Текущее время: Чт, июн 19 2025, 01:40

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


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


ВНИМАНИЕ!

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



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

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

Недостатки:
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
Сообщения: 1556
Откуда: Москва
Версия 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
Сообщения: 1556
Откуда: Москва
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  
 
 Заголовок сообщения: Re: Дарю народу инклуд ZALV_UTILS (для работы с CL_SAVL_TABLE)
СообщениеДобавлено: Пт, ноя 15 2024, 12:36 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
В следующем сообщении - версия утилиты для класса CL_GUI_ALV_GRID (в отличии от более ранних версий , ориентированных на класс cl_gui_alv_grid ) .
Главная отличительная особенность - возможность делать ячейки ALV редактируемыми.

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


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

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
*&---------------------------------------------------------------------*
*& Include #ZALV_UTILS_EDITABLE
*& #ZALV_UTILS_V2
*&---------------------------------------------------------------------*

CLASS lcl_alv_editable DEFINITION .
PUBLIC SECTION .
DATA: m_alvgrid TYPE REF TO cl_gui_alv_grid
, m_container TYPE REF TO cl_gui_custom_container "cl_gui_docking_container "
, mt_fldcat TYPE lvc_t_fcat
, ms_layout TYPE lvc_s_layo
.

METHODS constructor IMPORTING
i_structname TYPE any
i_contname TYPE any.
METHODS default_prepare .
METHODS set_col_txt IMPORTING i_colname TYPE string
i_coltxt TYPE string .
METHODS drop_down_on IMPORTING p_name TYPE any.
METHODS as_checkbox IMPORTING p_name TYPE any.

METHODS set_editable IMPORTING i_colnames TYPE string .
METHODS turn_of_f4 IMPORTING i_colnames TYPE string .
METHODS set_table CHANGING t_data TYPE table .

METHODS:
double_click FOR EVENT double_click
OF cl_gui_alv_grid
IMPORTING e_row
e_column
es_row_no, "#EC CALLED

hotspot_click FOR EVENT hotspot_click
OF cl_gui_alv_grid
IMPORTING e_row_id
e_column_id
es_row_no, "#EC CALLED

button_click FOR EVENT button_click
OF cl_gui_alv_grid
IMPORTING es_col_id
es_row_no, "#EC CALLED

data_changed FOR EVENT data_changed
OF cl_gui_alv_grid
IMPORTING er_data_changed
e_onf4
e_onf4_before
e_onf4_after, "#EC CALLED

data_changed_finished
FOR EVENT data_changed_finished
OF cl_gui_alv_grid, "#EC CALLED
* TOOLBAR_BUTTON_CLICK FOR EVENT TOOLBAR_BUTTON_CLICK
* OF cl_gui_alv_grid ,
toolbar FOR EVENT toolbar
OF cl_gui_alv_grid
IMPORTING e_object
e_interactive,
* E_OBJECT
*E_INTERACTIVE
user_command FOR EVENT user_command
OF cl_gui_alv_grid
IMPORTING e_ucomm ,

top_of_page FOR EVENT top_of_page
OF cl_gui_alv_grid
IMPORTING e_dyndoc_id
table_index ,
onf4 FOR EVENT onf4
OF cl_gui_alv_grid
IMPORTING e_fieldname
e_fieldvalue
es_row_no
er_event_data
et_bad_cells
e_display.
.
ENDCLASS . "lcl_alv DEFINITION

*----------------------------------------------------------------------*
* CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_editable IMPLEMENTATION .
METHOD constructor . "IMPORTING
* i_structname TYPE any
* i_contname TYPE any.
IF m_container IS INITIAL.
IF cl_gui_alv_grid=>offline( ) IS INITIAL.
CREATE OBJECT m_container
EXPORTING
container_name = i_contname.
ENDIF.

CREATE OBJECT m_alvgrid
EXPORTING
i_parent = m_container.

DATA: ls_fcat TYPE lvc_s_fcat,
l_lin TYPE i.

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_buffer_active = space
i_structure_name = i_structname
i_client_never_display = abap_true
i_bypassing_buffer = abap_true
CHANGING
ct_fieldcat = mt_fldcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

SET HANDLER:
me->double_click FOR m_alvgrid
, me->hotspot_click FOR m_alvgrid
, me->button_click FOR m_alvgrid
, me->data_changed FOR m_alvgrid
, me->data_changed_finished FOR m_alvgrid
* , me->TOOLBAR_BUTTON_CLICK FOR m_alvgrid
, me->user_command FOR m_alvgrid
, me->toolbar FOR m_alvgrid
, me->top_of_page FOR m_alvgrid
, me->onf4 FOR m_alvgrid
.
ENDIF .
ENDMETHOD . "lcl_alv

