欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

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中,此括号指示编译器操作数的值将在运行时确定,因此不会出现任何编译错误。

 

posted @ 2021-04-07 16:08  萧静默  阅读(907)  评论(0编辑  收藏  举报