[轉]ABAP Memory/SAP Memory/Shared Buffer/Database

sdvingo發表於2010-10-12
ABAP提供了IMPORT/EXPORT 和 SET/GET PARAMETER語句,可對使用者記憶體/伺服器記憶體/資料庫進行儲存和訪問。不過可能很多人對此還不是很瞭解,下面我們透過例項來測試它們的區別和聯絡。
1. 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,類似於定義全域性變數的效果。
2. 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會自動顯示剛剛建立的訂單號。
3. 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的結構來管理該片共享記憶體。
4. 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的過程則相反,系統將把這些條相關記錄又自動組合起來成為一個整體。
[@more@][轉]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/443058/viewspace-1039646/,如需轉載,請註明出處,否則將追究法律責任。

相關文章