有客户提出需求想要让BAPI:L_TO_CREATE_DN / BAPI_OUTB_DELIVERY_CONFIRM_DEC
这两个BAPI报错能够对应到行,经过跟踪程序和SD顾问的指导解决了这一需求,解决思路做如下记录。
前台模拟过账得到报错信息消息号:
使用消息跟踪到报错位置:
得到返回消息内表,包含具体报错行
测试过其他几个报错都会返回到该内表中,
故修改返回消息处代码,当判断BAPI执行错误时,获取该内表值返回报错对应到具体行
DATA: BEGIN OF t_grp_msg OCCURS 20.
INCLUDE STRUCTURE wmgrp_msg.
DATA: END OF t_grp_msg.
FIELD-SYMBOLS: <fs_grp_msg> TYPE ANY TABLE.
ASSIGN ('(SAPLL03B)T_GRP_MSG[]') TO <fs_grp_msg>.
IF sy-subrc = 0 AND <fs_grp_msg> IS ASSIGNED.
t_grp_msg[] = <fs_grp_msg>.
LOOP AT gt_out INTO gs_out WHERE vbeln = ls_vbeln-vbeln AND lgnum = ls_vbeln-lgnum
AND zsammg = ls_vbeln-sammg.
CLEAR: gs_out-msgtx.
CLEAR: gs_out-traffic_lights.
gs_out-traffic_lights = c_icon_red_light.
"报错行
LOOP AT t_grp_msg WHERE ( msgty = 'E' OR msgty = 'A' )
AND vbeln = gs_out-vbeln AND posnr = gs_out-posnr.
"gs_out-traffic_lights = c_icon_red_light.
gs_out-msgtx = COND #( WHEN gs_out-msgtx = space THEN t_grp_msg-msgtx
ELSE |{ gs_out-msgtx }/{ t_grp_msg-msgtx }| ).
gs_out-msgtx = 'TO失败:本行报错:' && gs_out-msgtx.
ENDLOOP.
IF sy-subrc <> 0.
IF t_grp_msg[] IS NOT INITIAL.
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO DATA(mtext)
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
gs_out-msgtx = 'TO失败:' && mtext.
CLEAR: mtext.
ENDIF.
ENDIF.
IF gs_out-msgtx IS NOT INITIAL.
gs_out-traffic_lights = c_icon_red_light.
ELSE.
gs_out-traffic_lights = c_icon_green_light.
ENDIF.
MODIFY gt_out FROM gs_out.
CLEAR: gs_out.
ENDLOOP.
ELSE.
gs_out-traffic_lights = c_icon_red_light.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO mtext
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
gs_out-msgtx = 'TO失败:' && mtext.
CLEAR: mtext.
MODIFY gt_out FROM gs_out TRANSPORTING traffic_lights msgtx WHERE vbeln = ls_vbeln-vbeln AND lgnum = ls_vbeln-lgnum AND zsammg = ls_vbeln-sammg.CLEAR:gs_out.
EXIT.
ENDIF.
继续跟踪DN过账BAPI,寻找装有具体报错信息的变量
跟踪BAPI代码很容易找到,BAPI:BAPI_OUTB_DELIVERY_CONFIRM_DEC 底层本质上还是调用的WS_DELIVERY_UPDATE
WS_DELIVERY_UPDATE拥有返回表参数PROT,内含有具体DN行
故用这个变量设置监控点观察数据变化,得到数据APPEND位置,数据从另一内表WAT_PROT继承获得
继续往前追溯WAT_PROT内表数据来源,跟踪至以下代码位置,发现标准代码已将WAT_PROT数据存入内存"PROT"
测试发现在调用BAPI:BAPI_OUTB_DELIVERY_CONFIRM_DEC外围可以获取到此内存值,故使用此标准内存获取具体报错行
* Fehlerprotokoll für Kommirückmeldung
DATA: BEGIN OF wat_prot OCCURS 0.
INCLUDE STRUCTURE prott.
DATA: END OF wat_prot.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
EXPORTING
header_data = header_data
header_control = header_control
delivery = delivery
TABLES
header_deadlines = header_deadlines
header_partner = header_partner
item_data = item_data
item_control = item_control
return = return.
READ TABLE return WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CLEAR: wat_prot[].
IMPORT proto_tab = wat_prot[] FROM MEMORY ID 'PROT'.
IF sy-subrc = 0.
proto_tab[] = wat_prot[].
ENDIF.
ENDIF.
延伸得出所有对DN的拣配过账操作BAPI,都可以用这个内存试一下看能否获取到具体报错信息。