From 97c860c1c285c6dd189dbaa1eec6ee36a6482ff3 Mon Sep 17 00:00:00 2001
From: Kevin Kok Khah Whey <khahwhey.kok@3ds.com>
Date: 星期四, 12 十月 2023 19:19:37 +0800
Subject: [PATCH] Kevin: Modified logic of GlobalOTDTable.SetIsLinkedWithFinishedGoodAttributes method to fix some bugs.
---
/dev/null | 91 -------------
_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDs.qbl | 8 +
_Main/BL/Type_Global_MappingProduct_MP/Attribute_IsLinkedWithFGCrossBusiness.qbl | 8 +
_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDsCrossBusiness.qbl | 8 +
_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG.qbl | 167 +++++++++++++++++++++++
_Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFGCrossBusiness.qbl | 8 +
_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes_DEBUG.qbl | 75 ++++++++++
_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCountCrossBusiness.qbl | 8 +
_Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFGCrossBusiness.qbl | 8 +
9 files changed, 290 insertions(+), 91 deletions(-)
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl
deleted file mode 100644
index 5a4ba17..0000000
--- a/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes.qbl
+++ /dev/null
@@ -1,45 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method SetIsLinkedWithFinishedGoodAttributes
-{
- Description: 'Method to traverse the supply chain to determine if there are any products that are not used to produce finished goods.'
- TextBody:
- [*
- // Reset IsLinkedWithFinishedGood
- traverse( this, Global_MappingProduct_MP, instance )
- {
- instance.IsLinkedWithFinishedGood( false );
- }
-
- traverse( this, Global_MappingOperation, instance )
- {
- instance.IsLinkedWithFinishedGood( false );
- }
-
- traverse( this, Global_MappingOperationBOM, instance )
- {
- instance.IsLinkedWithFinishedGood( false );
- }
-
- productspool := selectset( this, Global_MappingProduct_MP, product,
- product.ProductMajorType() <> "鎴愬搧" );
- operationspool := this.Global_MappingOperation( relget );
- operationbomspool := this.Global_MappingOperationBOM( relget );
-
- // Traverse each finished good and search for linked products/operations/lanes
- traverse( this, Global_MappingProduct_MP, product,
- product.ProductMajorType() = "鎴愬搧" )
- {
- uniquebomids := construct( Strings );
- product.IsLinkedWithFinishedGood( false );
- product.SetIsLinkedWithFinishedGoodAttributes_Recursive( 0, // depth
- 100, // maxdepth
- productspool,
- operationspool,
- operationbomspool,
- uniquebomids );
- uniquebomids := uniquebomids.Unique();
- product.BOMCount( uniquebomids.Size() );
- }
- *]
-}
diff --git a/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes_DEBUG.qbl b/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes_DEBUG.qbl
new file mode 100644
index 0000000..09c33d2
--- /dev/null
+++ b/_Main/BL/Type_GlobalDTOTable/Method_SetIsLinkedWithFinishedGoodAttributes_DEBUG.qbl
@@ -0,0 +1,75 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetIsLinkedWithFinishedGoodAttributes_DEBUG
+{
+ Description: 'Method to traverse the supply chain to determine if there are any products that are not used to produce finished goods.'
+ TextBody:
+ [*
+ // Reset IsLinkedWithFinishedGood
+ traverse( this, Global_MappingProduct_MP, instance )
+ {
+ instance.IsLinkedWithFinishedGood( false );
+ instance.BOMCount( 0 );
+ instance.BOMIDs( "" );
+
+ instance.IsLinkedWithFGCrossBusiness( false );
+ instance.BOMCountCrossBusiness( 0 );
+ instance.BOMIDsCrossBusiness( "" );
+ }
+
+ traverse( this, Global_MappingOperation, instance )
+ {
+ instance.IsLinkedWithFinishedGood( false );
+ instance.IsLinkedWithFGCrossBusiness( false );
+ }
+
+ traverse( this, Global_MappingOperationBOM, instance )
+ {
+ instance.IsLinkedWithFinishedGood( false );
+ instance.IsLinkedWithFGCrossBusiness( false );
+ }
+
+ finishedgoods := selectset( this, Global_MappingProduct_MP, product,
+ product.ProductMajorType() = "鎴愬搧" );
+ numfinishedgoods := finishedgoods.Size();
+ index := 1;
+
+ // Traverse each finished good and search for linked products/operations/lanes
+ traverse( finishedgoods, Elements, product )
+ {
+ if( not product.IsLinkedWithFinishedGood() )
+ {
+ info( "KKK", this.DefinitionName(), "SetIsLinkedWithFinishedGoodAttributes",
+ "| Processing Product:", product.ID(), "(", index, "/", numfinishedgoods, ")" );
+ uniquebomids := construct( Strings );
+ product.SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG( 0, // depth
+ 100, // maxdepth
+ uniquebomids,
+ false // isallowcrossbusinesstype
+ );
+ uniquebomids := uniquebomids.Difference( product.ID() ).Unique();
+ product.BOMCount( uniquebomids.Size() );
+ product.BOMIDs( uniquebomids.ToString( ";" ) );
+ }
+
+ if( not product.IsLinkedWithFGCrossBusiness() )
+ {
+ info( "KKK", this.DefinitionName(), "SetIsLinkedWithFinishedGoodAttributes",
+ "| Processing Product (cross business type):", product.ID(), "(", index, "/", numfinishedgoods, ")" );
+ uniquebomidscrossbusiness := construct( Strings );
+ product.SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG( 0, // depth
+ 100, // maxdepth
+ uniquebomidscrossbusiness,
+ true // isallowcrossbusinesstype
+ );
+ uniquebomidscrossbusiness := uniquebomidscrossbusiness.Difference( product.ID() ).Unique();
+ product.BOMCountCrossBusiness( uniquebomidscrossbusiness.Size() );
+ product.BOMIDsCrossBusiness( uniquebomidscrossbusiness.ToString( ";" ) );
+ }
+
+ index++;
+ }
+
+ info( "KKK", this.DefinitionName(), "SetIsLinkedWithFinishedGoodAttributes", "| Ended." );
+ *]
+}
diff --git a/_Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFGCrossBusiness.qbl b/_Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFGCrossBusiness.qbl
new file mode 100644
index 0000000..5725fee
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingOperation/Attribute_IsLinkedWithFGCrossBusiness.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsLinkedWithFGCrossBusiness
+{
+ #keys: '3[157968.0.1171600004][157968.0.1171600003][157968.0.1171600005]'
+ Description: 'Updated procedurally for checking whether this object is used to produce a finished good cross business type.'
+ ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFGCrossBusiness.qbl b/_Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFGCrossBusiness.qbl
new file mode 100644
index 0000000..b20b273
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingOperationBOM/Attribute_IsLinkedWithFGCrossBusiness.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsLinkedWithFGCrossBusiness
+{
+ #keys: '3[157968.0.1171600022][157968.0.1171600021][157968.0.1171600023]'
+ Description: 'Updated procedurally for checking whether this object is used to produce a finished good cross business type.'
+ ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCountCrossBusiness.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCountCrossBusiness.qbl
new file mode 100644
index 0000000..e85ba06
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMCountCrossBusiness.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BOMCountCrossBusiness
+{
+ #keys: '3[157968.0.1171600059][157968.0.1171600058][157968.0.1171600060]'
+ Description: 'Number of unique BOM used to produce this finished good cross business types.'
+ ValueType: Number
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDs.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDs.qbl
new file mode 100644
index 0000000..d4dcf3a
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDs.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BOMIDs
+{
+ #keys: '3[157968.0.1171600062][157968.0.1171600061][157968.0.1171600063]'
+ Description: 'Unique BOM IDs used to produce this finished good.'
+ ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDsCrossBusiness.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDsCrossBusiness.qbl
new file mode 100644
index 0000000..e48b8de
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_BOMIDsCrossBusiness.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute BOMIDsCrossBusiness
+{
+ #keys: '3[157968.0.1171600056][157968.0.1171600055][157968.0.1171600057]'
+ Description: 'Unique BOM IDs used to produce this finished good cross business types.'
+ ValueType: String
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Attribute_IsLinkedWithFGCrossBusiness.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_IsLinkedWithFGCrossBusiness.qbl
new file mode 100644
index 0000000..2e2ebdc
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Attribute_IsLinkedWithFGCrossBusiness.qbl
@@ -0,0 +1,8 @@
+Quintiq file version 2.0
+#parent: #root
+Attribute IsLinkedWithFGCrossBusiness
+{
+ #keys: '3[157968.0.1171600039][157968.0.1171600038][157968.0.1171600040]'
+ Description: 'Updated procedurally for checking whether this object is used to produce a finished good cross business type.'
+ ValueType: Boolean
+}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl
deleted file mode 100644
index f0425fa..0000000
--- a/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive.qbl
+++ /dev/null
@@ -1,91 +0,0 @@
-Quintiq file version 2.0
-#parent: #root
-Method SetIsLinkedWithFinishedGoodAttributes_Recursive (
- Number depth,
- Number maxdepth,
- Global_MappingProduct_MPs productspool,
- Global_MappingOperations operationspool,
- Global_MappingOperationBOMs operationbomspool,
- output Strings uniquebomids_o
-)
-{
- Description: 'Method to traverse the supply chain recursively to determine if there are any products that are not used to produce finished goods.'
- TextBody:
- [*
- if( not this.IsLinkedWithFinishedGood() )
- {
- if( this.ProductMajorType() <> "鎴愬搧" )
- {
- uniquebomids_o.Add( this.ID() );
- }
-
- depth := depth + 1;
- this.IsLinkedWithFinishedGood( true );
-
- if( depth <= maxdepth )
- {
- operations := selectset( operationspool, Elements, operation,
- not operation.IsLinkedWithFinishedGood()
- and operation.BusinessType() = this.BusinessType()
- and operation.ProductID() = this.ID() );
- operationspool.Remove( operations );
-
- traverse( operations, Elements, operation )
- {
- operation.IsLinkedWithFinishedGood( true );
-
- operationboms := selectset( operationbomspool, Elements, operationbom,
- not operationbom.IsLinkedWithFinishedGood()
- and operationbom.BusinessType() = operation.BusinessType()
- and operationbom.OrganCode() = operation.OrganCode()
- and operationbom.ProcessSection() = operation.ProcessSection()
- and operationbom.ProductCode() = operation.ProductID() );
- operationbomspool.Remove( operationboms );
-
- traverse( operationboms, Elements, operationbom )
- {
- operationbom.IsLinkedWithFinishedGood( true );
-
- componentproduct := Global_MappingProduct_MP::FindTypeIndexIDAndBusinessType( operationbom.ComponentCode(),
- operationbom.BusinessType() );
-
- if( guard( not componentproduct.IsLinkedWithFinishedGood(), false ) )
- {
- productspool.Remove( componentproduct );
- componentproduct.SetIsLinkedWithFinishedGoodAttributes_Recursive( depth,
- maxdepth,
- productspool,
- operationspool,
- operationbomspool,
- uniquebomids_o );
- }
-
- if( operationbom.AlternativeMaterialCode() <> ""
- and operationbom.AlternativeMaterialCode() <> operationbom.ComponentCode() )
- {
- alternativeproduct := Global_MappingProduct_MP::FindTypeIndexIDAndBusinessType( operationbom.AlternativeMaterialCode(),
- operationbom.BusinessType() );
-
- if( guard( not alternativeproduct.IsLinkedWithFinishedGood(), false ) )
- {
- productspool.Remove( alternativeproduct );
- alternativeproduct.SetIsLinkedWithFinishedGoodAttributes_Recursive( depth,
- maxdepth,
- productspool,
- operationspool,
- operationbomspool,
- uniquebomids_o );
- }
- }
- }
- }
- }
- else
- {
- debuginfo( "Product:", this.ID(),
- "| BusinessType:", this.BusinessType(),
- "| Max depth reached, stop searching... (", depth, ")" );
- }
- }
- *]
-}
diff --git a/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG.qbl b/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG.qbl
new file mode 100644
index 0000000..9dc5d75
--- /dev/null
+++ b/_Main/BL/Type_Global_MappingProduct_MP/Method_SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG.qbl
@@ -0,0 +1,167 @@
+Quintiq file version 2.0
+#parent: #root
+Method SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG (
+ Number depth,
+ Number maxdepth,
+ output Strings uniquebomids_o,
+ Boolean isallowcrossbusinesstype
+)
+{
+ Description: 'Method to traverse the supply chain recursively to determine if there are any products that are not used to produce finished goods.'
+ TextBody:
+ [*
+ info( 'KKK2', this.DefinitionName(), "SetIsLinkedWithFinishedGoodAttributes_Recursive",
+ "| Depth:", depth,
+ "| Product:", this.ID(),
+ "| BusinessType:", this.BusinessType(),
+ "| isallowcrossbusinesstype:", isallowcrossbusinesstype,
+ "| IsLinkedWithFGCrossBusiness:", this.IsLinkedWithFGCrossBusiness(),
+ "| IsLinkedWithFinishedGood:", this.IsLinkedWithFinishedGood() );
+ if( ifexpr( isallowcrossbusinesstype,
+ not this.IsLinkedWithFGCrossBusiness(),
+ not this.IsLinkedWithFinishedGood() ) )
+ {
+ depthlocal := depth + 1;
+
+ if( uniquebomids_o.Find( this.ID() ) < 0 )
+ {
+ uniquebomids_o.Add( this.ID() );
+ }
+
+ if( isallowcrossbusinesstype )
+ {
+ this.IsLinkedWithFGCrossBusiness( true );
+ }
+ else
+ {
+ this.IsLinkedWithFinishedGood( true );
+ }
+
+ if( depthlocal <= maxdepth )
+ {
+ uniquebomids_local := construct( Strings );
+ operations := selectset( this.GlobalOTDTable(), Global_MappingOperation, operation,
+ ( isallowcrossbusinesstype
+ or operation.BusinessType() = this.BusinessType() )
+ and operation.ProductID() = this.ID() );
+
+ traverse( operations, Elements, operation )
+ {
+ if( isallowcrossbusinesstype )
+ {
+ operation.IsLinkedWithFGCrossBusiness( true );
+ }
+ else
+ {
+ operation.IsLinkedWithFinishedGood( true );
+ }
+
+ operationboms := selectset( this.GlobalOTDTable(), Global_MappingOperationBOM, operationbom,
+ operationbom.BusinessType() = operation.BusinessType()
+ and operationbom.OrganCode() = operation.OrganCode()
+ and operationbom.ProcessSection() = operation.ProcessSection()
+ and operationbom.ProductCode() = operation.ProductID() );
+
+ traverse( operationboms, Elements, operationbom )
+ {
+ if( isallowcrossbusinesstype )
+ {
+ operationbom.IsLinkedWithFGCrossBusiness( true );
+ }
+ else
+ {
+ operationbom.IsLinkedWithFinishedGood( true );
+ }
+
+ traverse( this.GlobalOTDTable(), Global_MappingProduct_MP, componentproduct,
+ componentproduct.ID() = operationbom.ComponentCode()
+ and ( isallowcrossbusinesstype
+ or componentproduct.BusinessType() = operationbom.BusinessType() ) )
+ {
+ componentproduct.SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG( depthlocal,
+ maxdepth,
+ uniquebomids_local,
+ isallowcrossbusinesstype );
+ }
+
+ if( operationbom.AlternativeMaterialCode() <> ""
+ and operationbom.AlternativeMaterialCode() <> operationbom.ComponentCode() )
+ {
+ traverse( this.GlobalOTDTable(), Global_MappingProduct_MP, alternativeproduct,
+ alternativeproduct.ID() = operationbom.AlternativeMaterialCode()
+ and ( isallowcrossbusinesstype
+ or alternativeproduct.BusinessType() = operationbom.BusinessType() ) )
+ {
+ alternativeproduct.SetIsLinkedWithFinishedGoodAttributes_Recursive_DEBUG( depthlocal,
+ maxdepth,
+ uniquebomids_local,
+ isallowcrossbusinesstype );
+ }
+ }
+
+ info( 'KKK2', this.DefinitionName(), "SetIsLinkedWithFinishedGoodAttributes_Recursive",
+ "| Depth:", depthlocal - 1,
+ "| BusinessType:", operation.BusinessType(),
+ "| OrganCode:", operation.OrganCode(),
+ "| ProcessSection:", operation.ProcessSection(),
+ "| ProductID:", operation.ProductID(),
+ "| isallowcrossbusinesstype:", isallowcrossbusinesstype,
+ "| IsLinkedWithFGCrossBusiness:", this.IsLinkedWithFGCrossBusiness(),
+ "| IsLinkedWithFinishedGood:", this.IsLinkedWithFinishedGood(),
+ "| UniqueBOMIDs:", uniquebomids_local.Unique().ToString( ";" ) );
+ }
+ }
+
+ uniquebomids := uniquebomids_local.Unique().Difference( this.ID() );
+
+ if( isallowcrossbusinesstype )
+ {
+ this.BOMCountCrossBusiness( uniquebomids.Size() );
+ this.BOMIDsCrossBusiness( uniquebomids.ToString( ";" ) );
+ }
+ else
+ {
+ this.BOMCount( uniquebomids.Size() );
+ this.BOMIDs( uniquebomids.ToString( ";" ) );
+ }
+
+ traverse( uniquebomids, Elements, uniquebomid,
+ uniquebomids_o.Find( uniquebomid ) < 0 )
+ {
+ uniquebomids_o.Add( uniquebomid );
+ }
+ }
+ else
+ {
+ debuginfo( "Product:", this.ID(),
+ "| BusinessType:", this.BusinessType(),
+ "| IsAllowCrossBusinessType:", isallowcrossbusinesstype,
+ "| Max depth reached, stop searching... (", depth, ")" );
+ }
+ }
+ else
+ {
+ if( uniquebomids_o.Find( this.ID() ) < 0 )
+ {
+ uniquebomids_o.Add( this.ID() );
+ }
+
+ uniquebomids := construct( Strings );
+
+ if( isallowcrossbusinesstype )
+ {
+ uniquebomids := this.BOMIDsCrossBusiness().Tokenize( ";" );
+ }
+ else
+ {
+ uniquebomids := this.BOMIDs().Tokenize( ";" );
+ }
+
+ traverse( uniquebomids, Elements, uniquebomid,
+ uniquebomids_o.Find( uniquebomid ) < 0 )
+ {
+ uniquebomids_o.Add( uniquebomid );
+ }
+ }
+ *]
+}
--
Gitblit v1.9.3