数据引用Data References

摘要:
如果您希望在程序运行期间动态创建数据对象,则需要使用数据引用变量来动态创建它们:CREATEDATA<dref>TYPE<TYPE>| LIKE<obj>此语句创建一个数据对象并使用dref指向它。此外,还可以动态指定类型:CREATEDATA<dref>type。类型:typTYPEcLENGTH1.数据:drefTYPEREFTOTYP。“类型可以动态指定为CREATEDATAdrefTYPE.dref-˃*='A'。写入:/dref-˃*”ATYPES:typ2TYPEREFTOTyp。DATA:dref2TYPEREFTOTyp2。“指向指针CREATEDATAdref2的指针。DATA:dref3TYPEREFTOTyp2.dref3=dref2。”指向同一事物的指针DATA:cVALUE‘A’。获取参考cINTERDREF2-˃*。写入:/dref2-˃*。“ATYPES:tabtypTYPEiOCCURS0,LineTYPELINEOFtabtyp。DATA:waTYPELIN OFtabtyp。数据:drefTYPEREFTOtabtyp.CREATEDATATADREFLIKETABLEOFwa。”注意:TABLEOF后面是行类型“CREATEDATAdrefTYPETABLEOFi”。它也可以是“CREATE DATATADRefTYPETALEOFline”。“”您也可以使用APPEND1TODref-˃*。LOOPATdref-˃*进入。写作:哇。结束循环。获取数据对象引用GettingReferencestoDataObjects以将现有数据对象分配给定义的数据引用变量:GETREFRENCEOF。

定义引用变量Reference Variables. 141

动态创建数据对象Creating Data Objects Dynamically. 141

获取数据对象引用Getting References to Data Objects. 142

解引用Dereferencing Data References

定义引用变量Reference Variables

引用变量存储的是某个对象的地址,而不是实际的内容。ABAP中的引用包括数据引用对象引用,因此,ABAP中有数据引用变量对象引用变量两种,而对象引用又分为类引用接口引用

数据引用使用CREATE DATA...创建数据对象,对象引用使用CREATE OBJECT...创建类对象,但定义都使用DATA ... TYPE REF TO...的方式来声明一个引用变量(指针)。

数据引用就是指对非对象如基本变量、结构体、内表变量的引用(类似C中的指针)。对象引用指的是对象ABAP语言中的对象进行引用(类似Java中的指针)。

创建数据引用变量的数据类型:

TYPES <t_dref>TYPE REF TODATA.

使用上面创建出来的引用变量数据类型或者是直接通过下面的语句来创建数据引用变量:

DATA <dref>TYPE REF TODATA.

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

image097

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 TOtyp2."指向指针的指针
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 TOtabtyp.
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.

image098

获取数据对象引用Getting References to Data Objects

将已存在的某数据对象分配给已定义好的数据引用变量

GET REFERENCE OF <obj> INTO <dref>.

注意:<dref>一定要先通过上面DATA...TYPE REF TO ...语句定义过数据引用变量,这里只是获取与分配。这里的数据对象obj可以是通过DATA定义的数据对象(如基本内置数据类型变量),也可以是某字段符号,或者甚至还可以是DATA ... TYPE REF TO...定义的引用变量(此时相当于二级指针,请参考下面示例):

DATA dref TYPEREFTO string."第一步定义
DATA dref2 TYPEREFTODATA.
field
-SYMBOLS <fs>.
field
-SYMBOLS <fs1>.
field
-SYMBOLS <fs2>.
CREATEDATA dref TYPE('STRING')."
第二步创建
"因为定义时已经明确指定了数据类型所以可以省略TYPE选项
*CREATE DATA dref.
ASSIGN dref->* to <fs2>."第三步:使用
<fs2> =
'ABCD'.
"dref2
相当于二级指针
GETREFERENCEOF dref INTO dref2.
"
要区分与上面的区别,下面这样直接赋值属于指针拷贝,
"结果是dref2dref同指向同一个数据对象,此情况下的dref2则不是二级指针了
*dref2 = dref.
ASSIGN dref2->* to <fs>."第一次解引用
ASSIGN <fs>->* to <fs1>."第二次解引用
WRITE: / <fs1>.

ABCD

注意:不要将局部对象的引用传到其他过程中或不要引用局部对象,否则会出Java中不安全发布问题

可以将一个常量的地址分配给字段符号,但不能修改该常量的值:

DATA: e_i3 TYPEREFTOi.

GETREFERENCEOF33INTO e_i3.
field-SYMBOLS: <fs> TYPEi
.
ASSIGN e_i3->* to
<fs>.
<fs> =
100
.

以上代码运行时会报错。

或者直接获取某个非引用变量的地址

DATA: dref TYPE REF TO i ,
i TYPE i VALUE 33.
GET REFERENCE OF i INTO dref.
dref
->* = 44.
WRITE: i.

解引用Dereferencing Data References

要访问数据引用对象引用不需要)所指向的数据对象的内容,先一定要进行解引用操作(但不一定要将解引出来分配给字段符号后再能使用,可以直接使用解引用出来的内容,参看前面):

ASSIGN <dref>->*TO <FS> [CASTING ...].

DATA: dref TYPEREFTOi .
DATA: dref2 TYPEREFTOi
.
CREATEDATA dref.
基于基本数据类型创建数据对象
field-SYMBOLS: <fs>,<fs2>.
ASSIGN dref->* to
<fs>.
<fs> =
100
.
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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇刚看到有心人整理的表面安装元件(贴片元件)的手工拆焊与焊接技术Centos 7.x 双网卡绑定下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Angularjs总结(三)摸态框的使用

静态页面: <input class="btn btnStyle "value="提&emsp;取"type="button"ng-click="TQZJDFG() " /> controllers中的方法: 1 $scope.TQZJDFG = function() { 2 //可以将此参数传递到所弹出的摸态框的控制器中 3...

es6 解构赋值

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 关于给变量赋值,传统的变量赋值是这样的: var arr = [1,2,3];//把数组的值分别赋给下面的变量; var a = arr[0]; var b = arr[1]; var c = arr[2];...

Android_照相机Camera_调用系统照相机返回data为空

本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/16916279 1.调用系统照相机 [java] view plaincopy   //实例化一个intent,并指定action   Intent intent = new Intent(MediaStore.ACT...

详细解释VB连接access几种方法数据库

在VB在,连接ACCESS数据库的方法主要表现在以下三种 使用ADO对象。通过编写代码訪问数据库 Connection 对象 ODBC数据源 使用ADO Data 控件高速创建数据库连接 有三种连接方法 Data Link文件 使用ODBC数据源名称 使用连接字符串 使用数据环境设计器创建数据库连接 首先加入环境引用。 然后...

Bash变量

1、变量类型 Bash变量有两种:局部变量和环境变量 局部变量:局部变量的范围仅在创建它的Shell中有效 环境变量:能为创建它的Shell及其派生子进程所用的变量,也经常被称为全局变量,一般约定环境变量为大些,它们是那些可以通过内置命令export导出的变量。 2、变量命名 变量名必须以字母或下划线开始,其余部分则可以由字符、数字或下划线构成。变量名中不...

0x01 译文:Windows桌面应用Win32开发简介

本节课将简单介绍下使用C++开发Windows桌面应用的一些基础知识  目录: 准备你的开发环境 Windows 代码规范 操作字符串 什么是一个Window? WinMain:程序的入口点 1. 准备你的开发环境 安装 Windows SDK        要用C或者C++开发Windows 程序,你必须安装 Microsoft Windows So...