sap memory & abap memory

Upload: abel-wei

Post on 07-Jul-2018

276 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 SAP Memory & ABAP Memory

    1/10

    以前做 enhancement 的时候用过 parameter id 和  memory id, 但很多其他语法用法我是没接

    触过的, 今天看了 Palm 同鞋做的文档 SAP Memory & ABAP Memory, 做了一些测试, 本文几

    乎所有内容来自 Palm 同鞋的文档.

    1、先弄清 External Session 和 Internal Session 区别:

    External Session: 

    当 user 登陆 SAP 后, 就开启了一个 userlogon session。当 user 退出所有 sap window, 就结束

    了这个 user logon session。一个 userlogon session 最多有 6 个 external session(即 main session,

    对应有 6 个窗口).

    Internal Session: 

    在一个 external session   内调用其它程序将会生成新的 internal session, 比如 call FM, call

    transaction 或是 submit*** and return 等方式。  当关掉这个 external session 时,也就结束了

    external session 下的所有 internal session。一个 External session 最多有 20 个 Internal session.

    对 于 上 面 这 几 个 session   之 间 的 关 系 可 以 这 么 简 单 概 括 :

    User session > external session > internal session。 

    SAP memory 类似于全局变量,用于 Externalsession 间的通信,不同的 externalsession 都可以

    访问,当退出 userlogon session 时将清空 SAPmemory(不同 user 对应的 SAPmemory 不同)。 

    ABAP memory 类似于局部变量,用于同一 externalsession 下 internalsession 间的通信,不同

    的 externalsession 有不同的 ABAPmemory,同一个 externalsession 里的 internalsession 只能访

    问相应 session 的 ABAP memory。 

    2、网上写的两者几个不同点:

    1. 使用的语句不同 

    SAP memory 使用 SET/GET parameters; 

    SPA:SET PARAMETER ID 'MAT' FIELD p_matnr.

    GPA:GET PARAMETER ID 'MAT' FIELD p_matnr.

    ABAP Memory 使用 EXPORT 和 IMPORT :

    EXPORT p_matnr = p_matnr TO MEMORY ID 'ZTESTMAT'.

    EXPORT p_matnr = p_matnr FROM MEMORY ID 'ZTESTMAT'

    FREE MEMORY ID 'ZTESTMAT'. 清空指定的 ABAPmemoryFREE MEMORY. 清空 externalsession   内的所有

    ABAPmemory

    3、共享范围不同 

    SAP memory   用于所有 external session   间,ABAP memory  用于同一个 external session   的

    internal session 间。 

    4、作用范围不同(就是生存期) 

    SAP memory 在登陆到退出这期间一直有效。 

    ABAP memory 只在同一个 session(window) 内有效。 

    3、SAP Memory:

  • 8/19/2019 SAP Memory & ABAP Memory

    2/10

     

    1. 给 SAP Memory 赋值 

    创建程序 ZTEST_SET_SAP_MMR 给‘SAP_MMR'赋值'12345'.

    2.获取 SAP Memory 的值并显示在选择屏幕上 

    创建另一个程序 ZTEST_GET_SAP_MMR,并为 PR_TEST 指定 Memory ID ,这样 SAP_MMR 的值

    将会作为默认值显示在 selection screen 上。 

    运行结果,默认值显示在屏幕上: 

    因为 field 与 SAP Memory 绑定了,在 selection screen 上如果修改对应的值,比如将'12345'

    改成'123'后按 F8,也将修到 SAP memory 的值.重新运行程序如下: 

    3. Dialog 获取 SAPMemory 方式 

    在 dialog 屏幕上建一个 input field, 然后 Parameter ID 属性与'SAP_MMR'绑定,并打上 2 个勾。 

    Set Parameter: 允许将屏幕值返回给 SAP Memory (类似于执行 SET PARAMETER ID 语句)

    Get Parameter: 允许读取 SAP Memory 的值并默认显示(类似于执行 GET PARAMETER ID 语句).

    在程序里声明该变量:

    给程序创建一个 T-code

    运行结果(勾上 set parameter 后,当修改屏幕上的数值时也会反映到 SAP memory 里):

    备注:在 Data Element 里有一个地方可以填 Parameter ID(这个方法好无聊,但 SAP 可能为了规

    范参照同一 data element 的 parameter ID,就用了这方法....我只想到这用法,这优点).

    创建一个 Data Element,并创建一个 Parameter ID(存在表 TPARA 里,以 Z 或 Y 打头):

  • 8/19/2019 SAP Memory & ABAP Memory

    3/10

     

    绑定给 table 或 structure:

    在 Dialog 里输入 table-field 名字时,会提示是否参照 Dictionary.

  • 8/19/2019 SAP Memory & ABAP Memory

    4/10

     

    选是了后会自动带出 Parameter ID.

    此时需要勾上 Set Parameter 和 Get Parameter 并在代码里声明 ZTESTTEST 才有效.

    4. 通过 Get parameter ID 语句获取 SAP memory 的值,并赋给 LV_TEST

  • 8/19/2019 SAP Memory & ABAP Memory

    5/10

    如果 SET Parameter ID 后退出所有 sessions,SAP memory 将被清空,重新登陆 Get Parameter

    ID 将取到空值。 

    如果 SET Parameter ID 后其它 user 用 Get Parameter ID 也取不到相应的值。 

    5. TCODE SU3 设置 PARAMETER ID

    在 TCODE SU3 设置了 PARAMETER ID 后, 运行语句 GET PARAMETER ID 后就能读到设置的相

    关 PARAMETER ID 的值. 它的功能相当于 SET PARAMETER ID.

    4、ABAP Memory:

    1.建了个程序和 FM: 

    将数据丢到 ABAP 内存'ABAP_MMR',被调用的 FM 是在 internal session 内运行(或是用 submit

    和 call transaction)。 

    程序代码:(类的方法里不能使用这种语法,只能用下面的第二、三种)

  • 8/19/2019 SAP Memory & ABAP Memory

    6/10

     

    FM 代码: 

    运行结果,FM 里可以取到 ABAP memory 的值。 

    在程序里取'ABAP_MMR'的值,调用同一个 FM 取值。 

    代码: 

  • 8/19/2019 SAP Memory & ABAP Memory

    7/10

    如果跑完第一步的程序后不关闭窗口再跑这个程序,那么可以成功读到LV_TEST 的值。 

    程序:

    FM:

    如果跑第一步的程序后用另一窗口(external session)跑第二步程序,将读取不到数值。 

    运行结果: 

    程序:

    FM:

    3.如果 export   和 import   的参数名字不同,则需要指定对应参数名(很纠结的,被赋值的

    Lv_test_2 要放在  = 右边,但用  to 的话会比较直观)。 

  • 8/19/2019 SAP Memory & ABAP Memory

    8/10

     结果: 

    4. Export 多个数据放到 ABAP memory 里。 

    结果: 

  • 8/19/2019 SAP Memory & ABAP Memory

    9/10

     

    5. Free Memory:会清空该 external session 内所有的 ABAP Memory.

    程序:ZTEST_SET_ABAP_MMR_4

    用了 Free Memory ID 后'ABAP_MMR_1'和'ABAP_MMR_2'都为空,无法用 import 取值.

    6. Free Memory ID: 清空指定 ABAP Memory ID 的内容, 其它的 ID 不受影响.

    用 了 FREE MEMORY ID 'ABAP_MMR_3'. 后 , 'ABAP_MMR_3' 的 数 据 将 被 清 空 , 无 法 取 值 , 但

    'ABAP_MMR_4'不受影响,可以取到 LV_TEST 的值(放在 LV_TEST_5 里).

    如果将多个变量一直放在同一 ID 内, 如果用了 Free Memory 或是 Free Memory ID(指定这个

    ID),那这个 ID 内的所有变量将被全部清空.

    网上还说到另外两种传输方式.

  • 8/19/2019 SAP Memory & ABAP Memory

    10/10

    Share Memory 或 Share Buffer 用于不同用户间的数据传递.

    当使用 DELETE FROM SHARED BUFFER 语句或是服务器关闭后该内存才会被清空.

    使用 TOSHARED BUFFER 要用 FROMSHARED BUFFER 取值.

    使用 TOSHARED MEMORY 要用 FROMSHARED MEMORY 取值.

    语法和普通 MEMORY ID 是一样的 

    Database 将数据存进表里, 就算服务器关了数据还存在.

    表 INDX 会多一条记录.

    读取数据:

    语法和普通 MEMORY ID 是一样的 

    关于这个 memory id, database 还有一些细节可以参考老白的博客