AX2012中处理BOM展开逻辑的标准类是什么?
AX2012 现成BOM展开标准类及优化方案
一、AX2012内置的BOM展开标准类
AX2012提供了多个成熟的标准类来处理BOM展开逻辑,无需自行编写递归函数:
- BOMCalc:核心BOM计算类,内置多级BOM展开逻辑,支持按版本、生效日期等维度筛选,自动处理递归结构的BOM,底层优化了数据库查询效率。
- BOMExplosion:专门用于BOM展开的类,支持批量展开和自定义过滤条件,性能优于手动递归,减少了重复数据库请求。
- BOMLevel:辅助获取BOM层级信息,搭配BOMCalc使用可清晰管理展开的层级关系。
二、基于标准类的替代实现示例
替换你现有递归代码的X++示例:
while select * from ProdTable where ProdTable.StartDate == today() { // 初始化BOM计算实例,传入物料ID和当前日期 BOMCalc bomCalc = BOMCalc::newItem(ProdTable.ItemId, SystemDateGet()); bomCalc.calc(); // 遍历展开后的BOM记录 BOMCalcTrans bomCalcTrans; while select bomCalcTrans where bomCalcTrans.CalcId == bomCalc.calcId() { InventModelGroupItem modelGroupItem = InventModelGroupItem::findByItemIdLegalEntity(bomCalcTrans.ItemId); if (modelGroupItem.ModelGroupId != "WIP") { info(strfmt("lv. %1, ItemId: %2", bomCalcTrans.Level, bomCalcTrans.ItemId)); } } }
三、SQL Server存储过程实现思路
如果坚持用存储过程,可利用SQL递归CTE实现多级BOM展开,性能更优。示例CTE结构如下:
WITH BOMExplosionCTE AS ( -- 初始层级:传入根物料ID SELECT BOM.ItemId, BOM.BomId, 1 AS Level, IMGI.ModelGroupId FROM BOM JOIN InventModelGroupItem IMGI ON BOM.ItemId = IMGI.ItemId WHERE BOM.BomId = @RootItemId UNION ALL -- 递归层级:关联上一级物料 SELECT BOM.ItemId, BOM.BomId, BOMCTE.Level + 1, IMGI.ModelGroupId FROM BOM JOIN BOMExplosionCTE BOMCTE ON BOM.BomId = BOMCTE.ItemId JOIN InventModelGroupItem IMGI ON BOM.ItemId = IMGI.ItemId ) -- 筛选非WIP组的物料 SELECT Level, ItemId FROM BOMExplosionCTE WHERE ModelGroupId != 'WIP'
在存储过程中可循环处理ProdTable中符合StartDate == today()条件的物料,逐个调用上述CTE逻辑。
内容的提问来源于stack exchange,提问作者nuttapol madee
相关产品推荐
相关产品推荐

