我用ABAP做過的那些無聊的事情

i042416發表於2018-10-14

國慶大假馬上就要來臨了,我們聊點輕鬆的話題,關於假期。

Jerry的成都同事李貝南(Li Ben), 《 SAP成都研究院李三郎:SCP Application Router簡介 》的作者,有一次11月份的時候和Jerry一起去德國出差,不解地問到: 德國好歹也有八千多萬人口,怎麼街上冷冷清清的幾乎看不到人呢?

對於這個問題Jerry也沒有答案。而且這種現象在德國的法定節假日裡更加突出。

Jerry的文章《 Jerry 2017年的五一小長假:8種經典排序演算法的ABAP實現 》曾經提到,去年我在德國待了三個月,最難熬的就是德國幾乎每個月都有那麼幾天的法定節假日,因為既然放假,SAP總部的員工食堂就不開了,而且商店也全部關門,得提前一天備好乾糧。

SAP德國總部員工食堂的伙食是非常非常好的,就在Jerry寫這段文字時,彷彿又聞到了中午飯點時走近食堂,從裡面散發出食物的香味。

總部員工食堂菜的味道有甜有酸,有些湯的味道稍稍帶著苦味,沒有辣味,正好Jerry討厭吃辣,所以口味非常適合我,我一連吃了90天也不覺得膩。

葷素搭配很合理,而且肉和菜吃不夠隨便加,管飽,對於Jerry這種飯量大的程式猿來說簡直是天堂。

我用ABAP做過的那些無聊的事情

我用ABAP做過的那些無聊的事情

我用ABAP做過的那些無聊的事情

這些食物太美味了,每頓飯結束後我都是這個狀態:

我用ABAP做過的那些無聊的事情

然而到了德國法定節假日和星期日,這一切都消失了。德國商店的營業時間一直按照20世紀50年代的規定執行的:商店在工作日最晚開到下午六點半,週六最晚下午2點關閉, 週日全天不營業

於是,2017年五一小長假,4月29日~5月1日三天,Jerry只好靠這些乾糧充飢,三天一共只花了9歐元。

我用ABAP做過的那些無聊的事情

Jerry是一個程式猿,對吃的不挑剔,Zopf很經餓。什麼是Zopf?

我用ABAP做過的那些無聊的事情

我住在德國鄉下,平時也難得見到人,更別提節假日了。街上全是這種風格:

我用ABAP做過的那些無聊的事情

我用ABAP做過的那些無聊的事情

我用ABAP做過的那些無聊的事情

要不是耳邊傳來偶爾駛過的汽車和德國小朋友在自己花園裡嬉戲的聲音,Jerry還以為自己來到了科幻電影《我是傳奇》裡的世界。

五一小長假的最後一天,我的同事Liang Simon(梁亞舒)邀請我到他的家中,吃了一頓地道的德國烤肉。在此之前啃了兩天Zopf的我,覺得這是我這輩子吃過的最美味的烤肉!烤肉一掃光後,Simon的老婆又端出一個自己動手做的巧克力蛋糕。

Jerry吃完之後,心裡遺憾地想:當初這個蛋糕製作的時候,半徑再大幾釐米就更完美了。

在這種情況下,作為一個程式猿,娛樂的方式就只剩擼程式碼了。所以本文提到的這些東西都是Jerry在德國節假日裡無聊的產物,對於ABAP顧問的實際工作可能幫助不大。不過因為是過節,大家當看看小說消遣好了。

1.  Jerry 2017年的五一小長假:8種經典排序演算法的ABAP實現

把本科學過的八種排序演算法用ABAP逐一實現了一次。

我用ABAP做過的那些無聊的事情

SAP社群上有一位網友Sinai可能覺得我是吃飽了撐著沒事幹(這倒是事實),畢竟在ABAP裡要排序直接使用關鍵字SORT即可。

我用ABAP做過的那些無聊的事情

不過幸好還有另外的網友跳出來為我辯護,中心思想就四個字: 開心就好

我用ABAP做過的那些無聊的事情

2. 不用四則運算子比較兩個整數的大小

看文字描述就能感覺到這又是一個讓程式猿感覺很囧的需求。

