이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
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:
웹딘프로아밥 컴포넌트를 아래 그림처럼 만듭니다.
Step 2:
컴포넌트 WDR_OVS를 컴포넌트 재사용으로 등록합니다.
Step 3:
컴포넌트 재사용 TEST_OVS를 뷰 V_MAIN에 등록합니다.
Step 4:
컨텍스트 노드 SCARR를 만들고 어트리뷰트 CARRID 와 CARRNAME 을 추가합니다. 어트리뷰트 CARRID 에는 ovs를 지정합니다.
Step 5:
뷰 레이아웃에서 노드 SCARR에 대한 입력 필드를 2개 만듭니다.
Step 6:
이벤트 핸들러 ON_OVS를 만듭니다.
아래 코드를 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:
웹딘프로 어플리케이션을 만듭니다.
실행 결과: (최초 OVS 모습)
실행 결과: (검색 결과)
실행 결과: (CARRID 필드에 에러 발생)
이 글이 OVS 입력 필드 점검 메시지 처리에 도움이 되시길 바랍니다.
댓글 언제나 환영합니다.
이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2013/12/30/how-to-validate-the-fields-on-ovs-window-webdynpro-abap/