将内联声明 table 分配给字段符号
Assigning Inline declared table to Field Symbols
从 SELECT
语句生成了一个内联声明的 table,如下所示:
SELECT *
INTO TABLE @DATA(lt_result)
FROM scarr.
如何将 lt_result
分配给字段符号?
我尝试了以下方法:
FIELD-SYMBOLS: <fs_lt_result> TYPE ANY.
LOOP AT lt_result ASSIGNING <fs_lt_result>.
但我无法在循环内调用字段符号中的任何组件,例如:
WRITE / <fs_lt_result>-carrid.
(语法错误:The data object "<FS_LT_RESULT>" does not have a structure and therefore does not have a component called "CARRID".
)
ASSIGN 语句中内部 table 的字段符号的内联声明和 LOOP 中 table 行的字段符号的内联声明。
LOOP AT <lt_result> ASSIGNING FIELD-SYMBOL(<line>).
...
ENDLOOP.
来源:https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenfield-symbol_inline.htm
示例:
字段符号:类型 VBAK。
数据:ITAB 类型 TABLE OF VBAK .
SELECT * FROM VBAK INTO TABLE ITAB 最多 10 行。
循环 ITAB 分配
写:/-VBELN。 (写下您想显示的输出)
结束循环。
您声明字段符号是未知类型(ANY
,即确切类型仅在 运行 时间已知),因此编译器无法确定提到的组件(CARRID
) 存在,因此出现语法错误。
如果要静态提及组件,必须告知编译器确切的类型(存在哪些组件)。
例如,这会起作用:
SELECT *
INTO TABLE @DATA(lt_result)
FROM scarr.
FIELD-SYMBOLS: <fs_lt_result> TYPE scarr.
LOOP AT lt_result ASSIGNING <fs_lt_result>.
WRITE / <fs_lt_result>-carrid.
ENDLOOP.
或者使用你自己建议的字段符号的内联声明answer/solution:
LOOP AT lt_result ASSIGNING FIELD-SYMBOL(<fs_lt_result>).
注意:如果您的内部 table 仅在 运行 时确定了类型,则不可能静态指示组件名称,您需要动态引用该组件:
ASSIGN COMPONENT ('CARRID') OF STRUCTURE <fs_lt_result> TO FIELD-SYMBOL(<field>).
IF sy-subrc = 0.
WRITE / <field>.
ENDIF.
从 SELECT
语句生成了一个内联声明的 table,如下所示:
SELECT *
INTO TABLE @DATA(lt_result)
FROM scarr.
如何将 lt_result
分配给字段符号?
我尝试了以下方法:
FIELD-SYMBOLS: <fs_lt_result> TYPE ANY.
LOOP AT lt_result ASSIGNING <fs_lt_result>.
但我无法在循环内调用字段符号中的任何组件,例如:
WRITE / <fs_lt_result>-carrid.
(语法错误:The data object "<FS_LT_RESULT>" does not have a structure and therefore does not have a component called "CARRID".
)
ASSIGN 语句中内部 table 的字段符号的内联声明和 LOOP 中 table 行的字段符号的内联声明。
LOOP AT <lt_result> ASSIGNING FIELD-SYMBOL(<line>).
...
ENDLOOP.
来源:https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenfield-symbol_inline.htm
示例: 字段符号:类型 VBAK。 数据:ITAB 类型 TABLE OF VBAK .
SELECT * FROM VBAK INTO TABLE ITAB 最多 10 行。
循环 ITAB 分配 写:/-VBELN。 (写下您想显示的输出) 结束循环。
您声明字段符号是未知类型(ANY
,即确切类型仅在 运行 时间已知),因此编译器无法确定提到的组件(CARRID
) 存在,因此出现语法错误。
如果要静态提及组件,必须告知编译器确切的类型(存在哪些组件)。
例如,这会起作用:
SELECT *
INTO TABLE @DATA(lt_result)
FROM scarr.
FIELD-SYMBOLS: <fs_lt_result> TYPE scarr.
LOOP AT lt_result ASSIGNING <fs_lt_result>.
WRITE / <fs_lt_result>-carrid.
ENDLOOP.
或者使用你自己建议的字段符号的内联声明answer/solution:
LOOP AT lt_result ASSIGNING FIELD-SYMBOL(<fs_lt_result>).
注意:如果您的内部 table 仅在 运行 时确定了类型,则不可能静态指示组件名称,您需要动态引用该组件:
ASSIGN COMPONENT ('CARRID') OF STRUCTURE <fs_lt_result> TO FIELD-SYMBOL(<field>).
IF sy-subrc = 0.
WRITE / <field>.
ENDIF.