使用位操作,JavaScript可以很優雅地實現:

我用ABAP做過的那些無聊的事情

Java也沒問題:

我用ABAP做過的那些無聊的事情

輪到ABAP就麻煩了。因為ABAP的BIT-XOR這種位操作不支援整型型別。

我用ABAP做過的那些無聊的事情

既然語言層面不支援,就只好自己動手模擬了。

我用一個尺寸為32的ABAP內表儲存一個32位整數的每一個bit的值,然後基於這個內表模擬了整數的與或非以及異或操作,還有按位左移,右移。

讓ABAP整數也能像上圖JavaScript和Java那樣支援按位邏輯操作的模擬實現程式碼在我的部落格裡:

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

用這種模擬方式實現的ABAP程式碼比JavaScript和Java足足長了一倍。雖然醜陋,但好歹實現了題目的需求。

我用ABAP做過的那些無聊的事情

3. 給出儘可能多的計算兩個整數和的方案

下面的答案可以歸納為:

  • 普通程式設計師的答案

  • 2B程式設計師的答案

  • 文藝程式設計師的答案

  • 閒得蛋疼的程式設計師的答案

  • 。。。

我用ABAP做過的那些無聊的事情

最後一種解法實際就是本科計算機原理裡介紹的加法器:透過按位邏輯與運算(&)判斷當前位操作是否有進位產生,用按位邏輯或運算(|)儲存當前位進位的值。

我用ABAP做過的那些無聊的事情

最後一種解決方案的ABAP版本:

我用ABAP做過的那些無聊的事情

下面就是一些小工具了。

1. 如果您是一位ABAP顧問,您知道 每個月,哪個SAP事務碼被自己使用最多次數麼

只需寫一個簡單的ABAP報表,執行就能知道答案。報表的原始碼可以透過點選文末"閱讀原文"獲得。下圖是Jerry在SAP內部的開發系統執行該報表後的結果,排在第一位的SE24,一個月使用了713次不奇怪,令我吃驚的是SAT居然使用了692次。不用說,這個月一定在和各種與效能相關的incident進行苦戰。

我用ABAP做過的那些無聊的事情

2. 增強的ABAP程式碼版本管理功能。

打個比方, 如果我想查詢一行註釋"* Wave 12 Schema version is 7"最早是在哪一個ABAP程式碼改動版本引入的,最後發現是第45個版本引入的。

在實際工作中,SAP的開發人員經常需要做類似的事情,比如分析一個bug,最後定位到是引入了某一行程式碼引起的,然後就需要找到是哪一個請求號對應的版本引入的這行有問題的程式碼。

我用ABAP做過的那些無聊的事情

但是,這個方法一共有77個版本,難道我要從第一個版本開始,將其和當前版本比較,一直比較到最後一個版本?

這個是純粹的體力活,時間複雜度o(n)。我們也可以用二分查詢的思路,把77個版本中間的版本即版本39和當前版本比較,如果版本39沒有出現我們要查詢的程式碼,就對版本40和77這個區間段再次使用二分查詢。

我用ABAP做過的那些無聊的事情

這種查詢辦法只是把時間複雜度降成了對數級別,這種體力活仍然讓我心煩意亂。有沒有o(1)的解決方案?

當然有。就是把這個方法每個版本的原始碼全部下載到本地儲存成一個txt檔案,裡面的版本內容從低到高排序,然後直接按照要查詢的關鍵字進行搜尋,瞬間即可得出答案。

有了這個本地檔案,我可以用文字編輯器同時開啟它兩次,然後可以透過滑鼠滑動的方式,快捷地比較任意兩個版本的差異,而不需要SAPGUI"選擇待比較的版本->點選比較按鈕->檢視比較結果->點回退按鈕->選擇下一組要比較的版本"這種笨拙的操作,工作效率得到質的提升。

在我心中,重複的滑鼠點選對於程式猿來說就是萬惡之源。

我用ABAP做過的那些無聊的事情

這個工具的原始碼可以透過點選"閱讀原文"獲得。

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還慢,這就比較糟糕了,是我們需要採取措施的場景。

我用ABAP做過的那些無聊的事情

