본문 바로가기

Easy Abap 2.0

[3주차] [4주차] Chapter 12 Report Program Part2

 

4. 프로그램 구조(이벤트)

 

프로그램을 실행하면 화면에 보이는 필드들을 초기화하고, 
사용자가 입력한 값에 대한 결과를 반환하는 사용자 이벤트

 

이벤트
블록 발생
INITIALIZATION SELECTION SCREEN 화면이 열리기 전에 화면 필드 값을 
초기화하는데 주로 사용된다.

필드를 초기화, DEFAULT 값을 세팅
GUI STATUS 및 TITLEBAR 세팅
SET TITLEBAR...
SET PF-STATUS...
AT SELECTION-SCREEN 사용자가 SELECTION SCREEN에 값을 입력하기 전/후에 
작동한다.

추가로 아래의 기능이 더 있다.

1. ON psel
2. ON END OF sel
3. ON VALUE-REQUEST FOR psel_low_high
4. ON HELP-REQUEST FOR psel_low_high
5. ON RADIOBUTTON GROUP radi
6. ON BLOCK block
7. OUTPUT
START-OF-SELECTION 사용자가 실행 버튼(F8)을 클릭하면
데이터베이스(LDB)에서 값을 읽어온다.
일반적으로 SELECT 구문이 사용되는 블록이다.
LDB를 사용한 report에서는 GET<TABLE> 구문이 사용된다.
END-OF-SELECTION 데이터를 읽은 후의 작업을 수행하는 블록이다.

 

[1] INITIALIZATION

 

이벤트 중에서 프로그램을 실행했을 때 가장 먼저 수행되는 것이 INITIALIZATION이다.

이 이벤트는 SELECTION-SCREEN이 조회되기 전에 작동하므로 변수에 초기값을 지정할 때 흔히 사용된다.

즉, INITIALIZATION 이벤트에서 SELECTION-SCREEN에 사용되는 필드들의 초기값을 지정함으로써,

사용자가 자주 사용하는 값을 자동으로 입력하게 된다.

 

특히 SELECT-OPTION은 인터널 테이블 형태이기 떄문에 반드시 APPEND 구문으로 데이터를 추가하여야 한다.

 

[2] AT SELECTION-SCREEN

 

SELECTION-SCREEN에서 Input Field의 값이 변동되었을 때 실행되는 이벤트이며,

INITIALIZATION/과 START-OF-SELECTION 사이에 수행되어 사용자 액션에 대해 반응하고, 화면 필드를 조절한다.

 

<AT SELECTION- SCREEN 이벤트 기능 설명>

 

옵션 효과
①  ON psel  SELECTION SCREEN에서 전달되는 특정 필드에 대해 수행.

만약 오류 메시지가 발행하면 해당 필드는
다시 입력 상태가 되도록 설정한다.
② ON END OF sel SELECTION SCREEN에서 멀티로 선택하면, 
전체 SELECTION TABLE의 입력값을 제어할 수 있다.

즉, 하한/상한값, 미 입력값 체크 등에 사용할 수 있다.
③ OUTPUT AT SELECTION-SCREEN OUTPUT 구문을 이용해 
SELECTION-SCREEN 화면의 LAYOUT을 설정할 수 있다.
④ ON VALUE-REQUEST FOR psel_low_high ABAP Dictionary에서 제공해주는 Possible Entry 대신
사용자가 정의해준 Entry가 보이게 설정할 수 있다.
⑤ ON HELP-REQUEST FOR <field> ABAP Dictionary에 해당 필드에 대한 도움말이 없거나
기존의 도움말을 대신해서 표현하고자 할 때 사용된다.

SELECTION SCREEN의 필드를 선택하고
<F1>을 눌렀을 때 수행된다.
⑥ ON RADIOBUTTON GROUP radi RADIOBUTTON GROUP <radi>내에 선언된
PARAMETER들을 제어할 수 있다.

RADIOBUTTON 그룹 내의 필드는 <FIELD> 옵션으로 
제어할 수 없다.
⑦ ON BLOCK block SELECTION SCREEN의 BLOCK 내 입력 값을 제어 가능

