这是Jerry 2020年的第49篇文章,也是汪子熙公众号总共第232篇原创文章。

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

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个变量:

  • $I_PARAM-class$
  • $I_PARAM-global$
  • $I_PARAM-interface$
  • $I_PARAM-exception$

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

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

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

ABAP专题

  • Jerry的ABAP, Java和JavaScript乱炖
  • ABAP开发人员未来应该学些什么
  • Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
  • Jerry的ABAP原创技术文章合集
  • 300行ABAP代码实现一个最简单的区块链原型
  • 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数
  • 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务
  • ABAP vs Java, 蛙泳 vs 自由泳
  • 聊聊C语言和ABAP
  • 动手使用ABAP Channel开发一些小工具,提升日常工作效率
  • 我用ABAP做过的那些无聊的事情
  • 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
  • 使用Visual Studio Code编写和激活ABAP代码
  • 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
  • 在SAP云平台ABAP编程环境上编写第一段ABAP程序
  • SAP官方发布的ABAP编程规范
  • ABAP Code Inspector那些隐藏的功能,您都知道吗?
  • 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧
  • ABAP Netweaver体内的那些寄生式编程语言
  • 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀
  • 云端的ABAP Restful服务开发
  • 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
  • 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输
  • 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用
  • Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现
  • Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试
  • SAP云平台上的ABAP编程环境里如何消费第三方服务
  • ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了
  • 学而不思则罔 - SAP云平台ABAP编程环境的由来和适用场景
  • SAP云平台里的三叉戟应用
  • 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用
  • SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?
  • 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?
  • ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了
  • 利用ABAP 740的新关键字REDUCE完成一个实际工作任务
  • 一段让人瑟瑟发抖的ABAP代码
  • 昨日万圣节ABAP怪兽级代码谜团,公布答案啦
  • 介绍一种在ABAP内核态进行内表高效拷贝的方法
  • 使用SAP Cloud Application Programming模型开发OData的一个实际例子
  • 当ABAP遇见普罗米修斯
  • 使用ABAP绘制可伸缩矢量图
  • ABAP开发环境语法高亮的那些事儿
  • SAP错误消息调试之七种武器:让所有的错误消息都能被定位
  • 使用ABAP操作Excel的几种方法
  • SAP GUI里的收藏夹事务码管理工具
  • SAP GUI和Windows注册表
  • 有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
  • ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
  • 实现ABAP条件断点的三种方式
  • 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
  • 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害
  • SAP ABAP Netweaver容器化, 不可能完成的任务吗?
  • SAP产品增强技术回顾
  • SAP API开发方法大全
  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
  • SAP ABAP应用服务器的HTTP响应状态码(Status Code)
  • SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下
  • ABAP面试题系列:写一组会出现死锁(Deadlock)的ABAP程序
  • SAP ABAP Netweaver服务器的标准登录方式讲解

网络拓扑图自动生成_SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer相关推荐

  1. eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?

    eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)? 参考文章: (1)eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能( ...

  2. java 生成mysql dto_如何根据动态SQL代码自动生成DTO

    当前的状况 一般做数据库相关开发, 除非学习, 否则很少有人愿意直接使用JDBC.本来Java代码就比较啰嗦了,而直接用JDBC写代码之啰嗦简直有些令人发狂!所以在实际开发过程中,我们通常都会使用一些 ...

  3. java设置代码自动提示_eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能?...

    对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. EcliPSe代码里面的代码提示功能默认是关闭的,只有输入&q ...

  4. ABAP Development Tool如何配置代码自动完成的快捷键

    Keys->Content Assist, 默认是Shift + Tab: Guys, we don't need to remember all possible values for a g ...

  5. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.4.0版)

    TableGo_20210921 v7.4.0 正式版发布,此次版本累计更新如下:           1.新增企业或个人的简单定制版本,为企业和个人提供软实力的增值           2.新增导入 ...

  6. Eclipse 代码自动提示的设置

    1. eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)? 2. http://www.iteye.com/topic/1120919 [C++] ...

  7. Jupyter 编写python代码实现代码自动补齐功能设置实例演示

    Jupyter 代码自动补齐功能 第一章:启用代码自动补齐功能 ① 安装工具包 ② 重启 Jupyter 服务 ③ 功能设置 ④ 效果展示 ⑤ cmd 安装工具包详细过程展示 第一章:启用代码自动补齐 ...

  8. 在SAP API hub自动生成使用ABAP调用API的胶水代码

    登录api.sap.com, 找到自己想用ABAP调用的API: API References里,点击Code Snippt, 即可看到API Hub自动生成的使用ABAP调用该API的代码: 要获取 ...

  9. 能够自动绘制网络拓扑图的软件——WGCLOUD

    WGCLOUD是一款国人开源的分布式监控系统,可以监测所有的网络设备和服务器主机(实体机.虚拟机.云主机),并且是本地化部署,可以在局域网和内网运行. WGCLOUD安装部署好后,当然得有监控主机或数 ...

  10. 道友别走:手写网络拓扑图Illustrator + iconfont+ jquery+css3生成svg特效

    所需工具: 矢量绘图软件:Adobe Illustrator 阿里矢量图标库:https://www.iconfont.cn(下载成将各个矢量图标,下载AI格式,然后用Adobe Illustrato ...

最新文章

  1. axios链接带参数_axios常见传参方式
  2. spark笔记之Scala中的协变、逆变、非变
  3. adb shell 运行时报错“adb server version (26) doesn‘t match this client (39); killing...“的解决方案
  4. 易语言学习笔记(一)
  5. fastReport 绑定DataBand数据源后还是打印出一条数据
  6. 网站跨站点脚本,Sql注入等攻击的处理
  7. onClick,onServerClick,onClientClick
  8. 【优化算法】气味代理优化算法(SAO)【含Matlab源码 1131期】
  9. Schedule定时器cron表达式
  10. 剑网3:指尖江湖手游脚本哪个好呢? 剑网3:指尖江湖手游自动采集IOS脚本
  11. java 四分位算法_Java 四分位算法
  12. 创业和创业团队的感想感悟
  13. 家庭数据中心-私有云服务器定义和选择
  14. Unity3D打印拓展XMDebug
  15. Redis学习之setex命令
  16. 这几款浏览器插件提升科研效率,2023年你安装上了吗
  17. 四十七、批量操作数据
  18. Java如何使用直接内存?
  19. 如何利用AI(ChatGPT、NewBing、PHIND、YouChat)实现多智能体系统一致性仿真的代码编写
  20. UCML-领先的B/S应用快速开发工具,基于组件重用和应用框架重用,支持.NET体系,直接生成C#源码;

热门文章

  1. IntelliJ 中类似于Eclipse ctrl+o的是ctrl+F12
  2. 【BZOJ】3524: [Poi2014]Couriers
  3. Python字符串、元组、列表、字典互相转换的方法
  4. JQuery iframe页面通过parent方法操作父页面中的元素与方法(实例讲解)
  5. CentOS 6.5 shell中su切换自动输入密码
  6. BOJ 2773 第K个与m互质的数
  7. java list 过滤数据库_jdk8对list的各种处理实例详解,包括去重,排序,过滤,分组,统计...
  8. pytorch中模型结构图的可视化
  9. 自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)
  10. golang ide 环境搭建_新手引导 — Golang后端开发环境搭建