Первый вариант
- Наследуемся от класса cl_gui_alv_grid
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283CLASS lcl_alv DEFINITION INHERITING FROM cl_gui_alv_grid.PUBLIC SECTION.METHODS:constructor,export_to_excelIMPORTINGVALUE(it_data) TYPE ANY TABLE,create_fcatIMPORTINGit_data TYPE ANY TABLERETURNING VALUE(rt_fcat) TYPE lvc_t_fcat.ENDCLASS.CLASS lcl_alv IMPLEMENTATION.METHOD constructor."Создаем фиктивный контейнер, т.к. нам не нужно, чтобы ALV где либо отображалсяDATA lo_dummy_container TYPE REF TO cl_gui_custom_container.CREATE OBJECT lo_dummy_containerEXPORTINGcontainer_name = spaceEXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5OTHERS = 6.CHECK sy-subrc = 0."Передаем контейнер в конструктор суперклассаsuper->constructor(EXPORTINGi_appl_events = abap_truei_parent = lo_dummy_containerEXCEPTIONSerror_cntl_create = 1error_cntl_init = 2error_cntl_link = 3error_dp_create = 4OTHERS = 5).CHECK sy-subrc = 0.ENDMETHOD.METHOD export_to_excel."Вызываем метод для выгрузки"Он реагирует на код функции, поэтому устанавливаем нужныйsy-ucomm = mc_fc_call_xxl.fcode_bouncer( ).ENDMETHOD.METHOD create_fcat."Формирование каталога полей для произвольной таблицыDATA lo_table TYPE REF TO data.TRY.CREATE DATA lo_table LIKE it_data.ASSIGN lo_table->* TO FIELD-SYMBOL(<lt_table>).cl_salv_table=>factory( IMPORTINGr_salv_table = DATA(lo_salv_table)CHANGINGt_table = <lt_table> ).rt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(r_columns = lo_salv_table->get_columns( )r_aggregations = lo_salv_table->get_aggregations( )).CATCH cx_root.ENDTRY.ENDMETHOD.ENDCLASS. - Создаем ФМ для выгрузки в excel произвольной таблицы
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 |
FUNCTION zexport_to_xls. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" VALUE(IT_DATA) TYPE STANDARD TABLE *"---------------------------------------------------------------------- "Создаем instance ALV DATA(lo_alv_spreadsheet) = NEW lcl_alv( ). "Формируем каталог полей DATA(lt_fcat) = lo_alv_spreadsheet->create_fcat( it_data = it_data ). CHECK lt_fcat[] IS NOT INITIAL. "Передаем таблицу в ALV lo_alv_spreadsheet->set_table_for_first_display( CHANGING it_outtab = it_data[] it_fieldcatalog = lt_fcat[] EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 OTHERS = 4 ). CHECK sy-subrc = 0. "Вызываем стандартный диалог для сохранения в Excel lo_alv_spreadsheet->export_to_excel( it_data = it_data[] ). ENDFUNCTION. |
Второй вариант
Использовать интерфейс у класса обертки – if_alv_rm_grid_friend
В данном случае мы получаем доступ ко всем private методам внутри lcl_alv_wrapper
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
CLASS lcl_alv_wrapper DEFINITION. PUBLIC SECTION. INTERFACES if_alv_rm_grid_friend . METHODS: constructor, get_alv_instance RETURNING VALUE(ro_alv) TYPE REF TO cl_gui_alv_grid, export_to_excel IMPORTING VALUE(it_data) TYPE ANY TABLE, create_fcat IMPORTING it_data TYPE ANY TABLE it_exclude_fields TYPE tc_field_tab OPTIONAL RETURNING VALUE(rt_fcat) TYPE lvc_t_fcat, free. PRIVATE SECTION. DATA mo_dummy_container TYPE REF TO cl_gui_custom_container. DATA mo_alv TYPE REF TO cl_gui_alv_grid. ENDCLASS. CLASS lcl_alv_wrapper IMPLEMENTATION. *--------------------------------------------------------------------* * CONSTRUCTOR *--------------------------------------------------------------------* * Конструктор *--------------------------------------------------------------------* METHOD constructor. "Создаем фиктивный контейнер (т.к. ALV не будет нигде отображаться) CREATE OBJECT mo_dummy_container EXPORTING container_name = space EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5 OTHERS = 6. ASSERT sy-subrc = 0. mo_alv = NEW #( i_parent = mo_dummy_container ). ASSERT mo_alv IS BOUND. ENDMETHOD. *--------------------------------------------------------------------* * GET_ALV_INSTANCE *--------------------------------------------------------------------* * Вернуть instance ALV *--------------------------------------------------------------------* METHOD get_alv_instance. "Возвращаем ro_alv = mo_alv. ENDMETHOD. *--------------------------------------------------------------------* * EXPORT_TO_EXCEL *--------------------------------------------------------------------* * Выгрузка в Excel *--------------------------------------------------------------------* METHOD export_to_excel. "Выполнение команды mo_alv->execute_fcode( EXPORTING i_ucomm = cl_gui_alv_grid=>mc_fc_call_xxl ). ENDMETHOD. *--------------------------------------------------------------------* * CREATE_FCAT *--------------------------------------------------------------------* * Формирование каталога полей *--------------------------------------------------------------------* METHOD create_fcat. "Создаем таблицу входящего типа DATA lo_table TYPE REF TO data. TRY. CREATE DATA lo_table LIKE it_data. ASSIGN lo_table->* TO FIELD-SYMBOL(<lt_table>). cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_salv_table) CHANGING t_table = <lt_table> ). "Забираем каталог полей rt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns = lo_salv_table->get_columns( ) r_aggregations = lo_salv_table->get_aggregations( ) ). CATCH cx_root. RETURN. ENDTRY. ENDMETHOD. *--------------------------------------------------------------------* * FREE *--------------------------------------------------------------------* * Зачистка атрибутов *--------------------------------------------------------------------* METHOD free. "Зачистка атрибутов FREE mo_alv. FREE mo_dummy_container. ENDMETHOD. ENDCLASS. |
Пример использования:
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 |
FUNCTION zexport_to_xls. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" VALUE(IT_DATA) TYPE STANDARD TABLE *"---------------------------------------------------------------------- DATA(lo_alv_wrapper) = NEW lcl_alv_wrapper( ). "Формируем каталог полей DATA(lt_fcat) = lo_alv_wrapper->create_fcat( it_data = it_data ). CHECK lt_fcat[] IS NOT INITIAL. "Передаем таблицу в ALV lo_alv_wrapper->get_alv_instance( )->set_table_for_first_display( CHANGING it_outtab = it_data[] it_fieldcatalog = lt_fcat[] EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 OTHERS = 4 ). "Вызываем стандартный диалог для сохранения в Excel lo_alv_wrapper->export_to_excel( it_data = it_data[] ). "Завершаем работу lo_alv_wrapper->free( ). FREE lo_alv_wrapper. ENDFUNCTION. |