본문 바로가기

ABAP 프로그래밍 개념/Modulazation Technique

2-3. Modularization Techniques - Program Structure : Events

Event는 넓게는 하기와 같이 분류됩니다.

  1.  Program Costructor Events
  2.  Reporting Events
  3.  Selection Screen Events
  4.  List Events
  5.  Screen Events

아래 글을 통해 각 이벤트 들에 대해 설명하겠습니다.


Program Costructor Events


LOAD-OF-PROGRAM이라는 Event Block은 Program Constructor로서 제공됩니다. Program Constructors는 ABAP Class에서 constructor 메소드와 같이 프로그램 변수들을 초기화하는 것과 같은 목적으로 ABAP Program에서 사용됩니다. 

LOAD-OF-PROGRAM은 Executable Program, Moudlule Pool, Function Group, Subrouine Pool이 메모리로 올라갈 때, ABAP 런타임 환경에 의해 호출됩니다. 이 Event는 오직 프로그램 실행 시 한번만 트리거됩니다. 만약 프로그램이 SUBMIT과 CALL TRANSACTION 처럼 각 호출마다 새로운 Internal session을 연다면, LOAD-OF-PROGRAM은 모든 프로그램 호출마다 트리거 될 것입니다.

프로그램이 이 Event에 반응하게 만들기 위해서, 우리는 떠한 ABAP 코드가 처리되 전에 호출되는 첫 번째 Event인 LOAD-OF-PROGRAM이라는 Event 키워드를 사용합니다. 이 Event Block 안에 있는 구문들은 프로그램의 데이터를 초기화할 수 있도록 해줍니다.

LOAD-OF-PROGRAM 이벤트는 주로 호출된 Procedudes의 전역 데이터를 초기화하기 위해 외부 Procedudes를 호출할 때 사용됩니다. 예를 들어, 아래 구문에서 Data Object인 DATE는 LOAD-OF-PROGRAM을 통해서 초기화되며 오늘의 날짜를 가지게 됩니다.

DATA date TYPE d.

LOAD-OF-PROGRAM.
date = sy-datum.

LOAD-OF-PROGRAM 아래의 date = sy-datum 구문을 사용함으로써, 우리는 DATE라는 Data Object는 항상 프로그램이 실행되면 현재 날짜로 초기화될 것임을 알 수 있습니다.


Reporting Events


Reporting events는 Executable Program(Report Program)에서 사용됩니다. Executable Program은 Event(이벤트)에 의해 동작합니다. Executable Program을 실행할 때, 다양한 Events들이 순서대로 ABAP 런타임 환경에 의해 트리거 됩니다. 개발자는 이러한 Events들에 반응할 수 있는 Event block을 정의할 수 있습니다. Reporting Events들은 Executable Program에서 사용할 수 있고 다음과 같은 Event Blcok을 가지고 있습니다.

  • INITIALIZATION
  • START-OF-SELECTION
  • GET table
  • GET table LATE
  • END-OF-SELECTION

 

INITIALIZATION

INITIALIZATION은 Executable Program이 실행될 때 트리거 되는 첫번 째 Reporting Events입니다. 만약 프로그램이 LOAD-OF-PROGRAM을 Event Block으로 가지고 있었다면, INITILIZATION이라는 Event Block은 LOAD-OF-PROGRAM 뒤에 바로 실행될 것입니다.

만약 Executable Program이 Selection Screen(선택화면)을 가지고 있다면, INITIALIZATION Event는 ABAP Selection Screen 코드가 처리되었지만 Selection Screen이 사용자에게 보여지기 전에 호출됩니다.

* SELECTION SCREEN 코드 처리 후, 사용자에게 DISPLAY 되기 전 호출

그로므로,  INITIALIZATION을 이용하여, 유저가 입력 필드들에 값을 넣기 전에 Selection Screen의 입력 필드들을 초기화거나 Default Value를 입력할 수 있습니다.

