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

 

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

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/03/10/custom-timeout-page-for-web-dynpro-applications/

Custom timeout page for Web Dynpro applications

March 10, 2014 

 

 

     사용자들은 가끔 여러창에 웹딘프로 어플리케이션 여러개를 열어둘 떄가 있습니다. 일정시간(BC 설정에 따라 다름)이 흐른후 세션이 자동으로 닫힙니다. 그러면 어플리케이션 서버(Web AS)는 다임아웃 결과를 보여줍니다. 사용자 입장에서는 이런 동작이 혼란스러울 수 있습니다.


요구사항:

     세션 타임아웃 페이지를 만들고 싶습니다. 원래 스탠다드 페이지는 이렇습니다:


     대신 아래처럼 커스텀(회사 고유의) 페이지를 만들고 싶습니다. 여기에는 F5(새로고침) 기능과 아주 큰 "새로고침" 버튼을 넣고 싶습니다:

/wp-content/uploads/2014/03/timeout_406882.png

     티코드 SICF에서 덤프날때와 세션 타임아웃에 대한 에러 처리를 application errors탭에서 지정할 수 있습니다:

/wp-content/uploads/2014/03/sicf_406884.png

     만약 explicit response page를 선택한다면 모든 종류의 어플리케이션 에러에 대해서 동작하는 에러 처리 페이지를 만들게 됩니다. 하지만 지금 원하는 것은 약간 다릅니다. 다른 에러는 아니고 오직 타임아웃에 대해서만 커스텀 페이지를 만들고 싶습니다.

     explicit page는 HTML+CSS로 만들 수 있습니다. 그러나 가장 불편한 점은 자바스크립트를 쓸 수 없다는 것입니다. 즉, 에러 타입을 검사하여 각자 다른 에러 페이지를 보여주도록 만들 수 가 없습니다.

  

해결방법:

     리다이렉트나 시스템 태그 <%=MESSAGE%> 등 여러가지 시행착오 끝에 아주 간단한 해결방법을 찾았습니다. (오컴의 면도날: "같은 현상을 설명하는 두 개의 주장이 있다면, 간단한 쪽을 선택하라"):

     1. 에러 페이지를 .html로 만듭니다. (Notepad++ 등의 프로그램을 사용, 시스템에 기록을 남기고 싶다면 BSP로 저장하는것도 좋습니다).

BSP.png

     2. 티코드 SOTR_EDIT에서 OTR 롱 텍스트를 만들고 앞서 만든 파일내용을 복사하여 붙여넣기 합니다. (이 OTR이 실제 explicit page로 보여질 내용입니다)

 

     3. 스탠다드 클래스 CL_WDR_CLIENT_ABSTRACT_HTTP의 메소드 PREPROCESS_REQUEST를 수정해야 합니다. (이 작업은 enhancement로 할 수 없고 반드시 modify해야 합니다.)

/wp-content/uploads/2014/03/wdr_406888.png

     여기에 직접 코드를 나열하기 보다는 다른 클래스에 코드를 넣고 메소드를 호출하도록 구현하였습니다. 또한 모든 어플리케이션의 타임아웃 페이지에 사용하고자 하는것이 안니라 특정 어플리케이션만 지정하여 적용할 것입니다. 특정 어플리케이션만 지정하기 위해서 테이블을 하나 만들어서 거기에 웹딘프로아밥 어플리케이션 아이디와 사용여부 플래그를 저장했습니다.

 

method handle.

  data:
    lr_server    type ref to cl_http_server,
    lt_path      type string_table,
    ls_appl      type ytpf_t_appl_list,                       "#EC NEEDED
    ls_page      type icf_response_page,
    lv_index     type i,
    lv_service  type string.

lr_server ?= ir_server.
  if lr_server is bound.

     "cl_wdr_task=>application->name can NOT be used here, as the instance is already destroyed…
    split lr_server->m_runtime_memory_id at '/' into table lt_path[].

    if not lt_path[] is initial.
      describe table lt_path[] lines lv_index.
      read table lt_path[] into lv_service index lv_index. refresh lt_path[].

      if sy–subrc is initial.
        translate lv_service to upper case.

        select single service_name active
                             from ytpf_t_appl_list
                             into corresponding fields of ls_appl
                             where service_name eq lv_service
                                 and active       eq abap_true.

        if sy–subrc is initial.
          ls_page–body = '2C768A4E40741EE3A7A55C5708059340' "SOTR automatically generated GUID

          ir_server->set_page(
            exporting
              response_page_type   = ir_server->co_page_error_type
              response_option_page = ls_page
            exceptions
              invalid_parameter    = 1
              document_not_found   = 2
              others               = 3 ).

        endif.
      endif.
    endif.
  endif.

endmethod.

 

실행중에 어플리케이션 에러 타입이 세션 타임아웃인 경우 explicit page가 OTR 롱 텍스트에 저장해둔 커스텀 페이지로 바뀌어 보여집니다.

이방법은 IE 와 NWBC 모두 동작합니다.

 

오래전 부터 관련 논쟁이 게시판에 있었습니다. 참고: Custom timeout page in SICF

 

감사합니다. 댓글 환영합니다!

 

Tudor

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/03/10/custom-timeout-page-for-web-dynpro-applications/

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/03/12/providing-explicite-page-up-and-page-down-functionallity-for-table-in-webdynpro-abap/

Providing explicite page up and page down functionallity for Table in Webdynpro ABAP

March 12, 2014 | 8 Views |

 

요약:
테이블 엘리먼트의 속성 firstVisibleRow를 활용하면 명시적 페이지 표시가 가능합니다.

 

단계별 구현:

1. 메인 뷰의 컨텍스트에서 어트리뷰트 PAGE_NO를 I 타입으로 만듭니다.

/wp-content/uploads/2014/03/hai1_408652.png

