yanyuan
2023-09-07 14b9c9168f5e1b2580806aaa96966b5c46805c21
Combine code of MPsync

将MPsync的代码进行了整合,仅加入了新增的代码,因此会缺失部分前端相关的按钮对应的函数等
已添加100个文件
2720 ■■■■■ 文件已修改
_Main/BL/Relations/Relation_MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingBOM_MPSync_MPSync_MappingBOM.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFact.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingExternalSupply_MPSync_MPSync_MappingExternalSupply.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingForecast_MPSync_MPSync_MappingForecast.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAnd.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingOperationCost_MPSync_MPSync_MappingOperationCost.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingOperation_MPSync_MPSync_MappingOperation.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingProductInLane_MPSync_MPSync_MappingProductInLane.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingProduct_MPSync_MPSync_MappingProduct.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingSalesSegment_MPSync_MPSync_MappingSalesSegment.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingUnit_MPSync_MPSync_MappingUnit.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOBaseConversionFactor/StaticMethod_DeleteIfExist.qbl 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOBaseConversionFactor/_ROOT_Type_IOBaseConversionFactor.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOCurrencyRate_MP/StaticMethod_DeleteIfExist.qbl 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOCurrencyRate_MP/_ROOT_Type_IOCurrencyRate_MP.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOCurrency_MP/StaticMethod_DeleteIfExist.qbl 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOCurrency_MP/_ROOT_Type_IOCurrency_MP.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOLane/StaticMethod_DeleteIfExist.qbl 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOLane/_ROOT_Type_IOLane.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOOperation/StaticMethod_CreateIfNotExist.qbl 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOOperation/_ROOT_Type_IOOperation.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOProduct_MP/StaticMethod_CreateIfNotExist.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOProduct_MP/StaticMethod_FindById.qbl 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOProduct_MP/_ROOT_Type_IOProduct_MP.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IORoutingStep/StaticMethod_CreateIfNotExist.qbl 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IORoutingStep/_ROOT_Type_IORoutingStep.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOUnit/StaticMethod_CreateIfNotExistByTree.qbl 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOUnit/StaticMethod_FindById.qbl 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOUnit/_ROOT_Type_IOUnit.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_IOUnitOfMeasure_MP/StaticMethod_DeleteIfExist.qbl 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_GetProductTypeByProductId.qbl 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_ImportDBDataCustom.qbl 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingActualPISPIPData.qbl 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingBaseConversionFactorData.qbl 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingCurencyRatesData.qbl 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingCurrencyData#670.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingCurrencyData.qbl 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingCurrencyRateData.qbl 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingCustomerOrderData.qbl 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingExternalSupplyData.qbl 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingForecastData.qbl 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingInventoryValueAndCostData.qbl 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingLaneData#474.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingLaneData.qbl 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingLaneLegData#257.qbl 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingLaneLegData.qbl 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingOperationBOMData.qbl 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingOperationCostData.qbl 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingOperationData.qbl 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingProductData.qbl 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingProductInLaneData.qbl 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingSalesLevelData.qbl 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingSalesSegmentData.qbl 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingStockingPointData#321.qbl 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingStockingPointData.qbl 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingUnitData.qbl 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/Method_MappingUnitOfMeasureData.qbl 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/StaticMethod_ApiBuildPostRequestBody.qbl 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/StaticMethod_ApiResponesCheck.qbl 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MPSync/_ROOT_Type_MPSync.qbl 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew#331.qbl 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew#821.qbl 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew.qbl 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestCurrencyData_OnClick.def 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestCurrency_OnClick.def 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestLanesData_OnClick.def 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestLanesLegsData_OnClick.def 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestStockpointData_OnClick.def 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Component_Toolbar484.def 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Method_OpenDialog.def 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Response_Toolbar484_btnCancel_OnClick.def 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Response_Toolbar484_btnOk_OnClick.def 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/_ROOT_Component_CurrencyDataTestDialog.def 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Component_Toolbar868.def 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Method_OpenDialog.def 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Response_Toolbar868_btnCancel_OnClick.def 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Response_Toolbar868_btnOk_OnClick.def 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/_ROOT_Component_CurrencyRateDataTestDialog.def 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Component_Toolbar458.def 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Method_OpenDialog.def 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Response_Toolbar458_btnCancel_OnClick.def 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Response_Toolbar458_btnOk_OnClick.def 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/_ROOT_Component_LanesDataTestDialog.def 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Component_Toolbar886.def 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Method_OpenDialog.def 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Response_Toolbar886_btnCancel_OnClick.def 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Response_Toolbar886_btnOk_OnClick.def 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/_ROOT_Component_LanesLegsDataTestDialog.def 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Component_Toolbar309.def 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Method_OpenDialog.def 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Response_Toolbar309_btnCancel_OnClick.def 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Response_Toolbar309_btnOk_OnClick.def 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/_ROOT_Component_StockpointDataTestDialog.def 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_var/_Main/Data/.keep 补丁 | 查看 | 原始文档 | blame | 历史
_var/_Main/KBs/MacroPlanner/ScenarioManager/KB/1.0.0.0/Change_1086.kbc 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_var/_Main/KBs/MacroPlanner/ScenarioManager/KB/1.0.0.0/Table_BusinessTypes_1.elm 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_var/_Main/KBs/MacroPlanner/ScenarioManager/KB/1.0.0.0/Table_BusinessTypes_1.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
_Main/BL/Relations/Relation_MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingActualPISPIP_MPSync_MPSync_MappingActualPISPIP
{
  #keys: '1[414384.0.737300004]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300006][414384.0.737300005][414384.0.737300007]'
    Cardinality: '0to1'
    ObjectDefinition: MappingActualPISPIP
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingActualPISPIP
  {
    #keys: '3[414384.0.737300009][414384.0.737300008][414384.0.737300010]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingBOM_MPSync_MPSync_MappingBOM.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingBOM_MPSync_MPSync_MappingBOM
{
  #keys: '1[414384.0.737300037]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300039][414384.0.737300038][414384.0.737300040]'
    Cardinality: '0to1'
    ObjectDefinition: MappingBOM
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingBOM
  {
    #keys: '3[414384.0.737300042][414384.0.737300041][414384.0.737300043]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFact.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingBaseConversionFactor_MPSync_MPSync_MappingBaseConversionFactor
{
  #keys: '1[414384.0.737300021]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300023][414384.0.737300022][414384.0.737300024]'
    Cardinality: '0to1'
    ObjectDefinition: MappingBaseConversionFactor
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingBaseConversionFactor
  {
    #keys: '3[414384.0.737300026][414384.0.737300025][414384.0.737300027]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingCustomerOrder_MPSync_MPSync_MappingCustomerOrder
{
  #keys: '1[414384.0.737300053]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300055][414384.0.737300054][414384.0.737300056]'
    Cardinality: '0to1'
    ObjectDefinition: MappingCustomerOrder
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingCustomerOrder
  {
    #keys: '3[414384.0.737300058][414384.0.737300057][414384.0.737300059]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingExternalSupply_MPSync_MPSync_MappingExternalSupply.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingExternalSupply_MPSync_MPSync_MappingExternalSupply
{
  #keys: '1[414384.0.737300069]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300071][414384.0.737300070][414384.0.737300072]'
    Cardinality: '0to1'
    ObjectDefinition: MappingExternalSupply
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingExternalSupply
  {
    #keys: '3[414384.0.737300074][414384.0.737300073][414384.0.737300075]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingForecast_MPSync_MPSync_MappingForecast.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingForecast_MPSync_MPSync_MappingForecast
{
  #keys: '1[414384.0.737300085]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300087][414384.0.737300086][414384.0.737300088]'
    Cardinality: '0to1'
    ObjectDefinition: MappingForecast
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingForecast
  {
    #keys: '3[414384.0.737300090][414384.0.737300089][414384.0.737300091]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAnd.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingInventoryValueAndCost_MPSync_MPSync_MappingInventoryValueAndCost
{
  #keys: '1[414384.0.737300101]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300103][414384.0.737300102][414384.0.737300104]'
    Cardinality: '0to1'
    ObjectDefinition: MappingInventoryValueAndCost
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingInventoryValueAndCost
  {
    #keys: '3[414384.0.737300106][414384.0.737300105][414384.0.737300107]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingOperationCost_MPSync_MPSync_MappingOperationCost.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingOperationCost_MPSync_MPSync_MappingOperationCost
{
  #keys: '1[414384.0.736080617]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.736080619][414384.0.736080618][414384.0.736080620]'
    Cardinality: '0to1'
    ObjectDefinition: MappingOperationCost
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingOperationCost
  {
    #keys: '3[414384.0.736080622][414384.0.736080621][414384.0.736080623]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingOperation_MPSync_MPSync_MappingOperation.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingOperation_MPSync_MPSync_MappingOperation
{
  #keys: '1[414384.0.737300117]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.737300119][414384.0.737300118][414384.0.737300120]'
    Cardinality: '0to1'
    ObjectDefinition: MappingOperation
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingOperation
  {
    #keys: '3[414384.0.737300122][414384.0.737300121][414384.0.737300123]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingProductInLane_MPSync_MPSync_MappingProductInLane.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingProductInLane_MPSync_MPSync_MappingProductInLane
{
  #keys: '1[414384.0.736080646]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.736080648][414384.0.736080647][414384.0.736080649]'
    Cardinality: '0to1'
    ObjectDefinition: MappingProductInLane
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingProductInLane
  {
    #keys: '3[414384.0.736080651][414384.0.736080650][414384.0.736080652]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingProduct_MPSync_MPSync_MappingProduct.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingProduct_MPSync_MPSync_MappingProduct
{
  #keys: '1[414384.0.736080633]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.736080635][414384.0.736080634][414384.0.736080636]'
    Cardinality: '0to1'
    ObjectDefinition: MappingProduct
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingProduct
  {
    #keys: '3[414384.0.736080638][414384.0.736080637][414384.0.736080639]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingSalesSegment_MPSync_MPSync_MappingSalesSegment.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingSalesSegment_MPSync_MPSync_MappingSalesSegment
{
  #keys: '1[414384.0.736080662]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.736080664][414384.0.736080663][414384.0.736080665]'
    Cardinality: '0to1'
    ObjectDefinition: MappingSalesSegment
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingSalesSegment
  {
    #keys: '3[414384.0.736080667][414384.0.736080666][414384.0.736080668]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingUnitOfMeasure_MPSync_MPSync_MappingUnitOfMeasure
{
  #keys: '1[414384.0.736080697]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.736080699][414384.0.736080698][414384.0.736080700]'
    Cardinality: '0to1'
    ObjectDefinition: MappingUnitOfMeasure
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingUnitOfMeasure
  {
    #keys: '3[414384.0.736080702][414384.0.736080701][414384.0.736080703]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Relations/Relation_MappingUnit_MPSync_MPSync_MappingUnit.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Relation MappingUnit_MPSync_MPSync_MappingUnit
{
  #keys: '1[414384.0.736080678]'
  DefaultRelationStrategy
  {
  }
  RelationSide.LeftSide MPSync
  {
    #keys: '3[414384.0.736080680][414384.0.736080679][414384.0.736080681]'
    Cardinality: '0to1'
    ObjectDefinition: MappingUnit
    OwningSide: 'Reference'
  }
  RelationSide.RightSide MappingUnit
  {
    #keys: '3[414384.0.736080683][414384.0.736080682][414384.0.736080684]'
    Cardinality: '1toN'
    ObjectDefinition: MPSync
    OwningSide: 'Owned'
  }
}
_Main/BL/Type_IOBaseConversionFactor/StaticMethod_DeleteIfExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DeleteIfExist (
  MPSync mpSync,
  String from,
  String to,
  String productId
)
{
  TextBody:
  [*
    // yypsybs Sep-1-2023 (created)
    toDel := select( mpSync, IOBaseConversionFactor, item,
                     item.SourceUnitOfMeasureName() = from and item.TargetUnitOfMeasureName() = to and item.ProductID() = productId );
    if( not isnull( toDel ) ) {
      toDel.Delete();
    }
  *]
}
_Main/BL/Type_IOBaseConversionFactor/_ROOT_Type_IOBaseConversionFactor.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IOBaseConversionFactor #extension
{
}
_Main/BL/Type_IOCurrencyRate_MP/StaticMethod_DeleteIfExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DeleteIfExist (
  MPSync mpSync,
  String currencyId,
  Date start
)
{
  TextBody:
  [*
    // yypsybs Sep-1-2023 (created)
    toDel := select( mpSync, IOCurrencyRate_MP, item,
                     item.CurrencyID() = currencyId and item.Start() = start );
    if( not isnull( toDel ) ) {
      toDel.Delete();
    }
  *]
}
_Main/BL/Type_IOCurrencyRate_MP/_ROOT_Type_IOCurrencyRate_MP.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IOCurrencyRate_MP #extension
{
}
_Main/BL/Type_IOCurrency_MP/StaticMethod_DeleteIfExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DeleteIfExist (
  MPSync mpSync,
  String id
)
{
  TextBody:
  [*
    // yypsybs Sep-1-2023 (created)
    toDel := select( mpSync, IOCurrency_MP, item, item.ID() = id );
    if( not isnull( toDel ) ) {
      toDel.Delete();
    }
  *]
}
_Main/BL/Type_IOCurrency_MP/_ROOT_Type_IOCurrency_MP.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IOCurrency_MP #extension
{
}
_Main/BL/Type_IOLane/StaticMethod_DeleteIfExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DeleteIfExist (
  MPSync mpSync,
  String id
)
{
  TextBody:
  [*
    // yypsybs Sep-1-2023 (created)
    toDel := select( mpSync, IOLane, item, item.ID() = id );
    if( not isnull( toDel ) ) {
      toDel.Delete();
    }
  *]
}
_Main/BL/Type_IOLane/_ROOT_Type_IOLane.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IOLane #extension
{
}
_Main/BL/Type_IOOperation/StaticMethod_CreateIfNotExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
Quintiq file version 2.0
#parent: #root
StaticMethod CreateIfNotExist (
  MPSync mpSync,
  String id
) as IOOperation
{
  TextBody:
  [*
    // yypsybs Sep-5-2023 (created)
    result := select( mpSync, IOOperation, op, op.ID() = id );
    if( isnull( result ) ) {
      result := mpSync.IOOperation( relnew,
                          ID := id );
    }
    return result;
  *]
}
_Main/BL/Type_IOOperation/_ROOT_Type_IOOperation.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IOOperation #extension
{
}
_Main/BL/Type_IOProduct_MP/StaticMethod_CreateIfNotExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
StaticMethod CreateIfNotExist (
  MPSync mpSync,
  String id,
  String name,
  String parentId,
  String uom
) as IOProduct_MP
{
  TextBody:
  [*
    // yypsybs Sep-1-2023 (created)
    value := IOProduct_MP::FindById( mpSync, id );
    if( isnull( value ) ) {
      value := IOProduct_MP::Create( mpSync, id, name, "", uom );
      if( parentId <> "" ) {
        value.ParentID( parentId );
      }
    }
    return value;
  *]
}
_Main/BL/Type_IOProduct_MP/StaticMethod_FindById.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
Quintiq file version 2.0
#parent: #root
StaticMethod FindById (
  MPSync mpSync,
  String id
) as IOProduct_MP
{
  TextBody:
  [*
    // yypsybs Sep-1-2023 (created)
    result := select( mpSync, IOProduct_MP, item, item.ID() = id );
    return result;
  *]
}
_Main/BL/Type_IOProduct_MP/_ROOT_Type_IOProduct_MP.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IOProduct_MP #extension
{
}
_Main/BL/Type_IORoutingStep/StaticMethod_CreateIfNotExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
Quintiq file version 2.0
#parent: #root
StaticMethod CreateIfNotExist (
  MPSync mpSync,
  String routingId,
  String name,
  Number seq
) as IORoutingStep
{
  TextBody:
  [*
    // yypsybs Sep-5-2023 (created)
    value := select( mpSync, IORoutingStep, item, item.RoutingID() = routingId and item.Name() = name and item.SequenceNumberForExcel() = seq );
    if( isnull( value ) ) {
      mpSync.IORoutingStep( relnew,
                            RoutingID := routingId,
                            Name := name,
                            SequenceNumberForExcel := seq  );
    }
    return value;
  *]
}
_Main/BL/Type_IORoutingStep/_ROOT_Type_IORoutingStep.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IORoutingStep #extension
{
}
_Main/BL/Type_IOUnit/StaticMethod_CreateIfNotExistByTree.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
Quintiq file version 2.0
#parent: #root
StaticMethod CreateIfNotExistByTree (
  MPSync mpSync,
  String id,
  String name,
  String parentId,
  String UOMName,
  String currencyId,
  Date startDate,
  Date endDate,
  String capacityType
) as IOUnit
{
  TextBody:
  [*
    // yypsybs Sep-6-2023 (created)
    value := IOUnit::FindById( mpSync, id );
    if( isnull( value ) ) {
      value := mpSync.IOUnit( relnew,
                     ID := id,
                     Name := name,
                     ParentUnitID := parentId,
                     UnitOfMeasureName := UOMName,
                     CurrencyID := currencyId,
                     StartDate := startDate,
                     EndDate := endDate,
                     CapacityType := capacityType );
    }
    return value;
  *]
}
_Main/BL/Type_IOUnit/StaticMethod_FindById.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
Quintiq file version 2.0
#parent: #root
StaticMethod FindById (
  MPSync mpSync,
  String id
) as IOUnit
{
  TextBody:
  [*
    // yypsybs Sep-6-2023 (created)
    value := select( mpSync, IOUnit, item, item.ID() = id );
    return value;
  *]
}
_Main/BL/Type_IOUnit/_ROOT_Type_IOUnit.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
TypeSpecialization IOUnit #extension
{
}
_Main/BL/Type_IOUnitOfMeasure_MP/StaticMethod_DeleteIfExist.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DeleteIfExist (
  MPSync mpSync,
  String name
)
{
  TextBody:
  [*
    // yypsybs Sep-1-2023 (created)
    toDel := select( mpSync, IOUnitOfMeasure_MP, item,
                     item.Name() = name );
    if( not isnull( toDel ) ) {
      toDel.Delete();
    }
  *]
}
_Main/BL/Type_MPSync/Method_GetProductTypeByProductId.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method GetProductTypeByProductId (
  String productId
) as String
{
  TextBody:
  [*
    // yypsybs Sep-5-2023 (created)
    values := selectvalues( this, MappingBOM, item, item.ProductCode() = productId, item.ProductType() );
    value := "";
    if( values.Size() > 0 ) {
      value := values.Element( 0 );
    }
    return value;
  *]
}
_Main/BL/Type_MPSync/Method_ImportDBDataCustom.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
Quintiq file version 2.0
#parent: #root
Method ImportDBDataCustom (
  MacroPlan macroPlan,
  Strings businessTypes,
  Boolean isKeyProduct,
  Boolean createPurchaseSupplyMaterial
)
{
  Description: '将表的数据转为IOxxxx的数据'
  TextBody:
  [*
    // Import data from DB
    // æ•°æ®å¤„理
    // é”€å”®çº§åˆ«åŠé”€å”®éƒ¨é—¨
    this.MappingSalesLevelData();
    this.Broker_OTD_SalesSegment().Execute();
    this.MappingSalesSegmentData( businessTypes );
    // å•位及单位换算
    this.Broker_OTD_UnitOfMeasure().Execute();
    this.MappingUnitOfMeasureData();
    this.Broker_OTD_BaseConversionFactor().Execute();
    this.MappingBaseConversionFactorData();
    // è´§å¸åŠè´§å¸æ±‡çއ
    this.MappingCurrencyData();
    this.MappingCurrencyRateData();
    // åº“存点
    this.MappingStockingPointData();
    // äº§å“
    this.Broker_OTD_Product().Execute();
    this.MappingProductData( businessTypes, isKeyProduct );
    // è®¢å•预测
    this.Broker_OTD_Forecast().Execute();
    this.MappingForecastData( businessTypes );
    // è®¢å•需求
    this.Broker_OTD_CustomerOrder().Execute();
    this.MappingCustomerOrderData( businessTypes );
    // è½¦é“
    this.MappingLaneData();
    // è½¦é“运输段
    this.MappingLaneLegData();
    // ä¾›åº”网络(车道)
    this.Broker_OTD_ProductInLane().Execute();
    this.MappingProductInLaneData();
    // routing routingStep unit operation operationLink operationInputGroup operationBOM
    this.Broker_OTD_Operation().Execute();
    this.Broker_OTD_BOM().Execute();
    // æ¸…理旧数据
    this.IOUnit( relflush );
    this.IOOperation( relflush );
    this.IOOperationLink( relflush );
    this.IOOperationInputGroup( relflush );
    // å¤„理数据
    this.MappingUnitData( businessTypes );
    this.MappingOperationData( businessTypes );
    // æ¸…理旧数据
    this.IOOperationBOM( relflush );
    // å¤„理数据
    this.MappingOperationBOMData( businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
    // åº“存成本
    this.Broker_OTD_InventoryCost().Execute();
    this.MappingInventoryValueAndCostData();
    // åº“存数据
    this.Broker_OTD_ActualPISPIP().Execute();
    this.MappingActualPISPIPData( businessTypes, isKeyProduct )
    // Update the LastImportFromDatabase time
    this.LastImportTime( DateTime::ActualTime() );
    // sync to mp
    if( not isnull( macroPlan ) ) {
      macroPlan.SynchronizeFromMPSync( this, false,
                                       true, true, true, true, true,
                                       true, true, true, true, true,
                                       true, true, true, true, true,
                                       true, true, true, true, true,
                                       true, true, true, true );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingActualPISPIPData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
Quintiq file version 2.0
#parent: #root
Method MappingActualPISPIPData (
  Strings businessTypes,
  Boolean nuclear
)
{
  TextBody:
  [*
    this.IOActualProductInStockingPointInPeriod( relflush );
    // å…ˆæŒ‰å…³é”®ç‰©æ–™ï¼Œå†æŒ‰businessType筛选产品
    productList := selectset( this, MappingProduct, item, item.KeyProduct() = nuclear );
    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
      productList := selectset( productList, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
    }
    productIdList := selectvalues( productList, Elements, item, item.ID() );
    // æ ¹æ®äº§å“ç­›é€‰åº“存数据
    traverse( this, MappingActualPISPIP, item, productIdList.Find( item.ProductID() ) >= 0 ) {
      this.IOActualProductInStockingPointInPeriod( relnew,
                                                   ActualInventoryLevelEnd := item.ActualInventoryLevelEnd(),
                                                   // todo ç¡®è®¤ä½¿ç”¨å½“前日期还是数据库日期
                                                   Date := item.Date(),
                                                   Description := item.Description(),
                                                   ManufacturedDate := item.ManufacturedDate(),
                                                   ProductID := item.ProductID(),
                                                   StockingPointID := item.StockingPointID() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingBaseConversionFactorData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
Quintiq file version 2.0
#parent: #root
Method MappingBaseConversionFactorData
{
  Description: 'ETL数据转模型数据'
  TextBody:
  [*
    this.IOBaseConversionFactor( relflush );
    traverse( this, MappingBaseConversionFactor, item ) {
    //  IOBaseConversionFactor::DeleteIfExist( this, item.SourceUnitOfMeasureName(), item.TargetUnitOfMeasureName(), item.ProductId() );
      this.IOBaseConversionFactor( relnew,
                                   SourceUnitOfMeasureName := item.SourceUnitOfMeasureName(),
                                   TargetUnitOfMeasureName := item.TargetUnitOfMeasureName(),
                                   ProductID := item.ProductId(),
                                   UserFactor := item.Factor(),
                                   IsEnabled := item.IsEnabled() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingCurencyRatesData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
Quintiq file version 2.0
#parent: #root
Method MappingCurencyRatesData (
  JSON data
)
{
  TextBody:
  [*
    data_length := data.Size();
    for( i := 0; i < data_length; i++ )
    {
      datarow := data.Get( i );
      currencyId := datarow.Get( "currencyid" ).GetString();
      rate := [Real]datarow.Get( "rate" ).GetString();
      startString := datarow.Get( "start" ).GetString();
      years := [Number]startString.SubString( 0, 4 );
      month := [Number]startString.SubString( 5, 2 );
      day := [Number]startString.SubString( 8, 2 );
      start := Date::Construct( years, month, day );
      // åˆ é™¤å·²æœ‰çš„
    //  IOCurrencyRate_MP::DeleteIfExist( this, currencyId, start );
      this.IOCurrencyRate_MP( relnew,
                              CurrencyID := currencyId,
                              Rate := rate,
                              Start := start );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingCurrencyData#670.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Method MappingCurrencyData (
  JSON data
)
{
  TextBody:
  [*
    data_length := data.Size();
    for( i := 0; i < data_length; i++ )
    {
      datarow := data.Get( i );
      id := datarow.Get( "id" ).GetString();
      isBase := [Boolean]datarow.Get( "isbase" ).GetString();
      name := datarow.Get( "name" ).GetString();
      symbol := " ";
      // åˆ é™¤å·²æœ‰çš„
    //  IOCurrency_MP::DeleteIfExist( this, id );
      this.IOCurrency_MP( relnew,
                          ID := id, IsBase := isBase, Name := name, Symbol := symbol );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingCurrencyData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method MappingCurrencyData
{
  TextBody:
  [*
    this.IOCurrency_MP( relflush );
    // è´§å¸ä¿¡æ¯
    bodyNumber := "1";
    postRequestBody := MPSync::ApiBuildPostRequestBody( bodyNumber );
    address := "api-uat-sgc.tianma.cn";
    url := "/otdService/https/GetCurrenciesInfo";
    port := 443;
    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
    this.MappingCurrencyData( data );
  *]
}
_Main/BL/Type_MPSync/Method_MappingCurrencyRateData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method MappingCurrencyRateData
{
  TextBody:
  [*
    this.IOCurrencyRate_MP( relflush );
    // è´§å¸æ±‡çŽ‡ä¿¡æ¯
    bodynumber := "5";
    postrequestbody := MPSync::ApiBuildPostRequestBody( bodynumber );
    address := "api-uat-sgc.tianma.cn";
    url := "/otdService/https/GetCurrencyRatesInfo";
    port := 443;
    data := MPSync::ApiResponesCheck( address, port, url, postrequestbody );
    this.MappingCurencyRatesData( data );
  *]
}
_Main/BL/Type_MPSync/Method_MappingCustomerOrderData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
Quintiq file version 2.0
#parent: #root
Method MappingCustomerOrderData (
  Strings businessTypes
)
{
  Description: 'ETL订单预测'
  TextBody:
  [*
    toDels := selectset( this, IOSalesDemandBase, item, item.istype( IOCustomerOrder ) );
    traverse( toDels, Elements, toDel ) {
      toDel.Delete();
    }
    // å¾…处理数据
    toDealList := selectset( this, MappingCustomerOrder, item, true );
    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
        toDealList := selectset( toDealList, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
    }
    // todo æ²¡macroPlan怎么搞
    //queryStartDate := guard( DateTime::Now() - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
    //queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
    //listToDeal := selectset( listToDeal, Elements, item, item.StartDate() >= queryStartDate and item.EndDate() <= queryEndDate );
    // å¤„理
    traverse( toDealList, Elements, item ) {
      this.IOSalesDemandBase( relnew,
                              IOCustomerOrder,
                              ID := item.ID(),
                              CurrencyID := item.CurrencyID(),
                              PriorityName := item.PriorityName(),
                              ProductID := item.ProductID(),
                              SalesSegmentName := item.SalesSegmentName(),
                              StockingPointID := item.StockPointID(),
                              UnitOfMeasureName := item.UnitOfMeasureName(),
                              CustomerID := item.CustomerID(),
                              CustomerName := item.Customer(),
                              OrderID := item.OrderID(),
                              OrderLineID := item.OrderLineID(),
                              Price := item.Price(),
                              Quantity := item.Quantity(),
                              StartDate := item.OrderDate() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingExternalSupplyData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
Quintiq file version 2.0
#parent: #root
Method MappingExternalSupplyData (
  Strings businessTypes,
  Boolean nuclear
)
{
  TextBody:
  [*
    //// renhao Aug-14-2023 (created)
    //
    //traverse( this,MappingExternalSupply,externalSupply){
    //  product := select( this,MappingProduct,product,product.ID() = externalSupply.ProductID() and product.KeyProduct() = nuclear,true);
    //
    //  if( not isnull( product)){
    //    productMP :=  select( this,Product_MP,productMP,productMP.ID() = externalSupply.ProductID() ,true);
    //    stockingpoint := select( this,StockingPoint_MP,st,st.ID() = externalSupply.StockingPointID(),true);
    //    if( not isnull(businessTypes)){
    //
    //      for( i :=0 ;i < businessTypes.Size();i++ ){
    //        businessType := businessTypes.Element( i);
    //        if( product.BusinessType() = businessType and not product.IsCommon()){
    //          InventorySupply::Create(externalSupply.ID(),productMP,stockingpoint,externalSupply.Date(),externalSupply.ManufacturedDate(),externalSupply.UserQuantity(),"在途在制",true);
    //        }
    //      }
    //
    //    }else{
    //      InventorySupply::Create(externalSupply.ID(),productMP,stockingpoint,externalSupply.Date(),externalSupply.ManufacturedDate(),externalSupply.UserQuantity(),"在途在制",true);
    //    }
    //
    //  }
    //}
  *]
}
_Main/BL/Type_MPSync/Method_MappingForecastData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
Quintiq file version 2.0
#parent: #root
Method MappingForecastData (
  Strings businessTypes
)
{
  Description: 'ETL订单预测'
  TextBody:
  [*
    toDels := selectset( this, IOSalesDemandBase, item, item.istype( IOForecast ) );
    traverse( toDels, Elements, toDel ) {
      toDel.Delete();
    }
    // å¾…处理数据
    listToDeal := selectset( this, MappingForecast, item, true );
    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
        listToDeal := selectset( listToDeal, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
    }
    // todo æ²¡macroPlan怎么搞
    //queryStartDate := guard( DateTime::Now() - Duration::Days( 30 ), DateTime::MinDateTime() ).Date();
    //queryEndDate := guard( max( this, Period_MP, item, true, item.EndDate() ), Date::MaxDate() );
    //listToDeal := selectset( listToDeal, Elements, item, item.StartDate() >= queryStartDate and item.EndDate() <= queryEndDate );
    // å¤„理
    traverse( listToDeal, Elements, item ) {
      this.IOSalesDemandBase( relnew,
                              IOForecast,
                              ID := item.ID(),
                              CurrencyID := item.CurrencyID(),
                              PriorityName := item.PriorityName(),
                              SalesSegmentName := item.SalesSegmentName(),
                              StockingPointID := item.StockingPointID(),
                              UnitOfMeasureName := item.UnitOfMeasureName(),
                              ProductID := item.ProductID(),
                              StartDate := item.StartDate(),
                              EndDate := item.EndDate(),
                              Quantity := item.Quantity(),
                              Price := item.Price());
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingInventoryValueAndCostData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
Quintiq file version 2.0
#parent: #root
Method MappingInventoryValueAndCostData
{
  TextBody:
  [*
    this.IOInventoryValueAndCost( relflush );
    traverse( this, MappingInventoryValueAndCost, item ) {
      this.IOInventoryValueAndCost( relnew,
                                    ID := item.ID(),
                                    AccountName := item.AccountName(),
                                    Cost := item.Cost(),
                                    CostDriver := item.CostDriver(),
                                    ProductID := item.ProductID(),
                                    Start := item.Start(),
                                    StockingPointID := item.StockingPointID() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingLaneData#474.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Method MappingLaneData (
  JSON data
)
{
  TextBody:
  [*
    dataLength := data.Size();
    for( i := 0; i < dataLength; i++ ) {
      dataRow := data.Get( i );
      id := dataRow.Get( "id" ).GetString();
      unitId := dataRow.Get( "unitid" ).GetString();
      name := dataRow.Get( "name" ).GetString();
      userLeadTimeHours := [Number]dataRow.Get( "userleadtime" ).GetString();
      this.IOLane( relnew,
                   ID := id,
                   Name := name,
                   UnitID := unitId,
                   UserLeadTime := Duration::Hours( userLeadTimeHours ) );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingLaneData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: #root
Method MappingLaneData
{
  TextBody:
  [*
    this.IOLane( relflush );
    bodyNumber := "3";
    postRequestBody := MPSync::ApiBuildPostRequestBody( bodyNumber );
    address := "api-uat-sgc.tianma.cn";
    url := "/otdService/https/GetLanesInfo";
    port := 443;
    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
    this.MappingLaneData( data );
  *]
}
_Main/BL/Type_MPSync/Method_MappingLaneLegData#257.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
Quintiq file version 2.0
#parent: #root
Method MappingLaneLegData (
  JSON data
)
{
  TextBody:
  [*
    dataLength := data.Size();
    for( i := 0; i < dataLength; i++ ) {
      dataRow := data.Get( i );
      laneId := dataRow.Get( "laneid" ).GetString();
      originStockingPointId := dataRow.Get( "originstockingpointid" ).GetString();
      destinationStockingPointId := dataRow.Get( "destinationstockingpointid" ).GetString();
      name := dataRow.Get( "name" ).GetString();
      userLeadTimeHours := [Number]dataRow.Get( "userleadtime" ).GetString();
      this.IOLaneLeg( relnew,
                      LaneID := laneId,
                      OriginStockingPointID := originStockingPointId,
                      DestinationStockingPointID := destinationStockingPointId,
                      Name := name,
                      HasUserLeadTime := true,
                      UserLeadTime := Duration::Hours( userLeadTimeHours ),
                      Start := Date::MinDate(),
                      End := Date::MaxDate(),
                      PreferenceBonus := 0.0,
                      CO2Emission := 0.0 );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingLaneLegData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: #root
Method MappingLaneLegData
{
  TextBody:
  [*
    this.IOLaneLeg( relflush );
    bodynumber := "4";
    postRequestBody := MPSync::ApiBuildPostRequestBody( bodynumber );
    address := "api-uat-sgc.tianma.cn";
    url := "/otdService/https/GetLaneLegsInfo";
    port := 443;
    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
    this.MappingLaneLegData( data );
  *]
}
_Main/BL/Type_MPSync/Method_MappingOperationBOMData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,181 @@
Quintiq file version 2.0
#parent: #root
Method MappingOperationBOMData (
  Strings businessTypes,
  Boolean isKeyProduct,
  Boolean createPurchaseSupplyMaterial
)
{
  TextBody:
  [*
    // keyProduct
    keyProductIds := selectuniquevalues( this, MappingProduct, prod, prod.KeyProduct() = true, prod.ID() );
    // èŽ·å–æœ‰åºçš„å¾…å¤„ç†è®°å½•
    toDealOps := construct( MappingOperations );
    toDealBoms := construct( MappingBOMs );
    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
        toDealOps := selectsortedset( this, MappingOperation, item,
                                      businessTypes.Find( item.BusinessType() ) >= 0
                                      and ( not isKeyProduct or keyProductIds.Find( item.ProductID() ) >= 0 ),
                                      item.SequenceNumber() );
        toDealBoms := selectset( this, MappingBOM, item,
                                 businessTypes.Find( item.BusinessType() ) >= 0
                                 and ( not isKeyProduct or keyProductIds.Find( item.ComponentCode() ) >= 0 ) );
    } else {
        toDealOps := selectsortedset( this, MappingOperation, item,
                                      not isKeyProduct or keyProductIds.Find( item.ProductID() ) >= 0 ,
                                      item.SequenceNumber() );
        toDealBoms := selectset( this, MappingBOM, item,
                                 businessTypes.Find( item.BusinessType() ) >= 0
                                 and ( not isKeyProduct or keyProductIds.Find( item.ComponentCode() ) >= 0 ) );
    }
    // å¯¹æ¯ä¸ªrouting计算inputGroupId
    inputGroupId := 1
    // å¯¹æ¯ä¸ªRouting进行投入产出处理
    routingKeys := selectuniquevalues( toDealOps, Elements, item, item.OrganCode() + "_" + item.ProductID() );
    traverse( routingKeys, Elements, routingKey ) {
      // ==== äº§å‡º ====
      // æ‰¾æœ€å¤§seq
      maxSeq := max( toDealOps, Elements, item, item.OrganCode() + "_" + item.ProductID() = routingKey, item.SequenceNumber() );
      maxSeqElements := selectset( toDealOps, Elements, item,
                                   item.OrganCode() + "_" + item.ProductID() = routingKey and item.SequenceNumber() = maxSeq );
      traverse( maxSeqElements, Elements, maxSeqELement ) {
        operationId := maxSeqELement.OrganCode() + "_" + maxSeqELement.ProductID() + "_" + maxSeqELement.ProcessSection();
        if( maxSeqELement.Line() <> "" ) {
          operationId := operationId + "_" + maxSeqELement.Line();
        }
        this.IOOperationBOM( relnew,
                             OperationID := operationId,
                             ProductID := maxSeqELement.ProductID(),
                             StockingPointID := maxSeqELement.OrganCode() + "_" + this.GetProductTypeByProductId( maxSeqELement.ProductID() ) + "_Stock",
                             Quantity := 1,
                             IsInput := false );
      }
      // ==== æŠ•å…¥ ====
      // å¯¹Operation中的每个ProcessSection, æ‰¾seq最小的list,每条bom对该list生成operationBOM
      processSectionList := selectuniquevalues( toDealOps, Elements, toDeal,
                                                toDeal.OrganCode() + "_" + toDeal.ProductID() = routingKey,
                                                toDeal.ProcessSection() );
      traverse( processSectionList, Elements, processSection ) {
        minSeq := min( toDealOps, Elements, item,
                       item.OrganCode() + "_" + item.ProductID() = routingKey
                       and item.ProcessSection() = processSection,
                       item.SequenceNumber() );
        operationRecordsWithMinSeq := selectset( toDealOps, Elements, minSeqWithProcessSectionElement,
                                                 minSeqWithProcessSectionElement.OrganCode() + "_" + minSeqWithProcessSectionElement.ProductID() = routingKey
                                                 and minSeqWithProcessSectionElement.ProcessSection() = processSection
                                                 and minSeqWithProcessSectionElement.SequenceNumber() = minSeq );
        bomRecords := selectset( toDealBoms, Elements, bom,
                                 bom.OrganCode() + "_" + bom.ProductCode() = routingKey
                                 and bom.ProcessSection() = processSection );
        // æŒ‰æ˜¯å¦æœ‰æ›¿æ¢æ–™åˆ†ç»„
        bomWithoutAlters := selectset( bomRecords, Elements, bomRecord, bomRecord.AlternativeMaterialCode() = "" );
        bomWithAlters := selectset( bomRecords, Elements, bomRecord, bomRecord.AlternativeMaterialCode() <> "" );
        // å¤„理不带替换料的input
        traverse( operationRecordsWithMinSeq, Elements, op ) {
          traverse( bomWithoutAlters, Elements, bom ) {
            operationId := op.OrganCode() + "_" + op.ProductID() + "_" + op.ProcessSection();
            if( op.Line() <> "" ) {
              operationId := operationId + "_" + op.Line();
            }
            this.IOOperationBOM( relnew,
                                 OperationID := operationId,
                                 ProductID := op.ProductID(),
                                 StockingPointID := op.OrganCode() + "_" + bom.ComponentType() + "_Stock",
                                 IsInput := true,
                                 Quantity := bom.UnitUsageOfComponents() / bom.ComponentOutputRate() );
          }
        }
        // å¤„理带替换料的,按line和主料分组
        lineList := selectuniquevalues( operationRecordsWithMinSeq, Elements, item, item.Line() );
        mainProdList := selectuniquevalues( bomWithAlters, Elements, item, item.ComponentCode() );
        traverse( lineList, Elements, line ) {
          opWithLine := select( operationRecordsWithMinSeq, Elements, item, item.Line() = line );
          opId := opWithLine.OrganCode() + "_" + opWithLine.ProductID() + "_" + opWithLine.ProcessSection();
          if( opWithLine.Line() <> "" ) {
            opId := opId + "_" + opWithLine.Line();
          }
          traverse( mainProdList, Elements, mainProd ) {
            // æ¯ç§ä¸»æ–™ä¸€ä¸ªgroup
            inputGroupId := inputGroupId + 1;
            bomWithMainProdList := selectset( bomWithAlters, Elements, item, item.ComponentCode() = mainProd );
            bomRandom := bomWithMainProdList.First();
            // æ€»æ•°é‡
            maxQuantityInGroup := bomRandom.UnitUsageOfComponents() / bomRandom.ComponentOutputRate();
            // æ›¿ä»£æ–™æ€»æ¯”例
            alterRateTotal := sum( bomWithMainProdList, Elements, item, item.AlternativeRate() );
            // åˆ›å»ºinputGroup
            this.IOOperationInputGroup( relnew, InputGroupID := inputGroupId, OperationID := opId, InputGroupQuantity := maxQuantityInGroup );
            // åˆ›å»ºä¸»æ–™çš„input bom
            this.IOOperationBOM( relnew,
                                 OperationID := opId,
                                 InputGroupID := inputGroupId,
                                 ProductID := bomRandom.ComponentCode(),
                                 StockingPointID := bomRandom.OrganCode() + "_" + bomRandom.ComponentType() + "_Stock",
                                 IsInput := true,
                                 Quantity := maxQuantityInGroup * ( 1 - alterRateTotal ),
                                 MinQuantityInGroup := 0.0,
                                 MaxQuantityInGroup := maxQuantityInGroup );
            // æ›¿ä»£æ–™input bom
            traverse( bomWithMainProdList, Elements, bom ) {
              this.IOOperationBOM( relnew,
                         OperationID := opId,
                         InputGroupID := inputGroupId,
                         ProductID := bom.AlternativeMaterialCode(),
                         StockingPointID := bom.OrganCode() + "_" + bom.ComponentType() + "_Stock",
                         IsInput := true,
                         Quantity := maxQuantityInGroup * bom.AlternativeRate(),
                         MinQuantityInGroup := 0.0,
                         MaxQuantityInGroup := maxQuantityInGroup );
            }
          }
        }
      }
      // é’ˆå¯¹æ¯ä¸ªrouting é‡ç½® inputGroupId
      inputGroupId := 1;
    }
    // å¯¹æ¯ä¸ªOrgCode_ComponentCode组合,创建采购routing
    if( createPurchaseSupplyMaterial ) {
      toCreateKeys := selectuniquevalues( toDealBoms, Elements, bom,
                                          bom.ComponentType() = "P",
                                          bom.OrganCode() + "_" + bom.ComponentCode() );
      traverse( toCreateKeys, Elements, toCreateKey ) {
        bomRandom := selectset( toDealBoms, Elements, bom, bom.ComponentType() = "P" and bom.OrganCode() + "_" + bom.ComponentCode() = toCreateKey ).First();
        routingId := bomRandom.OrganCode() + "_" + bomRandom.ComponentCode();
        routingName := routingId;
        routingStepName := "采购";
        routingStepSeq := 1;
        operationId := bomRandom.OrganCode() + "_PR_" + bomRandom.ComponentCode();
        operationName := operationId;
        unitId := "供应商";
        // ==== åˆ›å»º ====
        // åˆ›å»ºrouting
        this.IORouting( relnew,
                        ID := routingId, Name := routingName, IsEnabled := true, Start := Date::MinDate(), End := Date::MaxDate() );
        // åˆ›å»ºroutingStep
        IORoutingStep::CreateIfNotExist( this,
                                     routingId,
                                     routingStepName,
                                     routingStepSeq );
        // åˆ›å»ºop
        ioOp := IOOperation::CreateIfNotExist( this, operationId );
        ioOp.UnitID( unitId );
        ioOp.RoutingID( routingId );
        ioOp.RoutingStepName( routingStepName );
        ioOp.Name( operationName );
        ioOp.UserLeadTime( Duration::Zero() );
        ioOp.Throughput( 1.0 );
        ioOp.HasUserMaximumQuantity( false );
        ioOp.UserMinimumQuantity( Real::MinReal() );
        ioOp.UserMaximumQuantity( Real::MaxReal() );
        // åˆ›å»ºopBOM
        this.IOOperationBOM( relnew,
                   OperationID := operationId,
                   ProductID := bomRandom.ComponentCode(),
                   StockingPointID := bomRandom.OrganCode() + "_" + bomRandom.ComponentType() + "_Stock",
                   IsInput := true,
                   Quantity := 1 );
      }
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingOperationCostData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
Quintiq file version 2.0
#parent: #root
Method MappingOperationCostData (
  Strings businesstypes
)
{
  Description: 'Get operation cost data from operation mapping'
  TextBody:
  [*
    //// Administrator Aug-21-2023 (created)
    //// list to deal
    //listtodeal := construct( structured[MappingOperation] );
    //
    //if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
    //    listtodeal := selectset( this, MappingOperation, item, true );
    //} else {
    //    listtodeal := selectset( this, MappingOperation, item, businesstypes.Find( item.BusinessType() ) <> -1 );
    //}
    //
    //// Get the list to deal with max sequence number
    //listtodealwithmaxsn := construct( structured[MappingOperation] );
    //traverse( listtodeal, Elements, item ){
    //  maxsn := maxselect( this,
    //                      MappingOperation,
    //                      moperation,
    //                      moperation.OrganCode() = item.OrganCode(),
    //                      moperation.ProductID() = item.ProductID(),
    //                      moperation.SequenceNumber() ).SequenceNumber()
    //  if( item.SequenceNumber() = maxsn ){
    //    listtodealwithmaxsn.Add( item );
    //    }
    //  }
    //
    //// Get the operation cost data
    //traverse( listtodealwithmaxsn, Elements, item ){
    //  id := item.OrganCode() + "_" + item.ProductID() + "_" + item.ProcessSection() + "_" + item.Line();
    //  operation := Operation::FindOperationTypeIndex( id );
    //  account := Account_MP::FindByName( this, "Operation cost" );
    //  isfromdb := false;
    //  existoperationcost := OperationCost::FindOperationCostTypeIndex( id );
    //  if( isnull( existoperationcost ) ){
    //    connecteditem := select( this,
    //                             MappingOperationCost,
    //                             moperationcost,
    //                             moperationcost.OrgCode() = item.OrganCode(),
    //                             moperationcost.ProductID() = item.ProductID() );
    //    cost := connecteditem.Cost();
    //    lengthoftime := connecteditem.LengthOfTime();
    //    start := connecteditem.Start();
    //    timeunit := connecteditem.TimeUnit();
    //    OperationCost::Create( id, operation, account, "Volume", start, timeunit, lengthoftime, cost, isfromdb );
    //    }
    //  }
  *]
}
_Main/BL/Type_MPSync/Method_MappingOperationData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
Quintiq file version 2.0
#parent: #root
Method MappingOperationData (
  Strings businessTypes
)
{
  TextBody:
  [*
    // èŽ·å–æœ‰åºçš„å¾…å¤„ç†è®°å½•
    toDealList := construct( MappingOperations );
    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
        toDealList := selectsortedset( this, MappingOperation, item,
                                       businessTypes.Find( item.BusinessType() ) >= 0,
                                       item.SequenceNumber() );
    } else {
        toDealList := selectsortedset( this, MappingOperation, item,
                                       true,
                                       item.SequenceNumber() );
    }
    // åˆ é™¤åŽŸæœ‰routing
    this.IORouting( relflush );
    // æ–°routing
    routingIdList := selectuniquevalues( toDealList, Elements, item, item.OrganCode() + "_" + item.ProductID() );
    traverse( routingIdList, Elements, routingId ) {
      this.IORouting( relnew,
                      ID := routingId, Name := routingId, IsEnabled := true );
    }
    // åˆ é™¤åŽŸæœ‰routingStep
    this.IORoutingStep( relflush );
    // æ–°routingStep
    traverse( toDealList, Elements, op ) {
      routingId := op.OrganCode() + "_" + op.ProductID();
      routingStepName := op.ProcessSection() + "_" + [String]op.SequenceNumber();
      IORoutingStep::CreateIfNotExist( this,
                                       routingId,
                                       routingStepName,
                                       op.SequenceNumber() );
    }
    // æ–°operation
    traverse( toDealList, Elements, op ) {
      // æ±‡æ€»æ•°æ®
      routingId := op.OrganCode() + "_" + op.ProductID();
      routingStepName := op.ProcessSection() + "_" + [String]op.SequenceNumber();
      opId := op.OrganCode() + "_" + op.ProductID() + "_" + op.ProcessSection();
      unitId := op.OrganCode() + "_" + op.ProcessSection();
      if( op.Line() <> "" ) {
        opId := opId + "_" + op.Line();
        unitId := unitId + "_" + op.Line();
      }
      opName := opId;
      // æ–°å»º
      ioOp := IOOperation::CreateIfNotExist( this, opId );
      ioOp.UnitID( unitId );
      ioOp.RoutingID( routingId );
      ioOp.RoutingStepName( routingStepName );
      ioOp.Name( opName );
      ioOp.UserLeadTime( Duration::Hours( op.UserLeadTime() ) );
      ioOp.Throughput( op.ActualCapacity() );
      ioOp.UserMinimumQuantity( op.MinimumQuantity() );
      ioOp.UserMaximumQuantity( op.MaximumQuantity() );
      ioOp.HasUserMaximumQuantity( op.MaximumQuantity() <> 0.0 );
    }
    // æŒ‰ OrganCode + ProductID åˆ†ç»„ + æŽ’序
    keyList := selectuniquevalues( toDealList, Elements, op,
                                   op.OrganCode() + "_" + op.ProductID() );
    keyList := selectsortedset( keyList, Elements, str, str );
    traverse( keyList, Elements, key ) {
      previousList := construct( MappingOperations );
      // æŒ‰ SequenceNumber åˆ†ç»„ + æŽ’序
      subKeyList := selectuniquevalues( toDealList, Elements, op,
                                        key = op.OrganCode() + "_" + op.ProductID(),
                                        op.SequenceNumber() );
      subKeyList := selectsortedset( subKeyList, Elements, seq, seq );
      // éåŽ†æ¯ä¸ªSeq,与前一个list进行连接,同时创建group
      traverse( subKeyList, Elements, seq ) {
        elementList := selectset( this, MappingOperation, op,
                                  op.OrganCode() + "_" + op.ProductID() = key and op.SequenceNumber() = seq );
        if( not isnull( previousList ) and previousList.Size() > 0 ) {
          // å¯¹æ¯ä¸ªç›®æ ‡åˆ›å»ºinputGroup
          if( previousList.Size() > 1 ) {
            traverse( elementList, Elements, targetOp ) {
              targetOpId := targetOp.OrganCode() + "_" + targetOp.ProductID() + "_" + targetOp.ProcessSection();
              this.IOOperationInputGroup( relnew, InputGroupID := 1, OperationID := targetOpId, InputGroupQuantity := 1 );
            }
          }
          // æºä¸Žç›®æ ‡ä¸¤ä¸¤åˆ›å»ºoperationLink
          traverse( elementList, Elements, targetOp ) {
            traverse( previousList, Elements, sourceOp ) {
              sourceOpId := sourceOp.OrganCode() + "_" + sourceOp.ProductID() + "_" + sourceOp.ProcessSection();
              targetOpId := targetOp.OrganCode() + "_" + targetOp.ProductID() + "_" + targetOp.ProcessSection();
              this.IOOperationLink( relnew,
                                    SourceOperationID := sourceOpId, DestOperationID := targetOpId,
                                    SourceGroupID := 1, DestGroupID := 1, SourceQuantity := 1, DestQuantity := 1 / previousList.Size(),
                                    DestHasUserQuantity := false, DestMinQuantity := 0, DestMaxQuantity := 1 );
            }
          }
        }
        previousList := elementList;
      }
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingProductData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
Quintiq file version 2.0
#parent: #root
Method MappingProductData (
  Strings businesstypes,
  Boolean iskeyproduct
)
{
  Description: 'Method to get needed data from mapping product data'
  TextBody:
  [*
    // æ¸…除旧数据
    this.IOProduct_MP( relflush );
    // list to deal
    listToDeal := construct( structured[MappingProduct] );
    if( isnull( businesstypes ) or businesstypes.Size() = 0 ) {
      if( iskeyproduct = true ){
        listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true );
      } else {
        listToDeal := selectset( this, MappingProduct, item, true );
      }
    } else {
      if( iskeyproduct = true ){
        listToDeal := selectset( this, MappingProduct, item, item.KeyProduct() = true, businesstypes.Find( item.BusinessType() ) <> -1 or businesstypes.Find( item.CommonBusiness() ) <> -1 );
      } else {
        listToDeal := selectset( this, MappingProduct, item, businesstypes.Find( item.BusinessType() ) <> -1 or businesstypes.Find( item.CommonBusiness() ) <> -1 );
      }
    }
    // åˆ›å»ºæ ¹äº§å“
    IOProduct_MP::CreateIfNotExist( this, "全部物料产品", "全部物料产品", "", "PCS" );
    // å¤„理新信息
    traverse( listToDeal, Elements, item ) {
      // åˆ›å»ºçˆ¶äº§å“
      IOProduct_MP::CreateIfNotExist( this, item.ProductMajorType(), item.ProductMajorType(), "全部物料", "PCS" );
      IOProduct_MP::CreateIfNotExist( this, item.ProductSubclassType(), item.ProductSubclassType(), item.ProductMajorType(), "PCS" );
      // åˆ›å»ºäº§å“
      this.IOProduct_MP( relnew,
                         ID := item.ID(),
                         Name := item.Name(),
                         ParentID := item.ProductSubclassType(),
                         UOMName := item.UnitOfMeasureName(),
                         // todo ?
                         HasShelfLife := true,
                         ShelfLife := item.ShelfLife(),
                         Notes := item.Notes() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingProductInLaneData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
Quintiq file version 2.0
#parent: #root
Method MappingProductInLaneData
{
  Description: 'Get Product In Line data'
  TextBody:
  [*
    this.IOProductInLane( relflush );
    traverse( this, MappingProductInLane, item ){
      this.IOProductInLane( relnew,
                            LaneID := item.LineID(),
                            ProductID := item.ProductID() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingSalesLevelData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
Quintiq file version 2.0
#parent: #root
Method MappingSalesLevelData
{
  TextBody:
  [*
    this.IOSalesLevel_MP( relflush );
    this.IOSalesLevel_MP( relnew,
                          Level := 0,
                          Name := "营销中心" );
    this.IOSalesLevel_MP( relnew,
                          Level := 1,
                          Name := "销售科" );
    this.IOSalesLevel_MP( relnew,
                          Level := 2,
                          Name := "客户" );
  *]
}
_Main/BL/Type_MPSync/Method_MappingSalesSegmentData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
Quintiq file version 2.0
#parent: #root
Method MappingSalesSegmentData (
  Strings businessTypes
)
{
  Description: 'ETL销售部门'
  TextBody:
  [*
    this.IOSalesSegment_MP( relflush );
    toDealList := selectset( this, MappingSalesSegment, item, true );
    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
        toDealList := selectset( toDealList, Elements, item, businessTypes.Find( item.BusinessType() ) >= 0 );
    }
    traverse( toDealList, Elements, item ) {
        this.IOSalesSegment_MP( relnew,
                                Name := item.Name(),
                                ParentName := item.ParentName(),
                                DisplayIndex := item.DisplayIndex() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingStockingPointData#321.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
Quintiq file version 2.0
#parent: #root
Method MappingStockingPointData (
  JSON data
)
{
  TextBody:
  [*
    dataLength := data.Size();
    for( i:=0; i < dataLength; i++ )
    {
      dataRow := data.Get( i );
      id := dataRow.Get( "id" ).GetString();
      unitId := dataRow.Get( "unitid" ).GetString();
      name := dataRow.Get( "name" ).GetString();
      this.IOStockingPoint_MP( relnew,
                               ID := id,
                               Name := name,
                               UnitID := unitId,
                               CurrencyID := "CNY",
                               UnitOfMeasureName := "PCS",
                               IsPlannedInfinite := false,
                               GroupName := " ",
                               Notes := " ",
                               Start := Date::MinDate(),
                               End := Date::MaxDate() );
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingStockingPointData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
Quintiq file version 2.0
#parent: #root
Method MappingStockingPointData
{
  TextBody:
  [*
    this.IOStockingPoint_MP( relflush );
    bodyNumber := "2";
    postRequestBody := MPSync::ApiBuildPostRequestBody( bodyNumber );
    address := "api-uat-sgc.tianma.cn";
    port := 443;
    url := "/otdService/https/GetStockingPointsInfo";
    data := MPSync::ApiResponesCheck( address, port, url, postRequestBody );
    this.MappingStockingPointData( data );
  *]
}
_Main/BL/Type_MPSync/Method_MappingUnitData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
Quintiq file version 2.0
#parent: #root
Method MappingUnitData (
  Strings businessTypes
)
{
  Description: 'Get unit data from operation mapping'
  TextBody:
  [*
    listToDeal := selectset( this, MappingOperation, item, true );
    if( not isnull( businessTypes ) and businessTypes.Size() > 0 ) {
      listToDeal := selectset( this, MappingOperation, item, businessTypes.Find( item.BusinessType() ) >= 0 );
    }
    // å¸¸é‡
    unitOfMeasureName := "PCS";
    currencyId := "CNY";
    startDate := Date::Date( 1900, 1, 1 );
    endDate := Date::Date( 9999, 12, 31 );
    capacityType := "Infinite";
    // é€çº§åˆ›å»º
    IOUnit::CreateIfNotExistByTree( this, "天马集团", "天马集团", "", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
    IOUnit::CreateIfNotExistByTree( this, "生产", "生产", "天马集团", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
    IOUnit::CreateIfNotExistByTree( this, "供应商", "供应商", "天马集团", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
    IOUnit::CreateIfNotExistByTree( this, "整车运输", "整车运输", "天马集团", unitOfMeasureName, currencyId, startDate, endDate, capacityType );
    // æ ¹æ®operation创建
    traverse( listToDeal, Elements, op ) {
      // ä¸€çº§ orgCode
      levelOne := op.OrganCode();
      IOUnit::CreateIfNotExistByTree( this,
                                      levelOne, op.OrganName(), "生产",
                                      unitOfMeasureName, currencyId, startDate, endDate, capacityType );
      // äºŒçº§ orgCode + plantName
      levelTwo := op.OrganCode() + "_" + op.PlantName();
      IOUnit::CreateIfNotExistByTree( this,
                                      levelTwo, levelTwo, levelOne,
                                      unitOfMeasureName, currencyId, startDate, endDate, capacityType );
      // ä¸‰çº§ äºŒçº§ + processSection
      levelThree := levelTwo + "_" + op.ProcessSection();
      IOUnit::CreateIfNotExistByTree( this,
                                      levelThree, levelThree, levelTwo,
                                      unitOfMeasureName, currencyId, startDate, endDate, capacityType );
      // å››çº§ ä¸‰çº§ + line
      if( op.Line() <> "" ) {
        levelFour := levelThree + "_" + op.Line();
        IOUnit::CreateIfNotExistByTree( this,
                                        levelFour, levelFour, levelThree,
                                        unitOfMeasureName, currencyId, startDate, endDate, capacityType );
      }
    }
  *]
}
_Main/BL/Type_MPSync/Method_MappingUnitOfMeasureData.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
Quintiq file version 2.0
#parent: #root
Method MappingUnitOfMeasureData
{
  Description: 'ETL数据转模型数据'
  TextBody:
  [*
    this.IOUnitOfMeasure_MP( relflush );
    traverse( this, MappingUnitOfMeasure, item ) {
    //  IOUnitOfMeasure_MP::DeleteIfExist( this, item.Name() );
      this.IOUnitOfMeasure_MP( relnew, IsDefault := item.IsDefault(), Name :=  item.Name() );
    }
  *]
}
_Main/BL/Type_MPSync/StaticMethod_ApiBuildPostRequestBody.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
Quintiq file version 2.0
#parent: #root
StaticMethod ApiBuildPostRequestBody (
  String bodynumber
) as String
{
  TextBody:
  [*
    postrequestbody := JSON::Object()
                        .Add( "serviceInterfaceCode", "ESBOTDH000" + bodynumber )
                        .Add( "fromSystemCode", "OTDH000" + bodynumber )
                        .Add( "toInterfaceCode", "QIDH000" + bodynumber )
                        .Add( "ouZone", "OU_TMSH" )
                        .Add( "uuid", "1617355496bb588e353e80147eea5f45" )
                        .Add( "requestTime", DateTime::Now().Format( "Y-M2-D2 H:m:s" ) )
                        .Add( "dataType", "JSON" )
                        .Add( "data", JSON::Object()
                                      .Add( "pageIndex", "1" ) ).Build();
    info( DateTime::Now().Format( "Y-M2-D2 H:m:s" ) );
    postrequestbodystring := postrequestbody.AsString();
    return postrequestbodystring;
  *]
}
_Main/BL/Type_MPSync/StaticMethod_ApiResponesCheck.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
Quintiq file version 2.0
#parent: #root
StaticMethod ApiResponesCheck (
  String address,
  Number port,
  String path,
  String postrequestbody
) as owning JSON
{
  TextBody:
  [*
    // for HTTPS requests:
    i := HTTPInterface::Create( address, port );
    //i := HTTPInterface::Create( address ,443);
    info( address, port, path, postrequestbody );
    i.URL(path);
    //i.SSL(false);
    i.SSL(true);
    i.SSLKeystore('MyKeystore'); // created in the Config Utility
    i.PostMethod(true); //it's a POST method
    i.Call(postrequestbody); // Call's argument is for POST method's content.
    htmlresult := i.Result();
    htmlresponse := JSON::Parse( htmlresult );
    code := htmlresponse.Get( "resultCode" ).GetString();
    message := htmlresponse.Get( "resultMsg" );
    data := htmlresponse.Get( "responseData" );
    datalist := data.Get( "dataList" );
    if( code = "1" )
    {
      info( "Data have been written into table" );
      }
    else
    {
      messagestring := " ";
      if ( message.IsNull() )
      {
        messagestring := "No message returns!";
        }
      else
      {
        messagestring := message.GetString();
        }
      info( "Error! error code: " + code + ", error message: " + messagestring );
      }
    return &datalist;
  *]
}
_Main/BL/Type_MPSync/_ROOT_Type_MPSync.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
Quintiq file version 2.0
#root
#parent: #DomainModel
Type MPSync #extension
{
}
_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew#331.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DoSyncNew (
  MacroPlan macroPlan,
  MPSync mpSync,
  String businessTypeStr,
  Boolean isKeyProduct,
  Boolean createPurchaseSupplyMaterial
)
{
  Description: '单次同步'
  TextBody:
  [*
    // yypsybs Aug-17-2023 (created)
    businessTypes := construct( Strings );
    if( businessTypeStr.Length() > 0 ) {
        businessTypes := businessTypeStr.Tokenize( ',' );
    }
    MacroPlan::DoSyncNew( macroPlan, mpSync, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
  *]
}
_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew#821.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DoSyncNew (
  MacroPlan macroPlan,
  MPSync mpSync,
  Boolean isKeyProduct,
  Boolean createPurchaseSupplyMaterial
)
{
  Description: '单次同步'
  TextBody:
  [*
    // yypsybs Aug-17-2023 (created)
    businessTypes := construct( Strings );
    MacroPlan::DoSyncNew( macroPlan, mpSync, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
  *]
}
_Main/BL/Type_MacroPlan/StaticMethod_DoSyncNew.qbl
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
StaticMethod DoSyncNew (
  MacroPlan macroPlan,
  MPSync mpSync,
  Strings businessTypes,
  Boolean isKeyProduct,
  Boolean createPurchaseSupplyMaterial
)
{
  Description: '单次同步'
  TextBody:
  [*
    // yypsybs Aug-31-2023 (created)
    mpSync.ImportDBDataCustom( macroPlan, businessTypes, isKeyProduct, createPurchaseSupplyMaterial );
  *]
}
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestCurrencyData_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
Quintiq file version 2.0
#parent: mbMainMenu/MenuTestCurrencyData
Response OnClick () id:Response_MacroPlanner_mbMainMenu_MenuTestCurrencyData_OnClick
{
  #keys: '[414502.0.88134030]'
  Body:
  [*
    // Click to start a dialog about lane data test
    dlg := construct( CurrencyDataTestDialog );
    dlg.OpenDialog( Application );
  *]
  DefinitionID: 'Responsedef_Menu_OnClick'
}
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestCurrency_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
Quintiq file version 2.0
#parent: mbMainMenu/MenuTestCurrency
Response OnClick () id:Response_MacroPlanner_mbMainMenu_MenuTestCurrency_OnClick
{
  #keys: '[414502.0.88134200]'
  Body:
  [*
    // Click to start a dialog about lane data test
    dlg := construct( CurrencyRateDataTestDialog );
    dlg.OpenDialog( Application );
  *]
  DefinitionID: 'Responsedef_Menu_OnClick'
}
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestLanesData_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
Quintiq file version 2.0
#parent: mbMainMenu/MenuTestLanesData
Response OnClick () id:Response_MacroPlanner_mbMainMenu_MenuTestLanesData_OnClick
{
  #keys: '[414502.0.18234397]'
  Body:
  [*
    // Click to start a dialog about lane data test
    dlg := construct( LanesDataTestDialog );
    dlg.OpenDialog( Application );
  *]
  DefinitionID: 'Responsedef_Menu_OnClick'
}
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestLanesLegsData_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
Quintiq file version 2.0
#parent: mbMainMenu/MenuTestLanesLegsData
Response OnClick () id:Response_MacroPlanner_mbMainMenu_MenuTestLanesLegsData_OnClick
{
  #keys: '[412960.0.15704079]'
  Body:
  [*
    // Click to start a dialog about lane data test
    dlg := construct( LanesLegsDataTestDialog );
    dlg.OpenDialog( Application );
  *]
  DefinitionID: 'Responsedef_Menu_OnClick'
}
_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Response_MacroPlanner_mbMainMenu_MenuTestStockpointData_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
Quintiq file version 2.0
#parent: mbMainMenu/MenuTestStockpointData
Response OnClick () id:Response_MacroPlanner_mbMainMenu_MenuTestStockpointData_OnClick
{
  #keys: '[414502.0.18234233]'
  Body:
  [*
    // Click to start a new dialog about stockpoint data test
    dlg := construct( StockpointDataTestDialog );
    dlg.OpenDialog( Application );
  *]
  DefinitionID: 'Responsedef_Menu_OnClick'
}
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Component_Toolbar484.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
Quintiq file version 2.0
Component Toolbar484
{
  #keys: '[414502.0.88134261]'
  BaseType: 'Toolbar'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 128 id: 486 parent: 0 }
      GBFlow.Column { grow: 0 id: 661 parent: 0 }
      GBFlow.Column { grow: 0 id: 550 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => btnOk
        Position { startcolumn: 661 startrow: 337 endcolumn: 661 endrow: 337 }
      }
      GBElement
      {
        Component => btnCancel
        Position { startcolumn: 550 startrow: 337 endcolumn: 550 endrow: 337 }
      }
    ]
    Gaps: [ left: 5 right: 5 top: 0 bottom: 0 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 337 parent: 0 }
    ]
  }
  Children:
  [
    Component btnOk
    {
      #keys: '[414502.0.88134278]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+O'
        Text: '&OK'
      ]
    }
    Component btnCancel
    {
      #keys: '[414502.0.88134286]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+C'
        Text: '&Cancel'
      ]
    }
  ]
  Properties:
  [
    Border: false
    Location: 'bottom'
    Size: 26
    ModeledStringList ChildOrdering
    {
      c: btnOk
      c: btnCancel
    }
  ]
}
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Method_OpenDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method OpenDialog (
  internal[GUIComponent] parent
) id:Method_CurrencyDataTestDialog_OpenDialog
{
  #keys: '[414502.0.88134527]'
  Body:
  [*
    testResult := MacroPlan.TestDataConnect("TestCurrency");
    Label413.Text( testResult );
    this.DoModal( parent );
  *]
}
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Response_Toolbar484_btnCancel_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
Quintiq file version 2.0
#parent: Toolbar484/btnCancel
Response OnClick () id:Response_Toolbar484_btnCancel_OnClick
{
  #keys: '[414502.0.88134293]'
  Body:
  [*
    Dialog.EndModal(-1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/Response_Toolbar484_btnOk_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
Quintiq file version 2.0
#parent: Toolbar484/btnOk
Response OnClick () id:Response_Toolbar484_btnOk_OnClick
{
  #keys: '[414502.0.88134285]'
  Body:
  [*
    Dialog.ApplyChanges();
    Dialog.EndModal(1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_CurrencyDataTestDialog/_ROOT_Component_CurrencyDataTestDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
Quintiq file version 2.0
#root
#parent: MacroPlanner
OrphanComponent CurrencyDataTestDialog
{
  #keys: '[414502.0.88134250]'
  BaseType: 'Dialog'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 0 id: 947 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => Label413
        Position { startcolumn: 947 startrow: 363 endcolumn: 947 endrow: 363 }
      }
    ]
    Gaps: [ left: 10 right: 10 top: 10 bottom: 10 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 363 parent: 0 }
    ]
  }
  Children:
  [
    #child: Toolbar484
    Component Label413
    {
      #keys: '[414502.0.88134400]'
      BaseType: 'Label'
      Properties:
      [
        Transparent: true
      ]
    }
  ]
  Properties:
  [
    EnterButton: 'btnOk'
    EscapeButton: 'btnCancel'
    Height: 108
    Title: 'Currency Data Test Dialog'
    Width: 121
    ModeledStringList ChildOrdering
    {
      c: Toolbar484
      c: Label413
    }
  ]
}
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Component_Toolbar868.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
Quintiq file version 2.0
Component Toolbar868
{
  #keys: '[414502.0.88134578]'
  BaseType: 'Toolbar'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 128 id: 376 parent: 0 }
      GBFlow.Column { grow: 0 id: 118 parent: 0 }
      GBFlow.Column { grow: 0 id: 500 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => btnOk
        Position { startcolumn: 118 startrow: 254 endcolumn: 118 endrow: 254 }
      }
      GBElement
      {
        Component => btnCancel
        Position { startcolumn: 500 startrow: 254 endcolumn: 500 endrow: 254 }
      }
    ]
    Gaps: [ left: 5 right: 5 top: 0 bottom: 0 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 254 parent: 0 }
    ]
  }
  Children:
  [
    Component btnOk
    {
      #keys: '[414502.0.88134595]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+O'
        Text: '&OK'
      ]
    }
    Component btnCancel
    {
      #keys: '[414502.0.88134603]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+C'
        Text: '&Cancel'
      ]
    }
  ]
  Properties:
  [
    Border: false
    Location: 'bottom'
    Size: 26
    ModeledStringList ChildOrdering
    {
      c: btnOk
      c: btnCancel
    }
  ]
}
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Method_OpenDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method OpenDialog (
  internal[GUIComponent] parent
) id:Method_CurrencyRateDataTestDialog_OpenDialog
{
  #keys: '[414502.0.88134671]'
  Body:
  [*
    testResult := MacroPlan.TestDataConnect("TestCurrencyRate");
    Label492.Text( testResult );
    this.DoModal( parent );
  *]
}
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Response_Toolbar868_btnCancel_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
Quintiq file version 2.0
#parent: Toolbar868/btnCancel
Response OnClick () id:Response_Toolbar868_btnCancel_OnClick
{
  #keys: '[414502.0.88134610]'
  Body:
  [*
    Dialog.EndModal(-1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/Response_Toolbar868_btnOk_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
Quintiq file version 2.0
#parent: Toolbar868/btnOk
Response OnClick () id:Response_Toolbar868_btnOk_OnClick
{
  #keys: '[414502.0.88134602]'
  Body:
  [*
    Dialog.ApplyChanges();
    Dialog.EndModal(1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_CurrencyRateDataTestDialog/_ROOT_Component_CurrencyRateDataTestDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
Quintiq file version 2.0
#root
#parent: MacroPlanner
OrphanComponent CurrencyRateDataTestDialog
{
  #keys: '[414502.0.88134567]'
  BaseType: 'Dialog'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 0 id: 116 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => Label492
        Position { startcolumn: 116 startrow: 920 endcolumn: 116 endrow: 920 }
      }
    ]
    Gaps: [ left: 10 right: 10 top: 10 bottom: 10 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 920 parent: 0 }
    ]
  }
  Children:
  [
    #child: Toolbar868
    Component Label492
    {
      #keys: '[414502.0.88134655]'
      BaseType: 'Label'
      Properties:
      [
        Transparent: true
      ]
    }
  ]
  Properties:
  [
    EnterButton: 'btnOk'
    EscapeButton: 'btnCancel'
    Title: 'Currency Rate Data Test Dialog'
    Width: 444
    ModeledStringList ChildOrdering
    {
      c: Toolbar868
      c: Label492
    }
  ]
}
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Component_Toolbar458.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
Quintiq file version 2.0
Component Toolbar458
{
  #keys: '[414502.0.18234842]'
  BaseType: 'Toolbar'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 128 id: 178 parent: 0 }
      GBFlow.Column { grow: 0 id: 729 parent: 0 }
      GBFlow.Column { grow: 0 id: 210 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => btnOk
        Position { startcolumn: 729 startrow: 251 endcolumn: 729 endrow: 251 }
      }
      GBElement
      {
        Component => btnCancel
        Position { startcolumn: 210 startrow: 251 endcolumn: 210 endrow: 251 }
      }
    ]
    Gaps: [ left: 5 right: 5 top: 0 bottom: 0 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 251 parent: 0 }
    ]
  }
  Children:
  [
    Component btnOk
    {
      #keys: '[414502.0.18234859]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+O'
        Text: '&OK'
      ]
    }
    Component btnCancel
    {
      #keys: '[414502.0.18234867]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+C'
        Text: '&Cancel'
      ]
    }
  ]
  Properties:
  [
    Border: false
    Location: 'bottom'
    Size: 26
    ModeledStringList ChildOrdering
    {
      c: btnOk
      c: btnCancel
    }
  ]
}
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Method_OpenDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method OpenDialog (
  internal[GUIComponent] parent
) id:Method_LanesDataTestDialog_OpenDialog
{
  #keys: '[414502.0.27954178]'
  Body:
  [*
    testResult := MacroPlan.TestDataConnect("TestLanes");
    Label808.Text( testResult );
    this.DoModal( parent );
  *]
}
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Response_Toolbar458_btnCancel_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
Quintiq file version 2.0
#parent: Toolbar458/btnCancel
Response OnClick () id:Response_Toolbar458_btnCancel_OnClick
{
  #keys: '[414502.0.18234874]'
  Body:
  [*
    Dialog.EndModal(-1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/Response_Toolbar458_btnOk_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
Quintiq file version 2.0
#parent: Toolbar458/btnOk
Response OnClick () id:Response_Toolbar458_btnOk_OnClick
{
  #keys: '[414502.0.18234866]'
  Body:
  [*
    Dialog.ApplyChanges();
    Dialog.EndModal(1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_LanesDataTestDialog/_ROOT_Component_LanesDataTestDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
Quintiq file version 2.0
#root
#parent: MacroPlanner
OrphanComponent LanesDataTestDialog
{
  #keys: '[414502.0.18234831]'
  BaseType: 'Dialog'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 0 id: 785 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => Label808
        Position { startcolumn: 785 startrow: 325 endcolumn: 785 endrow: 325 }
      }
    ]
    Gaps: [ left: 10 right: 10 top: 10 bottom: 10 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 325 parent: 0 }
    ]
  }
  Children:
  [
    #child: Toolbar458
    Component Label808
    {
      #keys: '[414502.0.27954099]'
      BaseType: 'Label'
      Properties:
      [
        Transparent: true
      ]
    }
  ]
  Properties:
  [
    EnterButton: 'btnOk'
    EscapeButton: 'btnCancel'
    Height: 108
    Title: 'Lanes Data Test'
    Width: 136
    ModeledStringList ChildOrdering
    {
      c: Toolbar458
      c: Label808
    }
  ]
}
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Component_Toolbar886.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
Quintiq file version 2.0
Component Toolbar886
{
  #keys: '[412960.0.15704261]'
  BaseType: 'Toolbar'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 128 id: 851 parent: 0 }
      GBFlow.Column { grow: 0 id: 755 parent: 0 }
      GBFlow.Column { grow: 0 id: 969 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => btnOk
        Position { startcolumn: 755 startrow: 569 endcolumn: 755 endrow: 569 }
      }
      GBElement
      {
        Component => btnCancel
        Position { startcolumn: 969 startrow: 569 endcolumn: 969 endrow: 569 }
      }
    ]
    Gaps: [ left: 5 right: 5 top: 0 bottom: 0 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 569 parent: 0 }
    ]
  }
  Children:
  [
    Component btnOk
    {
      #keys: '[412960.0.15704278]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+O'
        Text: '&OK'
      ]
    }
    Component btnCancel
    {
      #keys: '[412960.0.15704286]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+C'
        Text: '&Cancel'
      ]
    }
  ]
  Properties:
  [
    Border: false
    Location: 'bottom'
    Size: 26
    ModeledStringList ChildOrdering
    {
      c: btnOk
      c: btnCancel
    }
  ]
}
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Method_OpenDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method OpenDialog (
  internal[GUIComponent] parent
) id:Method_LanesLegsDataTestDialog_OpenDialog
{
  #keys: '[412960.0.15704586]'
  Body:
  [*
    testResult := MacroPlan.TestDataConnect("TestLanesLegs");
    Label484.Text( testResult );
    this.DoModal( parent );
  *]
}
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Response_Toolbar886_btnCancel_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
Quintiq file version 2.0
#parent: Toolbar886/btnCancel
Response OnClick () id:Response_Toolbar886_btnCancel_OnClick
{
  #keys: '[412960.0.15704293]'
  Body:
  [*
    Dialog.EndModal(-1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/Response_Toolbar886_btnOk_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
Quintiq file version 2.0
#parent: Toolbar886/btnOk
Response OnClick () id:Response_Toolbar886_btnOk_OnClick
{
  #keys: '[412960.0.15704285]'
  Body:
  [*
    Dialog.ApplyChanges();
    Dialog.EndModal(1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_LanesLegsDataTestDialog/_ROOT_Component_LanesLegsDataTestDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
Quintiq file version 2.0
#root
#parent: MacroPlanner
OrphanComponent LanesLegsDataTestDialog
{
  #keys: '[412960.0.15704249]'
  BaseType: 'Dialog'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 0 id: 739 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => Label484
        Position { startcolumn: 739 startrow: 321 endcolumn: 739 endrow: 321 }
      }
    ]
    Gaps: [ left: 10 right: 10 top: 10 bottom: 10 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 321 parent: 0 }
    ]
  }
  Children:
  [
    #child: Toolbar886
    Component Label484
    {
      #keys: '[412960.0.15704489]'
      BaseType: 'Label'
      Properties:
      [
        Transparent: true
      ]
    }
  ]
  Properties:
  [
    EnterButton: 'btnOk'
    EscapeButton: 'btnCancel'
    Title: 'Lanes Legs Data Test'
    Width: 492
    ModeledStringList ChildOrdering
    {
      c: Toolbar886
      c: Label484
    }
  ]
}
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Component_Toolbar309.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
Quintiq file version 2.0
Component Toolbar309
{
  #keys: '[414502.0.18234549]'
  BaseType: 'Toolbar'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 128 id: 557 parent: 0 }
      GBFlow.Column { grow: 0 id: 351 parent: 0 }
      GBFlow.Column { grow: 0 id: 110 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => btnOk
        Position { startcolumn: 351 startrow: 960 endcolumn: 351 endrow: 960 }
      }
      GBElement
      {
        Component => btnCancel
        Position { startcolumn: 110 startrow: 960 endcolumn: 110 endrow: 960 }
      }
    ]
    Gaps: [ left: 5 right: 5 top: 0 bottom: 0 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 960 parent: 0 }
    ]
  }
  Children:
  [
    Component btnOk
    {
      #keys: '[414502.0.18234566]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+O'
        Text: '&OK'
      ]
    }
    Component btnCancel
    {
      #keys: '[414502.0.18234574]'
      BaseType: 'Button'
      Properties:
      [
        LayoutGroup: 'dlgButtons'
        Shortcut: 'Alt+C'
        Text: '&Cancel'
      ]
    }
  ]
  Properties:
  [
    Border: false
    Location: 'bottom'
    Size: 26
    ModeledStringList ChildOrdering
    {
      c: btnOk
      c: btnCancel
    }
  ]
}
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Method_OpenDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
Quintiq file version 2.0
#parent: #root
Method OpenDialog (
  internal[GUIComponent] parent
) id:Method_StockpointDataTestDialog_OpenDialog
{
  #keys: '[414502.0.18237141]'
  Body:
  [*
    testResult := MacroPlan.TestDataConnect("TestStockpoint");
    Label310.Text( testResult );
    this.DoModal( parent );
  *]
}
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Response_Toolbar309_btnCancel_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
Quintiq file version 2.0
#parent: Toolbar309/btnCancel
Response OnClick () id:Response_Toolbar309_btnCancel_OnClick
{
  #keys: '[414502.0.18234581]'
  Body:
  [*
    Dialog.EndModal(-1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/Response_Toolbar309_btnOk_OnClick.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
Quintiq file version 2.0
#parent: Toolbar309/btnOk
Response OnClick () id:Response_Toolbar309_btnOk_OnClick
{
  #keys: '[414502.0.18234573]'
  Body:
  [*
    Dialog.ApplyChanges();
    Dialog.EndModal(1);
  *]
  DefinitionID: 'Responsedef_GUIButtonBase_OnClick'
}
_Main/UI/MacroPlanner/Component_StockpointDataTestDialog/_ROOT_Component_StockpointDataTestDialog.def
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
Quintiq file version 2.0
#root
#parent: MacroPlanner
OrphanComponent StockpointDataTestDialog
{
  #keys: '[414502.0.18234537]'
  BaseType: 'Dialog'
  GBLayout
  {
    Type: 'internal[GBLayoutDefinition]'
    Columns:
    [
      GBFlow.Column { grow: 0 id: 423 parent: 0 }
    ]
    Elements:
    [
      GBElement
      {
        Component => Label310
        Position { startcolumn: 423 startrow: 569 endcolumn: 423 endrow: 569 }
      }
    ]
    Gaps: [ left: 10 right: 10 top: 10 bottom: 10 inner: 5 ]
    Rows:
    [
      GBFlow.Row { grow: 0 id: 569 parent: 0 }
    ]
  }
  Children:
  [
    #child: Toolbar309
    Component Label310
    {
      #keys: '[414502.0.18237441]'
      BaseType: 'Label'
      Properties:
      [
        Transparent: true
      ]
    }
  ]
  Properties:
  [
    EnterButton: 'btnOk'
    EscapeButton: 'btnCancel'
    Height: 108
    Title: 'Stockpoint Data Test'
    Width: 121
    ModeledStringList ChildOrdering
    {
      c: Label310
      c: Toolbar309
    }
  ]
}
_var/_Main/Data/.keep
_var/_Main/KBs/MacroPlanner/ScenarioManager/KB/1.0.0.0/Change_1086.kbc
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<KBSChange:KBSChange
  xmlns:KBSChange="KBSChange"
  xmlns:KBRevisionElementID="KBRevisionElementID"
  xmlns:KBElementID="KBElementID">
  <KBSChange:ChangeNr>1086</KBSChange:ChangeNr>
  <KBSChange:User>quintiq/yypsybs</KBSChange:User>
  <KBSChange:Description>123</KBSChange:Description>
  <KBSChange:Category></KBSChange:Category>
  <KBSChange:CreationTime>2023-08-24T14:48:03</KBSChange:CreationTime>
  <KBSChange:Elements>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>45</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>AccountTypes</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>1</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>BusinessTypes</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>47</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>CostDriverRules</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>17</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>DemoScenario</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>57</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>NonFinancialKPI</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>31</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>SanityCheckCategories</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>23</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>ScenarioStatus</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>60</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>SolverSettings</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
    <KBRevisionElementID:KBRevisionElementID>
      <KBRevisionElementID:Revision>532</KBRevisionElementID:Revision>
      <KBElementID:KBElementID>
        <KBElementID:Kind>Table</KBElementID:Kind>
        <KBElementID:Name>TestInstances</KBElementID:Name>
      </KBElementID:KBElementID>
    </KBRevisionElementID:KBRevisionElementID>
  </KBSChange:Elements>
</KBSChange:KBSChange>
_var/_Main/KBs/MacroPlanner/ScenarioManager/KB/1.0.0.0/Table_BusinessTypes_1.elm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<KBSElementRevision:KBSElementRevision
  xmlns:KBSElementRevision="KBSElementRevision"
  xmlns:KBElementID="KBElementID">
  <KBSElementRevision:Revision>1</KBSElementRevision:Revision>
  <KBElementID:KBElementID>
    <KBElementID:Kind>Table</KBElementID:Kind>
    <KBElementID:Name>BusinessTypes</KBElementID:Name>
  </KBElementID:KBElementID>
</KBSElementRevision:KBSElementRevision>
_var/_Main/KBs/MacroPlanner/ScenarioManager/KB/1.0.0.0/Table_BusinessTypes_1.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<table>
  <name>BusinessTypes</name>
  <column>
    <name>BusinessType</name>
    <label>BusinessType</label>
    <type>String</type>
    <cell value="aaa"/>
    <cell value="bbb"/>
  </column>
</table>