当前位置: 首页 > Web前端 > JavaScript

浅谈SAPABAP系统中ALV输出模式的实现

时间:2023-03-26 21:56:13 JavaScript

由于国情原因,ABAPALV相关报表的开发一直是国内众多SAP技术交流群的热门话题。最近在Jerry和小伙伴的技术交流群里,郭老师介绍了ALVIntegratedDataAccess,可以很方便的将CDS视图的数据以ALV格式显示出来。什么是ALV?ALV最初是ABAP列表查看器的首字母缩写词,但在SAP文档中找到的当前术语是SAP列表查看器。不过没关系,在日常实践中它被简称为ALV,不再使用任何名称。ABAP列表查看器(ALV)是一组应用程序编程接口(API功能模块和类),用于以表格或分层格式显示数据,具有用于可视化呈现和事件处理的内置选项。对于用户,ALV提供了一个友好的界面和一个工具栏,允许每个用户根据自己的喜好调整呈现的布局,并轻松地对数据进行排序或过滤。许多标准SAP报告使用ALV,由于其灵活性、易于实施和多功能性,它已成为构建自定义ABAP报告时的流行工具。ALV框架的第一个实现是经典的SAP列表查看器,通常称为ALV列表。感谢郭老师的介绍,Jerry因为工作的关系不会编程SAPDynpro,所以并不知道这个ALVIDA的存在。上网搜了一下,发现SAP从业者早在2018年就写了一篇介绍它的博客:因为真的好用,Jerry就不重复博客里的内容了。对其详细用法感兴趣的朋友请移步本SAP社区博客:SAPListViewerwithintegratedDataAccessALVwithIDA。如下图,我在SAPGUI中写了一个报表,只需要一行语句就可以完成一个叫做ZFAT_INTERFACE的CDS视图的ALV显示工作。cl_salv_gui_table_ida=>create_for_cds_view(iv_cds_view_name='ZFAT_INTERFACE')->全屏()->显示()。这个CDS视图显示的数据是当前ABAP系统中的所有接口(SE24中查看的接口)和定义在接口号上的方法。CDS视图实现源码如下:为什么要创建这样的CDS视图?Jerry曾经给SAP成都研究院的同事做一个面向对象的编程培训,讲了一个原则:InterfaceSegregationPrinciple(接口分离/隔离原则)。接口分离原则的预期效果是,客户类不应该被迫依赖它们实际上不需要的接口。反之,一个接口定义的方法越多,它的实现类就越容易受制于该接口。比如一个客户端类A实现了一个接口,其中包含了客户端类不需要的方法,但是这些方法是其他客户端类需要的,那么当其他客户端类因为某些原因需要修改接口时,这个修改也会影响客户端A类。通过接口隔离原则,我们尽量避免这种不必要的耦合。比如上图中,将包含Print、Staple、Copy、Fax这4个方法的胖接口Job拆分为4个,每个只包含一个独立的方法接口。说完接口隔离的原理,突然灵机一动。SAPABAP系统大量的历史遗留代码中是否存在定义大量方法的胖接口?所以我开发了上面提到的CDS视图来一探究竟。从使用ALVIDA显示CDS视图ZFAT_INTERFACE的结果来看,方法数排名第一的胖接口IFUR_NW7__ALL,上面定义了755个方法...回到ALVIDA,它可以显示CDS视图的原理数据是什么?使用Jerry之前的文章:SAP错误信息调试的七大武器:让所有的错误信息都定位到PeacockLing的SAT中介绍的第五种方法是使用SAT运行之前写好的ALV程序,在SAT中跟踪结果,可以发现cl_salv_gui_table_ida最后如何从CDS视图中获取值:CL_SQL_STATEMENT->EXECUTE_QUERY在该方法中设置断点,执行报表,断点会触发两次:第一次触发断点,执行的SQL表达式公式:SELECTCOUNT(*)AS"COUNT"FROM"ZFATINF"AS"ZFAT_INTERFACE"WITHPARAMETERS('LOCALE'='EN')第二次触发断点,执行的SQL表达式为:SELECT"ZFAT_INTERFACE"."CLSNAME"AS"CLSNAME","ZFAT_INTERFACE"."METHOD_COUNT"AS"METHOD_COUNT"FROM"ZFATINF"AS"ZFAT_INTERFACE"ORDERBY"ZFAT_INTERFACE"."CLSNAME"ASCLIMIT?抵消?WITHPARAMETERS('LOCALE'='CASE_INSENSITIVE')指向结果集(resultset)的引用lo_result在1049行调用next_package方法后,将CDS视图的前1000条数据赋值给ABAP内表中的lr_data:这个不使用ABAPOPENSQL,而是使用CL_SQL_STATEMENT、CL_SQL_CONNECTION等系列工具数据库访问方式叫做ADBC——ABAPDatabaseConnectivity。ADBC是一组API的集合,可以让ABAP开发者使用ABAP面向对象编程与ABAP服务器原生SQL接口进行交互Jerry之前的文章合集Jerry'sABAP,Java和JavaScript炖,有一篇文章比较ADBC和Java的JDBC:ADBCvsJDBC下图左边是用ADBC读取数据库的代码,右边是Java的JDBC代码.可以简单的对比一下Syntax:最后,ALVIDA可以在哪些版本的ABAPServer上使用?CL_SALV_GUI_TABLE_IDA中有一个DB_CAPABILITIES方法,无需查阅文档:然后查看方法实现中的CL_SALV_IDA_CAPABILITY_SERVICE:当前DB是否支持指定的特性由这些IS方法返回的布尔值决定。从源码来看,很多功能需要ABAP740SP4之后的版本才能支持。谢谢阅读。