METHOD set_table . ""importing t_data type table .
DATA: ls_vari TYPE disvariant.

ls_vari-report = sy-repid .
ls_vari-handle = sy-dynnr .

CALL METHOD m_alvgrid->set_table_for_first_display
EXPORTING
i_buffer_active = abap_false
i_bypassing_buffer = abap_true
i_consistency_check = space
is_variant = ls_vari
i_save = 'X' "'U' ""'S'
i_default = abap_true
is_layout = ms_layout
* is_print = ls_prnt
* it_hyperlink = lt_hype
CHANGING
it_outtab = t_data[]
it_fieldcatalog = mt_fldcat.
ENDMETHOD . "set_table

METHOD default_prepare .
*... ALV-Control: Allgemeine Anzeigeoptionen
ms_layout-stylefname = space.

ms_layout-cwidth_opt = abap_true.
ms_layout-zebra = abap_true.
ms_layout-smalltitle = space.
ms_layout-graphics = space. ""abap_true.
ms_layout-frontend = abap_true.
ms_layout-template = space.

*... ALV-Control: Gridcustomizing
ms_layout-no_colexpd = space.
ms_layout-no_hgridln = space.
ms_layout-no_vgridln = space.
ms_layout-no_rowmark = space.
ms_layout-no_headers = space.
ms_layout-no_merging = space.
ms_layout-grid_title = space.

ms_layout-no_toolbar = space.

ms_layout-sel_mode = 'C'.

ms_layout-box_fname = 'BOX'.

ms_layout-sgl_clk_hd = space.

*... ALV-Control: Summenoptionen
ms_layout-totals_bef = space.
ms_layout-no_totline = space.
ms_layout-numc_total = abap_true.
ms_layout-no_utsplit = space.

*... ALV-Control: Exceptions
* ms_layout-excp_group = gs_test-excp_group.
* ms_layout-excp_fname = 'LIGHTS'.
* ms_layout-excp_rolln = space.
* ms_layout-excp_conds = gs_test-excp_condense.
* ms_layout-excp_led = gs_test-excp_led.

*... ALV-Control: Steuerung Interaktion
ms_layout-detailinit = space.
ms_layout-detailtitl = space.
ms_layout-keyhot = space.
ms_layout-no_keyfix = space.
ms_layout-no_author = space.
* clear ms_layout-s_dragdrop.

*... ALV-Control: Farben
ms_layout-info_fname = space.
ms_layout-ctab_fname = space.

*... ALV-Control: Eingabefahigkeit
ms_layout-edit = space.
ms_layout-edit_mode = space.

ms_layout-no_rowins = space.
ms_layout-no_rowmove = space.

*... ALV-Control: Web-Optionen
ms_layout-weblook = abap_true . "space.
ms_layout-webstyle = abap_true . "space.
ms_layout-webrows = space.
ms_layout-webxwidth = space.
ms_layout-webxheight = space.

CALL METHOD m_alvgrid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.

CALL METHOD m_alvgrid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.

ENDMETHOD . "lcl_alv

METHOD set_editable . "IMPORTING i_colnames TYPE string .
DATA: lt_names TYPE TABLE OF lvc_s_fcat-fieldname
, lwa_names TYPE lvc_s_fcat-fieldname.
FIELD-SYMBOLS <lwa_fldcat> LIKE LINE OF mt_fldcat .
* handle_style type lvc_t_styl,
SPLIT i_colnames AT ';' INTO TABLE lt_names .
LOOP AT lt_names INTO lwa_names.
READ TABLE mt_fldcat ASSIGNING <lwa_fldcat>
WITH KEY fieldname = lwa_names .
CHECK sy-subrc = 0 .
<lwa_fldcat>-edit = abap_true .
ENDLOOP.
ENDMETHOD . "lcl_alv

METHOD turn_of_f4 . "IMPORTING i_colnames TYPE string .
DATA: lt_names TYPE TABLE OF lvc_s_fcat-fieldname
, lwa_names TYPE lvc_s_fcat-fieldname.
FIELD-SYMBOLS <lwa_fldcat> LIKE LINE OF mt_fldcat .
* handle_style type lvc_t_styl,
SPLIT i_colnames AT ';' INTO TABLE lt_names .
LOOP AT lt_names INTO lwa_names.
READ TABLE mt_fldcat ASSIGNING <lwa_fldcat>
WITH KEY fieldname = lwa_names .
CHECK sy-subrc = 0 .
<lwa_fldcat>-f4availabl = abap_true .
* <lwa_fldcat>-CHECKTABLE = 'ZTM_CLINGROUPS'.
ENDLOOP.
ENDMETHOD . "lcl_alv

