| Quintiq file version 2.0 | 
| #parent: #root | 
| StaticMethod GetRollbackKPIDiff (LibOpt_Task task, LibOpt_DatasetCopyConditional datasetcopy) as owning RealVector | 
| { | 
|   Description: | 
|   [* | 
|     Returns the difference between the pre handle result Rollback KPI and the post handle result Rollback KPI of this component (or the next component that uses `LibOpt_SnapshotKPIs`) as a `RealVector`. | 
|     This difference is calculated as: `diff := KPIposthandleresult - KPIprehandleresult`. | 
|     Therefore, the returned `RealVector` will contain a negative value if the Rollback KPI decreased this iteration. Note that a negative value corresponds to an improvement if we are minimizing the Rollback KPI. | 
|   *] | 
|   TextBody: | 
|   [* | 
|     snapshotcomponent := task.SnapshotComponent(); | 
|     snapshotKPIprehandleresult := LibOpt_SnapshotKPI::GetSnapshotKPIDownstreamComponent( snapshotcomponent, true ); | 
|     snapshotKPIposthandleresult := LibOpt_SnapshotKPI::GetSnapshotKPIDownstreamComponent( snapshotcomponent, false ); | 
|      | 
|     diff := null( RealVector, owning ); | 
|     // It is sufficient to check if snapshotKPIposthandleresult is null. If snapshotKPIprehandleresult is null, then snapshotKPIposthandleresult will also always be null. | 
|     if( not isnull( snapshotKPIposthandleresult ) )  | 
|     { | 
|       KPIprehandleresult := snapshotKPIprehandleresult.RollbackKPI(); | 
|       KPIposthandleresult := snapshotKPIposthandleresult.RollbackKPI(); | 
|        | 
|       diff := RealVector::Construct( KPIposthandleresult ) - RealVector::Construct( KPIprehandleresult );   | 
|     } | 
|     else | 
|     { | 
|       // No snapshotKPIposthandleresult has been found on this component or on any descendant component that uses SnapshotKPIs. | 
|       // Show a warning in the Snapshot form to indicate this to the AE. | 
|       replannablesnapshot := select( task, | 
|                                      SnapshotComponent.Children.astype( LibOpt_SnapshotReplannableCopyDataset ), | 
|                                      snapshot, | 
|                                      snapshot.ComponentPositionName() = datasetcopy.ComponentPositionName() | 
|                                      ); | 
|       if( not isnull( replannablesnapshot ) ) | 
|       {     | 
|         LibOpt_SnapshotWarning::Throw( task.Run(), | 
|                                        replannablesnapshot, | 
|                                        Translations::LibOpt_DatasetCopyOnRollbackSize_NoPostHandleResult() );  | 
|       } | 
|       else | 
|       { | 
|         LibOpt_SnapshotWarning::Throw( task,  | 
|                                        Translations::LibOpt_DatasetCopyOnRollbackSize_NoPostHandleResult() );  | 
|       }   | 
|     } | 
|      | 
|     return &diff; | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |