Jerry和SAP成都研究院一些新同事聊天时,谈到ABAP和SAP GUI这个话题。很多新同事在加入SAP成都之前,是做Java和C++开发的,习惯了Eclipse/IntelliJ IDEA/Visual Studio这些现代IDE,对于SAP GUI这个比较”复古“的IDE不太适应。

其实还有一个选择:ABAP Development Tools,最初在SAP内部称为ABAP in Eclipse。这个工具SAP在很多场合简称为ADT,本文后续部分也使用这个简称。

简单地说,SAP对Eclipse做了扩展,开发了一些插件,使得开发人员能使用Eclipse完成部分以前在SAP GUI里进行的ABAP开发工作。

本文不去重复网上和SAP帮助文档里对ADT的介绍,而是介绍一些Jerry的原创内容。

Jerry曾经写过一篇文章 那些年我用过的SAP IDE, 里面也提到了ADT。本文对其做详细介绍。

文章目录

1. ADT的工作原理

2. SAP GUI和ADT的关系

3. ADT相比SAP GUI具有的一些独到之处

4. ADT其他一些值得一提的小功能

下面是正文。


1. ADT的工作原理

很多从Eclipse做Java开发的朋友转到ADT后,最大的不习惯就是ADT没办法离线使用。即使是用SAP云平台Neo编程环境里的SDK,开发人员也可以在本地完成开发后,使用命令行或者Eclipse Run As菜单将其发布到SAP云平台上。然而这种用法对于ADT来说行不通,因为后者仍然是一个Client / Server模式中的Client端。从本质上讲,和SAP GUI的区别,仅仅体现在对Netweaver服务器上开发资源的展示和操作方式有所差异罢了。

正因为这种CS架构,每次我们在ADT里操作Netweaver上的ABAP资源时,比如编辑一个ABAP类并保存,实际上都是通过消费ABAP后台暴露出的Restful API来完成的。

这种Restful API的消费行为可以通过打开ADT里的ABAP Communication Log视图来观察。点击Start logging按钮:

在源代码里随便做一些改动,比如增加一个空行,能观察到这个修改动作触发了很多到ABAP后台的HTTP请求:

如果想自己调试这些后台操作的具体实现,用SAP GUI登录ABAP后台,使用事务码SICF找到节点/sap/bc/adt:

在节点处理类的方法HANDLE_REQUEST里设置断点即可调试:

HTTP请求发送到后台之后,上述方法会调用一个统一的入口函数SADT_REST_RFC_ENDPOINT, 该函数和ADT后台框架其他处理逻辑的交互如下图所示:

关于这些HTTP的请求和响应明细,请参考Jerry的博客:

An example to help you understand how does ADT work

https://blogs.sap.com/2014/08/12/an-example-to-help-you-understand-how-does-adt-work/

比如在ADT里对ABAP源代码做语法检查,实际上就是把整段代码做一个Base64编码,然后通过HTTP Post发送到后台,由后台执行对应的检查函数,结果通过HTTP响应返回给ADT前端。

相应的,如果对ADT的前台Java代码感兴趣,请移步ADT安装目录下的plugins文件夹,把里面的jar包反编译出来阅读源代码即可。

2. SAP GUI和ADT的关系

Jerry的个人观点是:二者互为补充。

一方面,对于S/4HANA很多新功能的开发,比如CDS view和AMDP(ABAP Managed Database Procedure), 开发人员没有选择的余地,必须使用ADT,因为SAP GUI不支持这些新功能的开发。

比如在SAP GUI里即使想浏览CDS view的内容也不行,会收到提示:

Please use the ADT Tools in Eclipse to process DDL sources.

而AMDP,就是一个特殊的ABAP类,能够在ABAP方法里执行HANA的SQLScript或者存储过程。

SAP GUI里可以查看AMDP的源代码,但是没法做开发。试图在SAP GUI里进行编辑时,会遇到上面的提示信息:

Class XX contains stored procedures which cannot be changed in SAP GUI

反之,SAP GUI里一些比较传统的开发,ADT也是不支持的。举一些例子。

传统Dynpro程序的Screen开发,双击Screen number,就可以通过点击Layout按钮打开Screen Painter,然后进行所见即所得的Screen布局开发:

然而如果在ADT里试图编辑这个Screen会发生什么事?

ADT会打开一个新的标签页,里面显示一个嵌入的SAP GUI窗口,像Screen Painter和其他一些传统的ABAP开发,均在这个嵌入的SAP GUI里进行。

这就是Jerry在这一小节标题里提到SAP GUI和ADT互为补充的含义:即便使用了ADT,也不意味着能和SAP GUI说再见——很多传统的ABAP开发仍然需要在SAP GUI里进行,哪怕是作为一个窗口嵌入在ADT里。

使用SAP GUI做开发的ABAP顾问,应该明白这三个session的区别:

  • User Session

  • ABAP Session

  • Internal Session