PARAMETERS p_carrid TYPE s_carr_id DEFAULT 'LH'.
INITIALIZATION.
p_carrid = 'AA'.

그러나 INITIALIZATION라는 Event는 오직 프로그램 실행시 한번만 트리거 되기 때문에, Selection Screen에서 호출하는 어떠한 호출은 INITIALIZATION 아래에서는 작동하지 않습니다. INITIALIZATION은 Selection Screen이 ABAP Runtime Enviornment에 의해서 호출될 때만 작동합니다. 이러한 이유로 Selection Screen과 연관된 Event를 사용해서는 Selection Screen의 필드들의 값을 초기화하거나 변경하는데 사용하고 INITIALIZATION란 Event를 통해서는 프로그램의 모든 값을 초기화하는 것을 권유합니다.

위 예시를 보면, p_carrid 파라미터 필드는 DEFALUT VALUE로 LH를 가지고 있습니다. 그러나 이 값은 INITIALIZATION 이벤트를 통해서 런타임에서 값이 변경됩니다. 그 결과로서 사용자는 AA라는 값을 DEFAULT VALUE를 보게 됩니다.

 

START-OF-SELECTION

START-OF-SELECTION 이벤트는 프로그램이 실행 될 때 INITIALIZATION 이벤트 뒤에 호출됩니다. 만약 프로그램이 Selection Screen을 가지고 있다면, START-OF-SELECTION은 Selection Screen에서 실행되는 모든 이벤트들이 완료되고 난 뒤에 트리거되는 첫 번째 이벤트입니다. Selection Screen 이벤트들은 대표적으로 AT SELECTION SCREEN, AT SELECTION SCREEN OUTPUT과 같은 이벤트로서 INITILIZATION과 START-OF-SELECTION에서 진행됩니다.(뒤에 해당 내용을 담는 부분이 있습니다.)

START-OF-SELECTION 이벤트는 스탠다드 이벤트로서 역할을 하는데, 어떠한 다른 이벤트들이 선언되지 않았다면 START-OF-SELECTION를 굳이 코딩할 필요가 없다는 것입니다. 모든 구문들이 자동으로 START-OF-SELECTION의 Event Block으로 암묵적으로 할당되어 실행됩니다.

위 예시를 보면, EVENT에 START-OF-SELECTION이 실행되고 있는 것을 확인 할 수 있습니다.

유사하게, 만약 전역 변수 선언 영역과 프로그램의 첫 번째 Processing Block 사이에 구문이 있다면, 시스템은 자동적으로 START-OF-SELECTION를 삽입하고 실행할 것입니다.

아래 예시를 보면, 28 번 째의 CLEAR 구문은 전역 데이터 선언 영역과 INITILIZIATION 사이에 존재합니다. 이러한 구문은 시스템에서 자동으로 START-OF-SELECTION 의 맨 상단에  추가하고 46번째 줄의 PERFORM get_data 문 이전에 실행할 것입니다.

일바적으로, START-OF-SELECTION 이벤트 안에서 ABAP 프로그램에서 필요한 모든 DATA SELECT 로직을 수행하도록 로직을 구성합니다. 전형적인 레포트 프로그램에서, INITILIZATION 이벤트를 통해서 프로그램의 모든 데이터를 초기화하고, SELECTION SCREEN EVENTS에서 모든 SELECTION SCREEN 값들을 유효한지 확인하고, 앞선 과정들에 문제가 없다면 START-OF-SELECTION 이벤트에서 DATA SELECT를 진행합니다.

 

GET Table

GET Table 이벤트는 DATA SELECT를 위해 Logical Database를 사용하는 Executable Program에서 사용됩니다. Logical Database은 특별한 ABAP 프로그램으로 데이터베이스에서 데이터를 검색하고 프로그램에서 사용할 수 있도록 하는 특별한 ABAP 프로그램입니다. 프로그램에서 Logical Database을 사용 할 때, 데이터베이스에서 데이터를 가져오는데 다른 SQL 구문이 필요가 없습니다.

