在云平台 ABAP 编程环境上编写第一段 ABAP 程序
![在云平台 ABAP 编程环境上编写第一段 ABAP 程序](https://static001.geekbang.org/infoq/db/dbe61870039f1e3010ef4508d966c410.png)
距 2017 年秋季的 SAP TechEd 大会上一位大佬 Björn Goerke,SAP Chief Technology Officer 宣布了 SAP Cloud Platform 即将支持 ABAP 至今,已经过去了几年的时间。
目前国内的技术媒体平台上,已经有了部分概要性介绍 SAP Cloud Platform ABAP 编程环境的中文文章,但涉及到具体操作细节的文章比较少。
其实对于一个已经能够熟练使用 ABAP Development Tools 连接 On-Premises ABAP Netweaver 服务器做开发的传统开发人员而言,迁移到从 On-Premises 迁移到 SAP 云平台上的难度不大,只是需要注意一些开发理念上的转变,这个转变我们在后续具体做开发时会提到。
![](https://static001.geekbang.org/infoq/3a/3a5241394c82b4861a4ac81d58fac867.png)
这种相对平缓的迁移和学习曲线,对于 SAP 全球庞大生态圈的企业和开发人员来说,无疑是一个好消息——这意味着 SAP 正在进行中的向云端数字化转型的旅程里,这些企业和个人也能够加入其中,并且他们以前在 On-Premises 时代积累的宝贵的技术和业务领域知识,能够继续在云时代发光发热。
很多自学 SAP ABAP 的开发者们,面临的第一道关卡就是在自己本地搭一台 Netweaver 服务器出来。作为一个写了 15 年代码的老开发人员,笔者也搭过各种本地开发环境,深知这里面的水有多深。我以前的 Manager,也给我们分享过他当年来 SAP 成都研究院面试的时候,自己本地也搭过 Netweaver,并且短短几天啃完几百页的 Netweaver 英文文档的经历。
相信每一位在本地搭建 Netweaver 的 ABAP 学习者,当成功看到 Hello World 输出的那一刻,成就感一定爆棚。
然而,当 Jerry 第一次在 SAP Cloud Platform 的 ABAP 编程环境上看到 Hello World 时,却没有多少成就感,因为直接按照 ABAP Development Tool 里的项目创建向导一步步操作就可以了,过程比较简单易懂——这也体现了云时代到来后,对传统应用开发人员工作方式的影响:无需费神去关心底层硬件或者操作系统等资源,可以把精力集中于应用程序逻辑的编写上。换言之,SAP 负责管理和维护底层 HANA 数据库和中层的 ABAP runtime,用户只需管理顶层的 ABAP 应用代码。使用 ABAP Development Tools 的项目创建向导:New->ABAP Cloud Project:
![](https://static001.geekbang.org/infoq/58/5845dde36e4ab4904e331522c6d093dd.png)
Service Instance Connection,选择 SAP Cloud Platform CloudFoundry environment:
![](https://static001.geekbang.org/infoq/47/4706c8c9c48ac331cf376a43b789681d.png)
选择 Region,输入用户名密码,前提是你得在这个 region 下有一个 global Account。
![](https://static001.geekbang.org/infoq/9f/9fcd5e7437c7a8b7aaf06fdbb6899bb2.png)
下图是我在 SAP Cloud Platform 的 CloudFoundry 环境里的 Global Account:
![](https://static001.geekbang.org/infoq/23/234d090e0fbf39220cebae09daf584d8.png)
这个 Global Account 所属的 space 下面我创建了一个 ABAP 系统实例,ID 为 ME1:
![](https://static001.geekbang.org/infoq/ff/ff70aee3967936734f05529c1906690c.png)
这个 ABAP 运行实例具有 16GB 运行内存,64GB 的 HANA 内存。
![](https://static001.geekbang.org/infoq/07/07cec390b175b3c5b605d435591a62a5.png)
再回到 ABAP Development Tools, 在项目创建向导里使用 Cockpit 里维护的上述属性:
![](https://static001.geekbang.org/infoq/c2/c2d3932dc437772b3f2d308f5de4162b.png)
点 Next,在 ABAP Development Tools 里会看到一个嵌入的登录窗口。因为 Jerry 使用的是 SAP 社区 Mentor 的账号,所以登录窗口显示的标题是:Welcome to Mentors!
![](https://static001.geekbang.org/infoq/ba/ba8dee982922ad5a4cfc6936c9a233e3.png)
在向导里点 Finish 按钮:
![](https://static001.geekbang.org/infoq/4b/4ba83f2d09d8a6c4b4ecdb1b2494465b.png)
点击之后,在 ABAP Development Tools 左侧的项目列表里就能看见创建好的 ABAP Cloud 项目了,接下来在这个项目里编写 ABAP 代码进行开发的方式,和我们用 ADT 连接 On-Premises 系统基本一致。大家可以看到下图创建好的高亮的 ABAP Cloud 项目(系统 ID 为 ME1), 和其他 On-Premises 上的 ABAP 项目外观上没有区别。
![](https://static001.geekbang.org/infoq/9e/9eef87e762b399c276f268f41d56e215.png)
这两种 ABAP 项目的差异在于,ABAP Cloud 项目里能够使用的 ABAP 语言特性,只是传统 ABAP 语言的一个子集,比如传统 ABAP 语言里和 Dynpro 相关的关键字,即只能工作在 SAPGUI 中的那些关键字,因为在 Cloud 环境下不再适用了,所以在 ABAP Development Tools 的 ABAP Cloud 项目里禁止使用。
现在就可以进行第一行 ABAP 程序的编写了。和 On-Premises 环境下一样,首先创建一个本地包 ZJERRY(local package):
![](https://static001.geekbang.org/infoq/00/00d55ea7f1f698cddfbcb021ec1f3caf.png)
然后弹出提示要求创建 Transport Request(传输请求):
![](https://static001.geekbang.org/infoq/dd/ddb2272772dc1c57af529ba19f17db4c.png)
Package 和 Transport Request 都有了之后,就可以开始编码了。在 On-Premises 时代,我们想用 ABAP 打印 Hello World,直接 SE38 创建一个报表(Program,如下图所示),然后 WRITE: 'Hello World'就可以了。
![](https://static001.geekbang.org/infoq/3d/3d1e29a6ada90106f11bd39b58e4ad9b.png)
在 SAP Cloud Platform 上,新建列表的选项里已经没有了 ABAP Program 这一项.
![](https://static001.geekbang.org/infoq/92/9265d7d9dd3267c332103a759d8c3fd5.png)
所以我们只能选择新建一个 ABAP Class:
![](https://static001.geekbang.org/infoq/f6/f6aae783a5deed1b28e3851e24eee54d.png)
指定把这个类存储到刚刚新建的 Transport Request 里:
![](https://static001.geekbang.org/infoq/8c/8c91f28dd4e88385590a03313328017e.png)
接下来的操作,好比在 Java class 的 static public void main(String[] args)方法里用 System.out.println 打印 Hello World 一样。这个新建的 ABAP 类实现 IF_OO_ADT_CLASSRUN 接口, 进行 Hello World 的打印:
![](https://static001.geekbang.org/infoq/d0/d0689b691a4e48209592142fd218a114.png)
激活代码,可以看到和 On-Premises 一样,这个类的各个组成部分需要一起激活。
![](https://static001.geekbang.org/infoq/ee/ee652e1d32a49c74236126245e763e57.png)
激活完毕后,Run As->ABAP Application(console):
![](https://static001.geekbang.org/infoq/c8/c80698c100d875768595b9187afcc908.png)
Console 里看到输出:
![](https://static001.geekbang.org/infoq/a2/a21a0f38371383290f60bae0b9bfe668.png)
观察这个类执行的交互日志,发现我们在 ABAP Development Tools 里触发的执行动作,IDE 发送了一个 SAP Cloud Platform 上 endpoint 为/sap/bc/adt/oo/classrun 的 POST 请求。
![](https://static001.geekbang.org/infoq/f0/f08e1167ab01adf5105eb8b95bdb4076.png)
这段程序在 SAP 云平台的 ABAP 实例上执行,结果再以 HTTP 响应的方式返回给 IDE。
![](https://static001.geekbang.org/infoq/ca/cad50d21fc8095bbe40e05e05ab25e9a.png)
![](https://static001.geekbang.org/infoq/75/75898d41bea5fd1bffa7af2d0096c619.png)
在 SAP 云平台上的 ABAP 编程,和传统 On-Premises 系统编程相比,一个显著的差异就是,出于保持简单,降低操作风险的准则,以及在提供操作的灵活性和云平台安全性等方面的折衷考虑,开发人员在 SAP Cloud Platform 的 ABAP 编程环境无法像后者一样能够任意访问 Netweaver 上的资源。
以传统 ABAP 开发人员在 Netweaver 上进行二次开发最常用的 ABAP OPEN SQL 读表的操作为例,这种直接访问数据库表的行为在 SAP Cloud Platform 上会引起语法错误。
即使像下图这样在 ABAP 代码里直接引用 Netweaver 的数据库表,在 SAP 云平台上也是不允许的。
![](https://static001.geekbang.org/infoq/8b/8b5b9253399c514dfebfcada0ab4d4f4.png)
所有对底层资源的访问都必须通过 SAP 定义的白名单里的 API 进行,即下图 Released Objects 里包含的 API。
![](https://static001.geekbang.org/infoq/66/664a24d835f1548b8aaad70bd92e0446.png)
总结
本文首先介绍了 ABAP 编程语言从本地部署环境迁移到云端的历史必然性,接着从 Hello World 级别的例子出发,介绍了 ABAP 云端编程环境里如何创建最简单的 Class,以及云端区别于本地环境的编程注意事项。
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/6b8bfc7917898fabd0aa8743e】。文章转载请联系作者。
评论