웹딘프로아밥 테이블 필터링 적용된 데이터만 가져오는 스탠다드 메소드인 인터페이스 IF_WD_TABLE_METHOD_HNDL 의 GET_TABLE_DATA 에 해당하는 코드를 공유합니다.
SCN 커뮤니티 게시판에서 필터링 적용된 테이블 데이터를 가져오는 방법을 질문하는 글에 제대로된 답변이 없는 경우를 많이 보았습니다. 답은 정해져 있죠. 스탠다드 메소드인 인터페이스 IF_WD_TABLE_METHOD_HNDL 의 GET_TABLE_DATA를 사용하면 되는데 이게 시스템에 없는 경우가 있습니다. 아마도 GET_TABLE_DATA 메소드는 서버 버전이 SAP_ABA 731 이후 부터 사용가능 한것으로 보입니다.
그래서, 필터링 적용된 테이블 데이터를 가져오는 방법을 서버 버전에 상관없이 모두가 사용할 수 있도록 아래 로직을 만들었습니다.
선행 조건:
Webdynpro ABAP,& OO ABAP 에 대한 기본 지식이 필요합니다.
아래 메소드를 만들어 주세요.
Parameters: IO_TBL Importing type ref to CL_WD_TABLE RT_DATA Returning WDR_TABLE_ROW_DATA_TAB
METHOD get_table_data .
DATA elements TYPE wdr_context_element_set.
DATA element TYPE REF TO if_wd_context_element.
DATA row_data TYPE wdr_table_row_data.
DATA last_row_index TYPE i.
DATA first_row_index TYPE i.
DATA wd_row_arrangement_type_id TYPE guid.
DATA wd_row_arrangement TYPE REF TO cl_wd_view_element.
DATA first_actual_row TYPE i.
DATA fixed_row_count TYPE i.
DATA data_source TYPE REF TO if_wd_context_node.
DATA row_count TYPE i.
DATA selected_elements TYPE wdr_context_element_set.
DATA first_row TYPE i.
DATA last_row TYPE i value -1.
CONSTANTS c_none TYPE guid VALUE ''.
CLEAR rt_data.
CLEAR selected_elements.
row_count = 0.
IF data_source IS NOT BOUND.
data_source = io_tbl->get_data_source( ).
ENDIF.
wd_row_arrangement ?= io_tbl->get_row_arrangement( ).
IF wd_row_arrangement IS NOT BOUND.
wd_row_arrangement = io_tbl->get_master_column( ).
ENDIF.
IF wd_row_arrangement IS BOUND.
wd_row_arrangement_type_id = wd_row_arrangement->_cid.
ENDIF.
fixed_row_count = io_tbl->get_row_count( ).
first_actual_row = io_tbl->get_first_actual_row( ).
CASE wd_row_arrangement_type_id.
WHEN c_none.
selected_elements = data_source->get_selected_elements( ).
IF fixed_row_count = -1.
row_count = data_source->get_element_count( ) +
first_actual_row.
ELSE.
row_count = fixed_row_count.
ENDIF.
first_row_index = first_row - first_actual_row.
IF last_row = -1 OR
last_row > row_count.
last_row_index = row_count - first_actual_row.
ELSE.
last_row_index = last_row - first_actual_row.
ENDIF.
IF last_row_index >= first_row_index.
elements = data_source->get_elements( from = first_row_index
to = last_row_index ).
ENDIF.
LOOP AT elements INTO element.
row_data-context_element = element.
row_data-level = 0.
INSERT row_data INTO TABLE rt_data.
ENDLOOP.
ENDCASE.
ENDMETHOD.
|
컴포넌트 컨트롤러에 위 메소드 GET_TABLE_DATA 를 만들었다고 가정하겠습니다.
아래 사용방법에 따라 실행하면 필터링 적용된 데이터를 읽을 수 있습니다.
사용방법:
- 뷰의 어트리뷰트 탭으로 이동 하여 GO_TBL of type ref to CL_WD_TABLE를 추가 합니다.
- 메소드 WDDOMODIFYVIEW( ) 로 이동 하여 table ui element "MY_TABLE" 를 가져오는 아래 코드를 추가 합니다.
METHOD wddomodifyview .
IF first_time = abap_true.
"Note: my_table is the ui name of table in view layout
wd_this->go_tbl ?= view->get_element( 'MY_TABLE' ).
ENDIF.
ENDMETHOD.