SAP ABAP 物料主数据(MM01/MM02/MM03)屏幕增强

增强步骤

1.为主表添加一个附加结构
根据业务需求新建一个结构,结构中放入需要增强的屏幕字段并激活。
在这里插入图片描述

打开事务代码SE11,在需要保存的主表中添加这个附加结构并激活。
注:根据业务需求及屏幕增强的视图判断需要保存的主表是哪张,如基本数据在MARA,工厂级数据在MARC
在这里插入图片描述

2.创建定制子屏幕的程序
打开事务代码SPRO,选择"创建定制子屏幕的程序"。
在这里插入图片描述

保存后会生成一个函数组。
在这里插入图片描述

在生成的屏幕或自建一个屏幕进行屏幕绘制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要DIALOG代码:

PROCESS BEFORE OUTPUT.
  "MM03时限制输入状态
  MODULE disable_fields.
  "MM02/MM03时把数据从表里取出来,赋值给屏幕相应的字段
  MODULE get_data.

PROCESS AFTER INPUT.
 "把数据导出到MEMORY
  MODULE assign_data.
*----------------------------------------------------------------------*
***INCLUDE LZFGMM_003O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module DISABLE_FIELDS OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE disable_fields OUTPUT.
  IF sy-tcode = 'MM03'.
    LOOP AT SCREEN.
      screen-input = '0'.
      MODIFY SCREEN .
    ENDLOOP.
  ENDIF.
ENDMODULE.                 " DISABLE_FIELDS  OUTPUT
*&---------------------------------------------------------------------*
*& Module GET_DATA OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE get_data OUTPUT.
  TABLES:zsmm_mara.
  DATA:w_matnr TYPE matnr,
       c_matnr TYPE matnr,
       lv_flg  TYPE c.

  IF sy-tcode = 'MM01' AND lv_flg IS INITIAL.
    GET PARAMETER ID 'RMA' FIELD c_matnr.
    IF c_matnr IS NOT INITIAL.
      SELECT SINGLE * FROM mara
        INTO CORRESPONDING FIELDS OF zsmm_mara
        WHERE matnr = c_matnr.
    ENDIF.
  ELSEIF ( sy-tcode = 'MM02' OR sy-tcode = 'MM03' ) AND lv_flg IS INITIAL.
    GET PARAMETER ID 'MAT' FIELD w_matnr.
    SELECT SINGLE * FROM mara
      INTO CORRESPONDING FIELDS OF zsmm_mara
      WHERE matnr = w_matnr.
  ENDIF.

  IF sy-subrc = 0 AND zsmm_mara IS NOT INITIAL.
    mara-zzcgyq     = zsmm_mara-zzcgyq.
    mara-zzmyfs     = zsmm_mara-zzmyfs.
    mara-zzrdstatus = zsmm_mara-zzrdstatus.
    mara-zzkunnr    = zsmm_mara-zzkunnr.
    mara-zzggxh     = zsmm_mara-zzggxh.
    mara-zzwsize    = zsmm_mara-zzwsize.
    mara-zzmpw      = zsmm_mara-zzmpw.
    mara-zztester   = zsmm_mara-zztester.
    mara-zzcssj     = zsmm_mara-zzcssj.
    mara-zzcscx     = zsmm_mara-zzcscx.
    mara-zzeqccx    = zsmm_mara-zzeqccx.
    mara-zzdena     = zsmm_mara-zzdena.
    mara-zzhksj     = zsmm_mara-zzhksj.
    mara-zzhkwd     = zsmm_mara-zzhkwd.
    mara-zzuvsj     = zsmm_mara-zzuvsj.
    mara-zzchll     = zsmm_mara-zzchll.
    mara-zzbjll     = zsmm_mara-zzbjll.
    mara-zznkllks   = zsmm_mara-zznkllks.
    mara-zzpacktype = zsmm_mara-zzpacktype.
    mara-zzhxth     = zsmm_mara-zzhxth.
    mara-zzfzdjs    = zsmm_mara-zzfzdjs.
    mara-zzjbhd     = zsmm_mara-zzjbhd.
    mara-zzbjhd     = zsmm_mara-zzbjhd.
    mara-zzhpj      = zsmm_mara-zzhpj.
    mara-zzhpgy     = zsmm_mara-zzhpgy.
    mara-zzfjfs     = zsmm_mara-zzfjfs.
    mara-zzjjfs     = zsmm_mara-zzjjfs.
    mara-zzfps      = zsmm_mara-zzfps.
    mara-zzjygd     = zsmm_mara-zzjygd.
    mara-zzfthjyp   = zsmm_mara-zzfthjyp.
    mara-zzaoibs    = zsmm_mara-zzaoibs.
    mara-zzbqfs     = zsmm_mara-zzbqfs.
    mara-zzbzfs     = zsmm_mara-zzbzfs.
    mara-zzfzjyxh   = zsmm_mara-zzfzjyxh.
    mara-zzfzhyjbhd = zsmm_mara-zzfzhyjbhd.
    mara-zzfzjytmzl = zsmm_mara-zzfzjytmzl.
  ENDIF.
  lv_flg = abap_true.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  ASSIGN_DATA  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE assign_data INPUT.
  zsmm_mara_add-zzxh01 = mara-zzxh01.
  zsmm_mara_add-zzkd01 = mara-zzkd01.
  zsmm_mara_add-zzhd01 = mara-zzhd01.
  zsmm_mara_add-zzwx01 = mara-zzwx01.
  zsmm_mara_add-zzpp01 = mara-zzpp01.
  zsmm_mara_add-zzgg01 = mara-zzgg01.
  zsmm_mara_add-zzsx01 = mara-zzsx01.
  zsmm_mara_add-zzlb01 = mara-zzlb01.

  EXPORT zsmm_mara_add TO MEMORY ID 'ZMARA'.