2. 테이블의 속성 firstVisibleRow에 컨텍스트 어트리뷰트 PAGE_NO를 바인딩 합니다.

 

/wp-content/uploads/2014/03/hai2_408651.png

3. 아래 코드를 WDDOINIT()에 입력합니다.

 

method WDDOINIT.

DATA lo_nd_vbak

TYPE REF TO if_wd_context_node.

data lv_no_of_records type i. "to count no of records in internal table

TYPES :

BEGIN OF type_vbak,
vbeln type vbak-vbeln,
erdat type vbak-erdat,
erzet type vbak-erzet,

checkbox(1) type c,

END OF type_vbak.

data lt_vbak type TABLE OF type_vbak.

* navigate from <CONTEXT> to <VBAK> via lead selection
lo_nd_vbak = wd_context->get_child_node( name = 'VBAK' ).

SELECT vbeln erdat erzet from vbak INTO CORRESPONDING FIELDS OF TABLE lt_vbak UP TO 18 ROWS.if sy-subrc = 0.
no_of_records = sy-dbcnt.
ENDIF.

lo_nd_vbak->bind_table( lt_vbak ).

DATA lo_el_context TYPE REF TO if_wd_context_element.
DATA ls_context TYPE wd_this->element_context.
* get element via lead selection
lo_el_context = wd_context->get_element(  ).
* get single attribute
CALL METHOD LO_EL_CONTEXT->SET_ATTRIBUTE
EXPORTING
VALUE  = lv_no_of_records
NAME   = 'NO_OF_RECORDS'
.
endmethod.

 


4. 버튼 Page Up 과 Page Down 2개를 만듭니다. 두곳 모두에 액션 이벤트에 BUTTON_EVENT를 등록합니다.

/wp-content/uploads/2014/03/hai3_408662.png

5. 아래 코드를 ONACTIONBUTTON_EVENT( )에 입력합니다.

 

 

method ONACTIONBUTTON_ACTION .

data element_id type string.CALL METHOD WDEVENT->GET_STRING
EXPORTING
NAME   = 'ID'
RECEIVING
VALUE  = element_id.

DATA lo_el_context TYPE REF TO if_wd_context_element.
DATA ls_context TYPE wd_this->element_context.
DATA lv_page_no LIKE ls_context-page_no.
data lv_no_of_records LIKE ls_context-no_of_records.
* get element via lead selection
lo_el_context = wd_context->get_element(  ).
* get single attribute
lo_el_context->get_attribute(
EXPORTING
name =  `PAGE_NO`
IMPORTING
value = lv_page_no ).
* get single attribute
lo_el_context->get_attribute(
EXPORTING
name =  `NO_OF_RECORDS`
IMPORTING
value = lv_no_of_records ).

case element_id.

when 'PAGE_UP'.
if lv_page_no <= 0.

exit.

else.

lv_page_no = lv_page_no – 5.

endif.

WHEN 'PAGE_DOWN'.

if lv_page_no >= lv_no_of_records.
exit.

else.

lv_page_no = lv_page_no + 5 . "5 is default size of the table element
ENDIF.
ENDCASE.

CALL METHOD lo_el_context->set_attribute
EXPORTING
value  = lv_page_no
name   = 'PAGE_NO'
.

endmethod.

 


6. 활성화 하고 어플리케이션을 만들어서 테스트 합니다.

 

/wp-content/uploads/2014/03/hai4_408663.png

 

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/03/12/providing-explicite-page-up-and-page-down-functionallity-for-table-in-webdynpro-abap/

ABAP Objects 책 PDF 다운로드

http://plink.ucloud.com/public_link/link/b934ad420614336d

 

용량 266메가입니다.

 

Next Generation ABAP Development 책 PDF 다운로드

http://plink.ucloud.com/public_link/link/95b42861514ac624

 

용량 82메가입니다.

SAP 강의 동영상 중에 일반 동영상이 아닌게 제가 알기로는 sim , vcm 두가지 확장자가 있습니다.

 

.sim 확장자 파일은
SAP Tutor Player 프로그램을 다운로드 하세요.
http://service.sap.com/~sapidp/011000358700001572552002E

 

.vcm 확장자 파일은
Participant Application 프로그램을 다운로드 하세요.
http://www.corp.att.com/attconnectsupport/downloads/pa/

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/04/03/how-to-use-business-graphics-in-webdynpro-abap/

 

How to Use Business Graphics in Webdynpro Abap?

April 3, 2014 | 4 Views |

 

비지니스 그래픽 UI 엘리먼트

 

 

우선 티코드 SE11에서 테이블을 하나 만듭니다.

 

 

ZBG_DEMO

/wp-content/uploads/2014/04/tabl_strucvture_424779.png
    만든 테이블에 데이터를 좀 넣어 줍니다.

 

tbl2.PNG

 

 

웹딘프로

 

 

  • 웹딘프로 편집기로 이동하여 윈도우와 뷰를 하나씩 만듭니다(SE80).
  • 뷰 컨트롤러의 컨텍스트 탭에서 노드 ZBG_DEMO를 만들고 전체 필드를 추가합니다.
  • 뷰 컨트롤러의 레이아웃 탭에서 비지니스 그래픽 UI 엘리먼트를 추가합니다.

 

   

  1. 비지니스 그래픽 UI 엘리먼트의 속성 series source에 노드 ZBG_DEMO를 바인딩합니다.

 

bg1.PNG

 

 

 

  1. category를 하나 만들고 속성 description 과 tooltip 에 ZBG_DEMO노드의 TITLE을 바인딩 합니다.

 

category.PNG

 

step 3개를 추가합니다.
STEP1에서 속성 value 에 ZBG_DEMO노드의 VALUE1을 바인딩 합니다. 속성 ID , Label, Tooltip 을 그림처럼 입력합니다.

 

