生成会计凭证一般使用BAPI:BAPI_ACC_DOCUMENT_POST。
在使用该BAPI生成预制会计凭证时需要做增强,实例化 BAPI出口ACC_DOCUMENT,实现方法CHANGE:
READ TABLE C_EXTENSION2 INTO LS_EXTE WITH KEY STRUCTURE = 'ZFIDOCEXT'. IF SY-SUBRC = 0. ZEXT_DATA = LS_EXTE-VALUEPART1. MOVE ZEXT_DATA-STATUS TO C_ACCHD-STATUS_NEW.
ENDIF.
其中,ZFIDOCEXT为自定义结构,其中包含行号,记账码,原因代码和一个字符标识:
在程序中,调用BAPI_ACC_DOCUMENT_POST前,将结构ZFIDOCEXT型变量赋值,在预制会计凭证时需要将STATUS赋值为2,即将C_ACCHD-STATUS_NEW赋值为2,然后将ZFIDOCEXT传给BAPI的参数EXTENSION2:
IF SY-TCODE = 'ZFI210'. LW_ZFIDOCEXT-BSCHL = '40'. "记帐码 ELSEIF SY-TCODE = 'ZFI211'. LW_ZFIDOCEXT-BSCHL = '50'. "记帐码
ENDIF.
IF P_PARK = 'X'. "是否创建预制凭证,否则凭证直接过账
LW_ZFIDOCEXT-STATUS = '2'.
ELSE. LT_EXTENSION-STRUCTURE = 'ZFIDOCEXT'.
LT_EXTENSION-VALUEPART1 = LW_ZFIDOCEXT. APPEND LT_EXTENSION. CLEAR LT_EXTENSION,LW_ZFIDOCEXT.
ENDIF.
调用BAPI时将LT_EXTENSION传递给参数EXTENSION2:
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST' EXPORTING DOCUMENTHEADER = GD_DOCUMENTHEADER
TABLES * ACCOUNTGL = LT_ACCOUNTGL ACCOUNTRECEIVABLE = LT_ACCOUNTRECEIVABLE
* ACCOUNTPAYABLE = LT_ ACCOUNTPAYABLE
CURRENCYAMOUNT = LT_CURRENCYAMOUNT
RETURN = LT_RETURN
EXTENSION2 = LT_EXTENSION .
该BAPI中的参数ACCOUNTGL为总帐科目项,ACCOUNTRECEIVABLE为客户项目,ACCOUNTPAYABLE为供应商项目,CURRENCYAMOUNT为货币项目,RETURN为返回消息,在使用该BAPI时应注意参数的传递。
PS:实际应用过程中出现了生成的预制会计凭证无法转成正式会计凭证的问题,报错信息如下图:
经查,是因为LT_ACCOUNTRECEIVABLE中的BLINE_DATE这个参数未输,为该参数传值即可解决。