關于 ABAP字符變量和字符串變量字符個數的一個知識點

      網友投稿 829 2025-03-31

      使用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. 這個數字是什么鬼?!

      關于 ABAP字符變量和字符串變量字符個數的一個知識點

      再看函數的形式參數定義,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操作,性能可想而知。

      經歷過這次incident的處理之后,我個人覺得,使用隱式類型轉換的最佳實踐就是根本不去用它。程序員在工作的時候,必須時刻清醒地知道自己在做什么,要扼住編譯器的咽喉,而不要被編譯器扼住了咽喉。

      ABAP API 任務調度 數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:專職安全生產管理人員職責(專職安全生產管理人員職責有哪些)
      下一篇:excel表格運算時出現#value!是什么原因如何解決(excel中比較運算的結果是)
      相關文章
      亚洲成人中文字幕| 亚洲精品国产福利一二区| 亚洲精品无码专区久久| 亚洲码一区二区三区| 亚洲国产天堂在线观看| 亚洲AV无码乱码在线观看富二代| 亚洲性猛交XXXX| 久久国产成人精品国产成人亚洲| 亚洲片一区二区三区| 亚洲婷婷国产精品电影人久久| 亚洲国产成人影院播放| 亚洲女人被黑人巨大进入| 亚洲免费一区二区| 国产亚洲精品无码专区| 亚洲日韩国产精品第一页一区| 亚洲情综合五月天| 亚洲AV无码精品无码麻豆| 久久精品国产亚洲AV麻豆王友容| 久久国产亚洲观看| 精品亚洲成a人片在线观看 | 亚洲一区二区影院| 亚洲自偷自偷精品| 亚洲日韩在线视频| 亚洲成年网站在线观看| 亚洲欧洲无码AV不卡在线| 妇女自拍偷自拍亚洲精品| 亚洲国产91精品无码专区| 亚洲综合伊人久久综合| 亚洲国产精品VA在线观看麻豆| 午夜亚洲www湿好大| 亚洲精品自在线拍| 亚洲精品456人成在线| 久久综合亚洲色hezyo| 国产成人亚洲精品91专区手机| 亚洲毛片αv无线播放一区| 亚洲成在人线av| 亚洲第一页中文字幕| 一本色道久久88—综合亚洲精品| 日韩国产欧美亚洲v片| 国产亚洲精品无码拍拍拍色欲| 亚洲AV永久精品爱情岛论坛|