*&---------------------------------------------------------------------* *& Report ZHJ_TEST06 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zhj_test06. *變量定義============================================================== DATA:BEGIN OF it_itab OCCURS 0. DATA : light(4) TYPE c. INCLUDE STRUCTURE makt."sflight. DATA: text(4) 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 100."須要在屏幕裏畫一個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 50 ROWS FROM makt. IF sy-subrc NE 0. * 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 = 1 program_error = 2 OTHERS = 3. IF sy-subrc <> 0. 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 1. CLEAR gs_fieldcat. gs_fieldcat-col_pos = 15. 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 = 1 program_error = 2 too_many_lines = 3 OTHERS = 4. IF sy-subrc <> 0. 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 0. 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 = 0. 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 0. 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 ) < 2. CALL METHOD p_er_data_changed->add_protocol_entry EXPORTING i_msgid = '00' i_msgty = 'E' i_msgno = '001' 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