이번 포스팅에서는 ALV Edit 모드 시 추가 로직 구현에 있어 사용되는 Event에 대해 알아보도록 하겠다.

앞서 ALV EDIT 모드에 대해서도 한번 포스팅을 해두었으니 참고하도록 하자.

[ABAP Working Lv./ALV] - |ALV| EDIT 모드 

 

입력(변경) 데이터에 대해서 유효성 점검 또는 다른 필드의 데이터 입력 자동화 같은 추가 로직 구현은 Event "DATA_CHANGED"와 "DATA_CHANGED_FINISHED"를 사용하여 로직을 구현한다. 

 

Event "DATA_CHANGED"는 ALV 데이터의 변경이 인지되었을 때 수행되며, 인터널 테이블에는 아직 변경 값이 반영되기 전 시점이다. 변경을 인지하는 것은 Method "CHECK_CHANGED_DATA" 사용하거나 Method "REGISTER_EDIT_EVENT" 를 등록했을 경우를 말한다. 변경된 데이터는 Parameter "er_data_changed"를 통

해 제어할 수 있으며, 구현될 로직에 따라 Attribute와 Method를 적절하게 찾아 사용하면 된다. 

 

< DATA_CHANGED Event 예제 >

 

Parameter ER_DATA_CHANGED Object(객체)에서 자주 사용되는 Attribute  

MT_MOD_CELLS 변경된 Cell의 정보를 담고 있는 인터널테이블
( 에러와 상관없이 변경된 모든 데이터를 담고 있다. )
MT_GOOD_CELLS 변경된 Cell의 정보를 담고 있는 인터널테이블
( 에러가 없는 변경 데이터를 담고 있다. )
MP_MOD_ROWS 변경된 Row을 담은 인터널테이블의 Data reference
( ALV 인터널테이블과 동일 구조 ) 
MT_DELETED_ROWS 삭제된 Row의 정보를 담고 있는 인터널테이블
MT_INSERTED_ROWS 추가된 Row의 정보를 담고 있는 인터널테이블

 

Parameter ER_DATA_CHANGED Object(객체)에서 자주 사용되는 Method  

GET_CELL_VALUE 특정 Cell의 값을 가져오기
MODIFY_CELL 특정 Cell에 값 반영하기
MODIFY_STYLE 특정 Cell에 Style 반영하기
ADD_PROTOCOL_ENTRY ALV Error Log 팝업 창에 보여질 메세지 저장 
( * 에러 메세지는 해당 Cell의 문제가 해결될 때 까지 유지 )

 

Event "DATA_CHANGED_FINISHED"는 변경이 완료(After Commit)되는 시점에 수행되는데, 변경된 데이터가 ALV 인터널 테이블에 반영이 되었을 때를 말한다. 단, 이때 변경된 데이터는 Event "DATA_CHANGED"에서 Method "MODIFY_CELL"처럼 직접 값을 변경하는 경우가 아닌 화면에서 직접 key-in 하여 변경된 데이터를 말한다. 또한 Event "DATA_CHANGED"에서 변경 데이터 중 오류가 발생했다면 해당 값은 ALV 인터널 테이블에 반영이 되지 않으며, Event "DATA_CHANGED_FINISHED"는 수행되지 않는다. Event "DATA_CHANGED" 와는 달리 Parameter "er_data_changed"는 없으며, Parameter "et_good_cells" 통해 ALV 인터널 테이블에 최종으로 반영된 변경 데이터를 확인할 수 있다. 

 

따라서 일반적으로 데이터 변경 시 Event "DATA_CHANGED"가 호출되고 에러가 없다면 Event "DATA_CAHGNED_FINISHED"가 다음으로 호출된다. Method "CHECK_CHANGED_DATA" 같이 화면의 변경된 값을 인터널 테이블에 반영 시에도 일반적으로는 Event "DATA_CHANGED"가 먼저 호출되지만, 변경된 데이터가 없다면 Event "DATA_CHAGNED"는 Skip되고 "DATA_CHAGNED_FINISHED"만 수행하게 된다. 

 

간혹 과거에 개발된 내역을 보면 해당 이벤트 내에서 ALV 인터널 테이블 변경 시 제공된 Method를 사용하지 않고 기존 인터널 테이블 변경처럼 "MODIFY" 구문으로 데이터 수정 후 Method "REFRESH_TABLE_DISPLAY"를 사용하여 화면과 ALV 인터널 테이블을 동기화하는 경우가 있는데, 결과적으로는 같은 효과이지만 REFRESH Method는 데이터가 많은 경우 퍼포먼스 저하를 일으킬 수 있으므로 최대한 이벤트에 제공된 Method를 활용하도록 하자. 

 

+ Recent posts