前言
在 [ MB51自定义字段增强
](http://mp.weixin.qq.com/s?__biz=MzkwNzUxNDQ5Mg==&mid=2247484322&idx=1&sn=859ed6e357e2643a3c409c2a0f6280d0&chksm=c0d944b1f7aecda737581c423a7f1bb7918377a18978203c6a24b0fe19a36c6ce14a93796903&scene=21#wechat_redirect)
文章中介绍了ALV中的自定义字段增强,今天来介绍下选择屏幕如何来增强。
补充一个小知识,如果字段在MKPF和MSEG中存在,可以通过 SPRO->物料管理->库存管理和实际库存->报表->定义物料凭证列表的字段选择
来设置字段是否显示在选择屏幕和ALV中。
需求描述
在MARA表中增加的自定义字段有“品牌”、“年份”、“季节”等字段,现在想要在MB51的选择屏幕上加上这几个条件,用来过滤数据 。最终效果如下所示。
增强实现
1 .se38打开报表RM07DOCS, 在下图位置创建隐式增强,增加TABLES mara声明,为了在选择屏幕中增加SELECT-OPTIONS用
2.在 FORM fill_selections 的结尾增加隐式增强,代码如下:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(4) Form FILL_SELECTIONS, End A*$*$-Start: (4)---------------------------------------------------------------------------------$*$*ENHANCEMENT 7 ZMM_EI_MB51_EXTEND_FIELDS. "active versionIF uf_tabname = 'MSEG'. ax 'MARA ZBRAND +00+00'. ax 'MARA ZYEAR +00+00'. ax 'MARA ZSEASON +00+00'. APPEND VALUE #( report = 'RM07DOCS' tabname = 'MARA' fieldname = 'ZBRAND' selpos = 'X' outpos = 'X' dtg = |{ sy-datum }{ sy-uzeit }| ) TO dbtab. APPEND VALUE #( report = 'RM07DOCS' tabname = 'MARA' fieldname = 'ZYEAR' selpos = 'X' outpos = 'X' dtg = |{ sy-datum }{ sy-uzeit }| ) TO dbtab. APPEND VALUE #( report = 'RM07DOCS' tabname = 'MARA' fieldname = 'ZSEASON' selpos = 'X' outpos = 'X' dtg = |{ sy-datum }{ sy-uzeit }| ) TO dbtab. LOOP AT ct WHERE tabname = 'MARA'. READ TABLE dbtab WITH KEY fieldname = ct-fieldname. CHECK sy-subrc = 0. PERFORM fill_single_line. ENDLOOP.ENDIF.ENDENHANCEMENT.*$*$-End: (4)---------------------------------------------------------------------------------$*$*
注意保持ax 后面字符串长度一致。
3.在FORM generate_select_command 结尾处增加隐式增强,为了在SQL语句中增加mara表的关联
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(5) Form GENERATE_SELECT_COMMAND, End A*$*$-Start: (5)---------------------------------------------------------------------------------$*$*ENHANCEMENT 8 ZMM_EI_MB51_EXTEND_FIELDS. "active versionDATA: lv_tabix LIKE sy-tabix.LOOP AT code WHERE line = ' connection (dbcon) '. code-line = ' join mara on mara~matnr = mseg~matnr '. lv_tabix = sy-tabix - 1. "避免重复插入 READ TABLE code INTO DATA(ls_code) INDEX lv_tabix. CHECK ls_code-line <> code-line. lv_tabix += 1. INSERT code INDEX lv_tabix.ENDLOOP.LOOP AT code ASSIGNING FIELD-SYMBOL(<fs_code>) WHERE line = ' where matnr = matnr-low '. <fs_code>-line = ' where mseg~matnr = matnr-low '.ENDLOOP.ENDENHANCEMENT.*$*$-End: (5)---------------------------------------------------------------------------------$*$*同样注意 保持字符串长度一致。
4.在包含文件RM07DOCS_F01 的 form generate_select_single 结尾处增加隐式增强,代码如下
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Form GENERATE_SELECT_SINGLE, End A*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 10 ZMM_EI_MB51_EXTEND_FIELDS. "active versionDATA: lv_tabix LIKE sy-tabix.LOOP AT code WHERE line = ' connection (dbcon) '. code-line = ' join mara on mara~matnr = mseg~matnr '. lv_tabix = sy-tabix - 1. "避免重复插入 READ TABLE code INTO DATA(ls_code) INDEX lv_tabix. CHECK ls_code-line <> code-line AND ls_code-line <> ' and ekpo~pstyp <> ''9'' '. lv_tabix += 1. INSERT code INDEX lv_tabix.ENDLOOP.ENDENHANCEMENT.*$*$-End: (1)---------------------------------------------------------------------------------$*$*激活程序。
生成程序
1\. 在如下位置处打上断点,执行MB51程序后,然后DEBUG转到下一句PERFORM regenerate.
2\. 执行成功后,包含文件 RM07DOCS_GENERATED 中的代码会自动生成,再次运行MB51后,就可以看到想要的效果了.
TIPS: _如果因为代码编写错误,可能
RM07DOCS_GENERATED生成的代码有错,导致MB51无法运行,可以先根据错误信息,修改增强的代码,然后把生产机的
RM07DOCS_GENERATED代码拷贝到开发机或者直接在开发机中对
RM07DOCS_GENERATED源代码进行错误修复,激活后再用1方法重新生成代码 , _
后续处理
按 04 节方法,在生产机中重新生成程序即可
2\. 选择屏幕条件未生效
SE16N,在表中MMIM_CONTROL_LOG手工添加以下记录,未找到 前台配置地方
总结
相比ALV新增自定义字段而言,选择屏幕的增强难度要高不少,很容易因为增强代码编写错误导致自动生成的程序含有错误而无法激活,
朋友们可根据自己实际需求,亲自动手试一试。