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