From 108852b16d72a940d1ae5f335b904dd9e5df9bd8 Mon Sep 17 00:00:00 2001
From: xiaoding721 <33130084+xiaoding721@users.noreply.github.com>
Date: 星期四, 24 十月 2024 22:20:27 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev

---
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pContent.def                                                             |   14 
 _Main/BL/Type_MaterialRackTotalCell/Attribute_Quantity.qbl                                                                                     |    8 
 _Main/BL/Type_MaterialRackProportionRow/Attribute_Generation.qbl                                                                               |    7 
 _Main/BL/Type_MaterialRackTotalRow/DefaultValue_Name.qbl                                                                                       |    6 
 _Main/BL/Type_MaterialRackCustomCell/StaticMethod_CreateDate.qbl                                                                               |   24 
 _Main/BL/Type_MaterialRackProportionRow/Attribute_Name.qbl                                                                                     |    7 
 _Main/BL/Type_MaterialRackTotalCell/StaticMethod_Import.qbl                                                                                    |   37 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixEditorActionBarPage816.def                                         |   10 
 _Main/BL/Type_MaterialRackTotalCell/_ROOT_Type_MaterialRackTotalCell.qbl                                                                       |   10 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuEngineLogisticsCostReport.def                               |   11 
 _Main/BL/Type_MaterialRackCustomRow/DefaultValue_MLB_MQB.qbl                                                                                   |    6 
 _Main/BL/Type_MaterialRackCustomRow/Function_CalcName.qbl                                                                                      |   13 
 _Main/BL/Type_MaterialRackTotalColumn/StaticMethod_CreateDate.qbl                                                                              |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bExport_OnClick.def                                              |   22 
 _Main/BL/Type_MaterialRackCustomRow/_ROOT_Type_MaterialRackCustomRow.qbl                                                                       |   10 
 _Main/BL/Relations/Relation_MaterialRackCustomRow_MacroPlan_MacroPlan_MaterialRackCustomRow.qbl                                                |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/_ROOT_Component_FormMaterialRackCustom.def                                        |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_MatrixEditor240#88.def                                              |   97 ++
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pContent#338.def                                                    |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bImport_OnClick.def                                              |   45 +
 _Main/BL/Type_MaterialRackProportionRow/Attribute_MLB_MQB.qbl                                                                                  |    7 
 _Main/BL/Relations/Relation_MaterialRackProportionRow_MaterialRackProportionCell_MaterialRackPr.qbl                                            |   23 
 _Main/BL/Relations/Relation_MaterialRackTotalRow_MaterialRackTotalCell_MaterialRackTotalCell_Ma.qbl                                            |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bGenerate_OnClick.def                                             |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bImport_OnClick.def                                               |   45 +
 _Main/BL/Type_MaterialRackProportionRow/_ROOT_Type_MaterialRackProportionRow.qbl                                                               |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pHeader.def                                                              |   48 +
 _Main/BL/Type_MaterialRackProportionRow/DefaultValue_Name.qbl                                                                                  |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixeditorContextMenu134#1.def                                    |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_MatrixEditor240.def                                                      |   97 ++
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bExport_OnClick.def                                               |   22 
 _Main/BL/Type_MaterialRackCustomRow/Attribute_Name.qbl                                                                                         |    7 
 _Main/BL/Type_MaterialRackProportionCell/StaticMethod_Import.qbl                                                                               |   37 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixeditorContextMenu134.def                                           |   10 
 _Main/BL/Type_MaterialRackProportionCell/Attribute_Quantity.qbl                                                                                |    8 
 _Main/BL/Type_MaterialRackTotalRow/Attribute_Name.qbl                                                                                          |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/_ROOT_Component_FormMaterialRackProportion.def                                |   18 
 _Main/BL/Type_MaterialRackCustomRow/Attribute_MLB_MQB.qbl                                                                                      |    7 
 _Main/BL/Type_MaterialRackProportionRow/DefaultValue_MLB_MQB.qbl                                                                               |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bGenerate_OnClick.def                                    |   22 
 _Main/BL/Type_MaterialRackCustomRow/Attribute_Generation.qbl                                                                                   |    7 
 _Main/BL/Type_MaterialRackProportionRow/DefaultValue_Generation.qbl                                                                            |    6 
 _Main/BL/Type_MaterialRackProportionRow/Function_CalcName.qbl                                                                                  |   13 
 _Main/BL/Type_MaterialRackTotalCell/StaticMethod_CreateDate.qbl                                                                                |   24 
 _Main/BL/Type_MaterialRackCustomCell/_ROOT_Type_MaterialRackCustomCell.qbl                                                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pContent.def                                                            |   14 
 _Main/BL/Relations/Relation_MaterialRackTotalRow_MacroPlan_MacroPlan_MaterialRackTotalRow.qbl                                                  |   23 
 _Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackProportionCell_MaterialRackProportio.qbl                                            |   23 
 _Main/BL/Type_MaterialRackProportionCell/_ROOT_Type_MaterialRackProportionCell.qbl                                                             |   10 
 _Main/BL/Type_MaterialRackTotalRow/DefaultValue_Generation.qbl                                                                                 |    6 
 _Main/BL/Type_MaterialRackTotalRow/DefaultValue_MLB_MQB.qbl                                                                                    |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bGenerate_OnClick.def                                            |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bImport_OnClick.def                                      |   45 +
 _Main/BL/Type_MaterialRackTotalColumn/_ROOT_Type_MaterialRackColumn.qbl                                                                        |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/_ROOT_Component_FormMaterialRackTotal.def                                          |   18 
 _Main/BL/Relations/Relation_MaterialRackProportionRow_MacroPlan_MacroPlan_MaterialRackProportio.qbl                                            |   23 
 _Main/BL/Type_MaterialRackCustomCell/StaticMethod_Import.qbl                                                                                   |   37 +
 _Main/BL/Type_MaterialRackTotalCell/StaticMethod_Export.qbl                                                                                    |   61 +
 _Main/Sys/Repr/Global/MaterialRackColumn.qrp                                                                                                   |   11 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixeditorContextMenu134.def                                          |   10 
 _Main/BL/Type_MaterialRackProportionCell/StaticMethod_CreateDate.qbl                                                                           |   24 
 _Main/BL/Relations/Relation_MaterialRackCustomRow_MaterialRackCustomCell_MaterialRackCustomCell.qbl                                            |   23 
 _Main/BL/Type_MaterialRackTotalRow/_ROOT_Type_MaterialRackTotalRow.qbl                                                                         |   10 
 _Main/BL/Type_MaterialRackProportionCell/StaticMethod_Export.qbl                                                                               |   61 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixEditorActionBarPage816#1.def                                  |   10 
 _Main/BL/Type_MaterialRackTotalRow/Attribute_MLB_MQB.qbl                                                                                       |    7 
 _Main/BL/Type_MaterialRackTotalRow/Attribute_Generation.qbl                                                                                    |    7 
 _Main/BL/Type_MaterialRackTotalColumn/Attribute_Month.qbl                                                                                      |    8 
 _Main/BL/Type_MaterialRackCustomRow/DefaultValue_Generation.qbl                                                                                |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_MatrixEditor240.def                                                     |   97 ++
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bExport_OnClick.def                                      |   22 
 _Main/UI/MacroPlannerWebApp/Views/MaterialRackTotalSetting.vw                                                                                  |  212 ++++++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuEngineLogisticsCostReport_mMaterialRackTota.def |   23 
 _Main/BL/Type_MaterialRackCustomCell/Attribute_Quantity.qbl                                                                                    |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixEditorActionBarPage816.def                                        |   10 
 _Main/BL/Relations/Relation_MaterialRackColumn_MacroPlan_MacroPlan_MaterialRackColumn.qbl                                                      |   23 
 _Main/BL/Type_MaterialRackTotalRow/Function_CalcName.qbl                                                                                       |   13 
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pHeader#791.def                                                     |   48 +
 _Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pHeader.def                                                             |   48 +
 _Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackTotalCell_MaterialRackTotalCell_Mate.qbl                                            |   23 
 _Main/BL/Type_MaterialRackCustomCell/StaticMethod_Export.qbl                                                                                   |   61 +
 _Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackCustomCell_MaterialRackCustomCell_Ma.qbl                                            |   23 
 _Main/BL/Type_MaterialRackCustomRow/DefaultValue_Name.qbl                                                                                      |    6 
 _Main/BL/Type_MaterialRackTotalColumn/Attribute_StartDate.qbl                                                                                  |    8 
 84 files changed, 1,993 insertions(+), 0 deletions(-)

