浅谈 SAP ABAP 系统里的 ALV 输出方式实现

2年前 (2022) 程序员胖胖胖虎阿
200 0 0

由于国情原因,ABAP ALV相关的报表开发在国内众多SAP技术交流群里永远都是一个热门话题。
最近Jerry和朋友的技术交流群里,郭爷向大家介绍了ALV Integrated Data Access,能够轻松实现以ALV格式展示CDS view的数据。

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

什么是 ALV?ALV 最初是 ABAP List Viewer 的缩写,但在 SAP 文档中找到的当前术语是 SAP List Viewer。 不过,这并不重要,在日常实践中,它被简称为 ALV,不再使用任何名称。

ABAP 列表查看器 (ALV) 是一组应用程序编程接口(API 功能模块和类),用于以表格或分层格式显示数据,以及用于视觉呈现和事件处理的内置选项。

对于用户,ALV 提供了一个友好的界面和一个工具栏,允许每个用户根据自己的喜好调整呈现的布局,并轻松地对数据进行排序或过滤。 许多标准 SAP 报告使用 ALV,由于其灵活性、易于实施和多种功能,它已成为构建自定义 ABAP 报告时的流行工具。ALV 框架的第一个实现是经典 SAP 列表查看器,通常称为 ALV 列表。

感谢郭爷的介绍,Jerry因为工作原因不会进行SAP Dynpro的编程,所以也不知道这个ALV IDA的存在。网上搜了一下,发现早在2018年就有SAP从业者写过介绍它的博客了:

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

因为使用确实非常简单,Jerry不会重复博客里的内容,对其详细用法感兴趣的朋友,请移步这篇SAP社区博客: SAP List Viewer with integrated Data Access ALV with IDA.

如下图所示,我在SAPGUI里写了一个报表,只用一行语句就能完成一个名叫ZFAT_INTERFACE这个CDS view的ALV展示工作。

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

cl_salv_gui_table_ida=>create_for_cds_view( iv_cds_view_name = 'ZFAT_INTERFACE' )->fullscreen( )->display( ).

这个CDS view显示的数据,是当前ABAP系统里所有的接口(SE24里查看的interface)和接口上定义的方法个数。

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

CDS view实现源码如下:

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

为什么要搞这样一个CDS view出来?Jerry曾经给SAP成都研究院的同事们做过一个面向对象程序设计的培训,里面讲到了一个原则:

Interface Segregation Principle(接口分离/隔离原则).

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

接口隔离准则期望达到的效果是,客户类不应被强迫依赖于那些它们实际并不需要的接口。相反地,一个接口定义的方法数量越多,其实现类越容易受制于该接口。例如,一个客户类A实现了一个接口,该接口包含了客户类不需要的方法,但这些方法是其他客户类所需要的,那么当其他客户类由于某种原因需要对接口进行修改时,这个修改也将影响客户类A。通过接口隔离准则,我们尽可能地避免这种不必要的耦合,比如上图中把包含了Print,Staple, Copy和Fax四个方法的胖接口Job,拆分成了四个各自只包含一个独立方法的接口。

讲完了接口隔离原则之后,我忽然有了一个想法,SAP ABAP系统里大量的历史遗留代码里,是否存在着定义了大量方法的胖接口呢?于是就开发了上述的CDS view一探究竟。

从使用ALV IDA显示CDS view ZFAT_INTERFACE的结果看,方法数量排名第一的胖接口IFUR_NW7__ALL,其上定义了755个方法......

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

再回到ALV IDA,它能够显示CDS view数据的原理是什么?

使用Jerry之前文章:

SAP错误消息调试之七种武器:让所有的错误消息都能被定位 里介绍的第五种办法,孔雀翎之SAT,即使用SAT运行之前编写的ALV程序,在SAT跟踪结果里,就能找到cl_salv_gui_table_ida最后是如何从CDS view里取值的:

CL_SQL_STATEMENT->EXECUTE_QUERY

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

在该方法里设置断点, 执行报表,断点会触发两次:

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

断点第一次触发,执行的SQL表达式:

SELECT COUNT( * ) AS "COUNT" FROM "ZFATINF" AS "ZFAT_INTERFACE" WITH PARAMETERS( 'LOCALE' = 'EN' )

断点第二次触发,执行的SQL表达式:

SELECT "ZFAT_INTERFACE"."CLSNAME" AS "CLSNAME", "ZFAT_INTERFACE"."METHOD_COUNT" AS "METHOD_COUNT" FROM "ZFATINF" AS "ZFAT_INTERFACE" ORDER BY "ZFAT_INTERFACE"."CLSNAME" ASC LIMIT ? OFFSET ? WITH PARAMETERS( 'LOCALE' = 'CASE_INSENSITIVE' )

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

一旦指向结果集(result set)的引用lo_result在1049行代码调用next_package方法,CDS view的前1000条数据就被赋值到了ABAP内表lr_data里:

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

这种不采用ABAP OPEN SQL,而用CL_SQL_STATEMENT,CL_SQL_CONNECTION等系列工具类的数据库访问方式,称为ADBC - ABAP Database Connectivity.

ADBC是一套API的集合,能允许ABAP开发人员使用ABAP面向对象编程的方式,同ABAP服务器的原生SQL接口进行交互。

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

Jerry之前的文章集合 Jerry的ABAP, Java和JavaScript乱炖,里面有一篇将ADBC和Java的JDBC做了对比:

ADBC vs JDBC

下图左边是用ADBC读取数据库的代码,右边是Java的JDBC代码,大家可以简单对比一下语法:

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

最后,在哪些版本的ABAP服务器上能使用ALV IDA?

无需查阅文档,直接查看源代码,在CL_SALV_GUI_TABLE_IDA有个DB_CAPABILITIES方法:

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

进而查看该方法实现里的CL_SALV_IDA_CAPABILITY_SERVICE:

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

当前DB是否支持指定的特性,通过这些IS方法返回的布尔值决定。

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

从源代码看,很多特性需要ABAP 740 SP4之后的版本才能支持。

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

感谢阅读。

版权声明:程序员胖胖胖虎阿 发表于 2022年11月5日 上午8:16。
转载请注明:浅谈 SAP ABAP 系统里的 ALV 输出方式实现 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...