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>中。现在,该字段符号可用于对内部表执行任何有效的操作。 *数据引用和对象引用之间的区别: *有两种类型的参考变量: *数据参考和 *对象参考 *数据引用变量可以存储对任何数据对象(变量,结构,内部表等)的引用,而对象引用变量可以存储对任何类对象的引用。 *对于数据引用变量,可以指定通用数据类型或完全指定的数据类型。对于对象引用变量,可以指定类或接口。