From 3aa184a1b613952068af02e55960413b759e1701 Mon Sep 17 00:00:00 2001
From: rislai <risheng.lai@capgemini.com>
Date: 星期四, 25 七月 2024 10:32:21 +0800
Subject: [PATCH] 添加产量对比报表

---
 _Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl                                                                     |   44 ++
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def                               |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick#613.def                            |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def                                                   |   62 ++
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl                                                                     |   97 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def                               |   20 
 _Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl                                                                                            |    7 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl                                                                |   16 
 _Main/BL/Type_LocalColumn/Function_CalcIndex.qbl                                                                                               |   25 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def          |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def                          |   20 
 _Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl                                                                                           |   33 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def                                  |   18 
 _Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw                                                                               |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def                              |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison#1.def                      |   10 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl                                                                 |    7 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl                                                                         |  118 +++++
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison#634.def                                        |   84 +++
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl                                                                                 |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def                |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def                                                      |   16 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl                                                              |   39 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def                             |   16 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def                             |   16 
 _Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl                                                                              |   13 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl                                                                      |   32 +
 _Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl                                                                                         |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def     |   21 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def |   17 
 _Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl                                                                 |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def          |   20 
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport#1.qbl                                                            |   14 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl                                                                              |    7 
 _Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl                                                     |    9 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter#119.def                                                  |   96 ++++
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def                              |   26 +
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl                                                                         |   36 +
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl                                                                   |   22 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def                                               |   11 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl                                                                                |    7 
 _Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl                                                                    |    7 
 _Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl                                                              |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def                               |   16 
 _Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl                                                                        |   30 +
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor#988.def                                                 |  102 ++++
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl                                                                  |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison#1.def                        |   10 
 48 files changed, 1,251 insertions(+), 23 deletions(-)

diff --git "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl" "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
index 19ebdae..ddece8a 100644
--- "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
+++ "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
@@ -12,16 +12,16 @@
     // rislai Jul-9-2024 (created)
     table := owner.LocalTable( relnew,Name := "缁煎悎宸ユ椂鍒舵姤琛�");
     
-    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
-    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,CustomIndex := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,CustomIndex := 2);
     
-    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,CustomIndex := 3);
     
-    column4  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐鏃堕暱" ,Index := 4);
-    column5  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
+    column4  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐鏃堕暱" ,CustomIndex := 4);
+    column5  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,CustomIndex := 6);
     
-    column6  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐璐�" ,Index := 8);
-    column7 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
+    column6  := table.LocalColumn( relnew,Name := "鍔犵彮/娆犲伐璐�" ,CustomIndex := 8);
+    column7 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,CustomIndex := 10);
     
     units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
     
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
index b88493c..bf0aaa9 100644
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
@@ -12,20 +12,20 @@
     // rislai Jul-4-2024 (created)
     table := owner.LocalTable( relnew,Name := "鏍囧噯宸ユ椂鍒舵姤琛�");
     
-    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,Index := 1);
-    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,Index := 2);
+    //column1  := table.LocalColumn( relnew,Name := "宸ュ巶" ,CustomIndex := 1);
+    //column2  := table.LocalColumn( relnew,Name := "浜х嚎" ,CustomIndex := 2);
     
-    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,Index := 3);
+    column3  := table.LocalColumn( relnew,Name := "鐢熶骇澶╂暟" ,CustomIndex := 3);
     
-    column4  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮鏃堕暱" ,Index := 4);
-    column5  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝椂闀�" ,Index := 5);
-    column6  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,Index := 6);
-    column7  := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" ,Index := 7);
+    column4  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮鏃堕暱" ,CustomIndex := 4);
+    column5  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝椂闀�" ,CustomIndex := 5);
+    column6  := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝椂闀�" ,CustomIndex := 6);
+    column7  := table.LocalColumn( relnew,Name := "娆犲伐鏃堕暱" ,CustomIndex := 7);
     
-    column8  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮璐�" ,Index := 8);
-    column9  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝垂" ,Index := 9);
-    column10 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,Index := 10);
-    column11 := table.LocalColumn( relnew,Name := "娆犲伐璐�" ,Index := 11);
+    column8  := table.LocalColumn( relnew,Name := "骞虫棩鍔犵彮璐�" ,CustomIndex := 8);
+    column9  := table.LocalColumn( relnew,Name := "浼戞伅鏃ュ姞鐝垂" ,CustomIndex := 9);
+    column10 := table.LocalColumn( relnew,Name := "鑺傚亣鏃ュ姞鐝垂" ,CustomIndex := 10);
+    column11 := table.LocalColumn( relnew,Name := "娆犲伐璐�" ,CustomIndex := 11);
     
     units := selectset( shiftPlans,Elements.UnitPeriodTime.Unit,unit,true );
     
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
index 5bdd4f8..44609af 100644
--- a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_GenerateColumnIndex.qbl
@@ -30,7 +30,7 @@
           // 2023/01/01
           index := [Number]generalColumn.Name().ReplaceAll( "/", "" );
         }
