SAP调用函数BAPI_PO_CREATE1创建采购订单时候怎么传入增强字段
以下是基于已经在采购订单界面加好自定义字段的情况下的一些代码处理,如果想看怎么增加自定义字段,请参考相关文章
SAP屏幕增强自定义界面字段使用自定义搜索帮助方法/获取其他屏幕字段的值 - 萧静默 - 博客园
SAP -MM采购订单增加屏幕工具栏按钮及事件 - 萧静默 - 博客园
我们观察函数BAPI_PO_CREATE1可以看到有个入参extensionin = lt_extensionin[],这个是必须要传入的。
data: LT_EXTENSIONIN TYPE TABLE OF BAPIPAREX,
LS_EXTENSIONIN TYPE BAPIPAREX.
DATA: ls_te_mepoitem TYPE bapi_te_mepoitem.
* data:LS_EXTENSIONIN TYPE BAPIPAREX.
* 给需要的增强字段赋值
ls_te_mepoitem-po_item = xuhao * 10. "PO行号
* ls_te_mepoitem-zebeln = <grp01>-zebeln. "原PO号
* ls_te_mepoitem-zebelp = <grp01>-zebelp. "原PO行号
ls_te_mepoitem-zwlxfl = it_poitem-zwlxfl. "物料细分类
* ls_te_mepoitem-zpurdep = <grp01>-zpurdep. "采购部门
* 不需要赋值的字段不用手动处理,ABAP会自动填充空格
ls_extensionin-structure = 'BAPI_TE_MEPOITEM'.
* MOVE LS_TE_MEPOITEM TO LS_EXTENSIONIN-VALUEPART1.
" 2. 调用标准工具类完成Unicode安全的序列化
TRY.
" 修正点:将错误的IMPORT_VALUE替换为系统要求的IM_VALUE
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = ls_te_mepoitem
IMPORTING
ex_container = ls_extensionin-valuepart1.
CATCH cx_parameter_invalid_type.
MESSAGE '增强字段类型转换失败' TYPE 'E'.
CATCH cx_parameter_invalid_range.
MESSAGE '增强字段总长度超出VALUEPART1限制' TYPE 'E'.
ENDTRY.
APPEND ls_extensionin TO lt_extensionin.
* 必须配套 BAPI_TE_MEPOITEMX 控制哪些字段更新
DATA: ls_te_mepoitemx TYPE bapi_te_mepoitemx.
ls_te_mepoitemx-po_item = xuhao * 10. "行号作为KEY
* ls_te_mepoitemx-zebeln = 'X'.
* ls_te_mepoitemx-zebelp = 'X'.
ls_te_mepoitemx-zwlxfl = 'X'.
* ls_te_mepoitemx-zpurdep = 'X'.
ls_extensionin-structure = 'BAPI_TE_MEPOITEMX'.
" MOVE LS_TE_MEPOITEMX TO LS_EXTENSIONIN-VALUEPART1.
TRY.
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = ls_te_mepoitemx
IMPORTING
ex_container = ls_extensionin-valuepart1.
CATCH cx_parameter_invalid_type.
MESSAGE '增强控制字段类型转换失败' TYPE 'E'.
CATCH cx_parameter_invalid_range.
MESSAGE '增强控制字段总长度超出VALUEPART1限制' TYPE 'E'.
ENDTRY.
APPEND ls_extensionin TO lt_extensionin.
CLEAR ls_extensionin.
不再采取数字排序法,直接传入,在函数时注意传入
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = POHEADER
POHEADERX = POHEADERX
* MEMORY_COMPLETE = ''
* PARK_COMPLETE = ''
NO_PRICE_FROM_PO = 'X'
IMPORTING
EXPPURCHASEORDER = E_EBELN
TABLES
RETURN = RETURN
POITEM = POITEM
POITEMX = POITEMX
POSCHEDULE = POSCHEDULE
POSCHEDULEX = POSCHEDULEX
POACCOUNT = POACCOUNT
POACCOUNTX = POACCOUNTX
POCOND = POCOND
POCONDX = POCONDX
EXTENSIONIN = LT_EXTENSIONIN[].
另外要注意在实施类之前里进行赋值
使用badi ME_BAPI_PO_CUST进行实施增强

