SAP BAPI_ACC_DOCUMENT_POST增强字段

使用BAPI_ACC_DOCUMENT_POST创建会计凭证时,需要在行项目传入反记账标识和记账码,但是找遍了BAPI下面的传值结构也没有找到记账码的传值,倒是找到了反记账标识的传值,但是实在抬头上的,明显不符合要求。
所以只能另寻他法,看到这个BAPI下是有增强扩展的结构的,那么应该是可以通过增强字段来传入需要的值。
首先创建增强结构:
在这里插入图片描述
然后通过增强结构传入值。然后,测试发现没有效果。
发现还需要一个增强。
BADI: BADI_ACC_DOCUMENT
代码写入:IF_EX_ACC_DOCUMENT~CHANGE
代码如下:

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.

然后测试发现值顺利传入。
BAPI传值代码如下:

*&---BAPI参数
  DATA: LS_DOCUMENTHEADER TYPE BAPIACHE09,
        LT_ACCOUNTGL      TYPE STANDARD TABLE OF BAPIACGL09,      " 总账
        LT_CURRENCYAMOUNT TYPE STANDARD TABLE OF BAPIACCR09,      " 金额
        LT_EXTENSION2     TYPE STANDARD TABLE OF BAPIPAREX,       " 自定义字段增强
        LT_RETURN         TYPE STANDARD TABLE OF BAPIRET2,        " 返回参数
        LT_CRITERIA       TYPE STANDARD TABLE OF BAPIACKEC9.      " 获利能力分析字段增强
  DATA: LS_DOCH_O     TYPE BAPIACHE09.
  DATA: LS_ACCOUNTGL      TYPE BAPIACGL09,      " 总账
        LS_CURRENCYAMOUNT TYPE BAPIACCR09,      " 金额
        LS_CRITERIA       TYPE BAPIACKEC9,      " 获利能力分析字段增强
        LS_EXTENSION2     TYPE BAPIPAREX,       " 自定义字段增强
        LS_RETURN         TYPE BAPIRET2.        " 返回参数

  DATA LS_EXTENSION TYPE ZFIS0002 . " 增强结构


  DATA: LT_BKPF  TYPE STANDARD TABLE OF BKPF,
        LS_BKPF  TYPE BKPF,
        LT_BSEG  TYPE STANDARD TABLE OF BSEG,
        LV_PRCTR TYPE BSEG-PRCTR,
        LV_AUFNR TYPE COAS-AUFNR.
*&---其它字段定义
  DATA LV_NUM TYPE I VALUE 0.        " 凭证行项目编号
  DATA:LV_STR TYPE STRING.
  DATA:LS_BSEG TYPE BSEG.

  DATA: LS_ZFIT0045 TYPE ZFIT0045.
  DATA: LT_ZFIT0045 TYPE TABLE OF ZFIT0045.

  CLEAR: LS_ACCOUNTGL,
         LS_CURRENCYAMOUNT,
         LS_EXTENSION2.

  CLEAR GS_HEADER.
  READ TABLE GT_HEADER INTO GS_HEADER INDEX 1.

  CLEAR: LS_DOCUMENTHEADER.
  LS_DOCUMENTHEADER-COMP_CODE  = P_RBUKRS.        " 公司代码
  LS_DOCUMENTHEADER-DOC_DATE   = SY-DATUM.        " 凭证日期
  LS_DOCUMENTHEADER-PSTNG_DATE = GS_HEADER-BUDAT.        " 过账日期
  LS_DOCUMENTHEADER-DOC_TYPE   = 'ML'.        " 凭证类型
  LS_DOCUMENTHEADER-FISC_YEAR   = GS_HEADER-BUDAT+0(4).      " 财年
  LS_DOCUMENTHEADER-FIS_PERIOD   = P_MONAT.      " 会计期间
  LS_DOCUMENTHEADER-HEADER_TXT = 'XXX'.        " 凭证抬头文本
  LS_DOCUMENTHEADER-USERNAME   = SY-UNAME.                 " 创建人
