Автор Тема: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран  (Прочитано 183355 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Но все же, есть ли возможность программно управлять высотой блока "top of page"?
Самое интересное что для ФМ: REUSE_ALV_GRID_DISPLAY есть параметр: I_HTML_HEIGHT_TOP TYPE, который собственно говоря управляет высотой заголовка. Внутри там они получают доступ к сплитеру который отделяет таблицу от html-заголовка. Куда стоит наверное копать, так это получить у CL_SALV_TABLE ссылку на контейнер, в этом контейнере должны быть 3 элемента, собственно сама таблица, разделитель (объект типа сплитер) и область для вывода html заголовка. Теоретически наверное можно найти сам контейнер и получить доступ к объекту разделителя. Можно наверное посмотреть как это делается в REUSE_ALV_GRID_DISPLAY, там по факту тоже создается объектная таблица.

PS: Быстро это дело, сам не нашел, но если вы найдете, то буду рад прочитать как это сделать  8)

Оффлайн Rpl

  • Newbie
  • *
  • Сообщений: 7
  • Репутация: +0/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Можно наверное посмотреть как это делается в REUSE_ALV_GRID_DISPLAY, там по факту тоже создается объектная таблица.

Ковыряясь в REUSE_ALV_GRID_DISPLAY и классах наткнулся на:
Код: You are not allowed to view links. Register or Login
    DATA: lo_grid  TYPE REF TO cl_gui_alv_grid,
          f(14)    VALUE 'SET_ROW_HEIGHT'.

* Get global ALV information from buffer
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.
* Set size of ALV header, body & footer control
                                         "<0648171
    CALL METHOD lo_grid->parent->parent->(f)
      EXPORTING
        id     = 1
        height = 50.

    CALL METHOD lo_grid->refresh_table_display.

Высота топ листа меняется, но только по событию :-\.
Если перед
Код: You are not allowed to view links. Register or Login
gc_salv_table->display( )., то дамп

PS: Уже подумываю, что придется переписывать на cl_gui_alv_grid :'(

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
PS: Уже подумываю, что придется переписывать на cl_gui_alv_grid :'(
Ну как вариант, сделать наследника, в нем переопределить метод display и там вызвать уже изменение ширины, но после отработки родительского метода. Теоретически будет быстрее, чем переписывать все на другой класс.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
родительского метода. Теоретически будет быстрее, чем переписывать все на другой класс.
Хотя у меня тут возник по ходу один интересный вариант, проверю на выходных и если получится выложу так сказать таблетку  8)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Хотя у меня тут возник по ходу один интересный вариант, проверю на выходных и если получится выложу так сказать таблетку  8)
Не прошло, изоляция внутри классов, поломала всю малину через расширения стандартного класса. Так что наследование осталось как вариант. Хотя конечно можно еще поискать.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Да уж, в общем это из разряда - я хренею с этого SAP-а и ABAP-а, полез копать тут этот класс, копал и выкопал, что в итоге, он использует для своей работы при полном экране вызов ФМ: REUSE_ALV_GRID_DISPLAY, но при этом параметр I_HTML_HEIGHT_TOP, пацаны закоментировали, так что как бы мы тут класс не крутили, заголовком порулить не получиться.

Если пойти еще дальше, то в модуле LSLVC_FULLSCREENF01, со строки 1469 есть такая подпрограмма:
Код: You are not allowed to view links. Register or Login
*&--------------------------------------------------------------------*
*&      Form  set_salv_form_content_tol
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
form set_salv_form_content_tol.

===<вырезал лишнее>====

  gt_grid-r_form_tol->set_content( lr_content ).
  l_height = gt_grid-r_form_tol->get_height( ).
  gt_grid-r_form_tol->display( ).

  check gt_grid-splitter is not initial.

  if i_grid_settings-coll_top_p is initial and
    gt_grid-i_callback_html_top_of_page is initial and
    gt_grid-i_callback_html_end_of_list is initial.
    gt_grid-splitter->set_visible( abap_true ).
    call method gt_grid-splitter->set_row_mode
      exporting
        mode = cl_gui_splitter_container=>mode_absolute.
    if i_html_height_top is initial.                        "Y7AK007065
      call method gt_grid-splitter->set_row_height
        exporting
          height = l_height
          id     = 1.
    endif.
  endif.

