Posted: Sun Mar 15, 2009 6:00 am Post subject: Как отобразить внутр. таблицу?
Доброго времени суток.
не получается отобразить внутреннюю таблицу с запихнутыми туда данными из разных таблиц. Вывести в экран через контейнер.
короче, запарился уже. "не волшебник, только учусь".
Скажите что делать, люди, help.
Как заставить работать этот отчет?
Code:
REPORT Z_ALV_TEST1.
*
data: begin of tab_vt occurs 0,
citf like spfli-cityfrom,
citt like spfli-cityto,
pay like sflight-paymentsum,
end of tab_vt.
*
DATA: OK_CODE LIKE SY-UCOMM,
tabs type table of tab_vt,
G_CONTAINER TYPE SCRFNAME VALUE 'CONT',
GRID1 TYPE REF TO CL_GUI_ALV_GRID,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
*
SELECT * FROM spfli into table tabs.
select * from sflight into table tab
where connid = spfli-connid.
endselect.
endselect.
*
CALL SCREEN 100.
*
MODULE PBO OUTPUT.
SET PF-STATUS 'MAIN100'.
IF G_CUSTOM_CONTAINER IS INITIAL.
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING CONTAINER_NAME = G_CONTAINER.
CREATE OBJECT GRID1
EXPORTING I_PARENT = G_CUSTOM_CONTAINER.
CALL METHOD GRID1->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING I_STRUCTURE_NAME = 'SFLIGHT'
CHANGING IT_OUTTAB = tabs.
ENDIF.
ENDMODULE.
*
MODULE PAI INPUT.
call method cl_gui_cfw=>dispatch.
CASE OK_CODE.
WHEN 'EXIT'.
PERFORM EXIT_PROGRAM.
WHEN OTHERS.
ENDCASE.
CLEAR OK_CODE.
ENDMODULE.
*
FORM EXIT_PROGRAM.
CALL METHOD G_CUSTOM_CONTAINER->FREE.
CALL METHOD CL_GUI_CFW=>FLUSH.
LEAVE PROGRAM.
ENDFORM.
Age: 180 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Sun Mar 15, 2009 10:44 am Post subject:
1) Вы на 100 экране создали Custom Control с именем CONT?
2) Нужно определить тип, а не data
Code:
TYPES: BEGIN OF tab_vt,
citf LIKE spfli-cityfrom,
citt LIKE spfli-cityto,
pay LIKE sflight-paymentsum,
END OF tab_vt.
3) C селектом у вас все плохо.
нужно например так
Code:
SELECT spfli~cityfrom spfli~cityto sflight~paymentsum
INTO TABLE tabs
FROM spfli
INNER JOIN sflight ON sflight~connid = spfli~connid.
4) Вам нужно построить Field catalog типа tab_vt и передать его параметром
CALL METHOD grid1->set_table_for_first_display
EXPORTING
IT_FIELDCATALOG = gs_fc
Использование полей струкруры i_structure_name = 'SFLIGHT' недостаточно.
hello! Благодарствую за ответы.
После некоторых преобразований всё вроде начинает "вставать на места".
Но, требует тип tab_vt. А всмысле как тип? Это же внутрянка.
tabs это внутреннняя таблица.. или скорее всего "прозрачная". tabs используется для добавления во внутреннюю таблицу вызванных селектом столбцов.
... что-то подзапутался ...
товарищи программисты, скажите, что не так делаю... и как надо.
и
в код вписал коментарии. отругайте если что не так.
Code:
tables: spfli, sflight.
*
data: begin of tab_vt occurs 0, " создаем внутреннюю таблицу, добавляем в неё столбцы разных таблиц.
citf like spfli-cityfrom,
citt like spfli-cityto,
pay like sflight-paymentsum,
end of tab_vt.
DATA: OK_CODE LIKE SY-UCOMM, " сод связи с кустом-контрол
tabs type table of tab_vt, " задаем тип переменной "tabs" равный таблице tab_vt. Тут выдает ошибку "The type "TAB_VT" uncnown".
G_CONTAINER TYPE SCRFNAME VALUE 'CONT', " зазаем имя контейнера.
GRID1 TYPE REF TO CL_GUI_ALV_GRID, " задаем ALV тип для переменной.
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER. " тут наверное гуи для контейнера.
select-options:
cid for sflight-connid. " выборка по значениям "sflight-connid"
*
start-of-selection.
*
select * from spfli where connid in cid. " присвоение переменной выборки к столбцу таблицыю
*
select spfli~cityfrom spfli~cityto sflight~paymentsum " выбор таблиц/столбцов.
into table tabs " запихивая в tabs которая равна tab_vt.
from spfli
inner join sflight on sflight~connid = spfli~connid. " связка / отношение ключевых полей.
endselect.
CALL SCREEN 100. " набираем сотый скрин.
*
MODULE PBO OUTPUT. " модуль который проворачивает отображение
SET PF-STATUS 'MAIN100'. " задаем гуи статус
IF G_CUSTOM_CONTAINER IS INITIAL. " если кустом контейнер активирован
CREATE OBJECT G_CUSTOM_CONTAINER " создается объект
EXPORTING CONTAINER_NAME = G_CONTAINER. " название контейнера CONT
CREATE OBJECT GRID1 " создается объект который наверно отображает самц таблицу.
EXPORTING I_PARENT = G_CUSTOM_CONTAINER. " тип отображения контейнера (наверное)
CALL METHOD GRID1->SET_TABLE_FOR_FIRST_DISPLAY " метод отображения (наверное)
*HR_IT_SHOW_ANY_TABLE_ON_ALV
EXPORTING
* I_STRUCTURE_NAME = 'SFLIGHT'
IT_FIELDCATALOG = gs_fc " какой-то параметр
IT_OUTTAB = tabs. " таблица которая вставялется в кустом_контрол
call function 'LVC_FIELDCATALOG_MERGE' " вызываем функцию. Вообще не уверен в IF-ы писать или нет.
exporting
i_internal_tablename = 'TABS' " назвние внтутренней табицы
changing
ct_fieldcat = cat " параметр какойто
exceptions
others = 0.
ENDIF.
ENDMODULE.
MODULE PAI INPUT. " события после ввода
call method cl_gui_cfw=>dispatch. " метод выхода.. наверное.
CASE OK_CODE.
WHEN 'EXIT'.
PERFORM EXIT_PROGRAM.
WHEN OTHERS.
ENDCASE.
CLEAR OK_CODE.
ENDMODULE.
*
FORM EXIT_PROGRAM.
CALL METHOD G_CUSTOM_CONTAINER->FREE.
CALL METHOD CL_GUI_CFW=>FLUSH.
LEAVE PROGRAM.
ENDFORM.
Age: 48 Joined: 12 Jan 2009 Posts: 17 Location: Хабаровск
Posted: Tue Mar 17, 2009 3:51 am Post subject:
вы же сами написали "tabs type table of tab_vt" соов. программа ищет тип tab_vt, откуда ей знать что у вас в программе tab_vt это внутренняя таблица, поэтому и ругается.
vga, Брат Мигель, DKiyanov Благодарю за Ваше время!
* continue
Дальше пошли ошибки что параметры в changing-е должны быть, CAT не задан. Вроде исправил.
CAT задал LVC_T_FCAT посмотрев в Class Builder: Class CL_GUI_ALV_GRID Display.
Code:
DATA: OK_CODE LIKE SY-UCOMM,
tabs like table of tab_vt,
G_CONTAINER TYPE SCRFNAME VALUE 'CONT',
GRID1 TYPE REF TO CL_GUI_ALV_GRID,
CAT type LVC_T_FCAT,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
Синтаксическая ошибка изчезла. Программа запустилась.
Появились поля выборки.
При запуске (execute {F8}) появляется ошибка.
Field Catalog Not Found. (иллюстрация ниже)
В хелпе пишит что имя не задано. Активировал exporting и I_STRUCTURE_NAME = 'TAB_VT'. Непомогло...
Люди, помогите... я чувствую, что осталось немного до понимания))
надо дожать. обязательно.
Ребят, пожалуйста...
Age: 180 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Tue Mar 17, 2009 5:36 pm Post subject:
Кстати, у Вас какая версия системы? Тут обнаружил, что в 4.6 параметра i_internal_tablename нет, поэтому предположение первое - определить TABS явно, с перечислением полей, а не ссылкой на другую структуру.
Это связано с тем, что функция LVC_FIELDCATALOG_MERGE очень требовательна к определению внутренней таблицы. Например в ней нельзя описывать поля через типы, определенные в программе и т.д.
Code:
DATA: BEGIN OF tabs OCCURS 0,
citf LIKE spfli-cityfrom,
citt LIKE spfli-cityto,
pay LIKE sflight-paymentsum,
END OF tabs.
TYPE-POOLS: SLIS.
*&---------------------------------------------------------------------*
*& Form create_field_catalog_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_FCAT_GR text
* Creating field calalog from internal table REPORT_TABLE
*----------------------------------------------------------------------*
FORM f_create_field_catalog_funct
TABLES GS_FCAT_GR TYPE lvc_t_fcat.
DATA:
CT_FIELDCAT type SLIS_T_FIELDCAT_ALV,
CS_FIELDCAT type slis_fieldcat_alv,
I_REPID type sy-REPID.
i_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
I_PROGRAM_NAME = 'ИМЯ ПРОГРАММЫ'
I_INTERNAL_TABNAME = 'TABS'
I_INCLNAME = 'ИМЯ ИНКЛЮДА'
CHANGING
CT_FIELDCAT = CT_FIELDCAT
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3
.
if sy-subrc = 0.
loop at ct_fieldcat into cs_fieldcat.
move-corresponding cs_fieldcat to gs_fcat_gr.
первый вариант пишит ошибку. Запускается, и после выбоки уже.
Quote:
The field catalog cannot be determined because the output table structure name was not specified.
Думаю что нужно включить
CALL METHOD grid1->set_table_for_first_display
EXPORTING
I_STRUCTURE_NAME = 'TABS'
включаю и опять же после выборки выдает вот это.
1 method set_sort_criteria.
2
3 *... (1) Trace?
4 if not mr_trace is initial.
5 call method mr_trace->add_trace_item
6 exporting
7 i_trace_item = 'SET_SORT_CRITERIA'
8 ir_variant = m_cl_variant
9 it_data = mt_data
10 it_info = mt_info.
11 endif.
12
13 if m_cl_variant->mt_fieldcatalog is initial.
>>>>> raise no_fieldcatalog_available.
15 endif.
16
17 m_cl_variant->mt_sort = it_sort.
18
19 call function 'LVC_SORT_COMPLETE'
20 exporting
21 it_fieldcat = m_cl_variant->mt_fieldcatalog
22 changing
23 ct_sort = m_cl_variant->mt_sort.
24
25 endmethod.
может быть мы что то ещё не учли?
думаю на минисапе должно прокатить...
Второй вариант ещё не пробовал.
Скажите, во втором коде нужно имя инклюда.. а пустой инклюд ведь пойдет?
В книге Кречмера инклюд не описан(((
При запуске (execute {F8}) появляется ошибка.
Field Catalog Not Found. (иллюстрация ниже)
В хелпе пишит что имя не задано. Активировал exporting и I_STRUCTURE_NAME = 'TAB_VT'. Непомогло...
Люди, помогите... я чувствую, что осталось немного до понимания))
надо дожать. обязательно.
Ребят, пожалуйста...
а почему у вас филдкаталог формируется после вызова grid, или мне показалось ? _________________ Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Так, думаю сейчас расставим точки над i.
Обявляете переменную как
data: begin of .... occurs 0,
....
end of .....
Если объявляете данную переменную в отдельном инклюде, запоминаем его название.
запускаете 2 ФМ
p.s. ФМ, который я указывал выше (в другом посте), не нужно выводить в отдельном экране, просто напросто в самой программе его пишете, он сам все сгенерит.
Парни, спасибо что не бросаете... всётаки все были чайниками))
Честно говоря, я запутался.
* в модуле PBO.
задается статус.
создается кустом контрол.
- имя контрола
потом вызывается функция фиелд каталога.
- указывается: имя структуры, фиелд каталог и т.д.
потом создается грид
- задается кустом контрол
потом вызывается метод отображения грида
- задаются имя, фиелд каталог, выходная таблица.
Воот. И было бы очень здорово увидеть рабочий вариант.
Прост, парни, мне уже неудобно к Вам обращаться...
убейте 5 минут времени, подставьте рабочие функции чтобы заработало. А дальше, с другими подобными я сам постараюсь разобраться. Главное иметь рабочий.. с которым можно поиграть.
Ни каких корыстных целей не приследую...
Весь код.
Code:
REPORT z_alv_test1.
*
TABLES: spfli, sflight.
*
DATA: BEGIN OF tabs OCCURS 0,
citf LIKE spfli-cityfrom,
citt LIKE spfli-cityto,
pay LIKE sflight-paymentsum,
END OF tabs.
DATA: ok_code LIKE sy-ucomm,
"g_repid like sy-repid,
tabs1 LIKE table of tabs,
g_container TYPE scrfname VALUE 'CONT',
grid1 TYPE REF TO cl_gui_alv_grid,
cat TYPE slis_t_fieldcat_alv,
cat1 type lvc_t_fcat,
g_custom_container TYPE REF TO cl_gui_custom_container.
*
SELECT-OPTIONS:
cid FOR sflight-connid.
*
START-OF-SELECTION.
*
SELECT * FROM spfli WHERE connid IN cid.
*
SELECT spfli~cityfrom spfli~cityto sflight~paymentsum
INTO TABLE tabs
FROM spfli
INNER JOIN sflight ON sflight~connid = spfli~connid.
ENDSELECT.
*
CALL SCREEN 100.
*
MODULE pbo OUTPUT.
SET PF-STATUS 'MAIN100'.
IF g_custom_container IS INITIAL.
CREATE OBJECT g_custom_container
EXPORTING
container_name = g_container.
"if sy-subrc ne 0.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_internal_tablename = 'TABS'
CHANGING
ct_fieldcat = cat1
EXCEPTIONS
OTHERS = 0.
"endif.
CREATE OBJECT grid1
EXPORTING
i_parent = g_custom_container.
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Thu Mar 19, 2009 9:11 am Post subject:
mvs87 wrote:
убейте 5 минут времени, подставьте рабочие функции чтобы заработало. А дальше, с другими подобными я сам постараюсь разобраться. Главное иметь рабочий.. с которым можно поиграть.
Ни каких корыстных целей не приследую...
1.Сделайте так, как написал Брат Мигель.
2.Чтобы посмотреть рабочий код, с которым можно "поиграться", в транзакции SE38 поищите программы по маске BCALV*GRID* _________________ С уважением,
Удав.
Age: 37 Joined: 18 Jan 2008 Posts: 71 Location: Tashkent-Astana-Moscow
Posted: Thu Mar 19, 2009 9:32 am Post subject:
согласен с Удав .
но так просмотрев код , есть подозрение что возмона ошибка в объявлении таблицы tabs, просто в данном случае наверное вам надо явно указать в вызове метода отображения грида TABS[] . но лучше сделайте как вариант
Code:
data: begin of gs_main,
....
end of gs_main,
gt_main like table of gs_main.
может и сработает , но это IMHO _________________ Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э. Йодан)
Ошибка моя была в том что 'LVC_FIELDCATALOG_MERGE' не контачит с внутрянками. Ему надо структуру.
фух... как я мысленно матюкался когда узнал что людей и себя мучил попусту.
короче показали другую "концепцию" реализации.
Через аппенд.
Code:
wa_fieldcat type line of lvc_t_fcat,
****************************
wa_fieldcat-fieldname = 'CITYFROM'.
wa_fieldcat-scrtext_l = 'From'.
wa_fieldcat-scrtext_m = 'From'.
wa_fieldcat-scrtext_s = 'From'.
wa_fieldcat-outputlen = 20.
* wa_fieldcat-decimals = 3.
* wa_fieldcat-no_out = 'X'.
APPEND wa_fieldcat to cat1.
clear wa_fieldcat.
и т.д.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.