overcut calculate & item explode in d365fo x++
overcut calculate & item explode in d365fo x++
Code:
class SLD_CalculateOvercut
{
SLD_TmpBOMExplode tmpBOM;
SLD_RecipeIDEDT recipeID;
public static void main(Args _args)
{
FormRun formRun = _args.caller();
SLD_CalculateOvercut SLD_CalculateOvercut = new SLD_CalculateOvercut();
SalesTable salesTable;
SalesLine salesLine, salesLineUpd;
real overcutPercentage, RemainingSalesQty;
List LineList = new List(Types::Real);
enumerator enumerator = LineList.getEnumerator();
if(_args.record() && _args.record().TableId == TableNum(SalesTable))
{
salesTable = _args.record();
}
while select ItemId, sum(SalesQty)
from salesLine
group by salesLine.ItemId
where salesLine.SalesId == salesTable.SalesId
{
sld_CalculateOvercut.itemExplode(salesLine.ItemId, salesLine::find(salesTable.SalesId).inventDim().configId, 0);
overcutPercentage = sld_CalculateOvercut.getOvercutPercentage(salesLine.SalesQty);
if(overcutPercentage > 0)
{
salesLineUpd.clear();
while select forupdate salesLineUpd
where salesLineUpd.SalesId == salestable.SalesId
&& salesLineUpd.ItemId == salesLine.ItemId
{
ttsbegin;
salesLineUpd.bfpSurplusSalesQty = decRound((salesLineUpd.SalesQty * overcutPercentage)/100, 0);
salesLineUpd.RemainInventPhysical = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
salesLineUpd.RemainSalesPhysical = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
salesLineUpd.update();
ttscommit;
}
}
}
while
select ItemId, sum(SalesQty)
from salesLine
group by salesLine.ItemId
where salesLine.SalesId == salesTable.SalesId
{
real Qtyval = 0;
Qtyval = SLD_CalculateOvercut.getOvercutQty(salesLine.SalesQty);
if(Qtyval > 0)
{
salesLineUpd.clear();
while
select forupdate salesLineUpd
where salesLineUpd.SalesId == salestable.SalesId
&& salesLineUpd.ItemId == salesLine.ItemId
{
ttsbegin;
salesLineUpd.bfpSurplusSalesQty = decRound(Qtyval,0);
salesLineUpd.RemainInventPhysical = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
salesLineUpd.RemainSalesPhysical = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
salesLineUpd.update();
ttscommit;
}
}
}
//info(strFmt('BomExplode took %1 seconds.', ((endTime - startTime)/1000)));
if(formRun)
{
#Task
formRun.task(#taskRefresh);
}
}
private real getOvercutQty(Qty _qty)
{
CBLOverCutPolicyTable cblOverCutPolicyTable;
CBLOverCutPolicyLines cblOverCutPolicyLines;
select RecId
from cblOverCutPolicyTable
where cblOverCutPolicyTable.Status == CBLEnumPolicyStatus::Approved
join Qty
from cblOverCutPolicyLines
where cblOverCutPolicyTable.PolicyId == cblOverCutPolicyLines.PolicyId
&& cblOverCutPolicyLines.FromQty <= _qty && cblOverCutPolicyLines.ToQty >= _qty
&& cblOverCutPolicyLines.IsQty == NoYes::Yes;
if(cblOverCutPolicyLines)
{
return cblOverCutPolicyLines.Qty;
}
else
{
return 0;
}
}
private real getOvercutPercentage(Qty _qty)
{
SLD_RecipeTable sld_RecipeTable;
CBLOverCutPolicyTable cblOverCutPolicyTable;
CBLOverCutPolicyLines cblOverCutPolicyLines;
select firstonly RecipeID from tmpBOM where TmpBOM.RecipeID != '';
if(tmpBOM)
{
select RecId
from sld_RecipeTable
where sld_RecipeTable.SLD_RecipeID == tmpBOM.RecipeID
join CBLEDTOvercutPer
from cblOverCutPolicyLines
where cblOverCutPolicyLines.WashGroupID == sld_RecipeTable.WashGroupID
&& cblOverCutPolicyLines.FromQty <= _qty && cblOverCutPolicyLines.ToQty >= _qty
join RecId
from cblOverCutPolicyTable
where cblOverCutPolicyTable.PolicyId == cblOverCutPolicyLines.PolicyId
&& cblOverCutPolicyTable.Status == CBLEnumPolicyStatus::Approved;
if(cblOverCutPolicyLines)
{
return cblOverCutPolicyLines.CBLEDTOvercutPer;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
private int InsertParentItem(ItemId _itemId, int _level)
{
//Gets the parent information and then insert on TmpBOMExplode Table with level 0.
tmpBOM.ItemId = _itemId;
tmpBOM.Level = _level;
tmpBOM.BOMQty = 1 ;
tmpBOM.insert();
return _level+ 1 ;
}
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 ;
}
SLD_RecipeIDEDT itemExplode(ItemId _ItemId, str _configid, int _level = 0, BOMQty _bomQty = 1)
{
BOM bomTable;
BOMVersion bomVersion;
InventDim InventDim;
//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 == NoYes::Yes
&& bomVersion.FromDate <= systemdateget()
&& (!bomVersion.ToDate || bomVersion.ToDate >= systemdateget())
join InventDim
where BOMVersion.InventDimId == InventDim.inventDimId
&& InventDim.configId == _configid;
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
{
//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.RecipeID = bfpBOMTemplateLine::find(bomTable.bfpBOMTemplateId,bomTable.bfpRefLineNum).SLD_RecipeID;
tmpBOM.Level = _level;
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 (this.hasChild(bomTable.ItemId))
this.itemExplode(bomTable.ItemId, _configid, _level+ 1, tmpBOM.BOMQty);
}
}
return tmpBOM.RecipeID;
}
}
Comments
Post a Comment