From b02a3586a97064c94087c0e3ca2eac36cd9d9b42 Mon Sep 17 00:00:00 2001
From: lazhen <17772815105@139.com>
Date: 星期一, 21 十月 2024 17:36:04 +0800
Subject: [PATCH] 库存汇总报表导出格式修改

---
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelExport_369_ButtonExport696_OnClick.def |    2 
 _Main/BL/Type_FinancialSalesReport/Method_Generate.qbl                                                                   |    4 
 _Main/BL/Type_FinancialSalesRow/Attribute_Factory.qbl                                                                    |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelLeft.def                                   |    1 
 _Main/BL/Type_InventroySummaryRow/Attribute_Power.qbl                                                                    |    7 
 _Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl                                                                   |    6 
 _Main/BL/Type_InventroySummaryRow/Attribute_Factory.qbl                                                                  |    7 
 _Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def    |    2 
 /dev/null                                                                                                                |   22 --
 _Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_ButtonExport570_OnClick.def          |    2 
 _Main/BL/Type_InventorySummaryReport/Method_GenerateShow#925.qbl                                                         |    4 
 _Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl                                                             |  133 ++------------
 _Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl                                                           |   93 +++------
 _Main/BL/Type_InventroySummaryRow/Attribute_Generation.qbl                                                               |    7 
 _Main/BL/Type_InventroySummaryRow/Attribute_MLBMQB.qbl                                                                   |    7 
 _Main/BL/Type_FinancialSalesRow/DefaultValue_Factory.qbl                                                                 |    6 
 _Main/BL/Type_InventorySummaryColumn/Method_GenerateCell.qbl                                                             |   10 
 _Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl                                                         |    7 
 _Main/BL/Type_FinancialProductionReport/Method_GenerateShow.qbl                                                          |    5 
 _Main/BL/Type_FinancialProductionRow/Attribute_Factory.qbl                                                               |    7 
 _Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl                                                        |  124 ++-----------
 _Main/BL/Type_FinancialSalesReport/Method_GenerateShow.qbl                                                               |   23 +-
 22 files changed, 165 insertions(+), 321 deletions(-)

diff --git a/_Main/BL/Type_FinancialProductionReport/Method_GenerateShow.qbl b/_Main/BL/Type_FinancialProductionReport/Method_GenerateShow.qbl
index 1d2fd02..45ed8d4 100644
--- a/_Main/BL/Type_FinancialProductionReport/Method_GenerateShow.qbl
+++ b/_Main/BL/Type_FinancialProductionReport/Method_GenerateShow.qbl
@@ -11,7 +11,7 @@
     // 鐢勫叞楦� Oct-12-2024 (created)
     //骞存眹鎬�
     yearcolumn                := this.FinancialProductionColumn( relnew, Name := '姹囨��', Period := this.FinancialProductionSource().MacroPlan().StartOfPlanning().StartOfNextYear().Date() );
