开发者社区> python技术君> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 浅谈 SAP ABAP 系统里的 ALV 输出方式实现
+关注继续查看
福利推荐:阿里云、腾讯云、华为云等大品牌云产品全线2折优惠活动来袭,4核8G云服务器899元/3年,新老用户共享优惠,点击这里立即抢购>>>

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

ffb11c1ebb3afcba91222c697d640eb9.png

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


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

cb9843622e469fea4d18aef361487527.png

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


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

aa0c55144147ac0524d378f28a68206f.png

CDS view实现源码如下:

e1c0bda13e0f835eb59cae539f85b291.png

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


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

c9161001012fce560146c0f7e12bd5a9.png

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


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


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

13c1c1a960531905f2671e41b01c77e8.png

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


使用Jerry之前文章:


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


CL_SQL_STATEMENT->EXECUTE_QUERY


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

b9dee300c6cf8bf0add7585c453ee371 (1).png

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

886c37e6ce90d1af8b44c8d016bb2b07.png

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

fba89dba5c81197f12cf5ed27315b20f.png

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


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

85846f999bc20ec06bdd38e9faa29847.png

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


ADBC vs JDBC


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

dab654cadfa17f97625261857ef962ad.png

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


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

677fe7762b5dd4eca5343e247347ce00.png

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

eca93f6c65fb9e96d47f1aa557fb7966.png

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

ebaf507ef473a90e0e7939386733cb0c.png

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

875d775f8e542eca2369b4be5d1672af.png

感谢阅读。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何用 ABAP 代码创建 SAP CRM IBase
如何用 ABAP 代码创建 SAP CRM IBase
0 0
SAP Fiori My note应用的add to功能的后台ABAP实现
SAP Fiori My note应用的add to功能的后台ABAP实现
0 0
使用ABAP代码创建SAP S/4HANA系统的扩展字段
Besides S4 extension tool in Fiori UI, you can also create extension field in backend using report CFD_TEST.
0 0
一行代码将SAP CDS view数据以ALV的方式输出
一行代码将SAP CDS view数据以ALV的方式输出
0 0
SAP 不同 ABAP 系统里同一 Customizing activity 的显示差异分析
比如SAP HANA Live Reporting这个Customizing Activity,在System AG3里不可见,但是在另一个系统QHD里却能使用。比较下列两张图的差异。
0 0
SAP ABAP实用技巧介绍系列之使用代码获得某个structure上的扩展字段
SAP ABAP实用技巧介绍系列之使用代码获得某个structure上的扩展字段
0 0
SAP的ABAP屏幕程序如何使用Table Control进行数据交互
SAP中ABAP的屏幕元素涉及到“定制控制” 和 “Table Control” 两个数据显示容器。 定制控制是单向的数据展示,使用abap的SQL语句把数据从透明表(硬盘中)读取至内表(内存),进行一系列数据整理,然后采用ALV表格的形式把这些数据展示在“定制控制”这个用于数据显示的容器中。
7275 0
SAP应用界面开发:5)Report List报表开发(1)
  (1)Report List 输入定义   Report List主要应用于数据的格式化输出。Report List可以通过以下参数设置来控制报表标题显示、报表分页控制、参数数据库表及参考Message类等,具体扩展语法如下:???? ...NO STANDARD PAGE HEADING:输出的报表不包含表头(LIST HEADING)。
683 0
SAP应用界面开发:5)Report List报表开发(2)
  报表输出格式的控制 ????? (1)表格的制作?????? SAP Report List 开发中并没有表格的概念,所谓表格实现上是通过多个线条绘制而成。具体的线条输出位置,需要开发人员根据输出报表的大小,字段长短及位置来确定。
546 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载


http://www.vxiaotou.com