一行程式碼將SAP CDS view資料以ALV的方式輸出

i042416發表於2020-11-23

由於國情原因,ABAP ALV相關的報表開發在國內眾多SAP技術交流群裡永遠都是一個熱門話題。

最近Jerry和朋友的技術交流群裡,郭爺向大家介紹了ALV Integrated Data Access,能夠輕鬆實現以ALV格式展示CDS view的資料。


一行程式碼將SAP CDS view資料以ALV的方式輸出


感謝郭爺的介紹,Jerry因為工作原因不會進行SAP Dynpro的程式設計,所以也不知道這個ALV IDA的存在。網上搜了一下,發現早在2018年就有SAP從業者寫過介紹它的部落格了:


一行程式碼將SAP CDS view資料以ALV的方式輸出


因為使用確實非常簡單,Jerry不會重複部落格裡的內容,對其詳細用法感興趣的朋友,請移步這篇 SAP社群部落格: SAP List Viewer with integrated Data Access ALV with IDA.

如下圖所示,我在SAPGUI裡寫了一個報表,只用一行語句就能完成一個名叫ZFAT_INTERFACE這個CDS view的ALV展示工作。


一行程式碼將SAP 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)和介面上定義的方法個數。


一行程式碼將SAP CDS view資料以ALV的方式輸出


CDS view實現原始碼如下:


一行程式碼將SAP CDS view資料以ALV的方式輸出


為什麼要搞這樣一個CDS view出來?Jerry曾經給SAP成都研究院的同事們做過一個物件導向程式設計的培訓,裡面講到了一個原則: Interface Segregation Principle(介面分離/隔離原則).


一行程式碼將SAP CDS view資料以ALV的方式輸出


介面隔離準則期望達到的效果是,客戶類不應被強迫依賴於那些它們實際並不需要的介面。相反地,一個介面定義的方法數量越多,其實現類越容易受制於該介面。例如,一個客戶類A實現了一個介面,該介面包含了客戶類不需要的方法,但這些方法是其他客戶類所需要的,那麼當其他客戶類由於某種原因需要對介面進行修改時,這個修改也將影響客戶類A。通過介面隔離準則,我們儘可能地避免這種不必要的耦合,比如上圖中把包含了Print,Staple, Copy和Fax四個方法的胖介面Job,拆分成了四個各自只包含一個獨立方法的介面。

講完了介面隔離原則之後,我忽然有了一個想法,SAP ABAP系統裡大量的歷史遺留程式碼裡,是否存在著定義了大量方法的胖介面呢?於是就開發了上述的CDS view一探究竟。

從使用ALV IDA顯示CDS view ZFAT_INTERFACE的結果看,方法數量排名第一的胖介面IFUR_NW7__ALL,其上定義了755個方法......


一行程式碼將SAP CDS view資料以ALV的方式輸出


再回到ALV IDA,它能夠顯示CDS view資料的原理是什麼?

使用Jerry之前文章:  SAP錯誤訊息除錯之七種武器:讓所有的錯誤訊息都能被定位 裡介紹的第五種辦法,孔雀翎之SAT,即使用SAT執行之前編寫的ALV程式,在SAT跟蹤結果裡,就能找到cl_salv_gui_table_ida最後是如何從CDS view裡取值的:

CL_SQL_STATEMENT->EXECUTE_QUERY


一行程式碼將SAP CDS view資料以ALV的方式輸出


在該方法裡設定斷點, 執行報表,斷點會觸發兩次:


一行程式碼將SAP CDS view資料以ALV的方式輸出


斷點第一次觸發,執行的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' )


一行程式碼將SAP CDS view資料以ALV的方式輸出


一旦指向結果集(result set)的引用lo_result在1049行程式碼呼叫next_package方法,CDS view的前1000條資料就被賦值到了ABAP內表lr_data裡:


一行程式碼將SAP CDS view資料以ALV的方式輸出


這種不採用ABAP OPEN SQL,而用CL_SQL_STATEMENT,CL_SQL_CONNECTION等系列工具類的資料庫訪問方式,稱為 ADBC - ABAP Database Connectivity.

ADBC是一套API的集合,能允許ABAP開發人員使用ABAP物件導向程式設計的方式,同ABAP伺服器的原生SQL介面進行互動。


一行程式碼將SAP CDS view資料以ALV的方式輸出


Jerry之前的文章集合  Jerry的ABAP, Java和JavaScript亂燉,裡面有一篇將ADBC和Java的JDBC做了對比:

ADBC vs JDBC

下圖左邊是用ADBC讀取資料庫的程式碼,右邊是Java的JDBC程式碼,大家可以簡單對比一下語法:


一行程式碼將SAP CDS view資料以ALV的方式輸出


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

無需查閱文件,直接檢視原始碼,在CL_SALV_GUI_TABLE_IDA有個DB_CAPABILITIES方法:


一行程式碼將SAP CDS view資料以ALV的方式輸出


進而檢視該方法實現裡的CL_SALV_IDA_CAPABILITY_SERVICE:


一行程式碼將SAP CDS view資料以ALV的方式輸出


當前DB是否支援指定的特性,通過這些IS方法返回的布林值決定。


一行程式碼將SAP CDS view資料以ALV的方式輸出


從原始碼看,很多特性需要ABAP 740 SP4之後的版本才能支援。


一行程式碼將SAP CDS view資料以ALV的方式輸出


感謝閱讀。

ABAP專題

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":

一行程式碼將SAP CDS view資料以ALV的方式輸出


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2736246/,如需轉載,請註明出處,否則將追究法律責任。

相關文章