Logical Database는 자신이 OPEN SQL 구문을 포함하고 있어서 DB로부터 데이터를 가져오고 사용된 프로그램의 Interface Work Area로 한줄한줄 전달해줍니다.

Interface Work Area는 TABLES나 NODES라는 키워드로 정의되고, DATA 키워드로 정의된 Work Area와 유사하게 작동합니다. Interface Work Area 과 Work Area의 하나의 차이는 Interface Work Area는 프로그램 간이 공유하는 Data Area를 사용한다는 것입니다.

Interface Work Area은 세션의 Shared Memory Space(공유하는 메모리 영역)에서 정의되어서 같은 세션에서 실행되는 모든 프로그램들이 접근할 수 있습니다. 이러한 이유로 TABLES는 부작용을 만들 수 있어서 권장하지 않습니다. 

SAP ERP 시스템의 오래된 버젼들에는, 오직 Logical Database를 사용하기위한 오직 하나의 방법은 Executable Program과 Logical Database과 연결하여 GET 이벤트를 사용하여 데이터를 가져오는 것이었습니다. 그러나, SAP R/3 4.5A 이후로, Logical Database는 어느 프로그램과도 연결이 가능한데, LBD_PROCESS라는 Function Module을 사용하면 됩니다. 이 Function Module은 프로그램에서 다양한 Logical Database를 호출할 수 있게 해줍니다. 이와 관련하여, Interface Work Area의 사용은 현대 소프트웨어 개발에서는 거의 사용되지 않는 것으로 여겨지며, 이전 버전과의 하위 호환성을 위해서만 남겨두고 있습니다. 이는 새로운 프로그래밍 기술이나 방법론이 개발되어 시스템의 다른 부분 간 데이터를 연결하는데 있어 Interface Work Area의 사용이 더 이상 선호되지 않는다는 것을 의미합니다.

GET 이벤트는 Logical Database가 이벤트 키워드에서 언급된 테이블에서 한 행을 읽고, TABLES <table> 또는 NODES <table> 문을 사용하여 선언된 Work Area에서 프로그램에서 사용할 수 있게 만든 후 트리거됩니다.

NODES: SPFLI.
GET SPFLI.
 SKIP.
 WRITE: / 'From:', SPFLI-CITYFROM,
 'TO :', SPFLI-CITYTO.

 

GET <Table> LATE

Logical Database의 Node를 위한 모든 기록이 읽히고 난 뒤에, ABAP 런타임 환경은 GET <table> LATE 이벤트를 트리거합니다. 프로그램에서 이 이벤트를 사용함으로써, Event Block의 끝에서 실행되어야 하는 단계를 처리할 수 있습니다.  예를 들어, Sales Order에 대한 품목별 요약을 출력하려면, Event Block에서 이를 수행할 수 있습니다.

NODES: SPFLI, SFLIGHT, SBOOK.
DATA WEIGHT TYPE I VALUE 0.

GET SPFLI.

SKIP.

WRITE: / 'Carrid:', SPFLI-CARRID,
         'Connid:', SPFLI-CONNID,
       / 'From: ', SPFLI-CITYFROM,
       'To: ', SPFLI-CITYTO.   
ULINE.

GET SFLIGHT.
SKIP.
WRITE: / 'Date:', SFLIGHT-FLDATE.

GET SBOOK.
WEIGHT = WEIGHT + SBOOK-LUGGWEIGHT.

GET SFLIGHT LATE.
WRITE: / 'Total luggage weight =', WEIGHT.

ULINE.
CLEAR WEIGHT.

위 코드 예시를 보면, 우리는 각 항공사 코드(CARRID)와 항공편 연결 번호(CONNID)에 대한 날짜별 총 수하물 무게 요약을 인쇄하고 있습니다. 우리는 GET SPFLI 이벤트를 사용하여 항공 상세정보를 가져오고 있습니다. GET SFLIGHT 이벤트는 주어진 날짜에 대한 모든 항공편을 반복 처리합니다 (사용자는 Logical Database 선택 화면에서 범위를 제한할 수 있습니다)

