이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2013/11/25/how-to-close-ovs-popup-window/

How to Close OVS Popup window

November 25, 2013

 

소개

이글은 웹딘프로아밥에서 OVS 팝업 윈도우를 닫는 코드에 대해 설명합니다.


요구사항은 다음 글에서 시작되었습니다: http://scn.sap.com/thread/3456054 - OVS에서 검색 결과가 없을때 새 팝업을 열고 OVS는 닫는 방법을 알고 싶습니다.

 

준비물

OVS 서치 헬프  작성법.

 

이 글에서는 OVS 서치 헬프 작성법을 설명하지 않겠습니다. 이미 인터넷에 비슷한 글이 많이 있습니다. OVS 작성법을 먼저 공부하려면 대표적으로 Amy King의 다음 글을 참고하세요: http://scn.sap.com/docs/DOC-32690.

 

단계별 진행

OVS를 만들었다면 다음 단계를 따라가세요. 목표는 OVS에서 검색결과가 없을때 새 팝업을 열고 자동으로 OVS 윈도우를 닫는 것입니다.

 

주의: 지금 설명하는 방법은 여러 해결방법중 한가지를 보여주는 것으로 유일한 해결책은 아닙니다.

 

 

뷰의 어트리뷰트 탭으로 이동하여 어트리뷰트 GR_HANDLE 을 타입 TYPE REF TO IF_WDR_OVS_LISTENER 으로 만듭니다.

/wp-content/uploads/2013/11/1_331155.jpg

 

이제 아래 코드를 ON_OVS 메소드(OVS의 이벤트 핸들러)에 입력합니다.

 

ON_OVS

METHOD onovs .

* declare data structures for the fields to be displayed and

* for the table columns of the selection list, if necessary

   TYPES:

     BEGIN OF lty_stru_input,

*   add fields for the display of your search input here

       carrid TYPE string,

     END OF lty_stru_input.

   TYPES:

     BEGIN OF lty_stru_list,

*   add fields for the selection list here

       carrid TYPE string,

     END OF lty_stru_list.

 

   DATA: ls_search_input  TYPE lty_stru_input,

         lt_select_list   TYPE STANDARD TABLE OF lty_stru_list,

         ls_text          TYPE wdr_name_value,

         lt_label_texts   TYPE wdr_name_value_list,

         lt_column_texts  TYPE wdr_name_value_list,

         lv_window_title  TYPE string,

         lv_group_header  TYPE string,

         lv_table_header  TYPE string.

 

   DATA: lo_window_manager TYPE REF TO if_wd_window_manager,

         lr_view_controller TYPE REF TO if_wd_view_controller,

         lo_api_component  TYPE REF TO if_wd_component,

         lo_window         TYPE REF TO if_wd_window,

         l_text            TYPE string_table.

 

   FIELD-SYMBOLS: <ls_query_params> TYPE lty_stru_input,

                  <ls_selection>    TYPE lty_stru_list.

 

   CASE ovs_callback_object->phase_indicator.

 

     WHEN if_wd_ovs=>co_phase_0.  "configuration phase, may be omitted

*   in this phase you have the possibility to define the texts,

*   if you do not want to use the defaults (DDIC-texts)

 

       ls_textname = `CARRID`.  "must match a field name of search

       ls_textvalue = `Airline`. "wd_assist->get_text( `001` ).

       INSERT ls_text INTO TABLE lt_label_texts.

 

       ls_textname = `CARRID`"must match a field in list structure

       ls_textvalue = `Airline`. "wd_assist->get_text( `002` ).

       INSERT ls_text INTO TABLE lt_column_texts.

 

*      lv_window_title = wd_assist->get_text( `003` ).

*      lv_group_header = wd_assist->get_text( `004` ).

*      lv_table_header = wd_assist->get_text( `005` ).

 

       ovs_callback_object->set_configuration(

                 label_texts  = lt_label_texts

                 column_texts = lt_column_texts

                 group_header = lv_group_header

                 window_title = lv_window_title

                 table_header = lv_table_header

                 col_count    = 2

                 row_count    = 20 ).

 

 

     WHEN if_wd_ovs=>co_phase_1"set search structure and defaults