*  LS_DOCUMENTHEADER-NEG_POSTNG   = 'X'.                 " 反记账标识

  CLEAR LV_NUM.

  CLEAR GS_HEADER.
  LOOP AT GT_HEADER INTO GS_HEADER WHERE MARK EQ 'X'.
    CLEAR LS_BSEG.
    SELECT SINGLE *
      INTO LS_BSEG
      FROM BSEG
      WHERE GJAHR EQ GS_HEADER-GJAHR AND
                  H_MONAT EQ GS_HEADER-POPER+1(2) AND
                  BUKRS EQ GS_HEADER-RBUKRS AND
                  BELNR EQ GS_HEADER-BELNR_ML AND
                  HKONT EQ GS_HEADER-RACCT AND
                  AUFNR EQ GS_HEADER-AUFNR AND
                  MATNR EQ GS_HEADER-MATNR AND
                  H_BLART EQ 'ML' AND
                  BSCHL IN ( '81','91' ).

    LV_NUM = LV_NUM + 1.
    LS_ACCOUNTGL-ITEMNO_ACC = LV_NUM. "行项目编号
    LS_ACCOUNTGL-GL_ACCOUNT = GS_HEADER-RACCT. "科目
    LS_ACCOUNTGL-ORDERID = |{ GS_HEADER-AUFNR ALPHA = IN }| . "内部订单号
    LS_ACCOUNTGL-MATERIAL = GS_HEADER-MATNR. "物料编码
    LS_ACCOUNTGL-ALLOC_NMBR = LS_BSEG-ZUONR. "分配号
    LS_ACCOUNTGL-ITEM_TEXT = LS_BSEG-SGTXT. "行项目文本
    LS_ACCOUNTGL-REF_KEY_1 = LS_BSEG-XREF1. "综合管理维度
    APPEND LS_ACCOUNTGL TO LT_ACCOUNTGL.
    CLEAR LS_ACCOUNTGL.

    LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_NUM.
    LS_CURRENCYAMOUNT-CURRENCY = 'CNY'.
*    ls_currencyamount-amt_doccur = abs( gs_header-hsl ).
    LS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - GS_HEADER-HSL.
    APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
    CLEAR LS_CURRENCYAMOUNT.

    CLEAR LS_EXTENSION.
    LS_EXTENSION-POSNR = LV_NUM.
    IF GS_HEADER-HSL > 0.
      LS_EXTENSION-BSCHL = '50'.
      LS_EXTENSION-XNEGP = 'X'.
    ELSE.
      LS_EXTENSION-BSCHL = '40'.
      LS_EXTENSION-XNEGP = 'X'.
    ENDIF.


    LS_EXTENSION2-STRUCTURE = 'ZFIS0002'.
    LS_EXTENSION2-VALUEPART1 = LS_EXTENSION.
    APPEND LS_EXTENSION2 TO LT_EXTENSION2.
    CLEAR LS_EXTENSION2.

    CLEAR LS_ZFIT0045.
    LS_ZFIT0045-ZYPZ = GS_HEADER-BELNR_ML. "原凭证
    LS_ZFIT0045-ZYCN = GS_HEADER-GJAHR. "原凭证财年
    LS_ZFIT0045-POPER = GS_HEADER-POPER. "期间
    LS_ZFIT0045-RACCT = GS_HEADER-RACCT. "科目号
    LS_ZFIT0045-AUFNR = GS_HEADER-AUFNR. "内部订单号
    LS_ZFIT0045-MATNR = GS_HEADER-MATNR. "物料编码
    LS_ZFIT0045-HSL = GS_HEADER-HSL. "金额
    APPEND LS_ZFIT0045 TO LT_ZFIT0045.
    CLEAR LS_ZFIT0045.

  ENDLOOP.

  CLEAR GS_ITEM.
  LOOP AT GT_ITEM INTO GS_ITEM .

    CLEAR LS_BSEG.
    SELECT SINGLE *
      INTO LS_BSEG
      FROM BSEG
      WHERE GJAHR EQ GS_ITEM-GJAHR AND
                  H_MONAT EQ GS_ITEM-POPER+1(2) AND
                  BUKRS EQ GS_ITEM-RBUKRS AND
                  BELNR EQ GS_HEADER-BELNR_ML AND
                  HKONT EQ GS_ITEM-RACCT AND
                  AUFNR EQ GS_ITEM-AUFNR AND
                  MATNR EQ GS_ITEM-MATNR AND
                  H_BLART EQ 'ML' AND
                  BSCHL IN ( '81','91' ).

    LV_NUM = LV_NUM + 1.
    LS_ACCOUNTGL-ITEMNO_ACC = LV_NUM. "行项目编号
    LS_ACCOUNTGL-GL_ACCOUNT = GS_ITEM-RACCT. "科目
    LS_ACCOUNTGL-ORDERID = |{ GS_ITEM-AUFNR ALPHA = IN }| . "内部订单号
    LS_ACCOUNTGL-MATERIAL = GS_ITEM-MATNR. "物料编码
    LS_ACCOUNTGL-ALLOC_NMBR = LS_BSEG-ZUONR. "分配号
    LS_ACCOUNTGL-ITEM_TEXT = LS_BSEG-SGTXT. "行项目文本
    LS_ACCOUNTGL-REF_KEY_1 = LS_BSEG-XREF1. "综合管理维度
    LS_ACCOUNTGL-COSTCENTER = GS_ITEM-RCNTR. "成本中心
    APPEND LS_ACCOUNTGL TO LT_ACCOUNTGL.
    CLEAR LS_ACCOUNTGL.

    LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_NUM.
    LS_CURRENCYAMOUNT-CURRENCY = 'CNY'.
