From 133f1a1dc59bbf13a35dc3d64e2ddaf6b37a335f Mon Sep 17 00:00:00 2001
From: lazhen <17772815105@139.com>
Date: 星期一, 14 十月 2024 18:19:02 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.101.211.7:10101/r/VWED into dev-zlg

---
 _Main/BL/Type_OfflinePlanTableInfo/Attribute_TableSaveTime.qbl                                                   |    7 +
 _Main/BL/Type_OfflinePlanTableInfo/_ROOT_Type_OfflinePlanTableInfo.qbl                                           |   10 +
 _Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanMDSID.qbl                                                  |    7 +
 _Main/UI/MacroPlannerWebApp/Component_FormForecasts/Component_ListSalesDemands.def                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def                           |    3 
 _Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanName.qbl                                                   |    7 +
 _Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_bComparison_OnClick.def                |    9 +
 _Main/BL/Type_OfflinePlanTableInfo/Attribute_TableName.qbl                                                       |    7 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def                  |   10 -
 _Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl                                               |   24 +++
 _Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_ButtonRibbon_OnClick.def               |   17 ++
 _Main/UI/MacroPlannerWebApp/Component_Form701/Response_OnCreated.def                                             |   12 +
 _Main/UI/MacroPlannerWebApp/Component_FormForecasts/Response_ListSalesDemands_MenuCreate_OnClick#715.def         |   12 -
 _Main/BL/Type_Forecast/Function_CalcDiffernce.qbl                                                                |   13 +
 _Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl                                                          |   18 +
 _Main/UI/MacroPlannerWebApp/Component_Form701/Component_PanelRibbon504#801.def                                   |   44 ++++-
 _Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def |    2 
 _Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated#57.def   |   14 --
 _Main/BL/Relations/Relation_OfflinePlanTableInfo_RecycleBin_RecycleBin_OfflinePlanTableInfo.qbl                  |   23 +++
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport#1.qbl                              |   26 ++-
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlanByMDSID.def                     |   24 +++
 _Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl                                     |   20 ++
 _Main/BL/Type_OfflinePlanTableInfo/StaticMethod_Create.qbl                                                       |   23 +++
 _Main/BL/Type_Forecast/Attribute_Differnce.qbl                                                                   |    7 +
 _Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl                                    |   23 ++
 _Main/BL/Type_DispatchShiftSchedulingInformation/Function_CalcFac.qbl                                            |    4 
 26 files changed, 290 insertions(+), 78 deletions(-)