endform.                    "set_salv_form_content_tol
В общем этот код получает величину заполненной области и соответственно задает величину сплитера и далее, после кода check gt_grid-splitter is not initial. код дальше игнорируется. Так вот можно написать неявный энхансмент в конце этого блока и фактически написать что-то типа:
Код: You are not allowed to view links. Register or Login
    call method gt_grid-splitter->set_row_mode
      exporting
        mode = cl_gui_splitter_container=>mode_absolute.
    if i_html_height_top is initial.                        "Y7AK007065
      call method gt_grid-splitter->set_row_height
        exporting
          height = <нужная нам величина>
          id     = 1.
    endif.

При этом сделать можно так, завести параметр и перед вызовом gc_salv_table->display( ) поставить в этом параметр например наше значение, пусть будет 50. А в код получить значение этого параметра, если оно не равно 0, тогда вызвать приведенный выше код по установке высоты заголовка. Само собой после этого параметр через в памяти обнулить. Таким образом, при задании параметра будет выставляться нужная нам величина заголовка. А кто про параметр не знает, для того будет все отрабатывать как обычно, т.е. в энхансменте код должен выглядеть типа так:
Код: You are not allowed to view links. Register or Login
GET PARAMETR  'ZZ_HEADER' VALUE zz_new_height.
IF zz_new_height <> space.
    SET PARAMETR 'ZZ_HEADER' VALUE space.
    call method gt_grid-splitter->set_row_mode
      exporting
        mode = cl_gui_splitter_container=>mode_absolute.
    if i_html_height_top is initial.                        "Y7AK007065
      call method gt_grid-splitter->set_row_height
        exporting
          height = zz_new_height
          id     = 1.
    endif.
endif.

Должно сработать процентов на 99 без всяких проблем. Вообще-то если бы можно было в классе попасть в событие i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE', которое тоже закомментировано при вызове, то там бы вообще проблем небыло, так как в этом событии можно просто было бы написать приведенный выше вами код и все тоже работало бы:
Код: You are not allowed to view links. Register or Login
  DATA: lo_grid  TYPE REF TO cl_gui_alv_grid,
      f(14)    VALUE 'SET_ROW_HEIGHT'.

* Get global ALV information from buffer
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.
* Set size of ALV header, body & footer control
  BREAK-POINT.                                              "<0648171
  CALL METHOD lo_grid->parent->parent->(f)
    EXPORTING
      id     = 1
      height = 5.
В общем не докрутили они этот класс немного. Извечный вопрос, зачем комментировать вызов, ну добавьте в класс эти переменные, надо кому, будут использовать, не надо... будут стоять в значениях по умолчанию. В общем извечный вопрос, где была голова  8)

PS: Если решите использовать энхансмент, отпишитесь о результате. А впрочем пишите в любом случае как решили делать.
« Последнее редактирование: Сентябрь 21, 2013, 01:33:16 am от Uukrul »

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
PS: Если решите использовать энхансмент, отпишитесь о результате. А впрочем пишите в любом случае как решили делать.
Нет, там все глухо. Код реализующий ФМ: REUSE_ALV_GRID_DISPLAY относится к: "Object FUGR SLVC_FULLSCREEN is part of the central basis and therefore cannot be enhanced", короче переходите на использование или прямого вызова REUSE_ALV_GRID_DISPLAY, что чуть больше руками написать, но все зато будет работать или же на использование класса cl_gui_alv_grid Лично я бы просто использовал REUSE_ALV_GRID_DISPLAY и не лохматил бабушку  8) а этот класс использовать можно если надо где-то что-то быстро вывести без особых изысков, типа диалоговое окошечко, в котором что-то быстро показать и закрыть.

Оффлайн Rpl

  • Newbie
  • *
  • Сообщений: 7
  • Репутация: +0/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Uukrul, БОЛЬШОЕ СПАСИБО за потраченное время и подробное разъяснение!!!!

Буду переписывать на cl_gui_alv_grid, не хочу создавать филдкаталог :)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Буду переписывать на cl_gui_alv_grid, не хочу создавать филдкаталог :)
А я как-то все руками по привычке, хотя руками это тоже вопрос еще, так как просто копирую из примеров своих программ, так что у меня этот процесс минут 15 может занимает  8)

Оффлайн insaf121

  • Newbie
  • *
  • Сообщений: 25
  • Репутация: +1/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Здравствуйте. Недавно столкнулся с двумя проблемами для класса salv.