SELECTION-SCREEN BEGIN OF BLOCK~
SELECTION-SCREEN END OF BLOCK. 내에 선언된
필드들이 특정 규칙에 맞지 않을 때 제어할 수 있다.

 

① AT SELECTION- SCREEN ON <FIELD>

 

SELECTION-SCREEN에서 전달되는 특정 필드에 대해 수행한다.

오류 메시지가 발생하면 해당 필드는 다시 값을 입력받도록 커서가 위치하게 된다.

 

AT SELECTION- SCREEN  ON END OF sel

 

SELECTION-SCREEN에서 여러 건의 값을 입력할 때 전체 SELECTION TABLE의 입력값을 제어할 수 있다.

즉 하한/상한값, 미입력 값 등을 체크할 때 사용할 수 있다.

 

③ AT SELECTION-SCREEN OUTPUT

 

SELECTION-SCREEN 화면의 LAYOUT 속성(강조, 조회 전용과 같은 필드 속성)을 설정할 수 있다.

 

④ ON VALUE-REQUEST FOR psel_low_high

 

ABAP Dictionary에서 제공해주는 Possible Entry 대신
사용자가 정의해준 Entry가 보이게 설정할 수 있다.

 

⑤ ON HELP-REQUEST FOR <FIELD>

 

ABAP Dictionary에 해당 필드에 대한 도움말이 없거나
기존의 도움말을 대신해서 표현하고자 할 때 사용된다.

SELECTION SCREEN의 필드를 선택하고
을 눌렀을 때 수행된다.

 

Logical Database에 선언된 값들은 제어할 수 없으며 PARAMETERS, SELECT-OPTIONS로 선언해서 제어할 수 있다.

 

 

[3] START-OF-SELECTION

 

AT SELECTION-SCREEN에서 조회 화면의 필드에 대한 초기값 세팅 및 데이터 검증이 완료되었다면

이제 데이터베이스에 원하는 데이터를 가져오는 실질적인 작업을 수행하여야 한다.

만약 LDB를 이용한 프로그램이라면 GET 구문, 일반 프로그램이라면 SQL 문이 수행된다.

SQL 수행 이전에 CLEAR 구문이나 로직 상의 준비 작업을 한 후 SELECT를 수행하는 것이 좋다.

 

[4] END-OF-SELECTION

 

실행 환경에서 호출되는 마지막 이벤트로서 SELECT 구문에서 모든 데이터를 읽은 후 화면에 write 하기 전에 수행된다.

인터널 테이블에 저장된 데이터들을 변형하는 작업을 할 수 있다.

 

5.  프로그램 구조(List Process 이벤트)

 

조회 화면에서 조회 조건 입력 갑을 입력한 후 사용자가 실행 버튼을 클릭하거나 F8 키를 눌렀을 때 데이터를

화면에 뿌려주는 List Process 이벤트

 

<List Process 이벤트 설명>

블록 발생
① TOP-OF-PAGE 새로운 페이지가 시작될 때 수행되는 List Process 이벤트
START OF SELECTION에서 첫 번째 WRITE를 만나면
수행되고, 새로운 페이지마다 수행된다.
② END-OF-PAGE 페이지 끝에서 수행되는 블록
③ AT LINE-SELECTION LIST에서 라인을 더블클릭하거나 F2 키를 눌렀을 경우
수행되는 이벤트
④ AT PF<NN> PF<nn>으로 선언된 Funciton을 수행한다.
⑤ AT USER-COMMAND 프로그램에서 Function으로 선언된 기능을 수행한다.
⑥ TOP-OF-PAGE DURING LINE-SELECTION Secondary List에서 Header를 Control 할 때 사용하는 이벤트

 

① TOP-OF-PAGE

 

새로운 PAGE에 첫 번째 데이터가 출력되기 전에 수행된다.

그리고 NO STANDARD PAGE HEADING 옵션으로 생성된 프로그램에서 직접 HEADER 를 입력할 때 사용한다.

