CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран

Автор Uukrul, Грудень 13, 2010, 03:05:06 ДП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

themax

Как ни странно, но у меня почему то не все поля получается переименовать, всё отрабатывает, в дамп ничего не падает, но у пару полей имена не изменились, это получается РНН - IM_STCD1 и БИН - IM_STCD3. Странно, там нет ни каких ограничений у это класса на количеству  использования метода этого или ещё что?!

themax

Всем здравствуйте! Я извиняюсь за интеллект и за назойливость, есть ли возможность у этого класса допустим вывести на экран табличку в конкретно заданной шириной столбца, т.е. чтобы столбец был распахнут по длине текста названия этого слобца, чтобы вручную его не растягивать чтобы прочесть название столбца? Я понимаю что это мелочь и руки не отвалятся если я столбец растяну чтобы название посмотреть, но всё же....?!

themax

Цитата: themax від Жовтень 30, 2012, 02:19:30 ПП
Как ни странно, но у меня почему то не все поля получается переименовать, всё отрабатывает, в дамп ничего не падает, но у пару полей имена не изменились, это получается РНН - IM_STCD1 и БИН - IM_STCD3. Странно, там нет ни каких ограничений у это класса на количеству  использования метода этого или ещё что?!
Разобрался, всё дело было в параметрах длины поля, поставил оба параметра
short  и long, и нормально, переименовались. А вот как быть с шириной столбца при выводе на экран? Может кто подскажет?

Uukrul

Цитата: themax від Жовтень 31, 2012, 08:05:59 ДП
А вот как быть с шириной столбца при выводе на экран? Может кто подскажет?
Скорее всего, что никак. У ALV-сетки есть параметр, который подстраивает ширину ячейки под выводимую в ней информацию, а вот параметра, подстраивающего вывод, под выводимый заголовок колонки нет, так что скорее всего никак.

themax

Ну вот ширина сетки поля самой таблицы, да, она автоматически подгоняет под содержимое поле, но вот например Название столбца МеткаБлокировкиБЕ а содержимое поле стоит просто метка X, и таких у меня столбцов 6, ни как нельзя заставить сетку думать что содержимое поля, которое содержит Х, что там больше символов чем на самом деле и таким бы образом он выводил ширину столбца пошире, может у кого нибудь ещё будут мнения на этот счёт?!

themax

Есть метод у этого класса set_OUTPUT_LENGTH, вызываем его и пишем gc_colwork->set_OUTPUT_LENGTH( ' длина числом' ), с числом можно поэкспериментировать. А так в принципе ширину столбца изменил.

Uukrul

Цитата: themax від Жовтень 31, 2012, 10:58:00 ДП
Есть метод у этого класса set_OUTPUT_LENGTH, вызываем его и пишем gc_colwork->set_OUTPUT_LENGTH( ' длина числом' ), с числом можно поэкспериментировать. А так в принципе ширину столбца изменил.
Это называются костыли, но если вас они устраивают, то не вопрос.

themax

Да я понимаю что костыли, но что поделаешь, пользователи просят сделать как можно читабельней выводимую табличку.

themax

Доброго времени суток, господа-товарищи! Мне опять нужен ваш совет, возникла необходимость сделать даблклил, в выводимой табличке и чтобы при даблклике отркывалась ещё одна табличка, т.е. при даблклике происходило событие заполяющее данными вторую табличку, например я хочу посмотреть некоторые данные того или иного кредитора, я щёлкаю на поле даблкликом и у меня выходит ещё небольшая табличка с данными об этом кредиторе. Возможно ли это организовать средствами, приводимого вами в пример класса, или подгрузить отдельно как то?! Ошень надо сделать, буду весьма признателен за помощь.

Uukrul

Цитата: themax від Листопад 07, 2012, 04:46:00 ДП
Доброго времени суток, господа-товарищи! Мне опять нужен ваш совет, возникла необходимость сделать даблклил, в выводимой табличке и чтобы при даблклике отркывалась ещё одна табличка, т.е. при даблклике происходило событие заполяющее данными вторую табличку
Ну конечно, делаете реакцию на клик мышью в ячейке, попадаете в метод, в котором пишете код выбора необходимой информации после чего выводите ее в отдельном диалоговом окне. Как выводить это уже другой вопрос...

themax

Мне бы какой нить класс подсказать ааа, или в cl_salv_table какой нить метод, чтоб не сильно программку переделывать?

Uukrul