METHOD drop_down_on . "IMPORTING i_colnames TYPE string .
FIELD-SYMBOLS <lwa_fldcat> LIKE LINE OF mt_fldcat .

READ TABLE mt_fldcat ASSIGNING <lwa_fldcat>
WITH KEY fieldname = p_name .
CHECK sy-subrc = 0 .
<lwa_fldcat>-drdn_field = 'DROP_DOWN_HANDLE' .
<lwa_fldcat>-checktable = '!' .
ENDMETHOD . "lcl_alv

METHOD as_checkbox . "IMPORTING i_colnames TYPE string .
FIELD-SYMBOLS <lwa_fldcat> LIKE LINE OF mt_fldcat .

READ TABLE mt_fldcat ASSIGNING <lwa_fldcat>
WITH KEY fieldname = p_name .
CHECK sy-subrc = 0 .
<lwa_fldcat>-CHECKBOX = abap_true .
ENDMETHOD . "lcl_alv

METHOD set_col_txt . ""IMPORTING i_colname TYPE string
* i_coltxt TYPE string .
DATA: lt_txt TYPE TABLE OF string
, lwa_txt TYPE string.
FIELD-SYMBOLS <lwa_fldcat> LIKE LINE OF mt_fldcat .
READ TABLE mt_fldcat ASSIGNING <lwa_fldcat>
WITH KEY fieldname = i_colname .
CHECK sy-subrc = 0 .

SPLIT i_coltxt AT ';' INTO TABLE lt_txt .
READ TABLE lt_txt INTO lwa_txt INDEX 1 .
<lwa_fldcat>-coltext = lwa_txt .
READ TABLE lt_txt INTO lwa_txt INDEX 2 .
<lwa_fldcat>-scrtext_s = lwa_txt .
READ TABLE lt_txt INTO lwa_txt INDEX 3 .
<lwa_fldcat>-scrtext_m = lwa_txt .
READ TABLE lt_txt INTO lwa_txt INDEX 4 .
<lwa_fldcat>-scrtext_l = lwa_txt .
ENDMETHOD . "lcl_alv

METHOD data_changed . ""using er_data_changed
* e_onf4
* e_onf4_before
* e_onf4_after. "#EC *

* data: l_text1 type string,
* l_text2 type string,
* l_text3 type string.
*
* concatenate text-102 e_onf4 into l_text3.
* concatenate text-100 e_onf4_before into l_text1.
* concatenate text-101 e_onf4_after into l_text2.

* data: l_event type lvc_fname. "#EC NEEDED
*
* if gs_test-info_popup_once eq con_true.
* read table gs_test-events_info_popup into l_event
* with key table_line = 'DATA_CHANGED'.
* if sy-subrc ne 0.
* insert 'DATA_CHANGED'
* into gs_test-events_info_popup index 1.
* message i000(0k) with text-004
* l_text3
* l_text1
* l_text2.
* endif.
* elseif gs_test-no_info_popup eq space.
* message i000(0k) with text-004
* l_text3
* l_text1
* l_text2.
* endif.

*... die Ausgabetabelle ist noch nicht aktualisiert
* hier sollen semantische Prufungen zunachst erfolgen uber
* er_data_changed->mt_good_cells
* Fehler konnen dann dem Fehlerprotokoll angehangt werden
* er_data_changed->add_protocol_entry
* Es darf an dieser Stelle kein Refresh erfolgen!

ENDMETHOD. " d0100_event_data_changed

*&---------------------------------------------------------------------*
*& Form d0100_event_data_changed_finis
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
METHOD data_changed_finished . "#EC *

* data: l_event type lvc_fname. "#EC NEEDED
*
* if gs_test-info_popup_once eq con_true.
* read table gs_test-events_info_popup into l_event
* with key table_line = 'DATA_CHANGED_FINISHED'.
* if sy-subrc ne 0.
* insert 'DATA_CHANGED_FINISHED'
* into gs_test-events_info_popup index 1.
* message i000(0k) with text-005.
* endif.
* elseif gs_test-no_info_popup eq space.
* message i000(0k) with text-005.
* endif.

*... die Ausgabetabelle ist nun aktualisiert

ENDMETHOD. " d0100_event_data_changed_finis

*&---------------------------------------------------------------------*
*& Form d0100_event_double_click
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
METHOD double_click . ""using e_row type lvc_s_row
* e_column type lvc_s_col."#EC *

