SAP 小技巧 BOM 数据查询二

作者:ABAP技巧与实战 约 8 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Cloud Architecture, Data Engineering, 云架构, 开发, 数据工程

原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)

前言

这两天又在和BOM较劲.

前文提的一个BOM的变更逻辑:通过BOM明细表STPO的节点,计数器关联父节点,计数器获取项目的开始/结束日期.该逻辑只在特定情况下生效:变更编号不会重用且变更编号日期依次增加.

详见链接

**本文介绍尝试用CDS视图实现更完整的BOM有效期逻辑**

BOM修改场景

验证父节点关联方式的场景

通过如下两个场景的数据验证了原来的BOM视图通过关键父节点,计数器获取开始/结束日期是有问题的.

场景一 针对BOM一行按日期顺序多次修改

场景二 针对BOM一行按日期乱序多次修改

_**01** _

**场景一**

针对一行多次修改,多次修改按日期顺序

商品254 地点5981 备选3 行号 100

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

CS03放大日期范围查询的结果,该结果实际使用时, 要用有效期自<=指定日期 AND 有效期至 > 指定日期 来获取特定日期的BOM行.此时第一行

2022-09-02 2022-09-02 是无法单独查询的.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

自定义视图ZDDL_BOMD的查询结果,该结果修正了结束日期,避免日期的重叠. 要用有效期自<=指定日期 AND 有效期至 >= 指定日期

来获取特定日期的BOM行

因此无法查询的第一行出现结束日期<开始日期的情况.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

_**01** _

**场景二**

针对一行多次修改,多次修改按日期乱序

商品254 地点5981 备选4 行号 110

此时ZDDL_BOMD的内容有问题.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

标准CS03的结果

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

ZDDL_BOMD的查询结果异常. 出现日期重叠的行.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

标准的CDS视图

反复跟踪CS03显示BOM的过程(因为系统标准的解析BOM的逻辑过于复杂,很难通过CDS视图实现). 忽然想到,

SAP的源厂商是否已经尝试通过CDS视图呈现BOM的有效期信息呢?毕竟调用函数的方式获取BOM有效信息有一定的使用局限性, 不如CDS视图使用方便.

于是尝试用STPO表反查视图, 找到了P_COMPONENTS

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

场景一的数据

对于前文提到的场景一 .比较CS03与P_COMPONENTS结果.数据一致.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

场景二的数据

可以看到这里的CS03与P_COMPONENTS的结果出现差异, 视图少了2022-09-04 -> 2022-09-20 的期间.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

逻辑分析

追查该视图的逻辑.其核心逻辑是STAS关联STAS本身更大期间的数据,再用min(datuv)作为结束日期,从而获取每一行的开始日期/结束日期.该逻辑甚是巧妙.但对于复杂的场景二还是有问题.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

核心逻辑优化

实际测试中发现如果把a.datuv <= b.datuv 修改成 a.datuv <

b.datuv,在不影响场景一的数据基础上,可以解决场景二丢失期间的问题.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

场景一的数据

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

场景二的数据:其中丢失的期间 2022-09-04 -> 2022-09-20 出现了.

但是针对2022-11-01这一行,不能直接对目标日期调整成99991231 . (调整99991231需要判断改行是最后一行,需要另外的视图支持调整 )

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

重写BOM视图

复制如下的标准视图, 并调整部分逻辑,解决标准视图的BUG.

• P_BOMITEMVALID_TO

• P_BOMITEMLATESTVALID_TO

• P_BOMITEMWITHCHANGEFROM

• P_BOMITEMWITHCHANGENUM

• P_VALID_COMPONENTS

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

新增视图,用于获取物料清单 项目/排序字符串的最大项目, 只有最大节点,才对结束日期为空的补充结束日期.

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

修改 ZP_BOMITEMWITHCHANGENUM中补充结束日期的逻辑

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

调整ZDDL_BOMD中使用的视图

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

至此比较场景二的CS03与ZDDL_BOMD的结果,去掉无效行后,二者结果一致( CS03中的结束日期-1=ZDDL_BOMD中的结束日期)

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

总结

BOM主数据如果启用了变更号修改BOM,可以记录BOM每次修改的具体信息, 并且可以通过有效开始日期来控制修改的生效日期.

但是会让BOM表中的数据看起来比较复杂.

一般情况下, 推荐使用标准BOM查询函数查询 (后一个可能基于HANA优化了性能,可能在新版本中才能使用)

CS_BOM_EXPL_MAT_V2 BOM explosion for material

CS_BOM_EXPL_MAT_V2_HANA HANA MBOM explosion function module

在创建BOM相关报表时, 每个BOM调用查询函数获取结果,再整合输出. 这个过程有点麻烦,且性能会受影响.

本文通过分析BOM数据的特征,通过分析并优化标准DDL视图 P_COMPONENTS的BUG

创建的BOM视图可以获取和BOM函数类似的结果(未考虑变式分解/BOM子项目/相关性分配等特殊业务)

文中的CDS视图尚未用更多的特殊情况验证. **源码附在文末** , 有兴趣可以参与测试验证,也希望能分享你的测试结果及改进建议

**约定**

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.

( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.

越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )

SAP 小技巧 BOM 数据查询二 - 封面图
SAP 小技巧 BOM 数据查询二 - 封面图

**公众号 : syjf1976_abap**

**ABAP开发技巧**

**微信号 : 392077**

请微信联系管理员

syjf1976

sharry_xlp

Yannick_Duan

申请进入公众号讨论群提问或者参与话题讨论

源代码

ABAP技巧与实战

关于作者:ABAP技巧与实战

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「SAP小技巧BOM数据查询二.md」整理生成,仅用于内部技术分享与学习交流。