1、F-65 生成預制憑證
使用的bapi :
** Check the Document
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
**Create the Document
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
在使用這個BAPI的時候需要注意原因代碼等字段需要通過擴展去傳輸,這里就需要去使用SE19增強
參考實施是 ACC_DOCUMENT,我這里定義了一個 ZACC_DOCUMENT在他的CHANGE方法里面我們需要去寫入如下代碼:
DATA:ls_exte TYPE bapiparex. "用於生成預制憑證bapi設定 DATA: wa_extension TYPE bapiparex, ext_value(960) TYPE c, wa_accit TYPE accit, l_ref TYPE REF TO data. FIELD-SYMBOLS: <l_struc> TYPE any, <l_field> TYPE any. SORT c_extension2 BY structure. LOOP AT c_extension2 INTO wa_extension. AT NEW structure. CREATE DATA l_ref TYPE (wa_extension-structure). ASSIGN l_ref->* TO <l_struc>. ENDAT. CONCATENATE wa_extension-valuepart1 wa_extension-valuepart2 wa_extension-valuepart3 wa_extension-valuepart4 INTO ext_value. MOVE ext_value TO <l_struc>. ASSIGN COMPONENT 'POSNR' OF STRUCTURE <l_struc> TO <l_field>. READ TABLE c_accit WITH KEY posnr = <l_field> INTO wa_accit. IF sy-subrc IS INITIAL. MOVE-CORRESPONDING <l_struc> TO wa_accit. MODIFY c_accit FROM wa_accit INDEX sy-tabix. ENDIF. ENDLOOP. "如下計算稅額字段也需要在擴展里面去定義才能傳輸 LOOP AT c_extension2 INTO wa_extension WHERE structure = 'ZSEXTEN'. IF wa_extension-valuepart2 = 'XMWST'. LOOP AT c_accit INTO wa_accit . wa_accit-xmwst = 'X'. MODIFY c_accit FROM wa_accit INDEX sy-tabix TRANSPORTING xmwst. ENDLOOP. ENDIF. ENDLOOP. ”需要注意SET status為2才能生成預制憑證 READ TABLE c_extension2 INTO ls_exte WITH KEY structure = 'ZSEXTEN'. IF sy-subrc = 0. MOVE '2' TO c_acchd-status_new. DELETE c_extension2 INDEX sy-tabix. ENDIF.
遇到問題2是header_txt文本傳輸不進去,解決方法如下
使用SE24:IF_EX_AC_DOCUMENT,去調整他的方法 CHANGE_INITIAL ,CHANGE_AFTER_CHECK
在上面兩個方法里面添加如下代碼:
*----------------------------------------------------------------------------------------------------- *about field "HEADER_TXT" in structure "BAPIACHE09" not transferred to field "BKTXT" in table "BKPF" *Add by Torrance 20200330 *--------------------------------------------------------------------------------------------------- DATA: wa_header TYPE acchd. IF sy-xprog NE 'SAPMSSY1'. *---<SAPLBPFC> is for Posting with BAPI: BAPI_ACC_DOCUMENT_POST *---<SAPCNVE > is for Posting(Tax) with BAPI: BAPI_ACC_DOCUMENT_POST *---<SAPMSSY1> is for Test(Check) with BAPI: BAPI_ACC_DOCUMENT_CHECK CLEAR wa_header. wa_header = im_document-header. ex_document-header-bktxt = wa_header-bktxt. CLEAR wa_header. ENDIF.
2、FBV0過賬
*check document data
CALL FUNCTION 'ZPRELIMINARY_POSTING_CHECK_ALL'
*post document data
CALL FUNCTION 'ZPRELIMINARY_POSTING_POST_ALL'
原本應該使用PRELIMINARY_POSTING_CHECK_ALL和PRELIMINARY_POSTING_POST_ALL,但是這兩個方法在顯示界面的時候會去display log,如果在循環里面展現給用戶的結果就不友好,所以我復制了這兩個標准的function,然后在里面做變更,當我的程序call的時候就不display log
3、刪除預制憑證
這里使用了錄制BDC的方式
PERFORM bdc_dynpro USING 'SAPMF05V' '0100'. PERFORM bdc_field USING 'BDC_OKCODE' '/00'. PERFORM bdc_field USING 'BDC_CURSOR' 'RF05V-GJAHR'. PERFORM bdc_field USING 'RF05V-BUKRS' 'SR00'. PERFORM bdc_field USING 'RF05V-BELNR' p_belnr. PERFORM bdc_field USING 'RF05V-GJAHR' p_gjahr. PERFORM bdc_dynpro USING 'SAPLF040' '0700'. PERFORM bdc_field USING 'BDC_CURSOR' 'BKPF-XBLNR'. PERFORM bdc_field USING 'BDC_OKCODE' 'BL'. PERFORM bdc_dynpro USING 'SAPLSPO1' '0200'. PERFORM bdc_field USING 'BDC_CURSOR' 'SPOP-OPTION1'. "Button YES PERFORM bdc_field USING 'BDC_OKCODE' 'YES'. PERFORM bdc_field USING 'BDC_OKCODE' 'ENTER'. CALL TRANSACTION 'FBV0' USING bdcdata MODE mode UPDATE 'S'. CALL FUNCTION 'MESSAGE_TEXT_BUILD' EXPORTING msgid = sy-msgid msgnr = sy-msgno msgv1 = sy-msgv1 msgv2 = sy-msgv2 msgv3 = sy-msgv3 msgv4 = sy-msgv4 IMPORTING message_text_output = messtab EXCEPTIONS OTHERS = 4. APPEND messtab.
4、取消過賬
*會計憑證沖銷前檢查
CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_CHECK'
CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'