如何在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
相关产品推荐
相关产品推荐