Цитата: themax від Листопад 07, 2012, 10:19:18 ДП
Мне бы какой нить класс подсказать ааа, или в cl_salv_table какой нить метод, чтоб не сильно программку переделывать?
Ну зачем же ее переделывать, но вам надо прочитать BC410 кажется, который называется диалоговое программирование, который содержит информацию как рисовать свои окошки в SAP. Класс вам тут не очень поможет. Хотя есть к примеру можно по быстрому воспользоватся такими ФМ:

http://sapforum.biz/index.php/topic,223.msg940.html#msg940
http://sapforum.biz/index.php/topic,223.msg941.html#msg941
http://sapforum.biz/index.php/topic,223.msg8514.html#msg8514

Форматирование вывода будет не очень красивым, зато будет быстро и не надо свои экраны рисовать.


themax

Добрый день уважаемые ABAPer-ы. Вот не получается что то у меня даблклик, видимо всё таки делаю что то не так: Объявляю классы:
DATA: gc_alv_table TYPE REF TO cl_salv_table,
      gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table,
      gc_functions TYPE REF TO cl_salv_functions,
      gc_display TYPE REF TO cl_salv_display_settings,
      gr_table type ref to cl_salv_table.


class lcl_handle_events definition deferred.
data: gr_events type ref to lcl_handle_events.

class lcl_handle_events definition.
  public section.
    methods:
        on_double_click for event double_click of cl_salv_events_table
        importing row column.

endclass.                    "lcl_handle_events DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
class lcl_handle_events implementation.

  method on_double_click.
    perform double_click using row column.
  endmethod.                    "on_double_click

endclass.     






выше у меня идут объявления данных, их типов, записей и таблиц, я их не стал выкладывать, поскольку программка работает, т.е. выводит табличку в соответствии с теми классами которые я использовал на примерах приводимых здесь, но вот именно даблклик не пашет, видимо у меня догонялки не хватает додумать что я не так делаю. Затем у меня идёт start of selection, потом выводится табличка на экран и дальше идёт  perform double_click

FORM double_click  using  i_row    type i
                            i_column type lvc_fname.


  data: lr_selections     type ref to cl_salv_selections,
        ls_cell           type salv_s_cell.

  CASE i_column.
    WHEN 'IM_LIFNR'  " Подробно, документы
      OR 'IM_BUKRS'.
    lr_selections = gr_table->get_selections( ).
    ls_cell = lr_selections->get_current_cell( ).
    read table im_tab  index ls_cell-row.

  CLEAR wa.
  wa-program = 'SAPMF02K'.
  wa-dynpro = '0106'.
  wa-dynbegin = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'BDC_OKCODE'.
  wa-fval = '/00'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-LIFNR'.
  wa-fval = im_tab-im_lifnr.  "Vendor
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-BUKRS'.
  wa-fval = im_tab-im_bukrs.  "Company code
  APPEND wa TO bdcdata.

*General data
  CLEAR wa.
  wa-fnam = 'RF02K-D0110'.  "Address
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0120'. "Control
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0130'. "Payment transactions
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'WRF02K-D0380'. "contact person
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

*Company code data
  CLEAR wa.
  wa-fnam = 'RF02K-D0210'. "account info
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0215'. "Payment transactions
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0220'. "correspondence
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0610'. "With holding tax
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CALL TRANSACTION 'FK03' USING bdcdata MODE 'E'.
  ENDCASE.
ENDFORM.



Есть у кого какие мысли что именно я не так делаю?? Буду весьма признателен за помощь, а то сам наверное не разберусь.

insaf121

Обьяви

DATA:   gc_events TYPE REF TO cl_salv_events_table.

И после  CREATE OBJECT gr_events.

gc_events = gc_alv_table->get_event( ).
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.

jacknk88

а как можно выделить строки определенным цветом?

Uukrul


jacknk88

так как я создавал ALV так как Uukrul прописал...т.е. без ФМ REUSE_ALV_GRID_DISPLAY, то пришлось пойти другим путем....для этого наткнулся на пример SALV_DEMO_TABLE_COLUMNS и форум
В результате:

1) в своей табличке для ALV добавил поле

data: begin of gt_alv OCCURS 50,
...
t_color           TYPE lvc_t_scol, " установка цвета строки
end of  gt_alv.


2) объявил структуру и таблицу для установки цвета

data:   go_color  TYPE        lvc_s_scol,
        go_col    TYPE        lvc_t_scol.


3) перед выводом на экран таблички gt_alv написал следующее

LOOP AT gt_alv. " пробежимся по строчкам таблицы
    CLEAR go_col.
    CLEAR  go_color.

    if <условие>
          go_color-color-col = col_positive. " цвет
          go_color-color-int = 0.
          go_color-color-inv = 0.

          APPEND go_color TO go_col.

          gt_alv-t_color = go_col. " закинем настройки цвета текущей строки в поле таблички

      TRY.

        go_columns->set_color_column( 'T_COLOR' ). " указывается имя поля из пункта (1)

      CATCH cx_salv_data_error.                         "#EC NO_HANDLER

      ENDTRY.

      MODIFY gt_alv.

    ENDIF.

  ENDLOOP.