工具的輸出是一個ALV,可以直接匯出成excel。

我用ABAP做過的那些無聊的事情

有了這個工具,原本需要填 幾個小時 的excel,現在 十秒 就能完成。節省下來的時間可以花費到亮紅燈的那些結果,即真正需要進行HANA資料庫調優的那些程式碼中去。

後來Jerry把這個工具秀給了德國的專案主管,他很喜歡這個工具,讓我在一個內部會議上給SAP全球其他地區的同事講講工具怎麼用。這也是Jerry在這篇文章裡介紹的眾多用ABAP搞出來的無聊的東西里唯一被SAP官方認可的工具,囧。

這個工具的完整程式碼透過點選"閱讀原文"獲得。

4. 直接用excel執行SAPGUI裡的事務碼或者函式。

作為一個SAP ABAP開發人員,SAPGUI上的系統清單總是很長很長,這還是我清理過多次,刪除了若干很少使用系統之後的清單。有些系統我每天登陸上去只是為了看幾個簡單的事務碼,比如SM04,ST22,SE10這些。為此,每天我都要在SAPGUI裡選中某個系統,雙擊之後進行登入,然後在鍵盤上輸入事務碼。

很快我的 懶癌 又犯了,因為我在這些系統上並不會進行開發工作,那麼有沒有辦法不用SAPGUI登入系統,也能執行事務碼並檢視結果呢?有,用excel。在excel裡做幾個按鈕,每個按鈕的事件處理函式用VB硬編碼成對應系統的地址,系統編號,使用者名稱和密碼,以及期望執行的函式或者事務碼的名稱。

這樣以前繁瑣的操作,現在雙擊開啟excel啪啪啪點幾個按鈕,然後切去做其他事情,等一會再切回excel檢視結果即可。節省下來的時間可以做其他更有意義的事情。

這種VB程式碼像下面這樣寫:

我用ABAP做過的那些無聊的事情

5. 直接在SAPGUI裡給同系統其他線上使用者打招呼。

執行這個工具,會看到當前系統線上使用者列表和每個使用者正在使用的事務碼。

我用ABAP做過的那些無聊的事情

雙擊某個使用者名稱稱,他/她的SAPGUI裡就會出現一個彈出框,上面顯示一條預先指定好的文字,比如:

我用ABAP做過的那些無聊的事情

這個惡作劇其實就是透過函式TH_POPUP給指定的使用者傳送一條文字訊息,以彈出框的形式顯示出來:

我用ABAP做過的那些無聊的事情

6. 專案經理可以使用的查崗工具。

比如專案經理想檢視名叫WANGJER的顧問從2017年3月1日到3月25日這些天到底在系統裡做了哪些開發,只需要執行這個工具就能得到清單。

我用ABAP做過的那些無聊的事情

我用ABAP做過的那些無聊的事情

其實寫這個工具的初衷是為了方便我快速得回憶起任何一個時間段,比如一個月或者一年以前到底做了哪些開發工作。程式猿上了年紀後記憶力就衰減了,必須要透過工具的輔助。

最後一個是惡作劇。

一天我正在上班的時候,微信上一位partner向我求助,說是這根紅色標註的分割線可以往左拖拽。

我用ABAP做過的那些無聊的事情

一旦把它拖到最左邊的極限位置後,將無法再調整其位置了。如下圖這樣,因為左邊物件列表的寬度實在太窄,此時SE80其實已經沒有辦法使用了。

我用ABAP做過的那些無聊的事情

當時Jerry看了這位朋友微信上發過來的截圖,半信半疑,還有這種操作?

我用ABAP做過的那些無聊的事情

照著試了一下,結果我也杯具了。

好在我知道有這張表的存在:

我用ABAP做過的那些無聊的事情

一行程式碼即可讓SE80的設定回覆到初始設定:

DELETE FROM rseumod WHERE uname = 'WANGJER'.

感謝大家耐心聽完我的嘮叨,提前祝大家2018年國慶節快樂。

我用ABAP做過的那些無聊的事情

更多閱讀

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2216331/,如需轉載,請註明出處,否則將追究法律責任。

相關文章