Quintiq file version 2.0
|
#parent: #root
|
Method GetHasNoDirectLoop (
|
output Strings feedback_o,
|
output Strings sanitychecklevel_o
|
) declarative remote as Boolean
|
{
|
Description: 'Check if the lane leg has no direct loop (loop within 1 level, e.g. A->B and B->A)'
|
TextBody:
|
[*
|
isvalid := true;
|
|
// The loop should only be violated if both legs that are causing the loop are enabled
|
|
if( this.IsEnabled() and exists( this, LaneLegInputOutput.ProductInStockingPoint_MP.Product_MP, product, product.HasShelfLifeOrMaturation() ) )
|
{
|
directlooplaneleg := select( this, AsDestinationStockingPointLeg.StockingPoint_MP.StockingPointInLane.OriginStockingPointLeg, o,
|
o.IsEnabled()
|
and o.DestinationStockingPointID() = this.OriginStockingPointID() );
|
|
//check whether there are any overlap product in both laneleg
|
productindirectlooplaneleg := selectset( directlooplaneleg, Lane.ProductInLane.Product_MP, p, p.HasShelfLifeOrMaturation() );
|
currentproduct := selectset( this, Lane.ProductInLane.Product_MP, p, p.HasShelfLifeOrMaturation() );
|
productoverlap := currentproduct.Intersect( productindirectlooplaneleg );
|
|
isvalid := isnull( directlooplaneleg ) or productoverlap.Size() =0 ;
|
|
if( not isnull( feedback_o ) and not isvalid )
|
{
|
name := MacroPlan::GetSubstituteName( this.Name() );
|
feedback_o.Add( SanityCheckMessage::GetFormattedMessage( Translations::MP_Process_Instance( this.DefinitionName(), name ),
|
Translations::MP_LaneLeg_ViolateHasNoDirectLoop( directlooplaneleg.Lane().Name() ) ) );
|
sanitychecklevel_o.Add( SanityCheckCategoryLevel::GetSanityCheckCategoryDataWarning() );
|
}
|
}
|
|
return isvalid;
|
*]
|
}
|