step1.PNG

 

STEP2에서 속성 value 에 ZBG_DEMO노드의 VALUE2을 바인딩 합니다. 속성 ID , Label, Tooltip 을 그림처럼 입력합니다.

 

step2.PNG

 

STEP3에서 속성 value 에 ZBG_DEMO노드의 VALUE3을 바인딩 합니다. 속성 ID , Label, Tooltip 을 그림처럼 입력합니다.

 

step3.PNG

 

 

 

 

 

 

코드

 

 

  • 뷰 컨트롤러의 wddoinit( ) 메소드에 아래 코드를 입력합니다.

 

 

 

    DATA lo_nd_zbg_demo TYPE REF TO if_wd_context_node.

    DATA lo_el_zbg_demo TYPE REF TO if_wd_context_element.

    DATA ls_zbg_demo TYPE wd_this->element_zbg_demo.

    DATA lt_zbg_demo TYPE wd_this->elements_zbg_demo.

    DATA wa_zbg_demo Like LINE OF lt_zbg_demo.
*   navigate from  to  via lead selection

    lo_nd_zbg_demo =

wd_context->get_child_node( name = wd_this>wdctx_zbg_demo ).

*   @TODO handle non existant child

   IF lo_nd_zbg_demo IS INITIAL.

   ENDIF.

*   get element via lead selection

    lo_el_zbg_demo = lo_nd_zbg_demo->get_element( ).
*   alternative access  via index
*   lo_el_zbg_demo = lo_nd_zbg_demo->get_element( index = 1 ).
*   @TODO handle not set lead selection

    IF lo_el_zbg_demo IS INITIAL.

    ENDIF.

   SELECT * from zbg_demo into CORRESPONDING FIELDS OF TABLE lt_zbg_demo.

   lo_nd_zbg_demo->bind_table( lt_zbg_demo ) .

 

 

******************************************************************************************************

  • 저장하고 활성화 합니다. 어플리케이션을 만들고 테스트합니다.

******************************************************************************************************

 

  • 만약 ALV도 표시하고 싶다면 아래 코드도 추가합니다.

 

 

*********************************alv code…
DATA lo_cmp_usage TYPE REF TO if_wd_component_usage.

lo_cmp_usage =   wd_this->wd_cpuse_alv( ).
IF lo_cmp_usage->has_active_component( ) IS INITIAL.

  lo_cmp_usage->create_component( ).
ENDIF.

********************************************
*
*
*•Get the ALV Modal and make the config changes
DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .

lo_interfacecontroller =   wd_this->wd_cpifc_alv( ).

  DATA lv_value TYPE REF TO cl_salv_wd_config_table.

  lv_value = lo_interfacecontroller->get_model(

   ).

*Set Visible Row Count as 5

  lv_value->if_salv_wd_table_settings~set_visible_row_count( ‘5’ ).

* *** set display as graphics with table

  lv_value->IF_SALV_WD_TABLE_SETTINGS~SET_DISPLAY_AS(‘2’).
*  lv_value->IF_SALV_WD_TABLE_SETTINGS~SET_DISPLAY_AS(’03’).

**********************************************************************

 

 

실행 결과 화면

bg_screen.PNG

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/04/03/how-to-use-business-graphics-in-webdynpro-abap/

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/06/03/adaptation-in-web-dynpro-abap-in-depth-analysis/

 

* 번역자의 의견 *
주의!! 스크롤의 압박이 있습니다. FPM의 원리를 알고 싶은 분만 읽어 보세요.
이 글은 SAP의 공식 입장이 아니라 David Fernandez Castro 개인의 분석입니다.
adaptation(각색), enhancement(강화), configuration(구성), customization(맞춤)은 번역하지 않고 단어 그대로 사용하였습니다.
personalization은 주로 개인화로 번역하였습니다.


 

Adaptation in Web Dynpro ABAP – In-depth analysis

June 3, 2014 

 

소개

웹딘프로아밥 adaptation은 웹딘프로아밥의 핵심 개념중 하나이고 FPM(Floorplan Manager)의 초석을 이루는 기술입니다. 최근 SAP의 UI 가이드라인에 따르면, FPM은 비지니스 어플리케이션의 UI 개발에 사용할 추천 기술입니다. 웹딘프로아밥 컴포넌트와 어플리케이션에 대한 adaptation은 웹딘프로아밥 컨피규레이션 프레임워크로써 제공됩니다.

이 글은 웹딘프로아밥 adaptation 개념에 대해 기술적 관점에서 매우 상세하게 분석해 보겠습니다. 설명에 사용되는 기술 용어들이 매우 유사한 의미를 가지지만 미묘한 차이가 있다는 것을 파악해야 합니다. 예를 들어 adaptation, configuration, customization, personalization은 동의어라고 할 수 있을 정도로 비슷한 단어 이지만 여기에서는 매우 다른 개념을 가지고 있다는 점을 염두해 두세요.

Adaptation의 계층구조와 각 계층

웹딘프로아밥 컨피규레이션 프레임워크라는 이름과는 다르게 단지 컨피규레이션만이 아니라 adaptation을 합니다. 웹딘프로아밥 adaptation 은 2가지 방식으로 분류합니다. 한가지 방식은, 계층 구조로 3개의 계층를 가집니다: configuration, customization, personalization(개인화); 그리고 다른 방식은, 2 종류로 분류하는데 built-in adaptation 과 component-defined adaptation 입니다.

WDA Configuration Framework matrix.jpg

그림 1. Adaptation의 계층구조와 built-in/component-defined 데이터 표현

위 그림은 잘알려진 웹딘프로아밥 adaptation 게층구조 표현입니다. 세로방향으로 3개의 계층 나뉘어져 있습니다. 각 계층에서 내부에 가로방향으로 2개의 종류가 있습니다. Customization은 개인화의 관리자모드(administrator personalization)라고 불리기도 합니다.

