Настраиваемое всплывающее окно с данными из таблицы базы данных
Мне нужно отобразить всплывающее окно с данными из поля таблицы моей базы данных (Tab1-camp_type
).
На данный момент я создал UI-компонент (ZUIC_TYPES
), табличный вид (VWTYPES
) и добавил необходимое поле таблицы.
На DO_PREPARE_OUTPUT
метода моего узла контекста, я написал код, который должен дать мне все значения из camp_type
поле, но я получаю только одно значение, повторяющееся 37 раз (в моей таблице 37 строк).
Как я могу получить все свои данные во всплывающем окне?
Вот мой код:
DATA:lr_table TYPE REF TO crmc_mktpl_ctype,
lr_struct TYPE crmc_mktpl_ctype,
lt_tabledata TYPE TABLE OF crmc_mktpl_ctype,
ls_tabledata LIKE LINE OF lt_tabledata,
lr_camptype TYPE REF TO cl_bsp_wd_value_node,
lr_col TYPE REF TO cl_crm_bol_bo_col.
"fetch the data.
SELECT DISTINCT camp_type FROM crmc_mktpl_ctype INTO CORRESPONDING FIELDS OF TABLE lt_tabledata.
CHECK sy-subrc = 0.
"create collection object.
CREATE OBJECT lr_col.
CREATE DATA lr_table.
"create one empty value node with the required structure.
CREATE OBJECT lr_camptype
EXPORTING
iv_data_ref = lr_table.
"create value node for each record foound.
LOOP AT lt_tabledata INTO ls_tabledata.
"set the data into the value node.
lr_camptype->if_bol_bo_property_access~set_properties( is_attributes = ls_tabledata ).
"add node to the collection.
lr_col->if_bol_bo_col~add( lr_camptype ).
ENDLOOP.
"all records are processed. set the collection to the collection wrapper of
" context node to make it visible on web ui
me->typed_context->camptype->collection_wrapper->set_collection( lr_col ).
2 ответа
У вас создан только один узел (lr_camptype
) перед циклом, поэтому вы добавляете один и тот же несколько раз. Помните, что в каждом цикле вы добавляете ссылку на один и тот же объект, поэтому при последующей обработке объект будет содержать только последнее значение.
Вы должны создать по одному узлу в строке, перемещая создание узла внутри LOOP, как показано ниже:
...
"create collection object.
CREATE OBJECT lr_col.
CREATE DATA lr_table.
"create value node for each record found.
LOOP AT lt_tabledata INTO ls_tabledata.
"create one empty value node with the required structure.
CREATE OBJECT lr_camptype " <=== must be inside the loop !
EXPORTING
iv_data_ref = lr_table.
"set the data into the value node.
lr_camptype->if_bol_bo_property_access~set_properties( is_attributes = ls_tabledata ).
"add node to the collection.
lr_col->if_bol_bo_col~add( lr_camptype ).
ENDLOOP.
...
- Создайте компонент Z-UI.
- Создайте представление (Тип: Таблица) с помощью мастера (при создании представления выберите необходимую таблицу и поля).
- Привяжите свой вид к окну.
- Создайте компонентный интерфейс для вашего Z-окна.
- В
DO_PREPARE_OUTPUT
метод напишите этот код:
TYPES: BEGIN OF ltype_attr_struct,
camp_type TYPE crm_mktpl_camptype,
description TYPE crm_mktpl_camptypetx, "Added by wizard
END OF ltype_attr_struct.
DATA: lr_table TYPE REF TO crmc_mktpl_ctype,
lr_struct TYPE crmc_mktpl_ctype,
lt_tabledata TYPE TABLE OF ltype_attr_struct,
ls_tabledata LIKE LINE OF lt_tabledata,
lr_camptype TYPE REF TO cl_bsp_wd_value_node,
lr_col TYPE REF TO cl_crm_bol_bo_col.
"fetch the data.
SELECT DISTINCT
A~camp_type,
B~description
FROM TabA AS A INNER JOIN
TabB AS B ON A~camp_type = B~camp_type AND B~langu = 'EN'
INTO TABLE @lt_tabledata.
CHECK sy-subrc = 0.
"create collection object.
CREATE OBJECT lr_col.
CREATE DATA lr_table.
"create one empty value node with the required structure.
CREATE OBJECT lr_camptype
EXPORTING
iv_data_ref = lr_table.
"create value node for each record foound.
LOOP AT lt_tabledata INTO ls_tabledata.
"set the data into the value node.
lr_camptype->if_bol_bo_property_access~set_properties( is_attributes = ls_tabledata ).
"add node to the collection.
lr_col->if_bol_bo_col~add( NEW cl_bsp_wd_value_node( iv_data_ref = REF ltype_attr_struct( ls_tabledata ) ) ).
ENDLOOP.
"all records are processed. set the collection to the collection wrapper of context node to make it visible on web ui
me->typed_context->camptype->set_collection( lr_col ).
me->typed_context->camptype->build_table( ).
- В стандартном компоненте (откуда вы хотите вызвать всплывающее окно), создайте использование компонента для вашего интерфейса и в событии кнопки поместите код:
gr_popup = me->comp_controller->window_manager->create_popup( iv_interface_view_name = 'ZUIC_CAMP_TYPES/MainWindow'
iv_usage_name = 'ZCUTypes'
iv_title = 'Title' ).
gr_popup->set_window_width( iv_width = 400 ).
gr_popup->set_window_height( iv_height = 600 ).
gr_popup->set_on_close_event( iv_event_name = 'PP_CTYPE_CLOSED'
iv_view = me ).
gr_popup->set_display_mode( if_bsp_wd_popup=>c_display_mode_surrounded ).
gr_popup->open( ).
PS: GR_POPUP Instance Attribute
Public
Type
Ref To
IF_BSP_WD_POPUP
. gr_popup это атрибут класса.