From 0b84c9999f07bc46275f5947c4b8ebf5ce0c25cf Mon Sep 17 00:00:00 2001
From: 陈清红 <420599804@qq.com>
Date: 星期一, 14 四月 2025 15:51:58 +0800
Subject: [PATCH] BUG&优化项

---
 _Main/BL/Type_NewAssemblyOnlinePlanCell/StaticMethod_DetectingNegativeValues.qbl                                                              |   29 +
 _Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Response_PanelPeriod_71_bSynchronizeActualInventory_OnClick.def                |   18 
 _Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterfaceForSAPGet.qbl                                                                        |    6 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged#338.def                                        |   19 
 _Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_Publish.qbl                                                                              |   16 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_PanelScenarioSelection.def                                            |   14 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCreated.def                                                   |   28 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishSAP_mAPIMS64ProductRelation_OnClick.def |   16 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Component_lstRight590.def                                                              |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listContextMenu519.def                                            |   24 
 _Main/BL/Relations/Relation_APIRMS64ProductRelation_InterfaceDataset_InterfaceDataset_APIRMS64P.qbl                                           |   23 
 _Main/UI/MacroPlannerWebApp/Component_FormActualDailyProduction/Component_ListActualDailyProduction.def                                       |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormSAP_PIR/Response_List391_bPush_OnClick.def                                                          |    2 
 _Main/BL/Type_OfflinePlanArchiveVersionCell/StaticMethod_SynchronizeActualProduction.qbl                                                      |   51 +
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_MatrixEditorTable#384.def                                       |   20 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_bCreate_OnClick.def                                        |   18 
 _Main/UI/MacroPlannerWebApp/Component_FormInventoryPointSelection/Component_ListInventoryPointSelection.def                                   |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlRight#836.def                                                              |   25 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pHeader.def                                                       |   47 +
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def                                                                  |   10 
 _Main/BL/Type_NewOfflinePlanCell/StaticMethod_DetectingNegativeValues.qbl                                                                     |   31 +
 _Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelPeriod#71.def                                                   |   11 
 _Main/BL/Type_InventoryPlanArchiveRow/Method_SetQuantity.qbl                                                                                  |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/_ROOT_Component_FormAPIRMS64ProductRelation.def                             |   13 
 _Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_GenerateData.qbl                                                                         |    7 
 _Main/BL/Type_APIRMS64ProductRelation/_ROOT_Type_APIRMS64ProductRelation.qbl                                                                  |    9 
 _Main/BL/Type_InventoryPlanArchiveCell/StaticMethod_SynchronizeActualInventory.qbl                                                            |   51 +
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlContent.def                                                                |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_ddslProduct_OnCreated.def                                  |   18 
 _Main/BL/Type_InventoryInterfaceData/StaticMethod_UpdateInventoryQuantity.qbl                                                                 |   41 +
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pContent.def                                                      |   14 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Response_PanelPeriod_ButtonPeriod_OnClick.def                                    |   18 
 _Main/BL/Type_APIRMS64ProductRelation/Attribute_Factory.qbl                                                                                   |   13 
 _Main/BL/Type_InventoryPlanArchiveVersion/StaticMethod_GenerateData.qbl                                                                       |  134 +++-
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_pnlLeft_88_ddslFactory_OnSelectionChanged.def                                 |   28 +
 _Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bWriteBackTheTransferPlan_OnClick.def                                 |   22 
 _Main/BL/Dataset_InterfaceDataset/Daemon_ActualDailyProductionInterface.qbl                                                                   |    2 
 _Main/BL/Type_APIRMS64ProductRelation/Attribute_Product.qbl                                                                                   |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInventoryInterfaceData/Response_pHeader_bFilter_OnClick.def                                         |    3 
 _Main/BL/Type_TransferPlanCell/StaticMethod_WriteBackTheTransferPlan.qbl                                                                      |   52 +
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishSAP.def                                             |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_List920.def                                                       |   59 ++
 _Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelTable#881.def                                                   |   27 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_cmRight681#1.def                                                              |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_PanelTable#273.def                                              |   27 
 _Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Component_pHeader#136.def                                                     |   10 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelTable.def                                                         |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Component_pHeader.def                                                                |   10 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioSelection.def                                   |    8 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_abpRight481#1.def                                                             |   10 
 _Main/BL/Dataset_InterfaceDataset/Daemon_FinishedEngineInventoryInterface#0.qbl                                                               |    2 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listActionBarPage590.def                                          |   10 
 _Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl                                                                            |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_lstRight590_OnCreated.def                                                     |   28 +
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Method_OnOk.def                                                                         |    6 
 _Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_List920_mDelete_OnClick.def                                        |   18 
 _Main/UI/MacroPlannerWebApp/Views/APIMS64ProductRelation.vw                                                                                   |  307 ++++++++++
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_lstRight590#71.def                                                            |   44 +
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_pnlLeft_ddslFactory_OnSelectionChanged.def                                     |   30 +
 _Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Response_pHeader_136_bDetectingNegativeValues_OnClick#812.def                 |   18 
 _Main/BL/Type_AOnlineAndMOfflinePlanMS64/StaticMethod_GenerateData.qbl                                                                        |    8 
 _Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def                                    |    4 
 _Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelPeriod.def                                                        |   11 
 _Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_MatrixEditorTable#791.def                                            |   20 
 _Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl                                                                          |    2 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged.def                                            |   16 
 _Main/UI/MacroPlannerWebApp/Views/Inventory_plan_archive_report.vw                                                                            |   57 +
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Method_OnOk.def                                                                        |    3 
 _Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlLeft.def                                                                   |    1 
 _Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Response_pHeader_bDetectingNegativeValues_OnClick.def                                |   18 
 70 files changed, 1,552 insertions(+), 88 deletions(-)

diff --git a/_Main/BL/Dataset_InterfaceDataset/Daemon_ActualDailyProductionInterface.qbl b/_Main/BL/Dataset_InterfaceDataset/Daemon_ActualDailyProductionInterface.qbl
index ecc498d..accd1d8 100644
--- a/_Main/BL/Dataset_InterfaceDataset/Daemon_ActualDailyProductionInterface.qbl
+++ b/_Main/BL/Dataset_InterfaceDataset/Daemon_ActualDailyProductionInterface.qbl
@@ -5,7 +5,7 @@
   Frequency: P1DT0H0M0S
   Priority: 'Default'
   StartDate: 2020-01-01
