Текущее время: Пн, май 06 2024, 11:39

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Пт, фев 06 2009, 19:28 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1554
Откуда: Москва
Сабж. Давно хотел опубликовать, да откладывал - хотел хепл сначала написать, да кой-чего доработать. Чувствую, руки никогда не дойдут.
Условия использования: копирайтик мой не затирайте . Доработки приветствуются, но копирайт не трогайте (можете свой рядом дописать, если очень хочется).
Юзаю инклуд уже несколько лет, некоторые методы отлажены очень хорошо, некоторые требуют доработки.

Недостатки:
1.) Заточен только под CL_SAVL_TABLE .
2.) Хорошо подходит для программ, где только один ALV, и плохо подходит для программ, где несколько ALV, т.к. некоторые перформы требуют обязательного наличия переменных c заданным именем (например, gtb_selected) и определенного типа (той же структуры, что и отображаемая таблица), объявленных в главной программе. Если ALV только один, это удобно, иначе может быть не очень удобно. Были мысли вынести реализацию перформов, требующих эти переменные, в макрос, чтобы подключать их по необходимости. Либо сделать две версии инклуда - для одного ALV, и для нескольких. Или просто эти переменные заменить на параметры. Но руки не дошли. А системы под рукой, где есть CL_SALV_TABLE, сейчас нет.
Шаблон для копи-паста:
Code:
TYPES: BEGIN OF ty_alv .
INCLUDE TYPE [ваша ALV-структура].
TYPES: rownr TYPE i,
       END OF ty_alv .

DATA:
      gtv_alv       TYPE STANDARD TABLE OF [ваша ALV-структура],
      gwa_alv       TYPE                   [ваша ALV-структура],
      gr_alv     TYPE REF TO cl_salv_table ,
      gr_alv_container TYPE REF TO cl_gui_custom_container,
      gtb_selected  TYPE TABLE OF ty_alv WITH HEADER LINE

FORM set_current_alv - устанавливает текущий ALV, который собираетесь теребить .
FORM alv_visible_rows - работает некорректно. Если доработаете, дайте знать.
Использование макроса loop_at_selected :
Code:
loop_at_selected grv_alv gtv_Alv gwa_alv gwa_selected .
* 1 - ALV Grid, 2 - ALV-таблица, 3 - WA для %2, 4 - буффер для выбранной записи
[какой-то ваш код]
endloop.


FORM setup_single_alv - делает типовую настройку ALV (для простых случаев).
FORM confirm_delete - запрос на удаление. sy-subrc: 0 - да, 2 - нет, 10 - отмена.
Code:
FORM alv_delrows TABLES ptv_alv
                        pt_delbuf
                 USING  pr_alv TYPE REF TO cl_salv_table .

Удаляет выделенные строки из ALV, перемещая их из ptv_alv в pt_delbuf . confirm_delete вызывает самостоятельно. Обратите внимание на строку
Code:
SORT lt_rows DESCENDING .

Это позволяет удалять записи с конца (от последней выделенной записи к первой), что исключает проблему сбоя индексов при удалении строк (при удалении строки, строки идущие после нее, сдвигаются вверх, их индекс в таблице изменяется и перестает соответствовать тому, что был при выделении, т.е. до удаления). Если строки удалять с конца, индексы не нарушаются.

Использование lcl_handle_events:
1.) Вызвать конструктор;
2.) При необходимости добавить типовые кнопки с помощью set_functions (перечислить ф-коды через точку с запятой - по исходникам поймете, какие). Если нужна подпись на кнопке, необходимо указать ее, после FCODE, отделив от FCODE символом "|" (например, 'EXPORT| Выгрузить'). Если еще какие функции, кроме типовых, нужны, юзать add_function. Включать-выключать кнопки с помощью enable_functions/disable_functions (также, через точку с запятой, перечислять коды функций).
Пример:
Code:
 
CALL METHOD gr_events->set_functions( 'REFRESH;EXPORT| Выгрузить' ) .

3.) Реализовать перформ с именем USER_COMMAND[суффикс] (суффикс - см. параметр p_suffix конструктора). Например, USER_COMMAND_100, если суффикс задавали '_100'. Внутри перформа, CASE делать по SY-UCOMM .
Дабл-клики и линк-клики ловятся по SY-UCOMM
Code:
    CONSTANTS: c_dblclick  TYPE sy-ucomm VALUE 'DBL_CLICK',
               c_lnkclick  TYPE sy-ucomm VALUE 'LNK_CLICK' .

Кликнутые строка и столбец:
Code:
DATA: g_rowclick TYPE salv_de_row ,
      g_colclick TYPE salv_de_column .



Все остальное мне кажется в достаточной степени интуитивно понятным.
=========================
Code:
Старая версия удалена, см. последующие сообщения с более свежей версией

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Вт, окт 05 2010, 12:00 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1554
Откуда: Москва
Версия 2010 года.
1.) Убрал левые завязки на структуры словаря.
2.) Создал SETUP_SINGLE_ALV2, который работает с cl_gui_docking_container
(устранение бага с двойными полосами прокрутки).
3.) Добавил разные новые методы для бОльшего удобства (типа set_field_checkbox, set_field_hotspot, и т.д.).
4.) Добавил инклуд с selection-screen для имени ALV-варианта (обязательный компонент, см. следующее письмо).

