近日,有朋友在看过前面的一篇Link Program(请参阅:【Link Program】使用Link Program)的介绍后,询问到很多关于Link的应用,如call transaction, leave to transaction等,其中最为重要的是使用Link program后数据如何共享如何进行传递的问题.关于Link的应用,是SAP开发过程中相当重要的一部分.
以前并没有对该topic进行一个比较全面的总结,这次再回过去查阅查阅资料(毕竟需要严谨,不能全靠记忆),然后分成了两篇,这里先进行记录ABAP/SAP Memory,后面将记录在JOB间如何进行数据共享.
使用ABAP/SAP Memory,是因为它们可以在SAP中充当着“数据存储器”的作用,就比如DB、File等,同时程序中,因为我们大量地使用着Link program,所以为了数据的共享或者传递。
首先简要地总结一下Link program。从大类上来分,主要可以通过以下的图示表述:
其中
”被调用程序插入型”是指:调用程序(calling program)并不结束,当遇到Link 语句时,会去执行被调用程序(called program),当被调用程序结束后,调用程序继续执行;
”调用程序中止型”是指:调用程序(calling program)当遇到Link 语句时会中止,然后去执行被调用程序(called program);
其次,还得理解一个SAP关于session的处理逻辑;在SAP中,我们一般会有三种session之分,它们之间的关系可以用以图进行简单的描述:
其中一个logon user session中可以最大6个external session,一个external session中最大可以使用20个Internal session.
同时,一个external session对应着一个ABAP session;所以,一个window里的internal session共用着同一个ABAP session;所以,在一个user logon session中不同的window(external session)共同使用一个SAP memory;
最后,需要再理解各种Link program与Memory的关系:
同步的Link Program: (1)对于FM: 当一个FM被调用时,它对应的Function Group被load进当前的这个 internal session,当其处理完了,calling program继续被处理;(该Function Group下的global data可以继续被使用). (2)对于call transaction或submit and return 当运行到这种情况时,系统会重新运行一个internal session,当called program结束后(也可以是使用leave program),这个internal session会被delete掉,然后calling program继续运行. (3)对于Submit 当运行到这种情况时,calling program从当前的internal session中被移走,而called program被load进这个internal session. (4)对于Leave to Transaction 当运行到这种情况时,当前External session中的所有internal session被清掉,而called transaction将会在该external session中新开一个internal session; 另外,该种情况下,该external session所对应的ABAP memory将会被initialize,所以这种情况下,我们不能使用ABAP memory来传递数据,而应该使用SAP Memory; 异步的Link Program: 当遇到这种FM时,将会重新打开一个external session,它并行地、独立于当前的external session. |
所以,在同一个external session的Link program我们使用ABAP Memory进行传递数据;而在不同的external session间的Link program我们使用SAP Memory进行数据传递。
另外,对于FM而言,因为它依附于Function Group,所以,一般如果我们使用FM需要数据传递或者共享的话(除了FM自己的import/export/table外),我们是使用Function Group的全局变量;
Export TO MEMORY ID ‘ |
使用export将数据传递至ABAP Memory,或者理解为再开辟了一块cluster区域;
注意:如果使用了相同的ID,那么后面的将会overwrite前面已存在的值;其中ID最大32位;
IMPORT FROM MEMORY ID ‘ |
使用import将数据从ABAP Memory中读取过来;
注意:这里也可以只从ABAP memory中的该ID(cluster)中读取部分参数值;
* FREE MEMORY ID < MEM_ID >:清空指定的ID(Cluster) * FREE MEMORY:清空整个ABAP memory |
使用free可以清空ABAP memory;
在前面通过对Link program的叙述中也已经得知,我们可以使用ABAP Memory在以下的Link program中,因为它们都是”真正”地共用着同一块External Session:
(1) FM(同步)
(2) Call transaction
(3) Submit and return
(4) Submit(虽然会将calling program从当前的Internal session中清掉)
这里简要地只测试submit间利用ABAP Memory进行数据传递.
程序1,它主要完成:
(1) 清空该memory ID
(2) 向memory ID传递一个work area
(3) 向memory ID传递一个Internal table
(4) 向memory ID传递一个Parameter
*&———————————————————————* *& Report ZTEST_ABAP_MEM_PROG1 * *& * *&———————————————————————* *& * *& * *&———————————————————————*
REPORT ZTEST_ABAP_MEM_PROG1 No standard page heading .
*—Data & Types data: gs_scutom type scustom, gt_scustom type table of scustom, gv_para type char10.
start-of-selection.
*—Free Memory Free memory ID ‘TEST1′.
*—Retrieve data
*1. Get the structure select single * from scustom into gs_scutom where ID = ‘00000001′.
*2. Get the table select * from scustom into table gt_scustom up to 10 rows where COUNTRY = ‘DE’ .
*3. Set the parameter gv_para = ‘EDISON_TC’.
*4. Export to ABAP Memory Export gs_scutom gt_scustom gv_para To Memory ID ‘TEST1′.
*5. Submit Program 2 Submit ZTEST_ABAP_MEM_PROG2.
|
程序2,它主要完成:
(1) 从memory ID取得一个work area
(2) 从memory ID取得一个Internal table
(3) 从memory ID取得一个Parameter并同时赋给选择屏幕上的parameter
*&———————————————————————* *& Report ZTEST_ABAP_MEM_PROG2 * *& * *&———————————————————————* *& * *& * *&———————————————————————*
REPORT ZTEST_ABAP_MEM_PROG2 No standard page heading .
*—Data & Types data: gs_scutom type scustom, gt_scustom type table of scustom, gv_para type char10.
data: ls_scutom type scustom.
parameter: p_para type char10.
start-of-selection.
*1. Get the data from ABAP Memory Import gs_scutom gt_scustom gv_para to p_para From Memory ID ‘TEST1′.
*2. Write the data write:/ ‘1. The structure:’, 10, gs_scutom-id, 20, gs_scutom-NAME, 30, gs_scutom-COUNTRY. uline /(100).
write:/ ‘2. The table:’. Loop at gt_scustom into ls_scutom. write:/10 ls_scutom-id, 20, ls_scutom-NAME, 30, ls_scutom-COUNTRY. endloop. uline /(100).
write:/ ‘3. The parameter:’,p_para.
|
最后程序运行结果:
可以发现两个独立的程序使用ABAP memory进行了成功的数据传递。
不同于ABAP Memory,可以直接在程序中进行指定;对于SAP Memory,它其实是利用的是我们经常所说的SPA/GPA,也就是set parameter和get parameter;所以,这里首先得创建parameter ID;
创建Parameter,我们一般是使用SE80 object Navigator来进行创建,它最长为20位;Parameter的数据是存于数据库表TPARA;
SET PARAMETER ID ‘ FIELD ‘ |
使用上述语句在SAP Memory中将该parameter设上了值;
GET PARAMETER ID ‘ FIELD ‘ |
使用上述语句从SAP Memory中将该parameter的值读取出来;
而在一般的应用上,我们很多时候并不是像ABAP Memory那样直接在程序中完成了Set与Get方法;相反,一般是将其绑定给某一Data element(并激活着Set与Get方法),从而任何其他程序使用了该Data element的地方都将会有“default”值,也就是说在一个地方的data element的改变会影响其他地方,从而也就达到了数据传递的效果;我们自己在开发Dynpro的程序时,有时候根据实际的需求,也会勾选某些element的SPA/GPA属性(在SE51 Screen Painter中); 其实,这也是SAP标准所采用的技术,很简单地一个例子就是, Material Number的data element为MATNR,它的属性如下:
业务中,比如说,我们第一次使用MM01创建了一个Material,那么当我们再打开另一个Window/External session时,Material Number的栏位里就是我们刚创建的material number;
这样的例子还有很多。
在前面的分析中,我们可以知道,SAP Memory对于一个user log session都是共用的,也就是说上面的FM、Submit、Submit and return、call transaction、Leave to transaction都是可以使用它来进行数据传递的。
这里仅测试leave to transaction的使用SAP Memory,因为它是不能使用ABAP Memory的。
创建Parameter ID.
进行创建,并保存。
创建Data element.
Parameter ID
进行创建,并保存。
下面分别就自动与coding两种方式进行阐述SAP Memory。
创建测试程序1.
它是一个普通的Report程序,它只有一个parameter,但addition了一个parameter ID.然后F8执行会跳转到program 2.
*&———————————————————————* REPORT ZTEST_SAP_MEMORY_1 NO STANDARD PAGE HEADING. *—Parameter start-of-selection. *—Using SAP Memory |
其中测试程序1也创建了一个transaction Code:
创建测试程序2.
它是一个普通的Dynpro程序,它只有一个Screen,在这个Screen上面有一个Input field,同时该input field激活了SAP与GPA并指定了其parameter ID.当点击Application bar上的回到program1后会跳转到program 1.
PAI程序: (Function Code “PROG1”即是button回到program1)
MODULE USER_COMMAND_0100 INPUT. CASE SY-UCOMM . ENDMODULE. “ USER_COMMAND_0100 INPUT |
Screen上的input field:
同时它带有一个Trasanction code:
然后,测试顺序:
Program 1 :输入parameter内容à Program 2:修改传过来的内容àProgram 1.
例如:
Program 1:
F8执行:
Program 2:
然后修改: EDISON1 à EDISON2.
然后点击Go back to Program 1:
数据传递正确。
创建测试程序3.
它是一个普通的Report程序,它只有一个parameter,但addition了一个parameter ID.然后F8执行会跳转到program 4.
*&———————————————————————* REPORT ZTEST_SAP_MEMORY_3 NO STANDARD PAGE HEADING. *—Parameter start-of-selection. *—Using SAP Memory *1. Set Parameter ID *2. Leave to Transaction –> program 4 |
创建测试程序4.
它也是一个普通的Report程序。负责从SAP Memory中抽取数据并显示在选择屏幕上。
*&———————————————————————* REPORT ZTEST_SAP_MEMORY_4 NO STANDARD PAGE HEADING. *—Parameter *1. Retrieve the value from Parameter: Okay!! *2. Retrieve the value from Parameter: Not Okay!! “* Get Parameter ID *3. Retrieve the value from Parameter: Okay!! *4. Retrieve the value from Parameter: Not Okay!! |
注意,在这里,分别进行了上述四种event-block的测试,可以从上面知道哪些event-block是能成功抽取的。
测试结果:
运行program 3:
执行后:
数据传递正确。