ABAP程序間傳遞數據的幾種方法


原文標題:ABAP Memory, SAP Memory, Shared Buffer, Database

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的過程則相反,系統將把這些條相關記錄又自動組合起來成為一個整體。

 

附:用戶終端會話示意圖

用戶終端會話

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM