abap 리포트 이벤트 템플릿(+구조)

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.

즉, 위의 예제와 같이, 프로그램이 실행되기 전 오늘 날짜를 기준으로 자동으로 회계연도를 현재 연도로 초기화 하는 등의 작업을 하게 됩니다.

INITAILIZATION에서는 SELECTION SCREEN 이 호출되기 전 초기화 등의 작업을 함

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 이벤트시에 Search Help 처리

아래의 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) 등 화면에 보여주기 위한 사전 작업을 합니다.

pf status에 설정된 ucomm 값

만약 해당 리포트가 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 사용법 및 예제 등