*   In this phase you can set the structure and default values

*   of the search structure. If this phase is omitted, the search

*   fields will not be displayed, but the selection table is

*   displayed directly.

*   Read values of the original context (not necessary, but you

*   may set these as the defaults). A reference to the context

*   element is available in the callback object.

 

       ovs_callback_object->context_element->get_static_attributes(

           IMPORTING static_attributes = ls_search_input ).

*     pass the values to the OVS component

       ovs_callback_object->set_input_structure(

           input = ls_search_input ).

 

 

     WHEN if_wd_ovs=>co_phase_2.

*   If phase 1 is implemented, use the field input for the

*   selection of the table.

*   If phase 1 is omitted, use values from your own context.

 

       IF ovs_callback_object->query_parameters IS NOT BOUND.

******** TODO exception handling

       ENDIF.

       ASSIGN ovs_callback_object->query_parameters->*

                               TO <ls_query_params>.

       IF NOT <ls_query_params> IS ASSIGNED.

******** TODO exception handling

       ENDIF.

 

*     call business logic for a table of possible values

       SELECT carrid FROM sflight INTO TABLE lt_select_list.
       ovs_callback_object->set_output_table( output = lt_select_list ).
       IF lt_select_list IS INITIAL.     
*     Open a popup if no entries found 
         lo_api_component  = wd_comp_controller->wd_get_api( ).
         lo_window_manager = lo_api_component->get_window_manager( ).
         INSERT `No Entries Found! Do you want to create new entries?` INTO TABLE l_text.
         lo_window   = lo_window_manager->create_popup_to_confirm(
                           text = l_text
                           button_kind = if_wd_window=>co_buttons_yesno
                           message_type = if_wd_window=>co_msg_type_question
                           window_position = if_wd_window=>co_center
                            ).
*     Get View Controller Reference
         lr_view_controller = wd_this->wd_get_api( ).
*     Subscribe to No button Event
         lo_window->subscribe_to_button_event(
               button = if_wd_window=>co_button_no
               action_name = ‘CLOSE_OVS’           ” Create this Action
               action_view = lr_view_controller
               is_default_button = abap_false ).
         lo_window->open( ).
*     Store OVS Listener instance globally
         wd_this->gr_handle ?= ovs_callback_object.
       ENDIF.

 

     WHEN if_wd_ovs=>co_phase_3.

*   apply result

 

       IF ovs_callback_object->selection IS NOT BOUND.

******** TODO exception handling

       ENDIF.

 

       ASSIGN ovs_callback_object->selection->* TO <ls_selection>.

       IF <ls_selection> IS ASSIGNED.

         ovs_callback_object->context_element->set_attribute(

                                name  = `VAL`   ” Context Attribute Name

                                value = <ls_selection>carrid ).

 

       ENDIF.

   ENDCASE.

 

ENDMETHOD.

 

 

다음은 뷰의 액션 탭으로 이동하여 액션 CLOSE_OVS를 만듭니다.

 

/wp-content/uploads/2013/11/2_331180.jpg

 

 

아래 코드를 ONACTIONCLOSE_OVS 메소드에 입력합니다.

 

ONACTIONCLOSE_OVS

METHOD onactionclose_ovs .

* Work around to close the OVS search help window

   wd_this->gr_handle->on_cancel( ).

 

ENDMETHOD.

 

컴포넌트를 저장하고 활성화 합니다.


실행 결과

웹딘프로 어플리케이션을 테스트하겠습니다.

 

입력 필드에서 F4 헬프를 선택합니다.

 

/wp-content/uploads/2013/11/3_331186.jpg

검색 버튼을 누릅니다. ( co_phase_1 이 생략 된 경우 안눌러도 됩니다 ).

 

/wp-content/uploads/2013/11/4_331193.jpg

 

만약 검색 결과가 없다면 팝업이 열린 것을 볼 수 있습니다!

/wp-content/uploads/2013/11/5_331194.jpg

( 테스트로 팝업을 보기 위해 디버거로 테이블을 비웠습니다 ).

 

