Abap 将内联声明表分配给字段符号

Abap 将内联声明表分配给字段符号,abap,custom-data-type,Abap,Custom Data Type,有一个由SELECT语句生成的内联声明表,如下所示: SELECT * INTO TABLE @DATA(lt_result) FROM scarr. 如何将lt\u结果分配给字段符号 我尝试了以下方法: FIELD-SYMBOLS: <fs_lt_result> TYPE ANY. LOOP AT lt_result ASSIGNING <fs_lt_result>. 字段符号:键入任意。 在lt_结果赋值时循环。 但我无法调用循环中字段符号中的任何组件

有一个由
SELECT
语句生成的内联声明表,如下所示:

SELECT *
INTO TABLE @DATA(lt_result)
FROM scarr.
如何将
lt\u结果
分配给字段符号

我尝试了以下方法:

  FIELD-SYMBOLS: <fs_lt_result> TYPE ANY.

  LOOP AT lt_result ASSIGNING <fs_lt_result>.
字段符号:键入任意。
在lt_结果赋值时循环。
但我无法调用循环中字段符号中的任何组件,如:

WRITE / <fs_lt_result>-carrid.
WRITE/-carrid。

(语法错误:
数据对象“”没有结构,因此没有名为“CARRID”的组件。

为ASSIGN语句中的内部表内联声明字段符号,并为循环中的表行内联声明字段符号

LOOP AT <lt_result> ASSIGNING FIELD-SYMBOL(<line>).
  ...
ENDLOOP. 
在指定字段-SYMBOL()时循环。
...
结束循环。
来源:

示例: 字段符号:键入VBAK。 数据:VBAK的ITAB类型表

选择*从VBAK进入表ITAB,最多10行

在ITAB分配时循环 写入:/-VBELN。(写入要显示的输出)
ENDLOOP。

您声明字段符号的类型未知(
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.
选择*
进入表@数据(lt\U结果)
来自斯卡尔。
字段符号:输入scarr。
在lt_结果赋值时循环。
WRITE/-carrid。
结束循环。
或者使用您在自己的答案/解决方案中建议的字段符号内联声明:

LOOP AT lt_result ASSIGNING FIELD-SYMBOL(<fs_lt_result>).
lt_结果赋值字段-SYMBOL()处的循环。
注意:如果您的内部表的类型仅在运行时确定,则不可能静态指示组件名称,您需要动态引用组件:

ASSIGN COMPONENT ('CARRID') OF STRUCTURE <fs_lt_result> TO FIELD-SYMBOL(<field>).
IF sy-subrc = 0.
  WRITE / <field>.
ENDIF.
将结构的组件('CARRID')分配给字段-SYMBOL()。
如果sy subrc=0。
写/。
恩迪夫。

要回答为什么“无法调用循环中FS中的任何组件,如
-base\u unit
”(实际上,这意味着您在编译时遇到语法错误),这是因为您将字段符号类型声明为any,编译器假定字段符号将在运行时引用任何类型的数据对象,因此,拒绝提及组件基础单元。如果您不使用字段符号的内联声明,则另一种方式是声明:<代码>字段符号,如LTLRESULT的行。< /代码>(当然,在LTL结果声明之后)HELLO,欢迎您这样做,请考虑此指南以改进您的答案。