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

时间:2018-01-19 05:43:41

标签: sap abap custom-data-type

SELECT语句生成一个内联声明表,如下所示。

SELECT *
INTO TABLE @DATA(lt_result)
FROM table.

如何将lt_result分配给字段符号?

尝试以下方式;

  FIELD-SYMBOLS: <fs_lt_result> TYPE ANY.

  ASSIGN lt_result to <fs_lt_result>.

  LOOP AT lt_result ASSIGNING <fs_lt_result>.

但是我无法在循环中调用FS中的任何组件,如;

<fs_lt_result>-base_unit

3 个答案:

答案 0 :(得分:4)

ASSIGN语句中内部表的字段符号的内联声明和LOOP中表的行的字段符号的内联声明。

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

答案 1 :(得分:1)

您声明字段符号的类型未知(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.

或使用您在自己的答案/解决方案中建议的字段符号的内联声明:

LOOP AT lt_result ASSIGNING FIELD-SYMBOL(<fs_lt_result>).

注意:如果内部表的类型仅在运行时确定,则不可能静态地指示组件名称,而需要动态引用该组件:

ASSIGN COMPONENT ('CARRID') OF STRUCTURE <fs_lt_result> TO FIELD-SYMBOL(<field>).
IF sy-subrc = 0.
  WRITE / <field>.
ENDIF.

答案 2 :(得分:-2)

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

从* VBAK中选择*到多达10行的表ITAB中。

在ITAB分配时环回 写:/ -VBELN。 (写出您想显示的内容) ENDLOOP。