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 TO10 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。abap开发顾问是程序员吗
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 TO10 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 TO10 ROWS.
READ TABLE <fs_tab> ASSIGNING <fs_str> WITH KEY ('MATNR') = 'MAT001'.
*由于<fs_tab>是通⽤字段符号,因此其类型仅在运⾏时才知道,因此我们不能直接在WITH KEY之后编写MARA结构的字段,⽽是必须在括号内编写字段名称,如上所⽰。*在ABAP中,此括号指⽰编译器操作数的值将在运⾏时确定,因此不会出现任何编译错误。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。