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,做到得心应手。感谢阅读。

更多阅读

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

不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧的更多相关文章

  1. VBA驱动SAP GUI完成界面元素值初始化

    小爬日常利用VBA完成SAP GUI自动化时,经常被这个问题困扰:我们进入一个事务代码界面时,如FBL1N(供应商行项目显示),很多的 GuiTextField(文本框)对象.GuiCheckBox( ...

  2. SAP GUI的配置文件

    GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...

  3. SAP GUI SAPLOGON.INI

    GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...

  4. Mac OS X 中使用SAP GUI的方法

    下载sap gui for mac 730 解压后 安装之前需要去oracle 官网下载jdk 6 然后运行 安装完成后配置登陆端 新建连接时,只需要配置Advanced 页签:勾选Expert Mo ...

  5. SAP GUI 750 安装包 及 补丁3 共享

    SAP GUI 750 安装包 及 补丁3 共享 链接: https://pan.baidu.com/s/1hstkfUs%20 密码: ggbz -------------------------- ...

  6. SAP GUI个性化设置

    大概从GUI730开始,GUI品牌化一直不被默认支持,在GUI设置选项里处于灰色状态,如下图: 不过用户还是可以修改注册表的方式来进行修改,让它可以设置! 首先运行Regedit,在目录:HKEY_L ...

  7. 关闭 synactive guixt. 在sap gui的右上角一个标志里,将 active guixt 选项去掉即可。

    关闭 synactive guixt.  在sap gui的右上角一个标志里,将 active guixt 选项去掉即可.

  8. Python结合SAP GUI Script操作sap的简易教程

    众所周知,如果要用Python做一些桌面WIN32应用的自动化工作,就需要用到著名的pywin32尤其是其中的win32com.client模块,pywin32的安装不能直接通过pip install ...

  9. 配置SAP GUI FOR HTML(通过WEB方式登录)

    配置SAP GUI FOR HTML(通过WEB方式登录) SAP系统可以通过安装 SAP GUI.SAP GUI FOR JAVA.SAP GUI WEB FOR JAVA.SAP GUI FOR ...

随机推荐

  1. Spring3注解零配置

    我们在以前学习 Spring 的时候,其所有的配置信息都写在 applicationContext.xml 里,大致示例如下: java代码: 查看复制到剪贴板打印     OracleDriver& ...

  2. 为一个vector<cv::KeyPoint*> 类型的变量做初始化

    vector<cv::KeyPoint*> keypoints; int N; keypoints = vector<cv::KeyPoint*>(N, static_cast ...

  3. Oracle tns 协议

    下面是翻译国外的一篇博客,原文连接如下: https://thesprawl.org/research/oracle-tns-protocol/ 简介 TNS(Transparent Network ...

  4. 初步使用redis

    1.导入jar包 2.新建类: public class JedisAdapter { private static final Logger logger = LoggerFactory.getLo ...

  5. Umbraco image中使用Crop URL

    需要在Umbraco 的image中使用crop URL.首先你需要取出这个image作为IPublishedContent 有以下两种方法 第一种: var imageId = Model.Cont ...

  6. 2013年第四届蓝桥杯国赛试题(JavaA组)

    1.结果填空 (满分12分)2.结果填空 (满分15分)3.结果填空 (满分10分)4.程序设计(满分16分)5.程序设计(满分20分)6.程序设计(满分27分) 1.标题:填算式 请看下面的算式: ...

  7. 性能压测,SQL查询异常

    早上测试对性能压测,发现取sequence服务大量超时报错,查询线上的监控SQL: 大量这个查询,我在DeviceID和Isdelete上建有复合索引,应该很快,而且我测试了一下,取值,执行效率很高, ...

  8. HTML5学习笔记(一)相关概率

    HTML5的设计目的是为了在移动设备上支持多媒体. 声明:<!DOCTYPE html> 注意:对于中文网页需要使用 <meta charset="utf-8"& ...

  9. sqlserver的语句和mysql语句

    感谢原创 sqlserver和mysql基本语句的对比 http://blog.csdn.net/kk185800961/article/details/47044751 sqlserver中常见的语 ...

  10. 获得用户IP、城市、国家等信息的api接口

    1 这个信息比较多 https://api.ipdata.co/?api-key=test <script> $.get("https://api.ipdata.co?api-k ...