SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer
本文介紹的兩個知識點比較零碎,所以我放在同一篇文章裡來介紹。
Jerry在做SAP CRM Fiori應用開發時,在學習JavaScript時,讀過這本書:
書中使用這種語法圖講解JavaScript的語法:
其實ABAP幫助文件裡也存在類似的語法圖,只是藏在一個不起眼的角落,不為大家所熟知:
以關鍵字APPEND為例,檢視其語法圖:
單擊超連結,語法圖就展示出來了,我覺得比幫助文件裡的文字描述直觀得多:
點選問號,可以檢視圖裡每個組成部分的詳細說明:
我們有時候發現編寫的ABAP程式碼,執行時不能按照自己的期望工作,往往是因為對ABAP幫助文件裡描述的ABAP關鍵字的功能理解得似是而非。如果你閱讀有的關鍵字幫助文件時,感到晦澀難懂時,不妨換個角度,看一看它的語法圖,說不定能夠豁然開朗。
Jerry之前學習過SAP Commerce,在搭建開發環境執行ant all命令列進行專案構建時,發現會自動生成大量的.java檔案。我的同事告訴我,這些Java檔案的內容,是基於一個叫做Velocity的Java模板引擎生成的。
這些位於Hybris安裝包內,以.vm結尾的檔案,即Velocity的模板檔案:
開啟這些模板檔案,發現由下圖藍色區域所示的靜態內容和紅色區域所示的變數組成。
在基於這些模板檔案生成Java檔案時,以$開頭的變數會被執行時計算出的實際值替換,例如$currentDateTime被替換成實際執行ant all命令列構建專案的時間戳。
一個基於上圖模板檔案生成的Java檔案的例子:
那麼ABAP裡有沒有類似Java Velocity這種模板引擎呢?
和JavaScript一樣,ABAP裡也有字串模板(String Template)的概念:
ABAP字串模板定義在兩根豎線之內,如上圖第14行程式碼所示。字串模板裡包含靜態的字串文字和ABAP變數名。在執行時,這些充當佔位符的ABAP變數會被其實際包含的值所取代。
下圖是JavaScript裡的字串模板的一個例子,只不過分隔符從ABAP的豎線換成了單引號:
使用ABAP的字串模板,我們同樣可以實現類似Java Velocity動態生成程式碼的需求。Jerry之前的文章 淺談Java和SAP ABAP的靜態代理和動態代理,以及ABAP面向切面程式設計的嘗試 曾經介紹過。
將需要動態建立的ABAP類的原始碼用字串模板拼湊好,儲存到內表lt_source中,然後呼叫關鍵字GENERATE SUBROUTINE POOL,建立生命週期只存在於當前會話期間內的臨時ABAP類。
如果想生成全域性ABAP類,即生成之後能夠持久化在ABAP伺服器上,並且能夠通過SE24和SE80開啟,則將拼湊好的包含ABAP類實現原始碼的內表傳給ABAP類的建立API,即函式SEO_CLASS_CREATE_COMPLETE.
下圖程式碼根據內表mt_sourcecode裡儲存的內容,在$TMP包下建立了一個新的ABAP類。
以上就是ABAP最常用的兩種自動生成程式碼的方式。
其實還有第三種方式,應用在SAP一些框架比如BRFplus自動生成ABAP類的場景裡:
可以通過關鍵字ABAP CODE COMPOSER找到幫助文件。
下面Jerry就通過一個實際的例子介紹如何使用ABAP Code Composer自動生成程式碼。
和Java Velocity思路一樣,我們基於一個ABAP模板自動生成新的程式碼。建立一個ABAP Include充當模板,取名ZSINGLETON:
模板程式碼如下,定義了一個用單例設計模式(Singleton)實現的ABAP類的基本骨架。
這個ABAP模板裡以$開頭和$結尾的變數,作用和Java Velocity裡的變數類似,充當佔位符的角色,執行時被模板的呼叫者傳入的實際值替換。
而@if和@end, 和Velocity的#if與#end一樣,在根據模板生成實際程式碼時,提供了簡單的條件分支處理和控制功能。
我的ZSINGLETON模板裡總共定義了4個變數:
- $I_PARAM-class$
- $I_PARAM-global$
- $I_PARAM-interface$
- $I_PARAM-exception$
最後寫一個ABAP程式,使用Code Composer消費ZSINGLETON模板,將上述4個變數的實際值傳入,生成一個可以持久化儲存的ABAP單例類,名稱為第18行程式碼指定的ZCL_JERRY.
下圖是通過ABAP模板和ABAP Code Composer生成的ABAP類的原始碼,可以看到之前模板裡通過$定義的變數,已經被呼叫模板生成ABAP類時傳入的實際值替換了。
希望這篇文章能讓大家對SAP ABAP裡如何自動生成程式碼的幾種方式有所瞭解,感謝閱讀。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
ABAP專題
-
Jerry的ABAP, Java和JavaScript亂燉
-
ABAP開發人員未來應該學些什麼
-
Jerry 2017年的五一小長假:
8種經典排序演算法的ABAP實現
-
Jerry的ABAP原創技術文章合集
-
300行ABAP程式碼實現一個最簡單的區塊鏈原型
-
使用Java+SAP雲平臺+SAP Cloud Connector呼叫ABAP On-Premise系統裡的函式
-
在SAP雲平臺的CloudFoundry環境下消費ABAP On-Premise OData服務
-
ABAP vs Java, 蛙泳 vs 自由泳
-
聊聊C語言和ABAP
-
動手使用ABAP Channel開發一些小工具,提升日常工作效率
-
我用ABAP做過的那些無聊的事情
-
不喜歡SAP GUI?
那試試用Eclipse進行ABAP開發吧
-
使用Visual Studio Code編寫和啟用ABAP程式碼
-
你的ABAP程式給佛祖開過光麼?
來試試Jerry這個小技巧
-
在SAP雲平臺ABAP程式設計環境上編寫第一段ABAP程式
-
SAP官方釋出的ABAP程式設計規範
-
ABAP Code Inspector那些隱藏的功能,您都知道嗎?
-
還在用ABAP進行SAP產品的二次開發?來了解下這種全新的二次開發理念吧
-
ABAP Netweaver體內的那些寄生式程式語言
-
從SAP社群上的一篇部落格開始,聊聊SAP產品命名背後的那份情懷
-
雲端的ABAP Restful服務開發
-
如何在SAP雲平臺ABAP程式設計環境裡把CDS view暴露成OData服務
-
使用abapGit在ABAP On-Premises系統和SAP雲平臺ABAP環境之間進行程式碼傳輸
-
30分鐘用Restful ABAP Programming模型開發一個支援增刪改查的Fiori應用
-
Jerry帶您瞭解Restful ABAP Programming模型系列之二:Action和Validation的實現
-
Jerry帶您瞭解Restful ABAP Programming模型系列之三:
雲端ABAP應用除錯
-
SAP雲平臺上的ABAP程式設計環境裡如何消費第三方服務
-
ABAP開發者上雲的時候到了 - 現在大家可以免費使用SAP雲平臺ABAP環境的試用版了
-
學而不思則罔 - SAP雲平臺ABAP程式設計環境的由來和適用場景
-
SAP雲平臺裡的三叉戟應用
-
如何基於Restful ABAP Programming模型開發並部署一個支援增刪改查的Fiori應用
-
SAP 2019 TechEd Key Note解讀:雲時代下SAP從業人員如何做二次開發?
-
有哪些ABAP關鍵字和語法,到了ABAP雲環境上就沒辦法用了?
-
ABAP開發環境終於支援以駝峰命名法自動格式化ABAP變數名了
-
利用ABAP 740的新關鍵字REDUCE完成一個實際工作任務
-
一段讓人瑟瑟發抖的ABAP程式碼
-
昨日萬聖節ABAP怪獸級程式碼謎團,公佈答案啦
-
介紹一種在ABAP核心態進行內表高效拷貝的方法
-
使用SAP Cloud Application Programming模型開發OData的一個實際例子
-
當ABAP遇見普羅米修斯
-
使用ABAP繪製可伸縮向量圖
-
ABAP開發環境語法高亮的那些事兒
-
SAP錯誤訊息除錯之七種武器:
讓所有的錯誤訊息都能被定位
-
使用ABAP操作Excel的幾種方法
-
SAP GUI裡的收藏夾事務碼管理工具
-
SAP GUI和Windows登錄檔
-
有了Debug許可權就能幹壞事?小心了,你的一舉一動盡在系統監控中
-
ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX這些東東是什麼鬼
-
實現ABAP條件斷點的三種方式
-
使用SAT跟蹤監控從瀏覽器開啟的SAP應用的效能和呼叫棧
-
一個13年ABAP老兵的建議:瞭解這些基礎知識,對ABAP開發有百利而無一害
-
SAP ABAP Netweaver容器化, 不可能完成的任務嗎?
-
SAP產品增強技術回顧
-
SAP API開發方法大全
-
淺談Java和SAP ABAP的靜態代理和動態代理,以及ABAP面向切面程式設計的嘗試
-
SAP ABAP應用伺服器的HTTP響應狀態碼(Status Code)
-
SAP ABAP裡存在Java List這種集合工具類麼?CL_OBJECT_COLLECTION瞭解一下
-
ABAP面試題系列:寫一組會出現死鎖(Deadlock)的ABAP程式
- SAP ABAP Netweaver伺服器的標準登入方式講解
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2689683/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用ABAP程式碼生成二維碼(QR Code)
- ABAP和Hybris的原始碼生成工具原始碼
- ABAP文件生成工具
- ABAP Development Tool如何配置程式碼自動完成的快捷鍵dev
- ABAP關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
- 如何用程式碼動態生成ABAP型別型別
- SAP ABAP COMMIT WORK 關鍵字的一些使用要點MIT
- 關於用 ABAP 程式碼手動觸發 SAP CRM organization Model 自動決定的研究
- SAP ABAP RFC介面通用日誌工具:abap fm logger
- 使用Visual Studio Code編寫和啟用ABAP程式碼 (上)
- 如何使用ABAP程式碼建立SAP Product CategoryGo
- 如何使用 ABAP 程式消費 SAP ABAP OData 服務
- ABAP程式碼分析工具 - 事務碼SQF
- 一個好用的SAP ABAP工作程式跟蹤工具
- 使用ABAP建立QR Code(二維碼)
- SAP ABAP和Java的動態代理實現Java
- SAP ABAP CGLIB(Code Generation Library)的模擬實現CGLib
- SAP ABAP 程式之間的呼叫
- 淺談Java和SAP ABAP的靜態代理和動態代理,以及ABAP面向切面程式設計的嘗試Java程式設計
- 一些通過SAP ABAP程式碼審查得出的ABAP程式設計最佳實踐程式設計
- SAP Hybris的build callback和SAP ABAP的SGEN事務碼UI
- SAP ABAP Netweaver 裡的 ABAP 會話概念會話
- SAP ABAP 業務開關和 SAP 電商雲的 Feature Level
- ABAP 動態where語句
- SAP ABAP應用伺服器的HTTP響應狀態碼(Status Code)伺服器HTTP
- SAP SEGW 事物碼裡的 ABAP Editor
- SAP ABAP SQL的execution plan和cacheSQL
- SAP ABAP MIME Repository 和 API 介紹API
- 使用ABAP程式碼提交SAP CRM Survey調查問卷
- 使用ABAP程式碼給SAP CRM Business object建立附件AttachmentObject
- SAP ABAP 釋放 TR 遇到錯誤訊息 ended with return code 8 的含義和處理辦法
- 一些我工作中經常使用的ABAP新語法和函式,關鍵字,可以提高工作效率函式
- 如何讓Sublime Text編輯器支援新的ABAP關鍵字
- SAP ABAP Gateway Client 的 ABAP 實現,重用 HTTP ConnectionGatewayclientHTTP
- ABAP程式碼靜態分析工具SQF - Support Query FrameworkFramework
- SAP ABAP呼叫WEBAPI(一)WebAPI
- My suggestions on SAP ABAP transformationORM
- 具備自動重新整理功能的 SAP ABAP ALV 報表