一、前言
标准报表MB51用来显示物料凭证清单, 这个报表中没有包含物料,物料工厂视图的属性. 项目上提出增强这个报表
本文介绍了怎么改造标准报表MB51,让它能够通过配置添加物料或物料工厂属性作为选择和输出清单字段
二、标准配置
配置表 MMIM_REP_CUST 可以配置MB51报表的选择字段和输出字段. 但是标准配置仅支持MKPF/MSEG两个表的字段. 如果尝试用SE16N强制加入其它表字段,比如MARA MATKL
其中字段 日期-数据-组(DTG) 放入最新时间戳, 以便触发MB51重新生成程序
重新执行MB51. 该字段不会生效, 同时程序会自动从表里删除新增的记录
三、删除记录
程序RM07DOCS 2840行左右
FORM auto_repair. 负责干这个活.
凡是不符合统一思想认知的. 系统负责清理掉.
为了使用标准配置增强MB51的功能, 先干掉这个杀手. 找到auto_repair 例程, 例程末尾的删除表内容重新的操作去掉即可.
四、新增配置报错
好容易新增的记录保留下来了, 生成的程序无法执行,提示语法错误. 详细报错如下
结果加入的表,字段在生成的SQL语句中使用了如图模式,导致执行报错.
并且这个错误导致整个报表的语法报错. 无法再次生成程序.
只能用Z_EDIT 把生成的部分代码中 RM07DOCS_GENERATED 从其它系统复制过来, 再次执行MB51重新生成代码.
五、另一个思路
看来配置标准表还需要去重写SQL语句的生成部分逻辑以及其它可能的逻辑 这个有点麻烦.
如果考虑启用自己的配置表. 报表中补充字段仅需要考虑如下几点:
-
定义自己的配置表
-
嵌入标准的生成逻辑,生成一下选择屏幕
-
自定义字段嵌入到内表中
-
ALV输出前把字段放到FCAT中
-
ALV输出前补充内表中自定义字段的内容
但是因为没有把查询字段嵌入到原SQL语句中, 可能导致原SQL语句无法因为这个限制减少数据的读取量. 带来一些性能问题. 但是如果要把这个新的选择条件嵌入原SQL语句,又得全面理解该程序的所有生成代码逻辑. 复杂度太高.
六、挑战
考虑再三, 还是决定挑战 调整系统生成代码的逻辑
通过多次调整. 实现效果如下
在配置表中新增字段 MARA-MATKL 及MARC-DISPO 字段:日期-数据-组设置最新的时间戳
执行MB51是, 系统会自动重新生成选择屏幕,然后进入生成后的选择屏幕,该屏幕包含了新配置的字段
七、标准程序的思路
在程序初始化的时候检查配置表的最大时间戳是否大于上次生成后记录的时间戳
如果大于,说明配置表存在变化, 执行生成代码逻辑,重新生成选择屏幕及SQL语句部分代码
生成后,再次调用MB51 .此时已经是新的选择屏幕.
基于上述思路, 仅需要调整标准程序生成选择屏幕及SQL语句的部分即可.
八、修改
标准程序修改的部分如下:
补充表定义
补充选择屏幕定义
程序文本中补充
优化SQL语句中的字段指定
去除对配置表的限制
补充关联表MARA,MARC
上述调整只能直接修改源代码, 不过系统的修改源码辅助会记录这些修改点.
通过传输请求号,可以方便的查询到所有修改点
调整后, 允许配置表中任意配置MARA MARC的字段. 报表程序会自动适应新配置, 重新生成选择屏幕及相关代码.