1. 程式人生 > >使用BAPI_ACC_DOCUMENT_POST,建立會計憑證 增強

使用BAPI_ACC_DOCUMENT_POST,建立會計憑證 增強

業務需求:和銀行做一個介面,要通過銀行流水產生會計憑證,會計憑證的事務碼是F-02,查到了BAPI方法 BAPI_ACC_DOCUMENT_POST。
昨天測試發現,有一些引數在BAPI_ACC_DOCUMENT_POST的輸入和表引數中根本沒有,
如 記賬碼Posting Key、原因程式碼Reason Code,那怎麼把這些欄位的值傳進去呢?
在SDN查了一下相關問題的解決辦法,發現遇到這個問題的朋友還挺多,
總結了一下,解決辦法大體如下:
1、se11建立結構,必須包含行專案號POSNR欄位,和其他需要擴充套件的欄位,
   如記賬碼Posting Key、原因程式碼Reason Code
2、SE19實現BADI增強ACC_DOCUMENT,這個增強是用來將BAPI_ACC_DOCUMENT_POST引數表EXTENSION2傳入系統表
3、使用BAPI_ACC_DOCUMENT_POST引數表EXTENSION2,將擴充套件欄位傳入
詳細步驟如下:
1、建立結構,se11,很簡單,不再贅述,如下圖:
2、SE19實現BADI增強ACC_DOCUMENT
通過ACC_DOCUMENT help文件知道,方法CHANGE用來完成欄位的擴充套件,
還有一個需要注意的是參考業務型別,這個一定要選對,不然執行BAPI的時候不會呼叫這個BADI,我用的是BKPFF,
如下圖:
啟用這個BADI實現。
雙擊change方法建立,可以檢視ACC_DOCUMENT 的實現例子CL_EXM_IM_ACC_DOCUMENT(R/3 4.7版本,其他版本可能名稱不一樣)
將這個例項的change方法的程式碼直接copy過來,啟用方法,程式碼如下
***********************************************************************
*Example to move fields from BAPI parameter EXTENSION2 to structure  *
* ACCIT (accounting document line items).*
*The dictionary structure (content for EXTENSION2-STRUCTURE) must    *
* contain field POSNR,(TYPE POSNR_ACC) to indentify the correct line 
* * item of the internal table ACCIT.* *********************************************************************** 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.
3、使用BAPI_ACC_DOCUMENT_POST引數表EXTENSION2,將擴充套件欄位傳入 
**********************************************************************
*INTERNAL TABLE DECLARATION
**********************************************************************

*&—-G/L ACCOUNT ITEM
DATA: ACCOUNTGL TYPE STANDARD TABLE OF BAPIACGL09.

*&—CURRENCY ITEMS
DATA: CURRENCY_AMOUNT TYPE STANDARD TABLE OF BAPIACCR09.

*&—-RETURN PARAMETER
DATA: RETURN TYPE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE.

*&—-it_extension2 ITEMS
DATA: IT_EXTENSION2 TYPE STANDARD TABLE OF BAPIPAREX WITH HEADER LINE.

*&—WORKAREA FOR ZEXTEN
DATA: WA_ZEXTEN LIKE ZEXTEN.ZEXTEN就是剛才SE11建立的那個結構
**********************************************************************
*賦值
**********************************************************************

*& EXTENSION2 擴充套件欄位增強部分

  WA_ZEXTEN-POSNR ='0000000010'."憑證行專案
  WA_ZEXTEN-RSTGR = '171'. "憑證行專案原因程式碼

  IT_EXTENSION2-STRUCTURE  ='ZEXTEN'.
  IT_EXTENSION2-VALUEPART1 = WA_ZEXTEN.
  APPEND IT_EXTENSION2.

*其他引數表的欄位賦值如下例

  HEADER-HEADER_TXT ='TEST HEADER'."憑證擡頭文字
  HEADER-USERNAME   = SY-UNAME.  "使用者名稱
  HEADER-COMP_CODE  ='1000'."公司程式碼
  HEADER-DOC_DATE   = '20090618'."憑證中的憑證日期
  HEADER-PSTNG_DATE ='20090618'."憑證中的記帳日期
  HEADER-DOC_TYPE   = 'S1'."憑證型別
*  HEADER-BUS_ACT   ='RFBU'."交易業務

  WA_ACCOUNTGL-ITEMNO_ACC = '0000000010'. "會計憑證行專案編號
  WA_ACCOUNTGL-GL_ACCOUNT ='1002010105'."總分類帳帳目
*  WA_ACCOUNTGL-ITEM_TEXT = .
  WA_ACCOUNTGL-BUS_AREA   = '8000'. "業務範圍
  APPEND WA_ACCOUNTGL TO ACCOUNTGL.
  CLEAR WA_ACCOUNTGL.

  WA_ACCOUNTGL-ITEMNO_ACC ='0000000020'."會計憑證行專案編號
  WA_ACCOUNTGL-GL_ACCOUNT = '1301040000'. "總分類帳帳目
  WA_ACCOUNTGL-BUS_AREA   ='8000'."業務範圍
*WA_ACCOUNTGL-ITEM_TEXT   = .
*wa_accountgl-ACCT_TYPE   = 'R'.
  APPEND WA_ACCOUNTGL TO ACCOUNTGL.
  CLEAR WA_ACCOUNTGL.

  WA_CURRENCY_AMOUNT-ITEMNO_ACC = '0000000010'. "行專案編號
  WA_CURRENCY_AMOUNT-AMT_DOCCUR ='500'."金額
  WA_CURRENCY_AMOUNT-CURRENCY   = 'RMB'.
  APPEND WA_CURRENCY_AMOUNT TO CURRENCY_AMOUNT.
  CLEAR WA_CURRENCY_AMOUNT.

  WA_CURRENCY_AMOUNT-ITEMNO_ACC = '0000000020'.
  WA_CURRENCY_AMOUNT-AMT_DOCCUR = '-500'.
  WA_CURRENCY_AMOUNT-CURRENCY = 'RMB'.
  APPEND WA_CURRENCY_AMOUNT TO CURRENCY_AMOUNT.
  CLEAR WA_CURRENCY_AMOUNT.

  *執行BAPI
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    DOCUMENTHEADER = HEADER
*   CUSTOMERCPD    =
*   CONTRACTHEADER =
* IMPORTING
*   OBJ_TYPE =
*   OBJ_KEY  =
*   OBJ_SYS  =
  TABLES
    ACCOUNTGL         = ACCOUNTGL
*   ACCOUNTRECEIVABLE =
*   ACCOUNTPAYABLE =
*   ACCOUNTTAX     =
    CURRENCYAMOUNT = CURRENCY_AMOUNT
*   CRITERIA       =
*   VALUEFIELD     =
* EXTENSION1       =
    RETURN         = RETURN
*   PAYMENTCARD    =
*   CONTRACTITEM   =
    EXTENSION2     = IT_EXTENSION2
*   REALESTATE     =
  .

  IF RETURN-TYPE NA 'EA'.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
  ENDIF.
如果還需要擴充套件其他欄位,在結構ZEXTEN加入,然後在呼叫BAPI前對相應欄位賦值,就行了。