2015-07-21 139 views
2

當使用擴展程序檢查,我得到以下警告:在ABAP本地化全球varables報告

不要聲明領域和全球領域的符號(variable name)。

這是從選擇屏幕之前聲明全局數據。顯而易見的解決方案是,它們應該在子程序中進行本地聲明。

如果我決定這樣做,現在數據將超出其他子例程的範圍,所以我最終會創建一些對C或Java中的main()函數的影響。這聽起來像是一個好主意 - 但是,像INITIALIZATION這樣的事件不允許在子程序中,這意味着它會強制中斷程序。

觀察下面的示例程序:

REPORT Z_EXAMPLE. 
SELECTION-SCREEN BEGIN OF BLOCK upload WITH FRAME TITLE text-H01. 
    PARAMETERS: p_infile TYPE rlgrap-filename LOWER CASE OBLIGATORY. 
SELECTION-SCREEN END OF BLOCK upload. 
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_infile. 
    PERFORM main1 CHANGING p_infile. 
INITIALIZATION. 
    PERFORM main2. 
TOP-OF-PAGE. 
    PERFORM main3. 
... 

main1main2main3不能就我所知的任何數據傳遞到彼此沒有全局聲明。如果從main1上傳的文件p_infile解析數據,則無法在main2main3中訪問該數據。除了一起忽略事件,是否有任何方法來遵守警告,但讓數據通過事件傳遞?

回答

4

正如@vwegert所說的那樣,寫一個沒有至少一些全局變量的ABAP程序幾乎是不可能的(選擇屏幕和事件不幸)。

一種方法是使用控制器類,另一種方法是有一個主子例程並根據需要調用其他子例程,並根據需要傳遞值。在許多情況下,我傾向於採用後一種方法,因爲在單獨的包含中將子例程拆分爲邏輯分組更容易(對於類來說這樣做有時會有點難看)。儘管這確實是一個問題,但關鍵的一點是將全局變量降到最低 - 不幸的是,我遇到過的ABAP開發人員太少關心這些問題。

更新

@Christian提醒我說,ABAP的AS 7。02,子程序是considered obsolete

子程序不應該再在新程序中創建,原因如下:當與方法的參數接口相比

  • 參數接口有清晰的弱點,如:

    • 位置參數,而不是關鍵字參數
    • 在通沒有真正的輸入參數由參考
    • 打字是可選
    • 沒有可選參數
  • 每個子程序隱含屬於其程序的公共接口。通常這是不可取的。
  • 從外部調用子程序對於將容器程序分配給內部會話中的程序組至關重要。通常不能將此分配定義爲靜態。

這些都是正確的觀點,我認爲在光,使用類模塊化絕對是首選的方法(和從一個純粹的審美角度,他們也「配合」的語法增強更好在7.02及更高版本中)。

+0

謝謝。你對ABAP的關心太少了,你肯定是對的 - 但有人必須以身作則。我有一份Cengage Learning的ABAP編程介紹第三版的介紹,第294頁的示例程序ZCHECK僅包含全局變量。你知道任何好的資源對於試圖遵守編程標準的ABAPer有幫助嗎? – gkubed

+2

我認爲你正在使用擴展程序檢查('SLIN')進入正確的軌道。如果您正在尋找需要閱讀的內容,[官方ABAP編程指南](https://www.sap-press.com/official-abap-programming-guidelines_2093/)是一個很好的參考。 – mjturner

+2

@mjturner我在文檔中看到子程序已經過時。 – Christian

6

有各種各樣的技術 - 除了在單獨的控制器類中的基本選擇屏幕處理外,我更喜歡編寫幾乎所有的代碼。報告只是按照這個類別來調用它的方法。除此之外 - 這只是一個警告,如果你知道你在做什麼,你可以忽略它。編寫一個沒有任何全局變量的程序肯定不切合實際 - 但是,在方法參數更合適的地方使用全局變量或屬性之前,您應該至少考慮兩次。

+0

謝謝。由於這個我一直在使用ABAP對象。另外,感謝在7.50中實現IS INSTANCE OF! :) – gkubed