关于sap:浅谈-SAP-ABAP-系统里的-ALV-输出方式实现

42次阅读

共计 2505 个字符,预计需要花费 7 分钟才能阅读完成。

因为国情起因,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 之后的版本能力反对。

感激浏览。

正文完
 0