ABAP CDS中多层自引用存储位置表的库存SUM聚合实现问询
自引用存储位置的层级库存汇总实现方案
完全可以用单SELECT语句实现层级库存汇总,不需要依赖AMDP,核心是用**递归CTE(公共表表达式)**处理自引用层级关系,具体思路如下:
实现步骤
- 用递归CTE遍历自引用存储位置表,把每个有库存的子位置(比如你的AAA1)和它所有的父级节点(AA1、A1、A)建立映射关系,同时包含子位置自身。
- 将这个递归生成的层级映射表,和你已有的库存汇总CDS视图关联,按父级位置分组求和,就能得到每个父级的累计库存(包含所有子级的库存值)。
避免无限循环的关键
- 递归CTE必须设置明确的终止条件:比如只往上遍历到没有父级的根节点(A),在递归分支里加
WHERE parent_loc_id IS NOT NULL这类判断,防止无限制递归。 - 提前检查自引用表的数据,确保没有循环层级(比如A的父级设为A1,A1的父级又设为A),数据层面的循环会直接导致递归报错。
对比AMDP方案
- 不是必须用AMDP做预分配,递归CTE的方式更轻量,直接在ABAP SQL或者CDS视图里就能实现,不需要额外开发AMDP类。
- 只有当数据量极大、层级极深,递归CTE性能出现瓶颈时,才考虑用AMDP做批量预分配,但大部分业务场景下递归CTE足够满足需求。
示例SQL(伪代码)
WITH RECURSIVE loc_hierarchy AS ( -- 基准分支:取出所有有库存的位置 SELECT sl.loc_id, sl.parent_loc_id, sl.loc_id AS ancestor_loc FROM storage_loc sl INNER JOIN cds_stock_summary css ON sl.loc_id = css.loc_id UNION ALL -- 递归分支:向上遍历父级节点 SELECT sl.loc_id, sl.parent_loc_id, lh.ancestor_loc FROM storage_loc sl INNER JOIN loc_hierarchy lh ON sl.loc_id = lh.parent_loc_id WHERE sl.parent_loc_id IS NOT NULL ) -- 按父级位置汇总库存 SELECT ancestor_loc AS location, SUM(css.stock_qty) AS total_stock FROM loc_hierarchy lh INNER JOIN cds_stock_summary css ON lh.loc_id = css.loc_id GROUP BY ancestor_loc;
这个语句会返回A、A1、AA1、AAA1的库存值均为25,实现了父级汇总子级库存的需求。
内容的提问来源于stack exchange,提问作者user2239695
相关产品推荐
相关产品推荐

