ABAP中的动态编程–第2部分–数据参考简介

在我的上一个博客中,我解释了有关字段符号的内容,以下是相同的链接:

https://www.cnblogs.com/BruceKing/p/14628217.html

在这个博客中,我将解释有关数据引用及其在动态编程中的意义。

根据SAP文档,数据引用可以指向任何数据对象或其部分(组件,内部表的行或由偏移量和长度指定的部分)。

因此,数据引用不过是指针。它存储任何数据对象的内存地址。但是要访问数据引用指向的实际数据对象,我们首先需要使用解引用运算符-> *对其进行引用。

字段符号和数据引用之间的区别:

字段符号是分配给它的数据对象的占位符,它指向数据对象的内容,因此它可以在任何操作数位置使用(无需取消引用),并且可以与引用的存储区的内容一起使用(值语义) )。

数据引用是指向数据对象的指针,它包含数据对象的内存地址(引用语义)。数据引用不能直接在操作数位置使用;应该首先取消引用。

*数据引用可以有两种类型:
*类型化数据参考&通用数据参考
*类型化数据参考:
*类型化的数据引用变量可以声明为:
DATA LR_NUM TYPE REF TO I.
CREATE DATA LR_NUM.
*在这里,第一条语句声明了一个引用变量LR_NUM,它可以指向类型为“ I”的任何数据对象。第二条语句创建类型为“ I”的匿名数据对象,并将该数据对象的引用分配给LR_NUM。现在,如果我们要更改数据对象的值,则可以通过使用取消引用运算符-> *取消引用LR_NUM来完成此操作,如下所示:
DATA LR_NUM TYPE REF TO I.
CREATE DATA LR_NUM.
LR_NUM->* = 2.
WRITE: / LR_NUM->*.
*输出将是2。
*与ABAP 7.40,代替创建数据,则NEW操作者也可用于创建匿名数据对象和分配它参照数据参考变量。
DATA LR_NUM TYPE REF TO I.
LR_NUM = NEW #( ).
*将现有数据对象分配给数据引用:
*如果要将现有数据对象的引用分配给数据引用,则可以使用GET REFERENCE 语句。
DATA: LV_NUM TYPE I VALUE 2.
DATA: LR_NUM TYPE REF TO I.
GET REFERENCE OF LV_NUM INTO LR_NUM.
LR_NUM->* = 4.
WRITE: / LV_NUM.
*这里LV_NUM是一个现有的数据对象(未匿名数据对象)。输出将是4。
*与ABAP 7.40,而不是GET REFERENCE,则REF操作者也可以用来分配现有数据对象到数据参考基准。
*使用结构:
DATA: LR_MARA TYPE REF TO MARA.
CREATE DATA LR_MARA.
LR_MARA->MATNR = '1111'.
LR_MARA->MATKL = '03'.
*在这里,可以使用->运算符访问数据引用变量来访问结构的各个组件。

*使用内部表:
*在处理内部表行时,我们可以使用REFERENCE INTO语句来设置对表行的引用,如下所示:

DATA: LR_MARA TYPE REF TO MARA.
DATA: LT_MARA TYPE TABLE OF MARA.
SELECT * FROM MARA INTO TABLE LT_MARA UP TO 10 ROWS.
LOOP AT LT_MARA REFERENCE INTO LR_MARA.
  WRITE: / LR_MARA->MATNR.
ENDLOOP.

*通用数据参考:
*通用数据引用可以声明为:
DATA: LR_NUM TYPE REF TO DATA.
CREATE DATA LR_NUM TYPE I.
*在这里,第一条语句声明了通用数据引用LR_NUM,该引用可以指向任何数据对象。第二条语句创建类型为“ I”的匿名数据对象,并将其引用分配给LR_NUM。
*ABAP中的“数据”是一种通用数据类型。
*现在,由于LR_NUM是泛型的,因此不能直接在操作数位置使用LR_NUM-> *。因此,以下声明将不被允许。
LR_NUM->* = 2.
*因此,在使用通用数据引用的情况下,只能使用字段符号对其进行取消引用,并且可以在任何操作数位置使用此字段符号来操作数据对象的值,如下所示:

DATA: LR_NUM TYPE REF TO DATA.
FIELD-SYMBOLS: <NUM> TYPE ANY.
CREATE DATA LR_NUM TYPE I.
ASSIGN LR_NUM->* TO <NUM>.
<NUM> = 3.
*在ASSIGN语句之后,您应该检查SY-SUBRC如果成功分配字段符号,则SY-SUBRC将为0,否则将为4。
*使用结构:
DATA: LR_STR TYPE REF TO DATA.
FIELD-SYMBOLS: <STR> TYPE ANY.
FIELD-SYMBOLS: <DATA> TYPE ANY.
CREATE DATA LR_STR TYPE MARA.

ASSIGN LR_STR->* TO <STR>.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <STR> TO <DATA>.
<DATA> = '112'.
*这里的CREATE DATA语句创建一个匿名数据对象(MARA结构),并将其引用分配给通用数据引用LR_STR,然后可以将其取消引用为通用字段符号<STR>。现在,要访问MARA结构的各个组件,可以使用ASSIGN COMPONENT语句。

*动态创建数据对象:
*要求:选择屏幕参数“表格名称”将以表格名称作为输入,并显示相应的表格条目作为输出。
*解决方案:
PARAMETERS: P_TNAME TYPE TABNAME.
DATA: LR_TAB TYPE REF TO DATA.
FIELD-SYMBOLS: <TAB> TYPE ANY TABLE.
CREATE DATA LR_TAB TYPE TABLE OF (P_TNAME).
ASSIGN LR_TAB->* TO <TAB>.
IF SY-SUBRC EQ 0.
  SELECT * FROM (P_TNAME) INTO TABLE <TAB> UP TO 10 ROWS.
  CL_DEMO_OUTPUT=>DISPLAY( <TAB> ).
ENDIF.
*解释:
*这里LR_TAB是通用数据引用,而<TAB>是内部表的通用字段符号。在CREATE DATA语句中,括号中提到了数据对象的类型,这意味着该类型将在运行时根据参数P_TNAME的值确定。之后,我们将数据引用LR_TAB取消引用到通用字段符号<TAB>中。现在,该字段符号可用于对内部表执行任何有效的操作。
*数据引用和对象引用之间的区别:
*有两种类型的参考变量:
*数据参考和
*对象参考
*数据引用变量可以存储对任何数据对象(变量,结构,内部表等)的引用,而对象引用变量可以存储对任何类对象的引用。
*对于数据引用变量,可以指定通用数据类型或完全指定的数据类型。对于对象引用变量,可以指定类或接口。

 

上一篇:33.Linux驱动调试-根据oops的栈信息,确定函数调用过程


下一篇:C#中的ORM框架