1. 基礎知識:
ABAP程序在首次執行前(或新版本激活後,再次執行時),會經歷編譯的過程,生成一個可執行對象LOAD, 這個可執行對象是存儲在應用服務器AS的buffer裏的。
其實對於運行環境而言,ABAP程序由兩部分組成:一部分是固定不可修改的,例如編譯後的可執行代碼、程序中的文本、常量等等,這些內容會存儲在PXA(Program Execution Area)中。另一部分,對程序而言,是可能發生變化的內容,例如程序運行中的變量等,這一部分的內容會存儲在Roll Area中。
當同一個程序被併發執行多次時(被1個User同時執行多次,或者多個User同時併發單獨執行),都會爲每次一運行分配獨立的Roll Area. 這也就是不同user同時執行一個相同的程序時,並不會相互干擾的原因。
2. External Session vs. Internal Session
學習ABAP Memory和SAP Memory,首先要區分External Session和Internal Session的概念。
- External Session: 一個External Session就是一個獨立的GUI Window. 在SAP GUI中默認定義最大可有6個External Session,也即最多可以有6個獨立的GUI Window。當然,這個是可以由Basis配置的,因爲在SAP NW 7.0以上的版本,最多可以支持16個External Session。
- Internal Session:在一個External Session中,又可以有多個Internal Session。在ABAP程序中,可以通過SUBMIT, CALL TRANSACTION等方式產生新的internal session,系統對於每一個Internal Session會分配單獨的Roll Area。ABAP中,在一個program中,最多可以有9個Internal Session.
產生Internal Session的語法,區別如下:
執行完會返回 | 執行完不會返回 |
---|---|
SUBMIT program_name AND RETURN | SUBMIT program_name ** |
CALL TRANSACTION tran_name | LEAVE TO TRANSACTION tran_name |
3. ABAP Memory vs. SAP Memory
ABAP Memory是Internal Session間可共有的內存空間;而SAP Memory是External Session間可共有的內存空間,它們的關係見下圖:
可以使用ABAP在Internal Session見進行數據傳遞,當前Session結束後,ABAP Memory會自動釋放。
可以使用FREE MEMORY ID xxx的方式進行手動釋放。
下面給出了一個利用ABAP memory進行數據傳遞的例子。
REPORT ztest_calculate_main.
**********************************************************************
* ABAP Memory
**********************************************************************
DATA: lv_a TYPE i,
lv_b TYPE i.
lv_a = 1.
lv_b = 2.
EXPORT val_1 = lv_a
val_2 = lv_b
TO MEMORY ID 'test_val_id'.
SUBMIT ztest_calculate AND RETURN.
WRITE: / 'run successfully.'.
REPORT ztest_calculate.
DATA: lv_val_1 TYPE i,
lv_val_2 TYPE i,
lv_sum TYPE i.
IMPORT val_1 = lv_val_1
val_2 = lv_val_2
FROM MEMORY ID 'test_val_id'.
lv_sum = lv_val_1 + lv_val_2.
WRITE:/ 'result = ', lv_sum.
可以使用SAP Memory在External Session間進行數據傳遞,例如在SU3中維護的user parameter其實就是使用的SAP Memory。
SAP Memory在user退出系統登錄後自動釋放。
** In external session 1 - Set
DATA: ls_bkpf TYPE bkpf.
SET PARAMETER ID 'BUK' FIELD ls_bkpf-bukrs.
** In external session 2 - Get
DATA: ls_header TYPE bkpf.
Get PARAMETER ID 'BUK' FIELD ls_header-bukrs.
當然,也可以使用SAP Memory在Internal Session間進行值的傳遞,如下例:
**********************************************************************
* SAP Memory
**********************************************************************
DATA: ls_bkpf TYPE bkpf.
SELECT * FROM bkpf INTO ls_bkpf
UP TO 1 ROWS
WHERE gjahr = 2018.
ENDSELECT.
IF sy-subrc = 0.
SET PARAMETER: ID 'BUK' FIELD ls_bkpf-bukrs,
ID 'BLN' FIELD ls_bkpf-belnr,
ID 'GJR' FIELD ls_bkpf-gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
WRITE: / 'back from FB03'.