ABAP基础-动态数据对象

1.概述

ABAP的动态数据对象包括字段符号(filed symbols)和数据引用(data reference)两种形式。
普通数据对象的寻址静态地通过该对象名称进行;而上述两种数据对象则只有在运行时,系统才知道该数据对象的名称和属性,并进行寻址。

  • 字段符号是数据对象的语义上的名称。当访问字段符号时,实际操作的是分配给该字段符号的数据对象内容,因而字段符号可以看作仅是已经被解除引用的指针。
  • 数据引用中是数据对象的地址。当操作数据引用变量时,程序访问的数据引用的内容即其指向数据对象的地址。因而,如果要通过数据引用操作实际代表的数据对象的内容,必须先进行引用解除操作。

2.字段符号

在程序运行期内可将数据对象分配给字段符号。成功分配后,使用字段符号或其所代表数据对象本身,是没有任何区别的。换句话说,如果用赋值语句修改字段符号的值,字段符号所代表的数据对象本身的值也随之改变。

1.声明字段符号

声明字段符号需使用FIELD-SYMBOLS语句,基本语法格式如下
FIELD-SYMBOLS <fs> [ TYPE type | LIKE dobj ].
声明字段符号时可以指定类型,该类型决定了运行时何种数据对象可以被分配给一个字段符号,此处可以指定一般性类型和完全限定类型,如果不指定类型,则系统默认该字段符号为一般性类型ANY。

REPORT z_simple_fieldsymbols.
DATA: BEGIN OF address,
        no(5)      TYPE n,
        street(30) TYPE c,
      END OF address.

DATA itab_add LIKE TABLE OF address.

address-no = '001'.
address-street = 'street1'.
INSERT address INTO TABLE itab_add.

FIELD-SYMBOLS <fs> TYPE INDEX TABLE.
ASSIGN itab_add TO <fs>.

READ TABLE itab_add WITH TABLE KEY no = '001' street = 'street1' INTO address.

2.分配数据对象

字段符号声明之后,可以进行字段分配,所分配的数据对象应符合字段符号定义时的类型说明。字段符号可以反复进行分配,且分配方式有静态和动态之区分。

  • 静态分配
    在程序运行前确定要分配给字段符号的数据对象名称,使用ASSIGN f TO <fs>.语句。
    可以在分配过程中指定要分配数据对象的偏移量和长度ASSIGN f[+o][(1)] TO <fs>.。在ASSIGN语句中,偏移量说明有下述特征:
    • o和1可以是字符文字或变量
    • 系统不检查偏移部分是否位于字段f内部,因此偏移量o和长度1都可以大于f的长度,这为字段符号操作带来了灵活性
    • 如果未指定长度1,系统默认字段f的长度,在这种情况下o大于零,,<fs>将总是指向超出f限制的区域。
    • 如果o小于f的长度,可以为1指定一个“*”来阻止分配f限制之外的区域给<fs>
REPORT z_simple_fieldsymbols.
DATA: BEGIN OF address,
        street(20) TYPE c VALUE 'Nanyang Street',
        no(4)      TYPE c VALUE '1234',
        zip(5)     TYPE c VALUE '56789',
        city(20)   TYPE c VALUE 'Singapore',
      END OF address.

FIELD-SYMBOLS: <street_no> TYPE c,
               <zip_city>  TYPE c.
ASSIGN: address(24) TO <street_no>,
address+24(25) TO <zip_city>.

WRITE: / <street_no>,
/ <zip_city>.
静态分配
  • 动态分配
    运行时才能确定要分配给字段符号的数据对象名称,语法如下ASSGIN (f) TO <fs>.。动态分配不是将字段f分配给字段符号<fs>,而是先找到字段f的内容,再将该内容作为一个新的数据对象名称分配给<fs>。动态分配中不能进行指定偏移量和长度的指定。
REPORT z_simple_fieldsymbols.
FIELD-SYMBOLS: <fs>.
DATA: str(20)  TYPE c VALUE 'Output String',
      name(20) TYPE c VALUE 'str'.

ASSIGN name TO <fs>.
WRITE / <fs>.

ASSIGN (name) TO <fs>.
WRITE / <fs>.
动态分配

3.强势类型转换

在将数据对象分配给字段符号的过程中,可以进行类型的强制转换,即所有数据对象都可以被视为一个特定类型。强制类型转换通过ASSIGN语句中的CASTING附加项指定,该选项的出现意味着可以将一个与字段符号指定类型不兼容的数据对象赋给字段符号。强制类型转换分为显式和隐式两种情况。
如果一个字段符号的类型是完全指定的,或者是ABAP内置类型C,N,P,X之一,可以使用下列格式实现隐式强制类型转换ASSGIN f TO <fs> CASTING.当字段分配后,无论其原始数据对象类型如何,系统内表都按照字段符号定义类型对分配的数据对象进行处理。