관리 주체

일반적으로 configuration 데이터는 개발자가, customization 데이터는 시스템 관리자가, 개인화 데이터는 각 사용자가 관리합니다. 여기서 개발자란 S_DEVELOP 권한이 있는 사람을 뜻하고, 관리자란 S_WDR_P13N 권한이 있는 사람을 뜻합니다.

데이터 적용 우선순위

개인화 데이터가 가장 높은 우선순위를 가집니다. 그 다음이 customization 데이터 그리고 다음이 configuration 데이터 입니다. 다른 말로 하자면 configuration 데이터가 기본으로 적용되지만 customization 데이터로 덮어써질 수 있고 개인화 데이터가 이 모든걸 덮어쓰고 최후에 적용될 수 있습니다. 하지만 예외적으로 configuration 이나 customization 에서 최종(final) 표시된 데이터는 더 높은 우선순위 데이터가 있더라도 변경 되지 않고 적용됩니다.

데이터 적용 범위

The scope of adaptation data is different for each adaptation data layer. The configuration data applies to the whole system, the customization data depends on the system client, and the personalization data depends on the user.

Built-in adaptation 데이터 와 component-defined adaptation 데이터

built-in adaptation 데이터는 웹딘프로아밥 컨피규레이션 프레임워크에 의해 직접 제공되는 데이터 입니다. 각 컴포넌트의 구현에 관계없이 모든 웹딘프로 컴포넌트에 동일하게 적용됩니다. 이것은 일반적인 adaptation으로 볼 수 있습니다. 기본적으로 UI 엘리먼트의 속성(보임/숨김, 텍스트 등)을 변경할 하는 것이라고 보면 됩니다.

그리고 또다른 종류의 adaptation 데이터가 있습니다. 바로 각 컴포넌트 별로 다르게 적용되는 component-defined adaptation 데이터 입니다. 이것을 정의하려면 WDA 컴포넌트에 컨피규레이션 컨트롤러를 만들어야 합니다. 컨피규레이션 컨트롤러에 어떤 데이터를 adaptation 해야 하는지 어트리뷰트를 정의합니다. 일반적이지 않고 각 컴포넌트 구현에 따라서 다른 데이터 구조를 가집니다.

adaptation 데이터 인스턴스 개념

콘크리트 adaptation, 이것은 공식 용어는 아니지만 쉽게 설명하기 위해 사용합니다. 콘크리트 adaptation 데이터는 하나의 웹딘프로아밥 컴포넌트 인스턴스를 위해 존재하는 adaptation 으로 3 계층을 포함합니다. 하나의 configuration 데이터 인스턴스, 클라이언트별로 여러개의 customization 데이터 인스턴스, 사용자별로 여러개의 개인화 데이터 인스턴스가 있습니다. 그림 1에서 설명한 내용을 대입하여 각 계층별로 맞춰보시기 바랍니다.

Adaptation hierarchy - Multiple instances.jpg

그림 2. adaptation 데이터 인스턴스 개념

그림 2에서는 하나의 configuration 데이터 인스턴스(system), 여러 customization 데이터 인스턴스(clients), 여러 개인화 데이터 인스턴스(users)를 보여줍니다. 하지만 실행시에는 웹딘프로아밥 컨피규레이션 프레임워크가 하나의 customization 데이터 인스턴스와 하나의 개인화 데이터 인스턴스만 선택할 것입니다. 선택과정은 나중에 다시 설명하겠습니다.

웹딘프로아밥 컴포넌트에 대한 adaptation - 컴포넌트 컨피규레이션

웹딘프로 아밥 컴포넌트는 웹딘프로아밥 컨피규레이션 프레임워크를 사용하여 adaptation 할 수 있습니다. 하나의 컴포넌트에 대해 여러개의 adaptation 인스턴스를 만들 수 있습니다. adaptation 데이터 인스턴스는 컴포넌트 컨피규레이션 이라는 곳에 저장됩니다. 이름 떄문에 의미가 햇갈릴 수 있으니 주의하세요. 컴포넌트 컨피규레이션은 단지 configuration만 저장하는게 아니라 adaptation 전체를 저장합니다. 각각의 컴포넌트 컨피규레이션은 각자 유일한 컨피규레이션 아이디를 가지고 있습니다.

웹딘프로아밥 컴포넌트는 여러개의 adaptation 인스턴스를 가질수 있기 때문에, 여러개의 컴포넌트 컨피규레이션에 의해 adaptation 될 수 있습니다. 반대 방향을 살펴보면 하나의 컴포넌트 컨피규레이션은 오직 하나의 adaptation 인스턴스 즉 하나의 웹딘프로아밥 컴포넌트만 가질 수 있습니다.

일반적으로 웹딘프로아밥 컴포넌트 adaptation 과정을 보면 개발자가 컴포넌트 컨피규레이션을 만드는 것으로 시작합니다. 그러나 이것만이 유일한 경우는 아닙니다. 컴포넌트 컨피규레이션이 암시적(implicitly)으로 시스템에 의해 자동 생성 되는 경우도 있습니다. 이렇게 두가지 경우로 구분할수 있습니다:

  • 명시적 컴포넌트 컨피규레이션, 이것은 TADIR 오브젝트 입니다. 보통 개발 오브젝트 처럼 아밥 저장소에 저장되고 CTS할 수 있습니다. 개발자가 아밥 워크벤치(SE80)에서 개발합니다. Z로 시작하는 컨피규레이션 아아디를 입력해야 합니다. 인스턴스가 한번 만들어지면 모든 adaptation 데이터(configuration 데이터, customization 데이터, 개인화 데이터)를 관리합니다.
  • 암시적 또는 이름없는 컴포넌트 컨피규레이션, 이것은 저장소에 저장되는 오브젝트가 아닙니다. 필요에 따라 웹딘프로아밥 컨피규레이션 프레임워크가 암시적으로 만들어냅니다. 컨피규레이션 아이디는 숫자와 알파벳을 혼용하여 자동으로 생성됩니다. 여기에는 configuration 데이터나 component-defined adaptation 데이터는 들어 있지 않습니다. 오직 built-in customization 데이터 와 built-in 개인화 데이터만 들어 있습니다. 웹딘프로 컨피규레이션 프레임워크는 웹딘프로아밥 어플리케이션과 컴포넌트 인스턴스/ 재사용에 대한 여러 조합에 각각 필요한 이름없는 컨피규레이션을 만들어 냅니다. 조합을 결정하는 자세한 과정은 아래에 다시 설명하겠습니다.

