REUSE_ALV_GRID_DISPLAY 显示可编辑字段,设置gui_stauts按钮,点击保存按钮保存到数据库,弹窗提示是否要保存,同时增加页眉和图片logo,输入搜索条件显示alv

image
image


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

DATA: lv_ip TYPE string.

CALL METHOD cl_gui_frontend_services=>get_ip_address
  RECEIVING
    ip_address = lv_ip.

IF sy-subrc = 0.
  WRITE: / '客户端IP地址:', lv_ip.
ELSE.
  WRITE: / '获取IP地址失败。'.
ENDIF.

DATA: lv_ip2 TYPE usr41-Terminal. " TERM字段存储IP或主机名

SELECT SINGLE Terminal
  FROM usr41
  INTO lv_ip2
  WHERE bname = sy-uname. " 当前用户名
*   AND   mandt = sy-mandt.

IF sy-subrc = 0.
  WRITE: / '当前用户的IP/主机名:', lv_ip2.
ELSE.
  WRITE: / '未找到用户信息。'.
ENDIF.



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.

DATA: ls_glay TYPE lvc_s_glay.
ls_glay-edt_cll_cb = 'X'. " 允许在单元格输入后立即更新内表

*------------------ 选择屏幕 --------------------------------------------
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 = '价格'.
  gs_fieldcat-edit = 'X'.
  gs_fieldcat-decimals_out = '2'.
  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     " 当前程序名
      i_callback_pf_status_set = 'FRM_SET_STATUS' " 设置GUI状态的FORM[reference:16]
      i_callback_user_command = 'USER_COMMAND'
      is_layout          = gs_layout
      it_fieldcat        = gt_fieldcat
      i_save             = 'A'          " 允许用户保存布局
      i_callback_top_of_page  = 'ALV_TOP_OF_PAGE'
      i_grid_settings = ls_glay   " 用于数据同步
    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.

FORM alv_top_of_page.
  DATA:it_commentary TYPE slis_t_listheader.
  DATA wa_commentary LIKE LINE OF it_commentary .
  CLEAR wa_commentary.
  wa_commentary-typ = 'S'.
  wa_commentary-key = 'expose'.
  wa_commentary-info = 'flatter flat float flow blow blast boom explode flavor blaspheme blame explosive inflammable flammable explosion'.
  APPEND wa_commentary TO it_commentary .
  CLEAR wa_commentary.
  wa_commentary-typ = 'S'.
  wa_commentary-key = 'artificial'.
  wa_commentary-info = 'He was a man of forceful character, with considerable insight and diplomatic skills.' .
  APPEND wa_commentary TO it_commentary .

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = it_commentary
      i_logo             = 'BE_BANNER'. "ENJOYSAP_LOGO

ENDFORM.

FORM user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.

  CASE r_ucomm.
    WHEN 'ZSAVE' OR '&SAVE'.
      DATA: lv_answer TYPE c.          " 返回的答案,'1'=是,'2'=否

      " 弹出确认对话框
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          titlebar              = '确认保存'          " 标题
          text_question         = '确定要将修改的价格保存到数据库吗?'
          text_button_1         = '是'                " 按钮1文字
          icon_button_1         = 'ICON_OKAY'         " 按钮1图标(可选)
          text_button_2         = '否'                " 按钮2文字
          icon_button_2         = 'ICON_CANCEL'       " 按钮2图标(可选)
          default_button        = '1'                 " 默认高亮按钮(1或2)
          display_cancel_button = 'X'                 " 是否显示取消按钮(可选)
        IMPORTING
          answer                = lv_answer.
         IF lv_answer = '1'.  " 用户选择了“是”
        " 执行数据库更新(沿用之前的安全更新逻辑)
        LOOP AT gt_sflight INTO DATA(ls_flight).
          UPDATE sflight SET price = ls_flight-price
            WHERE carrid = ls_flight-carrid
              AND connid = ls_flight-connid
              AND fldate = ls_flight-fldate.
          IF sy-subrc <> 0.
            ROLLBACK WORK.
            MESSAGE '更新失败,请检查主键' TYPE 'E' DISPLAY LIKE 'E'.
            RETURN.
          ENDIF.
        ENDLOOP.
        COMMIT WORK.
        MESSAGE '价格更新成功!' TYPE 'S'.
      ELSE.
        " 用户选择了“否”或取消,不保存
        MESSAGE '操作已取消' TYPE 'S'.
      ENDIF.

    WHEN '&IC1'.  " 双击事件等
      " ...
  ENDCASE.

ENDFORM.

FORM frm_set_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZPCY100_ALV_GUI'. " 这里替换成你创建的GUI状态名[reference:20]
ENDFORM.

posted @ 2026-08-07 11:46  虚拟过客之IT老男人  阅读(2)  评论(0)    收藏  举报