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個變量:

  • IPARAMclassI_PARAM-class
  • IPARAMglobalI_PARAM-global
  • IPARAMinterfaceI_PARAM-interface
  • IPARAMexceptionI_PARAM-exception

最後寫一個ABAP程序,使用Code Composer消費ZSINGLETON模板,將上述4個變量的實際值傳入,生成一個可以持久化保存的ABAP單例類,名稱爲第18行代碼指定的ZCL_JERRY.

下圖是通過ABAP模板和ABAP Code Composer生成的ABAP類的源代碼,可以看到之前模板裏通過$定義的變量,已經被調用模板生成ABAP類時傳入的實際值替換了。

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

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

ABAP專題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章