Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => Тема розпочата: A. від Липень 10, 2013, 10:45:36 ДП

Назва: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 10:45:36 ДП
Всем добрый день.

Хочу поместить на подэкран в закладке ALV Grid. Для основного экрана создан элемент tabstrip, созданы области подэкранов, созданы сами подэкраны, логика для них и для основного экрана. Делаю как обычно - создание контейнера, потом самого грида, потом set_table_for_first_display. Но ничего не выводится на подэкран! Вообще ничего.

Может кто сталкивался с такой ситуацией.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 11:31:46 ДП
Создание ALV Grid выполняется в PBO подэкрана. Сейчас попробовал с помощью аналогичного кода создать ALV Grid на основном экране - все создается.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Липень 10, 2013, 01:04:24 ПП
Цитата: A. від Липень 10, 2013, 10:45:36 ДП
Хочу поместить на подэкран в закладке ALV Grid. Для основного экрана создан элемент tabstrip, созданы области подэкранов, созданы сами подэкраны, логика для них и для основного экрана. Делаю как обычно - создание контейнера, потом самого грида, потом set_table_for_first_display. Но ничего не выводится на подэкран! Вообще ничего.
Делал и не раз, и не один даже грид на подэкране размещал а до 4, а вообще в целом на кажется закладках шести было штук 20 гридов и все работало. Вопрос первый, контейнер создался? Есть подозрение что контейнер не создан на подэкране, т.е. при создании связка подэкрана с элементом контейнера не правильно определена.

Цитата: A. від Липень 10, 2013, 10:45:36 ДП
Может кто сталкивался с такой ситуацией.
Нет, у меня все работало.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 01:13:27 ПП
Логика основного (5001) экрана:


process before output.
  module pbo_5001.
  call subscreen ss_5010 including sy-repid '5010'.
  call subscreen ss_5020 including sy-repid '5020'.

process after input.
  module pai_exit_5001 at exit-command.
  module pai_5001.
  call subscreen ss_5010.
  call subscreen ss_5020.


Логика подэкрана (5010)6


process before output.
  module pbo_5010.

process after input.
  module pai_5010.


Модуль pbo_5010:

module pbo_5010 output.
  call method gcl_screen_5010->pbo.
endmodule.                 " PBO_5010  OUTPUT


Метод pbo:

  method pbo.

    data:
      ls_layout type lvc_s_layo.

    ls_layout-zebra = 'X'.
    ls_layout-cwidth_opt = 'X'.
    ls_layout-no_totline = 'X'.
    ls_layout-no_toolbar = 'X'.

    if me->screen eq '5010' and g_custom_cont_1 is initial.

      call method build_fieldcat.


      create object g_custom_cont_1
        exporting
          container_name              = 'ALV_GRID_5010'
          repid                       = sy-repid
          dynnr                       = sy-dynnr
        exceptions
          cntl_error                  = 1
          cntl_system_error           = 2
          create_error                = 3
          lifetime_error              = 4
          lifetime_dynpro_dynpro_link = 5
          others                      = 6.

      create object g_alv_grid_1
        exporting
          i_parent          = g_custom_cont_1
        exceptions
          error_cntl_create = 1
          error_cntl_init   = 2
          error_cntl_link   = 3
          error_dp_create   = 4
          others            = 5.

      call method g_alv_grid_1->set_table_for_first_display
        exporting
          is_layout                     = ls_layout
        changing
          it_outtab                     = gt_screen_tab_1[]
          it_fieldcatalog               = me->fieldcat[]
        exceptions
          invalid_parameter_combination = 1
          program_error                 = 2
          too_many_lines                = 3
          others                        = 4.

    endif.


Описание переменных:

data: g_custom_cont_1 type ref to cl_gui_custom_container,
      g_alv_grid_1 type ref to cl_gui_alv_grid.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 01:16:30 ПП
Посмотрел scn.sap.com - там всё по этому образу и подобию сделано.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 01:17:49 ПП
Пробовал без классов, вставить код непосредственно в модуль pbo_5010, помещал его в pbo основного экрана - без толку. Может какое обновление надо делать?
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Липень 10, 2013, 01:19:30 ПП
Цитата: A. від Липень 10, 2013, 01:16:30 ПП
Посмотрел scn.sap.com - там всё по этому образу и подобию сделано.
Вот тут вот проверьте контейнер создан и еще проверьте на подэкране элемент контейнера так же называется ALV_GRID_5010? Там же связка идет через это имя элемента на подэкране.

      create object g_custom_cont_1
        exporting
          container_name              = 'ALV_GRID_5010'
          repid                       = sy-repid
          dynnr                       = sy-dynnr
        exceptions
          cntl_error                  = 1
          cntl_system_error           = 2
          create_error                = 3
          lifetime_error              = 4
          lifetime_dynpro_dynpro_link = 5
          others                      = 6.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 01:25:56 ПП
Создаётся, sy-subrc во всех вызовах 0, имя задано верно.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Липень 10, 2013, 01:29:18 ПП
Цитата: A. від Липень 10, 2013, 01:17:49 ПП
Пробовал без классов, вставить код непосредственно в модуль pbo_5010, помещал его в pbo основного экрана - без толку. Может какое обновление надо делать?
Нет, обновления вряд ли поможет. Все таки я думаю, что проблема со связкой объектов. Как вариант делаем один экран. на нем подэкран и там пробуем вывести алв.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Липень 10, 2013, 01:29:45 ПП
Цитата: A. від Липень 10, 2013, 01:25:56 ПП
Создаётся, sy-subrc во всех вызовах 0, имя задано верно.
Можно показать экраны картинками с именами элементов?
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 01:34:35 ПП
Скрины экранов.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 10, 2013, 01:55:40 ПП
Фух. Разобрался. При создании контейнера нужно указывать не номер подэкрана, на котором он расположен, а номер основного экрана, в данном случае правильно указывать 5001.

