BAPI_ACC_DOCUMENT_CHECK BAPI_ACC_DOCUMENT_POST BAPI_TRANSACTION_COMMIT

BAPI_ACC_DOCUMENT_CHECK

该BAPI是针对FB01进行会计凭证批导模拟冲销,与BAPI BAPI_ACC_DOCUMENT_CHECK BAPI_TRANSACTION_COMMIT 配合使用,后两个中前者是用于会计凭证冲销,后者是用于冲销提交。

引用该BAPI:

  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
    EXPORTING
      DOCUMENTHEADER          =
*     CUSTOMERCPD             =
*     CONTRACTHEADER          =
    TABLES
*     ACCOUNTGL               =
*     ACCOUNTRECEIVABLE       =
*     ACCOUNTPAYABLE          =
*     ACCOUNTTAX              =
*     CURRENCYAMOUNT          =
*     CRITERIA                =
*     VALUEFIELD              =
*     EXTENSION1              =
      RETURN                  =
*     PAYMENTCARD             =
*     CONTRACTITEM            =
*     EXTENSION2              =
*     REALESTATE              =
*     ACCOUNTWT               =
            .

其中DOCUMENTHEADER是抬头数据,这里的参数除了RETURN,其余的都是需要选择性插入的数据。

ACCOUNTGL 为例

image-20220804094350711

可以看见对应的关联类型里有很多字段,这些字段是和FB01中的字段相对应

image-20220804094500325

image-20220804094633694

不同的过账码对应了不同的帐户类型借贷标识,在表 TBSL 中可以查看。

image-20220804100117640image-20220804100139374

*根据过账码获得对应帐户类型和借贷标识
*GT_OUT是过账数据内表
LOOP AT GT_OUT ASSIGNING FIELD-SYMBOL(<FS_DATA>).
    SELECT SINGLE BSCHL,KOART, SHKZG FROM TBSL INTO @DATA(LS_TBSL) WHERE BSCHL = @<FS_DATA>-BSCHL.
    IF SY-SUBRC = 0.
      <FS_DATA>-KOART = LS_TBSL-KOART.
      <FS_DATA>-SHKZG = LS_TBSL-SHKZG.
    ENDIF.
    "对于外部数据,如EXCEL导入的数据,需要进行内外部转换,加减前导零,不然有可能出现数据不存在的错误
    "外部转内部
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = <FS_DATA>-HKONT
      IMPORTING
        OUTPUT = <FS_DATA>-HKONT.
ENDLOOP.

接下来定义BAPI对应的工作区和内表,下面是所有定义,部分可能不会用到

DATA: GS_HEADER            TYPE BAPIACHE09,
      GT_CUSTOMERCPD       TYPE TABLE OF BAPIACPA09,
      GS_CUSTOMERCPD       TYPE BAPIACPA09,
      GT_CONTRACTHEADER    TYPE TABLE OF BAPIACCAHD,
      GS_CONTRACTHEADER    TYPE BAPIACCAHD,
      GT_RETURN            TYPE TABLE OF BAPIRET2,
      GT_ACCOUNTGL         TYPE TABLE OF BAPIACGL09,
      GS_ACCOUNTGL         TYPE BAPIACGL09,
      GT_ACCOUNTRECEIVABLE TYPE TABLE OF BAPIACAR09,
      GS_ACCOUNTRECEIVABLE TYPE BAPIACAR09,
      GT_ACCOUNTPAYABLE    TYPE TABLE OF BAPIACAP09,
      GS_ACCOUNTPAYABLE    TYPE BAPIACAP09,
      GT_ACCOUNTTAX        TYPE TABLE OF BAPIACTX09,
      GS_ACCOUNTTAX        TYPE BAPIACTX09,
      GT_CURRENCYAMOUNT    TYPE TABLE OF BAPIACCR09,
      GS_CURRENCYAMOUNT    TYPE BAPIACCR09,
      GT_CRITERIA          TYPE TABLE OF BAPIACKEC9,
      GS_CRITERIA          TYPE BAPIACKEC9,
      GT_VALUEFIELD        TYPE TABLE OF BAPIACKEV9,
      GS_VALUEFIELD        TYPE BAPIACKEV9,
      GT_EXTENSION1        TYPE TABLE OF BAPIACEXTC,
      GS_EXTENSION1        TYPE BAPIACEXTC,
      GT_PAYMENTCARD       TYPE TABLE OF BAPIACPC09,
      GS_PAYMENTCARD       TYPE BAPIACPC09,
      GT_CONTRACTITEM      TYPE TABLE OF BAPIACCAIT,
      GS_CONTRACTITEM      TYPE BAPIACCAIT,
      GT_EXTENSION2        TYPE TABLE OF BAPIPAREX,
      GS_EXTENSION2        TYPE BAPIPAREX,
      GT_REALESTATE        TYPE TABLE OF BAPIACRE09,
      GS_REALESTATE        TYPE BAPIACRE09,
      GT_ACCOUNTWT         TYPE TABLE OF BAPIACWT09,
      GS_ACCOUNTWT         TYPE BAPIACWT09.