No 버튼에 대해서만 OVS를 닫는 이벤트 처리를 해두었습니다. No 를 클릭하면 OVS 윈도우도 자동으로 닫히는 것을 볼 수 있습니다.

 

/wp-content/uploads/2013/11/6_331195.jpg

 



결론

 

이번 데모에서는 No 버튼만 OVS를 닫는 이벤트 처리를 했지만, 비슷하게 Yes 버튼에도 신규 항목을 작성하는 화면으로 이동하도록 이벤트 처리를 할 수 있습니다. 이글이 비슷한 문제로 어려움을 겪는 분들에게 도움이 되었으면 좋겠습니다.   

 


 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2013/11/25/how-to-close-ovs-popup-window/

저작자 표시 변경 금지
신고
Posted by boy0

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2013/12/18/how-to-check-supported-web-browser-version/

 

How to check supported web browser version

December 18, 2013 

 

최근까지도 내가(SAP직원으로) 지원 나가는 로컬 고객들에게서 가장 많이 듣는 질문중 하나는 "우리 서버의 웹딘프로아밥 / BSP는 인터넷 익스플로러 버전 몇까지 지원되나요? 파이어폭스, 크롬도 지원되지요?" 입니다.

그 질문에 대한 답을 기록으로 남기기 위해 여기에 적어 둡니다.

 

 

1. 홈페이지 http://service.sap.com 에 접속합니다. "Products" -> "Product availability" 로 이동합니다.

/wp-content/uploads/2013/12/clipboard1_346203.png

(번역자 의견: 구글에서 Product Availability Matrix를 검색하는게 더 편합니다)


 

2. Product Availability Matrix 페이지가 열립니다. 우리 서버의 서버 버전을 선택합니다. 예를들어 SAP NETWEAVER 7.4 를 선택합니다.

/wp-content/uploads/2013/12/clipboard2_346204.png

 

3. "Technical Release Information"->"Web Browser Platforms" 탭을 선택합니다. 웹딘프로 아밥과 BSP의 웹브라우저 호환성을 확인하고 싶다면 Product Instnce에서 "Application Server ABAP"을 선택합니다. 필터에서는 파이어폭스, 크롬, IE 를 선택할 수 있습니다.

/wp-content/uploads/2013/12/clipboard3_346211.png

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2013/12/18/how-to-check-supported-web-browser-version/

 

저작자 표시 변경 금지
신고
Posted by boy0

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2013/12/30/how-to-validate-the-fields-on-ovs-window-webdynpro-abap/

 

How to validate the fields on OVS window – Webdynpro ABAP

December 30, 2013 

 

목표:

 

OVS 화면에서 어트리뷰트(필드 강조) 에러 메시지 출력하기.

 

시나리오:

 

이 글에서는 OVS 창에 있는 필드에 대해 값 점검을 하고 에러 메시지를 출력하는 방법을 설명합니다.

 

  • 스탠다드/T100 메시지 출력하기

    • 스탠다드/T100 메시지를 출력하는 방법은 인터페이스 IF_WD_OVS의 메소드 SET_MESSAGES를 사용하면 됩니다.
    • 또는 인터페이스 IF_WD_MESSAGE_MANAGER의 여러 메소드를 사용할 수도 있습니다.

 

  • 어트리뷰트(필드 강조) 에러 메시지 출력하기

    • 컴포넌트 재사용에 접근하여 OVS 컴포넌트의 컨텍스트 엘리먼트를 가져와야 합니다.
    • 어트리뷰트 에러 메시지를 출력하는 방법은 인터페이스 IF_WD_MESSAGE_MANAGER의 메소드 REPORT_ATTRIBUTE_ERROR_MESSAGE를 사용하면 됩니다.

 

          주요 로직: Getti컴포넌트 WDR_OVS의 컨텍스트 노드 "INPUT"에 대한 커텍스트 엘리먼트 참조변수를 가져오는 로직입니다.

 

    DATA lo_ovs             TYPE REF TO iwci_wdr_ovs.  
    DATA lo_context         TYPE REF TO if_wd_context.  
    DATA lo_context_node    TYPE REF TO if_wd_context_node.  
    DATA lo_el              TYPE REF TO if_wd_context_element.  

    " get reference of ovs component usage  
    lo_ovs = wd_this->wd_cpifc_test_ovs( ).  

    " get the context of ovs component  
    lo_context = lo_ovs->wd_get_api( )->get_context( ).  

    " get input node reference  
    lo_context_node = lo_context->root_node->get_child_node( 'INPUT').  

    " get reference to the context element by using lead index  
    lo_el = lo_context_node->get_element( ). 

 

