我用ABAP作过的那些无聊的事情

国庆大假立刻就要来临了,咱们聊点轻松的话题,关于假期。程序员

Jerry的成都同事李贝宁(Li Ben), 《SAP成都研究院李三郎:SCP Application Router简介》的做者,有一次11月份的时候和Jerry一块儿去德国出差,不解地问到:德国好歹也有八千多万人口,怎么街上冷冷清清的几乎看不到人呢?算法

对于这个问题Jerry也没有答案。并且这种现象在德国的法定节假日里更加突出。数据库

Jerry的文章《Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现》曾经提到,去年我在德国待了三个月,最难熬的就是德国几乎每月都有那么几天的法定节假日,由于既然放假,SAP总部的员工食堂就不开了,并且商店也所有关门,得提早一天备好干粮。微信

SAP德国总部员工食堂的伙食是很是很是好的,就在Jerry写这段文字时,仿佛又闻到了中午餐点时走近食堂,从里面散发出食物的香味。编辑器

总部员工食堂菜的味道有甜有酸,有些汤的味道稍稍带着苦味,没有辣味,正好Jerry讨厌吃辣,因此口味很是适合我,我一连吃了90天也不以为腻。ide

荤素搭配很合理,并且肉和菜吃不够随便加,管饱,对于Jerry这种饭量大的程序猿来讲简直是天堂。函数

这些食物太美味了,每顿饭结束后我都是这个状态:工具

然而到了德国法定节假日和星期日,这一切都消失了。德国商店的营业时间一直按照20世纪50年代的规定执行的:商店在工做日最晚开到下午六点半,周六最晚下午2点关闭,周日全天不营业性能

因而,2017年五一小长假,4月29日~5月1日三天,Jerry只好靠这些干粮充饥,三天一共只花了9欧元。区块链

Jerry是一个程序猿,对吃的不挑剔,Zopf很经饿。什么是Zopf?

我住在德国乡下,平时也可贵见到人,更别提节假日了。街上全是这种风格:

要不是耳边传来偶尔驶过的汽车和德国小朋友在本身花园里嬉戏的声音,Jerry还觉得本身来到了科幻电影《我是传奇》里的世界。

五一小长假的最后一天,个人同事Liang Simon(梁亚舒)邀请我到他的家中,吃了一顿地道的德国烤肉。在此以前啃了两天Zopf的我,以为这是我这辈子吃过的最美味的烤肉!烤肉一扫光后,Simon的老婆又端出一个本身动手作的巧克力蛋糕。

Jerry吃完以后,内心遗憾地想:当初这个蛋糕制做的时候,半径再大几厘米就更完美了。

在这种状况下,做为一个程序猿,娱乐的方式就只剩撸代码了。因此本文提到的这些东西都是Jerry在德国节假日里无聊的产物,对于ABAP顾问的实际工做可能帮助不大。不过由于是过节,你们当看看小说消遣好了。

1. Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

把本科学过的八种排序算法用ABAP逐一实现了一次。

SAP社区上有一位网友Sinai可能以为我是吃饱了撑着没事干(这却是事实),毕竟在ABAP里要排序直接使用关键字SORT便可。

不过幸亏还有另外的网友跳出来为我辩护,中心思想就四个字:开心就好

2. 不用四则运算符比较两个整数的大小

看文字描述就能感受到这又是一个让程序猿感受很囧的需求。

使用位操做,JavaScript能够很优雅地实现:

Java也没问题:

轮到ABAP就麻烦了。由于ABAP的BIT-XOR这种位操做不支持整型类型。

既然语言层面不支持,就只好本身动手模拟了。

我用一个尺寸为32的ABAP内表存储一个32位整数的每个bit的值,而后基于这个内表模拟了整数的与或非以及异或操做,还有按位左移,右移。

让ABAP整数也能像上图JavaScript和Java那样支持按位逻辑操做的模拟实现代码在个人博客里:

Bitwise operation ( OR, AND, XOR ) on ABAP Integer

用这种模拟方式实现的ABAP代码比JavaScript和Java足足长了一倍。虽然丑陋,但好歹实现了题目的需求。

3. 给出尽量多的计算两个整数和的方案

下面的答案能够概括为:

  • 普通程序员的答案

  • 2B程序员的答案

  • 文艺程序员的答案

  • 闲得蛋疼的程序员的答案

  • 。。。

最后一种解法实际就是本科计算机原理里介绍的加法器:经过按位逻辑与运算(&)判断当前位操做是否有进位产生,用按位逻辑或运算(|)保存当前位进位的值。

最后一种解决方案的ABAP版本:

下面就是一些小工具了。

1. 若是您是一位ABAP顾问,您知道每月,哪一个SAP事务码被本身使用最屡次数么

只需写一个简单的ABAP报表,执行就能知道答案。报表的源代码能够经过点击文末"阅读原文"得到。下图是Jerry在SAP内部的开发系统执行该报表后的结果,排在第一位的SE24,一个月使用了713次不奇怪,令我吃惊的是SAT竟然使用了692次。不用说,这个月必定在和各类与性能相关的incident进行苦战。

2. 加强的ABAP代码版本管理功能。

打个比方,  若是我想查找一行注释"* Wave 12 Schema version is 7"最先是在哪个ABAP代码改动版本引入的,最后发现是第45个版本引入的。

在实际工做中,SAP的开发人员常常须要作相似的事情,好比分析一个bug,最后定位到是引入了某一行代码引发的,而后就须要找到是哪个请求号对应的版本引入的这行有问题的代码。

可是,这个方法一共有77个版本,难道我要从第一个版本开始,将其和当前版本比较,一直比较到最后一个版本?

