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 为例
可以看见对应的关联类型里有很多字段,这些字段是和FB01中的字段相对应
不同的过账码对应了不同的帐户类型和借贷标识,在表 TBSL 中可以查看。
*根据过账码获得对应帐户类型和借贷标识
*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)
下面是具体模拟冲销的代码
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就是对应的 凭证编号+工厂+财年
要更新凭证编号的话直接将凭证编号字段等于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.