一个完整的ABAP ALV报表示例,它包含一个选择屏幕,您可以在其中输入两个参数(例如航空公司代码和航班连接号),点击执行按钮(或按F8)后,系统会根据参数查询数据并显示在ALV网格中。


*&---------------------------------------------------------------------*
*& Report Z_ALV_WITH_PARAMS
*&---------------------------------------------------------------------*
*& 简单的ALV报表,带两个输入参数,点击执行查询并显示
*&---------------------------------------------------------------------*
REPORT z_alv_with_params.

TABLES: sflight.                         " 引用数据库表,用于字段定义

*------------------ 内表与工作区定义 ------------------------------------
DATA: gt_sflight TYPE TABLE OF sflight,   " 存放查询结果
      gs_sflight LIKE LINE OF gt_sflight.

*------------------ ALV相关变量 -----------------------------------------
DATA: gs_layout   TYPE slis_layout_alv,   " 布局结构
      gt_fieldcat TYPE slis_t_fieldcat_alv, " 字段目录内表
      gs_fieldcat LIKE LINE OF gt_fieldcat.

*------------------ 选择屏幕 --------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_carrid TYPE sflight-carrid OBLIGATORY,  " 航空公司代码(必输)
            p_connid TYPE sflight-connid OBLIGATORY.  " 航班连接号(必输)
SELECTION-SCREEN END OF BLOCK b1.

*----------------------------------------------------------------------*
* 主处理
*----------------------------------------------------------------------
START-OF-SELECTION.
  PERFORM get_data.           " 1. 获取数据
  PERFORM build_fieldcat.     " 2. 构建字段目录
  PERFORM set_layout.         " 3. 设置布局
  PERFORM display_alv.        " 4. 显示ALV

*&---------------------------------------------------------------------*
*& 获取数据(根据输入参数从SFLIGHT表查询)
*&---------------------------------------------------------------------*
FORM get_data.
  SELECT * FROM sflight
    INTO TABLE gt_sflight
    WHERE carrid = p_carrid
      AND connid = p_connid.

  IF sy-subrc <> 0.
    MESSAGE '未找到符合条件的航班数据!' TYPE 'I'.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& 构建字段目录(定义要显示的列)
*&---------------------------------------------------------------------*
FORM build_fieldcat.
  CLEAR gt_fieldcat.

  " 列1:航空公司代码
  gs_fieldcat-fieldname = 'CARRID'.
  gs_fieldcat-tabname   = 'SFLIGHT'.
  gs_fieldcat-seltext_m = '航空公司'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  " 列2:航班连接号
  gs_fieldcat-fieldname = 'CONNID'.
  gs_fieldcat-tabname   = 'SFLIGHT'.
  gs_fieldcat-seltext_m = '航班号'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  " 列3:航班日期
  gs_fieldcat-fieldname = 'FLDATE'.
  gs_fieldcat-tabname   = 'SFLIGHT'.
  gs_fieldcat-seltext_m = '航班日期'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  " 列4:价格
  gs_fieldcat-fieldname = 'PRICE'.
  gs_fieldcat-tabname   = 'SFLIGHT'.
  gs_fieldcat-seltext_m = '价格'.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.

  " 可根据需要添加更多字段...
ENDFORM.

*&---------------------------------------------------------------------*
*& 设置ALV全局布局
*&---------------------------------------------------------------------*
FORM set_layout.
  CLEAR gs_layout.
  gs_layout-colwidth_optimize = 'X'.   " 优化列宽
  gs_layout-zebra             = 'X'.   " 斑马条纹
  gs_layout-detail_popup      = 'X'.   " 双击行弹出详细信息(依赖系统标准)
ENDFORM.

*&---------------------------------------------------------------------*
*& 调用标准函数显示ALV
*&---------------------------------------------------------------------*
FORM display_alv.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid     " 当前程序名
      is_layout          = gs_layout
      it_fieldcat        = gt_fieldcat
      i_save             = 'A'          " 允许用户保存布局
    TABLES
      t_outtab           = gt_sflight
    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.
ENDFORM.
posted @ 2026-06-29 08:51  虚拟过客之IT老男人  阅读(2)  评论(0)    收藏  举报