Code:
*&---------------------------------------------------------------------*
*&  Include           ZALV_UTILS
*&---------------------------------------------------------------------*
*&      Набор утилит для уменьшения объема и трудоемкости кода,
*&  необходимого для настройки ALV в отчетах (ALV-класс CL_SALV_TABLE).
*&  Содержит подпрограммы, облегчающие настройку ALV, универсальный
*&  класс-обработчик событий ALV (lcl_handle_events) с набором кнопок
*&  наиболее типовых функций, подпрограммы работы с ALV для наиболее
*&  типовых случаев.
*&---------------------------------------------------------------------*
*&  Автор: Амосов В.А.
*&---------------------------------------------------------------------*
*&  Использование:
*&---------------------------------------------------------------------*
*&  Необходимо объявить в главной программе типы и переменные:
*&---------------------------------------------------------------------*
*&  TYPE-POOLS: icon .
*&
*&  TYPES: BEGIN OF ty_alv .
*&  INCLUDE TYPE <ваша ALV-структура в словаре данных> .
*&  TYPES: rownr TYPE i,
*&         END OF ty_alv .
*&  DATA:
*&        gtv_alv           TYPE STANDARD TABLE OF <ваша ALV-структура в словаре данных>,
*&        gwa_alv           TYPE                   <ваша ALV-структура в словаре данных>,
*&        gr_alv            TYPE REF TO cl_salv_table ,
*&        gr_alv_container  TYPE REF TO cl_gui_custom_container,
*&        gr_selections     TYPE REF TO cl_salv_selections ,
*&        gt_selections     TYPE salv_t_row ,
*&        gtb_selected      TYPE TABLE OF ty_alv WITH HEADER LINE .
*&
*&  DATA: g_okcode TYPE sy-ucomm .
*&---------------------------------------------------------------------*
*&  Также необходимо включить инклуд, содержащий параметр выбора
*&  для ALV-варианта просмотра, в ваш экран параметров:
*&---------------------------------------------------------------------*
*&  INCLUDE zalv_selscr .
*&---------------------------------------------------------------------*

DATA: gr_current_alv TYPE REF TO cl_salv_table,
      gr_columns     TYPE REF TO cl_salv_columns_table,
      gc_selected    TYPE i ,
      gr_sels        TYPE REF TO cl_salv_selections,
      gsp_sell       TYPE salv_s_cell,
      gt_rows        TYPE lvc_t_row,
      gwa_rows         TYPE lvc_s_row,
      g_rowclick TYPE salv_de_row ,
      g_colclick TYPE salv_de_column .

TYPES:  BEGIN OF tys_fields ,
           fieldname TYPE string,
           scrtext_s TYPE scrtext_s,
           scrtext_m TYPE scrtext_m,
           scrtext_l TYPE scrtext_l,
           convexit  TYPE dd01l-convexit,
           pos       TYPE i,
        END   OF tys_fields,
        tyt_fields TYPE TABLE OF tys_fields .
.
FIELD-SYMBOLS: <g_rownr> TYPE i .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var .
  PERFORM f4_alvariant  USING 1
                     CHANGING p_var
                            .

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
    CONSTANTS: c_check     TYPE sy-ucomm VALUE 'CHECK',
               c_save      TYPE sy-ucomm VALUE 'SAVE',
               c_create    TYPE sy-ucomm VALUE 'CREATE',
               c_change    TYPE sy-ucomm VALUE 'CHANGE',
               c_detail    TYPE sy-ucomm VALUE 'DETAIL',
               c_delete    TYPE sy-ucomm VALUE 'DELETE',
               c_import    TYPE sy-ucomm VALUE 'IMPORT',
               c_export    TYPE sy-ucomm VALUE 'EXPORT',
               c_refresh   TYPE sy-ucomm VALUE 'REFRESH',
               c_search    TYPE sy-ucomm VALUE 'SEARCH',
               c_dblclick  TYPE sy-ucomm VALUE 'DBL_CLICK',
               c_lnkclick  TYPE sy-ucomm VALUE 'LNK_CLICK'
               .

    DATA: ucomm      TYPE sy-ucomm.
    DATA: gt_data      TYPE REF TO data,            " ref to src tab
          gtb_selected TYPE REF TO data,
          gwa_selected TYPE REF TO data,
          gr_alv       TYPE REF TO cl_salv_table,
          gr_functions TYPE REF TO cl_salv_functions_list,
          suffix       TYPE string .

    METHODS: constructor
      IMPORTING p_suffix  TYPE string
*                pt_data   TYPE REF TO data
                p_alv     TYPE REF TO cl_salv_table
      EXCEPTIONS invalid_parameter
                 internal_error,

             set_functions IMPORTING p_funclist  TYPE string,
          enable_functions IMPORTING p_funclist  TYPE string,
         disable_functions IMPORTING p_funclist  TYPE string,
             add_function  IMPORTING p_name      TYPE string
                                     p_text      TYPE string
                                     p_icon      TYPE c "string
                                     .

    METHODS:
      on_user_command
         FOR EVENT added_function OF cl_salv_events_table
         IMPORTING e_salv_function,

*      on_before_user_command
*         FOR EVENT before_salv_function OF cl_salv_events_table
*         IMPORTING e_salv_function,
*
*      on_after_user_command
*         FOR EVENT after_salv_function  OF cl_salv_events_table
*         IMPORTING e_salv_function,

      on_double_click
         FOR EVENT double_click         OF cl_salv_events_table
         IMPORTING row column,

      on_link_click
         FOR EVENT link_click           OF cl_salv_events_table
         IMPORTING row column.

  PRIVATE SECTION.
*    FIELD-SYMBOLS: <lwa_data>,
*                   <lt_selected> TYPE table .

ENDCLASS.                    "lcl_handle_events DEFINITION

*&---------------------------------------------------------------------*
*&      Form  ALV_VISIBLE_ROWS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PR_ALV    - ALV
*      -->pt_fields - таблица видимых полей
*----------------------------------------------------------------------*
FORM alv_visible_rows TABLES pt_fields TYPE tyt_fields
                       USING pr_alv    TYPE REF TO cl_salv_table .
  DATA: lt_columns     TYPE salv_t_column_ref ,
        lwa_columns    TYPE salv_s_column_ref ,
        lr_columns     TYPE REF TO cl_salv_columns_table,
        lwa_fields     TYPE tys_fields,
        l_colpos       TYPE i,
        l_domname      TYPE domname .
* 'DD01D-CONVEXIT'
  REFRESH pt_fields .
  CHECK pr_alv IS BOUND .
  pr_alv->get_metadata( ) .
  lr_columns  = pr_alv->get_columns( ) .
  lt_columns  = lr_columns->get( ) .

  LOOP AT lt_columns INTO lwa_columns .
    TRY.
        CALL METHOD lr_columns->get_column_position
          EXPORTING
            columnname = lwa_columns-columnname
          RECEIVING
            value      = l_colpos.
      CATCH cx_salv_not_found .
    ENDTRY.
    CHECK l_colpos > 0 .
    CLEAR lwa_fields .
    lwa_fields-fieldname = lwa_columns-columnname .
    lwa_fields-pos       = l_colpos .
    lwa_fields-scrtext_l = lwa_columns-r_column->get_long_text( ) .
    lwa_fields-scrtext_m = lwa_columns-r_column->get_medium_text( ) .
    lwa_fields-scrtext_s = lwa_columns-r_column->get_short_text( ) .
    l_domname = lwa_columns-r_column->get_ddic_domain( ) .
    IF NOT l_domname IS INITIAL .
      SELECT SINGLE convexit INTO lwa_fields-convexit
        FROM dd01l
       WHERE domname EQ l_domname .
    ENDIF.
    APPEND lwa_fields TO pt_fields .
  ENDLOOP .
  SORT pt_fields BY pos .
ENDFORM.                    " ALV_VISIBLE_ROWS
*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*---------------------------------------------------------------------*
* §5.2 implement the events for handling the events of cl_salv_table
*---------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
  METHOD constructor .
    FIELD-SYMBOLS: <lt>  TYPE table .

*    IF pt_data IS INITIAL.
*      RAISE invalid_parameter.
*    ELSE.
*      ASSIGN pt_data->* TO <lt>.
*      IF <lt> IS ASSIGNED.
*        gt_data = pt_data.
*        UNASSIGN <lt>.
*      ELSE.
*        MESSAGE i038 RAISING invalid_parameter.
*      ENDIF.
*    ENDIF.

*   ALV structure
    IF p_alv IS INITIAL.
      RAISE invalid_parameter.
    ELSE.
      gr_alv = p_alv.
    ENDIF.

*    CREATE DATA gtb_selected LIKE TABLE OF <lt>.
*    IF gtb_selected IS NOT BOUND.
*      RAISE internal_error.
*    ENDIF.
*
*    CREATE DATA gwa_selected LIKE LINE OF <lt>.
*    IF gtb_selected IS NOT BOUND.
*      RAISE internal_error.
*    ENDIF.

    suffix = p_suffix.

    DATA: lr_events TYPE REF TO cl_salv_events_table.

    lr_events = gr_alv->get_event( ).

*... §6.1 register to the event USER_COMMAND
    SET HANDLER me->on_user_command FOR lr_events.

    SET HANDLER me->on_double_click FOR lr_events.

    SET HANDLER me->on_link_click FOR lr_events.

    gr_functions = gr_alv->get_functions( ).
  ENDMETHOD .                    "constructor

  METHOD on_user_command.
    DATA: l_subname TYPE string .

    CONCATENATE 'USER_COMMAND' suffix INTO l_subname .

    sy-ucomm = e_salv_function .
    PERFORM (l_subname) IN PROGRAM (sy-repid)
*                        USING e_salv_function
                        IF FOUND .
  ENDMETHOD.                    "on_user_command

  METHOD on_double_click.
    g_rowclick = row .
    g_colclick = column .

    CALL METHOD me->on_user_command
      EXPORTING
        e_salv_function = c_dblclick.
  ENDMETHOD.                    "on_double_click

  METHOD on_link_click.
    g_rowclick = row .
    g_colclick = column .

    CALL METHOD me->on_user_command
      EXPORTING
        e_salv_function = c_lnkclick.
  ENDMETHOD.                    "on_link_click

  METHOD add_function .
*    add_function  IMPORTING p_name      TYPE string
*                            p_text      TYPE string
*                            p_icon      TYPE string
    DATA: lt_funcs  TYPE TABLE OF salv_de_function ,
          lwa_funcs TYPE salv_de_function .
    DATA:
      l_boolean         TYPE sap_bool,
      l_text            TYPE string,
      l_itext           TYPE string,
      l_icon            TYPE string ,
      l_name            TYPE salv_de_function,
      lr_functions_list TYPE REF TO cl_salv_functions_list .

    SPLIT p_text AT ';' INTO l_text l_itext .

    l_name = p_name .
    l_icon = p_icon .
    TRY .
        gr_functions->add_function(
                   name     = l_name
                   icon     = l_icon
                   text     = l_itext
                   tooltip  = l_text
                   position = if_salv_c_function_position=>right_of_salv_functions ).
      CATCH cx_salv_existing .
      CATCH cx_salv_wrong_call .
    ENDTRY.
  ENDMETHOD .                    "add_function

  METHOD set_functions .
    DATA: lt_funcs  TYPE TABLE OF salv_de_function ,
          lwa_funcs TYPE salv_de_function .
    DATA:
      l_boolean         TYPE sap_bool,
      l_text            TYPE string,
      l_itext           TYPE string,
      l_icon            TYPE string,
      lr_functions_list TYPE REF TO cl_salv_functions_list .

    SPLIT p_funclist AT ';' INTO TABLE lt_funcs .
    CHECK NOT lt_funcs[] IS INITIAL .

    LOOP AT lt_funcs INTO lwa_funcs .
      SPLIT lwa_funcs AT '|' INTO lwa_funcs l_itext  .
      CASE lwa_funcs .
        WHEN c_check.
          l_itext = l_text = 'Проверить'.
          l_icon = icon_check.
        WHEN c_save.
          l_text = 'Сохранить'.
*          l_itext = ' ' .
          l_icon = icon_system_save .
        WHEN c_create.
          l_text = 'Создать'.
*          l_itext = ' ' .
          l_icon = icon_create.
        WHEN c_change.
          l_text = 'Изменить'.
*          l_itext = ' ' .
          l_icon = icon_change.
        WHEN c_detail.
          l_text = 'Подробно'.
*          l_itext = ' ' .
          l_icon = icon_zoom_in .
        WHEN c_delete.
          l_text = 'Удалить'.
*          l_itext = ' ' .
          l_icon = icon_delete.
        WHEN c_import.
          l_text = 'Импортировать'.
*          l_itext = ' ' .
          l_icon = icon_import .
        WHEN c_export.
          l_text = 'Экспортировать...'.
*          l_itext = ' ' .
          l_icon = icon_export.
        WHEN c_refresh.
          l_text = 'Обновить'.
*          l_itext = ' ' .
          l_icon = icon_refresh.
        WHEN c_search .
          l_text = 'Поиск'.
*          l_itext = l_text = 'Поиск'.
          l_icon = icon_search .
        WHEN OTHERS .
          CONTINUE .
      ENDCASE .
      TRY .
          gr_functions->add_function(
                     name     = lwa_funcs
                     icon     = l_icon
                     text     = l_itext
                     tooltip  = l_text
                     position = if_salv_c_function_position=>right_of_salv_functions ).
        CATCH cx_salv_existing .
        CATCH cx_salv_wrong_call .
      ENDTRY.
    ENDLOOP .
  ENDMETHOD .                    "set_functions

  METHOD enable_functions .
    DATA: lt_funcs  TYPE TABLE OF salv_de_function ,
          lwa_funcs TYPE salv_de_function ,
          lp_func   TYPE salv_de_function .

    SPLIT p_funclist AT ';' INTO TABLE lt_funcs .
    CHECK NOT lt_funcs[] IS INITIAL .

    LOOP AT lt_funcs INTO lwa_funcs .
      lp_func = lwa_funcs .
      TRY.
          CALL METHOD gr_functions->enable_function
            EXPORTING
              name    = lwa_funcs
              boolean = abap_true.
        CATCH cx_salv_wrong_call .
        CATCH cx_salv_not_found .
      ENDTRY.

    ENDLOOP .
  ENDMETHOD .                    "set_functions

  METHOD disable_functions .
    DATA: lt_funcs  TYPE TABLE OF salv_de_function ,
          lwa_funcs TYPE salv_de_function ,
          lp_func   TYPE salv_de_function .

    SPLIT p_funclist AT ';' INTO TABLE lt_funcs .
    CHECK NOT lt_funcs[] IS INITIAL .

    LOOP AT lt_funcs INTO lwa_funcs .
      lp_func = lwa_funcs .
      TRY.
          CALL METHOD gr_functions->enable_function
            EXPORTING
              name    = lwa_funcs
              boolean = abap_false.
        CATCH cx_salv_wrong_call .
        CATCH cx_salv_not_found .
      ENDTRY.

    ENDLOOP .
  ENDMETHOD .                    "set_functions
ENDCLASS.                    "lcl_handle_events IMPLEMENTATION

DEFINE first_selected .
* 1 - ALV Grid, 2 - ALV-таблица, 3 - WA для %2
  &1->get_metadata(  ) .
  gr_sels = &1->get_selections( ).

  gt_rows = gr_sels->get_selected_rows( ).
  if not gt_rows[] is initial .
    describe table gt_rows lines gc_selected .
    read table gt_rows into gwa_rows index 1.
    read table &2 into &3 index gwa_rows .
  else.
    sy-subrc = 4 .
  endif.
END-OF-DEFINITION .

DEFINE get_dbl_clicked .
* 1 - ALV Grid, 2 - Имя поля, 3 - значение поля
  &1->get_metadata(  ) .
  gr_sels = &1->get_selections( ).

  clear gsp_sell .
  call method gr_sels->get_current_cell
    receiving
      value = gsp_sell.

  &2 = gsp_sell-columnname .
  &3 = gsp_sell-value .
