ABAP的动态数据对象包括字段符号和数据引用两种形式。动态数据对象只有在运行的时候,系统才知道该数据对象的名称和属性,并进行寻址。
1,字段符号:本身只是一个已存在的数据对象的占位符或者语义名称,系统不直接给字段符号本身保留内存空间,而是将其指向一个数据对象。通过操作字段符号,可以修改其指向的数据对象的内容。
在程序运行期间内可将数据对象分配给字段符号。成功分配后,使用字段符号或其代表的数据对象本身,是没有任何区别的。也就是说如果用赋值语句修改字段符号的值,字段符号所代表的数据对象的值也随之改变。
通过字段符号可以实现对数据对象的一般处理,可以在运行时数据对象具体性质不确定的情况下操作,同时还可以进行强制类型转换,即根据某一指定操作的规则处理其指向的数据对象,而不是根据该数据本身的类型。
<1>,声明字符段符号
FIELD-SYMBOLS <fs> [ TYPE type|Like dobj].
<2>. 分配数据对象
静态分配, 程序运行之前分配
ASSIGN f TO <fs>.
静态分配, 程序运行之前分配
ASSIGN f TO <fs>.
ASSIGN f [+o] [ (l) ] TO <fs>. o为偏移量, l为长度.
动态分配.
ASSIGN (f) TO <fs>.
动态分配不是将字段 f 分配给字段符号, 而是先找到字段 f 的内容, 再将内容作为一个新的数据对象名称分配给<fs>.不能进行指定偏移量和长度.
2,数据引用:
程序中使用的所有数据对象均存储在运行时分配的内存中, 数据对象的内存地址也常常被称作引用. 引用存储于引用变量中,分为数据引用和对象引用.
<1>,声明引用变量
引用变量中包含地址引用,是指向其他数据对象的指针, 其实际内容代表某数据对象的内存地址,
TYPES t_dref TYPE REF TO DATA.
DATA dref TYPE REF TO DATA.
引用变量声明时没有指向任何数据对象,因而也不能进行解除引用操作.
下列操作可使该引用对象指向实际的数据对象.
- 通过该变量动态创建数据对象。
- 通过该变量获取一个数据对象的引用。
- 给该变量分配其它已经存在的数据引用变量。
CREATE DATA dref TYPE type | LIKE obj.
<3>,获取对象引用
GET REFERENCE OF obj INTO dref.
通过这个语句可以使一个引用变量获得已经存在的数据对象的地址引用.
<4>,解除数据引用
解除引用是访问引用所指向的数据对象的前提.
ASSIGN dref->* TO <fs> [CASTING ... ].
该语句将数据引用变量 dref指向的数据对象赋给字段符号.