一行代碼將SAP CDS view數據以ALV的方式輸出
由于國情原因,ABAP ALV相關的報表開發在國內眾多技術交流群里永遠都是一個熱門話題。

最近Jerry和朋友的技術交流群里,郭爺向大家介紹了ALV Integrated Data Access,能夠輕松實現以ALV格式展示CDS view的數據。
感謝郭爺的介紹,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 ERP https JavaScript
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。