ENDMODULE.

3.在实例化出口中增加数据保存功能增强点
打开事务代码CMOD,在增强点实例中写数据保存的逻辑代码;只需要将数据分配到CMARA内表中即可,SAP会将CMARA中的数据保存至MARA表中
在这里插入图片描述
在这里插入图片描述

4.配置子屏幕
打开事务代码SPRO,选择"定义每个屏幕序列的数据屏幕的结构"。
在这里插入图片描述
选择需要增强的视图后双击子屏幕。
在这里插入图片描述
在这里插入图片描述

在相应的子屏幕位置新建条目并选择自定义的屏幕。其中程序名为SPAL+自己定义的函数组名,屏幕号为自定义的屏幕号。
注:视图中的子屏幕项与顺序有关,请根据需求新增在相应的位置
在这里插入图片描述
可以点击视图数据屏幕模拟查看效果。
在这里插入图片描述
新增视图
如果需要增强一个视图,则需要多配置两个步骤
一个是需要配置数据屏幕,也就是新增的视图
在这里插入图片描述
然后配置这个视图所在的位置顺序
在这里插入图片描述
在这里插入图片描述效果如下
在这里插入图片描述
在这里插入图片描述

5.配置字段组
打开事务代码SPRO,选择"给字段选择组分配字段"。
在这里插入图片描述

点击"新条目"并添加增强的字段。
在这里插入图片描述

其中维护状态为:EDVKALBQPSZXCFG,字段组为:GR_GLOB
在这里插入图片描述

所有字段新增后保存即可。
注:所有增强字段必须分配选择组,否则无法更新成功
效果如下:
在这里插入图片描述拓展
其他视图底表的增强
对MARC做增强,屏幕字段操作可以参考MARA;但是赋值就无法在二代增强MGA00001中进行赋值了,因为EXIT_SAPLMGMU_001中CHANGING参数只有CMARA MARA的参考结构。若想实现赋值,在这个函数调用点后创建隐式增强,通过内存传值修改MARC-XXX/CMARC-XXX自定义字段的值实现。
物料编号搜索帮助增强
首先根据增强字段创建一个搜索帮助
在这里插入图片描述然后在搜索帮助出口中编写取值逻辑。
可拷贝系统标准的搜索帮助出口DEMO:F4IF_SHLP_EXIT_EXAMPLE 然后进行修改

