From 3bd62f5f68dfab21885d9b3f6c5d4e4defadae42 Mon Sep 17 00:00:00 2001
From: hongji.li <hongji.a.li@capgemini.com>
Date: 星期一, 30 十月 2023 15:21:58 +0800
Subject: [PATCH] 年度产销复盘BUG修改

---
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh#171.def |    4 
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl                                                                                            |    6 
 _Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl                                                                                                                    |   49 +
 _Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl                                                                                                               |   93 +--
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def                                                                             |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick#603.def                              |    8 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def                                                                                                    |   29 +
 _Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl                                                                             |   18 
 _Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def                                                                                           |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def                                                   |    2 
 _Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl                                                                                                 |   15 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def                                                                             |   60 ++
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def                                                                     |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def                                                                  |   41 +
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def                                                                         |    5 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews#859.def                                                         |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def                                                         |   53 -
 _Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl                                                                                                 |   19 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def                                                                   |   23 
 _Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def                                                                                                |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def                                                     |   22 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def                                                              |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick#325.def                                                    |    6 
 _Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl                                                                                                             |  247 ++++---
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick#19.def                                                         |   26 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def                                |   20 
 /dev/null                                                                                                                                                                     |  205 -------
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def                                                                                   |   37 +
 _Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl                                                                                                |   16 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def                                                                   |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def                                                                                     |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick#971.def                                                            |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def                                                                                          |   48 +
 _Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl                                                                                         |   18 
 _Main/UI/MacroPlannerWebApp/Views/年度产销复盘.vw                                                                                                                                   |  562 ++----------------
 _Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl                                                                                         |    8 
 _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick#231.def                                      |   12 
 38 files changed, 750 insertions(+), 986 deletions(-)

diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl
new file mode 100644
index 0000000..c116037
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemColumn/Attribute_TotalIdentification.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TotalIdentification
+{
+  #keys: '3[414702.1.286051925][414702.1.286051924][414702.1.286051926]'
+  Description: '鏍囪瘑浣嶏紙鍒ゆ柇鏄惁鍔犲拰锛�'
+  ValueType: Number
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
index 230f93e..3b19661 100644
--- a/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
+++ b/_Main/BL/Type_CapacityAndSaleBudgeCompareItemRow/StaticMethod_CreateIfNotExist.qbl
@@ -10,9 +10,11 @@
   [*
     // yypsybs Sep-18-2023 (created)
     value := select( parent, CapacityAndSaleBudgeCompareItemRow, row, row.BusinessType() = businessType and row.PlaceOfProductionOfArray() = placeOfProductionOfArray );
-    if( isnull( value ) ) {
+    
+    if ( isnull( value ) ) {
       value := parent.CapacityAndSaleBudgeCompareItemRow( relnew, BusinessType := businessType, PlaceOfProductionOfArray := placeOfProductionOfArray );  
-    } 
+    }
+    
     return value;
   *]
 }
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..a41d703
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterBusinessType/StaticMethod_InitializedData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP,
+  const GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterBusinessType( relflush );
+    
+    businessTypes := selectuniquevalues( globalOTDTable, Global_MappingProduct_MP, tempGMPMP, true, tempGMPMP.BusinessType() );
+    
+    traverse ( businessTypes, Elements, bt ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterBusinessType( relnew, BusinessType := bt );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
deleted file mode 100644
index 3601509..0000000
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_Initial.qbl
+++ /dev/null
@@ -1,14 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod Initial (
-  GlobalOTDSOP parent
-)
-{
-  Description: '鍒濆鍖栧姣旈」'
-  TextBody:
-  [*
-    // yypsybs Sep-15-2023 (created)
-    CapacityAndSaleBudgeFilterItem::CreateIfNotExist( parent, "闈㈡澘鍒嗛厤閲�" );
-    CapacityAndSaleBudgeFilterItem::CreateIfNotExist( parent, "閿�鍞" );
-  *]
-}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..c9a019d
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterItem/StaticMethod_InitializedData.qbl
@@ -0,0 +1,15 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP
+)
+{
+  Description: '鍒濆鍖栧姣旈」'
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterItem( relflush );
+    
+    globalOTDSOP.CapacityAndSaleBudgeFilterItem( relnew, ItemName := "闈㈡澘鍒嗛厤閲�" );
+    globalOTDSOP.CapacityAndSaleBudgeFilterItem( relnew, ItemName := "閿�鍞" );
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
deleted file mode 100644
index 8159900..0000000
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_Initial.qbl
+++ /dev/null
@@ -1,19 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod Initial (
-  GlobalOTDSOP parent
-)
-{
-  Description: '鍒濆鍖栧勾浠�'
-  TextBody:
-  [*
-    // yypsybs Sep-15-2023 (created)
-    existList := selectuniquevalues( parent, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
-    for( i := 1; i <= 12; i++ ) {
-      if( existList.Find( i ) = -1 ) {
-        parent.CapacityAndSaleBudgeFilterMonth( relnew, 
-                                                MonthNo := i );
-      }  
-    }
-  *]
-}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..b85464a
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterMonth/StaticMethod_InitializedData.qbl
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP
+)
+{
+  Description: '鍒濆鍖栧勾浠�'
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterMonth( relflush );
+    
+    for( i := 1; i <= 12; i++ ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterMonth( relnew, MonthNo := i );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..3c65d07
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterPlaceOfProductionOfArray/StaticMethod_InitializedData.qbl
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP,
+  const GlobalOTDTable globalOTDTable
+)
+{
+  TextBody:
+  [*
+    globalOTDSOP.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relflush );
+    
+    organCodes := selectuniquevalues( globalOTDTable, Global_MappingOperation, tempGMO, true, tempGMO.OrganCode() );
+    
+    traverse ( organCodes, Elements, oc ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relnew, PlaceOfProductionOfArray := oc );
+    }
+  *]
+}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
deleted file mode 100644
index 72badb3..0000000
--- a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_Initial.qbl
+++ /dev/null
@@ -1,20 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod Initial (
-  GlobalOTDSOP parent
-)
-{
-  Description: '鍒濆鍖栧勾浠�'
-  TextBody:
-  [*
-    // yypsybs Sep-15-2023 (created)
-    existList := selectuniquevalues( parent, CapacityAndSaleBudgeFilterYear, item, item.YearNo() );
-    nowYear := Date::Today().Year();
-    for( i := nowYear - 10; i <= nowYear + 5; i++ ) {
-      if( existList.Find( i ) = -1 ) {
-        parent.CapacityAndSaleBudgeFilterYear( relnew, 
-                                               YearNo := i );
-      }  
-    }
-  *]
-}
diff --git a/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl
new file mode 100644
index 0000000..a76216a
--- /dev/null
+++ b/_Main/BL/Type_CapacityAndSaleBudgeFilterYear/StaticMethod_InitializedData.qbl
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod InitializedData (
+  GlobalOTDSOP globalOTDSOP
+)
+{
+  Description: '鍒濆鍖栧勾浠�'
+  TextBody:
+  [*
+    // yypsybs Sep-15-2023 (created)
+    globalOTDSOP.CapacityAndSaleBudgeFilterYear( relflush );
+    
+    nowYear := Date::Today().Year();
+    
+    for( i := nowYear - 10; i <= nowYear + 5; i++ ) {
+      globalOTDSOP.CapacityAndSaleBudgeFilterYear( relnew, YearNo := i );  
+    }
+  *]
+}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl b/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl
index c84f323..98dddf0 100644
--- a/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl
+++ b/_Main/BL/Type_GlobalDTOTable/Method_InitTestDataByYear.qbl
@@ -2,28 +2,45 @@
 #parent: #root
 Method InitTestDataByYear (
   MacroPlan macroPlan,
-  CapacityAndSaleBudgeFilterYears years
+  GlobalOTDSOP globalOTDSOP,
+  CapacityAndSaleBudgeFilterYears years,
+  CapacityAndSaleBudgeFilterBusinessTypes businessTypes,
+  CapacityAndSaleBudgeFilterPlaceOfProductionOfArrays placeOfProductionOfArrays,
+  Product_MPs product_MPs
 )
 {
   TextBody:
   [*
-    // yypsybs Oct-7-2023 (created)
-    productCodeList := selectuniquevalues( macroPlan, Product_MP, item, item.ID() );
-    debuginfo( "productCodeList : " + [String]productCodeList.Size() );
+    product_MPs := selectset( product_MPs, Elements, tempPMP, tempPMP.IsLeaf() and not tempPMP.IsSystem() );
     
     this.Global_MappingAnnualBudgetData( relflush );
-    debuginfo( "create Global_MappingAnnualBudgetData test data" );
-    id := 1;
-    traverse( years, Elements, year ) {
-      for( i := 1; i <= productCodeList.Size(); i := i + 1 ) {
-        productCode := productCodeList.Element( i - 1 );
+    
+    if ( years.Size() = 0 ) {
+      years := selectset( globalOTDSOP, CapacityAndSaleBudgeFilterYear, tempCASBFY, 
+                          tempCASBFY.YearNo() = Date::ActualDate().Year()     or
+                          tempCASBFY.YearNo() = Date::ActualDate().Year() - 1 or
+                          tempCASBFY.YearNo() = Date::ActualDate().Year() + 1
+                         );
+    }
+    if ( businessTypes.Size() = 0 ) {
+      businessTypes := selectset( globalOTDSOP, CapacityAndSaleBudgeFilterBusinessType, tempCASBFBT, true );
+    }
+    if ( placeOfProductionOfArrays.Size() = 0 ) {
+      placeOfProductionOfArrays := selectset( globalOTDSOP, CapacityAndSaleBudgeFilterPlaceOfProductionOfArray, tempCASBFPOPOA, true );
+    }
+    
+    traverse ( years, Elements, year ) {
+      traverse ( product_MPs, Elements, pmp ) {
+        businessType             := businessTypes.Element( Number::Random( 0, businessTypes.Size() - 1 ) ).BusinessType();
+        placeOfProductionOfArray := placeOfProductionOfArrays.Element( Number::Random( 0, placeOfProductionOfArrays.Size() - 1 ) ).PlaceOfProductionOfArray();
         mappingAnnualBudget := this.Global_MappingAnnualBudgetData( relnew, 
-                                                                    ID := [String]id,
-                                                                    YearNo := [String]year.YearNo(),
-                                                                    BusinessType := "浜嬩笟閮�" + [String](productCode.Length() mod 3),
-                                                                    OrganCode := "I13",
-                                                                    ProductID := productCode);
-        id := id + 1;
+                                                                    ID           := OS::GenerateGUIDAsString(),
+                                                                    YearNo       := [String]year.YearNo(),
+                                                                    BusinessType := businessType,
+                                                                    OrganCode    := placeOfProductionOfArray,
+                                                                    ProductID    := pmp.ID()
+                                                                   );
+                                                                   
         mappingAnnualBudget.MonthlyModCapacity1( [String]Real::Random( 20000.0, 30000.0 ) );
         mappingAnnualBudget.MonthlyModCapacity2( [String]Real::Random( 20000.0, 30000.0 ) );
         mappingAnnualBudget.MonthlyModCapacity3( [String]Real::Random( 20000.0, 30000.0 ) );
@@ -62,7 +79,5 @@
         mappingAnnualBudget.MonthlySales12(  [String]Real::Random( 20000.0, 30000.0 ) );
       }
     }
-    result2 := selectset( this, Global_MappingAnnualBudgetData, item, true );
-    debuginfo( "test MappingAnnualBudget size : " + [String]result2.Size() );
   *]
 }
diff --git a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl
index f860d1f..b96a8a8 100644
--- a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl
+++ b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeChart.qbl
@@ -15,73 +15,47 @@
   Description: '鎸夊叆鍙傚鐞嗘暟鎹紝浜х敓闇�瑕佺殑CapacityAndSaleBudgeChartElement'
   TextBody:
   [*
-    // yypsybs Sep-19-2023 (created)
-    // true, false
-    //info( saleOrCapacity );
-    // 鏈�;瀛e害;鍗婂勾;骞�
-    //info( groupBy );
-    // 闈㈡澘鍩哄湴;浜嬩笟閮�
-    //info( byBusinessTypeOrByOrgCode );
-    //traverse( businessTypes, Elements, businessType ) {
-    //  info( "businessType : " + businessType.BusinessType() );
-    //}
-    //traverse( placeOfProductionOfArrays, Elements, placeOfProductionOfArray ) {
-    //  info( "placeOfProductionOfArray : " + placeOfProductionOfArray.PlaceOfProductionOfArray() );
-    //}
-    //traverse( macroPlans, Elements, macroPlan ) {
-    //  info( "macroPlan : " + macroPlan.ScenarioName() );  
-    //}
+    info( "浜ц兘/閿�鍞锛�", saleOrCapacity, "    鏃堕棿鍒嗙粍锛�", groupBy, "    鍩哄湴/浜嬩笟閮細", byBusinessTypeOrByOrgCode );
     // 骞翠唤涓嶉�夋椂鍏ㄩ��
-    if( years.Size() = 0 ) {
-      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, true, item.YearNo() );
+    if ( years.Size() = 0 ) {
+      years := selectset( this, CapacityAndSaleBudgeFilterYear, tempCASBFY, tempCASBFY.YearNo() = Date::ActualDate().Year() );
     }
-    //traverse( years, Elements, year ) {
-    //  debuginfo( "yearNo : " + [String]year.YearNo() );
-    //}
     // 鏈堜唤涓嶉�夋椂鍏ㄩ��
-    if( months.Size() = 0 ) {
+    if ( months.Size() = 0 ) {
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, true, item.MonthNo() );
     }
-    //traverse( months, Elements, month ) {
-    //  debuginfo( "monthNo : " + [String]month.MonthNo() );
-    //}
     
     // ====娓呯悊鏃ф暟鎹�====
     this.CapacityAndSaleBudgeChartRow( relflush );
     this.CapacityAndSaleBudgeChartElement( relflush );
     
     // ====鎸夐潰鏉垮熀鍦板拰浜嬩笟閮ㄥ浜у搧杩涜绛涢�夊垎缁�====
-    historyData := selectset( otdTable, Global_MappingAnnualBudgetData, item, true );
-    if( businessTypes.Size() > 0 ) {
+    targeGlobal_MappingAnnualBudgetDatas := selectset( otdTable, Global_MappingAnnualBudgetData, tempGMABD, true );
+    if ( businessTypes.Size() > 0 ) {
       businessTypeStrings := selectuniquevalues( businessTypes, Elements, item, true, item.BusinessType() );
-      historyData := selectset( historyData, Elements, item, businessTypeStrings.Find( item.BusinessType() ) > -1 );
+      targeGlobal_MappingAnnualBudgetDatas := selectset( targeGlobal_MappingAnnualBudgetDatas, Elements, item, businessTypeStrings.Find( item.BusinessType() ) > -1 );
     }
-    if( placeOfProductionOfArrays.Size() > 0 ) {
+    if ( placeOfProductionOfArrays.Size() > 0 ) {
       placeOfProductionOfArrayStrings := selectuniquevalues( placeOfProductionOfArrays, Elements, item, true, item.PlaceOfProductionOfArray() );
-      historyData := selectset( historyData, Elements, item, placeOfProductionOfArrayStrings.Find( item.OrgCodeFromBom() ) > -1 );
+      targeGlobal_MappingAnnualBudgetDatas := selectset( targeGlobal_MappingAnnualBudgetDatas, Elements, item, placeOfProductionOfArrayStrings.Find( item.OrganCode() ) > -1 );
     }
-    //info( "historyData : " + [String]historyData.Size() );
-    traverse( historyData, Elements, item ) {
-      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, item.BusinessType(), item.OrgCodeFromBom() );
+    info( "閫変腑鐨勪釜鏁�:", targeGlobal_MappingAnnualBudgetDatas.Size() );
+    
+    traverse ( targeGlobal_MappingAnnualBudgetDatas, Elements, gmabd ) {
+      row := CapacityAndSaleBudgeChartRow::CreateIfNotExist( this, gmabd.BusinessType(), gmabd.OrganCode() );
       // 璁板綍姣忚鍖呭惈鍝簺product
-      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, item.ProductID() );
+      CapacityAndSaleBudgeChartRowProduct::CreateIfNotExist( row, gmabd.ProductID() );
     }
+    
     rows := selectset( this, CapacityAndSaleBudgeChartRow, item, true );
-    //info( "rows : " + [String]rows.Size() );
-    placeOfProductionOfArrayList := selectuniquevalues( historyData, Elements, item, item.OrgCodeFromBom() );
-    //traverse( placeOfProductionOfArrayList, Elements, item ) {
-    //  info( "placeOfProduction : " + item );  
-    //}
-    businessTypeList := selectuniquevalues( historyData, Elements, item, item.BusinessType() );
-    //traverse( businessTypeList, Elements, item ) {
-    //  info( "businessType : " + item );  
-    //}
+    placeOfProductionOfArrayList := selectuniquevalues( targeGlobal_MappingAnnualBudgetDatas, Elements, tempGMABD, tempGMABD.OrganCode() );
+    businessTypeList := selectuniquevalues( targeGlobal_MappingAnnualBudgetDatas, Elements, tempGMABD, tempGMABD.BusinessType() );
+    
     // 鐢熸垚鍥捐〃鍏冪礌
-    traverse( years, Elements, year ) {
-    //  debuginfo( "process year start : " + [String]year.YearNo() );
-      if( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
+    traverse ( years, Elements, year ) {
+      if ( byBusinessTypeOrByOrgCode = "闈㈡澘鍩哄湴" and groupBy = "骞�" ) {
         // 鐩爣
-        traverse( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
+        traverse ( placeOfProductionOfArrayList, Elements, placeOfProductionOfArray ) {
           productCodeList := CapacityAndSaleBudgeChartRow::GetProductCodesByPlaceOfProductionOfArray( rows, placeOfProductionOfArray );
           this.CapacityAndSaleBudgeChartElement( relnew, 
                                                  TimeStringAndScenarioName := [String]year.YearNo() + "骞�-鐩爣",
@@ -89,9 +63,9 @@
                                                  Quantity := ifexpr( saleOrCapacity = "閿�鍞",
                                                                      Global_MappingAnnualBudgetData::GetSaleByYear( productCodeList, otdTable, year.YearNo() ),
                                                                      Global_MappingForecast::GetQuantityByYear( productCodeList, otdTable, year.YearNo() ) )
-                                                 );  
+                                                );
           // S&OP
-          traverse( macroPlans, Elements, macroPlan ) {
+          traverse ( macroPlans, Elements, macroPlan ) {
             this.CapacityAndSaleBudgeChartElement( relnew, 
                                                    TimeStringAndScenarioName := [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName(),
                                                    BusinessTypeOrPlaceOfProductionOfArray := placeOfProductionOfArray, 
@@ -286,17 +260,16 @@
     //      debuginfo( "process month end : " + [String]month.MonthNo() );
         }
       }
-    //  debuginfo( "process year end : " + [String]year.YearNo() )
     }
-    //info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
-    //traverse( this, CapacityAndSaleBudgeChartRow, row ) {
-    //  info( "==鈫�==" );
-    //  info( row.BusinessType() );
-    //  info( row.PlaceOfProductionOfArray() );
-    //  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
-    //  info( elements.Size() );
-    //  info( row.GetProductCodes().Concatenate( " | " ) );
-    //  info( "==鈫�==" );
-    //}
+    ////info( "CapacityAndSaleBudgeChartElement : " + [String]selectset( this, CapacityAndSaleBudgeChartElement, item, true ).Size() );
+    ////traverse( this, CapacityAndSaleBudgeChartRow, row ) {
+    ////  info( "==鈫�==" );
+    ////  info( row.BusinessType() );
+    ////  info( row.PlaceOfProductionOfArray() );
+    ////  elements := selectset( row, CapacityAndSaleBudgeChartRowProduct, cell, true );
+    ////  info( elements.Size() );
+    ////  info( row.GetProductCodes().Concatenate( " | " ) );
+    ////  info( "==鈫�==" );
+    ////}
   *]
 }
diff --git a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl
index 64a208a..0ba67ec 100644
--- a/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl
+++ b/_Main/BL/Type_GlobalOTDSOP/Method_CapacityAndSaleBudgeCompare.qbl
@@ -11,35 +11,22 @@
   Description: 'todo : mappingParent鏀逛负mpSync, random鍒犱簡'
   TextBody:
   [*
-    // yypsybs Sep-18-2023 (created)
     // ====涓嶉�夋椂榛樿鍏ㄩ��====
-    if( years.Size() = 0 ) {
-      years := selectsortedset( this, CapacityAndSaleBudgeFilterYear, item, item.YearNo() );
+    if ( years.Size() = 0 ) {
+      years := selectset( this, CapacityAndSaleBudgeFilterYear, tempCASBFY, tempCASBFY.YearNo() = Date::ActualDate().Year() );
     }
-    if( months.Size() = 0 ) {
+    if ( months.Size() = 0 ) {
       months := selectsortedset( this, CapacityAndSaleBudgeFilterMonth, item, item.MonthNo() );
     }
-    traverse( macroPlans, Elements, item ) {
-      debuginfo( "scenario : " + item.ScenarioName() );
-    }
-    traverse( items, Elements, item ) {
-      debuginfo( "item : " + item.ItemName() );
-    }
-    traverse( years, Elements, item ) {
-      debuginfo( "year : " + [String]item.YearNo() );
-    }
-    traverse( months, Elements, item ) {
-      debuginfo( "month : " + [String]item.MonthNo() );
-    }
-    // ====娓呯悊鏃ф暟鎹�====
+    
     this.CapacityAndSaleBudgeCompareItemRow( relflush );
     this.CapacityAndSaleBudgeCompareItemColumn( relflush );
-    // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
-    historyData := selectset( otdTable, Global_MappingAnnualBudgetData, item, true );
-    debuginfo( "historyData : " + [String]historyData.Size() );
     
-    traverse( historyData, Elements, one ) {
-      productCode := one.ProductID();
+    // ====姹囨�绘墍鏈夊嚭鐜扮殑浜у搧====
+    targetglobal_MappingAnnualBudgetData := selectset( otdTable, Global_MappingAnnualBudgetData, item, true );
+    
+    traverse ( targetglobal_MappingAnnualBudgetData, Elements, gmabd ) {
+      productCode := gmabd.ProductID();
     //  Global_MappingOperationBOM::CreateTestData( otdTable, "浜嬩笟閮�" + [String](productCode.Length() mod 3), "闈㈡澘鍩哄湴" + [String](productCode.Length() mod 4), productCode );
     //  boms := selectset( otdTable, Global_MappingOperationBOM, bom, bom.ProductCode() = productCode );
     //  if( boms.Size() > 0 ) {
@@ -47,17 +34,16 @@
     //    businessType := bom.BusinessType();
     //    placeOfProductionOfArray := bom.OrganCode();
         // 鐩稿悓闈㈡澘鍩哄湴鍜屼簨涓氶儴鐨勬斁涓�琛�
-        row := CapacityAndSaleBudgeCompareItemRow::CreateIfNotExist( this, one.BusinessType(), one.OrgCodeFromBom() );
+        row := CapacityAndSaleBudgeCompareItemRow::CreateIfNotExist( this, gmabd.BusinessType(), gmabd.OrganCode() );
         // 璁板綍姣忚鍖呭惈鍝簺product
         CapacityAndSaleBudgeCompareItemRowProduct::CreateIfNotExist( row, productCode );
     //  } else {
     //    debuginfo( "no boms for product : " + productCode );
     //  }
     }
-    debuginfo( "CapacityAndSaleBudgeCompareItemRow : " + [String]selectset( this, CapacityAndSaleBudgeCompareItemRow, item, true ).Size() );
+    
     // ====浠庡乏鍚戝彸鐢熸垚鍒楀ご涓庡唴瀹�====
     // 浜嬩笟閮紝闈㈡澘鍩哄湴
-    debuginfo( "dealing businessType and placeOfProductionOfArray" )
     columnBusinessType := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜嬩笟閮�" );
     columnPlaceOfProductionOfArray := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍩哄湴" );
     traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
@@ -66,100 +52,159 @@
       cell := columnPlaceOfProductionOfArray.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := row.PlaceOfProductionOfArray() );
       cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
     }
+    
     // 闈㈡澘鍒嗛厤閲� - 骞村害棰勭畻 (sheets)
     // 鏍煎紡锛� 闈㈡澘鍒嗛厤閲� - 骞� - 鏈堬紙1-12 & total锛� - 骞村害棰勭畻/scenarioName
-    debuginfo( "dealing 闈㈡澘鍒嗛厤閲�" )
-    if( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
-      traverse( years, Elements, year ) {
-        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞�" );
+    if ( CapacityAndSaleBudgeFilterItem::Contains( items, "闈㈡澘鍒嗛厤閲�" ) ) {
+      traverse ( years, Elements, year ) {
         // 鍘嗗彶鏁版嵁
-        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
-        traverse( months, Elements, month ) {
-          columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := Global_MappingForecast::GetQuantityByMonth( row.GetProductCodes(), otdTable, DateTime::Now().Year(), month.MonthNo() );
-            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( months, Elements, month ) {
+    //      columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
+    //      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        cellReal := Global_MappingForecast::GetQuantityByMonth( row.GetProductCodes(), otdTable, DateTime::Now().Year(), month.MonthNo() );
+    //        cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+    //    columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
+    //    traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //      cellReal := Global_MappingForecast::GetQuantityByYear( row.GetProductCodes(), otdTable, year.YearNo() );
+    //      cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    }
+        
+        traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+          total := 0.0;
+          traverse ( months, Elements, m ) {
+            columnName  := "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-骞村害棰勭畻";
+            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+            cellReal    := Global_MappingForecast::GetQuantityByMonth( casbcir.GetProductCodes(), otdTable, DateTime::Now().Year(), m.MonthNo() );
+            cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            total       := total + cellReal;
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
+          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
+          cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+          columnYear.TotalIdentification( year.YearNo() );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
         }
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          cellReal := Global_MappingForecast::GetQuantityByYear( row.GetProductCodes(), otdTable, year.YearNo() );
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-        debuginfo( "闈㈡澘鍒嗛厤閲�" + [String]year.YearNo() + "骞碨&OP鏁版嵁" );
+        
         // S&OP鏁版嵁
-        traverse( macroPlans, Elements, macroPlan ) {
-          traverse( months, Elements, month ) {
-            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
-                                                                                    "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
-            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-              cellReal := Product_MP::GetNewSupplyByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
-              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( macroPlans, Elements, macroPlan ) {
+    //      traverse ( months, Elements, month ) {
+    //        columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
+    //                                                                                "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
+    //        traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //          cellReal := Product_MP::GetNewSupplyByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
+    //          cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //        }
+    //      }
+    //      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
+    //                                                                             "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
+    //      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        cellReal := Product_MP::GetNewSupplyByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
+    //        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+        traverse ( macroPlans, Elements, mp ) {
+          traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+            total := 0.0;
+            traverse ( months, Elements, m ) {
+              columnName  := "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-" + mp.ScenarioName();
+              columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+              cellReal    := Product_MP::GetNewSupplyByMonth( casbcir.GetProductCodes(), mp, year.YearNo(), m.MonthNo() );
+              cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+              total       := total + cellReal;
+              cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
             }
-          }
-          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, 
-                                                                                 "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := Product_MP::GetNewSupplyByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
-            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+            columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "闈㈡澘鍒嗛厤閲�-" + [String]year.YearNo() + "骞�-total-" + mp.ScenarioName() );
+            cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+            columnYear.TotalIdentification( year.YearNo() );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
         }
       }
     }
+    
     // 骞村害閿�鍞
-    debuginfo( "dealing 閿�鍞" )
-    if( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
-      traverse( years, Elements, year ) {
-        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞�" );
+    if ( CapacityAndSaleBudgeFilterItem::Contains( items, "閿�鍞" ) ) {
+      traverse ( years, Elements, year ) {
         // 鍘嗗彶鏁版嵁
-        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹�" );
-        traverse( months, Elements, month ) {
-          columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            cellReal := Global_MappingAnnualBudgetData::GetSaleByMonth( row.GetProductCodes(), otdTable, year.YearNo(), month.MonthNo() );
-            cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( months, Elements, month ) {
+    //      columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-骞村害棰勭畻" );
+    //      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        cellReal := Global_MappingAnnualBudgetData::GetSaleByMonth( row.GetProductCodes(), otdTable, year.YearNo(), month.MonthNo() );
+    //        cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+    //    columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
+    //    traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //      cellReal := Global_MappingAnnualBudgetData::GetSaleByYear( row.GetProductCodes(), otdTable, year.YearNo() );
+    //      cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //      cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    }
+        traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+          total := 0.0;
+          traverse ( months, Elements, m ) {
+            columnName  := "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-骞村害棰勭畻";
+            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+            cellReal    := Global_MappingAnnualBudgetData::GetSaleByMonth( casbcir.GetProductCodes(), otdTable, year.YearNo(), m.MonthNo() );
+            cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+            total       := total + cellReal;
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
+          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-骞村害棰勭畻" );
+          cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+          columnYear.TotalIdentification( year.YearNo() );
+          cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
         }
-        columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-          cellReal := Global_MappingAnnualBudgetData::GetSaleByYear( row.GetProductCodes(), otdTable, year.YearNo() );
-          cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
-        }
-        debuginfo( "閿�鍞" + [String]year.YearNo() + "骞村巻鍙叉暟鎹甋&OP鏁版嵁" );
+        
         // S&OP鏁版嵁
-        traverse( macroPlans, Elements, macroPlan ) {
-          traverse( months, Elements, month ) {
-            columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
-            traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-              cellReal := Forecast::GetFulfilledBalanceByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
-              cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-              cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //    traverse ( macroPlans, Elements, macroPlan ) {
+    //      traverse ( months, Elements, month ) {
+    //        columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]month.MonthNo() + "鏈�-" + macroPlan.ScenarioName() );
+    //        traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //          cellReal := Forecast::GetFulfilledBalanceByMonth( row.GetProductCodes(), macroPlan, year.YearNo(), month.MonthNo() );
+    //          cell := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //          cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //        }
+    //      }
+    //      columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
+    //      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+    //        // QID 23
+    //        cellReal := Forecast::GetFulfilledBalanceByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
+    //        cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+    //        cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+    //      }
+    //    }
+        traverse ( macroPlans, Elements, mp ) {
+          traverse ( this, CapacityAndSaleBudgeCompareItemRow, casbcir ) {
+            total := 0.0;
+            traverse ( months, Elements, m ) {
+              columnName  := "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-" + [String]m.MonthNo() + "鏈�-" + mp.ScenarioName();
+              columnMonth := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, columnName );
+              cellReal    := Forecast::GetFulfilledBalanceByMonth( casbcir.GetProductCodes(), mp, year.YearNo(), m.MonthNo() );
+              cell        := columnMonth.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
+              total       := total + cellReal;
+              cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
             }
-          }
-          columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + macroPlan.ScenarioName() );
-          traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-            // QID 23
-            cellReal := Forecast::GetFulfilledBalanceByYear( row.GetProductCodes(), macroPlan, year.YearNo() );
-            cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]cellReal );
-            cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
+            columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "瀵瑰閿�鍞-" + [String]year.YearNo() + "骞�-total-" + mp.ScenarioName() );
+            cell       := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]total );
+            columnYear.TotalIdentification( year.YearNo() );
+            cell.CapacityAndSaleBudgeCompareItemRow( relset, casbcir );
           }
         }
       }
     }
+    
     // 澶у紶鐩堝埄棰�
-    debuginfo( "dealing 澶у紶鐩堝埄棰�" )
-    traverse( years, Elements, year ) {
+    traverse ( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "澶у紶鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
-      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-        // todo 
-        // QID 23
+      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
         cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
         cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
       }
@@ -173,19 +218,17 @@
       }
     }
     // 浜у搧鐩堝埄棰�
-    debuginfo( "dealing 浜у搧鐩堝埄棰�" )
-    traverse( years, Elements, year ) {
+    traverse ( years, Elements, year ) {
       // 鍘嗗彶鏁版嵁
       columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-骞村害棰勭畻" );
-      traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
-        // todo
+      traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
         cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
         cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
       }
       // S&OP鏁版嵁
-      traverse( macroPlans, Elements, macroPlan ) {
+      traverse ( macroPlans, Elements, macroPlan ) {
         columnYear := CapacityAndSaleBudgeCompareItemColumn::CreateIfNotExist( this, "浜у搧鐩堝埄棰�-" + [String]year.YearNo() + "骞�-" + macroPlan.ScenarioName() );
-        traverse( this, CapacityAndSaleBudgeCompareItemRow, row ) {
+        traverse ( this, CapacityAndSaleBudgeCompareItemRow, row ) {
           // todo
           cell := columnYear.CapacityAndSaleBudgeCompareItemCell( relnew, CellContent := [String]Number::Random( 0, 0 ) );
           cell.CapacityAndSaleBudgeCompareItemRow( relset, row );
@@ -194,7 +237,6 @@
     }
     
     // 璁剧疆rowNo鍜宑olumnNo
-    debuginfo( "set rowNo and columnNo" );
     rowNo := 1;
     rowSorted := selectsortedset( this, CapacityAndSaleBudgeCompareItemRow, item, item.PlaceOfProductionOfArray() + "_" + item.BusinessType() );
     traverse( rowSorted, Elements, item ) {
@@ -206,6 +248,5 @@
       item.ColumnNo( columnNo );
       columnNo := columnNo + 1;
     }
-    debuginfo( "done" );
   *]
 }
diff --git a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
index 4ad9e84..2cd8ea3 100644
--- a/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
+++ b/_Main/UI/MacroPlanner/Component_ApplicationLibMacroPlanner/Component_mbMainMenu.def
@@ -85,6 +85,7 @@
         Component MenuDoSync { #keys: '[414384.0.605664172]' BaseType: 'Menu' Properties: [ Image: 'CLOUD_DOWNLOAD' Text: 'DoSync' ] }
         Component menuSeparator506 { #keys: '[414702.0.137524309]' BaseType: 'Menu' Properties: [ Separator: true ] }
         Component ComponentMenuAnalysisGlobalOTDTable { #keys: '[414702.0.137524953]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysisGlobalOTDTable' Text: '' ] }
+        Component ComponentMenu749 { #keys: '[414702.1.273394009]' BaseType: 'ComponentMenu' Properties: [ ComponentType: 'frmStandardAnalysis633' Text: '' ] }
       ]
       Properties:
       [
@@ -103,6 +104,7 @@
           c: MenuDoSync
           c: menuSeparator506
           c: ComponentMenuAnalysisGlobalOTDTable
+          c: ComponentMenu749
         }
       ]
     }
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def
new file mode 100644
index 0000000..297a438
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTop.def
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+Component swTop
+{
+  #keys: '[530.0.3531806]'
+  BaseType: 'swTop'
+  IsDerived: true
+  Children:
+  [
+    Component spTopLeft
+    {
+      #keys: '[530.0.3531807]'
+      BaseType: 'spTopLeft'
+      IsDerived: true
+      Children:
+      [
+        Component Analysis
+        {
+          #keys: '[530.0.3532065]'
+          BaseType: 'Analysis'
+          IsDerived: true
+          Properties:
+          [
+            GlobalInstance: 'GlobalOTDSOP'
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def
new file mode 100644
index 0000000..8a8fcd7
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/Component_swTopMost.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+Component swTopMost
+{
+  #keys: '[530.0.3531801]'
+  BaseType: 'swTopMost'
+  IsDerived: true
+  Children:
+  [
+    Component SplitterPane1
+    {
+      #keys: '[530.0.3531802]'
+      BaseType: 'SplitterPane1'
+      IsDerived: true
+      Children:
+      [
+        #child: swTop
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def
new file mode 100644
index 0000000..a7fd526
--- /dev/null
+++ b/_Main/UI/MacroPlanner/Component_frmStandardAnalysis633/_ROOT_Component_frmStandardAnalysis633.def
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlanner
+OrphanComponent frmStandardAnalysis633
+{
+  #keys: '[414702.1.273394023]'
+  BaseType: 'frmStandardAnalysis'
+  Children:
+  [
+    #child: swTopMost
+  ]
+  Properties:
+  [
+    Height: 740
+    Image: 'BEER_GLASS'
+    Title: 'Analysis GlobalOTDSOP'
+    Width: 1300
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews\043859.def" "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews\043859.def"
new file mode 100644
index 0000000..2f902b8
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioComparisonViews\043859.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+Component ActionBarGroupScenarioComparisonViews #extension
+{
+  Children:
+  [
+    Component ButtonAnnualProductionAndSalesReview
+    {
+      #keys: '[414702.1.286513416]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'COCKTAIL'
+        Label: '骞村害浜ч攢澶嶇洏'
+        Taborder: 8
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def
new file mode 100644
index 0000000..fb3b421
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioComparison.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component ActionBarPageScenarioComparison #extension
+{
+  Children:
+  [
+    #child: ActionBarGroupScenarioComparisonViews
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
index 05a14f4..3103966 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_cmTestAttempt.def
@@ -22,7 +22,7 @@
       BaseType: 'WebMenu'
       Properties:
       [
-        Image: 'PIG'
+        Image: 'LEMONADE_GLASS'
         Taborder: 6
         Title: '骞村害浜ч攢澶嶇洏'
       ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def
new file mode 100644
index 0000000..52c5931
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualPro.def
@@ -0,0 +1,20 @@
+Quintiq file version 2.0
+#parent: ActionBarGroupScenarioComparisonViews/ButtonAnnualProductionAndSalesReview
+Response OnClick () id:Response_TIANMA_JITUAN_ActionBarGroupScenarioComparisonViews_ButtonAnnualProductionAndSalesReview_OnClick
+{
+  #keys: '[414702.1.288075432]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  Precondition:
+  [*
+    
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "骞村害浜ч攢澶嶇洏", true );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
index 219db76..c307f2a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/_ROOT_Component_ApplicationMacroPlanner.def
@@ -15,6 +15,7 @@
         #child: ActionBarPagePlan
         #child: ActionBarPageInventory
         #child: ActionBarPageScenarioSelection
+        #child: ActionBarPageScenarioComparison
       ]
     }
     Component DataHolderCapacityAndSaleBudgeFilterItem
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
index 4af954a..1cb79bb 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_ListCapacityAndSaleBudge.def
@@ -12,7 +12,6 @@
       Properties:
       [
         DataType: 'GlobalOTDTable'
-        FixedFilter: '[Number]object.YearNo() = Date::ActualDate().Year()'
         Source: 'GlobalOTDTable'
         Taborder: 0
         Transformation: 'Global_MappingAnnualBudgetData'
@@ -29,7 +28,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"YearNo","title":"YearNo","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"YearNo"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessType","title":"BusinessType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayTechSort","title":"DisplayTechSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DisplayTechSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessSort","title":"BusinessSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductLineAndSpecification","title":"ProductLineAndSpecification","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductLineAndSpecification"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCodeFromBom","title":"OrgCodeFromBom","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCodeFromBom"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ResolutionRatio","title":"ResolutionRatio","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ResolutionRatio"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ShippingForm","title":"ShippingForm","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ShippingForm"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CutsNumber","title":"CutsNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CutsNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CapacityEquivalent","title":"CapacityEquivalent","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CapacityEquivalent"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaskNumber","title":"MaskNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaskNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity1","title":"MonthlyModCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity2","title":"MonthlyModCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity3","title":"MonthlyModCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity4","title":"MonthlyModCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity5","title":"MonthlyModCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity6","title":"MonthlyModCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity7","title":"MonthlyModCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity8","title":"MonthlyModCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity9","title":"MonthlyModCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity10","title":"MonthlyModCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity11","title":"MonthlyModCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity12","title":"MonthlyModCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity1","title":"MonthlySheetCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity2","title":"MonthlySheetCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity3","title":"MonthlySheetCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity4","title":"MonthlySheetCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity5","title":"MonthlySheetCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity6","title":"MonthlySheetCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity7","title":"MonthlySheetCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity8","title":"MonthlySheetCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity9","title":"MonthlySheetCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity10","title":"MonthlySheetCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity11","title":"MonthlySheetCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity12","title":"MonthlySheetCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales1","title":"MonthlySales1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales2","title":"MonthlySales2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales3","title":"MonthlySales3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales4","title":"MonthlySales4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales5","title":"MonthlySales5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales6","title":"MonthlySales6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales7","title":"MonthlySales7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales8","title":"MonthlySales8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales9","title":"MonthlySales9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales10","title":"MonthlySales10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales11","title":"MonthlySales11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales12","title":"MonthlySales12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales12"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"YearNo","title":"YearNo","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"YearNo"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessType","title":"BusinessType","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessType"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DisplayTechSort","title":"DisplayTechSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DisplayTechSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"BusinessSort","title":"BusinessSort","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"BusinessSort"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductLineAndSpecification","title":"ProductLineAndSpecification","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductLineAndSpecification"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrgCodeFromBom","title":"OrgCodeFromBom","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrgCodeFromBom"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ResolutionRatio","title":"ResolutionRatio","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ResolutionRatio"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ShippingForm","title":"ShippingForm","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ShippingForm"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CutsNumber","title":"CutsNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CutsNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"CapacityEquivalent","title":"CapacityEquivalent","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"CapacityEquivalent"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MaskNumber","title":"MaskNumber","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MaskNumber"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity1","title":"MonthlyModCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity2","title":"MonthlyModCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity3","title":"MonthlyModCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity4","title":"MonthlyModCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity5","title":"MonthlyModCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity6","title":"MonthlyModCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity7","title":"MonthlyModCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity8","title":"MonthlyModCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity9","title":"MonthlyModCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity10","title":"MonthlyModCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity11","title":"MonthlyModCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlyModCapacity12","title":"MonthlyModCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlyModCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity1","title":"MonthlySheetCapacity1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity2","title":"MonthlySheetCapacity2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity3","title":"MonthlySheetCapacity3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity4","title":"MonthlySheetCapacity4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity5","title":"MonthlySheetCapacity5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity6","title":"MonthlySheetCapacity6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity7","title":"MonthlySheetCapacity7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity8","title":"MonthlySheetCapacity8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity9","title":"MonthlySheetCapacity9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity10","title":"MonthlySheetCapacity10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity11","title":"MonthlySheetCapacity11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySheetCapacity12","title":"MonthlySheetCapacity12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySheetCapacity12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales1","title":"MonthlySales1","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales1"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales2","title":"MonthlySales2","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales2"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales3","title":"MonthlySales3","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales3"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales4","title":"MonthlySales4","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales4"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales5","title":"MonthlySales5","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales5"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales6","title":"MonthlySales6","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales6"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales7","title":"MonthlySales7","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales7"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales8","title":"MonthlySales8","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales8"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales9","title":"MonthlySales9","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales9"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales10","title":"MonthlySales10","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales10"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales11","title":"MonthlySales11","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales11"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"MonthlySales12","title":"MonthlySales12","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"MonthlySales12"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"OrganCode","title":"OrganCode","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"OrganCode"}}]'
         ContextMenu: 'listContextMenuCapacityAndSaleBudge'
         SortCriteria: 'BusinessSort;OrganCode;ProductID'
         Taborder: 2
@@ -38,6 +37,6 @@
   ]
   Properties:
   [
-    Taborder: 2
+    Taborder: 1
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def
new file mode 100644
index 0000000..427fcd9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Component_pButton.def
@@ -0,0 +1,48 @@
+Quintiq file version 2.0
+Component pButton
+{
+  #keys: '[414702.1.268476564]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonGenerateTestData id:ButtonGenerateTestData_136
+    {
+      #keys: '[414702.1.266041306]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ARROW_CIRCLE2'
+        Label: '鍒锋柊绛涢�夋暟鎹�'
+        Taborder: 0
+      ]
+    }
+    Component ButtonExportDetail id:ButtonExportDetail_97
+    {
+      #keys: '[414702.1.266041310]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 2
+      ]
+    }
+    Component ButtonCreateData
+    {
+      #keys: '[414702.1.266042204]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ICE_CREAM'
+        Label: '鐢熸垚鏁版嵁'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonGenerateTestData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonGenerateTestData_OnClick.def
deleted file mode 100644
index 7b8522f..0000000
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonGenerateTestData_OnClick.def
+++ /dev/null
@@ -1,25 +0,0 @@
-Quintiq file version 2.0
-#parent: ButtonGenerateTestData
-Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonGenerateTestData_OnClick
-{
-  #keys: '[414384.0.971540692]'
-  CanBindMultiple: false
-  DefinitionID: 'Responsedef_WebButton_OnClick'
-  Precondition:
-  [*
-    return not isnull( MacroPlan );
-  *]
-  QuillAction
-  {
-    Body:
-    [*
-      GlobalOTDTable.InitTestDataByYear( MacroPlan, DataHolderCapacityAndSaleBudgeFilterYear.Data() );
-      Global_MappingAnnualBudgetData::SetOrgCodeFromForecast( GlobalOTDTable );
-      GlobalOTDSOP::RefreshCapacityAndSaleBudgeFilter( true, GlobalOTDTable, GlobalOTDSOP );
-      CapacityAndSaleBudgeFilterItem::Initial( GlobalOTDSOP );
-      CapacityAndSaleBudgeFilterYear::Initial( GlobalOTDSOP );
-      CapacityAndSaleBudgeFilterMonth::Initial( GlobalOTDSOP );
-    *]
-    GroupServerCalls: false
-  }
-}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def
new file mode 100644
index 0000000..55bdd70
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonCreateData_OnClick.def
@@ -0,0 +1,41 @@
+Quintiq file version 2.0
+#parent: pButton/ButtonCreateData
+Response OnClick () id:Response_pButton_ButtonCreateData_OnClick
+{
+  #keys: '[414702.1.266042218]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    flag := true;
+    
+    flag := GlobalOTDSOP.CapacityAndSaleBudgeFilterYear( relsize ) > 0                     and
+            GlobalOTDSOP.CapacityAndSaleBudgeFilterBusinessType( relsize ) > 0             and
+            GlobalOTDSOP.CapacityAndSaleBudgeFilterPlaceOfProductionOfArray( relsize ) > 0;
+    
+    return flag;
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      option := WebMessageBox::Question( "璇烽�夋嫨鏁版嵁婧�", "鏁版嵁婀東娴嬭瘯鏁版嵁|鍙栨秷" );
+      
+      if ( option = 0 ) {
+        WebMessageBox::Error( "鏁版嵁婀栨殏鏃犳暟鎹�", true );
+      } else if ( option = 1 ) {
+        if ( DataHolderCheckedProduct.Data().Size() = 0 ) {
+          WebMessageBox::Error( "璇峰厛鍦ㄥ乏渚у鑸爮閫夋嫨瑕佺敓鎴愭祴璇曟暟鎹殑浜у搧锛�", true );
+        } else {
+          GlobalOTDTable.InitTestDataByYear( MacroPlan, 
+                                             GlobalOTDSOP,
+                                             DataHolderCapacityAndSaleBudgeFilterYear.Data(),
+                                             DataHolderCapacityAndSaleBudgeFilterBusinessType.Data(),
+                                             DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data(),
+                                             DataHolderCheckedProduct.Data() );
+        }
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick\043971.def"
similarity index 85%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick\043971.def"
index e09f8c8..faf0bf7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_ButtonExportDetail_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonExportDetail_OnClick\043971.def"
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: ButtonExportDetail
-Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonExportDetail_OnClick
+#parent: pButton/ButtonExportDetail_97
+Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonExportDetail_OnClick_971
 {
-  #keys: '[414384.0.887310502]'
+  #keys: '[414702.1.266041309]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick\04319.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick\04319.def"
new file mode 100644
index 0000000..6af89c3
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/Response_pButton_ButtonGenerateTestData_OnClick\04319.def"
@@ -0,0 +1,26 @@
+Quintiq file version 2.0
+#parent: pButton/ButtonGenerateTestData_136
+Response OnClick () id:Response_FormCapacityAndSaleBudge_ButtonGenerateTestData_OnClick_19
+{
+  #keys: '[414702.1.266041305]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan ) and not isnull( GlobalOTDSOP ) and not isnull( GlobalOTDTable );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      CapacityAndSaleBudgeFilterItem::InitializedData( GlobalOTDSOP );
+      CapacityAndSaleBudgeFilterYear::InitializedData( GlobalOTDSOP );
+      CapacityAndSaleBudgeFilterMonth::InitializedData( GlobalOTDSOP );
+      CapacityAndSaleBudgeFilterBusinessType::InitializedData( GlobalOTDSOP, GlobalOTDTable );
+      CapacityAndSaleBudgeFilterPlaceOfProductionOfArray::InitializedData( GlobalOTDSOP, GlobalOTDTable );
+      
+      GlobalOTDTable.Global_MappingAnnualBudgetData( relflush );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
index 7c799db..95e899e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudge/_ROOT_Component_FormCapacityAndSaleBudge.def
@@ -8,28 +8,7 @@
   Children:
   [
     #child: ListCapacityAndSaleBudge
-    Component ButtonExportDetail
-    {
-      #keys: '[414384.0.887310503]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'EXPORT1'
-        Label: '瀵煎嚭'
-        Taborder: 1
-      ]
-    }
-    Component ButtonGenerateTestData
-    {
-      #keys: '[414384.0.971540693]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'IMPORT1'
-        Label: '鏍规嵁绛涢�夊勾浠界敓鎴愭祴璇曟暟鎹�'
-        Taborder: 0
-      ]
-    }
+    #child: pButton
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
index 8c71c5c..f3f605d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_ChartCapacityAndSaleBudgeChart.def
@@ -80,6 +80,6 @@
   Properties:
   [
     ContextMenu: 'chartContextMenuCapacityAndSaleBudge'
-    Taborder: 7
+    Taborder: 4
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def
new file mode 100644
index 0000000..4ab0d20
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Component_pFilterCriteria.def
@@ -0,0 +1,60 @@
+Quintiq file version 2.0
+Component pFilterCriteria
+{
+  #keys: '[414702.1.277336951]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component DropDownByBusinessTypeOrByOrgCode id:DropDownByBusinessTypeOrByOrgCode_549
+    {
+      #keys: '[414702.1.277808126]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '鏍规嵁闈㈡澘鍩哄湴/浜嬩笟閮ㄥ垎缁�'
+        Strings: '闈㈡澘鍩哄湴;浜嬩笟閮�'
+        Taborder: 1
+      ]
+    }
+    Component DropDownTimeGroup id:DropDownTimeGroup_593
+    {
+      #keys: '[414702.1.277808195]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '鏃堕棿鍒嗙粍'
+        Strings: '鏈�;瀛e害;鍗婂勾;骞�'
+        Taborder: 2
+      ]
+    }
+    Component DropDownSaleOrCapacity id:DropDownSaleOrCapacity_715
+    {
+      #keys: '[414702.1.277808264]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '浜ц兘/閿�鍞'
+        Strings: '浜ц兘;閿�鍞'
+        Taborder: 3
+      ]
+    }
+    Component ButtonCapacityAndSaleBudgeChartTest id:ButtonCapacityAndSaleBudgeChartTest_844
+    {
+      #keys: '[414702.1.277808330]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'PRESENTATION_CHART'
+        Label: '鐢熸垚鍥捐〃'
+        Taborder: 0
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 3
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick\043603.def"
similarity index 86%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick\043603.def"
index cbd7ff2..761a489 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_ButtonCapacityAndSaleBudgeChartTest_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/Response_pFilterCriteria_ButtonCapacityAndSaleBudgeChartTest_OnClick\043603.def"
@@ -1,11 +1,10 @@
 Quintiq file version 2.0
-#parent: ButtonCapacityAndSaleBudgeChartTest
-Response OnClick () id:Response_FormCapacityAndSaleBudgeChart_ButtonCapacityAndSaleBudgeChartTest_OnClick
+#parent: pFilterCriteria/ButtonCapacityAndSaleBudgeChartTest_844
+Response OnClick () id:Response_FormCapacityAndSaleBudgeChart_ButtonCapacityAndSaleBudgeChartTest_OnClick_603
 {
-  #keys: '[414384.0.857443403]'
+  #keys: '[414702.1.277808329]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
@@ -22,5 +21,6 @@
                                               DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
                                               GlobalOTDTable );
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
index 237e0c6..56d70aa 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeChart/_ROOT_Component_FormCapacityAndSaleBudgeChart.def
@@ -8,16 +8,6 @@
   Children:
   [
     #child: ChartCapacityAndSaleBudgeChart
-    Component ButtonCapacityAndSaleBudgeChartTest
-    {
-      #keys: '[414384.0.857443217]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: '鐢熸垚'
-        Taborder: 6
-      ]
-    }
     Component DropDownYears
     {
       #keys: '[414384.0.857740648]'
@@ -25,7 +15,7 @@
       Properties:
       [
         Label: '骞翠唤'
-        Taborder: 2
+        Taborder: 0
         Visible: false
       ]
     }
@@ -37,7 +27,7 @@
       [
         AllowEmpty: true
         Label: '浜嬩笟閮�'
-        Taborder: 3
+        Taborder: 1
         Visible: false
       ]
     }
@@ -49,46 +39,11 @@
       [
         AllowEmpty: true
         Label: '闈㈡澘鍩哄湴'
-        Taborder: 4
+        Taborder: 2
         Visible: false
       ]
     }
-    Component DropDownTimeGroup
-    {
-      #keys: '[414384.0.857771238]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        InitialValue: '鏈�'
-        Label: '鏃堕棿鍒嗙粍'
-        Strings: '鏈�;瀛e害;鍗婂勾;骞�'
-        Taborder: 1
-      ]
-    }
-    Component DropDownByBusinessTypeOrByOrgCode
-    {
-      #keys: '[414384.0.857702904]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        InitialValue: '浜嬩笟閮�'
-        Label: '鏍规嵁闈㈡澘鍩哄湴/浜嬩笟閮ㄥ垎缁�'
-        Strings: '闈㈡澘鍩哄湴;浜嬩笟閮�'
-        Taborder: 0
-      ]
-    }
-    Component DropDownSaleOrCapacity
-    {
-      #keys: '[414384.0.886240556]'
-      BaseType: 'WebDropDownStringList'
-      Properties:
-      [
-        InitialValue: '閿�鍞'
-        Label: '閿�鍞/浜ц兘'
-        Strings: '閿�鍞;浜ц兘'
-        Taborder: 5
-      ]
-    }
+    #child: pFilterCriteria
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
index d59a144..2666de7 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_MatrixEditorCapacityAndSaleBudgeCompare.def
@@ -93,6 +93,6 @@
     ContextMenu: 'matrixeditorContextMenuCapacityAndSaleBudgeCompare'
     Editable: false
     Rows: 'MatrixEditorRowsCapacityAndSaleBudgeCompare'
-    Taborder: 2
+    Taborder: 1
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def
new file mode 100644
index 0000000..52b3f21
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Component_pButton.def
@@ -0,0 +1,37 @@
+Quintiq file version 2.0
+Component pButton
+{
+  #keys: '[414702.1.272379026]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ButtonCapacityAndSaleBudgeCompare id:ButtonCapacityAndSaleBudgeCompare_956
+    {
+      #keys: '[414702.1.272313474]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'COCKTAIL'
+        Label: '鍒锋柊'
+        Taborder: 0
+      ]
+    }
+    Component ButtonExportCompare id:ButtonExportCompare_364
+    {
+      #keys: '[414702.1.269961255]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'EXPORT1'
+        Label: '瀵煎嚭'
+        Taborder: 1
+      ]
+    }
+  ]
+  Properties:
+  [
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick\043231.def"
similarity index 61%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick\043231.def"
index 7f559d2..a683e63 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonCapacityAndSaleBudgeCompare_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonCapacityAndSaleBudgeCompare_OnClick\043231.def"
@@ -1,24 +1,20 @@
 Quintiq file version 2.0
-#parent: ButtonCapacityAndSaleBudgeCompare
-Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonCapacityAndSaleBudgeCompare_OnClick
+#parent: pButton/ButtonCapacityAndSaleBudgeCompare_956
+Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonCapacityAndSaleBudgeCompare_OnClick_231
 {
-  #keys: '[414384.0.818241703]'
+  #keys: '[414702.1.272313473]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      info( DataHolderMacroPlansForScenarioComparison.Data().Size() );
-      info( DataHolderCapacityAndSaleBudgeFilterItem.Data().Size() );
-      info( DataHolderCapacityAndSaleBudgeFilterYear.Data().Size() );
-      info( DataHolderCapacityAndSaleBudgeFilterMonth.Data().Size() );
       GlobalOTDSOP.CapacityAndSaleBudgeCompare( DataHolderMacroPlansForScenarioComparison.Data(), 
                                                 DataHolderCapacityAndSaleBudgeFilterItem.Data(), 
                                                 DataHolderCapacityAndSaleBudgeFilterYear.Data(), 
                                                 DataHolderCapacityAndSaleBudgeFilterMonth.Data(),
                                                 GlobalOTDTable );
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick\043325.def"
similarity index 80%
rename from _Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
rename to "_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick\043325.def"
index f98be27..1dbc159 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_ButtonExportCompare_OnClick.def
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/Response_pButton_ButtonExportCompare_OnClick\043325.def"
@@ -1,8 +1,8 @@
 Quintiq file version 2.0
-#parent: ButtonExportCompare
-Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonExportCompare_OnClick
+#parent: pButton/ButtonExportCompare_364
+Response OnClick () id:Response_FormCapacityAndSaleBudgeCompare_ButtonExportCompare_OnClick_325
 {
-  #keys: '[414384.0.881345276]'
+  #keys: '[414702.1.269961254]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebButton_OnClick'
   Precondition:
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
index d44643f..d5e9525 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeCompare/_ROOT_Component_FormCapacityAndSaleBudgeCompare.def
@@ -8,27 +8,7 @@
   Children:
   [
     #child: MatrixEditorCapacityAndSaleBudgeCompare
-    Component ButtonCapacityAndSaleBudgeCompare
-    {
-      #keys: '[414384.0.818241675]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Label: '鍒锋柊'
-        Taborder: 0
-      ]
-    }
-    Component ButtonExportCompare
-    {
-      #keys: '[414384.0.881345277]'
-      BaseType: 'WebButton'
-      Properties:
-      [
-        Image: 'EXPORT1'
-        Label: '瀵煎嚭'
-        Taborder: 1
-      ]
-    }
+    #child: pButton
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def"
index f254f69..9e21db8 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCh\043171.def"
@@ -5,12 +5,12 @@
   #keys: '[414384.0.875704514]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      DataHolderCapacityAndSaleBudgeFilterYear.Data().Flush();
+      DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data().Flush();
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def
index 5d9bdf7..86b3523 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormCapacityAndSaleBudgeFilterPlaceOfProductionOfArray/Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserChecke.def
@@ -1,18 +1,18 @@
 Quintiq file version 2.0
 #parent: ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray
 Response OnUserCheckedChanged (
-  structured[CapacityAndSaleBudgeFilterYear] checkeditems
+  structured[CapacityAndSaleBudgeFilterPlaceOfProductionOfArray] checkeditems
 ) id:Response_ListCapacityAndSaleBudgeFilterPlaceOfProductionOfArray_OnUserCheckedChanged
 {
   #keys: '[414384.0.875704513]'
   CanBindMultiple: false
   DefinitionID: 'Responsedef_WebList_OnUserCheckedChanged'
-  GroupServerCalls: true
   QuillAction
   {
     Body:
     [*
-      DataHolderCapacityAndSaleBudgeFilterYear.Data( checkeditems.Copy() );
+      DataHolderCapacityAndSaleBudgeFilterPlaceOfProductionOfArray.Data( checkeditems.Copy() );
     *]
+    GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Capacity___sale_budge.vw b/_Main/UI/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
deleted file mode 100644
index 901e27f..0000000
--- a/_Main/UI/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
+++ /dev/null
@@ -1,16 +0,0 @@
-Quintiq file version 2.0
-{
-  viewcontents
-  {
-    image: 'CHART_HI_LO'
-    page: 'ActionBarPageScenarioComparison'
-    group: ''
-    index: 0
-    description: ''
-  }
-  formatversion: 2
-  id: 'Capacity___sale_budge'
-  name: 'Capacity & sale budge'
-  isglobal: false
-  isroot: true
-}
diff --git "a/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw" "b/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
index 64db9ed..0516c1b 100644
--- "a/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
+++ "b/_Main/UI/MacroPlannerWebApp/Views/\345\271\264\345\272\246\344\272\247\351\224\200\345\244\215\347\233\230.vw"
@@ -12,495 +12,59 @@
         layout
         {
           mode: 'open'
-          rowPosition: 1
-          rowSpan: 4
+          rowPosition: 6
+          rowSpan: 8
           columnPosition: 1
-          columnSpan: 2
+          columnSpan: 12
         }
         components
         {
+          FormCapacityAndSaleBudge_pButton
+          {
+            sizeRatio: 1
+          }
           FormCapacityAndSaleBudge_ListCapacityAndSaleBudge
           {
           }
           FormCapacityAndSaleBudge_DataSetLevelCapacityAndSaleBudge
           {
             groupDepth: -1
-            column_Deleted
-            {
-              columnId: 'Deleted'
-              dataPath: 'Deleted'
-              dataType: 'boolean'
-              index: 0
-              subtotals: ''
-              width: 150
-            }
-            column_YearNo
-            {
-              columnId: 'YearNo'
-              dataPath: 'YearNo'
-              dataType: 'number'
-              index: 1
-              subtotals: ''
-              width: 150
-            }
-            column_OrgCode
-            {
-              columnId: 'OrgCode'
-              dataPath: 'OrgCode'
-              dataType: 'string'
-              index: 2
-              subtotals: ''
-              width: 150
-            }
-            column_DisplayTechnology
-            {
-              columnId: 'DisplayTechnology'
-              dataPath: 'DisplayTechnology'
-              dataType: 'string'
-              index: 3
-              subtotals: ''
-              width: 150
-            }
+            sort: 'YearNo,ProductID'
             column_BusinessType
             {
               columnId: 'BusinessType'
               dataPath: 'BusinessType'
               dataType: 'string'
-              index: 4
+              index: 0
               subtotals: ''
-              width: 150
+              width: 107
             }
-            column_LineAndSpecification
+            column_ProductID
             {
-              columnId: 'LineAndSpecification'
-              dataPath: 'LineAndSpecification'
+              columnId: 'ProductID'
+              dataPath: 'ProductID'
               dataType: 'string'
-              index: 5
+              index: 1
               subtotals: ''
-              width: 150
+              width: 178
             }
-            column_ProductCode
+            column_OrganCode
             {
-              columnId: 'ProductCode'
-              dataPath: 'ProductCode'
+              columnId: 'OrganCode'
+              dataPath: 'OrganCode'
               dataType: 'string'
-              index: 6
+              index: 2
               subtotals: ''
-              width: 150
+              width: 98
             }
-            column_PlaceOfProductionOfArray
+            column_YearNo
             {
-              columnId: 'PlaceOfProductionOfArray'
-              dataPath: 'PlaceOfProductionOfArray'
+              columnId: 'YearNo'
+              dataPath: 'YearNo'
               dataType: 'string'
-              index: 7
+              index: 3
               subtotals: ''
-              width: 150
-            }
-            column_PlaceOfProductionOfEvaporation
-            {
-              columnId: 'PlaceOfProductionOfEvaporation'
-              dataPath: 'PlaceOfProductionOfEvaporation'
-              dataType: 'string'
-              index: 8
-              subtotals: ''
-              width: 150
-            }
-            column_Resolution
-            {
-              columnId: 'Resolution'
-              dataPath: 'Resolution'
-              dataType: 'string'
-              index: 9
-              subtotals: ''
-              width: 150
-            }
-            column_ShippingForm
-            {
-              columnId: 'ShippingForm'
-              dataPath: 'ShippingForm'
-              dataType: 'string'
-              index: 10
-              subtotals: ''
-              width: 150
-            }
-            column_NumberOfCut
-            {
-              columnId: 'NumberOfCut'
-              dataPath: 'NumberOfCut'
-              dataType: 'string'
-              index: 11
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityEquivalent
-            {
-              columnId: 'CapacityEquivalent'
-              dataPath: 'CapacityEquivalent'
-              dataType: 'string'
-              index: 12
-              subtotals: ''
-              width: 150
-            }
-            column_NumberOfMask
-            {
-              columnId: 'NumberOfMask'
-              dataPath: 'NumberOfMask'
-              dataType: 'string'
-              index: 13
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth1
-            {
-              columnId: 'CapacityInPCSInMonth1'
-              dataPath: 'CapacityInPCSInMonth1'
-              dataType: 'real'
-              index: 14
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth2
-            {
-              columnId: 'CapacityInPCSInMonth2'
-              dataPath: 'CapacityInPCSInMonth2'
-              dataType: 'real'
-              index: 15
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth3
-            {
-              columnId: 'CapacityInPCSInMonth3'
-              dataPath: 'CapacityInPCSInMonth3'
-              dataType: 'real'
-              index: 16
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth4
-            {
-              columnId: 'CapacityInPCSInMonth4'
-              dataPath: 'CapacityInPCSInMonth4'
-              dataType: 'real'
-              index: 17
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth5
-            {
-              columnId: 'CapacityInPCSInMonth5'
-              dataPath: 'CapacityInPCSInMonth5'
-              dataType: 'real'
-              index: 18
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth6
-            {
-              columnId: 'CapacityInPCSInMonth6'
-              dataPath: 'CapacityInPCSInMonth6'
-              dataType: 'real'
-              index: 19
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth7
-            {
-              columnId: 'CapacityInPCSInMonth7'
-              dataPath: 'CapacityInPCSInMonth7'
-              dataType: 'real'
-              index: 20
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth8
-            {
-              columnId: 'CapacityInPCSInMonth8'
-              dataPath: 'CapacityInPCSInMonth8'
-              dataType: 'real'
-              index: 21
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth9
-            {
-              columnId: 'CapacityInPCSInMonth9'
-              dataPath: 'CapacityInPCSInMonth9'
-              dataType: 'real'
-              index: 22
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth10
-            {
-              columnId: 'CapacityInPCSInMonth10'
-              dataPath: 'CapacityInPCSInMonth10'
-              dataType: 'real'
-              index: 23
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth11
-            {
-              columnId: 'CapacityInPCSInMonth11'
-              dataPath: 'CapacityInPCSInMonth11'
-              dataType: 'real'
-              index: 24
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSInMonth12
-            {
-              columnId: 'CapacityInPCSInMonth12'
-              dataPath: 'CapacityInPCSInMonth12'
-              dataType: 'real'
-              index: 25
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInPCSTotal
-            {
-              columnId: 'CapacityInPCSTotal'
-              dataPath: 'CapacityInPCSTotal'
-              dataType: 'real'
-              index: 26
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth1
-            {
-              columnId: 'CapacityInSheetInMonth1'
-              dataPath: 'CapacityInSheetInMonth1'
-              dataType: 'real'
-              index: 27
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth2
-            {
-              columnId: 'CapacityInSheetInMonth2'
-              dataPath: 'CapacityInSheetInMonth2'
-              dataType: 'real'
-              index: 28
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth3
-            {
-              columnId: 'CapacityInSheetInMonth3'
-              dataPath: 'CapacityInSheetInMonth3'
-              dataType: 'real'
-              index: 29
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth4
-            {
-              columnId: 'CapacityInSheetInMonth4'
-              dataPath: 'CapacityInSheetInMonth4'
-              dataType: 'real'
-              index: 30
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth5
-            {
-              columnId: 'CapacityInSheetInMonth5'
-              dataPath: 'CapacityInSheetInMonth5'
-              dataType: 'real'
-              index: 31
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth6
-            {
-              columnId: 'CapacityInSheetInMonth6'
-              dataPath: 'CapacityInSheetInMonth6'
-              dataType: 'real'
-              index: 32
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth7
-            {
-              columnId: 'CapacityInSheetInMonth7'
-              dataPath: 'CapacityInSheetInMonth7'
-              dataType: 'real'
-              index: 33
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth8
-            {
-              columnId: 'CapacityInSheetInMonth8'
-              dataPath: 'CapacityInSheetInMonth8'
-              dataType: 'real'
-              index: 34
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth9
-            {
-              columnId: 'CapacityInSheetInMonth9'
-              dataPath: 'CapacityInSheetInMonth9'
-              dataType: 'real'
-              index: 35
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth10
-            {
-              columnId: 'CapacityInSheetInMonth10'
-              dataPath: 'CapacityInSheetInMonth10'
-              dataType: 'real'
-              index: 36
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth11
-            {
-              columnId: 'CapacityInSheetInMonth11'
-              dataPath: 'CapacityInSheetInMonth11'
-              dataType: 'real'
-              index: 37
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetInMonth12
-            {
-              columnId: 'CapacityInSheetInMonth12'
-              dataPath: 'CapacityInSheetInMonth12'
-              dataType: 'real'
-              index: 38
-              subtotals: ''
-              width: 150
-            }
-            column_CapacityInSheetTotal
-            {
-              columnId: 'CapacityInSheetTotal'
-              dataPath: 'CapacityInSheetTotal'
-              dataType: 'real'
-              index: 39
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth1
-            {
-              columnId: 'SaleAmountInMonth1'
-              dataPath: 'SaleAmountInMonth1'
-              dataType: 'real'
-              index: 40
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth2
-            {
-              columnId: 'SaleAmountInMonth2'
-              dataPath: 'SaleAmountInMonth2'
-              dataType: 'real'
-              index: 41
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth3
-            {
-              columnId: 'SaleAmountInMonth3'
-              dataPath: 'SaleAmountInMonth3'
-              dataType: 'real'
-              index: 42
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth5
-            {
-              columnId: 'SaleAmountInMonth5'
-              dataPath: 'SaleAmountInMonth5'
-              dataType: 'real'
-              index: 43
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth4
-            {
-              columnId: 'SaleAmountInMonth4'
-              dataPath: 'SaleAmountInMonth4'
-              dataType: 'real'
-              index: 44
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth6
-            {
-              columnId: 'SaleAmountInMonth6'
-              dataPath: 'SaleAmountInMonth6'
-              dataType: 'real'
-              index: 45
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth7
-            {
-              columnId: 'SaleAmountInMonth7'
-              dataPath: 'SaleAmountInMonth7'
-              dataType: 'real'
-              index: 46
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth8
-            {
-              columnId: 'SaleAmountInMonth8'
-              dataPath: 'SaleAmountInMonth8'
-              dataType: 'real'
-              index: 47
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth9
-            {
-              columnId: 'SaleAmountInMonth9'
-              dataPath: 'SaleAmountInMonth9'
-              dataType: 'real'
-              index: 48
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth10
-            {
-              columnId: 'SaleAmountInMonth10'
-              dataPath: 'SaleAmountInMonth10'
-              dataType: 'real'
-              index: 49
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth11
-            {
-              columnId: 'SaleAmountInMonth11'
-              dataPath: 'SaleAmountInMonth11'
-              dataType: 'real'
-              index: 50
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountInMonth12
-            {
-              columnId: 'SaleAmountInMonth12'
-              dataPath: 'SaleAmountInMonth12'
-              dataType: 'real'
-              index: 51
-              subtotals: ''
-              width: 150
-            }
-            column_SaleAmountTotal
-            {
-              columnId: 'SaleAmountTotal'
-              dataPath: 'SaleAmountTotal'
-              dataType: 'real'
-              index: 52
-              subtotals: ''
-              width: 150
+              width: 84
             }
           }
         }
@@ -513,20 +77,24 @@
         layout
         {
           mode: 'open'
-          rowPosition: 5
-          rowSpan: 10
-          columnPosition: 5
-          columnSpan: 8
+          rowPosition: 14
+          rowSpan: 8
+          columnPosition: 1
+          columnSpan: 12
         }
         components
         {
+          FormCapacityAndSaleBudgeCompare_pButton
+          {
+            sizeRatio: 1
+          }
           FormCapacityAndSaleBudgeCompare_MatrixEditorCapacityAndSaleBudgeCompare
           {
             gridColor: '#c4c4c4'
-            totalHeaderWidth: 200
+            totalHeaderWidth: 67
             attributeHeaderWidthRatio: 0.6
             nameHeaderWidthRatio: 0.4
-            columnWidth: 100
+            columnWidth: 264
             horizontalGrid: true
             verticalGrid: true
             backendState
@@ -576,7 +144,7 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
+          rowSpan: 5
           columnPosition: 3
           columnSpan: 2
         }
@@ -588,6 +156,7 @@
           FormCapacityAndSaleBudgeFilterItem_DataSetLevelCapacityAndSaleBudgeFilterItem
           {
             groupDepth: -1
+            sort: 'ItemName'
             column_ItemName
             {
               columnId: 'ItemName'
@@ -608,13 +177,17 @@
         layout
         {
           mode: 'open'
-          rowPosition: 5
-          rowSpan: 11
+          rowPosition: 22
+          rowSpan: 13
           columnPosition: 1
-          columnSpan: 4
+          columnSpan: 12
         }
         components
         {
+          FormCapacityAndSaleBudgeChart_pFilterCriteria
+          {
+            sizeRatio: 1
+          }
           FormCapacityAndSaleBudgeChart_ChartCapacityAndSaleBudgeChart
           {
             SynchronizationGroup: ''
@@ -636,7 +209,7 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
+          rowSpan: 5
           columnPosition: 5
           columnSpan: 2
         }
@@ -669,8 +242,8 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
-          columnPosition: 7
+          rowSpan: 5
+          columnPosition: 9
           columnSpan: 2
         }
         components
@@ -702,8 +275,8 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
-          columnPosition: 11
+          rowSpan: 5
+          columnPosition: 7
           columnSpan: 2
         }
         components
@@ -735,8 +308,8 @@
         {
           mode: 'open'
           rowPosition: 1
-          rowSpan: 4
-          columnPosition: 9
+          rowSpan: 5
+          columnPosition: 11
           columnSpan: 2
         }
         components
@@ -759,6 +332,39 @@
           }
         }
       }
+      form_FormScenarioManager
+      {
+        title: 'QLibMacroPlannerWebUI::FormScenarioManager'
+        shown: true
+        componentID: 'QLibMacroPlannerWebUI::FormScenarioManager'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 5
+          columnPosition: 1
+          columnSpan: 2
+        }
+        components
+        {
+          FormScenarioManager_ListScenario
+          {
+          }
+          FormScenarioManager_DataSetLevelScenario
+          {
+            groupDepth: -1
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 240
+            }
+          }
+        }
+      }
     }
     userconfigurableinformation
     {
diff --git a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Capacity___sale_budge.vw b/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
deleted file mode 100644
index 780f9e5..0000000
--- a/_var/_Main/ProjSettings/MacroPlannerWebApp/Views/Capacity___sale_budge.vw
+++ /dev/null
@@ -1,205 +0,0 @@
-Quintiq file version 2.0
-{
-  viewcontents
-  {
-    forms
-    {
-      form_legacy_1
-      {
-        title: 'Scenario manager'
-        shown: true
-        componentID: 'FormScenarioManager'
-        layout
-        {
-          mode: 'open'
-          rowPosition: 1
-          rowSpan: 8
-          columnPosition: 1
-          columnSpan: 5
-        }
-        components
-        {
-          FormScenarioManager_ListScenario
-          {
-          }
-          FormScenarioManager_DataSetLevelScenario
-          {
-            groupDepth: -1
-            column_All_constraints
-            {
-              columnId: 'All constraints'
-              dataPath: 'All constraints'
-              dataType: 'string'
-              title: 'All constraints'
-              index: 0
-              subtotals: ''
-              width: 90
-            }
-            column_Name
-            {
-              columnId: 'Name'
-              dataPath: 'Name'
-              dataType: 'string'
-              title: '鍚嶇О'
-              index: 1
-              subtotals: ''
-              width: 197
-            }
-            column_ChangedBy
-            {
-              columnId: 'ChangedBy'
-              dataPath: 'ChangedBy'
-              dataType: 'string'
-              title: 'Changed by'
-              index: 2
-              subtotals: ''
-              width: 91
-            }
-            column_ChangedOn
-            {
-              columnId: 'ChangedOn'
-              dataPath: 'ChangedOn'
-              dataType: 'datetime'
-              title: 'Changed on'
-              index: 3
-              subtotals: ''
-              width: 99
-            }
-            column_StorageMode
-            {
-              columnId: 'StorageMode'
-              dataPath: 'StorageMode'
-              dataType: 'string'
-              title: 'StorageMode'
-              index: 4
-              subtotals: ''
-              width: 40
-            }
-          }
-        }
-      }
-      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: '鍚嶇О'
-              index: 1
-              subtotals: ''
-              width: 109
-            }
-            column_Description
-            {
-              columnId: 'Description'
-              dataPath: 'Description'
-              dataType: 'string'
-              title: '鎻忚堪'
-              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: '鍚嶇О'
-              index: 1
-              subtotals: ''
-              width: 200
-            }
-          }
-        }
-      }
-    }
-    userconfigurableinformation
-    {
-    }
-    index: 0
-    image: 'CHART_HI_LO'
-    page: 'ActionBarPageScenarioComparison'
-    group: ''
-    description: ''
-  }
-  formatversion: 2
-  id: 'Capacity___sale_budge'
-  name: 'Capacity & sale budge'
-  isglobal: false
-  isroot: true
-}

--
Gitblit v1.9.3