REPORT z_simple_fieldsymbols.
TYPES: BEGIN OF t_date,
         year(4)  TYPE n,
         month(2) TYPE n,
         day(2)   TYPE n,
       END OF t_date.
FIELD-SYMBOLS <fs> TYPE t_date.
ASSIGN sy-datum TO  <fs> CASTING.
WRITE: / <fs>-year , / <fs>-month, / <fs>-day.

强制转换

如果字段符号的类型是一般性类型,则需要使用下述格式在ASSIGN语句中进行显示强制类型转换:ASSGIN f TO <fs> CASTING {TYPE type | LIKE dobj} [DECIMALS dec].

3.数据引用

程序中使用的所有数据对象均存储在运行时分配的内存中,每一个对象均对应有其起始的内存地址,该地址是由编译器分配的,一般不能被随意操作。数据对象的内存地址也常常被称作引用。通常情况下,声明数据后,程序通过数据对象的名称对其进行操作,然而有时也通过字段符号或者引用通过其他地址进行操作。
在ABAP中,引用以数据引用和对象引用两种形式存在。

1.声明引用变量

引用变量中包含地址引用,是指向其它数据对象的指针,其实际内容代表某数据对象的内存地址,在ABAP程序中是不可见的。引用类型定义和引用变量声明的语法格式如下:
TYPES t_dref TYPE REF TO DATA.
DATA dref TYPE REF TO DATA.
引用变量在ABAP作为结构类型的组件时可以被视为时普通基本类型,即引用变量可以作为复杂类型的结构组件或者独立出现。
引用变量声明时没有指向任何数据对象,因而也不能进行解除引用操作。下述操作可以使该引用对象指向实际的数据对象。

  • 通过该变量动态创建数据对象
  • 通过该变量获取一个数据对象的引用
  • 给该变量分配其他已经存在的数据引用变量

数据引用变量之间可以相互赋值,目标对象和源引用变量指向相同的数据对象,但不能将对象引用或非引用对象的值传递给引用变量。

2.动态对象创建

所有通过DATA语句创建的数据对象都属于静态创建的数据对象,当程序开始运行时,这些变量已经存在。要在程序运行期间动态的创建对象,可通过数据引用变量进行。
CREATE DATA dref TYPE type | LIKE obj.
该语句在运行期间内动态创建一个数据对象,同时引用变量dref指向这一对象。该对象没有名称,只能通过数据引用变量进行寻址,但在操作该数据对象之前,需要通过字段符号解除引用。当没有任何数据引用变量指向该对象时,他将被sap中的垃圾收集装置从系统内存中删除。
在该语句中,必须指定数据类型。也可以通过变量动态的指定所创建的数据对象类型,这种指定类型的方式在所有ABAP语句中是唯一的。
CREATE DATA dref TYPE (name).此处的变量name中包含具体的类型名称(如“C”)。

3.获取对象引用

使用GET语句可以使一个引用变量获得已经存在的数据对象的地址引用。
GET REFERENCE OF obj INTO dref.
其中obj可以是一个通过DATA语句定义的静态变量,也可以是指向某数据对象的字段符号。如果将引用变量指向一个过程内部的局域变量,则该变量在离开过程后将不能再使用,也不能进行解引用操作。

4.解除数据引用

解除引用是访问引用所指向的数据对象的前提,ABAP数据引用变量的解引用语法格式如下ASSGIN dref->* TO <fs> [CASTING ...] .
该语句将数据引用变量dref指向的数据对象赋给字段符号,如果操作成功,系统字段SY-SUBRC将返回0。系统将检查数据对象类型是否与字段符号声明类型相匹配,且该过程中可能出现强制类型转换。如果数据引用变量的值为初始值或者不正确,则无法进行解引用操作,字段符号将保持原值不变,而系统字段SY-SUBRC将返回。对于动态创建的数据对象,解引用是获取其内容的唯一方式。

REPORT z_simple_fieldsymbols.
TYPES: BEGIN OF t_struct,
         col1 TYPE i,
         col2 TYPE i,
       END OF t_struct.

DATA: dref1 TYPE REF TO data,
      dref2 TYPE REF TO data.

FIELD-SYMBOLS: <fs1> TYPE t_struct,
               <fs2> TYPE i.
CREATE DATA dref1 TYPE t_struct.

ASSIGN dref1->* TO <fs1>.
<fs1>-col1 = 1.
<fs1>-col2 = 2.
dref2 = dref1.
ASSIGN dref2->* TO <fs2> CASTING.
WRITE / <fs2>.
GET REFERENCE OF <fs1>-col2 INTO dref2.
ASSIGN dref2->* TO <fs2>.
WRITE / <fs2>.
数据引用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,861评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,263评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,033评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,999评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,000评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,483评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,850评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,827评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,366评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,404评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,525评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,130评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,853评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,293评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,426评论 1 276
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,082评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,590评论 2 366

推荐阅读更多精彩内容