使用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…