| Quintiq file version 2.0 | 
| #parent: #root | 
| MultiTransaction ExecutePeriodRoll ( | 
|   DateTime rollto, | 
|   PeriodSpecification_MP periodspecification | 
| ) | 
| { | 
|   Description: 'Roll to the given date. Using multitransaction to break down the transaction such that it consume lesser memory.' | 
|   ExecuteContinuous: true | 
|   FreeMemory: true | 
|   OnFailureText: | 
|   [* | 
|     debuginfo( "Period roll failed!", errormessage ); | 
|     this.IsRollingPeriod( false ); // Set IsRollingPeriod to false if fails | 
|     this.UpdateLastPlanningAction( false, false, true, false ); // isReset, isPlan, isRoll, isLockUnlock | 
|   *] | 
|   Priority: 'Default' | 
|   ReleaseHistory: true | 
|   Text: | 
|   [* | 
|     /* IMPORTANT NOTE | 
|     The period roll goes by this sequence: | 
|     1) Set MP.IsRollingPeriod to true | 
|     2) Synchronize periods, in this synchronize, no instance will be deleted, they will be set to IsDeleted to assume is deleted | 
|     3) Aggregation/Disaggregation | 
|     4) Delete all obsolte instances | 
|     5) Set MP.IsRollingPeriod to false | 
|     */ | 
|     stopcondition := false; | 
|      | 
|     if ( step = 0 ) | 
|     { | 
|       // Synchronize all periods | 
|       this.PeriodParameter_MP().Update( rollto, periodspecification, false, false ); | 
|     } | 
|     else if ( step = 1 ) | 
|     { | 
|       this.HandlePostPeriodRollPeriodTaskOperations(); | 
|     } | 
|     else if ( step = 2 ) | 
|     { | 
|      this.HandlePostPeriodRollSalesDemands(); | 
|      this.HandlePostPeriodRollGlobalParameters(); | 
|     } | 
|     else if ( step = 3 ) | 
|     { | 
|       // Clean up | 
|       this.DeleteObsoletePeriodAndCleanObsoletePeriodTasks(); | 
|       this.IsRollingPeriod( false ); | 
|       this.CleanUpActuals(); | 
|     } | 
|     this.UpdateLastPlanningAction( false, false, true, false ); // isReset, isPlan, isRoll, isLockUnlock | 
|     return step = 3 or stopcondition; | 
|   *] | 
| } |