END-OF-DEFINITION .

DEFINE loop_at_selected .
* 1 - ALV Grid, 2 - ALV-таблица, 3 - WA для %2, 4 - буффер для выбранной записи
  &1->get_metadata(  ) .
  gr_sels = &1->get_selections( ).

  gt_rows = gr_sels->get_selected_rows( ).
  describe table gt_rows lines gc_selected .
  sort gt_rows descending .

  loop at gt_rows into gwa_rows.
    if sy-subrc eq 10 . exit . endif.
    read table &2 into &3 index gwa_rows .
    if sy-subrc > 0 . continue . endif.
    clear &4 .
    move-corresponding &3 to &4 .

    unassign <g_rownr> .
    assign component 'ROWNR' of structure &4 to <g_rownr> .
    if sy-subrc = 0 .
      <g_rownr> = gwa_rows .
    endif.
  END-OF-DEFINITION .

*&---------------------------------------------------------------------*
*&      Form  alv_set_coltext
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM alv_set_coltext USING p_fieldname
                           p_texts.

  DATA: lr_column  TYPE REF TO cl_salv_column_table, "cl_salv_column,
        l_colname  TYPE lvc_fname,
        l_stxt     TYPE scrtext_s,
        l_mtxt     TYPE scrtext_m,
        lt_texts   TYPE TABLE OF scrtext_l WITH HEADER LINE.

  SPLIT p_texts AT ';' INTO TABLE lt_texts .
  l_colname = p_fieldname .
  TRY.
      lr_column ?= gr_columns->get_column( l_colname ).

      READ TABLE lt_texts INDEX 1 .
      l_stxt = lt_texts .
      lr_column->set_short_text( l_stxt ).

      READ TABLE lt_texts INDEX 2 .
      l_mtxt = lt_texts .
      lr_column->set_medium_text( l_mtxt ).

      READ TABLE lt_texts INDEX 3 .
      lr_column->set_long_text( lt_texts ).

    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.

ENDFORM.                    " alv_set_coltext

*&---------------------------------------------------------------------*
*&      Form  hide_fields
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM hide_fields USING p_fieldname .
  DATA: lr_column  TYPE REF TO cl_salv_column .

  TRY.
      lr_column = gr_columns->get_column( p_fieldname ).
      lr_column->set_visible( abap_false ) .
    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.

ENDFORM.                    " alv_set_coltext
*&---------------------------------------------------------------------*
*&      Form  set_current_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_current_alv USING pr_alv TYPE REF TO cl_salv_table .
  gr_current_alv = pr_alv .
  gr_columns = pr_alv->get_columns( ) .

  DATA: lr_column  TYPE REF TO cl_salv_column_table.

  TRY.
      lr_column ?= gr_columns->get_column( 'ROWNR' ).
      lr_column->set_technical( abap_true ) .

    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.

ENDFORM.                    " set_current_alv

**&---------------------------------------------------------------------*
**&      Form  get_selected
**&---------------------------------------------------------------------*
**       text
**----------------------------------------------------------------------*
**  -->  p1        text
**  <--  p2        text
**----------------------------------------------------------------------*
FORM get_selected .
  DATA: lwa_rows TYPE LINE OF salv_t_row .

  REFRESH: gtb_selected,
           gt_selections .

  gr_current_alv->get_metadata(  ) .
  gt_selections = gr_selections->get_selected_rows( ).

  LOOP AT gt_selections INTO lwa_rows.
    READ TABLE gtv_alv INTO gwa_alv INDEX lwa_rows .
    CHECK sy-subrc = 0 .
    CLEAR gtb_selected .
    MOVE-CORRESPONDING gwa_alv TO gtb_selected .
    gtb_selected-rownr = lwa_rows .
    APPEND gtb_selected .
  ENDLOOP .
  DESCRIBE TABLE gtb_selected LINES gc_selected .

  IF gc_selected = 0 .
    DATA: lc_count TYPE i .
    DESCRIBE TABLE gtv_alv LINES lc_count .
    IF lc_count = 1 .
      gc_selected = 1 .
      READ TABLE gtv_alv INTO gwa_alv INDEX 1 .
      CLEAR gtb_selected .
      MOVE-CORRESPONDING gwa_alv TO gtb_selected .
      gtb_selected-rownr = 1 .
      APPEND gtb_selected .
    ENDIF.
  ENDIF.
  READ TABLE gtb_selected INDEX 1 .
ENDFORM.                    " get_selected
*&---------------------------------------------------------------------*
*&      Form  refresh_grid
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM refresh_grid .
  DATA: ls_stbl TYPE lvc_s_stbl.
  ls_stbl-row = 'X' .
  ls_stbl-col = 'X' .

  CALL METHOD gr_alv->refresh
    EXPORTING
      s_stable     = ls_stbl
      refresh_mode = if_salv_c_refresh=>soft.
ENDFORM.                    " refresh_grid
*&---------------------------------------------------------------------*
*&      Form  set_field_checkbox
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_field_checkbox USING p_fieldname .
  DATA: lr_column  TYPE REF TO cl_salv_column_table.

  TRY.
      lr_column ?= gr_columns->get_column( p_fieldname ).
      lr_column->set_cell_type( 1 ) .

    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.
ENDFORM.                    " refresh_grid

