| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod GenerateForecast ( | 
|   ArchiveExecutionStatus archiveExecutionStatus, | 
|   MacroPlan macroPlan, | 
|   Boolean isClearForecast | 
| ) | 
| { | 
|   TextBody: | 
|   [* | 
|     if( isClearForecast ){ | 
|       traverse ( macroPlan, SalesDemand.astype( Forecast ), f ) { | 
|         f.Delete(); | 
|       } | 
|     } | 
|      | 
|     productMPs := selectset( macroPlan,Product_MP,prod,not prod.IsSystem() ); | 
|     productMPIndexTree := NamedValueTree::Create(); | 
|     productMPIndexTreeNotes := NamedValueTree::Create(); | 
|     for( i := 0; i < productMPs.Size(); i++ ){ | 
|       productMP := productMPs.Element( i ); | 
|        | 
|       productMPHandle := productMPIndexTree.GetHandle( productMP.ID() ); | 
|       productMPIndexTree.Root().AddChild( productMPHandle,i ); | 
|        | 
|       productMPHandleNotes := productMPIndexTreeNotes.GetHandle( productMP.Notes() ); | 
|       productMPIndexTreeNotes.Root().AddChild( productMPHandleNotes,i ); | 
|     } | 
|      | 
|     stockingPoints := selectset( macroPlan,StockingPoint_MP,sotckingPoint,not sotckingPoint.IsSystem() ); | 
|     stockingPointIndexTree := NamedValueTree::Create(); | 
|     for( i := 0; i < stockingPoints.Size(); i++ ){ | 
|       stockingPoint := stockingPoints.Element( i ); | 
|       stockingPointHandle := stockingPointIndexTree.GetHandle( stockingPoint.ID() ); | 
|       stockingPointIndexTree.Root().AddChild( stockingPointHandle, i ); | 
|     } | 
|      | 
|     traverse ( archiveExecutionStatus, TemporaryDemandData, tdd ,tdd.Origin() = "" or tdd.StartDate() >= macroPlan.StartOfPlanning().Date()) { | 
|       if( tdd.ProductID() = "6914" or tdd.ProductID() = "6916" or tdd.ProductID() = "6917" or tdd.ProductID() = "06S100010R" or tdd.ProductID() = "06S100010M" or tdd.ProductID() = "06S100010N" ){ | 
|         tdd.StockingPointID( "大连发动机的长春外租库" ); | 
|       } | 
|        | 
|       targetProduct_MP := null( Product_MP ); | 
|        | 
|       productMPHandleNotes := productMPIndexTreeNotes.GetHandle( tdd.ProductID()); | 
|       productMPIndexNotes := guard( productMPIndexTreeNotes.Root().Child( productMPHandleNotes ),null( NamedValue )); | 
|       if( isnull( productMPIndexNotes )){ | 
|         productMPHandle := productMPIndexTree.GetHandle( tdd.ProductID()); | 
|         productMPIndex := guard( productMPIndexTree.Root().Child( productMPHandle ),null( NamedValue )); | 
|         if( not isnull( productMPIndex )){ | 
|           targetProduct_MP := productMPs.Element( productMPIndex.GetValueAsNumber() ); | 
|         } | 
|       }else{ | 
|         targetProduct_MP := productMPs.Element( productMPIndexNotes.GetValueAsNumber() ); | 
|       } | 
|        | 
|       targetStockingPoint_MP := null( StockingPoint_MP ); | 
|       stockingPointHandle := stockingPointIndexTree.GetHandle( tdd.StockingPointID() ); | 
|       stockingPointIndex := guard( stockingPointIndexTree.Root().Child( stockingPointHandle ),null( NamedValue )); | 
|       if( not isnull( stockingPointIndex )){ | 
|         targetStockingPoint_MP := stockingPoints.Element( stockingPointIndex.GetValueAsNumber() );  | 
|       } | 
|     //  targetProduct_MP       := select( macroPlan, Product_MP, tempPMP, tempPMP.Notes() = tdd.ProductID() ); | 
|       // targetProduct_MP       := select( macroPlan, Product_MP, tempPMP, tempPMP.ID() = tdd.ProductID() ); | 
|     //  targetStockingPoint_MP := select( macroPlan, StockingPoint_MP, tempSPMP, tempSPMP.ID() = tdd.StockingPointID() ); | 
|       // info( tdd.SalesSegmentName() ); | 
|       if ( not isnull( targetProduct_MP ) and not isnull( targetStockingPoint_MP ) ) { | 
|         forcest := Forecast::Create( targetProduct_MP, | 
|                                      targetStockingPoint_MP, | 
|                                      IDHolder::GetGUID(), | 
|                                      tdd.StartDate(), | 
|                                      tdd.EndDate(), | 
|                                      tdd.Quantity(), | 
|                                      [Real]tdd.Price(), | 
|                                      tdd.PriorityName(), | 
|                                      tdd.SalesSegmentName(), | 
|                                      tdd.CurrencyID(), | 
|                                      tdd.UnitOfMeasureName(), | 
|                                      0.0, | 
|                                      false, | 
|                                      false ); | 
|         forcest.Origin( tdd.Origin() ); | 
|       } | 
|       if( isnull( targetProduct_MP )){ | 
|         info( tdd.ProductID() + " -> 未找到Product_MP" );  | 
|       } | 
|       if( isnull( targetStockingPoint_MP )){ | 
|         info( tdd.StockingPointID() + " -> 未找到StockingPoint_MP" );  | 
|       } | 
|     } | 
|   *] | 
| } |