很多BAPI允许用户将自定义字段通过一个table参数EXTENSIONIN传入BAPI中,比如采购订单创建的bapi BAPI_PO_CREATE1,如下:
定义EXTENSIONIN的结构类型BAPIPAREX如下:
STRUCTURE字段用来填写结构名字,这个结构里面就是自定义增强字段,BAPI_PO_CREATE1中可供使用的是以下6个结构名,
- BAPI_TE_MEPOHEADER--采购订单抬头
- BAPI_TE_MEPOHEADERX
- BAPI_TE_MEPOITEM--采购订单行项目
- BAPI_TE_MEPOITEMX
- BAPI_TE_MEPOACCOUNTING--采购订单科目分配
- BAPI_TE_MEPOACCOUNTINGX
这些结构里大概就是下面这个样子,当然这些自定义字段需要通过增强append到ekpo中
VALUEPART1,VALUEPART2,VALUEPART3,VALUEPART4中保存的是自定义字段值和更新标识
,EXTENSIONIN怎么才能赋值呢?下面主角登场了,SAP提供了一个类CL_ABAP_CONTAINER_UTILITIES,里面有两个方法, 方法read_container_c-用来读取EXTENSIONIN, 方法fill_container_c用来填充EXTENSIONIN。
例子代码当然不能少了,下面这一小段代码就是先将EXTENSIONIN中的值读出来,然后再加入一个自定义字段 zsfyg的值,再回写EXTENSIONIN。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
LOOP AT et_extensionin ASSIGNING <fs_ext> WHERE structure = 'BAPI_TE_MEPOITEM'. * 读取自定义字段值 CALL METHOD cl_abap_container_utilities=>read_container_c EXPORTING im_container = <fs_ext>+30 IMPORTING ex_value = ls_bapi_te_mepoitem EXCEPTIONS illegal_parameter_type = 1 OTHERS = 2. IF ls_bapi_te_mepoitem-po_item = iv_ebelp. * PO行项目相同 ls_bapi_te_mepoitem-zsfyg = iv_zsfyg. * 写入新的自定义字段值 CALL METHOD cl_abap_container_utilities=>fill_container_c EXPORTING im_value = ls_bapi_te_mepoitem IMPORTING ex_container = <fs_ext>+30 EXCEPTIONS illegal_parameter_type = 1 OTHERS = 2. ENDIF. ENDLOOP. |
可以看到这两个方法的container参数中用到了<fs_ext>+30,有个30的偏移量,含义就是将第一个字段STRUCTURE跳过,STRUCTURE恰好30位长,然后读取或写入之后的VALUEPART1,VALUEPART2,VALUEPART3,VALUEPART4。
以上。
发表评论