SAP ECN修改记录实现方案

BOM数据,是制造业SAP系统管理最为重要的主数据之一。

了解PP模块的顾问都知道,BOM数据是具有时间维度的,代表着产品的不断演变过程。可以在不同的时间轴节点上查询历史BOM数据。

换句话说BOM就是产品全生命周期的一个缩影。

想要达到BOM的生命周期管理,需要启动BOM变更管理(OS27)。

此时会有增加一个主数据-ECN:工程变更号/工程变更通告。

在SAP系统,可以很方便的查询BOM历史数据、不同的BOM展开结构、版本对比等,但在整个BOM变更管理中,变更审核/断点管理也特别想知道,分配给工程师的ECN修改了什么内容。

反映在SAP业务需求:ECN修改记录。

标准功能通过ECN查询修改记录,可以说是个灾难,即使在S4也没有进步。

了解BOM后台表的顾问,可能会通过STPO和STAS的查询ECN修改记录:

其实简单BOM的获取函数:‘CSAP_MAT_BOM_READ’

和订单BOM获取函数:‘CSAP_ORD_BOM_ITEM_SELECT‘

出参结构T_STPO,也体现着修改逻辑,只要定义好逻辑,可以开发出直观ECN修改记录。

通过函数获取T_STPO,获取到BOM行数据:

LOOP AT lt_stpo INTO lw_stpo .
CLEAR gw_stpo.
gw_stpo-werks = p_werks.
gw_stpo-aennr_search = in_aennr.
gw_stpo-stlan = in_stlan.
gw_stpo-matnr = in_matnr.
gw_stpo-stlty = in_stlty.
gw_stpo-stlnr = in_stlnr.
gw_stpo-stlkn = lw_stpo-item_node.
gw_stpo-stpoz = lw_stpo-item_count.
gw_stpo-posnr = lw_stpo-item_no.
gw_stpo-idnrk = lw_stpo-component.
gw_stpo-aennr = lw_stpo-change_no.
gw_stpo-vbeln = in_order.
gw_stpo-vbpos = in_vbpos.
gw_stpo-annam = lw_stpo-created_by.
gw_stpo-aennr_end = lw_stpo-chg_no_to.
gw_stpo-postp = lw_stpo-item_categ.

CALL FUNCTION ‘UNITS_STRING_CONVERT’
EXPORTING
units_string = lw_stpo-comp_qty
dcpfm = l_dcpfm
IMPORTING
units = gw_stpo-menge
EXCEPTIONS
invalid_type = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
gw_stpo-sortf = lw_stpo-sortstring.
APPEND gw_stpo TO gt_stpo.
ENDLOOP.

通过BOM函数获取的字段STVKN为空

还需要填充STVKN字段值:

SELECT stlty stlnr stlkn stpoz vgknt AS stvkn
INTO CORRESPONDING FIELDS OF TABLE
lt_stpo_update
FROM stpo
FOR ALL ENTRIES IN gt_stpo
WHERE stlty = gt_stpo-stlty
AND stlnr = gt_stpo-stlnr
AND stlkn = gt_stpo-stlkn
AND stpoz = gt_stpo-stpoz
AND vgknt <> ‘’.
IF lt_stpo_update[] IS NOT INITIAL.
LOOP AT lt_stpo_update INTO lw_stpo_update.
READ TABLE gt_stpo INTO gw_stpo WITH KEY stlty = lw_stpo_update-stlty
stlnr = lw_stpo_update-stlnr
stlkn = lw_stpo_update-stlkn
stpoz = lw_stpo_update-stpoz.
IF sy-subrc EQ 0.
gw_stpo-stvkn = lw_stpo_update-stvkn.
MODIFY gt_stpo FROM gw_stpo INDEX sy-tabix.
ENDIF.
ENDLOOP.

以上ECN及BOM数据获取完整后

根据BOM的数据分析是新增、删除、还是修改。

LOOP AT gt_stpo INTO gw_stpo .
IF gw_stpo-aennr_end <> ‘’.
IF gw_stpo-aennr_end = in_aennr.
MOVE-CORRESPONDING gw_stpo TO gw_stpo_b_e.
gw_stpo_b_e-menge_end = gw_stpo-menge.
gw_stpo_b_e-sortf_end = gw_stpo-sortf.
APPEND gw_stpo_b_e TO gt_stpo_b_e.
ENDIF.
ENDIF.
IF gw_stpo-aennr = in_aennr.
MOVE-CORRESPONDING gw_stpo TO gw_stpo_b.
APPEND gw_stpo_b TO gt_stpo_b.
ENDIF.
ENDLOOP.

如果aennr_end = 为空,

而且STVKN为空,代表这是新增行

LOOP AT gt_stpo_b INTO gw_stpo_b .
l_index = sy-tabix.
IF gw_stpo_b-stvkn = ‘’." 不存在继承节点-则属于新增
gw_stpo_b-action = ‘新增’.
APPEND gw_stpo_b TO gt_stpo_result.
DELETE gt_stpo_b INDEX l_index.

如果aennr_end = 为空,

STVKN不为空,代表这是修改行或者替换
ELSE."存在继承节点 -则属于修改
READ TABLE gt_stpo_b_e INTO gw_stpo_b_e WITH KEY aennr_end = gw_stpo_b-aennr stlkn = gw_stpo_b-stvkn."查找父节点
IF sy-subrc EQ 0.
l_index_e = sy-tabix.
IF gw_stpo_b_e-idnrk = gw_stpo_b-idnrk.
gw_stpo_b_e-action = ‘修改前’.
gw_stpo_b-action = ‘修改后’ .

ELSE.
gw_stpo_b_e-action = ‘替换前’.
gw_stpo_b-action = ‘替换后’.

DELETE gt_stpo_b_e INDEX l_index_e.

在处理新增、修改或者替换后,剩余的为删除行:
IF gw_stpo_b_e-aennr_end = in_aennr…
CLEAR gw_stpo_b_e-menge_end.
gw_stpo_b_e-action = ‘删除’.

ENDLOOP.

APPEND LINES OF gt_stpo_result TO gt_stpo_result_all.

最终获取到BOM的ECN修改记录

按照业务用户的要求,展现数据结构如变更前后的库存、采购等数据。

发布了5 篇原创文章 · 获赞 0 · 访问量 397

猜你喜欢

转载自blog.csdn.net/SAPer_Leon/article/details/105346536
SAP