Текущее время: Пт, май 02 2025, 04:15

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


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

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


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

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