SAP ABAP MASS/MM17批量维护增强

增强步骤

1.为IDoc的MATMAS03段类型进行扩充增强
注:进行此增强的前提是在标准表中(如MARA、MARC等)已经附加了自定义的结构字段
打开事务代码WE31,创建一个新的段类型。
在这里插入图片描述将自定义的字段添加到段类型中。
在这里插入图片描述
打开事务代码WE30,为IDoc MATMAS03创建新的扩展类型。输入对象名称,选择[扩展]选项,点击[创建]按钮。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
将段类型及扩展段进行发布。(先后顺序为:WE31->WE30)
在这里插入图片描述
在这里插入图片描述

设置后无法更改,只有取消发布后才能进行更改。
每个发布创建之后,开发工作都会产生新的IDoc版本。所有旧版本仍然存储于系统中,从而保留了将现有版本回溯为旧版本的可能,确保向后兼容,所以同样为了向后兼容,新的IDoc版本相对旧版本只能增加数据段和数据字段,而不能减少。
注:一个标准的IDoc类型只能创建一个扩展类型,但是一个扩展类型里可以创建多个扩展类型段
打开事务代码WE82,将新创建的扩展分配给消息类型和IDoc类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其中的段类型字段采用WE30创建的扩展类型名称;释放字段采用WE31创建的段类型中的版本。(版本需要释放后才会产生)
2.创建BADI实现
此步骤的目的是为了将数据填充到新创建的段中,必须实现BADI: MG_MASS_NEWSEG中的ADD_NEW_SEGMENT方法。
在这里插入图片描述

代码示例:

METHOD if_ex_mg_mass_newseg~add_new_segment .
*------------------------------------------------------------------------------
* HOW.2 (2013-12-12) Begin Types declaration of customer specific IDoc segments
*------------------------------------------------------------------------------
  TYPES: BEGIN OF lty_ze1maram,
           docnum  TYPE edidc-docnum,
           pointer TYPE sy-tabix.
      INCLUDE TYPE ze1mara AS data. "<<< Custom segment!
  TYPES: END OF lty_ze1maram.
  TYPES: lty_ze1maram_tab TYPE STANDARD TABLE OF lty_ze1maram.
*------------------------------------------------------------------------------
* HOW.2 (EndOF) Begin Types declaration of customer specific IDoc segments
*------------------------------------------------------------------------------
*------------------------------------------------------------------------------
* HOW.2 (2013-12-12) Local data declarations
*------------------------------------------------------------------------------
  DATA: lv_tabix     TYPE sytabix,
        ls_idoc_data TYPE edidd,
        lt_e1maram   TYPE mgmc_e1maram_tab,
        lt_e1marcm   TYPE mgmc_e1marcm_tab,
        ls_ze1maram  TYPE lty_ze1maram,
        lt_ze1maram  TYPE lty_ze1maram_tab.
  FIELD-SYMBOLS: <ls_smarc>   TYPE marc,
                 <ls_e1maram> TYPE mgmc_e1maram,
                 <ls_e1marcm> TYPE mgmc_e1marcm.
*------------------------------------------------------------------------------
* HOW.2 (EndOf) Local data declarations
*------------------------------------------------------------------------------
*------------------------------------------------------------------------------
* HOW.2 (2013-12-12) Initializations
*------------------------------------------------------------------------------
* Copy the IDoc segment tables from BADI interface to local tables
  lt_e1maram = t_e1maram.
  lt_e1marcm = t_e1marcm.
*------------------------------------------------------------------------------
* HOW.2 (EndOf) Initializations
*------------------------------------------------------------------------------
*------------------------------------------------------------------------------
* HOW.2 (2013-12-12) Logic
*------------------------------------------------------------------------------
  LOOP AT smarc ASSIGNING <ls_smarc>.
    CLEAR: ls_ze1maram , lv_tabix.
    MOVE-CORRESPONDING <ls_smarc> TO ls_ze1maram .
    READ TABLE lt_e1maram
    WITH KEY matnr = <ls_smarc>-matnr
    ASSIGNING <ls_e1maram>.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.
    READ TABLE lt_e1marcm
    WITH KEY docnum = <ls_e1maram>-docnum
    werks = <ls_smarc>-werks
    ASSIGNING <ls_e1marcm>.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.
    CALL FUNCTION 'I_MASS_GET_INDEX'
      EXPORTING
        pointer = <ls_e1maram>-pointer
      IMPORTING
        tabix   = lv_tabix.
    IF lv_tabix IS INITIAL.
      lv_tabix = 1.
    ELSE.
      lv_tabix = lv_tabix + 1.
    ENDIF.
    ls_idoc_data-segnam = 'Z1MARAM' . "<<< Customer segment name!
    ls_idoc_data-sdata = ls_ze1maram-data .
    ls_idoc_data-docnum = <ls_e1maram>-docnum.
    INSERT ls_idoc_data
    INTO t_idoc_data
    INDEX lv_tabix.
  ENDLOOP.
*------------------------------------------------------------------------------
* HOW.2 (EndOf) Logic
*------------------------------------------------------------------------------
ENDMETHOD.

3.实现函数出口MGV00001
此步骤的目的是将BADI处理后的内表(参照EDIDD类型)中的自定义字段传入到相应结构字段中,用于更新到标准表中。
在这里插入图片描述

示例代码:

