增强步骤
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.
最后在系统标准的搜索帮助集合中添加自定义的搜索帮助即可
效果如下