FUNCTION zmm_sh_shlp_f4_exit.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------
  DATA:BEGIN OF str_help,
         maktx      TYPE makt-maktx,
         matnr      TYPE mara-matnr,
         zzggxh     TYPE mara-zzggxh,
         zztester   TYPE mara-zztester,
         zzcscx     TYPE mara-zzcscx,
         zzeqccx    TYPE mara-zzeqccx,
         zzpacktype TYPE mara-zzpacktype,
         zzhxth     TYPE mara-zzhxth,
       END OF str_help.

  DATA:l_it_show LIKE TABLE OF str_help WITH HEADER LINE.

  DATA: lw_selopt     TYPE ddshselopt,
        lv_sql        TYPE string,
        lv_maktx      TYPE string,
        lv_matnr      TYPE string,
        lv_zzggxh     TYPE string,
        lv_zztester   TYPE string,
        lv_zzcscx     TYPE string,
        lv_zzeqccx    TYPE string,
        lv_zzpacktype TYPE string,
        lv_zzhxth     TYPE string.

* EXIT immediately, if you do not want to handle this step
  IF callcontrol-step <> 'SELONE' AND
     callcontrol-step <> 'SELECT' AND
      " AND SO ON
     callcontrol-step <> 'DISP'.
    EXIT.
  ENDIF.

*"----------------------------------------------------------------------
* STEP SELONE  (Select one of the elementary searchhelps)
*"----------------------------------------------------------------------
* This step is only called for collective searchhelps. It may be used
* to reduce the amount of elementary searchhelps given in SHLP_TAB.
* The compound searchhelp is given in SHLP.
* If you do not change CALLCONTROL-STEP, the next step is the
* dialog, to select one of the elementary searchhelps.
* If you want to skip this dialog, you have to return the selected
* elementary searchhelp in SHLP and to change CALLCONTROL-STEP to
* either to 'PRESEL' or to 'SELECT'.
  IF callcontrol-step = 'SELONE'.
*   PERFORM SELONE .........
    EXIT.
  ENDIF.

*"----------------------------------------------------------------------
* STEP PRESEL  (Enter selection conditions)
*"----------------------------------------------------------------------
* This step allows you, to influence the selection conditions either
* before they are displayed or in order to skip the dialog completely.
* If you want to skip the dialog, you should change CALLCONTROL-STEP
* to 'SELECT'.
* Normaly only SHLP-SELOPT should be changed in this step.
  IF callcontrol-step = 'PRESEL'.
*   PERFORM PRESEL ..........
    EXIT.
  ENDIF.
