首页 > 其他分享 >浅谈 SAP ABAP 系统里的 ALV 输出方式实现

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

时间:2022-09-04 21:35:22浏览次数:54  
标签:浅谈 接口 ABAP CDS ALV SAP view

由于国情原因,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之后的版本才能支持。

感谢阅读。

标签:浅谈,接口,ABAP,CDS,ALV,SAP,view
From: https://www.cnblogs.com/sap-jerry/p/16656164.html

相关文章

  • 如何使用 ABAP 代码解析 XML 文件
    正如本教程的开篇介绍文章SAPOData开发教程-从入门到提高(包含SEGW,RAP和CDP)所提到的,SAPOData服务开发,从实现技术上来说,可以分为三大类。因此本教程也分为三大......
  • 区块链技术浅谈(三)
    (三)虚拟币的应用虚拟币当然是希望把自己作为一种货币来应用的。这里我们不讨论恶意割韭菜的投机者创造出来的空气币——这些空气币都是不怀好意之刃蹭了区块链技术的热度,......
  • Idea配置Serializable class without ‘serialVersionUID’ 找不到
    在使用Java原生序列化的时候,serialVersionUID起到了一个类似版本号的作用,在反序列化的时候判断serialVersionUID如果不相同,会抛出InvalidClassException。关于Idea如何快......
  • 浅谈电能质量在线监测装置的功能与概述
    电能质量在线监测装置产品概述: 随着我国国民经济的蓬勃发展,电力负荷急剧加大,特别是冲击性和非线性负荷容量的不断增长,使得电网发生波形畸变、电压波动与闪变和三......
  • 浅谈无扰动稳定控制装置的应用范畴及原理
    无扰动稳定控制装置的应用范畴及原理        石化、煤炭、冶金、制药等是连续性生产企业,工艺和安全生产要求流程的连续性,任何电源波动,确保交流接触器不异......
  • 浅谈10kV无扰动快切装置在煤矿电网中的应用
    10kV无扰动快切装置在煤矿电网的应用摘要:结合某煤矿公司10kV无扰动快切装置在变电站实际情况,对10kV无扰动快切装置的应用从动作原理、保护功能及应用等方面进行分析......
  • 区块链技术浅谈(二)
    (二)虚拟币的兴起以及交易市场比特币可以视为区块链应用落地的一次初尝,中本聪设计了这样一种简单明了的玩法,让大家通过不断的烧显卡就可能获得“比特币”。我想他只是想把去......
  • 浅谈-java GUI-基础理论
    GUI:GraphicalUserInterface(图形用户接口)用图形的方式,用来显示计算机操作的界面Java为GUI提供的API都存在java.awt和javax.Swing两个包中java.awt包:awt是这三个......
  • ABAP-OLE复制行和复制SHEET
    1DATAlc_rangeTYPEole2_object.2DATAlv_sheetTYPEole2_object.3DO2TIMES.4CALLMETHODOFlv_sheet'Rows'=lc_range5EXPORTING#1=7.......
  • 网赚是什么?浅谈分析底层逻辑和煜讯汇
    那么网赚到底是什么?顾名思义,网赚就是利用电脑在因特网上赚钱,这是一个很笼统的含义。“网赚”大概是在2000年左右被人认可的,估计最大规模的网赚行为应该是淘宝开店。淘宝......