컴포넌트 컨피큐레이션 오브젝트에서 adaptation 데이터 관리

컴포넌트 컨피규레이션 오브젝트에서 adaptation 데이터 인스턴스는 추가되거나 변경될 수 있습니다. 각 계층에 따라 관리 방법이 다릅니다:

  • Configuration 데이터, 컨피큐레이션 에디터를 사용해서 명시적 컴포넌트 컨피규레이션을 관리 할 수 있습니다. 시작하는 방법은 스탠다드 웹딘프로아밥 어플리케이션 CONFIGURE_COMPONENT(컴포넌트는 WDR_CFGE_EDITOR)을 실행하면 됩니다. 물론, 개발시에 이렇게 해야하고 실행시에는 관리가 불가능 합니다. 예외로 실행시 관리하는 유일한 것은 바로 컨피규레이션 에디터 자체를 실행할때 입니다.
  • Customization 데이터, 커스터마이즈 에디터를 사용하여 관리합니다. 시작하는 방법은 스탠다드 웹딘프로아밥 어플리케이션 CUSTOMIZE_COMPONENT(컴포넌트는 WDR_CFGE_EDITOR)을 실행하면 됩니다. 물론, 개발시에 이렇게 해야합니다.  실행시에는 관리하는 방법도 있습니다. 바로 URL 파라미터 sap-config-mode=x 를 주어서 관리자 모드로 실행하는 것입니다. customization 데이터가 적용되는 범위는 오직 그 하나의 클라이언트라는 점을 주의하세요.
  • 개인화 데이터, 오직 실행시에만 관리할 수 있습니다. 그리고 개인화 비활성화 옵션을 사용하지 않아야 합니다. 각 사용자는 자신의 개인화 데이터만 관리할 수 있습니다. 데이터 자체가 개인에게 속한것이라 할 수 있습니다. 실행시 웹딘프로아밥 컨피큐레이션 프레임워크는 built-in 개인화 데이터만 관리합니다. 그러므로 component-defined 개인화 데이터를 관리하고 싶다면 개발 단계에서 미리 사용자가 개인화 관리를 할 수 있도록 해주어야 합니다. 개인화 비활성화 옵션은 웹딘프로아밥 어플리케이션 파라미터 WDDISABLEUSERPERSONALIZATION로 조정합니다.

아래 표를 통해 정리해 보았습니다.

 

ADAPTATION

MATRIX

Configuration Customization

개인화(Personalization)

Built-in

실행시: 불가.



개발시: CONFIGURE_COMPONENT 어플리케이션을 실행하여 관리. 명시적 컴포넌트 컨피규레이션만 가능.


실행시: 관리자 모드로 실행하면 마우스 오른쪽 버튼을 눌러 나온 메뉴로 들어갈 수 있음.



개발시: CUSTOMIZE_COMPONENT 어플리케이션을 실행하여 관리. 명시적 컴포넌트 컨피규레이션만 가능.




실행시: 실행중 마우스 오른쪽 버튼을 눌러 나온 메뉴로 들어갈 수 있음. 관리자모드가 아닐것. WDDISABLEUSERPERSONALIZATION 파라미터를 사용하지 않을것.





개발시: 불가.
Component-defined

실행시: 불가 (FPM은 가능).





개발시: CONFIGURE_COMPONENT 어플리케이션을 실행하여 관리. 명시적 컴포넌트 컨피규레이션만 가능.


실행시: 관리자 모드로 실행하면 마우스 오른쪽 버튼을 눌러 나온 메뉴로 들어갈 수 있음.



개발시: CUSTOMIZE_COMPONENT 어플리케이션을 실행하여 관리. 명시적 컴포넌트 컨피규레이션만 가능.


실행시: 불가. 개발 단계에서 미리 사용자가 개인화 관리를 할 수 있도록 해주어야 함.





개발시: 불가.

 

어플리케이션 컨피규레이션 오브젝트

어플리케이션 컨피규레이션 오브젝트는 adaptation 스키마에서 매우 중요합니다. 이것은 아밥 워크벤치에서 만듭니다. 항상 하나의 웹딘프로아밥 어플리케이션에 연결됩니다. 각 웹딘프로아밥 어플리케이션은 여러개의 어플리케이션 컨피규레이션이 연결될 수 있습니다. 어플리케이션 컨피규레이션 오브젝트는 TADIR 테이블에 타입 WDCA 오브젝트로 저장됩니다. 각각의 어플리케이션 컨피규레이션은 각자 유일한 컨피규레이션 아이디를 가지고 있습니다.

어플리케이션 컨피규레이션 오브젝트는 어떤 컴포넌트 컨피규레이션 오브젝트가 adaptation 되어야 하는지를 어플리케이션 관점에서 전체적으로 보는 지도 같은 존재 입니다. 어플리케이션에 속한 모든 컴포넌트에 대해서 컴포넌트 컨피규레이션을 지정할 필요는 없습니다. 명시적으로 지정하지 않은 경우는 웹딘프로아밥 컨피규레이션 프레임워크에 의해 이름없는 컴포넌트 컨피규레이션으로 인식하여 자동으로 관리합니다.

