乐趣区

在SAP云平台ABAP编程环境上编写第一段ABAP程序

距 2017 年秋季的 SAP TechEd 大会上一位大佬 Björn Goerke,SAP’s Chief Technology Officer 宣布了 SAP Cloud Platform 即将支持 ABAP 至今,已经过去了两年的时间。

目前国内的技术媒体平台上,已经有了部分概要性介绍 SAP Cloud Platform ABAP 编程环境的中文文章,但涉及到具体操作细节的文章比较少。

Jerry 最近会做一系列关于如何在 SAP Cloud Platform 上的 ABAP 编程环境上做开发的分享。

其实对于一个已经能够熟练使用 ABAP Development Tools 连接 On-Premises ABAP Netweaver 服务器做开发的传统开发人员而言,迁移到从 On-Premises 迁移到 SAP 云平台上的难度不大,只是需要注意一些开发理念上的转变,这个转变我们在后续具体做开发时会提到。

这种相对平缓的迁移和学习曲线,对于 SAP 全球庞大生态圈的企业和开发人员来说,无疑是一个好消息——这意味着 SAP 正在进行中的向云端数字化转型的旅程里,这些企业和个人也能够加入其中,并且他们以前在 On-Premises 时代积累的宝贵的技术和业务领域知识,能够继续在云时代发光发热。

我曾经在网络上了解到,很多自学 SAP ABAP 的朋友们,面临的第一道关卡就是在自己本地搭一台 Netweaver 服务器出来。作为一个写了 12 年代码的老开发人员,Jerry 也搭过各种本地开发环境,深知这里面的水有多深。我以前的老板,也给我们分享过他当年来 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:

Service Instance Connection,选择 SAP Cloud Platform CloudFoundry environment:

选择 Region,输入用户名密码,前提是你得在这个 region 下有一个 global Account。

下图是我在 SAP Cloud Platform 的 CloudFoundry 环境里的 Global Account:

这个 Global Account 所属的 space 下面我创建了一个 ABAP 系统实例,ID 为 ME1:

这个 ABAP 运行实例具有 16GB 运行内存,64GB 的 HANA 内存。

再回到 ABAP Development Tools, 在项目创建向导里使用 Cockpit 里维护的上述属性:

点 Next,在 ABAP Development Tools 里会看到一个嵌入的登录窗口。因为 Jerry 使用的是 SAP 社区 Mentor 的账号,所以登录窗口显示的标题是:Welcome to Mentors!

在向导里点 Finish 按钮:

点击之后,在 ABAP Development Tools 左侧的项目列表里就能看见创建好的 ABAP Cloud 项目了,接下来在这个项目里编写 ABAP 代码进行开发的方式,和我们用 ADT 连接 On-Premises 系统基本一致。大家可以看到下图创建好的高亮的 ABAP Cloud 项目 (系统 ID 为 ME1), 和其他 On-Premises 上的 ABAP 项目外观上没有区别。

这两种 ABAP 项目的差异在于,ABAP Cloud 项目里能够使用的 ABAP 语言特性,只是传统 ABAP 语言的一个子集,比如传统 ABAP 语言里和 Dynpro 相关的关键字,即只能工作在 SAPGUI 中的那些关键字,因为在 Cloud 环境下不再适用了,所以在 ABAP Development Tools 的 ABAP Cloud 项目里禁止使用。

现在就可以进行第一行 ABAP 程序的编写了。

和 On-Premises 环境下一样,首先创建一个本地包 ZJERRY(local package):

然后弹出提示要求创建 Transport Request(传输请求):

Package 和 Transport Request 都有了之后,就可以开始编码了。
在 On-Premises 时代,我们想用 ABAP 打印 Hello World,直接 SE38 创建一个报表 (Program,如下图所示),然后 WRITE: ‘Hello World’ 就可以了。

在 SAP Cloud Platform 上,新建列表的选项里已经没有了 ABAP Program 这一项。

所以我们只能选择新建一个 ABAP Class:

指定把这个类存储到刚刚新建的 Transport Request 里:

接下来的操作,好比在 Java class 的 static public void main(String[] args) 方法里用 System.out.println 打印 Hello World 一样。

这个新建的 ABAP 类实现 IF_OO_ADT_CLASSRUN 接口, 进行 Hello World 的打印:

激活代码,可以看到和 On-Premises 一样,这个类的各个组成部分需要一起激活。

至于为什么 Jerry 在 IDE 里书写了一段纯文本的 ABAP 源码,但是激活时任务列表里产生了这么多对象,请参考 Jerry 的博客:General properties of ABAP Classes / Interfaces
https://blogs.sap.com/2014/03…
激活完毕后,Run As->ABAP Application(console):

Console 里看到输出:

观察这个类执行的交互日志,发现我们在 ABAP Development Tools 里触发的执行动作,IDE 发送了一个 SAP Cloud Platform 上 endpoint 为 /sap/bc/adt/oo/classrun 的 POST 请求。

这段程序在 SAP 云平台的 ABAP 实例上执行,结果再以 HTTP 响应的方式返回给 IDE。

IDE 发送请求给 SAP Cloud Platform 的具体 Java 代码,可以按照 Jerry 的文章:那些年我用过的 SAP IDE 里介绍的方法去反编译后查看。

在 SAP 云平台上的 ABAP 编程,和传统 On-Premises 系统编程相比,一个显著的差异就是,出于保持简单,降低操作风险的准则,以及在提供操作的灵活性和云平台安全性等方面的折衷考虑,开发人员在 SAP Cloud Platform 的 ABAP 编程环境无法像后者一样能够任意访问 Netweaver 上的资源。

以传统 ABAP 开发人员在 Netweaver 上进行二次开发最常用的 ABAP OPEN SQL 读表的操作为例,这种直接访问数据库表的行为在 SAP Cloud Platform 上会引起语法错误。

即使像下图这样在 ABAP 代码里直接引用 Netweaver 的数据库表,在 SAP 云平台上也是不允许的。

所有对底层资源的访问都必须通过 SAP 定义的白名单里的 API 进行,即下图 Released Objects 里包含的 API。

后续 Jerry 将带来 SAP 云平台 ABAP 编程环境更多开发内容的分析,敬请期待。

要获取更多 Jerry 的原创文章,请关注公众号 ” 汪子熙 ”:

退出移动版