diff --git a/_Main/BL/Relations/Relation_MaterialRackColumn_MacroPlan_MacroPlan_MaterialRackColumn.qbl b/_Main/BL/Relations/Relation_MaterialRackColumn_MacroPlan_MacroPlan_MaterialRackColumn.qbl
new file mode 100644
index 0000000..9507153
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackColumn_MacroPlan_MacroPlan_MaterialRackColumn.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackColumn_MacroPlan_MacroPlan_MaterialRackColumn
+{
+  #keys: '1[413988.1.14566916]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.1.14566918][413988.1.14566917][413988.1.14566919]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MaterialRackColumn
+  {
+    #keys: '3[413988.1.14566921][413988.1.14566920][413988.1.14566922]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackCustomCell_MaterialRackCustomCell_Ma.qbl b/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackCustomCell_MaterialRackCustomCell_Ma.qbl
new file mode 100644
index 0000000..9a0561a
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackCustomCell_MaterialRackCustomCell_Ma.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackColumn_MaterialRackCustomCell_MaterialRackCustomCell_MaterialRackColumn
+{
+  #keys: '1[413988.1.14566935]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MaterialRackCustomCell
+  {
+    #keys: '3[413988.1.14566937][413988.1.14566936][413988.1.14566938]'
+    Cardinality: '1toN'
+    ObjectDefinition: MaterialRackColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MaterialRackColumn
+  {
+    #keys: '3[413988.1.14566940][413988.1.14566939][413988.1.14566941]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackCustomCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackProportionCell_MaterialRackProportio.qbl b/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackProportionCell_MaterialRackProportio.qbl
new file mode 100644
index 0000000..a40f8ea
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackProportionCell_MaterialRackProportio.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackColumn_MaterialRackProportionCell_MaterialRackProportionCell_MaterialRackColumn
+{
+  #keys: '1[413988.1.14566948]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MaterialRackProportionCell
+  {
+    #keys: '3[413988.1.14566950][413988.1.14566949][413988.1.14566951]'
+    Cardinality: '1toN'
+    ObjectDefinition: MaterialRackColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MaterialRackColumn
+  {
+    #keys: '3[413988.1.14566953][413988.1.14566952][413988.1.14566954]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackProportionCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackTotalCell_MaterialRackTotalCell_Mate.qbl b/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackTotalCell_MaterialRackTotalCell_Mate.qbl
new file mode 100644
index 0000000..45b09c0
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackColumn_MaterialRackTotalCell_MaterialRackTotalCell_Mate.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackColumn_MaterialRackTotalCell_MaterialRackTotalCell_MaterialRackColumn
+{
+  #keys: '1[413988.1.14566964]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MaterialRackTotalCell
+  {
+    #keys: '3[413988.1.14566966][413988.1.14566965][413988.1.14566967]'
+    Cardinality: '1toN'
+    ObjectDefinition: MaterialRackColumn
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MaterialRackColumn
+  {
+    #keys: '3[413988.1.14566969][413988.1.14566968][413988.1.14566970]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackTotalCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackCustomRow_MacroPlan_MacroPlan_MaterialRackCustomRow.qbl b/_Main/BL/Relations/Relation_MaterialRackCustomRow_MacroPlan_MacroPlan_MaterialRackCustomRow.qbl
new file mode 100644
index 0000000..4d9dae2
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackCustomRow_MacroPlan_MacroPlan_MaterialRackCustomRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackCustomRow_MacroPlan_MacroPlan_MaterialRackCustomRow
+{
+  #keys: '1[413988.1.14567062]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.1.14567064][413988.1.14567063][413988.1.14567065]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackCustomRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MaterialRackCustomRow
+  {
+    #keys: '3[413988.1.14567067][413988.1.14567066][413988.1.14567068]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackCustomRow_MaterialRackCustomCell_MaterialRackCustomCell.qbl b/_Main/BL/Relations/Relation_MaterialRackCustomRow_MaterialRackCustomCell_MaterialRackCustomCell.qbl
new file mode 100644
index 0000000..61b0c10
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackCustomRow_MaterialRackCustomCell_MaterialRackCustomCell.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackCustomRow_MaterialRackCustomCell_MaterialRackCustomCell_MaterialRackCustomRow
+{
+  #keys: '1[413988.1.14567075]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MaterialRackCustomCell
+  {
+    #keys: '3[413988.1.14567077][413988.1.14567076][413988.1.14567078]'
+    Cardinality: '1toN'
+    ObjectDefinition: MaterialRackCustomRow
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide MaterialRackCustomRow
+  {
+    #keys: '3[413988.1.14567080][413988.1.14567079][413988.1.14567081]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackCustomCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackProportionRow_MacroPlan_MacroPlan_MaterialRackProportio.qbl b/_Main/BL/Relations/Relation_MaterialRackProportionRow_MacroPlan_MacroPlan_MaterialRackProportio.qbl
new file mode 100644
index 0000000..5eeb6d3
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackProportionRow_MacroPlan_MacroPlan_MaterialRackProportio.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackProportionRow_MacroPlan_MacroPlan_MaterialRackProportionRow
+{
+  #keys: '1[413988.1.14566990]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.1.14566992][413988.1.14566991][413988.1.14566993]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackProportionRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MaterialRackProportionRow
+  {
+    #keys: '3[413988.1.14566995][413988.1.14566994][413988.1.14566996]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackProportionRow_MaterialRackProportionCell_MaterialRackPr.qbl b/_Main/BL/Relations/Relation_MaterialRackProportionRow_MaterialRackProportionCell_MaterialRackPr.qbl
new file mode 100644
index 0000000..0998926
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackProportionRow_MaterialRackProportionCell_MaterialRackPr.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackProportionRow_MaterialRackProportionCell_MaterialRackProportionCell_MaterialRackProportionRow
+{
+  #keys: '1[413988.1.14567003]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MaterialRackProportionCell
+  {
+    #keys: '3[413988.1.14567005][413988.1.14567004][413988.1.14567006]'
+    Cardinality: '1toN'
+    ObjectDefinition: MaterialRackProportionRow
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide MaterialRackProportionRow
+  {
+    #keys: '3[413988.1.14567008][413988.1.14567007][413988.1.14567009]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackProportionCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackTotalRow_MacroPlan_MacroPlan_MaterialRackTotalRow.qbl b/_Main/BL/Relations/Relation_MaterialRackTotalRow_MacroPlan_MacroPlan_MaterialRackTotalRow.qbl
new file mode 100644
index 0000000..32799ec
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackTotalRow_MacroPlan_MacroPlan_MaterialRackTotalRow.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackTotalRow_MacroPlan_MacroPlan_MaterialRackTotalRow
+{
+  #keys: '1[413988.1.14566875]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MacroPlan
+  {
+    #keys: '3[413988.1.14566877][413988.1.14566876][413988.1.14566878]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackTotalRow
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide MaterialRackTotalRow
+  {
+    #keys: '3[413988.1.14566880][413988.1.14566879][413988.1.14566881]'
+    Cardinality: '1toN'
+    ObjectDefinition: MacroPlan
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Relations/Relation_MaterialRackTotalRow_MaterialRackTotalCell_MaterialRackTotalCell_Ma.qbl b/_Main/BL/Relations/Relation_MaterialRackTotalRow_MaterialRackTotalCell_MaterialRackTotalCell_Ma.qbl
new file mode 100644
index 0000000..42fbee0
--- /dev/null
+++ b/_Main/BL/Relations/Relation_MaterialRackTotalRow_MaterialRackTotalCell_MaterialRackTotalCell_Ma.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation MaterialRackTotalRow_MaterialRackTotalCell_MaterialRackTotalCell_MaterialRackTotalRow
+{
+  #keys: '1[413988.1.14566888]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide MaterialRackTotalCell
+  {
+    #keys: '3[413988.1.14566890][413988.1.14566889][413988.1.14566891]'
+    Cardinality: '1toN'
+    ObjectDefinition: MaterialRackTotalRow
+    OwningSide: 'Owned'
+  }
+  RelationSide.RightSide MaterialRackTotalRow
+  {
+    #keys: '3[413988.1.14566893][413988.1.14566892][413988.1.14566894]'
+    Cardinality: '0to1'
+    ObjectDefinition: MaterialRackTotalCell
+    OwningSide: 'Reference'
+  }
+}
diff --git a/_Main/BL/Type_MaterialRackCustomCell/Attribute_Quantity.qbl b/_Main/BL/Type_MaterialRackCustomCell/Attribute_Quantity.qbl
new file mode 100644
index 0000000..1364c27
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomCell/Attribute_Quantity.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[413988.1.14567048][413988.1.14567047][413988.1.14567049]'
+  Description: '鏁伴噺'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_CreateDate.qbl b/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_CreateDate.qbl
new file mode 100644
index 0000000..7626e47
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_CreateDate.qbl
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateDate (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    genrations   := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.Generation().TrimBoth() <> "", tempPMP.Generation() );
+    mqbmlbs      := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.MQBMLB().TrimBoth() <> "", tempPMP.MQBMLB() );
+    traverse ( genrations, Elements, g ) {
+      traverse ( mqbmlbs, Elements, m ) {
+        mrcr     := select( macroPlan, MaterialRackCustomRow, tempMRCR, tempMRCR.Generation() = g and tempMRCR.MLB_MQB() = m );
+        if ( isnull( mrcr ) ) {
+          mrcr   := macroPlan.MaterialRackCustomRow( relnew, Generation := g, MLB_MQB := m );
+          traverse ( macroPlan, MaterialRackColumn, mrc ) {
+            cell := mrcr.MaterialRackCustomCell( relnew, Quantity := 0 );
+            cell.MaterialRackColumn( relset, mrc );
+          }
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_Export.qbl b/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_Export.qbl
new file mode 100644
index 0000000..94c5b51
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_Export.qbl
@@ -0,0 +1,61 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI      := XMLDOMImplementation::Create();
+    xmlDOM       := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    // 绗竴鍒楋紙鍚嶇О锛�
+    mrcrs       := selectsortedset( macroPlan, MaterialRackCustomRow, tempMRCR, true, tempMRCR.Name() );
+    firstColumn := xmlDOM.CreateElement( "column" );
+    firstName   := xmlDOM.CreateElement( "name" );
+    firstType   := xmlDOM.CreateElement( "type" );
+    firstName.TextContent( "*" );
+    firstType.TextContent( "String" );
+    firstColumn.AppendChild( firstName );
+    firstColumn.AppendChild( firstType );
+    traverse ( mrcrs, Elements, mrcr ) {
+      firstCell := xmlDOM.CreateElement( "cell" );
+      firstCell.SetAttribute( "value", mrcr.Name() );
+      firstColumn.AppendChild( firstCell );
+    }
+    tableElement.AppendChild( firstColumn );
+    
+    // 鏃堕棿鍒�
+    mrcs         := selectsortedset( macroPlan, MaterialRackColumn, tempMRC, true, tempMRC.Month() );
+    traverse ( mrcs, Elements, mrc ) {
+      cellColumn := xmlDOM.CreateElement( "column" );
+      cellName   := xmlDOM.CreateElement( "name" );
+      cellType   := xmlDOM.CreateElement( "type" );
+      cellName.TextContent( [String]mrc.Month() );
+      cellType.TextContent( "Real" );
+      cellColumn.AppendChild( cellName );
+      cellColumn.AppendChild( cellType );
+      cells := selectsortedset( mrc, MaterialRackCustomCell, tempMRCCell, true, tempMRCCell.MaterialRackCustomRow().Name() );
+      traverse ( cells, Elements, c ) {
+        cell := xmlDOM.CreateElement( "cell" );
+        cell.SetAttribute( "value", [String]c.Quantity() ); // 鏂欐灦鎬绘暟閲�
+        cellColumn.AppendChild( cell );
+      }
+      tableElement.AppendChild( cellColumn );
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_Import.qbl b/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_Import.qbl
new file mode 100644
index 0000000..b3fb936
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomCell/StaticMethod_Import.qbl
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Import (
+  MacroPlan macroPlan,
+  GeneralExcelImportAndExportDataTable table
+)
+{
+  TextBody:
+  [*
+    generation := "";
+    mqb_mlb    := "";
+    
+    traverse ( table, GeneralExcelImportAndExportDataRow, row ) {
+      traverse ( table, GeneralExcelImportAndExportDataColumn, column ) {
+        // 鍗曞厓鏍煎��
+        cellValue := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDCell, tempGEIAEDCell.GeneralExcelImportAndExportDataColumn() = column ).Value();
+        
+        if ( column.ColumnIndex() = 0 and cellValue <> "" ) {
+          generation := guard( cellValue.Tokenize( " " ).Element( 0 ), "" );
+          mqb_mlb    := guard( cellValue.Tokenize( " " ).Element( 1 ), "" );
+        }
+        
+        
+        // 鏂欐灦鎬绘暟璁剧疆鍒�
+        mrc  := select( macroPlan, MaterialRackColumn, tempMRC, tempMRC.Month() = guard( [Number]column.Name(), 0 ) );
+        // 鏂欐灦鎬绘暟璁剧疆琛�
+        mrcr := select( macroPlan, MaterialRackCustomRow, tempMRCR, tempMRCR.Generation() = generation and tempMRCR.MLB_MQB() = mqb_mlb );
+        
+        if ( column.ColumnIndex() > 0 and not isnull( mrc ) and not isnull( mrcr ) ) {
+          cell := select( mrcr, MaterialRackCustomCell, tempMRCCell, tempMRCCell.MaterialRackColumn() = mrc );
+          
+          cell.Quantity( [Real]cellValue );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackCustomCell/_ROOT_Type_MaterialRackCustomCell.qbl b/_Main/BL/Type_MaterialRackCustomCell/_ROOT_Type_MaterialRackCustomCell.qbl
new file mode 100644
index 0000000..8186cd8
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomCell/_ROOT_Type_MaterialRackCustomCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MaterialRackCustomCell
+{
+  #keys: '5[413988.1.14566859][413988.1.14566857][0.0.0][413988.1.14566858][413988.1.14566860]'
+  BaseType: Object
+  Description: '瀹㈡埛鏂欐灦鏁伴噺鍗曞厓鏍�'
+  StructuredName: 'MaterialRackCustomCells'
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/Attribute_Generation.qbl b/_Main/BL/Type_MaterialRackCustomRow/Attribute_Generation.qbl
new file mode 100644
index 0000000..17b674a
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/Attribute_Generation.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Generation
+{
+  #keys: '3[413988.1.14567052][413988.1.14567051][413988.1.14567053]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/Attribute_MLB_MQB.qbl b/_Main/BL/Type_MaterialRackCustomRow/Attribute_MLB_MQB.qbl
new file mode 100644
index 0000000..1dbcf99
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/Attribute_MLB_MQB.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MLB_MQB
+{
+  #keys: '3[413988.1.14567058][413988.1.14567057][413988.1.14567059]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/Attribute_Name.qbl b/_Main/BL/Type_MaterialRackCustomRow/Attribute_Name.qbl
new file mode 100644
index 0000000..3ce0fe6
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[413988.1.14567055][413988.1.14567054][413988.1.14567056]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_Generation.qbl b/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_Generation.qbl
new file mode 100644
index 0000000..9e5b51e
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_Generation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Generation
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_MLB_MQB.qbl b/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_MLB_MQB.qbl
new file mode 100644
index 0000000..b629d82
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_MLB_MQB.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: MLB_MQB
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_Name.qbl b/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/Function_CalcName.qbl b/_Main/BL/Type_MaterialRackCustomRow/Function_CalcName.qbl
new file mode 100644
index 0000000..64e6dfc
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/Function_CalcName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcName
+{
+  TextBody:
+  [*
+    // lihongji Aug-12-2024 (created)
+    
+    value := this.Generation() + ifexpr( this.MLB_MQB() <> "", " " + this.MLB_MQB(), "" );
+    
+    this.Name( value );
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackCustomRow/_ROOT_Type_MaterialRackCustomRow.qbl b/_Main/BL/Type_MaterialRackCustomRow/_ROOT_Type_MaterialRackCustomRow.qbl
new file mode 100644
index 0000000..67c0301
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackCustomRow/_ROOT_Type_MaterialRackCustomRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MaterialRackCustomRow
+{
+  #keys: '5[413988.1.14566854][413988.1.14566852][0.0.0][413988.1.14566853][413988.1.14566855]'
+  BaseType: Object
+  Description: '瀹㈡埛搴撴枡鏋舵暟閲忚'
+  StructuredName: 'MaterialRackCustomRows'
+}
diff --git a/_Main/BL/Type_MaterialRackProportionCell/Attribute_Quantity.qbl b/_Main/BL/Type_MaterialRackProportionCell/Attribute_Quantity.qbl
new file mode 100644
index 0000000..398ad45
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionCell/Attribute_Quantity.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[413988.1.14567042][413988.1.14567041][413988.1.14567043]'
+  Description: '鏁伴噺'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_CreateDate.qbl b/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_CreateDate.qbl
new file mode 100644
index 0000000..fc05b40
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_CreateDate.qbl
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateDate (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    genrations   := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.Generation().TrimBoth() <> "", tempPMP.Generation() );
+    mqbmlbs      := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.MQBMLB().TrimBoth() <> "", tempPMP.MQBMLB() );
+    traverse ( genrations, Elements, g ) {
+      traverse ( mqbmlbs, Elements, m ) {
+        mrpr     := select( macroPlan, MaterialRackProportionRow, tempMRPR, tempMRPR.Generation() = g and tempMRPR.MLB_MQB() = m );
+        if ( isnull( mrpr ) ) {
+          mrpr   := macroPlan.MaterialRackProportionRow( relnew, Generation := g, MLB_MQB := m );
+          traverse ( macroPlan, MaterialRackColumn, mrc ) {
+            cell := mrpr.MaterialRackProportionCell( relnew, Quantity := 0 );
+            cell.MaterialRackColumn( relset, mrc );
+          }
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_Export.qbl b/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_Export.qbl
new file mode 100644
index 0000000..5e942c1
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_Export.qbl
@@ -0,0 +1,61 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI      := XMLDOMImplementation::Create();
+    xmlDOM       := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    // 绗竴鍒楋紙鍚嶇О锛�
+    mrprs       := selectsortedset( macroPlan, MaterialRackProportionRow, tempMRPR, true, tempMRPR.Name() );
+    firstColumn := xmlDOM.CreateElement( "column" );
+    firstName   := xmlDOM.CreateElement( "name" );
+    firstType   := xmlDOM.CreateElement( "type" );
+    firstName.TextContent( "*" );
+    firstType.TextContent( "String" );
+    firstColumn.AppendChild( firstName );
+    firstColumn.AppendChild( firstType );
+    traverse ( mrprs, Elements, mrpr ) {
+      firstCell := xmlDOM.CreateElement( "cell" );
+      firstCell.SetAttribute( "value", mrpr.Name() );
+      firstColumn.AppendChild( firstCell );
+    }
+    tableElement.AppendChild( firstColumn );
+    
+    // 鏃堕棿鍒�
+    mrcs         := selectsortedset( macroPlan, MaterialRackColumn, tempMRC, true, tempMRC.Month() );
+    traverse ( mrcs, Elements, mrc ) {
+      cellColumn := xmlDOM.CreateElement( "column" );
+      cellName   := xmlDOM.CreateElement( "name" );
+      cellType   := xmlDOM.CreateElement( "type" );
+      cellName.TextContent( [String]mrc.Month() );
+      cellType.TextContent( "Real" );
+      cellColumn.AppendChild( cellName );
+      cellColumn.AppendChild( cellType );
+      cells := selectsortedset( mrc, MaterialRackProportionCell, tempMRPCell, true, tempMRPCell.MaterialRackProportionRow().Name() );
+      traverse ( cells, Elements, c ) {
+        cell := xmlDOM.CreateElement( "cell" );
+        cell.SetAttribute( "value", [String]c.Quantity() ); // 鏂欐灦鎬绘暟閲�
+        cellColumn.AppendChild( cell );
+      }
+      tableElement.AppendChild( cellColumn );
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_Import.qbl b/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_Import.qbl
new file mode 100644
index 0000000..3c12b79
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionCell/StaticMethod_Import.qbl
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Import (
+  MacroPlan macroPlan,
+  GeneralExcelImportAndExportDataTable table
+)
+{
+  TextBody:
+  [*
+    generation := "";
+    mqb_mlb    := "";
+    
+    traverse ( table, GeneralExcelImportAndExportDataRow, row ) {
+      traverse ( table, GeneralExcelImportAndExportDataColumn, column ) {
+        // 鍗曞厓鏍煎��
+        cellValue := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDCell, tempGEIAEDCell.GeneralExcelImportAndExportDataColumn() = column ).Value();
+        
+        if ( column.ColumnIndex() = 0 and cellValue <> "" ) {
+          generation := guard( cellValue.Tokenize( " " ).Element( 0 ), "" );
+          mqb_mlb    := guard( cellValue.Tokenize( " " ).Element( 1 ), "" );
+        }
+        
+        
+        // 鏂欐灦鎬绘暟璁剧疆鍒�
+        mrc  := select( macroPlan, MaterialRackColumn, tempMRC, tempMRC.Month() = guard( [Number]column.Name(), 0 ) );
+        // 鏂欐灦鎬绘暟璁剧疆琛�
+        mrpr := select( macroPlan, MaterialRackProportionRow, tempMRPR, tempMRPR.Generation() = generation and tempMRPR.MLB_MQB() = mqb_mlb );
+        
+        if ( column.ColumnIndex() > 0 and not isnull( mrc ) and not isnull( mrpr ) ) {
+          cell := select( mrpr, MaterialRackProportionCell, tempMRPCell, tempMRPCell.MaterialRackColumn() = mrc );
+          
+          cell.Quantity( [Real]cellValue );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackProportionCell/_ROOT_Type_MaterialRackProportionCell.qbl b/_Main/BL/Type_MaterialRackProportionCell/_ROOT_Type_MaterialRackProportionCell.qbl
new file mode 100644
index 0000000..c6eb6dd
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionCell/_ROOT_Type_MaterialRackProportionCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MaterialRackProportionCell
+{
+  #keys: '5[413988.1.14566849][413988.1.14566847][0.0.0][413988.1.14566848][413988.1.14566850]'
+  BaseType: Object
+  Description: '鏂欐灦姣斾緥鍗曞厓鏍�'
+  StructuredName: 'MaterialRackProportionCells'
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/Attribute_Generation.qbl b/_Main/BL/Type_MaterialRackProportionRow/Attribute_Generation.qbl
new file mode 100644
index 0000000..c686921
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/Attribute_Generation.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Generation
+{
+  #keys: '3[413988.1.14566983][413988.1.14566982][413988.1.14566984]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/Attribute_MLB_MQB.qbl b/_Main/BL/Type_MaterialRackProportionRow/Attribute_MLB_MQB.qbl
new file mode 100644
index 0000000..394e013
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/Attribute_MLB_MQB.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MLB_MQB
+{
+  #keys: '3[413988.1.14566986][413988.1.14566985][413988.1.14566987]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/Attribute_Name.qbl b/_Main/BL/Type_MaterialRackProportionRow/Attribute_Name.qbl
new file mode 100644
index 0000000..fe81535
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[413988.1.14566980][413988.1.14566979][413988.1.14566981]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_Generation.qbl b/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_Generation.qbl
new file mode 100644
index 0000000..9e5b51e
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_Generation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Generation
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_MLB_MQB.qbl b/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_MLB_MQB.qbl
new file mode 100644
index 0000000..b629d82
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_MLB_MQB.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: MLB_MQB
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_Name.qbl b/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/Function_CalcName.qbl b/_Main/BL/Type_MaterialRackProportionRow/Function_CalcName.qbl
new file mode 100644
index 0000000..64e6dfc
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/Function_CalcName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcName
+{
+  TextBody:
+  [*
+    // lihongji Aug-12-2024 (created)
+    
+    value := this.Generation() + ifexpr( this.MLB_MQB() <> "", " " + this.MLB_MQB(), "" );
+    
+    this.Name( value );
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackProportionRow/_ROOT_Type_MaterialRackProportionRow.qbl b/_Main/BL/Type_MaterialRackProportionRow/_ROOT_Type_MaterialRackProportionRow.qbl
new file mode 100644
index 0000000..80f7e68
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackProportionRow/_ROOT_Type_MaterialRackProportionRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MaterialRackProportionRow
+{
+  #keys: '5[413988.1.14566844][413988.1.14566842][0.0.0][413988.1.14566843][413988.1.14566845]'
+  BaseType: Object
+  Description: '鏂欐灦姣斾緥琛�'
+  StructuredName: 'MaterialRackProportionRows'
+}
diff --git a/_Main/BL/Type_MaterialRackTotalCell/Attribute_Quantity.qbl b/_Main/BL/Type_MaterialRackTotalCell/Attribute_Quantity.qbl
new file mode 100644
index 0000000..b81818f
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalCell/Attribute_Quantity.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Quantity
+{
+  #keys: '3[413988.1.14567025][413988.1.14567024][413988.1.14567026]'
+  Description: '鏁伴噺'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_CreateDate.qbl b/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_CreateDate.qbl
new file mode 100644
index 0000000..74924c3
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_CreateDate.qbl
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateDate (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    genrations   := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.Generation().TrimBoth() <> "", tempPMP.Generation() );
+    mqbmlbs      := selectuniquevalues( macroPlan, Product_MP, tempPMP, tempPMP.MQBMLB().TrimBoth() <> "", tempPMP.MQBMLB() );
+    traverse ( genrations, Elements, g ) {
+      traverse ( mqbmlbs, Elements, m ) {
+        mrtr     := select( macroPlan, MaterialRackTotalRow, tempMRTR, tempMRTR.Generation() = g and tempMRTR.MLB_MQB() = m );
+        if ( isnull( mrtr ) ) {
+          mrtr   := macroPlan.MaterialRackTotalRow( relnew, Generation := g, MLB_MQB := m );
+          traverse ( macroPlan, MaterialRackColumn, mrc ) {
+            cell := mrtr.MaterialRackTotalCell( relnew, Quantity := 0 );
+            cell.MaterialRackColumn( relset, mrc );
+          }
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_Export.qbl b/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_Export.qbl
new file mode 100644
index 0000000..5ef7a49
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_Export.qbl
@@ -0,0 +1,61 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Export (
+  MacroPlan macroPlan
+) as BinaryValue
+{
+  TextBody:
+  [*
+    xmlDOMI      := XMLDOMImplementation::Create();
+    xmlDOM       := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>Sheet1</name></table>' );
+    
+    tableElement := xmlDOM.GetElementByTagName( "table", 0 );
+    
+    // 绗竴鍒楋紙鍚嶇О锛�
+    mrtrs       := selectsortedset( macroPlan, MaterialRackTotalRow, tempMRTR, true, tempMRTR.Name() );
+    firstColumn := xmlDOM.CreateElement( "column" );
+    firstName   := xmlDOM.CreateElement( "name" );
+    firstType   := xmlDOM.CreateElement( "type" );
+    firstName.TextContent( "*" );
+    firstType.TextContent( "String" );
+    firstColumn.AppendChild( firstName );
+    firstColumn.AppendChild( firstType );
+    traverse ( mrtrs, Elements, cerr ) {
+      firstCell := xmlDOM.CreateElement( "cell" );
+      firstCell.SetAttribute( "value", cerr.Name() );
+      firstColumn.AppendChild( firstCell );
+    }
+    tableElement.AppendChild( firstColumn );
+    
+    // 鏃堕棿鍒�
+    mrcs         := selectsortedset( macroPlan, MaterialRackColumn, tempMRC, true, tempMRC.Month() );
+    traverse ( mrcs, Elements, mrc ) {
+      cellColumn := xmlDOM.CreateElement( "column" );
+      cellName   := xmlDOM.CreateElement( "name" );
+      cellType   := xmlDOM.CreateElement( "type" );
+      cellName.TextContent( [String]mrc.Month() );
+      cellType.TextContent( "Real" );
+      cellColumn.AppendChild( cellName );
+      cellColumn.AppendChild( cellType );
+      cells := selectsortedset( mrc, MaterialRackTotalCell, tempMRTCell, true, tempMRTCell.MaterialRackTotalRow().Name() );
+      traverse ( cells, Elements, c ) {
+        cell := xmlDOM.CreateElement( "cell" );
+        cell.SetAttribute( "value", [String]c.Quantity() ); // 鏂欐灦鎬绘暟閲�
+        cellColumn.AppendChild( cell );
+      }
+      tableElement.AppendChild( cellColumn );
+    }
+    
+    xmlString := xmlDOMI.CreateSerializer().WriteToString( xmlDOM )
+    
+    //info( xmlString );
+    
+    tableGroupHandle := TableGroupHandle::Create( "Sheet1" );
+    tableHandle      := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
+    tableGroupHandle.Add( tableHandle );
+    
+    binaryData := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
+    
+    return binaryData.AsBinaryValue();
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_Import.qbl b/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_Import.qbl
new file mode 100644
index 0000000..40de0f4
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalCell/StaticMethod_Import.qbl
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Import (
+  MacroPlan macroPlan,
+  GeneralExcelImportAndExportDataTable table
+)
+{
+  TextBody:
+  [*
+    generation := "";
+    mqb_mlb    := "";
+    
+    traverse ( table, GeneralExcelImportAndExportDataRow, row ) {
+      traverse ( table, GeneralExcelImportAndExportDataColumn, column ) {
+        // 鍗曞厓鏍煎��
+        cellValue := select( row, GeneralExcelImportAndExportDataCell, tempGEIAEDCell, tempGEIAEDCell.GeneralExcelImportAndExportDataColumn() = column ).Value();
+        
+        if ( column.ColumnIndex() = 0 and cellValue <> "" ) {
+          generation := guard( cellValue.Tokenize( " " ).Element( 0 ), "" );
+          mqb_mlb    := guard( cellValue.Tokenize( " " ).Element( 1 ), "" );
+        }
+        
+        
+        // 鏂欐灦鎬绘暟璁剧疆鍒�
+        mrc  := select( macroPlan, MaterialRackColumn, tempMRC, tempMRC.Month() = guard( [Number]column.Name(), 0 ) );
+        // 鏂欐灦鎬绘暟璁剧疆琛�
+        mrtr := select( macroPlan, MaterialRackTotalRow, tempMRTR, tempMRTR.Generation() = generation and tempMRTR.MLB_MQB() = mqb_mlb );
+        
+        if ( column.ColumnIndex() > 0 and not isnull( mrc ) and not isnull( mrtr ) ) {
+          cell := select( mrtr, MaterialRackTotalCell, tempMRTCell, tempMRTCell.MaterialRackColumn() = mrc );
+          
+          cell.Quantity( [Real]cellValue );
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackTotalCell/_ROOT_Type_MaterialRackTotalCell.qbl b/_Main/BL/Type_MaterialRackTotalCell/_ROOT_Type_MaterialRackTotalCell.qbl
new file mode 100644
index 0000000..0e8dad7
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalCell/_ROOT_Type_MaterialRackTotalCell.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MaterialRackTotalCell
+{
+  #keys: '5[413988.1.14566839][413988.1.14566837][0.0.0][413988.1.14566838][413988.1.14566840]'
+  BaseType: Object
+  Description: '鏂欐灦鎬绘暟閲忓崟鍏冩牸'
+  StructuredName: 'MaterialRackTotalCells'
+}
diff --git a/_Main/BL/Type_MaterialRackTotalColumn/Attribute_Month.qbl b/_Main/BL/Type_MaterialRackTotalColumn/Attribute_Month.qbl
new file mode 100644
index 0000000..a07e657
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalColumn/Attribute_Month.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Month
+{
+  #keys: '3[413988.1.14031041][413988.1.14031040][413988.1.14031042]'
+  Description: '鏈堜唤'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_MaterialRackTotalColumn/Attribute_StartDate.qbl b/_Main/BL/Type_MaterialRackTotalColumn/Attribute_StartDate.qbl
new file mode 100644
index 0000000..ee56d74
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalColumn/Attribute_StartDate.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute StartDate
+{
+  #keys: '3[413988.1.14566904][413988.1.14566903][413988.1.14566905]'
+  Description: '寮�濮嬫椂闂�'
+  ValueType: Date
+}
diff --git a/_Main/BL/Type_MaterialRackTotalColumn/StaticMethod_CreateDate.qbl b/_Main/BL/Type_MaterialRackTotalColumn/StaticMethod_CreateDate.qbl
new file mode 100644
index 0000000..b781ace
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalColumn/StaticMethod_CreateDate.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod CreateDate (
+  MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    for ( i := 1; i <= 12; i++ ) {
+      mrc := select( macroPlan, MaterialRackColumn, tempMRC, tempMRC.Month() = i );
+      if ( isnull( mrc ) ) {
+        macroPlan.MaterialRackColumn( relnew, Month := i );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackTotalColumn/_ROOT_Type_MaterialRackColumn.qbl b/_Main/BL/Type_MaterialRackTotalColumn/_ROOT_Type_MaterialRackColumn.qbl
new file mode 100644
index 0000000..f4746c2
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalColumn/_ROOT_Type_MaterialRackColumn.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MaterialRackColumn
+{
+  #keys: '5[413988.1.14566826][413988.1.14566824][0.0.0][413988.1.14566825][413988.1.14566827]'
+  BaseType: Object
+  Description: '鏂欐灦鍒�'
+  StructuredName: 'MaterialRackColumns'
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/Attribute_Generation.qbl b/_Main/BL/Type_MaterialRackTotalRow/Attribute_Generation.qbl
new file mode 100644
index 0000000..da6b2fa
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/Attribute_Generation.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Generation
+{
+  #keys: '3[413988.1.14566865][413988.1.14566864][413988.1.14566866]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/Attribute_MLB_MQB.qbl b/_Main/BL/Type_MaterialRackTotalRow/Attribute_MLB_MQB.qbl
new file mode 100644
index 0000000..9ca20d4
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/Attribute_MLB_MQB.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MLB_MQB
+{
+  #keys: '3[413988.1.14566871][413988.1.14566870][413988.1.14566872]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/Attribute_Name.qbl b/_Main/BL/Type_MaterialRackTotalRow/Attribute_Name.qbl
new file mode 100644
index 0000000..9a6ba46
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/Attribute_Name.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Name
+{
+  #keys: '3[413988.1.14566868][413988.1.14566867][413988.1.14566869]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_Generation.qbl b/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_Generation.qbl
new file mode 100644
index 0000000..9e5b51e
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_Generation.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Generation
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_MLB_MQB.qbl b/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_MLB_MQB.qbl
new file mode 100644
index 0000000..b629d82
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_MLB_MQB.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: MLB_MQB
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_Name.qbl b/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_Name.qbl
new file mode 100644
index 0000000..86c3d59
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/DefaultValue_Name.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Name
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/Function_CalcName.qbl b/_Main/BL/Type_MaterialRackTotalRow/Function_CalcName.qbl
new file mode 100644
index 0000000..64e6dfc
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/Function_CalcName.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcName
+{
+  TextBody:
+  [*
+    // lihongji Aug-12-2024 (created)
+    
+    value := this.Generation() + ifexpr( this.MLB_MQB() <> "", " " + this.MLB_MQB(), "" );
+    
+    this.Name( value );
+  *]
+}
diff --git a/_Main/BL/Type_MaterialRackTotalRow/_ROOT_Type_MaterialRackTotalRow.qbl b/_Main/BL/Type_MaterialRackTotalRow/_ROOT_Type_MaterialRackTotalRow.qbl
new file mode 100644
index 0000000..63a27ab
--- /dev/null
+++ b/_Main/BL/Type_MaterialRackTotalRow/_ROOT_Type_MaterialRackTotalRow.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type MaterialRackTotalRow
+{
+  #keys: '5[413988.1.14566834][413988.1.14566832][0.0.0][413988.1.14566833][413988.1.14566835]'
+  BaseType: Object
+  Description: '鏂欐灦鎬绘暟閲忚'
+  StructuredName: 'MaterialRackTotalRows'
+}
diff --git a/_Main/Sys/Repr/Global/MaterialRackColumn.qrp b/_Main/Sys/Repr/Global/MaterialRackColumn.qrp
new file mode 100644
index 0000000..dc499e1
--- /dev/null
+++ b/_Main/Sys/Repr/Global/MaterialRackColumn.qrp
@@ -0,0 +1,11 @@
+Quintiq file version 2.0
+#parent: #root
+TypeRepresentation MaterialRackColumn
+{
+  AttributeRepresentation Month
+  {
+    Alignment: 'Right'
+    AttributeKey: '[413988.1.14031040]'
+  }
+  RelationRepresentation MacroPlan { RelationKey: '[413988.1.14566917]' Visibility: 'Normal' }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuEngineLogisticsCostReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuEngineLogisticsCostReport.def
index e126415..b49fa7a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuEngineLogisticsCostReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuEngineLogisticsCostReport.def
@@ -62,6 +62,17 @@
         Title: '澶ц繛鍙戝姩鏈烘枡鏋舵姤琛�'
       ]
     }
+    Component mMaterialRackTotalSetting
+    {
+      #keys: '[413988.1.16000836]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'WINDOW_GEAR'
+        Taborder: 5
+        Title: '鏂欐灦鎬绘暟閲忚缃�'
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuEngineLogisticsCostReport_mMaterialRackTota.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuEngineLogisticsCostReport_mMaterialRackTota.def
new file mode 100644
index 0000000..95d9e00
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuEngineLogisticsCostReport_mMaterialRackTota.def
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: ContextMenuEngineLogisticsCostReport/mMaterialRackTotalSetting
+Response OnClick () id:Response_MacroPlanner_ContextMenuEngineLogisticsCostReport_mMaterialRackTotalSetting_OnClick
+{
+  #keys: '[413988.1.16000982]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      // 鍒涘缓鏂欐灦璁剧疆鎬绘暟閲忚缃垪
+      MaterialRackColumn::CreateDate( MacroPlan );
+      
+      ApplicationScope.ViewManager().ResetUserViewById( "MaterialRackTotalSetting", true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_MatrixEditor240.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_MatrixEditor240.def
new file mode 100644
index 0000000..20703f7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_MatrixEditor240.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditor240
+{
+  #keys: '[413988.1.14781785]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell567
+    {
+      #keys: '[413988.1.14781786]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractor775
+        {
+          #keys: '[413988.1.14781787]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackCustomRow.MaterialRackCustomCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Quantity'
+        Column: 'MaterialRackColumn'
+        Row: 'MaterialRackCustomRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows741
+    {
+      #keys: '[413988.1.14781788]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor571
+        {
+          #keys: '[413988.1.14781789]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackCustomRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Name'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns208
+    {
+      #keys: '[413988.1.14781790]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor294
+        {
+          #keys: '[413988.1.14781791]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Month'
+        SortCriteria: 'Month'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPage816
+    #child: matrixeditorContextMenu134
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumns208'
+    ContextMenu: 'matrixeditorContextMenu134'
+    Rows: 'MatrixEditorRows741'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixEditorActionBarPage816.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixEditorActionBarPage816.def
new file mode 100644
index 0000000..a0012fd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixEditorActionBarPage816.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPage816
+{
+  #keys: '[413988.1.14781792]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixeditorContextMenu134.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixeditorContextMenu134.def
new file mode 100644
index 0000000..e9cc0cb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_matrixeditorContextMenu134.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenu134
+{
+  #keys: '[413988.1.14781793]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pContent.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pContent.def
new file mode 100644
index 0000000..7c692c4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pContent.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent
+{
+  #keys: '[413988.1.14781784]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor240
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pHeader.def
new file mode 100644
index 0000000..c7268f6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Component_pHeader.def
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[413988.1.14781717]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bImport
+    {
+      #keys: '[413988.1.14781718]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Label: '瀵煎叆'
+        Taborder: 1
+      ]
+    }
+    Component bExport
+    {
+      #keys: '[413988.1.14781719]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 2
+      ]
+    }
+    Component bGenerate
+    {
+      #keys: '[413988.1.14781720]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '鐢熸垚妯℃澘'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bExport_OnClick.def
new file mode 100644
index 0000000..9f36fbd
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bExport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bExport
+Response OnClick () id:Response_pHeader_bExport_OnClick
+{
+  #keys: '[413988.1.26522395]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := MaterialRackCustomCell::Export( MacroPlan );
+      
+      Application.Download( "鏂欐灦鎬绘暟閲�.xlsx", binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bGenerate_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bGenerate_OnClick.def
new file mode 100644
index 0000000..d3adb79
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bGenerate_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bGenerate
+Response OnClick () id:Response_pHeader_bGenerate_OnClick
+{
+  #keys: '[413988.1.26522194]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      MaterialRackCustomCell::CreateDate( MacroPlan );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bImport_OnClick.def
new file mode 100644
index 0000000..a25a929
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/Response_pHeader_bImport_OnClick.def
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: pHeader/bImport
+Response OnClick () id:Response_pHeader_bImport_OnClick
+{
+  #keys: '[413988.1.26522306]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+          Archive::VerifyTheFileName( uploadJson );
+                
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+              
+          webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
+          
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource.ReadStructure();
+          
+          selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "Sheet1" );
+          
+          MaterialRackCustomCell::Import( MacroPlan, selection );
+          
+          // 鍚庣画鍒犻櫎
+          generalExcelImportAndExportDataSource.Delete();
+          
+          WebMessageBox::Success( Translations::A_VWED_Success() );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/_ROOT_Component_FormMaterialRackCustom.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/_ROOT_Component_FormMaterialRackCustom.def
new file mode 100644
index 0000000..24fa20b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackCustom/_ROOT_Component_FormMaterialRackCustom.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormMaterialRackCustom
+{
+  #keys: '[413988.1.14711995]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pContent
+    #child: pHeader
+  ]
+  Properties:
+  [
+    Description: '瀹㈡埛搴撴枡鏋舵暟閲�'
+    Title: '瀹㈡埛搴撴枡鏋舵暟閲�'
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_MatrixEditor240\04388.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_MatrixEditor240\04388.def"
new file mode 100644
index 0000000..da2028d
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_MatrixEditor240\04388.def"
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditor240 id:MatrixEditor240_88
+{
+  #keys: '[413988.1.14780998]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell567
+    {
+      #keys: '[413988.1.14780999]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractor775
+        {
+          #keys: '[413988.1.14781000]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackProportionRow.MaterialRackProportionCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Quantity'
+        Column: 'MaterialRackColumn'
+        Row: 'MaterialRackProportionRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows741
+    {
+      #keys: '[413988.1.14781001]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor571
+        {
+          #keys: '[413988.1.14781002]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackProportionRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Name'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns208
+    {
+      #keys: '[413988.1.14781003]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor294
+        {
+          #keys: '[413988.1.14781004]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Month'
+        SortCriteria: 'Month'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPage816_1
+    #child: matrixeditorContextMenu134_1
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumns208'
+    ContextMenu: 'matrixeditorContextMenu134'
+    Rows: 'MatrixEditorRows741'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixEditorActionBarPage816\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixEditorActionBarPage816\0431.def"
new file mode 100644
index 0000000..c7cdd60
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixEditorActionBarPage816\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPage816 id:matrixEditorActionBarPage816_1
+{
+  #keys: '[413988.1.14781005]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixeditorContextMenu134\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixeditorContextMenu134\0431.def"
new file mode 100644
index 0000000..f36c684
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_matrixeditorContextMenu134\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenu134 id:matrixeditorContextMenu134_1
+{
+  #keys: '[413988.1.14781006]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pContent\043338.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pContent\043338.def"
new file mode 100644
index 0000000..72d8f96
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pContent\043338.def"
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent id:pContent_338
+{
+  #keys: '[413988.1.14780997]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor240_88
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pHeader\043791.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pHeader\043791.def"
new file mode 100644
index 0000000..547213c
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Component_pHeader\043791.def"
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+Component pHeader id:pHeader_791
+{
+  #keys: '[413988.1.16001292]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bImport
+    {
+      #keys: '[413988.1.16001293]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Label: '瀵煎叆'
+        Taborder: 1
+      ]
+    }
+    Component bExport
+    {
+      #keys: '[413988.1.16001294]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 2
+      ]
+    }
+    Component bGenerate
+    {
+      #keys: '[413988.1.16001295]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '鐢熸垚妯℃澘'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bExport_OnClick.def
new file mode 100644
index 0000000..1cc8a31
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bExport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader_791/bExport
+Response OnClick () id:Response_pHeader_791_bExport_OnClick
+{
+  #keys: '[413988.1.26481619]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := MaterialRackProportionCell::Export( MacroPlan );
+      
+      Application.Download( "鏂欐灦鎬绘暟閲�.xlsx", binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bGenerate_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bGenerate_OnClick.def
new file mode 100644
index 0000000..a85d33f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bGenerate_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader_791/bGenerate
+Response OnClick () id:Response_pHeader_791_bGenerate_OnClick
+{
+  #keys: '[413988.1.25920259]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      MaterialRackProportionCell::CreateDate( MacroPlan );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bImport_OnClick.def
new file mode 100644
index 0000000..e9f6e0b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/Response_pHeader_791_bImport_OnClick.def
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: pHeader_791/bImport
+Response OnClick () id:Response_pHeader_791_bImport_OnClick
+{
+  #keys: '[413988.1.24511147]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+          Archive::VerifyTheFileName( uploadJson );
+                
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+              
+          webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
+          
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource.ReadStructure();
+          
+          selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "Sheet1" );
+          
+          MaterialRackProportionCell::Import( MacroPlan, selection );
+          
+          // 鍚庣画鍒犻櫎
+          generalExcelImportAndExportDataSource.Delete();
+          
+          WebMessageBox::Success( Translations::A_VWED_Success() );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/_ROOT_Component_FormMaterialRackProportion.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/_ROOT_Component_FormMaterialRackProportion.def
new file mode 100644
index 0000000..901d1d5
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackProportion/_ROOT_Component_FormMaterialRackProportion.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormMaterialRackProportion
+{
+  #keys: '[413988.1.14711914]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pContent_338
+    #child: pHeader_791
+  ]
+  Properties:
+  [
+    Description: '绌烘枡鏋舵瘮渚�'
+    Title: '绌烘枡鏋舵瘮渚�'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_MatrixEditor240.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_MatrixEditor240.def
new file mode 100644
index 0000000..f8a1e3a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_MatrixEditor240.def
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+Component MatrixEditor240
+{
+  #keys: '[413988.1.15920739]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell567
+    {
+      #keys: '[413988.1.15920740]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractor775
+        {
+          #keys: '[413988.1.15920741]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackTotalRow.MaterialRackTotalCell'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Quantity'
+        Column: 'MaterialRackColumn'
+        Row: 'MaterialRackTotalRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows741
+    {
+      #keys: '[413988.1.15920744]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor571
+        {
+          #keys: '[413988.1.15920745]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackTotalRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Name'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns208
+    {
+      #keys: '[413988.1.15920748]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractor294
+        {
+          #keys: '[413988.1.15920749]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'MaterialRackColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Month'
+        SortCriteria: 'Month'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPage816
+    #child: matrixeditorContextMenu134
+  ]
+  Properties:
+  [
+    Columns: 'MatrixEditorColumns208'
+    ContextMenu: 'matrixeditorContextMenu134'
+    Rows: 'MatrixEditorRows741'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixEditorActionBarPage816.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixEditorActionBarPage816.def
new file mode 100644
index 0000000..6aaed1f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixEditorActionBarPage816.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPage816
+{
+  #keys: '[413988.1.15920752]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixeditorContextMenu134.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixeditorContextMenu134.def
new file mode 100644
index 0000000..7139242
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_matrixeditorContextMenu134.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenu134
+{
+  #keys: '[413988.1.15920755]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pContent.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pContent.def
new file mode 100644
index 0000000..e71135f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pContent.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent
+{
+  #keys: '[413988.1.14712032]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor240
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pHeader.def
new file mode 100644
index 0000000..888b498
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Component_pHeader.def
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[413988.1.14712020]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component bImport
+    {
+      #keys: '[413988.1.14712119]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'IMPORT1'
+        Label: '瀵煎叆'
+        Taborder: 1
+      ]
+    }
+    Component bExport
+    {
+      #keys: '[413988.1.14712131]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 2
+      ]
+    }
+    Component bGenerate
+    {
+      #keys: '[413988.1.14712143]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '鐢熸垚妯℃澘'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bExport_OnClick.def
new file mode 100644
index 0000000..ccc7223
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bExport_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bExport
+Response OnClick () id:Response_pHeader_bExport_OnClick
+{
+  #keys: '[413988.1.24570285]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      binaryValue := MaterialRackTotalCell::Export( MacroPlan );
+      
+      Application.Download( "鏂欐灦鎬绘暟閲�.xlsx", binaryValue.AsBinaryData() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bGenerate_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bGenerate_OnClick.def
new file mode 100644
index 0000000..005e8c8
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bGenerate_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bGenerate
+Response OnClick () id:Response_pHeader_bGenerate_OnClick
+{
+  #keys: '[413988.1.25900711]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      MaterialRackTotalCell::CreateDate( MacroPlan );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bImport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bImport_OnClick.def
new file mode 100644
index 0000000..6258600
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/Response_pHeader_bImport_OnClick.def
@@ -0,0 +1,45 @@
+Quintiq file version 2.0
+#parent: pHeader/bImport
+Response OnClick () id:Response_pHeader_bImport_OnClick
+{
+  #keys: '[413988.1.25930512]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      try {
+        uploadJsonString := Application.GetFile();
+        if ( uploadJsonString <> "" ) {
+          uploadJson := JSON::Parse( uploadJsonString );
+          Archive::VerifyTheFileName( uploadJson );
+                
+          fileName := uploadJson.Get( "name" ).GetString();
+          base64String := uploadJson.Get( "data" ).GetString();
+              
+          webFileBinaryData := BinaryData::FromBase64EncodedString( base64String ).AsBinaryValue();
+          
+          generalExcelImportAndExportDataSource := GeneralExcelImportAndExportDataSource::Upload( RecycleBin, webFileBinaryData, fileName );
+          generalExcelImportAndExportDataSource.ReadStructure();
+          
+          selection := select( generalExcelImportAndExportDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, tempGEIAEDT.Name() = "Sheet1" );
+          
+          MaterialRackTotalCell::Import( MacroPlan, selection );
+          
+          // 鍚庣画鍒犻櫎
+          generalExcelImportAndExportDataSource.Delete();
+          
+          WebMessageBox::Success( Translations::A_VWED_Success() );
+        }
+      } onerror {
+        WebMessageBox::Error( e.GeneralInformation() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/_ROOT_Component_FormMaterialRackTotal.def b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/_ROOT_Component_FormMaterialRackTotal.def
new file mode 100644
index 0000000..33b4bca
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormMaterialRackTotal/_ROOT_Component_FormMaterialRackTotal.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormMaterialRackTotal
+{
+  #keys: '[413988.1.14711841]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pContent
+    #child: pHeader
+  ]
+  Properties:
+  [
+    Description: '鏂欐灦鎬绘暟閲�'
+    Title: '鏂欐灦鎬绘暟閲�'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/MaterialRackTotalSetting.vw b/_Main/UI/MacroPlannerWebApp/Views/MaterialRackTotalSetting.vw
new file mode 100644
index 0000000..fd65a42
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/MaterialRackTotalSetting.vw
@@ -0,0 +1,212 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormMaterialRackTotal
+      {
+        title: 'QMacroPlanner::FormMaterialRackTotal'
+        shown: true
+        componentID: 'QMacroPlanner::FormMaterialRackTotal'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 9
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormMaterialRackTotal_pHeader
+          {
+            sizeRatio: 1
+          }
+          FormMaterialRackTotal_pContent
+          {
+            sizeRatio: 1
+          }
+          FormMaterialRackTotal_MatrixEditor240
+          {
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            gridColor: '#c4c4c4'
+          }
+        }
+      }
+      form_FormMaterialRackProportion
+      {
+        title: 'QMacroPlanner::FormMaterialRackProportion'
+        shown: true
+        componentID: 'QMacroPlanner::FormMaterialRackProportion'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 10
+          rowSpan: 9
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormMaterialRackProportion_pContent
+          {
+            sizeRatio: 1
+          }
+          FormMaterialRackProportion_MatrixEditor240
+          {
+            totalHeaderWidth: 200
+            attributeHeaderWidthRatio: 0.6
+            nameHeaderWidthRatio: 0.4
+            columnWidth: 100
+            horizontalGrid: true
+            verticalGrid: true
+            gridColor: '#c4c4c4'
+          }
+        }
+      }
+      form_FormMaterialRackCustom
+      {
+        title: 'QMacroPlanner::FormMaterialRackCustom'
+        shown: true
+        componentID: 'QMacroPlanner::FormMaterialRackCustom'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 19
+          rowSpan: 9
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components: null
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormKPI
+      {
+        title: 'KPI Dashboard'
+        shown: true
+        componentID: 'FormKPI'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormKPI_PanelKPI
+          {
+            sizeRatio: 1
+            activeChild: 'PanelKPISelection'
+          }
+          FormKPI_PanelKPIDashboard
+          {
+            sizeRatio: 1
+          }
+          FormKPI_PanelKPISelection
+          {
+            sizeRatio: 1
+          }
+          FormKPI_ListKPISelection
+          {
+            QuillViewData
+            {
+              Food_KPISetting: 'Cost of sales;Fulfillment;Fulfillment target;Inventory holding cost;Labor cost;Margin;Safety stock;Sales;Sourcing cost;Total CO2 emission;Transportation cost;Volume'
+            }
+          }
+          FormKPI_DataSetLevelKPISelection
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 200
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'JOYSTICK'
+    description: ''
+  }
+  formatversion: 2
+  id: 'MaterialRackTotalSetting'
+  name: 'MaterialRackTotalSetting'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3