웹딘프로아밥 어플리케이션이 실행될때마다 특정 어플리케이션 컨피규레이션을 지정하여 실행하거나 명시적으로 지정하지 않은 경우 이름없는 어플리케이션 컨피규레이션이 자동으로 붙습니다. 두번째 경우라면, 어플리케이션에 속한 각 웹딘프로아밥 컴포넌트는 이름없는 컴포넌트 컨피규레이션 정책을 따릅니다. 반대로 어플리케이션 컨피규레이션을 지정하여 실행하면 각 컴포넌트에 어떤 컴포넌트 컨피규레이션을 사용하는지 알 수가 있습니다.

컴포넌트 컨피규레이션과 어플리케이션 컨피규레이션 둘은 FPM을 이루는 기반입니다. FPM을 사용하므로써 개발 기술이 웹딘프로아밥 컴포넌트를 전체 개발하는 방식에서 스탠다드 웹딘프로아밥 컴포넌트(FPM 컴포넌트)를 단지 adaptation 하는 형태로 개발 방식의 변경이 있습니다.

권장하는건 아니지만 컴포넌트 컨피규레이션 아이디와 어플리케이션 컨피규레이션 아이디를 동일하게 만들 수도 있습니다.

웹딘프로아밥 어플리케이션을 실행할때 2가지 방법으로 어플리케이션 컨피규레이션을 지정할 수 있습니다:

  • URL 파라미터 SAP-WD-CONFIGID 로 어플리케이션 컨피규레이션 아이디를 전달합니다. 컨피규레이션 아이디가 올바르다면 해당 어플리케이션 컨피규레이션이 지정됩니다. 올바르지 않다면 어플리케이션 컨피규레이션을 지정하지 않고 어플리케이션이 시작됩니다.
  • 만약 URL에 SAP-WD-CONFIG 파라미터가 없다면, 프레임워크는 웹딘프로아밥 어플리케이션 파라미터 WDCONFIGURATIONID를 확인합니다. WDCONFIGURATIONID에 값이 있고 그 컨피규레이션 아이디가 올바르다면 해당 어플리케이션 컨피규레이션이 지정됩니다. 올바르지 않다면 어플리케이션 컨피규레이션을 지정하지 않고 어플리케이션이 시작됩니다.

어플리케이션 컨피규레이션 오브젝트 정의는 테이블 WDY_CONFIG_APPL 에 저장됩니다.

실행시 동적으로 컴포넌트 컨피규레이션을 적용하는 방법

개발시에는 어플리케이션 컨피규레이션에서만 컴포넌트 컨피규레이션을 지정할 수 있습니다. 동적으로 컴포넌트 컨피규레이션을 변경해야 한다고 가정해 봅시다. 이런경우 어플리케이션 컨피규레이션은 적절한 컴포넌트 컨피규레이션을 동적으로 지정할 수 없습니다. 그러나 아밥 코드를 이용하여 실행중에 컴포넌트 컨피규레이션을 지정할 수 있는 방법이 있습니다. 사실 FPM 프레임워크가 UIBB(User Interface Building Block)를 지정할때 이 메소드를 사용합니다. (컨피규레이션 아이디는 개발시 미리 adaptation 데이터로 입력해 두긴 하지만 실행시 그 정보를 기반으로 변경합니다).

아래 코드를 WDDOINIT 메소드에 넣으면 컴포넌트 컨피규레이션을 실행중에 변경할 수 있습니다:

 

METHOD wddoinit .

   DATA lif_api        TYPE REF TO if_wd_component.

   DATA lif_adaptation TYPE REF TO if_wd_personalization.

   DATA ls_config      TYPE wdy_config_key.

   lif_api = wd_this->wd_get_api( ).

   lif_adaptation = lif_api->get_personalization_manager( ).

   CLEAR ls_config.

   ls_config–config_id = 'ZWD_DFC_1_COMP_CONFIG_2'.

   lif_adaptation->load_config_by_key( ls_config ).

ENDMETHOD.

 

위 예제 코드에서 컴포넌트 컨피규레이션으로 ZWD_DFC_1_COMP_CONFIG_2을 지정하였습니다.

adaptation 데이터를 CTS 전송하는 방법

CTS 가능한지와 주의사항은 각 계층별로 각각 다릅니다. 개인화 데이터는 전송할 수 없습니다. customization 데이터는 customizing request로 전송합니다. configuration 데이터는 workbench request로 전송합니다.

adaptation 데이터의 전송에는 테이블 WDY_CONF_USER, WDY_CONF_USERT, WDY_CONF_USERT2, WDY_CONF_UDEF를 포함합니다. 어플리케이션 컨피규레이션은 workbench request로 전송하고 내용은 WDY_CONFIG_APPL 테이블에 있습니다.

실행시 adaptation 데이터를 결정하는 과정

실행시 웹딘프로아밥 컨피규레이션 프레임워크는 adaptation 데이터를 결정하고 각 웹딘프로아밥 컴포넌트 인스턴스에 적용합니다. 그림 3 처럼 3단계 과정이 있습니다.

 

Adaptation data determination runtime process.jpg

그림 3. 각 웹딘프로아밥 컴포넌트 인스턴스에 대해 실행시 adaptation 데이터를 결정하는 과정

 

첫번째 단계에서는 웹딘프로아밥 컨피규레이션 프레임워크는 adaptation 데이터를 가져와야할 컨피규레이션 아이디를 읽어 옵니다. 다음 두번째 단계에서는 클라이언트와 사용자를 고려하여 필요한 모든 adaptation 데이터를 가져옵니다. 마지막으로 세번째 단계에서는 각 계층의 adaptation 데이터를 병합하여 최종 adaptation 데이터를 만들어 냅니다. 각 단계의 상세 설명은 아래에 더 있습니다. 이 모든것은 웹딘프로아밥 컴포넌트 하나의 입장에서 설명하는 것입니다.