추가적인 옵션이 없을 때에는 기초적인 LIST 생성 시에만 사용된다.

현재 PAGE에서 고정된 HEADER로 지정되기 때문에 스크롤을 해도 움직이지 않는다.

 

 

② END-OF-PAGE

 

END-OF-PAGE는 현재 페이지의 남은 공간이 부족할 때 수행되는 이벤트이다.

즉, 페이지의 Footer를 지정하게 된다.

 

만약 명시적으로 Line-count를 지정하면 페이지가 Line-count 수를 넘어가면 수행된다.

예시) LINE-COUNT 10(2)의 숫자 10은 한 페이지의 총 라인 수를 의미하며,

(2)는 Page Footer에 뿌려줄 라인 수를 의미한다.

그리고 프로그램 내에서 NEW-PAGE 이벤트를 추가하였다면 END-OF-PAGE는 수행되지 않는다.

 

③ AT LINE-SELECTION

 

Report의 한 Line을 더블클릭하거나 F2 키를 눌렀을 때 발생하는 이벤트이다.

이 때 발생하는 SY-UCOMM 시스템 변수에는 'PICK'이 할당된다.

 

이 라인을 더블클릭하기 쉽게 FORMAT HOTSPOT 구문을 사용하여 해당 라인을 더블클릭하기 쉽게
만들어줄 수도 있다. HOTSPOT 구문 사용 시 ON 구문으로 시작하였다면, 반드시 OFF 구문으로 끝내야 한다.

 

<List의 System Field>

 

시스템 필드  설명
SY-TITLE Program의 Title (Text Element 부분에서 입력)
SY-LINCT Report Statement에서 지정한 한 Page의 Line 수
SY-LINSZ Report Statement에서 지정한 Line의 길이
SY-SROWS Current Window의 Line의 수
SY-SCOLS Current Window의 Column의 수
SY-PAGNO Page Number (Current Page)
SY-LILLI 선택된 Line이 몇 번째 Line인지를 알 수 있다.
SY-LINNO 각 Page의 Line Number
SY-COLNO Current Column의 Number
SY-LISEL 선택한 Line의 모든 값
SY-CPAGE Current Page의 Page Number
SY-LSIND List의 순번. Secondary List.

 

 

④ AT PF<NN>

 

PF<NN>으로 선언된 Function을 수행한다. 

Function Key NN번을 눌렀을 때 발생하는 이벤트이다.

<NN>은 1~24번까지의 숫자이다.

 

⑤ AT USER-COMMAND

 

프로그램에서 Funnction으로 선언된 기능을 수행한다.

메뉴 바의 기능을 선택하거나 버튼을 눌렀을 때 발생하는 이벤트이다.

GUI Status(SET PF-STATUS 구문)을 이용하여 화면 동적 부분을 추가할 수 있다.ㅇ

 

⑥ TOP-OF-PAGE DURING LINE=SELECTION

 

Secondary List에서 Header를 Control 할 때 사용하는 이벤트이다.

시스템 변수 SY-LSIND에 현재 List Index를 가지고 있다.

SY-LSIND변수는 Secondary List가 보일 때마다 Index는 1씩 증가한다.

Basic List는 Index가 0이다.

만일 'SY-LSIND = SY-LSIND -1' 이라는 문장을 사용하면 다음 List를 현재 화면에 겹쳐 쓰겠다는 표시가 된다.

Secondary List에서 Back 버튼이나 Exit(ICON X) 버튼을 누르면 Index는 1씩 감소하게 된다.

 

⑦ WRITE 구문

 

WRITE 구문은 OUTPUT 리스트에 데이터를 쓰는 기능을 주로 하게 되며, 값을 할당하는(MOVE)의 기능도 수행한다.

리스트용으로 사용될 때에는 데이터를 LIST BUFFER에 저장한다.

 

<OUTPUT 리스트에 사용될 수 있는 항목>

  • DATA 구문으로 선언된 필드
  • TABLES 구문으로 선언된 구조체의 항목
  • FIELD-SYMBOL로 선언된 필드 심볼
  • 언어에 종속적이지 않은 Text 문장

 

