程序间数据共享与传递:EXPORTIMPORT、SAPABAPMemory ABAP提供了IMPORT/EXPORT 和 SET/GET PARAMETER语句,可对⽤户内存/服务器内存/数据库进⾏存储和访问。
详细请参照《数据共享与传递.docx》⽂档
EXPORT 语句
{= dobj1 p2 = dobj2 ...} |FROM dobj1 p2 FROM dobj2 ...} | )
TO| { id}
| { dbtab() FROM wa] CLIENT cl] ID  }
| { dbtab(ar) [FROM wa] [CLIENT cl] ID id}
| { SHARED dbtab(ar) [FROM wa] [CLIENT cl] ID id}
1.{p1 = p2 = dobj2 ...}与 {p1 FROM dobj1 p2 FROM dobj2 ...}的意义⼀样,只是写法不⼀样,、dobj2…变量将会
以、p2…名称存储到内存或数据库中。、p2…名称随便取,如果p1、p2…与将要存储的变量名相同时,
只需写变量名即可,即等号与 FROM 后⾯可以省略。p1、p2…这些名称必须与IMPORT语句中相⼀致,否则读取不出
2.(ptab):为动态指定需要存储的变量,ptab内表结构要求是这样的:只需要两列,列名任意,但类型需要是字符
型;第⼀列存储如上⾯的p1、p2…名称,第⼆列为上⾯的dobj1、dobj2…变量,如果变量与名称相同,则也可以像上⾯⼀样,省略第⼆列的值。两列的值都必需要⼤写,实例如下:
TYPES:BEGIN OF tab_type,
para TYPE string,"列的名称任意,类型为字符型
dobj TYPE string,
END OF tab_type.
DATA:text1 TYPE string VALUE `TXT1`,
text2 TYPE string VALUE `TXT2`,
line  TYPE tab_type,
itab  TYPE STANDARD TABLE OF tab_type.
line-para = 'P1'."值都需要⼤写
line-dobj = 'TEXT1'."值都需要⼤写
APPEND line TO itab.
line-para = 'P2'.
line-dobj = 'TEXT2'.
APPEND line TO itab.
EXPORT (itab) TO MEMORY ID 'TEXTS'.
IMPORT p1 = text2 p2 = text1 FROM MEMORY ID 'TEXTS'.
WRITE: / text1,text2."TXT2 TXT1
CLEAR: text1,text2.
IMPORT (itab) FROM MEMORY ID 'TEXTS'.
WRITE: / text1,text2."TXT1 TXT2
3.:将变量存储到ABAP Memory内存中
4.:将变量存储到数据库中;为簇数据库表的名称(如系统提供的标准表INDX);ar的值为区域ID,它将数据库表
的⾏分成若⼲,它必须被直接指定,且值是两位字符,被存储到簇数据库表中的字段中;id的值会存储到簇数据表中的RELID字段的下⼀⽤户⾃定义字段中:
TYPES:BEGIN OF tab_type,
col1 TYPE i,
col2 TYPE i,
END OF tab_type.
DATA:wa_indx TYPE demo_indx_table,
wa_itab TYPE tab_type,
itab  TYPE STANDARD TABLE OF tab_type.
WHILE sy-index< 100.
wa_itab-col1 = sy-index.
wa_itab-col2 = sy-index** 2.
APPEND wa_itab TO itab.
ENDWHILE.
wa_indx-timestamp = sy-datum && sy-uzeit.
wa_indx-userid    = sy-uname.
EXPORT tab = itab TO DATABASE demo_indx_table(sq) FROM wa_indx ID 'TABLE'.
实例⼆:
TABLES: indx.
DATA: BEGIN OF i_tab OCCURS 100,
col1 TYPE i,
col2 TYPE i,
END OF i_tab.
DO 3000 TIMES.
i_tab-col1 = sy-index.
i_tab-col2 = sy-index ** 2.
APPEND i_tab.
ENDDO.
indx-aedat = sy-datum.
indx-usera = sy-uname.
indx-pgmid = sy-repid.
"省略了FROM选项,因为已经使⽤TABLES indx语句定义了名为indx的结构变量了
"Export时会⾃动将表⼯作区indx变量中的⽤户字段存储到簇数据库表中
EXPORT i_tab TO DATABASE indx(HK) ID 'Key'.
WRITE: ' SRTF2',AT 20 'AEDAT',AT 35 'USERA',AT 50 'PGMID'.
ULINE.
"注:下⾯完全可以使⽤ IMPORT FROM DATABASE TO wa 语句来读取⽤户区字段
SELECT * FROM indx WHERE relid = 'HK'AND srtfd = 'Key'.
WRITE: / indx-srtf2 UNDER 'SRTF2',
indx-aedat UNDER 'AEDAT',
indx-usera UNDER 'USERA',
indx-pgmid UNDER 'PGMID'.
ENDSELECT.
SRTF2            AEDAT          USERA          PGMID
0          2011.10.12    ZHENGJUN      YJZJ_TEST2
1          2011.10.1
2    ZHENGJUN      YJZJ_TEST2
2          2011.10.12    ZHENGJUN      YJZJ_TEST2
3          2011.10.12    ZHENGJUN      YJZJ_TEST2
4          2011.10.12    ZHENGJUN      YJZJ_TEST2
5.:将数据存储到SAP应⽤服务器上的SAP Memory中,可共同⼀服务上的所有程序访问。两种的作⽤是⼀样的,
最⼤不同是在数据达到最⼤内存限制时的处理⽅式不同:最⼤内存限制值分别是通
过rsdb/esm/buffersize_kb )、rsdb/obj/buffersize (SHARED )来设置的,当内存占⽤快满时,SHARED MEMORY必须通过来⼿动清理,⽽SHARED BUFFER会⾃动删除很少被使⽤到的数据(当然也可以通过DELETE FROM SHARED BUFFER⼿动及时的删除不⽤的数据)
:wa⼯作区类型可以参照簇数据库类型,也可定义成只含有⽤户数据字段的结构,它是⽤来设置簇数据库表中SRTF2 与 CLUSTR两个字段之间的()的值,然后在Export时将相应的字段存储到SRTF2字段与CLUSTR字段间的相应字段中去。如果使⽤TABLES dbtab.”定义语句,可以省略[FROM wa]”,也会默认将其存储到数据库表中,但如果没有“TABLES dbtab.”这样的定义语句,也没有“[FROM wa]”选项时,将不会有数据存储到簇数据库表中的⽤户字段中去
7.CLIENT cl:默认为当前客户端,存储到簇数据库表中的MANDT字段中
语句
IMPORT {p1 = dobj1 p2 = dobj2 ...} | {p1 dobj1 p2 TO dobj2 ...} | (ptab)
| { MEMORY ID id}
| { dbtab(ar) [ wa] [CLIENT cl] ID id}
| { SHARED MEMORY dbtab(ar) [TO wa] [CLIENT cl] ID id}
| { SHARED BUFFER dbtab(ar) [TO wa] [CLIENT cl] ID id}
从簇数据表中读取数据,各项参数与是⼀样的,请参考EXPORT各项解释
TYPES:BEGIN OF tab,
col1 TYPE i,
col2 TYPE i,
END OF tab.
DATA:wa_indx TYPE demo_indx_table,
wa_itab TYPE tab,
itab    TYPE STANDARD TABLE OF tab.
IMPORT tab = itab FROM DATABASE demo_indx_table(sq) TO wa_indx ID 'TABLE'.
WRITE: wa_indx-timestamp, wa_indx-userid.
ULINE.
LOOP AT itab INTO wa_itab.
WRITE: / wa_itab-col1, wa_itab-col2.
ENDLOOP.
实例⼆:
TABLES indx.
DATA: BEGIN OF jtab OCCURS 100,
col1 TYPE i,
col2 TYPE i,
END OF jtab.
"注意:i_tab的名称不能是其他的,必须与EXPORT语句中的分类
"存储标签名⼀样。如果i_tab本⾝⼜是⼀个jtab类型的内表,则
"TO后⾯的jtab可以省略
IMPORT i_tab TO jtab FROM DATABASE indx(hk) ID 'Key'.
"注:在该程序中并没有明显的为indx⼯作区设置值,但由于使⽤了
"TABLES indx.语句定义了与indx簇数据库表同名的结构变量,所以
"上⾯IMPORT会默认加上使⽤TO indx选项
WRITE: / 'AEDAT:', indx-aedat,
/ 'USERA:', indx-usera,
/
'PGMID:', indx-pgmid.
SKIP.
WRITE 'JTAB:'.
LOOP AT jtab FROM 1 TO 5.
WRITE: / jtab-col1, jtab-col2.
ENDLOOP.
AEDAT: 2011.10.12
USERA: ZHENGJUN
PGMID: YJZJ_TEST2
JTAB:
1          1
2          4
3          9
4          16
5          25
IMPORT DIRECTORY语句
IMPORT DIRECTORY INTO FROM DATABASE dbtab(ar) [TO wa] [CLIENT cl] ID id.
该语句的作⽤⽤来读取存储到簇数据表中的变量信息,如存储名是什么、以什么样的类型存储的、数据长度等(有点类似反射)。itab 为cdir词典类型的内表,其结构与各字段作⽤:
Component Type Meaning
NAME CHAR(30)Name of the parameter under which a data object was saved.
OTYPE:CHAR(1)General type of the data object saved. The following values are permitted: "F" for elementary, flat data objects, "G" for strings, "R" for , "S" for , "T" for internal tables with flat row type
and "C" for tables with a deep row type.
FTYPE CHAR(1)More specific type of the data object saved. For elementary data objects and internal tables with a elementary row type, the data or row type is returned in accordance with the table of return values from ("a", "b", "C", "D", "e", "F", "g", "I", "N", "P", "s", "T", "X", "y"). In the case of flat structures and internal tables with flat structured row types, "C" is returned. In the case of structures and internal tables with deep structured row types, "v" is returned. In the case of a table that has an internal table as a row type, "h" is returned.
TFILL INT4Length filled of the saved data object. For strings the length of the content in bytes is returned and for internal tables the number of rows is returned. The value 0 is returned for other data objects.
FLENG INT2Length of saved data object or saved table row in bytes. The value 8 is returned for strings. DATA: f1 TYPE decfloat16,
f2 TYPE TABLE OF i,
f3 TYPE spfli.
DATA itab TYPE STANDARD TABLE OF cdir.
DO 10 TIMES.
APPEND sy-index TO f2.
ENDDO.
EXPORT par1 = f1 par2 = f2 par3 = f3 TO DATABASE demo_indx_table(hk) ID 'HK'.
IMPORT DIRECTORY INTO itab FROM DATABASE demo_indx_table(hk) ID 'HK'.
NAME OTYPE:FTYPE TFILL FLENG
"PAR1""F""a"08
"PAR2""T""I"104
"PAR3""R""C"0168
DELETE FROM语句
DELETE FROM { {MEMORY ID id}
| {DATABASE      dbtab(ar) [CLIENT cl] ID id}
| {SHARED MEMORY dbtab(ar) [CLIENT cl] ID id}
| {SHARED BUFFER dbtab(ar) [CLIENT cl] ID id} }.
⽤来清理语句的存储的数据
其中DELETE FROM MEMORY ID id.与FREE MEMORY ID id.作⽤⼀样
DATA: id    TYPE c LENGTH 4 VALUE 'TEXT',
text1 TYPE string    VALUE 'Tina',
text2 TYPE string    VALUE 'Mike'.
EXPORT p1 = text1 p2 = text2 TO SHARED BUFFER demo_indx_table(xy) ID id.
IMPORT p1 = text2 p2 = text1 FROM SHARED BUFFER demo_indx_table(xy) ID id.
.
..
DELETE FROM SHARED BUFFER demo_indx_table(xy) ID id.
"此语句会执⾏后,sy-subrc返回4
IMPORT p1 = text2 p2 = text1 FROM SHARED BUFFER demo_indx_table(xy) ID id.
ABAP Memory(同⼀⽤户的同⼀窗⼝Session)
l保存数据
<f1><f2> [FROM <g2>] ... TO MEMORY ID <>.
如果省略了FROM <g1>选项,则被存储的数据源就来⾃于程序中与f1⾃已同名的变量,否则数据源为g1指定的变量(或者g1本⾝就是字符常量);key ⽤来标⽰ABAP内存。可以将多个变量存储在同⼀个<key>中,它们是通过<fi>来区别的。IMPORT中的<fi>必须与EXPORT中的<fi>名称相同。
DATA text1(10) VALUE 'Exporting'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 5 TIMES.
itab-bookid = 100 + sy-index.
APPEND itab.
ENDDO.
"将 text1 与 text2都存储到 text ID的名下
EXPORT text1 "数据来源于上⾯定义的 text1变量,并以text1名分类存储
text2 FROM 'Literal'"数据直接来源于From后⾯指定的常量字符串,也以text1名分类存储
TO MEMORY ID 'text'.
"将前⾯定义的itab存储到以table为ID的内存中,并以itab名分类存储
EXPORT itab TO MEMORY ID 'table'.
l读取数据
IMPORT <f1> [TO <g1>] <f2> [TO <g2>] ... FROM MEMORY ID <key>.
如果忽略选项TO<gi>,则将内存中的数据对象<fi>赋给程序中的同名数据对象;如果使⽤此选项,则将内存中的数据对象<fi>写⼊字
段<gi>中。IMPORT中的<fi>必须与EXPORT中的<fi>名称相同。
不必读取存在特定ID<key>下的所有对象,在读取时可以通过指定名称<fi>中进⾏有选择性的读取。如果内存中不包含指定ID<key>下的对象,则将SY-SUBRC设置为4,但是如果内存中存在带此ID的数据簇,⽆论数据对象<fi>是否也存在,SY-SUBRC之值总是为0。如果簇中不存在数据对象<fi>,则⽬标字段保持不变(gi或fi本⾝)。
DATA text1(10) VALUE 'TEST1'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 5 TIMES.
itab-bookid = 100 + sy-index.
APPEND itab.
ENDDO.
EXPORT text1"被存储的数据来⾃text1变量
text2 FROM 'Literal'"被存储的数据直接来⾃FORM后⾯字符串常量
"将'TEST1'与'Literal'存储到ID为text的ABAP内存中,并且分别以
"text1和text2标签来分类存储
TO MEMORY ID 'text'.
EXPORT itab"被存储的数据来⾃itab变量所对应的内存
TO MEMORY ID 'table'.
SUBMIT zjzjimpt1 AND RETURN."调⽤其他程序并等待返回
REPORT  zjzjimpt1.
DATA: text1(10),
text3 LIKE text1.
"从ID为text的ABAP内存区域读取分类存储标签为text1
"的内存数据并存储到text1变量中去
IMPORT text1 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text1.
"从ID为text的ABAP内存区域读取分类存储标签为text2
"的内存数据并存储到text3变量中去
IMPORT text2 TO text3 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text3.
DATA jtab LIKE sbook OCCURS 10 WITH HEADER LINE.
"从ID为table的ABAP内存区域读取分类存储标签为itab
"的内存数据并存储到jtab变量中去
IMPORT itab TO jtab FROM MEMORY ID 'table'.
LOOP AT jtab.
WRITE / jtab-bookid.
ENDLOOP.
*    0  TEST1
*    0  Literal
*00000101
*00000102
*00000103
*00000104
*00000105
l删除数据
FREE MEMORY [ID <key>].
与DELETE FROM MEMORY ID id.等效
如果不附加ID<key>,则此语句删除整个内存,包括此前⽤EXPORT存储到ABAP/4内存中的所有数据簇。附加ID<key>之后,该语句只删除⽤此名称命名的数据簇。
⽤户登陆后,最多⼀个系统可以开6个窗⼝,这在SAP中称为External Mode。⽽同⼀个窗⼝中,运⾏某程序后,可以通过CALL TRANSACTION/SUBMIT或其他代码跳转到其他程序,这个称为Internal Mode。Internal Mode的调⽤栈最多为9层。那么ABAP Memory,它是属于Internal Mode间可以共享的数据,⽽External Mode间⽆法共享。所以,ABAP Memorcy只能在同⼀窗体中共享,这与浏览器中的Session是⼀样的。
y(同⼀⽤户的不同窗⼝Session)
更多请参考《数据共享与传递.docx》中的SAP Memory语句章节
同⼀客户端的不同窗体(External Mode)它们之间共享数据必须通过SET/GET PARAMETER语句,不再是EXPORT/IMPORT的模式。
例⼦. 创建程序A,输⼊:
DATA matnr TYPE matnr.
GET PARAMETER ID'ytest'FIELD matnr.
WRITE matnr.
创建程序B,输⼊:
DATA: matnr TYPE matnr.
matnr = '000000000000012345'.
SET PARAMETER ID'YTEST'FIELD matnr.
在窗⼝1运⾏程序B并关闭后,在窗⼝2运⾏程序A,发现程序A仍然读到了SAP Memory的值。
说明:
1、调试时,可通过点击Goto->System Area->SAP Memory,查看到YTEST及其对应的值。
2、SET/GET PARAMETER的值与本次登陆有关,当⽤户注销后才失效。在⽤户登陆的时候,系统会根据每个⽤户System->User Profile->Own Data-
>Parameter下的设置,载⼊到SAP Memory。
3、在Data Element中可以看到Further Characteristics下可定义PARAMETER ID,代表该字段作为屏幕元素时,可读取该PARAMETER ID作为默认值。⽐
如VA03会⾃动显⽰刚刚创建的订单号。
SHARED MEMORY/SHARED BUFFER(不同Client、Job)
前⾯介绍的都是⽤户内存,那么不同⽤户间如何实现数据共享呢?可以⽤SHARED MEMORY或SHARED BUFFER,它们是服务器上的某⽚所有⽤户共享的内存。关于SHARED MEMORY和SHARED BUFFER的区别,可以F1查看帮助。如果EXPORT SHARED BUFFER,则必须IMPORT SHARED BUFFER才能读到,⽤IMPORT SHARED MEMORY是读不到的。反过来也是。
例⼦. 创建程序A,输⼊:
DATA matnr TYPE matnr.
IMPORT matnr FROM SHARED BUFFER indx(aa) ID'YTEST_MATNR '.
WRITE matnr.
创建程序B,输⼊:
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER indx(aa) ID''.
先在⽤户1的电脑上运⾏程序B,然后在⽤户2的电脑上运⾏程序A,发现⽤户2可以读取到值。
说明:
1、既然是服务器上的所有⽤户共享空间,那么该值将保存到服务器关机重启为⽌,除⾮⽤户⽤DELETE语句清除它。其实这个跟ENQUEUE/DEQUEUE有点相
似之处。
2、数据库也可共享数据,不过服务器共享肯定速度快些。
3、INDX是系统中存在的符合特定格式要求的表。但这不代表该EXPORT/IMPORT语句将在表INDX中增加记录,仅仅代表服务器借⽤了INDX的结构来管理该
⽚共享内存。
删除:
DELETE FROMSHARED BUFFER dbtab(ar) [CLIENT cl] ID id
DELETE FROMSHARED MEMORY dbtab(ar) [CLIENT cl] ID id
更具体的实例请参考《操作设置.docx》⽂档中的“通过程序创建Job”⼩节实例
Smartform中使⽤全局⾃定义表import语句
在开发smartform的时候可以通过指针来调⽤全局⾃定义的表,⽽不⽤在系统中创建⼀个永久的结构。
【1】:在SmartForm中定义⼀个结构,这个结构要和程序中使⽤的结构完全相同。
【2】:定义报表中全局的表和⼯作空间,
【3】:定义指针,指向程序中的某个内表,然后获取该内表。
其实如果也想这样动态调⽤某函数⾥的全局变量,先到这个函数所在的函数组,再到该函数组所对应的主程序名,然后像上⾯那样使⽤即可:
动态访问主调程序中的全局变量
DATABASE
上⾯说了SHARED BUFFER并不访问(存储)数据库,⽽要访问数据库就应该⽤DATABASE。
EXPORT DATABASE与普通数据库操作的不同之处是,它适合⼤数据量的操作,系统⾃动将其拆分成多条记录并存储到数据库中,⽐如图⽚或⽂档(甚⾄是程序中的某个内表,请参考后⾯的实例)。⽽⽤IMPORT DATABASE的过程则相反,系统将把这些条相关记录⼜⾃动组合起来成为⼀个整体。
如果要⾃定义INDX这样的表,需要按以下表结构顺序来定义:
1、可以有也可以⽆ MANDT字段
2、除开第⼀个字段MANDT(如果有的情况下),下⼀个字段必须是RELID,类型为CHAR 2,它是⽤来存储area ID,系统会根据⽤户在使

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。