以前做enhancement的時候用過parameter id 和 memory id, 但很多其他語法用法我是沒接觸過的, 今天看了Palm同鞋做的文檔SAP Memory & ABAP Memory, 做了一些測試, 本文幾乎所有內容來自Palm同鞋的文檔.
1、先弄清External Session 和Internal Session區別:
External Session:
當user登陸SAP後, 就開啓了一個userlogon session。當user退出所有sap window, 就結束了這個user logon session。一個userlogon session最多有6個external session(即main session,對應有6個窗口).
Internal Session:
在一個external session內調用其它程序將會生成新的internal session, 比如call FM, call transaction或是submit*** and return等方式。 當關掉這個external session時,也就結束了external session下的所有internal session。一個External session最多有20個Internal session.
對於上面這幾個session之間的關係可以這麼簡單概括:User session > external session > internal session。
SAP memory類似於全局變量,用於Externalsession間的通信,不同的externalsession都可以訪問,當退出userlogon session時將清空SAPmemory(不同user對應的SAPmemory不同)。
ABAP memory類似於局部變量,用於同一externalsession下internalsession間的通信,不同的externalsession有不同的ABAPmemory,同一個externalsession裏的internalsession只能訪問相應session的ABAP memory。
2、網上寫的兩者幾個不同點:
1. 使用的語句不同
SAP memory使用SET/GET parameters;
SPA:SET PARAMETER ID 'MAT' FIELD p_matnr.
GPA:GET PARAMETER ID 'MAT' FIELD p_matnr.
ABAP Memory使用EXPORT 和IMPORT :
EXPORT p_matnr = p_matnr TO MEMORY ID 'ZTESTMAT'.
EXPORT p_matnr = p_matnr FROM MEMORY ID 'ZTESTMAT'
FREE MEMORY ID 'ZTESTMAT'. 清空指定的ABAPmemory
FREE MEMORY. 清空externalsession內的所有ABAPmemory
3、共享範圍不同
SAP memory用於所有external session間,ABAP memory用於同一個external session的internal session間。
4、作用範圍不同(就是生存期)
SAP memory在登陸到退出這期間一直有效。
ABAP memory只在同一個session(window) 內有效。
3、SAP Memory:
1. 給SAP Memory賦值
創建程序ZTEST_SET_SAP_MMR給‘SAP_MMR'賦值'12345'.
2.獲取SAP Memory 的值並顯示在選擇屏幕上
創建另一個程序ZTEST_GET_SAP_MMR,併爲PR_TEST指定Memory ID ,這樣SAP_MMR的值將會作爲默認值顯示在selection screen上。
運行結果,默認值顯示在屏幕上:
因爲field與SAP Memory綁定了,在selection screen上如果修改對應的值,比如將'12345'改成'123'後按F8,也將修到SAP memory的值.重新運行程序如下:
3. Dialog獲取SAPMemory方式
在dialog 屏幕上建一個input field, 然後Parameter ID屬性與'SAP_MMR'綁定,並打上2個勾。
Set Parameter: 允許將屏幕值返回給SAP Memory (類似於執行SET PARAMETER ID語句)
Get Parameter: 允許讀取SAP Memory的值並默認顯示(類似於執行GET PARAMETER ID語句).
在程序裏聲明該變量:
給程序創建一個T-code
運行結果(勾上set parameter後,當修改屏幕上的數值時也會反映到SAP memory裏):
備註:在Data Element裏有一個地方可以填Parameter ID(這個方法好無聊,但SAP可能爲了規範參照同一data element的parameter ID,就用了這方法....我只想到這用法,這優點).
創建一個Data Element,並創建一個Parameter ID(存在表TPARA裏,以Z或Y打頭):
綁定給table或structure:
在Dialog裏輸入table-field名字時,會提示是否參照Dictionary.
選是了後會自動帶出Parameter ID.
此時需要勾上Set Parameter和Get Parameter並在代碼裏聲明ZTESTTEST纔有效.
4. 通過Get parameter ID語句獲取SAP memory的值,並賦給LV_TEST
如果SET Parameter ID後退出所有sessions,SAP memory將被清空,重新登陸Get Parameter ID將取到空值。
如果SET Parameter ID後其它user用Get Parameter ID也取不到相應的值。
5. TCODE SU3設置PARAMETER ID
在TCODE SU3設置了PARAMETER ID後, 運行語句GET PARAMETER ID 後就能讀到設置的相關PARAMETER ID的值. 它的功能相當於SET PARAMETER ID.
4、ABAP Memory:
1.建了個程序和FM:
將數據丟到ABAP內存'ABAP_MMR',被調用的FM是在internal session內運行(或是用submit和call transaction)。
程序代碼:(類的方法裏不能使用這種語法,只能用下面的第二、三種)
FM代碼:
運行結果,FM裏可以取到ABAP memory的值。
在程序裏取'ABAP_MMR'的值,調用同一個FM取值。
代碼:
如果跑完第一步的程序後不關閉窗口再跑這個程序,那麼可以成功讀到LV_TEST的值。
程序:
FM:
如果跑第一步的程序後用另一窗口(external session)跑第二步程序,將讀取不到數值。
運行結果:
程序:
FM:
3.如果export和import的參數名字不同,則需要指定對應參數名(很糾結的,被賦值的Lv_test_2要放在 = 右邊,但用 to的話會比較直觀)。
結果:
4. Export多個數據放到ABAP memory裏。
結果:
5. Free Memory:會清空該external session內所有的ABAP Memory.
程序:ZTEST_SET_ABAP_MMR_4
用了Free Memory ID後'ABAP_MMR_1'和'ABAP_MMR_2'都爲空,無法用import取值.
6. Free Memory ID: 清空指定ABAP Memory ID的內容, 其它的ID不受影響.
用了FREE MEMORY ID 'ABAP_MMR_3'.後, 'ABAP_MMR_3'的數據將被清空,無法取值,但'ABAP_MMR_4'不受影響,可以取到LV_TEST的值(放在LV_TEST_5裏).
如果將多個變量一直放在同一ID內, 如果用了Free Memory 或是Free Memory ID(指定這個ID),那這個ID內的所有變量將被全部清空.
網上還說到另外兩種傳輸方式.
Share Memory 或Share Buffer 用於不同用戶間的數據傳遞.
當使用DELETE FROM SHARED BUFFER 語句或是服務器關閉後該內存纔會被清空.
使用TOSHARED BUFFER要用FROMSHARED BUFFER取值.
使用TOSHARED MEMORY要用FROMSHARED MEMORY取值.
語法和普通MEMORY ID是一樣的
Database 將數據存進表裏, 就算服務器關了數據還存在.
表INDX會多一條記錄.
讀取數據:
語法和普通MEMORY ID是一樣的
關於這個memory id, database還有一些細節可以參考老白的博客
轉自:http://jinyueting.it.blog.163.com/blog/static/50938665201302202150368/