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

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

本文介绍的两个知识点比较零碎,所以我放在同一篇文章里来介绍。

Jerry在做SAP CRM Fiori应用开发时,在学习JavaScript时,读过这本书:

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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


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

image.png


这些位于Hybris安装包内,以.vm结尾的文件,即Velocity的模板文件:

image.png

打开这些模板文件,发现由下图蓝色区域所示的静态内容和红色区域所示的变量组成。

image.png

在基于这些模板文件生成Java文件时,以开 头 的 变 量 会 被 运 行 时 计 算 出 的 实 际 值 替 换 , 例 如 开头的变量会被运行时计算出的实际值替换,例如开头的变量会被运行时计算出的实际值替换,例如currentDateTime被替换成实际执行ant all命令行构建项目的时间戳。


一个基于上图模板文件生成的Java文件的例子:

image.png

那么ABAP里有没有类似Java Velocity这种模板引擎呢?

和JavaScript一样,ABAP里也有字符串模板(String Template)的概念:

image.png

ABAP字符串模板定义在两根竖线之内,如上图第14行代码所示。字符串模板里包含静态的字符串文本和ABAP变量名。在运行时,这些充当占位符的ABAP变量会被其实际包含的值所取代。

下图是JavaScript里的字符串模板的一个例子,只不过分隔符从ABAP的竖线换成了单引号:

image.png

使用ABAP的字符串模板,我们同样可以实现类似Java Velocity动态生成代码的需求。Jerry之前的文章 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试 曾经介绍过。


将需要动态创建的ABAP类的源代码用字符串模板拼凑好,存储到内表lt_source中,然后调用关键字GENERATE SUBROUTINE POOL,创建生命周期只存在于当前会话期间内的临时ABAP类。


image.png

如果想生成全局ABAP类,即生成之后能够持久化在ABAP服务器上,并且能够通过SE24和SE80打开,则将拼凑好的包含ABAP类实现源代码的内表传给ABAP类的创建API,即函数SEO_CLASS_CREATE_COMPLETE.


下图代码根据内表mt_sourcecode里存储的内容,在$TMP包下创建了一个新的ABAP类。


image.png

以上就是ABAP最常用的两种自动生成代码的方式。

其实还有第三种方式,应用在SAP一些框架比如BRFplus自动生成ABAP类的场景里:

image.png

可以通过关键字ABAP CODE COMPOSER找到帮助文档。

image.png

下面Jerry就通过一个实际的例子介绍如何使用ABAP Code Composer自动生成代码。

和Java Velocity思路一样,我们基于一个ABAP模板自动生成新的代码。创建一个ABAP Include充当模板,取名ZSINGLETON:

image.png

模板代码如下,定义了一个用单例设计模式(Singleton)实现的ABAP类的基本骨架。

image.png

image.png

这个ABAP模板里以开 头 和 开头和开头和结尾的变量,作用和Java Velocity里的变量类似,充当占位符的角色,运行时被模板的调用者传入的实际值替换。


而@if和@end, 和Velocity的#if与#end一样,在根据模板生成实际代码时,提供了简单的条件分支处理和控制功能。


我的ZSINGLETON模板里总共定义了4个变量:


I P A R A M − c l a s s I_PARAM-classI

P

ARAM−class

I P A R A M − g l o b a l I_PARAM-globalI

P

ARAM−global

I P A R A M − i n t e r f a c e I_PARAM-interfaceI

P

ARAM−interface

I P A R A M − e x c e p t i o n I_PARAM-exceptionI

P

ARAM−exception

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


image.png

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

image.png

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

相关文章
|
7月前
|
存储
使用 ABAP 代码获得 SAP 系统支持的所有 language 列表
使用 ABAP 代码获得 SAP 系统支持的所有 language 列表
31 0
|
7月前
|
BI
如何用 ABAP 代码创建 SAP CRM IBase
如何用 ABAP 代码创建 SAP CRM IBase
46 0
|
7月前
使用 ABAP 代码删除指定 SAP CRM 系统里 Opportunity 订单的文本
使用 ABAP 代码删除指定 SAP CRM 系统里 Opportunity 订单的文本
47 0
|
1月前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
21 0
|
7月前
|
XML JavaScript 前端开发
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
SAP UI5 本地开发如何实现 XML 和 JavaScript 代码的自动完成和嵌入式 API 文档自动显示试读版
66 0
|
7月前
SAP CRM 如何使用 ABAP 代码读取 Campaign 的数据
SAP CRM 如何使用 ABAP 代码读取 Campaign 的数据
28 0
|
4月前
|
Web App开发 开发者
5. 问题解答:SAP Fiori Launchpad 点了 Logout 之后,背后都运行了哪些代码
5. 问题解答:SAP Fiori Launchpad 点了 Logout 之后,背后都运行了哪些代码
27 0
|
6月前
|
安全 数据库
SAP ABAP 动态生成 ABAP 程序并动态调用的例子代码试读版
SAP ABAP 动态生成 ABAP 程序并动态调用的例子代码试读版
34 0
|
7月前
|
存储 数据处理 数据库
关于 SAP CRM User Status 处理的示例 ABAP 代码
关于 SAP CRM User Status 处理的示例 ABAP 代码
26 0
|
7月前
使用 ABAP 代码打印 SAP 系统指定订单的 Reference Currency 字段
使用 ABAP 代码打印 SAP 系统指定订单的 Reference Currency 字段
19 0