首页 > 其他分享 >生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题

生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题

时间:2022-10-14 17:32:03浏览次数:49  
标签:ACC 会计凭证 wa accit ref idetails extension DOCUMENT TYPE

帮人解决一个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.


生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题_字段


然后在BADI  ACC_DOCUMENT 来赋值

生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题_字段_02


我看到有这么一段代码:

生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题_赋值_03

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结构做单独的处理,增强还是尽量控制影响范围,别影响了别人的逻辑。


比如下面这样或者其他方式,能实现即可

生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题_赋值_04

同时,赋值的时候,也要extension值是否为空,非空才赋值。


下面是我之前写的一个函数


生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题_字段_05

以下代码仅供参考:

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.

开心每一天:

昨晚和老公看电视,老公说电视里的女演员一脸的克夫相,我贱贱的凑过脸问他:“那我呢?我是不是天生旺夫相?”

老公瞟了瞟,说:“遇到你,只能说我命硬……”

命硬……硬……

生成会计凭证 ACC_DOCUMENT 增强可能忽略一个问题_ide_06





标签:ACC,会计凭证,wa,accit,ref,idetails,extension,DOCUMENT,TYPE
From: https://blog.51cto.com/u_15680210/5757564

相关文章