SAP中SE80查看该function
具体代码如下所示:
FUNCTION Z_PDM_MATERIAL.
*"----------------------------------------------------------------------
*"*"Local interface:
*" TABLES
*" IM_TAB STRUCTURE ZPDM_MATERIAL
*" IT_RETURN STRUCTURE ZPDM_RETURN
*"----------------------------------------------------------------------
* 2018年4月12日 之前传递给 MM03-工厂数据/存储2 tab页中的 “净重” 字段的数据,现在需要修改;
* 改为传递给同tab页面中的 “毛重”字段;
* 净重 字段 存在于 bapi_mara中
* 需要在 BAPI_TE_MARA 和 BAPI_TE_MARAX中追加这个字段
*
*"----------------------------------------------------------------------
DATA: l_head LIKE bapimathead, "1初始屏幕
" l_dl_maozhong LIKE BAPI_TE_MARA,
l_clinetdata LIKE bapi_mara,
l_clinetdatax LIKE bapi_marax,
l_plantdata LIKE bapi_marc,
l_plantdatax LIKE bapi_marcx, "5工厂视图
it_makt LIKE bapi_makt OCCURS 0 WITH HEADER LINE,
l_bapiret2 LIKE bapiret2.
DATA BEGIN OF w_extensionin OCCURS 0.
INCLUDE STRUCTURE bapiparex. "BAPI 参数 ExtensionIn/ExtensionOut 的参考结构
DATA END OF w_extensionin.
DATA BEGIN OF w_extensioninx OCCURS 0.
INCLUDE STRUCTURE bapiparexx. "Extension In/Extension Out 的复选框结构
DATA END OF w_extensioninx.
"毛重 字段 添加到下面的增强中 参考 MARA-BRGEW 毛重
DATA zzbapi_te_mara LIKE bapi_te_mara. "客户定义字段:客户级别的物料数据
DATA zzbapi_te_marax LIKE bapi_te_marax. "客户定义字段:客户级别的物料数据
REFRESH it_return .
LOOP AT im_tab.
SELECT SINGLE matnr INTO l_head-material FROM mara WHERE matnr = im_tab-matnr.
l_head-material = im_tab-matnr. "物料号
l_head-ind_sector = 'M'. "行业类型
l_head-matl_type = im_tab-mtart. "物料类型
"l_clinetdata-matl_group = '$$'.
"l_clinetdatax-matl_group = 'X'.
l_head-basic_view = 'X'. "基本数据视图
l_clinetdata-base_uom = im_tab-meins. "基本计量单位
l_clinetdatax-base_uom = 'X'.
* "净重字段去掉
* l_clinetdata-net_weight = im_tab-ntgew . "净重
* l_clinetdatax-net_weight = 'X'.
l_clinetdata-unit_of_wt = 'KG' . "重量单位
l_clinetdatax-unit_of_wt = 'X'.
l_clinetdata-temp_conds = im_tab-tempb . "温度条件标识
l_clinetdatax-temp_conds = 'X'.
l_clinetdata-basic_matl = im_tab-wrkst . "基本物料
l_clinetdatax-basic_matl = 'X'.
l_clinetdata-DOCUMENT = im_tab-zeinr." 凭证
l_clinetdatax-DOCUMENT = 'X'.
l_plantdata-NEG_STOCKS = im_tab-XMCNG." 是否允许负库存
l_plantdatax-NEG_STOCKS = 'X'.
"l_clinetdata-prod_memo = '无'.
"l_clinetdatax-prod_memo = 'X'.
it_makt-langu = '1'.
it_makt-matl_desc = im_tab-maktx. "物料描述(中文)*
APPEND it_makt.
zzbapi_te_mara-material = im_tab-matnr.
zzbapi_te_mara-volum = im_tab-volum. "业务量(增强)
zzbapi_te_mara-voleh = 'M3'. "体积(增强)
zzbapi_te_mara-BRGEW = im_tab-ntgew. "毛重
zzbapi_te_marax-material = im_tab-matnr.
zzbapi_te_marax-volum = 'X'. "业务量(增强)
zzbapi_te_marax-voleh = 'X'. "体积(增强)
zzbapi_te_marax-BRGEW = 'X'. "毛重
w_extensionin-structure = 'BAPI_TE_MARA'.
w_extensionin-valuepart1 = zzbapi_te_mara.
APPEND w_extensionin.
w_extensioninx-structure = 'BAPI_TE_MARAX'.
w_extensioninx-valuepart1 = zzbapi_te_marax.
APPEND w_extensioninx.
l_head-storage_view = 'X'.
"l_head-ACCOUNT_VIEW = 'X'.
"l_head-COST_VIEW = 'X'.
l_plantdata-plant = im_tab-werks."工厂
l_plantdatax-plant = im_tab-werks.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "利润中心
EXPORTING
input = im_tab-prctr
IMPORTING
output = l_plantdata-profit_ctr.
l_plantdatax-profit_ctr = 'X'.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = l_head
clientdata = l_clinetdata
clientdatax = l_clinetdatax
plantdata = l_plantdata
plantdatax = l_plantdatax
IMPORTING
return = l_bapiret2
TABLES
materialdescription = it_makt
extensionin = w_extensionin
extensioninx = w_extensioninx.
IF l_bapiret2-type CA 'EA'.
it_return-type = 'E'.
it_return-matnr = im_tab-matnr.
it_return-message = l_bapiret2-message.
APPEND it_return.
ELSE.
it_return-type = 'S'.
it_return-matnr = im_tab-matnr.
it_return-message = ''.
APPEND it_return.
ENDIF.
CLEAR:l_head,l_clinetdata,l_clinetdatax,l_plantdata,l_plantdatax,l_bapiret2.
REFRESH:it_makt,w_extensionin,w_extensioninx.
ENDLOOP.
ENDFUNCTION.
下面测试上述代码
这样就创建了一个物料
使用MM03查询这个物料
可以看到这个物料已经创建好了
上述内容,仅仅是abap代码本身以及这段代码所代表的Function Module的调用调试过程。
Function Module相当于一个java中的方法,对应的有输入参数,输出参数和源代码。
源代码已经在上面列举出来了。我们先看看输入输出参数。
如上图,Function Module的输入输出参数,也就是局部变量,拥有参数名,和类型。
参数名干什么用呢?如下图所示,tables中的参数名,会直接被source code中的代码使用
类型有什么用呢?或者说,这个类型是从何而来呢?
这个类型,就相当于java世界中的自定义的PO,你想想,我们在写java代码的时候,是不是也经常会使用自定义的PO类作为返回值或者输入参数的类型呢?当然。
明白了这一点,我们先去看看之前提到的参数类型,在哪里定义的。
打开SE11,查看类型的定义,如下图
具体的定义可以看到如下:
上面是输入参数的参数类型
同理,查看一下返回类型的定义
通过上面的描述,Function Module的输入参数和返回值的变量名、参数类型都看到了。
下面我们具体看一下source code,也就是abap的源代码
定义了两个变量,变量类型如下所示
DATA zzbapi_te_mara LIKE bapi_te_mara. "客户定义字段:客户级别的物料数据
DATA zzbapi_te_marax LIKE bapi_te_marax. "客户定义字段:客户级别的物料数据
上面提到的内容,需要abaper手动扩展
具体的定义如下所示,其中后面三个蓝色的变量成员是需要我们手动添加到这个结构中去的,另一个变量的类型x也是同理。
Function Module的具体代码含义,就是从输入参数获取数据,然后
调用下面的function生成物料
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = l_head
clientdata = l_clinetdata
clientdatax = l_clinetdatax
plantdata = l_plantdata
plantdatax = l_plantdatax
IMPORTING
return = l_bapiret2
TABLES
materialdescription = it_makt
extensionin = w_extensionin
extensioninx = w_extensioninx.
上述内容,就是使用代码创建物料的基本描述。