0

如何在 ALV 网格中显示内联声明的数据类型?

例如:

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

如何lt_result在 ALV 网格中显示?

4

2 回答 2

8

这是一个基本示例:

DATA: alv TYPE REF TO cl_salv_table.   

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

cl_salv_table=>factory( IMPORTING r_salv_table = alv
                        CHANGING  t_table      = lt_result ).

alv->display( ).

您可以在包 SALV_OM_OBJECTS 中找到使用 SALV 对象模型的其他示例。

这是一种比使用“REUSE_ALV_GRID_DISPLAY”更现代的方法,您不需要定义字段目录。

于 2018-01-19T16:25:26.303 回答
2

无论您如何创建 lt_result,您都必须做同样的事情。如您的示例中的Aselect *将导致 lt_result 等于,如果您这样做了DATA lt_result type table of tablename

在这种情况下,您可以发送结构的名称。但这仅在 SE11 中定义了结构类型时才有效,即,如果您在select *没有任何连接或别名的情况下执行 a。

否则,您必须创建并发送一个字段目录,其中包含您希望显示的 lt_result 中的所有字段。

例子:

SELECT * FROM mara
UP TO 10 ROWS
INTO TABLE @DATA(lt_mara).

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program = sy-repid
    i_structure_name   = 'MARA'
*    it_fieldcat  => use this if i_structure_name is not sufficient
  TABLES
    t_outtab           = lt_mara
  EXCEPTIONS
    OTHERS             = 1.

如果您使用 cl_gui_alv_grid,同样的情况也适用。

编辑:您可以像这样动态填充字段目录:

DATA:
  lo_t_struct TYPE REF TO cl_abap_tabledescr,
  lo_struct   TYPE REF TO cl_abap_structdescr.

lo_t_struct ?= cl_abap_tabledescr=>describe_by_data( lt_result ).
lo_struct ?= lo_t_struct->get_table_line_type( ).

LOOP AT lo_struct->components ASSIGNING FIELD-SYMBOL(<comp>).
  "Fill a range-table with <comp>-name
ENDLOOP.

使用范围表从表 dd04t 中获取字段描述。

然后再次循环lo_struct->components,并用字段名和描述填充字段目录。在这里,您还可以为任何给定字段添加特殊逻辑。

于 2018-01-19T14:16:59.623 回答