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


*&---------------------------------------------------------------------*
*& 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.
浙公网安备 33010602011771号