写点什么

SAP ABAP 关键字语法图和 ABAP 代码自动生成工具 Code Composer

作者:Jerry Wang
  • 2022 年 8 月 15 日
    上海
  • 本文字数:1824 字

    阅读完需:约 6 分钟

SAP ABAP 关键字语法图和 ABAP 代码自动生成工具 Code Composer

本文介绍的两个知识点比较相关,所以笔者放在同一篇文章里来介绍。


笔者在 SAP 成都研究院做 SAP CRM Fiori 应用开发时,在学习 JavaScript 时,读过这本书:



书中使用这种语法图讲解 JavaScript 的语法:



其实 ABAP 帮助文档里也存在类似的语法图,只是藏在一个不起眼的角落,不为大家所熟知:



以关键字 APPEND 为例,查看其语法图:



单击超链接,语法图就展示出来了,我觉得比帮助文档里的文字描述直观得多:



点击问号,可以查看图里每个组成部分的详细说明:



我们有时候发现编写的 ABAP 代码,运行时不能按照自己的期望工作,往往是因为对 ABAP 帮助文档里描述的 ABAP 关键字的功能理解得似是而非。如果你阅读有的关键字帮助文档时,感到晦涩难懂时,不妨换个角度,看一看它的语法图,说不定能够豁然开朗。


Jerry 之前学习过 SAP Commerce,在搭建开发环境执行 ant all 命令行进行项目构建时,发现会自动生成大量的.java 文件。我的同事告诉我,这些 Java 文件的内容,是基于一个叫做 Velocity 的 Java 模板引擎生成的。


Velocity 是一个基于 Java 的模板引擎。


它是一个开源 Web 框架,旨在用作 MVC 架构中的视图组件,它提供了一些现有技术(如 JSP)的替代方案。

Velocity 可用于生成 XML 文件、SQL、PostScript 和大多数其他基于文本的格式,当然也包含 .java 文件。


Velocity 模板语言 (VTL) 通过使用 VTL 引用提供了将动态内容合并到网页中的最简单和最干净的方法。


速度模板中的 VTL 引用以 $ 开头,用于获取与该引用关联的值。 VTL 还提供了一组指令,可用于操作 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 个变量:







最后写一个 ABAP 程序,使用 Code Composer 消费 ZSINGLETON 模板,将上述 4 个变量的实际值传入,生成一个可以持久化保存的 ABAP 单例类,名称为第 18 行代码指定的 ZCL_JERRY.



下图是通过 ABAP 模板和 ABAP Code Composer 生成的 ABAP 类的源代码,可以看到之前模板里通过 $定义的变量,已经被调用模板生成 ABAP 类时传入的实际值替换了。



希望这篇文章能让大家对 SAP ABAP 里如何自动生成代码的几种方式有所了解,感谢阅读。

发布于: 刚刚阅读数: 4
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
SAP ABAP 关键字语法图和 ABAP 代码自动生成工具 Code Composer_Java_Jerry Wang_InfoQ写作社区