GET SBOOK 이벤트는 각 예약의 수하물 무게를 해당 항공편의 SBOOK 테이블에서 검색합니다. 이 이벤트 내에서 우리는 지정된 날짜의 총 무게를 집계하고 있습니다.

마지막으로, GET SFLIGHT LATE 이벤트는 지정된 날짜의 모든 항공편 레코드가 처리된 후에 호출됩니다. 이 이벤트에서는, 지정된 날짜에 대해 CARRID와 CONNID에 해당하는 총 수하물 무게를 출력합니다. 이 예시에서는 Transaction SLDB를 사용하여 확인할 수 있는 Logical Database Selection F1S를 사용합니다.

 

END-OF-SELECTION

END-OF-SELECTION 이벤트는 Selection(선택)의 마지막을 표현하기 위하여 사용됩니다. 만약 당신의 레포트가 Logical Database를 사용하지 않는다면, 이 이벤트는 START-OF-SELECTION 다음에 사용되어서, Selection의 끝을 표시하고 선텍된 데이터들의 추후 처리(Output과 관련된)를 진행하기 위해 사용됩니다. 그러나, 만약 당신의 레포트가 Logical Database와 연관되어있다면, 이 이벤트는 Logical Database가 모든 레코드를 애플리케이션 프로그램으로 완전히 전송한 후 호출됩니다.

바로 위 코드 예시에서, 모든 Logical Database Selection에서의 데이터가 인터널 테이블에 업데이터 되었다면, END-OF-SELECTION 이벤트를 사용하여 Data Selection이 끝났음을 표시하고 가져온 데이터를 처리하는 추후의 로직을 실행할 수 있습니다. END-OF-SELECTION 이벤트는 모든 GET 이벤트들의 프로세스가 끝난 후 런타임 환경에 의해 호출됩니다.

END-OF-SELECTION 이벤트를 사용하는 것은 Logical Database를 사용할 때 선택 로직과 출력 로직을 분리하기 위해 이 이벤트를 사용하는 것에 필수적입니다. 그렇지 않으면, 이 이벤트의 목적은 순전히 문서화 및 코드의 가독성을 높이기 위한 것입니다. SAP는 이 END-OF-SELECTION 이벤트를 사용하여 Logical Database를 사용하지 않는 프로그램에서도 선택 로직과 출력 로직의 분리를 나타내기 위해 이 이벤트를 사용하는 것이 좋습니다.

NODES: SPFLI, SFLIGHT, SBOOK.
DATA: gr_table TYPE REF TO cl_salv_hierseq_table.
DATA: it_spfli TYPE TABLE OF spfli.
DATA: it_sflight TYPE TABLE OF sflight.
DATA: it_binding TYPE salv_t_hierseq_binding.
DATA: wa_binding LIKE LINE OF it_binding.

GET SPFLI.
APPEND spfli to it_spfli.
GET SFLIGHT.
APPEND sflight to it_sflight.

END-OF-SELECTION.
wa_binding-master = 'CARRID'.
wa_binding-slave = 'CARRID'.
APPEND wa_binding TO it_binding.

wa_binding-master = 'CONNID'.
wa_binding-slave = 'CONNID'.
APPEND wa_binding TO it_binding.

cl_salv_hierseq_table=>factory(
 EXPORTING
  t_binding_level1_level2 = it_binding
 IMPORTING
  r_hierseq = gr_table
 CHANGING
  t_table_level1 = it_spfli
  t_table_level2 = it_sflight ).

gr_table->display( ).

