原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
这两天又在和BOM较劲.
前文提的一个BOM的变更逻辑:通过BOM明细表STPO的节点,计数器关联父节点,计数器获取项目的开始/结束日期.该逻辑只在特定情况下生效:变更编号不会重用且变更编号日期依次增加.
详见链接
**本文介绍尝试用CDS视图实现更完整的BOM有效期逻辑**
二
BOM修改场景
验证父节点关联方式的场景
通过如下两个场景的数据验证了原来的BOM视图通过关键父节点,计数器获取开始/结束日期是有问题的.
场景一 针对BOM一行按日期顺序多次修改
场景二 针对BOM一行按日期乱序多次修改
_**01** _
**场景一**
针对一行多次修改,多次修改按日期顺序
商品254 地点5981 备选3 行号 100
CS03放大日期范围查询的结果,该结果实际使用时, 要用有效期自<=指定日期 AND 有效期至 > 指定日期 来获取特定日期的BOM行.此时第一行
2022-09-02 2022-09-02 是无法单独查询的.
自定义视图ZDDL_BOMD的查询结果,该结果修正了结束日期,避免日期的重叠. 要用有效期自<=指定日期 AND 有效期至 >= 指定日期
来获取特定日期的BOM行
因此无法查询的第一行出现结束日期<开始日期的情况.
_**01** _
**场景二**
针对一行多次修改,多次修改按日期乱序
商品254 地点5981 备选4 行号 110
此时ZDDL_BOMD的内容有问题.
标准CS03的结果
ZDDL_BOMD的查询结果异常. 出现日期重叠的行.
三
标准的CDS视图
反复跟踪CS03显示BOM的过程(因为系统标准的解析BOM的逻辑过于复杂,很难通过CDS视图实现). 忽然想到,
SAP的源厂商是否已经尝试通过CDS视图呈现BOM的有效期信息呢?毕竟调用函数的方式获取BOM有效信息有一定的使用局限性, 不如CDS视图使用方便.
于是尝试用STPO表反查视图, 找到了P_COMPONENTS
场景一的数据
对于前文提到的场景一 .比较CS03与P_COMPONENTS结果.数据一致.
场景二的数据
可以看到这里的CS03与P_COMPONENTS的结果出现差异, 视图少了2022-09-04 -> 2022-09-20 的期间.
四
逻辑分析
追查该视图的逻辑.其核心逻辑是STAS关联STAS本身更大期间的数据,再用min(datuv)作为结束日期,从而获取每一行的开始日期/结束日期.该逻辑甚是巧妙.但对于复杂的场景二还是有问题.
五
核心逻辑优化
实际测试中发现如果把a.datuv <= b.datuv 修改成 a.datuv <
b.datuv,在不影响场景一的数据基础上,可以解决场景二丢失期间的问题.
场景一的数据
场景二的数据:其中丢失的期间 2022-09-04 -> 2022-09-20 出现了.
但是针对2022-11-01这一行,不能直接对目标日期调整成99991231 . (调整99991231需要判断改行是最后一行,需要另外的视图支持调整 )
六
重写BOM视图
复制如下的标准视图, 并调整部分逻辑,解决标准视图的BUG.
• P_BOMITEMVALID_TO
• P_BOMITEMLATESTVALID_TO
• P_BOMITEMWITHCHANGEFROM
• P_BOMITEMWITHCHANGENUM
• P_VALID_COMPONENTS
新增视图,用于获取物料清单 项目/排序字符串的最大项目, 只有最大节点,才对结束日期为空的补充结束日期.
修改 ZP_BOMITEMWITHCHANGENUM中补充结束日期的逻辑
调整ZDDL_BOMD中使用的视图
至此比较场景二的CS03与ZDDL_BOMD的结果,去掉无效行后,二者结果一致( CS03中的结束日期-1=ZDDL_BOMD中的结束日期)
七
总结
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视图尚未用更多的特殊情况验证. **源码附在文末** , 有兴趣可以参与测试验证,也希望能分享你的测试结果及改进建议
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
**公众号 : syjf1976_abap**
**ABAP开发技巧**
**微信号 : 392077**
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论
源代码