程序间数据共享与传递(3):EXPORT/IMPORT、SAP/ABAP Memory
ABAP Memory(同一用戶的同一窗口Session)
l??保存數據
EXPORT[FROM ]??[FROM ] ... TO MEMORY ID <</span>key>.
如果省略了FROM?選項,則被存儲的數據源就來自于程序中與f1自已同名的變量,否則數據源為g1指定的變量(或者g1本身就是字符常量);key?用來標示ABAP內存。可以將多個變量存儲在同一個中,它們是通過來區別的。IMPORT中的必須與EXPORT中的名稱相同。
DATA?text1(10)?VALUE?'Exporting'.
DATA?itab?LIKE?sbook?OCCURS?10?WITH HEADER LINE.
DO?5?TIMES.
??itab-bookid?=?100?+ sy-index.
??APPEND?itab.
ENDDO.
"將?text1?與?text2都存儲到?text ID的名下
EXPORT?text1?"數據來源于上面定義的?text1變量,并以text1名分類存儲
???????text2?FROM?'Literal'"數據直接來源于From后面指定的常量字符串,也以text1名分類存儲
??TO MEMORY ID?'text'.
"將前面定義的itab存儲到以table為ID的內存中,并以itab名分類存儲
EXPORT?itab?TO MEMORY ID?'table'.
?
l??讀取數據
IMPORT [TO ] [TO ] ... FROM MEMORY ID .
如果忽略選項TO,則將內存中的數據對象賦給程序中的同名數據對象;如果使用此選項,則將內存中的數據對象寫入字段中。IMPORT中的必須與EXPORT中的名稱相同。
?
不必讀取存在特定ID下的所有對象,在讀取時可以通過指定名稱中進行有選擇性的讀取。如果內存中不包含指定ID下的對象,則將SY-SUBRC設置為4,但是如果內存中存在帶此ID的數據簇,無論數據對象是否也存在,SY-SUBRC之值總是為0。如果簇中不存在數據對象,則目標字段保持不變(gi或fi本身)。
DATA?text1(10)?VALUE?'TEST1'.
DATA?itab?LIKE?sbook?OCCURS?10?WITH HEADER LINE.
DO?5?TIMES.
??itab-bookid?=?100?+ sy-index.
??APPEND?itab.
ENDDO.
EXPORT?text1"被存儲的數據來自text1變量
???????text2?FROM?'Literal'"被存儲的數據直接來自FORM后面字符串常量
???????"將'TEST1'與'Literal'存儲到ID為text的ABAP內存中,并且分別以
???????"text1和text2標簽來分類存儲
???????TO MEMORY ID?'text'.
EXPORT?itab"被存儲的數據來自itab變量所對應的內存
????????TO MEMORY ID?'table'.
SUBMIT?zjzjimpt1?AND RETURN."調用其他程序并等待返回
?
REPORT??zjzjimpt1.
DATA:?text1(10),
??????text3?LIKE?text1.
"從ID為text的ABAP內存區域讀取分類存儲標簽為text1
"的內存數據并存儲到text1變量中去
IMPORT?text1?FROM MEMORY ID?'text'.
WRITE:?/ sy-subrc,?text1.
"從ID為text的ABAP內存區域讀取分類存儲標簽為text2
"的內存數據并存儲到text3變量中去
IMPORT?text2?TO?text3?FROM MEMORY ID?'text'.
WRITE:?/ sy-subrc,?text3.
DATA?jtab?LIKE?sbook?OCCURS?10?WITH HEADER LINE.
"從ID為table的ABAP內存區域讀取分類存儲標簽為itab
"的內存數據并存儲到jtab變量中去
IMPORT?itab?TO?jtab?FROM MEMORY ID?'table'.
LOOP AT?jtab.
??WRITE?/ jtab-bookid.
ENDLOOP.
*????0??TEST1
*????0??Literal
*00000101
*00000102
*00000103
*00000104
*00000105
?
l??刪除數據
FREE MEMORY [ID ].
與DELETE FROM MEMORY ID id.等效
如果不附加ID,則此語句刪除整個內存,包括此前用EXPORT存儲到ABAP/4內存中的所有數據簇。附加ID之后,該語句只刪除用此名稱命名的數據簇。
?
用戶登陸后,最多一個系統可以開6個窗口,這在SAP中稱為External Mode。而同一個窗口中,運行某程序后,可以通過CALL TRANSACTION/SUBMIT或其他代碼跳轉到其他程序,這個稱為Internal Mode。Internal Mode的調用棧最多為9層。那么ABAP Memory,它是屬于Internal Mode間可以共享的數據,而External Mode間無法共享。所以,ABAP Memorcy只能在同一窗體中共享,這與瀏覽器中的Session是一樣的。
?
SAP Memory(同一用戶的不同窗口Session)
更多請參考《數據共享與傳遞.docx》中的SAP Memory語句章節
?
同一客戶端的不同窗體(External Mode)它們之間共享數據必須通過SET/GET PARAMETER語句,不再是EXPORT/IMPORT的模式。
?
例子.?創建程序A,輸入:
DATA?matnr?TYPE?matnr.
GET?PARAMETER?ID?'ytest'?FIELD?matnr.
WRITE?matnr.
創建程序B,輸入:
DATA: matnr?TYPE?matnr.
matnr =?'000000000000012345'.
SET PARAMETER ID?'YTEST'?FIELD?matnr.
在窗口1運行程序B并關閉后,在窗口2運行程序A,發現程序A仍然讀到了SAP Memory的值。
?
說明:
1、??調試時,可通過點擊Goto->System Area->SAP Memory,查看到YTEST及其對應的值。
2、??SET/GET PARAMETER的值與本次登陸有關,當用戶注銷后才失效。在用戶登陸的時候,系統會根據每個用戶System->User Profile->Own Data->Parameter下的設置,載入到SAP Memory。
3、??在Data Element中可以看到Further Characteristics下可定義PARAMETER ID,代表該字段作為屏幕元素時,可讀取該PARAMETER ID作為默認值。比如VA03會自動顯示剛剛創建的訂單號。
?
SHARED MEMORY/SHARED BUFFER(不同Client、Job)
前面介紹的都是用戶內存,那么不同用戶間如何實現數據共享呢?可以用SHARED MEMORY或SHARED BUFFER,它們是服務器上的某片所有用戶共享的內存。關于SHARED MEMORY和SHARED BUFFER的區別,可以F1查看幫助。如果EXPORT SHARED BUFFER,則必須IMPORT SHARED BUFFER才能讀到,用IMPORT SHARED MEMORY是讀不到的。反過來也是。
?
例子.?創建程序A,輸入:
DATA?matnr?TYPE?matnr.
IMPORT?matnr?FROM?SHARED?BUFFER?indx(aa)?ID?'YTEST_MATNR '.
WRITE?matnr.
創建程序B,輸入:
DATA: matnr?TYPE?matnr.
matnr =?'000000000000123456'.
EXPORT?matnr?TO?SHARED?BUFFER?indx(aa)?ID?'YTEST_MATNR'.
先在用戶1的電腦上運行程序B,然后在用戶2的電腦上運行程序A,發現用戶2可以讀取到值。
?
說明:
1、??既然是服務器上的所有用戶共享空間,那么該值將保存到服務器關機重啟為止,除非用戶用DELETE語句清除它。其實這個跟ENQUEUE/DEQUEUE有點相似之處。
2、??數據庫也可共享數據,不過服務器共享肯定速度快些。
3、??INDX是系統中存在的符合特定格式要求的表。但這不代表該EXPORT/IMPORT語句將在表INDX中增加記錄,僅僅代表服務器借用了INDX的結構來管理該片共享內存。
總結
以上是生活随笔為你收集整理的程序间数据共享与传递(3):EXPORT/IMPORT、SAP/ABAP Memory的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序间数据共享与传递(2):EXPORT
- 下一篇: LTRIM、RTRIM和TRIM在ORA