我们每次用SAP GUI登录一个系统,都会产生一个新的User Session,每个User Session里用/o打开一个新的事务码,则是在该User Session里开启了一个新的ABAP Session。一个User Session默认能打开最多6个ABAP Session,可以通过修改系统参数把最大数目扩充为16个。

那么ADT里打开的嵌有SAP GUI窗口的标签页,背后启动的Session类型是什么?经过Jerry测试,答案是User Session。

下图是ADT里打开的两个标签和其对应的两个User Session,用不同颜色来区分。

3. ADT和SAP GUI相比一些独到之处

既然是一个基于Eclipse的IDE,ADT和SAP GUI相比还是存在一些独到之处。

(1) 由于ADT是基于Eclipse这个较之SAP GUI来说更加现代的IDE,从使用习惯上来说更贴近Java/C++程序员。

以ABAP类为例,各个维度的信息在ADT里能在一个屏幕里同时显示,在SAP GUI里一个屏幕显示的信息维度很单一,如果想看其他维度信息,只有通过双击的方式跳转,查看完毕后通过回退键回到正在工作的界面。

又比如所有添加了关注的系统的ST22信息能在一个地方统一监控了,Jerry再也不需要自己开发工具实现了:

(2) ADT提供了很多代码重构的向导(Assistant), Java和C++的开发人员对这些类的重构功能一定不会陌生。

Delete unused variables:

快速删除一个方法里所有定义了但未使用的局部变量,这个功能很实用,SAP GUI不支持。

Extract Methods: 如果一段代码反复出现,可以考虑用重构技术里的方法提取,将其封装成一个方法。

当然还在使用SAP GUI的开发人员要使用ABAP重构向导也是可以的, 根据SAP GUI版本的不同, 入口也稍有差异。

在Jerry的SAP GUI 740版本里,重构向导通过Utilities菜单进入。

740之前的版本,重构向导的打开方式大同小异:

(3) 对SAP GUI一些常用功能的原生支持

所谓原生支持,指用Eclipse原生的页面来提供以前在SAP GUI里实现的功能。

对ABAP开发顾问来说,几乎每天都要在SAP GUI进行的操作就是ABAP类和报表的调试。

有的以前从事Java开发的朋友们转到SAP GUI后,刚上手时使用SAP GUI的调试器总觉得很别扭。一旦使用ADT的调试器,熟悉的味道又回来了。在ADT里调试ABAP和Eclipse里调试Java程序的方式完全一致。

SAP GUI里的单元测试和分支/语句执行覆盖率:

ADT里也提供了单元测试和各种覆盖率审查的原生支持:

SAP GUI里的事务码SAT在ADT里的原生支持:

使用方式和SAP GUI里的没有差别。

(4) 方便的SQL console功能。

以前在SAP GUI里时,有时出于测试目的想写些简单的SQL语言做些验证,还得创建一个报表然后在报表里书写。在ADT里,直接使用SQL console就可省去不必要的报表创建:

(5) 改进的代码版本比较功能

Jerry之前的公众号文章 我用ABAP做过的那些无聊的事情 提到,有的朋友觉得SAP GUI里自带的代码比较工具不是很好用:

如今在ADT里,ABAP开发人员终于可以像Java程序员一样,享受Eclipse提供的便利的代码版本比较功能了:

4. ADT其他一些值得一提的小功能

(1) ADT Link

比如任何一个在ADT里能够查看的资源,都有一个所谓的ADT Link,通过菜单Share Link查看:

这种Link格式如下:

adt://AG3/sap/bc/adt/vit/wb/object_type/tabldt/object_name/ZORDER

通过Open ADT Link菜单,输入上述ADT Link,能直接打开对应的资源,而不需要像SAP GUI那样,需要先运行正确的事务码,进入事务码之后再打开资源。

(2) 自定义编辑器颜色

Jerry和很多程序猿一样,两件T恤衫就能穿一个夏天:

然而对于自己每天都要使用八到十个小时的IDE,其个性化装扮是一点都不能含糊。

如何才能让您的IDE和其他程序猿相比显得与众不同呢?一个办法是个性化字体和背景色。比如Jerry的SAP GUI的个性化设置是这样的,字体必须用程序猿专用的等宽开源字体Inconsolata,这样显得比较专业。

SAP GUI的颜色个性化设置稍显麻烦,需要一项项手动设置。而ADT因为是基于Eclipse,所以主题的个性化就容易多了。如果觉得下面的dark主题还不够酷,

安装一个名叫Eclipse Color Theme的插件,就可以使用这个插件预置好的几十套主题,真正做到一年54周每周换一套了。程序猿衣着可以随便,但IDE或者代码编辑器决不能随便。

总结

说了这么多,Jerry并不是在推销ADT,在我心中SAP GUI和ADT都是优秀的IDE,各有优缺点。我觉得网上流传的程序猿IDE和工具的鄙视链很无聊,与其有时间去鄙视别人,不如把这时间用来深入研究自己每天用的IDE,进一步提高自己单位时间内的工作效率。

祝大家都能愉快地使用SAP GUI和ADT,做到得心应手。感谢阅读。

本文作者:Wang Jerry

