SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer

i042416發表於2020-05-02

本文介紹的兩個知識點比較零碎,所以我放在同一篇文章裡來介紹。

Jerry在做SAP CRM Fiori應用開發時,在學習JavaScript時,讀過這本書:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


書中使用這種語法圖講解JavaScript的語法:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


其實ABAP幫助文件裡也存在類似的語法圖,只是藏在一個不起眼的角落,不為大家所熟知:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


以關鍵字APPEND為例,檢視其語法圖:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


單擊超連結,語法圖就展示出來了,我覺得比幫助文件裡的文字描述直觀得多:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


點選問號,可以檢視圖裡每個組成部分的詳細說明:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


我們有時候發現編寫的ABAP程式碼,執行時不能按照自己的期望工作,往往是因為對ABAP幫助文件裡描述的ABAP關鍵字的功能理解得似是而非。如果你閱讀有的關鍵字幫助文件時,感到晦澀難懂時,不妨換個角度,看一看它的語法圖,說不定能夠豁然開朗。

Jerry之前學習過SAP Commerce,在搭建開發環境執行ant all命令列進行專案構建時,發現會自動生成大量的.java檔案。我的同事告訴我,這些Java檔案的內容,是基於一個叫做Velocity的Java模板引擎生成的。


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


這些位於Hybris安裝包內,以.vm結尾的檔案,即Velocity的模板檔案:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


開啟這些模板檔案,發現由下圖藍色區域所示的靜態內容和紅色區域所示的變數組成。


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


在基於這些模板檔案生成Java檔案時,以$開頭的變數會被執行時計算出的實際值替換,例如$currentDateTime被替換成實際執行ant all命令列構建專案的時間戳。

一個基於上圖模板檔案生成的Java檔案的例子:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


那麼ABAP裡有沒有類似Java Velocity這種模板引擎呢?

和JavaScript一樣,ABAP裡也有字串模板(String Template)的概念:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


ABAP字串模板定義在兩根豎線之內,如上圖第14行程式碼所示。字串模板裡包含靜態的字串文字和ABAP變數名。在執行時,這些充當佔位符的ABAP變數會被其實際包含的值所取代。

下圖是JavaScript裡的字串模板的一個例子,只不過分隔符從ABAP的豎線換成了單引號:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


使用ABAP的字串模板,我們同樣可以實現類似Java Velocity動態生成程式碼的需求。Jerry之前的文章  淺談Java和SAP ABAP的靜態代理和動態代理,以及ABAP面向切面程式設計的嘗試 曾經介紹過。

將需要動態建立的ABAP類的原始碼用字串模板拼湊好,儲存到內表lt_source中,然後呼叫關鍵字GENERATE SUBROUTINE POOL,建立生命週期只存在於當前會話期間內的臨時ABAP類。


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


如果想生成全域性ABAP類,即生成之後能夠持久化在ABAP伺服器上,並且能夠透過SE24和SE80開啟,則將拼湊好的包含ABAP類實現原始碼的內表傳給ABAP類的建立API,即函式SEO_CLASS_CREATE_COMPLETE.

下圖程式碼根據內表mt_sourcecode裡儲存的內容,在$TMP包下建立了一個新的ABAP類。


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


以上就是ABAP最常用的兩種自動生成程式碼的方式。

其實還有第三種方式,應用在SAP一些框架比如BRFplus自動生成ABAP類的場景裡:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


可以透過關鍵字ABAP CODE COMPOSER找到幫助文件。


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


下面Jerry就透過一個實際的例子介紹如何使用ABAP Code Composer自動生成程式碼。

和Java Velocity思路一樣,我們基於一個ABAP模板自動生成新的程式碼。建立一個ABAP Include充當模板,取名ZSINGLETON:


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


模板程式碼如下,定義了一個用單例設計模式(Singleton)實現的ABAP類的基本骨架。


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


這個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.


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


下圖是透過ABAP模板和ABAP Code Composer生成的ABAP類的原始碼,可以看到之前模板裡透過$定義的變數,已經被呼叫模板生成ABAP類時傳入的實際值替換了。


SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


希望這篇文章能讓大家對SAP ABAP裡如何自動生成程式碼的幾種方式有所瞭解,感謝閱讀。

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

SAP ABAP關鍵字語法圖和ABAP程式碼自動生成工具Code Composer


ABAP專題


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

相關文章