SAP內存管理
內存是程序之間為了傳遞數據而使用的共享存儲空間
SAP內存分類:1、SAP內存,2、ABAP內存
這兩種內存都是針對同一登錄用戶實現數據共享。
SAP內存(SAP Memory)和ABAP內存(ABAP Memory),兩者都可用于編程中的數據傳遞,將數據通過ID進行綁定,之后在其他程序中通過ID獲取。
先引入三個概念,User Session、External Session 和 Internal Session。
當用戶登錄SAP就生成了User Session。
打開一個窗口界面,就產生了一個External Session,窗口關閉,則External Session釋放。
SAP NW 7.0之前的版本,一次最多打開6個窗口,也就是6個External Session。之后的版本最多打開16個窗口。
在一個窗口內,通過CALL TRANSACTION,SUBMIT等方式調用程序,則會自動打開Internal Session,此處會根據調用打開多個Internal Session。當窗口關閉時,則釋放該External Session下的所有Internal Session。
用戶退出登錄,則關閉所有External Session和Internal Session。
理解了這三個概念,ABAP內存是在Internal Session之間進行數據傳遞,而SAP內存是在External Session之間進行數據傳遞,當然也可以傳數據到Internal Session中。
通俗的講,ABAP內存是在同一個窗口內運行的程序之間,進行數據傳遞。而SAP內存,可以在多個窗口之間進行數據傳遞。
1、SAP內存
? ?
全局內存,用戶終端會話內的所有外部會話都可以訪問,實現主會話之間的數據共享(主會話:即單開的SAP窗口,SAP最多支持同時打開6個主會話)
基本語句:SET PARAMETER / GET PARAMETER語句來共享內存,實現傳值。
(也可以在PARAMETERS 或 SELECT-OPTION變量中使用 MEMORY ID 來連接字段與參數)
SET PARAMETER ID 'MAT' FIELD p_matnr.?
?
GET PARAMETER ID 'MAT' FIELD p_matnr.
2、ABAP內存
? ? ? ?
內部會話之間的數據共享(內部會話:在主會話中進行程序調用時,即call function,還在當前窗口中調用產生的窗口,就叫內部會話)。只有在同一個窗口執行的程序才能共享內存
?基本語句:
?EXPORT obj1 … objn TO MEMORY ID key.
?IMPORT obj1 … objn FROM MEMORY ID key.
FREE MEMORY ID ''.
注意:在每個程序里使用的內存有ABAP內存和SAP內存
3.?標準SAP內存ID的應用
在SAP中,定義了很多SAP內存ID,存放在TPARA表中,通常也與數據元素綁定
如:公司代碼,MARA-MATNR物理編碼。VBAK-銷售訂單號,會計憑證號,憑證貨幣等等
如此,可以通過SAP拋內存的方式,為初始屏幕中的字段填值, 如手工憑證錄入的功能中:
作用就是通過內存傳值,自動賦值對應的屏幕等字段
如MM物料編碼的應用:
搭配AND SKIP FIRST SCREEN,就自動打開對應的物料視圖。類似平時在報表中常用的穿透。
對于SAP內存傳值的應用還很多。再比如,當批導上傳EXCEL時,為了能記錄上次導入的文件地址,避免重復選擇文件,通常在文件后邊加上MEMORY ID。此應用也是使用了SAP內存傳值
上傳文件地址
?如果此時用接內存的方式,運行程序就能得到批導程序上傳的文件路徑
當然此時運行其他批導程序,而且MEMORY ID相同,則其他程序也會自動帶出上一個批導程序的文件路徑
所以內存傳值也可以用在一些個性化細節的需求開發。
sap 四種數據共享方式
ABAP Memory/SAP Memory/Shared Buffer/Database
ABAP提供了IMPORT/EXPORT 和 SET/GET PARAMETER語句,可對用戶內存/服務器內存/數據庫進行存儲和訪問。
不過可能很多人對此還不是很了解,下面我們通過實例來測試它們的區別和聯系。
-
ABAP Memory
-
用戶登陸后,最多一個系統可以開6個窗口,這在SAP中稱為External Mode。而同一個窗口中,運行某程序后,可以通過CALL TRANSACTION/SUBMIT或其他代碼跳轉到其他程序,這個稱為Internal Mode。Internal Mode的調用棧最多為9層。那么ABAP Memory,它是屬于Internal Mode間可以共享的數據,而External Mode間無法共享。
例子. 創建程序A,輸入:
DATA matnr TYPE matnr.
IMPORT matnr FROM MEMORY ID ‘YTEST_MATNR’.
WRITE matnr.
創建程序B,輸入:
DATA matnr TYPE matnr.
matnr = ‘000000000000001234’.
EXPORT matnr TO MEMORY ID ‘YTEST_MATNR’.
SUBMIT y_program_a. “調用程序A
直接運行B,發現程序A從ABAP Memory讀到了值并輸出到LIST.
說明:
(1)調試運行B到EXPORT語句后面,Goto-System Area-ABAP Memory,可以查看到名為YTEST_MATNR的一片內存。
(2)如果B和A運行在不同的窗口,則A將訪問不到數據;當用戶輸入/N退出當前程序時,內存值也將被清空。
(3)該語句適用于CALL TRANSACTION/SUBMIT過程中的數據共享,也常用于User Exit,類似于定義全局變量的效果。
-
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的值與本次登陸有關,當用戶注銷后才失效。在用戶登陸的時候,系統會根據每個用戶
User Profile-Own Data-Parameter下的設置,載入到SAP Memory。
(3)Data?Element中可以看到Further Characteristics下可定義PARAMETER ID,代表該字段作為屏幕元素時,可
讀取該PARAMETER ID作為默認值。比如VA03會自動顯示剛剛創建的訂單號。
-
SHARED MEMORY/SHARED BUFFER
前面介紹的都是用戶內存,那么不同用戶間如何實現數據共享呢?可以用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的結構來管理該片共享內存。
-
DATABASE
- 上面說了SHARED BUFFER并不訪問數據庫,而要訪問數據庫就應該用DATABASE。
創建一個程序,錄入代碼:
DATA: matnr TYPE matnr.
matnr = ‘000000000000004321’.
EXPORT matnr TO DATABASE indx(aa) ID ‘YTEST_MATNR’.
執行程序,然后SE16查看表INDX,發現新增了一條RELID = AA, SRTFD = YTEST_MATNR的記錄。如果EXPORT
的數據量比較大,則新增的將是多條,這些條目的字段值SRTF2從0遞增。所以EXPORT DATABASE與普通數據庫操
作的不同之處是,它適合大數據量的操作,系統自動將其拆分成多條記錄并存儲到數據庫中,比如圖片或文檔。而用
IMPORT DATABASE的過程則相反,系統將把這些條相關記錄又自動組合起來成為一個整體。