ACAC应计对象参数增强
1. 业务背景
业务上希望根据会计凭证生成应计对象时,将会计凭证上的某些字段保存到应计对象上,同时在应计对象过账时将这些字段的值赋值给应计对象过账产生的会计凭证上。
2. 需求分析
- 2.1 从SAP官方帮助文档中,我们发现应计对象的参数,就是用来存储客户自定义字段的。
详细信息可以参照官方帮助文档如下:
-
2.2 前置需求
- 需要在结构ACAC_PARAMETERS中加入字段
- 在配置项 分配参数到应计对象类别 中将参数字段分配给应计对象类别。
详细的过程,可以参考配参数到应计对象类别的配置文档:
3. 功能实现
3.1 增强结构ACAC_PARAMETERS
3.2 分配参数到应计对象类别
- 3.2.1 选择配置项分配参数到应计对象类别
- 3.2.2 选择定义的参数字段
保存时报错:ACAC 009 名称范围 Z* 适用于用户定义的参数的注释
检查代码发现,Z类型的应计对象类别只能赋值Z开头参数字段
修改参数结构ACAC_PARAMETERS,再重新配置保存。
3.3 测试应计对象创建
输入公司代码、应计对象类别和应计对象编号,点击参数页签,点击输入参数,可以看到我们配置的字段显示在屏幕上。
3.4 修改会计凭证生成应计对象的逻辑
在会计凭证生成应计对象时,将会计凭证上的字段作为应计对象的参数赋值给应计对象。使用类CL_ACE_MDO_SUBOBJ中PARAMETERS_MODIFY方法
-
- 创建方法GET_PO_ASSIGN读取应计对象类型的参数配置
METHOD get_po_assign.
SELECT *
FROM tacac_po_assign
INTO TABLE @gt_po_assign.
SORT gt_po_assign BY objtype acac_parameter.
ENDMETHOD.
-
- 根据配置和凭证抬头设置参数
METHOD get_parameters_from_acc.
DATA: lv_acc_field TYPE char30,
lv_acc_fname TYPE fieldname,
lv_content TYPE ace_par_content.
FIELD-SYMBOLS: <lfs_acc_field> TYPE any.
LOOP AT gt_po_assign INTO DATA(ls_po_assign) WHERE objtype = iv_acac_objtype.
lv_acc_fname = ls_po_assign-acac_parameter+2.
"凭证抬头字段
lv_acc_field = 'IS_BKPF-' && lv_acc_fname.
ASSIGN (lv_acc_field) TO <lfs_acc_field>.
IF NOT <lfs_acc_field> IS ASSIGNED.
"凭证明细字段
lv_acc_field = 'IS_BSEG-' && lv_acc_fname.
ASSIGN (lv_acc_field) TO <lfs_acc_field>.
ENDIF.
IF NOT <lfs_acc_field> IS ASSIGNED.
CONTINUE.
ENDIF.
lv_content = <lfs_acc_field>.
UNASSIGN <lfs_acc_field>.
rt_parameters = VALUE #( BASE rt_parameters
( param_name = ls_po_assign-acac_parameter
content = |{ lv_content ALPHA = OUT }| ) ).
ENDLOOP.
ENDMETHOD.
-
- 更新应计对象的参数
"将凭证信息更新到应计对象的参数
DATA(lt_parameters) = get_parameters_from_acc(
EXPORTING
iv_acac_objtype = lv_acac_objtype
is_bseg = <fs_bseg>
is_bkpf = gs_bkpf ).
lo_acac_mdo_subobj->parameters_modify(
EXPORTING
id_datefrom = acec_lowest_date " From Date of an Entry
* id_testrun = space
it_params = lt_parameters
).
3.5 修改凭证替代
在执行事务代码ACEPOSTINGRUN时,将原凭证抬头的参考代码1赋值给应计过账凭证的参考码3
4 测试结果
原始会计凭证
生成的应计对象
应计对象过账结果
应计对象过账凭证