300x250
728x90

# 시작하기 전..


# 프로젝트를 하면서 ALV CRUD를 하는 경우가 많이 생긴다.

# 그중에 많이 사용하는 이벤트인 " REGISTER_EDIT_EVENT "이다.

# 사용자가 입력한 값에 따라서 변경이 되는 ALV에 대해서 알아보자. 

 

# 우선 기본적으로 ALV Cell활성화/비활성화가 되어있어야 하기 때문에 안 되어있다면 다음 링크에서 하고 넘어오자. 

2022.04.15 - [.ABAP/..ALV] - SAP ALV cell edit 설정( Enabled, Disabled )

 

SAP ALV cell edit 설정( Enabled, Disabled )

# SAP ALV Cell 관리하는 방법( Display -> Input ) 1. 전체 ALV을 Input으로 변경하는 방법 2. 몇 개 필드는 Enabled , 나머지 필드는 Disabled로 변경하는 방법이 있다. # 참고로 Enabled = Edit 가능 Disabled = Edit 불가

potato98.tistory.com

 

# 시작하기 앞서 추가해야 할 것은 다음과 같다. 

- 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 ] 사용 안 해도 값이 변경되어 있는 걸 볼 수 있다. 

# 또한, 필드 값바뀔 때마다이벤트가 타기 때문에 잘 참고하고 사용하자. 

 

 

끝..!!

 

 

도움이 되셨으면 하단에 있는 광고 한번씩 눌러주세유!!

 

 

728x90