• 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>中。现在,该字段符号可用于对内部表执行任何有效的操作。
    *数据引用和对象引用之间的区别:
    *有两种类型的参考变量:
    *数据参考和
    *对象参考
    *数据引用变量可以存储对任何数据对象(变量,结构,内部表等)的引用,而对象引用变量可以存储对任何类对象的引用。
    *对于数据引用变量,可以指定通用数据类型或完全指定的数据类型。对于对象引用变量,可以指定类或接口。
  • 相关阅读:
    字典对象的 Pythonic 用法(上篇:转载)
    代码这样写更优雅(Python 版)(转载)
    [Python爬虫] 之二十七:Selenium +phantomjs 利用 pyquery抓取今日头条视频
    [Python爬虫] 之二十六:Selenium +phantomjs 利用 pyquery抓取智能电视网站图片信息
    [Python爬虫] 之二十五:Selenium +phantomjs 利用 pyquery抓取今日头条网数据
    [Python爬虫] 之二十四:Selenium +phantomjs 利用 pyquery抓取中广互联网数据
    [Python爬虫] 之二十三:Selenium +phantomjs 利用 pyquery抓取智能电视网数据
    MOVE降低高水位 HWM
    select查询语句执行顺序
    Oracle表空间维护总结
  • 原文地址:https://www.cnblogs.com/BruceKing/p/14628266.html
Copyright © 2020-2023  润新知