[ABAP] 销售业务TO创建/DN过账报错对应到行

文章描述了如何通过跟踪和修改代码来处理BAPI调用中遇到的行级错误,特别是BAPI_L_TO_CREATE_DN和BAPI_OUTB_DELIVERY_CONFIRM_DEC。通过获取错误消息内表,确定错误行,并在BAPI调用后从内存中提取错误日志以获取详细信息。
摘要由CSDN通过智能技术生成

有客户提出需求想要让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,都可以用这个内存试一下看能否获取到具体报错信息。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值