其中GT_EXTENSION2是拓展字段 也就是预制BAPI字段的关联类型中找不到的字段,比如开户行等.

拓展字段的使用请看我另一篇文章 《BAPI_ACC_DOCUMENT_CHECK BAPI_ACC_DOCUMENT_POST字段增强||字段拓展

冲销数据至少是两条 因为需要收支平衡

冲销数据 (GT_OUT)

image-20220804104021283

下面是具体模拟冲销的代码

FORM FRM_MN_PROCESS .
  DATA: NUM       TYPE I.
  DATA:L_EXTNAME TYPE STRING VALUE 'ZFI001_EXTEN'.
  DATA: LS_EXTEN2 TYPE ZFI001_EXTEN.
  "根据凭证序号HEADID进行分组循环,一共分为四组
  LOOP AT GT_OUT ASSIGNING FIELD-SYMBOL(<FS_OUT>) GROUP BY ( KEY1 = <FS_OUT>-HEADID ) ASSIGNING FIELD-SYMBOL(<FS_GROUP>).
    NUM = 1.
    "对每组数据进行循环
    LOOP AT GROUP <FS_GROUP> ASSIGNING FIELD-SYMBOL(<FS_LINE>).
      CLEAR GS_HEADER.
      GS_HEADER-USERNAME = SY-UNAME.
      GS_HEADER-COMP_CODE = <FS_LINE>-BUKRS.   "公司代码
      GS_HEADER-DOC_TYPE = <FS_LINE>-BLART.        "凭证类型
      GS_HEADER-DOC_DATE = <FS_LINE>-BLDAT. "凭证日期
      GS_HEADER-PSTNG_DATE = <FS_LINE>-BUDAT. "过账日期
      GS_HEADER-FIS_PERIOD = <FS_LINE>-MONAT. "会计期间
      GS_HEADER-REF_DOC_NO = <FS_LINE>-XBLNR.   "参考凭证号
      GS_HEADER-HEADER_TXT = <FS_LINE>-BKTXT. "凭证抬头文本
      GS_CURRENCYAMOUNT-CURRENCY = <FS_LINE>-WAERS. "货币
      GS_CURRENCYAMOUNT-ITEMNO_ACC = NUM. "行项目编号
      GS_CURRENCYAMOUNT-AMT_DOCCUR = <FS_LINE>-WRBTR.   "凭证货币金额
      IF <FS_LINE>-SHKZG = 'H'.     "如果贷方就为负
        GS_CURRENCYAMOUNT-AMT_DOCCUR = 0 - <FS_LINE>-WRBTR.   "凭证货币金额
      ENDIF.
      APPEND GS_CURRENCYAMOUNT  TO GT_CURRENCYAMOUNT.
      CLEAR GS_CURRENCYAMOUNT.
*        "拓展字段
      CLEAR LS_EXTEN2.
      CLEAR GS_EXTENSION2.
      LS_EXTEN2-POSNR = NUM.
*        LS_EXTEN2-DMBTR = <FS_LINE>-DMBTR.
      LS_EXTEN2-FKBER = <FS_LINE>-FKBER.
*        LS_EXTEN2-MEINS = <FS_LINE>-MEINS.
      LS_EXTEN2-NEWBW = <FS_LINE>-NEWBW.
      LS_EXTEN2-POSID = <FS_LINE>-POSID.
      LS_EXTEN2-RBUSA = <FS_LINE>-RBUSA.
      LS_EXTEN2-XNEGP = <FS_LINE>-XNEGP.
      LS_EXTEN2-XREF1 = <FS_LINE>-XREF1.
      LS_EXTEN2-XREF2 = <FS_LINE>-XREF2.
      LS_EXTEN2-XREF3 = <FS_LINE>-XREF3.
      LS_EXTEN2-ZUONR = <FS_LINE>-ZOUNR.
      LS_EXTEN2-HBKID = <FS_LINE>-HBKID.
      LS_EXTEN2-HKTID = <FS_LINE>-HKTID.
      GS_EXTENSION2-STRUCTURE = L_EXTNAME.
      GS_EXTENSION2-VALUEPART1 = LS_EXTEN2.
      APPEND GS_EXTENSION2 TO GT_EXTENSION2.