go_alv->display( ). " вызов экрана



PS:

1) gt_alv - таблица с данными для ALV

2)

DATA:   go_alv            TYPE REF TO cl_salv_table,
           go_columns        TYPE REF TO cl_salv_columns_table.


3) вместо col_positive вроде можно просто прописать число от 1 до 9.

вот как-то так....таким же образом и отдельную ячейку можно покрасить))

themax

#67
Цитата: insaf121 від Листопад 27, 2012, 02:56:14 ПП
Обьяви

DATA:   gc_events TYPE REF TO cl_salv_events_table.

И после  CREATE OBJECT gr_events.

gc_events = gc_alv_table->get_event( ).
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.


Здравствуйте уважаемые ABAPеры, в общем я сделал как вы и сказали, но чота у меня всё равно даблклик так и не срабатывает. Видимо я  всё равно что то не так делаю, как вы и сказали я объявил
DATA:   gc_events TYPE REF TO cl_salv_events_table.

вставил я это объявления в кучу объявлений всех моих классов.
затем идёт класс
class lcl_handle_events definition deferred.
data: gr_events type ref to lcl_handle_events.

class lcl_handle_events definition.
  public section.
    methods:
        on_double_click for event double_click of cl_salv_events_table
        importing row column.

endclass.                    "lcl_handle_events DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
class lcl_handle_events implementation.

  method on_double_click.
    perform double_click using row column.
  endmethod.                    "on_double_click

endclass.

затем идёт START-OF-SELECTION, затем идёт вывод таблички на экран с помощью класса gc_alv_table->display( ).
И после это я создаю объект и вставляю метод
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.

Затем у меня идёт форма даблклика и вызова транзакций по даблклику. Может подскажите что именно я не так делаю?

themax

#68
В общем я попробывал вставить
gc_events = gc_alv_table->get_event( ).
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.


До конца выполнения вывода таблички на экран, перед
gc_alv_table->display( ).

Даблклик стал отрабатывать и падать в дамп,  а мозгов как не хватало для решения это проблемки, так и щас не хватает. Может кто подскажет?! Буду весьма признателен.

insaf121

Вот пример для аналогии.


REPORT 121.


DATA:  BEGIN OF test_tabl OCCURS 1,
  SIGNAL type c,
  vtoroe(15) TYPE c,
  tretie(15) TYPE c
  .
DATA:  END   OF test_tabl.

FIELD-SYMBOLS: <test_tabl> like LINE OF test_tabl.

DATA: text TYPE string ,
      nomer TYPE n.

DATA: gc_layout     TYPE REF TO cl_salv_layout, "для варианта
      gc_alv_table  TYPE REF TO cl_salv_table,
      gc_columns    TYPE REF TO cl_salv_columns_table,
      gc_colwork    TYPE REF TO cl_salv_column_table,
      gc_display    TYPE REF TO cl_salv_display_settings,
      gc_events     TYPE REF TO cl_salv_events_table,
      gc_functions  TYPE REF TO cl_salv_functions
      .

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
*    CLASS-DATA:
*        lo_popup TYPE REF TO cl_salv_table.
    METHODS:

        on_double_click FOR EVENT double_click OF cl_salv_events_table
      IMPORTING row column,

    on_function_click
    FOR EVENT if_salv_events_functions~added_function
    OF cl_salv_events_table IMPORTING e_salv_function,


      on_link_click FOR EVENT link_click OF cl_salv_events_table
    IMPORTING row column .


ENDCLASS.                    "lcl_handle_events DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*---------------------------------------------------------------------*
* §5.2 implement the events for handling the events of cl_salv_table
*---------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.

  METHOD on_double_click. "Для двойного щелчка

    text = 'Вы выбрали'.
    nomer = row.
    CONCATENATE text  'строчку №' nomer 'и столбец' column INTO text SEPARATED BY space.
    MESSAGE text TYPE 'I' .

  ENDMETHOD.                    "on_double_click

  METHOD on_function_click. "Это для кнопок в заголовке

    CASE e_salv_function.
      WHEN 'EDIT'.

      WHEN 'ALL'.

    ENDCASE.
  ENDMETHOD.                    "on_function_click

  METHOD on_link_click. "Для вызова по ссылке
    CASE column.
      WHEN 'SIGNAL'.
        text = 'Отработка чек-бокса.'.
        MESSAGE text TYPE 'I' .


        read TABLE test_tabl ASSIGNING <test_tabl> INDEX  row.

        CASE <test_tabl>-SIGNAL.
          WHEN 'X'.
            <test_tabl>-SIGNAL = ' '.
          WHEN ' '.
            <test_tabl>-SIGNAL = 'X'.
          WHEN OTHERS.
        ENDCASE.

        gc_alv_table->refresh( ).

      WHEN 'TRETIE'.
        text = 'Ну и вызов чего-нибудь.'.
        MESSAGE text TYPE 'I' .
        call TRANSACTION 'ABAPDOCU'.
      WHEN OTHERS.
    ENDCASE.

  ENDMETHOD.                    "on_single_click