这个是纯粹的体力活,时间复杂度o(n)。咱们也能够用二分查找的思路,把77个版本中间的版本即版本39和当前版本比较,若是版本39没有出现咱们要查找的代码,就对版本40和77这个区间段再次使用二分查找。

这种查找办法只是把时间复杂度降成了对数级别,这种体力活仍然让我心烦意乱。有没有o(1)的解决方案?

固然有。就是把这个方法每一个版本的源代码所有下载到本地保存成一个txt文件,里面的版本内容从低到高排序,而后直接按照要查找的关键字进行搜索,瞬间便可得出答案。

有了这个本地文件,我能够用文本编辑器同时打开它两次,而后能够经过鼠标滑动的方式,快捷地比较任意两个版本的差别,而不须要SAPGUI"选择待比较的版本->点击比较按钮->查看比较结果->点回退按钮->选择下一组要比较的版本"这种笨拙的操做,工做效率获得质的提高。

在我心中,重复的鼠标点击对于程序猿来讲就是万恶之源。

这个工具的源代码能够经过点击"阅读原文"得到。

3. 加强的SAT功能。

SAP成都研究院CRM开发团队曾经接到一个CRM On HANA的测试项目,就是在两个系统上同时运行一系列相同的ABAP代码,这两个系统底层的数据库分别是非HANA数据库和HANA数据库,经过这种方式评测SAP CRM运行在HANA数据库上的性能。一旦发现某些代码在HANA数据库上运行的性能还不如非HANA数据库,就找出缘由,对相应代码作优化。

当时,德国同事给咱们的要求就是,在两个系统分别用SAT运行应用,而后手动分析SAT结果,把在数据库为HANA的系统上运行速度慢于非HANA系统的点都找出来,写成文档。

我当时一接到这个项目,内心暗暗叫苦:这不又是纯体力活么。若是待测试的一段代码调用了很是多的API,那岂不是要把这些API在两个系统上执行的时间一个一个找出来手动比较么?就算用双屏,脑壳也要像波浪鼓同样左右晃动,这又不是在练习自由泳的转头换气。

后来Jerry就写了一个工具自动进行比较。下图是工具界面,HN1和Q2U是这两个系统的代号,其中HN1系统后台数据库是HANA,而Q2U后台是非HANA。

Green Threashold指定成50,意思是若是同一个方法,HN1的执行速度比Q2U快50%,则这个方法的比较结果显示成绿灯;Yello Threshold则表明HN1比Q2U快,但只快了20%到50%。若是HN1比Q2U还慢,这就比较糟糕了,是咱们须要采起措施的场景。

工具的输出是一个ALV,能够直接导出成excel。

有了这个工具,本来须要填几个小时的excel,如今十秒就能完成。节省下来的时间能够花费到亮红灯的那些结果,即真正须要进行HANA数据库调优的那些代码中去。

后来Jerry把这个工具秀给了德国的项目主管,他很喜欢这个工具,让我在一个内部会议上给SAP全球其余地区的同事讲讲工具怎么用。这也是Jerry在这篇文章里介绍的众多用ABAP搞出来的无聊的东西里惟一被SAP官方承认的工具,囧。

这个工具的完整代码经过点击"阅读原文"得到。

4. 直接用excel执行SAPGUI里的事务码或者函数。

做为一个SAP ABAP开发人员,SAPGUI上的系统清单老是很长很长,这仍是我清理过屡次,删除了若干不多使用系统以后的清单。有些系统我天天登录上去只是为了看几个简单的事务码,好比SM04,ST22,SE10这些。为此,天天我都要在SAPGUI里选中某个系统,双击以后进行登陆,而后在键盘上输入事务码。

很快个人懒癌又犯了,由于我在这些系统上并不会进行开发工做,那么有没有办法不用SAPGUI登陆系统,也能执行事务码并查看结果呢?有,用excel。在excel里作几个按钮,每一个按钮的事件处理函数用VB硬编码成对应系统的地址,系统编号,用户名和密码,以及指望执行的函数或者事务码的名称。

这样之前繁琐的操做,如今双击打开excel点几个按钮,而后切去作其余事情,等一会再切回excel查看结果便可。节省下来的时间能够作其余更有意义的事情。

这种VB代码像下面这样写:

5. 直接在SAPGUI里给同系统其余在线用户打招呼。

执行这个工具,会看到当前系统在线用户列表和每一个用户正在使用的事务码。

双击某个用户名称,他/她的SAPGUI里就会出现一个弹出框,上面显示一条预先指定好的文本,好比:

这个恶做剧其实就是经过函数TH_POPUP给指定的用户发送一条文本消息,以弹出框的形式显示出来:

6. 项目经理可使用的查岗工具。

好比项目经理想查看名叫WANGJER的顾问从2017年3月1日到3月25日这些天到底在系统里作了哪些开发,只须要执行这个工具就能获得清单。

其实写这个工具的初衷是为了方便我快速得回忆起任何一个时间段,好比一个月或者一年之前到底作了哪些开发工做。程序猿上了年纪后记忆力就衰减了,必需要经过工具的辅助。

最后一个是恶做剧。

一天我正在上班的时候,微信上一位partner向我求助,说是这根红色标注的分割线能够往左拖拽。

一旦把它拖到最左边的极限位置后,将没法再调整其位置了。以下图这样,由于左边对象列表的宽度实在太窄,此时SE80其实已经没有办法使用了。

当时Jerry看了这位朋友微信上发过来的截图,半信半疑,还有这种操做?

照着试了一下,结果我也杯具了。

好在我知道有这张表的存在:

一行代码便可让SE80的设置回复到初始设置:

DELETE FROM rseumod WHERE uname = 'WANGJER'.

感谢你们耐心听完个人唠叨,提早祝你们2018年国庆节快乐。

更多阅读

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

相关文章
相关标签/搜索