단계 1: 컴포넌트 컨피규레이션 오브젝트를 가져옴

실행시에 웹딘프로아밥 컨피규레이션 프레임워크는 실행중인 각 웹딘프로아밥 컴포넌트 인스턴스별로 어떤 컴포넌트 컨피규레이션이 필요한지 결정합니다. 각 웹딘프로아밥 컴포넌트 인스턴스별로 모든 adaptation 데이터는 지정된 컴포넌트 컨피규레이션에서 읽어오고 그 컴포넌트 컨피규레이션 이름으로 저장하고 관리합니다. 웹딘프로아밥 컨피규레이션 프레임워크는 사용할 컨피규레이션 아이디를 결정합니다. 컨피규레이션 아이디는 어플리케이션 컨피규레이션에 지정된 값을 사용하거나 실행중에 아밥 코드로 동적으로 지정될 수도 있습니다. 만약 컨피규레이션 아이디가 아무것도 지정되지 않았거나 유효하지 않은 아이디 값을 입력한 경우, 프레임워크는 이름없는 컴포넌트 컨피규레이션 결정을 합니다.

이름없는 컴포넌트 컨피규레이션 결정

실행시, 일부 웹딘프로아밥 컴포넌트 인스턴스는 유효하지 않은 컨피규레이션 아이디를 가지는 경우도 있습니다. 웹딘프로아밥 컨피큐레이션 프레임워크는 이런 경우 이름없는 컨포넌트 컨피규레이션 결정을 합니다. 컨피규레이션 아이디는 프레임워크에 의해 자동으로 생성됩니다. 웹딘프로아밥 어플리케이션 이름과 웹딘프로아밥 컴포넌트 인스턴스에 따라 해시 펑션을 적용하여 아이디 값을 결정합니다.

Determinación ID de configuración genérico_EN.jpg

그림 4. 이름없는 컴포넌트 컨피규레이션에서 컨피규레이션 아이디 결정

그림 4는 웹딘프로 어플리케이션 ZWD_APPL 와 웹딘프로 컴포넌트 ZWD_MAIN 으로 실행하는 경우를 예를들어 보여주고 있습니다. ZWD_MAIN은 2개의 컴포넌트를 사용합니다. 컴포넌트 ZWD_COMP1를 USAGE_1으로 사용하고 컴포넌트 ZWD_COMP2는 USAGE_2로 사용합니다. 웹딘프로아밥 어플리케이션 ZWD_APPL은 어플리케이션 컨피규레이션 지정 없이 실행하였습니다. 그리고 동적인 컴포넌트 컨피규레이션 적용 코드도 없습니다. 그러므로 웹딘프로아밥 컨피규레이션 프레임워크는 각 웹딘프로아밥 컴포넌트 인스턴스에 (메인 컴포넌트(ZWD_MAIN), USAGE_1 재사용(ZWD_COMP1), USAGE_2 재사용(ZWD_COMP2)) 대해 이름없는 컴포넌트 컨피규레이션 결정을 합니다. 앞서 설명했듯이 컨피규레이션 아이디는 숫자와 알파벳을 혼용하여 자동으로 결정됩니다. 각 컨피규레이션 아이디 결정 과정은 어플리케이션이 변경되거나 컴포넌트가 변경되어도 항상 동일합니다. 웹딘프로아밥 컴포넌트 이름은 영향이 없고 컴포넌트 사용 이름(USAGE_1 과 USAGE_2)이 영향을 줍니다. 이것은 만약 USAGE_1의 실제 웹딘프로아밥 컴포넌트가 변경되더라도 (예를들어 ZWD_COMP1 에서 ZWD_COMP_OTHER로) 컨피규레이션 아이디는 동일할 것을 의미합니다.

단계 2: adaptation 데이터 읽음

다음은 앞 단계에서 결정한 컴포넌트 컨피규레이션 오브젝트에서 adaptation 데이터를 읽어오는 것입니다. 여기서는 각 adaptation 계층별로 각각 데이터를 읽어 옵니다. configuration 데이터는 컴포넌트 컨피규레이션으로 부터 직접 읽어 올 수 있습니다. customization 데이터는 해당 어플리케이션이 실행중인 클라이언트에 따라 데이터를 가져옵니다. 마지막으로 개인화 데이터는 해당 어플리케이션을 실행중인 사용자 아이디 별로 데이터를 가져옵니다.

Determinación de adaptación en configuración de componente_EN.jpg

그림 5. 계층별 adaptation 데이터 읽음

 

그림 5는 콘크리트 웹딘프로아밥 컴포넌트에서 계층별 adaptation 데이터 읽는 과정을 예를 들어 보여주고 있습니다. 이 예에서는 N개의 클라이언트와 M개의 사용자가 있음을 가정했습니다. 그림에 강조된 화살표를 따라가 보면 클라이언트는 "Client 1" 과 사용자는 "User M-1" 입니다.

단계 3: 각 계층의 adaptation 데이터를 병합

마지막으로, 앞 단계에서 읽어온 데이터를 병합하여 최종 adaptation 데이터를 만들어 냅니다. 병합의 의미는 configuration 데이터, customization 데이터, 개인화 데이터를 합친다는 뜻입니다. 이 과정은 중요한 점은 적용 우선순위로 개인화 데이터가 가장 높은 우선순위를 가지고 있고 그다음 customization 데이터이고 가장 낮은 우선순위는 configuration 데이터 입니다. 우선순위에 따른 데이터 적용 결정 과정이  CSS (Cascading Style Sheet)의 그것과 매우 유사합니다.

Delta handling with CSS_EN.jpg

그림 6. 계층 adaptation 데이터 병합을 CSS와 비교

 

