2013-10-30 80 views
5

在修改現有程序的CASE語句時,我不得不添加第二個塊,其中重複一些邏輯來設置NetWeaver門戶設置。這是通過設置局部變量中的值,然後將該變量分配給Changing參數來完成的。我複製了代碼並做了一個漂亮的打印,期待編譯器抱怨未知的變量。令我吃驚然而,這段代碼實際上編譯就好:Case Statement中的變量封裝

CASE i_actionid. 
    WHEN 'DOMIGO'. 
     DATA: ls_portal_actions TYPE powl_follow_up_sty. 
     CLEAR ls_portal_actions. 
     ls_portal_actions-bo_system = 'SAP_ECC_Common'. 
     " [...] 
     c_portal_actions = ls_portal_actions. 
    WHEN 'EBELN'. 
     ls_portal_actions-bo_system = 'SAP_ECC_Common'. 
     " [...] 
     C_PORTAL_ACTIONS = ls_portal_actions. 
ENDCASE. 

正如我在所有其他編程語言所看到的,DATA:聲明在第一WHEN聲明應被封裝僅是開關塊內。 SAP是否忽略此封裝以使整個CASE語句中的值可用?這是記錄在任何地方?

請注意,此代碼編譯得很好,然後雙擊第二個開關中的局部變量將我帶到第一個數據聲明中。但是,由於我們的測試環境停機,我無法測試此代碼是否正確執行。

回答

8

總之你不能這樣做。您將有以下的範圍中在其內聲明的變量(從地方到全球)的ABAP程序:

  • 形式例行:FORM和端部結構
  • 方法之間的所有變量:方法和ENDMETHOD
  • 之間的所有變量
  • 類 - 類和ENDCLASS之間,但只有在類定義部分的所有變量
  • 功能模塊:功能與endfunction下面
  • 計劃/全球之間的所有變量 - 任何沒有在上面一個是在當前程序包括變量全球在P BO和PAI模塊

具有在for循環中本地定義變量的能力,或者是否真的有用,但不幸在ABAP中不可行。最接近你將公開可用的文檔是關於help.sap.com:Local Data in the Subroutine

至於編譯過程中不要假設ABAP會優化出任何你不使用它的變量不會,使用代碼檢查員自己查找並刪除它們。由於ABAP以它的方式工作,我個人在模塊化單元的開始處定義了所有變量,而不是與其他代碼內聯,並且更改了漂亮的打印機以將任何內聯定義移動到當前範圍的頂部。

+0

你修改漂亮的打印機來移動數據聲明?棒極了。不要以爲你已經在任何地方分享了這個代碼,scn等等? –

+0

感謝您提供有用的概述,在培訓和幫助材料中沒有更好地記錄這一點,這真是一個恥辱。假設您能夠公開發布,我會再次選擇Bryain對漂亮打印修改的請求。 – Lilienthal

+3

不幸的是,它在工作,所以我不能自由地分享它,但它非常直截了當我在ENDFUCTION之前的函數模塊PRETTY_PRINTER的末尾添加了一個退出權限。如果你在這裏添加一個調用,你可以使用包含格式化源代碼的表ntext [](只要檢查l_indentation_wrong,如果'X'表示語法錯誤,在這種情況下我沒有進行格式化)。它也適用於新的Eclipse ABAP編輯器 – DW8Reaper

3

您認爲CASE語句在ABAP中定義它自己的變量範圍簡直是錯誤的(對於其他許多編程語言也是錯誤的)。用變量聲明拋棄代碼是一個壞主意,因爲這使得它非常難以閱讀和維護,但這是可能的。語句以及許多其他聲明性語句僅在編譯時進行評估,並且在運行時完全忽略。你可以找到more information about the scopes in the online documentation

+0

您能否詳細說明編譯過程?據我瞭解,ABAP不是真正編譯的,而是爲激活解釋而優化的。那麼編譯器是否會簡單地檢查每個使用的變量是否在代碼的早期聲明以及執行靜態類型強制?當你說在運行時忽略聲明性語句,這是否意味着沒有執行動態類型檢查? – Lilienthal

+0

如果您有關於此主題的任何參考,他們將非常感激。我看到的TAW書幾乎沒有任何用處,我幾乎找不到有關網上編譯/解釋過程的可靠信息。 – Lilienthal

+0

@Lilienthal:有很少的信息可用。 ABAP被編譯成一種字節碼(由於歷史原因稱爲「加載」),然後由內核中的虛擬機解釋。此加載針對某種機器類型進行了優化(與Java系統無關的字節碼形成對比)。您不需要太多的信息,因爲無法作爲開發人員與負載進行交互。 – vwegert

0

內聯變量聲明現在可以使用最新版本的SAP Netweaver。這裏是文檔DATA - inline declaration的鏈接。這也是這個新功能

這裏的好和壞的一些用法guidelines從這個網站報價:

與申報操作數據的聲明表達聲明用作操作數的變量var目前的作家位置。聲明的變量在DATA(var)程序中靜態可見,並且在當前上下文中有效。聲明是在程序編譯時進行的,無論聲明是否被實際執行。

個人還沒有時間檢查出來,因爲沒有訪問這樣的系統。

+0

新功能非常好,我們必須在多個版本4.7 - >最新版本上支持客戶,所以我們永遠不能使用它們:(希望SAP能夠在一段時間內回溯一次 – DW8Reaper