近日,有朋友在看过前面的一篇Link Program(请参阅:【Link Program】使用Link Program)的介绍后,询问到很多关于Link的应用,如call transaction, leave to transaction等,其中最为重要的是使用Link program后数据如何共享如何进行传递的问题.关于Link的应用,是SAP开发过程中相当重要的一部分.
以前并没有对该topic进行一个比较全面的总结,这次再回过去查阅查阅资料(毕竟需要严谨,不能全靠记忆),然后分成了两篇,这里先进行记录ABAP/SAP Memory,后面将记录在JOB间如何进行数据共享.
1. ABAP /SAP Memory简介
使用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的全局变量;
2. 使用ABAP Memory
(1)ABAP Memory语句
Export
<name> FROM <参数或parameter等>
<work area>
<internal table>
TO MEMORY ID ‘<MEM_ID>’.
使用export将数据传递至ABAP Memory,或者理解为再开辟了一块cluster区域;
注意:如果使用了相同的ID,那么后面的将会overwrite前面已存在的值;其中ID最大32位;
IMPORT
<name> TO <参数或parameter等>
<work area>
<internal table>
FROM MEMORY ID ‘<MEM_ID>’.
使用import将数据从ABAP Memory中读取过来;
注意:这里也可以只从ABAP memory中的该ID(cluster)中读取部分参数值;
* FREE MEMORY ID < MEM_ID >:清空指定的ID(Cluster)
* FREE MEMORY:清空整个ABAP memory
使用free可以清空ABAP memory;
(2)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进行了成功的数据传递。
3. 使用SAP Memory
(1)SAP Memory语句
不同于ABAP Memory,可以直接在程序中进行指定;对于SAP Memory,它其实是利用的是我们经常所说的SPA/GPA,也就是set parameter和get parameter;所以,这里首先得创建parameter ID;
创建Parameter,我们一般是使用SE80 object Navigator来进行创建,它最长为20位;Parameter的数据是存于数据库表TPARA;
SET PARAMETER
ID ‘<par_id>’
FIELD ‘<value>’
使用上述语句在SAP Memory中将该parameter设上了值;
GET PARAMETER
ID ‘<par_id>’
FIELD ‘<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;
这样的例子还有很多。
(2)SAP Memory实例
在前面的分析中,我们可以知道,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。
【2-1. 自动的SPA与GPA】
创建测试程序 1.
它是一个普通的Report程序,它只有一个parameter,但addition了一个parameter ID.然后F8执行会跳转到program 2.
*&———————————————————————*
*& Report ZTEST_SAP_MEMORY_1
*&
*&———————————————————————*
*& Using SAP Memory to transfer Data
*&
*&———————————————————————*
REPORT ZTEST_SAP_MEMORY_1 NO STANDARD PAGE HEADING.
*—Parameter
PARAMETERS: p_spa type ZDELM_1 MEMORY ID ZPARA1.
start-of-selection.
*—Using SAP Memory
*1. Leave to Transaction –> program 2
leave to TRANSACTION ‘ZSAP_MEM_2′.
其中测试程序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 .
WHEN ‘BACK’ or ‘%EX’ or ‘RW’.
LEAVE to SCREEN 0.
when ‘PROG1′.
LEAVE to TRANSACTION ‘ZSAP_MEM_1′.
WHEN OTHERS.
ENDCASE.
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:
数据传递正确。
【2-2. 程序控制SPA与GPA】
创建测试程序 3.
它是一个普通的Report程序,它只有一个parameter,但addition了一个parameter ID.然后F8执行会跳转到program 4.
*&———————————————————————*
*& Report ZTEST_SAP_MEMORY_3
*&
*&———————————————————————*
*& Using SAP Memory to transfer Data
*&
*&———————————————————————*
REPORT ZTEST_SAP_MEMORY_3 NO STANDARD PAGE HEADING.
*—Parameter
PARAMETERS: p_spa type ZDELM_1.
start-of-selection.
*—Using SAP Memory
*1. Set Parameter ID
SET PARAMETER
ID ‘ZPARA1′
FIELD p_spa.
*2. Leave to Transaction –> program 4
leave to TRANSACTION ‘ZSAP_MEM_4′.
创建测试程序 4.
它也是一个普通的Report程序。负责从SAP Memory中抽取数据并显示在选择屏幕上。
*&———————————————————————*
*& Report ZTEST_SAP_MEMORY_4
*&
*&———————————————————————*
*& Using SAP Memory to transfer Data
*&
*&———————————————————————*
REPORT ZTEST_SAP_MEMORY_4 NO STANDARD PAGE HEADING.
*—Parameter
PARAMETERS: p_spa type ZDELM_1.
*1. Retrieve the value from Parameter: Okay!!
LOAD-OF-PROGRAM.
* Get Parameter ID
GET PARAMETER
ID ‘ZPARA1′
FIELD p_spa.
*2. Retrieve the value from Parameter: Not Okay!!
“INITIALIZATION.
“* Get Parameter ID
“ GET PARAMETER
“ ID ’ZPARA1′
“ FIELD p_spa.
*3. Retrieve the value from Parameter: Okay!!
AT SELECTION-SCREEN OUTPUT.
* Get Parameter ID
GET PARAMETER
ID ‘ZPARA1′
FIELD p_spa.
*4. Retrieve the value from Parameter: Not Okay!!
“AT SELECTION-SCREEN.
“* Get Parameter ID
“ GET PARAMETER
“ ID ’ZPARA1′
“ FIELD p_spa.
注意,在这里,分别进行了上述四种event-block的测试,可以从上面知道哪些event-block是能成功抽取的。
测试结果:
运行program 3:
执行后:
数据传递正确。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com