最近做一个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.