中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SAP ABAP字符變量和字符串變量怎么理解

發布時間:2021-12-29 16:45:15 來源:億速云 閱讀:143 作者:iii 欄目:服務器

本篇內容主要講解“SAP ABAP字符變量和字符串變量怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SAP ABAP字符變量和字符串變量怎么理解”吧!

使用ABAP strlen函數計算下列這4個字符和字符串變量中包含的字符個數。

SAP ABAP字符變量和字符串變量怎么理解

大家先別急著滑動屏幕,先試著自己計算一下,看和標準答案是否有出入。也許大家覺得這些小的知識點沒什么用,但Jerry馬上會分享一個我實際處理過的客戶incident,正是由于類似這種看似不起眼的小知識點沒有留意,最后影響了項目進展。

正確答案,依次是:

  • 2

  • 1

  • 19

  • 17

逐一解釋。

strlen( lv_s ) = 2

整型變量的值,整數1,賦給字符串變量lv_s, 這里發生一個隱式類型轉換。

SAP幫助文檔里聲明,整型變量賦給字符串變量時,如果整數為負數,則字符串變量末尾為"-";如果整數為正數,則字符串變量末尾為空白字符。換言之,當整型變量到字符串變量的隱式類型轉換發生時,字符串變量末尾會多出一位,代表賦值源頭的整型數的符號位。

SAP ABAP字符變量和字符串變量怎么理解

lv_s多出來的這個空白字符在調試器里看得很清楚,2000正是空白字符的16進制編碼。同時調試器里也能看到lv_s的字符串個數為2.

SAP ABAP字符變量和字符串變量怎么理解

strlen( lv_s2 ) = 1

和前一例相比,lv_s2的復制操作沒有出現隱式類型轉換,而是直接被賦以了一個字符常量,故字符個數為1.

strlen( lv_ss) = 19

lv_ss的類型為SSTRING,實際就是一個CHAR20:

SAP ABAP字符變量和字符串變量怎么理解

在調試器里,lv_ss有18個前導空白(leading blank)字符,字符"1"和1個尾部空白(trailing blank)字符組成,總共20個字符,調試器里的Technical Type顯示為C(20).

SAP ABAP字符變量和字符串變量怎么理解

那為什么strlen(lv_ss)不等于20,而等于19?SAP幫助文檔里給出了答案——SSTRING即CHAR20這種變量,屬于固定長度(fixed length)類型變量。當使用strlen函數計算這種變量的字符串個數時,尾部空白字符不應參加計數,所以要減一。

SAP ABAP字符變量和字符串變量怎么理解

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條記錄。

SAP ABAP字符變量和字符串變量怎么理解

然而從ERP端返回了總共408093條記錄。顯然,雖然通過硬編碼指定Max Hit為15,卻完全沒有起到限制作用。

SAP ABAP字符變量和字符串變量怎么理解

起初我想當然地認為這是ERP函數的bug,沒有正確處理CRM調用端傳遞過來的Max Hit. 然而當我在調試器里單步執行到CRM函數內部查看iv_max_entries時,一下傻了眼:

SAP ABAP字符變量和字符串變量怎么理解

它的值從15一下變成了3473457. 這個數字是什么鬼?!

再看函數的形式參數定義,iv_max_entries類型為整型,而二次開發顧問傳入的硬編碼值'15', 是一個字符值,我頓時恍然大悟。

SAP ABAP字符變量和字符串變量怎么理解

'15'是怎么變成魔幻數字3473457的?

Jerry先不解釋,而是請大家看下面這段代碼:

SAP ABAP字符變量和字符串變量怎么理解

執行,正好輸出3473457這個魔幻數字。那么代碼第四行31003500是哪里來的?其實就是字符串'15'的十六進制編碼。

SAP ABAP字符變量和字符串變量怎么理解

也就是說,二次開發顧問在RFC調用時,將硬編碼的'15'傳給了接受整型變量的函數參數IV_MAX_ENTRIES. 應該該參數類型為整型,所以'15'的十六進制編碼'31003500'被自動轉換成了對應的整型數3473457. 顯然這不是開發顧問期望的行為,但因為程序能夠繼續運行,所以這個問題暫時被掩蓋了。

而RFC調用完成之后,緊接著是一個嵌套的LOOP. 在Max Hit能按照期望工作的前提下,對于最多包含15條記錄的內表,就算進行嵌套的LOOP操作也能很快完成。但如今因為Max Hit不工作,內表記錄從最多15條一下子變成了超過40萬條,在這么龐大規模的內表上進行嵌套LOOP操作,性能可想而知。

到此,相信大家對“SAP ABAP字符變量和字符串變量怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瓮安县| 井陉县| 堆龙德庆县| 兴海县| 彝良县| 垫江县| 奉新县| 江北区| 隆尧县| 巴中市| 上杭县| 大兴区| 丘北县| 治多县| 清新县| 同江市| 濮阳县| 萨嘎县| 漠河县| 丹江口市| 托里县| 锦州市| 合肥市| 阳春市| 师宗县| 和政县| 房山区| 永昌县| 河津市| 碌曲县| 余江县| 突泉县| 丘北县| 黑河市| 平武县| 许昌市| 吉木萨尔县| 阳春市| 温泉县| 肇州县| 南部县|