diff --git a/_Main/BL/Relations/Relation_OfflinePlanTableInfo_RecycleBin_RecycleBin_OfflinePlanTableInfo.qbl b/_Main/BL/Relations/Relation_OfflinePlanTableInfo_RecycleBin_RecycleBin_OfflinePlanTableInfo.qbl
new file mode 100644
index 0000000..6320701
--- /dev/null
+++ b/_Main/BL/Relations/Relation_OfflinePlanTableInfo_RecycleBin_RecycleBin_OfflinePlanTableInfo.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation OfflinePlanTableInfo_RecycleBin_RecycleBin_OfflinePlanTableInfo
+{
+  #keys: '1[414996.1.124530089]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide RecycleBin
+  {
+    #keys: '3[414996.1.124530091][414996.1.124530090][414996.1.124530092]'
+    Cardinality: '0to1'
+    ObjectDefinition: OfflinePlanTableInfo
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide OfflinePlanTableInfo
+  {
+    #keys: '3[414996.1.124530094][414996.1.124530093][414996.1.124530095]'
+    Cardinality: '1toN'
+    ObjectDefinition: RecycleBin
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_DispatchShiftSchedulingInformation/Function_CalcFac.qbl b/_Main/BL/Type_DispatchShiftSchedulingInformation/Function_CalcFac.qbl
index a20b0a3..5f1c80b 100644
--- a/_Main/BL/Type_DispatchShiftSchedulingInformation/Function_CalcFac.qbl
+++ b/_Main/BL/Type_DispatchShiftSchedulingInformation/Function_CalcFac.qbl
@@ -6,9 +6,9 @@
   [*
     // Akari Aug-21-2024 (created)
     value := "";
-    if( this.FactoryName() = "澶ц繛宸ュ巶" ){
+    if( this.FactoryName().LikeUserLocale( "澶ц繛" ) or  this.FactoryName().LikeUserLocale( "DL" ) ){
       value := "DL";
-    }else if( this.FactoryName() = "闀挎槬宸ュ巶"){
+    }else if( this.FactoryName().LikeUserLocale( "闀挎槬" ) or  this.FactoryName().LikeUserLocale( "CC" )){
       value := "CC";
     }
     
diff --git a/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl b/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl
index 1de3a99..cd068af 100644
--- a/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl
+++ b/_Main/BL/Type_DispatchShiftSchedulingInformation/StaticMethod_SplitShifts.qbl
@@ -12,19 +12,32 @@
     shiftSchedulingInformations := construct( DispatchShiftSchedulingInformations );
     if( shiftName = "3" ){
       shiftSchedulingInformation1 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
-      shiftSchedulingInformation1.SingleShiftName( "1鐝�" );
+      shiftSchedulingInformation1.SingleShiftName( "鐧界彮" );
       shiftSchedulingInformations.Add( shiftSchedulingInformation1 );
       
       shiftSchedulingInformation2 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
-      shiftSchedulingInformation2.SingleShiftName( "2鐝�" );
+      shiftSchedulingInformation2.SingleShiftName( "浜岀彮" );
       shiftSchedulingInformations.Add( shiftSchedulingInformation2 );
       
       shiftSchedulingInformation3 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 3 );
-      shiftSchedulingInformation3.SingleShiftName( "3鐝�" );
+      shiftSchedulingInformation3.SingleShiftName( "涓夌彮" );
       shiftSchedulingInformations.Add( shiftSchedulingInformation3 );
+    }else if( shiftName = "2" ){
+      shiftSchedulingInformation1 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 2 );
+      shiftSchedulingInformation1.SingleShiftName( "鐧界彮" );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation1 );
+      
+      shiftSchedulingInformation2 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 2 );
+      shiftSchedulingInformation2.SingleShiftName( "浜岀彮" );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation2 );
+    }else if( shiftName = "1" ){
+      shiftSchedulingInformation1 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 1 );
+      shiftSchedulingInformation1.SingleShiftName( "鐧界彮" );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation1 );
     }else{
-      shiftSchedulingInformation := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume );
-      shiftSchedulingInformations.Add( shiftSchedulingInformation );
+      shiftSchedulingInformation1 := owner.DispatchShiftSchedulingInformation( relnew ,ID := IDHolder::GetGUID(),ShiftName := shiftName,ShiftVolume := shiftVolume / 1 );
+      shiftSchedulingInformation1.SingleShiftName( "" );
+      shiftSchedulingInformations.Add( shiftSchedulingInformation1 );
     }
     
     
