SAP Memory & ABAP Memory

以前做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語句).


SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

在程序裏聲明該變量:

給程序創建一個T-code

運行結果(勾上set parameter後,當修改屏幕上的數值時也會反映到SAP memory裏):


備註:在Data Element裏有一個地方可以填Parameter ID(這個方法好無聊,但SAP可能爲了規範參照同一data element的parameter ID,就用了這方法....我只想到這用法,這優點).

創建一個Data Element,並創建一個Parameter ID(存在表TPARA裏,以Z或Y打頭):

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

綁定給table或structure:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

在Dialog裏輸入table-field名字時,會提示是否參照Dictionary.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

選是了後會自動帶出Parameter ID.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

此時需要勾上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.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客


4、ABAP Memory:

1.建了個程序和FM:

將數據丟到ABAP內存'ABAP_MMR',被調用的FM是在internal session內運行(或是用submit和call transaction)。

程序代碼:(類的方法裏不能使用這種語法,只能用下面的第二、三種)

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

FM代碼:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

運行結果,FM裏可以取到ABAP memory的值。



在程序裏取'ABAP_MMR'的值,調用同一個FM取值。

代碼:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

如果跑完第一步的程序後不關閉窗口再跑這個程序,那麼可以成功讀到LV_TEST的值。

程序:


FM:


如果跑第一步的程序後用另一窗口(external session)跑第二步程序,將讀取不到數值。

運行結果:

程序:


FM:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客


3.如果export和import的參數名字不同,則需要指定對應參數名(很糾結的,被賦值的Lv_test_2要放在 = 右邊,但用 to的話會比較直觀)。

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

結果:



4. Export多個數據放到ABAP memory裏。

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客

結果:

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客


5. Free Memory:會清空該external session內所有的ABAP Memory.

程序:ZTEST_SET_ABAP_MMR_4

用了Free Memory ID後'ABAP_MMR_1'和'ABAP_MMR_2'都爲空,無法用import取值.

SAP Memory  ABAP Memory  - Jinyueting.it - jinyueting.it博客


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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章