You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 05:07:28