-    sumrow                    := this.FinancialProductionRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( 'SUM' ), Unit := factory );
+    sumrow                    := this.FinancialProductionRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( 'SUM' ), Factory := factory );
     sumyearcell               := yearcolumn.FinancialProductionCell( relnew, Quantity := 0 );
     sumrow.FinancialProductionCell( relinsert, sumyearcell );
     traverse( table, FinancialProductionRow, row, row.Unit() = factory ){
@@ -19,7 +19,8 @@
       productid.Add( row.Name() );
         
       if( productids.ContainsAll( productid ) ){
-        showrow               := this.FinancialProductionRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( row.Name() ), Unit := row.Unit() );
+        showrow               := this.FinancialProductionRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( row.Name() ), Unit := row.Unit(), Factory := factory );
+        row.Product_MP().FinancialProductionRow( relinsert, showrow );
         yearcell              := yearcolumn.FinancialProductionCell( relnew, Quantity := 0 );
         showrow.FinancialProductionCell( relinsert, yearcell );
         traverse( row, FinancialProductionCell, cell, not cell.FinancialProductionColumn().IsDay() ){
diff --git a/_Main/BL/Type_FinancialProductionRow/Attribute_Factory.qbl b/_Main/BL/Type_FinancialProductionRow/Attribute_Factory.qbl
new file mode 100644
index 0000000..14d0cb7
--- /dev/null
+++ b/_Main/BL/Type_FinancialProductionRow/Attribute_Factory.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Factory
+{
+  #keys: '3[415136.0.1226310164][415136.0.1226310163][415136.0.1226310165]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
index bad3460..3d8a7dc 100644
--- a/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
+++ b/_Main/BL/Type_FinancialProductionSource/StaticMethod_Download.qbl
@@ -1,11 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Download (
-  MacroPlan macroPlan,
-  Factorys factorys,
-  ProductGenerations generations,
-  ProductPowers powers,
-  ProductMLBMQBs mlbmqls
+  MacroPlan macroPlan
 ) as BinaryValue
 {
   Description: '涓嬭浇璐㈠姟鎶ヨ〃鏁版嵁'
@@ -18,116 +14,42 @@
     xmlDOM                        := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
     
     tableElement                  := xmlDOM.GetElementByTagName( "table", 0 );
-    //Search
-    searchcolumnelement           := xmlDOM.CreateElement( "column" );
-    searchnameelement             := xmlDOM.CreateElement( "name" );
-    searchtypeelement             := xmlDOM.CreateElement( "type" );
-    searchnameelement.TextContent( 'Search' );
-    searchtypeelement.TextContent( "String" );
-    searchcolumnelement.AppendChild( searchnameelement );
-    searchcolumnelement.AppendChild( searchtypeelement );
+    //Factory
+    searchunitcolumn              := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Unit' );
+    //Generation
+    generationcolumn              := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Generation' );
+    //Power
+    powercolumn                   := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Power' );
+    //MLBMQBS
+    mlbmqbcolumn                  := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'MLBMQB' );
     //Product
-    productcolumnelement          := xmlDOM.CreateElement( "column" );
-    productnameelement            := xmlDOM.CreateElement( "name" );
-    producttypeelement            := xmlDOM.CreateElement( "type" );
-    productnameelement.TextContent( 'Product' );
-    producttypeelement.TextContent( "String" );
-    productcolumnelement.AppendChild( productnameelement );
-    productcolumnelement.AppendChild( producttypeelement );
+    productcolumnelement          := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Product' );
     //Unit
-    unitcolumnelement             := xmlDOM.CreateElement( "column" );
-    unitnameelement               := xmlDOM.CreateElement( "name" );
-    unittypeelement               := xmlDOM.CreateElement( "type" );
-    unitnameelement.TextContent( 'Unit' );
-    unittypeelement.TextContent( "String" );
-    unitcolumnelement.AppendChild( unitnameelement );
-    unitcolumnelement.AppendChild( unittypeelement );
-    
-    tableElement.AppendChild( searchcolumnelement ); 
-    tableElement.AppendChild( productcolumnelement ); 
-    tableElement.AppendChild( unitcolumnelement ); 
-    searchtotal                   := factorys.Size() + generations.Size() + powers.Size() + mlbmqls.Size() + 4 ;
-    searchunitElement             := xmlDOM.CreateElement( "cell" );
-    searchunitElement.SetAttribute( "value", 'Unit' );
-    searchcolumnelement.AppendChild( searchunitElement );
-    traverse( factorys, Elements, factory ){
-      searchunitcellElement       := xmlDOM.CreateElement( "cell" );
-      searchunitcellElement.SetAttribute( "value", factory.Name() );
-      searchcolumnelement.AppendChild( searchunitcellElement );
-    }
-    searchgenerationElement       := xmlDOM.CreateElement( "cell" );
-    searchgenerationElement.SetAttribute( "value", 'Generation' );
-    searchcolumnelement.AppendChild( searchgenerationElement );
-    traverse( generations, Elements, generation ){
-      generationcellElement       := xmlDOM.CreateElement( "cell" );
-      generationcellElement.SetAttribute( "value", generation.Generation() );
-      searchcolumnelement.AppendChild( generationcellElement );
-    }
-    searchpowerElement            := xmlDOM.CreateElement( "cell" );
-    searchpowerElement.SetAttribute( "value", 'Power' );
-    searchcolumnelement.AppendChild( searchpowerElement );
-    traverse( powers, Elements, power ){
-      searchpowercellElement      := xmlDOM.CreateElement( "cell" );
-      searchpowercellElement.SetAttribute( "value", power.Power() );
-      searchcolumnelement.AppendChild( searchpowercellElement );
-    }
-    searchmlbmqlElement           := xmlDOM.CreateElement( "cell" );
-    searchmlbmqlElement.SetAttribute( "value", 'MQBMLB' );
-    searchcolumnelement.AppendChild( searchmlbmqlElement );
-    traverse( mlbmqls, Elements, mlbmql ){
-      searchmlbmqlcellElement     := xmlDOM.CreateElement( "cell" );
-      searchmlbmqlcellElement.SetAttribute( "value", mlbmql.MLBMQB() );
-      searchcolumnelement.AppendChild( searchmlbmqlcellElement );
-    }
-    
-    for( i := searchtotal; i < table.FinancialProductionRow( relsize ); i := i + 1 ){
-      searchcellElement           := xmlDOM.CreateElement( "cell" );
-      searchcellElement.SetAttribute( "value", '' );
-      searchcolumnelement.AppendChild( searchcellElement );
-    }
+    unitcolumnelement             := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Unit' );
     
     minindex                      := min( table, FinancialProductionColumn, column, not column.IsDay(), column.Index() );
     traverse ( table, FinancialProductionColumn, column, not column.IsDay() ) {
-      columnelement               := xmlDOM.CreateElement( "column" );
-      nameelement                 := xmlDOM.CreateElement( "name" );
-      typeelement                 := xmlDOM.CreateElement( "type" );
-      nameelement.TextContent( column.Name() );
-      typeelement.TextContent( "String" );
-      columnelement.AppendChild( nameelement );
-      columnelement.AppendChild( typeelement );
+      columnelement               := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, column.Name() );
       
       cells                       := selectsortedset( column, FinancialProductionCell, cell, cell.FinancialProductionRow().RowNr() );
     
       traverse ( cells, Elements, c ) {
         if( column.Index() = minindex ){
           row                     := c.FinancialProductionRow();
+          //Factory
+          InventorySummarySource::CreateCellElement( xmlDOM, searchunitcolumn, row.Factory() );
+          //Generation
+          InventorySummarySource::CreateCellElement( xmlDOM, generationcolumn, row.Product_MP().Generation() );
+          //Power
+          InventorySummarySource::CreateCellElement( xmlDOM, powercolumn, row.Product_MP().Power() );
+          //MLBMQBS
+          InventorySummarySource::CreateCellElement( xmlDOM, mlbmqbcolumn, row.Product_MP().MQBMLB() );
           //Product
-          productcellElement      := xmlDOM.CreateElement( "cell" );
-          productcellElement.SetAttribute( "value", row.Name() );
-          productcolumnelement.AppendChild( productcellElement );
+          InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
           //Unit
-          unitcellElement         := xmlDOM.CreateElement( "cell" );
-          unitcellElement.SetAttribute( "value", row.Unit() );
-          unitcolumnelement.AppendChild( unitcellElement );
+          InventorySummarySource::CreateCellElement( xmlDOM, unitcolumnelement, row.Unit() );
         }
-        cellElement               := xmlDOM.CreateElement( "cell" );
-        cellElement.SetAttribute( "value", c.Value() ); 
-        columnelement.AppendChild( cellElement );
-      }
-      for( i := cells.Size(); i < searchtotal; i := i + 1 ){
-        searchcellElement         := xmlDOM.CreateElement( "cell" );
-        searchcellElement.SetAttribute( "value", '' );
-        columnelement.AppendChild( searchcellElement );
-        
-        if( column.Index() = minindex ){
-          productcellElement      := xmlDOM.CreateElement( "cell" );
-          productcellElement.SetAttribute( "value", '' );
-          productcolumnelement.AppendChild( productcellElement );
-          //Unit
-          unitcellElement         := xmlDOM.CreateElement( "cell" );
-          unitcellElement.SetAttribute( "value", '' );
-          unitcolumnelement.AppendChild( unitcellElement );
-        }
+        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, c.Value() );
       }
       tableElement.AppendChild( columnelement );  
     }
diff --git a/_Main/BL/Type_FinancialSalesReport/Method_Generate.qbl b/_Main/BL/Type_FinancialSalesReport/Method_Generate.qbl
index cba9d49..4838b9d 100644
--- a/_Main/BL/Type_FinancialSalesReport/Method_Generate.qbl
+++ b/_Main/BL/Type_FinancialSalesReport/Method_Generate.qbl
@@ -9,7 +9,7 @@
   TextBody:
   [*
     // 鐢勫叞楦� Jun-25-2024 (created)
-    table      := selectobject( this, FinancialSalesSource.FinancialSalesReport, report, not report.IsShow() );
+    table                   := selectobject( this, FinancialSalesSource.FinancialSalesReport, report, not report.IsShow() );
     //娓呯┖涔嬪墠瀛樺偍鐨勬樉绀烘暟鎹�
     this.Clear();
     traverse( factorys, Elements, factory ){
@@ -19,7 +19,7 @@
     i                       := 0;
     traverse( rows, Elements, e ){
       e.RowNr( i );
-      i                    := i + 1;
+      i                     := i + 1;
     }
   *]
 }
