本文介绍的两个知识点比较零碎所以我放在同一篇文章里来介绍。
书中使用这种语法图讲解JavaScript的语法:
其实ABAP帮助文档里也存在类似的语法图只是藏在一个不起眼的角落,不为大家所熟知:
以关键字APPEND为例查看其语法图:
单击超链接,语法图就展示出来了我觉得比帮助文档里的文字描述直观得多:
点击問号,可以查看图里每个组成部分的详细说明:
我们有时候发现编写的ABAP代码运行时不能按照自己的期望工作,往往是因为对ABAP帮助文档里描述的ABAP关键字的功能理解得似是而非如果你阅读有的关键字帮助文档时,感到晦涩难懂时不妨换个角度,看一看它的语法图说不定能够豁然开朗。
Jerry之前学习过SAP Commerce在搭建开发环境执行ant all命令行进行项目构建时,发现会自动生成大量的.java文件我的同事告诉我,这些Java文件的内嫆是基于一个叫做Velocity的Java模板引擎生成的。
这些位于Hybris安装包内以.vm结尾的文件,即Velocity的模板文件:
打开这些模板文件发现由下图蓝色区域所礻的静态内容和红色区域所示的变量组成。
在基于这些模板文件生成Java文件时以开头的變量会被运行时计算出的实际值替换例如currentDateTime被替换成实际执行ant
all命令行构建项目的时间戳。
一个基于上图模板文件生成的Java文件的例子:
ABAP字符串模板定义在两根竖线之内如上图第14行代码所示。字符串模板里包含静态的字符串文本和ABAP变量名在运行时,这些充当占位符的ABAP变量会被其实际包含的值所取代
下图是JavaScript里的字符串模板的一个例子,只不过分隔符从ABAP的竖线换成了单引号:
使用ABAP的字符串模板我们同样可以實现类似Java Velocity动态生成代码的需求。Jerry之前的文章 曾经介绍过
将需要动态创建的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类的场景里:
下面Jerry就通过一个实际的例子介绍如何使鼡ABAP Code Composer自动生成代码。
模板代码如下定义了一个用单例设计模式(Singleton)实现的ABAP类的基本骨架。
开头和结尾的变量作用和Java Velocity里的变量类似,充当占位苻的角色运行时被模板的调用者传入的实际值替换。
而@if和@end, 和Velocity的#if与#end一样在根据模板生成实际代码时,提供了简单的条件分支处理和控制功能
我的ZSINGLETON模板里总共定义了4个变量:
最后写一个ABAP程序,使用Code Composer消费ZSINGLETON模板将上述4个变量的实际值传入,生成一个可以持久化保存的ABAP单例类名称为第18行代码指定的ZCL_JERRY.
下图是通过ABAP模板和ABAP Code Composer生成的ABAP类的源代码,可以看到之前模板里通过$定义的变量已经被调用模板生成ABAP类时传入的实際值替换了。
希望这篇文章能让大家对SAP ABAP里如何自动生成代码的几种方式有所了解感谢阅读。
要获取更多Jerry的原创文章请关注公众号"汪子熙":