因为国情起因,ABAP ALV相干的报表开发在国内泛滥SAP技术交换群里永远都是一个热门话题。
最近Jerry和敌人的技术交换群里,郭爷向大家介绍了ALV Integrated Data Access,可能轻松实现以ALV格局展现CDS view的数据。

什么是 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从业者写过介绍它的博客了:

因为应用的确非常简单,Jerry不会反复博客里的内容,对其具体用法感兴趣的敌人,请移步这篇SAP社区博客: SAP List Viewer with integrated Data Access ALV with IDA.

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

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

这个CDS view显示的数据,是以后ABAP零碎里所有的接口(SE24里查看的interface)和接口上定义的办法个数。

CDS view实现源码如下:

为什么要搞这样一个CDS view进去?Jerry已经给SAP成都研究院的共事们做过一个面向对象程序设计的培训,外面讲到了一个准则:

Interface Segregation Principle(接口拆散/隔离准则).

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

讲完了接口隔离准则之后,我突然有了一个想法,SAP ABAP零碎里大量的历史遗留代码里,是否存在着定义了大量办法的胖接口呢?于是就开发了上述的CDS view一探到底。

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

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

应用Jerry之前文章:

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

CL_SQL_STATEMENT->EXECUTE_QUERY

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

断点第一次触发,执行的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' )

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

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

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

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

ADBC vs JDBC

下图右边是用ADBC读取数据库的代码,左边是Java的JDBC代码,大家能够简略比照一下语法:

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

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

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

以后DB是否反对指定的个性,通过这些IS办法返回的布尔值决定。

从源代码看,很多个性须要ABAP 740 SP4之后的版本能力反对。

感激浏览。