ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-04-07 16:33:03  阅读:166  来源: 互联网

标签:数据 简介 编程 ABAP NUM LR 引用 TYPE DATA


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

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

 

标签:数据,简介,编程,ABAP,NUM,LR,引用,TYPE,DATA
来源: https://www.cnblogs.com/BruceKing/p/14628266.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有