쌓고 쌓다

[ABAP] ALV 버튼 컬럼 추가 및 버튼 클릭 이벤트 본문

SAP/ABAP

[ABAP] ALV 버튼 컬럼 추가 및 버튼 클릭 이벤트

승민아 2025. 2. 25. 10:05

ALV 버튼 컬럼 추가

ALV에 위와 같은 버튼을 띄워보자.

 

우선 버튼 위에 보일 텍스트 BTN_TEXT 필드와

버튼을 위한 IT_BTN 필드를 LVC_T_STYL 타입으로 추가한다.

 

BTN_TEXT 필드가 버튼 클릭시 COLUMN 들어가는 FIELDNAME이 됨을 알자!

IT_BTN이 버튼 클릭 이벤트에 발생한 COLUMN명이 되는게 아니다!

 

 

LVC_S_STYL 타입으로 변수명 LS_BTN을 선언한다.

 

List Data에 버튼을 표시하고자하는 Structure에

BTN_TEXT 필드에 버튼 위에 표시할 텍스트와

 

LS_BTN 변수에 FIELDNAME(선언한 버튼 텍스트의 필드명), STYLE을 작성하고

표시하고자하는 Structure에 APPEND(할당) 해준다. 

 

Layout 변수를 선언하고

 

ALV의 화면 호출 메서드 SET_TABLE_ FOR_FIRST_DISPLAY에

Layout 변수의 STYLEFNAME에 버튼을 위해 추가해준 필드명을 적고

IS_LAYOUT에 Layout Structure를 넘겨준다.

 

버튼을 위해 추가한 필드를 ALV에 표시하기 위해서

Field Catalog에 추가한 필드를 추가 설정을 해주어야한다.

 

왜냐하면 현재 I_STRUCTURE_NAME에 적힌 ABAP Dictionary에 있는

Structure명에 없는 추가적인 필드는 Field Catalog를 설정해주지 않으면 ALV에 표시되지 않기 때문이다.

 

 

필드카탈로그 추가를 위해 LVC_T_FCAT 타입으로 변수를 선언한다.

 

필드 카탈로그에 'BTN_TEXT' 필드를 추가해주고

표시할 컬럼 텍스트를 작성한다.

 

설정한 Field Catalog를 IT_FIELDCATALOG 파라미터로 넘겨주면 된다.

 

ALV에 버튼이 생성된 모습니다.

 

버튼 클릭시 동작은?

버튼 클릭 이벤트를 정의하면 된다.

버튼 클릭시 발생하는 이벤트는 BUTTON_CLICK이다.

ALV의 한 ROW에 여러 컬럼에 버튼이 있을 수 있으므로

ES_COL_ID를 통해 FIELDNAME을 구분할 수 있다.

 

ALV의 하나의 ROW에 여러 버튼이 존재할 수 있으므로

ES_COL_ID-FIELDNAME을 통해 누른 버튼 컬럼을 구분할 수 있다.

 

TEXT_BUTTON_1을 누른다면 LS_ANSWER에는 '1'

TEXT_BUTTON_2를 누른다면 LS_ANSWER에는 '2' 가 들어온다.

 

위의 이벤트를 HANDLER에 등록해주어야지 동작한다.

 

버튼 클릭시 팝업창이 뜬다.

 

ALV GRID 오브젝트를 생성할때

I_APPL_EVENTS 파라미터에 'X' 값을 넘겨주자.

 

아직은 안와닿지만

 

I_APPL_EVENTS = ‘X’

를 줘야지 이벤트 메소드가 다 실행된 후에 다시 PAI PBO 스크린으로 돌아온다.

우린 메시지만 보여주기 떄문에 안해도 된다.

즉 스크린에서 클래스로 넘어가면 다시 스크린으로 돌아오지 않는다

다시 스크린으로 돌아와 PAI가 타게끔하는게 I_APPL_EVENTS에 값을 주는 것이다.

 

또 다른 방법으로 수동으로 호출하여 해당 스크린의 PAI를 타게하는 방법이 있다.

 

CL_GUI_CFW 클래스의 SET_NEW_OK_CODE 메소드이다.

 

임의의 Function Code를 작성하거나

USER_COMMAND에 있는 원하는 Function Code를 타게끔

NEW_CODE를 작성해주면 된다.

 

NEW_CODE에 OK_CODE를 태울 Function Code를 입력하면 되는 것이다.

 

SET_NEW_OK_CODE 메소드가 실행되고

USER_COMMAND를 탐으로써

다시 해당 스크린의 PAI PBO가 실행됨을 알 수 있다.

 

 

현재 ALV를 초기화하는 부분에

IF GO_ALV_GRID IS INITITAL.

~

ELSE.

"REFRESH ALV "

ENDIF.

 

ELSE문을 타게되어 ALV가 REFRESH가 된다.

USER_COMMAND에 REFRESH를 넣고 ALV를 새로고침하는

REFRESH OK_CODE를 타게하는 방법도 가능하다.

Comments