* data: l_text type string.
*
* concatenate text-001
* text-100 e_row-index
* text-101 e_column-fieldname
* into l_text separated by space.
*
* data: l_event type lvc_fname. "#EC NEEDED
*
* if gs_test-info_popup_once eq con_true.
* read table gs_test-events_info_popup into l_event
* with key table_line = 'DOUBLE_CLICK'.
* if sy-subrc ne 0.
* insert 'DOUBLE_CLICK' into gs_test-events_info_popup index 1.
* message i000(0k) with l_text.
* endif.
* elseif gs_test-no_info_popup eq space.
* message i000(0k) with l_text.
* endif.

ENDMETHOD. " d0100_event_double_click

*&---------------------------------------------------------------------*
*& Form d0100_event_hotspot_click
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
METHOD hotspot_click . ""using e_row_id type lvc_s_row
* e_column_id type lvc_s_col."#EC *

* data: l_text type string.
*
* concatenate text-002
* text-100 e_row_id-index
* text-101 e_column_id-fieldname
* into l_text separated by space.
*
* data: l_event type lvc_fname. "#EC NEEDED
*
* if gs_test-info_popup_once eq con_true.
* read table gs_test-events_info_popup into l_event
* with key table_line = 'HOTSPOT_CLICK'.
* if sy-subrc ne 0.
* insert 'HOTSPOT_CLICK' into gs_test-events_info_popup index 1.
* message i000(0k) with l_text.
* endif.
* elseif gs_test-no_info_popup eq space.
* message i000(0k) with l_text.
* endif.

ENDMETHOD. " d0100_event_hotspot_click

*&---------------------------------------------------------------------*
*& Form d0100_event_button_click
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
METHOD button_click . ""using es_col_id type lvc_s_col
* es_row_no type lvc_s_roid."#EC *

* data: l_text type string,
* l_row type char10.
*
* l_row = es_row_no-row_id.
*
* concatenate text-003
* text-100 l_row
* text-101 es_col_id-fieldname
* into l_text separated by space.
*
* data: l_event type lvc_fname. "#EC NEEDED
*
* if gs_test-info_popup_once eq con_true.
* read table gs_test-events_info_popup into l_event
* with key table_line = 'BUTTON_CLICK'.
* if sy-subrc ne 0.
* insert 'BUTTON_CLICK' into gs_test-events_info_popup index 1.
* message i000(0k) with l_text.
* endif.
* elseif gs_test-no_info_popup eq space.
* message i000(0k) with l_text.
* endif.

ENDMETHOD. " d0100_event_button_click

* METHOD TOOLBAR_BUTTON_CLICK . "using. E_OBJECT
** E_UCOMM
* break-point .
* endmethod .

METHOD user_command . "using. E_OBJECT
* E_UCOMM
CASE e_ucomm .
WHEN 'APPEND_MULTI'.
PERFORM append_multi IN PROGRAM (sy-repid)
IF FOUND .
m_alvgrid->refresh_table_display( ) .
ENDCASE .
ENDMETHOD . "user_command

METHOD toolbar .
* E_OBJECT
*E_INTERACTIVE
DATA: lo_toolbar TYPE REF TO cl_alv_event_toolbar_set
, lwa_button TYPE stb_button
.
lo_toolbar ?= e_object .
lwa_button-function = 'APPEND_MULTI'.
lwa_button-icon = icon_insert_multiple_lines .
lwa_button-quickinfo = 'Добавить несколько записей'.
* BUTN_TYPE
* DISABLED
lwa_button-text = 'Несколько'.
APPEND lwa_button TO lo_toolbar->mt_toolbar .
* CHECKED
ENDMETHOD . "toolbar

METHOD top_of_page .
* IMPORTING E_DYNDOC_ID
* TABLE_INDEX .
DATA: lo_header TYPE REF TO cl_dd_document .
PERFORM draw_header IN PROGRAM (sy-repid) IF FOUND
USING e_dyndoc_id .
lo_header ?= e_dyndoc_id .

ENDMETHOD . "top_of_page

METHOD onf4 .
* onf4 for event onf4
* OF cl_gui_alv_grid
* importing E_FIELDNAME
* E_FIELDVALUE
* ES_ROW_NO
* ER_EVENT_DATA
* ET_BAD_CELLS
* E_DISPLAY.
.
PERFORM call_f4 IN PROGRAM (sy-repid) IF FOUND
USING e_fieldname
e_fieldvalue
es_row_no .
m_alvgrid->refresh_table_display( ) .
ENDMETHOD . "onf4

"lcl_alv
ENDCLASS . "lcl_alv IMPLEMENTATION

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


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

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


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

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


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

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