SAP ABAP 指针
目录
- 一、FIELD SYMBOL 字段符号
- 1、定义
- 2、assign分配
- 3.分配-内表
- 4.动态内表
- 二、数据引用
一、FIELD SYMBOL 字段符号
定义:是已经存在的数据对象的占位符或者符号名称,通过关键字 FIELD-SYMBOLS 定义,类似于指针,可以指代任何变量。
1、定义
定义方式: FIELD-SYMBOLS:<X> type <Y>
X: 字符符号-名称
Y:字段符号-参照类型
当Y输入时,继承赋给它的变量的所有属性
当Y不输入时,赋给它的变量必须与同类型。
- generic type
- 定义field symbol时不指定类型,当分配时,根据数据对象类型继承其技术属性
- TYPE ANY TABLE - 结构表
- TYPE ANY - 行结构
- full type
- 当定义field symbol时就固定形式定义数据对象,field symbol的技术属性与分配的数据对象相同
- type | like type
FIELD-SYMBOLS:<f1>.
FIELD-SYMBOLS:<f2> TYPE i.
2、assign分配
语法 :ASSIGN [mem_area] TO [casting_spec][range_spec].
语义:将mem_area分配给 casting_spec range_spec。
- assign 语句的基本结构
- 静态分配-字段名已知
- assign dobj to .
- 可以使用+(n)对字符串进行截取,分配给field symbol,注意长度
- 动态分配-字段名未知
- assign (dobj) to
- 静态分配-字段名已知
- 将结构体字段分配到field symbol中
- assign component comp of structure struc to
- comp可以为行编号或者字段名
- 类型更改,可以通过casting把一个不同类型的变量分配给一个
- 隐式型变化:ASSIGN TO CASTING
- 显示型变化:`ASSIGN TO CASTING TYPE .
- 检查
- sy-subrc: 成功为零 不成功非零
- IS ASSIGND
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.
3.分配-内表
- 基本语句定义
- 如果指定为generic type,必须使用TYPE ANY TABLE
- 分配语句
- ASSIGN itab TO <f_s>.
- 注意
- 类型可匹配
- 如果有表头行,应使用itab[] , 否则分配表头行
- 在读取时,需要使用动态指定方式读取字段
- READ TABLE <f_s> INTO structre WITH KEY (dobj) = val1
- 明确指定字段全名会产生错误.
- 内表循环修改
- LOOP使用ASSIGNING语句,不需要使用MODIF语句.
- 直接修改存储在内存中的值,所以可以省略内表值复制到结构体在执行MODIF的过程,提高性能.
"将指针中的变量取出来
的两种方式
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.
4.动态内表
- 目的
- 创建列数不确定的内表
- 当创建报表遇到行转列,或根据查询到的数据,确定显示ALV列时,可以使用动态内表,在运行是确定列数。
- 步骤
- 动态内表的创建,首先要定义动态结构,然后在根据定义的动态结构利用系统一个标准的method:cl_alv_table_create=>create_dynamic_table生成动态内表.
- 可以使用循环DO,与CONCATENATE语句配合,动态指定字段.
- 动态内表的创建,首先要定义动态结构,然后在根据定义的动态结构利用系统一个标准的method:cl_alv_table_create=>create_dynamic_table生成动态内表.
- 动态内表的赋值.遍历动态结构,获取指定的字段,然后给指定的字段赋值
- 可以使用LOOP循环中的AT时间,将基本表汇总的数据分块赋值到动态表中
- 动态内表读取显示.与赋值相似,遍历动态结构,获取指定的字段,然后读取对应的字段值.或使用输出工具直接输出.
二、数据引用
介绍:引用变量存储的是某个对象的地址,而不是实际的内容。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->*."ATYPES : 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->*->*."ATYPES: 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.