我用ABAP做過的那些無聊的事情
國慶大假馬上就要來臨了,我們聊點輕松的話題,關于假期。
對于這個問題Jerry也沒有答案。而且這種現象在德國的法定節假日里更加突出。
Jerry的文章《Jerry 2017年的五一小長假:8種經典排序算法的ABAP實現》曾經提到,去年我在德國待了三個月,最難熬的就是德國幾乎每個月都有那么幾天的法定節假日,因為既然放假,SAP總部的員工食堂就不開了,而且商店也全部關門,得提前一天備好干糧。
SAP德國總部員工食堂的伙食是非常非常好的,就在Jerry寫這段文字時,仿佛又聞到了中午飯點時走近食堂,從里面散發出食物的香味。
總部員工食堂菜的味道有甜有酸,有些湯的味道稍稍帶著苦味,沒有辣味,正好Jerry討厭吃辣,所以口味非常適合我,我一連吃了90天也不覺得膩。
葷素搭配很合理,而且肉和菜吃不夠隨便加,管飽,對于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’.
感謝大家耐心聽完我的嘮叨。
更多閱讀
動手使用ABAP Channel開發一些小工具,提升日常工作效率
聊聊C語言和ABAP
ABAP vs Java, 蛙泳 vs 自由泳
300行ABAP代碼實現一個最簡單的區塊鏈原型
Jerry的ABAP原創技術文章合集
ABAP開發人員未來應該學些什么
Jerry的ABAP, Java和JavaScript亂燉
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙"。
ABAP ERP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。