SAP创建会计凭证,用BAPI扩展字段方法:BAPI_ACC_DOCUMENT_POST

业务需求:和银行做一个接口,要通过银行流水产生会计凭证,会计凭证的事务码是F-02,查到了BAPI方法BAPI_ACC_DOCUMENT_POST。昨天测试发现,有一些参数在BAPI_ACC_DOCUMENT_POST的输入和表参数中根本没有,如记账码Posting Key、原因代码Reason Code,那怎么把这些字段的值传进去呢?在SDN查了一下相关问题的解决办法,发现遇到这个问题的朋友还挺多,总结了一下,解决办法大体如下:
    1se11创建结构,必须包含行项目号POSNR字段,和其他需要扩展的字段,如记账码Posting Key、原因代码Reason Code
    2
SE19实现BADI增强ACC_DOCUMENT,这个增强是用来将BAPI_ACC_DOCUMENT_POST参数表EXTENSION2传入系统表
    3、使用BAPI_ACC_DOCUMENT_POST参数表EXTENSION2,将扩展字段传入

详细步骤如下:
1、创建结构,se11,很简单,不再赘述,如下图:
SAP创建会计凭证,用BAPI扩展字段方法:BAPI_ACC_DOCUMENT_POST_第1张图片

 

2SE19实现BADI增强ACC_DOCUMENT
通过ACC_DOCUMENT help文档知道,方法CHANGE用来完成字段的扩展,还有一个需要注意的是参考业务类型,这个一定要选对,不然执行BAPI的时候不会调用这个BADI,我用的是BKPFF,如下图:
SAP创建会计凭证,用BAPI扩展字段方法:BAPI_ACC_DOCUMENT_POST_第2张图片

 

激活这个BADI实现。

双击change方法创建,可以查看ACC_DOCUMENT 的实现例子CL_EXM_IM_ACC_DOCUMENTR/3 4.7版本,其他版本可能名称不一样),,将这个实例的change方法的代码直接copy过来,激活方法,代码如下

DATA: wa_extension   TYPE bapiparex,
        ext_value(960) TYPE c,
        wa_accit       TYPE accit,
        l_ref          TYPE REF TO data.
  FIELD-SYMBOLS:  TYPE ANY,
                  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 .
    ENDAT.
    CONCATENATE wa_extension-valuepart1 wa_extension-valuepart2
                wa_extension-valuepart3 wa_extension-valuepart4
           INTO ext_value.
    MOVE ext_value TO .
    ASSIGN COMPONENT 'POSNR' OF STRUCTURE TO .
    READ TABLE c_accit WITH KEY posnr = 
          INTO wa_accit.
    IF sy-subrc IS INITIAL.
      MOVE-CORRESPONDING  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前对相应字段赋值,就行了。

注释:使用动态赋值需要排除系统中已实现的非动态赋值的增强结构。。

解决方案:在动态创建数据引用时,查询结构在DD02L中是否存在,若存在就继续执行。

你可能感兴趣的:(SAP,FICO,SAP,ABAP,开发语言,abap)