*"----------------------------------------------------------------------
* STEP SELECT    (Select values)
*"----------------------------------------------------------------------
* This step may be used to overtake the data selection completely.
* To skip the standard seletion, you should return 'DISP' as following
* step in CALLCONTROL-STEP.
* Normally RECORD_TAB should be filled after this step.
* Standard function module F4UT_RESULTS_MAP may be very helpfull in this
* step.
  IF callcontrol-step = 'SELECT'.

    LOOP AT shlp-selopt INTO lw_selopt.
      CASE lw_selopt-shlpfield.
        WHEN 'MAKTX'.
          lv_maktx = lw_selopt-low.
          REPLACE ALL OCCURRENCES OF '*' IN lv_maktx WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = | MAKTX LIKE @LV_MAKTX |.
          ELSE.
            lv_sql = lv_sql && | AND MAKTX LIKE @LV_MAKTX |.
          ENDIF.
        WHEN 'MATNR'.
          lv_matnr = '%' && lw_selopt-low && '%'.
          REPLACE ALL OCCURRENCES OF '*' IN lv_matnr WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = | A~MATNR LIKE @LV_MATNR |.
          ELSE.
            lv_sql = lv_sql && |'AND A~MATNR LIKE @LV_MATNR |.
          ENDIF.
        WHEN 'ZZGGXH'.
          lv_zzggxh = '%' && lw_selopt-low && '%'.
          REPLACE ALL OCCURRENCES OF '*' IN lv_zzggxh WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = | ZZGGXH LIKE @LV_ZZGGXH |.
          ELSE.
            lv_sql = lv_sql && | AND ZZGGXH LIKE @LV_ZZGGXH |.
          ENDIF.
        WHEN 'ZZTESTER'.
          lv_zztester = '%' && lw_selopt-low && '%'.
          REPLACE ALL OCCURRENCES OF '*' IN lv_zztester WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = | ZZTESTER LIKE @LV_ZZTESTER |.
          ELSE.
            lv_sql = lv_sql && | AND ZZTESTER LIKE @LV_ZZTESTER |.
          ENDIF.
        WHEN 'ZZCSCX'.
          lv_zzcscx = '%' && lw_selopt-low && '%'.
          REPLACE ALL OCCURRENCES OF '*' IN lv_zzcscx WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = |ZZCSCX LIKE @LV_ZZCSCX|.
          ELSE.
            lv_sql = lv_sql && | AND ZZCSCX LIKE @LV_ZZCSCX |.
          ENDIF.
        WHEN 'ZZEQCCX'.
          lv_zzeqccx = '%' && lw_selopt-low && '%'.
          REPLACE ALL OCCURRENCES OF '*' IN lv_zzeqccx WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = | ZZEQCCX LIKE @LV_ZZEQCCX |.
          ELSE.
            lv_sql = lv_sql && | AND ZZEQCCX LIKE @LV_ZZEQCCX |.
          ENDIF.
        WHEN 'ZZPACKTYPE'.
          lv_zzpacktype = '%' && lw_selopt-low && '%'.
          REPLACE ALL OCCURRENCES OF '*' IN lv_zzpacktype WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = | ZZPACKTYPE LIKE @LV_ZZPACKTYPE |.
          ELSE.
            lv_sql = lv_sql && | AND ZZPACKTYPE LIKE @LV_ZZPACKTYPE |.
          ENDIF.
        WHEN 'ZZHXTH'.
          lv_zzhxth = '%' && lw_selopt-low && '%'.
          REPLACE ALL OCCURRENCES OF '*' IN lv_zzhxth WITH '%'.
          IF lv_sql IS INITIAL.
            lv_sql = | ZZHXTH LIKE @LV_ZZHXTH |.
          ELSE.
            lv_sql = lv_sql && | AND ZZHXTH LIKE @LV_ZZHXTH |.
          ENDIF.
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.

    SELECT b~maktx,
           a~matnr,
           a~zzggxh,
           a~zztester,
           a~zzcscx,
           a~zzeqccx,
           a~zzpacktype,
           a~zzhxth
      FROM mara AS a
     INNER JOIN makt AS b
        ON b~matnr = a~matnr
    UP TO @callcontrol-maxrecords ROWS
    INTO TABLE @l_it_show
    WHERE (lv_sql).

    CALL FUNCTION 'F4UT_RESULTS_MAP'
      TABLES
        shlp_tab          = shlp_tab[]
        record_tab        = record_tab[]
        source_tab        = l_it_show
      CHANGING
        shlp              = shlp
        callcontrol       = callcontrol
      EXCEPTIONS
        illegal_structure = 1
        OTHERS            = 2.

    IF l_it_show[] IS NOT INITIAL.
      callcontrol-step = 'DISP'.
    ELSE.
      callcontrol-step = 'SELECT'.
    ENDIF.

    EXIT. "Don't process STEP DISP additionally in this call.
  ENDIF.
*"----------------------------------------------------------------------
* STEP DISP     (Display values)
*"----------------------------------------------------------------------
* This step is called, before the selected data is displayed.
* You can e.g. modify or reduce the data in RECORD_TAB
* according to the users authority.
* If you want to get the standard display dialog afterwards, you
* should not change CALLCONTROL-STEP.
* If you want to overtake the dialog on you own, you must return
* the following values in CALLCONTROL-STEP:
* - "RETURN" if one line was selected. The selected line must be
*   the only record left in RECORD_TAB. The corresponding fields of
*   this line are entered into the screen.
* - "EXIT" if the values request should be aborted
* - "PRESEL" if you want to return to the selection dialog
* Standard function modules F4UT_PARAMETER_VALUE_GET and
* F4UT_PARAMETER_RESULTS_PUT may be very helpfull in this step.
  IF callcontrol-step = 'DISP'.
*   PERFORM AUTHORITY_CHECK TABLES RECORD_TAB SHLP_TAB
*                           CHANGING SHLP CALLCONTROL.

    EXIT.
  ENDIF.
ENDFUNCTION.

最后在系统标准的搜索帮助集合中添加自定义的搜索帮助即可
在这里插入图片描述在这里插入图片描述
效果如下
在这里插入图片描述

  • 10
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值