# 시작하기 전..
# 프로젝트를 하면서 ALV CRUD를 하는 경우가 많이 생긴다.
# 그중에 많이 사용하는 이벤트인 " REGISTER_EDIT_EVENT "이다.
# 사용자가 입력한 값에 따라서 변경이 되는 ALV에 대해서 알아보자.
# 우선 기본적으로 ALV Cell을 활성화/비활성화가 되어있어야 하기 때문에 안 되어있다면 다음 링크에서 하고 넘어오자.
2022.04.15 - [.ABAP/..ALV] - SAP ALV cell edit 설정( Enabled, Disabled )
# 시작하기 앞서 추가해야 할 것은 다음과 같다.
- Include P01 ( ALV Class 관련 )
- Include A01 ( ALV Perform문 관련 )
- Set Handler 설정
- DATA_CHANGED 옵션 설정
# 01. INCLUDE P01 or A01
# 추가하는 이유는 기본적으로 Include F01 있지만, 나중에 ALV 개수가 많아지거나 기능이 많아지면, 찾기가 힘들기 때문에 따로 만든 것이다.
# 01. 기본적인 Class을 설정해 보자.
# 02. 우리가 사용할 [ Data_Changed ]와 [ DATA_Changed_Finished ]을 등록해 보자.
우선 두 개의 차이점을 알아보자.
## DATA_CHANGED
- 사용자가 셀의 값을 바꾸면 이벤트가 발생해, 유효성 검사나 값 보정을 수행한다.
물론, 옵션에 따라서 [ ENTER ]을 쳤을 때 또는 다른 [ CELL ]을 눌렀을 때 달라지게 된다.
- 이때는 화면인 "ALV"만 바뀌는 것이지, 인터널 테이블에 값이 바뀌는 건 아니다.
- 데이터 검증할 때 필요한 이벤트이다.
# DATA_CHANGED 이벤트 탔을 때 #
## DATA_CHANGED_FINISHED
- 위에 [ DATA_CHANGED ] 이벤트가 성공적으로 끝나면, 발생하는 이벤트이다.
- 이때는 인터널 테이블이 실제로 변경이 되는 역할이라고 생각하면 된다.
- 즉 " 이제 다 수정. 확인했으니 최종적으로 한 번 더 후속 로직을 돌려라 " 하는 뜻으로 이해해 보자.
# DATA_CHANGED_FINISHED 이벤트 탔을 때 #
# 03. Include A01도 똑같이 생성해 보자.
# 02. SET HANDLER 설정
# 01. 앞에서 설정하였던 Event PERFORM문을 생성해 보자.
# 02. 앞에서 선언하였던 " GO_EVENT "을 통해서 SET HANDLER을 [ INCLUDE A01 ]에 설정해 보자.
# 자 이제 실행을 해보자!!
# 03. DATA CHANGED 옵션 설정
# 실행을 하면 [ DATA_CHANGED ] 이벤트가 발생이 안될 것이다. 그 이유는 옵션 설정을 안 해서....
옵션 설정 해보자!
# 01. 일단 관리하기 위해서 PERFORM문( Include A01 )을 생성해 보자.
# 02. 여러 이벤트를 알아보자.
# [ MC_EVT_ENTER ]
- [ Enter ] 키 입력 순간 발생
# [ MC_EVT_MODIFIED ]
- [ 사용자가 셀 값을 수정(변경) 완료했을 때 발생하는 이벤트 설정 ]
# [ MC_EVT_DELAYED_CHANGE_SELECT ] or [ MC_EVT_DELAYED_MOVE_CURR_CELL ]
- 바로 발생하는 것이 아닌 지연을 줘서 어떤 행동이 끝났을 때 발생하는 이벤트이다.
- 값 변경이나 커서를 이동시켰을 때 이벤트가 너무 빈번하게 발생하는 것을 방지한다.
- 한 번도 써본 적이 없긴 하지만 참고용으로 확인해 보자.
# 03. 우리는 [ ENTER ]을 설정해야 하기 때문에, [ MC_EVT_ENTER ] 이것만 등록해 보자.
" Enter 눌렀을 때 "
G_ALV_GRID01->REGISTER_EDIT_EVENT(
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
).
# 04. 그럼 제대로 작동이 될 것이다.
# 04. DATA CHANGED 중요한 부분
# 위에서 설명했듯이 Data Changed 이벤트를 제대로 발생시켰다고 해도, 인터널 테이블을 확인해 보면 다음과 같이 안 바뀌어 있다.
# 만약 어떤 시점에 둘 다 바뀐 걸 보고싶다면 [ DATA_CHANGED_FINISHED ] 설정해야 한다.
# 01. 설정하였던 METHOD로 가서 PERFORM문을 생성해 보자. ( Incldue A01 )
PERFORM ALV_DATA_CHANGED
USING
ER_DATA_CHANGED
E_ONF4
E_ONF4_BEFORE
E_ONF4_AFTER.
# 02. [ ER_DATA_CHANGED ] CLASS 안에는 다음과 같이 다양한 정보들이 들어있다.
우리는 이 CLASS을 통해서 실시간으로 변경된 데이터를 확인할 것이다.
# 여기서 [ P_ONF4 ], [ P_ONF4_BEFORE ], [ P_ONDF4_AFTER ]은 F4을 눌렀을 때 값이 들어가기 때문에 상황에 맞춰서 로직을 짜면 될 것 같다.
# 03. 이 로직을 통해 변경했었던 값들( LT_GOOD_CELLS )을 알 수 있다.
# 04. 다 건의 데이터가 변경될 수도 있기 때문에 LOOP문을 사용해 보자.
# 05. 이제 ALV에서 변경했던 값들을 가져와서 해당 방법으로 상태에 맞게 변경해 보자.
# 대부분 Data_changed을 통해 유효성 검사를 해서 하나의 필드 값이 변경될 때 다른 필드의 상태 값 또는 내역(자재내역, 플랜트내역, 코스트센터 등)이 변경되게 하는 방법이 있다.
# 여기서는 [ CARRID ]을 " GJ "으로 변경했을 때, " GAMJA "라는 값이 [ CARRNAME ]에 들어가게 설정해 보자. ( 유효성 검사는 빼겠다. )
# MODIFY_CELL을 통해서 값을 변경해 보자. #
## METHOD [ MODIFY_CELL ]을 사용하는 이유 ##
- 간단 - 인터널 테이블의 값 변경하려고
# 우리가 ALV에서 해당 필드를 변경했을 때에 [ LT_GOOD_CELLS ] 값을 보면, 내가 변경했던 필드, 값에 대한 정보들이 들어가게 된다.
# 우리가 변경해야 할 [ CARRNAME ] 필드의 정보들이 없기 때문에, 해당 [ CARRNAME ]을 바꿀 수 없게 된다. 그렇기 때문에 [ MODIFY_CELL ]을 통해 원하는 필드를 정해서 변경할 수 있게 된다.
# 06. 실행을 해보면? 다음과 같이 변경이 되게 된다.
# 참고 #
# 만약, 한 줄에 여러 값을 넣었을 때, [ CURRCODE ] 값을 먼저 읽어서 유효성 검사를 할 때가 있을 것이다.
# 예를 들어) [ USD ] 일 때, [ GJ ] 값이 못 들어가게 설정하고 싶을 때...
# METHOD [ GET_CELL_VALUE ]을 통해서 가져오게 할 수 있다.
# DATA_CHANGED_FINISHED에 대해서
# 이 이벤트는 DATA_CHANGED가 제대로 끝나면 타는 이벤트이며, 보통 ALV Refresh을 설정해서 Layout, Field Catalog, Sort 등 ALV에 대한 옵션들을 다시 Refresh 하는 용도로 알고 있으면 좋다.
# 중요한 점은 ALV을 꼭 Refresh을 사용하지 않아도 이벤트를 설정해 놓으면 자동으로 REFRESH가 된다는 점
- 변경했을 때 -
# 인터널 테이블의 값이 안 바뀌어있는 걸 볼 수 있다 #
# 하지만[ DATA_CHANGED_FINISHED ] 탔을 때는 [ REFRESH ] 사용 안 해도 값이 변경되어 있는 걸 볼 수 있다.
# 또한, 필드 값이 바뀔 때마다 이 이벤트가 타기 때문에 잘 참고하고 사용하자.
끝..!!
도움이 되셨으면 하단에 있는 광고 한번씩 눌러주세유!!
'.ABAP > ..ALV' 카테고리의 다른 글
SAP ALV Toolbar Button(버튼) 설정 (0) | 2024.12.05 |
---|---|
SAP ALV Tree 정리 - 2 ( 데이터에 따른 노드 설정 ) (0) | 2024.11.24 |
SAP ALV Tree 정리 - 1 ( 데이터에 따른 노드 설정 ) (0) | 2024.11.22 |
SAP ALV 일관성 점검( Consistency Check ) (0) | 2024.11.21 |
SAP ALV ROW Color 설정 (0) | 2024.11.07 |