* 根据账户类型进行对象区分
      CASE <FS_LINE>-KOART.
        WHEN 'A'.
          GS_ACCOUNTGL-ITEMNO_ACC = NUM . "行项目编号
          GS_ACCOUNTGL-ITEM_TEXT = <FS_LINE>-SGTXT. "行项目文本
          GS_ACCOUNTGL-GL_ACCOUNT = <FS_LINE>-NEWKO.
          GS_ACCOUNTGL-COSTOBJECT = <FS_LINE>-KOSTL. "成本中心
          GS_ACCOUNTGL-PROFIT_CTR = <FS_LINE>-PRCTR.  "利润中心
          GS_ACCOUNTGL-ORDERID = <FS_LINE>-AUFNR. "订单号
          GS_ACCOUNTGL-TAX_CODE = <FS_LINE>-MWSKZ. "税码
          GS_ACCOUNTGL-ALLOC_NMBR = <FS_LINE>-ZOUNR. "分配号
          GS_ACCOUNTGL-QUANTITY = <FS_LINE>-MENGE. "数量
          GS_ACCOUNTGL-MATERIAL = <FS_LINE>-MATNR. "物料编号
          APPEND GS_ACCOUNTGL TO GT_ACCOUNTGL.
          CLEAR GS_ACCOUNTGL.
        WHEN 'D'.
          GS_ACCOUNTRECEIVABLE-ITEMNO_ACC = NUM  . "行项目编号
          GS_ACCOUNTRECEIVABLE-CUSTOMER = <FS_LINE>-NEWKO.
          GS_ACCOUNTRECEIVABLE-ITEM_TEXT = <FS_LINE>-SGTXT. "行项目文本
          GS_ACCOUNTRECEIVABLE-SP_GL_IND = <FS_LINE>-UMSKZ.  "特别总帐标识
          GS_ACCOUNTRECEIVABLE-GL_ACCOUNT = <FS_LINE>-HKONT. "总分类帐帐目
          GS_ACCOUNTRECEIVABLE-PROFIT_CTR = <FS_LINE>-PRCTR.  "利润中心
          GS_ACCOUNTRECEIVABLE-TAX_CODE = <FS_LINE>-MWSKZ. "税码
          GS_ACCOUNTRECEIVABLE-ALLOC_NMBR = <FS_LINE>-ZOUNR. "分配号
          GS_ACCOUNTRECEIVABLE-BLINE_DATE = <FS_LINE>-ZFBDT. "基准日期
          APPEND GS_ACCOUNTRECEIVABLE TO GT_ACCOUNTRECEIVABLE.
          CLEAR GS_ACCOUNTRECEIVABLE.
        WHEN 'S'.
          GS_ACCOUNTGL-ITEMNO_ACC = NUM . "行项目编号
          GS_ACCOUNTGL-ITEM_TEXT = <FS_LINE>-SGTXT. "行项目文本
          GS_ACCOUNTGL-GL_ACCOUNT = <FS_LINE>-NEWKO.
          GS_ACCOUNTGL-COSTCENTER = <FS_LINE>-KOSTL. "成本中心
          GS_ACCOUNTGL-PROFIT_CTR = <FS_LINE>-PRCTR.  "利润中心
          GS_ACCOUNTGL-ORDERID = <FS_LINE>-AUFNR. "订单号
          GS_ACCOUNTGL-TAX_CODE = <FS_LINE>-MWSKZ. "税码
          GS_ACCOUNTGL-ALLOC_NMBR = <FS_LINE>-ZOUNR. "分配号
          GS_ACCOUNTGL-QUANTITY = <FS_LINE>-MENGE. "数量
          GS_ACCOUNTGL-MATERIAL = <FS_LINE>-MATNR. "物料编号
          APPEND GS_ACCOUNTGL TO GT_ACCOUNTGL.
          CLEAR GS_ACCOUNTGL.
        WHEN 'K'.
          GS_ACCOUNTPAYABLE-ITEMNO_ACC = NUM .   "行项目编号
          GS_ACCOUNTPAYABLE-ITEM_TEXT = <FS_LINE>-SGTXT. "行项目文本
          GS_ACCOUNTPAYABLE-SP_GL_IND = <FS_LINE>-UMSKZ.  "特别总帐标识
          GS_ACCOUNTPAYABLE-VENDOR_NO = <FS_LINE>-NEWKO.
          GS_ACCOUNTPAYABLE-PROFIT_CTR = <FS_LINE>-ZOUNR. "分配号
          GS_ACCOUNTPAYABLE-TAX_CODE = <FS_LINE>-MWSKZ. "税码
          GS_ACCOUNTPAYABLE-ALLOC_NMBR = <FS_LINE>-ZOUNR. "分配号
          GS_ACCOUNTPAYABLE-BLINE_DATE = <FS_LINE>-ZFBDT. "基准日期
          APPEND GS_ACCOUNTPAYABLE TO GT_ACCOUNTPAYABLE.
          CLEAR GS_ACCOUNTPAYABLE.
      ENDCASE.
      NUM = NUM + 1.
    ENDLOOP.
    "BAPI模拟过账
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
      EXPORTING
        DOCUMENTHEADER    = GS_HEADER
      TABLES
        ACCOUNTGL         = GT_ACCOUNTGL[]
        ACCOUNTRECEIVABLE = GT_ACCOUNTRECEIVABLE[]
        CURRENCYAMOUNT    = GT_CURRENCYAMOUNT[]
        ACCOUNTPAYABLE    = GT_ACCOUNTPAYABLE[]
        EXTENSION2        = GT_EXTENSION2[]
        RETURN            = GT_RETURN[].
    SORT GT_RETURN ASCENDING BY MESSAGE.
    "删除相同MESSAGE的行
    DELETE ADJACENT DUPLICATES FROM GT_RETURN COMPARING MESSAGE.
    LOOP AT GT_RETURN INTO DATA(LS_RETURN).
      LOOP AT GROUP <FS_GROUP> ASSIGNING FIELD-SYMBOL(<FS_LINE_A>).
        IF LS_RETURN-TYPE = 'E'.
          <FS_LINE_A>-MESSAGE = '模拟过账失败!'.
          <FS_LINE_A>-LIGHT = '@0A@'.
          CONCATENATE <FS_LINE_A>-MESSAGE LS_RETURN-MESSAGE INTO <FS_LINE_A>-MESSAGE SEPARATED BY '。'.
        ENDIF.
        IF <FS_LINE_A>-MESSAGE = ''.
          <FS_LINE_A>-LIGHT = '@08@'.
          <FS_LINE_A>-MESSAGE = '模拟过账成功!'.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
    REFRESH: GT_ACCOUNTGL,GT_ACCOUNTRECEIVABLE,GT_CURRENCYAMOUNT,GT_RETURN,GT_EXTENSION2,GT_ACCOUNTPAYABLE.
    "更新ALV
    LOOP AT GROUP <FS_GROUP> ASSIGNING FIELD-SYMBOL(<FS_LINE_B>).
      LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<LFS_ALV>) WHERE HEADID = <FS_LINE_B>-HEADID.
        IF SY-TABIX = 1.
          <LFS_ALV>-MESSAGE = ''.
        ENDIF.
        <LFS_ALV>-LIGHT = <FS_LINE_B>-LIGHT.
        <LFS_ALV>-MESSAGE = <FS_LINE_B>-MESSAGE.
      ENDLOOP.
    ENDLOOP.
  ENDLOOP.

