Skip to content

数据引用

一、介绍

  用一句话概括数据引用,如下所示。

数据引用是数据对象的指针(Pointer)。

  指针是C语言中最具代表性的特征之一,能直接接触到计算机的内存,提供简洁及高效的功能。指针数据类型是取得其他变量内存地址的类型,因此使用指针可以直接接触要使用的对象。在 ABAP 中将使用这种指针功能称为数据引用。
  前面也定义了 FIELD SYMBOLS 为指针,与数据引用不同的是,FIELDSYMBOLS 只是指针,没有自己的内存领域,即在被分配的数据对象内存领域中进行操作。与此相反,数据引用是将指针作为值且拥有自己的内存领域。以下内容对其进行详细分析。
  FIELD SYMBOLS 与数据引用在 ABAP 程序中可以动态的生成及访问数据对象。换言之即在程序执行时刻定义数据属性与名字可以灵活应用数据对象。
  例如,如果有用户直接输入表名查询所需数据的需求,此时需要根据各自的表结构将数据显示到画面上,但是要实现SAP中使用的三万个以上的表,根据情况定义各自的结构则非常不明智。
  但是如下实例所示,运用数据引用动态生成数据对象可以简单地解决这一问题。
[例 10-12]

abap
REPORT z10_12
PARAMETERS :ptame(30) DEFAULT 'SFLIGHT'

DATA: drefTYPE REF TO data.

FIELD-SYMBOLS: <fs1> TYPE ANY , <fs2> TYPE ANY.

CREATE DATA dref TYPE (p_tname).
ASSIGN dref->* TO <fs1>.

SELECT * FROM (p_tname) INTO <fs1> UP TO 3 ROWS.
    DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <fs1> TO <fs2>
        IF sy-subrc NE 0.
            SKIP.
            EXIT.
        ENDIF.
        WRITE: <fs2>
    ENDDO.
ENDSELECT.

结果 alt text   [例 10-12]中不使用数据引用,而只是使用 FIELD SYMBOLS 则无法动态的制定表名。这是因为FIELDSYMBOLS只有在创建数据对象后才可以使用Assign语句。若想只利用FIELD SYMBOLS 构成,需用 DATA SFLIGHT TYPE SFLIGHT.或者TABLES SFLIGHT.语句定义,使程序执行的同时静态生成数据对象。但使用数据引用时,如CREATEDATA drefTYPE(p tname).语句,程序执行中可以动态生成数据对象。
  根据前面的定义,将上述情况用程序术语重新解释则如下所示。
  FIELD SYMBOLS 在数据对象占有的内存里进行操作。FIELDSYMBOLS 是数据对象的另一个别名。数据引用是拥有自身内存地址的独立性数据对象,用于存储数据变量。数据引用是存储自身内存地址的独立数据对象,将参照变量作为变量值进行存储。
  如[图 10-71所示,数据引用是指向数据对象的指针,通过 FIELDSYMBOLS 访问数据对象的值。程序执行时会动态生成数据对象,因此也动态分配内存地址。这就是利用FELDSYMBOLS 访问数据对象的根本原因。
alt text   请读者比较10.1节[图10-1]FIELDSYMBOLS 与数据引用机制,整理两者的区别。

二、参照变量

  参照变量有两个类型。其一是本章即将学习的DataReference Variable,其二是ABAP对象 里类使用的 Object Reference Variable。前面提到过,如果一般变量(Data Variable)存储变量值的内存,则数据引用可以说是存储内存地址的变量。数据引用存储的项目在ABAP程序中是不可见的。ABAP只是拥有数据引用而已。因此访问数据引用的值必须使用FIELD SYMBOLS。
  通过下面例题生成参照引用类型。

abap
TYPES t drefTYPE REF TO DATA.

  综上所述,利用己定义的数据引用生成参照变量。参照变量的使用方法与 Elementary Data Type 相似,参照变量可以作为结构体、内表、字段等对象。

abap
DATA dref TYPE REF TO t dref.
DATA dref TYPE REF TO DATA.

  使用上面语句定义的 dref处于尚未指向对象的状态,因此无法使用。可以使用类似于CREATE DATA drefTYPE SFLIGHT 这样的语句将参照变量连接到数据对象。

abap
CREATE DATA dref {TYPE type}|{LIKE dobj}}.

三、间接引用

  在编程语言中,间接引用(Dereference)访问指针指向编号中存储的数据。若要访问数据引用所指的数据对象变量值要经过间接引用过程(=Assign到FIELDSYMBOLS中)。FIELD SYMBOLS中的CASTING功能也同样可用。

abap
ASSIGN dref->* TO <f$> [CASTING ...].

  使用 CASTING 把参照变量分配到FIELDSYMBOLS,则当访问动态生成的数据对象值时其类型参照FIELDSYMBOLS 数据类型。成功执行Dereference(=Assign),则系统变量SY-SUBRC返回0,失败返回4。
  通过调试画面分析数据引用程序的执行步骤。
[例 10-13]

abap
REPORT z10_13.
TYPES: BEGIN OF t_struct,
    col1 TYPE char15,
    col2 TYPE char15,
END OF t_struct.

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

FIELD-SYMBOLS: <fs1> TYPE t_struct,
                <fs2> TYPE char15.

CREATE DATA drefl TYPE t_struct.

ASSIGN dref1->* TO <fs1>.

<fs1>-col1 ='Enj0y ABAP'.
<fs1>-coI2 ='ABAP PROGRAMMING'

dref2 = drefl

ASSIGN dref2->* TO <fS2> CASTING,
WRITE/<fs2>.

GET REFERENCE OF <fs1>-col2 INTO dref2

ASSIGN dref2->* TO <fs2>.
WRITE/<fs2>.

[结果 10-13]

abap
Enjoy ABAP
ABAP PROGRAMMIN

  调试[例 10-13]程序有助于理解参照变量的创建方法。 alt textalt text