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