위 예시는, GET SPFLI와 GET SFLIGHT 이벤트를 사용하여 IT_SPFLI와 IT_SFLIGHT 인터널 테이블을 각각 채웠습니다. 그런 다음 이 데이터들을 END-OF-SELECTION 이벤트 내에서 ALV Object Model을 사용하여 계층 & 순차적인 디스플레이로 이 데이터를 표시합니다. ALV Object Model은 ALV 결과를 만드는 것을 쉽게 해줍니다.


3. Selection Screen Events


Selection Screen(선택 화면)은 사용자가 프로그램에 대한 선택 기준을 입력할 수 있는 특별한 화면입니다. Selection Screen은 주로 Report 프로그램 (executable program)에서 사용되고, 때때로 Module Pool이나 Function Group에서도 사용될 수 있습니다. Selection Screen Events는 전형적으로 Selection Screen을 준비하는 것을 도와주고 Screen에서 유저의 액션에 대해 판단합니다.

예를 들어, Selection Screen Events을 통해 프로그램 실행시에, 입력 필드에 디폴드 값을 할당할 수도 있고, 동적으로 틀정 필드를 열고 닫을수 있고, 유저가 입력한 값의 유효성을 판단하여 유저에게 적절한 메시지를 내어보낼 수도 있습니다.

Selection Screen Events은 Selection Screen이 프로그램을 위해 정의되고 ABAP 런타임 환경에 의해 처리될 때 트리거 됩니다. 프로그램에 Selection Screen이 정의되지 않았다면, Selection Screen Events는 트리거 되지 않을 것입니다.

Selection Screen은 ABAP 문장 (PARAMETERS 또는 SELECT-OPTIONS)을 사용하여 정의할 수 있는 특수 화면으로, 화면 페인터를 사용하여 수동으로 정의하는 것이 아니라 ABAP 컴파일러에 의해 자동으로 생성됩니다.

Selection Screen은 자동으로 생성되기 때문에, 개발자들은 화면을 수정하거나 사용자 동작에 반응하기 위한 Dialog Module을 정의할 수 있는 Screen Flow Logic에 접근할 수 없습니다. ABAP 런타임 환경은 화면 처리를 완전히 제어하며, 프로그래머는 Event Block을 유지 관리하여 이러한 이벤트에 대응할 수 있도록 여러 Selection Screen Event를 생성합니다.

Screen Flow Logic은 Process Before Outpu(PBO)와 Prcess After Input(PAI)로 나뉩니다. PBO는 화면이 유저에게 나타나기 전에 트리거되고, PI는 유저가 나타자니 화면에서 클릭과 같은 어떠한 액션을 해야 트리거됩니다. ABAP 런타임 환경은 화면이 처리되는 동안 PBO와 PAI에서 다른 이벤트들을 트리거합니다.

AT SELECTION-SCREEN OUTPUT은 PBO 이벤트입니다. 이 Event Block을 프로그램에서 편집하여 이벤트에 대응하고 화면을 수정하거나 기본값을 할당하는 코드를 실행할 수 있습니다. AT SELECTION-SCREEN은 PAI 이벤트로 유저가 화면에서 어떠한 동작을 취한 뒤 트리거됩니다. 이 Event Block을 통해 유저가 입력한 값에 대해 유효성을 판단할 수 있습니다.

Selection Screen Event의 기본 형태는 AT SELECTION-SCREEN 이벤트 입니다. 이 이벤트는 ABAP 런타임 환경이 선택 화면에서 입력된 모든 데이터를 ABAP 프로그램으로 전송한 후에 트리거됩니다.


4. List Events


List Eventssms SAP 시스템에서 존재하는 Screen의 3가지 종류중 하나입니다(Dialog Screen & Selection Screen & List Screen).  데이터의 출력을 위해 사용되고 유저와 상호작용을 할 수 있게 해줍니다. Selection Screen과 비슷하게, List Screen은 또한 ABAP 구문을 통해 만드는데 사용됩니다. 부가적으로 List Screen의 결과는 Printer에 전송될 수 있습니다.

