浅谈|浅谈 SAP ABAP 系统里的 ALV 输出方式实现
由于国情原因,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代码,大家可以简单对比一下语法:
文章图片
【浅谈|浅谈 SAP ABAP 系统里的 ALV 输出方式实现】最后,在哪些版本的ABAP服务器上能使用ALV IDA?
无需查阅文档,直接查看源代码,在CL_SALV_GUI_TABLE_IDA有个DB_CAPABILITIES方法:
文章图片
进而查看该方法实现里的CL_SALV_IDA_CAPABILITY_SERVICE:
文章图片
当前DB是否支持指定的特性,通过这些IS方法返回的布尔值决定。
文章图片
从源代码看,很多特性需要ABAP 740 SP4之后的版本才能支持。
文章图片
感谢阅读。
推荐阅读
- 如何对|如何对 ABAP 数据库表通过 ABAP 代码进行更新和删除操作试读版
- SAP|SAP UI5 应用中的 sap.ui.require.toUrl 使用场景
- SAP|SAP UI5 应用中 MockServer 的实例化方法
- SAP|SAP UI5 应用中的 sap.ui.require 使用场景
- 前端|浅谈函数式编程柯里化的魔法
- SAP|SAP 电商云 Spartacus 服务器端渲染的单步调试详细步骤
- 使用|使用 Busy Dialog 动画阻止 SAP UI5 应用按钮短时间内快速被点击试读版
- 使用函数节流思想避免|使用函数节流思想避免 SAP UI5 应用里按钮短时间内被高频重复点击试读版
- SAP|SAP UI5 里的 Busy Indicator 控件使用概述
- 一键部署开箱即用的代理服务器,解决|一键部署开箱即用的代理服务器,解决 SAP UI5 应用开发过程中访问远端 OData 服务的跨域问题