设为首页 收藏本站
查看: 594|回复: 0

[经验分享] 【Link Program】使用ABAP Memory与SAP Memory 转自(作者:edison_tc)

[复制链接]

尚未签到

发表于 2015-9-20 09:25:02 | 显示全部楼层 |阅读模式
  近日,有朋友在看过前面的一篇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&prime;.
  
  *—Retrieve data
  
  *1. Get the structure
  select single * from scustom
  into gs_scutom
  where ID = ‘00000001&prime;.
  
  *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&prime;.
  
  *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&prime;.
  
  *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&prime;.
  其中测试程序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&prime;.
      LEAVE to TRANSACTION ‘ZSAP_MEM_1&prime;.
    WHEN OTHERS.
  ENDCASE.
  ENDMODULE.                 “ USER_COMMAND_0100  INPUT
  Screen上的input field:
  
  同时它带有一个Trasanction code:
  
  然后,测试顺序:
  Program 1 :输入parameter内容&agrave; Program 2:修改传过来的内容&agrave;Program 1.
  例如:
  Program 1:
  
  F8执行:
  Program 2:
  
  然后修改: EDISON1 &agrave; 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&prime;
  FIELD p_spa.
  *2. Leave to Transaction –> program 4
  leave to TRANSACTION ‘ZSAP_MEM_4&prime;.
  创建测试程序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&prime;
  FIELD p_spa.
  *2. Retrieve the value from Parameter: Not Okay!!
“INITIALIZATION.
  “* Get Parameter ID
“  GET PARAMETER
“  ID ’ZPARA1&prime;
“  FIELD p_spa.
  *3. Retrieve the value from Parameter: Okay!!
AT SELECTION-SCREEN OUTPUT.
* Get Parameter ID
  GET PARAMETER
  ID ‘ZPARA1&prime;
  FIELD p_spa.
  *4. Retrieve the value from Parameter: Not Okay!!
“AT SELECTION-SCREEN.
“* Get Parameter ID
“  GET PARAMETER
“  ID ’ZPARA1&prime;
“  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

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-116081-1-1.html 上篇帖子: SAP WM 层面仓位调整 下篇帖子: SAP的GUI与浏览器的相同点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表