You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ALV Grid中显示内联声明的数据对象(如lt_result)?

嘿,这个问题我太熟悉了!用内联声明DATA(lt_result)得到的内表,和普通声明的内表在ALV Grid里显示的逻辑其实大同小异——唯一需要注意的是,因为它是泛型内表(编译时结构不确定),我们得确保ALV能正确识别它的结构信息。下面给你两种实用的实现方式,附完整代码示例:

方式一:用传统LVC函数快速实现(推荐新手)

REUSE_ALV_GRID_DISPLAY_LVC这个函数对泛型内表非常友好,它会自动通过运行时类型服务(RTTS)解析内表的结构,不需要你手动处理字段目录,几步就能搞定:

REPORT z_alv_inline_demo.

START-OF-SELECTION.
  " 1. 内联声明获取目标数据
  SELECT * FROM sflight INTO TABLE @DATA(lt_result) UP TO 100 ROWS.

  " 2. 判断数据非空后调用ALV函数
  IF lt_result IS NOT INITIAL.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program = sy-repid  " 当前程序名,必须指定
        is_layout_lvc      = VALUE lvc_s_layo( grid_title = '航班数据(内联内表)' )
      TABLES
        t_outtab           = lt_result  " 直接传入内联声明的内表
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ELSE.
    MESSAGE '未查询到任何数据' TYPE 'I'.
  ENDIF.
方式二:用OO ALV实现(适合复杂自定义场景)

如果你需要自定义列属性、添加事件逻辑(比如双击事件),OO ALV会更灵活。这里我们通过RTTS获取内表的结构描述,手动生成字段目录:

REPORT z_alv_inline_oo_demo.

CLASS lcl_alv_manager DEFINITION.
  PUBLIC SECTION.
    METHODS:
      show_alv IMPORTING it_data TYPE STANDARD TABLE.
ENDCLASS.

CLASS lcl_alv_manager IMPLEMENTATION.
  METHOD show_alv.
    " 创建ALV Grid实例
    DATA(lo_alv_grid) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>screen0 ).
    
    " 获取内表的行结构描述
    DATA(lo_table_descr) = cl_abap_tabledescr=>describe_by_data( it_data ).
    DATA(lo_struct_descr) = CAST cl_abap_structdescr( lo_table_descr->get_table_line_type( ) ).
    
    " 生成字段目录
    DATA(lt_fieldcat) = VALUE lvc_t_fcat( ).
    LOOP AT lo_struct_descr->components INTO DATA(ls_comp).
      APPEND VALUE lvc_s_fcat(
        fieldname = ls_comp-name
        scrtext_l = ls_comp-name  " 可以替换为自定义文本,比如用DDIC字段描述
        ref_table = ls_comp-type->get_relative_name( )
      ) TO lt_fieldcat.
    ENDLOOP.

    " 设置ALV布局
    DATA(ls_layout) = VALUE lvc_s_layo( grid_title = 'OO ALV展示内联内表' ).

    " 初始化并显示ALV
    CALL METHOD lo_alv_grid->set_table_for_first_display
      EXPORTING
        is_layout_lvc = ls_layout
      CHANGING
        it_outtab     = it_data
        it_fieldcatalog_lvc = lt_fieldcat.

    " 弹出屏幕显示ALV
    CALL SCREEN 100.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  " 内联声明获取数据
  SELECT carrid, connid, cityfrom, cityto FROM spfli INTO TABLE @DATA(lt_result) UP TO 50 ROWS.

  IF lt_result IS NOT INITIAL.
    DATA(lo_alv_mgr) = NEW lcl_alv_manager( ).
    lo_alv_mgr->show_alv( lt_result ).
  ELSE.
    MESSAGE '无数据可显示' TYPE 'I'.
  ENDIF.

" 屏幕100的PBO模块(需要在SE80中创建对应屏幕并绑定模块)
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STANDARD_ALV'.  " 可以自定义状态栏,这里用标准的
ENDMODULE.

MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.
关键注意点
  • 即使SELECT没查到数据,内联声明的内表依然保留了结构信息,不过最好先判断lt_result IS NOT INITIAL再显示,避免无意义的ALV渲染。
  • 不管是单表查询还是多表联合查询(比如SELECT a~col1 b~col2 INTO TABLE @DATA(lt_result)...),上面的方法都能自动识别内表结构,无需额外处理。

内容的提问来源于stack exchange,提问作者Isuru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:45:17