*&---------------------------------------------------------------------*
*& Include ZXMGVU04
*&---------------------------------------------------------------------*
*------------------------------------------------------------------------------
* HOW.2 (2013-12-12) Local data declarations
*------------------------------------------------------------------------------
DATA: ls_ze1mara TYPE ze1mara.
*------------------------------------------------------------------------------
* HOW.2 (EndOf) Local data declarations
*------------------------------------------------------------------------------
*------------------------------------------------------------------------------
* HOW.2 (2013-12-12) Logic
*------------------------------------------------------------------------------
IF f_cust_segment-segnam = 'Z1MARAM'.  "<<< Customer segment name!
  ls_ze1mara = f_cust_segment-sdata.
  IF ls_ze1mara-zzdummy = c_nodata.
    CLEAR ls_ze1mara-zzdummy.
  ELSE.
    IF ls_ze1mara-zzdummy IS INITIAL.
      res_fields-feldname = 'MARA-ZZDUMMY'.  "<<< Customer field name!
      APPEND res_fields.
    ENDIF.
  ENDIF.
  f_marc_ueb-zzdummy = ls_ze1mara-zzdummy.
ENDIF.
*------------------------------------------------------------------------------
* HOW.2 (EndOf) Logic
*------------------------------------------------------------------------------

4.MASS屏幕增强(增加自定义字段)
打开事务代码MASSOBJ,选择BUS1001对象。然后双击[字段列表(可选)]文件夹。
在这里插入图片描述
在这里插入图片描述

点击新条目新增自定义字段数据。
在这里插入图片描述

效果如下。
在这里插入图片描述

5.给自定义字段分配选择组
注:若该步骤已完成可跳过
打开事务代码OMSR,点击新条目。将自定义字段数据新增并选择一个选择组。
在这里插入图片描述

维护状态:EDVKALBQPSZXCFG
在这里插入图片描述

扩展

MASS/MM17的增强中,需要进行ABAP开发的两个增强点都与下图中的结构有关;其中BADI是为了将需要修改的数据及IDoc段等信息插入一条到参照该结构的内表中,然后再在用户出口中根据结构字段SDATA将数据与字段名做对应关系并赋值。
在这里插入图片描述

此时有读者可能会问,SDATA是一个字段,如何在用户出口中给多个字段赋值呢?
由图中可以看出SDATA是一个长度达到1000个字节的长字符串,那么它的原理就显而易见了,首先将IDoc段中所有字段拼接为一个字符串并赋值到SDATA中(这也是物料主数据增强字段必须为字符串的原因之一);在用户出口中,假设某个字段X在IDoc段中处于第三位,前两位字段的字符长度及X字段的字符长度都为10,那么系统给X字段赋值的时候,会截取第21位字符到第30位字符的字符串的值给到X字段。
在这里插入图片描述
在这里插入图片描述

可以看到我原来的结构中实际前面还有十几个字符长度较小的字段,它们都在TEST1前,而由于最后四个字符长度为40,即使字段的值没有到达40个长度也会用空格补满,防止在字段赋值的时候出错。
有同学可能又会问,如果自定义字段的所有长度之和大于1000怎么办?
虽然现实业务场景发生这样的情况不大,但还是有实际的解决办法的:
需要将超出部分的字段分开放到另外一个IDoc段中,上面我们提到一个标准IDoc类型只能有一个扩展类型,但一个扩展类型里可以有多个IDoc段;
在这里插入图片描述

然后在BADI中再插入一条此IDoc段的数据即可。

ls_idoc_data-segnam = 'Z1MARAM' . "<<< Customer segment name!
ls_idoc_data-sdata = ls_ze1maram-data .
ls_idoc_data-docnum = <ls_e1maram>-docnum.
INSERT ls_idoc_data
INTO t_idoc_data
INDEX lv_tabix.
ls_idoc_data-segnam = 'Z2MARAM' . "<<< Customer segment name!
ls_idoc_data-sdata = ls_ze2maram-data .
ls_idoc_data-docnum = <ls_e1maram>-docnum.
INSERT ls_idoc_data
INTO t_idoc_data
INDEX lv_tabix.

程序走到用户出口时,实际上是循环表中的数据。因此改为如图所示的结构即可。

CASE f_cust_segment-segnam.
  WHEN 'Z1MARAM'.  "<<< Customer segment name!
    ls_ze1mara = f_cust_segment-sdata.
    IF ls_ze1mara-zzdummy = c_nodata.
      CLEAR ls_ze1mara-zzdummy.
    ELSE.
      IF ls_ze1mara-zzdummy IS INITIAL.
        res_fields-feldname = 'MARA-ZZDUMMY'.  "<<< Customer field name!
        APPEND res_fields.
      ENDIF.
    ENDIF.
    f_marc_ueb-zzdummy = ls_ze1mara-zzdummy.
  WHEN 'Z2MARAM'.
    ls_ze2mara = f_cust_segment-sdata.
    IF ls_ze2mara-zztest = c_nodata.
      CLEAR ls_ze2mara-zztest.
    ELSE.
      IF ls_ze2mara-zztest IS INITIAL.
        res_fields-feldname = 'MARA-ZZTEST'.  "<<< Customer field name!
        APPEND res_fields.
      ENDIF.
    ENDIF.
    f_marc_ueb-zztest = ls_ze2mara-zztest.
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值