*&---------------------------------------------------------------------*
*& Report ZHJ_TEST06
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------* REPORT zhj_test06.
*变量定义==============================================================
DATA:BEGIN OF it_itab OCCURS .
DATA : light() TYPE c.
INCLUDE STRUCTURE makt."sflight.
DATA: text() TYPE c.
DATA:END OF it_itab. "定义一个容器类
DATA: wcl_container TYPE REF TO cl_gui_custom_container, "定义alv--grid对象
wcl_alv TYPE REF TO cl_gui_alv_grid ,
gt_fieldcat TYPE lvc_t_fcat, "这个表存放标题栏不显示的图标功能码
ex_fcode TYPE ui_functions,
"layout
gs_layout TYPE lvc_s_layo. DATA : container_head TYPE REF TO cl_gui_custom_container ,
cl_viewer TYPE REF TO cl_gui_html_viewer ,
cl_doc TYPE REF TO cl_dd_document .
DATA : l_abck TYPE sdydo_key VALUE space .
DATA : msg TYPE sdydo_text_element . *----------------------------------------------------------------------*
* class lcl_event_receiver definition
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION.
METHODS:
*--在alv的工具条上增加新的按钮
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object
e_interactive,
*--实现用户命令
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm, *--热点点击控制
handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no, *--用户双击事件
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no, *--覆盖标准的功能.
handle_before_user_command
FOR EVENT before_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm, *--覆盖标准的功能.
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed
e_onf4 e_onf4_before
e_onf4_after
e_ucomm,
********页眉
handle_top_page
FOR EVENT top_of_page OF cl_gui_alv_grid
IMPORTING e_dyndoc_id
table_index .
* IMPORTing .
ENDCLASS. "lcl_event_receiver DEFINITION START-OF-SELECTION.
PERFORM get_data."向内表写数据
PERFORM set_fieldcat."设置FIELDCAT
PERFORM set_layout."设置layout
PERFORM set_ex_fcode."设置隐藏工具栏按钮
CALL SCREEN ."需要在屏幕里画一个container *&---------------------------------------------------------------------*
*& form get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data . REFRESH it_itab.CLEAR it_itab.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE it_itab
UP TO ROWS
FROM makt.
IF sy-subrc NE .
* MESSAGE e000 WITH '没有数据选择!'.
ENDIF. ENDFORM. " GET_DATA *&---------------------------------------------------------------------*
*& form set_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_fieldcat . * 这个函数只能读取标准结构体的fieldcat
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
* i_buffer_active =
i_structure_name = 'MAKT'
i_client_never_display = 'X'
* i_bypassing_buffer =
* i_internal_tabname =
CHANGING
ct_fieldcat = gt_fieldcat
EXCEPTIONS
inconsistent_interface =
program_error =
OTHERS = .
IF sy-subrc <> .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF. DATA gs_fieldcat LIKE LINE OF gt_fieldcat.
gs_fieldcat-fieldname = 'LIGHT'.
gs_fieldcat-scrtext_l = '标志'.
* gs_fieldcat-CHECKBOX = 'X'.
INSERT gs_fieldcat INTO gt_fieldcat INDEX . CLEAR gs_fieldcat.
gs_fieldcat-col_pos = .
gs_fieldcat-fieldname = 'TEXT'.
gs_fieldcat-scrtext_l = '文本'.
gs_fieldcat-edit = 'X'.
APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. " SET_FIELDCAT
*&---------------------------------------------------------------------*
*& form output_display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM output_display .
CALL METHOD wcl_alv->set_table_for_first_display
EXPORTING
i_save = 'A'
is_layout = gs_layout
it_toolbar_excluding = ex_fcode
CHANGING
it_outtab = it_itab[]
it_fieldcatalog = gt_fieldcat
EXCEPTIONS
invalid_parameter_combination =
program_error =
too_many_lines =
OTHERS = . IF sy-subrc <> .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF. CREATE OBJECT cl_doc . CALL METHOD wcl_alv->list_processing_events
EXPORTING
i_event_name = 'TOP_OF_PAGE'
i_dyndoc_id = cl_doc.
ENDFORM. " OUTPUT_DISPLAY
*&---------------------------------------------------------------------*
*& module status_0100 output
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'GUI_STATUS'.
* set titlebar 'xxx'.
IF wcl_alv IS INITIAL. CREATE OBJECT: wcl_container
EXPORTING
container_name = 'ALV_CON'. CREATE OBJECT container_head
EXPORTING
container_name = 'HON_CONT'. CREATE OBJECT wcl_alv
EXPORTING
i_parent = wcl_container. * create and set event
DATA event_receiver TYPE REF TO lcl_event_receiver.
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_toolbar FOR wcl_alv.
SET HANDLER event_receiver->handle_top_page FOR wcl_alv .
SET HANDLER event_receiver->handle_user_command FOR wcl_alv.
SET HANDLER event_receiver->handle_hotspot_click FOR wcl_alv.
SET HANDLER event_receiver->handle_double_click FOR wcl_alv.
SET HANDLER event_receiver->handle_before_user_command FOR wcl_alv.
SET HANDLER event_receiver->handle_data_changed FOR wcl_alv. PERFORM output_display. * set interaction
CALL METHOD wcl_alv->set_toolbar_interactive.
* 注册更新时间
CALL METHOD wcl_alv->register_edit_event
EXPORTING
i_event_id = wcl_alv->mc_evt_enter. ENDIF. ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& module user_command_0100 input
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT. CASE sy-ucomm.
WHEN '&F03' OR '&F12'.
LEAVE TO SCREEN .
WHEN '&F15'.
LEAVE PROGRAM.
WHEN 'SAVE'.
DATA lt_selected_rows TYPE lvc_t_roid.
CALL METHOD wcl_alv->get_selected_rows
IMPORTING
et_row_no = lt_selected_rows.
* MESSAGE i003 WITH 'USER_COMMAND_0100 event'.
WHEN OTHERS.
ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& form set_layout
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_layout . gs_layout-zebra = 'X'."条纹格式输出
* gs_layout-edit = 'X'."可编辑状态
gs_layout-smalltitle = 'X'."小标题
* gs_layout-no_hgridln ='X'."隐藏水平网格线
* gs_layout-no_vgridln = 'X'."隐藏垂直网格线
* gs_layout-no_headers = 'X'."隐藏列抬头
* gs_layout-no_merging = 'X'."禁用单元格合并
gs_layout-cwidth_opt = 'X'."优化列宽度
* gs_layout-no_f4 = 'X'."没有F4按键功能
* gs_layout-no_rowmark = 'X'."禁用行选择
* gs_layout-no_toolbar = 'X'."隐藏工具栏
gs_layout-grid_title = 'ALV实例'."标题栏
* gs_layout-sgl_clk_hd = 'X'."单击列标题按升序排列
* gs_layout-no_totline = 'X'."不要输出总计行
gs_layout-keyhot = 'X'."关键列作为热
* gs_layout-info_fname = 'TEXT'."带有简单行彩色代码的字段名称
* gs_layout-ctab_fname = 'TEXT'."带有复杂单元格颜色编码的字段名称 gs_layout-sel_mode = 'C'.
* gs_layout-box_fname = 'CHX'. DATA:l_fielfcat TYPE LINE OF lvc_t_fcat.
LOOP AT gt_fieldcat INTO l_fielfcat.
CASE l_fielfcat-fieldname.
WHEN 'MATNR'.
* fcat_100-ref_table = 'T001W'.
* fcat_100-ref_field = 'WERKS'.
* fcat_100-outputlen = '10'.
l_fielfcat-edit = 'X'.
WHEN OTHERS.
* WHEN 'HSDAT' OR 'ERSDA' OR 'VFDAT'.
* fcat_100-outputlen = '10'.
* FCAT_100-NO_ZERO = 'X'.
ENDCASE.
MODIFY gt_fieldcat FROM l_fielfcat.
CLEAR l_fielfcat.
ENDLOOP. ENDFORM. " SET_LAYOUT
*&---------------------------------------------------------------------*
*& form set_ex_fcode
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_ex_fcode .
REFRESH ex_fcode.CLEAR ex_fcode.
DATA:ls_fcode TYPE ui_func. ls_fcode = cl_gui_alv_grid=>mc_fc_info.
APPEND ls_fcode TO ex_fcode.
ls_fcode = cl_gui_alv_grid=>mc_fc_loc_append_row.
APPEND ls_fcode TO ex_fcode.
ls_fcode = cl_gui_alv_grid=>mc_fc_loc_insert_row.
APPEND ls_fcode TO ex_fcode.
ls_fcode = cl_gui_alv_grid=>mc_fc_loc_delete_row.
APPEND ls_fcode TO ex_fcode.
ls_fcode = cl_gui_alv_grid=>mc_fc_loc_copy_row.
APPEND ls_fcode TO ex_fcode.
ls_fcode = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
APPEND ls_fcode TO ex_fcode. ENDFORM. " SET_EX_FCODE
*&---------------------------------------------------------------------*
*& class (implementation) lcl_event_receiver
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION. *-- handle toolbar
METHOD handle_toolbar.
PERFORM handle_toolbar USING e_object e_interactive.
ENDMETHOD. "handle_toolbar *-- handdle user_command
METHOD handle_user_command.
PERFORM handle_user_commmand CHANGING e_ucomm.
ENDMETHOD. "Handle user command *-- handle_hotspot_click
METHOD handle_hotspot_click.
PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.
ENDMETHOD. "HANDLE_HOTSPOT_CLICK *--handle_double_click
METHOD handle_double_click.
PERFORM handle_double_click USING e_row e_column es_row_no.
ENDMETHOD. "HANDLE_DOUBLE_CLICK *--before_user_command
METHOD handle_before_user_command.
PERFORM handle_before_user_command USING e_ucomm.
ENDMETHOD. "BEFORE_USER_COMMAND *--before_user_command
METHOD handle_data_changed.
PERFORM handle_data_changed USING er_data_changed.
ENDMETHOD. "BEFORE_USER_COMMAND *--before_user_command
METHOD handle_top_page.
* CREATE OBJECT CL_DOC .
CALL METHOD cl_doc->initialize_document . CALL METHOD cl_doc->add_text
EXPORTING
text = 'qwertyuioplkjhgfdsa'
sap_style = 'HEADING'. IF msg IS NOT INITIAL .
CALL METHOD cl_doc->new_line .
CALL METHOD cl_doc->add_text
EXPORTING
text = msg
sap_emphasis = ''.
CLEAR msg .
ENDIF.
IF cl_viewer IS INITIAL .
CREATE OBJECT cl_viewer
EXPORTING
parent = container_head.
ENDIF. CALL FUNCTION 'REUSE_ALV_GRID_COMMENTARY_SET'
EXPORTING
document = cl_doc
bottom = l_abck
* IMPORTING
* LENGTH =
. CALL METHOD cl_doc->merge_document .
CALL METHOD cl_doc->set_document_background
EXPORTING
picture_id = space. cl_doc->html_control = cl_viewer . CALL METHOD cl_doc->display_document
EXPORTING
reuse_control = 'X'
parent = container_head. *ENDFORM. " FRM_TOP_OF_PAGE ENDMETHOD. "BEFORE_USER_COMMAND ENDCLASS. "LCL_EVENT_RECEIVER
*&---------------------------------------------------------------------*
*& form handle_toolbar
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->p_e_object text
* -->p_e_interactive text
*----------------------------------------------------------------------*
FORM handle_toolbar USING p_e_object
TYPE REF TO cl_alv_event_toolbar_set
p_e_interactive. DATA: utoolbar TYPE stb_button.
CLEAR utoolbar.
utoolbar-function = 'TEST'.
utoolbar-butn_type = .
utoolbar-icon = icon_color.
utoolbar-quickinfo = 'TEST BUTTON'.
APPEND utoolbar TO p_e_object->mt_toolbar.
CLEAR utoolbar. ENDFORM. " HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*& form handle_user_commmand
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM handle_user_commmand CHANGING e_ucomm.
CASE e_ucomm.
WHEN 'SHOW'.
MESSAGE 'handle user command event' TYPE 'S'.
WHEN 'TEST'.
MESSAGE '你点击了color按钮' TYPE 'I'.
WHEN 'BACK'.
LEAVE TO SCREEN .
WHEN OTHERS.
MESSAGE 'OTHERS' TYPE 'I'.
ENDCASE.
ENDFORM. " HANDLE_USER_COMMMAND
*&---------------------------------------------------------------------*
*& form handle_hotspot_click
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->p_e_row_id text
* -->p_e_column_id text
* -->p_es_row_no text
*----------------------------------------------------------------------*
FORM handle_hotspot_click USING p_e_row_id
p_e_column_id
p_es_row_no. DATA:l_s TYPE string.
CONCATENATE '你点击了' p_e_row_id p_e_column_id INTO l_s.
MESSAGE l_s TYPE 'I'. "p_e_row_id p_e_column_id . ENDFORM. " HANDLE_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
*& form handle_double_click
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->p_e_row_id text
* -->p_e_column_id text
* -->p_es_row_no text
*----------------------------------------------------------------------*
FORM handle_double_click USING p_e_row_id
p_e_column_id
p_es_row_no. MESSAGE '双击事件' TYPE 'I'. ENDFORM. " HANDLE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*& form handle_before_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->p_e_ucomm text
*----------------------------------------------------------------------*
FORM handle_before_user_command USING p_e_ucomm.
DATA:l_s TYPE string.
CONCATENATE '按钮的功能码为' p_e_ucomm INTO l_s.
MESSAGE l_s TYPE 'I'. ENDFORM. " HANDLE_BEFORE_USER_COMMAND *&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED_FINISHED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_UCOMM text
*----------------------------------------------------------------------*
FORM handle_data_changed USING p_er_data_changed
TYPE REF TO cl_alv_changed_data_protocol. * 如果更新的reason字段长度小于10为则提示用户填入字符数不能低于10
DATA: mod_data TYPE lvc_t_modi,
wa_mod_data TYPE lvc_s_modi. mod_data = p_er_data_changed->mt_mod_cells.
LOOP AT mod_data INTO wa_mod_data WHERE fieldname = 'TEXT'.
IF strlen( wa_mod_data-value ) < .
CALL METHOD p_er_data_changed->add_protocol_entry
EXPORTING
i_msgid = ''
i_msgty = 'E'
i_msgno = ''
i_msgv1 = '长度必须大于2 '
i_fieldname = wa_mod_data-fieldname. * 如果长度小于2,则将字段内容更新为长都无法确定
CLEAR wa_mod_data-value.
CALL METHOD p_er_data_changed->modify_cell
EXPORTING
i_row_id = wa_mod_data-row_id
i_fieldname = wa_mod_data-fieldname
i_value = wa_mod_data-value.
ENDIF.
ENDLOOP. ENDFORM. " HANDLE_DATA_CHANGED_FINISHED