VF01销售开票BAPI:
FUNCTION zsdfu007.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_ID) TYPE ZRFC_LOGID OPTIONAL
*" VALUE(I_CANUM) TYPE CANUM OPTIONAL
*" EXPORTING
*" VALUE(E_CODE) TYPE MSGTY
*" VALUE(E_MSG) TYPE MSGTXT
*" VALUE(E_FLOW_END) TYPE CHAR01
*" TABLES
*" ET_RETURN STRUCTURE ZRFCT005 OPTIONAL
*"----------------------------------------------------------------------
DATA:lt_zsdt013 TYPE TABLE OF zsdt013,
ls_zsdt013 LIKE LINE OF lt_zsdt013,
ls_zsdt016 TYPE zsdt016,
lt_zsdt016 TYPE TABLE OF zsdt016,
lt_zsdt018 TYPE TABLE OF zsdt018,
ls_zsdt018 LIKE LINE OF lt_zsdt018,
lt_zsdt017 TYPE TABLE OF zsdt017,
ls_zsdt017 LIKE LINE OF lt_zsdt017.
DATA:BEGIN OF ls_objkey,
ebeln TYPE ekko-ebeln,
objkey TYPE zsdt008-objkey.
DATA:END OF ls_objkey.
DATA lt_objkey LIKE TABLE OF ls_objkey.
DATA:BEGIN OF ls_zrfc_logid,
zrfc_logid TYPE zsdt013-zrfc_logid,
objkey TYPE zsdt013-objkey,
zrfcid TYPE zsdt013-zrfcid,
END OF ls_zrfc_logid.
DATA lt_zrfc_logid LIKE TABLE OF ls_zrfc_logid.
DATA:ls_zrfct002 TYPE zrfct002.
DATA:ls_creatordatain TYPE bapicreatordata,
lt_billing TYPE STANDARD TABLE OF bapivbrk,
ls_billing TYPE bapivbrk.
DATA:lt_likp TYPE TABLE OF likp WITH HEADER LINE.
TYPES BEGIN OF ty_zsdt008.
INCLUDE TYPE zsdt008.
TYPES vbeln TYPE vbak-vbeln.
TYPES ebeln TYPE ekko-ebeln.
TYPES END OF ty_zsdt008.
DATA:ls_zsdt008 TYPE ty_zsdt008.
DATA:lt_zsdt008 TYPE TABLE OF ty_zsdt008.
DATA:ls_zsdt0082 TYPE ty_zsdt008.
DATA:lt_zsdt0082 TYPE TABLE OF ty_zsdt008.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_zsdt018
FROM zsdt018
WHERE zrfc_logid = i_id.
IF lt_zsdt018 IS INITIAL.
e_code = 'E'.
e_msg = '无可执行数据'.
RETURN.
ENDIF.
CALL METHOD zcl_rfc=>get_source
EXPORTING
i_id = i_id
i_canum = i_canum
IMPORTING
e_zrfct002 = ls_zrfct002.
DATA:lv_zrfc_logid TYPE zrfc_logid.
SELECT SINGLE * INTO ls_zsdt016 FROM zsdt016 WHERE zrfcid = ls_zrfct002-zrfcid AND canum = i_canum." AND bsart = ls_zsdt018-bsart.
LOOP AT lt_zsdt018 INTO ls_zsdt018.
ls_objkey-objkey = ls_zsdt018-ebeln.
ls_objkey-ebeln = ls_zsdt018-ebeln.
COLLECT ls_objkey INTO lt_objkey.
ENDLOOP.
SELECT
*
INTO TABLE lt_zsdt0082
FROM zsdt008
FOR ALL ENTRIES IN lt_objkey
WHERE objkey = lt_objkey-objkey
AND zrfcid = ls_zsdt016-zzrfcid.
IF lt_zsdt0082 IS NOT INITIAL.
SELECT *
INTO TABLE lt_zsdt008
FROM zsdt008
FOR ALL ENTRIES IN lt_zsdt0082
WHERE zrfc_logid = lt_zsdt0082-zrfc_logid
AND canum = ls_zsdt016-zcanum.
LOOP AT lt_zsdt008 INTO ls_zsdt008.
ls_zsdt008-vbeln = ls_zsdt008-objkey.
MODIFY lt_zsdt008 FROM ls_zsdt008.
ENDLOOP.
ENDIF.
* IF sy-subrc <> 0.
IF lt_zsdt008 IS INITIAL.
e_code = 'E'.
e_msg = '无可执行数据'.
RETURN.
ENDIF.
DATA:ls_vbak TYPE vbak,
lt_vbak TYPE TABLE OF vbak,
ls_vbap TYPE vbap,
lt_vbap TYPE TABLE OF vbap.
IF lt_zsdt008 IS NOT INITIAL.
SELECT
*
INTO TABLE lt_vbak
FROM vbak
FOR ALL ENTRIES IN lt_zsdt008
WHERE vbeln = lt_zsdt008-vbeln.
SELECT
*
INTO TABLE lt_vbap
FROM vbap
FOR ALL ENTRIES IN lt_zsdt008
WHERE vbeln = lt_zsdt008-vbeln.
ENDIF.
DATA:lv_posnr TYPE vbap-posnr.
****ADD BY ZJ 20221205 S 删除免费赠品
DELETE lt_zsdt018 WHERE flag = 'X'.
****ADD BY ZJ 20221205 E 删除免费赠品
LOOP AT lt_zsdt018 INTO ls_zsdt018.
READ TABLE lt_objkey INTO ls_objkey WITH KEY ebeln = ls_zsdt018-ebeln.
IF sy-subrc = 0.
READ TABLE lt_zsdt0082 INTO ls_zsdt0082 WITH KEY objkey = ls_objkey-objkey.
IF sy-subrc = 0.
READ TABLE lt_zsdt008 INTO ls_zsdt008 WITH KEY zrfc_logid = ls_zsdt0082-zrfc_logid.
IF sy-subrc = 0.
READ TABLE lt_vbak INTO ls_vbak WITH KEY vbeln = ls_zsdt008-vbeln.
ENDIF.
ENDIF.
ENDIF.
lv_posnr = ls_zsdt018-ebelp.
READ TABLE lt_vbap INTO ls_vbap WITH KEY posnr = lv_posnr vbeln = ls_zsdt008-vbeln.
ls_creatordatain-created_by = sy-uname.
ls_creatordatain-created_on = ls_zsdt018-bldat.
ls_billing-ref_doc = ls_vbak-vbeln.
ls_billing-ref_doc_ca = ls_vbak-vbtyp.
ls_billing-ref_item = ls_vbap-posnr.
ls_billing-bill_date = ls_zsdt018-budat.
ls_billing-req_qty = ls_zsdt018-menge.
****begin of jt-hpz 20221129 销售订单发票按采购订单行汇总
COLLECT ls_billing INTO lt_billing.
AT END OF ebeln.
ls_zsdt017-canum = i_canum.
ls_zsdt017-objtype = ls_zrfct002-objtype_save.
ls_zsdt017-zrfcid = ls_zrfct002-zrfcid.
ls_zsdt017-zrfc_logid = i_id.
ls_zsdt017-zzrfc_logid = ls_zsdt008-zrfc_logid.
ls_zsdt017-zcanum = ls_zsdt008-canum.
ls_zsdt017-zobjkey = ls_zsdt008-objkey.
ls_zsdt017-zobjtype = ls_zsdt008-objtype.
APPEND ls_zsdt017 TO lt_zsdt017.
ENDAT.
ENDLOOP.
PERFORM create_bl TABLES et_return lt_billing lt_zsdt017 USING i_id i_canum ls_creatordatain CHANGING e_code e_msg e_flow_end.
REFRESH:lt_billing,lt_zsdt017.
ENDFUNCTION.
FORM create_bl TABLES p_et_return STRUCTURE zrfct005
lt_billing STRUCTURE bapivbrk
lt_zsdt017 STRUCTURE zsdt017
USING p_i_id TYPE zrfc_logid
p_i_canum TYPE canum
ls_creatordatain TYPE bapicreatordata
CHANGING p_e_code
p_e_msg
p_e_flow_end.
DATA: lt_return1 TYPE STANDARD TABLE OF bapireturn1,
lt_errors TYPE STANDARD TABLE OF bapivbrkerrors,
lt_success TYPE STANDARD TABLE OF bapivbrksuccess,
ls_billing TYPE bapivbrk,
ls_return1 TYPE bapireturn1,
ls_errors TYPE bapivbrkerrors,
ls_success TYPE bapivbrksuccess.
DATA:BEGIN OF ls_bill_doc,
bill_doc TYPE bapivbrksuccess-bill_doc,
END OF ls_bill_doc,
lt_bill_doc LIKE TABLE OF ls_bill_doc.
DATA ls_zsdt017 TYPE zsdt017.
DATA:ls_zrfct005 TYPE zrfct005.
DATA:message TYPE c LENGTH 200.
DATA:bill_doc TYPE c LENGTH 200.
DATA:lt_condition TYPE TABLE OF bapikomv,
lt_bapisucc TYPE TABLE OF bapisucc.
CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
EXPORTING
creatordatain = ls_creatordatain
TABLES
billingdatain = lt_billing
errors = lt_errors
return = lt_return1
success = lt_success.
WAIT UP TO '0.5' SECONDS."不加没有返回消息
IF lt_success[] IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
LOOP AT lt_success INTO ls_success.
ls_bill_doc-bill_doc = ls_success-bill_doc.
COLLECT ls_bill_doc INTO lt_bill_doc.
ENDLOOP.
IF sy-subrc EQ 0.
LOOP AT lt_zsdt017 INTO ls_zsdt017.
LOOP AT lt_bill_doc INTO ls_bill_doc.
ls_zsdt017-objtype = 'BL'.
ls_zsdt017-objkey = ls_bill_doc-bill_doc."发票凭证
MODIFY lt_zsdt017 FROM ls_zsdt017.
ENDLOOP.
ENDLOOP.
MODIFY zsdt017 FROM TABLE lt_zsdt017.
p_e_code = 'S'.
LOOP AT lt_bill_doc INTO ls_bill_doc.
CONCATENATE bill_doc ls_bill_doc-bill_doc ',' INTO bill_doc.
ENDLOOP.
CONCATENATE 'BL:' bill_doc '创建成功' INTO p_e_msg.
CLEAR:ls_zrfct005.
ls_zrfct005-status = '53'.
ls_zrfct005-msgty = p_e_code.
ls_zrfct005-msgid = '00'.
ls_zrfct005-msgno = '001'.
ls_zrfct005-msgv1 = p_e_msg.
ls_zrfct005-msgv4 = ls_success-bill_doc.
APPEND ls_zrfct005 TO p_et_return.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT lt_return1 INTO ls_return1 WHERE type = 'E' OR type = 'A'.
CONCATENATE message ls_return1-message INTO message.
ENDLOOP.
p_e_code = 'E'.
p_e_msg = message.
ENDIF.
ENDFORM.