abap 리포트 이벤트 템플릿(+구조)
오늘은 abap 리포트 이벤트 구조 템플릿에 대해서 정리해보도록 하겠습니다.
아밥 리포트는 크게 셀렉션 스크린(Selection-Screen), 화면 초기화 단계(Initialization), 입력 필드값 변경시(AT SELECTION-SCREEN), 최종 화면 스크린 아웃풋(AT SELECTION-SCREEN OUTPUT), 메인 로직(START-OF-SELECTION), PBO(Process Before Output), PAI(Process After Input) 등으로 이루어집니다.
기본적인 ABAP 리포트 이벤트 구조를 통해, 각 이벤트별 주요 처리 내역 및 예제를 정리해 보았습니다.
Initialization
Initialization 이벤트는 SELECTION-SCREEN이 화면에서 보여지기 전 먼저 처리되는 이벤트를 이야기 합니다.
즉, 프로그램을 티코드를 통해 실행했을 때 가장 먼저 실행되는 구간입니다.
Initialization 이벤트에서는 주로 변수값 및 오브젝트 초기화, 화면 기본값 등을 처리하게 됩니다.
INITIALIZATION.
P_GJAHR = SY-DATUM+0(4).
S_GJAHR-LOW = SY-DATUM+0(4).
S_GJAHR-OPTION = 'EQ'.
S_GJAHR-SIGN = 'I'.
APPEND S_GJAHR.
즉, 위의 예제와 같이, 프로그램이 실행되기 전 오늘 날짜를 기준으로 자동으로 회계연도를 현재 연도로 초기화 하는 등의 작업을 하게 됩니다.
AT SELECTION-SCREEN
AT SELECTION-SCREEN 이벤트는 셀렉션 스크린(Selection-Screen)에 정의한 입력 필드의 값이 변경되었을 때 실행되는 이벤트입니다.
위에서 설명한 INITIALIZATION과 START-OF-SELECTION 중간에 실행되는 이벤트로써, 초기화 이후 사용자가 입력 처리를 한 이후 발생하게 됩니다.
이 이벤트 단계에서는 입력값에 따른 분기 처리 및 입력된 값의 Validation, 셀렉션 스크린 버튼에 대한 이벤트 처리 등을 담당하게 됩니다.
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01'.
PERFORM EXCEL_DOWNLOAD.
ENDCASE.
위의 예제의 경우, 셀렉션 스크린의 버튼 커맨트 FC01을 실행했을 때 엑셀 폼과 관련된 이벤트를 실행하는 예제입니다.
또, 만약 특정 필드에 입력 가능한 값 중 입력되어서는 안되는 코드가 있는 경우에도 AT SELECTION-SCREEN에서 Validation 처리를 할 수 있습니다.
아래의 예제는 회사코드가 3000이 입력되면 더이상 진행되지 않도록 유효성을 점검하는 코드입니다.
AT SELECTION-SCREEN.
IF P_BUKRS = '3000'.
MESSAGE E000 WITH '사용할 수 없는 회사코드 입니다.'.
ENDIF.
AT SELECTION-SCREEN ON 스크린 필드
AT SELECTION-SCREEN ON은 특정 필드의 값 변경 여부에 따라 실행되는 이벤트입니다.
순서는 AT SELECTION-SCREEN ON /스크린필드/ 에 정의된 이벤트가 먼저 타고, AT SELECTION-SCREEN 이 타게 됩니다.
ON 다음에 지정된 스크린 필드가 변경되었을 때에만 해당 이벤트에 진입하게 됩니다.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR
AT SELECTION-SCREEN ON VALUE-REQUEST FOR 이벤트는 해당 필드에 F4 Search Help 이벤트를 연결해 줍니다.
즉, 필드 오른쪽에 Possible Entry 버튼을 누르거나 단축키 F4를 누르게 되면 발생하는 이벤트이며, Search Help Help Request 를 호출하게 됩니다.
아래의 ON VALUE-REQUEST FOR 예제는 P_FNAME 스크린 필드의 Possible Entry를 호출하게 되면 해당 이벤트를 타게 되고 아래의 Function KD_GET_FILENAME_ON_F4를 실행하게 됩니다.
KD_GET_FILENAME_ON_F4 함수는 파일 선택 다이얼로그를 호출해 줍니다.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FNAME.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
CHANGING
FILE_NAME = P_FNAME
EXCEPTIONS
MASK_TOO_LONG = 1
OTHERS = 2.
AT SELECTION-SCREEN OUTPUT
AT SELECTION-SCREEN OUTPUT 이벤트는 스크린에 정의된 컨트롤의 보여지는 모습을 변경하는 이벤트로써, 대표적으로 LOOP AT SCREEN 과 MODIF ID, 스크린 필드명으로 화면 요소 제어 등의 처리를 주로 합니다.
아래와 같이 특정 조건이 충족될 때 MODIF ID MD1 그룹에 활성화 비활성화를 결정하는 로직을 AT SELECTION-SCREEN OUTPUT에 기술합니다.
LOOP AT SCREEN.
IF P_BOX = 'X'.
IF SCREEN-GROUP1 = 'MD1'.
SCREEN-ACTIVE = 1.
ENDIF.
ELSE.
IF SCREEN-GROUP1 = 'MD1'.
SCREEN-ACTIVE = 0.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
" 혹은 특정 스크린 필드명인 경우 입력상태의 활성/비활성을 제어
LOOP AT SCREEN.
IF SCREEN-NAME = 'P_VERSN'.
SCREEN-INPUT = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
START-OF-SELECTION
START-OF-SELECTION은 셀렉션 스크린의 [실행-F8] 버튼을 클릭하면 실행되면 메인 로직 구문입니다.
셀렉션 스크린 조건을 기준으로 로직을 수행하는 실질적인 메인 부분으로, 셀렉션 스크린 조건을 SQL 쿼리 조건에 넣고 DB 값을 조회 한 후, 최종 ALV로 보여줄 인터널 테이블 값을 만들어 내는 등의 주요 작업을 처리하는 이벤트입니다.
이벤트 실행 순서
위의 이벤트 순서를 정리하면,
INITIALIZATION → 셀렉션 스크린(SELECTION-SCREEN)
셀렉션 스크린(SELECTION-SCREEN) 사용자 입력 → AT SELECTION-SCREEN ON → AT SELECTION-SCREEN -> AT SELECTION-SCREEN OUTPUT
의 순서로 이벤트가 순차적으로 발생하게 됩니다.
END-OF-SELECTION
END-OF-SELECTION은 LDB 형태로 프로그램을 만들때 사용하는 이벤트로, LDB 자체가 현재 많이 사용되지 않기 때문에 END OF SELECTION도 거의 사용하지 않고 있습니다.
그 외에도 AT USER-COMMAND, AT LINE-SELECTION, TOP-OF-PAGE, END-OF-PAGE 등의 이벤트가 있으나 ALV 등 클래스 기반 컨트롤로 인해 최근에는 많이 사용이 안되는 추세입니다.
PBO(Process Before Output)
PBO는 셀렉션 스크린 실행 후, CALL SCREEN에 정의된 스크린이 나타나기 전 실행되며, 버튼 생성(PF-STATUS), 화면 제목 설정(TITLEBAR) 등 화면에 보여주기 위한 사전 작업을 합니다.
만약 해당 리포트가 ALV를 사용한다면 PBO 이벤트에 ALV 생성 로직을 작성하게 됩니다.
MODULE STATUS_0100 OUTPUT.
"
" 버튼 생성, 화면 제목 설정
"PF-STATUS 설정해서 화면 메뉴 및 실행 버튼 등을 맵핑
SET PF-STATUS '0100'.
SET TITLEBAR '0100'.
" 만약 해당 리포트에 ALV가 사용된다면 이 부분 혹은 이 부분에 서브 루틴으로 확장해서 사용
* PERFORM SET_CONTAINER.
* PERFORM SET_FIELDCAT.
* PERFORM SET_LAYOUT.
* PERFORM SET_ALV.
ENDMODULE.
PAI(Process After Input)
PAI는 사용자 버튼 클릭 및 드래그 등의 사용자 액션 수행 후 발생하는 이벤트로써, GUI STATUS 맵핑되어 있는 각각의 UCOMM이 OK_CODE 변수를 통해 넘어오게 됩니다.
기본적인 PAI 이벤트로는 아래의 예제와 같이 BACK, CANC, EXIT 등이 있습니다.
MODULE USER_COMMAND_0100 INPUT.
CASE GV_OK_CODE.
WHEN 'BACK' OR 'CANC' OR 'EXIT'.
IF GV_OK_CODE = 'EXIT'.
LEAVE PROGRAM.
ELSE.
LEAVE TO SCREEN 0.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
이상으로 ABAP 리포트 이벤트 템플릿 구조에 대해서 알아보았습니다. 아밥 리포트 구현할 때 참고하시어 이벤트에 적절한 로직을 적용하시기 바랍니다.
좀 더 자세한 사항과 예제는 SAP 공식 문서 SELECTION-SCREEN-EVENTS 항목을 참고해 보시기 바랍니다.
함께 보면 좋은 글
ABAP READ TABLE 사용법 및 예제 정리
ABAP Collect 사용법 및 예제
ABAP CONCATENATE 사용법 및 예제 정리
ABAP LOOP AT 사용법 및 예제 등