• ABAP中的动态编程–第1部分–字段符号简介


    字段符号是数据对象的占位符,它指向数据对象的内存地址上存在的值。当我们声明它们时,它不会保留任何物理内存空间,它仅在运行时指向数据对象。

    "类型字段符号
    "类型字段符号可以声明为:
    DATA: var TYPE I VALUE 2.
    FIELD-SYMBOLS: <fs_num> TYPE I.
    ASSIGN var TO <fs_num>.
    WRITE: / <fs_num>.
    <fs_num> = 4.
    WRITE: / var.
    "输出将是2和4。
    "-------------------------------------------------------------------------------------
    "类型化的字段符号只能指向指定类型的数据对象。
    "将数据对象分配给字段符号后,如果我们对字段符号值进行了任何更改,则相应数据对象的值也会被更新。
    "字段符号代替工作区:
    "修改内部表记录–我们可以声明任何结构类型的字段符号,这些符号可以在循环内部表时使用。
    DATA: lt_mara TYPE STANDARD TABLE OF mara.
    FIELD-SYMBOLS: <fs_mara> TYPE mara.
    SELECT * FROM mara INTO TABLE lt_mara UP TO 10 ROWS.
    LOOP AT lt_mara ASSIGNING <fs_mara>.
      <fs_mara>-matkl = 'DEMO'.
    ENDLOOP.
    "如果我们更改字段符号中的任何结构字段,内部的相应字段将被更新。我们不需要编写如果使用工作区就可以编写的MODIFY语句。这是因为工作区存储内部表行的副本,而字段符号直接引用内部表行。
    "因此,带有字段符号的内部表的处理比带有工作区域的内部表的处理要快。
    "-------------------------------------------------------------------------------------
    "附加到内部表–现在假设我们要将一些值附加到一个内部表中,那么我们可以使用字段符号,如下所示:
    DATA: lt_mara TYPE STANDARD TABLE OF mara.
    FIELD-SYMBOLS: <fs_mara> TYPE mara.
    APPEND INITIAL LINE TO lt_mara ASSIGNING <fs_mara>.
    IF <fs_mara> IS ASSIGNED.
      <fs_mara>-matnr = 'MAT1'.
      <fs_mara>-matkl = '001'.
      UNASSIGN <fs_mara>.
    ENDIF.
    APPEND INITIAL LINE TO lt_mara ASSIGNING <fs_mara>.
    IF <fs_mara> IS ASSIGNED.
      <fs_mara>-matnr = 'MAT2'.
      <fs_mara>-matkl = '001'.
      UNASSIGN <fs_mara>.
    ENDIF."执行此操作后,内部表将包含两行。
    "在执行任何操作之前,请务必对字段符号进行检查,以确定是否已分配该符号,以免发生短时转储。同样在执行该操作之后,取消分配字段符号。
    "-------------------------------------------------------------------------------------
    "读取内部表–我们可以使用字段符号读取内部表的记录,如下所示:
    READ TABLE lt_mara ASSIGNING <fs_mara> WITH KEY matnr = 'MAT1'.
    "-------------------------------------------------------------------------------------
    "通用字段符号:
    "动态编程实际上是使用通用字段符号实现的。最常用的通用类型是TYPE ANY和TYPE ANY TABLE。
    FIELD-SYMBOLS: <fs_str> TYPE ANY.
    FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE.
    "在这里,我们可以将任何数据对象分配给TYPE ANY字段符号,而TYPE ANY TABLE字段符号则用于分配任何内部表。
    "-------------------------------------------------------------------------------------
    *键入任何:
    *让我们将MARA类型的工作区分配给TYPE ANY字段符号,然后使用字段符号填充工作区。
    FIELD-SYMBOLS: <fs_str> TYPE ANY.
    FIELD-SYMBOLS: <fs_data> TYPE ANY.
    DATA: lw_mara TYPE mara.
    ASSIGN lw_mara TO <fs_str>.
    IF <fs_str> IS ASSIGNED.
      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <fs_str> TO <fs_data>.
      IF <fs_data> IS ASSIGNED.
        <fs_data> = 'MAT001'.
        UNASSIGN <fs_data>.
      ENDIF.
      UNASSIGN <fs_str>.
    ENDIF.
    *将lw_mara分配给<fs_str>之后,我们不能直接在字段符号上使用'-'运算符来访问MARA结构的字段,即<fs_str> -matnr会产生语法错误。这是因为字段符号类型仅在运行时声明,而不在编译时声明。
    *因此,要使用字段符号访问matnr字段,首先需要将该字段组件分配给其他字段符号,然后使用新的字段符号来更新matnr字段,如上面的代码片段所示。
    *上面的代码段的执行之后,的值lw_mara-MATNR将MAT001。
    "-------------------------------------------------------------------------------------
    *键入任何表:
    *我们可以将任何内部表分配给该字段符号。让我们分析以下代码片段,以了解如何使用此类字段符号。
    FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE.
    FIELD-SYMBOLS: <fs_str> TYPE ANY.
    FIELD-SYMBOLS: <fs_data> TYPE ANY.
    DATA: lt_mara TYPE STANDARD TABLE OF mara.
    DATA: lw_mara TYPE mara.
    ASSIGN lt_mara TO <fs_tab>.
    SELECT * FROM mara INTO TABLE lt_mara UP TO 10 ROWS.
    LOOP AT <fs_tab> ASSIGNING <fs_str>.
      IF <fs_str> IS ASSIGNED.
        ASSIGN COMPONENT 'MATKL' OF STRUCTURE <fs_str> TO <fs_data>.
        IF <fs_data> IS ASSIGNED.
          IF <fs_data> EQ '01'.
    *********** Do some processing *********
          ENDIF.
          UNASSIGN <fs_data>.
        ENDIF.
      ENDIF.
    ENDLOOP.
    
    *使用通用字段符号读取内部表:
    FIELD-SYMBOLS: <fs_tab> TYPE ANY TABLE.
    FIELD-SYMBOLS: <fs_str> TYPE ANY.
    DATA: lt_mara TYPE STANDARD TABLE OF mara.
    ASSIGN lt_mara TO <fs_tab>.
    SELECT * FROM mara INTO TABLE lt_mara UP TO 10 ROWS.
    READ TABLE <fs_tab> ASSIGNING <fs_str> WITH KEY ('MATNR') = 'MAT001'.
    *由于<fs_tab>是通用字段符号,因此其类型仅在运行时才知道,因此我们不能直接在WITH KEY之后编写MARA结构的字段,而是必须在括号内编写字段名称,如上所示。
    *在ABAP中,此括号指示编译器操作数的值将在运行时确定,因此不会出现任何编译错误。
  • 相关阅读:
    Windows 下Npm和NodeJS升级
    解决本地端口占用问题
    eclipse spring boot项目部署
    JPA 使用 Specification 复杂查询和 Criteria 查询
    datepicker 属性设置 以及方法和事件
    sqlServer拼结列字符串
    Gson基本操作,JsonObject,JsonArray,String,JavaBean,List互转
    PNChart,简洁高效有动画效果的iOS图表库
    PureLayout,使用纯代码写AutoLayout
    iRate快速绕坑使用
  • 原文地址:https://www.cnblogs.com/BruceKing/p/14628217.html
Copyright © 2020-2023  润新知