*&---------------------------------------------------------------------*
*&      Form  set_field_checkbox
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_field_hotspot USING p_fieldname .
  DATA: lr_column  TYPE REF TO cl_salv_column_table.

  TRY.
      lr_column ?= gr_columns->get_column( p_fieldname ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ) .

    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.
ENDFORM.                    " refresh_grid

*&---------------------------------------------------------------------*
*&      Form  SETUP_SINGLE_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0071   text
*----------------------------------------------------------------------*
FORM setup_single_alv TABLES pt_data TYPE table
                      USING  p_contname
                             p_handle     TYPE i
                             pr_alv       TYPE REF TO cl_salv_table
                             p_variname
                    CHANGING pr_container TYPE REF TO cl_gui_custom_container
                             pr_selection TYPE REF TO cl_salv_selections
                             .
  IF cl_salv_table=>is_offline( ) EQ if_salv_c_bool_sap=>false.
    CREATE OBJECT pr_container
      EXPORTING
        style          = cl_gui_container=>ws_maximizebox
        container_name = p_contname.
    pr_container->set_alignment( cl_gui_custom_container=>align_at_left ) .
  ENDIF.

*    perform show_as_tree .

  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container    = pr_container
          container_name = p_contname
        IMPORTING
          r_salv_table   = pr_alv
        CHANGING
          t_table        = pt_data[] ).
    CATCH cx_salv_msg.
  ENDTRY.

*... set the columns technical
  DATA: lr_columns TYPE REF TO cl_salv_columns_table,
        lr_column  TYPE REF TO cl_salv_column_table.

  lr_columns ?= pr_alv->get_columns( ).

*    lr_columns->set_optimize( gc_true ).

**... §4 set hotspot column
*  TRY.
*      lr_column ?= lr_columns->get_column( 'OBJIDOBJ' ).
*      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
*    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
*  ENDTRY.
*
*... §6 register to the events of cl_salv_table
  DATA: lr_events TYPE REF TO cl_salv_events_table .

  lr_events = pr_alv->get_event( ).

*  CREATE OBJECT gr_events.
*
**... §6.1 register to the event USER_COMMAND
*  SET HANDLER gr_events->on_before_user_command FOR lr_events.

*... set list title
*    DATA: lr_display_settings TYPE REF TO cl_salv_display_settings,
*          l_title TYPE lvc_title.
*
*    l_title = text-t01.
*    lr_display_settings = gr_alv->get_display_settings( ).
*    lr_display_settings->set_list_header( l_title ).
*
*    IF p_none NE gc_true.
*... §7 set layout
  DATA: lr_layout TYPE REF TO cl_salv_layout,
        ls_key    TYPE salv_s_layout_key.

  lr_layout = pr_alv->get_layout( ).

*... §7.1 set the Layout Key
  ls_key-report = sy-repid.
  ls_key-handle = p_handle .
  lr_layout->set_key( ls_key ).
*  lr_layout->set_initial_layout( '/DEFAULT' ) .
*... §7.2 set Layout save restriction
  lr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
  lr_layout->set_default( abap_true ) .

* Установка функций
  DATA:
    l_boolean         TYPE sap_bool,
    l_text            TYPE string,
    l_icon            TYPE string,
    lr_functions_list TYPE REF TO cl_salv_functions_list
.

  lr_functions_list = pr_alv->get_functions( ).
  lr_functions_list->set_all( abap_true ).
  lr_functions_list->set_detail( abap_true ) .

  pr_selection = pr_alv->get_selections(  ) .
  pr_selection->set_selection_mode( cl_salv_selections=>multiple ) .

*  DATA: lr_diapset TYPE REF TO cl_salv_display_settings .
*  CALL METHOD pr_alv->get_display_settings
*    RECEIVING
*      value = lr_diapset.
*  .
*
*  CALL METHOD lr_diapset->set_striped_pattern
*    EXPORTING
*      value = if_salv_c_bool_sap=>true.

*  PERFORM set_current_alv USING pr_alv .

  DATA: lp_var TYPE slis_vari .
  IF NOT p_variname IS INITIAL .

    lp_var = p_var .
    lr_layout->set_initial_layout( p_var ) .
  ELSE.
* Иногда дефолтовый вариант сам почему-то не загружается... :-(
    DATA: lsp_layout TYPE salv_s_layout .
    CALL METHOD lr_layout->get_default_layout
      RECEIVING
        value = lsp_layout.

    IF NOT lsp_layout-layout IS INITIAL .
      lr_layout->set_initial_layout( lsp_layout-layout ) .
    ENDIF.
  ENDIF .

  pr_alv->display( ).
ENDFORM.                    " SETUP_SINGLE_ALV

*&---------------------------------------------------------------------*
*&      Form  SETUP_SINGLE_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0071   text
*----------------------------------------------------------------------*
FORM setup_single_alv2 TABLES pt_data TYPE table
                      USING  p_contname
                             p_handle     TYPE i
                             pr_alv       TYPE REF TO cl_salv_table
                             p_variname
                    CHANGING pr_container TYPE REF TO cl_gui_docking_container
                             pr_selection TYPE REF TO cl_salv_selections
                             .

  IF cl_salv_table=>is_offline( ) EQ if_salv_c_bool_sap=>false.
    CREATE OBJECT pr_container
      EXPORTING
        style = cl_gui_container=>ws_child
        side  = cl_gui_docking_container=>dock_at_left
*        ratio = 50
        extension = 5000
        name  = p_contname.

  ENDIF.

*    perform show_as_tree .

  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container    = pr_container
          container_name = p_contname
        IMPORTING
          r_salv_table   = pr_alv
        CHANGING
          t_table        = pt_data[] ).
    CATCH cx_salv_msg.
  ENDTRY.

