Использование трассировки ST05

Итак, пока готовится большой пост по FI, сегодня будет короткий на тему трассировки с помощью транзакции ST05.

ST05 - Трассировка

Если вы разрабатываете технические задания, а вы их непременно разрабатываете, если работаете с SAP, то вы должны уметь искать необходимые таблицы. Зачастую простой вызов F1 по полю ничего не дает, вот тогда один из вариантов это воспользоваться ST05.

Установка SAP Solution Manager 7.1

Подвернулась возможность немного позаниматься базисом, решил воспользоваться. Установил SAP Solution Manager 7.1 на Windows 2008 R2, база Oracle. До этого никогда не сталкивался, но разобрался. Благо есть документация на портале support.sap.com и конечно же на блоге у Вячеслава Шиболова http://sidadm.blogspot.ru/, за что ему отдельное спасибо.


Отмечу моменты, которые необходимо добавить в его инструкции:

  1. На чистую Win2008 R2 перед установкой надо ставить пакет Microsoft Visual С++ 2008.
  2. Если Oracle у вас выше 11-го, то не используйте в паролях символ '@'.
  3. Сразу расширьте файл подкачки до 20гб, и проверьте чтобы оперативной памяти у сервера было хотя бы 6-8Гб.
На этом пока всё, делаем бекап существующей установки и будем обновлять стек.

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