本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注“汪子熙”

不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧相关推荐

  1. SAP GUI 登录语言设置

    SAP客户端安装好客户端后就可以登录系统,SAP支持很多种语言登录,但也并不是你想让它显示那种语言都可以,这些显示是需要前台和后台配置的.通常设置涉及到三层: 第一次:sap gui本身的语言显示,这 ...

  2. python获取sap数据_Python驱动SAP GUI完成自动化(选择布局+动态获取节点值)

    讨论过如何利用工具Scripting Tracker录制python操纵SAP GUI的py脚本.软件的录制和生成的代码界面如下: 场景一:实际业务中,除了一些常规步骤,我们可能会驱动SAP GUI中 ...

  3. SAP 远程连接出错 SAP GUI For Windows 7.40 hostname ‘NiHLGetNodeAddr‘ unknown

    SAP 远程连接出错 SAP GUI For Windows 7.40 hostname 'NiHLGetNodeAddr' unknown 最近重装了下SAP GUI 用的是740,今天有个系统需要 ...

  4. PHP 5.6.30连接SAP GUI 730 配置(SAPRFC)

    一.起源: 如何透过PHP访问SAP 这里介绍了PHP连接SAP RFC 的方案,但是版本比较旧,只支持SAP GUI640. SAPRFC Project 这里有更新的版本,支持PHP5.3-5.6 ...

  5. 访问SAP时提示报错SAP GUI for Windows 720窗口

    访问SAP时提示报错SAP GUI for Windows 720窗口,报错 信息为"登录负载均衡错误88:无法连接到消息服务器(rc=9)是否要查看详细的错误信息? 此报错是因为SAP系统 ...

  6. SAP GUI 遇到 Error in Parser-Thread 错误的解决方法

    问题 SAPGUI 打开 ABAP 代码时,GUI 崩溃,遇到错误消息: Error in Parser-Thread 解决方法 参考这个 SAP note. 对于 SAP GUI 740 和 750 ...

  7. 一步步把SAP GUI的事务码配置到SAP Fiori Launchpad里

    今天是2020年1月31日鼠年大年初七,这是Jerry鼠年的第7篇文章,也是汪子熙公众号总共第206篇原创文章. Jerry之前的文章 为什么SAP GUI里的传统事务码能通过Fiori Launch ...

  8. 为什么SAP GUI里的传统事务码能通过Fiori Launchpad启动

    今天是农历鼠年大年初六,本文是鼠年第6篇文章,也是汪子熙公众号第205篇原创文章. 大家这几天宅得怎么样了? Jerry之前的文章 那些年我用过的SAP IDE 曾经提到,我们可以把SAP GUI里的 ...

  9. SAP GUI和Windows注册表

    本文是2020年第16篇原创文章,也是汪子熙公众号总共第199篇原创文章. 今天是猪年最后一天,大年三十.往年的这个时候,我都有点紧张,因为有亲戚会来串门,而亲戚的熊孩子们,出于好奇总是会觊觎我书房里 ...

最新文章

  1. java速查表_Java8新功能速查表 - 穿梭于偶然
  2. ES6 模块化的基本语法——默认导出 与 默认导入、按需导出 与 按需导入、直接导入并执行模块代码
  3. 利用spring session解决共享Session问题
  4. vue路由切换时内容组件的滚动条回到顶部
  5. HTMLTestRunner测试报告
  6. 【AI视野·今日Robot 机器人论文速览 第四期】Wed, 9 Jun 2021
  7. pythoncsv数据类型_python – 从CSV文件行中的值确定数据类型
  8. 『TensorFlow』分布式训练_其二_单机多GPU并行GPU模式设定
  9. python字典类型可迭代_核心数据类型--字典
  10. 第三章(循环) 编程题 2
  11. Apache roller
  12. “矢量网络分析仪”检测同轴电缆的驻波比(SWR)
  13. android studio连接木木模拟器
  14. 还记得那年大明湖畔的Java 7吗
  15. Linux boot 时 USB 的初始化过程分析2
  16. 请使用“与 或 非” 逻辑符号实现“同或”、“异或”逻辑运算,简述实现方案并给出示意电路图。‏
  17. python批量下载数据|工具箱
  18. android x86占比,不输主流安卓机 Android x86系统体验分享(附性能对比)
  19. 小身材也有强劲性能,树莓派2代B型图形界面搞机
  20. 第22课:打包和发布 Electron 应用

热门文章

  1. 学编程当中最重要的三点,一些很正经的建议
  2. 我在大厂,下班了也戴着工牌
  3. 酷派奖励程序员10 万股期权!因代码贡献受 Linux 之父亲自点名赞赏
  4. 新职业风口已至!人社部宣布这10个职业缺口近千万!
  5. ajax得到后端数据一直提示为[object Object]解决方法
  6. 子元素超出父元素宽高是否会报错?
  7. HttpSessionActivationListener接口 学习笔记
  8. 区块链仅仅只是炒作吗
  9. 静态方法和实例化方法的区别
  10. Android ANR产生的原理和如何避免