Есть у меня программа, которая формирует график платежей построенный на Z-таблицах. Решили ее доработать и сделать нормальный выбор записей по кнопке "Выбрать все", если ALV отфильтрован.
Проблема была в том, что если предварительно отфильтровать ALV, а потом нажать выбрать все, то в программе выбирались все записи, включая и те, что не попали под значения фильтра. Стандартного метода у cl_salv_table по получению отфильтрованных значений нет и это немного усложнило задачу.
Свое решение я выкладываю ниже:
Основная идея взята отсюда: https://scn.sap.com/message/10767989#10767989
Проблема была в том, что если предварительно отфильтровать ALV, а потом нажать выбрать все, то в программе выбирались все записи, включая и те, что не попали под значения фильтра. Стандартного метода у cl_salv_table по получению отфильтрованных значений нет и это немного усложнило задачу.
Свое решение я выкладываю ниже:
DATA: lt_comp_details TYPE abap_compdescr_tab, ls_comp_details TYPE abap_compdescr, ref_descr TYPE REF TO cl_abap_structdescr, lt_output type standard table of ts_sdata_bot, lo_cols TYPE REF TO cl_salv_columns, lo_cols_tab TYPE salv_t_column_ref, lo_col LIKE LINE OF lo_cols_tab, lo_filters TYPE REF TO cl_salv_filters, lo_filter TYPE REF TO cl_salv_filter, lv_filter_val TYPE salv_t_selopt_ref, lr_range TYPE RANGE OF char80, lv_index type sytabix, lo_selopt TYPE REF TO cl_salv_selopt, lwa_range LIKE LINE OF lr_range, indx TYPE i. TYPES: BEGIN OF ty_filters, index type sytabix, fname type NAME_KOMP, range LIKE lr_range, END OF ty_filters. DATA: lt_filters TYPE SORTED TABLE OF ty_filters WITH NON-UNIQUE key index, ls_filters type ty_filters. FIELD-SYMBOLS: <lt_output> like line of lt_output, <comp> TYPE ANY. ref_descr ?= cl_abap_typedescr=>describe_by_name( 'TS_SDATA_BOT' ). lt_comp_details[] = ref_descr->components[]. lt_output[] = gt_sdata_bot[]. TRY . * Columns and Filters lo_cols = go_grid_bot->get_columns( ). lo_cols_tab = lo_cols->get( ). lo_filters = go_grid_bot->get_filters( ). LOOP AT lt_output ASSIGNING <lt_output>. AT FIRST. CLEAR: ls_filters, lt_filters[]. LOOP AT lt_comp_details INTO ls_comp_details. CLEAR: lr_range, lr_range[]. lv_index = sy-tabix. TRY . * Получаем имя колонки с фильтром lo_filter = lo_filters->get_filter( ls_comp_details-name ). lv_filter_val = lo_filter->get( ). LOOP AT lv_filter_val INTO lo_selopt. lwa_range-sign = lo_selopt->get_sign( ). lwa_range-option = lo_selopt->get_option( ). lwa_range-low = lo_selopt->get_low( ). lwa_range-high = lo_selopt->get_high( ). ls_filters-fname = ls_comp_details-name. ls_filters-index = lv_index. APPEND lwa_range to lr_range. ls_filters-range = lr_range. INSERT ls_filters INTO TABLE lt_filters. CLEAR: lwa_range. ENDLOOP. CATCH cx_salv_not_found. ENDTRY. ENDLOOP. ENDAT. LOOP AT lt_filters INTO ls_filters. ASSIGN COMPONENT ls_filters-index OF STRUCTURE <lt_output> to <comp>. IF <comp> NOT IN ls_filters-range. DELETE lt_output. EXIT. ENDIF. ENDLOOP. ENDLOOP. CATCH CX_SY_REF_IS_INITIAL. ENDTRY. ************************************************************************** DATA: ls_output LIKE LINE OF lt_output. LOOP AT lt_output INTO ls_output. LOOP AT gt_sdata_bot INTO gl_sdata_bot WHERE ebeln EQ ls_output-ebeln AND ebelp EQ ls_output-ebelp AND kolvo EQ ls_output-kolvo. gl_sdata_bot-sel = 'X'. MODIFY gt_sdata_bot INDEX sy-tabix FROM gl_sdata_bot. ENDLOOP. ENDLOOP. go_grid_bot->refresh( refresh_mode = IF_SALV_C_REFRESH=>FULL ).
Основная идея взята отсюда: https://scn.sap.com/message/10767989#10767989
Комментариев нет:
Отправить комментарий