7.1) AT pl

 

필드의 위치와 길이를 지정해 준다.

슬래시( / ) 기호new line을 의미하며 숫자 앞에 선언되어야 한다.

 

7.2) WRITE OPTION

 

<LIST OUTPUT 포맷을 설정하는 옵션>

 

옵션 의미
NO-ZERO 0을 출력하지 않음
TYPE C인 경우 SPACE(공백)
NO-SIGN 부호를 조회하지 않음
DD/MM/YY
MM/DD/YY
DD/MM/YYYY
MM/DD/YYYY
DDMMYY
TYPE D
날짜 포맷을 변경함
(YY= year, MM= month, DD=day)
CURRENCY w w에 정의된 통화 형식으로 금액 필드 값을 나타낸다.
w에 정의된 통화 key가 얼마나 많은 소수점 자리를 가졌는지를 파악하여, 이를 금액 필드에 적용하는 것이다.
통화 종류별 소수 자릿수는 테이블 tcurx에 정의 되어 있다.
DECIMALS d 소수점 자리를 조절한다
(Numerical data인 TYPE I, P, F에서 사용된다.)
ROUND r r수만큼 10진수는 10의 r승 이동함
(진수 별로 shift 연산과 같음).
UNIT u u에 정의된 단위에 따라 출력 값의 포맷을 결정한다.
이때 출력 변수 f는 수량으로 취급되며, 
u에 정의된 단위로 출력 시의 소수점 자리를 결정한다.
EXPONENT e e만큼 지수를 설정하여 보여준다
(TYPE f).
USING EDIT MASK mask
USING NO EDIT MASK
사용자가 정의한 포맷으로 화면에 보여준다.
UNDER g g헤더라인을 선언하고 아래에 각 필드의 값을 보일 경우
사용한다.
NO-GAP 필드 사이의 공백을 없애준다.
LEFT-JUSTIFIED 왼쪽으로 정렬한다.
CENTERED 중앙으로 정렬한다.
RIGHT-JUSTIFIED 오른쪽으로 정렬한다.

 

 

<데이터 타입별 표준 길이와 표준 정렬>

 

옵션 표준 OUTPUT 길이 표준 OUTPUT 정렬
C 변수 길이(len) 왼쪽 정렬
D 8 왼쪽 정렬
F 22 오른쪽 정렬
I 11 오른쪽 정렬
N 변수 길이(len) 왼쪽 정렬
P 2*len or 2*len+1 오른쪽 정렬
T 6 왼쪽 정렬
X 2*len 왼쪽 정렬

 

 

7.3) WRITE OUTPUT 포맷

 

LIST의 필드별 OUTPUT 포맷을 설정한다.

각 옵션은 중복 사용이 가능하다(Input 옵션은 제외)

 

<OUTPUT 포맷 옵션>

 

옵션 의미
COLOR n [ON] or...COLOR OFF 필드의 색상을 변경한다.


- Background

OFF = COL_BACKGROUND

- Headers (색상 : grayish blue)

1 = COL_HEADING

- List Body (색상 : bright gray)

2 = COL_NORMAL

- Totals (색상 : yellow)

3 = COL_TOTAL

- Key_columns (색상 : bluish green)

4 = COL_KEY

- Positive threshold value (색상 : green)   
※ threshold : 임계점

5 = COL_POSITIVE

- Negative threshold value (색상 : red)

6 = COL_NEGATIVE

- Control levels (색상: violet)

7 = COL_GROUP 

INTENSIFIED [ON] or...INTENSIFIED OFF 색상이 강조됨 ( 색상: blue)
INVERSE [ON] or... INVERSE OFF 색상이 반전됨
HOTSPOT [ON] or...HOTSPOT OFF HOTSPOT 기능 활성화(클릭 = 더블클릭)
INPUT [ON] or ...INPUT OFF 입력필드로 변환함.
HOTSPOT과 같은 옵션이 작동하지 않음.
RESET 다음 구문과 같은 효과를 가져온다.
FORMAT COLOR OFF INTENSIFIED OFF INVERSE OFF
HOTSPOT OFF INPUT OFF

 

