MB51选择屏幕与报表增强
1、文档说明
如之前文档《MIGO新增页签增强》,在MIGO中增强自定义字段,那么在查询MB51时,想通过自定义字段进行筛选,并将数据展示到报表中,就需要对MB51进行增强。
此处需要说明,文档《MIGO新增页签增强》中是将自定义字段存入自建表中,读者也可以自己研究,是否能将字段存入标准表MSEG中。两种做法不同,则在本篇文档中的做法也有一定区别,请读者予以辨别。
2、增强实施
2.1、增强字段
文档《MIGO新增页签增强》中将MIGO增强字段存储在表ZTPP001中

因为需要将数据展示在报表中,所以要在标准表中增强字段
MSEG

MATDOC

此处请注意,如果增强的字段和MIGO中增强的字段名称一致,则需要修改MIGO增强页签中的一段逻辑
文档《MIGO新增页签增强》中在增强方法IF_EX_MB_MIGO_BADI~POST_DOCUMENT中,将MIGO增强的字段存表时,为了得到物料凭证、年度、行项目的值,曾使用MOVE-CORRESPONDING,将MSEG结构的数据传递到自建表的内表中。如果MSEG增强字段和ZTPP001字段名一致,就会使ZTPP001的ZNUM被MSEG的ZNUM(空值)覆盖掉,所以此处可以单独将物料凭证、年度、行项目赋值给ZTPP001的内表。当然,读者也可以定义不一样的字段名,避免覆盖的情况。

2.2、配置选择屏幕
可以通过配置,为MB51新增筛选和展示字段
TCODE:SPRO

新增对应字段,其中选择字段:显示在选择屏幕中,输出字段:显示在报表中

保存之后,重新执行MB51,标准代码则自动更新,此时单据号字段就显示在选择屏幕上

查看包含文件RM07DOCS_GENERATED,可以看到代码更新的时间

选择屏幕代码中也已经自动添加了ZNUM

2.3、隐式增强
在RM07DOCS_GENERATED的子例程FORM DATA_SELECTION_NEW开头位置创建隐式增强

代码如下
"--------------------@斌将军--------------------
IF sy-tcode = 'MB51'.
IF znum[] IS NOT INITIAL."当选择屏幕筛选字段有值
SELECT
mblnr,
mjahr,
zeile,
znum
FROM ZTPP001
INTO TABLE @DATA(lt_ztpp001)
WHERE znum IN @znum.
"将物料凭证、年度、行项目赋值到对应的筛选字段中
LOOP AT lt_ztpp001 INTO DATA(ls_ztpp001).
mblnr-low = ls_ztpp001-mblnr.
mblnr-sign = 'I'.
mblnr-option = 'EQ'.
APPEND mblnr.
CLEAR mblnr.
mjahr-low = ls_ztpp001-mjahr.
mjahr-sign = 'I'.
mjahr-option = 'EQ'.
APPEND mjahr.
CLEAR mjahr.
zeile-low = ls_ztpp001-zeile.
zeile-sign = 'I'.
zeile-option = 'EQ'.
APPEND zeile.
CLEAR zeile.
CLEAR:ls_ztpp001.
ENDLOOP.
"标准表中该字段是空的,并不存值,所以此处要清空,
"避免标准代码用此字段筛选查询MSEG表,导致数据为空,所以此处要清空
CLEAR znum[].
ENDIF.
ENDIF.
"--------------------@斌将军--------------------
同样的代码,增强到以下子例程的开头处
FORM DATA_SELECTION
FORM DATA_SELECTION_VIA_MATNR
FORM DATA_SELECTION_VIA_BUDAT
在RM07DOCS的FORM detail_list中创建隐式增强,将数据赋值到ALV中

代码如下
"--------------------@斌将军--------------------
ENHANCEMENT 5 ZEMM_MB51_APPEND. "active version
IF list[] IS NOT INITIAL.
DATA(lt_list) = list[]. SELECT
ztpp001~mblnr,
ztpp001~mjahr,
ztpp001~zeile,
ztpp001~ZNUM
FROM ZTPP001
INNER JOIN @lt_list AS LIST ON ztpp001~mblnr = LIST~MBLNR
AND ztpp001~mjahr = LIST~mjahr
AND ztpp001~zeile = LIST~zeile
INTO TABLE @DATA(LT_ZPP001). SORT LT_ZPP001 BY MBLNR MJAHR ZEILE. LOOP AT list ASSIGNING FIELD-SYMBOL(<fs_list>).
READ TABLE LT_ZPP001 INTO DATA(LS_ZPP001) WITH KEY mblnr = <fs_list>-MBLNR
mjahr = <fs_list>-mjahr
zeile = <fs_list>-zeile BINARY SEARCH.
IF SY-SUBRC EQ 0.
<fs_list>-ZNUM = LS_ZPP001-ZNUM.
ENDIF.
ENDLOOP. ENDIF.
ENDENHANCEMENT.
"--------------------@斌将军--------------------
2.4、测试效果
输入单据号

数据表中存储的数据

运行结果

