数据引用Data References

定义引用变量Reference Variables
引用变量存储的是某个对象的地址,而不是实际的内容。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.
DATA数据类型为通用类型,这里还可以使用其他通用类型或具体的类型。
动态创建数据对象Creating Data Objects Dynamically
以前在程序的声明部分通过DATA语句定义都是静态的数据对象,它们在程序运行前就已经存在了。如果想在程序运行期间动态的创建数据对象,则需要使用数据引用变量来动态的创建:
CREATE DATA <dref> TYPE <type>|LIKE <obj>.
该语句创建出一个数据对象,并使用 dref 指向它。与C中的指针一样,如果要访问该对象内容,则一定先要进行解引操作。注意:<dref>一定要先通过上面DATA...TYPE REF TO ... 语句定义过数据引用变量,这里只是创建与分配。另外,type还可以是动态指定的:
CREATE DATA <dref> TYPE (<name>).

.
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
,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.

获取数据对象引用Getting References to Data Objects
将已存在的某数据对象分配给已定义好的数据引用变量:
GET REFERENCE OF <obj> INTO <dref>.
注意:<dref>一定要先通过上面DATA...TYPE REF TO ... 语句定义过数据引用变量,这里只是获取与分配。这里的数据对象obj 可以是通过DATA定义的数据对象(如基本内置数据类型变量),也可以是某字段符号,或者甚至还可以是DATA ... TYPE REF TO...定义的引用变量(此时相当于二级指针,请参考下面示例):
DATA dref TYPE REF TO string."第一步:定义
DATA dref2 TYPE REF TO DATA.
field-SYMBOLS <fs>.
field-SYMBOLS <fs1>.
field-SYMBOLS <fs2>.
CREATE DATA dref TYPE ('STRING')."第二步:创建
"因为定义时已经明确指定了数据类型,所以可以省略TYPE选项
*CREATE DATA dref.
ASSIGN dref->* to <fs2>."第三步:使用
<fs2> = 'ABCD'.
"dref2相当于二级指针
GET REFERENCE OF dref INTO dref2.
"要区分与上面的区别,下面这样直接赋值属于指针拷贝,
"结果是dref2与dref同指向同一个数据对象,此情况下的dref2则不是二级指针了
*dref2 = dref.
ASSIGN dref2->* to <fs>."第一次解引用
ASSIGN <fs>->* to <fs1>."第二次解引用
WRITE : / <fs1>.
ABCD
注意:不要将局部对象的引用传到其他过程中或不要引用局部对象,否则会出Java中不安全发布问题
可以将一个常量的地址分配给字段符号,但不能修改该常量的值:
DATA: e_i3 TYPE REF TO i .
.
以上代码运行时会报错。
或者直接获取某个非引用变量的地址:
.
WRITE: i.
解引用Dereferencing Data References
要访问数据引用(对象引用不需要)所指向的数据对象的内容,先一定要进行解引用操作(但不一定要将解引出来分配给字段符号后再能使用,可以直接使用解引用出来的内容,参看前面):
ASSIGN <dref>->* TO <FS> [CASTING ...].
.
dref2 = dref.
ASSIGN dref2->* to <fs2>.
WRITE: / <fs2>.
100
但如果数据引用是一个指向某个结构的数据对象时,可以直接通过结构对象引用(指针)来访问其成员,这与普通数据变量对象引用有所区别:
TYPES: BEGIN OF strc,
comp ,
END OF strc.
DATA ref TYPE REF TO strc.
CREATE DATA ref TYPE strc.
"可以直接使用结构引用(指针)访问其成员
ref->comp = 'X'.
"也可这样:先解引用结构对象,再访问其成员,这也是标准访问方式
"ref->*-comp = 'X'.
"通过指针直接进行访问成员
WRITE: / ref->comp.
FIELD-SYMBOLS: <dref> TYPE strc.
ASSIGN ref->* TO <dref>.
"通过结构体对象本身来访问成员
WRITE: / <dref>-comp.
数据引用Data References的更多相关文章
- [SAP ABAP开发技术总结]数据引用(data references)、对象引用(object references)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- jQuery1.9.1源码分析--数据缓存Data模块
jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...
- jQuery数据缓存$.data 的使用以及源码解析
一.实现原理: 对于DOM元素,通过分配一个唯一的关联id把DOM元素和该DOM元素的数据缓存对象关联起来,关联id被附加到以jQuery.expando的值命名的属性上,数据存储在全局缓存对象jQu ...
- 代码的坏味道(16)——纯稚的数据类(Data Class)
坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...
- FAT32文件系统学习(3) —— 数据区(DATA区)
FAT32文件系统学习(3) —— 数据区(DATA区) 今天继续学习FAT32文件系统的数据区部分(Data区).其实这一篇应该是最有意思的,我们可以通过在U盘内放入一些文件,然后在程序中读取出来: ...
- Data - References
01 - 数据分析与数据挖掘的知识列表 图解 知识列表 |关注方面|初级数据分析师|高级数据分析师|数据挖掘工程师| |--------|--------|--------|--------| | 数 ...
- 数据卷(Data Volumes)
Docker宿主机和容器之间文件拷贝docker copy 前言: Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享,这必然涉及 ...
- Docker之数据卷(Data Volumes)操作
目的: 前言 Docker宿主机和容器之间文件拷贝 数据卷 数据卷容器 前言 Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享, ...
- 七个用于数据科学(data science)的命令行工具
七个用于数据科学(data science)的命令行工具 数据科学是OSEMN(和 awesome 相同发音),它包括获取(Obtaining).整理(Scrubbing).探索(Exploring) ...
随机推荐
- Couchbase
Couchbase介绍,更好的Cache系统 在移动互联网时代,我们面对的是更多的客户端,更低的请求延迟,这当然需要对数据做大量的 Cache 以提高读写速度. 术语 节点:指集群里的一台服务器. 现 ...
- iOS发布条款检查表
序号 分类 条款编号 条款 案例 1 功能 2.1 崩溃的程序将会被拒绝 2 2.2 有错误的程序将会被拒绝 点击版本升级无反应/点击版本升级,在线版本和当前版本都是2.0.3 3 2.3 跟开发者宣 ...
- 6*17点阵的Window程序, Java写的。
package com.wulala; import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;imp ...
- flexbox in IE (10+ and 9 and 8)
.parent { display: -webkit-box !important; display: -moz-box !important; display: -ms-flexbox !impor ...
- 14 个 grep 命令的例子 【转】
转自:https://linux.cn/article-5453-1.html 编译自:http://www.linuxtechi.com/linux-grep-command-with-14-dif ...
- JVM学习笔记(三)------内存管理和垃圾回收【转】
转自:http://blog.csdn.net/cutesource/article/details/5906705 版权声明:本文为博主原创文章,未经博主允许不得转载. JVM内存组成结构 JVM栈 ...
- Java中删除指定文件夹文件夹下面有内容也删除使用递归方案
import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java ...
- editPlus,3.7V 注册码
editPlus,3.7V 注册码: username:linzhihui password:5A2B6-69740-D9CDE-79702-C9CCD
- Centos7下使用ELK(Elasticsearch + Logstash + Kibana)搭建日志集中分析平台
日志监控和分析在保障业务稳定运行时,起到了很重要的作用,不过一般情况下日志都分散在各个生产服务器,且开发人员无法登陆生产服务器,这时候就需要一个集中式的日志收集装置,对日志中的关键字进行监控,触发异常 ...
- 安装keepalived
主机名 网络IP VIPnode1 192.168.2.161 192.168.2.165node2 192.168.2.162 [root@node ...