diff --git a/_Main/BL/Type_Forecast/Attribute_Differnce.qbl b/_Main/BL/Type_Forecast/Attribute_Differnce.qbl
new file mode 100644
index 0000000..776bc62
--- /dev/null
+++ b/_Main/BL/Type_Forecast/Attribute_Differnce.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Differnce
+{
+  #keys: '3[414996.1.124560122][414996.1.124560121][414996.1.124560123]'
+  ValueType: Real
+}
diff --git a/_Main/BL/Type_Forecast/Function_CalcDiffernce.qbl b/_Main/BL/Type_Forecast/Function_CalcDiffernce.qbl
new file mode 100644
index 0000000..8592251
--- /dev/null
+++ b/_Main/BL/Type_Forecast/Function_CalcDiffernce.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Function CalcDiffernce
+{
+  TextBody:
+  [*
+    // Akari Oct-14-2024 (created)
+    
+    value := this.Quantity() - this.FulfilledQuantity();
+    
+    this.Differnce( value );
+  *]
+}
diff --git "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl" "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
index 905b371..1eb1832 100644
--- "a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
+++ "b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateComprehensiveHoursReport\0431.qbl"
@@ -85,15 +85,16 @@
         workingDayCell.RealValue( workingDayCell.RealValue() + 1 );
         if( shiftPlan.IsHoliday() ){
           // 鑺傚亣鏃ュ姞鐝� 
-          overtime := shiftPlan.GetBreakDayOvertimeHour( false );
+          overtime := shiftPlan.GetHolidayOvertimeHour( false );
           holidayOvertimeHourCell.RealValue( holidayOvertimeHourCell.RealValue() + overtime );
           if( not isnull( nextShiftPlan )){
-            nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
             if( nextShiftPlan.IsHoliday()){
               // 涓嬩竴澶╂槸鑺傚亣鏃�
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               holidayOvertimeHourCell.RealValue( holidayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else if( shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄥ叚" ) or shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄦ棩" ) ){
               // 涓嬩竴澶╂槸鍛ㄥ叚鎴栧懆鏃�
+              nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
               breakDayOvertimeHourCell.RealValue( breakDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else{
               // 涓嬩竴澶╂槸骞冲父鐨勫伐浣滄棩
@@ -106,12 +107,14 @@
           overtime := shiftPlan.GetBreakDayOvertimeHour( false );
           breakDayOvertimeHourCell.RealValue( breakDayOvertimeHourCell.RealValue() + overtime );
           if( not isnull( nextShiftPlan )){
-            nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
+            
             if( nextShiftPlan.IsHoliday()){
               // 涓嬩竴澶╂槸鑺傚亣鏃�
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               holidayOvertimeHourCell.RealValue( holidayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else if( shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄥ叚" ) or shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄦ棩" ) ){
               // 涓嬩竴澶╂槸鍛ㄥ叚鎴栧懆鏃�
+              nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
               breakDayOvertimeHourCell.RealValue( breakDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else{
               // 涓嬩竴澶╂槸骞冲父鐨勫伐浣滄棩
@@ -124,12 +127,13 @@
           overtime := shiftPlan.GetDefaultDayOvertimeHour( false );
           defaultDayOvertimeHourCell.RealValue( defaultDayOvertimeHourCell.RealValue() + overtime );
           if( not isnull( nextShiftPlan )){
-            nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
             if( nextShiftPlan.IsHoliday()){
               // 涓嬩竴澶╂槸鑺傚亣鏃�
+              nextDayOvertime := shiftPlan.GetHolidayOvertimeHour( true );
               holidayOvertimeHourCell.RealValue( holidayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else if( shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄥ叚" ) or shiftPlan.DefaultRemark().LikeUserLocale( "鍛ㄦ棩" ) ){
               // 涓嬩竴澶╂槸鍛ㄥ叚鎴栧懆鏃�
+              nextDayOvertime := shiftPlan.GetBreakDayOvertimeHour( true );
               breakDayOvertimeHourCell.RealValue( breakDayOvertimeHourCell.RealValue() + nextDayOvertime );
             }else{
               // 涓嬩竴澶╂槸骞冲父鐨勫伐浣滄棩
@@ -150,6 +154,12 @@
     defaultMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "骞虫椂鍔犵彮" );
     if( isnull( defaultMultiplier )){
       defaultMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "骞虫椂鍔犵彮鍊嶇巼",Multiplier := 1.5 );
+    }
+    
+    // 娆犲伐鍊嶇巼
+    qiangongMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "娆犲伐" );
+    if( isnull( qiangongMultiplier )){
+      qiangongMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "娆犲伐",Multiplier := 1 );
     }
     
     // 浼戞伅鏃ュ姞鐝�嶇巼
@@ -174,11 +184,13 @@
       unit := units.Element( unitIndexTree.Root().Child( unitIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
       
       jiejiariCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
-      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
-      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,jiejiariCell.RealValue()));
+      jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,holidayMultiplier,jiejiariCell.RealValue()));
       
       qiangongCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
-      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
+      qiangongCell.RealValue( qiangongCell.RealValue() - 8 );
+      
+      qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
       qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,qiangongCell.RealValue() ));
     }
     
diff --git a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
index c46525a..2a888ca 100644
--- a/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
+++ b/_Main/BL/Type_LocalCell_Default/StaticMethod_GenerateStandardHoursReport.qbl
@@ -157,6 +157,12 @@
       defaultMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "骞虫椂鍔犵彮鍊嶇巼",Multiplier := 1.5 );
     }
     
+    // 娆犲伐鍊嶇巼
+    qiangongMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "娆犲伐" );
+    if( isnull( qiangongMultiplier )){
+      qiangongMultiplier := macroPlan.OvertimeMultiplier( relnew,Name := "娆犲伐",Multiplier := 1 );
+    }
+    
     // 浼戞伅鏃ュ姞鐝�嶇巼
     breakDayMultiplier := select( macroPlan,OvertimeMultiplier,object,object.Name() = "鍛ㄦ湯鍔犵彮");
     if( isnull( breakDayMultiplier )){
@@ -178,28 +184,32 @@
       rowKey := row.CustomName();
       unit := units.Element( unitIndexTree.Root().Child( unitIndexTree.GetHandle( rowKey )).GetValueAsNumber() );
       
+      // 鑺傚亣鏃ュ姞鐝垂
       jiejiariCell := LocalCell_Default::GetCell(  rowKey + column6.Name(), cellIndexTree, cells, row, column6 );
       jiejiarifeiCell := LocalCell_Default::GetCell(  rowKey + column10.Name(), cellIndexTree, cells, row, column10 );
-      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,jiejiariCell.RealValue()));
+      jiejiarifeiCell.RealValue( EmployeeCost::GetSalary( unit,holidayMultiplier,jiejiariCell.RealValue()));
       
+      // 浼戞伅鏃ュ姞鐝垂
       xiuxiCell := LocalCell_Default::GetCell(  rowKey + column5.Name(), cellIndexTree, cells, row, column5 );
       xiuxifeiCell := LocalCell_Default::GetCell(  rowKey + column9.Name(), cellIndexTree, cells, row, column9 );
       xiuxifeiCell.RealValue( EmployeeCost::GetSalary( unit,breakDayMultiplier,xiuxiCell.RealValue()));
       
+      // 骞虫椂鍔犵彮璐�
       jiabanCell := LocalCell_Default::GetCell(  rowKey + column4.Name(), cellIndexTree, cells, row, column4 );
       jiabanfeiCell := LocalCell_Default::GetCell(  rowKey + column8.Name(), cellIndexTree, cells, row, column8 );
-      jiabanfeiCell.RealValue( EmployeeCost::GetSalary( unit,holidayMultiplier,jiabanCell.RealValue()));
+      jiabanfeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier ,jiabanCell.RealValue()));
       