준비물:

 

Webdynpro ABAP 기본지식, OVS concept & OO ABAP


단계별 진행:


예제로 간단한 웹딘프로 어플리케이션을 하나 만들어 보겠습니다. 인풋필드 2개 CARRID & CARRNAME 을 만듭니다. 필드 CARRID에는 OVS 헬프를 붙여줍니다.


Step 1:


웹딘프로아밥 컴포넌트를 아래 그림처럼 만듭니다.

1.PNG

Step 2:


컴포넌트 WDR_OVS를 컴포넌트 재사용으로 등록합니다.


/wp-content/uploads/2013/12/2_352512.png


Step 3:


컴포넌트 재사용 TEST_OVS를 뷰 V_MAIN에 등록합니다.


2_1.PNG

Step 4:


컨텍스트 노드 SCARR를 만들고 어트리뷰트 CARRID 와 CARRNAME 을 추가합니다. 어트리뷰트 CARRID 에는 ovs를 지정합니다.


3.PNG

Step 5:


뷰 레이아웃에서 노드 SCARR에 대한 입력 필드를 2개 만듭니다.


4.PNG

Step 6:


이벤트 핸들러 ON_OVS를 만듭니다.

5.PNG

 

아래 코드를 ON_OVS에 입력합니다.

 

METHOD on_ovs .
TYPES:
    BEGIN OF lty_stru_input,
      carrid TYPE scarr-carrid,
    END OF lty_stru_input.
TYPES:
    BEGIN OF lty_stru_output,
      carrid TYPE scarr-carrid,
      carrname   TYPE scarr-carrname,
    END OF lty_stru_output.
DATA: ls_search_input  TYPE lty_stru_input,
        lt_select_list   TYPE STANDARD TABLE OF lty_stru_output,
        ls_text          TYPE wdr_name_value,
        lt_label_texts   TYPE wdr_name_value_list,
        lt_column_texts  TYPE wdr_name_value_list,
        lv_window_title  TYPE string,
        lv_table_header  TYPE string.
FIELD-SYMBOLS: <LS_QUERY_PARAMS> TYPE lty_stru_input,
                 <LS_SELECTION>    TYPE lty_stru_output.
CASE ovs_callback_object->phase_indicator.
   WHEN if_wd_ovs=>co_phase_0.  "configuration phase, may be omitted
     ls_text-name = `CARRNAME`.  "must match a field name of search
      ls_text-value = `Airline Name`. "wd_assist->get_text( `001` ).
      INSERT ls_text INTO TABLE lt_label_texts.
      INSERT ls_text INTO TABLE lt_column_texts.
     ovs_callback_object->set_configuration(
                label_texts  = lt_label_texts
                column_texts = lt_column_texts
                window_title = lv_window_title
                table_header = lv_table_header ).
   WHEN if_wd_ovs=>co_phase_1.  "set search structure and defaults
     ovs_callback_object->context_element->get_static_attributes(
          IMPORTING static_attributes = ls_search_input ).
     "pass the values to the OVS component
      ovs_callback_object->set_input_structure(
          input = ls_search_input ).
    WHEN if_wd_ovs=>co_phase_2.
      IF ovs_callback_object->query_parameters IS NOT BOUND.
******** TODO exception handling
      ENDIF.
      ASSIGN ovs_callback_object->query_parameters->*
                              TO <LS_QUERY_PARAMS>.
      IF NOT <LS_QUERY_PARAMS> IS ASSIGNED.