BAPI_ACC_DOCUMENT_POST

对于过账BAPI 在CHECK之后直接调用就可以了

"BAPI模拟过账
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    DOCUMENTHEADER    = GS_HEADER
  TABLES
    ACCOUNTGL         = GT_ACCOUNTGL[]
    ACCOUNTRECEIVABLE = GT_ACCOUNTRECEIVABL
    CURRENCYAMOUNT    = GT_CURRENCYAMOUNT[]
    ACCOUNTPAYABLE    = GT_ACCOUNTPAYABLE[]
    EXTENSION2        = GT_EXTENSION2[]
    RETURN            = GT_RETURN[].

如果过账成功 RETURN中只会返回一条数据 字段MESSAGE_V2就是对应的 凭证编号+工厂+财年

image-20220804105103361

要更新凭证编号的话直接将凭证编号字段等于MESAGE_V2即可

<FS_LINE_A>-BELNR = LS_RETURN-MESSAGE_V2.

别问为什么,问就是BELNR长度是10,MESAGE_V2长度大于10,赋值的话塞不下,只能得到前10位,正好就是我们需要的凭证编号。

过账后记得提交,提交使用BAPI:BAPI_TRANSACTION_COMMIT

DATA: GT_RET TYPE  BAPIRET2.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  EXPORTING
    WAIT   = 'X'
  IMPORTING
    RETURN = GT_RET.
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值