List Screen은 WRITE, ULINE 또는 SKIP 구문을 사용하여 생성되고, ABAP 런타임 환경은 List Screen을 처리하는 동안 List Events를 호출합니다. List Screen은 데이터를 채울 수 있는 자유롭게 정의 가능한 영역을 제공합니다. List Screen은 보고서 출력을 표시하는 데 일반적으로 사용됩니다. 그러나 이는 구식으로 간주되며, 이러한 화면은 보통 최신 시스템에서 ALV 기술로 대체되었습니다.

화면을 지원하는 프로그램 유형으로 executable programs, module pool programs, and function groups이 있기 때문에, 리스트 이벤트는 전통적인 리스트가 생성되거나 디스플레이된 리스트에서 사용자가 동작을 수행 할 때만 이러한 유형의 프로그램에서 사용할 수 있습니다.

다섯 가지의 List Events가 존재합니다.

  • TOP-OF-PAGE
  • TOP-OF-PAGE DURING LINE-SELECTION
  • END-OF-PAGE
  • AT USER-COMMAND
  • AT LINE-SELECTION

TOP-OF-PAGE 와 END-OF-PAGE 이벤트들은 PBO에서 트리거되고 페이지에서 헤더부분(TOP) 혹은 바닥부분(END)에 데이터를 출력할 때 사용됩니다. AT USER-COMMAND와 AT LINE-SELECTION은 PAI에서 트리거되며 화면에서 사용자의 동작에 반응하여 사용됩니다. TOP-OF-PAGE DURING LINE-SELECTION은 보조 목록(Secondary List)을 준비할 때 트리거됩니다.

예를 들어, AT USER-COMMAND 이벤트는 사용자가 응용 프로그램 툴바 버튼 중 하나를 선택할 때 트리거되고, AT LINE-SELECTION 이벤트는 사용자가 출력 라인을 더블 클릭할 때 트리거됩니다. 이러한 이벤트는 드릴다운 보고서를 제공하는 데 사용할 수 있습니다.


5. Screen Events


Screen Events는 일반적인 화면을 처리할 때 트리거됩니다.Special Screen(Selection Screen과 List Screen)은 ABAP 구문을 사용하여 ABAP 프로그램에서 정의되는 것과 달리, General Screen은 Screen Painter를 통해 만들어집니다. General Screen들은 트랜잭션에서 사용되는 가장 일반적인 Screen 입니다.

General Screen은 입력/출력 필드와 Screen Flow Logic로 구성된 화면입니다. Selection Screen과 List Screen과 마찬가지로, General Screen은 executable programs, module pool programs, and function groups에 대해 정의할 수 있습니다. General Screen은 주로 Module Pool 프로그램에 사용됩니다.

Screen Flow Logic은 화면이 표시되기 전에 처리되는 PBO 이벤트와 화면에서 사용자 작업 후에 처리되는 PAI 이벤트로 나뉩니다.

화면이 처리될 때 트리거되는 네가지 Screen Events가 있습니다.

PBO : PBO 이벤트는 화면이 사용자에게 표시되기 전에 트리거되며 화면을 수정하는 데 사용할 수 있습니다.

PAI : PAI 이벤트는 사용자가 화면에서 작업을 수행할 때 트리거됩니다. 이 이벤트는 사용자 작업을 평가하는 데 사용할 수 있습니다

Process on help request(POH) : POH 이벤트는 사용자가 화면 필드에서 (F1) 도움을 선택하였 을 때 트리거됩니다. 이 이벤트는 필드에 대해 더 많은 정보를 사용자가 학습할 수 있도록 필드 설명서를 표시하는 데 사용할 수 있습니다.

Process on value request(POV) : POV 이벤트는 사용자가 화면 필드에서 (F4) 도움말을 선택할 때 트리거됩니다. POV 이벤트는 필드에 대한 Possible Entry(값 목록)을 표시하는 데 사용할 수 있습니다.

PBO를 제외한 모든 화면 이벤트는 프로그램 화면을 표시한 후에 트리거됩니다.

 

반응형