소개

 

보통 스탠다드 컴포넌트의 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를 해야 합니다.