diff --git a/_Main/BL/Type_FinancialSalesReport/Method_GenerateShow.qbl b/_Main/BL/Type_FinancialSalesReport/Method_GenerateShow.qbl
index 712aafb..58c304f 100644
--- a/_Main/BL/Type_FinancialSalesReport/Method_GenerateShow.qbl
+++ b/_Main/BL/Type_FinancialSalesReport/Method_GenerateShow.qbl
@@ -10,33 +10,34 @@
   [*
     // 鐢勫叞楦� Oct-12-2024 (created)
     //骞存眹鎬�
-    yearcolumn := this.FinancialSalesColumn( relnew, Name := '姹囨��', Period := this.FinancialSalesSource().MacroPlan().StartOfPlanning().StartOfNextYear().Date() );
-    sumrow     := this.FinancialSalesRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( 'SUM' ), Unit := factory, RowNr := table.FinancialSalesRow( relsize ) );
-    sumyearcell := yearcolumn.FinancialSalesCell( relnew, Value := '0' );
+    yearcolumn          := this.FinancialSalesColumn( relnew, Name := '姹囨��', Period := this.FinancialSalesSource().MacroPlan().StartOfPlanning().StartOfNextYear().Date() );
+    sumrow              := this.FinancialSalesRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( 'SUM' ), Factory := factory );
+    sumyearcell         := yearcolumn.FinancialSalesCell( relnew, Value := '0' );
     sumrow.FinancialSalesCell( relinsert, sumyearcell );
     traverse( table, FinancialSalesRow, row, row.Unit() = factory ){
-      productid  := construct( Strings );
+      productid         := construct( Strings );
       productid.Add( row.Name() );
       
       if( productids.ContainsAll( productid ) ){
-        showrow := this.FinancialSalesRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( row.Name() ), Unit := row.Unit(), RowNr := row.RowNr() );
-        yearcell := yearcolumn.FinancialSalesCell( relnew, Value := '0' );
+        showrow         := this.FinancialSalesRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( row.Name() ), Unit := row.Unit() );
+        row.Product_MP().FinancialSalesRow( relinsert, showrow );
+        yearcell        := yearcolumn.FinancialSalesCell( relnew, Value := '0' );
         showrow.FinancialSalesCell( relinsert, yearcell );
         
         traverse( row, FinancialSalesCell, cell, not cell.FinancialSalesColumn().IsDay() ){
-          column   := selectobject( this, FinancialSalesColumn, column, column.Name() = cell.FinancialSalesColumn().Name() and not column.IsDay());
+          column        := selectobject( this, FinancialSalesColumn, column, column.Name() = cell.FinancialSalesColumn().Name() and not column.IsDay());
           
-          sumcell  := selectobject( column, FinancialSalesCell, c, c.FinancialSalesRow() = sumrow );
+          sumcell       := selectobject( column, FinancialSalesCell, c, c.FinancialSalesRow() = sumrow );
           if( isnull( sumcell ) ){
-            sumcell := column.FinancialSalesCell( relnew, Value := '0' );
+            sumcell     := column.FinancialSalesCell( relnew, Value := '0' );
             sumrow.FinancialSalesCell( relinsert, sumcell );
           }
           
-          showcell := column.FinancialSalesCell( relnew, Value := cell.Value(), IsUpdate := cell.IsUpdate()  );
+          showcell      := column.FinancialSalesCell( relnew, Value := cell.Value(), IsUpdate := cell.IsUpdate()  );
           showrow.FinancialSalesCell( relinsert, showcell );
           yearcell.Value( [String]( [Real]yearcell.Value() + [Real]cell.Value() ) );
           sumyearcell.Value( [String]( [Real]sumyearcell.Value() + [Real]cell.Value() ) );
-          value := [Real]cell.Value() + [Real]sumcell.Value();
+          value         := [Real]cell.Value() + [Real]sumcell.Value();
           sumcell.Value( [String]value );
         }
       }