*    ls_currencyamount-amt_doccur = abs( gs_item-hsl ).
    LS_CURRENCYAMOUNT-AMT_DOCCUR = GS_ITEM-HSL .
    APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
    CLEAR LS_CURRENCYAMOUNT.

    CLEAR LS_EXTENSION.
    LS_EXTENSION-POSNR = LV_NUM.
    IF GS_ITEM-HSL > 0.
      LS_EXTENSION-BSCHL = '40'.
    ELSE.
      LS_EXTENSION-BSCHL = '50'.
      LS_EXTENSION-XNEGP = 'X'.
    ENDIF.

    LS_EXTENSION2-STRUCTURE = 'ZFIS0002'.
    LS_EXTENSION2-VALUEPART1 = LS_EXTENSION.
    APPEND LS_EXTENSION2 TO LT_EXTENSION2.
    CLEAR LS_EXTENSION2.

  ENDLOOP.

  SORT LT_EXTENSION2.

  CLEAR LT_RETURN.
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
    EXPORTING
      DOCUMENTHEADER = LS_DOCUMENTHEADER
    TABLES
      ACCOUNTGL      = LT_ACCOUNTGL
      CURRENCYAMOUNT = LT_CURRENCYAMOUNT
      CRITERIA       = LT_CRITERIA
      EXTENSION2     = LT_EXTENSION2
      RETURN         = LT_RETURN.

  LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE EQ 'E' OR TYPE EQ 'A'.
    GS_HEADER-MESSAGE = GS_HEADER-MESSAGE && LS_RETURN-MESSAGE.
  ENDLOOP.
  IF SY-SUBRC EQ 0.
    MODIFY GT_HEADER FROM GS_HEADER TRANSPORTING MESSAGE WHERE MARK EQ 'X'.
  ELSE.
**&---正式凭证创建
    CLEAR LT_RETURN.
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        DOCUMENTHEADER = LS_DOCUMENTHEADER
      IMPORTING
        OBJ_TYPE       = LS_DOCH_O-OBJ_TYPE
        OBJ_KEY        = LS_DOCH_O-OBJ_KEY
        OBJ_SYS        = LS_DOCH_O-OBJ_SYS
      TABLES
        ACCOUNTGL      = LT_ACCOUNTGL                "总账
        CURRENCYAMOUNT = LT_CURRENCYAMOUNT           "金额
        CRITERIA       = LT_CRITERIA
        EXTENSION2     = LT_EXTENSION2               "扩展
        RETURN         = LT_RETURN.


    READ TABLE LT_RETURN INTO LS_RETURN WITH KEY ID = 'RW' NUMBER = '605'.
    IF SY-SUBRC = 0.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      LS_ZFIT0045-ZFTPZ = LS_DOCH_O-OBJ_KEY.
      LS_ZFIT0045-GJAHR = GS_ITEM-GJAHR.
      LS_ZFIT0045-BUKRS = GS_ITEM-RBUKRS.
      MODIFY LT_ZFIT0045 FROM LS_ZFIT0045 TRANSPORTING ZFTPZ GJAHR BUKRS
      WHERE ZYPZ NE ''.

      LV_STR = '创建成功:' && LS_DOCH_O-OBJ_KEY.
*    MESSAGE '创建成功!' TYPE 'S'.
      MESSAGE LV_STR TYPE 'S'.
      LOOP AT GT_HEADER ASSIGNING FIELD-SYMBOL(<FW_HEADER>).
        <FW_HEADER>-MESSAGE = LV_STR.
        <FW_HEADER>-BELNR = LS_DOCH_O-OBJ_KEY.
      ENDLOOP.

    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      CLEAR LV_STR.
      LOOP AT LT_RETURN INTO LS_RETURN .
        IF LS_RETURN-TYPE = 'E' OR LS_RETURN-TYPE = 'A'.
          CONCATENATE LV_STR LS_RETURN-MESSAGE ';' INTO LV_STR.
          CLEAR LS_RETURN .
        ENDIF.
      ENDLOOP.

      LV_STR = '创建失败:' && LV_STR.
      MESSAGE LV_STR TYPE 'S' DISPLAY LIKE 'E'.


    ENDIF.
  ENDIF.

  IF LT_ZFIT0045 IS NOT INITIAL.
    MODIFY ZFIT0045 FROM TABLE LT_ZFIT0045[].
    COMMIT WORK AND WAIT .
  ENDIF.

  CLEAR LT_ZFIT0045.

  REFRESH: LT_ACCOUNTGL      ,
   LT_CURRENCYAMOUNT   ,
   LT_CRITERIA,
   LT_EXTENSION2     ,
   LT_RETURN.


  CLEAR LV_NUM.

OVER…

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值