Текущее время: Ср, апр 24 2024, 10:51

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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