이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
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/

+ Recent posts