共計 1981 個字符,預計需要花費 5 分鐘才能閱讀完成。
本篇內容主要講解“SAP ABAP 字符變量和字符串變量怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“SAP ABAP 字符變量和字符串變量怎么理解”吧!
使用 ABAP strlen 函數計算下列這 4 個字符和字符串變量中包含的字符個數。
大家先別急著滑動屏幕,先試著自己計算一下,看和標準答案是否有出入。也許大家覺得這些小的知識點沒什么用,但 Jerry 馬上會分享一個我實際處理過的客戶 incident,正是由于類似這種看似不起眼的小知識點沒有留意,最后影響了項目進展。
正確答案,依次是:
2
1
19
17
逐一解釋。
strlen(lv_s) = 2
整型變量的值,整數 1,賦給字符串變量 lv_s, 這里發生一個隱式類型轉換。
SAP 幫助文檔里聲明,整型變量賦給字符串變量時,如果整數為負數,則字符串變量末尾為 –;如果整數為正數,則字符串變量末尾為空白字符。換言之,當整型變量到字符串變量的隱式類型轉換發生時,字符串變量末尾會多出一位,代表賦值源頭的整型數的符號位。
lv_s 多出來的這個空白字符在調試器里看得很清楚,2000 正是空白字符的 16 進制編碼。同時調試器里也能看到 lv_s 的字符串個數為 2.
strlen(lv_s2) = 1
和前一例相比,lv_s2 的復制操作沒有出現隱式類型轉換,而是直接被賦以了一個字符常量,故字符個數為 1.
strlen(lv_ss) = 19
lv_ss 的類型為 SSTRING,實際就是一個 CHAR20:
在調試器里,lv_ss 有 18 個前導空白 (leading blank) 字符,字符 1 和 1 個尾部空白 (trailing blank) 字符組成,總共 20 個字符,調試器里的 Technical Type 顯示為 C(20).
那為什么 strlen(lv_ss)不等于 20,而等于 19?SAP 幫助文檔里給出了答案——SSTRING 即 CHAR20 這種變量,屬于固定長度 (fixed length) 類型變量。當使用 strlen 函數計算這種變量的字符串個數時,尾部空白字符不應參加計數,所以要減一。
strlen(lv_s3) = 17
有了例三的基礎,這個就很容易了。變量 lv_s3 類型是 CHAR18,屬于固定長度類型變量,因此 strlen 計算出的字符串個數為 18 – 1 = 17.
第一個例子中,我們把一個整數直接賦給了一個字符串變量,發生了隱式類型轉換。在實際項目中,這種隱式類型轉換很容易出現在函數或者 ABAP 類方法的參數傳遞中。對于函數或 ABAP 類方法的形式參數,如果我們傳遞的實際參數類型和其類型不匹配,就會發生隱式類型轉換,這種自動轉換有時并非我們期望發生的,甚至容易被忽略。
看一個真實的例子。我曾經擔任過一個俄羅斯的 SAP CRM 客戶項目的 Dev Angel,收到過一個性能相關的 incident,客戶打開某個 UI 的速度極其緩慢,甚至經常超時。
我通過調試,最終發現罪魁禍首位于下段代碼。該代碼從 SAP CRM 發起 RFC 調用,去 SAP ERP 讀取數據,Max Hit 設置為 15,意思是期望 ERP 端至多返回 15 條記錄。
然而從 ERP 端返回了總共 408093 條記錄。顯然,雖然通過硬編碼指定 Max Hit 為 15,卻完全沒有起到限制作用。
起初我想當然地認為這是 ERP 函數的 bug,沒有正確處理 CRM 調用端傳遞過來的 Max Hit. 然而當我在調試器里單步執行到 CRM 函數內部查看 iv_max_entries 時,一下傻了眼:
它的值從 15 一下變成了 3473457. 這個數字是什么鬼?!
再看函數的形式參數定義,iv_max_entries 類型為整型,而二次開發顧問傳入的硬編碼值 15 , 是一個字符值,我頓時恍然大悟。
15 是怎么變成魔幻數字 3473457 的?
Jerry 先不解釋,而是請大家看下面這段代碼:
執行,正好輸出 3473457 這個魔幻數字。那么代碼第四行 31003500 是哪里來的?其實就是字符串 15 的十六進制編碼。
也就是說,二次開發顧問在 RFC 調用時,將硬編碼的 15 傳給了接受整型變量的函數參數 IV_MAX_ENTRIES. 應該該參數類型為整型,所以 15 的十六進制編碼 31003500 被自動轉換成了對應的整型數 3473457. 顯然這不是開發顧問期望的行為,但因為程序能夠繼續運行,所以這個問題暫時被掩蓋了。
而 RFC 調用完成之后,緊接著是一個嵌套的 LOOP. 在 Max Hit 能按照期望工作的前提下,對于最多包含 15 條記錄的內表,就算進行嵌套的 LOOP 操作也能很快完成。但如今因為 Max Hit 不工作,內表記錄從最多 15 條一下子變成了超過 40 萬條,在這么龐大規模的內表上進行嵌套 LOOP 操作,性能可想而知。
到此,相信大家對“SAP ABAP 字符變量和字符串變量怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!