Если нам необходимо средство поиска для cl_gui_alv_grid и нас не устраивает средство поиска, которое мы можем задать при создании каталога полей, мы можем использовать событие onf4
Порядок действия при этом следующий:
- При создании каталога полей устанавливаем флаг f4availabl и делаем поле доступным для изменений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
METHOD get_fieldcat. DATA lt_fieldcat TYPE lvc_t_fcat. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING * I_BUFFER_ACTIVE = i_structure_name = 'Z_что-то там' * I_CLIENT_NEVER_DISPLAY = 'X' * I_BYPASSING_BUFFER = * I_INTERNAL_TABNAME = CHANGING ct_fieldcat = lt_fieldcat EXCEPTIONS inconsistent_interface = 1 program_error = 2 OTHERS = 3. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. LOOP AT lt_fieldcat ASSIGNING FIELD-SYMBOL(<ls_fieldcat>) WHERE fieldname = 'LGORT'. <ls_fieldcat>-style = cl_gui_alv_grid=>mc_style_enabled. <ls_fieldcat>-f4availabl = abap_true. ENDLOOP. et_fieldcat = lt_fieldcat. ENDMETHOD. |
2. Создаем метод для события onf4:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
DATA go_alv_f4 TYPE REF TO cl_salv_table. METHODS: handle_on_f4 FOR EVENT onf4 OF cl_gui_alv_grid IMPORTING e_fieldname es_row_no er_event_data et_bad_cells e_display, "Событие двойного клика для нашего средство поиска cl_salv_table (только для примера) on_double_click_f4 FOR EVENT double_click OF cl_salv_events_table IMPORTING row column. "Реализация метода METHOD . FIELD-SYMBOLS: <lt_mod> TYPE lvc_t_modi. CASE e_fieldname. WHEN 'LGORT'. "Реализуем вызов справки любым удобным образом "Например DATA lr_functions TYPE REF TO cl_salv_functions_list. DATA lr_selections TYPE REF TO cl_salv_selections. DATA lt_select TYPE salv_t_row. DATA: lr_events_t TYPE REF TO cl_salv_events_table. TYPES: BEGIN OF lty_s_lgort, werks TYPE werks_d, lgort TYPE lgort_d, lgobe TYPE lgobe, END OF lty_s_lgort. DATA lt_data_tab_lgort TYPE TABLE OF lty_s_lgort. "Вызов окна для выбора записей SELECT werks lgort lgobe FROM t001l INTO CORRESPONDING FIELDS OF TABLE lt_data_tab_lgort WHERE werks = '0001'. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv_f4 CHANGING t_table = lt_data_tab_lgort[] ). lr_events_t = go_alv_f4->get_event( ). SET HANDLER on_double_click_f4 FOR lr_events_t. CATCH cx_salv_msg. ENDTRY. lr_functions = go_alv_f4->get_functions( ). lr_functions->set_all( 'X' ). IF go_alv_f4 IS BOUND. go_alv_f4->set_screen_popup( start_column = 30 end_column = 60 start_line = 20 end_line = 30 ). lr_selections = go_alv_f4->get_selections( ). go_alv_f4->display( ). lt_select = lr_selections->get_selected_rows( ). FREE go_alv_f4. ENDIF. "Используем выделенные строки как хотим READ TABLE lt_select ASSIGNING FIELD-SYMBOL(<ls_select>) INDEX 1. IF sy-subrc = 0. READ TABLE lt_data_tab_lgort ASSIGNING FIELD-SYMBOL(<ls_data_tab_lgort>) INDEX <ls_select>. IF sy-subrc = 0. ASSIGN er_event_data->m_data->* TO <lt_mod>. APPEND VALUE: #( row_id = es_row_no-row_id fieldname = e_fieldname value = <ls_data_tab_lgort>-lgort ) TO <lt_mod>. ENDIF. ENDIF. "..... ENDCASE. er_event_data->m_event_handled = abap_true. ENDMETHOD. |
3. Регистрируем поля и события при создании грида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
METHOD create_grid. DATA lt_f4 TYPE lvc_t_f4. * Создаём объект грида lo_grid как и обычно ............. APPEND VALUE #( fieldname = 'LGORT' register = abap_true ) TO lt_f4. APPEND VALUE #( fieldname = 'TYPE_STORAGE' register = abap_true ) TO lt_f4. lo_grid->register_f4_for_fields( EXPORTING it_f4 = lt_f4 ). "Регистрируем обработчик события SET HANDLER: me->handle_on_f4 FOR lo_grid2. ENDMETHOD. METHOD on_double_click_f4 . go_alv_f4->close_screen( ). ENDMETHOD. |