MB51选择屏幕增强

作者:ABAP三叔 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
MB51选择屏幕增强 - 封面图
MB51选择屏幕增强 - 封面图

前言

在 [ 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中。

MB51选择屏幕增强 - 封面图
MB51选择屏幕增强 - 封面图

需求描述

在MARA表中增加的自定义字段有“品牌”、“年份”、“季节”等字段,现在想要在MB51的选择屏幕上加上这几个条件,用来过滤数据 。最终效果如下所示。

MB51选择屏幕增强 - 封面图
MB51选择屏幕增强 - 封面图

增强实现

1 .se38打开报表RM07DOCS, 在下图位置创建隐式增强,增加TABLES mara声明,为了在选择屏幕中增加SELECT-OPTIONS用

MB51选择屏幕增强 - 封面图
MB51选择屏幕增强 - 封面图

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.

MB51选择屏幕增强 - 封面图
MB51选择屏幕增强 - 封面图

2\. 执行成功后,包含文件 RM07DOCS_GENERATED 中的代码会自动生成,再次运行MB51后,就可以看到想要的效果了.

TIPS: _如果因为代码编写错误,可能

RM07DOCS_GENERATED生成的代码有错,导致MB51无法运行,可以先根据错误信息,修改增强的代码,然后把生产机的

RM07DOCS_GENERATED代码拷贝到开发机或者直接在开发机中对

RM07DOCS_GENERATED源代码进行错误修复,激活后再用1方法重新生成代码 , _

后续处理

1.请求传生产机后,选择屏幕字段不显示中文

按 04 节方法,在生产机中重新生成程序即可

2\. 选择屏幕条件未生效

SE16N,在表中MMIM_CONTROL_LOG手工添加以下记录,未找到 前台配置地方

MB51选择屏幕增强 - 封面图
MB51选择屏幕增强 - 封面图

总结

相比ALV新增自定义字段而言,选择屏幕的增强难度要高不少,很容易因为增强代码编写错误导致自动生成的程序含有错误而无法激活,

朋友们可根据自己实际需求,亲自动手试一试。

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「MB51选择屏幕增强.md」整理生成,仅用于内部技术分享与学习交流。