class SNBBOMExplode
{
SNBBOMExplodeTmp tmpBOM;
SNBBOMExplodeData bomdata;
ItemId itemId;
EcoResItemSizeName inventSizeId;
EcoResItemColorName inventColorId;
InventSiteId inventSiteId;
}
boolean hasChild(ItemId _itemId)
{
BOMVersion bomVersion;
;
//Check if the item is also a BOM item.
select firstonly bomVersion
where bomVersion.ItemId == _itemid
&& bomVersion.Active
&& bomVersion.FromDate <= systemdateget ()
&& (!bomVersion.ToDate || bomVersion.ToDate >= systemdateget ());
if (bomVersion.RecId)
return true ;
return false ;
}
private int InsertParentItem(ItemId _itemId, int _level)
{
InventTable inventTable;
;
//Gets the parent information and then insert on TmpBOMExplode Table with level 0.
select firstOnly inventTable where inventTable.ItemId == _itemId;
tmpBOM.ItemId = _itemId;
tmpBOM.Level = _level;
tmpBOM.BOMQty = 1 ;
tmpBOM.HasChild = this.hasChild(_ItemId);
tmpBOM.insert();
return _level+ 1 ;
}
void itemExplode(ItemId _ItemId, int _level = 0, BOMQty _bomQty = 1)
{
BOM bomTable;
InventTable inventTable;
BOMVersion bomVersion;
InventDim inventDim;
BOMQty qtyS;
;
//Insert parent Item
if (_level == 0)
_level = this.InsertParentItem(_ItemId, _level);
//Verifies if the Item exists in BOMVersion Table.
//The item must be active and not expired.
select firstonly bomVersion
where bomVersion.ItemId == _itemid
&& bomVersion.Active
exists join inventDim
where inventDim.inventDimId == bomVersion.InventDimId &&
(inventDim.InventColorId == inventColorId || inventColorId == "") &&
(inventDim.InventSizeId == inventSizeId || inventSizeId == "");
// && bomVersion.FromDate <= systemdateget()
// && (!bomVersion.ToDate || bomVersion.ToDate >= systemdateget());
if (bomVersion.RecId)
{
//Every item on BOMVersion has a BOMId which is used to show
//which products belong to a BOM Item.
While select bomTable
where bomTable.BOMId == bomVersion.BOMId
join inventTable
where bomTable.ItemId == inventTable.ItemId
{
//Insert the items that compose the BOM Item with level 1.
tmpBOM.ItemId = bomTable.ItemId;
tmpBOM.RefItemId = bomVersion.ItemId;
tmpBOM.BOMQty = bomTable.BOMQty / bomTable.BOMQtySerie * _bomQty;
tmpBOM.Level = _level;
tmpBOM.UnitId = bomTable.UnitId;
tmpBOM.HasChild = this.hasChild(bomTable.ItemId);
tmpBOM.MainItemId = this.parmItemId();
tmpBOM.insert();
//This method is used to check if the BOM Item is composed by
//another BOM Item, case true it will call the method recursively
// with level 2.
if (tmpbom.HasChild == NoYes::Yes)//--- unit conversion ---
{
qtyS = UnitOfMeasureConverter::convert(
tmpBOM.BOMQty,
UnitOfMeasure::unitOfMeasureIdBySymbol(tmpBOM.UnitId),
UnitOfMeasure::unitOfMeasureIdBySymbol(bomTable.inventTable().inventUnitId()),
NoYes::Yes,
InventTable::itemProduct(tmpBOM.ItemId));
this.itemExplode(bomTable.ItemId, _level+ 1, qtyS);
}
}
}
}
void linkTables(SNBBOMExplodeTmp _tmp)
{
tmpBOM.linkPhysicalTableInstance(_tmp);
}
EcoResItemColorName parmInventColorId(EcoResItemColorName _inventColorId = inventColorId)
{
inventColorId = _inventColorId;
return inventColorId;
}
EcoResItemSizeName parmInventSizeId(EcoResItemSizeName _inventSizeId = inventSizeId)
{
inventSizeId = _inventSizeId;
return inventSizeId;
}
ItemId parmItemId(ItemId _itemId = ItemId)
{
ItemId = _itemId;
return ItemId;
}
SNBBOMExplodeTmp parmSNBBOMExplodeTmp()
{
select * from tmpBOM;
return TmpBOM;
}
void run()
{
delete_from tmpBOM;
this.itemExplode(ItemId,0);
}
Class'da kullanılan SNBBOMExplodeTmp isimli tempDB tipli tablonun yapısı:
BOMQty BOMQty
HasChild NoYesId
ItemId ItemId
Level BOMLevel
MainItemId ItemId
RefItemId ItemId
UnitId UnitOfMeasureSymbol
Örnek kullanımı:
SNBBOMExplodeTmp tmpBOM;
SNBBOMExplode bomExp = new SNBBOMExplode();
bomExp.parmItemId(list.ItemId);
bomExp.linkTables(tmpBOM);
bomExp.parmInventColorId(list.InventColorId);
bomExp.parmInventSizeId(list.InventSizeId);
bomExp.run();
Hiç yorum yok:
Yorum Gönder