Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Function CalcQuantityToMove 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    // cye1 Jan-20-2017 (created) 
 | 
     
 | 
    value := 0.0; 
 | 
    bestitsl := select( this, IterationServiceLevel, itsl, itsl.Iteration().IsBestIteration() ); 
 | 
    targetsl := this.TargetPercentage(); 
 | 
     
 | 
      if( not isnull( bestitsl ) ) 
 | 
      { 
 | 
        // Select all simulation pispips that are related to this service level that had unfilfilled demand in the best run 
 | 
        simpispips := selectset( bestitsl, IterationPISPIP.SimulationPISPIP, simpispip, 
 | 
                                 guard( simpispip.ProductInStockingPointInPeriodPlanningLeaf().GetServiceLevel() = this, false )  // Only evaluate the pispips that are related to the service level 
 | 
                               );   
 | 
         
 | 
        if( exists( simpispips, Elements, simpisp, simpisp.HasUnfulfilledDemand() ) ) 
 | 
        { 
 | 
          // The average shortage in the pispips with a shortage 
 | 
          averageshortage := average( simpispips, Elements, simpispip, simpispip.HasUnfulfilledDemand(), simpispip.UnfulfilledDemandQty() ); 
 | 
           
 | 
          // The desired total shortage is ( 100% - target servicelevel ) * total demand 
 | 
          desiredtotalshortage := ( ( 100.0 - targetsl ) / 100.0 ) * sum( simpispips, Elements, simpispip, 
 | 
                                                                         simpispip.SalesDemandQty() ); 
 | 
           
 | 
          // The desired average shortage is then the desired total shortage divided by the number of pispips with a shortage 
 | 
          // Please note that this will undersestimate the new shortage since some of these pispips may only have a very small unfulfilled demand 
 | 
          desiredavgshortage := desiredtotalshortage / simpispips.Size(); 
 | 
          value := averageshortage - desiredavgshortage; 
 | 
         
 | 
        } 
 | 
     
 | 
    } 
 | 
     
 | 
    this.QuantityToMove( value ); 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |