以前做enhancement的時候用過parameter id 和 memory id, 但很多其他語法用法我是沒接觸過的, 今天看了Palm同鞋做的文檔SAP Memory & ABAP Memory, 做了一些測試, 本文幾乎所有內容來自Palm同鞋的文檔.
1、先弄清External Session 和Internal Session區(qū)別: 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.
EXPORT p_matnr = p_matnr TO 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賦值 創(chuàng)建程序ZTEST_SET_SAP_MMR給‘SAP_MMR'賦值'12345'. 2.獲取SAP Memory 的值并顯示在選擇屏幕上 創(chuàng)建另一個程序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 (類似于執(zhí)行SET PARAMETER ID語句) Get Parameter: 允許讀取SAP Memory的值并默認顯示(類似于執(zhí)行GET PARAMETER ID語句).
在程序里聲明該變量: 給程序創(chuàng)建一個T-code 運行結果(勾上set parameter后,當修改屏幕上的數值時也會反映到SAP memory里): 備注:在Data Element里有一個地方可以填Parameter ID(這個方法好無聊,但SAP可能為了規(guī)范參照同一data element的parameter ID,就用了這方法....我只想到這用法,這優(yōu)點). 創(chuàng)建一個Data Element,并創(chuàng)建一個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還有一些細節(jié)可以參考老白的博客 轉自:http://jinyueting.it.blog.163.com/blog/static/50938665201302202150368/ |
|