| Quintiq file version 2.0 | 
| #parent: #root | 
| Method Generate ( | 
|   EnginePipelineSearch search, | 
|   Product_MPs products | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     // 甄兰鸽 Jun-25-2024 (created) | 
|     table                   := selectobject( this, Source.Report, report, not report.IsShow() ); | 
|     //清空之前存储的显示数据 | 
|     this.Clear( search.TimeUnit(), search.StartDate(), search.EndDate() ); | 
|     Transaction::Transaction().Propagate( attribute( EnginePipelineColumn, Index ) ); | 
|     Transaction::Transaction().Propagate( attribute( EnginePipelineCell, ProductionQuantity ) ); | 
|     Transaction::Transaction().Propagate( attribute( EnginePipelineCell, DemandQuantity ) ); | 
|     //过滤后的产品id | 
|     productids              := selectuniquevalues( products, Elements, product, true, product.ID() ); | 
|     rows                    := selectsortedset( table, Row, row, row.RowNr() ); | 
|     //显示列 | 
|     productcolumn           := selectobject( this, Column, column, column.Index() = 0 ); | 
|     attricolumn             := selectobject( this, Column, column, column.Index() = 1 ); | 
|     models                  := selectuniquevalues( table, Column.Cell.Demand, demand, demand.Model() ); | 
|     cellnr                  := 5 + models.Size(); | 
|     //合计行 | 
|     sumrowproduction        := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '生产', rows.Size() * cellnr, true ); | 
|     sumrowdlproduction      := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '大连产量', sumrowproduction.RowNr() + 1, false ); | 
|     sumrowccproduction      := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '长春产量', sumrowproduction.RowNr() + 2, false ); | 
|     sumrowdemand            := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '需求', sumrowproduction.RowNr() + 3, false ); | 
|     rowno                   := sumrowproduction.RowNr() + 4; | 
|     traverse( models, Elements, model ){ | 
|       EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', model, rowno, false );  | 
|       rowno                 := rowno + 1; | 
|     } | 
|     sumrowinventory         := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, 'SUM', '库存', rowno, false ); | 
|      | 
|     //行计数 | 
|     rownr                   := 0; | 
|     traverse( rows, Elements, row, productids.Find( row.Name() ) >= 0 ){ | 
|      | 
|       showrowproduction   := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '生产', rownr, true );; | 
|       showrowdlproduction := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '大连产量', rownr + 1, false ); | 
|       showrowccproduction := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '长春产量', rownr + 2, false ); | 
|       showrowdemand       := EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '需求', rownr + 3, false ); | 
|       rownr               := rownr + 4; | 
|       modelsnr            := rownr + 3; | 
|       models              := construct( Strings ); | 
|       uniquemodels        := selectuniquevalues( row, Cell.Demand, demand, true, demand.Model() ); | 
|      | 
|       traverse( uniquemodels, Elements, e ){ | 
|      | 
|         if( rownr < modelsnr ){ | 
|           EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), e, rownr, false );  | 
|           models.Add( e ); | 
|           rownr             := rownr + 1; | 
|         } | 
|       } | 
|      | 
|       for( rownr := rownr; rownr < modelsnr; rownr ++ ){ | 
|      | 
|         EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '', rownr, false );  | 
|       } | 
|       showrowinventory    :=  EnginePipelineRow::CraeteCellValueForRow( this, productcolumn, attricolumn, row.Name(), '库存', rownr, false ); | 
|      | 
|       traverse( row, Cell, cell, cell.Column().TimeUnit() = search.TimeUnit() ){ | 
|      | 
|         column            := selectobject( this, Column, column, column.Name() = cell.Column().Name() and column.TimeUnit() = search.TimeUnit() ); | 
|          | 
|         if( not isnull( column ) ){ | 
|            | 
|           //生产 | 
|           production              := column.CellValue( relnew, Value := [String]cell.ProductionQuantity() ); | 
|           showrowproduction.CellValue( relinsert, production ); | 
|           sumproduction           := selectobject( column, CellValue, c, c.Row() = sumrowproduction ); | 
|      | 
|           if( isnull( sumproduction ) ){ | 
|             sumproduction         := column.CellValue( relnew, Value := [String]0 ); | 
|             sumrowproduction.CellValue( relinsert, sumproduction ); | 
|           } | 
|           sumproduction.Value( [String]( [Real]sumproduction.Value() + cell.ProductionQuantity() ) ); | 
|      | 
|           //大连产量 | 
|           dlproductionquantity     := guard( cell.Production().DLProduction(), 0 ); | 
|           dlproduction             := column.CellValue( relnew, Value := [String]dlproductionquantity ); | 
|           showrowdlproduction.CellValue( relinsert, dlproduction ); | 
|           sumdlproduction          := selectobject( column, CellValue, c, c.Row() = sumrowdlproduction ); | 
|      | 
|           if( isnull( sumdlproduction ) ){ | 
|             sumdlproduction        := column.CellValue( relnew, Value := [String]0 ); | 
|             sumrowdlproduction.CellValue( relinsert, sumdlproduction ); | 
|           } | 
|           sumdlproduction.Value( [String]( [Real]sumdlproduction.Value() + dlproductionquantity ) ); | 
|            | 
|           //长春产量 | 
|           ccproductionquantity     := guard( cell.Production().CCProduction(), 0 ); | 
|           ccproduction             := column.CellValue( relnew, Value := [String]ccproductionquantity ); | 
|           showrowccproduction.CellValue( relinsert, ccproduction ); | 
|           sumccproduction          := selectobject( column, CellValue, c, c.Row() = sumrowccproduction ); | 
|      | 
|           if( isnull( sumccproduction ) ){ | 
|             sumccproduction        := column.CellValue( relnew, Value := [String]0 ); | 
|             sumrowccproduction.CellValue( relinsert, sumccproduction ); | 
|           } | 
|           sumccproduction.Value( [String]( [Real]sumccproduction.Value() + ccproductionquantity ) ); | 
|            | 
|           //需求 | 
|           totaldemand              := column.CellValue( relnew, Value := [String]cell.DemandQuantity() ); | 
|           showrowdemand.CellValue( relinsert, totaldemand ); | 
|           sumdemand                := selectobject( column, CellValue, c, c.Row() = sumrowdemand ); | 
|           if( isnull( sumdemand ) ){ | 
|             sumdemand              := column.CellValue( relnew, Value := [String]0 ); | 
|             sumrowdemand.CellValue( relinsert, sumdemand ); | 
|           } | 
|           sumdemand.Value( [String]( [Real]sumdemand.Value() + cell.DemandQuantity() ) ); | 
|            | 
|           traverse( cell, Demand, demand, exists( models, Elements, model, model = demand.Model() ) ){ | 
|             demandrow              := selectobject( this, Row, r, r.Name() = row.Name() and exists( r, CellValue, cv, cv.Column() = attricolumn and cv.Value() = demand.Model() ) ); | 
|             sumdemandrow           := selectobject( this, Row, r, r.Name() = 'SUM' and exists( r, CellValue, cv, cv.Column() = attricolumn and cv.Value() = demand.Model() ) ); | 
|      | 
|             if( not isnull( demandrow ) ){ | 
|               demandcell             := column.CellValue( relnew, Value := [String]demand.Quantity() ); | 
|               demandrow.CellValue( relinsert, demandcell ); | 
|             } | 
|             if( not isnull( sumdemandrow ) ){ | 
|             sumdemandcell          := selectobject( column, CellValue, c, c.Row() = sumdemandrow ); | 
|             if( isnull( sumdemandcell ) ){ | 
|               sumdemandcell        := column.CellValue( relnew, Value := [String]0 ); | 
|               sumdemandrow.CellValue( relinsert, sumdemandcell ); | 
|             } | 
|             sumdemandcell.Value( [String]( [Real]sumdemandcell.Value() + demand.Quantity() ) ); | 
|             } | 
|           } | 
|      | 
|           for( demandr := showrowdemand.RowNr() + 1; demandr < showrowinventory.RowNr(); demandr := demandr + 1 ){ | 
|             demandrow              := selectobject( this, Row, r, r.RowNr() = demandr and r.Name() = row.Name() ); | 
|             if( not isnull( demandrow ) and not exists( demandrow, CellValue, cv, cv.Column() = column ) ){ | 
|               demandcell           := column.CellValue( relnew, Value := '' ); | 
|               demandrow.CellValue( relinsert, demandcell ); | 
|             } | 
|           } | 
|      | 
|            | 
|           //库存 | 
|           inventory                := column.CellValue( relnew, Value := [String]cell.InventoryQuantity() ); | 
|           showrowinventory.CellValue( relinsert, inventory ); | 
|           suminventory             := selectobject( column, CellValue, c, c.Row() = sumrowinventory ); | 
|           if( isnull( suminventory ) ){ | 
|             suminventory           := column.CellValue( relnew, Value := [String]0 ); | 
|             sumrowinventory.CellValue( relinsert, suminventory ); | 
|           } | 
|           suminventory.Value( [String]( [Real]suminventory.Value() + cell.InventoryQuantity() ) ); | 
|      | 
|         } | 
|       } | 
|     } | 
|     traverse( this, Column, column ){ | 
|       for( demandr := sumrowdemand.RowNr() + 1; demandr < sumrowinventory.RowNr(); demandr := demandr + 1 ){ | 
|         demandrow              := selectobject( this, Row, r, r.RowNr() = demandr and r.Name() = 'SUM' ); | 
|     //    info( '------------------14----------------' ); | 
|         if( not isnull( demandrow ) and not exists( demandrow, CellValue, cv, cv.Column() = column ) ){ | 
|           demandcell           := column.CellValue( relnew, Value := '' ); | 
|           demandrow.CellValue( relinsert, demandcell ); | 
|         } | 
|       } | 
|     } | 
|      | 
|     rows := selectsortedset( this, Row, row, row.Name(), row.RowNr() ); | 
|     i    := 0; | 
|     traverse( rows, Elements, e ){ | 
|       e.RowNr( i ); | 
|       i := i + 1; | 
|     } | 
|   *] | 
| } |