Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: A. от Июль 10, 2013, 10:45:36 am
-
Всем добрый день.
Хочу поместить на подэкран в закладке ALV Grid. Для основного экрана создан элемент tabstrip, созданы области подэкранов, созданы сами подэкраны, логика для них и для основного экрана. Делаю как обычно - создание контейнера, потом самого грида, потом set_table_for_first_display. Но ничего не выводится на подэкран! Вообще ничего.
Может кто сталкивался с такой ситуацией.
-
Создание ALV Grid выполняется в PBO подэкрана. Сейчас попробовал с помощью аналогичного кода создать ALV Grid на основном экране - все создается.
-
Хочу поместить на подэкран в закладке ALV Grid. Для основного экрана создан элемент tabstrip, созданы области подэкранов, созданы сами подэкраны, логика для них и для основного экрана. Делаю как обычно - создание контейнера, потом самого грида, потом set_table_for_first_display. Но ничего не выводится на подэкран! Вообще ничего.
Делал и не раз, и не один даже грид на подэкране размещал а до 4, а вообще в целом на кажется закладках шести было штук 20 гридов и все работало. Вопрос первый, контейнер создался? Есть подозрение что контейнер не создан на подэкране, т.е. при создании связка подэкрана с элементом контейнера не правильно определена.
Может кто сталкивался с такой ситуацией.
Нет, у меня все работало.
-
Логика основного (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.
-
Посмотрел scn.sap.com - там всё по этому образу и подобию сделано.
-
Пробовал без классов, вставить код непосредственно в модуль pbo_5010, помещал его в pbo основного экрана - без толку. Может какое обновление надо делать?
-
Посмотрел 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.
-
Создаётся, sy-subrc во всех вызовах 0, имя задано верно.
-
Пробовал без классов, вставить код непосредственно в модуль pbo_5010, помещал его в pbo основного экрана - без толку. Может какое обновление надо делать?
Нет, обновления вряд ли поможет. Все таки я думаю, что проблема со связкой объектов. Как вариант делаем один экран. на нем подэкран и там пробуем вывести алв.
-
Создаётся, sy-subrc во всех вызовах 0, имя задано верно.
Можно показать экраны картинками с именами элементов?
-
Скрины экранов.
-
Фух. Разобрался. При создании контейнера нужно указывать не номер подэкрана, на котором он расположен, а номер основного экрана, в данном случае правильно указывать 5001.
:-)
-
Ну я всегда вот так объявлял контейнеры (т.е. без указания программы и экрана):
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.
Поэтому с такой проблемой никогда похоже и не сталкивался.
-
Всем добрый вечер.
Ещё одна проблема с 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[].
-
Ещё одна проблема с 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.
-
Попробовал без указания имени программы и номера экрана. Безрезультатно.
-
Ну в общем как всегда — стоит только спросить :)
* ls_layout-no_toolbar = 'X'.
-
Ну в общем как всегда — стоит только спросить :)
* ls_layout-no_toolbar = 'X'.
Ну ты лейаут не показывал, так что это было бы сложно предположить 8)
-
Всем добрый вечер.
Сделал кнопку, которая в LOOP AT SCREEN скрывает некоторые поля. Ниже этих полей находится ALV Grid. При сокрытии элементов область, занятая ALV Grid, при полноэкранном режиме, не растягивается на полный экран, а просто поднимается вверх, образуя под собой пустое место.
Можно как-либо сделать так, чтобы при сокрытии полей ALV Gird также заново перерисовывался на все свободное место экрана?
-
Можно как-либо сделать так, чтобы при сокрытии полей ALV Gird также заново перерисовывался на все свободное место экрана?
Поменять местами наверное, т..е. поля поставить вверху на ALV. тогда при их скрытии должно занять все пространство. Как вариант поиграться с размещением полей и ALVтаблицы, на разных подэкранах.
-
Можно как-либо сделать так, чтобы при сокрытии полей 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.