adaptation의 계층 구조 적용은 폭포같은 방법으로 높은 우선순위를 가진 계층이 상속받은 낮은 우선순위 계층의 데이터를 덮어쓰는 방식 입니다. 그리고 최종(final) 표시가 안된것만 이렇게 높은 우선순위가 낮은 우선순위 데이터를 덮어쓰는 방식이 적용됩니다.

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/06/03/adaptation-in-web-dynpro-abap-in-depth-analysis/

 

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/06/16/how-to-report-only-one-error-message-for-many-mandatory-fields-in-web-dynpro-abap/

 

How to Report only one error message for many mandatory fields in Web Dynpro ABAP

June 16, 2014

 

필수값 체크를 위해서 보통은 클래스 CL_WD_DYNAMIC_TOOL의 메소드 CHECK_MANDATORY_ATTR_ON_VIEW( )를 호출합니다.

 

Yes, 이건 잘 동작합니다. 하지만 동일한 에러 메시지 “모든 필수 입력 필드를 채우십시오”를 여러 필드에 대해 여러번 출력하는 문제가 있습니다. 예를들어 필드가 100개면 100개의 에러 메시지가 출력됩니다. 

 

원래 실행 결과:

 

err.JPG

필수값 체크 에러가 발생했네요. 필드 하나당 메시지 하나씩 입니다.

 

err1.JPG

 

 

엄청난 스크롤이 메시지 영역에 나타났습니다. 메시지가 지루하게 많습니다. 게다가 화면 윗부분에 자리를 많이 차지하고 있습니다.

 

그럼 어떻게 하면 좋을까요?

          여러 필드 필수값 체크에 에러메시지 하나만 표시하기를 원한다면...

 

해결 방법:

 

 

  • 메소드 CHECK_MANDATORY_ATTR_ON_VIEW 호출시 메시지를 표시하지 않도록 파라미터 DISPLAY_MESSAGES = ABAP_FALSE 을 입력합니다.
  • 메시지는 인터널 테이블 lt_messages에 넣어 둡니다.
  • lt_messages에는 메시지 외에도 필수값 체크에 에러가 난 컨텍스트 엘리먼트와 어트리뷰트 정보가 들어 있습니다.
  • 각 컨텍스트 엘리먼트 별로 어트리뷰트 목록을 모아서 lt_attributes에 넣습니다.
  • IF_WD_MESSAGE_MANAGER의 메소드 REPORT_ELEMENT_ERROR_MESSAGE( )를 사용하여 각 컨텍스트 엘리먼트 별로 하나의 에러 메시지를 표시하도록 합니다.

 

이 해결 방법이 좋아 보입니다.

 

뷰의 WDDOBEFOREACTION( ) 메소드에 아래 코드를 입력해 주세요..

 

주의: 메시지는 컨텍스트 엘리먼트 별로 하나씩 표시 됩니다. 즉 뷰에 컨텍스트 노드가 여러개라면, 여러개의 메시지가 컨텍스트 엘리먼트 별로 하나씩 표시 됩니다.

 

WDDOBEFOREACTION( )
METHOD wddobeforeaction .

  DATA lo_api_controller            TYPE REF TO if_wd_view_controller.

  DATA lo_action                       TYPE REF TO if_wd_action.

  DATA lo_message_manager     TYPE REF TO if_wd_message_manager.

  DATA lt_attributes                   TYPE string_table.

  DATA lt_messages            TYPE cl_wd_dynamic_tool=>t_check_result_message_tab.

  DATA ls_messages            LIKE LINE OF lt_messages.

  lo_api_controller = wd_this->wd_get_api( ).

  lo_action = lo_api_controller->get_current_action( ).

  CALL METHOD lo_api_controller->get_message_manager

    RECEIVING

      message_manager = lo_message_manager.

  IF lo_action IS BOUND.

    CASE lo_action->name.

      WHEN 'CHECK_DATA'.

        cl_wd_dynamic_tool=>check_mandatory_attr_on_view(

          EXPORTING

        view_controller = lo_api_controller

        display_messages = abap_false

          IMPORTING

        messages = lt_messages ).

        CLEAR lt_attributes.

        “sort by context element,

        SORT lt_messages BY context_element.

        LOOP AT lt_messages INTO ls_messages.

          APPEND ls_messages-attribute_name TO lt_attributes.

          AT END OF context_element.

            ” if no attributes found for errors, skip error message

            IF lt_attributes[] IS INITIAL.

              CONTINUE.

            ENDIF.

            ”         report message

            CALL METHOD lo_message_manager->report_element_error_message

              EXPORTING

                message_text = 'Please fill all required fields'

                element      = ls_messages-context_element

                attributes   = lt_attributes.

     

           “Clear attributes list, for next context element

            CLEAR lt_attributes.

          ENDAT.

        ENDLOOP.

    ENDCASE.

  ENDIF.

ENDMETHOD.

 

실행 결과 - 1:

 

에러 메시지가 컨텍스트 엘리먼트 별로 하나씩 표시 됩니다

err2.JPG

실행 결과 - 2:

 

사용자가 영역 1 에 필수 값을 모두 입력하고 check data 버튼을 눌렀습니다,

err3.JPG

————————————-

이 글이 (컨텍스트 엘리먼트 별로) 메시지 하나만 출력하고자 하던 분들에게 도움이 되셨길 바랍니다.

 

그리고 모든 컨텍스트에 대해 메시지 하나만 표시하고 원하신다면 아래 글을 참고하세요.

 

How to Report one attribute error message for multiple fields in Web Dynpro ABAP

————————————

여러분의 소중한 피드백 / 제안 / 댓글 환영합니다.

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/06/16/how-to-report-only-one-error-message-for-many-mandatory-fields-in-web-dynpro-abap/

+ Recent posts