定义:是已经存在的数据对象的占位符或者符号名称,通过关键字 FIELD-SYMBOLS 定义,类似于指针,可以指代任何变量。
定义方式: FIELD-SYMBOLS:<X> type <Y>
X: 字符符号-名称
Y:字段符号-参照类型
当Y输入时,继承赋给它的变量的所有属性
当Y不输入时,赋给它的变量必须与同类型。
FIELD-SYMBOLS:<f1>.
FIELD-SYMBOLS:<f2> TYPE i.
语法 :ASSIGN [mem_area] TO [casting_spec][range_spec].
语义:将mem_area分配给 casting_spec range_spec。
FIELD-SYMBOLS:<fs>.
FIELD-SYMBOLS:<fs1>.
DATA:"str(20) TYPE c VALUE 'Out',
name(20) TYPE c VALUE 'str'.
*Static assignment
ASSIGN name TO <fs>.
WRITE / <fs>.
*Dynamic assignment
*动态分配不是将字段f分配给<fs>,而是先找到字段f的内容,再将该内容作为一个新的数据对象分配给<fs>
*是把name变量的值 str 对应的变量地址赋值给<fs1>
*动态分配之后一定要检查 sy-subrc的值
ASSIGN (name) TO <fs1>.
WRITE / <fs1>.
FIELD-SYMBOLS:<fs_a>.
SELECT * FROM t001w INTO TABLE @DATA(lt_t001w).
LOOP AT lt_t001w ASSIGNING FIELD-SYMBOL(<fs_1>).
ENDLOOP.
READ TABLE lt_t001w ASSIGNING FIELD-SYMBOL(<fs_2>) INDEX 1.
READ TABLE lt_t001w ASSIGNING <fs_a> INDEX 1.
"将指针中的变量取出来
的两种方式
SELECT * FROM t001w INTO TABLE @DATA(lt_t001w).
FIELD-SYMBOLS:<fs_a> TYPE ANY TABLE.
DATA : lr_obj TYPE REF TO data.
*get REFERENCE OF lt_t001w into lr_obj.
*ASSIGN lr_obj->* TO <fs_a>.
DATA:lv_d TYPE t001w-werks.
READ TABLE <fs_a> ASSIGNING FIELD-SYMBOL(<fs_data>) WITH KEY ('werks') = '1010'.
"将指针中的变量取出来的两种方式
IF sy-subrc = 0.
"先定义 一个固定类型的字段,然后利用指针的隐式转换,直接赋值
ASSIGN COMPONENT 'NAME1' OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<value>).
lv_d = <value>.
"先定义 一个固定类型的字段,然后利用指针的隐式转换,直接赋值
ASSIGN COMPONENT 'NAME1' OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<value1>) CASTING TYPE werks_d.
ENDIF.
介绍:引用变量存储的是某个对象的地址,而不是实际的内容。ABAP中的引用包括数据引用与对象引用,因此,ABAP中有数据引用变量与对象引用变量两种,而对象引用又分为类引用与接口引用。
数据引用使用**CREATE DATA…创建数据对象,对象引用使用CREATE OBJECT…创建类对象,但定义都使用DATA … TYPE REF TO…**的方式来声明一个引用变量(指针)。
数据引用就是指对非对象如基本变量、结构体、内表变量的引用(类似C中的指针)。对象引用指的是对象ABAP语言中的对象进行引用(类似Java中的指针)。
创建数据引用变量的数据类型:
TYPES <t_dref> TYPE REF TO
DATA
.
使用上面创建出来的引用变量数据类型或者是直接通过下面的语句来创建数据引用变量:
**DATA <dref> TYPE REF TO** **DATA****.**
TYPES : typ TYPE c LENGTH 1.
DATA: dref TYPE REF TO typ.
"类型可以是动态指定
CREATE DATA dref TYPE ('TYP') .
dref->* = 'A'.
WRITE: / dref->*."A
TYPES : typ2 TYPE REF TO typ.
DATA: dref2 TYPE REF TO typ2."指向指针的指针
CREATE DATA dref2 .
DATA: dref3 TYPE REF TO typ2.
dref3 = dref2."指向同一东西
DATA: c VALUE 'A'.
GET REFERENCE OF c INTO dref2->*.
WRITE: / dref3->*->*."A
TYPES: tabtyp TYPE i OCCURS 0,line TYPE LINE OF tabtyp.
DATA: wa TYPE LINE OF tabtyp.
DATA: dref TYPE REF TO tabtyp.
CREATE DATA dref LIKE TABLE OF wa."注:TABLE OF 后面接的是内表的行类型
"CREATE DATA dref TYPE TABLE OF i."也可以是这样
"CREATE DATA dref TYPE TABLE OF line."也可以是这样
APPEND 1 TO dref->*.
LOOP AT dref->* INTO wa.
WRITE: wa.
ENDLOOP.