[ABAP] QF01质检通知单删除行数据BAPI:BAPI_QUALNOT_DEL_DATA

最近做一个QF01的批导创建需求,QF01质检通知单创建的BAPI一开始没有找到采用录屏的的方式实现的,后边查资料找到几个BAPI还没有去验证测试:QFFE_FAILURE_RECORDING、BAPI_QNOTIFICAT_CREATE、BAPI_QUALNOT_CREATE等。

后边需求有变更要求导入时已创建的检验批数据需要覆盖通知单,这样就涉及到QF01的删除行数据操作了,偏偏前台操作SAP没有预留整单删除按钮,录屏又不太好实现,这样尝试去查找删除质检通知单的BAPI找到:BAPI_QUALNOT_DEL_DATA

阅读BAPI文档得到需要与BAPI_QUALNOT_SAVE连用,类似于一个提交操作。

在使用BAPI_QUALNOT_DEL_DATA的时候需要注意参数值需要填写完整,而完整的参数值很难通过表取数获取,可以通过调用:BAPI_QUALNOT_GETDETAIL来获取相关参数值,将需要删除的行数据填入BAPI_QUALNOT_DEL_DATA就可以了。

需要注意:即使用BAPI删除了通知单的所有行数据, 抬头表QMEL的删除标识KZLOESCH也是不会打钩的,但是前台QF01删除所有行数据抬头QMEL-KZLOESCH会自动打钩,这点在使用中需要注意。

欢迎指正!

附调用代码:

*&---------------------------------------------------------------------*
*& Form FRM_DELETE_QMNUM 
*& 删除通知单
*&---------------------------------------------------------------------*
FORM frm_delete_qmnum USING pv_qmnum TYPE bapi2078_nothdre-notif_no
                    CHANGING p_head LIKE gs_data.
  DATA: lt_notitem     TYPE TABLE OF bapi2078_notiteme,
        lt_notifcaus   TYPE TABLE OF bapi2078_notcause,
        lt_notifactv   TYPE TABLE OF bapi2078_notactve,
        lt_notiftask   TYPE TABLE OF bapi2078_nottaske,
        lt_notifpartnr TYPE TABLE OF bapi2078_notpartnre,
        lt_return      TYPE TABLE OF bapiret2.
  DATA: lt_notitem_del     TYPE TABLE OF bapi2078_notitemi,
        lt_notifcaus_del   TYPE TABLE OF bapi2078_notcausi,
        lt_notifactv_del   TYPE TABLE OF bapi2078_notactvi,
        lt_notiftask_del   TYPE TABLE OF bapi2078_nottaski,
        lt_notifpartnr_del TYPE TABLE OF bapi2078_notpartnri,
        lt_return_del      TYPE TABLE OF bapiret2.
  DATA: lt_return_save     TYPE TABLE OF bapiret2.

  "获取通知单明细数据
  CALL FUNCTION 'BAPI_QUALNOT_GETDETAIL'
    EXPORTING
      number      = pv_qmnum
* IMPORTING
*     NOTIFHEADER_EXPORT       =
*     NOTIFHDTEXT =
    TABLES
      "    NOTLONGTXT               =
      notitem     = lt_notitem
      notifcaus   = lt_notifcaus
      notifactv   = lt_notifactv
      notiftask   = lt_notiftask
      notifpartnr = lt_notifpartnr
      return      = lt_return.
  IF NOT line_exists( lt_return[ type = 'E' ] ).
    "删除通知单行项目
    MOVE-CORRESPONDING lt_notitem[] TO lt_notitem_del[].
    MOVE-CORRESPONDING lt_notifcaus[] TO lt_notifcaus_del[].
    MOVE-CORRESPONDING lt_notifactv[] TO lt_notifactv_del[].
    MOVE-CORRESPONDING lt_notiftask[] TO lt_notiftask_del[].
"    MOVE-CORRESPONDING lt_notifpartnr[] TO lt_notifpartnr_del[].

    CALL FUNCTION 'BAPI_QUALNOT_DEL_DATA'
      EXPORTING
        number      = pv_qmnum
      TABLES
        notitem     = lt_notitem_del
        notifcaus   = lt_notifcaus_del
        notifactv   = lt_notifactv_del
        notiftask   = lt_notiftask_del
"        notifpartnr = lt_notifpartnr_del
        return      = lt_return_del.
    IF line_exists( lt_return_del[ type = 'E' ] ) OR line_exists( lt_return_del[ type = 'A' ] ).
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      p_head-statu = c_red .
      p_head-message = '执行失败,执行删除操作失败!'.
      LOOP AT lt_return_del INTO DATA(ls_return_del) WHERE type = 'E' OR type = 'A'.
        p_head-message =
          COND #( WHEN p_head-message = space THEN ls_return_del-message
                  ELSE |{ p_head-message }/{ ls_return_del-message }| ).
      ENDLOOP.
      EXIT.
    ELSE.
      CALL FUNCTION 'BAPI_QUALNOT_SAVE'
        EXPORTING
          number = pv_qmnum
        TABLES
          return = lt_return_save.
      IF line_exists( lt_return_save[ type = 'E' ] ) OR line_exists( lt_return_save[ type = 'A' ] ).
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        p_head-statu = c_red .
        p_head-message = '执行失败,执行删除操作失败!'.
        LOOP AT lt_return_save INTO DATA(ls_return_save) WHERE type = 'E' OR type = 'A'.
          p_head-message =
            COND #( WHEN p_head-message = space THEN ls_return_save-message
                    ELSE |{ p_head-message }/{ ls_return_save-message }| ).
        ENDLOOP.
        EXIT.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ENDIF.
    ENDIF.
  ELSE.
    p_head-statu = c_red .
    p_head-message = '执行失败,执行删除操作失败!'.
    LOOP AT lt_return INTO DATA(ls_return) WHERE type = 'E' OR type = 'A'.
      p_head-message =
        COND #( WHEN p_head-message = space THEN ls_return-message
                ELSE |{ p_head-message }/{ ls_return-message }| ).
    ENDLOOP.
    EXIT.
  ENDIF.

ENDFORM.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值