ENDCLASS.                    "lcl_handle_events IMPLEMENTATION

DATA: gr_events TYPE REF TO lcl_handle_events.


START-OF-SELECTION.

  DO 5 TIMES.
    test_tabl-SIGNAL = 'X'.
    test_tabl-vtoroe = sy-index * 2.
    test_tabl-tretie = 'Здесь будет ваша ссылка.'.
    append test_tabl.
  ENDDO.
  cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table CHANGING t_table = test_tabl[] ).

  gc_columns = gc_alv_table->get_columns( ).

*-Нажимаемый чекбокс одновременно является ссылкой
  gc_colwork ?= gc_columns->get_column( 'SIGNAL' ).
  gc_colwork->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).
  gc_colwork->set_long_text( 'CHECKBOX' ).


  gc_colwork ?= gc_columns->get_column( 'TRETIE' ).
  gc_colwork->set_cell_type( if_salv_c_cell_type=>hotspot ).
  gc_colwork->set_long_text( 'Ссылка на что-то' ).

  gc_events = gc_alv_table->get_event( ).

  CREATE OBJECT gr_events.

  SET HANDLER gr_events->on_link_click FOR gc_events.
  SET HANDLER gr_events->on_double_click FOR gc_events.


  gc_layout = gc_alv_table->get_layout( ).
  gc_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
  gc_layout->set_default('X'). "Вроде таким образом он будет помнить вариант по умолчанию который выбрал пользователь

  gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).



  gc_display = gc_alv_table->get_display_settings( ).
  gc_display->set_list_header( 'Тестовая таблица' ).


  gc_alv_table->display( ).


А по поводу вашей ошибки он говорит что параметр еще не присвоен.

themax

Уряяяя, получилось, оказывается я использовал две ссылки на один и тот же класс, поэтому он у меня и падал в дамп, убрал вторую ссылку и заработало, спасибо insaf121 за помощь.

Uukrul

Цитата: themax від Грудень 06, 2012, 08:04:58 ДП
спасибо insaf121 за помощь.
Под иконкой пользователя выбираешь сердечко и добавляешь человеку свое спасибо  8)

Rpl

Всем доброго времени суток!

Uukrul , большое спасибо за тему, часто пользуюсь :)

У меня следующая ситуация:
Использую описанный класс для вывода данных, и в "top of page" вывожу критерии выбора селекционного экране. Если в поле многократного выбора было внесено некое большое количество параметров, то этот "top of page" занимает весь экран и нужно его вручную уменьшить. Можно ограничивать количество выводимых строк в "top of page" или вручную изменять высоту. Конечно, это не так уж критично.
Но все же, есть ли возможность программно управлять высотой блока "top of page"?
Спасибо!

Uukrul

Цитата: Rpl від Вересень 19, 2013, 10:25:55 ДП
Но все же, есть ли возможность программно управлять высотой блока "top of page"?
Как вы туда вообще попадаете? У меня почему-то в свое время

    on_top_of_page
      FOR EVENT if_salv_events_list~top_of_page OF cl_salv_events_table
      IMPORTING r_top_of_page page table_index.

-------------------

  gc_events = gc_alv_table->get_event( ).
  CREATE OBJECT gr_events.

  SET HANDLER gr_events->on_top_of_page FOR gc_events.


ни при каких условиях не хотело попадать в это событие  :-\

Rpl

#74
Цитата: Uukrul від Вересень 19, 2013, 11:55:38 ДП
Как вы туда вообще попадаете?

Сори, ошибочка:-[ :-[ ... вывожу в "top of list"


DATA: lr_header     TYPE REF TO cl_salv_form_layout_grid,
          lr_flow         TYPE REF TO cl_salv_form_layout_flow.

CREATE OBJECT lr_header.

      lr_flow = lr_header->create_flow( row = sy-index   column  = 1 ).
      r_flow->create_text( text = 'text' ).

      gc_salv_table->set_top_of_list( lr_header ).