一行代碼將SAP CDS view數據以ALV的方式輸出

      網友投稿 921 2025-04-04

      由于國情原因,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(接口分離/隔離原則).

      一行代碼將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個方法…

      再回到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小時內刪除侵權內容。

      上一篇:別再糾結Redis/zookeeper,告訴你分布式鎖的正確解決方案
      下一篇:表格中帶格式怎樣刪除(怎么刪除帶格式的表格)
      相關文章
      在线观看亚洲AV日韩A∨| 337P日本欧洲亚洲大胆艺术图| 亚洲国产综合自在线另类| 亚洲人成网77777色在线播放| gogo全球高清大胆亚洲| 亚洲精品国产摄像头| 亚洲欧洲免费无码| 亚洲精品色播一区二区| 亚洲AV永久无码精品网站在线观看| 亚洲综合小说另类图片动图| 一本色道久久88—综合亚洲精品| 亚洲三级高清免费| 亚洲人成欧美中文字幕| 亚洲第一街区偷拍街拍| 日本亚洲高清乱码中文在线观看| 国产精品亚洲专区无码唯爱网| 国产精品自拍亚洲| 亚洲女人被黑人巨大进入| 亚洲精品无码成人片在线观看| 亚洲国产婷婷综合在线精品| 亚洲人成人网站在线观看| 久久精品国产精品亚洲下载| 亚洲欧洲成人精品香蕉网| 亚洲av无码专区国产乱码在线观看 | 33333在线亚洲| 色天使亚洲综合在线观看| 亚洲中文字幕乱码一区| 亚洲爆乳大丰满无码专区| 亚洲成a人在线看天堂无码| 久久久久亚洲AV无码专区网站 | 亚洲精品亚洲人成在线| 国产精品亚洲一区二区无码 | 亚洲国产激情一区二区三区| 最新亚洲成av人免费看| 亚洲VA中文字幕不卡无码| 亚洲精品成人网站在线播放| 国产精品亚洲片在线va| 亚洲AV性色在线观看| 2022中文字字幕久亚洲| 亚洲国产精品无码久久久蜜芽| 内射少妇36P亚洲区|