Отчет на WEB DYNPRO
Отчет на WEB DYNPRO состоит из двух компонентов:
1. Селекционный экран
2. ALV, которое использует данные с сел. экрана.
Web dynpro – селекционный экран
1. Создаем Web dynpro
Двойной клик по приложению, далее добавляем стандартный компонент в наше приложение (WDR_SELECT_OPTIONS)
Создаем нод и атрибут к нему типа интерфейс, в него мы будем передавать данные во второе приложение.
Активируем.
Создаем метод и отмечаем, что это интерфейс → двойной клик по нему, проваливаемся, где создаем атрибуты и вставляем код:
1. Вариант
DATA LO_ND_EXP_HANDLER TYPE REF TO IF_WD_CONTEXT_NODE. DATA LO_EL_EXP_HANDLER TYPE REF TO IF_WD_CONTEXT_ELEMENT. DATA LS_EXP_HANDLER TYPE WD_THIS->ELEMENT_EXP_HANDLER. * navigate from <CONTEXT> to <EXP_HANDLER> via lead selection LO_ND_EXP_HANDLER = WD_CONTEXT->GET_CHILD_NODE( NAME = WD_THIS->WDCTX_EXP_HANDLER ). * get element via lead selection LO_EL_EXP_HANDLER = LO_ND_EXP_HANDLER->GET_ELEMENT( ). * get all declared attributes LO_EL_EXP_HANDLER->GET_STATIC_ATTRIBUTES( IMPORTING STATIC_ATTRIBUTES = LS_EXP_HANDLER ). e_HANDLER = LS_EXP_HANDLER-handler.
Итак, должно получиться следующее…
2. Вариант
Использование визарда.
Двойной клик по нашему ноду → ОК
Т.е. генерируем код для получения нашего узла с атрибутом, после галок ОК получим тот же самый код:
DATA LO_ND_EXP_HANDLER TYPE REF TO IF_WD_CONTEXT_NODE.
DATA LO_EL_EXP_HANDLER TYPE REF TO IF_WD_CONTEXT_ELEMENT.
DATA LS_EXP_HANDLER TYPE WD_THIS->ELEMENT_EXP_HANDLER.
* navigate from <CONTEXT> to <EXP_HANDLER> via lead selection
LO_ND_EXP_HANDLER = WD_CONTEXT->GET_CHILD_NODE( NAME = WD_THIS->WDCTX_EXP_HANDLER ).
* get element via lead selection
LO_EL_EXP_HANDLER = LO_ND_EXP_HANDLER->GET_ELEMENT( ).
* get all declared attributes
LO_EL_EXP_HANDLER->GET_STATIC_ATTRIBUTES(
IMPORTING
STATIC_ATTRIBUTES = LS_EXP_HANDLER ).
Далее просто заполняем наш выходной параметр.
e_HANDLER = LS_EXP_HANDLER-handler.
→Активируем.
Далее идем в свойства вида и добавляем приложение, которое мы добавили на предыдущих шагах в View, чтобы его здесь использовать.
Добавляем наше приложение в вид двойным кликом по нему.
На вкладке Context перетаскиваем из COMPONENTCONTROLLER в наш View созданный нод (автоматически создается mapping), таким образом мы можем использовать в View глобальные данные.
Идем на вкладку Layout и перетаскиваем элемент контейнер в редактор. Он нужен для отображения приложений, которые мы используем в своем.
Идем в интерфейс WINDOW (это название мы давали вначале), он содержит наши View (которых может быть несколько) и жмем ПРАВОЙ кнопкой по контейнеру, который мы создали и нажимаем → Embed View.
Далее настроим отображение в нем стороннего приложения, которое мы используем(WDR_SELECT_OPTIONS).
Возвращаемся в View вкладка Атрибуты и добавляем 2 атрибута:
Активируем.
Идем во вкладку методы и в методе Init пишем код:
METHOD WDDOINIT .
DATA: LT_RANGE_TABLE TYPE REF TO DATA,
RT_RANGE_TABLE TYPE REF TO DATA,
READ_ONLY TYPE ABAP_BOOL,
TYPENAME TYPE STRING.
DATA: LR_COMPONENTCONTROLLER TYPE REF TO IG_COMPONENTCONTROLLER,
L_REF_CMP_USAGE TYPE REF TO IF_WD_COMPONENT_USAGE.
* create the used component
L_REF_CMP_USAGE = WD_THIS->WD_CPUSE_SELECT_OPTIONS( ).
IF L_REF_CMP_USAGE->HAS_ACTIVE_COMPONENT( ) IS INITIAL.
L_REF_CMP_USAGE->CREATE_COMPONENT( ).
ENDIF.
WD_THIS->M_WD_SELECT_OPTIONS = WD_THIS->WD_CPIFC_SELECT_OPTIONS( ).
* init the select screen
WD_THIS->M_HANDLER = WD_THIS->M_WD_SELECT_OPTIONS->INIT_SELECTION_SCREEN( ).
WD_THIS->M_HANDLER->SET_GLOBAL_OPTIONS(
I_DISPLAY_BTN_CANCEL = ABAP_FALSE
I_DISPLAY_BTN_CHECK = ABAP_FALSE
I_DISPLAY_BTN_RESET = ABAP_FALSE
I_DISPLAY_BTN_EXECUTE = ABAP_FALSE ).
* create a range table that consists of this new data element
LT_RANGE_TABLE = WD_THIS->M_HANDLER->CREATE_RANGE_TABLE( I_TYPENAME = ‘S_CARR_ID’ ).
* add a new field to the selection
WD_THIS->M_HANDLER->ADD_SELECTION_FIELD( I_ID = ‘S_CARR_ID’
IT_RESULT = LT_RANGE_TABLE I_READ_ONLY = READ_ONLY ).
CLEAR LT_RANGE_TABLE.
* create a range table that consists of this new data element
LT_RANGE_TABLE = WD_THIS->M_HANDLER->CREATE_RANGE_TABLE( I_TYPENAME = ‘S_CONN_ID’ ).
* add a new field to the selection
WD_THIS->M_HANDLER->ADD_SELECTION_FIELD( I_ID = ‘S_CONN_ID’
IT_RESULT = LT_RANGE_TABLE
I_READ_ONLY = READ_ONLY
I_VALUE_HELP_TYPE = IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_OVS ).
* add a new parametr
DATA: LR_VALUE TYPE REF TO DATA.
DATA: M_HANDLER TYPE REF TO IF_WD_SELECT_OPTIONS.
FIELD-SYMBOLS: <FS_S_FROM_CIT> TYPE S_FROM_CIT.
CREATE DATA LR_VALUE TYPE S_FROM_CIT.
ASSIGN LR_VALUE->* TO <FS_S_FROM_CIT>.
CALL METHOD WD_THIS->M_HANDLER->ADD_PARAMETER_FIELD
EXPORTING
I_ID = ‘CITYFROM’
* I_WITHIN_BLOCK = MC_ID_MAIN_BLOCK
I_DESCRIPTION = ‘Город отправления’
* I_IS_AUTO_DESCRIPTION = ABAP_TRUE
I_VALUE = LR_VALUE
* I_OBLIGATORY = ABAP_FALSE
I_VALUE_HELP_TYPE = IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_OVS
* I_VALUE_HELP_ID =
* I_VALUE_HELP_MODE =
* I_VALUE_HELP_STRUCTURE =
* I_VALUE_HELP_STRUCTURE_FIELD =
* I_HELP_REQUEST_HANDLER =
* I_LOWER_CASE =
* I_MEMORY_ID =
* I_AS_CHECKBOX = ABAP_FALSE
* I_AS_DROPDOWN = ABAP_FALSE
* IT_VALUE_SET =
* I_READ_ONLY = ABAP_FALSE
* I_DONT_CARE_VALUE =
* I_EXPLANATION =
* I_TOOLTIP =
* I_IS_NULLABLE = ABAP_TRUE
* I_FORMAT_PROPERTIES =
.
ENDMETHOD.
Далее в методе WDDOMODIFYVIEW:
method WDDOMODIFYVIEW . *заполнение интерфейсного нода для использования в других приложениях DATA LO_ND_EXP_HANDLER TYPE REF TO IF_WD_CONTEXT_NODE. DATA LO_EL_EXP_HANDLER TYPE REF TO IF_WD_CONTEXT_ELEMENT. DATA LS_EXP_HANDLER TYPE WD_THIS->ELEMENT_EXP_HANDLER. * navigate from <CONTEXT> to <EXP_HANDLER> via lead selection LO_ND_EXP_HANDLER = WD_CONTEXT->GET_CHILD_NODE( NAME = WD_THIS->WDCTX_EXP_HANDLER ). * get element via lead selection LO_EL_EXP_HANDLER = LO_ND_EXP_HANDLER->GET_ELEMENT( ). LS_EXP_HANDLER-HANDLER = wd_this->M_HANDLER. * set all declared attributes LO_EL_EXP_HANDLER->sET_STATIC_ATTRIBUTES( EXPORTING STATIC_ATTRIBUTES = LS_EXP_HANDLER ).
Создаем метод OVS_ON_SO как событие (выбрав соответствующее значение из листбокса) и жмем на search help, там выбираем событие из используемого нами стандартного средства поиска.
Проваливаемся в метод и вставляем код: для функции F4 наших полей селекционного экрана, которые не имеют подключенного средства поиска.
method OVS_ON_SO . DATA: lt_SGEOCITY TYPE TABLE OF SGEOCITY, lt_CONNID type TABLE OF spfli. FIELD-SYMBOLS: <lt_ovs_result> LIKE lt_SGEOCITY, <SGEOCITY> LIKE LINE OF <lt_ovs_result>, <lt_ovs_result2> LIKE lt_CONNID, <CONNID> LIKE LINE OF <lt_ovs_result2>, <lt_sel_opt_result> TYPE STANDARD TABLE. *Фазы работы средства поиска CASE i_ovs_data-m_ovs_callback_object->phase_indicator. "Set Configuration WHEN if_wd_ovs=>co_phase_0. "Preassign Entry Values WHEN if_wd_ovs=>co_phase_1. "Fill Value List WHEN if_wd_ovs=>co_phase_2. IF I_OVS_DATA-M_SELECTION_FIELD_ID = 'CITYFROM'. SELECT MANDT CITY COUNTRY LATITUDE LONGITUDE FROM SGEOCITY INTO CORRESPONDING FIELDS OF TABLE lt_SGEOCITY UP TO 200 ROWS. i_ovs_data-m_ovs_callback_object->set_output_table( OUTPUT = lt_SGEOCITY ). ENDIF. IF I_OVS_DATA-M_SELECTION_FIELD_ID = 'S_CONN_ID'. SELECT MANDT CARRID CONNID COUNTRYFR CITYFROM AIRPFROM FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE lt_CONNID UP TO 200 ROWS. i_ovs_data-m_ovs_callback_object->set_output_table( OUTPUT = lt_CONNID ). ENDIF. "Value Return WHEN if_wd_ovs=>co_phase_3. IF I_OVS_DATA-M_SELECTION_FIELD_ID = 'CITYFROM'. ASSIGN i_ovs_data-m_ovs_callback_object->selection->* TO <SGEOCITY>. ASSIGN i_ovs_data-mt_selected_values->* TO <lt_sel_opt_result>. APPEND <SGEOCITY>-CITY to <lt_sel_opt_result>. ENDIF. IF I_OVS_DATA-M_SELECTION_FIELD_ID = 'S_CONN_ID'. ASSIGN i_ovs_data-m_ovs_callback_object->selection->* TO <CONNID>. ASSIGN i_ovs_data-mt_selected_values->* TO <lt_sel_opt_result>. APPEND <CONNID>-CONNID TO <lt_sel_opt_result>. ENDIF. WHEN OTHERS. ENDCASE. endmethod.
Активируем.
Создаем Application для теста.
Тестируем и радуемся 🙂