原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
前文提到对CL_DEMO_OUTPUT的优化
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧 CL_DEMO_OUTPUT优化-输出屏幕控制
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247489471&idx=1&sn=cf10a3273ffb85de24471644403e9825&chksm=cf5dca89f82a439f54cd2fb6f443d4f9f517c6051b77afa997714cfb21db2826a6259bfb212f&token=801420869&lang=zh_CN#rd)
随后发现CL_DEMO_OUTPUT输出多表内容的一个最大的问题. 当内表条目数比较大时. 屏幕显示内容过多,只能在知道内表名的情况下通过搜索功能定位内表,
只能查看内表内容,无法分析内表内容(排序,过滤,合计等等)
针对这个问题, 改进了类ZCL_DEMO_OUTPUT功能. 提供分屏ALV显示
**本文主要介绍ZCL_DEMO_OUTPUT通过分屏ALV的方式呈现程序的内表变量**
二
使用方式
• 字段
• 工作区
• 内表
• 嵌套内表的工作区
• 嵌套内表的内表
使用 zcl_demo_output=>write 记录内容.
方法通过如下参数写入一些辅助信息
• IV_DESC 字段名 'X' 字段描述
• IT_FCAT 特定字段的描述
• NAME 内表名称
通过 zcl_demo_output=>display 显示内表内容
通过 is_para 结构传递控制参数
• ALV_DISP = 'X'
• ALV_MODE = 'H' 'H' 上下分屏 'V' 左右分屏
三
显示效果
抬头显示显示如下结构中的字段,其中runtime 大致可以判断中内表内容获取占用的时间(通过当前时间点-上个序号的时间点获取微秒)
显示效果如下图
对于变量, 直接显示内容,对于简单工作区和内表 , 允许通过ALV显示明细, 所有类型都支持用网页显示明细. 通过链接内容跳转到分屏的下方显示ALV内容.
或弹窗显示网页内容
其中变量类型区分如下: z 类型是增强的一个类型. 因为ALV只能显示扁平内表(没有嵌套的内表). 所以需要进一步识别内表的工作区类型 如果工作区是嵌套结构
, 则内表类型识别为 z
四
比较
ALV显示VS网页显示
ALV仅支持简单内表的显示.可以利用ALV的功能对数据进行各种分析及下载.
网页显示支持嵌套内表(多级嵌套)的显示. 对于ALV不支持的类型,只能使用网页方式显示
五
实现
类ZCL_DEMO_OUTPUT 的 WRITE方法记录待显示的变量信息及内容
DISPLAY 则根据传入的控制参数 is_para-alv_disp 确定显示方式
其中ALV显示通过函数Z_BC_DEMO_OUTPUT_ALV 中的屏幕实现
函数中再调用 ZCL_DEMO_OUTPUT=>MAIN方法 实现ALV对象数据内容的分屏呈现
六
实际应用
如下的差异分摊程序.
提供测试运行按钮. 把分摊的内容 及分摊的结果都呈现在ALV中. 用户通过点击查看特定内表内容. 检查获取数据的正确性.
有利于用户通过呈现的数据分析呈现结果的正确性.
ALV的切换: 使用类 cl_salv_table很难做到 多个ALV内容 在 下方屏幕切换显示 ( 容器刷新的问题) . 但是用 类
CL_GUI_ALV_GRID则可以比较方便实现 ALV内容的切换. 因为ALV对象 附加到容器上一次即可, 后续可以通过方法
set_table_for_first_display切换 要显示的内容. 但整个ALV对象 似乎无法在 底层的容器中 实现切换.
(无法实现定义多个ALV对象,在 底层容器中切换 ALV对象-- 或者是我用的方法不正确.
这个问题有点困扰我,如果你有相关经验,欢迎指正 )
七
总结
通过ZCL_DEMO_OUTPUT 可以很方便的把程序的执行过程变量最终呈现出来. 有利于通过显示的数据分析程序的执行逻辑.
方便对逻辑复杂程序的测试,验证.
后续可以考虑把获取的内表内容记录在程序的日志中,方便对历史执行程序的结果正确性分析.
> 程序执行日志详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧 记录报表程序的执行日志
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247489370&idx=1&sn=886311b48de78052dc5fb50fcd8c5193&chksm=cf5dca6cf82a437a7611e5b904ef9105fdcc6ff8701502c9219e9546c13f00d1437d06f53681&token=801420869&lang=zh_CN#rd)
相比 SBAL 函数组的系统日志功能,ZCL_DEMO_OUTPUT可以记录并显示更加详细的过程数据
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论