-        column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),Index := index );
+        column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),CustomIndex := index );
         columns.Add( column );
         columnTree.Root().AddChild( tempHandle,columns.Size() - 1 );
       }
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl
new file mode 100644
index 0000000..e46be0b
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Actual.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Actual
+{
+  #keys: '3[412672.1.64753749][412672.1.64753748][412672.1.64753750]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl
new file mode 100644
index 0000000..7abefbe
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_BaseVersionValue.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BaseVersionValue
+{
+  #keys: '3[412672.1.64753763][412672.1.64753762][412672.1.64753764]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl
new file mode 100644
index 0000000..8e0d3b4
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_CompareVersionValue.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CompareVersionValue
+{
+  #keys: '3[412672.1.64753752][412672.1.64753751][412672.1.64753753]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl
new file mode 100644
index 0000000..e066a00
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Gap.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Gap
+{
+  #keys: '3[412672.1.64753755][412672.1.64753754][412672.1.64753756]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl
new file mode 100644
index 0000000..7592aad
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Attribute_Plan.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Plan
+{
+  #keys: '3[412672.1.64753743][412672.1.64753742][412672.1.64753744]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl
new file mode 100644
index 0000000..2f8d5c8
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_BaseVersionValue.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: BaseVersionValue
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl
new file mode 100644
index 0000000..3f4ebb7
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/DefaultValue_CompareVersionValue.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: CompareVersionValue
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl
new file mode 100644
index 0000000..dcff02a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Function_CalcGap.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcGap
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    
+    value := this.Plan() - this.Actual();
+    
+    this.Gap( value );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl
new file mode 100644
index 0000000..f235f04
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/Method_GetAttributeByName.qbl
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetAttributeByName (
+  String attributeName
+) const declarative as String
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    value := "";
+    
+    if( attributeName = "BaseVersion" ){
+       if( not this.LocalColumn().IsAttrbuteColumn() ){
+         value := this.Plan().Format( "N(Dec)" );
+       }
+    }
+    if( attributeName = "CompareVersion" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := this.Actual().Format( "N(Dec)" );
+      }
+    }
+    if( attributeName = "Gap" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := this.Gap().Format( "N(Dec)" );
+      }
+    }
+    if( attributeName = "BaseVersionValue" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := "0";
+      }else{
+        value := this.BaseVersionValue();
+      }
+    }
+    if( attributeName = "CompareVersionValue" ){
+      if( not this.LocalColumn().IsAttrbuteColumn() ){
+        value := "0";
+      }else{
+        value := this.CompareVersionValue();
+      }
+    }
+    
+    return value;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl
new file mode 100644
index 0000000..d19420b
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_AsyncExport.qbl
@@ -0,0 +1,32 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod AsyncExport (
+  RecycleBin recycleBin,
+  const constcontent LocalRows rows,
+  const constcontent LocalColumns columns,
+  const MacroPlan macroPlan
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    sortColumns := selectsortedset( columns,Elements,column,true,column.Index());
+    
+    attributeNames := LocalCell_DemandComparison::GetAttributeNames();
+    
+    columnstring := emit( "" );
+    flag := true;
+    traverse( sortColumns,Elements,sortColumn ){
+      if( flag ){
+        attributeXML := rows -> LocalCell_DemandComparison::GetColumnXML( sortColumn,attributeNames,"attribute",macroPlan );
+        columnstring := columnstring.Merge( attributeXML )
+        flag := false;
+      }
+      
+      cellxml := rows -> LocalCell_DemandComparison::GetColumnXML( sortColumn,attributeNames ,"data",macroPlan );
+      columnstring := columnstring.Merge( cellxml);
+    }
+     
+    columnstring -> GroupAll() -> ExportXMLManager::AwaitLocalTableXMLData( recycleBin,guard( rows.Element(0).LocalTable().Name(),"Sheet1") );
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl
new file mode 100644
index 0000000..3c0055a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_Compared.qbl
@@ -0,0 +1,118 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Compared (
+  RecycleBin recycleBin,
+  String baseVersionPath,
+  String compareVersionPath,
+  String baseVersionName,
+  String compareVersionName
+) as LocalTable
+{
+  TextBody:
+  [*
+    // rislai Jun-20-2024 (created)
+    localTable := recycleBin.LocalTable( relnew,Name := baseVersionName + "__" + compareVersionName );
+    
+    baseVersionFile := OSFile::Construct();
+    compareVersionFile := OSFile::Construct();
+    
+    try {
+      baseVersionFile.Open( baseVersionPath, "Read", false );
+      baseVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, baseVersionFile.ReadBinary(), baseVersionPath );
+      baseVersionDataSource.ReadStructure();
+      
+      compareVersionFile.Open( compareVersionPath, "Read", false );
+      compareVersionDataSource := GeneralExcelImportAndExportDataSource::Upload( recycleBin, compareVersionFile.ReadBinary(), compareVersionPath );
+      compareVersionDataSource.ReadStructure();
+      
+      baseVersionTable := select( baseVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+      compareVersionTable := select( compareVersionDataSource, GeneralExcelImportAndExportDataTable, tempGEIAEDT, true );
+      
+      if( not isnull( baseVersionTable ) and not isnull( compareVersionTable )){
+        
+        //鐢熸垚琛屾暟鎹�
+        rowKeys := construct( Strings );
+        baseVersionRowTree := NamedValueTree::Create();
+        baseVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
+        compareVersionRowTree := NamedValueTree::Create();
+        compareVersionRows := construct( GeneralExcelImportAndExportDataRows ,constcontent);
+        LocalCell_DemandComparison::FillRows( baseVersionTable,rowKeys,baseVersionRowTree,baseVersionRows );
+        LocalCell_DemandComparison::FillRows( compareVersionTable,rowKeys,compareVersionRowTree,compareVersionRows );
+        
+        // 鐢熸垚鍒楁暟鎹�
+        columnTree := NamedValueTree::Create();
+        columns := construct( LocalColumns );
+        LocalCell_DemandComparison::GenerateColumnIndex( baseVersionTable,localTable,columnTree,columns );
+        LocalCell_DemandComparison::GenerateColumnIndex( compareVersionTable,localTable,columnTree,columns );
+        columnNames := selectvalues( columns,Elements,column,true,column.Name() );
+        
+        // 鐢熸垚鏁版嵁
+        
+        for ( rowIndex := 0; rowIndex < rowKeys.Size(); rowIndex++ ) {
+          rowKey := rowKeys.Element( rowIndex );
+          
+          baseVersionCellTree := NamedValueTree::Create();
+          baseVersionCells := construct( GeneralExcelImportAndExportDataCells ,constcontent);
+          
+          compareVersionCellTree := NamedValueTree::Create();
+          compareVersionCells := construct( GeneralExcelImportAndExportDataCells ,constcontent);
+          
+          LocalCell_DemandComparison::FillCells( rowKey,baseVersionRowTree,baseVersionRows,baseVersionCellTree,baseVersionCells );
+          LocalCell_DemandComparison::FillCells( rowKey,compareVersionRowTree,compareVersionRows,compareVersionCellTree,compareVersionCells );
+          
+          row := localTable.LocalRow( relnew,Index := localTable.GetRowIndexCache()  );
+          
+          traverse( columnNames,Elements,columnName ){
+            columnHandle := columnTree.GetHandle( columnName );
+            columnIndex := columnTree.Root().Child( columnHandle ).GetValueAsNumber();
+            column := columns.Element( columnIndex );
+            
+            baseVersionCell := constnull( GeneralExcelImportAndExportDataCell );
+            baseVersionCellHandle := baseVersionCellTree.GetHandle( columnName );
+            try{
+              baseVersionCellIndex := baseVersionCellTree.Root().Child( baseVersionCellHandle ).GetValueAsNumber();
+              baseVersionCell := baseVersionCells.Element( baseVersionCellIndex );
+            }onerror{}
+            
+            compareVersionCell := constnull( GeneralExcelImportAndExportDataCell );
+            compareVersionCellHandle := compareVersionCellTree.GetHandle( columnName );
+            try{
+              compareVersionCellIndex := compareVersionCellTree.Root().Child( compareVersionCellHandle ).GetValueAsNumber();
+              compareVersionCell := compareVersionCells.Element( compareVersionCellIndex );
+            }onerror{}
+            
+            if( columnName = "浜у湴" or columnName = "杞﹀瀷" or columnName = "鍙戝姩鏈洪浂浠跺彿" or columnName = "鍙戝姩鏈哄洓浣嶇爜" ){
+              row.LocalCell( relnew,LocalCell_DemandComparison,LocalColumn := column,
+                             BaseVersionValue := ifexpr( isnull( baseVersionCell ), "绌�", baseVersionCell.Value()),
+                             CompareVersionValue := ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()));
+              column.IsAttrbuteColumn( true );
+              if( columnName = "鍙戝姩鏈洪浂浠跺彿" ){
+                row.CustomName( ifexpr( isnull( baseVersionCell ), ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()), baseVersionCell.Value()) );
+              }
+            }else{
+              row.LocalCell( relnew,LocalCell_DemandComparison,LocalColumn := column,
+                             BaseVersion := ifexpr( isnull( baseVersionCell ),0,[Real]baseVersionCell.Value()),
+                             CompareVersion := ifexpr( isnull( compareVersionCell ), 0 ,[Real]compareVersionCell.Value() ));
+            }
+          }
+        }
+      }
+      // 鍚庣画鍒犻櫎
+      baseVersionDataSource.Delete();
+      compareVersionDataSource.Delete();
+      
+      baseVersionFile.Close();
+      compareVersionFile.Close();
+    } onerror {
+      if( not isnull( baseVersionFile )){
+        baseVersionFile.Close(); 
+      }
+      if( not isnull( compareVersionFile )){
+        compareVersionFile.Close(); 
+      }
+      error( e );
+    }
+    
+    return localTable;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl
new file mode 100644
index 0000000..6aeded1
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillCells.qbl
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FillCells (
+  String rowName,
+  NamedValueTree rowTree,
+  constcontent GeneralExcelImportAndExportDataRows rows,
+  NamedValueTree cellTree,
+  constcontent GeneralExcelImportAndExportDataCells cells
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    rowHandel := rowTree.GetHandle( rowName );
+    try{
+      rowIndex := rowTree.Root().Child( rowHandel ).GetValueAsNumber();
+      row := rows.Element( rowIndex );
+      
+      temp_cells := selectsortedset( row,GeneralExcelImportAndExportDataCell,cell,true,cell.GeneralExcelImportAndExportDataColumn().ColumnIndex() );
+      for( i := 0 ; i<temp_cells.Size();i++ ){
+        cell := temp_cells.Element( i );
+        tempHandle := cellTree.GetHandle( cell.GeneralExcelImportAndExportDataColumn().Name() );
+        
+        cells.Add( cell );
+        cellTree.Root().AddChild( tempHandle,cells.Size() - 1 );
+        
+      }
+    }onerror{}
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl
new file mode 100644
index 0000000..391100a
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_FillRows.qbl
@@ -0,0 +1,36 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod FillRows (
+  const GeneralExcelImportAndExportDataTable general,
+  Strings rowKeys,
+  NamedValueTree rowTree,
+  constcontent GeneralExcelImportAndExportDataRows rows
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    rowKeyColumn1 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "浜у湴" );
+    rowKeyColumn2 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "杞﹀瀷" );
+    rowKeyColumn3 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "鍙戝姩鏈洪浂浠跺彿" );
+    rowKeyColumn4 := select( general, GeneralExcelImportAndExportDataColumn, column, column.Name() = "鍙戝姩鏈哄洓浣嶇爜" );
+    tempRowKeyCells1 := selectset( rowKeyColumn1,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells2 := selectset( rowKeyColumn2,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells3 := selectset( rowKeyColumn3,GeneralExcelImportAndExportDataCell,cell,true );
+    tempRowKeyCells4 := selectset( rowKeyColumn4,GeneralExcelImportAndExportDataCell,cell,true );
+    
+    for( i := 0; i< tempRowKeyCells1.Size(); i++ ){
+      tempRowKeyCell1 := tempRowKeyCells1.Element( i );
+      tempRowKeyCell2 := tempRowKeyCells2.Element( i );
+      tempRowKeyCell3 := tempRowKeyCells3.Element( i );
+      tempRowKeyCell4 := tempRowKeyCells4.Element( i );
+      
+      rowKey := tempRowKeyCell1.Value() + tempRowKeyCell2.Value() + tempRowKeyCell3.Value() + tempRowKeyCell4.Value();
+      
+      tempHandle := rowTree.GetHandle( rowKey );
+      rowTree.Root().AddChild( tempHandle ,i);
+      rows.Add( tempRowKeyCell1.GeneralExcelImportAndExportDataRow());
+      rowKeys.Add( rowKey );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl
new file mode 100644
index 0000000..44609af
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GenerateColumnIndex.qbl
@@ -0,0 +1,39 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GenerateColumnIndex (
+  const GeneralExcelImportAndExportDataTable table,
+  LocalTable localTable,
+  NamedValueTree columnTree,
+  LocalColumns columns
+)
+{
+  TextBody:
+  [*
+    // rislai Jun-22-2024 (created)
+    tableColumns := selectset( table,GeneralExcelImportAndExportDataColumn,column,true );
+    for( i := 0; i< tableColumns.Size(); i++ ){
+      generalColumn := tableColumns.Element( i );
+      tempHandle := columnTree.GetHandle( generalColumn.Name() );
+    
+      nameValue := guard( columnTree.Root().Child( tempHandle ),null( NamedValue )); 
+      if( isnull( nameValue )){
+        index := 999;
+        if( generalColumn.Name() = "浜у湴" ){
+          index := 1;
+        }else if( generalColumn.Name() = "杞﹀瀷" ){
+          index := 2;
+        }else if( generalColumn.Name() = "鍙戝姩鏈洪浂浠跺彿" ){
+          index := 3;
+        }else if( generalColumn.Name() = "鍙戝姩鏈哄洓浣嶇爜" ){
+          index := 4;
+        }else{
+          // 2023/01/01
+          index := [Number]generalColumn.Name().ReplaceAll( "/", "" );
+        }
+        column := localTable.LocalColumn( relnew, Name := generalColumn.Name(),CustomIndex := index );
+        columns.Add( column );
+        columnTree.Root().AddChild( tempHandle,columns.Size() - 1 );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl
new file mode 100644
index 0000000..1072935
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetAttributeNames.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetAttributeNames () const declarative as owning Strings
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    attributeNames := construct( Strings );
+    
+    attributeNames.Add( "BaseVersion" );
+    attributeNames.Add( "CompareVersion" );
+    attributeNames.Add( "Gap" );
+    
+    return &attributeNames;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl
new file mode 100644
index 0000000..6d45dc4
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/StaticMethod_GetColumnXML.qbl
@@ -0,0 +1,97 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod GetColumnXML (
+  const constcontent LocalRows rows,
+  const LocalColumn column,
+  const Strings attributeNames,
+  String type,
+  const MacroPlan macroPlan
+) const as String
+{
+  TextBody:
+  [*
+    // rislai Jun-21-2024 (created)
+    // rislai Jun-20-2024 (created)
+    columnXML := "";
+    cells := selectsortedset( column, LocalCell.astype( LocalCell_DemandComparison ), cell,
+                                  exists( rows,Elements,element,element = cell.LocalRow()), cell.LocalRow().Index());
+    if( type = "data" ){
+      columnXML := "";
+      if( column.IsAttrbuteColumn() ){
+        columnXML := "<column><name>" + column.Name() + "</name><type>String</type>"; 
+      }else{
+        columnXML := "<column><name>" + column.Name() + "</name><type>Number</type>"; 
+      }
+      traverse ( cells, Elements, cell ) {
+        traverse( attributeNames ,Elements,e ){
+          cellXML := '<cell value="' + cell.GetAttributeByName( e ) + '"/>'
+          columnXML := columnXML + cellXML;
+        }
+      }
+      columnXML := columnXML + "</column>";
+    }
+    if( type = "attribute" ){
+      columnXML0_1 := "<column><name>Sales Segment</name><type>String</type>";
+      columnXML0_2 := "<column><name>Generation</name><type>String</type>";
+      columnXML0_3 := "<column><name>MQB/MLB</name><type>String</type>";
+      columnXML0_4 := "<column><name>鍔熺巼</name><type>String</type>";
+      
+      columnXML1 := "<column><name>Product ID</name><type>String</type>";
+      columnXML2 := "<column><name>Attribute</name><type>String</type>";
+      
+      traverse ( cells, Elements, cell ) {
+        flag := true;
+        traverse( attributeNames ,Elements,e ){
+          if( flag ){
+            cellXML := '<cell value="' + cell.LocalRow().Name() + '"/>'
+            columnXML1 := columnXML1 + cellXML;
+            
+            salesSegment := select( cell.LocalRow().LocalTable(),LocalColumn.LocalCell.astype( LocalCell_DemandComparison ),temp_cell,temp_cell.LocalRow() = cell.LocalRow() and temp_cell.LocalColumn().Name() = "浜у湴");
+            if( not isnull( salesSegment )){
+              cellXML0_1 := '<cell value="' + ifexpr( salesSegment.BaseVersionValue() <> "绌�",salesSegment.BaseVersionValue(),salesSegment.CompareVersionValue()) + '"/>';
+              columnXML0_1 := columnXML0_1 + cellXML0_1;
+            }else{
+              cellXML0_1 := '<cell value="  "/>'
+              columnXML0_1 := columnXML0_1 + cellXML0_1;
+            }
+            
+            product := select( macroPlan,Product_MP,product,product.ID() = cell.LocalRow().Name() );
+            if( not isnull( product )){
+              cellXML0_2 := '<cell value="' + product.Generation() + '"/>';
+              cellXML0_3 := '<cell value="' + product.MQBMLB() + '"/>';
+              cellXML0_4 := '<cell value="' + product.Power() + '"/>';
+              columnXML0_2 := columnXML0_2 + cellXML0_2;
+              columnXML0_3 := columnXML0_3 + cellXML0_3;
+              columnXML0_4 := columnXML0_4 + cellXML0_4;
+            }else{
+              cellXML0_2 := '<cell value="  "/>';
+              cellXML0_3 := '<cell value="  "/>';
+              cellXML0_4 := '<cell value="  "/>';
+              columnXML0_2 := columnXML0_2 + cellXML0_2;
+              columnXML0_3 := columnXML0_3 + cellXML0_3;
+              columnXML0_4 := columnXML0_4 + cellXML0_4;
+            }
+            
+            flag := false;
+          }else{
+            cellXML := '<cell value="  "/>'
+            columnXML1 := columnXML1 + cellXML;
+            cellXML0_1 := '<cell value="  "/>'
+            cellXML0_2 := '<cell value="  "/>';
+            cellXML0_3 := '<cell value="  "/>';
+            cellXML0_4 := '<cell value="  "/>';
+            columnXML0_1 := columnXML0_1 + cellXML0_1;
+            columnXML0_2 := columnXML0_2 + cellXML0_2;
+            columnXML0_3 := columnXML0_3 + cellXML0_3;
+            columnXML0_4 := columnXML0_4 + cellXML0_4;
+          }
+          cellXML := '<cell value="' + e + '"/>'
+          columnXML2 := columnXML2 + cellXML;
+        }
+      }
+      columnXML := columnXML0_1 + "</column>" + columnXML0_2 + "</column>" + columnXML0_3 + "</column>" + columnXML0_4 + "</column>" + columnXML1 + "</column>" + columnXML2 + "</column>";
+    }
+     
+    return columnXML;
+  *]
+}
diff --git a/_Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl b/_Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl
new file mode 100644
index 0000000..3271cca
--- /dev/null
+++ b/_Main/BL/Type_LocalCell_ProductionComparison/_ROOT_Type_LocalCell_ProductionComparison.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+TypeSpecialization LocalCell_ProductionComparison
+{
+  #keys: '2[412672.1.64753741][412672.1.64753740]'
+  Parent: LocalCell
+  StructuredName: 'LocalCell_ProductionComparisons'
+}
diff --git a/_Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl b/_Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl
new file mode 100644
index 0000000..08e7058
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Attribute_CustomIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute CustomIndex
+{
+  #keys: '3[412672.1.64721865][412672.1.64721864][412672.1.64721866]'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl b/_Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl
new file mode 100644
index 0000000..d26aba3
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/DefaultValue_CustomIndex.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  ISOValue: '-999'
+  TargetAttribute: CustomIndex
+}
diff --git a/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl b/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl
new file mode 100644
index 0000000..8319f34
--- /dev/null
+++ b/_Main/BL/Type_LocalColumn/Function_CalcIndex.qbl
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcIndex
+{
+  TextBody:
+  [*
+    // rislai Jul-24-2024 (created)
+    year := this.Date().Year();
+    month := this.Date().Month();
+    day := this.Date().Day();
+    
+    index := [String]year;
+    if( month < 10 ){
+      index := index + "0" + [String]month; 
+    }
+    if( day < 10 ){
+      index := index + "0" + [String]day; 
+    }
+    
+    
+    value := ifexpr( this.CustomIndex() = -999,[Number]index,this.CustomIndex() );
+    
+    this.Index( value );
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl b/_Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl
index cb7d860..9434ec7 100644
--- a/_Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl
+++ b/_Main/BL/Type_OfflinePlanTable/Method_Comparison.qbl
@@ -8,7 +8,16 @@
   [*
     // rislai Jul-17-2024 (created)
     macroPlan := this.MacroPlan();
-    table := recycleBin.LocalTable( relnew,Name := "");
+    table := recycleBin.LocalTable( relnew,Name := "浜ч噺瀵规瘮鎶ヨ〃");
+    
+    actualDailyProductionDatas := selectset( macroPlan,ActualDailyProductionData,data,true );
+    actualDailyProductionDataIndexTree := NamedValueTree::Create();
+    for( i := 0; i< actualDailyProductionDatas.Size(); i++ ){
+      actualDailyProductionData := actualDailyProductionDatas.Element( i );
+      actualDailyProductionDataKey := actualDailyProductionData.Product() + actualDailyProductionData.Date().AsQUILL();
+      actualDailyProductionDataHandle := actualDailyProductionDataIndexTree.GetHandle( actualDailyProductionDataKey );
+      actualDailyProductionDataIndexTree.Root().AddChild( actualDailyProductionDataHandle,i ); 
+    }
     
     localColumns := construct( LocalColumns );
     localColumnIndexTree := NamedValueTree::Create();
@@ -18,20 +27,36 @@
       localColumns.Add( localColumn );
       localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 );
     }
+    
     traverse( this,OfflinePlanRow,row,row.Type() = "1" ){
       productID := row.ProductID();
-      
+      productLine := row.ProductionLine();
       localRow := table.LocalRow( relnew,Index := table.GetRowIndexCache(),CustomName := productID );
       traverse( row,OfflinePlanCell,cell,cell.OfflinePlanColumn().ColumnDate() >= macroPlan.StartOfPlanning().Date() ){
         localColumnHandle := localColumnIndexTree.GetHandle( cell.OfflinePlanColumn().ColumnDate().AsQUILL() );
         localColumnIndex := guard( localColumnIndexTree.Root().Child( localColumnHandle ),null( NamedValue ));
         if( not isnull( localColumnIndex )){
+          actualDailyProductionDataKey := productID + cell.OfflinePlanColumn().ColumnDate().AsQUILL();
+          actualDailyProductionDataHandle := actualDailyProductionDataIndexTree.GetHandle( actualDailyProductionDataKey );
+          actualDailyProductionDataIndex := guard( actualDailyProductionDataIndexTree.Root().Child( actualDailyProductionDataHandle ),null( NamedValue ));
+          
+          actualDailyProductionVolume := 0.0;
+          if( not isnull( actualDailyProductionDataIndex )){
+            actualDailyProductionData := actualDailyProductionDatas.Element( actualDailyProductionDataIndex.GetValueAsNumber() );
+            actualDailyProductionVolume := actualDailyProductionData.ProductionVolume();
+          }
           localColumn := localColumns.Element( localColumnIndex.GetValueAsNumber() );
-          localCell := localRow.LocalCell( relnew,LocalCell_DemandComparison ,LocalColumn := localColumn,
-                                           BaseVersion := cell.Quantity(),CompareVersion := 0.0);
+          localRow.LocalCell( relnew,LocalCell_ProductionComparison ,LocalColumn := localColumn,
+                                           Plan := cell.Quantity(),Actual := actualDailyProductionVolume );
         }
       }
     }
+    traverse( table,LocalColumn,column ){
+      if( column.LocalCell( relsize ) = 0 ){
+        column.Delete(); 
+      } 
+    }
+    
     return table;
   *]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
index 8417130..7f3a077 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupReport.def
@@ -71,6 +71,17 @@
         Taborder: 5
       ]
     }
+    Component ButtonOfflinePlanComparisonReport
+    {
+      #keys: '[412672.1.66051424]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'DOCUMENT_INFO'
+        Label: '浜ч噺瀵规瘮鎶ヨ〃'
+        Taborder: 6
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def
new file mode 100644
index 0000000..76d3138
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupReport/ButtonOfflinePlanComparisonReport
+Response OnClick () id:Response_MacroPlanner_ActionBarGroupReport_ButtonOfflinePlanComparisonReport_OnClick
+{
+  #keys: '[412672.1.66051682]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      // Open view
+      ApplicationMacroPlanner.OpenView( 'OfflinePlanComparisonReport', this );
+    *]
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor\043988.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor\043988.def"
new file mode 100644
index 0000000..9fe94ea
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_MatrixEditor\043988.def"
@@ -0,0 +1,102 @@
+Quintiq file version 2.0
+Component MatrixEditor id:MatrixEditor_988
+{
+  #keys: '[412672.1.61940674]'
+  BaseType: 'WebMatrixEditor'
+  Children:
+  [
+    Component MatrixEditorCell
+    {
+      #keys: '[412672.1.61940675]'
+      BaseType: 'WebMatrixEditorCell'
+      Children:
+      [
+        Component DataExtractorCells
+        {
+          #keys: '[412672.1.61940676]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalRow.LocalCell.astype(LocalCell_ProductionComparison)'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Attributes: 'Plan;Actual;Gap'
+        Column: 'LocalColumn'
+        Row: 'LocalRow'
+        Taborder: 0
+      ]
+    }
+    Component MatrixEditorRows
+    {
+      #keys: '[412672.1.61940677]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorRows
+        {
+          #keys: '[412672.1.61940678]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            FilterArguments: 'checkedProduct:QMacroPlanner::FormOfflinePlanComparison.dhFinelProduct'
+            FixedFilter: 'exists( checkedProduct,Elements,product,product.ID() = object.Name() )'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalRow'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Name'
+        SortCriteria: 'Index'
+        Taborder: 1
+      ]
+    }
+    Component MatrixEditorColumns
+    {
+      #keys: '[412672.1.61940679]'
+      BaseType: 'WebMatrixEditorHeaderLevel'
+      Children:
+      [
+        Component DataExtractorColumns
+        {
+          #keys: '[412672.1.61940680]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'LocalTable'
+            FilterArguments: 'startDate:QMacroPlanner::FormOfflinePlanComparison.dhStartDate;endDate:QMacroPlanner::FormOfflinePlanComparison.dhEndDate'
+            FixedFilter: 'not object.IsAttrbuteColumn() and startDate <= object.Date() and endDate > object.Date()'
+            Source: 'dhComparisonData'
+            Taborder: 0
+            Transformation: 'LocalColumn'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Legend: 'Date'
+        SortCriteria: 'Index'
+        Taborder: 2
+      ]
+    }
+    #child: matrixEditorActionBarPageDemandComparison_1
+    #child: matrixeditorContextMenuDemandComparison_1
+  ]
+  Properties:
+  [
+    AllowMultipleAttributes: true
+    Columns: 'MatrixEditorColumns'
+    ContextMenu: 'matrixeditorContextMenuDemandComparison'
+    Rows: 'MatrixEditorRows'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison\043634.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison\043634.def"
new file mode 100644
index 0000000..d1923c2
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelDemandComparison\043634.def"
@@ -0,0 +1,84 @@
+Quintiq file version 2.0
+Component PanelDemandComparison id:PanelDemandComparison_634
+{
+  #keys: '[412672.1.61940673]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: MatrixEditor_988
+    Component dhComparisonData
+    {
+      #keys: '[412672.1.61940683]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'LocalTable'
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
+    Component dhCheckedProduct
+    {
+      #keys: '[412672.1.61940684]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Product_MP]*'
+      Children:
+      [
+        Component deCheckedProduct
+        {
+          #keys: '[412672.1.61940685]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[Product_MP]'
+            Source: 'ApplicationMacroPlanner.DataHolderCheckedProduct'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 3
+      ]
+    }
+    Component dhFinelProduct
+    {
+      #keys: '[412672.1.61940686]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Product_MP]*'
+      Properties:
+      [
+        Taborder: 2
+      ]
+    }
+    Component dhCheckedSalesSegment
+    {
+      #keys: '[412672.1.61940687]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[SalesSegment_MP]*'
+      Children:
+      [
+        Component deCheckedSalesSegment
+        {
+          #keys: '[412672.1.61940688]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'structured[SalesSegment_MP]'
+            Source: 'ApplicationMacroPlanner.DataHolderCheckedSalesSegment'
+            Taborder: 0
+            Transformation: 'Elements'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 4
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter\043119.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter\043119.def"
new file mode 100644
index 0000000..688487d
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelFilter\043119.def"
@@ -0,0 +1,96 @@
+Quintiq file version 2.0
+Component PanelFilter id:PanelFilter_119
+{
+  #keys: '[412672.1.61991354]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslGeneration
+    {
+      #keys: '[412672.1.61991355]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'Generation'
+        Taborder: 0
+      ]
+    }
+    Component ddslMQBMLB
+    {
+      #keys: '[412672.1.61991356]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: 'MQB/MLB'
+        Taborder: 1
+      ]
+    }
+    Component ddslPower
+    {
+      #keys: '[412672.1.61991357]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '鍔熺巼'
+        Taborder: 2
+      ]
+    }
+    Component dsStartDate
+    {
+      #keys: '[412672.1.61991358]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Label: 'Start Date'
+        Taborder: 3
+      ]
+    }
+    Component dsEndDate
+    {
+      #keys: '[412672.1.61991359]'
+      BaseType: 'WebDateSelector'
+      Properties:
+      [
+        Date: 9999-12-31
+        Label: 'End Date'
+        Taborder: 5
+      ]
+    }
+    Component ButtonFilter
+    {
+      #keys: '[412672.1.61991360]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '杩囨护'
+        Taborder: 7
+      ]
+    }
+    Component dhStartDate
+    {
+      #keys: '[412672.1.61991361]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date*'
+      Properties:
+      [
+        Taborder: 4
+      ]
+    }
+    Component dhEndDate
+    {
+      #keys: '[412672.1.61991362]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'Date*'
+      Properties:
+      [
+        Taborder: 6
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def
new file mode 100644
index 0000000..8c81a3d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+Component PanelRibbon
+{
+  #keys: '[412672.1.64210439]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: PanelFilter_119
+    #child: PanelRibbon504
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def
new file mode 100644
index 0000000..abb2e55
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_PanelRibbon504.def
@@ -0,0 +1,62 @@
+Quintiq file version 2.0
+Component PanelRibbon504
+{
+  #keys: '[412672.1.64850929]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddlOfflinePlanTable
+    {
+      #keys: '[412672.1.64850982]'
+      BaseType: 'WebDropDownList'
+      Databinding: 'OfflinePlanTable'
+      Children:
+      [
+        Component DataExtractorRibbon
+        {
+          #keys: '[412672.1.64850983]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'MacroPlan'
+            Source: 'MacroPlan'
+            Taborder: 0
+            Transformation: 'OfflinePlanTable'
+          ]
+        }
+      ]
+      Properties:
+      [
+        DisplayField: 'SaveDateTime'
+        Label: '涓嬬嚎璁″垝:'
+        Taborder: 0
+      ]
+    }
+    Component bComparison
+    {
+      #keys: '[412672.1.64851009]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '寮�濮嬪姣�'
+        Taborder: 1
+      ]
+    }
+    Component LabelRibbon
+    {
+      #keys: '[412672.1.66018113]'
+      BaseType: 'WebLabel'
+      Properties:
+      [
+        DataBinding: 'ddlOfflinePlanTable.Data.SaveDateTime'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison\0431.def"
new file mode 100644
index 0000000..f0083f7
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixEditorActionBarPageDemandComparison\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixEditorActionBarPageDemandComparison id:matrixEditorActionBarPageDemandComparison_1
+{
+  #keys: '[412672.1.61940681]'
+  BaseType: 'matrixEditorActionBarPage'
+  Properties:
+  [
+    Taborder: 3
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison\0431.def"
new file mode 100644
index 0000000..5cd9345
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Component_matrixeditorContextMenuDemandComparison\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component matrixeditorContextMenuDemandComparison id:matrixeditorContextMenuDemandComparison_1
+{
+  #keys: '[412672.1.61940682]'
+  BaseType: 'matrixeditorContextMenu'
+  Properties:
+  [
+    Taborder: 4
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def
new file mode 100644
index 0000000..15c2b22
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhCheckedProduct
+Response OnDataChanged () id:Response_PanelDemandComparison_634_dhCheckedProduct_OnDataChanged
+{
+  #keys: '[412672.1.61940669]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Data().Size() <> 0 ){
+        dhFinelProduct.Data( this.Data().Copy() ); 
+      }else{
+        dhFinelProduct.Data( DataHolderProduct.Data().Copy() ); 
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def
new file mode 100644
index 0000000..48ec71e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged.def
@@ -0,0 +1,21 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhCheckedSalesSegment
+Response OnDataChanged () id:Response_PanelDemandComparison_634_dhCheckedSalesSegment_OnDataChanged
+{
+  #keys: '[412672.1.61940667]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      if( this.Data().Size() <> 0 ){
+        prods := selectset( dhFinelProduct.Data(),Elements,element,exists( this.Data(),Elements.SalesDemand.Product_MP,prod,element = prod ));
+        dhFinelProduct.Data( &prods );
+      }else{
+        dhFinelProduct.Data( DataHolderProduct.Data().Copy() );
+      }
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def
new file mode 100644
index 0000000..0142a22
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhComparisonData
+Response OnDataChanged () id:Response_PanelDemandComparison_634_dhComparisonData_OnDataChanged
+{
+  #keys: '[412672.1.61940670]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      PanelDemandComparison.Title( this.Data().Name() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def
new file mode 100644
index 0000000..c3eacc2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelDemandComparison_634_dhFinelProduct_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelDemandComparison_634/dhFinelProduct
+Response OnCreated () id:Response_PanelDemandComparison_634_dhFinelProduct_OnCreated
+{
+  #keys: '[412672.1.61940668]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( DataHolderProduct.Data().Copy() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def
new file mode 100644
index 0000000..a4f3788
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ButtonFilter_OnClick.def
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ButtonFilter
+Response OnClick () id:Response_PanelFilter_119_ButtonFilter_OnClick
+{
+  #keys: '[412672.1.61991348]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      products := dhCheckedProduct.Data().Copy();
+      if( ddslGeneration.Text() <> "<All>" ){
+        products := selectset( products,Elements,element,element.Generation() <> ddslGeneration.Text());
+      }
+      if( ddslMQBMLB.Text() <> "<All>" ){
+        products := selectset( products,Elements,element,element.MQBMLB() <> ddslMQBMLB.Text());
+      }
+      if( ddslPower.Text() <> "<All>" ){
+        products := selectset( products,Elements,element,element.Power() <> ddslPower.Text());
+      }
+      dhFinelProduct.Data( &products );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def
new file mode 100644
index 0000000..d7286fc
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslGeneration_OnCreated.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ddslGeneration
+Response OnCreated () id:Response_PanelFilter_119_ddslGeneration_OnCreated
+{
+  #keys: '[412672.1.61991353]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      strings := selectuniquevalues( MacroPlan,Product_MP,product,not product.IsSystem(),product.Generation() );
+      
+      res := strings.Concatenate( ";" );
+      
+      this.Strings( "<All>;" + res );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def
new file mode 100644
index 0000000..3228a00
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslMQBMLB_OnCreated.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ddslMQBMLB
+Response OnCreated () id:Response_PanelFilter_119_ddslMQBMLB_OnCreated
+{
+  #keys: '[412672.1.61991352]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      strings := selectuniquevalues( MacroPlan,Product_MP,product,not product.IsSystem(),product.MQBMLB() );
+      
+      res := strings.Concatenate( ";" );
+      
+      this.Strings( "<All>;" + res );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def
new file mode 100644
index 0000000..7d8370b
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_ddslPower_OnCreated.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/ddslPower
+Response OnCreated () id:Response_PanelFilter_119_ddslPower_OnCreated
+{
+  #keys: '[412672.1.61991351]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      strings := selectuniquevalues( MacroPlan,Product_MP,product,not product.IsSystem(),product.Power() );
+      
+      res := strings.Concatenate( ";" );
+      
+      this.Strings( "<All>;" + res );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def
new file mode 100644
index 0000000..2aedb4a
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhEndDate_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dhEndDate
+Response OnCreated () id:Response_PanelFilter_119_dhEndDate_OnCreated
+{
+  #keys: '[412672.1.61991346]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( Date::MaxDate() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def
new file mode 100644
index 0000000..a2dc135
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dhStartDate_OnCreated.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dhStartDate
+Response OnCreated () id:Response_PanelFilter_119_dhStartDate_OnCreated
+{
+  #keys: '[412672.1.61991347]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      this.Data( Date::MinDate() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def
new file mode 100644
index 0000000..79ee881
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsEndDate_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dsEndDate
+Response OnChanged () id:Response_PanelFilter_119_dsEndDate_OnChanged
+{
+  #keys: '[412672.1.61991349]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhEndDate.Data( this.Date() );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def
new file mode 100644
index 0000000..1b7e133
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelFilter_119_dsStartDate_OnChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: PanelFilter_119/dsStartDate
+Response OnChanged () id:Response_PanelFilter_119_dsStartDate_OnChanged
+{
+  #keys: '[412672.1.61991350]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDateTimeFieldBase_OnChanged'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      dhStartDate.Data( this.Date() );
+    *]
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def"
new file mode 100644
index 0000000..99add2b
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/Response_PanelRibbon504_bComparison_OnClick\043613.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelRibbon504/bComparison
+Response OnClick () id:Response_PanelRibbon504_bComparison_OnClick_613
+{
+  #keys: '[412672.1.64851008]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      opt := ddlOfflinePlanTable.Data();
+      
+      dhComparisonData.Data( opt.Comparison( RecycleBin ));
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def
new file mode 100644
index 0000000..064466f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanComparison/_ROOT_Component_FormOfflinePlanComparison.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormOfflinePlanComparison
+{
+  #keys: '[412672.1.61921213]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: PanelRibbon
+    #child: PanelDemandComparison_634
+  ]
+  Properties:
+  [
+    Image: 'DOCUMENT_INFO'
+    Title: '浜ч噺瀵规瘮鎶ヨ〃'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw b/_Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw
new file mode 100644
index 0000000..0bb5878
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/OfflinePlanComparisonReport.vw
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    page: ''
+    group: ''
+    index: 0
+    image: 'DOCUMENT_INFO'
+    description: ''
+  }
+  formatversion: 2
+  id: 'OfflinePlanComparisonReport'
+  name: 'OfflinePlanComparisonReport'
+  isglobal: false
+  isroot: true
+}

--
Gitblit v1.9.3