*... set the columns technical
  DATA: lr_columns TYPE REF TO cl_salv_columns_table,
        lr_column  TYPE REF TO cl_salv_column_table.

  lr_columns ?= pr_alv->get_columns( ).

*    lr_columns->set_optimize( gc_true ).

**... §4 set hotspot column
*  TRY.
*      lr_column ?= lr_columns->get_column( 'OBJIDOBJ' ).
*      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
*    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
*  ENDTRY.
*
*... §6 register to the events of cl_salv_table
  DATA: lr_events TYPE REF TO cl_salv_events_table .

  lr_events = pr_alv->get_event( ).

*  CREATE OBJECT gr_events.
*
**... §6.1 register to the event USER_COMMAND
*  SET HANDLER gr_events->on_before_user_command FOR lr_events.

*... set list title
*    DATA: lr_display_settings TYPE REF TO cl_salv_display_settings,
*          l_title TYPE lvc_title.
*
*    l_title = text-t01.
*    lr_display_settings = gr_alv->get_display_settings( ).
*    lr_display_settings->set_list_header( l_title ).
*
*    IF p_none NE gc_true.
*... §7 set layout
  DATA: lr_layout TYPE REF TO cl_salv_layout,
        ls_key    TYPE salv_s_layout_key.

  lr_layout = pr_alv->get_layout( ).

*... §7.1 set the Layout Key
  ls_key-report = sy-repid.
  ls_key-handle = p_handle .
  lr_layout->set_key( ls_key ).
*  lr_layout->set_initial_layout( '/DEFAULT' ) .
*... §7.2 set Layout save restriction
  lr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
  lr_layout->set_default( abap_true ) .

* Установка функций
  DATA:
    l_boolean         TYPE sap_bool,
    l_text            TYPE string,
    l_icon            TYPE string,
    lr_functions_list TYPE REF TO cl_salv_functions_list
.

  lr_functions_list = pr_alv->get_functions( ).
  lr_functions_list->set_all( abap_true ).
  lr_functions_list->set_detail( abap_true ) .

  pr_selection = pr_alv->get_selections(  ) .
  pr_selection->set_selection_mode( cl_salv_selections=>multiple ) .

*  DATA: lr_diapset TYPE REF TO cl_salv_display_settings .
*  CALL METHOD pr_alv->get_display_settings
*    RECEIVING
*      value = lr_diapset.
*  .
*
*  CALL METHOD lr_diapset->set_striped_pattern
*    EXPORTING
*      value = if_salv_c_bool_sap=>true.

*  PERFORM set_current_alv USING pr_alv .

  DATA: lp_var TYPE slis_vari .
  IF NOT p_variname IS INITIAL .

    lp_var = p_var .
    lr_layout->set_initial_layout( p_var ) .
  ELSE.
