From 8a69c2f5505f7d54a7ce097765ca7c6c0e265725 Mon Sep 17 00:00:00 2001
From: hongji.li <hongji.a.li@capgemini.com>
Date: 星期一, 11 九月 2023 15:08:29 +0800
Subject: [PATCH] 物料标签&计划策略优化

---
 _Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyTheTemplate.qbl                                                                              |   24 +
 _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnOk_OnClick.def                                          |    5 
 _Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/Method_parseTable.qbl                                                                                   |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/_ROOT_Component_DialogCreateEditMaterialLabelingAndPlanningStrategy.def        |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnCancel_OnClick.def                                      |    2 
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_CreateIfNotExist.qbl                                                                              |    4 
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MaximumNumberOfDaysInInventory.qbl                                                                   |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuSelectAll_O.def |   17 
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_SerialNumber.qbl                                                                                     |    8 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def                                                                            |    4 
 _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlContent.def                                                       |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/_ROOT_Component_FormMaterialLabelingAndPlanningStrategy.def                      |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndImport_OnCl.def |   42 ++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def                 |    1 
 _Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CheckThePrecedingColumn.qbl                                                                        |   37 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelChildMaterial#558.def                                             |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonSynchronizeInventoryTargets_.def |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnDoubleClick.def   |   19 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialOperationButton.def                                       |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuChildMaterial.def                                       |   10 
 _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlActions.def                                                       |    8 
 _Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_upload.qbl                                                                                 |   19 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTopMost.def                                                                      |   20 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuDeleteAll_O.def |   21 +
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl                                                                |   23 +
 _Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/StaticMethod_export.qbl                                                                                   |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheck#591.def |   16 
 _Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CreateOrUpdateData.qbl                                                                             |   62 +++
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListMaterialMaterialLabelingAndPlanningStrategy#880.def                |   60 +++
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_BusinessType.qbl                                                                                     |    8 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/_ROOT_Component_frmStandardAnalysisGlobalOTDTable.def                                        |   19 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndExport_OnCl.def |   21 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialExportAndImport#136.def                                   |   51 ++
 _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlGeneral.def                                                       |  133 +++++++
 _Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTop.def                                                                          |   29 +
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MinimumNumberOfDaysInStock.qbl                                                                       |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageChildMaterial.def                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialLabelingAndPlanningStrategy.def                           |   15 
 _Main/BL/Type_GlobalDTOTable/Method_InitTestData.qbl                                                                                                           |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterial.def                                                      |   26 +
 _Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_SynchronizeData.qbl                                                                                |   15 
 _Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyThatTheItemCodeIsNotDuplicated.qbl                                                           |   23 +
 /dev/null                                                                                                                                                      |   17 
 _Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl                                                                           |   42 ++
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterial_DataHolderCheckedMaterials_OnDataChanged.def              |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuMaterial455#1.def                                       |   46 ++
 _Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_parseRows.qbl                                                                                      |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Method_Edit.def                                                                |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListChildMaterial.def                                                  |   42 ++
 _Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_VerifyTheFileName.qbl                                                                      |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageMaterial790#1.def                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheckedCh.def |   18 
 52 files changed, 1,059 insertions(+), 51 deletions(-)

diff --git a/_Main/BL/Type_GlobalDTOTable/Method_InitTestData.qbl b/_Main/BL/Type_GlobalDTOTable/Method_InitTestData.qbl
index 0ad0d09..6f10cf9 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_InitTestData.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_InitTestData.qbl
@@ -4,14 +4,16 @@
 {
   TextBody:
   [*
+    //this.MatAttrSettingAndPlanStrategy( relflush );
+    
     // yypsybs Sep-8-2023 (created)
-    mat1 := MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, "MAT_1", "MAT_1", "TYPE_1", 233.0, "閫氱敤", "闀垮懆鏈�" );
+    mat1 := MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, 1, "鎵嬫満浜嬩笟閮�", "MAT_1", "MAT_1", "TYPE_1", 233.0, "閫氱敤", "闀垮懆鏈�" );
     MatAttrSettingAndPlanStrategyDetail::CreateIfNotExist( mat1, "PROD_1", 666.0, "PROD_1_DESC" );
     MatAttrSettingAndPlanStrategyDetail::CreateIfNotExist( mat1, "PROD_2", 777.0, "PROD_2_DESC" );
-    mat2 := MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, "MAT_2", "MAT_2", "TYPE_2", 233.0, "涓撶敤", "闀垮懆鏈�" );
+    mat2 := MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, 2, "鎵嬫満浜嬩笟閮�", "MAT_2", "MAT_2", "TYPE_2", 233.0, "涓撶敤", "闀垮懆鏈�" );
     MatAttrSettingAndPlanStrategyDetail::CreateIfNotExist( mat2, "PROD_1", 1666.0, "PROD_1_DESC" );
     MatAttrSettingAndPlanStrategyDetail::CreateIfNotExist( mat2, "PROD_2", 1777.0, "PROD_2_DESC" );