7.4) WRITE AS CHECKBOX

 

리스트의 필드를 체크박스로 보여준다.

 

7.5) WRITE AS SYMBOL

 

리스트의 필드를 심볼로 보여준다.

 

7.6) WRITE AS ICON

 

리스트의 필드를 아이콘을 보여준다.

AS ICON 구문을 사용하려면 INCLUDE <ICON> 또는 INCLUDE <LIST> 구문을 선언해야 한다.

T-CODE: SE11에서 ICON 테이블의 데이터 리스트를 확인가능하다.

 

7.7) WRITE AS LINE

 

기본적인 수직선/수평선 이외의 라인을 출력할 수 있게 한다.

 

7.8) WRITE AS QUICKINFO

 

Quickinfo로 선언될 필드 위에 마우스 커서가 놓이면 정보가 보인다.

INCLUDE <LIST>는 INCLUDE <SYMBOL>, <ICON>, <LINES>, <COLOR>를 포함한다.


 

※  QUICKINFO 중요 추가 구문

 

1) NEW-PAGE : 새로운 페이지 생성한다.

 

2) NEW-LINE : 줄 바꿈 ( = WRITE 문장의 슬래시(/)와 동일)

 

3) SKIP <n> : Blank Line을 <n>번 출력.

 

4) SKIP TO LINE <n> : <n>번째 Line으로 커서의 위치를 옮긴다.

 

5) RESERVE <n> LINES : 현재 페이지에 최소 <n>만큼 여유가 없다면 자동으로 Page Feed가 생성된다.

 

6) BACK : RESERVE 다음에 사용했을 떄는 커서 위치를 RESERVE 문장 전의 위치로 이동한다.

                   RESERVE 없이 사용하면 Page의 처음으로 이동한다.

 

7) POSITION <n>: Column 상의 커서 위치를 지정한다.

 

8) SET BLANK LINES ON(OFF) : BLANK LINE을 출력(삭제) , 기본은 ON(출력)이다.

 


[4주차]

6.  CALLING PROGRAM

 

프로젝트 수행 시 하나의 프로그램을 여러 명의 개발자가 동시에 개발해야 하는 경우가 발생할 수 있다.

즉,  프로그램이 매우 복잡한 기능을 수행해야 하는 경우, 기능별로 프로그램을 나눠서 개발하는 것도
좋은 방법이다(모듈화). 이렇게 구성된 패키지 프로그램은 메인 프로그램에서 사용자의 요구에 따라
각각의 프로그램을 호출하여 사용한다.

 

<프로그램 호출>

  실행 가능한 프로그램 호출
(Type 1 program)
트랜잭션 호출
타 프로그램 호출 후 복귀X SUBMIT LEAVE TO TRANSACTION
타 프로그램 호출 후 복귀ㅇ SUBMIT AND RETURN CALL TRANSACTION

 

Type-1 프로그램이 다른 프로그램에 의해 호출될 때는 LOAD-OF-PROGRAM 이벤트가 자동으로 수행된다.

클래스의 CONSTRUCTOR 메서드와 유사한 기능을 수행하며,
리포트 프로그램에서 처음 수행되는 INITIALIZATION 이벤트 이전에 수행된다.

이것은 실행 가능한 프로그램은 소스에 SUBMIT 구문을 암묵적으로 포함하고 있다는 것을 방증해주는 것이다.

T-CODE : SE38에서 TYPE-1 프로그램을 실행하게 되면, SUBMIT 구문이 호출되어 프로그램이 실행되는 것이다.

 

SUBMIT AND RETURN과 CALL TRANSCATION 구문을 이용하여 다른 프로그램을 호출한 후에 프로그램을 빠져나오면

호출한 프로그램에서 해당 구문의 바로 다음 라인이 수행된다.

예를 들어, 자재 코드 리스트에서 자재 코드의 상세 내역을 조회하고자 다른 프로그램을 호출한 후 빠져나오면
이전 리스트로 돌아와야 한다. 이러한 작업을 문제없이 수행하려면 SUBMIT과 AND RETURN을 함께 추가하면 된다.

 