******** TODO exception handling
      ENDIF.
     "==========================================
      " Report query parameter table
      "==========================================
      DATA ls_so_carrid TYPE selopt.
      DATA lt_so_carrid TYPE TABLE OF selopt.
     CLEAR ls_so_carrid.
      CLEAR lt_so_carrid.
   IF <LS_QUERY_PARAMS>-carrid IS NOT INITIAL.
        ls_so_carrid-sign = 'I'.
        ls_so_carrid-option = 'EQ'.
        ls_so_carrid-low = <LS_QUERY_PARAMS>-carrid.
        FIND '*' IN ls_so_carrid-low.
        IF sy-subrc IS INITIAL .
          ls_so_carrid-option = 'CP'.
        ENDIF.
        APPEND ls_so_carrid TO lt_so_carrid.
      ENDIF.
     "=================================================
      "Note: Do not query database directy inside view, instead
      " call a method/function module to get data
      " call business logic for a table of possible values
      "=================================================
      SELECT carrid
             carrname
        FROM scarr
        INTO TABLE lt_select_list
        WHERE carrid IN lt_so_carrid.
      IF lt_select_list[] IS INITIAL.
       "==========================================
        " Report attribute error message here
        "==========================================
        DATA lo_ovs             TYPE REF TO iwci_wdr_ovs.
        DATA lo_context         TYPE REF TO if_wd_context.
        DATA lo_context_node    TYPE REF TO if_wd_context_node.
        DATA lo_el              TYPE REF TO if_wd_context_element.
        DATA lo_ovs_listener    TYPE REF TO if_wdr_ovs_listener.
        DATA lo_message_manager TYPE REF TO if_wd_message_manager.
       " get reference of ovs component usage
        lo_ovs = wd_this->wd_cpifc_test_ovs( ).
       " get the context of ovs component
        lo_context = lo_ovs->wd_get_api( )->get_context( ).
       " get input node reference
        lo_context_node = lo_context->root_node->get_child_node( 'INPUT').
       " get reference to the context element by using lead index
        lo_el = lo_context_node->get_element( ).
       " get reference to message manager
        lo_message_manager = wd_this->wd_get_api( )->get_message_manager( ).
*         report message
        CALL METHOD lo_message_manager->report_attribute_error_message
          EXPORTING
            message_text   = 'Invalid entry - ( Attribute error message )'
            element        = lo_el
            attribute_name = 'CARRID'.  " Attribute Name
       "==========================================
        " Report standard error message here
        "==========================================
        DATA lt_messages TYPE if_wd_ovs=>ty_t_messages.
        DATA ls_messages LIKE LINE OF lt_messages.
       CLEAR ls_messages.
        CLEAR lt_messages.
       ls_messages-standard_message-text = 'Invalid entry ( Standard message )' .
        ls_messages-standard_message-type = if_wd_message_manager=>co_type_error.
        APPEND ls_messages TO lt_messages.
       ovs_callback_object->set_messages( messages = lt_messages ).
      ENDIF.
      ovs_callback_object->set_output_table( output = lt_select_list ).
   WHEN if_wd_ovs=>co_phase_3.
*   apply result
      IF ovs_callback_object->selection IS NOT BOUND.
******** TODO exception handling
      ENDIF.
      ASSIGN ovs_callback_object->selection->* TO <LS_SELECTION>.
      IF <LS_SELECTION> IS ASSIGNED.
        ovs_callback_object->context_element->set_static_attributes(
                               static_attributes = <LS_SELECTION> ).
      ENDIF.
  ENDCASE.
ENDMETHOD.

저장하고 활성화 합니다.

 

 

Step 7:

 

웹딘프로 어플리케이션을 만듭니다.

6.PNG

 

실행 결과: (최초 OVS 모습)

O1.PNG

실행 결과: (검색 결과)

o2.PNG

 

실행 결과: (CARRID 필드에 에러 발생)

o3.PNG

 

이 글이 OVS 입력 필드 점검 메시지 처리에 도움이 되시길 바랍니다.

 

댓글 언제나 환영합니다.

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2013/12/30/how-to-validate-the-fields-on-ovs-window-webdynpro-abap/

저작자 표시 변경 금지
신고
Posted by boy0

티스토리 툴바