2.5、问题说明
此方法实现的屏幕筛选,并不能像常规一样,多个筛选条件取交集,而是与其他筛选字段取并集。读者可以根据项目情况,灵活更改代码实现需求。
3、MB51代码重置
正常情况下,如上文中配置完屏幕字段后,运行MB51,对应的MB51源码就能更新。但是也存在个例,运行MB51时,源代码没有更新过来,选择屏幕中并没有对应的字段
推测原因,可能是开发的增强与MB51要更新的代码出现了冲突,导致更新失败。
例如:有的选择屏幕字段,是直接增强上去的,而不是配置的,导致配置的字段与原本增强的字段重复,所以更新失败
解决方法一:
注释选择屏幕中自开发的增强字段和相关的增强,然后运行MB51,保证程序不DUMP的情况下,程序就会自动再更新源码
解决方法二:
如果仍然不能更新,则采用以下办法,根据官方提供的程序,手动执行更新
首先注释与选择屏幕相关的自开发增强逻辑,保证源码被重置时,使用到选择屏幕等字段的逻辑不报错,保证MB51的正常运行
找到官方NOTE:

根据官方源码,创建并执行程序

对比前后的RM07DOCS_GENERATED,可以发现选择屏幕等源代码全部都没了

执行事务代码MB51,重新生成对应代码

配置的字段就更新进来了

定期更文,欢迎关注

MB51选择屏幕与报表增强的更多相关文章
- ALV报表——选择屏幕选项卡
ALV选择屏幕选项卡 运行效果: 代码: *&--------------------------------------------------------------------* *&a ...
- ALV报表——选择屏幕变量赋值
ABAP选择屏幕变量赋值 运行效果: 代码: *&---------------------------------------------------------------------* ...
- 选择屏幕(Selection Screen)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- abap 选择屏幕事件AT SELECTION-SCREEN
AT SELECTION-SCREEN (1).其实就像一个FORM,所以在这个事件里声明的变量都是局部变量. (2).根据SY-UCOMM这个系统变量可以判断用户的命令 (3).在这个事件里响应的是 ...
- [SAP ABAP开发技术总结]动态修改选择屏幕
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]选择屏幕——按钮、单选复选框
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]选择屏幕——SELECT-OPTIONS
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 选择屏幕中的下拉框和dialog中下拉框设计
REPORT YTEST014. PARAMETERS: auart LIKE vapma-auart AS LISTBOX VISIBLE LENGTH 6. AT SELECTION-SC ...
- abap选择屏幕上的button
1.背景:近期在看sap的一些abapDemo,看了一个比較好用的功能.分享一下.希望对用到的兄弟有帮助,主要功能是:在选择屏幕上弹出一个小窗体.放一些button在上面,触发不同button,会处理 ...
- 【ABAP系列】SAP ABAP选择屏幕(SELECTION SCREEN)事件解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP选择屏幕(SEL ...
随机推荐
- PTA作业4、5、6及期中考试的总结
一.前言 本次博客是针对面向对象程序设计课程布置的PTA第4.5.6次作业以及期中考试的编程题而写的总结分析,重点分析了菜单计价系列题目.期中考试的编程题等具有一定难度和特色的问题. 二.PTA第四次 ...
- Kubernetes Gateway API 攻略:解锁集群流量服务新维度!
Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程.这其中包括一套更标准.更强大的 API资源,用于管理已暴露的服务.在这篇文章中,我将介绍 Gateway ...
- 在.net中使用AutoMapper进行对象映射,对象相互转,简单方便
AutoMapper是一种对象映射工具,它可以帮助我们将不同类型的数据对象之间进行相互转换.在.NET中,我们可以使用AutoMapper库来简化数据对象之间的映射操作,从而提高代码的可读性和可维护性 ...
- UNCTF-Crypto wp
2020年 easy_rsa 题目 from Crypto.Util import number import gmpy2 from Crypto.Util.number import bytes_t ...
- 公司oa是什么?一般公司oa有什么样功能?
公司OA(Office Automation)是指通过计算机和信息技术来实现办公自动化的系统. 它提供了一系列的功能和工具,用于协调.管理和处理公司内部的日常事务和流程.OA系统旨在提高工作效率.加强 ...
- 新来个架构师,把Xxl-Job原理讲的炉火纯青
大家好,我是三友~~ 今天来继续探秘系列,扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 公众号:三友的java日记 核心概念 这里还是老样子,为了保证文章的完整性和连贯性,方便那些没有 ...
- 如何在 PyQt 中实现异步数据库请求
需求 开发软件的时候不可避免要和数据库发生交互,但是有些 SQL 请求非常耗时,如果在主线程中发送请求,可能会造成界面卡顿.这篇博客将会介绍一种让数据库请求变得和前端的 ajax 请求一样简单,且不会 ...
- redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
大家如果对使用netty搞这些http请求什么的感兴趣的,可以参观我自己创建的这个项目. nanshaws/nettyWeb: 复习一下netty,并打算做一个web项目出来 (github.com) ...
- [CF1034C] Region Separation
题目描述 There are $ n $ cities in the Kingdom of Autumn, numbered from $ 1 $ to $ n $ . People can trav ...
- 新冠肺炎病毒(Covid-19)检测系统
一 .背景 新冠肺炎是一种新的呼吸道疾病,它由新型冠状病毒引起,而这种病毒以前从未在人类身上发现 过.新冠肺炎如何传播? 新冠肺炎很容易通过与新冠肺炎患者的密切接触(距离约 6 英尺或两臂长范围内)在 ...