boy0

[번역] 스탠다드 컴포넌트에 enhancement 없이 UI 엘리먼트 동적 변경 (BAdI)

ABAP/Web Dynpro ABAP(WDA)

[번역] 스탠다드 컴포넌트에 enhancement 없이 UI 엘리먼트 동적 변경 (BAdI)

Derby 2016. 12. 5. 13:34

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/10/18/dynamically-createmodify-ui-elements-of-standard-components-without-enhancing/

 

Dynamically Create/Modify UI elements of Standard components without Enhancing

October 18, 2014 

소개

 

보통 스탠다드 컴포넌트의 UI 엘리먼트 속성을 수정하려면, 해당 컴포넌트로 이동하여 enhancement를 해서 레이아웃의 UI 엘리먼트 속성을 수정(엘리먼트를 삭제하고 새로 엘리먼트를 추가하는 방법으로)하거나 또는 WDDOMODIFYVIEW 메소드에 pre/post-exit을 만들어서 속성 변경하는 코드를 넣는 방법이 있습니다.

 

스탠다드 컴포넌트에 enhancement를 작성하는 방법 대신 (가끔 enhancement를 원하지 않는 고객이 있지요) BAdI - WD_BADI_DOMODIFYVIEW 가 있습니다. 

 

이 글에서는 예제를 통해 스탠다드 컴포넌트에 enhancement 없이 UI 엘리먼트 속성을 동적 변경하여 보겠습니다.

 

진행

 

간단한 스탠다드 웹딘프로아밥 컴포넌트를 하나 선택합니다. 예를 들어 항공편 목록 프로그램입니다.

 

/wp-content/uploads/2014/10/1_566500.jpg

Depart.City를 입력하지 못하도록 하고 싶습니다.

/wp-content/uploads/2014/10/4_566501.jpg

 

보통은 해당 WDA 컴포넌트로 가서 enhancement를 하고 UI 엘리먼트는 삭제하거나 또는 WDDOMODIFYVIEW메소드에 post-exit을 만들고 코딩으로 UI 엘리먼트를 숨기도록 합니다.

 

이번에는 스탠다드 컴포넌트에 enhancement 없이, 전혀 스탠다드를 건드리지 않고 해보겠습니다. 방법은 바로 BAdI – WD_BADI_DOMODIFYVIEW 구현을 만드는 것입니다.

 

** WD_BADI_DOMODIFYVIEW 는 필터가 있는 바디 입니다. 필터 COMPONENT_NAME 과 VIEW_NAME 이 있습니다. 바디 구현을 만들때 이 필터에 해당 스탠다드 프로그램 값을 입력하여 만들겠습니다.

 

컴포넌트와 뷰의 이름을 찾아보겠습니다. ( 화면에서 오른쪽 버튼 클릭 -> 기술정보):

 

/wp-content/uploads/2014/10/2_566502.jpg

/wp-content/uploads/2014/10/3_566503.jpg

 

UI 엘리먼트의 ID를 찾아 보겠습니다: 기술정보 -> view and View Elements 탭:

/wp-content/uploads/2014/10/5_566504.jpg

 

또는, 티코드 SE80에서 웹딘프로 컴포넌트를 열어서 UI 엘리먼트 ID를 찾을 수 있습니다.

 

/wp-content/uploads/2014/10/6_566505.jpg

 

구현

티코드 SE18 로 이동하여 BAdI를 열어주세요.

/wp-content/uploads/2014/10/7_566506.jpg

해당 컴포넌트에 대해 (필터값 확인) 이미 구현된 것이 있는지 확인합니다. 없으면 구현을 하나 만들어 주세요. Implementations에서 마우스 오른쪽 버튼을 누르고 생성을 선택합니다.

/wp-content/uploads/2014/10/8_566507.jpg

Enhancement Implementation 과 설명을 입력하고 OK를 클릭합니다.

/wp-content/uploads/2014/10/9_566508.jpg

BAdI implementation name 과 설명을 입력하고 Implementation Class도 입력합니다.

/wp-content/uploads/2014/10/10_566509.jpg

 

이제 필터 값을 입력하겠습니다. (어느 컴포넌트와 뷰에 적용할 것인지).

/wp-content/uploads/2014/10/13_566510.jpg

주의: 만약 필터를 만들지 않으면, 모든 웹딘프로 어플리케이션을 대상으로 실행됩니다.(게다가 실행중 덤프가 발생할 수도 있습니다.).

 

마지막으로, 메소드 IF_WD_BADI_DOMODIFYVIEW~WDDOMODIFYVIEW 에 코딩을 합니다.

/wp-content/uploads/2014/10/11_566511.jpg

 

아래 코드를 입력하세요.

 

if_wd_badi_domodifyview~wddomodifyview
METHOD if_wd_badi_domodifyview~wddomodifyview.

     DATA lr_ui_elem TYPE REF TO cl_wd_uielement.

     IF first_time = abap_true.

*     Hide Depart.City Label

       lr_ui_elem ?= view->get_element( 'CITYFROM_LABEL_1_CP' ).

       lr_ui_elem->set_visible( cl_wd_uielement=>e_visible–none ).

*     Hide Depart.City Input

       lr_ui_elem ?= view->get_element( 'CITYFROM_INPUTFIELD_1_CP' ).

       lr_ui_elem->set_visible( cl_wd_uielement=>e_visible–none ).

     ENDIF.

  ENDMETHOD.

 

저장하고 활성화 합니다.

 

실행 결과

어플리케이션을 실행합니다. Depart.City의 레이블과 입력 필드가 숨겨진 것을 확인할 수 있습니다!.

/wp-content/uploads/2014/10/14_566513.jpg

 

결론

예제를 통해 간단히 살펴보았습니다. 서치핼프를 추가/변경 할 수도 있습니다. 레이블을 변경할 수 있습니다. 특정 UI 엘리먼트를 활성화/비활성화 할 수도 있습니다. 이런 일들을 스탠다드 enhancement 없이 단지 필터 값을 가진 BAdI를 구현하여 달성 할 수 있습니다.

 

자세한 코딩 방법에 대해서는 다음 글을 참고하세요: Auto Align UI Elements Dynamically in Web Dynpro ABAP

 

그리고, 동일한 필터에 대해 여러 구현을 만드는 것도 가능합니다.

 

제한사항

위 방법으로 UI 엘리먼트를 만들고 액션을 지정하는것 까지는 가능합니다.(예: 입력 필드/버튼) 그러나 액션에 대한 On_Action 메소드는 여기서 만들 수 없습니다. 그런 경우는 스탠다드 컴포넌트에 enhancement를 해야 합니다.

 

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2014/10/18/dynamically-createmodify-ui-elements-of-standard-components-without-enhancing/