Подпрограмма для получения отфильтрованной таблицы при работе с cl_salv_table

Есть у меня программа, которая формирует график платежей построенный на Z-таблицах. Решили ее доработать и сделать нормальный выбор записей по кнопке "Выбрать все", если ALV отфильтрован.

Проблема была в том, что если предварительно отфильтровать 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

Комментариев нет:

Отправить комментарий