-  StartTimeOfDay: P0DT10H0M0S
+  StartTimeOfDay: P0DT9H30M0S
   Text:
   [*
     options := DatasetFindOptions::Construct( 'InterfaceDataset' ).IncludeOffline( true ); //to load we must search offline datasets.
diff --git "a/_Main/BL/Dataset_InterfaceDataset/Daemon_FinishedEngineInventoryInterface\0430.qbl" "b/_Main/BL/Dataset_InterfaceDataset/Daemon_FinishedEngineInventoryInterface\0430.qbl"
index 60fb321..fe6de8e 100644
--- "a/_Main/BL/Dataset_InterfaceDataset/Daemon_FinishedEngineInventoryInterface\0430.qbl"
+++ "b/_Main/BL/Dataset_InterfaceDataset/Daemon_FinishedEngineInventoryInterface\0430.qbl"
@@ -5,7 +5,7 @@
   Frequency: P1DT0H0M0S
   Priority: 'Default'
   StartDate: 2024-07-19
-  StartTimeOfDay: P0DT10H0M0S
+  StartTimeOfDay: P0DT9H30M0S
   Text:
   [*
     options := DatasetFindOptions::Construct( 'InterfaceDataset' ).IncludeOffline( true ); //to load we must search offline datasets.
diff --git a/_Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl b/_Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl
index 7f710f2..a89df67 100644
--- a/_Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl
+++ b/_Main/BL/Dataset_InterfaceDataset/Daemon_MachineStockInterface.qbl
@@ -5,7 +5,7 @@
   Frequency: P1DT0H0M0S
   Priority: 'Default'
   StartDate: 2024-07-19
-  StartTimeOfDay: P0DT10H0M0S
+  StartTimeOfDay: P0DT9H30M0S
   Text:
   [*
     options := DatasetFindOptions::Construct( 'InterfaceDataset' ).IncludeOffline( true ); //to load we must search offline datasets.
diff --git a/_Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl b/_Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl
index a2bfd9f..1992c36 100644
--- a/_Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl
+++ b/_Main/BL/Dataset_InterfaceDataset/Daemon_ShippingActualInterface.qbl
@@ -5,7 +5,7 @@
   Frequency: P1DT0H0M0S
   Priority: 'Default'
   StartDate: 2024-07-19
-  StartTimeOfDay: P0DT10H0M0S
+  StartTimeOfDay: P0DT9H30M0S
   Text:
   [*
     options := DatasetFindOptions::Construct( 'InterfaceDataset' ).IncludeOffline( true ); //to load we must search offline datasets.
diff --git a/_Main/BL/Relations/Relation_APIRMS64ProductRelation_InterfaceDataset_InterfaceDataset_APIRMS64P.qbl b/_Main/BL/Relations/Relation_APIRMS64ProductRelation_InterfaceDataset_InterfaceDataset_APIRMS64P.qbl
new file mode 100644
index 0000000..9749331
--- /dev/null
+++ b/_Main/BL/Relations/Relation_APIRMS64ProductRelation_InterfaceDataset_InterfaceDataset_APIRMS64P.qbl
@@ -0,0 +1,23 @@
+Quintiq file version 2.0
+#parent: #root
+Relation APIRMS64ProductRelation_InterfaceDataset_InterfaceDataset_APIRMS64ProductRelation
+{
+  #keys: '1[730572.0.162835510]'
+  DefaultRelationStrategy
+  {
+  }
+  RelationSide.LeftSide InterfaceDataset
+  {
+    #keys: '3[730572.0.162835512][730572.0.162835511][730572.0.162835513]'
+    Cardinality: '0to1'
+    ObjectDefinition: APIRMS64ProductRelation
+    OwningSide: 'Reference'
+  }
+  RelationSide.RightSide APIRMS64ProductRelation
+  {
+    #keys: '3[730572.0.162835515][730572.0.162835514][730572.0.162835516]'
+    Cardinality: '1toN'
+    ObjectDefinition: InterfaceDataset
+    OwningSide: 'Owned'
+  }
+}
diff --git a/_Main/BL/Type_AOnlineAndMOfflinePlanMS64/StaticMethod_GenerateData.qbl b/_Main/BL/Type_AOnlineAndMOfflinePlanMS64/StaticMethod_GenerateData.qbl
index 9c1fd0a..5e661f1 100644
--- a/_Main/BL/Type_AOnlineAndMOfflinePlanMS64/StaticMethod_GenerateData.qbl
+++ b/_Main/BL/Type_AOnlineAndMOfflinePlanMS64/StaticMethod_GenerateData.qbl
@@ -41,11 +41,13 @@
                                                                 , VersionTo := versionto, IsActive := versionflag );
     loginfo.AOnlineAndMOfflinePlanMS64( relinsert, ms64 );
     traverse( products, Elements, product, product.IsLeaf() ){
+      productID := ifexpr( product.ParentID() = "MLB" or product.ParentID() = "MQB", product.Notes(), product.ID() );
+      //productID := ifexpr( product.Notes().TrimBoth() <> "", product.Notes(), product.ID() );
       if( werk = 'All' ){
-        ms64.MS64Data( relnew, Product := product.ID(), Werk := '8200' );
-        ms64.MS64Data( relnew, Product := product.ID(), Werk := '8201' );
+        ms64.MS64Data( relnew, Product := productID, Werk := '8200' );
+        ms64.MS64Data( relnew, Product := productID, Werk := '8201' );
       }else{
-        ms64.MS64Data( relnew, Product := product.ID(), Werk := ms64.Werk() );
+        ms64.MS64Data( relnew, Product := productID, Werk := ms64.Werk() );
       }
       
     }
diff --git a/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_GenerateData.qbl b/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_GenerateData.qbl
index e9ed573..8b2192b 100644
--- a/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_GenerateData.qbl
+++ b/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_GenerateData.qbl
@@ -9,7 +9,8 @@
   Date enddate,
   String executor,
   String feedback,
-  Boolean isPush
+  Boolean isPush,
+  Product_MPs products
 ) as InterfaceLoginfo
 {
   TextBody:
@@ -60,7 +61,7 @@
     traverse( owner, OfflinePlanArchiveVersion, table, not table.IsShow() ){
       traverse( table, Column, column, column.StartDate() >= startdate and column.StartDate() <= enddate ){//column.TimeUnit() = Translations::MP_GlobalParameters_Day() and 
         traverse( column, Cell, cell, ( werk = 'All' or cell.Row().Unit().FindString( werk, 0 ) > -1 )
-                  and ( cell.Row().ProductionLine() <> 'DL_MOMO' or cell.Row().ProductionLine() <> 'CC_MOMO' ) ){
+                  and ( cell.Row().ProductionLine() <> 'DL MoMo' and cell.Row().ProductionLine() <> 'CC MoMo' and cell.Row().ProductionLine() <> 'DL ZKM' ) ){
           row              := cell.Row();
           rowwerk          := ifexpr( row.ProductionLine().FindString( "CC", 0 ) > -1, AOnlineAndMOfflinePlanPIR::GetWerk( FinancialProductionReport::GetDefaultCCUnit() ), AOnlineAndMOfflinePlanPIR::GetWerk( FinancialProductionReport::GetDefaultDLUnit() ) );
           if( not exists( productids, Elements, e, e = row.ProductID() ) ){
@@ -94,7 +95,7 @@
     loginfo.TotalRow( pir.PIRData( relsize ) );
     
     if ( isPush ) {
-      feedback             := AOnlineAndMOfflinePlanPIR::Publish( owner, loginfo );
+      feedback             := AOnlineAndMOfflinePlanPIR::Publish( owner, loginfo, products );
     }
     
     return loginfo;
diff --git a/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_Publish.qbl b/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_Publish.qbl
index 1703e66..d5d2b37 100644
--- a/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_Publish.qbl
+++ b/_Main/BL/Type_AOnlineAndMOfflinePlanPIR/StaticMethod_Publish.qbl
@@ -2,7 +2,8 @@
 #parent: #root
 StaticMethod Publish (
   InterfaceDataset owner,
-  InterfaceLoginfo loginfo
+  InterfaceLoginfo loginfo,
+  Product_MPs products
 ) as String
 {
   TextBody:
@@ -12,7 +13,8 @@
     
     traverse( loginfo, AOnlineAndMOfflinePlanPIR, pir ){
       jsonarray        := JSON::Array();//.Add( "dto", JSON::Object().Add( "dday", date.Format( "Y-M2-D2" ) ).Add( "fac", "" ) ).Build();
-      traverse( pir, PIRData, pirdata ){
+      traverse( pir, PIRData, pirdata, exists( products, Elements, tempP, 
+                                               ifexpr( tempP.ParentID() = "MLB" or tempP.ParentID() = "MQB", tempP.Notes(), tempP.ID() ) = pirdata.Product() ) ){
         pirjson        := JSON::Object().Add( "product", pirdata.Product() )
                                         .Add( "planningDate", pirdata.PlanningDate().Format( 'YM2D2' ) )//"2024-10-01" )
                                         .Add( "planningQty", pirdata.PlanningQty() )
@@ -27,10 +29,16 @@
       .Add( 'dataList', jsonarray );
     }
     
-    loginfo.RequestBody( jsondata.Build().AsString() );
-    //info( loginfo.RequestBody() );
+    // 璁剧疆璇锋眰浣�
+    requestBody := jsondata.Build().AsString();
+    loginfo.RequestBody( requestBody );
+    
+    info( loginfo.RequestBody() );
     data              := InterfaceLoginfo::CallInterfaceForSAPGet( owner, loginfo );
+    
     //info( '----------------', data );
+    //data := "Test";
+    
     return data;
   *]
 }
diff --git a/_Main/BL/Type_APIRMS64ProductRelation/Attribute_Factory.qbl b/_Main/BL/Type_APIRMS64ProductRelation/Attribute_Factory.qbl
new file mode 100644
index 0000000..38903e0
--- /dev/null
+++ b/_Main/BL/Type_APIRMS64ProductRelation/Attribute_Factory.qbl
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Factory
+{
+  #keys: '3[730572.0.162836302][730572.0.162836301][730572.0.162836303]'
+  Description:
+  [*
+    宸ュ巶
+    VWED CC
+    VWED DL
+  *]
+  ValueType: String
+}
diff --git a/_Main/BL/Type_APIRMS64ProductRelation/Attribute_Product.qbl b/_Main/BL/Type_APIRMS64ProductRelation/Attribute_Product.qbl
new file mode 100644
index 0000000..efad231
--- /dev/null
+++ b/_Main/BL/Type_APIRMS64ProductRelation/Attribute_Product.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Product
+{
+  #keys: '3[730572.0.162836325][730572.0.162836324][730572.0.162836326]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_APIRMS64ProductRelation/_ROOT_Type_APIRMS64ProductRelation.qbl b/_Main/BL/Type_APIRMS64ProductRelation/_ROOT_Type_APIRMS64ProductRelation.qbl
new file mode 100644
index 0000000..4b8360f
--- /dev/null
+++ b/_Main/BL/Type_APIRMS64ProductRelation/_ROOT_Type_APIRMS64ProductRelation.qbl
@@ -0,0 +1,9 @@
+Quintiq file version 2.0
+#root
+#parent: #DomainModel
+Type APIRMS64ProductRelation
+{
+  #keys: '5[730572.0.162835490][730572.0.162835488][0.0.0][730572.0.162835489][730572.0.162835491]'
+  BaseType: Object
+  StructuredName: 'APIRMS64ProductRelations'
+}
diff --git a/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterfaceForSAPGet.qbl b/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterfaceForSAPGet.qbl
index 26a316c..9147f1f 100644
--- a/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterfaceForSAPGet.qbl
+++ b/_Main/BL/Type_InterfaceLoginfo/StaticMethod_CallInterfaceForSAPGet.qbl
@@ -10,9 +10,9 @@
   [*
     // 鐢勫叞楦� Jul-22-2024 (created)
     address           := Translations::InterfaceDataset_SAP_Address(); 
-    httpinterface     := HTTPInterface::Create( address,8080); // 娴嬭瘯
+    //httpinterface     := HTTPInterface::Create( address,8080); // 娴嬭瘯
     
-    //httpinterface     := HTTPInterface::Create( "10.120.76.32",8080); // 鐢熶骇
+    httpinterface     := HTTPInterface::Create( "10.120.76.32",8080); // 鐢熶骇
     
     httpinterface.PostMethod( true ); ; 
     httpinterface.MediaType( Translations::InterfaceDataset_ContentType() );
@@ -69,7 +69,7 @@
           feedback   := feedback.Concat( '浜у搧' ).Concat( failproduct.Concatenate( '銆�' ) ).Concat( '鍥犱负' ).Concat( failmsg ).Concat( '鎺ㄩ�佸け璐�' ).Concat( '锛�' );
         }
       }
-      feedback       := feedback.Replace( feedback.Length() - 1, 1, '銆�' );
+    //  feedback       := feedback.Replace( feedback.Length() - 1, 1, '銆�' ); // 杩欒鎶ラ敊
     }
     
     return feedback;
diff --git a/_Main/BL/Type_InventoryInterfaceData/StaticMethod_UpdateInventoryQuantity.qbl b/_Main/BL/Type_InventoryInterfaceData/StaticMethod_UpdateInventoryQuantity.qbl
new file mode 100644
index 0000000..87736e3
--- /dev/null
+++ b/_Main/BL/Type_InventoryInterfaceData/StaticMethod_UpdateInventoryQuantity.qbl
@@ -0,0 +1,41 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod UpdateInventoryQuantity (
+  InterfaceDataset interfaceDataset,
+  Date startDate,
+  Date endDate
+)
+{
+  TextBody:
+  [*
+    if ( ( endDate - startDate ) <= 10 ) {
+      while ( startDate <= endDate ) {
+        feis := selectset( interfaceDataset, InterfaceLoginfo.FinishedEngineInventory, tempFEI, tempFEI.DDay() = startDate );
+      
+        msds := selectset( interfaceDataset, InterfaceLoginfo.MachineStockData, tempMSD, tempMSD.DDay() = startDate );
+      
+        iids := selectset( interfaceDataset, InventoryInterfaceData, tempIID, tempIID.Date() = startDate );
+        traverse ( iids, Elements, iid ) {
+          traverse ( iid, InventoryInterfaceDataDetail, iidd ) {
+            iidd.Quantity( sum( feis, Elements, tempFEI, 
+                                tempFEI.DDay()     = iidd.Date()           and
+                                tempFEI.FourCode() = iidd.PartNumber()     and
+                                tempFEI.BIPlace()  = iidd.InventoryPoint() and
+                                tempFEI.Fac()      = iidd.Fac(),
+                                tempFEI.Total() ) );
+          
+            total := sum( msds, Elements, tempMSD, 
+                          tempMSD.DDay()     = iidd.Date()         and
+                          tempMSD.MaterialNo() = iidd.PartNumber() and
+                          tempMSD.Lgort()  = iidd.InventoryPoint() and
+                          tempMSD.Fac()      = iidd.Fac(),
+                          tempMSD.Total() );
+            iidd.Quantity( ifexpr( total > 0, total, iidd.Quantity() ) );
+          }
+        }
+        
+        startDate := startDate + 1;
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_InventoryPlanArchiveCell/StaticMethod_SynchronizeActualInventory.qbl b/_Main/BL/Type_InventoryPlanArchiveCell/StaticMethod_SynchronizeActualInventory.qbl
new file mode 100644
index 0000000..d9aef53
--- /dev/null
+++ b/_Main/BL/Type_InventoryPlanArchiveCell/StaticMethod_SynchronizeActualInventory.qbl
@@ -0,0 +1,51 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeActualInventory (
+  InterfaceDataset interfaceDataset,
+  Archive archive
+)
+{
+  TextBody:
+  [*
+    //opv := select( interfaceDataset, InventoryPlanArchiveVersion, tempOPAV, not tempOPAV.IsShow() );
+    //
+    //mindate := minselect( opv, Column, tempC, true, tempC.StartDate() ).StartDate();
+    //maxdate := maxselect( opv, Column, tempC, true, tempC.StartDate() ).StartDate();
+    //
+    ////info( "鏈�灏忔椂闂达細", mindate.Format( "Y-M2-D2" ), "    鏈�澶ф椂闂达細", maxdate.Format( "Y-M2-D2" ) );
+    //
+    //adpds := selectsortedset( archive, ActualDailyProductionData, tempADPD, 
+    //                          tempADPD.ProductionDate() >= mindate and 
+    //                          tempADPD.ProductionDate() <= maxdate, 
+    //                          tempADPD.ProductionDate() );
+    //
+    ////info( "瀹為檯鐢熶骇鐨勪釜鏁帮細", adpds.Size() );
+    //
+    //products := construct( Strings );
+    //
+    //traverse ( adpds, Elements, adpd
+    ////           ,( adpd.Fac() + " " + adpd.LineName() + "_" + adpd.ProductNo() ) = "CC MoMo_6909" and adpd.ProductionDate() = Date::Construct( 2025, 4, 1 )
+    //            ) {
+    ////  info( "宸ュ巶锛�", adpd.Fac(), "    浜у搧锛�", adpd.ProductNo(), "    浜х嚎锛�", adpd.LineName() );
+    //  
+    //  // 浜х嚎澶勭悊
+    //  productLine := adpd.Fac() + " " + adpd.LineName() + "_" + adpd.ProductNo();
+    //  
+    ////  info( "name锛�", productLine, "    鐢熸垚鏃ユ湡锛�", adpd.ProductionDate().Format( "Y-M2-D2" ), "    鏁伴噺锛�", adpd.ActualOut() );
+    //  
+    //  row  := select( opv, Row, tempR, tempR.ShowName().TrimBoth() = productLine.TrimBoth() );
+    //  cell := select( row, Cell, tempC, tempC.Column().StartDate() = adpd.ProductionDate() );
+    //  
+    //  // 娓�0閲嶆柊璧嬪��
+    //  if ( not isnull( cell ) and not exists( products, Elements, p, p = cell.Key().AsQUILL() ) ) {
+    //    cell.ActualProductionQty( 0 );
+    //  
+    //    products.Add( cell.Key().AsQUILL() );
+    //  }
+    //  
+    //  if ( not isnull( cell ) ) {
+    //    cell.ActualProductionQty( cell.ActualProductionQty() + adpd.ActualOut() );
+    //  }
+    //}
+  *]
+}
diff --git a/_Main/BL/Type_InventoryPlanArchiveRow/Method_SetQuantity.qbl b/_Main/BL/Type_InventoryPlanArchiveRow/Method_SetQuantity.qbl
index 8fad06d..193e0db 100644
--- a/_Main/BL/Type_InventoryPlanArchiveRow/Method_SetQuantity.qbl
+++ b/_Main/BL/Type_InventoryPlanArchiveRow/Method_SetQuantity.qbl
@@ -3,7 +3,8 @@
 Method SetQuantity (
   InventoryPlanArchiveColumn column,
   Real planqty,
-  Real actualaty
+  Real actualaty,
+  NamedValueTree resetNVT
 )
 {
   TextBody:
@@ -15,7 +16,16 @@
     
       column.Cell( relinsert, cell );
     }
+    
+    // 鍒ゆ柇鏄惁閲嶇疆涓�0
+    resetH := resetNVT.GetHandle( this.ShowName() + column.StartDate().Format( "Y-M2-D2" ) );
+    if ( guard( isnull( resetNVT.Root().Child( resetH ) ), true ) ) {
+      cell.PlanQuantity( 0 );
+      
+      resetNVT.Root().AddChild( resetH );
+    }
+    
     cell.PlanQuantity( cell.PlanQuantity() + planqty );
-    cell.ActualQuantity( cell.ActualQuantity() + actualaty );
+    cell.ActualQuantity( actualaty );
   *]
 }
diff --git a/_Main/BL/Type_InventoryPlanArchiveVersion/StaticMethod_GenerateData.qbl b/_Main/BL/Type_InventoryPlanArchiveVersion/StaticMethod_GenerateData.qbl
index c3446fa..510f0a4 100644
--- a/_Main/BL/Type_InventoryPlanArchiveVersion/StaticMethod_GenerateData.qbl
+++ b/_Main/BL/Type_InventoryPlanArchiveVersion/StaticMethod_GenerateData.qbl
@@ -9,63 +9,125 @@
   TextBody:
   [*
     //interfaceDataset.InventoryPlanArchiveVersion( relflush );
-    info( '-------------------------Start---------------------');
-    machineproductparent   := MachiningPipelineReport::GetDefaultProductParent();
-    engineproductparent    := EnginePipelineReport::GetDefaultProductParent();
-    allunit                := AssemblyOnlinePlanVersion::GetDefaultAllUnit();
-    name                   := InventoryPlanArchiveVersion::GetDefaultName();//search                 := 
-    interfaceDataset.InventoryPlanArchiveVersionSearch( relnew, Product := allunit, Unit := allunit, StartDate := Date::MinDate(), EndDate := Date::MaxDate() );//, TimeUnit := Translations::MP_GlobalParameters_Day()
+    info( '-------------------------Start---------------------' );
+    //machineproductparent   := MachiningPipelineReport::GetDefaultProductParent(); // 鏈哄姞浠�
+    //engineproductparent    := EnginePipelineReport::GetDefaultProductParent(); // 鍙戝姩鏈�
+    allunit                := AssemblyOnlinePlanVersion::GetDefaultAllUnit(); // <All>
+    name                   := InventoryPlanArchiveVersion::GetDefaultName(); // Inventory plan archive 
+    interfaceDataset.InventoryPlanArchiveVersionSearch( relnew, 
+                                                        Product   := allunit, 
+                                                        Unit      := allunit, 
+                                                        StartDate := Date::MinDate(), 
+                                                        EndDate   := Date::MaxDate() );//, TimeUnit := Translations::MP_GlobalParameters_Day()
+    
+    // 鍒涘缓鏄剧ず琛ㄦ牸
     table                  := selectobject( interfaceDataset, InventoryPlanArchiveVersion, version, not version.IsShow() );
     if( isnull( table ) ){
       table                := interfaceDataset.InventoryPlanArchiveVersion( relnew, ID := name, Name := name );
     }
+    
     //showtable              := selectobject( interfaceDataset, InventoryPlanArchiveVersion, version, version.IsShow() );
     //if( isnull( showtable ) ){ 
     //  showtable               := interfaceDataset.InventoryPlanArchiveVersion( relnew, ID := name, Name := name, IsShow := true );
     //}
+    
+    // 鍒涘缓涓嶅瓨鍦ㄥ垪
     periods                := selectuniquevalues(  macroPlan, Period_MP, period, not period.IsHistorical() and period.TimeUnit() = Translations::MP_GlobalParameters_Day()
                                                    and not exists( table, Column, column, column.StartDate() = period.StartDate() ), period.StartDate() );//column.TimeUnit() = Translations::MP_GlobalParameters_Day() and 
     if( periods.Size() > 0 ){
       table.GenerateColumn( periods, false );
     }
+    
+    // 鏈�灏忔椂闂�
+    minDate := minselect( table, Column, tempC, true, tempC.StartDate() ).StartDate();
+    maxDate := maxselect( table, Column, tempC, true, tempC.StartDate() ).StartDate();
+    info( "鏈�灏忔椂闂达細", minDate.Format( "Y-M2-D2" ), "    鏈�澶ф椂闂达細", maxDate.Format( "Y-M2-D2" ) );
+    
     actinventorytree       := NamedValueTree::Create();
-    inventoryqrys          := construct( Reals );
-    inventoryindex         := 0;
-    traverse( interfaceDataset,InterfaceLoginfo.MachineStockData, actinventory ){
-      inventoryqrys.Add( actinventory.Total() );
-      actinventoryKey      := actinventory.MaterialNo() + actinventory.DDay().AsQUILL();
+    // 鏈哄姞瀹為檯搴撳瓨
+    traverse ( interfaceDataset,InterfaceLoginfo.MachineStockData, actinventory, 
+    //           actinventory.Fac() = "CC" and actinventory.MaterialNo() = "06U105101A" and actinventory.DDay() = Date::Construct( 2025, 4, 9 ) and// 娴嬭瘯杩囨护锛堢敓浜ч渶瑕佹敞閲婏級
+               actinventory.DDay() >= minDate and actinventory.DDay() <= maxDate ) {
+      // 搴撲綅鏄惁缁戝畾搴撳瓨鐐�
+      iid  := select( interfaceDataset, InventoryInterfaceData, tempIID, tempIID.Date() = actinventory.DDay()             and 
+                                                                         tempIID.PartNumber() = actinventory.MaterialNo() );
+      iidd := select( iid, InventoryInterfaceDataDetail, tempIIDD, tempIIDD.InventoryPoint() = actinventory.Lgort() and
+                                                                   tempIIDD.Fac()            = actinventory.Fac() );
+      flag := guard( iidd.InventoryPointSelection().IsIncluded(), false );
+    //  info( "鏄惁琚簱瀛樼偣閫夋嫨锛�", flag,  "    鏁伴噺锛�", actinventory.Total() );
+      actinventoryKey      := ifexpr( actinventory.Fac() = "DL", FinancialProductionReport::GetDefaultDLUnit(), FinancialProductionReport::GetDefaultCCUnit() ) +
+                              actinventory.MaterialNo()                                                                                                         + 
+                              actinventory.DDay().Format( "Y-M2-D2" );
       actinventoryhandle   := actinventorytree.GetHandle( actinventoryKey );
-      actinventorytree.Root().AddChild( actinventoryhandle,inventoryindex ); 
-      inventoryindex       := inventoryindex + 1;
-    }
-    traverse( interfaceDataset,InterfaceLoginfo.FinishedEngineInventory,actinventory ){
-      product               := selectobject( macroPlan, Product_MP, product, product.Notes() = actinventory.FourCode() );
-      if( not isnull( product ) ){
-        inventoryqrys.Add( actinventory.Total() );
-        actinventoryKey     := actinventory.FourCode() + actinventory.DDay().AsQUILL();
-        actinventoryhandle  := actinventorytree.GetHandle( actinventoryKey );
-        actinventorytree.Root().AddChild( actinventoryhandle,inventoryindex ); 
-        inventoryindex      := inventoryindex + 1;
+      if ( guard( actinventorytree.Root().Child( actinventoryhandle ).GetValueAsReal() > 0, false ) ) { // 鍒ゆ柇鏄惁瀛樺湪锛屽瓨鍦�
+        if ( flag ) {
+          targetNV := actinventorytree.Root().Child( actinventoryhandle );
+          targetNV.SetValue( targetNV.GetValueAsReal() + actinventory.Total() );
+        }
+      } else { // 涓嶅瓨鍦�
+        if ( flag ) {
+          actinventorytree.Root().AddChild( actinventoryhandle, actinventory.Total() );
+        }
       }
     }
-    traverse( macroPlan, Product_MP, product, exists( product.GetAllParent(), Elements, e, e.ID() = machineproductparent or e.ID() = engineproductparent ) ){ 
+    // 鍙戝姩鏈哄疄闄呭簱瀛�
+    traverse ( interfaceDataset, InterfaceLoginfo.FinishedEngineInventory, actinventory, 
+    //           actinventory.Fac() = "CC" and actinventory.FourCode() = "6908" and actinventory.DDay() = Date::Construct( 2025, 4, 2 ) and// 娴嬭瘯杩囨护锛堢敓浜ч渶瑕佹敞閲婏級
+               actinventory.DDay() >= minDate and actinventory.DDay() <= maxDate ) {
+      // 搴撲綅鏄惁缁戝畾搴撳瓨鐐�
+      iid  := select( interfaceDataset, InventoryInterfaceData, tempIID, tempIID.Date() = actinventory.DDay()           and 
+                                                                         tempIID.PartNumber() = actinventory.FourCode() );
+      iidd := select( iid, InventoryInterfaceDataDetail, tempIIDD, tempIIDD.InventoryPoint() = actinventory.BIPlace() and
+                                                                   tempIIDD.Fac()            = actinventory.Fac() );
+      flag := guard( iidd.InventoryPointSelection().IsIncluded(), false );
+      
+      product               := selectobject( macroPlan, Product_MP, product, product.ID() = actinventory.FourCode() );
+      if ( not isnull( product ) ) {
+        actinventoryKey     := ifexpr( actinventory.Fac() = "DL", FinancialProductionReport::GetDefaultDLUnit(), FinancialProductionReport::GetDefaultCCUnit() ) +
+                               actinventory.FourCode() + 
+                               actinventory.DDay().Format( "Y-M2-D2" );
+        actinventoryhandle  := actinventorytree.GetHandle( actinventoryKey );
+        if ( guard( actinventorytree.Root().Child( actinventoryhandle ).GetValueAsReal() > 0, false ) ) { // 鍒ゆ柇鏄惁瀛樺湪锛屽瓨鍦�
+          if ( flag ) {
+            targetNV := actinventorytree.Root().Child( actinventoryhandle );
+            targetNV.SetValue( targetNV.GetValueAsReal() + actinventory.Total() );
+          }
+        } else { // 涓嶅瓨鍦�
+          if ( flag ) {
+            actinventorytree.Root().AddChild( actinventoryhandle, actinventory.Total() );
+          }
+        }
+      }
+    }
+    
+    //handle := actinventorytree.GetHandle( "VWED CC06U105101A2025-04-09" );
+    //info( "鏁伴噺锛�", guard( actinventorytree.Root().Child( handle ).GetValueAsReal(), 0 ) );
+    
+    // 淇濆瓨宸查噸缃�0鐨勪骇鍝�
+    resetNVT := NamedValueTree::Create();
+    
+    traverse ( macroPlan, Product_MP, product
+    //           ,product.ID() = "6909" 
+              ) { 
       traverse ( product, ProductInStockingPoint_MP, pispmp, not pispmp.IsSystem() and pispmp.IsLeaf() ) {
-        unit                 := ifexpr( pispmp.StockingPointID().Regex( "澶ц繛" ) or pispmp.StockingPointID().Regex( "DL" ), FinancialProductionReport::GetDefaultDLUnit(), FinancialProductionReport::GetDefaultCCUnit() );
-        inventoryrow         := table.GetRowByUnit( pispmp.Product_MP(), unit );
-        traverse ( pispmp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispippl, not pispippl.IsPeriodFrozen() ) {
+        unit                 := ifexpr( pispmp.StockingPointID().Regex( "澶ц繛" ) or pispmp.StockingPointID().Regex( "DL" ), 
+                                        FinancialProductionReport::GetDefaultDLUnit(), 
+                                        FinancialProductionReport::GetDefaultCCUnit() ); // 宸ュ巶
+        inventoryrow         := table.GetRowByUnit( pispmp.Product_MP(), unit ); // 鍒涘缓搴撳瓨瀛樻。琛�
+    //    info( pispmp.Name() );
+        
+        traverse ( pispmp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), pispippl, 
+    //               pispmp.ProductID() = "6909" and pispippl.Start().Date() = Date::Construct( 2025, 3, 31 ) and // 娴嬭瘯杩囨护锛堢敓浜ч渶瑕佹敞閲婏級
+                   not pispippl.IsPeriodFrozen() ) {
           startdate          := pispippl.Start().Date();
-          daycolumn          := table.GetColumnByTimeUnit( Translations::MP_GlobalParameters_Day(), startdate );
+          daycolumn          := table.GetColumnByTimeUnit( Translations::MP_GlobalParameters_Day(), startdate ); // 鑾峰彇搴撳瓨瀛樻。鍒�
     //      weekcolumn         := table.GetColumnByTimeUnit( Translations::MP_GlobalParameters_Week(), startdate );
     //      monthcolumn        := table.GetColumnByTimeUnit( Translations::MP_GlobalParameters_Month(), startdate );
-          actinventoryKey    := pispmp.ProductID() + startdate.AsQUILL();
+          actinventoryKey    := unit + pispmp.ProductID() + startdate.Format( "Y-M2-D2" );
           actinventoryhandle := actinventorytree.GetHandle( actinventoryKey );
-          actinventoryindex  := guard( actinventorytree.Root().Child( actinventoryhandle ),null( NamedValue ));
-          
-          actinventoryqty    := 0.0;
-          if( not isnull( actinventoryindex )){
-            actinventoryqty  := inventoryqrys.Element( actinventoryindex.GetValueAsNumber() );
-          }
-          inventoryrow.SetQuantity( daycolumn, pispippl.InventoryLevelEnd(), actinventoryqty );
+          actinventoryQty    := guard( actinventorytree.Root().Child( actinventoryhandle ).GetValueAsReal(), 0 );
+    //      info( "鏁伴噺锛�", actinventoryQty );
+          inventoryrow.SetQuantity( daycolumn, pispippl.InventoryLevelEnd(), actinventoryQty, resetNVT );
     //      inventoryrow.SetQuantity( weekcolumn, pispippl.InventoryLevelEnd(), actinventoryqty );
     //      inventoryrow.SetQuantity( monthcolumn, pispippl.InventoryLevelEnd(), actinventoryqty );
       
@@ -73,7 +135,7 @@
       }
     }
     
-    info( '-------------------------End---------------------');
+    info( '-------------------------End---------------------' );
     //productids             := selectuniquevalues( table, Row, row, row.Name() );
     //productlines           := selectuniquevalues( table, Row, row, row.Unit() );
     //showtable.Generate( search, productids, productlines );
diff --git a/_Main/BL/Type_NewAssemblyOnlinePlanCell/StaticMethod_DetectingNegativeValues.qbl b/_Main/BL/Type_NewAssemblyOnlinePlanCell/StaticMethod_DetectingNegativeValues.qbl
new file mode 100644
index 0000000..7d050a3
--- /dev/null
+++ b/_Main/BL/Type_NewAssemblyOnlinePlanCell/StaticMethod_DetectingNegativeValues.qbl
@@ -0,0 +1,29 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DetectingNegativeValues (
+  MacroPlan macroPlan
+) as String
+{
+  Description: '妫�娴嬭礋鍊�'
+  TextBody:
+  [*
+    res  := "";
+    
+    // 寰幆閬嶅巻鏄庣粏鏁版嵁
+    traverse ( macroPlan, NewAssemblyOnlinePlanRow, naopr, naopr.Type() = "1" ) {
+      traverse ( naopr, NewAssemblyOnlinePlanCell, naopcell, naopcell.Quantity() < 0 ) {
+        res := res      +
+               "浜х嚎锛�" + naopr.ProductionLine()                                                 + " " +
+               "浜у搧锛�" + naopr.ProductID()                                                      + " " +
+               "鏃堕棿锛�" + naopcell.NewAssemblyOnlinePlanColumn().StartDate().Format( "Y-M2-D2" ) + " " +
+               "鏁伴噺锛�" + [String]naopcell.Quantity()                                            + "\n";
+      }
+    }
+    
+    if ( res = "" ) {
+      res := "鏆傛湭鍑虹幇璐熷��";
+    }
+    
+    return res;
+  *]
+}
diff --git a/_Main/BL/Type_NewOfflinePlanCell/StaticMethod_DetectingNegativeValues.qbl b/_Main/BL/Type_NewOfflinePlanCell/StaticMethod_DetectingNegativeValues.qbl
new file mode 100644
index 0000000..2e1a735
--- /dev/null
+++ b/_Main/BL/Type_NewOfflinePlanCell/StaticMethod_DetectingNegativeValues.qbl
@@ -0,0 +1,31 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod DetectingNegativeValues (
+  MacroPlan macroPlan
+) as String
+{
+  Description: '妫�娴嬭礋鍊�'
+  TextBody:
+  [*
+    nopt := maxselect( macroPlan, NewOfflinePlanTable, tempOPT, true, tempOPT.SaveDateTime() );
+    
+    res  := "";
+    
+    // 寰幆閬嶅巻鏄庣粏鏁版嵁
+    traverse ( nopt, NewOfflinePlanRow, npr, npr.Type() = "1" ) {
+      traverse ( npr, NewOfflinePlanCell, npcell, npcell.Quantity() < 0 ) {
+        res := res      +
+               "浜х嚎锛�" + npr.ProductionLine()                                          + " " +
+               "浜у搧锛�" + npr.ProductID()                                               + " " +
+               "鏃堕棿锛�" + npcell.NewOfflinePlanColumn().StartDate().Format( "Y-M2-D2" ) + " " +
+               "鏁伴噺锛�" + [String]npcell.Quantity()                                     + "\n";
+      }
+    }
+    
+    if ( res = "" ) {
+      res := "鏆傛湭鍑虹幇璐熷��";
+    }
+    
+    return res;
+  *]
+}
diff --git a/_Main/BL/Type_OfflinePlanArchiveVersionCell/StaticMethod_SynchronizeActualProduction.qbl b/_Main/BL/Type_OfflinePlanArchiveVersionCell/StaticMethod_SynchronizeActualProduction.qbl
new file mode 100644
index 0000000..47b85b0
--- /dev/null
+++ b/_Main/BL/Type_OfflinePlanArchiveVersionCell/StaticMethod_SynchronizeActualProduction.qbl
@@ -0,0 +1,51 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod SynchronizeActualProduction (
+  InterfaceDataset interfaceDataset,
+  Archive archive
+)
+{
+  TextBody:
+  [*
+    opv := select( interfaceDataset, OfflinePlanArchiveVersion, tempOPAV, not tempOPAV.IsShow() );
+    
+    mindate := minselect( opv, Column, tempC, true, tempC.StartDate() ).StartDate();
+    maxdate := maxselect( opv, Column, tempC, true, tempC.StartDate() ).StartDate();
+    
+    //info( "鏈�灏忔椂闂达細", mindate.Format( "Y-M2-D2" ), "    鏈�澶ф椂闂达細", maxdate.Format( "Y-M2-D2" ) );
+    
+    adpds := selectsortedset( archive, ActualDailyProductionData, tempADPD, 
+                              tempADPD.ProductionDate() >= mindate and 
+                              tempADPD.ProductionDate() <= maxdate, 
+                              tempADPD.ProductionDate() );
+    
+    //info( "瀹為檯鐢熶骇鐨勪釜鏁帮細", adpds.Size() );
+    
+    products := construct( Strings );
+    
+    traverse ( adpds, Elements, adpd
+    //           ,( adpd.Fac() + " " + adpd.LineName() + "_" + adpd.ProductNo() ) = "CC MoMo_6909" and adpd.ProductionDate() = Date::Construct( 2025, 4, 1 )
+                ) {
+    //  info( "宸ュ巶锛�", adpd.Fac(), "    浜у搧锛�", adpd.ProductNo(), "    浜х嚎锛�", adpd.LineName() );
+      
+      // 浜х嚎澶勭悊
+      productLine := adpd.Fac() + " " + adpd.LineName() + "_" + adpd.ProductNo();
+      
+    //  info( "name锛�", productLine, "    鐢熸垚鏃ユ湡锛�", adpd.ProductionDate().Format( "Y-M2-D2" ), "    鏁伴噺锛�", adpd.ActualOut() );
+      
+      row  := select( opv, Row, tempR, tempR.ShowName().TrimBoth() = productLine.TrimBoth() );
+      cell := select( row, Cell, tempC, tempC.Column().StartDate() = adpd.ProductionDate() );
+      
+      // 娓�0閲嶆柊璧嬪��
+      if ( not isnull( cell ) and not exists( products, Elements, p, p = cell.Key().AsQUILL() ) ) {
+        cell.ActualProductionQty( 0 );
+      
+        products.Add( cell.Key().AsQUILL() );
+      }
+      
+      if ( not isnull( cell ) ) {
+        cell.ActualProductionQty( cell.ActualProductionQty() + adpd.ActualOut() );
+      }
+    }
+  *]
+}
diff --git a/_Main/BL/Type_TransferPlanCell/StaticMethod_WriteBackTheTransferPlan.qbl b/_Main/BL/Type_TransferPlanCell/StaticMethod_WriteBackTheTransferPlan.qbl
new file mode 100644
index 0000000..cccb0bb
--- /dev/null
+++ b/_Main/BL/Type_TransferPlanCell/StaticMethod_WriteBackTheTransferPlan.qbl
@@ -0,0 +1,52 @@
+Quintiq file version 2.0
+#parent: #root
+StaticMethod WriteBackTheTransferPlan (
+  MacroPlan macroPlan,
+  Product_MPs selectedProducts
+)
+{
+  TextBody:
+  [*
+    traverse ( selectedProducts, Elements, p, p.IsLeaf() and exists( macroPlan, TransferPlanRow, tempTPR, tempTPR.ProductID() = p.ID() ) ) {
+      tprs := selectset( macroPlan, TransferPlanRow, tempTPR, tempTPR.ProductID() = p.ID() );
+      
+      traverse ( tprs, Elements, tpr ) {
+        tpcells := selectsortedset( tpr, TransferPlanCell, tempTPCell, guard( [Number]tempTPCell.Value(), 0 ) >= 0.0, tempTPCell.TransferPlanColumn().ColumnDate() );
+        traverse ( tpcells, Elements, tpcell
+    //               , tpcell.TransferPlanColumn().ColumnDate() = Date::Construct( 2025, 1, 11 )
+                    ) {
+    //      info( "鏃堕棿锛�", tpcell.TransferPlanColumn().ColumnName(),                                                                 "    ", 
+    //            tpcell.TransferPlanRow().SourceStockpoingPointID() + "  To  " + tpcell.TransferPlanRow().TargetStockpoingPointID(), "    ",
+    //            tpcell.Value() );
+        
+          // selecte trip plan
+          unitName := tpcell.TransferPlanRow().SourceStockpoingPointID() + " " + "to" + " " + tpcell.TransferPlanRow().TargetStockpoingPointID() + " " + tpcell.TransferPlanRow().Category() + " " + "Transport"
+          pit      := select( macroPlan, Unit.Lane.LaneLeg.Trip.ProductInTrip, tempPIT, 
+                              tempPIT.Trip().Departure().Date()             = tpcell.TransferPlanColumn().ColumnDate() and
+                              tempPIT.Trip().LaneLeg().Lane().Unit().Name() = unitName                                 and
+                              tempPIT.ProductID()                           = tpr.ProductID()
+                             );
+          if ( not isnull( pit ) ) { // 鏈塗rip鎯呭喌
+    //        info( pit.Quantity() );
+            if ( [Number]pit.Quantity() <> [Number]tpcell.Value() ) {
+              pit.Update( [Real]tpcell.Value(), true );
+            }
+          } else { // 鏃燭rip鎯呭喌
+    //        error( "no trip" );
+    //        info( tpr.ProductID(), "    鏁伴噺锛�", [Number]tpcell.Value() );
+    //        
+    //        t := select( macroPlan, Unit.Lane.LaneLeg.Trip, tempP, 
+    //                     tempP.LaneLeg().Lane().Unit().Name() = unitName and
+    //                     tempP.Departure().Date()             = tpcell.TransferPlanColumn().ColumnDate() );
+    //        p := select( macroPlan, Product_MP, tempPMP, tempPMP.ID() = tpr.ProductID() );
+    //        info( not isnull( t ) );
+    //        if ( [Number]tpcell.Value() > 0 and not isnull( t ) and not isnull( p ) ) {
+    //          ProductInTrip::CreateOrUpdateForTrip( t, p, [Real]tpcell.Value() );
+    //          Transaction::Transaction().PropagateAll();
+    //        }
+          }
+        }
+      }
+    }
+  *]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioSelection.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioSelection.def
new file mode 100644
index 0000000..c8a46d0
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarGroupScenarioSelection.def
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+Component ActionBarGroupScenarioSelection #extension
+{
+  Children:
+  [
+    #child: PanelScenarioSelection
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def
index 024119c..18ff83a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ActionBarPageScenarioSelection.def
@@ -1,6 +1,10 @@
 Quintiq file version 2.0
 Component ActionBarPageScenarioSelection #extension
 {
+  Children:
+  [
+    #child: ActionBarGroupScenarioSelection
+  ]
   Properties:
   [
     Taborder: 22
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishSAP.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishSAP.def
index 87434ae..b2c6de5 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishSAP.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_ContextMenuPublishSAP.def
@@ -25,6 +25,16 @@
         Title: 'SAP MS64'
       ]
     }
+    Component mAPIMS64ProductRelation
+    {
+      #keys: '[730572.0.167360055]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Taborder: 2
+        Title: '宸ュ巶浜у搧瀵瑰簲鍏崇郴'
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_PanelScenarioSelection.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_PanelScenarioSelection.def
new file mode 100644
index 0000000..4df0cd4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Component_PanelScenarioSelection.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component PanelScenarioSelection #extension
+{
+  Children:
+  [
+    Component DropDownListScenario id:DropDownListScenario_886 #extension
+    {
+      Properties:
+      [
+        NumberOfColumns: 40
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishSAP_mAPIMS64ProductRelation_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishSAP_mAPIMS64ProductRelation_OnClick.def
new file mode 100644
index 0000000..e5dbfe4
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_ApplicationMacroPlanner/Response_MacroPlanner_ContextMenuPublishSAP_mAPIMS64ProductRelation_OnClick.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: ContextMenuPublishSAP/mAPIMS64ProductRelation
+Response OnClick () id:Response_MacroPlanner_ContextMenuPublishSAP_mAPIMS64ProductRelation_OnClick
+{
+  #keys: '[730572.0.167360231]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebMenu_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      ApplicationScope.ViewManager().ResetUserViewById( "APIMS64ProductRelation", true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Component_lstRight590.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Component_lstRight590.def
index 375b58a..85538ec 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Component_lstRight590.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Component_lstRight590.def
@@ -11,7 +11,7 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'external[MacroPlan]'
+        DataType: 'MacroPlan'
         Source: 'MacroPlan'
         Taborder: 0
         Transformation: 'Product_MP'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Method_OnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Method_OnOk.def
index 28ea388..704d831 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Method_OnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Method_OnOk.def
@@ -16,7 +16,8 @@
       if( sucproduct.Size() = loginfo.SAPResponseLoginfo( relsize ) ){
         WebMessageBox::Success( ApplicationMacroPlanner, '鎺ㄩ�佹垚鍔�' );
       }else{
-        WebMessageBox::Warning( ApplicationMacroPlanner, msg, 'Yes|No' );
+    //    WebMessageBox::Warning( ApplicationMacroPlanner, msg, 'Yes|No' );
+        WebMessageBox::Success( ApplicationMacroPlanner, Translations::A_VWED_Success() );
       }
     }
     Form.Close();
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_lstRight590_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_lstRight590_OnCreated.def
new file mode 100644
index 0000000..c6cda36
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_lstRight590_OnCreated.def
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: lstRight590
+Response OnCreated () id:Response_lstRight590_OnCreated
+{
+  #keys: '[730572.0.167230490]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      this.CheckAll();
+      
+      apims64pr := selectset( InterfaceDataset, APIRMS64ProductRelation, tempAPIMS64PR, 
+                              ifexpr( ddslFactory.Text() = "All", true, tempAPIMS64PR.Factory() = ddslFactory.Text() ) );
+                              
+      pmps := selectset( MacroPlan, Product_MP, tempPMP,
+                         tempPMP.IsLeaf() and
+                         not exists( apims64pr, Elements, tempAPIMS64PR, tempAPIMS64PR.Product() = tempPMP.ID() )
+                        );
+      
+      traverse ( pmps, Elements, pmp ) {
+        this.UnCheckByKey( pmp.Key() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_pnlLeft_88_ddslFactory_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_pnlLeft_88_ddslFactory_OnSelectionChanged.def
new file mode 100644
index 0000000..008d7b9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSMS64/Response_pnlLeft_88_ddslFactory_OnSelectionChanged.def
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: pnlLeft_88/ddslFactory
+Response OnSelectionChanged () id:Response_pnlLeft_88_ddslFactory_OnSelectionChanged
+{
+  #keys: '[730572.0.167230570]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      lstRight590.CheckAll();
+      
+      apims64pr := selectset( InterfaceDataset, APIRMS64ProductRelation, tempAPIMS64PR, 
+                              ifexpr( this.Text() = "All", true, tempAPIMS64PR.Factory() = this.Text() ) );
+                              
+      pmps := selectset( MacroPlan, Product_MP, tempPMP,
+                         tempPMP.IsLeaf() and
+                         not exists( apims64pr, Elements, tempAPIMS64PR, tempAPIMS64PR.Product() = tempPMP.ID() )
+                        );
+      
+      traverse ( pmps, Elements, pmp ) {
+        lstRight590.UnCheckByKey( pmp.Key() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_abpRight481\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_abpRight481\0431.def"
new file mode 100644
index 0000000..d47c1b4
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_abpRight481\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component abpRight481 id:abpRight481_1
+{
+  #keys: '[730572.0.145570670]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_cmRight681\0431.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_cmRight681\0431.def"
new file mode 100644
index 0000000..d2cc0e4
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_cmRight681\0431.def"
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component cmRight681 id:cmRight681_1
+{
+  #keys: '[730572.0.145570672]'
+  BaseType: 'listContextMenu'
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_lstRight590\04371.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_lstRight590\04371.def"
new file mode 100644
index 0000000..f794292
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_lstRight590\04371.def"
@@ -0,0 +1,44 @@
+Quintiq file version 2.0
+Component lstRight590 id:lstRight590_71
+{
+  #keys: '[730572.0.145570668]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component deRight862
+    {
+      #keys: '[730572.0.145570669]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'MacroPlan'
+        Source: 'MacroPlan'
+        Taborder: 0
+        Transformation: 'Product_MP'
+      ]
+    }
+    #child: abpRight481_1
+    Component dslRight661
+    {
+      #keys: '[730572.0.145570671]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: cmRight681_1
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ID","title":"ID","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ID"}}]'
+        ContextMenu: 'cmRight681'
+        FixedFilter: "object.IsLeaf() and object.ParentID() <> '绱х己浠�'"
+        SortCriteria: 'ID'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    SelectionCheckboxes: true
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlContent.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlContent.def
index f1a2cd6..9aab117 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlContent.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlContent.def
@@ -6,9 +6,11 @@
   Children:
   [
     #child: pnlLeft
+    #child: pnlRight_836
   ]
   Properties:
   [
+    Orientation: 'horizontal'
     Padding: 'true'
     Taborder: 0
   ]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlLeft.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlLeft.def
index 68c7490..7767ba2 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlLeft.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlLeft.def
@@ -50,6 +50,7 @@
   ]
   Properties:
   [
+    Border: true
     Taborder: 0
   ]
 }
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlRight\043836.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlRight\043836.def"
new file mode 100644
index 0000000..afeba25
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Component_pnlRight\043836.def"
@@ -0,0 +1,25 @@
+Quintiq file version 2.0
+Component pnlRight id:pnlRight_836
+{
+  #keys: '[730572.0.145570666]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component dhProducts
+    {
+      #keys: '[730572.0.145570667]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[Product_MP]*'
+      Properties:
+      [
+        Taborder: 0
+      ]
+    }
+    #child: lstRight590_71
+  ]
+  Properties:
+  [
+    Taborder: 1
+    Title: '浜у搧'
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Method_OnOk.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Method_OnOk.def
index 659b1a1..181cb35 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Method_OnOk.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Method_OnOk.def
@@ -16,12 +16,14 @@
                                                                dsEndDate.Date(), 
                                                                QuintiqUser::CurrentUser().DisplayName(), 
                                                                msg,
-                                                               InterfaceDataset.IsPushSAP_PIR() );
+                                                               InterfaceDataset.IsPushSAP_PIR(),
+                                                               dhProducts.Data() );
       sucproduct   := selectuniquevalues( loginfo, SAPResponseLoginfo, e, e.IsSuccess(), e.Msg_v1() );
       if( sucproduct.Size() = loginfo.SAPResponseLoginfo( relsize ) ){
         WebMessageBox::Success( ApplicationMacroPlanner, '鎺ㄩ�佹垚鍔�' );
       }else{
-        WebMessageBox::Warning( ApplicationMacroPlanner, msg, 'Yes|No' );
+    //    WebMessageBox::Warning( ApplicationMacroPlanner, msg, 'Yes|No' );
+        WebMessageBox::Success( ApplicationMacroPlanner, Translations::A_VWED_Success() );
       }
     }
     Form.Close();
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged\043338.def" "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged\043338.def"
new file mode 100644
index 0000000..a7c60a9
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged\043338.def"
@@ -0,0 +1,19 @@
+Quintiq file version 2.0
+#parent: lstRight590_71
+Response OnCheckedChanged (
+  structured[Product_MP] checkeditems
+) id:Response_lstRight590_71_OnCheckedChanged_338
+{
+  #keys: '[730572.0.145570662]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnCheckedChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      products := checkeditems.Copy();
+      dhProducts.Data( &products );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged.def
new file mode 100644
index 0000000..2327d59
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCheckedChanged.def
@@ -0,0 +1,16 @@
+Quintiq file version 2.0
+#parent: lstRight590_71
+Response OnCheckedChanged () id:Response_lstRight590_71_OnCheckedChanged
+{
+  #keys: '[730572.0.145570663]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebList_OnCheckedChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      dhProducts.Data().Flush();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCreated.def
new file mode 100644
index 0000000..18fbe6d
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_lstRight590_71_OnCreated.def
@@ -0,0 +1,28 @@
+Quintiq file version 2.0
+#parent: lstRight590_71
+Response OnCreated () id:Response_lstRight590_71_OnCreated
+{
+  #keys: '[730572.0.166121446]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      this.CheckAll();
+      
+      apims64pr := selectset( InterfaceDataset, APIRMS64ProductRelation, tempAPIMS64PR, 
+                              ifexpr( ddslFactory.Text() = "All", true, tempAPIMS64PR.Factory() = ddslFactory.Text() ) );
+                              
+      pmps := selectset( MacroPlan, Product_MP, tempPMP,
+                         tempPMP.IsLeaf() and
+                         not exists( apims64pr, Elements, tempAPIMS64PR, tempAPIMS64PR.Product() = tempPMP.ID() )
+                        );
+      
+      traverse ( pmps, Elements, pmp ) {
+        this.UnCheckByKey( pmp.Key() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_pnlLeft_ddslFactory_OnSelectionChanged.def b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_pnlLeft_ddslFactory_OnSelectionChanged.def
new file mode 100644
index 0000000..d5a2d35
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_DialogZEDPPSPIR/Response_pnlLeft_ddslFactory_OnSelectionChanged.def
@@ -0,0 +1,30 @@
+Quintiq file version 2.0
+#parent: pnlLeft/ddslFactory_424
+Response OnSelectionChanged () id:Response_pnlLeft_ddslFactory_OnSelectionChanged
+{
+  #keys: '[730572.0.167280424]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebDropDownStringList_OnSelectionChanged'
+  QuillAction
+  {
+    Body:
+    [*
+      lstRight590.CheckAll();
+      
+      apims64pr := selectset( InterfaceDataset, APIRMS64ProductRelation, tempAPIMS64PR, 
+                              ifexpr( this.Text() = "All", true, tempAPIMS64PR.Factory() = this.Text() ) );
+                              
+      pmps := selectset( MacroPlan, Product_MP, tempPMP,
+                         tempPMP.IsLeaf() and
+                         not exists( apims64pr, Elements, tempAPIMS64PR, tempAPIMS64PR.Product() = tempPMP.ID() )
+                        );
+      
+      //info( pmps.Size() );
+      
+      traverse ( pmps, Elements, pmp ) {
+        lstRight590.UnCheckByKey( pmp.Key() );
+      }
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_List920.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_List920.def
new file mode 100644
index 0000000..bda7a09
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_List920.def
@@ -0,0 +1,59 @@
+Quintiq file version 2.0
+Component List920
+{
+  #keys: '[730572.0.166102291]'
+  BaseType: 'WebList'
+  Children:
+  [
+    Component DataExtractor376
+    {
+      #keys: '[730572.0.166102292]'
+      BaseType: 'WebDataExtractor'
+      Properties:
+      [
+        DataType: 'InterfaceDataset'
+        Source: 'InterfaceDataset'
+        Taborder: 0
+        Transformation: 'APIRMS64ProductRelation'
+      ]
+    }
+    #child: listActionBarPage590
+    Component DataSetLevel195
+    {
+      #keys: '[730572.0.166102297]'
+      BaseType: 'WebDataSetLevel'
+      Children:
+      [
+        #child: listContextMenu519
+      ]
+      Properties:
+      [
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Factory","title":"Factory","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Factory"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Product","title":"Product","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Product"}}]'
+        ContextMenu: 'listContextMenu519'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+  ResponseDefinitions:
+  [
+    DelegatedResponseDefinition OnClick id:Responsedef_List920_WebMenu_OnClick
+    {
+      #keys: '[730572.0.167350332]'
+      Initiator: 'WebMenu'
+      IsInherited: false
+      ResponseType: 'OnClick'
+      Arguments:
+      [
+        ResponseDefinitionArgument selection
+        {
+          #keys: '[207.0.11974633]'
+          Binding: 'this.Selection()'
+        }
+      ]
+    }
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listActionBarPage590.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listActionBarPage590.def
new file mode 100644
index 0000000..2536bc6
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listActionBarPage590.def
@@ -0,0 +1,10 @@
+Quintiq file version 2.0
+Component listActionBarPage590
+{
+  #keys: '[730572.0.166102294]'
+  BaseType: 'listActionBarPage'
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listContextMenu519.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listContextMenu519.def
new file mode 100644
index 0000000..a08b591
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_listContextMenu519.def
@@ -0,0 +1,24 @@
+Quintiq file version 2.0
+Component listContextMenu519
+{
+  #keys: '[730572.0.166102299]'
+  BaseType: 'listContextMenu'
+  Children:
+  [
+    Component mDelete
+    {
+      #keys: '[730572.0.167350446]'
+      BaseType: 'WebMenu'
+      Properties:
+      [
+        Image: 'DELETE'
+        Taborder: 3
+        Title: 'Delete'
+      ]
+    }
+  ]
+  Properties:
+  [
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pContent.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pContent.def
new file mode 100644
index 0000000..fcb87cc
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pContent.def
@@ -0,0 +1,14 @@
+Quintiq file version 2.0
+Component pContent
+{
+  #keys: '[730572.0.166102177]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    #child: List920
+  ]
+  Properties:
+  [
+    Taborder: 1
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pHeader.def
new file mode 100644
index 0000000..316e7d7
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Component_pHeader.def
@@ -0,0 +1,47 @@
+Quintiq file version 2.0
+Component pHeader
+{
+  #keys: '[730572.0.166102162]'
+  BaseType: 'WebPanel'
+  Children:
+  [
+    Component ddslFactory
+    {
+      #keys: '[730572.0.166102447]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '宸ュ巶'
+        Strings: 'VWED CC;VWED DL'
+        Taborder: 0
+      ]
+    }
+    Component ddslProduct
+    {
+      #keys: '[730572.0.166102507]'
+      BaseType: 'WebDropDownStringList'
+      Properties:
+      [
+        Label: '浜у搧'
+        Taborder: 1
+      ]
+    }
+    Component bCreate
+    {
+      #keys: '[730572.0.167350289]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ADD2'
+        Taborder: 2
+      ]
+    }
+  ]
+  Properties:
+  [
+    Border: true
+    FixedSize: true
+    Orientation: 'horizontal'
+    Taborder: 0
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_List920_mDelete_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_List920_mDelete_OnClick.def
new file mode 100644
index 0000000..4377551
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_List920_mDelete_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: List920
+Response OnClick (
+  APIRMS64ProductRelation selection
+) id:Response_List920_mDelete_OnClick
+{
+  #keys: '[730572.0.167350349]'
+  DefinitionID => /List920/Responsedef_List920_WebMenu_OnClick
+  Initiator: 'mDelete'
+  QuillAction
+  {
+    Body:
+    [*
+      selection.Delete();
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_bCreate_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_bCreate_OnClick.def
new file mode 100644
index 0000000..a41b389
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_bCreate_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pHeader/bCreate
+Response OnClick () id:Response_pHeader_bCreate_OnClick
+{
+  #keys: '[730572.0.167350572]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      InterfaceDataset.APIRMS64ProductRelation( relnew, 
+                                                Factory := ddslFactory.Text(),
+                                                Product := ddslProduct.Text() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_ddslProduct_OnCreated.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_ddslProduct_OnCreated.def
new file mode 100644
index 0000000..d7b04fb
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/Response_pHeader_ddslProduct_OnCreated.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pHeader/ddslProduct
+Response OnCreated () id:Response_pHeader_ddslProduct_OnCreated
+{
+  #keys: '[730572.0.167390234]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebComponent_OnCreated'
+  QuillAction
+  {
+    Body:
+    [*
+      ids := selectuniquevalues( MacroPlan, Product_MP, tempPMP, tempPMP.IsLeaf(), tempPMP.ID() );
+      
+      this.Strings( ids.Concatenate( ";" ) );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/_ROOT_Component_FormAPIRMS64ProductRelation.def b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/_ROOT_Component_FormAPIRMS64ProductRelation.def
new file mode 100644
index 0000000..8b92b1c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormAPIRMS64ProductRelation/_ROOT_Component_FormAPIRMS64ProductRelation.def
@@ -0,0 +1,13 @@
+Quintiq file version 2.0
+#root
+#parent: MacroPlannerWebApp
+OrphanComponent FormAPIRMS64ProductRelation
+{
+  #keys: '[730572.0.166101908]'
+  BaseType: 'WebForm'
+  Children:
+  [
+    #child: pHeader
+    #child: pContent
+  ]
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormActualDailyProduction/Component_ListActualDailyProduction.def b/_Main/UI/MacroPlannerWebApp/Component_FormActualDailyProduction/Component_ListActualDailyProduction.def
index d2910b8..7b2123b 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormActualDailyProduction/Component_ListActualDailyProduction.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormActualDailyProduction/Component_ListActualDailyProduction.def
@@ -11,7 +11,7 @@
       BaseType: 'WebDataExtractor'
       Properties:
       [
-        DataType: 'external[Archive]'
+        DataType: 'Archive'
         Source: 'Archive'
         Taborder: 0
         Transformation: 'ActualDailyProductionData'
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_MatrixEditorTable\043384.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_MatrixEditorTable\043384.def"
index 37837b4..901e355 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_MatrixEditorTable\043384.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_MatrixEditorTable\043384.def"
@@ -17,10 +17,10 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'InterfaceDataset'
-            Source: 'InterfaceDataset'
+            DataType: 'structured[AssemblyOnlinePlanVersionRow]'
+            Source: 'dhRows'
             Taborder: 0
-            Transformation: 'AssemblyOnlinePlanVersion.Row.Cell'
+            Transformation: 'Elements.Cell'
           ]
         }
       ]
@@ -44,12 +44,10 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'InterfaceDataset'
-            FilterArguments: 'units:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderUnit;products:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderProduct'
-            FixedFilter: '( units.Size() = 0 or exists( units, Elements, unit, unit.ID() = object.ProductionLine() ) ) and ( products.Size() = 0 or exists( products, Elements, product, product.ID() = object.Name() ) )'
-            Source: 'InterfaceDataset'
+            DataType: 'structured[AssemblyOnlinePlanVersionRow]'
+            Source: 'dhRows'
             Taborder: 0
-            Transformation: 'AssemblyOnlinePlanVersion.Row'
+            Transformation: 'Elements'
           ]
         }
       ]
@@ -72,13 +70,13 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'InterfaceDataset'
+            DataType: 'structured[AssemblyOnlinePlanVersionRow]'
             Description: '( search.StartDate().IsMinInfinity() or object.StartDate() >= search.StartDate() ) and ( search.EndDate().IsMaxInfinity() or object.StartDate() <= search.EndDate() )'
             FilterArguments: 'search:QMacroPlanner::FormAssemblyOnlinePlanVersion.dhSearch'
             FixedFilter: 'object.Filter( search )'
-            Source: 'InterfaceDataset'
+            Source: 'dhRows'
             Taborder: 0
-            Transformation: 'AssemblyOnlinePlanVersion.Column'
+            Transformation: 'Elements.Cell.Column'
           ]
         }
       ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_PanelTable\043273.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_PanelTable\043273.def"
index 3db3b8c..424feff 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_PanelTable\043273.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormAssemblyOnlinePlanVersion/Component_PanelTable\043273.def"
@@ -6,6 +6,33 @@
   Children:
   [
     #child: MatrixEditorTable_384
+    Component dhRows
+    {
+      #keys: '[730572.0.144480758]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[AssemblyOnlinePlanVersionRow]*'
+      Children:
+      [
+        Component deRows
+        {
+          #keys: '[730572.0.144480804]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InterfaceDataset'
+            FilterArguments: 'units:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderUnit;products:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderProduct'
+            FixedFilter: 'not object.Version().IsShow() and ( units.Size() = 0 or exists( units, Elements, unit, unit.ID() = object.ProductionLine() ) ) and ( products.Size() = 0 or exists( products, Elements, product, product.ID() = object.Name() ) )'
+            Source: 'InterfaceDataset'
+            Taborder: 0
+            Transformation: 'AssemblyOnlinePlanVersion.Row'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryInterfaceData/Response_pHeader_bFilter_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryInterfaceData/Response_pHeader_bFilter_OnClick.def
index a36cf44..4af384d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryInterfaceData/Response_pHeader_bFilter_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryInterfaceData/Response_pHeader_bFilter_OnClick.def
@@ -9,6 +9,9 @@
   {
     Body:
     [*
+      // 鏇存柊搴撳瓨
+      InventoryInterfaceData::UpdateInventoryQuantity( InterfaceDataset, dsStart.Date(), dsEnd.Date() );
+      
       dhStartDate.Data( dsStart.Date().Format( "YM2D2" ) )
       dhEndDate.Data( dsEnd.Date().Format( "YM2D2" ) );
     *]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_MatrixEditorTable\043791.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_MatrixEditorTable\043791.def"
index bb0a572..fb2dbde 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_MatrixEditorTable\043791.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_MatrixEditorTable\043791.def"
@@ -17,10 +17,10 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'InterfaceDataset'
-            Source: 'InterfaceDataset'
+            DataType: 'structured[InventoryPlanArchiveRow]'
+            Source: 'dhRows'
             Taborder: 0
-            Transformation: 'InventoryPlanArchiveVersion.Row.Cell'
+            Transformation: 'Elements.Cell'
           ]
         }
       ]
@@ -44,12 +44,10 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'InterfaceDataset'
-            FilterArguments: 'units:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderUnit;products:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderProduct'
-            FixedFilter: '( units.Size() = 0 or exists( units, Elements, unit, unit.ID() = object.Unit() ) ) and ( products.Size() = 0 or exists( products, Elements, product, product.ID() = object.Name() ) )'
-            Source: 'InterfaceDataset'
+            DataType: 'structured[InventoryPlanArchiveRow]'
+            Source: 'dhRows'
             Taborder: 0
-            Transformation: 'InventoryPlanArchiveVersion.Row'
+            Transformation: 'Elements'
           ]
         }
       ]
@@ -72,13 +70,13 @@
           BaseType: 'WebDataExtractor'
           Properties:
           [
-            DataType: 'InterfaceDataset'
+            DataType: 'structured[InventoryPlanArchiveRow]'
             Description: '( search.StartDate().IsMinInfinity() or object.StartDate() >= search.StartDate() ) and ( search.EndDate().IsMaxInfinity() or object.StartDate() <= search.EndDate() )'
             FilterArguments: 'search:QMacroPlanner::FormInventoryPlanArchive.dhSearch'
             FixedFilter: 'object.Filter( search )'
-            Source: 'InterfaceDataset'
+            Source: 'dhRows'
             Taborder: 0
-            Transformation: 'InventoryPlanArchiveVersion.Column'
+            Transformation: 'Elements.Cell.Column'
           ]
         }
       ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelPeriod\04371.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelPeriod\04371.def"
index f1e7c43..8bc5af4 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelPeriod\04371.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelPeriod\04371.def"
@@ -26,6 +26,17 @@
         Taborder: 1
       ]
     }
+    Component bSynchronizeActualInventory
+    {
+      #keys: '[730572.0.167441650]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: '鍚屾瀹為檯搴撳瓨'
+        Taborder: 2
+        Visible: false
+      ]
+    }
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelTable\043881.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelTable\043881.def"
index e265e3f..c75cd20 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelTable\043881.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Component_PanelTable\043881.def"
@@ -6,6 +6,33 @@
   Children:
   [
     #child: MatrixEditorTable_791
+    Component dhRows
+    {
+      #keys: '[730572.0.172650978]'
+      BaseType: 'WebDataHolder'
+      Databinding: 'structured[InventoryPlanArchiveRow]*'
+      Children:
+      [
+        Component deRows
+        {
+          #keys: '[730572.0.172651057]'
+          BaseType: 'WebDataExtractor'
+          Properties:
+          [
+            DataType: 'InterfaceDataset'
+            FilterArguments: 'units:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderUnit;products:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderProduct'
+            FixedFilter: 'not object.Version().IsShow() and ( units.Size() = 0 or exists( units, Elements, unit, unit.ID() = object.Unit() ) ) and ( products.Size() = 0 or exists( products, Elements, product, product.ID() = object.Name() ) )'
+            Source: 'InterfaceDataset'
+            Taborder: 0
+            Transformation: 'InventoryPlanArchiveVersion.Row'
+          ]
+        }
+      ]
+      Properties:
+      [
+        Taborder: 1
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Response_PanelPeriod_71_bSynchronizeActualInventory_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Response_PanelPeriod_71_bSynchronizeActualInventory_OnClick.def
new file mode 100644
index 0000000..2b84b3e
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPlanArchive/Response_PanelPeriod_71_bSynchronizeActualInventory_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelPeriod_71/bSynchronizeActualInventory
+Response OnClick () id:Response_PanelPeriod_71_bSynchronizeActualInventory_OnClick
+{
+  #keys: '[730572.0.167291731]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      InventoryPlanArchiveCell::SynchronizeActualInventory( InterfaceDataset, Archive );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success(), true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPointSelection/Component_ListInventoryPointSelection.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPointSelection/Component_ListInventoryPointSelection.def
index 6cb9c14..f3d542d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPointSelection/Component_ListInventoryPointSelection.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventoryPointSelection/Component_ListInventoryPointSelection.def
@@ -29,7 +29,7 @@
       ]
       Properties:
       [
-        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsIncluded","title":"ImgIsIncluded","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsIncluded"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"InventoryPoint","title":"InventoryPoint","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"InventoryPoint"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockpoingPoint","title":"StockpoingPoint","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockpoingPoint"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Fac","title":"Fac","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Fac"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Dtype","title":"Dtype","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Dtype"}}]'
+        Columns: '[{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ImgIsIncluded","title":"ImgIsIncluded","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"ImgIsIncluded"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"ProductID","title":"ProductID","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"ProductID"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"InventoryPoint","title":"InventoryPoint","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"InventoryPoint"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"StockpoingPoint","title":"StockingPoint","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"StockpoingPoint"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Quantity","title":"Quantity","subtotals":"","tooltip":"","width":-1,"display":"shown","attribute":"Quantity"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Fac","title":"Fac","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Fac"}},{"attribute":{"classtype":"WebApiDefinitionAttributeDataMember","columnid":"Dtype","title":"Dtype","subtotals":"","tooltip":"","width":-1,"display":"shown","editable":false,"attribute":"Dtype"}}]'
         ContextMenu: 'listContextMenuInventoryPointSelection'
         Taborder: 2
       ]
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Component_pHeader\043136.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Component_pHeader\043136.def"
index 4c7dcdd..6c04f80 100644
--- "a/_Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Component_pHeader\043136.def"
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Component_pHeader\043136.def"
@@ -35,6 +35,16 @@
         Taborder: 0
       ]
     }
+    Component bDetectingNegativeValues id:bDetectingNegativeValues_791
+    {
+      #keys: '[730572.0.159950553]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Detecting negative values'
+        Taborder: 3
+      ]
+    }
   ]
   Properties:
   [
diff --git "a/_Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Response_pHeader_136_bDetectingNegativeValues_OnClick\043812.def" "b/_Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Response_pHeader_136_bDetectingNegativeValues_OnClick\043812.def"
new file mode 100644
index 0000000..1d3bbbf
--- /dev/null
+++ "b/_Main/UI/MacroPlannerWebApp/Component_FormNewAssemblyOnlinePlan/Response_pHeader_136_bDetectingNegativeValues_OnClick\043812.def"
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pHeader_136/bDetectingNegativeValues_791
+Response OnClick () id:Response_pHeader_bDetectingNegativeValues_OnClick_812
+{
+  #keys: '[730572.0.159950552]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      res := NewAssemblyOnlinePlanCell::DetectingNegativeValues( MacroPlan );
+      
+      WebMessageBox::Success( res, true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Component_pHeader.def
index 2858b6f..77cee8c 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Component_pHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Component_pHeader.def
@@ -75,6 +75,16 @@
         Taborder: 6
       ]
     }
+    Component bDetectingNegativeValues
+    {
+      #keys: '[730572.0.159670034]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Detecting negative values'
+        Taborder: 7
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Response_pHeader_bDetectingNegativeValues_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Response_pHeader_bDetectingNegativeValues_OnClick.def
new file mode 100644
index 0000000..97ecb8f
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormNewOfflinePlan/Response_pHeader_bDetectingNegativeValues_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: pHeader/bDetectingNegativeValues
+Response OnClick () id:Response_pHeader_bDetectingNegativeValues_OnClick
+{
+  #keys: '[730572.0.159870568]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      res := NewOfflinePlanCell::DetectingNegativeValues( MacroPlan );
+      
+      WebMessageBox::Success( res, true );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelPeriod.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelPeriod.def
index dda4554..ff2928f 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelPeriod.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelPeriod.def
@@ -26,6 +26,17 @@
         Taborder: 1
       ]
     }
+    Component ButtonPeriod
+    {
+      #keys: '[730572.0.144413017]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Image: 'ARROW_CIRCLE2'
+        Label: '鍚屾瀹為檯浜ч噺'
+        Taborder: 2
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelTable.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelTable.def
index 8388d74..7a23f47 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelTable.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Component_PanelTable.def
@@ -21,7 +21,7 @@
           [
             DataType: 'InterfaceDataset'
             FilterArguments: 'units:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderUnit;products:QLibMacroPlannerWebUI::ApplicationMacroPlanner.DataHolderProduct'
-            FixedFilter: '( units.Size() = 0 or exists( units, Elements, unit, unit.ID() = object.ProductionLine() ) ) and ( products.Size() = 0 or exists( products, Elements, product, product.ID() = object.Name() ) )'
+            FixedFilter: 'not object.Version().IsShow() and ( units.Size() = 0 or exists( units, Elements, unit, unit.ID() = object.ProductionLine() ) ) and ( products.Size() = 0 or exists( products, Elements, product, product.ID() = object.Name() ) )'
             Source: 'InterfaceDataset'
             Taborder: 0
             Transformation: 'OfflinePlanArchiveVersion.Row'
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Response_PanelPeriod_ButtonPeriod_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Response_PanelPeriod_ButtonPeriod_OnClick.def
new file mode 100644
index 0000000..c3d67a9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormOfflinePlanArchive/Response_PanelPeriod_ButtonPeriod_OnClick.def
@@ -0,0 +1,18 @@
+Quintiq file version 2.0
+#parent: PanelPeriod/ButtonPeriod
+Response OnClick () id:Response_PanelPeriod_ButtonPeriod_OnClick
+{
+  #keys: '[730572.0.156334897]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  QuillAction
+  {
+    Body:
+    [*
+      OfflinePlanArchiveCell::SynchronizeActualProduction( InterfaceDataset, Archive );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormSAP_PIR/Response_List391_bPush_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormSAP_PIR/Response_List391_bPush_OnClick.def
index 4dbe266..f379cbc 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormSAP_PIR/Response_List391_bPush_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormSAP_PIR/Response_List391_bPush_OnClick.def
@@ -12,7 +12,7 @@
   {
     Body:
     [*
-      AOnlineAndMOfflinePlanPIR::Publish( InterfaceDataset, selection.InterfaceLoginfo() );
+      //AOnlineAndMOfflinePlanPIR::Publish( InterfaceDataset, selection.InterfaceLoginfo() );
     *]
     GroupServerCalls: false
   }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def
index 74595a4..1bdd3af 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Component_pHeader.def
@@ -35,6 +35,16 @@
         Taborder: 2
       ]
     }
+    Component bWriteBackTheTransferPlan
+    {
+      #keys: '[730572.0.154074820]'
+      BaseType: 'WebButton'
+      Properties:
+      [
+        Label: 'Write back'
+        Taborder: 3
+      ]
+    }
   ]
   Properties:
   [
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bWriteBackTheTransferPlan_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bWriteBackTheTransferPlan_OnClick.def
new file mode 100644
index 0000000..7b7c6b9
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormTransferPlan/Response_pHeader_bWriteBackTheTransferPlan_OnClick.def
@@ -0,0 +1,22 @@
+Quintiq file version 2.0
+#parent: pHeader/bWriteBackTheTransferPlan
+Response OnClick () id:Response_pHeader_bWriteBackTheTransferPlan_OnClick
+{
+  #keys: '[730572.0.154074898]'
+  CanBindMultiple: false
+  DefinitionID: 'Responsedef_WebButton_OnClick'
+  Precondition:
+  [*
+    return not isnull( MacroPlan );
+  *]
+  QuillAction
+  {
+    Body:
+    [*
+      TransferPlanCell::WriteBackTheTransferPlan( MacroPlan, DataHolderCheckedProduct.Data() );
+      
+      WebMessageBox::Success( Translations::A_VWED_Success() );
+    *]
+    GroupServerCalls: false
+  }
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/APIMS64ProductRelation.vw b/_Main/UI/MacroPlannerWebApp/Views/APIMS64ProductRelation.vw
new file mode 100644
index 0000000..5a5187c
--- /dev/null
+++ b/_Main/UI/MacroPlannerWebApp/Views/APIMS64ProductRelation.vw
@@ -0,0 +1,307 @@
+Quintiq file version 2.0
+{
+  viewcontents
+  {
+    forms
+    {
+      form_FormAPIRMS64ProductRelation
+      {
+        title: 'QMacroPlanner::FormAPIRMS64ProductRelation'
+        shown: true
+        componentID: 'QMacroPlanner::FormAPIRMS64ProductRelation'
+        layout
+        {
+          mode: 'open'
+          rowPosition: 1
+          rowSpan: 13
+          columnPosition: 1
+          columnSpan: 12
+        }
+        components
+        {
+          FormAPIRMS64ProductRelation_pHeader
+          {
+            sizeRatio: 1
+          }
+          FormAPIRMS64ProductRelation_pContent
+          {
+            sizeRatio: 1
+          }
+          FormAPIRMS64ProductRelation_List920
+          {
+          }
+          FormAPIRMS64ProductRelation_DataSetLevel195
+          {
+            groupDepth: -1
+            column_Factory
+            {
+              columnId: 'Factory'
+              dataPath: 'Factory'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 252
+            }
+            column_Product
+            {
+              columnId: 'Product'
+              dataPath: 'Product'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 239
+            }
+          }
+        }
+      }
+      form_FormOptimizerPuzzles
+      {
+        title: 'Optimizer Puzzles'
+        shown: false
+        componentID: 'FormOptimizerPuzzles'
+        layout
+        {
+          mode: 'dockright'
+          index: 0
+        }
+        components
+        {
+          FormOptimizerPuzzles_ListOptimizerPuzzles
+          {
+          }
+          FormOptimizerPuzzles_DataSetLevelOptimizerPuzzles
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              title: 'All constraints'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              title: 'Name'
+              index: 1
+              subtotals: ''
+              width: 109
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              title: 'Description'
+              index: 2
+              subtotals: ''
+              width: 207
+            }
+          }
+        }
+      }
+      form_FormSanityCheck
+      {
+        title: 'Sanity Check'
+        shown: false
+        componentID: 'FormSanityCheck'
+        layout
+        {
+          mode: 'dockright'
+          index: 1
+        }
+        components
+        {
+          FormSanityCheck_PanelSanityCheckToolbar
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckContent
+          {
+            sizeRatio: 1
+          }
+          FormSanityCheck_PanelSanityCheckGroup
+          {
+            sizeRatio: 4
+          }
+          FormSanityCheck_ListSanityCheckGroup
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckGroup
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,DESC:SanityCheckHighestCategory,DESC:_Expr3'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 31
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 31
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 31
+            }
+            column_Group
+            {
+              columnId: 'Group'
+              dataPath: 'Group'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 235
+            }
+            column__Expr3
+            {
+              columnId: '_Expr3'
+              dataPath: '_Expr3'
+              dataType: 'number'
+              index: 4
+              subtotals: ''
+              width: 85
+            }
+          }
+          FormSanityCheck_PanelSanityCheckMessage
+          {
+            sizeRatio: 5
+          }
+          FormSanityCheck_ListSanityCheckMessage
+          {
+          }
+          FormSanityCheck_DataSetLevelSanityCheckMessage
+          {
+            groupDepth: -1
+            sort: 'DESC:IsShown,SanityCheckGroup.Type,SanityCheckGroup.Group,Description'
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 31
+            }
+            column_Show
+            {
+              columnId: 'Show'
+              dataPath: 'Show'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 31
+            }
+            column_Category
+            {
+              columnId: 'Category'
+              dataPath: 'Category'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 31
+            }
+            column_Messages
+            {
+              columnId: 'Messages'
+              dataPath: 'Messages'
+              dataType: 'string'
+              index: 3
+              subtotals: ''
+              width: 31
+            }
+            column_Description
+            {
+              columnId: 'Description'
+              dataPath: 'Description'
+              dataType: 'string'
+              index: 4
+              subtotals: ''
+              width: 505
+            }
+          }
+        }
+      }
+      form_FormOptimizerStrategiesSlideIn
+      {
+        title: 'Optimizer Strategies'
+        shown: true
+        componentID: 'FormOptimizerStrategiesSlideIn'
+        layout
+        {
+          mode: 'dockright'
+          index: 2
+        }
+        components
+        {
+          FormOptimizerStrategiesSlideIn_ListOptimizerStrategiesSlideIn
+          {
+          }
+          FormOptimizerStrategiesSlideIn_DataSetLevelOptimizerStrategiesSlideIn
+          {
+            groupDepth: -1
+            column_All_constraints
+            {
+              columnId: 'All constraints'
+              dataPath: 'All constraints'
+              dataType: 'string'
+              index: 0
+              subtotals: ''
+              width: 32
+            }
+            column_ImgIsValid
+            {
+              columnId: 'ImgIsValid'
+              dataPath: 'ImgIsValid'
+              dataType: 'string'
+              index: 1
+              subtotals: ''
+              width: 32
+            }
+            column_Name
+            {
+              columnId: 'Name'
+              dataPath: 'Name'
+              dataType: 'string'
+              index: 2
+              subtotals: ''
+              width: 270
+            }
+          }
+        }
+      }
+    }
+    userconfigurableinformation
+    {
+    }
+    page: ''
+    group: ''
+    index: 0
+    image: 'BEAR'
+    description: ''
+  }
+  formatversion: 2
+  id: 'APIMS64ProductRelation'
+  name: 'APIMS64ProductRelation'
+  isglobal: false
+  isroot: true
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Views/Inventory_plan_archive_report.vw b/_Main/UI/MacroPlannerWebApp/Views/Inventory_plan_archive_report.vw
index a8856d6..54be4ee 100644
--- a/_Main/UI/MacroPlannerWebApp/Views/Inventory_plan_archive_report.vw
+++ b/_Main/UI/MacroPlannerWebApp/Views/Inventory_plan_archive_report.vw
@@ -23,11 +23,19 @@
           {
             sizeRatio: 1
           }
+          FormInventoryPlanArchive_PanelRowSearch
+          {
+            sizeRatio: 1
+          }
           FormInventoryPlanArchive_PanelUnit
           {
             sizeRatio: 1
           }
           FormInventoryPlanArchive_PanelProduct
+          {
+            sizeRatio: 1
+          }
+          FormInventoryPlanArchive_PanelColumnSearch
           {
             sizeRatio: 1
           }
@@ -49,13 +57,56 @@
           }
           FormInventoryPlanArchive_MatrixEditorTable
           {
-            totalHeaderWidth: 200
+            gridColor: '#c4c4c4'
+            totalHeaderWidth: 378
             attributeHeaderWidthRatio: 0.6
             nameHeaderWidthRatio: 0.4
             columnWidth: 100
             horizontalGrid: true
             verticalGrid: true
-            gridColor: '#c4c4c4'
+            backendState
+            {
+              componentId: 'QMacroPlanner::FormInventoryPlanArchive.MatrixEditorTable'
+              state
+              {
+                cells
+                {
+                  attributes
+                  {
+                    attribute_PlanQuantity
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 0
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'PlanQuantity'
+                    }
+                    attribute_ActualQuantity
+                    {
+                      type: 'MatrixEditorWebApiCellDataModelInterest'
+                      index: 1
+                      rowsubtotal: ''
+                      columnsubtotal: ''
+                      attribute: 'ActualQuantity'
+                    }
+                  }
+                }
+                columns
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'StartDate'"
+                  }
+                }
+                rows
+                {
+                  sorting
+                  {
+                    criteria: "datamember:'Name'"
+                  }
+                }
+              }
+            }
           }
         }
       }
@@ -65,7 +116,7 @@
     }
     page: ''
     group: ''
-    index: 31
+    index: 0
     image: 'WAREHOUSE'
     description: ''
   }

--
Gitblit v1.9.3