1. Если выводить в отчет порядка 120 тысяч записей, то выводит он довольно шустро, но если к отчету который уже на экране попробовать применить фильтрацию по каким-нибудь полям( особенно когда список значений) он начинает работать очень медленно :(
2. В этом же отчете когда бухи пробуют сделать общую сумму он выдает что значение переполнено( поле типа bseg-wrbtr ).

Вопрос:
1. Нет ли способа как-нибудь ускорить это дело? Например буферизация в память или что-то вроде этого.
2. Есть ли способ подавить это сообщение и выводить промежутки.
Например у нас сумма 137 миллиардов, а вывести 99 миллиардов и 38 миллиардов.  Без группировки по полям.
Заранее спасибо.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
1. Нет ли способа как-нибудь ускорить это дело? Например буферизация в память или что-то вроде этого.
Ну там работает обычный ФМ REUSE_ALV_GRID поэтому у меня вообще после 60-70 тысяч оно часто ничего не выводит :-) а у вас 120 000 и даже как говорите шустро работает.

You are not allowed to view links. Register or Login
2. Есть ли способ подавить это сообщение и выводить промежутки.
Например у нас сумма 137 миллиардов, а вывести 99 миллиардов и 38 миллиардов.  Без группировки по полям.
Ну это поле суммы, а оно привязано к валюте. А поэтому читаем: You are not allowed to view links. Register or Login это как оно все организовано. Думаю что без группировки вряд ли выйдет, так как там все автоматически работает и вмешаться вряд ли выйдет.

Оффлайн insaf121

  • Newbie
  • *
  • Сообщений: 25
  • Репутация: +1/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Спасибо за ответ.
По предложенному Вами варианту думаю лучше не стоит   :) пусть лучше в excel выводят и там суммируют если им так нужно  ;D

Оффлайн insaf121

  • Newbie
  • *
  • Сообщений: 25
  • Репутация: +1/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Кстати есть все таки способ использовать функциональность по добавлению новой кнопки.

Код: You are not allowed to view links. Register or Login
write 'любой текст'.  "Нужен нам вроде для событий экрана, иначе defaukt_screen будет работать не корректно.

TRY.
cl_salv_table=>factory(
EXPORTING
r_container = cl_gui_container=>default_screen                       " Нужно объявить вот это.
IMPORTING
r_salv_table = go_alv
CHANGING
t_table = gt_data ).
CATCH cx_salv_msg .
MESSAGE 'Ошибка при создании ALV' TYPE 'E'.
ENDTRY.

go_functions->add_function(                                               "сама функциональность
EXPORTING
NAME = 'ADDFUNC'
icon = '@01@'
text = 'ДопКнопка'
tooltip = 'Всплывающая подсказка'
POSITION = if_salv_c_function_position=>right_of_salv_functions ).

« Последнее редактирование: Март 19, 2014, 06:36:23 am от insaf121 »

Оффлайн dominirovanie

  • Newbie
  • *
  • Сообщений: 2
  • Репутация: +0/-0
  • Пол: Женский
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Ну, во-первых, спасибо за супер ветку)
А во-вторых, возник вот какой вопрос:
На экране отображаются мои данные из внутренней таблицы, я выделяю строки, прохожусь по выделенным строкам, нажимаю кнопку из гуи-статуса "удалить" , отрабатывает написанная обработка, и всё нормально работает, строки удаляются из внутренней таблицы, далее
Код: You are not allowed to view links. Register or Login
gc_alv_table->refresh( ).
экран обновляется, данные верные.
НО в случае когда после отображения данных я нажимаю на стандартную кнопку гуи-статуса "Фильтр", фильтрую записи по какому-то полю, фильтр срабатывает, оставляя, например, 4 записи. из получившегося списка я выделяю строки (например, две), нажимаю как и прежде "удалить", всё нормально удаляется из внутренней таблицы, НО после обновления экрана передо мной список из 4х строк, среди которых две строки, которые не должны попадать(не подходят по условию фильтра); то есть мои две строки, которые оттуда удалились, заменились на следующие за ними во внутренней таблице.
Собственно, вопрос в том, как это исправить, чтобы фильтрация срабатывала как надо. (кстати, думается мне, что и сортировка будет глюк давать)
Надеюсь на ответы  :)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Собственно, вопрос в том, как это исправить, чтобы фильтрация срабатывала как надо. (кстати, думается мне, что и сортировка будет глюк давать)
Ну попробуйте вызвать обновление передав методу refresh параметр REFRESH_MODE = IF_SALV_C_REFRESH=>FULL. Возможно поможет. Или более сложный вариант:
1. Вызываете метод GET_FILTERS, который вернет вам переменную VALUE типа  CL_SALV_FILTERS. Это класс управления фильтрами. Вот уже у этого объекты VALUE будет метод REPAIR, который теоретически восстановит фильтрацию. Точнее там сначала надо бы вызвать IS_FILTER_DEFINED, типа проверить задана ли фильтрация, а уже после дергать REPAIR.

