/**
* Calculate the managed cost for a given item and site.
*
* @param _itemId The ItemId for which the managed cost is to be calculated.
* @param _siteId The SiteId for which the managed cost is to be filtered.
*
* @return The calculated managed cost for the given site.
*/
private real calculateManagedCostBySite(ItemId _itemId, InventSiteId _siteId)
{
Query query;
QueryRun queryRun;
QueryBuildDataSource inventSumDS, inventDimDS, inventTableDS;
InventSum inventSum;
InventDim inventDim;
real totalPostedValue = 0;
real totalPostedQty = 0;
real managedCost = 0;
boolean hasRecords = false; // To check if the query has any results
// Initialize query
query = new Query();
// Add InventSum as the main data source
inventSumDS = query.addDataSource(tableNum(InventSum));
inventSumDS.addSelectionField(fieldNum(InventSum, PostedQty), SelectionField::Sum);
inventSumDS.addSelectionField(fieldNum(InventSum, PostedValue), SelectionField::Sum);
// Group by fields
inventSumDS.addGroupByField(fieldNum(InventSum, ItemId));
inventSumDS.addGroupByField(fieldNum(InventSum, InventDimId));
// Join InventDim table and group by site (InventSiteId)
inventDimDS = inventSumDS.addDataSource(tableNum(InventDim));
inventDimDS.relations(true);
inventDimDS.joinMode(JoinMode::InnerJoin);
inventDimDS.addLink(fieldNum(InventSum, InventDimId), fieldNum(InventDim, InventDimId));
inventDimDS.addSelectionField(fieldNum(InventDim, InventSiteId));
inventDimDS.addGroupByField(fieldNum(InventDim, InventSiteId));
// Filter by the given SiteId
if (_siteId)
{
inventDimDS.addRange(fieldNum(InventDim, InventSiteId)).value(queryValue(_siteId));
}
// Join InventTable table
inventTableDS = inventSumDS.addDataSource(tableNum(InventTable));
inventTableDS.relations(true);
inventTableDS.joinMode(JoinMode::InnerJoin);
inventTableDS.addLink(fieldNum(InventSum, ItemId), fieldNum(InventTable, ItemId));
// Add range for the specified item
inventSumDS.addRange(fieldNum(InventSum, ItemId)).value(queryValue(_itemId));
// Execute query and calculate site-wise average cost
queryRun = new QueryRun(query);
// Loop over query results but only update for the correct site and avoid multiple updates
while (queryRun.next())
{
inventSum = queryRun.get(tableNum(InventSum));
inventDim = queryRun.get(tableNum(InventDim));
// If the record matches the site
if (inventDim.InventSiteId == _siteId)
{
totalPostedQty = inventSum.PostedQty;
totalPostedValue = inventSum.PostedValue;
// Avoid division by zero
if (totalPostedQty != 0)
{
managedCost = totalPostedValue / totalPostedQty;
hasRecords = true;
}
}
}
// If no records found, return 0
if (!hasRecords)
{
info(strFmt("No records found for Site: %1", _siteId));
return 0;
}
info(strFmt("Site: %1, Managed Cost: %2", _siteId, managedCost));
return managedCost;
}
}
Comments
Post a Comment