예시)

더보기

REPORT ZTEST.

SUBMIT 'program' AND RETURN.

IMPORT g_carrid FROM MEMORY ID 'T_CID'.

프로그램 호출 후 원래 프로그램으로 복귀할 때 IMPORT 구문부터 수행된다.

 

[1] 리포트 프로그램 호출

 

Type- 1 프로그램은 다음 구문과 같이 SUBMIT 구문으로 호출할 수 있다.

 

SUBMIT <rep> | (<field>) [AND RETURN] [<option>].

 

프로그램 호출할 때 소스 코드 레벨에서 직접 프로그램 이름을 정적으로 저장할 수 있고,

'(프로그램 이름)'과 같이 괄호를 사용해 동적으로 호출할 수도 있다.

시스템이 SUBMIT 구문을 수행하여 적절한 프로그램을 찾지 못하면 RUNTIME 에러가 발생한다.

그리고 AND RETURN 구문을 사용하지 않으면 호출한 프로그램의 모든 데이터와 리스트는 삭제된다.

AND RETURN 구문을 사용하면 시스템은 데이터를 STACK에 저장하고 있다가 원래의 프로그램으로 되돌아오게 된다.

 

1.1) 리포트 프로그램 호출과 SELECTION SCREEN

 

TYPE-1 프로그램을 실행하게 되면 일반적으로 PARAMETERS와
SELECT-OPTION을 포함하는 표준 SELECTION SCREEN이 화면에 조회된다.

SUBMIT 구문을 이용하여 SELECTION SCREEN 입력 필드에 값을 채우는 다양한 옵션을 수행할 수 있다.

 

SUBMIT 구문 뒤 옵션 설명
VIA SELECTION-SCREEN 호출된 프로그램의 SELECTION SCREEN 화면이 나타난다.
이 구문을 사용하지 않으면 SELECTION을 화면에 보이지 않고 바로 호출된 프로그램을 실행한다.
USING SELECTION-SET <var> 호출된 프로그램의 변수(Variant)를 사용하여 호출할 수 있다.
WITH p op f SIGN s SELECTION-SCREEN의 구성 요소
(PARAMETERS와 SELECT-OPTIONS)에 값을 채우게 된다.
WITH FREE SELECTION freesel 동적인 selection이 가능하며, 
호출된 프로그램은 LDB에 연결되어야 한다.
WITH SELECTION-TABLE rspar RSPARAMS 구조체를 이용한 인터널 테이블을 활용해 
호출된 프로그램의 SELECTION SCREEN의
입력 값들을 동적으로 채울 수 있다.

 

1.2) 호출된 프로그램 리스트 설정

 

호출된 프로그램은 REPORT 구문이 존재하지 않기 때문에 LIST의 라인 수와 같은 포맷을 설정할 수 없다.

이 때는 SUBMIT 구문을 이용하여 호출된 프로그램의 LIST 구조를 변경할 수 있다.

 

더보기

SUBMIT...[LINE-SIZE <width>] [LINE-COUNT <length>].

 

1.3) 트랜잭션 호출

 

프로그램이 트랜잭션을 가지고 있다면, 트랜잭션을 실행하여 타 프로그램을 호출할 수 있다.

 

아래 구문은 호출한 프로그램을 종료하고 새로운 프로그램을 수행 시 사용하는 구문이다.

호출된 프로그램을 종료하게 되면 처름 실행된 메뉴 화면으로 돌아간다.

더보기

LEAVE TO TRANSACTION tcod [AND SKIP FIRST SCREEN].

 

아래 구문은 호출한 프로그램의 데이터를 저장하고 트랜잭션을 호출하는 구문이다.

AND SKIP FIRST SCREEN 옵션은 메모리 파라미터를 이용하여 SELECTION SCREEN을 건너뛰고 
바로 Output List가 조회되도록 한다.

 

더보기

CALL TRANSACTION tcod [AND SKIP FIRST SCREEN].