在方法IF_EX_ME_BAPI_PO_CREATE_02~MAP2I_EXTENSIONIN里进行代码编辑赋值

"创建采购订单时增强字段写入--改成不按照数字去数了
IF IM_NAME = 'CI_EKPODB'.
FIELD-SYMBOLS: <GW_EKPO> TYPE BAPI_TE_MEPOITEM,
<GW_CONTAINER> TYPE BAPI_TE_MEPOITEM.
ASSIGN CH_STRUC TO <GW_EKPO> CASTING.
ASSIGN IM_CONTAINER TO <GW_CONTAINER> CASTING.
<GW_EKPO> = <GW_CONTAINER>. "两边类型一致,不触发Unicode转换检查
ELSEIF IM_NAME = 'CI_EKPODBX'.
FIELD-SYMBOLS: <GW_EKPOX> TYPE BAPI_TE_MEPOITEMX,
<GW_CONTAINERX> TYPE BAPI_TE_MEPOITEMX.
ASSIGN CH_STRUC TO <GW_EKPOX> CASTING.
ASSIGN IM_CONTAINER TO <GW_CONTAINERX> CASTING.
<GW_EKPOX> = <GW_CONTAINERX>.
ENDIF.
如果以上增强字段里有数字,可能会报错,改用下面的逐个字段赋值
"创建采购订单时增强字段写入--改成不按照数字去数了
IF IM_NAME = 'CI_EKPODB'.
FIELD-SYMBOLS: <GW_EKPO> TYPE BAPI_TE_MEPOITEM,
<GW_CONTAINER> TYPE BAPI_TE_MEPOITEM.
ASSIGN CH_STRUC TO <GW_EKPO> CASTING.
ASSIGN IM_CONTAINER TO <GW_CONTAINER> CASTING.
* <GW_EKPO> = <GW_CONTAINER>. "两边类型一致,不触发Unicode转换检查
"只挑需要的字段单独赋值,不做整体结构覆盖,不碰数值型字段
<GW_EKPO>-PO_ITEM = <GW_CONTAINER>-PO_ITEM.
<GW_EKPO>-ZEBELN = <GW_CONTAINER>-ZEBELN.
<GW_EKPO>-ZEBELP = <GW_CONTAINER>-ZEBELP.
<GW_EKPO>-ZWLXFL = <GW_CONTAINER>-ZWLXFL.
<GW_EKPO>-ZPURDEP = <GW_CONTAINER>-ZPURDEP.
ELSEIF IM_NAME = 'CI_EKPODBX'.
FIELD-SYMBOLS: <GW_EKPOX> TYPE BAPI_TE_MEPOITEMX,
<GW_CONTAINERX> TYPE BAPI_TE_MEPOITEMX.
ASSIGN CH_STRUC TO <GW_EKPOX> CASTING.
ASSIGN IM_CONTAINER TO <GW_CONTAINERX> CASTING.
* <GW_EKPOX> = <GW_CONTAINERX>.
<GW_EKPOX>-PO_ITEM = <GW_CONTAINERX>-PO_ITEM.
<GW_EKPOX>-ZEBELN = <GW_CONTAINERX>-ZEBELN.
<GW_EKPOX>-ZEBELP = <GW_CONTAINERX>-ZEBELP.
<GW_EKPOX>-ZWLXFL = <GW_CONTAINERX>-ZWLXFL.
<GW_EKPOX>-ZPURDEP = <GW_CONTAINERX>-ZPURDEP.
ENDIF.

浙公网安备 33010602011771号