SAP中使用Function Module创建物料的过程

SAP中SE80查看该function
image
具体代码如下所示:

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.

下面测试上述代码
image
image
image
image
image
image
image
这样就创建了一个物料
使用MM03查询这个物料
image

image
可以看到这个物料已经创建好了
上述内容,仅仅是abap代码本身以及这段代码所代表的Function Module的调用调试过程。
Function Module相当于一个java中的方法,对应的有输入参数,输出参数和源代码。
源代码已经在上面列举出来了。我们先看看输入输出参数。
image
如上图,Function Module的输入输出参数,也就是局部变量,拥有参数名,和类型。
参数名干什么用呢?如下图所示,tables中的参数名,会直接被source code中的代码使用
image

类型有什么用呢?或者说,这个类型是从何而来呢?
这个类型,就相当于java世界中的自定义的PO,你想想,我们在写java代码的时候,是不是也经常会使用自定义的PO类作为返回值或者输入参数的类型呢?当然。
明白了这一点,我们先去看看之前提到的参数类型,在哪里定义的。
打开SE11,查看类型的定义,如下图
image
具体的定义可以看到如下:
image
image
上面是输入参数的参数类型
同理,查看一下返回类型的定义

image
image
通过上面的描述,Function Module的输入参数和返回值的变量名、参数类型都看到了。
下面我们具体看一下source code,也就是abap的源代码
定义了两个变量,变量类型如下所示


  DATA zzbapi_te_mara LIKE bapi_te_mara.   "客户定义字段:客户级别的物料数据
  DATA zzbapi_te_marax LIKE bapi_te_marax. "客户定义字段:客户级别的物料数据

上面提到的内容,需要abaper手动扩展
image
具体的定义如下所示,其中后面三个蓝色的变量成员是需要我们手动添加到这个结构中去的,另一个变量的类型x也是同理。
image
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.

上述内容,就是使用代码创建物料的基本描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值