diff --git a/_Main/BL/Type_FinancialSalesRow/Attribute_Factory.qbl b/_Main/BL/Type_FinancialSalesRow/Attribute_Factory.qbl
new file mode 100644
index 0000000..f45ce2c
--- /dev/null
+++ b/_Main/BL/Type_FinancialSalesRow/Attribute_Factory.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Factory
+{
+  #keys: '3[415136.0.1226310174][415136.0.1226310173][415136.0.1226310175]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_FinancialSalesRow/DefaultValue_Factory.qbl b/_Main/BL/Type_FinancialSalesRow/DefaultValue_Factory.qbl
new file mode 100644
index 0000000..49653fb
--- /dev/null
+++ b/_Main/BL/Type_FinancialSalesRow/DefaultValue_Factory.qbl
@@ -0,0 +1,6 @@
+Quintiq file version 2.0
+#parent: #root
+DefaultValue
+{
+  TargetAttribute: Factory
+}
diff --git a/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl b/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl
index 6edd436..73339a8 100644
--- a/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl
+++ b/_Main/BL/Type_FinancialSalesSource/StaticMethod_Download.qbl
@@ -1,11 +1,7 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Download (
-  MacroPlan macroPlan,
-  Factorys factorys,
-  ProductGenerations generations,
-  ProductPowers powers,
-  ProductMLBMQBs mlbmqls
+  MacroPlan macroPlan
 ) as BinaryValue
 {
   Description: '涓嬭浇璐㈠姟鎶ヨ〃鏁版嵁'
@@ -18,123 +14,42 @@
     xmlDOM                        := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
     
     tableElement                  := xmlDOM.GetElementByTagName( "table", 0 );
-    //Search
-    searchcolumnelement           := xmlDOM.CreateElement( "column" );
-    searchnameelement             := xmlDOM.CreateElement( "name" );
-    searchtypeelement             := xmlDOM.CreateElement( "type" );
-    searchnameelement.TextContent( 'Search' );
-    searchtypeelement.TextContent( "String" );
-    searchcolumnelement.AppendChild( searchnameelement );
-    searchcolumnelement.AppendChild( searchtypeelement );
+    //Factory
+    searchunitcolumn              := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Unit' );
+    //Generation
+    generationcolumn              := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Generation' );
+    //Power
+    powercolumn                   := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Power' );
+    //MLBMQBS
+    mlbmqbcolumn                  := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'MLBMQB' );
     //Product
-    productcolumnelement          := xmlDOM.CreateElement( "column" );
-    productnameelement            := xmlDOM.CreateElement( "name" );
-    producttypeelement            := xmlDOM.CreateElement( "type" );
-    productnameelement.TextContent( 'Product' );
-    producttypeelement.TextContent( "String" );
-    productcolumnelement.AppendChild( productnameelement );
-    productcolumnelement.AppendChild( producttypeelement );
+    productcolumnelement          := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Product' );
     //Unit
-    unitcolumnelement             := xmlDOM.CreateElement( "column" );
-    unitnameelement               := xmlDOM.CreateElement( "name" );
-    unittypeelement               := xmlDOM.CreateElement( "type" );
-    unitnameelement.TextContent( 'Unit' );
-    unittypeelement.TextContent( "String" );
-    unitcolumnelement.AppendChild( unitnameelement );
-    unitcolumnelement.AppendChild( unittypeelement );
+    unitcolumnelement             := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Unit' );
     
-    tableElement.AppendChild( searchcolumnelement ); 
-    tableElement.AppendChild( productcolumnelement ); 
-    tableElement.AppendChild( unitcolumnelement ); 
-    searchtotal                   := factorys.Size() + generations.Size() + powers.Size() + mlbmqls.Size() + 4 ;
-    searchunitElement             := xmlDOM.CreateElement( "cell" );
-    searchunitElement.SetAttribute( "value", 'Unit' );
-    searchcolumnelement.AppendChild( searchunitElement );
-    traverse( factorys, Elements, factory ){
-      searchunitcellElement       := xmlDOM.CreateElement( "cell" );
-      searchunitcellElement.SetAttribute( "value", factory.Name() );
-      searchcolumnelement.AppendChild( searchunitcellElement );
-    }
-    searchgenerationElement       := xmlDOM.CreateElement( "cell" );
-    searchgenerationElement.SetAttribute( "value", 'Generation' );
-    searchcolumnelement.AppendChild( searchgenerationElement );
-    traverse( generations, Elements, generation ){
-      generationcellElement       := xmlDOM.CreateElement( "cell" );
-      generationcellElement.SetAttribute( "value", generation.Generation() );
-      searchcolumnelement.AppendChild( generationcellElement );
-    }
-    searchpowerElement            := xmlDOM.CreateElement( "cell" );
-    searchpowerElement.SetAttribute( "value", 'Power' );
-    searchcolumnelement.AppendChild( searchpowerElement );
-    traverse( powers, Elements, power ){
-      searchpowercellElement      := xmlDOM.CreateElement( "cell" );
-      searchpowercellElement.SetAttribute( "value", power.Power() );
-      searchcolumnelement.AppendChild( searchpowercellElement );
-    }
-    searchmlbmqlElement           := xmlDOM.CreateElement( "cell" );
-    searchmlbmqlElement.SetAttribute( "value", 'MQBMLB' );
-    searchcolumnelement.AppendChild( searchmlbmqlElement );
-    traverse( mlbmqls, Elements, mlbmql ){
-      searchmlbmqlcellElement     := xmlDOM.CreateElement( "cell" );
-      searchmlbmqlcellElement.SetAttribute( "value", mlbmql.MLBMQB() );
-      searchcolumnelement.AppendChild( searchmlbmqlcellElement );
-    }
-    
-    for( i := searchtotal; i < table.FinancialSalesRow( relsize ); i := i + 1 ){
-      searchcellElement           := xmlDOM.CreateElement( "cell" );
-      searchcellElement.SetAttribute( "value", '' );
-      searchcolumnelement.AppendChild( searchcellElement );
-    }
-    
-    minindex        := min( table, FinancialSalesColumn, column, not column.IsDay(), column.Index() );
+    minindex                      := min( table, FinancialSalesColumn, column, not column.IsDay(), column.Index() );
     traverse ( table, FinancialSalesColumn, column, not column.IsDay() ) {
-      columnelement               := xmlDOM.CreateElement( "column" );
-      nameelement                 := xmlDOM.CreateElement( "name" );
-      typeelement                 := xmlDOM.CreateElement( "type" );
-      nameelement.TextContent( column.Name() );
-      typeelement.TextContent( "String" );
-      columnelement.AppendChild( nameelement );
-      columnelement.AppendChild( typeelement );
+      columnelement               := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, column.Name() );
       
       cells := selectsortedset( column, FinancialSalesCell, cell, cell.FinancialSalesRow().RowNr() );
     
       traverse ( cells, Elements, c ) {
         if( column.Index() = minindex ){
           row                     := c.FinancialSalesRow();
+          //Factory
+          InventorySummarySource::CreateCellElement( xmlDOM, searchunitcolumn, row.Factory() );
+          //Generation
+          InventorySummarySource::CreateCellElement( xmlDOM, generationcolumn, row.Product_MP().Generation() );
+          //Power
+          InventorySummarySource::CreateCellElement( xmlDOM, powercolumn, row.Product_MP().Power() );
+          //MLBMQBS
+          InventorySummarySource::CreateCellElement( xmlDOM, mlbmqbcolumn, row.Product_MP().MQBMLB() );
           //Product
-          productcellElement      := xmlDOM.CreateElement( "cell" );
-          productcellElement.SetAttribute( "value", row.Name() );
-          productcolumnelement.AppendChild( productcellElement );
+          InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
           //Unit
-          unitcellElement         := xmlDOM.CreateElement( "cell" );
-          unitcellElement.SetAttribute( "value", row.Unit() );
-          unitcolumnelement.AppendChild( unitcellElement );
-          if( cells.Size() > searchtotal ){
-            for( i := searchtotal; i < cells.Size(); i := i + 1 ){
-              searchcellElement1  := xmlDOM.CreateElement( "cell" );
-              searchcellElement1.SetAttribute( "value", '' );
-              searchcolumnelement.AppendChild( searchcellElement1 );
-            }
-          }
+          InventorySummarySource::CreateCellElement( xmlDOM, unitcolumnelement, row.Unit() );
         }
-        cellElement               := xmlDOM.CreateElement( "cell" );
-        cellElement.SetAttribute( "value", c.Value() ); 
-        columnelement.AppendChild( cellElement );
-      }
-      for( i := cells.Size(); i < searchtotal; i := i + 1 ){
-        searchcellElement         := xmlDOM.CreateElement( "cell" );
-        searchcellElement.SetAttribute( "value", '' );
-        columnelement.AppendChild( searchcellElement );
-        
-        if( column.Index() = minindex ){
-          productcellElement      := xmlDOM.CreateElement( "cell" );
-          productcellElement.SetAttribute( "value", '' );
-          productcolumnelement.AppendChild( productcellElement );
-          //Unit
-          unitcellElement         := xmlDOM.CreateElement( "cell" );
-          unitcellElement.SetAttribute( "value", '' );
-          unitcolumnelement.AppendChild( unitcellElement );
-        }
+        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, c.Value() );
       }
       tableElement.AppendChild( columnelement );  
     }
diff --git a/_Main/BL/Type_InventorySummaryColumn/Method_GenerateCell.qbl b/_Main/BL/Type_InventorySummaryColumn/Method_GenerateCell.qbl
index c56f1d4..8daf1ab 100644
--- a/_Main/BL/Type_InventorySummaryColumn/Method_GenerateCell.qbl
+++ b/_Main/BL/Type_InventorySummaryColumn/Method_GenerateCell.qbl
@@ -7,7 +7,7 @@
   InventorySummaryReport table,
   Date start,
   Date end,
-  String productid,
+  Product_MP product,
   String allunit,
   String ccunit,
   String dlunit
