【Link Program】使用ABAP Memory与SAP Memory

近日,有朋友在看过前面的一篇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。从大类上来分,主要可以通过以下的图示表述:

clip_image002

其中

”被调用程序插入型”是指:调用程序(calling program)并不结束,当遇到Link 语句时,会去执行被调用程序(called program),当被调用程序结束后,调用程序继续执行;

”调用程序中止型”是指:调用程序(calling program)当遇到Link 语句时会中止,然后去执行被调用程序(called program);

其次,还得理解一个SAP关于session的处理逻辑;在SAP中,我们一般会有三种session之分,它们之间的关系可以用以图进行简单的描述:

clip_image004

其中一个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.

 

最后程序运行结果:

clip_image002[5]

可以发现两个独立的程序使用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,它的属性如下:

clip_image005

业务中,比如说,我们第一次使用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.

clip_image007

进行创建,并保存。

clip_image009

创建Data element.

clip_image011

Parameter ID

clip_image013

进行创建,并保存。

下面分别就自动与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:

clip_image002[7]

创建测试程序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:

clip_image004[5]

同时它带有一个Trasanction code:

clip_image006

然后,测试顺序:

Program 1 :输入parameter内容à Program 2:修改传过来的内容àProgram 1.

例如:

Program 1:

clip_image008

F8执行:

Program 2:

clip_image010

然后修改: EDISON1 à EDISON2.

clip_image012

然后点击Go back to Program 1:

clip_image014

数据传递正确。

【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:

clip_image002[9]

执行后:

clip_image004[7]

数据传递正确。

 

 

 

 

 

 

(一)         Difference Between SAP and ABAP Memory  
(1) 、读取和使用方法不同
SAP
内存使用SET/GET parameters方法;
SET PARAMETER ID 'MAT' field p_matnr.
GET PARAMETER ID 'MAT' field p_matnr.

ABAP
内存使用EXPORT IMPORT  方法;
export p_matnr = p_matnr to memory id 'ZTESTMAT'.
import p_matnr = p_matnr from memory id 'ZTESTMAT'
(2) 、共享范围不同
SAP
内存可以被所有的主 session 访问,内存数据可以在同一个 session 中不同程序之间,或者不同 session 之间共享数据;
ABAP
内存只能在同个 session 的不同程序之间共享数据;
(3) 、作用范围不同
SAP
内存在整个终端 session 时间内都有效;
ABAP
内存只能在一个 session 时间内有效;
(4) 、使用一般原则
SAP
内存用于屏幕默认值输入;
ABAP
内存用于模块之间传替数据

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值