* Иногда дефолтовый вариант сам почему-то не загружается... :-(
    DATA: lsp_layout TYPE salv_s_layout .
    CALL METHOD lr_layout->get_default_layout
      RECEIVING
        value = lsp_layout.

    IF NOT lsp_layout-layout IS INITIAL .
      lr_layout->set_initial_layout( lsp_layout-layout ) .
    ENDIF.
  ENDIF .

  pr_alv->display( ).

ENDFORM.                    " SETUP_SINGLE_ALV

*&---------------------------------------------------------------------*
*&      Form  CONFIRM_DELETE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM confirm_delete .
  IF gc_selected = 0 .
    MESSAGE i004(zcommon) .
    sy-subrc = 1 .
    EXIT .
  ENDIF .

  DATA: l_answer .
  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      titlebar                    = 'Запрос подтверждения'
*            DIAGNOSE_OBJECT             = ' '
      text_question               = 'Действительно удалить записи?'
     text_button_1               = 'Да'
*            ICON_BUTTON_1               = ' '
     text_button_2               = 'Нет'
*            ICON_BUTTON_2               = ' '
             default_button              = '2'
      display_cancel_button       = ' '
*            USERDEFINED_F1_HELP         = ' '
*            START_COLUMN                = 25
*            START_ROW                   = 6
*            POPUP_TYPE                  =
*            IV_QUICKINFO_BUTTON_1       = ' '
*            IV_QUICKINFO_BUTTON_2       = ' '
   IMPORTING
     answer                      = l_answer
*          TABLES
*            PARAMETER                   =
   EXCEPTIONS
     text_not_found              = 1
     OTHERS                      = 2
            .

  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  CASE l_answer .
    WHEN '1'.
      sy-subrc = 0 .
    WHEN '2'.
      sy-subrc = 2 .
    WHEN OTHERS .
      sy-subrc = 10 .
  ENDCASE .
ENDFORM.                    " CONFIRM_DELETE
*&---------------------------------------------------------------------*
*&      Form  ALV_DELROWS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM alv_delrows TABLES ptv_alv
                        pt_delbuf
                 USING  pr_alv TYPE REF TO cl_salv_table .
  DATA: lt_rows  TYPE salv_t_row,
        lwa_rows TYPE int4 ,
        lr_sels  TYPE REF TO cl_salv_selections.

  pr_alv->get_metadata(  ) .
  lr_sels = pr_alv->get_selections( ) .
  lt_rows = lr_sels->get_selected_rows( ).

  gc_selected = LINES( lt_rows ) .
  PERFORM confirm_delete .
  CHECK sy-subrc = 0 .

  SORT lt_rows DESCENDING .

  LOOP AT lt_rows INTO lwa_rows.
    READ TABLE ptv_alv INDEX lwa_rows .
    CHECK sy-subrc = 0 .
    MOVE-CORRESPONDING ptv_alv TO pt_delbuf .
    APPEND pt_delbuf .
    DELETE ptv_alv INDEX lwa_rows .
  ENDLOOP .

  pr_alv->refresh( ) .
ENDFORM.                    " ALV_DELROWS

*&---------------------------------------------------------------------*
*&      Form  F4_ALVARIANT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_P_  text
*----------------------------------------------------------------------*
FORM f4_alvariant    USING p_handle
                  CHANGING p_variant
                       .
  DATA: lsp_var   TYPE salv_s_layout ,
        lr_layout TYPE REF TO cl_salv_layout ,
        ls_key    TYPE salv_s_layout_key .

  lsp_var-layout = p_variant .

  ls_key-report = sy-repid .
  ls_key-handle = p_handle .
  CREATE OBJECT lr_layout .
  CALL METHOD lr_layout->set_key
    EXPORTING
      value = ls_key.

  CALL METHOD lr_layout->f4_layouts
    RECEIVING
      value = lsp_var.

  IF NOT lsp_var-layout IS INITIAL .
    p_variant = lsp_var-layout .
  ENDIF.
ENDFORM.                    " F4_ALVARIANT
*&---------------------------------------------------------------------*
*&      Form  ALV_SET_COLKEY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0352   text
*      -->P_0353   text
*----------------------------------------------------------------------*
FORM alv_set_colkey  USING p_fieldname
                           p_value .

  DATA: lr_column  TYPE REF TO cl_salv_column_table, "cl_salv_column,
        lp_colname  TYPE lvc_fname ,
        lp_value   TYPE sap_bool .

  lp_colname = p_fieldname .
  IF p_value IS INITIAL .
    lp_value = if_salv_c_bool_sap=>false .
  ELSE.
    lp_value = if_salv_c_bool_sap=>true .
  ENDIF.

  TRY.
      lr_column ?= gr_columns->get_column( lp_colname ).

      CALL METHOD lr_column->set_key_presence_required
        EXPORTING
          value = lp_value.

      CALL METHOD lr_column->set_key
        EXPORTING
          value = lp_value.

    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.

ENDFORM.                    " ALV_SET_COLKEY

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Последний раз редактировалось 111 Вт, окт 05 2010, 12:04, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Вт, окт 05 2010, 12:02 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1554
Откуда: Москва
111 написал(а):
Версия 2010 года.
1.) Убрал левые завязки на структуры словаря.
2.) Создал SETUP_SINGLE_ALV2, который работает с cl_gui_docking_container
(устранение бага с двойными полосами прокрутки).
3.) Добавил разные новые методы для бОльшего удобства (типа set_field_checkbox, set_field_hotspot, и т.д.).
4.) Добавил инклуд с selection-screen для имени ALV-варианта (обязательный компонент, см. следующее письмо).


Code:
*&---------------------------------------------------------------------*
*&  Include           ZALV_SELSCR
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&  Инклуд, содержащий параметр выбора для ALV-варианта просмотра.
*&  Предназначен для совместной работы с инклудом ZALV_UTILS.
*&  Должен быть включен в код объявления экрана выбора.
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK alv WITH FRAME TITLE text-alv .
PARAMETERS:
       p_var TYPE disvariant-variant MEMORY ID alvar .
SELECTION-SCREEN END   OF BLOCK alv .


+ вставить PERFORM f4_alvariant в логику обработки экрана выбора.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Пт, апр 15 2011, 10:22 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, дек 16 2010, 14:04
Сообщения: 84
Откуда: Нижнекамск
Пол: Мужской
Цитата:
*& gtv_alv TYPE STANDARD TABLE OF <ваша ALV-структура в словаре данных>,
*& gwa_alv TYPE <ваша ALV-структура в словаре данных>,


Недавно работаю в сапе и есть вопрос. Ваша alv-стуктура в словаре данных. Как её описать и что имеется ввиду?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Пт, апр 15 2011, 11:31 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
insaf121 написал:
Цитата:
*& gtv_alv TYPE STANDARD TABLE OF <ваша ALV-структура в словаре данных>,
*& gwa_alv TYPE <ваша ALV-структура в словаре данных>,


Недавно работаю в сапе и есть вопрос. Ваша alv-стуктура в словаре данных. Как её описать и что имеется ввиду?

курс BC430 - ABAP Dictionary по-моему.
http://www.sapnet.ru/viewtopic.php?t=2&sid=86bfdbc6e6c99609d37faf86b8b72859


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Пт, апр 15 2011, 12:18 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, дек 16 2010, 14:04
Сообщения: 84
Откуда: Нижнекамск
Пол: Мужской
Спасибою


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Ср, апр 10 2013, 09:18 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, дек 16 2010, 14:04
Сообщения: 84
Откуда: Нижнекамск
Пол: Мужской
А можно какой-нибудь пример использования?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB