✅ 1. SELECT-OPTIONS란?

  • 사용자에게 여러 값, 범위, 조건을 입력 받을 수 있는 필드를 생성.
  • 하나의 필드로 다중 입력, 범위 입력, 제외 조건 등 다양한 입력을 받을 수 있음.
  • 기본적으로 내부 테이블 형태로 구성됨.

✅ 2. 내부 구조 (내부 테이블 필드)

SELECT-OPTIONS는 다음 네 가지 필드로 구성된 내부 테이블을 자동으로 생성함:

필드명 설명 예시
SIGN I(Include) or E(Exclude) I → 포함 / E → 제외
OPTION 조건 연산자 EQ, NE, BT, CP 등
LOW 비교 기준 값 (또는 범위의 시작) ‘19991213’
HIGH 범위 조건의 끝 ‘20010101’

✅ 3. 코드 흐름 요약

 
  • zemployees 테이블에서 모든 레코드를 조회하고,
  • DOB(생년월일)이 선택화면에서 사용자가 입력한 조건(my_dob) 에 포함되는지 확인.
  • 포함되면 WRITE로 출력.

✅ 4. 예제 시나리오

  1. 사용자가 선택화면에서 아무 값도 입력하지 않으면 my_dob 테이블은 비어있고, 모든 레코드가 출력됨.
  2. 사용자가 특정 날짜 (예: 19581202)를 입력하면 SIGN = I, OPTION = EQ, LOW = 19581202 값의 내부 테이블이 생성됨.
  3. 이 상태에서 zemployees-dob IN my_dob 조건이 만족하면 해당 레코드가 출력됨.
  4. Multiple Selection 버튼을 통해 다중 입력, 범위 입력, 제외 조건 입력 가능함.

예:

  • 포함 조건: EQ 19581202, EQ 19771213
  • 제외 조건: BT 19990101~20021220

✅ 5. IN 조건의 마법

IF zemployees-dob IN my_dob.
  • 이 한 줄로 모든 조건을 자동으로 평가해줌.
  • 내부적으로 SIGN, OPTION, LOW, HIGH를 순회하며 비교함.
  • 조건을 일일이 IF문으로 안 써도 되는 큰 장점이 있음.

🔍 결론

  • SELECT-OPTIONS는 복잡한 사용자 입력을 간편하게 처리할 수 있는 강력한 도구
  • 내부적으로 생성되는 구조를 이해하면, 이후 SELECT 조건이나 조건문 작성이 쉬워짐!.
  • IN 구문은 복잡한 필터링 로직을 아주 간단하게 만들어주는 핵심 포인트!
*&---------------------------------------------------------------------*
*& Report  Z_SCREENS_1                                                 *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

REPORT  z_screens_1                             .

TABLES: zemployees.

DATA: wa_employee LIKE zemployees-employee.

PARAMETERS: my_ee LIKE zemployees-employee
                          DEFAULT '12345678' OBLIGATORY,
            my_box1 AS CHECKBOX,
            wa_green  RADIOBUTTON GROUP grp1,
            wa_blue   RADIOBUTTON GROUP grp1,
            wa_red    RADIOBUTTON GROUP grp1.

SELECT-OPTIONS my_dob FOR zemployees-dob.

*INITIALIZATION.

  SELECT * FROM zemployees.
    wa_employee = zemployees-employee.
  ENDSELECT.

AT SELECTION-SCREEN ON my_ee.
* Check to make sure the employee number is not greater than the
* last employee number in our table.
  IF my_ee > wa_employee.
* DISPLAY A MESSAGE.
  ENDIF.


*

 

SELECT-OPTIONS를 사용하면 자동으로 내부 테이블이 생성되고, 이 테이블은 다음 4개의 필드로 구성된다!


🧾 SELECT-OPTIONS 테이블 구조 (기본 4개 필드)


필드명 설명예시
SIGN 포함 여부를 결정하는 필드 I (Include) / E (Exclude)
OPTION 조건 연산자를 지정하는 필드 EQ, NE, BT, CP, NP 등
LOW 조건의 기준 값, 또는 범위의 시작 값 '20230101', '10000001'
HIGH 범위의 끝 값 (OPTION = 'BT'일 때만 사용) '20231231'

🎯 각 필드의 의미 자세히 보기

✅ SIGN

  • 조건을 포함할지(Include) 또는 **제외할지(Exclude)**를 의미
  • 값:
    • I → 포함 (Include)
    • E → 제외 (Exclude)
SIGN 의미 설명
I Include 조건을 포함함
E Exclude 조건을 제외함

✅ OPTION

  • 조건 연산자(Logical Operator)를 의미
  • 값:
옵션 의미 설명
EQ Equal 같음 (=)
NE Not Equal 같지 않음 (≠)
GT Greater Than 초과 (>)
LT Less Than 미만 (<)
GE 크거나 같음
LE 작거나 같음
BT Between ~사이 (범위)
NB Not Between ~사이 제외
CP Contains Pattern 와일드카드 사용 (예: A*, 1%)
NP Not like pattern 패턴 제외

✅ LOW / HIGH

  • LOW: 조건의 기준 값 또는 범위의 시작값
  • HIGH: OPTION = 'BT'일 때 범위 끝값
예시 의미
LOW = '20230101', HIGH = '20231231', OPTION = 'BT' 2023년 전체 범위
LOW = 'MILLS', OPTION = 'EQ' 성이 MILLS인 사람
LOW = 'J*', OPTION = 'CP' J로 시작하는 모든 값

 

 

 

✅ PARAMETERS vs SELECT-OPTIONS 차이점


항목 파라미터 select-options
입력 가능 값 단일 값 단일 값, 값의 범위, 여러 값, 여러 범위
내부 구조 단일 변수 내부 테이블 (SIGN, OPTION, LOW, HIGH 필드로 구성됨)
복잡한 조건 불가능 가능 (예: 제외 조건, 여러 범위 입력)
UI 구성 한 줄 입력창 From~To 입력창 + 다중 선택 팝업 기능

🧠 SELECT-OPTIONS 내부 구조 (자동 생성되는 테이블 구조)

SELECT-OPTIONS: s_dob FOR zemployees-dob.

필드명 의미예시
SIGN 포함(I) / 제외(E) I or E
OPTION 조건 연산자 (EQ, NE, BT, CP 등) EQ, BT, CP
LOW 기준 값 or 범위 시작값 20240101
HIGH 범위의 끝값 (OPTION = BT인 경우) 20241231

이 테이블은 루프 돌면서 사용 가능하다!

LOOP AT s_dob INTO DATA(wa_dob). 
	WRITE: / wa_dob-sign, wa_dob-option, wa_dob-low, wa_dob-high. 
ENDLOOP.

 


🖱 UI 상에서 제공하는 기능

  • FROM ~ TO 입력란 기본 제공
  • 오른쪽의 “다중 선택 버튼” 클릭 → 다이얼로그 팝업에서 다음 입력 가능:
    • 여러 개의 단일 값
    • 여러 개의 범위
    • 포함(INCLUDE), 제외(EXCLUDE)
    • 와일드카드 (*, %)도 가능 (자동으로 CP 조건 사용됨)

🎯 언제 SELECT-OPTIONS를 써야 할까?

  • 사용자가 여러 값을 동시에 검색하고 싶을 때
  • 범위 검색이 필요한 필드일 때 (예: 날짜, 번호, 코드 등)
  • 복잡한 필터 조건 (제외, 와일드카드 등)이 필요할 때

🔍 예시 코드 요약

SELECT-OPTIONS: s_dob FOR zemployees-dob. 
START-OF-SELECTION. 
LOOP AT s_dob INTO DATA(wa_dob). 
	WRITE: / wa_dob-sign, wa_dob-option, wa_dob-low, wa_dob-high. 
ENDLOOP.

✅ 1. CHECKBOX (체크박스)

📌 정의 방법:

PARAMETERS: my_box1 AS CHECKBOX.

📌 특징:

  • my_box1는 TYPE C LENGTH 1 (문자형 1자리) 로 자동 지정됨.
  • 체크박스에 체크하면 값은 'X',
    체크하지 않으면 공백(' ') 이 저장됨.

📌 사용 예:

IF my_box1 = 'X'. 
	WRITE: 'Checkbox is checked!'. 
ELSE. 
	WRITE: 'Checkbox is not checked!'. 
ENDIF.

✅ 2. RADIO BUTTON (라디오 버튼)

📌 정의 방법 (3개 그룹 예시):

PARAMETERS: color_green 
RADIOBUTTON GROUP grp1, 
color_blue RADIOBUTTON GROUP grp1, color_red RADIOBUTTON GROUP grp1.

📌 특징:

  • 라디오 버튼은 하나의 그룹에 속해야 한다 (GROUP 이름 지정 필수)
  • 동시에 하나만 선택 가능
  • TYPE C LENGTH 1 자동 지정됨
  • 선택된 버튼의 변수만 값 'X', 나머지는 공백 (' ')

📌 사용 예:

IF color_green = 'X'. 
	WRITE: 'You selected Green!'. 
ELSEIF color_blue = 'X'. 
	WRITE: 'You selected Blue!'. 
ELSEIF color_red = 'X'. 
	WRITE: 'You selected Red!'. 
ENDIF.

✅ 체크박스 vs 라디오 버튼


항목 체크박스 라디오버튼
개수 여러 개 선택 가능 한 그룹당 1개만 선택
타입 TYPE C LENGTH 1 TYPE C LENGTH 1
'X' 또는 ' ' 'X' 또는 ' ', 단 하나만 'X'
사용 목적 선택 가능한 옵션 여러 개 하나만 선택하게 하고 싶을 때

✅ 라벨위치, 설명 

  • 라벨 위치:
    • Checkbox: 라벨이 오른쪽에 위치함
    • Radio: 라벨은 왼쪽, 버튼은 오른쪽
  • 이름은 8자 이내 (PARAMETERS: mybox1 OK, mybox_name은 NG)
  • 입력 필드에 DEFAULT, OBLIGATORY 같은 옵션도 사용 가능 (checkbox/radio에는 보통 사용 안 함)

✅ 마무리

지금까지 PARAMETERS로 만들 수 있는 다양한 입력 필드들

  • 기본 입력 필드 (텍스트, 숫자 등)
  • 드롭다운 (도메인 기반)
  • DEFAULT, OBLIGATORY, LOWER CASE 옵션
  • 체크박스
  • 라디오 버튼

 

✅ PARAMETERS 문이란?

PARAMETERS 문은 사용자가 값을 입력할 수 있는 화면 필드(입력창) 를 만드는 명령어
일반적인 DATA 선언처럼 보이지만, 차이점은 "화면에 표시된다"는 것.

PARAMETERS: my_ee LIKE zemployees-employee.
  • my_ee : 사용자 입력을 받을 변수명
  • LIKE zemployees-employee : zemployees 테이블의 employee 필드 형식을 그대로 사용

→ 이 코드를 쓰면 사용자가 employee 번호를 입력할 수 있는 입력창이 생성됨!


✅ 예시 필드 추가

1. 생년월일(DOB) 필드 추가

 
  • zemployees-dob가 날짜 필드이므로,
    자동으로 달력 아이콘과 날짜 포맷 유효성 검사가 적용됨! 🎉

2. 숫자 입력 필드 (직접 타입 지정)

PARAMETERS: mynum TYPE i.
 
  • TYPE i: 정수형 입력을 받겠다는 뜻
  • 주의: PARAMETERS 변수명은 최대 8자까지만 사용 가능! (mynumber ❌)

✅ 자주 사용하는 PARAMETERS 옵션들


옵션명 설명
DEFAULT 기본값 설정
OBLIGATORY 필수 입력 필드로 지정
VALUE CHECK 도메인/데이터 요소에 등록된 값으로 유효성 검사 (도움말 리스트 연동)
LOWER CASE 소문자 입력 허용 (기본은 대문자로 자동 변환됨)

🔸 예시:

PARAMETERS: my_ee LIKE zemployees-employee DEFAULT '10000001' OBLIGATORY, 
gender LIKE zemployees2-gender VALUE CHECK, 
surname LIKE zemployees-surname DEFAULT 'bloggs' LOWER CASE.

✅ VALUE CHECK 예시 설명

 
PARAMETERS: gender LIKE zemployees2-gender VALUE CHECK.
  • zemployees2-gender 필드가 도메인에 'M', 'F', 'U' 같이 고정값(dropdown) 으로 설정되어 있다면
  • VALUE CHECK 옵션을 붙이면
    • 사용자가 입력한 값이 정의된 값 중 하나인지 검사함
    • 예: K 입력 시 → 오류 메시지: ❌ "Enter a valid value"

✅ LOWER CASE 옵션 설명

PARAMETERS: surname LIKE zemployees-surname DEFAULT 'bloggs' LOWER CASE.
 
  • 기본적으로 모든 입력은 자동으로 대문자로 변환
  • LOWER CASE 옵션을 붙이면 소문자도 유지됨

✅ 정리


기본값 설정 DEFAULT 'value' 화면에 초기값 표시
필수입력 OBLIGATORY 빈 칸 제출 시 에러
유효값 체크 VALUE CHECK 도메인 값 기준 유효성 검사
소문자 허용 LOWER CASE 입력한 소문자 그대로 사용

💬 추가

  • OBLIGATORY + DEFAULT 조합 공부 (기본값 + 강제 입력)
  • VALUE CHECK는 도메인 값 기반으로 유효성 체크
  • LOWER CASE는 이름/이메일 같이 소문자 유지가 중요한 필드에 사용.

 

 

신기하다

📌 목표 요약

사용자가 선택화면에서 값을 입력하기 전에,
프로그램이 마지막 사번(Employee Number) 을 조회해서 기본값이나 참고 정보를 제공하고 싶을 때
사용하는 블록이 바로 INITIALIZATION!


📚 개념 정리

✅ 1. INITIALIZATION 이벤트란?

  • Selection Screen이 보여지기 전에 한 번 실행되는 이벤트 블록.
  • 기본값 설정, 초기 세팅 작업, 선택화면에 표시할 데이터 준비 등에 자주 쓰임.
  • 프로그램이 실행되면 제일 먼저 실행됨.
  • ENDINITIALIZATION 같은 종료 구문은 없음 — 다음 블록이 나오면 끝남.

✅ 2. 예제 흐름 설명

REPORT z_screen_1.

TABLES: zemployees.    " 테이블 연결

DATA: wa_employee LIKE zemployees-employee.  " 마지막 사번 담을 변수

INITIALIZATION.

  SELECT * FROM zemployees.   " 테이블 전체에서 루프 돌면서
    wa_employee = zemployees-employee.  " 마지막 사번 계속 갱신
  ENDSELECT.

  WRITE: wa_employee.   " 마지막에 선택된 값(즉, 마지막 사번)
 
 

🧠 이 코드는 뭐하냐면?

  • zemployees 테이블에서 모든 레코드를 루프로 읽음.
  • 매번 wa_employee 에 현재 사번(employee number) 을 저장함.
  • 루프가 끝나면 가장 마지막에 읽힌 사번 = 테이블의 마지막 사번 이 됨.
  • 그 값을 사용해서 사용자에게 참고값으로 보여줄 수 있음.

🎯 이 코드의 핵심 포인트


요소 설명
INITIALIZATION 선택화면이 뜨기 전에 한 번 실행되는 블록
TABLES: zemployees. 테이블을 선언해서 SELECT 문 등에서 사용 가능하게 함
DATA: wa_employee LIKE zemployees-employee. 사번을 담을 변수 선언
SELECT * FROM zemployees. 테이블 전체 순회 (마지막 사번을 찾기 위해)
wa_employee = zemployees-employee. 루프 도는 동안 계속 값 갱신 (최종적으로 마지막 값이 저장됨)
WRITE: wa_employee. 테스트용 출력 (나중엔 선택화면에 활용)

✨ 추가 팁

  • 실제로는 이 마지막 사번(wa_employee)을 이용해서:
    • PARAMETERS p_empno DEFAULT wa_employee.
      처럼 선택화면에 기본값으로 세팅할 수 있음
  • 이렇게 하면 사용자는 이미 존재하는 가장 마지막 사번을 보고, 다음 사번을 유추하거나 참고할 수 있음

필요하면 이 사번을 기준으로:

  • 신규 사번 생성할 수도 있고
  • 유효성 검사할 수도 있고
  • 기본값으로 띄울 수도 있다!

📚 요약: AT SELECTION-SCREEN 이벤트


항목 설명
역할 사용자가 선택화면에서 "실행(Execute)" 버튼을 눌렀을 때, 입력값을 검증하는 이벤트
위치 INITIALIZATION 블록 다음, 본문 코드 이전
활용 사용자가 잘못된 값을 입력했을 경우 에러 메시지 출력하고, 선택화면을 다시 보여줌
형식 AT SELECTION-SCREEN ON <parameter>. 특정 파라미터에 대해 검사

 

🔎 실습 흐름 요약

  1. INITIALIZATION에서 마지막 사번(employee number) 을 DB에서 읽어서 wa_employee에 저장
  2. PARAMETERS 문으로 입력 필드 생성 (my_ee)
  3. AT SELECTION-SCREEN ON my_ee. 안에서
    • 사용자가 입력한 my_ee 값이 wa_employee보다 큰지 검사
    • 크면 메시지 출력 후, 다시 선택화면으로
REPORT z_screens_1.

TABLES: zemployees.

DATA: wa_empl LIKE zemployees-employee.

PARAMETERS: my_ee LIKE zemployees-employee.

INITIALIZATION.
  SELECT * FROM zemployees.
    wa_empl = zemployees-employee.
  ENDSELECT.

AT SELECTION-SCREEN ON my_ee.
  IF my_ee > wa_empl.
    MESSAGE '입력한 사번이 마지막 사번보다 큽니다!' TYPE 'E'.
  ENDIF.

START-OF-SELECTION.
  WRITE: / '입력한 사번: ', my_ee,
         / '마지막 사번: ', wa_empl.

💡 왜 START-OF-SELECTION을 써야 할까?

  • ABAP은 이벤트 기반 구조라서
  • PARAMETERS → INITIALIZATION → AT SELECTION-SCREEN 까지가 화면 입력 처리용
  • 실제 결과 출력은 START-OF-SELECTION 이후에 수행

📌 실행 흐름

  1. 프로그램 시작
  2. INITIALIZATION → 테이블에서 마지막 사번을 읽음
  3. 사용자가 my_ee에 값을 입력
  4. AT SELECTION-SCREEN → 값 검사
  5. START-OF-SELECTION → 입력 값 출력 ✅

항목 설명
PARAMETERS: 선택화면에 입력 필드를 만듬
my_ee 사용자로부터 입력받을 변수 이름 (내부적으로 사용됨)
LIKE zemployees-employee 이 변수의 데이터 타입을 zemployees 테이블의 employee 필드와 같게 지정
" 사용자 입력 파라미터 그냥 주석 (이 필드가 뭔지 설명)

 

 

📌 요약 정리

ABAP 프로그램에는 두 가지 화면이 있다.

  1. Selection Screen (선택 화면)
  2. List Output Screen (출력 화면)

✅ 1. Selection Screen (선택 화면) 이란?

  • 사용자가 직접 값을 입력하는 화면
  • 예를 들어: 날짜, 이름, 부서 등을 입력할 수 있도록 텍스트 박스, 드롭다운, 라디오 버튼 등을 보여주는 화면.
  • 이 화면은 SAP GUI에서 프로그램을 실행할 때 가장 먼저 나타남
    (예: SE38에서 실행하는 리포트 / 위 사진 첨부)

📌 즉, 사용자 입력을 받기 위한 UI.


✅ 2. List Output Screen (리스트 출력 화면)

  • WRITE 문으로 데이터를 출력하는 화면
  • 사용자가 값을 입력하고 실행을 누르면, 조건에 맞는 데이터가 이 화면에 출력 됨

✅ 3. Selection Screen을 만들기 위해 Dim Pro (Dynpro)를 직접 만들 필요는 없다!

  • SAP의 대화형 프로그램(dialog program)은 보통 Dynpro (Dialog Program) 라는 걸 쓰는데,
  • ABAP Report Program에서는 그 복잡한 화면 컨트롤 코드(Dynpro)를 직접 작성하지 않아도됨!
  • 대신 PARAMETERS, SELECT-OPTIONS 같은 특정 ABAP 문법만 사용하면,
    SAP가 자동으로 화면을 만들어줌

✅ 4. 내부적으로는?

  • SAP는 표준 선택 화면(Standard Selection Screen) 이라는 Dynpro를 사용
  • 이 화면의 번호는 항상 1000번
  • 우리가 PARAMETERS, SELECT-OPTIONS 등을 선언하면, 이 표준화된 Dynpro에 값이 반영돼서 사용자에게 보여지는 것.

✅ 5. 장점?

  • 개발자가 직접 화면을 디자인하거나 제어할 필요 없음!
  • ABAP 문법으로 선언만 하면,
    SAP 시스템이 화면 그리기 + 동작 제어까지 자동으로 해줘서 편리하다.

 


🔍 마무리 정리


개념 설명
Selection Screen 사용자에게 입력을 받는 화면
List Output 결과를 출력하는 화면
PARAMETERS / SELECT-OPTIONS 선택 화면을 만드는 ABAP 문법
Dynpro 1000 SAP 내부적으로 사용하는 선택화면의 번호
장점 개발자가 직접 화면을 컨트롤할 필요 없이 시스템이 자동 처리

 

 

Selection Screen과 이벤트 처리 흐름

SAP에서는 프로그램을 실행하면 일정한 흐름(이벤트 순서)으로 코드가 실행된다.


🧭 이벤트 흐름 요약 (간단 다이어그램)

  1. 프로그램 시작
  2. INITIALIZATION
    → Selection Screen 필드의 초기값 지정
  3. SELECTION-SCREEN
    → 선택화면 정의 & 사용자에게 표시됨
  4. 사용자가 값 입력 후 실행 (F8) 클릭
  5. AT SELECTION-SCREEN
    → 사용자가 입력한 값 검증
  6. START-OF-SELECTION
    → 실제 데이터 처리 로직 실행
  7. END-OF-SELECTION (선택)
    리스트 출력 전 마무리 작업
  8. 리스트 출력 (결과 출력)

🎯 주요 이벤트 정리


이벤트 역할
INITIALIZATION 화면에 기본으로 표시될 초기값 지정
AT SELECTION-SCREEN 사용자가 입력한 값 검증
→ 오류가 있으면 메시지 띄우고 다시 입력받음
START-OF-SELECTION 본격적인 데이터 처리 로직 시작
END-OF-SELECTION 출력 전에 마무리 작업
AT LINE-SELECTION 리스트 출력 후, 라인 더블 클릭 시 실행

 

🧑‍💻 코드 흐름 예시

REPORT z_example.

PARAMETERS: p_name TYPE string.

INITIALIZATION.
  p_name = '홍길동'.

AT SELECTION-SCREEN.
  IF p_name IS INITIAL.
    MESSAGE '이름을 입력해주세요.' TYPE 'E'.
  ENDIF.

START-OF-SELECTION.
  WRITE: / '입력한 이름:', p_name.

실행 흐름:

  1. INITIALIZATION → p_name에 '홍길동' 자동 입력됨
  2. Selection Screen 표시됨
  3. 사용자가 값을 입력하고 실행
  4. AT SELECTION-SCREEN → 값 검증
  5. START-OF-SELECTION → 값 출력

🔄  Descriptions.

  • SAP 시스템이 프로그램을 실행할 때 자동으로 특정 이벤트 블록을 호출
  • 각 블록에 맞게 코드를 작성하면 자동 실행 흐름에 맞춰 실행
  • Selection Screen은 PARAMETERS나 SELECT-OPTIONS로 선언하고,
    사용자 입력 검사는 AT SELECTION-SCREEN에서 수행함
  • 잘못된 값이 입력되면, 에러 메시지 후 다시 입력화면이 보여짐

📝 정리

 

개념 설명
Selection Screen 사용자에게 입력 받는 UI 화면
이벤트 블록 프로그램 흐름을 단계별로 나누는 구조
주요 블록 INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION 등
리스트 출력 후 인터랙션 AT LINE-SELECTION 등으로 후속 동작 처리 가능

 

이렇게만 정리해도 약간 헷갈린다.

 

✅ 1. Selection Screen이란?

📌 "사용자로부터 입력을 받는 화면"을 의미함

ABAP 프로그램을 만들다 보면, 사용자가 직접 검색 조건, 날짜, 이름, 코드 같은 데이터를 입력할 때, 사용하는 게 바로 **Selection Screen (선택 화면)**!

✅ 2. 그럼 이벤트(Event)는 뭘까?

**이벤트(Event)**는 ABAP 프로그램 실행 시, 특정한 시점에서 자동으로 호출되는 코드 블록.

SAP 시스템은 프로그램을 실행하면서, 정해진 순서대로 특정 이벤트 블록들을 자동으로 실행해줌!

📌 ABAP Report Program Flow (표준 실행 흐름)

1. Program Start  
2. INITIALIZATION  
3. AT SELECTION-SCREEN  
4. START-OF-SELECTION  
5. Data Retrieval (e.g. SELECT)  
6. Processing Entries (LOOP / IF / grouping etc.)  
7. List Output (WRITE, ALV, etc.)

 

✅ 1. Start (프로그램 시작)

  • 프로그램이 실행되면 전역 변수들이 메모리에 로드됨

✅ 2. INITIALIZATION

  • Selection screen이 나타나기 에 실행됨
  • 여기에서 selection screen의 초기값을 설정할 수 있음
INITIALIZATION.
  p_date = sy-datum.

 

✅ 3. AT SELECTION-SCREEN

  • 사용자가 화면에서 값을 입력하고 실행했을 때,
  • 입력값을 검증하고 조건을 체크하는 곳
AT SELECTION-SCREEN.
  IF p_date < sy-datum.
    MESSAGE '오늘 이후 날짜를 입력하세요' TYPE 'E'.
  ENDIF.

 

✅ 4. START-OF-SELECTION

  • 여기서부터 메인 프로그램 로직이 시작됨
  • SELECT 문이나 LOOP, 데이터 처리 시작 위치
START-OF-SELECTION.
  SELECT * FROM zemployees INTO TABLE it_emp
    WHERE dept = p_dept.

 

✅ 5. READ AN ENTRY (데이터 1건씩 읽기)

  • SELECT 또는 LOOP AT를 통해 데이터 한 줄씩 처리
LOOP AT it_emp INTO wa_emp.
  WRITE: / wa_emp-name, wa_emp-salary.
ENDLOOP.

 

✅ 6. PROCESS AN ENTRY (데이터 처리)

  • 예를 들어 계산, 필터링, 그룹핑 등
  • 데이터를 한 줄씩 읽고 필요한 가공 로직 수행
  IF wa_emp-salary > 5000.
    wa_emp-bonus = wa_emp-salary * 0.1.
  ENDIF.

 

✅ 7. GROUP PROCESSING (필요한 경우)

  • 여러 건을 묶어서 집계 처리할 수도 있음
  • AT NEW, AT END OF 등의 그룹 제어문 사용 가능
LOOP AT it_emp INTO wa_emp.
  AT NEW dept.
    WRITE: / '부서:', wa_emp-dept.
  ENDAT.

  WRITE: / wa_emp-name.

  AT END OF dept.
    WRITE: / '---- 부서 종료 ----'.
  ENDAT.
ENDLOOP.

 

8. List Output (결과 출력)

  • WRITE, ALV, CL_GUI... 등을 이용한 출력
  • 기본 WRITE는 바로 화면에 출력

 

 

[Start]
   ↓
[INITIALIZATION] → selection screen에 초기값
   ↓
[SELECTION SCREEN 표시됨 → 사용자 입력]
   ↓
[AT SELECTION-SCREEN] → 사용자 입력 검증
   ↓
[START-OF-SELECTION] → 핵심 처리 시작
   ↓
[SELECT / LOOP] → 데이터 조회 및 처리
   ↓
[WRITE / ALV] → 결과 출력
   ↓
[End]

✅ EXIT 문 요약

항목 설명
📌 역할 현재 반복문을 즉시 종료
🎯 차이점 CONTINUE는 다음 루프로 넘어감, EXIT은 반복문 전체 탈출
🔄 사용 위치 반복문 안 (DO, WHILE, SELECT 등)
또는 서브루틴 안에서도 사용 가능
🧨 반복문 밖에서 쓰면? 해당 블록이나 프로그램 전체 종료할 수 있음

💡 코드 예시: 반복문 안에서 EXIT

DATA: a TYPE i.

DO 10 TIMES.
  a = a + 1.
  IF sy-index = 3.
    EXIT.
  ENDIF.
  WRITE: / 'Loop iteration:', a.
ENDDO.

WRITE: / 'Loop finished!'.
 

🔎 실행 결과:

Loop iteration: 1
Loop iteration: 2
Loop finished!
  • sy-index = 3일 때 EXIT 실행 → 루프 전체 종료
  • 아래 루프 바깥의 WRITE는 실행됨

🚫 반복문 밖에서 사용하면?

 
DATA: a TYPE i VALUE 0.

EXIT.

WRITE: / 'This will not be shown'.
  • EXIT에 도달하면 프로그램 종료
  • 아래 코드 실행 안 됨

⛓️ 중첩 루프에서는?

  • EXIT은 현재 루프만 종료
  • 바깥 루프는 계속 진행
DO 3 TIMES. " Outer loop
  DO 5 TIMES. " Inner loop
    IF sy-index = 2.
      EXIT. " 탈출하는 건 inner loop!
    ENDIF.
    WRITE: / '  Inner:', sy-index.
  ENDDO.
  WRITE: / 'Outer:', sy-index.
ENDDO.

 


📝 정리

  • EXIT → 전체 루프를 탈출
  • CONTINUE → 현재 루프 한 번만 건너뛰기
  • CHECK → 조건 맞을 때만 아래 코드 실행

✅ 핵심 요약: CHECK 문

📌 기본 동작

  • CHECK 조건.
    → 조건이 거짓(FALSE) 이면, 해당 루프의 나머지 코드를 실행하지 않고 다음 루프로 건너뜀.
  • 조건이 참(TRUE) 이면, 아래의 코드를 계속 실행함.

🔄 CHECK vs CONTINUE vs IF

구문동작 예시 상황
IF 조건. CONTINUE. ENDIF. 조건이 맞을 때 다음 루프로 넘어감 조금 더 복잡한 조건이 필요할 때
CHECK 조건. 조건이 거짓이면 다음 루프로 넘어감 간단한 조건일 때 코드가 더 간결해짐
IF 조건. (일반 실행) ENDIF. 조건이 참일 때만 코드 실행 명확한 조건 분기 필요할 때

→ CHECK는 사실상 IF NOT 조건. CONTINUE. 와 같음.


🧪 예제 코드: 루프 내 CHECK

 
DO 10 TIMES.
  CHECK sy-index MOD 2 = 0.  "짝수만 출력
  WRITE: / sy-index.
ENDDO.

🔍 결과

Loop: 1
Loop: 3
...
Loop: 15

2번째 루프는 출력이 없음 → sy-index = 2일 때 CHECK sy-index <> 2. 조건은 거짓 → 다음 루프로 넘어감


⚠ CHECK의 위치에 따른 효과

1. ✅ 루프 안에 사용 → 해당 루프만 skip (마치 CONTINUE)

DO 10 TIMES.
  CHECK sy-index MOD 2 = 0.  "짝수만 출력
  WRITE: / sy-index.
ENDDO.

2. ⚠ 루프 밖에서 사용전체 프로그램 블록 종료

DATA a TYPE i VALUE 0.
CHECK a = 1. " 조건 안 맞음 → 전체 프로그램 종료
WRITE: / '이건 실행되지 않음'.

→ 루프 밖에서 CHECK 조건이 false이면 그 블록 자체를 종료하기 때문에 주의!


🧠 정리

  • CHECK는 간단한 조건 필터링에 매우 유용함
  • 루프 내에서는 CONTINUE 대용으로 자주 사용
  • 루프 외부에서는 블록 종료 역할을 하므로 주의 필요
  • 코드를 더 간결하게 만들 수 있어 ABAP 스타일로도 추천됨!

 

🔄 CONTINUE만 써도 되지 않을까?

사실 기능적으로는 CONTINUE 하나만 써도 가능하지않나?
다만, CHECK는 가독성과 간결함에서 큰 장점이 있다고 한다.

1. CHECK는 간단한 필터링 조건에 많이 사용됨.

LOOP AT it_employees INTO wa_emp.
  CHECK wa_emp-department = 'IT'.
  " 아래는 IT 부서에만 해당
  WRITE: / wa_emp-name.
ENDLOOP.

→ 위 코드는 "IT 부서 아닌 사람은 걍 건너뛰어!" 라는 뜻인데, CHECK로 한 줄이면 끝남.

 

2. 똑같은 로직을 IF + CONTINUE로 쓰면:

LOOP AT it_employees INTO wa_emp.
  IF wa_emp-department <> 'IT'.
    CONTINUE.
  ENDIF.
  WRITE: / wa_emp-name.
ENDLOOP.

→ 동작은 똑같지만, 코드가 3줄임.

+ Recent posts