@@ -17,22 +17,22 @@
   [*
     // 鐢勫叞楦� Jul-3-2024 (created)
     //All
-    alldetails := selectset( selections, Elements.InventoryInterfaceDataDetail, detail, detail.PartNumber() = productid and detail.Date() >= start and detail.Date() <= end );
+    alldetails := selectset( selections, Elements.InventoryInterfaceDataDetail, detail, detail.PartNumber() = product.ID() and detail.Date() >= start and detail.Date() <= end );
     if( alldetails.Size() > 0 ){
-      allrow     := table.GetRow( allunit, productid );
+      allrow     := table.GetRow( allunit, product );
       allvalue := sum( alldetails, Elements, e, [Number]e.Quantity() );
       allrow.SetCellValue( this, allvalue );
       //闀挎槬
       ccdetails := selectset( alldetails, Elements, detail, ccstockingpointids.Find( detail.InventoryPointSelection().StockpoingPoint() ) >= 0 );
       if( ccdetails.Size() > 0 ){
-        ccrow := table.GetRow( ccunit, productid );
+        ccrow := table.GetRow( ccunit, product );
         value := sum( ccdetails, Elements, e, [Number]e.Quantity() );
         ccrow.SetCellValue( this, value );
       }
       //澶ц繛
       dldetails := selectset( alldetails, Elements, detail, dlstockingpointids.Find( detail.InventoryPointSelection().StockpoingPoint() ) >= 0 );
       if( dldetails.Size() > 0 ){
-        dlrow := table.GetRow( dlunit, productid );
+        dlrow := table.GetRow( dlunit, product );
         value := sum( dldetails, Elements, e, [Number]e.Quantity() );
         dlrow.SetCellValue( this, value );
       }
diff --git "a/_Main/BL/Type_InventorySummaryReport/Method_GenerateShow\043925.qbl" "b/_Main/BL/Type_InventorySummaryReport/Method_GenerateShow\043925.qbl"
index 7ed3100..43e03de 100644
--- "a/_Main/BL/Type_InventorySummaryReport/Method_GenerateShow\043925.qbl"
+++ "b/_Main/BL/Type_InventorySummaryReport/Method_GenerateShow\043925.qbl"
@@ -9,14 +9,14 @@
   TextBody:
   [*
     // 鐢勫叞楦� Oct-12-2024 (created)
-    sumrow                    := this.InventroySummaryRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( 'SUM' ), Unit := factory );
+    sumrow                    := this.InventroySummaryRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( 'SUM' ), Factory := factory );
     sumrow.InitializeCell( this );
     traverse( table, InventroySummaryRow, row, row.Unit() = factory ){
       productid               := construct( Strings );
       productid.Add( row.Name() );
         
       if( productids.ContainsAll( productid ) ){
-        showrow               := this.InventroySummaryRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( row.Name() ), Unit := row.Unit(), RowNr := row.RowNr() );
+        showrow               := this.InventroySummaryRow( relnew, Name := factory.Format( 'S(Len(10))' ).Concat( row.Name() ), Generation := row.Generation(), Power := row.Power(), MLBMQB := row.MLBMQB(), Unit := row.Unit(), Factory := factory, RowNr := row.RowNr() );
         traverse( this, InventorySummaryColumn, column ){
           sumcell             := selectobject( column, InventorySummaryCell, c, c.InventroySummaryRow() = sumrow );
           daycells            := selectset( row, InventorySummaryCell, cell, cell.InventorySummaryColumn().TimeUnit() = Translations::MP_GlobalParameters_Day() and
diff --git a/_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl b/_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl
index 7fc4aeb..0861cec 100644
--- a/_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl
+++ b/_Main/BL/Type_InventorySummaryReport/Method_GetRow.qbl
@@ -2,16 +2,16 @@
 #parent: #root
 Method GetRow (
   String unit,
-  String product
+  Product_MP product
 ) as InventroySummaryRow
 {
   TextBody:
   [*
     // 鐢勫叞楦� Jun-28-2024 (created)
-    row := selectobject( this, InventroySummaryRow, row, row.Name() = product and row.Unit() = unit );
+    row := selectobject( this, InventroySummaryRow, row, row.Name() = product.ID() and row.Unit() = unit );
     
     if( isnull( row ) ){
-      row := this.InventroySummaryRow( relnew, Name := product, Unit := unit );
+      row := this.InventroySummaryRow( relnew, Name := product.ID(), Generation := product.Generation(), Power := product.Power(), MLBMQB := product.MQBMLB(), Unit := unit );
       //鍒濆鍖栧崟鍏冩牸
       row.InitializeCell( this );
     }
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateCellElement0.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateCellElement0.qbl
deleted file mode 100644
index 509d7b3..0000000
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateCellElement0.qbl
+++ /dev/null
@@ -1,19 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod CreateCellElement (
-  XMLDOMDocument xmlDOM,
-  XMLDOMElement columnelement,
-  String value,
-  Number rowsize
-)
-{
-  TextBody:
-  [*
-    // 鐢勫叞楦� Oct-18-2024 (created)
-    for( j := 0; j < rowsize; j := j + 1 ){
-      cellElement          := xmlDOM.CreateElement( "cell" );
-      cellElement.SetAttribute( "value", value );
-      columnelement.AppendChild( cellElement );
-    }
-  *]
-}
diff --git "a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement\043822.qbl" "b/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement\043822.qbl"
deleted file mode 100644
index 690264a..0000000
--- "a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement\043822.qbl"
+++ /dev/null
@@ -1,24 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod CreateColumnElement (
-  XMLDOMElement xmltable,
-  XMLDOMDocument xmlDOM,
-  String value,
-  String name,
-  Number rowsize
-) as XMLDOMElement
-{
-  TextBody:
-  [*
-    // 鐢勫叞楦� Oct-18-2024 (created)
-    columnelement           := InventorySummarySource::CreateColumnElement( xmltable, xmlDOM, name );
-    
-    InventorySummarySource::CreateCellElement( xmlDOM, columnelement, value );
-    
-    for( i := 1; i < rowsize; i := i + 1 ){
-      InventorySummarySource::CreateCellElement( xmlDOM, columnelement, '' );
-    }
-    
-    return columnelement;
-  *]
-}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement.qbl
deleted file mode 100644
index e1d08e3..0000000
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement.qbl
+++ /dev/null
@@ -1,26 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod CreateColumnElement (
-  XMLDOMElement xmltable,
-  XMLDOMDocument xmlDOM,
-  Strings values,
-  String name,
-  Number rowsize
-) as XMLDOMElement
-{
-  TextBody:
-  [*
-    // 鐢勫叞楦� Oct-18-2024 (created)
-    columnelement           := InventorySummarySource::CreateColumnElement( xmltable, xmlDOM, name );
-    
-    for( i := 0; i < rowsize; i := i + 1 ){
-      if( i < values.Size() ){
-        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, values.Element( i ) );
-      }else{
-        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, '' );
-      }
-    }
-    
-    return columnelement;
-  *]
-}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement0.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement0.qbl
deleted file mode 100644
index e018a3e..0000000
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_CreateColumnElement0.qbl
+++ /dev/null
@@ -1,21 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod CreateColumnElement (
-  XMLDOMElement xmltable,
-  XMLDOMDocument xmlDOM,
-  String name,
-  Number rowsize
-) as XMLDOMElement
-{
-  TextBody:
-  [*
-    // 鐢勫叞楦� Oct-18-2024 (created)
-    columnelement           := InventorySummarySource::CreateColumnElement( xmltable, xmlDOM, '' );
-    
-    for( i := 0; i < rowsize; i := i + 1 ){
-      InventorySummarySource::CreateCellElement( xmlDOM, columnelement, '' );
-    }
-    InventorySummarySource::CreateCellElement( xmlDOM, columnelement, name );
-    return columnelement;
-  *]
-}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl
index d18d397..72cd244 100644
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_Download.qbl
@@ -1,84 +1,61 @@
 Quintiq file version 2.0
 #parent: #root
 StaticMethod Download (
-  MacroPlan macroPlan,
-  Factorys factorys,
-  ProductGenerations generations,
-  ProductPowers powers,
-  ProductMLBMQBs mlbmqls,
-  InventorySummarySearch search
+  MacroPlan macroPlan
 ) as BinaryValue
 {
   Description: '涓嬭浇璐㈠姟鎶ヨ〃鏁版嵁'
   TextBody:
   [*
     //鑾峰彇鏌ヨ琛屾暟
-    searchrowsize               := InventorySummarySource::GetSearchRows( factorys, generations, powers, mlbmqls );
     table                       := selectobject( macroPlan, InventorySummarySource.InventorySummaryReport, table, table.IsShow() );
     
     xmlDOMI                     := XMLDOMImplementation::Create();
     xmlDOM                      := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
     
     tableElement                := xmlDOM.GetElementByTagName( "table", 0 );
-    //Product/Unit
-    factoryvalues               := selectuniquevalues( factorys, Elements, factory, factory.Name() );
-    productcolumnelement        := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, factoryvalues, 'Unit', searchrowsize );
-    InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, 'Product' );
-    //Unit/Generation
-    generationvalues            := selectuniquevalues( generations, Elements, generation, generation.Generation() );
-    unitcolumnelement           := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, generationvalues, 'Generation', searchrowsize );
-    InventorySummarySource::CreateCellElement( xmlDOM, unitcolumnelement, 'Unit' );
-    //Attribute/Power
-    powervalues                 := selectuniquevalues( powers, Elements, power, power.Power() );
-    attricolumnelement          := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, powervalues, 'Power', searchrowsize );
-    InventorySummarySource::CreateCellElement( xmlDOM, attricolumnelement, 'Attribute' );
+    //Factory
+    searchunitcolumn            := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Unit' );
+    //Generation
+    generationcolumn            := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Generation' );
+    //Power
+    powercolumn                 := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Power' );
     //MLBMQBS
-    mlbmqbvalues                := selectuniquevalues( mlbmqls, Elements, mlbmqb, mlbmqb.MLBMQB() );
-    mlbmqlcolumnelement         := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, mlbmqbvalues, 'MLBMQB', searchrowsize );
-    //Start date
-    startcolumnelement          := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, search.StartDate().Format( 'M2/D2/Y' ), 'Start date', searchrowsize );
-    //End date
-    endcolumnelement            := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, search.EndDate().Format( 'M2/D2/Y' ), 'End date', searchrowsize );
-    //Period
-    periodcolumnelement         := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, search.Category(), 'Period', searchrowsize );
-    
-    searchcolumn                := 7 ;
-    rowsize                     := table.InventroySummaryRow( relsize ) * 4;
-    for( i := table.InventorySummaryColumn( relsize ); i < searchcolumn - 3; i := i + 1 ){
-      if( i = 0 ){
-        InventorySummarySource::CreateCellElement( xmlDOM, mlbmqlcolumnelement, '', rowsize );
-      }else if( i = 1 ){
-        InventorySummarySource::CreateCellElement( xmlDOM, startcolumnelement, '', rowsize );
-      }else if( i = 2 ){
-        InventorySummarySource::CreateCellElement( xmlDOM, endcolumnelement, '', rowsize );
-      }else if( i = 3 ){
-        InventorySummarySource::CreateCellElement( xmlDOM, periodcolumnelement, '', rowsize );
-      }
-    }
-    
+    mlbmqbcolumn                := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'MLBMQB' );
+    //Product
+    productcolumnelement        := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Product' );
+    //Unit
+    unitcolumnelement           := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Unit' );
+    //Attribute
+    attricolumnelement          := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Attribute' );
     traverse ( table, InventorySummaryColumn, column ) {
-      columnelement             := null( XMLDOMElement ); 
-      if( column.Index() = 0 ){
-        columnelement           := mlbmqlcolumnelement;
-        InventorySummarySource::CreateCellElement( xmlDOM, mlbmqlcolumnelement, column.Name() );
-      }else if( column.Index() = 1 ){
-        columnelement           := startcolumnelement
-        InventorySummarySource::CreateCellElement( xmlDOM, startcolumnelement, column.Name() );
-      }else if( column.Index() = 2 ){
-        columnelement           := endcolumnelement;
-        InventorySummarySource::CreateCellElement( xmlDOM, endcolumnelement, column.Name() );
-      }else if( column.Index() = 3 ){
-        columnelement           := periodcolumnelement;
-        InventorySummarySource::CreateCellElement( xmlDOM, periodcolumnelement, column.Name() );
-      }else{
-        columnelement           := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, column.Name(), rowsize );
-      }
+      columnelement             := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, column.Name() );
       
       cells                     := selectsortedset( column, InventorySummaryCell, cell, cell.InventroySummaryRow().RowNr() );
     
       traverse ( cells, Elements, c ) {
         if( column.Index() = 0 ){
           row                   := c.InventroySummaryRow();
+          //Factory
+          InventorySummarySource::CreateCellElement( xmlDOM, searchunitcolumn, row.Factory() );
+          InventorySummarySource::CreateCellElement( xmlDOM, searchunitcolumn, row.Factory() );
+          InventorySummarySource::CreateCellElement( xmlDOM, searchunitcolumn, row.Factory() );
+          InventorySummarySource::CreateCellElement( xmlDOM, searchunitcolumn, row.Factory() );
+          //Generation
+          InventorySummarySource::CreateCellElement( xmlDOM, generationcolumn, row.Generation() );
+          InventorySummarySource::CreateCellElement( xmlDOM, generationcolumn, row.Generation() );
+          InventorySummarySource::CreateCellElement( xmlDOM, generationcolumn, row.Generation() );
+          InventorySummarySource::CreateCellElement( xmlDOM, generationcolumn, row.Generation() );
+          //Power
+          InventorySummarySource::CreateCellElement( xmlDOM, powercolumn, row.Power() );
+          InventorySummarySource::CreateCellElement( xmlDOM, powercolumn, row.Power() );
+          InventorySummarySource::CreateCellElement( xmlDOM, powercolumn, row.Power() );
+          InventorySummarySource::CreateCellElement( xmlDOM, powercolumn, row.Power() );
+          //MLBMQBS
+          InventorySummarySource::CreateCellElement( xmlDOM, mlbmqbcolumn, row.MLBMQB() );
+          InventorySummarySource::CreateCellElement( xmlDOM, mlbmqbcolumn, row.MLBMQB() );
+          InventorySummarySource::CreateCellElement( xmlDOM, mlbmqbcolumn, row.MLBMQB() );
+          InventorySummarySource::CreateCellElement( xmlDOM, mlbmqbcolumn, row.MLBMQB() );
           //Product
           InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
           InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_Download0.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_Download0.qbl
deleted file mode 100644
index 36a27c4..0000000
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_Download0.qbl
+++ /dev/null
@@ -1,104 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod Download0 (
-  MacroPlan macroPlan,
-  Factorys factorys,
-  ProductGenerations generations,
-  ProductPowers powers,
-  ProductMLBMQBs mlbmqls,
-  InventorySummarySearch search
-) as BinaryValue
-{
-  Description: '涓嬭浇璐㈠姟鎶ヨ〃鏁版嵁'
-  TextBody:
-  [*
-    //鑾峰彇鏌ヨ琛屾暟
-    searchrowsize               := InventorySummarySource::GetSearchRows( factorys, generations, powers, mlbmqls );
-    table                       := selectobject( macroPlan, InventorySummarySource.InventorySummaryReport, table, table.IsShow() );
-    
-    xmlDOMI                     := XMLDOMImplementation::Create();
-    xmlDOM                      := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + table.Name() + '</name></table>' );
-    
-    tableElement                := xmlDOM.GetElementByTagName( "table", 0 );
-    //Product
-    productcolumnelement        := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Product' );
-    //Unit
-    unitcolumnelement           := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Unit' );
-    //Attribute
-    attricolumnelement          := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, 'Attribute' );
-    traverse ( table, InventorySummaryColumn, column ) {
-      columnelement             := InventorySummarySource::CreateColumnElement( tableElement, xmlDOM, column.Name() );
-      
-      cells                     := selectsortedset( column, InventorySummaryCell, cell, cell.InventroySummaryRow().RowNr() );
-    
-      traverse ( cells, Elements, c ) {
-        if( column.Index() = 0 ){
-          row                   := c.InventroySummaryRow();
-          //Product
-          InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
-          InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
-          InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
-          InventorySummarySource::CreateCellElement( xmlDOM, productcolumnelement, row.Name() );
-          //Unit
-          InventorySummarySource::CreateCellElement( xmlDOM, unitcolumnelement, row.Unit() );
-          InventorySummarySource::CreateCellElement( xmlDOM, unitcolumnelement, row.Unit() );
-          InventorySummarySource::CreateCellElement( xmlDOM, unitcolumnelement, row.Unit() );
-          InventorySummarySource::CreateCellElement( xmlDOM, unitcolumnelement, row.Unit() );
-          //Attribute
-          //鏈熸湯搴撳瓨
-          InventorySummarySource::CreateCellElement( xmlDOM, attricolumnelement, '鏈熸湯搴撳瓨' );//EndingInventory
-          //鏈�灏忓簱瀛�
-          InventorySummarySource::CreateCellElement( xmlDOM, attricolumnelement, '鏈�灏忓簱瀛�' );//MinimumInventory
-          //鏈�澶у簱瀛�
-          InventorySummarySource::CreateCellElement( xmlDOM, attricolumnelement, '鏈�澶у簱瀛�' );//MaximumInventory
-          //骞冲潎搴撳瓨
-          InventorySummarySource::CreateCellElement( xmlDOM, attricolumnelement, '骞冲潎搴撳瓨' );//AverageInventory
-    
-        }
-        //鏈熸湯搴撳瓨
-        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, [String]c.EndingInventory() );
-        //鏈�灏忓簱瀛�
-        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, [String]c.MinimumInventory() );
-        //鏈�澶у簱瀛�
-        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, [String]c.MaximumInventory() );
-        //骞冲潎搴撳瓨
-        InventorySummarySource::CreateCellElement( xmlDOM, columnelement, [String]c.AverageInventory() );
-      }
-    
-      tableElement.AppendChild( columnelement );  
-    }
-    searchxmlDOM                := xmlDOMI.CreateDocumentFromString( '<?xml version="1.0" encoding="UTF-16"?><table><name>' + 'Search' + '</name></table>' );
-    searchElement               := searchxmlDOM.GetElementByTagName( "table", 0 );
-    //Unit
-    factoryvalues               := selectuniquevalues( factorys, Elements, factory, factory.Name() );
-    InventorySummarySource::CreateColumnElement( searchElement, searchxmlDOM, factoryvalues, 'Unit', searchrowsize );
-    //Generation
-    generationvalues            := selectuniquevalues( generations, Elements, generation, generation.Generation() );
-    InventorySummarySource::CreateColumnElement( searchElement, searchxmlDOM, generationvalues, 'Generation', searchrowsize );
-    //Power
-    powervalues                 := selectuniquevalues( powers, Elements, power, power.Power() );
-    InventorySummarySource::CreateColumnElement( searchElement, searchxmlDOM, powervalues, 'Power', searchrowsize );
-    //MLBMQBS
-    mlbmqbvalues                := selectuniquevalues( mlbmqls, Elements, mlbmqb, mlbmqb.MLBMQB() );
-    InventorySummarySource::CreateColumnElement( searchElement, searchxmlDOM, mlbmqbvalues, 'MLBMQB', searchrowsize );
-    //Start date
-    InventorySummarySource::CreateColumnElement( searchElement, searchxmlDOM, search.StartDate().Format( 'M2/D2/Y' ), 'Start date', searchrowsize );
-    //End date
-    InventorySummarySource::CreateColumnElement( searchElement, searchxmlDOM, search.EndDate().Format( 'M2/D2/Y' ), 'End date', searchrowsize );
-    //Period
-    InventorySummarySource::CreateColumnElement( searchElement, searchxmlDOM, search.Category(), 'Period', searchrowsize );
-    
-    xmlString                   := xmlDOMI.CreateSerializer().WriteToString( xmlDOM );
-    
-    tableGroupHandle            := TableGroupHandle::Create( InventorySummaryReport::GetDefaultName() );
-    tableHandle                 := TableHandle::ImportXML( BinaryValue::Construct( xmlString ) );
-    tableGroupHandle.Add( tableHandle );
-    searchxmlString                   := xmlDOMI.CreateSerializer().WriteToString( searchxmlDOM );
-    searchtableHandle                 := TableHandle::ImportXML( BinaryValue::Construct( searchxmlString ) );
-    tableGroupHandle.Add( searchtableHandle );
-    
-    binaryData                  := XLS::SaveTableGroupToBinaryData( tableGroupHandle, true );
-    
-    return binaryData.AsBinaryValue();
-  *]
-}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_GetSearchRows.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_GetSearchRows.qbl
deleted file mode 100644
index b8deb38..0000000
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_GetSearchRows.qbl
+++ /dev/null
@@ -1,22 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-StaticMethod GetSearchRows (
-  Factorys factorys,
-  ProductGenerations generations,
-  ProductPowers powers,
-  ProductMLBMQBs mlbmqls
-) as Number
-{
-  Description: '鑾峰彇鏌ヨ鏉′欢琛屾暟'
-  TextBody:
-  [*
-    // 鐢勫叞楦� Oct-18-2024 (created)
-    searchrows                  := construct( Numbers );
-    searchrows.Add( factorys.Size() );
-    searchrows.Add( generations.Size() );
-    searchrows.Add( powers.Size() );
-    searchrows.Add( mlbmqls.Size() );
-    searchrowsize               := max( searchrows, Elements, e, e );
-    return searchrowsize;
-  *]
-}
diff --git a/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl b/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
index 015ec8b..acab2f9 100644
--- a/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
+++ b/_Main/BL/Type_InventorySummarySource/StaticMethod_Initialize.qbl
@@ -37,9 +37,9 @@
         traverse( stockingpoint, ProductInStockingPoint_MP, pisp,  pisp.Product_MP().IsLeaf() ){
           productids.Add( pisp.ProductID() );
           //鑾峰彇宸ュ巶琛�
-          factoryrow          := table.GetRow( ifexpr( iscc, ccunit, dlunit ), pisp.ProductID() );
+          factoryrow          := table.GetRow( ifexpr( iscc, ccunit, dlunit ), pisp.Product_MP() );
           //鑾峰彇鍚堣琛�
-          allrow              := table.GetRow( allunit, pisp.ProductID() );
+          allrow              := table.GetRow( allunit, pisp.Product_MP() );
           
           pispips             := selectsortedset( pisp, ProductInStockingPointInPeriod, pispip, pispip.Start() < startofnextyear 
                                                   and pispip.Period_MP().TimeUnit() = Translations::MP_GlobalParameters_Day(), pispip.Start() );
@@ -80,7 +80,8 @@
     traverse( table, InventorySummaryColumn, column, column.TimeUnit() = Translations::MP_GlobalParameters_Day() and column.StartDate() < startofplanning.Date() ){
       traverse( productidset, Elements, productid ){
         productids.Add( productid );
-        column.GenerateCell( selections, ccsps, dlsps, table, column.StartDate(), column.EndaDate(), productid, allunit, ccunit, dlunit );
+        product               := selectobject( owner, Product_MP, product, product.ID() = productid );
+        column.GenerateCell( selections, ccsps, dlsps, table, column.StartDate(), column.EndaDate(), product, allunit, ccunit, dlunit );
       }
     }
       
diff --git a/_Main/BL/Type_InventroySummaryRow/Attribute_Factory.qbl b/_Main/BL/Type_InventroySummaryRow/Attribute_Factory.qbl
new file mode 100644
index 0000000..e1863ad
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Attribute_Factory.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Factory
+{
+  #keys: '3[415136.0.1226331362][415136.0.1226331361][415136.0.1226331363]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Attribute_Generation.qbl b/_Main/BL/Type_InventroySummaryRow/Attribute_Generation.qbl
new file mode 100644
index 0000000..490c3ad
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Attribute_Generation.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Generation
+{
+  #keys: '3[415136.0.1226310057][415136.0.1226310056][415136.0.1226310058]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Attribute_MLBMQB.qbl b/_Main/BL/Type_InventroySummaryRow/Attribute_MLBMQB.qbl
new file mode 100644
index 0000000..223874b
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Attribute_MLBMQB.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute MLBMQB
+{
+  #keys: '3[415136.0.1226310078][415136.0.1226310077][415136.0.1226310079]'
+  ValueType: String
+}
diff --git a/_Main/BL/Type_InventroySummaryRow/Attribute_Power.qbl b/_Main/BL/Type_InventroySummaryRow/Attribute_Power.qbl
new file mode 100644
index 0000000..0532e2f
--- /dev/null
+++ b/_Main/BL/Type_InventroySummaryRow/Attribute_Power.qbl
@@ -0,0 +1,7 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute Power
+{
+  #keys: '3[415136.0.1226310068][415136.0.1226310067][415136.0.1226310069]'
+  ValueType: String
+}
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelExport_369_ButtonExport696_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelExport_369_ButtonExport696_OnClick.def
index 3ee2cc5..2ad8c4d 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelExport_369_ButtonExport696_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialProductionReport/Response_PanelExport_369_ButtonExport696_OnClick.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      binaryValue := FinancialProductionSource::Download( MacroPlan, dhFactorys.Data(), dhGenerations.Data(), dhPowers.Data(), dhMQBMLBs.Data() );
+      binaryValue := FinancialProductionSource::Download( MacroPlan );
       
       Application.Download( FinancialProductionReport::GetDefaultName() + '.xlsx', binaryValue.AsBinaryData() );
     *]
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelLeft.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelLeft.def
index 00fd43a..089941a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelLeft.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Component_PanelLeft.def
@@ -12,6 +12,7 @@
   ]
   Properties:
   [
+    FixedSize: true
     Taborder: 0
   ]
 }
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_ButtonExport570_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_ButtonExport570_OnClick.def
index a198312..96fa9ae 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_ButtonExport570_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormFinancialSalesReport/Response_PanelExport_ButtonExport570_OnClick.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      binaryValue := FinancialSalesSource::Download( MacroPlan, dhFactorys.Data(), dhGenerations.Data(), dhPowers.Data(), dhMQBMLBs.Data() );
+      binaryValue := FinancialSalesSource::Download( MacroPlan );
       
       Application.Download( FinancialSalesReport::GetDefaultName() + '.xlsx', binaryValue.AsBinaryData() );
       //owner.FinancialSalesSource( relflush );
diff --git a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def
index e049eb6..b3d157a 100644
--- a/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def
+++ b/_Main/UI/MacroPlannerWebApp/Component_FormInventorySummaryReport/Response_PanelExport_ButtonSummaryExport_OnClick.def
@@ -13,7 +13,7 @@
   {
     Body:
     [*
-      binaryValue := InventorySummarySource::Download( MacroPlan, dhFactorys.Data(), dhGenerations.Data(), dhPowers.Data(), dhMQBMLBs.Data(), dhSearch.Data() );
+      binaryValue := InventorySummarySource::Download( MacroPlan );
       
       Application.Download( InventorySummaryReport::GetDefaultName() + '.xlsx', binaryValue.AsBinaryData() );
     *]

--
Gitblit v1.9.3