+      // 娆犲伐璐�
       qiangongCell := LocalCell_Default::GetCell(  rowKey + column7.Name(), cellIndexTree, cells, row, column7 );
-      qiangongCell.RealValue( qiangongCell.RealValue() - 1 );
+      qiangongCell.RealValue( qiangongCell.RealValue() - 8 );
       
       qiangongfeiCell := LocalCell_Default::GetCell(  rowKey + column11.Name(), cellIndexTree, cells, row, column11 );
-      qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,defaultMultiplier,qiangongCell.RealValue() ));
+      qiangongfeiCell.RealValue( EmployeeCost::GetSalary( unit,qiangongMultiplier,qiangongCell.RealValue() ));
       
       
       // 宸ヤ綔鏃�
       workingDayCell := LocalCell_Default::GetCell(  rowKey + column3.Name(), cellIndexTree, cells, row, column3 );
-      workingDayCell.RealValue( workingDayCell.RealValue() + 1 );
+      workingDayCell.RealValue( workingDayCell.RealValue() );
     }
     
     return table;
diff --git a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl
index 6d6bf49..f774c24 100644
--- a/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl
+++ b/_Main/BL/Type_LocalCell_DemandComparison/StaticMethod_Compared.qbl
@@ -2,6 +2,7 @@
 #parent: #root
 StaticMethod Compared (
   RecycleBin recycleBin,
+  const MacroPlan mactoPlan,
   String baseVersionPath,
   String compareVersionPath,
   String baseVersionName,
@@ -12,6 +13,17 @@
   [*
     // rislai Jun-20-2024 (created)
     localTable := recycleBin.LocalTable( relnew,Name := baseVersionName + "__" + compareVersionName );
+    
+    products := selectset( mactoPlan,Product_MP,product,not product.IsSystem() and product.IsUsed() );
+    productIndexTree := NamedValueTree::Create();
+    try{
+      for( i := 0; i < products.Size(); i++){
+        product := products.Element( i );
+        productHandle := productIndexTree.GetHandle( product.Notes() );
+        productIndexTree.Root().AddChild( productHandle,i )
+      }
+    }onerror{}
+    
     
     baseVersionFile := OSFile::Construct();
     compareVersionFile := OSFile::Construct();
@@ -88,7 +100,17 @@
                              CompareVersionValue := ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()));
               column.IsAttrbuteColumn( true );
               if( columnName = "鍙戝姩鏈洪浂浠跺彿" ){
-                row.ProductID( ifexpr( isnull( baseVersionCell ), ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()), baseVersionCell.Value()) );
+                productID := ifexpr( isnull( baseVersionCell ), ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()), baseVersionCell.Value());
+                
+                productHanlde := productIndexTree.GetHandle( productID );
+                productIndex := guard( productIndexTree.Root().Child( productHanlde ), null( NamedValue ));
+                if( not isnull( productIndex )){
+                  product := products.Element( productIndex.GetValueAsNumber() );
+                  productID := product.ID();
+                }
+                
+                row.ProductID( productID );
+                
               }
               if( columnName = "杞﹀瀷" ){
                 row.CustomName( " > " + ifexpr( isnull( baseVersionCell ), ifexpr( isnull( compareVersionCell ),"绌�",compareVersionCell.Value()), baseVersionCell.Value()) );
diff --git a/_Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanMDSID.qbl b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanMDSID.qbl
new file mode 100644
index 0000000..992e017
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanMDSID.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MacroPlanMDSID
+{
+  #keys: '3[414996.1.124530070][414996.1.124530069][414996.1.124530071]'
+  ValueType: Key
+}
diff --git a/_Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanName.qbl b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanName.qbl
new file mode 100644
index 0000000..c4ade67
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_MacroPlanName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MacroPlanName
+{
+  #keys: '3[414996.1.124550976][414996.1.124550975][414996.1.124550977]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OfflinePlanTableInfo/Attribute_TableName.qbl b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_TableName.qbl
new file mode 100644
index 0000000..a5dd339
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_TableName.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TableName
+{
+  #keys: '3[414996.1.124530080][414996.1.124530079][414996.1.124530081]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_OfflinePlanTableInfo/Attribute_TableSaveTime.qbl b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_TableSaveTime.qbl
new file mode 100644
index 0000000..4a261cf
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTableInfo/Attribute_TableSaveTime.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute TableSaveTime
+{
+  #keys: '3[414996.1.124540172][414996.1.124540171][414996.1.124540173]'
+  ValueType: DateTime
+}
diff --git a/_Main/BL/Type_OfflinePlanTableInfo/StaticMethod_Create.qbl b/_Main/BL/Type_OfflinePlanTableInfo/StaticMethod_Create.qbl
new file mode 100644
index 0000000..419d238
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTableInfo/StaticMethod_Create.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod Create (
+  const constcontent MacroPlans macroPlans,
+  RecycleBin owner
+)
+{
+  TextBody:
+  [*
+    // Akari Oct-14-2024 (created)
+    owner.OfflinePlanTableInfo( relflush );
+    info( macroPlans.Size() );
+    traverse( macroPlans,Elements,macroPlan ){
+      mdsid := macroPlan.MDSID();
+      name := macroPlan.MDSMacroPlan().Description();
+      
+      traverse( macroPlan,OfflinePlanTable,offlinePlanTable ){
+        owner.OfflinePlanTableInfo( relnew,MacroPlanName := name,TableName := offlinePlanTable.SaveDateTime().Format( "Y-M2-D2 H:m:s" ),MacroPlanMDSID := mdsid ,TableSaveTime := offlinePlanTable.SaveDateTime());
+      }
+    }
+    info( owner.OfflinePlanTableInfo( relsize ) );
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanTableInfo/_ROOT_Type_OfflinePlanTableInfo.qbl b/_Main/BL/Type_OfflinePlanTableInfo/_ROOT_Type_OfflinePlanTableInfo.qbl
new file mode 100644
index 0000000..4e59627
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanTableInfo/_ROOT_Type_OfflinePlanTableInfo.qbl
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type OfflinePlanTableInfo
+{
+  #keys: '5[414996.1.124560137][414996.1.124560135][0.0.0][414996.1.124560136][414996.1.124560138]'
+  BaseType: Object
+  Description: '涓嬬嚎璁″垝瀵瑰簲鐨刴acroPlan淇℃伅'
+  StructuredName: 'OfflinePlanTableInfos'
+}
diff --git a/_Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl b/_Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl
index 39d85a3..bf28d76 100644
--- a/_Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl
+++ b/_Main/BL/Type_ProductionLineBatchData/Method_Enable.qbl
@@ -29,9 +29,9 @@
         
         tempPeriod_MPs := selectset( dayPeriod_MPs,Elements,period_MP,period_MP.StartDate() >= tempStartDate and period_MP.EndDate() <= tempEndDate );
         
-        unitPeriodTimes1 := selectset( this.Unit1(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()) and not isnull( unitPeriodTime.UnitAvailability()));
-        unitPeriodTimes2 := selectset( this.Unit2(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()) and not isnull( unitPeriodTime.UnitAvailability()));
-        unitPeriodTimes3 := selectset( this.Unit3(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()) and not isnull( unitPeriodTime.UnitAvailability()));
+        unitPeriodTimes1 := selectset( this.Unit1(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
+        unitPeriodTimes2 := selectset( this.Unit2(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
+        unitPeriodTimes3 := selectset( this.Unit3(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,exists( tempPeriod_MPs,Elements,period_MP,period_MP = unitPeriodTime.Period_MP()));
         if( unitPeriodTimes1.Size() > 0 ){
           this.OnOK( unitPeriodTimes1,shiftPattern1 ); 
         }
@@ -49,11 +49,17 @@
         shiftPattern3 := tempShiftPattern;
       }
     }
+    
+    // 杞崲鐝缂撳瓨
+    shiftPattern1 := this.ShiftPattern1();
+    shiftPattern2 := this.ShiftPattern2();
+    shiftPattern3 := this.ShiftPattern3();
+    tempShiftPattern := shiftPattern1;
     if( weekPeriod_MPs.Size() <> 0 ){
       traverse( weekPeriod_MPs,Elements,period_MP ){
-        unitPeriodTimes1 := selectset( this.Unit1(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP() and not isnull( unitPeriodTime.UnitAvailability()));
-        unitPeriodTimes2 := selectset( this.Unit2(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP() and not isnull( unitPeriodTime.UnitAvailability()));
-        unitPeriodTimes3 := selectset( this.Unit3(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP() and not isnull( unitPeriodTime.UnitAvailability()));
+        unitPeriodTimes1 := selectset( this.Unit1(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP());
+        unitPeriodTimes2 := selectset( this.Unit2(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP());
+        unitPeriodTimes3 := selectset( this.Unit3(),UnitPeriod.astype( UnitPeriodTime ),unitPeriodTime,period_MP = unitPeriodTime.Period_MP());
         
         if( unitPeriodTimes1.Size() > 0 ){
           this.OnOK( unitPeriodTimes1,shiftPattern1 ); 
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def
index a6f622c..a9e718b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageReport.def
@@ -26,16 +26,6 @@
         Taborder: 2
       ]
     }
-    Component dhMDSHandles
-    {
-      #keys: '[414996.1.116451655]'
-      BaseType: 'WebDataHolder'
-      Databinding: 'structured[internal[ExternalMDSHandle]]*'
-      Properties:
-      [
-        Taborder: 3
-      ]
-    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlanByMDSID.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlanByMDSID.def
new file mode 100644
index 0000000..5dd44f2
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlanByMDSID.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+#parent: #root
+Method GetMacroPlanByMDSID (
+  OfflinePlanTableInfo offlinePlanInfo
+) as MacroPlan id:Method_ApplicationMacroPlanner_GetMacroPlanByMDSID
+{
+  #keys: '[414996.1.122222878]'
+  Body:
+  [*
+    componentmds := ApplicationScope.ComponentMDS();
+    
+    demandMacroPlan := null( MacroPlan );
+    
+    if( exists( ScenarioManager,ScenarioMP,scemp,scemp.IsLoaded() and scemp.DatasetMDSID() = offlinePlanInfo.MacroPlanMDSID() )){
+      mdsinstance     := select( componentmds, ComponentMDSKinds.ComponentMDSInstances, m, m.MDSID().MDSKey() = offlinePlanInfo.MacroPlanMDSID() );
+      handle          := mdsinstance.GetMDSHandle();
+      demandMacroPlan := handle.AsMacroPlan();
+    }else{
+      error( "MacroPlan[ " + offlinePlanInfo.MacroPlanName() + "] is not load." );
+    }
+    
+    return demandMacroPlan;
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def
index a6154d6..695b69b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Method_GetMacroPlans.def
@@ -7,14 +7,13 @@
   [*
     componentmds := ApplicationScope.ComponentMDS();
     
-    dhMDSHandles.Data().Flush();
     
     macroPlans := construct( MacroPlans );
     scemps := selectset( ScenarioManager,ScenarioMP,mp,mp.IsLoaded());
     traverse( scemps,Elements,scemp ){
       mdsinstance     := select( componentmds, ComponentMDSKinds.ComponentMDSInstances, m, m.MDSID().MDSKey() = scemp.DatasetMDSID() );
       handle          := mdsinstance.GetMDSHandle();
-      dhMDSHandles.Data().Add( handle );
+    
       demandMacroPlan := handle.AsMacroPlan();
       macroPlans.Add( demandMacroPlan );
     }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_PanelRibbon504\043801.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_PanelRibbon504\043801.def"
index 0b818cc..56e00de 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_PanelRibbon504\043801.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form701/Component_PanelRibbon504\043801.def"
@@ -9,7 +9,7 @@
     {
       #keys: '[412672.1.78210474]'
       BaseType: 'WebDropDownList'
-      Databinding: 'OfflinePlanTable'
+      Databinding: 'OfflinePlanTableInfo'
       Children:
       [
         Component DataExtractorRibbon
@@ -18,7 +18,7 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'structured[OfflinePlanTable]'
+            DataType: 'structured[OfflinePlanTableInfo]'
             Source: 'dhOfflinePlanTables'
             Taborder: 0
             Transformation: 'Elements'
@@ -27,7 +27,7 @@
       ]
       Properties:
       [
-        DisplayField: 'SaveDateTime'
+        DisplayField: 'TableName'
         Label: '鍩哄噯涓嬬嚎璁″垝:'
         Taborder: 0
       ]
@@ -46,7 +46,7 @@
     {
       #keys: '[412672.1.78210579]'
       BaseType: 'WebDropDownList'
-      Databinding: 'OfflinePlanTable'
+      Databinding: 'OfflinePlanTableInfo'
       Children:
       [
         Component DataExtractorRibbon300
@@ -55,7 +55,7 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'structured[OfflinePlanTable]'
+            DataType: 'structured[OfflinePlanTableInfo]'
             Source: 'dhOfflinePlanTables'
             Taborder: 0
             Transformation: 'Elements'
@@ -64,7 +64,7 @@
       ]
       Properties:
       [
-        DisplayField: 'SaveDateTime'
+        DisplayField: 'TableName'
         Label: '瀵规瘮涓嬬嚎璁″垝:'
         Taborder: 1
       ]
@@ -73,10 +73,25 @@
     {
       #keys: '[414996.1.103241339]'
       BaseType: 'WebDataHolder'
-      Databinding: 'structured[OfflinePlanTable]*'
+      Databinding: 'structured[OfflinePlanTableInfo]*'
+      Children:
+      [
+        Component deOfflinePlanTables
+        {
+          #keys: '[414996.1.124700546]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'RecycleBin'
+            Source: 'RecycleBin'
+            Taborder: 0
+            Transformation: 'OfflinePlanTableInfo'
+          ]
+        }
+      ]
       Properties:
       [
-        Taborder: 3
+        Taborder: 4
       ]
     }
     Component bExport
@@ -86,7 +101,7 @@
       Properties:
       [
         Image: 'EXPORT1'
-        Taborder: 4
+        Taborder: 5
       ]
     }
     Component dhXMLDataListener
@@ -112,7 +127,16 @@
       ]
       Properties:
       [
-        Taborder: 5
+        Taborder: 6
+      ]
+    }
+    Component ButtonRibbon
+    {
+      #keys: '[414996.1.125429607]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Taborder: 3
       ]
     }
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_OnCreated.def
new file mode 100644
index 0000000..2054ef1
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_OnCreated.def
@@ -0,0 +1,12 @@
+Quintiq file version 2.0
+#parent: #root
+Response OnCreated () id:Response_FormOfflinePlanChanges_OnCreated
+{
+  #keys: '[414996.1.124740834]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  GroupServerCalls: true
+  QuillAction
+  {
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_ButtonRibbon_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_ButtonRibbon_OnClick.def
new file mode 100644
index 0000000..6488149
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_ButtonRibbon_OnClick.def
@@ -0,0 +1,17 @@
+Quintiq file version 2.0
+#parent: PanelRibbon504_801/ButtonRibbon
+Response OnClick () id:Response_PanelRibbon504_801_ButtonRibbon_OnClick
+{
+  #keys: '[414996.1.125429626]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  GroupServerCalls: true
+  QuillAction
+  {
+    Body:
+    [*
+      macroPlans := ApplicationMacroPlanner.GetMacroPlans();
+      OfflinePlanTableInfo::Create( macroPlans,RecycleBin );
+    *]
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_bComparison_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_bComparison_OnClick.def
index da3570f..292494e 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_bComparison_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_bComparison_OnClick.def
@@ -9,8 +9,13 @@
   {
     Body:
     [*
-      baseVersion := ddlBaseOfflinePlanTable.Data();
-      compareVersion := ddlCompareOfflinePlanTable.Data();
+      baseOfflineTableInfo := ddlBaseOfflinePlanTable.Data();
+      baseMacroPlan := ApplicationMacroPlanner.GetMacroPlanByMDSID( baseOfflineTableInfo );
+      baseVersion := select( baseMacroPlan ,OfflinePlanTable,table,table.SaveDateTime() = baseOfflineTableInfo.TableSaveTime() );
+      
+      compareOfflineTableInfo := ddlCompareOfflinePlanTable.Data();
+      compareMacroPlan := ApplicationMacroPlanner.GetMacroPlanByMDSID( compareOfflineTableInfo );
+      compareVersion := select( compareMacroPlan ,OfflinePlanTable,table,table.SaveDateTime() = compareOfflineTableInfo.TableSaveTime() );
       
       dhTable.Data( LocalCell_OfflinePlanComparison::Compared( RecycleBin,baseVersion,compareVersion ));
     *]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def" "b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def"
index 0df72f7..8844fc9 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_Form701/Response_PanelRibbon504_801_dhOfflinePlanTables_OnCreated\04357.def"
@@ -7,20 +7,6 @@
   DefinitionID: 'Responsedef_WebComponent_OnCreated'
   QuillAction
   {
-    Body:
-    [*
-      macroPlans := ApplicationMacroPlanner.GetMacroPlans();
-      offlinePlanTables := selectset( macroPlans,Elements.OfflinePlanTable,table,true );
-      traverse( macroPlans,Elements,element ){
-        info( element.MDSID() ); 
-      }
-      info( dhMDSHandles.Data().Size() );
-      traverse( dhMDSHandles.Data(),Elements,element ){
-        info( element.AsMacroPlan().MDSMacroPlan().Description() );
-      }
-      
-      this.Data( &offlinePlanTables );
-    *]
     GroupServerCalls: false
   }
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def
index 76c486e..d126b96 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormDemandComparison/Response_PanelOperation_568_ButtonCompare_OnClick.def
@@ -10,7 +10,7 @@
     Body:
     [*
       
-      table := LocalCell_DemandComparison::Compared( RecycleBin,dhBaseVersionPath.Data(),dhCompareVersionPath.Data(),lBaseVersionName.Text(),lCompareVersionName.Text() );
+      table := LocalCell_DemandComparison::Compared( RecycleBin,MacroPlan, dhBaseVersionPath.Data(),dhCompareVersionPath.Data(),lBaseVersionName.Text(),lCompareVersionName.Text() );
       dhComparisonData.Data( table );
     *]
     GroupServerCalls: false
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Component_ListSalesDemands.def b/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Component_ListSalesDemands.def
index 8fc3953..5fc2143 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Component_ListSalesDemands.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Component_ListSalesDemands.def
@@ -7,7 +7,7 @@
     {
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgNotLinkedToPeriod","title":"ImgNotLinkedToPeriod","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgNotLinkedToPeriod"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsPostponed","title":"ImgIsPostponed","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsPostponed"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPoint_MP.ID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPoint_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegment_MP.Name","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegment_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Product_MP.ID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Product_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Start","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasure_MP.Name","title":"Quantity UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"UnitOfMeasure_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Original Qty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NettedQuantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"NettedQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantity","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment Illustration","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfillment","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round(2)"}},{"name":"Unfulfilled demand","color":"rgb(232,123,0)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Unfulfilled demand","title":"Unfulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"maxvalue(object.NettedQuantity()-object.FulfilledQuantity(),0.0).Round(2)"}}]}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PriceUoM","title":"PriceUoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"PriceUoM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Priority.Name","title":"Priority","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Priority.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DemandUncertaintyPercentage","title":"Uncertainty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DemandUncertaintyPercentage"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Origin","title":"Origin","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Origin"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeAllConstraint","columnid":"All constraints","title":"All constraints","subtotals":"","tooltip":"","width":1,"display":"shown"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgNotLinkedToPeriod","title":"ImgNotLinkedToPeriod","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgNotLinkedToPeriod"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsPostponed","title":"ImgIsPostponed","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsPostponed"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockingPoint_MP.ID","title":"Stocking point","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"StockingPoint_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"SalesSegment_MP.Name","title":"Sales segment","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"SalesSegment_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Product_MP.ID","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Product_MP.ID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StartDate","title":"Start","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StartDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"EndDate","title":"End","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"EndDate"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"UnitOfMeasure_MP.Name","title":"Quantity UoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"UnitOfMeasure_MP.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Original Qty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"NettedQuantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"NettedQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"FulfilledQuantity","title":"Fulfilled","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"FulfilledQuantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeChart","columnid":"Fulfillment Illustration","title":"Fulfillment","subtotals":"","tooltip":"","width":-1,"display":"shown","type":"stackbar","relative":true,"attributes":[{"name":"Fulfilled demand","color":"rgb(87,184,71)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Fulfillment","title":"Fulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"object.FulfilledQuantity().Round(2)"}},{"name":"Unfulfilled demand","color":"rgb(232,123,0)","expression":{"classtype":"WebApiDefinitionAttributeExpression","columnid":"Unfulfilled demand","title":"Unfulfilled demand","subtotals":"","tooltip":"","width":-1,"display":"shown","expressionbody":"maxvalue(object.NettedQuantity()-object.FulfilledQuantity(),0.0).Round(2)"}}]}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Price","title":"Price","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Price"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"PriceUoM","title":"PriceUoM","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"PriceUoM"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Priority.Name","title":"Priority","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Priority.Name"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"DemandUncertaintyPercentage","title":"Uncertainty","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"DemandUncertaintyPercentage"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Origin","title":"Origin","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Origin"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Differnce","title":"Differnce","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Differnce"}}]'
       ]
     }
   ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Response_ListSalesDemands_MenuCreate_OnClick\043715.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Response_ListSalesDemands_MenuCreate_OnClick\043715.def"
index 7041dcb..4267aa8 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Response_ListSalesDemands_MenuCreate_OnClick\043715.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormForecasts/Response_ListSalesDemands_MenuCreate_OnClick\043715.def"
@@ -2,16 +2,4 @@
 #parent: ListSalesDemands
 Response OnClick () inherited id:Response_ListSalesDemands_MenuCreate_OnClick_715 #extension
 {
-  QuillAction #extension
-  {
-    Body:
-    [*
-      //Create new sales demand
-      dlg := construct( DialogCreateEditForecast );
-      dlg.New();
-      
-      dlg.bSplitUsingCurve().Visible( true );
-      dlg.PanelCurve().Visible( true );
-    *]
-  }
 }

--
Gitblit v1.9.3