帮人解决一个BAPI_ACC_DOCUMENT_POST创建会计凭证增强的问题,
然后整理了以下内容:
"创建凭证的时候经常会用到 extension2 传一些标准bapi接口未提供的值
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = gs_bkpf
TABLES
accountgl = gt_account
accountreceivable = gt_customer
accountpayable = gt_vendor
currencyamount = gt_currency
return = gt_return
extension2 = gt_etx.
然后在BADI ACC_DOCUMENT 来赋值
我看到有这么一段代码:
method 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>.
if <l_field> IS ASSIGNED.
" 会计凭证行项目增强
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.
else.
"
" 会计凭证抬头增强
MOVE-CORRESPONDING <l_struc> TO c_acchd.
endif.
ENDLOOP.
endmethod.
貌似看着没问题,而且动态的,挺好,通用的。
但是这样会存在一个问题:
如果增强结构里,有一个字段跟 c_accit c_acchd字段相同,
而且 c_accit c_acchd原来某个字段本身就是有值的(可能是标准bapi支持可能是别的增强写进去的),
而c_extension2 内这个字段却没赋值……
会出现把原来的值覆盖掉的情况……
所以不建议这么写,
建议针对不同的extension结构做单独的处理,增强还是尽量控制影响范围,别影响了别人的逻辑。
比如下面这样或者其他方式,能实现即可
同时,赋值的时候,也要extension值是否为空,非空才赋值。
下面是我之前写的一个函数
以下代码仅供参考:
FUNCTION zfm_move_value.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(IS_INPUT)
*" VALUE(IV_STRUCTURE)
*" VALUE(CV_STRUCTURE)
*" CHANGING
*" VALUE(CS_INPUT) OPTIONAL
*"----------------------------------------------------------------------
FIELD-SYMBOLS:
<l_field> TYPE any, "从工作区结构
<l_field_c> TYPE any. "到工作区结构
*
DATA : lt_idetails TYPE abap_compdescr_tab WITH HEADER LINE.
DATA : lr_ref_table_des TYPE REF TO cl_abap_structdescr.
DATA : ct_idetails TYPE abap_compdescr_tab WITH HEADER LINE.
DATA : cr_ref_table_des TYPE REF TO cl_abap_structdescr.
lr_ref_table_des ?=
cl_abap_typedescr=>describe_by_name( iv_structure ).
CLEAR lt_idetails[].
lt_idetails[] = lr_ref_table_des->components[].
cr_ref_table_des ?=
cl_abap_typedescr=>describe_by_name( cv_structure ).
CLEAR ct_idetails[].
ct_idetails[] = cr_ref_table_des->components[].
"循环判断结构每个字段
LOOP AT lt_idetails.
ASSIGN COMPONENT lt_idetails-name OF STRUCTURE is_input TO <l_field> .
CHECK sy-subrc = 0 .
READ TABLE ct_idetails WITH KEY name = lt_idetails-name.
CHECK sy-subrc = 0.
ASSIGN COMPONENT ct_idetails-name OF STRUCTURE cs_input TO <l_field_c>.
CHECK sy-subrc = 0.
IF <l_field> IS NOT INITIAL.
<l_field_c> = <l_field>.
ENDIF.
ENDLOOP.
ENDFUNCTION.
开心每一天:
昨晚和老公看电视,老公说电视里的女演员一脸的克夫相,我贱贱的凑过脸问他:“那我呢?我是不是天生旺夫相?”
老公瞟了瞟,说:“遇到你,只能说我命硬……”
命硬……硬……