Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod ComparedNew ( 
 | 
  RecycleBin recycleBin, 
 | 
  const NewOfflinePlanTable baseOfflinePlan, 
 | 
  const NewOfflinePlanTable compareOfflinePlan 
 | 
) as LocalTable 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // rislai Jun-20-2024 (created) 
 | 
    table := recycleBin.LocalTable( relnew,Name := LocalCell_OfflinePlanComparison::GetTableName()); 
 | 
     
 | 
    localColumns := construct( LocalColumns ); 
 | 
    localColumnIndexTree := NamedValueTree::Create(); 
 | 
    traverse( baseOfflinePlan,NewOfflinePlanColumn,column,column.StartDate() >=  baseOfflinePlan.MacroPlan().StartOfPlanning().Date()){ 
 | 
      localColumnHandle := localColumnIndexTree.GetHandle( column.StartDate().AsQUILL() ); 
 | 
      localColumnIndex := guard( localColumnIndexTree.Root().Child( localColumnHandle ),null( NamedValue )); 
 | 
      if( isnull( localColumnIndex )){ 
 | 
        localColumn := table.LocalColumn( relnew,CustomDate := column.StartDate(),TimeUnit := "Day"); 
 | 
        localColumns.Add( localColumn ); 
 | 
        localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 ); 
 | 
      } 
 | 
    } 
 | 
    traverse( compareOfflinePlan,NewOfflinePlanColumn,column,column.StartDate() >=  compareOfflinePlan.MacroPlan().StartOfPlanning().Date()){ 
 | 
      localColumnHandle := localColumnIndexTree.GetHandle( column.StartDate().AsQUILL() ); 
 | 
      localColumnIndex := guard( localColumnIndexTree.Root().Child( localColumnHandle ),null( NamedValue )); 
 | 
      if( isnull( localColumnIndex )){ 
 | 
        localColumn := table.LocalColumn( relnew,CustomDate := column.StartDate(),TimeUnit := "Day"); 
 | 
        localColumns.Add( localColumn ); 
 | 
        localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    baseOfflinePlanCells := construct( NewOfflinePlanCells, constcontent ); 
 | 
    baseOfflinePlanCellIndexTree := NamedValueTree::Create(); 
 | 
    compareOfflinePlanCells := construct( NewOfflinePlanCells, constcontent ); 
 | 
    compareOfflinePlanCellIndexTree := NamedValueTree::Create(); 
 | 
     
 | 
    localRows := construct( LocalRows ); 
 | 
    localRowIndexTree := NamedValueTree::Create(); 
 | 
     
 | 
    traverse( baseOfflinePlan,NewOfflinePlanRow,row,row.Type() = "1" ){ 
 | 
      rowKey := row.ProductID() + "@$#" + row.ProductionLine()+ "@$#"; 
 | 
      localRowHandle := localRowIndexTree.GetHandle( rowKey ); 
 | 
      localRowIndex := guard( localRowIndexTree.Root().Child( localRowHandle ),null( NamedValue )); 
 | 
      if( isnull( localRowIndex )){ 
 | 
        localRow := table.LocalRow( relnew,Index := table.GetRowIndexCache(),ProductID := row.ProductID(),CustomName := row.ProductID() + " > " + row.ProductionLine(),Remark := rowKey ); 
 | 
        localRows.Add( localRow ); 
 | 
        localRowIndexTree.Root().AddChild( localRowHandle,localRows.Size() - 1 ); 
 | 
      } 
 | 
      traverse( row,NewOfflinePlanCell,cell ){ 
 | 
        columnKey := cell.NewOfflinePlanColumn().StartDate().AsQUILL(); 
 | 
        cellKey := rowKey + columnKey; 
 | 
        cellHandle := baseOfflinePlanCellIndexTree.GetHandle( cellKey ); 
 | 
        baseOfflinePlanCells.Add( cell ); 
 | 
        baseOfflinePlanCellIndexTree.Root().AddChild( cellHandle,baseOfflinePlanCells.Size() - 1 ); 
 | 
      } 
 | 
    } 
 | 
    traverse( compareOfflinePlan,NewOfflinePlanRow,row,row.Type() = "1" ){ 
 | 
      rowKey := row.ProductID() + "@$#" + row.ProductionLine()+ "@$#"; 
 | 
      localRowHandle := localRowIndexTree.GetHandle( rowKey ); 
 | 
      localRowIndex := guard( localRowIndexTree.Root().Child( localRowHandle ),null( NamedValue )); 
 | 
      if( isnull( localRowIndex )){ 
 | 
        localRow := table.LocalRow( relnew,Index := table.GetRowIndexCache(),ProductID := row.ProductID(),CustomName := row.ProductID() + " > " + row.ProductionLine(),Remark := rowKey ); 
 | 
        localRows.Add( localRow ); 
 | 
        localRowIndexTree.Root().AddChild( localRowHandle,localRows.Size() - 1 ); 
 | 
      } 
 | 
      traverse( row,NewOfflinePlanCell,cell ){ 
 | 
        columnKey := cell.NewOfflinePlanColumn().StartDate().AsQUILL(); 
 | 
        cellHandle := compareOfflinePlanCellIndexTree.GetHandle( rowKey + columnKey ); 
 | 
        compareOfflinePlanCells.Add( cell ); 
 | 
        compareOfflinePlanCellIndexTree.Root().AddChild( cellHandle,compareOfflinePlanCells.Size() - 1 ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    traverse( localRows,Elements,localRow ){ 
 | 
      rowKey := localRow.Remark(); 
 | 
      traverse( localColumns,Elements,localColumn ){ 
 | 
        columnKey := localColumn.CustomDate().AsQUILL(); 
 | 
        cellKey := rowKey + columnKey; 
 | 
         
 | 
        baseOfflinePlanCell := constnull( NewOfflinePlanCell ); 
 | 
        compareOfflinePlanCell := constnull( NewOfflinePlanCell ); 
 | 
        baseOfflinePlanCellIndex := guard( baseOfflinePlanCellIndexTree.Root().Child( baseOfflinePlanCellIndexTree.GetHandle( cellKey ) ),null( NamedValue )); 
 | 
        compareOfflinePlanCellIndex := guard( compareOfflinePlanCellIndexTree.Root().Child( compareOfflinePlanCellIndexTree.GetHandle( cellKey ) ),null( NamedValue )); 
 | 
        if( not isnull( baseOfflinePlanCellIndex )){ 
 | 
          baseOfflinePlanCell := baseOfflinePlanCells.Element( baseOfflinePlanCellIndex.GetValueAsNumber() );  
 | 
        } 
 | 
        if( not isnull( compareOfflinePlanCellIndex )){ 
 | 
          compareOfflinePlanCell := compareOfflinePlanCells.Element( compareOfflinePlanCellIndex.GetValueAsNumber() );  
 | 
        } 
 | 
         
 | 
        localRow.LocalCell( relnew,LocalCell_OfflinePlanComparison,LocalColumn := localColumn, 
 | 
                            BaseVersion := ifexpr( isnull( baseOfflinePlanCell),0.0,baseOfflinePlanCell.Quantity()), 
 | 
                            CompareVersion := ifexpr( isnull( compareOfflinePlanCell),0.0,compareOfflinePlanCell.Quantity())); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    startDate := minselect( table,LocalColumn,localColumn,localColumn.CustomDate() ).CustomDate(); 
 | 
    endDate := maxselect( table,LocalColumn,localColumn,localColumn.CustomDate() ).CustomDate(); 
 | 
    for( i := startDate.StartOfWeek(); i <= endDate.StartOfNextWeek(); i := i.StartOfNextWeek() ){ 
 | 
      timeUnit := "Week"; 
 | 
      localColumnHandle := localColumnIndexTree.GetHandle( i.AsQUILL() + timeUnit); 
 | 
      localColumn := table.LocalColumn( relnew,CustomDate := i,TimeUnit := timeUnit ); 
 | 
      localColumns.Add( localColumn ); 
 | 
      localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 ); 
 | 
    } 
 | 
    for( i := startDate.StartOfMonth(); i <= endDate.StartOfNextMonth(); i := i.StartOfNextMonth() ){ 
 | 
      timeUnit := "Month"; 
 | 
      localColumnHandle := localColumnIndexTree.GetHandle( i.AsQUILL() + timeUnit); 
 | 
      localColumn := table.LocalColumn( relnew,CustomDate := i,TimeUnit := timeUnit ); 
 | 
      localColumns.Add( localColumn ); 
 | 
      localColumnIndexTree.Root().AddChild( localColumnHandle,localColumns.Size() - 1 ); 
 | 
    } 
 | 
     
 | 
    traverse( table,LocalRow,row ){ 
 | 
      traverse( table,LocalColumn,column,column.TimeUnit() = "Week"){ 
 | 
        baseVersionValue := sum( row,LocalCell.astype( LocalCell_OfflinePlanComparison ),cell, 
 | 
                                 cell.LocalColumn().TimeUnit() = "Day" and 
 | 
                                 cell.LocalColumn().CustomDate() >= column.CustomDate() and 
 | 
                                 cell.LocalColumn().CustomDate() < column.CustomDate().StartOfNextWeek(), cell.BaseVersion()); 
 | 
        compareVersionValue := sum( row,LocalCell.astype( LocalCell_OfflinePlanComparison ),cell, 
 | 
                                 cell.LocalColumn().TimeUnit() = "Day" and 
 | 
                                 cell.LocalColumn().CustomDate() >= column.CustomDate() and 
 | 
                                 cell.LocalColumn().CustomDate() < column.CustomDate().StartOfNextWeek(), cell.CompareVersion()); 
 | 
                                  
 | 
        row.LocalCell( relnew,LocalCell_OfflinePlanComparison,LocalColumn := column,BaseVersion := baseVersionValue,CompareVersion := compareVersionValue ); 
 | 
      }  
 | 
    } 
 | 
    traverse( table,LocalRow,row ){ 
 | 
      traverse( table,LocalColumn,column,column.TimeUnit() = "Month"){ 
 | 
        baseVersionValue := sum( row,LocalCell.astype( LocalCell_OfflinePlanComparison ),cell, 
 | 
                                 cell.LocalColumn().TimeUnit() = "Day" and 
 | 
                                 cell.LocalColumn().CustomDate() >= column.CustomDate() and 
 | 
                                 cell.LocalColumn().CustomDate() < column.CustomDate().StartOfNextMonth(), cell.BaseVersion()); 
 | 
        compareVersionValue := sum( row,LocalCell.astype( LocalCell_OfflinePlanComparison ),cell, 
 | 
                                 cell.LocalColumn().TimeUnit() = "Day" and 
 | 
                                 cell.LocalColumn().CustomDate() >= column.CustomDate() and 
 | 
                                 cell.LocalColumn().CustomDate() < column.CustomDate().StartOfNextMonth(), cell.CompareVersion()); 
 | 
                                  
 | 
        row.LocalCell( relnew,LocalCell_OfflinePlanComparison,LocalColumn := column,BaseVersion := baseVersionValue,CompareVersion := compareVersionValue ); 
 | 
      }  
 | 
    } 
 | 
     
 | 
    traverse( table,LocalColumn,column ){ 
 | 
      if( column.LocalCell( relsize ) = 0 ){ 
 | 
        column.Delete();  
 | 
      }  
 | 
    } 
 | 
     
 | 
    return table; 
 | 
  *] 
 | 
} 
 |