:-)
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Липень 10, 2013, 03:07:09 ПП
Ну я всегда вот так объявлял контейнеры (т.е. без указания программы и экрана):

  create object ref_container_0250
    exporting
      container_name              = 'CONTROL_0250'
    exceptions
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      others                      = 6.

Поэтому с такой проблемой никогда похоже и не сталкивался.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 22, 2013, 05:13:53 ПП
Всем добрый вечер.

Ещё одна проблема с ALV Grid в подэкране - не видно стандартную панель инструментов ALV. Как её вернуть? Вот такой код заведует созданием объектов:

      call method me->build_fieldcat.


      create object gr_custom_cont_1
        exporting
          container_name = 'ALV_GRID_5010'
          repid          = sy-repid
          dynnr          = '5001'.

      create object gr_alv_grid_1
        exporting
          i_parent = gr_custom_cont_1.

      call method gr_alv_grid_1->set_table_for_first_display
        exporting
          is_layout       = ls_layout
        changing
          it_outtab       = gt_screen_tab_1[]
          it_fieldcatalog = me->fieldcat[].

Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Липень 23, 2013, 02:41:55 ДП
Цитата: A. від Липень 22, 2013, 05:13:53 ПП
Ещё одна проблема с ALV Grid в подэкране - не видно стандартную панель инструментов ALV. Как её вернуть? Вот такой код заведует созданием объектов:
Ну никогда с такой проблемой не сталкивался, но может попробуешь вызвать создание всего набора так:

      create object gr_custom_cont_1
        exporting
          container_name = 'ALV_GRID_5010'.

Ну контейнер же уже на каком-то экране размещен, зачем принудительно программу и экран еще передавать? Что-то есть мысль что он появляется не там где надо из-за такого вызова. Я по своим программам посмотрел, нигде явно программу и экран не задают при создании контейнера, всегда хватало типа такого объявления:

  create object ref_container_0200
    exporting
      container_name              = 'CONTROL_0200'
    exceptions
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      others                      = 6.
  if sy-subrc <> 0. message a001 with 'REF_CONTAINER_0200'. endif.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 23, 2013, 08:36:47 ДП
Попробовал без указания имени программы и номера экрана. Безрезультатно.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Липень 23, 2013, 08:42:30 ДП
Ну в общем как всегда — стоит только спросить :)
*    ls_layout-no_toolbar = 'X'.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Липень 23, 2013, 10:27:26 ДП
Цитата: A. від Липень 23, 2013, 08:42:30 ДП
Ну в общем как всегда — стоит только спросить :)
*    ls_layout-no_toolbar = 'X'.
Ну ты лейаут не показывал, так что это было бы сложно предположить  8)
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: A. від Серпень 07, 2013, 05:30:38 ПП
Всем добрый вечер.

Сделал кнопку, которая в LOOP AT SCREEN скрывает некоторые поля. Ниже этих полей находится ALV Grid. При сокрытии элементов область, занятая ALV Grid, при полноэкранном режиме, не растягивается на полный экран, а просто поднимается вверх, образуя под собой пустое место.

Можно как-либо сделать так, чтобы при сокрытии полей ALV Gird также заново перерисовывался на все свободное место экрана?

Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Серпень 13, 2013, 11:45:29 ПП
Цитата: A. від Серпень 07, 2013, 05:30:38 ПП
Можно как-либо сделать так, чтобы при сокрытии полей ALV Gird также заново перерисовывался на все свободное место экрана?
Поменять местами наверное, т..е. поля поставить вверху на ALV. тогда при их скрытии должно занять все пространство. Как вариант поиграться с размещением полей и ALVтаблицы, на разных подэкранах.
Назва: Re: ALV Grid не показывается на подэкране закладки
Відправлено: Uukrul від Вересень 02, 2013, 10:03:08 ДП
Цитата: A. від Серпень 07, 2013, 05:30:38 ПП
Можно как-либо сделать так, чтобы при сокрытии полей ALV Gird также заново перерисовывался на все свободное место экрана?
В общем тут пришлось самому нечто похоже делать, когда внизу есть ALV и надо чтобы верхняя таблица перерисовывалась на весь экран, когда ALV-таблица скрывается. В общем это все можно реализовать, только нужно использовать для вывода ALV-таблицы динамический контейнер, кода приблизительно такой:

DATA:
      ref_container_0550    type ref to cl_gui_docking_container,
      ref_alv_0550          type ref to cl_gui_alv_grid.

  create object ref_container_0550
    exporting
      side   = cl_gui_docking_container=>dock_at_bottom
      ratio  = 50
    exceptions
      others = 1.

  create object ref_alv_0550
    exporting
      i_parent = ref_container_0550.

* Формирование каталога полей для таблицы
*
* -------------------

  call method ref_alv_0550->set_table_for_first_display
    exporting
      is_layout       = gs_layout
      is_variant      = gs_variant
    changing
      it_sort         = gt_sort
      it_fieldcatalog = gt_fldcat
      it_outtab       = gt_eban_list.

Ну и далее для скрытия таблицы вызвать:

call method ref_container_0550->free.