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退出系统登录后自动释放( SAP Memory的这些parameter ID是存储在TPARA表中的,程序中指定的PARAMETER ID必须是TPARA表中存在的)。
** 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'.
通常PARAMETER ID会与Data Element绑定,如下图所示。这样通过PARAMETER ID来为屏幕预填一些default的值。