声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4293361.html

定义引用变量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的更多相关文章

  1. [SAP ABAP开发技术总结]数据引用(data references)、对象引用(object references)

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. jQuery1.9.1源码分析--数据缓存Data模块

    jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...

  3. jQuery数据缓存$.data 的使用以及源码解析

    一.实现原理: 对于DOM元素,通过分配一个唯一的关联id把DOM元素和该DOM元素的数据缓存对象关联起来,关联id被附加到以jQuery.expando的值命名的属性上,数据存储在全局缓存对象jQu ...

  4. 代码的坏味道(16)——纯稚的数据类(Data Class)

    坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...

  5. FAT32文件系统学习(3) —— 数据区(DATA区)

    FAT32文件系统学习(3) —— 数据区(DATA区) 今天继续学习FAT32文件系统的数据区部分(Data区).其实这一篇应该是最有意思的,我们可以通过在U盘内放入一些文件,然后在程序中读取出来: ...

  6. Data - References

    01 - 数据分析与数据挖掘的知识列表 图解 知识列表 |关注方面|初级数据分析师|高级数据分析师|数据挖掘工程师| |--------|--------|--------|--------| | 数 ...

  7. 数据卷(Data Volumes)

    Docker宿主机和容器之间文件拷贝docker copy 前言: Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享,这必然涉及 ...

  8. Docker之数据卷(Data Volumes)操作

    目的: 前言 Docker宿主机和容器之间文件拷贝 数据卷 数据卷容器 前言 Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享, ...

  9. 七个用于数据科学(data science)的命令行工具

    七个用于数据科学(data science)的命令行工具 数据科学是OSEMN(和 awesome 相同发音),它包括获取(Obtaining).整理(Scrubbing).探索(Exploring) ...

随机推荐

  1. 关于mac book 的启动选项

    苹果电脑是用EFI的,没有BIOS,唯一可以设置的是开机的启动选项.可以在基于 Intel 的 Mac 电脑上使用下列启动键组合启动时按住 C 键——从可启动 CD 或 DVD 光盘启动,如随机附带的 ...

  2. jsp页面的跳转取值

    <p >工单管理 >> <c:if test="${code eq 0}">全部工单>>详情页</c:if> <c ...

  3. 【python cookbook】【数据结构与算法】18.将名称映射到序列的元素中

    问题:希望通过名称来访问元素,减少结构中对位置的依赖性 解决方案:使用命名元组collections.namedtuple().它是一个工厂方法,返回的是python中标准元组类型的子类,提供给它一个 ...

  4. Backup: Numbers in Perl6

    Perl6 is a new language, not a improved version of Perl5. Perl6 inherits many good features from man ...

  5. 非常好!!!【从头开始写操作系统系列】实现一个-GDT(1)【转】

    转自:http://blog.csdn.net/luoyhang003/article/details/47338019 权声明:本文为博主原创文章,未经博主允许不得转载.(文章来源:http://b ...

  6. SQL Server系统表sysobjects介绍与使用

    关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器.你可 ...

  7. jquery,返回到顶部按钮

    HTML: <footer> <a href="#" class="top">↑</a> </footer> C ...

  8. 对页面制定区域进行打印,以及打印不显示页脚URL的方法

    第一种方式 - 此种方式简单易用,但不能进行页面设置,会在底部显示页面的URL地址. 打印命令:只需在页面上的按钮事件调用这段JS代码 javascript:window.print(); ===== ...

  9. java 面试每日一题6

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5 ...

  10. [原创]南水之源A*(A-Star)算法

    开发导航之前我看了一些A*(A-Star)算法的例子和讲解.没有求得甚解!不过也从A*(A-Star)算法中得到启发,写了一套自己的A*(A-Star)算法.当然,这不是真正(我也不知道)的A*(A- ...