1、se11创建结构,必须包含行项目号POSNR字段,和其他需要扩展的字段,如记账码Posting Key、原因代码
Reason Code等;
2、SE19实现BADI增强ACC_DOCUMENT,这个增强是用来将BAPI_ACC_DOCUMENT_POST参数表EXTENSION2传入系统表
3、使用BAPI_ACC_DOCUMENT_POST参数表EXTENSION2,将扩展字段传入。
以下详细列出方法:
1、略
2、引用bapi中的extession2表,将字段扩展进去。
但是必须得通过BADI增强将字段扩展进去。
Step1:创建Badi
tcode:SE19
此处有2种方式来创建增强,“Classic BADI”或“New BADI”
创建Classic Badi名称:ACC_DOCUMENT
或创建New Badi名称:BADI_ACC_DOCUMENT
这篇文章里以创建Classic Badi为例。
命名为Z_MY_ACC_DOCUMENT
Step2:增加一个Filter
新增一条BKPFF的Filter
Step3:保存
如果保存时出现了下面这个消息,说明你必须将你做的Classic Badi迁移到New Badi。
此时可以选择已有的或创建新的Badi Enhancement Implementation。我们选择创建新的。
创建好之后,系统会提示消息。
Step5:编辑代码
在New Badi里面显示Z_MY_ACC_DOCUMENT,此时将不会报出需要删除Classic Badi的警告了。
双击CHANGE方法即可进入编辑。
代码例子:
- METHOD IF_EX_ACC_DOCUMENT~CHANGE.
- DATA: WA_EXTENSION TYPE BAPIPAREX,
- ZEXT_DATA TYPE Zsfi_bseg. "此处为1所建的结构
-
- FIELD-SYMBOLS: TYPE ACCIT.
- IF C_EXTENSION2[] IS NOT INITIAL.
- LOOP AT C_EXTENSION2 INTO WA_EXTENSION
- WHERE STRUCTURE = 'ZSFI_BSEG'.
- ZEXT_DATA = WA_EXTENSION-VALUEPART1.
- READ TABLE C_ACCIT ASSIGNING WITH KEY POSNR = ZEXT_DATA-POSNR.
- IF SY-SUBRC = 0.
- * -ABPER = ZEXT_DATA-ABPER.
- * -ZZCASHFLOW = ZEXT_DATA-ZZCASHFLOW.
- -BSCHL = ZEXT_DATA-BSCHL.
- * -XREF1_HD = ZEXT_DATA-XREF1_HD.
- ENDIF.
- ENDLOOP.
- ENDIF.
- ENDMETHOD.
代码释义
CHANGE方法中参数FLT_VAL,C_ACCHD,C_ACCIT,C_ACCCR,C_ACCWT,C_ACCTX均与凭证数据相关。
C_EXTENSION2中传入的数据即为BAPI_ACC_DOCUMENT_POST中EXTENSION2参数。
BAPIPAREX-TE_STRUC为数据字典中结构的名称,其余为扩展数据。
上面例子中,生成BAPI的EXTENTION2参数时,就是按照ZKS_OA_ACC_EXT的数据结构顺序写入的,读取时也按照相同的方式读取即可。
根据参数里面的类型和说明来判断某个参数对应凭证中的什么数据,将BAPI中无法传入的数据从EXTENTION2里面取出,传入CHANGE的参数里面即可。
3、调用BAPI,引用Extenssion2.
READ TABLE lt_alv INDEX 1.
IF sy-subrc = 0.
documentheader-comp_code = lt_alv-bukrs.
documentheader-fisc_year = lv_endda+0(4)..
documentheader-fis_period = lv_endda+4(2).
documentheader-doc_date = lv_endda.
documentheader-pstng_date = lv_endda.
documentheader-doc_type = 'SA'.
documentheader-header_txt = '计提存货跌价准备'.
documentheader-username = sy-uname.
LOOP AT lt_alv.
item = item + 1.
accountgl-itemno_acc = item.
accountgl-comp_code = lt_alv-bukrs.
accountgl-doc_type = 'SA'.
accountgl-plant = lt_alv-werks.
accountgl-gl_account = '1471000010'.
accountgl-material = lt_alv-matnr.
APPEND accountgl.
currencyamount-itemno_acc = item.
currencyamount-currency = 'CNY'.
currencyamount-amt_doccur = lt_alv-zytje * ( -1 ).
APPEND currencyamount.
CLEAR extension2.
CLEAR wa_zsfi040.
wa_zsfi040-posnr = item.
wa_zsfi040-bschl = '50'. "记账代码 增强字段
extension2-structure = 'ZSFI040'.
extension2-valuepart1 = wa_zsfi040.
APPEND extension2.
CLEAR:accountgl,currencyamount.
CLEAR:lt_alv-matnr,lt_alv-zchemc,
lt_alv-maktx,lt_alv-meins,
lt_alv-bklas,lt_alv-bkbez,
lt_alv-zkckm,lt_alv-zkckmz,
lt_alv-zcykm,lt_alv-zcykmz,
lt_alv-zbqcy,lt_alv-zqmze,
lt_alv-zqmsl,lt_alv-zqmdj,
lt_alv-zkbdj,lt_alv-zdjce.
COLLECT lt_alv INTO lt_salv.
ENDLOOP.
READ TABLE lt_salv INDEX 1.
item = item + 1.
accountgl-itemno_acc = item.
accountgl-comp_code = lt_salv-bukrs.
accountgl-doc_type = 'SA'.
accountgl-plant = lt_salv-werks.
accountgl-gl_account = '6701000020'.
APPEND accountgl.
currencyamount-itemno_acc = item.
currencyamount-currency = 'CNY'.
currencyamount-amt_doccur = lt_salv-zytje .
APPEND currencyamount.
wa_zsfi040-posnr = item.
wa_zsfi040-bschl = '40'. "记账代码
extension2-structure = 'ZSFI040'.
extension2-valuepart1 = wa_zsfi040.
APPEND extension2.
CLEAR lt_salv.
CLEAR lt_alv.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = documentheader
TABLES
accountgl = accountgl
currencyamount = currencyamount
return = return
extension2 = extension2.
ENDIF.
CLEAR:documentheader,accountgl[],currencyamount[],extension2[].
READ TABLE return WITH KEY type = 'E'.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = return.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
IMPORTING
return = return.
ENDIF.
LOOP AT return.
*将返回日志记入LOG
gs_log-type = return-type.
gs_log-message = return-message.
APPEND gs_log TO gt_log.
ENDLOOP.
PERFORM display_log.
CLEAR:gt_log[],return[] .