ABAP:销售发票冲销BAPI及VF02过账BDC
销售发票冲销BAPI及VF02过账BDC
FUNCTION zsdfu019. *"---------------------------------------------------------------------- *"*"本地接口: *" 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_zsdt027 TYPE TABLE OF zsdt027, ls_zsdt027 LIKE LINE OF lt_zsdt027, ls_zsdt026 TYPE zsdt026, lt_zsdt026 TYPE TABLE OF zsdt026, ls_zsdt017 TYPE zsdt017, ls_zsdt017_1 TYPE zsdt017, lt_zsdt017 TYPE TABLE OF zsdt017. DATA:ls_zrfct002 TYPE zrfct002. DATA:ls_source TYPE TABLE OF zrfcs001. DATA:ls_zrfct005 TYPE zrfct005. DATA:BEGIN OF ls_objkey, objkey TYPE zsdt008-objkey, END OF ls_objkey. DATA lt_objkey LIKE TABLE OF ls_objkey. DATA:BEGIN OF ls_zrfc_logid, zrfc_logid TYPE zsdt017-zrfc_logid, objkey TYPE zsdt008-objkey, END OF ls_zrfc_logid. DATA lt_zrfc_logid LIKE TABLE OF ls_zrfc_logid. DATA:lv_fkdat TYPE vbrk-fkdat, lv_stgrd TYPE stgrd. DATA:message TYPE c LENGTH 200. DATA:mtext TYPE c LENGTH 200. "获取源表数据 SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zsdt027 FROM zsdt027 WHERE zrfc_logid = i_id. IF lt_zsdt027 IS INITIAL. e_code = 'E'. e_msg = '无可执行数据'. RETURN. ENDIF. LOOP AT lt_zsdt027 INTO ls_zsdt027. ls_objkey-objkey = ls_zsdt027-vbeln. lv_fkdat = ls_zsdt027-fkdat. APPEND ls_objkey TO lt_objkey. ls_zsdt027-zposnr = ''. MODIFY lt_zsdt027 FROM ls_zsdt027. ENDLOOP. DELETE ADJACENT DUPLICATES FROM lt_objkey COMPARING ALL FIELDS. CALL METHOD zcl_rfc=>get_source EXPORTING i_id = i_id i_canum = i_canum IMPORTING e_zrfct002 = ls_zrfct002. "获取开票流程步骤 SELECT SINGLE zzrfcid zcanum INTO (ls_zsdt026-zzrfcid,ls_zsdt026-zcanum) FROM zsdt026 WHERE zrfcid = ls_zrfct002-zrfcid AND canum = i_canum. "根据开票流程步骤找到发票数据 SELECT zrfc_logid objkey INTO TABLE lt_zrfc_logid FROM zsdt017 FOR ALL ENTRIES IN lt_objkey WHERE objkey = lt_objkey-objkey AND zrfcid = ls_zsdt026-zzrfcid. IF lt_zrfc_logid IS INITIAL. e_code = 'E'. e_msg = '无可执行数据'. RETURN. ENDIF. SORT lt_zrfc_logid BY zrfc_logid. SELECT * INTO TABLE lt_zsdt017"销售开票数据 FROM zsdt017 FOR ALL ENTRIES IN lt_zrfc_logid WHERE zrfc_logid = lt_zrfc_logid-zrfc_logid AND canum = ls_zsdt026-zcanum. SORT lt_zsdt017 BY zrfc_logid. SORT lt_zrfc_logid BY objkey. "销售发票冲销结构定义 DATA:lt_return TYPE TABLE OF bapireturn1. DATA:lt_success TYPE TABLE OF bapivbrksuccess. DATA:ls_return TYPE bapireturn1. DATA:ls_success TYPE bapivbrksuccess. DATA:lv_billingdate TYPE bapivbrk-bill_date. DATA:lv_vbeln_old TYPE bill_doc. CLEAR:ls_zsdt017_1. READ TABLE lt_zsdt017 INTO ls_zsdt017_1 INDEX 1. CLEAR:lt_return[],lt_success[],lv_billingdate,lv_vbeln_old. lv_vbeln_old = ls_zsdt017_1-objkey. lv_billingdate = lv_fkdat. "判断发票是否产生会计凭证 DATA:lv_rfbsk TYPE vbrk-rfbsk. CLEAR:lv_rfbsk. SELECT SINGLE rfbsk INTO lv_rfbsk FROM vbrk WHERE vbeln = ls_zsdt017_1-objkey. CALL FUNCTION 'BAPI_BILLINGDOC_CANCEL1' EXPORTING billingdocument = lv_vbeln_old billingdate = lv_billingdate TABLES return = lt_return success = lt_success. READ TABLE lt_return INTO ls_return WITH KEY type = 'E'. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. e_code = 'E'. e_msg = ls_return-message. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. WAIT UP TO '2' SECONDS. READ TABLE lt_success INTO ls_success WITH KEY ref_doc = lv_vbeln_old. IF sy-subrc = 0. IF lv_rfbsk = 'C'. "冲销之后过账 CLEAR:messtab,bdcdata[]. PERFORM bdc_dynpro USING 'SAPMV60A' '0101'. PERFORM bdc_field USING 'BDC_CURSOR' 'VBRK-VBELN'. PERFORM bdc_field USING 'BDC_OKCODE' '/00'. PERFORM bdc_field USING 'VBRK-VBELN' ls_success-bill_doc. PERFORM bdc_dynpro USING 'SAPMV60A' '0104'. PERFORM bdc_field USING 'BDC_CURSOR' 'VBRK-FKART'. PERFORM bdc_field USING 'BDC_OKCODE' '=FKFR'. PERFORM bdc_dynpro USING 'SAPMV60A' '0104'. PERFORM bdc_field USING 'BDC_CURSOR' 'VBRK-FKART'. PERFORM bdc_field USING 'BDC_OKCODE' '=SICH'. gwa_ctu-defsize = 'X'. gwa_ctu-dismode = 'N'. gwa_ctu-updmode = 'S'. CALL TRANSACTION 'VF02' USING bdcdata OPTIONS FROM gwa_ctu MESSAGES INTO messtab. LOOP AT messtab WHERE msgtyp = 'E' OR msgtyp = 'X' OR msgtyp = 'A'. MESSAGE ID messtab-msgid TYPE messtab-msgtyp NUMBER messtab-msgnr INTO mtext WITH messtab-msgv1 messtab-msgv2 messtab-msgv3 messtab-msgv4. CONCATENATE message mtext INTO message SEPARATED BY '/'. ENDLOOP. IF sy-subrc <> '0'. ELSE. e_code = 'E'. e_msg = message. ENDIF. ENDIF. CLEAR:ls_zsdt017. SELECT SINGLE belnr INTO ls_zsdt017-belnr FROM bkpf WHERE awkey = ls_success-bill_doc. ls_zsdt017-zrfc_logid = i_id. ls_zsdt017-canum = ls_zrfct002-canum. ls_zsdt017-objtype = ls_zrfct002-objtype_save. ls_zsdt017-objkey = ls_success-bill_doc. ls_zsdt017-zrfcid = ls_zrfct002-zrfcid. * ls_zsdt017-belnr = ls_success-bill_doc. ls_zsdt017-zzrfc_logid = ls_zsdt017_1-zrfc_logid. ls_zsdt017-zcanum = ls_zsdt017_1-canum. ls_zsdt017-zobjkey = ls_zsdt017_1-objkey. ls_zsdt017-zobjtype = ls_zsdt017_1-objtype. APPEND ls_zsdt017 TO lt_zsdt017. CLEAR:ls_zsdt017. SELECT SINGLE * INTO ls_zsdt017 FROM zsdt017 WHERE zrfc_logid = ls_zsdt017_1-zrfc_logid AND canum = ls_zsdt017_1-canum AND objkey = ls_zsdt017_1-objkey AND objtype = ls_zsdt017_1-objtype. ls_zsdt017-fksto = 'X'. APPEND ls_zsdt017 TO lt_zsdt017. MODIFY zsdt017 FROM TABLE lt_zsdt017. e_code = 'S'. CONCATENATE 'BL:' ls_success-bill_doc '冲销成功' INTO e_msg. CLEAR:ls_zrfct005. ls_zrfct005-status = '53'. ls_zrfct005-msgty = e_code. ls_zrfct005-msgid = '00'. ls_zrfct005-msgno = '001'. ls_zrfct005-msgv1 = e_msg. ls_zrfct005-msgv4 = ls_success-bill_doc. APPEND ls_zrfct005 TO et_return. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. e_code = 'E'. e_msg = '冲销失败'. ENDIF. ENDIF. ENDFUNCTION.