Отчет на WEB DYNPRO

By: Execution Blog | 7 Дек 2017

Отчет на 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 для теста.

 

 

Тестируем и радуемся 🙂

 

Теги
2
Поделиться