SAP FI 会计凭证过账bapi BAPI_ACC_DOCUMENT_POST
生活随笔
收集整理的這篇文章主要介紹了
SAP FI 会计凭证过账bapi BAPI_ACC_DOCUMENT_POST
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.??? 舉個我們這次系統中的一個業務場景
前面講到我們需要把一個Oracle應付發票的憑證導入到SAP中,但是導入的字段比較多,就會出現如下的問題:
SAP系統中把憑證中的[分支號]作為不同系統的來源,例如憑證來源于Oracle,金蝶,用友,那么分支號分別是'001','002','003'。
我們這里使用BAPI_ACC_DOCUMENT_POST來導入憑證,
大家可以看一下在BKPF表中存在[分支號]字段?????? 但是在BAPIACHE09(操作代碼SE37)結構中卻沒有[分支號]這個字段,BAPIACHE09是BAPI_ACC_DOCUMENT_POST導入憑證頭的入口結構???????
???????
那么標準API沒有[分支號],SAP采用何種方法才能將[分支號]導入系統哪?很高興看到SAP提供了增強BAdi(客戶化創建BAdi)來導入標準API沒有的字段
一般情況下,不需要對BAdi作增強,但是當需要將某個不常用的字段導入到SAP,但是標準的BAPI又不能夠支持這個字段,則需要對BAdi作增強,那么如何對BAdi作增強那?
下面簡單做個講解:
1)首先需要我們對標準的BAdi(操作代碼SE19)做個實例化,本場景中,我們對ACC_DOCUMENT這個標準的BAdi實例化????? ??????? ???????
關鍵是上圖中的CHANGE部分,雙擊就可以進入BAdi的ABAP程序源代碼,是不是感覺很爽,不過別高興太早,因為進入源代碼的編輯器之后,是空的,當然,源代碼是需要自己添加的,請看下圖:
???????
上面的代碼看不懂沒關系,我來解釋一下:
DATA部分是定義變量,liw_accit TYPE accit就是定義一個accit的結構類型的變量liw_accit;
LOOP部分就是對BAPI中的extension2的數據作循環
Liw_accit-bschl就是對bschl這個字段根據實際傳入的數據作賦值,當然,bschl就是類似[分支號]的字段;
MODIFY就是將bashl等字段寫入到c_accit結構中,相當于更新accit表中的數據大家看到這里,可能已經明白了BAdi是怎么回事。但是大家可能會問,BAPI怎么會去調用BAdi來做這個事情哪?這個問題可能比較復雜,但是我把他簡化了說:
在下圖中,BAPI一般會有
[Import]傳入參數
[Export]傳出參數
[Tabellen]這個是table類型的,用來傳入和傳出數組類型或table類型的數據,在table類型的數據中有個參數是extension2,作為擴展導入的字段,只要在extension2中作了定義,那么就會執行所有實例化的BAdi,所以這也算是SAP的一個缺點,因為假設你定義了2個相同類型的BAdi,它們都會被執行,假設這兩個BAdi邏輯相悖,則會導致所無的數據,所以要在SAP的開發中避免
???????
1.??? SAP導入多個憑證
?
不過講到這里,我們也只是一個憑證,但是在我們實際的業務場景中,我們大部分都需要導入多個憑證,那么如果想要導入多個憑證,使用SAP的API如何來實現那?既然可以使用BAPI_ACC_DOCUMENT_POST可以導入單個憑證,只要對它循環操作就可以實現多個憑證的導入了,大家看了下面的代碼就會理解,紅色的部分就是循環調用BAPI_ACC_DOCUMENT_POST就可以批量導入憑證
?
?
主要關于BAPI_ACC_DOCUMENT_POST的用法,懂ABAP的人都知道這是用于過賬的,而BAPI_ACC_DOCUMENT_CHECK是用于做過賬前的Check處理的。
我程序里明明設置好了參數,但是Debug測試時只看到Post Successfully的消息,卻看不到我要的會計憑證號,當時很奇怪。百翻思考,網上查資料,后來問題終于得到解決。原來是因為我在 documentheader里多傳進去了三個參數:OBJ_TYPE, OBJ_KEY,OBJ_SYS。如果刪除這三個參數的話就能在返回的內部table里抓去我想要的憑證號碼了。呵呵!問題搞定,當時真的很興奮!
如果誰對BAPI_ACC_DOCUMENT_POST和BAPI_ACC_DOCUMENT_CHECK這兩個BAPI不太熟悉的話,那麼在 SAP ECC6.0以上的版本上有一本系統程序ACC_BAPI_TEST_DOCUMENT,可供參考。里面有關于他們的用法以及參數設置。。。
? ? ? 實例代碼: *?????????當前行過賬-header信息設定PERFORM?FRM_HEADER_DOCUMENT????USING?LV_INDEXCHANGING?LW_HEADER_DOCU.*?????????當前行過賬-明細信息設定PERFORM?FRM_EDIT_BAPIITEMS????USING?LV_INDEXLW_ALVDATA.*?????????登錄會計憑證PERFORM?FRM_CALL_BAPI?????????USING?LW_HEADER_DOCU. ? ? *&---------------------------------------------------------------------* *&??????Form??FRM_HEADER_DOCUMENT *&---------------------------------------------------------------------* *???????header信息設定 *----------------------------------------------------------------------* *??????-->P_IN_FLG??????????處理FLG *??????<--PW_OUT_HEADER?????表頭 *----------------------------------------------------------------------* FORM?FRM_HEADER_DOCUMENT?????USING?P_IN_FLG?TYPE?CHAR01CHANGING?PW_OUT_HEADER?TYPE?BAPIACHE09.DATA:?LV_TEXT???TYPE?BKTXT.CLEAR?PW_OUT_HEADER.*?YYYY年MM月總額法壞賬準備計提CONCATENATE?P_YEMON+0(4)?TEXT-005?P_YEMON+4(2)?TEXT-006INTO?LV_TEXT.PW_OUT_HEADER-USERNAME???=?SY-UNAME.???"用戶名PW_OUT_HEADER-HEADER_TXT?=?LV_TEXT.????"憑證抬頭文本PW_OUT_HEADER-COMP_CODE??=?P_BUKRS.????"公司代碼PW_OUT_HEADER-DOC_DATE???=?GV_EDATE.???"憑證中的憑證日期PW_OUT_HEADER-DOC_TYPE???=?'ZG'.???????"憑證類型*?處理FLGCASE?P_IN_FLG. *???當月的壞賬會計憑證WHEN?'1'.PW_OUT_HEADER-PSTNG_DATE?=?GV_EDATE.????"憑證過帳日期PW_OUT_HEADER-FISC_YEAR??=?P_YEMON+0(4)."會計年度PW_OUT_HEADER-FIS_PERIOD?=?P_YEMON+4(2)."會計期間*???下月的沖銷會計憑證WHEN?'2'. *?????下個會計期間的設定PERFORM?FRM_GET_NEXTMONTHCHANGING?PW_OUT_HEADER-PSTNG_DATE?"憑證過帳日期PW_OUT_HEADER-FISC_YEAR??"會計年度PW_OUT_HEADER-FIS_PERIOD."會計期間WHEN?OTHERS.ENDCASE.ENDFORM.????????????????????"?FRM_HEADER_DOCUMENT ? ? *&---------------------------------------------------------------------* *&??????Form??FRM_EDIT_BAPIITEMS *&---------------------------------------------------------------------* *???????當前行過賬-明細信息設定 *----------------------------------------------------------------------* *??????-->P_IN_FLG?????????????當月憑證與下一個月憑證標志 *??????-->P_IN_ALVDATA?????????alv數據 *----------------------------------------------------------------------* FORM?FRM_EDIT_BAPIITEMS??USING?P_IN_FLG??????TYPE?CHAR01P_IN_ALVDATA??TYPE?TYP_ALVDATA.REFRESH:?GT_ACCOUNTGL,GT_CURRAMOUNT,GT_ACCOUNTAR,GT_EXTENSION2.****第一個分錄 *???各明細項目的作成PERFORM?FRM_APPEND_ITEMS??USING?P_IN_FLG'1'P_IN_ALVDATA.****第二個分錄 *???各明細項目的作成PERFORM?FRM_APPEND_ITEMS??USING?P_IN_FLG'2'P_IN_ALVDATA.ENDFORM.????????????????????"?FRM_EDIT_BAPIITEMS ? *&---------------------------------------------------------------------* *&??????Form??FRM_APPEND_ITEMS *&---------------------------------------------------------------------* *???????各明細項目的作成 *----------------------------------------------------------------------* *??????-->P_IN_CLFLG????當月憑證標志與下一個月憑證標志 *??????-->P_IN_INDEX????第一分錄與第二分錄標志 *??????-->P_IN_DATA?????alv數據 *----------------------------------------------------------------------* FORM?FRM_APPEND_ITEMS??USING????P_IN_CLFLG??TYPE?CHAR01P_IN_INDEX??TYPE?CHAR01P_IN_DATA???TYPE?TYP_ALVDATA.DATA:?LW_ACCOUNTGL??TYPE?BAPIACGL09,LW_CURRAMOUNT?TYPE?BAPIACCR09,LW_ACCOUNTAR??TYPE?BAPIACAR09,LW_EXTENSION2?TYPE?BAPIPAREX,LW_ZEXTEN?????TYPE?ZEXTEN.*?第一分錄的時候IF?P_IN_INDEX?????=?'1'.*???會計憑證行項目編號LW_ACCOUNTGL-ITEMNO_ACC?=?1. *???利潤中心LW_ACCOUNTGL-PROFIT_CTR?=?P_IN_DATA-PRCTR. *???總賬科目LW_ACCOUNTGL-GL_ACCOUNT?=?'0670100100'.APPEND?LW_ACCOUNTGL?TO?GT_ACCOUNTGL.ELSEIF?P_IN_INDEX?=?'2'. *???會計憑證行項目編號LW_ACCOUNTAR-ITEMNO_ACC?=?2. *???客戶編號LW_ACCOUNTAR-CUSTOMER???=?P_IN_DATA-KUNNR. *???到期日計算的基限日期LW_ACCOUNTAR-BLINE_DATE?=?GV_EDATE. *???利潤中心LW_ACCOUNTAR-PROFIT_CTR?=?P_IN_DATA-PRCTR.APPEND?LW_ACCOUNTAR?TO?GT_ACCOUNTAR.ENDIF.*?會計憑證行項目編號LW_CURRAMOUNT-ITEMNO_ACC?=?LINES(?GT_CURRAMOUNT?)?+?1. *?貨幣碼LW_CURRAMOUNT-CURRENCY???=?P_IN_DATA-WAERS. *?貨幣類型LW_CURRAMOUNT-CURR_TYPE??=?'00'.*?第一分錄的時候IF?P_IN_INDEX?????=?'1'.CASE?P_IN_CLFLG. *?????當月的壞賬會計憑證WHEN?'1'. *???????憑證貨幣金額(正值)?---?40?---LW_CURRAMOUNT-AMT_DOCCUR?=?ABS(?P_IN_DATA-DMBTRP_SUM?).*?????下月的沖銷會計憑證WHEN?'2'. *???????憑證貨幣金額(負值)?---?50?---LW_CURRAMOUNT-AMT_DOCCUR?=?ABS(?P_IN_DATA-DMBTRP_SUM?)?*?-1.WHEN?OTHERS.ENDCASE.*?第二分錄的時候ELSEIF?P_IN_INDEX?=?'2'.CASE?P_IN_CLFLG. *?????當月的壞賬會計憑證?---?19?---WHEN?'1'. *???????憑證貨幣金額(負值)LW_CURRAMOUNT-AMT_DOCCUR?=?ABS(?P_IN_DATA-DMBTRP_SUM?)?*?-1.*?????下月的沖銷會計憑證WHEN?'2'. *???????憑證貨幣金額(負值)?---?09?---LW_CURRAMOUNT-AMT_DOCCUR?=?ABS(?P_IN_DATA-DMBTRP_SUM?).WHEN?OTHERS.ENDCASE.ENDIF.APPEND?LW_CURRAMOUNT?TO?GT_CURRAMOUNT.CLEAR?LW_ZEXTEN.*?第一分錄的時候IF?P_IN_INDEX?????=?'1'.CASE?P_IN_CLFLG. *?????當月的壞賬會計憑證WHEN?'1'. *???????記帳代碼LW_ZEXTEN-BSCHL??=?'40'.*?????下月的沖銷會計憑證WHEN?'2'. *???????記帳代碼LW_ZEXTEN-BSCHL??=?'50'.WHEN?OTHERS.ENDCASE.*?第二分錄的時候ELSEIF?P_IN_INDEX?=?'2'.CASE?P_IN_CLFLG. *?????當月的壞賬會計憑證WHEN?'1'. *???????記帳代碼LW_ZEXTEN-BSCHL??=?'19'.*?????下月的沖銷會計憑證WHEN?'2'. *???????記帳代碼LW_ZEXTEN-BSCHL??=?'09'.WHEN?OTHERS.ENDCASE. *???特殊總帳標識LW_ZEXTEN-UMSKZ??????=?'H'.ENDIF.*?會計憑證行項目編號LW_ZEXTEN-POSNR??????????=?LINES(?GT_EXTENSION2?)?+?1. *?到期日LW_ZEXTEN-ZFBDT??????????=?GV_EDATE. *?BAPI?表擴展的結構名稱LW_EXTENSION2-STRUCTURE??=?'ZEXTEN'. *?BAPI?擴展參數的數據部分LW_EXTENSION2-VALUEPART1?=?LW_ZEXTEN.APPEND?LW_EXTENSION2?TO?GT_EXTENSION2.ENDFORM.????????????????????"?FRM_APPEND_ITEMS ? ? *&---------------------------------------------------------------------* *&??????Form??FRM_CALL_BAPI *&---------------------------------------------------------------------* *???????登錄會計憑證 *----------------------------------------------------------------------* *??????-->P_IN_HEADER?????????header信息 *----------------------------------------------------------------------* FORM?FRM_CALL_BAPI??USING??P_IN_HEADER??TYPE?BAPIACHE09.DATA:?LW_RETURN??TYPE?BAPIRET2,LT_RETURN??TYPE?STANDARD?TABLE?OF?BAPIRET2.CALL?FUNCTION?'BAPI_ACC_DOCUMENT_POST'EXPORTINGDOCUMENTHEADER????=?P_IN_HEADERTABLESACCOUNTGL?????????=?GT_ACCOUNTGLACCOUNTRECEIVABLE?=?GT_ACCOUNTARCURRENCYAMOUNT????=?GT_CURRAMOUNTRETURN????????????=?LT_RETURNEXTENSION2????????=?GT_EXTENSION2.*?S?成功,E?錯誤,W?警告,I?信息,A?中斷LOOP?AT?LT_RETURN?INTO?LW_RETURN?WHERE?TYPE?=?'E'OR?TYPE?=?'A'.CALL?FUNCTION?'BAPI_TRANSACTION_ROLLBACK'.MESSAGE?ID?LW_RETURN-ID?TYPE?'E'?NUMBER?LW_RETURN-NUMBERWITH?LW_RETURN-MESSAGE_V1LW_RETURN-MESSAGE_V2LW_RETURN-MESSAGE_V3LW_RETURN-MESSAGE_V4.ENDLOOP.*?創建成功IF?SY-SUBRC?<>?0.CALL?FUNCTION?'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT?=?'X'.*???憑證過賬運行結束!MESSAGE?S067(ZFI01).ENDIF.ENDFORM.????????????????????"?FRM_CALL_BAPI總結
以上是生活随笔為你收集整理的SAP FI 会计凭证过账bapi BAPI_ACC_DOCUMENT_POST的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何区分“Invoice代码”和“Inv
- 下一篇: CALL TRANSACTION用法