Ну надеюсь если что-то поможет, напишите.
« Последнее редактирование: Август 26, 2014, 04:13:07 pm от Uukrul »

Оффлайн dominirovanie

  • Newbie
  • *
  • Сообщений: 2
  • Репутация: +0/-0
  • Пол: Женский
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Ну попробуйте вызвать обновление передав методу refresh параметр REFRESH_MODE = IF_SALV_C_REFRESH=>FULL. Возможно поможет. Или более сложный вариант:
1. Вызываете метод GET_FILTERS, который вернет вам переменную VALUE типа  CL_SALV_FILTERS. Это класс управления фильтрами. Вот уже у этого объекты VALUE будет метод REPAIR, который теоретически восстановит фильтрацию. Точнее там сначала надо бы вызвать IS_FILTER_DEFINED, типа проверить задана ли фильтрация, а уже после дергать REPAIR.

Ну надеюсь если что-то поможет, напишите.
Спасибо огромное  :) первый вариант помог

Оффлайн Лисенок

  • Newbie
  • *
  • Сообщений: 2
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Подскажите, пожалуйста, можно ли как-нибудь повесить свою обработки на кнопки "светофора" (назад)?
пробовала в своем gue-статусе назвать их по другому и обработать, но отрабатывает стандарт ((.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Подскажите, пожалуйста, можно ли как-нибудь повесить свою обработки на кнопки "светофора" (назад)?
пробовала в своем gue-статусе назвать их по другому и обработать, но отрабатывает стандарт ((.
Ну почему нельзя.. можно если имеются в виду кнопки из картинки ниже, то вот в этом примере You are not allowed to view links. Register or Login, сделал свой статус только назвал кнопки в статусе по своему, рисунок PF01.png и все заработало,при нажатии на кнопку выхода попадаю в обработчик из примера.
Код: You are not allowed to view links. Register or Login
  METHOD on_user_command.
    DATA: l_index LIKE sy-tabix,
          lt_rows TYPE salv_t_row.

    BREAK-POINT.
    CASE e_salv_function.
      WHEN 'BTN_1'.
*       Нажата первая кнопка

        ENDLOOP.

      WHEN 'BTN_2'.
*       Нажата вторая кнопка
    ENDCASE.
  ENDMETHOD.                    "on_user_command
Ну и соответственно выхода из окна программы не происходит, т.е. перехват нажатия произошел, при этом на панели задач, второй кнопки выхода нет. Так что работает.

Оффлайн Лисенок

  • Newbie
  • *
  • Сообщений: 2
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Спасибо, сработало ))

Оффлайн maker2k

  • Newbie
  • *
  • Сообщений: 3
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYears
Подскажите, как переопределить стандартный экспорт в Excel?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Подскажите, как переопределить стандартный экспорт в Excel?
Ну как, сделайте свою кнопку экспорта и напишите код выгрузки в Excel

Оффлайн Kastain

  • Newbie
  • *
  • Сообщений: 3
  • Репутация: +0/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYears
Подскажите, как в top_of_list настроить фиксированную ширину выводимых колонок для всех строк.
Сей час получается что ширина каждой колонки равна ширине самой длинной из всех строк.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Подскажите, как в top_of_list настроить фиксированную ширину выводимых колонок для всех строк.
Сей час получается что ширина каждой колонки равна ширине самой длинной из всех строк.
Как-то так наверное.
Код: You are not allowed to view links. Register or Login
DATA: gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table.

* Получим каталог полей таблицы
  gc_columns = gc_alv_table->get_columns( ).
* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'SEL' ).

  gc_colwork->SET_OUTPUT_LENGTH( <размер колонки в знаках>  ).

Оффлайн Kastain

  • Newbie
  • *
  • Сообщений: 3
  • Репутация: +0/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYears
Не то.
Меня именно TOP_OF_LIST интересует.
Вложил файл, что сей час получается. А мне надо чтобы в строках не сливались колонки.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Не то.
Меня именно TOP_OF_LIST интересует.
Вложил файл, что сей час получается. А мне надо чтобы в строках не сливались колонки.
Ну если вы хотите сами формировать заголовок, то это вам читать и искать правила использования класса cl_dd_document совместно с ALV-grid, там можно все что надо отрисовать.

Sapforum.Biz