-    MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, "MAT_3", "MAT_3", "TYPE_1", 233.0, "閫氱敤", "鐭懆鏈�" );
-    MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, "MAT_4", "MAT_4", "TYPE_2", 233.0, "涓撶敤", "鐭懆鏈�" );
+    MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, 3, "鎵嬫満浜嬩笟閮�", "MAT_3", "MAT_3", "TYPE_1", 233.0, "閫氱敤", "鐭懆鏈�" );
+    MatAttrSettingAndPlanStrategy::CreateIfNotExist( this, 4, "鎵嬫満浜嬩笟閮�", "MAT_4", "MAT_4", "TYPE_2", 233.0, "涓撶敤", "鐭懆鏈�" );
   *]
 }
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CheckThePrecedingColumn.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CheckThePrecedingColumn.qbl
new file mode 100644
index 0000000..915e044
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CheckThePrecedingColumn.qbl
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+#parent: #root
+Method CheckThePrecedingColumn (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    traverse ( this, MatAttrSettingAndPlanStrategyDataRow, masapsdr ) {
+      itemCode := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡缂栫爜" );
+      targetMatAttrSettingAndPlanStrategy := select( globalOTDTable, MatAttrSettingAndPlanStrategy, tempMASAPS, tempMASAPS.MatCode() = itemCode.value() );
+      if ( not isnull( targetMatAttrSettingAndPlanStrategy ) ) {
+        businessType                      := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "涓氬姟绫诲瀷" ).value();
+        nameOfMaterial                    := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡鍚嶇О" ).value();
+        itemClassification                := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡鍒嗙被" ).value();
+        LTTimeDays                        := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "LT鏃堕棿锛堝ぉ锛�" ).value();
+        numberOfFinishedSKUs              := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鎴愬搧SKU鏁伴噺" ).value();
+        finishedProductDeliveryMinLTDays  := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鎴愬搧浜や粯Min-LT锛堝ぉ锛�" ).value();
+        longAndShortCycleLabels           := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "闀跨煭鍛ㄦ湡鏍囩" ).value();
+        genericSpecialLabels              := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "閫氱敤涓撶敤鏍囩" ).value();
+        automaticMaterialPlanningPolicies := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鑷姩鐗╂枡璁″垝绛栫暐" ).value();
+        if ( businessType                           <> targetMatAttrSettingAndPlanStrategy.BusinessType()     or
+             nameOfMaterial                         <> targetMatAttrSettingAndPlanStrategy.MatName()          or
+             itemClassification                     <> targetMatAttrSettingAndPlanStrategy.MatType()          or
+             [Real]LTTimeDays                       <> targetMatAttrSettingAndPlanStrategy.MatArrivalLT()     or
+             [Real]numberOfFinishedSKUs             <> targetMatAttrSettingAndPlanStrategy.ProductCount()     or
+             [Real]finishedProductDeliveryMinLTDays <> targetMatAttrSettingAndPlanStrategy.MinProdDeliverLT() or
+             longAndShortCycleLabels                <> targetMatAttrSettingAndPlanStrategy.FlagLongTerm()     or
+             genericSpecialLabels                   <> targetMatAttrSettingAndPlanStrategy.FlagGeneric()      or
+             automaticMaterialPlanningPolicies      <> targetMatAttrSettingAndPlanStrategy.PlanningStrategyAuto() )
+        {
+          error( "瀵煎叆澶辫触锛屼笌褰撳墠绯荤粺瀛楁涓嶄竴鑷达細", targetMatAttrSettingAndPlanStrategy.MatCode() );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CreateOrUpdateData.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CreateOrUpdateData.qbl
new file mode 100644
index 0000000..6d76f0a
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_CreateOrUpdateData.qbl
@@ -0,0 +1,62 @@
+Quintiq file version 2.0
+#parent: #root
+Method CreateOrUpdateData (
+  GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    traverse ( this, MatAttrSettingAndPlanStrategyDataRow, masapsdr ) {
+      itemCode := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡缂栫爜" );
+      targetMatAttrSettingAndPlanStrategy := select( globalOTDTable, MatAttrSettingAndPlanStrategy, tempMASAPS, tempMASAPS.MatCode() = itemCode.value() );
+      if ( not isnull( targetMatAttrSettingAndPlanStrategy ) ) {
+        minimumNumberOfDaysInStock     := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "搴撳瓨鏈�灏忓ぉ鏁�" ).value();
+        maximumNumberOfDaysInInventory := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "搴撳瓨鏈�澶уぉ鏁�" ).value();
+        try {
+          targetMatAttrSettingAndPlanStrategy.MinimumNumberOfDaysInStock( [Number]minimumNumberOfDaysInStock );
+          targetMatAttrSettingAndPlanStrategy.MaximumNumberOfDaysInInventory( [Number]maximumNumberOfDaysInInventory );
+          targetMatAttrSettingAndPlanStrategy.UpdateBy( QuintiqUser::CurrentUser().Username() );
+          targetMatAttrSettingAndPlanStrategy.UpdateTime( DateTime::ActualTime() );
+        } onerror {
+          error( "搴撳瓨鏈�灏忓ぉ鏁版垨搴撳瓨鏈�澶уぉ鏁板繀椤讳负鏁存暟锛�", targetMatAttrSettingAndPlanStrategy.MatCode() );
+        }
+      } else {
+        businessType                      := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "涓氬姟绫诲瀷" ).value();
+        createItemCode                    := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡缂栫爜" ).value();
+        nameOfMaterial                    := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡鍚嶇О" ).value();
+        itemClassification                := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡鍒嗙被" ).value();
+        LTTimeDays                        := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "LT鏃堕棿锛堝ぉ锛�" ).value();
+    //    numberOfFinishedSKUs              := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鎴愬搧SKU鏁伴噺" ).value();
+    //    finishedProductDeliveryMinLTDays  := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鎴愬搧浜や粯Min-LT锛堝ぉ锛�" ).value();
+        longAndShortCycleLabels           := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "闀跨煭鍛ㄦ湡鏍囩" ).value();
+        genericSpecialLabels              := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "閫氱敤涓撶敤鏍囩" ).value();
+    //    automaticMaterialPlanningPolicies := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鑷姩鐗╂枡璁″垝绛栫暐" ).value();
+        usersManuallySchedulePolicies     := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐢ㄦ埛鎵嬪姩璁″垝绛栫暐" ).value();
+        minimumNumberOfDaysInStock        := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "搴撳瓨鏈�灏忓ぉ鏁�" ).value();
+        maximumNumberOfDaysInInventory    := select( masapsdr, MatAttrSettingAndPlanStrategyDataCell, tempMASAPSDC, tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "搴撳瓨鏈�澶уぉ鏁�" ).value();
+        try {
+          matAttrSettingAndPlanStrategy := globalOTDTable.MatAttrSettingAndPlanStrategy( relnew,
+                                                                                         BusinessType := businessType,
+                                                                                         MatCode := createItemCode,
+                                                                                         MatName := nameOfMaterial,
+                                                                                         MatType := itemClassification,
+                                                                                         MatArrivalLT := [Number]LTTimeDays,
+    //                                                                                     ProductCount := [Number]numberOfFinishedSKUs,
+    //                                                                                     MinProdDeliverLT := [Number]finishedProductDeliveryMinLTDays,
+                                                                                         FlagLongTerm := longAndShortCycleLabels,
+                                                                                         FlagGeneric := genericSpecialLabels,
+    //                                                                                     PlanningStrategyAuto := automaticMaterialPlanningPolicies,
+                                                                                         PlanningStrategyCustom := usersManuallySchedulePolicies,
+                                                                                         MinimumNumberOfDaysInStock := [Number]minimumNumberOfDaysInStock,
+                                                                                         MaximumNumberOfDaysInInventory := [Number]maximumNumberOfDaysInInventory
+                                                                                        );
+          matAttrSettingAndPlanStrategy.UpdateBy( QuintiqUser::CurrentUser().Username() );   
+          matAttrSettingAndPlanStrategy.UpdateTime( DateTime::ActualTime() );
+          matAttrSettingAndPlanStrategy.SerialNumber( maxselect( globalOTDTable, MatAttrSettingAndPlanStrategy, tempMASAPS, tempMASAPS.SerialNumber() ).SerialNumber() + 1 );                                                                                
+        } onerror {
+          error( "搴撳瓨鏈�灏忓ぉ鏁版垨搴撳瓨鏈�澶уぉ鏁板繀椤讳负鏁存暟锛�", targetMatAttrSettingAndPlanStrategy.MatCode() );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_SynchronizeData.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_SynchronizeData.qbl
new file mode 100644
index 0000000..c88a29b
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_SynchronizeData.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+Method SynchronizeData
+{
+  TextBody:
+  [*
+    this.VerifyThatTheItemCodeIsNotDuplicated();
+    
+    globalOTDTable := this.MatAttrSettingAndPlanStrategyInputSource().GlobalOTDTable();
+    
+    this.CheckThePrecedingColumn( globalOTDTable );
+    
+    this.CreateOrUpdateData( globalOTDTable );
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyThatTheItemCodeIsNotDuplicated.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyThatTheItemCodeIsNotDuplicated.qbl
new file mode 100644
index 0000000..cebf23b
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyThatTheItemCodeIsNotDuplicated.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Method VerifyThatTheItemCodeIsNotDuplicated
+{
+  TextBody:
+  [*
+    itemCodes := selectuniquevalues( this, 
+                                     MatAttrSettingAndPlanStrategyDataColumn.MatAttrSettingAndPlanStrategyDataCell, 
+                                     tempMASAPSDC,
+                                     tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡缂栫爜",
+                                     tempMASAPSDC.value() );
+    
+    traverse ( itemCodes, Elements, ic ) {
+      icTotal := selectset( this, 
+                            MatAttrSettingAndPlanStrategyDataColumn.MatAttrSettingAndPlanStrategyDataCell, 
+                            tempMASAPSDC,
+                            tempMASAPSDC.MatAttrSettingAndPlanStrategyDataColumn().name() = "鐗╂枡缂栫爜" and tempMASAPSDC.value() = ic );
+      if ( icTotal.Size() > 1 ) {
+        error( "瀛樺湪閲嶅鐗╂枡缂栫爜锛�", ic );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyTheTemplate.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyTheTemplate.qbl
new file mode 100644
index 0000000..c17b3d6
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_VerifyTheTemplate.qbl
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+Method VerifyTheTemplate
+{
+  TextBody:
+  [*
+    if ( select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 0 ).name()  <> "涓氬姟绫诲瀷"             or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 1 ).name()  <> "鐗╂枡缂栫爜"             or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 2 ).name()  <> "鐗╂枡鍚嶇О"             or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 3 ).name()  <> "鐗╂枡鍒嗙被"             or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 4 ).name()  <> "LT鏃堕棿锛堝ぉ锛�"         or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 5 ).name()  <> "鎴愬搧SKU鏁伴噺"          or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 6 ).name()  <> "鎴愬搧浜や粯Min-LT锛堝ぉ锛�" or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 7 ).name()  <> "闀跨煭鍛ㄦ湡鏍囩"         or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 8 ).name()  <> "閫氱敤涓撶敤鏍囩"         or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 9 ).name()  <> "鑷姩鐗╂枡璁″垝绛栫暐"     or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 10 ).name() <> "鐢ㄦ埛鎵嬪姩璁″垝绛栫暐"     or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 11 ).name() <> "搴撳瓨鏈�灏忓ぉ鏁�"         or
+         select( this, MatAttrSettingAndPlanStrategyDataColumn, tempMASAPSDC, tempMASAPSDC.columnIndex() = 12 ).name() <> "搴撳瓨鏈�澶уぉ鏁�"
+        ) {
+      error( "妯℃澘瑙f瀽閿欒" );    
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_parseRows.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_parseRows.qbl
index 4f276e4..c10da83 100644
--- a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_parseRows.qbl
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/Method_parseRows.qbl
@@ -1,6 +1,6 @@
 Quintiq file version 2.0
 #parent: #root
-Method parseRows
+Method ParseRows
 {
   TextBody:
   [*
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/StaticMethod_export.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/StaticMethod_export.qbl
index 35be39b..126e66e 100644
--- a/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/StaticMethod_export.qbl
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyDataTable/StaticMethod_export.qbl
@@ -55,6 +55,7 @@
     }
     //---------------------------------------------------------------------------------------------
     xmlTemplate := xmlTemplate + "</table>";
+    info( xmlTemplate );
     tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTemplate ) );
     XLS::SaveTable( tableHandle, OS::TempPath() + "MatAttrSettingAndPlanStrategy.xlsx" );
     file := OSFile::Construct();
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/DefaultValue_fileName.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/DefaultValue_fileName.qbl
deleted file mode 100644
index 104c0d8..0000000
--- a/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/DefaultValue_fileName.qbl
+++ /dev/null
@@ -1,6 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-DefaultValue
-{
-  TargetAttribute: fileName
-}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/Method_parseTable.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/Method_parseTable.qbl
index b970d61..20d7fd4 100644
--- a/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/Method_parseTable.qbl
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/Method_parseTable.qbl
@@ -4,20 +4,22 @@
 {
   TextBody:
   [*
-    // yypsybs Jul-1-2023 (created)
     tableGroupHandle := TableGroupHandle::Create( this.FileName() );
     tableGroupHandle := XLS::LoadTableGroupFromBinaryData( BinaryData::FromBase64EncodedString( this.Base64Str() ), tableGroupHandle, true, this.IsXlsx() );
     
     sheets := tableGroupHandle.TableNames();
     
-    traverse ( sheets, Elements, sheetName, sheetName = "MatAttrSettingAndPlanStrategy" ) {
+    traverse ( sheets, Elements, sheetName, sheetName = "鐗╂枡鏍囩" ) {
       tableHandle := tableGroupHandle.Table( sheetName );
       tableXML := TableHandle::ExportXML( tableHandle );
+      
       MatAttrSettingAndPlanStrategyDataTable::XMLImportMatAttrSettingAndPlanStrategyDataTableXMLHeaders(  tableXML );
-      parsedTable := MatAttrSettingAndPlanStrategyDataTable::XMLImportMatAttrSettingAndPlanStrategyDataTableXML( tableXML );
-      parsedTable.parseRows();
-      parsedTable.name( sheetName );
-      this.MatAttrSettingAndPlanStrategyDataTable( relinsert, &parsedTable ); 
+      matAttrSettingAndPlanStrategyDataTable := MatAttrSettingAndPlanStrategyDataTable::XMLImportMatAttrSettingAndPlanStrategyDataTableXML( tableXML );
+      
+      matAttrSettingAndPlanStrategyDataTable.ParseRows();
+      
+      matAttrSettingAndPlanStrategyDataTable.name( sheetName );
+      this.MatAttrSettingAndPlanStrategyDataTable( relinsert, &matAttrSettingAndPlanStrategyDataTable ); 
     }
   *]
 }
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_VerifyTheFileName.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_VerifyTheFileName.qbl
new file mode 100644
index 0000000..e5127f4
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_VerifyTheFileName.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod VerifyTheFileName (
+  JSON uploadJson
+)
+{
+  TextBody:
+  [*
+    fileNames := uploadJson.Get( "name" ).GetString().Tokenize( "." );
+    fileNameSuffix := fileNames.Element( fileNames.Size() - 1 );
+    if ( fileNameSuffix <> "xlsx" and fileNameSuffix <> "xls" ) {
+      error( "璇蜂笂浼燛xcel鏂囦欢" );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_upload.qbl b/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_upload.qbl
index be023c4..16be5bb 100644
--- a/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_upload.qbl
+++ b/_Main/BL/Type_MatAttrSettingAndPlanStrategyInputSource/StaticMethod_upload.qbl
@@ -1,7 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Upload (
-  GlobalOTDTable parent,
+  GlobalOTDTable globalOTDTable,
   String filePath,
   String base64Str,
   String userName
@@ -9,16 +9,15 @@
 {
   TextBody:
   [*
-    // yypsybs Jul-1-2023 (created)
-    parent.MatAttrSettingAndPlanStrategyInputSource( relflush );
-    info( "filePath : " + filePath );
+    globalOTDTable.MatAttrSettingAndPlanStrategyInputSource( relflush );
+    
     fileName := filePath.Tokenize( "\" ).Element( filePath.Tokenize( "\" ).Size() - 1 );
-    info( "fileName : " + fileName );
-    inputSource := parent.MatAttrSettingAndPlanStrategyInputSource( relnew,
-                                                                    FileName := fileName,
-                                                                    Base64Str := base64Str, 
-                                                                    IsXlsx := fileName.EndsWith( "xlsx" ), 
-                                                                    UserName := userName );
+    
+    inputSource := globalOTDTable.MatAttrSettingAndPlanStrategyInputSource( relnew,
+                                                                            FileName  := fileName,
+                                                                            Base64Str := base64Str, 
+                                                                            IsXlsx    := fileName.EndsWith( "xlsx" ), 
+                                                                            UserName  := userName );
     
     return inputSource;
   *]
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_BusinessType.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_BusinessType.qbl
new file mode 100644
index 0000000..5d9d3ba
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_BusinessType.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BusinessType
+{
+  #keys: '3[414702.0.129575801][414702.0.129575800][414702.0.129575802]'
+  Description: '涓氬姟绫诲瀷'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MaximumNumberOfDaysInInventory.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MaximumNumberOfDaysInInventory.qbl
new file mode 100644
index 0000000..d15fda5
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MaximumNumberOfDaysInInventory.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MaximumNumberOfDaysInInventory
+{
+  #keys: '3[414702.0.129559419][414702.0.129559418][414702.0.129559420]'
+  Description: '搴撳瓨鏈�澶уぉ鏁�'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MinimumNumberOfDaysInStock.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MinimumNumberOfDaysInStock.qbl
new file mode 100644
index 0000000..b1b5700
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_MinimumNumberOfDaysInStock.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MinimumNumberOfDaysInStock
+{
+  #keys: '3[414702.0.129559409][414702.0.129559408][414702.0.129559410]'
+  Description: '搴撳瓨鏈�灏忓ぉ鏁�'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_SerialNumber.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_SerialNumber.qbl
new file mode 100644
index 0000000..3efd0ad
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/Attribute_SerialNumber.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute SerialNumber
+{
+  #keys: '3[414702.0.129544801][414702.0.129544800][414702.0.129544802]'
+  Description: '搴忓彿'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_CreateIfNotExist.qbl
index c69081c..8e647b2 100644
--- a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_CreateIfNotExist.qbl
@@ -2,6 +2,8 @@
 #parent: #root
 StaticMethod CreateIfNotExist (
   GlobalOTDTable parent,
+  Number serialNumber,
+  String businessType,
   String matCode,
   String matName,
   String matType,
@@ -16,6 +18,8 @@
     value := MatAttrSettingAndPlanStrategy::GetExistByMatCode( parent, matCode );
     if( isnull( value ) ) {
       value := parent.MatAttrSettingAndPlanStrategy( relnew, 
+                                                     SerialNumber := serialNumber,
+                                                     BusinessType := businessType,
                                                      MatCode := matCode, 
                                                      MatName := matName,
                                                      MatType := matType,
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl
new file mode 100644
index 0000000..4b41017
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_ExportTheFileStream.qbl
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod ExportTheFileStream (
+  MatAttrSettingAndPlanStrategys masapss
+) as BinaryValue
+{
+  TextBody:
+  [*
+    text:= '<?xml version="1.0" encoding="utf-8" standalone="yes"?><table><name>鐗╂枡鏍囩</name><column><name>涓氬姟绫诲瀷</name><type>String</type></column><column><name>鐗╂枡缂栫爜</name><type>String</type></column><column><name>鐗╂枡鍚嶇О</name><type>String</type></column><column><name>鐗╂枡鍒嗙被</name><type>String</type></column><column><name>LT鏃堕棿锛堝ぉ锛�</name><type>Number</type></column><column><name>鎴愬搧SKU鏁伴噺</name><type>Number</type></column><column><name>鎴愬搧浜や粯Min-LT锛堝ぉ锛�</name><type>Number</type></column><column><name>闀跨煭鍛ㄦ湡鏍囩</name><type>String</type></column><column><name>閫氱敤涓撶敤鏍囩</name><type>String</type></column><column><name>鑷姩鐗╂枡璁″垝绛栫暐</name><type>String</type></column><column><name>鐢ㄦ埛鎵嬪姩璁″垝绛栫暐</name><type>String</type></column><column><name>搴撳瓨鏈�灏忓ぉ鏁�</name><type>Number</type></column><column><name>搴撳瓨鏈�澶уぉ鏁�</name><type>Number</type></column></table>';
+    xmlDOMImplementation := XMLDOMImplementation::Create();
+    xmlDOMDocument := xmlDOMImplementation.CreateDocumentFromString( text );
+    
+    masapss := selectsortedset( masapss, Elements, tempMASAPS, true, tempMASAPS.MatCode() );
+    tableElement:= xmlDOMDocument.GetElementByTagName( "table", 0 );
+    
+    traverse ( masapss, Elements, masaps ) {
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.BusinessType(), "涓氬姟绫诲瀷" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.MatCode(), "鐗╂枡缂栫爜" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.MatName(), "鐗╂枡鍚嶇О" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.MatType(), "鐗╂枡鍒嗙被" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]masaps.MatArrivalLT(), "LT鏃堕棿锛堝ぉ锛�" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]masaps.ProductCount(), "鎴愬搧SKU鏁伴噺" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]masaps.MinProdDeliverLT(), "鎴愬搧浜や粯Min-LT锛堝ぉ锛�" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.FlagLongTerm(), "闀跨煭鍛ㄦ湡鏍囩" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.FlagGeneric(), "閫氱敤涓撶敤鏍囩" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.PlanningStrategyAuto(), "鑷姩鐗╂枡璁″垝绛栫暐" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, masaps.PlanningStrategyCustom(), "鐢ㄦ埛鎵嬪姩璁″垝绛栫暐" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]masaps.MinimumNumberOfDaysInStock(), "搴撳瓨鏈�灏忓ぉ鏁�" );
+      MatAttrSettingAndPlanStrategy::GeneratesTheSpecifiedXMLColumn( xmlDOMDocument, tableElement, [String]masaps.MaximumNumberOfDaysInInventory(), "搴撳瓨鏈�澶уぉ鏁�" );
+    }
+    
+    xmlDOMSerializer := xmlDOMImplementation.CreateSerializer();
+    xmlTableString := xmlDOMSerializer.WriteToString( xmlDOMDocument );
+    
+    tableHandle := TableHandle::ImportXML( BinaryValue::Construct( xmlTableString ) );
+    tableGroupHandle := TableGroupHandle::Create( "鐗╂枡鏍囩" );
+    tableGroupHandle.Add( tableHandle );
+    tableBinaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return tableBinaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl
new file mode 100644
index 0000000..f40c634
--- /dev/null
+++ b/_Main/BL/Type_MatAttrSettingAndPlanningStrategy/StaticMethod_GeneratesTheSpecifiedXMLColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GeneratesTheSpecifiedXMLColumn (
+  XMLDOMDocument xmlDOMDocument,
+  XMLDOMElement tableElement,
+  String value,
+  String columnName
+)
+{
+  TextBody:
+  [*
+    columnElements := tableElement.GetElementsByTagName( "column" );
+    
+    traverse ( columnElements, Elements, ce ) {
+      nameElement := ce.GetElementByTagName( "name", 0 );
+      if ( nameElement.TextContent() = columnName ) {
+        cell := xmlDOMDocument.CreateElement( "cell" );
+        cell.SetAttribute( "value", value );
+        ce.AppendChild( cell );
+      }
+    }
+  *]
+}
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
index 6055329..51fa4f0 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
@@ -78,6 +78,8 @@
           ]
         }
         Component MenuDoSync { #keys: '[414384.0.605664172]' BaseType: 'Menu' Properties: [ Image: 'CLOUD_DOWNLOAD' Text: 'DoSync' ] }
+        Component menuSeparator506 { #keys: '[414702.0.137524309]' BaseType: 'Menu' Properties: [ Separator: true ] }
+        Component ComponentMenuAnalysisGlobalOTDTable { #keys: '[414702.0.137524953]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysisGlobalOTDTable' Text: '' ] }
       ]
       Properties:
       [
@@ -94,6 +96,8 @@
           c: Menu8
           c: MenuSelectDemoDataset
           c: MenuDoSync
+          c: menuSeparator506
+          c: ComponentMenuAnalysisGlobalOTDTable
         }
       ]
     }
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTop.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTop.def
new file mode 100644
index 0000000..89fbbad
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTop.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+Component swTop
+{
+  #keys: '[530.0.3531806]'
+  BaseType: 'swTop'
+  IsDerived: true
+  Children:
+  [
+    Component spTopLeft
+    {
+      #keys: '[530.0.3531807]'
+      BaseType: 'spTopLeft'
+      IsDerived: true
+      Children:
+      [
+        Component Analysis
+        {
+          #keys: '[530.0.3532065]'
+          BaseType: 'Analysis'
+          IsDerived: true
+          Properties:
+          [
+            GlobalInstance: 'GlobalOTDTable'
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTopMost.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTopMost.def
new file mode 100644
index 0000000..8a8fcd7
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/Component_swTopMost.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+Component swTopMost
+{
+  #keys: '[530.0.3531801]'
+  BaseType: 'swTopMost'
+  IsDerived: true
+  Children:
+  [
+    Component SplitterPane1
+    {
+      #keys: '[530.0.3531802]'
+      BaseType: 'SplitterPane1'
+      IsDerived: true
+      Children:
+      [
+        #child: swTop
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/_ROOT_Component_frmStandardAnalysisGlobalOTDTable.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/_ROOT_Component_frmStandardAnalysisGlobalOTDTable.def
new file mode 100644
index 0000000..587a278
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysisGlobalOTDTable/_ROOT_Component_frmStandardAnalysisGlobalOTDTable.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlanner
+OrphanComponent frmStandardAnalysisGlobalOTDTable
+{
+  #keys: '[414702.0.137524322]'
+  BaseType: 'frmStandardAnalysis'
+  Children:
+  [
+    #child: swTopMost
+  ]
+  Properties:
+  [
+    Height: 601
+    Image: 'BIRD'
+    Title: 'Analysis GlobalOTDTable'
+    Width: 783
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def
index b948d58..d927b55 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonIn.def
@@ -2,7 +2,6 @@
 #parent: LibSOPImpExp_ContextMenuImport/MenuImportFromCommonInformationModel
 Response OnClick () id:Response_TIANMA_JITUAN_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonInformationModel_OnClick
 {
-  #warning 103647: "Identifier 'Response_MacroPlanner_LibSOPImpExp_ContextMenuImport_MenuImportFromCommonInformationModel_OnClick' is not unique in the scope of 'LibSOPImpExp_ContextMenuImport' component on 'ApplicationMacroPlanner'. The reason can be a recently added ModeledResponse. A unique identifier was generated automatically."
   #keys: '[146140.2.683371355]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebMenu_OnClick'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Component_pnlContent.def
deleted file mode 100644
index 802f9f1..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Component_pnlContent.def
+++ /dev/null
@@ -1,27 +0,0 @@
-Quintiq file version 2.0
-Component pnlContent
-{
-  #keys: '[414384.0.770880995]'
-  BaseType: 'WebPanel'
-  Children:
-  [
-    Component dropDownPlanningStrategyCustom
-    {
-      #keys: '[414384.0.770871903]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        AllowEmpty: true
-        DataBinding: 'DataHolderDialogData.Data.PlanningStrategyCustom'
-        Label: 'PlanningStrategyCustom'
-        Strings: 'JIT;瀹夊叏搴撳瓨;VMI'
-        Taborder: 0
-      ]
-    }
-  ]
-  Properties:
-  [
-    Padding: 'true'
-    Taborder: 0
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Method_Edit.def
deleted file mode 100644
index 20760cd..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Method_Edit.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method Edit (
-  MatAttrSettingAndPlanStrategy item
-) id:Method_DialogEditMatAttrSettingAndPlanStrategy_Edit
-{
-  #keys: '[414384.0.772161633]'
-  Body:
-  [*
-    // Edit uom
-    data := shadow( item );
-    
-    DataHolderDialogData.Data( &data );
-    
-    ApplicationMacroPlanner.ShowFormModal( this );
-  *]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Method_OnOK.def b/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Method_OnOK.def
deleted file mode 100644
index d26a7a1..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Method_OnOK.def
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method OnOK () id:Method_DialogEditMatAttrSettingAndPlanStrategy_OnOK
-{
-  #keys: '[414384.0.772193415]'
-  Body:
-  [*
-    // On ok
-    Form.ApplyChanges();
-    
-    data := DataHolderDialogData.Data();
-    data.WrappedInstance().PlanningStrategyCustom( dropDownPlanningStrategyCustom.Text() );
-    
-    Form.Close();
-  *]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Component_pnlActions.def b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlActions.def
similarity index 82%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogEdit/Component_pnlActions.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlActions.def
index 16082f0..adcf81f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Component_pnlActions.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlActions.def
@@ -1,13 +1,13 @@
 Quintiq file version 2.0
 Component pnlActions
 {
-  #keys: '[414384.0.770880997]'
+  #keys: '[414702.0.131771244]'
   BaseType: 'WebPanel'
   Children:
   [
     Component btnOk
     {
-      #keys: '[414384.0.770881001]'
+      #keys: '[414702.0.131771248]'
       BaseType: 'WebButton'
       Properties:
       [
@@ -17,7 +17,7 @@
     }
     Component btnCancel
     {
-      #keys: '[414384.0.770881003]'
+      #keys: '[414702.0.131771250]'
       BaseType: 'WebButton'
       Properties:
       [
@@ -35,6 +35,6 @@
     Orientation: 'horizontal'
     Padding: 'true'
     Style: 'footer'
-    Taborder: 1
+    Taborder: 2
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlContent.def
new file mode 100644
index 0000000..9155690
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlContent.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component pnlContent
+{
+  #keys: '[414702.0.131771242]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: pnlGeneral
+  ]
+  Properties:
+  [
+    Padding: 'true'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlGeneral.def b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlGeneral.def
new file mode 100644
index 0000000..a034ddf
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Component_pnlGeneral.def
@@ -0,0 +1,133 @@
+Quintiq file version 2.0
+Component pnlGeneral
+{
+  #keys: '[414702.0.139154801]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component efBusinessType
+    {
+      #keys: '[414702.0.139035752]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.BusinessType'
+        Enabled: false
+        Label: '涓氬姟绫诲瀷'
+        Taborder: 0
+      ]
+    }
+    Component efItemCode
+    {
+      #keys: '[414702.0.139035772]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.MatCode'
+        Enabled: false
+        Label: '鐗╂枡缂栫爜'
+        Taborder: 1
+      ]
+    }
+    Component efNameOfMaterial
+    {
+      #keys: '[414702.0.139035784]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.MatName'
+        Enabled: false
+        Label: '鐗╂枡鍚嶇О'
+        Taborder: 2
+      ]
+    }
+    Component efMaterialArrivalLTDays
+    {
+      #keys: '[414702.0.139035796]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.MatArrivalLT'
+        Description: 'Finished product minimum delivery LT (days)'
+        Enabled: false
+        Label: '鐗╂枡鍒拌揣LT锛堝ぉ锛�'
+        Taborder: 3
+      ]
+    }
+    Component efFinishedProductMinimumDeliveryLTDays
+    {
+      #keys: '[414702.0.139035809]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.MinProdDeliverLT'
+        Enabled: false
+        Label: '鎴愬搧鏈�灏忎氦浠楲T锛堝ぉ锛�'
+        Taborder: 4
+      ]
+    }
+    Component efFinishedSKUType
+    {
+      #keys: '[414702.0.139035821]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.ProductCount'
+        Enabled: false
+        Label: '鎴愬搧SKU绉嶇被'
+        Taborder: 5
+      ]
+    }
+    Component efTheSystemAutomaticallySchedulesPolicies
+    {
+      #keys: '[414702.0.139035834]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.PlanningStrategyAuto'
+        Enabled: false
+        Label: '绯荤粺鑷姩璁″垝绛栫暐'
+        Taborder: 6
+      ]
+    }
+    Component ddslMaterialPlanningPolicyChanges
+    {
+      #keys: '[414702.0.139877037]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        AllowEmpty: true
+        DataBinding: 'DataHolderDialogData.Data.PlanningStrategyCustom'
+        Label: '鐗╂枡璁″垝绛栫暐鍙樻洿'
+        Strings: 'JIT;VMI;M/A;瀹夊叏搴撳瓨;PO鎷夋枡'
+        Taborder: 7
+      ]
+    }
+    Component efTheMinimumNumberOfDaysForAnItemToBeInventoried
+    {
+      #keys: '[414702.0.139969846]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.MinimumNumberOfDaysInStock'
+        Label: '鐗╂枡搴撳瓨鏈�灏忓ぉ鏁�'
+        Taborder: 8
+      ]
+    }
+    Component efTheMaximumNumberOfDaysThatTheItemIsInStock
+    {
+      #keys: '[414702.0.139969907]'
+      BaseType: 'WebEditField'
+      Properties:
+      [
+        DataBinding: 'DataHolderDialogData.Data.MaximumNumberOfDaysInInventory'
+        Label: '鐗╂枡搴撳瓨鏈�澶уぉ鏁�'
+        Taborder: 9
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Method_Edit.def b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Method_Edit.def
new file mode 100644
index 0000000..78dd14b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Method_Edit.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+Method Edit (
+  MatAttrSettingAndPlanStrategy selection
+) id:Method_DialogCreateEditMaterialLabelingAndPlanningStrategy_Edit
+{
+  #keys: '[414702.0.137732159]'
+  Body:
+  [*
+    //data := shadow( selection );
+    DataHolderDialogData.Data( selection );
+    
+    selection.UpdateBy( QuintiqUser::CurrentUser().Username() );
+    selection.UpdateTime( DateTime::ActualTime() );
+    
+    ApplicationMacroPlanner.ShowFormModal( this );
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Response_pnlActions_btnCancel_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnCancel_OnClick.def
similarity index 88%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogEdit/Response_pnlActions_btnCancel_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnCancel_OnClick.def
index 179c75d..e03c477 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Response_pnlActions_btnCancel_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnCancel_OnClick.def
@@ -2,7 +2,7 @@
 #parent: pnlActions/btnCancel
 Response OnClick () id:Response_pnlActions_btnCancel_OnClick
 {
-  #keys: '[414384.0.770881007]'
+  #keys: '[414702.0.131771254]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
   QuillAction
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Response_pnlActions_btnOk_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnOk_OnClick.def
similarity index 74%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogEdit/Response_pnlActions_btnOk_OnClick.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnOk_OnClick.def
index d6ccb93..8f6e89a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/Response_pnlActions_btnOk_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/Response_pnlActions_btnOk_OnClick.def
@@ -2,14 +2,15 @@
 #parent: pnlActions/btnOk
 Response OnClick () id:Response_pnlActions_btnOk_OnClick
 {
-  #keys: '[414384.0.770881006]'
+  #keys: '[414702.0.131771253]'
   DefinitionID: 'Responsedef_WebButton_OnClick'
   GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      Form.OnOK();
+      Form.ApplyChanges();
+      Form.Close();
     *]
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/_ROOT_Component_DialogEditMatAttrSettingAndPlanStrategy.def b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/_ROOT_Component_DialogCreateEditMaterialLabelingAndPlanningStrategy.def
similarity index 66%
rename from _Main/UI/MacroPlannerWebApp/Component_DialogEdit/_ROOT_Component_DialogEditMatAttrSettingAndPlanStrategy.def
rename to _Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/_ROOT_Component_DialogCreateEditMaterialLabelingAndPlanningStrategy.def
index bc7540c..78c4c93 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogEdit/_ROOT_Component_DialogEditMatAttrSettingAndPlanStrategy.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogMaterialLabelingAndPlanningStrategy/_ROOT_Component_DialogCreateEditMaterialLabelingAndPlanningStrategy.def
@@ -1,9 +1,9 @@
 Quintiq file version 2.0
 #root
 #parent: MacroPlannerWebApp
-OrphanComponent DialogEditMatAttrSettingAndPlanStrategy
+OrphanComponent DialogCreateEditMaterialLabelingAndPlanningStrategy
 {
-  #keys: '[414384.0.770880993]'
+  #keys: '[414702.0.131771240]'
   BaseType: 'WebForm'
   Children:
   [
@@ -11,12 +11,12 @@
     #child: pnlActions
     Component DataHolderDialogData
     {
-      #keys: '[414384.0.772100860]'
+      #keys: '[414702.0.139153395]'
       BaseType: 'WebDataHolder'
-      Databinding: 'shadow[MatAttrSettingAndPlanStrategy]*'
+      Databinding: 'MatAttrSettingAndPlanStrategy'
       Properties:
       [
-        Taborder: 2
+        Taborder: 0
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_ListMatAttrSettingAndPlanStrategy.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_ListMatAttrSettingAndPlanStrategy.def
deleted file mode 100644
index 37dde34..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_ListMatAttrSettingAndPlanStrategy.def
+++ /dev/null
@@ -1,105 +0,0 @@
-Quintiq file version 2.0
-Component ListMatAttrSettingAndPlanStrategy
-{
-  #keys: '[414384.0.769370441]'
-  BaseType: 'WebList'
-  Children:
-  [
-    Component DataExtractorMatAttrSettingAndPlanStrategy
-    {
-      #keys: '[414384.0.769370442]'
-      BaseType: 'WebDataExtractor'
-      Properties:
-      [
-        DataType: 'GlobalOTDTable'
-        Source: 'GlobalOTDTable'
-        Taborder: 0
-        Transformation: 'MatAttrSettingAndPlanStrategy'
-      ]
-    }
-    Component DataSetLevelMatAttrSettingAndPlanStrategy
-    {
-      #keys: '[414384.0.769370443]'
-      BaseType: 'WebDataSetLevel'
-      Children:
-      [
-        #child: listContextMenuMatAttrSettingAndPlanStrategy
-      ]
-      Properties:
-      [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatCode","title":"MatCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatName","title":"MatName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatType","title":"MatType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatArrivalLT","title":"MatArrivalLT","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatArrivalLT"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductCount","title":"ProductCount","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductCount"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MinProdDeliverLT","title":"MinProdDeliverLT","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MinProdDeliverLT"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FlagLongTerm","title":"FlagLongTerm","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FlagLongTerm"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FlagGeneric","title":"FlagGeneric","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FlagGeneric"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PlanningStrategyAuto","title":"PlanningStrategyAuto","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PlanningStrategyAuto"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PlanningStrategyCustom","title":"PlanningStrategyCustom","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PlanningStrategyCustom"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UpdateBy","title":"UpdateBy","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UpdateBy"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UpdateTime","title":"UpdateTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UpdateTime"}}]'
-        ContextMenu: 'listContextMenuMatAttrSettingAndPlanStrategy'
-        SortCriteria: 'MatCode'
-        Taborder: 1
-      ]
-    }
-    #child: listActionBarPageMatAttrSettingAndPlanStrategy
-  ]
-  Properties:
-  [
-    Taborder: 2
-  ]
-  ResponseDefinitions:
-  [
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategy_WebMenu_OnClick
-    {
-      #keys: '[414384.0.769370436]'
-      Initiator: 'WebMenu'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument selection
-        {
-          #keys: '[2651.0.25404553]'
-          Binding: 'this.Selection()'
-        }
-      ]
-    }
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategy_WebButton_OnClick
-    {
-      #keys: '[414384.0.769370435]'
-      Initiator: 'WebButton'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument selection
-        {
-          #keys: '[6763.0.7953347]'
-          Binding: 'this.Selection()'
-        }
-      ]
-    }
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategy_WebMenu_OnClick_106
-    {
-      #keys: '[414384.0.769370434]'
-      Initiator: 'WebMenu'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument checked
-        {
-          #keys: '[6763.0.7953392]'
-          Binding: 'this.Checked()'
-        }
-      ]
-    }
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategy_WebButton_OnClick_415
-    {
-      #keys: '[414384.0.769370433]'
-      Initiator: 'WebButton'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument checked
-        {
-          #keys: '[6763.0.7953437]'
-          Binding: 'this.Checked()'
-        }
-      ]
-    }
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_listActionBarPageMatAttrSettingAndPlanStrategy.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_listActionBarPageMatAttrSettingAndPlanStrategy.def
deleted file mode 100644
index 524e038..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_listActionBarPageMatAttrSettingAndPlanStrategy.def
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component listActionBarPageMatAttrSettingAndPlanStrategy
-{
-  #keys: '[414384.0.769370448]'
-  BaseType: 'listActionBarPage'
-  Properties:
-  [
-    Taborder: 2
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_listContextMenuMatAttrSettingAndPlanStrategy.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_listContextMenuMatAttrSettingAndPlanStrategy.def
deleted file mode 100644
index 3415621..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Component_listContextMenuMatAttrSettingAndPlanStrategy.def
+++ /dev/null
@@ -1,27 +0,0 @@
-Quintiq file version 2.0
-Component listContextMenuMatAttrSettingAndPlanStrategy
-{
-  #keys: '[414384.0.769370444]'
-  BaseType: 'listContextMenu'
-  Children:
-  [
-    Component MenuEdit
-    {
-      #keys: '[414384.0.769370445]'
-      BaseType: 'WebMenu'
-      Properties:
-      [
-        BindOnDoubleClick: true
-        DelegationID: 'ActionBarData_Edit'
-        Image: 'PENCIL'
-        Shortcut: 'Enter'
-        Taborder: 3
-        Title: 'Edit...'
-      ]
-    }
-  ]
-  Properties:
-  [
-    Taborder: 0
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ButtonMatAttrSettingAndPlanStrategyExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ButtonMatAttrSettingAndPlanStrategyExport_OnClick.def
deleted file mode 100644
index 73a180c..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ButtonMatAttrSettingAndPlanStrategyExport_OnClick.def
+++ /dev/null
@@ -1,18 +0,0 @@
-Quintiq file version 2.0
-#parent: ButtonMatAttrSettingAndPlanStrategyExport
-Response OnClick () id:Response_FormMatAttrSettingAndPlanStrategy_ButtonMatAttrSettingAndPlanStrategyExport_OnClick
-{
-  #keys: '[414384.0.772313427]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      info( "ButtonMatAttrSettingAndPlanStrategyExport.OnClick" );
-      Application.Download( "MatAttrSettingAndPlanningStrategy.xlsx", 
-                            MatAttrSettingAndPlanStrategyDataTable::Export( GlobalOTDTable ) );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ButtonMatAttrSettingAndPlanStrategyImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ButtonMatAttrSettingAndPlanStrategyImport_OnClick.def
deleted file mode 100644
index 183442b..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ButtonMatAttrSettingAndPlanStrategyImport_OnClick.def
+++ /dev/null
@@ -1,32 +0,0 @@
-Quintiq file version 2.0
-#parent: ButtonMatAttrSettingAndPlanStrategyImport
-Response OnClick () id:Response_FormMatAttrSettingAndPlanStrategy_ButtonMatAttrSettingAndPlanStrategyImport_OnClick
-{
-  #keys: '[414384.0.772313506]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  QuillAction
-  {
-    Body:
-    [*
-      try {
-        uploadJson := Application.GetFile();
-        json := JSON::Parse( uploadJson );
-        if( json.IsArray() or json.Size() = 0 ) {
-          error( "please select one .xls or .xlsx file" ); 
-        }
-        name := json.Get( "name" ).GetString();
-        base64Data := json.Get( "data" ).GetString();
-        inputSource := MatAttrSettingAndPlanStrategyInputSource::Upload( GlobalOTDTable, name, base64Data, ApplicationMacroPlanner.GetUserName() );
-        inputSource.ParseTable();
-        inputSource.SaveData();
-      } onerror {
-        info( e.GeneralInformation() );
-        info( e.DetailedInformation() );
-        info( e.DeveloperInformation() );
-        WebMessageBox::Error( e.GeneralInformation() );
-      }
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ListMatAttrSettingAndPlanStrategy_MenuEdit_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ListMatAttrSettingAndPlanStrategy_MenuEdit_OnClick.def
deleted file mode 100644
index f0014e8..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_ListMatAttrSettingAndPlanStrategy_MenuEdit_OnClick.def
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: ListMatAttrSettingAndPlanStrategy
-Response OnClick (
-  MatAttrSettingAndPlanStrategy selection
-) id:Response_ListMatAttrSettingAndPlanStrategy_MenuEdit_OnClick
-{
-  #keys: '[414384.0.769370438]'
-  CanBindMultiple: false
-  DefinitionID => /ListMatAttrSettingAndPlanStrategy/Responsedef_ListMatAttrSettingAndPlanStrategy_WebMenu_OnClick
-  GroupServerCalls: true
-  Initiator: 'MenuEdit'
-  QuillAction
-  {
-    Body:
-    [*
-      dlg := construct( DialogEditMatAttrSettingAndPlanStrategy );
-      dlg.Edit( selection );
-    *]
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_OnCreated.def
deleted file mode 100644
index 461fa7c..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/Response_OnCreated.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Response OnCreated () id:Response_FormMatAttrSettingAndPlanStrategy_OnCreated
-{
-  #keys: '[414384.0.770811994]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebComponent_OnCreated'
-  GroupServerCalls: true
-  QuillAction
-  {
-    Body:
-    [*
-      GlobalOTDTable.InitTestData();
-      info( "FormMatAttrSettingAndPlanStrategy created" )
-    *]
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/_ROOT_Component_FormMatAttrSettingAndPlanStrategy.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/_ROOT_Component_FormMatAttrSettingAndPlanStrategy.def
deleted file mode 100644
index 7d0618e..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategy/_ROOT_Component_FormMatAttrSettingAndPlanStrategy.def
+++ /dev/null
@@ -1,39 +0,0 @@
-Quintiq file version 2.0
-#root
-#parent: MacroPlannerWebApp
-OrphanComponent FormMatAttrSettingAndPlanStrategy
-{
-  #keys: '[414384.0.767100500]'
-  BaseType: 'WebForm'
-  Children:
-  [
-    #child: ListMatAttrSettingAndPlanStrategy
-    Component ButtonMatAttrSettingAndPlanStrategyExport
-    {
-      #keys: '[414384.0.770831027]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'EXPORT1'
-        Label: 'Export'
-        Taborder: 0
-      ]
-    }
-    Component ButtonMatAttrSettingAndPlanStrategyImport
-    {
-      #keys: '[414384.0.770831036]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'IMPORT1'
-        Label: 'Import'
-        Taborder: 1
-      ]
-    }
-  ]
-  Properties:
-  [
-    Description: '4.11.鐗╂枡灞炴�ф爣绛捐瀹�&鐗╂枡璁″垝绛栫暐'
-    Title: '鐗╂枡灞炴�ф爣绛句笌鐗╂枡璁″垝绛栫暐'
-  ]
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_ListMatAttrSettingAndPlanStrategyDetail\04321.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_ListMatAttrSettingAndPlanStrategyDetail\04321.def"
deleted file mode 100644
index 6a99d11..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_ListMatAttrSettingAndPlanStrategyDetail\04321.def"
+++ /dev/null
@@ -1,106 +0,0 @@
-Quintiq file version 2.0
-Component ListMatAttrSettingAndPlanStrategyDetail id:ListMatAttrSettingAndPlanStrategyDetail_21
-{
-  #keys: '[414384.0.769370487]'
-  BaseType: 'WebList'
-  Children:
-  [
-    Component DataExtractorMatAttrSettingAndPlanStrategyDetail
-    {
-      #keys: '[414384.0.769370488]'
-      BaseType: 'WebDataExtractor'
-      Properties:
-      [
-        DataType: 'MatAttrSettingAndPlanStrategy'
-        ExtractionMode: 'Selected'
-        Source: 'FormMatAttrSettingAndPlanStrategy.ListMatAttrSettingAndPlanStrategy'
-        Taborder: 0
-        Transformation: 'MatAttrSettingAndPlanStrategyDetail'
-      ]
-    }
-    Component DataSetLevelMatAttrSettingAndPlanStrategyDetail
-    {
-      #keys: '[414384.0.769370489]'
-      BaseType: 'WebDataSetLevel'
-      Children:
-      [
-        #child: listContextMenuMatAttrSettingAndPlanStrategyDetail_1
-      ]
-      Properties:
-      [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatCode","title":"MatCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductCode","title":"ProductCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StandardLT","title":"StandardLT","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StandardLT"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductDesc","title":"ProductDesc","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductDesc"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Comment","title":"Comment","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Comment"}}]'
-        ContextMenu: 'listContextMenuMatAttrSettingAndPlanStrategyDetail'
-        SortCriteria: 'MatCode;ProductCode'
-        Taborder: 1
-      ]
-    }
-    #child: listActionBarPageMatAttrSettingAndPlanStrategyDetail_1
-  ]
-  Properties:
-  [
-    Taborder: 0
-  ]
-  ResponseDefinitions:
-  [
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategyDetail_21_WebMenu_OnClick
-    {
-      #keys: '[414384.0.769370482]'
-      Initiator: 'WebMenu'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument selection
-        {
-          #keys: '[2651.0.25404553]'
-          Binding: 'this.Selection()'
-        }
-      ]
-    }
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategyDetail_21_WebButton_OnClick
-    {
-      #keys: '[414384.0.769370481]'
-      Initiator: 'WebButton'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument selection
-        {
-          #keys: '[6763.0.7953347]'
-          Binding: 'this.Selection()'
-        }
-      ]
-    }
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategyDetail_21_WebMenu_OnClick_737
-    {
-      #keys: '[414384.0.769370480]'
-      Initiator: 'WebMenu'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument checked
-        {
-          #keys: '[6763.0.7953392]'
-          Binding: 'this.Checked()'
-        }
-      ]
-    }
-    DelegatedResponseDefinition OnClick id:Responsedef_ListMatAttrSettingAndPlanStrategyDetail_21_WebButton_OnClick_456
-    {
-      #keys: '[414384.0.769370479]'
-      Initiator: 'WebButton'
-      IsInherited: false
-      ResponseType: 'OnClick'
-      Arguments:
-      [
-        ResponseDefinitionArgument checked
-        {
-          #keys: '[6763.0.7953437]'
-          Binding: 'this.Checked()'
-        }
-      ]
-    }
-  ]
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_listActionBarPageMatAttrSettingAndPlanStrategyDetail\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_listActionBarPageMatAttrSettingAndPlanStrategyDetail\0431.def"
deleted file mode 100644
index c48d2ee..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_listActionBarPageMatAttrSettingAndPlanStrategyDetail\0431.def"
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component listActionBarPageMatAttrSettingAndPlanStrategyDetail id:listActionBarPageMatAttrSettingAndPlanStrategyDetail_1
-{
-  #keys: '[414384.0.769370494]'
-  BaseType: 'listActionBarPage'
-  Properties:
-  [
-    Taborder: 2
-  ]
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_listContextMenuMatAttrSettingAndPlanStrategyDetail\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_listContextMenuMatAttrSettingAndPlanStrategyDetail\0431.def"
deleted file mode 100644
index a829c7d..0000000
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/Component_listContextMenuMatAttrSettingAndPlanStrategyDetail\0431.def"
+++ /dev/null
@@ -1,10 +0,0 @@
-Quintiq file version 2.0
-Component listContextMenuMatAttrSettingAndPlanStrategyDetail id:listContextMenuMatAttrSettingAndPlanStrategyDetail_1
-{
-  #keys: '[414384.0.769370490]'
-  BaseType: 'listContextMenu'
-  Properties:
-  [
-    Taborder: 0
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/_ROOT_Component_FormMatAttrSettingAndPlanStrategyDetail.def b/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/_ROOT_Component_FormMatAttrSettingAndPlanStrategyDetail.def
deleted file mode 100644
index 5247d29..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormMatAttrSettingAndPlanStrategyDetail/_ROOT_Component_FormMatAttrSettingAndPlanStrategyDetail.def
+++ /dev/null
@@ -1,17 +0,0 @@
-Quintiq file version 2.0
-#root
-#parent: MacroPlannerWebApp
-OrphanComponent FormMatAttrSettingAndPlanStrategyDetail
-{
-  #keys: '[414384.0.769370336]'
-  BaseType: 'WebForm'
-  Children:
-  [
-    #child: ListMatAttrSettingAndPlanStrategyDetail_21
-  ]
-  Properties:
-  [
-    Description: '鐗╂枡灞炴�ф爣绛捐瀹�&鐗╂枡璁″垝绛栫暐'
-    Title: '鐗╂枡鍏宠仈浜у搧'
-  ]
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListChildMaterial.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListChildMaterial.def
new file mode 100644
index 0000000..40e2efd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListChildMaterial.def
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+Component ListChildMaterial
+{
+  #keys: '[414702.0.122536770]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorChildMaterial
+    {
+      #keys: '[414702.0.122536771]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MatAttrSettingAndPlanStrategy'
+        ExtractionMode: 'Selected'
+        Source: 'PanelMaterial.ListMaterialMaterialLabelingAndPlanningStrategy'
+        Taborder: 0
+        Transformation: 'MatAttrSettingAndPlanStrategyDetail'
+      ]
+    }
+    #child: listActionBarPageChildMaterial
+    Component DataSetLevelChildMaterial
+    {
+      #keys: '[414702.0.122536776]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuChildMaterial
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatCode","title":"MatCode","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"MatCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductCode","title":"ProductCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StandardLT","title":"StandardLT","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StandardLT"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductDesc","title":"ProductDesc","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductDesc"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Comment","title":"Comment","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Comment"}}]'
+        ContextMenu: 'listContextMenuChildMaterial'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListMaterialMaterialLabelingAndPlanningStrategy\043880.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListMaterialMaterialLabelingAndPlanningStrategy\043880.def"
new file mode 100644
index 0000000..698efbd
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_ListMaterialMaterialLabelingAndPlanningStrategy\043880.def"
@@ -0,0 +1,60 @@
+Quintiq file version 2.0
+Component ListMaterialMaterialLabelingAndPlanningStrategy id:ListMaterialMaterialLabelingAndPlanningStrategy_880
+{
+  #keys: '[414702.0.122174685]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractorMaterial367
+    {
+      #keys: '[414702.0.122174686]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'GlobalOTDTable'
+        Source: 'GlobalOTDTable'
+        Taborder: 0
+        Transformation: 'MatAttrSettingAndPlanStrategy'
+      ]
+    }
+    #child: listActionBarPageMaterial790_1
+    Component DataSetLevelMaterial679
+    {
+      #keys: '[414702.0.122174688]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenuMaterial455_1
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SerialNumber","title":"SerialNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"SerialNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessType","title":"BusinessType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatCode","title":"MatCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatCode"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatName","title":"MatName","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatName"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatType","title":"MatType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MatArrivalLT","title":"MatArrivalLT","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MatArrivalLT"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductCount","title":"ProductCount","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ProductCount"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MinProdDeliverLT","title":"MinProdDeliverLT","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"MinProdDeliverLT"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FlagLongTerm","title":"FlagLongTerm","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FlagLongTerm"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FlagGeneric","title":"FlagGeneric","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"FlagGeneric"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PlanningStrategyAuto","title":"PlanningStrategyAuto","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"PlanningStrategyAuto"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PlanningStrategyCustom","title":"PlanningStrategyCustom","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"PlanningStrategyCustom"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UpdateBy","title":"UpdateBy","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UpdateBy"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UpdateTime","title":"UpdateTime","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"UpdateTime"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MinimumNumberOfDaysInStock","title":"MinimumNumberOfDaysInStock","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MinimumNumberOfDaysInStock"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaximumNumberOfDaysInInventory","title":"MaximumNumberOfDaysInInventory","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaximumNumberOfDaysInInventory"}},{"attribute":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"1","title":"1","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"VALUE( object.UpdateTime() )"}}]'
+        ContextMenu: 'listContextMenuMaterial455'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    SelectionCheckboxes: true
+    Taborder: 1
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_ListMaterialMaterialLabelingAndPlanningStrategy_880_WebMenu_OnClick
+    {
+      #keys: '[414702.0.132706551]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[319.0.80354936]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelChildMaterial\043558.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelChildMaterial\043558.def"
new file mode 100644
index 0000000..8e0ce39
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelChildMaterial\043558.def"
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelChildMaterial
+{
+  #keys: '[414702.0.121452333]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListChildMaterial
+  ]
+  Properties:
+  [
+    Border: true
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterial.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterial.def
new file mode 100644
index 0000000..7232995
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterial.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+Component PanelMaterial
+{
+  #keys: '[414702.0.121452322]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: ListMaterialMaterialLabelingAndPlanningStrategy_880
+    #child: PanelMaterialOperationButton
+    Component DataHolderCheckedMaterials
+    {
+      #keys: '[414702.0.136936641]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[MatAttrSettingAndPlanStrategy]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialExportAndImport\043136.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialExportAndImport\043136.def"
new file mode 100644
index 0000000..636f952
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialExportAndImport\043136.def"
@@ -0,0 +1,51 @@
+Quintiq file version 2.0
+Component PanelMaterialExportAndImport id:PanelMaterialExportAndImport_136
+{
+  #keys: '[414702.0.130101487]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonMaterialExportAndExport
+    {
+      #keys: '[414702.0.130101488]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '鏁版嵁瀵煎嚭'
+        Taborder: 1
+      ]
+    }
+    Component ButtonMaterialExportAndImport
+    {
+      #keys: '[414702.0.130101489]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Label: '鏁版嵁瀵煎叆'
+        Taborder: 2
+      ]
+    }
+    Component ButtonSynchronizeInventoryTargets
+    {
+      #keys: '[414702.0.142124169]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'CLOUD_REFRESH'
+        Label: '鍚屾搴撳瓨鐩爣'
+        Taborder: 0
+        Visible: false
+      ]
+    }
+  ]
+  Properties:
+  [
+    Alignment: 'trailing'
+    FixedSize: true
+    MinimumColumns: 25
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialLabelingAndPlanningStrategy.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialLabelingAndPlanningStrategy.def
new file mode 100644
index 0000000..97be3df
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialLabelingAndPlanningStrategy.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelMaterialLabelingAndPlanningStrategy
+{
+  #keys: '[414702.0.121452301]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelChildMaterial
+    #child: PanelMaterial
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialOperationButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialOperationButton.def
new file mode 100644
index 0000000..3099403
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_PanelMaterialOperationButton.def
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+Component PanelMaterialOperationButton
+{
+  #keys: '[414702.0.130161515]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelMaterialExportAndImport_136
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageChildMaterial.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageChildMaterial.def
new file mode 100644
index 0000000..a4bbf6c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageChildMaterial.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageChildMaterial
+{
+  #keys: '[414702.0.122536773]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageMaterial790\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageMaterial790\0431.def"
new file mode 100644
index 0000000..7c30238
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listActionBarPageMaterial790\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPageMaterial790 id:listActionBarPageMaterial790_1
+{
+  #keys: '[414702.0.122174687]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuChildMaterial.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuChildMaterial.def
new file mode 100644
index 0000000..e87ec5b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuChildMaterial.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listContextMenuChildMaterial
+{
+  #keys: '[414702.0.122536778]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuMaterial455\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuMaterial455\0431.def"
new file mode 100644
index 0000000..fe19274
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Component_listContextMenuMaterial455\0431.def"
@@ -0,0 +1,46 @@
+Quintiq file version 2.0
+Component listContextMenuMaterial455 id:listContextMenuMaterial455_1
+{
+  #keys: '[414702.0.122174689]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component MenuSeparator
+    {
+      #keys: '[121142.1.1147171519]'
+      BaseType: 'MenuSeparator'
+      IsDerived: true
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component MenuDeleteAll
+    {
+      #keys: '[414702.0.141671580]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 3
+        Title: '鍒犻櫎'
+      ]
+    }
+    Component MenuSelectAll
+    {
+      #keys: '[414702.0.141943188]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'PIG'
+        Shortcut: 'Ctrl+A'
+        Taborder: 4
+        Title: '鍏ㄩ��'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuDeleteAll_O.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuDeleteAll_O.def
new file mode 100644
index 0000000..a921721
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuDeleteAll_O.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: ListMaterialMaterialLabelingAndPlanningStrategy_880
+Response OnClick (
+  structured[MatAttrSettingAndPlanStrategy] selection
+) id:Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuDeleteAll_OnClick
+{
+  #keys: '[414702.0.141854066]'
+  CanBindMultiple: false
+  DefinitionID => /ListMaterialMaterialLabelingAndPlanningStrategy_880/Responsedef_ListMaterialMaterialLabelingAndPlanningStrategy_880_WebMenu_OnClick
+  Initiator: 'MenuDeleteAll'
+  QuillAction
+  {
+    Body:
+    [*
+      traverse ( selection, Elements, s ) {
+        s.Delete();
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuSelectAll_O.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuSelectAll_O.def
new file mode 100644
index 0000000..23b4c6a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuSelectAll_O.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ListMaterialMaterialLabelingAndPlanningStrategy_880
+Response OnClick () id:Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_MenuSelectAll_OnClick
+{
+  #keys: '[414702.0.141794738]'
+  CanBindMultiple: false
+  DefinitionID => /ListMaterialMaterialLabelingAndPlanningStrategy_880/Responsedef_ListMaterialMaterialLabelingAndPlanningStrategy_880_WebMenu_OnClick
+  Initiator: 'MenuSelectAll'
+  QuillAction
+  {
+    Body:
+    [*
+      this.SelectAll();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnDoubleClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnDoubleClick.def
new file mode 100644
index 0000000..a91ec9c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnDoubleClick.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: ListMaterialMaterialLabelingAndPlanningStrategy_880
+Response OnDoubleClick (
+  MatAttrSettingAndPlanStrategy selection
+) id:Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnDoubleClick
+{
+  #keys: '[414702.0.137732025]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnDoubleClick'
+  QuillAction
+  {
+    Body:
+    [*
+      dlg := construct( DialogCreateEditMaterialLabelingAndPlanningStrategy );
+      dlg.Edit( selection );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheck\043591.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheck\043591.def"
new file mode 100644
index 0000000..4eb4da0
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheck\043591.def"
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ListMaterialMaterialLabelingAndPlanningStrategy_880
+Response OnUserCheckedChanged () id:Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheckedChanged_591
+{
+  #keys: '[414702.0.136206065]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      DataHolderCheckedMaterials.Data().Flush();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheckedCh.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheckedCh.def
new file mode 100644
index 0000000..9c7c2b3
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheckedCh.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: ListMaterialMaterialLabelingAndPlanningStrategy_880
+Response OnUserCheckedChanged (
+  structured[MatAttrSettingAndPlanStrategy] checkeditems
+) id:Response_ListMaterialMaterialLabelingAndPlanningStrategy_880_OnUserCheckedChanged
+{
+  #keys: '[414702.0.136757090]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      DataHolderCheckedMaterials.Data( checkeditems.Copy() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndExport_OnCl.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndExport_OnCl.def
new file mode 100644
index 0000000..b909d65
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndExport_OnCl.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: PanelMaterialExportAndImport_136/ButtonMaterialExportAndExport
+Response OnClick () id:Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndExport_OnClick
+{
+  #keys: '[414702.0.133071932]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      tableBinaryData := MatAttrSettingAndPlanStrategy::ExportTheFileStream( DataHolderCheckedMaterials.Data() ).AsBinaryData();
+      Application.Download( "MaterialLabelingAndPlanningStrategy.xlsx", tableBinaryData );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndImport_OnCl.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndImport_OnCl.def
new file mode 100644
index 0000000..ce5035b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndImport_OnCl.def
@@ -0,0 +1,42 @@
+Quintiq file version 2.0
+#parent: PanelMaterialExportAndImport_136/ButtonMaterialExportAndImport
+Response OnClick () id:Response_PanelMaterialExportAndImport_136_ButtonMaterialExportAndImport_OnClick
+{
+  #keys: '[414702.0.134451163]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+        
+          MatAttrSettingAndPlanStrategyInputSource::VerifyTheFileName( uploadJson );
+          
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+          matAttrSettingAndPlanStrategyInputSource := MatAttrSettingAndPlanStrategyInputSource::Upload( GlobalOTDTable, fileName, base64String, ApplicationMacroPlanner.GetUserName() );
+          
+          matAttrSettingAndPlanStrategyInputSource.ParseTable();
+          
+          matAttrSettingAndPlanStrategyDataTable := select( matAttrSettingAndPlanStrategyInputSource, MatAttrSettingAndPlanStrategyDataTable, tempMASAPSDT, tempMASAPSDT.name() = "鐗╂枡鏍囩" );
+          matAttrSettingAndPlanStrategyDataTable.VerifyTheTemplate();
+          
+          matAttrSettingAndPlanStrategyDataTable.SynchronizeData();
+          
+          WebMessageBox::Success( "涓婁紶鎴愬姛", true );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation(), true );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonSynchronizeInventoryTargets_.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonSynchronizeInventoryTargets_.def
new file mode 100644
index 0000000..a7731ca
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterialExportAndImport_136_ButtonSynchronizeInventoryTargets_.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelMaterialExportAndImport_136/ButtonSynchronizeInventoryTargets
+Response OnClick () id:Response_PanelMaterialExportAndImport_136_ButtonSynchronizeInventoryTargets_OnClick
+{
+  #keys: '[414702.0.141615322]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      WebMessageBox::Success( "鍚屾鎴愬姛", true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterial_DataHolderCheckedMaterials_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterial_DataHolderCheckedMaterials_OnDataChanged.def
new file mode 100644
index 0000000..380ad59
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/Response_PanelMaterial_DataHolderCheckedMaterials_OnDataChanged.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelMaterial/DataHolderCheckedMaterials
+Response OnDataChanged () id:Response_PanelMaterial_DataHolderCheckedMaterials_OnDataChanged
+{
+  #keys: '[414702.0.136147695]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      //traverse ( this.Data(), Elements, e ) {
+      //  info( "閫変腑鐨勭墿鏂欏彿锛�", e.MatCode() );
+      //}
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/_ROOT_Component_FormMaterialLabelingAndPlanningStrategy.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/_ROOT_Component_FormMaterialLabelingAndPlanningStrategy.def
new file mode 100644
index 0000000..527a380
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialLabelingAndPlanningStrategy/_ROOT_Component_FormMaterialLabelingAndPlanningStrategy.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormMaterialLabelingAndPlanningStrategy
+{
+  #keys: '[414702.0.120950329]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelMaterialLabelingAndPlanningStrategy
+  ]
+  Properties:
+  [
+    Description: '鐗╂枡鏍囩&璁″垝绛栫暐琛ㄥ崟'
+    Image: 'PAPER_ROLL'
+    Title: 'Material labeling&planning strategy'
+  ]
+}

--
Gitblit v1.9.3