ABAP基础-动态数据对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP基础-动态数据对象相关的知识,希望对你有一定的参考价值。

参考技术A ABAP的动态数据对象包括字段符号(filed symbols)和数据引用(data reference)两种形式。
普通数据对象的寻址静态地通过该对象名称进行;而上述两种数据对象则只有在运行时,系统才知道该数据对象的名称和属性,并进行寻址。

在程序运行期内可将数据对象分配给字段符号。成功分配后,使用字段符号或其所代表数据对象本身,是没有任何区别的。换句话说,如果用赋值语句修改字段符号的值,字段符号所代表的数据对象本身的值也随之改变。

声明字段符号需使用 FIELD-SYMBOLS 语句,基本语法格式如下
FIELD-SYMBOLS <fs> [ TYPE type | LIKE dobj ].
声明字段符号时可以指定类型,该类型决定了运行时何种数据对象可以被分配给一个字段符号,此处可以指定一般性类型和完全限定类型,如果不指定类型,则系统默认该字段符号为一般性类型ANY。

字段符号声明之后,可以进行字段分配,所分配的数据对象应符合字段符号定义时的类型说明。字段符号可以反复进行分配,且分配方式有静态和动态之区分。

在将数据对象分配给字段符号的过程中,可以进行类型的强制转换,即所有数据对象都可以被视为一个特定类型。强制类型转换通过ASSIGN语句中的CASTING附加项指定,该选项的出现意味着可以将一个与字段符号指定类型不兼容的数据对象赋给字段符号。强制类型转换分为显式和隐式两种情况。
如果一个字段符号的类型是完全指定的,或者是ABAP内置类型C,N,P,X之一,可以使用下列格式实现隐式强制类型转换 ASSGIN f TO <fs> CASTING. 当字段分配后,无论其原始数据对象类型如何,系统内表都按照字段符号定义类型对分配的数据对象进行处理。

程序中使用的所有数据对象均存储在运行时分配的内存中,每一个对象均对应有其起始的内存地址,该地址是由编译器分配的,一般不能被随意操作。数据对象的内存地址也常常被称作引用。通常情况下,声明数据后,程序通过数据对象的名称对其进行操作,然而有时也通过字段符号或者引用通过其他地址进行操作。
在ABAP中,引用以数据引用和对象引用两种形式存在。

引用变量中包含地址引用,是指向其它数据对象的指针,其实际内容代表某数据对象的内存地址,在ABAP程序中是不可见的。引用类型定义和引用变量声明的语法格式如下:
TYPES t_dref TYPE REF TO DATA.
DATA dref TYPE REF TO DATA.
引用变量在ABAP作为结构类型的组件时可以被视为时普通基本类型,即引用变量可以作为复杂类型的结构组件或者独立出现。
引用变量声明时没有指向任何数据对象,因而也不能进行解除引用操作。下述操作可以使该引用对象指向实际的数据对象。

数据引用变量之间可以相互赋值,目标对象和源引用变量指向相同的数据对象,但不能将对象引用或非引用对象的值传递给引用变量。

所有通过DATA语句创建的数据对象都属于静态创建的数据对象,当程序开始运行时,这些变量已经存在。要在程序运行期间动态的创建对象,可通过数据引用变量进行。
CREATE DATA dref TYPE type | LIKE obj.
该语句在运行期间内动态创建一个数据对象,同时引用变量dref指向这一对象。该对象没有名称,只能通过数据引用变量进行寻址,但在操作该数据对象之前,需要通过字段符号解除引用。当没有任何数据引用变量指向该对象时,他将被sap中的垃圾收集装置从系统内存中删除。
在该语句中,必须指定数据类型。也可以通过变量动态的指定所创建的数据对象类型,这种指定类型的方式在所有ABAP语句中是唯一的。
CREATE DATA dref TYPE (name). 此处的变量name中包含具体的类型名称(如“C”)。

使用GET语句可以使一个引用变量获得已经存在的数据对象的地址引用。
GET REFERENCE OF obj INTO dref.
其中obj可以是一个通过DATA语句定义的静态变量,也可以是指向某数据对象的字段符号。如果将引用变量指向一个过程内部的局域变量,则该变量在离开过程后将不能再使用,也不能进行解引用操作。

解除引用是访问引用所指向的数据对象的前提,ABAP数据引用变量的解引用语法格式如下 ASSGIN dref->* TO <fs> [CASTING ...] .
该语句将数据引用变量dref指向的数据对象赋给字段符号,如果操作成功,系统字段SY-SUBRC将返回0。系统将检查数据对象类型是否与字段符号声明类型相匹配,且该过程中可能出现强制类型转换。如果数据引用变量的值为初始值或者不正确,则无法进行解引用操作,字段符号将保持原值不变,而系统字段SY-SUBRC将返回。对于动态创建的数据对象,解引用是获取其内容的唯一方式。

以上是关于ABAP基础-动态数据对象的主要内容,如果未能解决你的问题,请参考以下文章

ABAP Memory Inspector 里对动态内存对象的内存消耗度量方式

ABAP-基于MEMORY动态传参

ABAP基本数据类型通用类型

为什麽要用ABAP动态内表

ABAP ALV 动态显示列

详解ABAP/4内表结构