✅ ABAP 조건문에서 사용하는 비교 연산자 (Relational Operators)

표준연산자 의미 abap 키워드
= 같다 EQ
<> 같지 않다 NE
< 작다 LT
> 크다 GT
<= 작거나 같다 LE
>= 크거나 같다 GE

⚠️ 키워드 방식(EQ, NE 등)은 예전 방식이고, 지금은 보통 =, <> 등 표준 방식이 더 많이 쓰임.


🔗 논리 연산자 (Logical Operators)


연산자 의미 사용예시
AND 그리고 IF a = b AND c = d.
OR 또는 IF a = b OR c = d.
NOT ~가 아니다 IF NOT a = b.

 


🧩 예시 코드

 
IF surname = 'SMITH' AND forename = 'JOHN'. WRITE: 'This is John Smith'. ENDIF.

또는

IF surname = 'SMITH' OR surname = 'BROWN'. WRITE: 'Common surname'. ENDIF.

✨ 요약

  • ABAP에서도 다양한 조건 연산자 사용 가능!
  • AND, OR, NOT을 통해 여러 조건을 조합 가능
  • EQ, NE, LT 등의 키워드 방식은 가능하지만 덜 권장됨 → 되도록 표준 연산자(=, <> 등) 사용

✅ 핵심 주제: IF 조건문 (Control Structures)

ABAP 프로그램에서 조건에 따라 다른 동작을 하게 만들기 위해 사용하는 것이 IF 문.


🧩 예제 흐름 정리

1. 프로그램 복사

  • 기존 프로그램 Z_OPENSQL_1을 복사해서 Z_LOGIC_1으로 만들고,
  • 그 안에서 논리 흐름을 실습해보는 방식으로 설명이 시작됨.

2. 조건문 기본 구조 설명

abap
CopyEdit
`IF condition.`
 - 조건이 참일 때 실행
`ELSEIF another_condition.`
- " 다른 조건이 참일 때 실행
ELSE. "
모든 조건이 거짓일 때 실행
ENDIF.

3. 예제 코드 흐름

 
DATA surname TYPE c LENGTH 15.

surname = 'SMITH'.

IF surname = 'SMITH'.
  WRITE: 'You''ve won a car'.
ELSEIF surname = 'BROWN'.
  WRITE: 'You''ve won a boat'.
ELSEIF surname = 'JONES'.
  WRITE: 'You''ve won a plane'.
ELSEIF surname = 'ANDREWS'.
  WRITE: 'You''ve won a house'.
ELSE.
  WRITE: 'Unlucky, you go home empty handed'.
ENDIF.

 

👀 실행 결과

  • surname = 'SMITH' → "You've won a car"
  • surname = 'BROWN' → "You've won a boat"
  • surname = 'ANDREWS' → "You've won a house"
  • surname = 'KIM' → "Unlucky, you go home empty handed"

📌 요약

 

IF 조건이 이면 해당 블록 실행
ELSEIF 첫 조건이 거짓이고, 이 조건이 참이면 실행
ELSE 위 조건들 전부 거짓이면 실행
ENDIF 조건문의

🧠 왜 중요할까?

  • 조건에 따라 프로그램 흐름을 제어할 수 있음 (분기)
  • 복잡한 로직을 처리할 때 가장 기본적이고 강력한 도구
  • 특히 ABAP에서는 데이터 처리 로직, 오류 처리, 화면 표시 조건 등에 자주 사용됨

 

 

결과값 : money!

 

🔥 ABAP DELETE 문이란?

  • 데이터베이스 테이블의 레코드를 삭제하는 명령어
  • 신중히 써야 해! 잘못 쓰면 테이블 전체 레코드가 삭제될 수도 있음!

✅ 기본 문법

1. 🔸 특정 레코드 삭제 (기본 키 기준)

 
```
CLEAR wa_employees. wa_employees-employee = '10000007'. " 기본 키만 세팅 DELETE zemployees FROM wa_employees.
```
  • wa_employees 구조체의 **기본 키 값(employee)**에 해당하는 레코드만 삭제.
  • sy-subrc = 0 → 삭제 성공
  • sy-subrc ≠ 0 → 실패 (예: 해당 키의 레코드 없음)

2. 🔸 조건 삭제 (WHERE 사용)

abap
CopyEdit
DELETE FROM zemployees WHERE surname = 'BROWN'.
  • surname이 'BROWN'인 모든 레코드 삭제
  • 여러 개 삭제 가능!

3. 🔥 전부 삭제 (❗주의❗)

abap
CopyEdit
DELETE FROM zemployees.
  • 테이블의 모든 레코드 삭제 😱
  • 실수로 쓰면 큰 문제가 생길 수 있으니 정말 조심해야함

💡 DELETE 문 흐름 예시

  1. 기본 키로 삭제
    • employee = '10000007' 인 레코드 1개 삭제
  2. 조건으로 삭제
    • surname = 'BROWN' 인 레코드 여러 개 삭제
  3. 테이블 전체 삭제
    • 실습에서는 하지 않았지만, 문법은 존재

📌 리턴 코드 sy-subrc


의미
0 삭제 성공
4 해당 조건의 레코드 없음

🚨 주의사항

  • 항상 sy-subrc를 체크해서 정상 동작했는지 확인해야함
  • DELETE FROM 전체 삭제는 절대 주의!!
  • CLEAR 구문으로 워크에어리어 초기화하는 습관도 중요

🧠 결론 요약

  • 기본 키 삭제 → DELETE FROM tab FROM wa
  • 조건 삭제 → DELETE FROM tab WHERE field = 'value'
  • 전체 삭제 → DELETE FROM tab. → 사용 주의!
  • ✔ 항상 sy-subrc 체크하기
  • ✔ CLEAR 문으로 워크에어리어 초기화 습관 들이기

 

DELETE FROM ... FROM wa 특정 키 값 레코드 삭제
DELETE FROM ... WHERE 조건에 해당하는 레코드 삭제
DELETE FROM ... 테이블 전체 삭제

 

 

 

✅ 1. 첫 번째 DELETE FROM zemployees FROM wa_empl.

abap
CopyEdit
wa_empl-employee = '1000012'. DELETE zemployees FROM wa_empl.

이 경우는 employee = '1000012' 인 레코드가 실제로 존재해서 삭제 성공했기 때문에
→ sy-subrc = 0이 되는 거야.
즉, 삭제 성공 = sy-subrc가 0


❌ 2. 두 번째 DELETE FROM zemployees WHERE surname = 'BROWN'.

abap
CopyEdit
DELETE FROM zemployees WHERE surname = 'BROWN'.

여기서는 surname = 'BROWN'인 레코드가 존재하지 않았기 때문에,
삭제할 게 없어서 아무 일도 안 일어났고,
→ 그 결과 **sy-subrc = 4**가 된 거야.


🔢 SY-SUBRC 값 정리:

SY-SUBRC 값의미
0 작업 성공 (레코드 삭제됨)
4 작업 실패 (삭제할 레코드 없음 등)

 

🔢 table entries delete

 

결과:

- No table entries found for specified key

: 모든 데이터가 사라졌다!

🧾 🔧 MODIFY 문이란?

  • MODIFY는 존재하는 레코드면 UPDATE, 없으면 INSERT 하는 명령어.
  • 즉, "있으면 수정하고, 없으면 새로 넣어라" 이런 뜻!

✅ 사용 형식

`MODIFY zemployees FROM wa_employees.`
  • wa_employees는 워크 에어리어 (작업용 구조체)
  • 내부적으로는 employee(Key)를 보고,
    • 있으면 그 레코드를 수정 (UPDATE)
    • 없으면 새로 추가 (INSERT)

✅ 리턴값 체크

  • sy-subrc = 0 → 성공
  • sy-subrc = 4 → 실패 (예: 테이블 오류)

👀 예제 흐름 요약

  1. INSERT: 10000006번 직원 등록 (WESTMORE / BRUCE)
  2. UPDATE: 10000006의 성을 EASTMORE, 이름을 ANDY로 변경
  3. MODIFY (기존 레코드):
    • 같은 10000006 키 → NORTHMORE / PETER로 업데이트
  4. MODIFY (새로운 레코드):
    • 10000007 신규 → 새로운 직원 삽입

📌 핵심 요점

구문기능조건
INSERT 새 레코드 삽입 해당 키가 없을 때만 가능
UPDATE 기존 레코드 수정 해당 키가 있어야 함
MODIFY 있으면 수정, 없으면 삽입 (자동 판단) 키 존재 여부로 판단

💡 왜 MODIFY는 조심해서 써야 할까?

  • INSERT / UPDATE를 명확하게 나누는 게 가독성 좋음
  • 하지만 실무에서 상황 따라 둘 중 하나를 선택해야 할 때는 MODIFY가 유용함

🔚 결론

  • 평소엔 INSERT, UPDATE를 구분해서 쓰고
  • 조건에 따라 둘 중 하나를 선택해야 할 때만 MODIFY를 사용하자!

 


✅ 코드 구조

1. 작업에 필요한 워크 에어리어(work area)는 이미 선언됨


DATA wa_employees LIKE zemployees.

2. 첫 번째 INSERT

 
 
wa_employees-employee = '10000006'. 
wa_employees-surname = 'WESTMORE'. 
wa_employees-forename = 'BRUCE'. 
wa_employees-title = 'MR'. 
wa_employees-dob = '19921213'. 


INSERT zemployees FROM wa_employees. 


IF sy-subrc = 0. 
	WRITE 'Record Inserted Correctly'. 
ELSE. 
	WRITE: 'We have a return code of ', sy-subrc. 
ENDIF.
  • 새 직원 'WESTMORE / BRUCE'를 등록함.
  • sy-subrc = 0이면 성공한 거고, 4면 실패 (예: 중복 key)

3. UPDATE 할 값으로 다시 세팅

wa_employees-surname = 'EASTMORE'. wa_employees-forename = 'ANDY'.
 
 
  • 이름만 바꿔줌.
  • employee number는 그대로!
    ➜ 이게 key 역할을 하기 때문에, 이 key로 해당 레코드를 찾아서 나머지를 바꾸는 것!

4. UPDATE 실행

UPDATE zemployees FROM wa_employees. 
IF sy-subrc = 0. 
	WRITE 'Record Updated Correctly'. 
ELSE. 
	WRITE: 'Update Failed. Return code: ', sy-subrc. 
ENDIF.
 
이 구문은 employee가 10000006인 레코드를 찾아서, surname, forename 등을 UPDATE함.

🔍 추가 팁

✨ CLEAR 안 해도 괜찮은 이유

  • 이 예제에서는 모든 필드를 다시 덮어쓰니까, 이전 값이 남아 있을 걱정이 없음
  • 하지만 일부 필드만 바꾼다면, 꼭 CLEAR 해줘야 함!

🧠 UPDATE의 핵심 조건

  • Key 필드 (employee) 가 같아야 하고,
  • 나머지 필드를 바꾸고 싶을 때 사용함.

💡 정리


구문 역할
INSERT 새 레코드 추가
UPDATE 기존 레코드 수정 (Key 기준 찾음)
sy-subrc = 0 성공 여부 확인

💡 전체 개요

  • 프로그램이 단일한 INSERT로 끝나는 게 아니라,
  • 반복(loop)을 통해 여러 개의 데이터를 삽입하거나 수정할 때,
  • 같은 Work Area를 재사용하는 경우가 많음
  • 이때 기존 데이터가 남아있으면 오류가 발생할 수 있으므로, CLEAR를 써서 초기화해줘야함!

🔄 프로그램 흐름

  1. wa_employees에 데이터 채움
  2. INSERT로 DB 테이블에 삽입
  3. SY-SUBRC 체크해서 성공 여부 확인
  4. 그 다음 작업 전 CLEAR wa_employees 실행! → 이전 값들을 날리고 깨끗한 상태로 만들어줌
  5. 다시 새로운 데이터를 넣고 INSERT 시도

🧪 실행 중 에러 발생 예시

  • 같은 키 값(employee = '10000006')으로 두 번 INSERT 시도하면? → SY-SUBRC = 4가 뜸 (에러) → "Record already exists" 느낌의 실패 코드

💡 CLEAR 사용 방식

문장 설명
CLEAR wa_employees. 구조체 전체를 초기화
CLEAR wa_employees-employee. 특정 필드만 초기화

💡 전체 구조체를 초기화하는 걸 추천!


📌 디버그 화면에서 확인한 내용

  • SY-SUBRC = 4일 때, 오류 메시지 출력
  • 이후 CLEAR로 일부 필드를 초기화하고 새로운 값 삽입하면 SY-SUBRC = 0으로 성공
  • 보고서에는 "We have a return code of 4" 또는 "Record Inserted Correctly" 출력

🧼 왜 CLEAR가 중요할까?

  • ABAP은 변수를 재사용할 때 기존 값이 자동으로 초기화되지 않음
  • 예기치 않은 값이 남아있을 수 있음
  • 특히 loop나 반복 insert/update 작업에서는 필수!

✅ 핵심 요약

  • CLEAR는 변수나 구조체의 값 초기화용
  • Work Area를 여러 번 쓰는 경우 반드시 필요함
  • SY-SUBRC 값으로 성공/실패 판단 후 대응 로직 작성!
  • 실습에서는 employee 필드만 초기화했지만, 보통은 CLEAR wa_employees. 처럼 전체 구조체를 비우는 게 안전함

 

✅ CLEAR 문이 필요한 이유 (왜 쓰는가?)

CLEAR는 변수나 구조체(work area)의 값을 초기화
즉, 기존에 있던 값들을 다 지워주는 것!


❓ 그럼 왜 굳이 초기화해야 할까?

📌 1. 이전 값이 남아 있어서 잘못된 데이터가 들어갈 수 있기 때문!

예를 들어서...

 
wa_emp-employee = '1001'. wa_emp-surname = 'KIM'. wa_emp-forename = 'JISOO'. 
INSERT zemployees FROM wa_emp.

 

 

⬇️ 다음 레코드 만들 때...

CLEAR wa_emp-employee. " employee만 초기화 wa_emp-employee = '1002'. 
INSERT zemployees FROM wa_emp.
 
이러면 surname과 forename은 그대로 KIM, JISOO가 남아있음.

➡️ employee = 1002지만 이름은 여전히 JISOO가 들어감 ❗

즉, 예전 값이 덮어써지지 않으면 그 값 그대로 들어가버림 


📌 2. 반복문에서 구조체 재사용할 때 자주 씀

예를 들어 LOOP 돌면서 레코드 계속 INSERT 한다고 하면:

LOOP AT it_data INTO wa_data. CLEAR wa_emp. " 구조체 전체 초기화 => wa_emp-employee = wa_data-id. wa_emp-surname = wa_data-name. 
INSERT zemployees FROM wa_emp. ENDLOOP.

CLEAR 안 하면 이전 루프에서 남은 값들이 계속 따라다님... 🥲


✨ 핵심 요약

상황CLEAR 안 써도 됨?추천?
모든 필드를 직접 덮어씀 O 괜찮음
일부 필드만 변경 X CLEAR 꼭 필요
반복문에서 구조체 재사용 X CLEAR 추천

 


*&---------------------------------------------------------------------*
*& Report  Z_OPENSQL_1                                                 *
*&---------------------------------------------------------------------*
*& Demonstrates INSERT with Open SQL and SY-SUBRC check
*&---------------------------------------------------------------------*

REPORT  z_opensql_1.

* Work area 선언
DATA wa_employees LIKE zemployees.

* 데이터 채우기
wa_employees-employee = '10000006'.
wa_employees-surname = 'WESTMORE'.
wa_employees-forename = 'BRUCE'.
wa_employees-title = 'MR'.
wa_employees-dob = '19921213'.

* INSERT 구문 실행
INSERT zemployees FROM wa_employees.

* 결과 확인
IF sy-subrc = 0.
  WRITE 'Record Inserted Correctly'.
ELSE.
  WRITE: 'We have a return code of ', sy-subrc.
ENDIF.

💡 보충 설명:

  • wa_employees는 테이블 구조와 동일한 레코드 단위 메모리 공간
  • INSERT 구문으로 테이블에 데이터를 넣고,
  • sy-subrc = 0이면 성공적으로 삽입된 것!
  • 실패 시에는 실패 코드(sy-subrc)를 출력

 

💡 Work Area란?

**Work Area(워크 에어리어)**는 ABAP에서 내가 작업할 데이터를 임시로 저장해두는 메모리 공간

  • 쉽게 말해, "하나의 레코드(한 줄)"를 담을 수 있는 변수라고 생각하면됨!
  • 보통 테이블 구조와 동일하게 만들어서, 테이블에 값을 넣거나, 테이블에서 값을 가져와서 사용하는 데 쓰임.

📦 예시로 이해하기

예를 들어 zemployees라는 테이블이 이렇게 생겼다고 해볼게요:


EMPLOYEE SURNAME FORENAME TITLE DOB
10000006 WESTMORE BRUCE MR 19921213

이 한 줄을 담을 수 있는 그릇이 바로 Work Area!

 
DATA wa_employees LIKE zemployees.

 

📝 결과

✅ 핵심 요약

✔ Open SQL 5가지 기본 문장

구문기능
SELECT 테이블에서 데이터를 조회
INSERT 테이블에 새 레코드 추가
UPDATE 테이블에 기존 레코드 수정
MODIFY 조건에 따라 추가 또는 수정
DELETE 테이블에서 레코드 삭제

📌 주요 내용 정리

🔹 1. SELEC

  • 테이블에서 데이터를 읽어와서 프로그램에서 사용/ 조회

🔹 2. INSERT

  • 테이블에 새로운 데이터를 추가
INSERT ztable FROM wa.

🔹 3. UPDATE

  • 이미 존재하는 레코드를 변경할 때 사용
UPDATE ztable SET field = 'value' WHERE id = '001'.

🔹 4. MODIFY

  • 존재하면 UPDATE, 존재하지 않으면 INSERT로 동작
  • 조건 판단 없이 편하게 쓸 수 있지만, 주의해서 사용해야함!

🔹 5. DELETE

  • 테이블에서 특정 레코드를 삭제할 수 있음
 
DELETE FROM ztable WHERE id = '001'.

🛡️ SY-SUBRC: 실행 결과 확인

  • ABAP에서는 명령어가 성공했는지 실패했는지 SY-SUBRC라는 시스템 변수로 확인함
SY-SUBRC 값 의미
0 명령이 정상 수행됨
≠ 0 실패하거나 특별한 상황 발생 (예: 조건 불일치)
 
INSERT ztable FROM wa. IF sy-subrc = 0. WRITE: '삽입 성공!'. ELSE. WRITE: '삽입 실패!'. ENDIF.

🧠 주의사항

  • SY-SUBRC는 모든 SQL 문에서 각각 다른 의미를 가질 수 있음
  • 예를 들어 SELECT에서는 "데이터가 없음"도 sy-subrc ≠ 0으로 처리됨!
  • 따라서 문장별 의미를 꼭 문서나 도움말에서 확인해두는 것이 중요함 

📝 마무리

이제 ABAP에서 데이터 조작 시 반드시 SY-SUBRC로 결과를 체크해야 하고,
어떤 상황에서 어떤 값을 가지는지 꼭 익숙해지면 실무에서 버그 방지에 큰 도움이 된다고 함 

🔹 "이제 ABAP 프로그램에서 사용할 수 있는 Open SQL 문들을 살펴보자."

 

Open SQL 문을 사용하면 DB 테이블의 레코드에 간접적으로 접근하거나 수정할 수 있음.

 


🔹 "Open SQL의 장점"

Open SQL의 큰 장점은,
우리가 어떤 종류의 데이터베이스(Oracle, Microsoft SQL 등) 를 쓰든 동일한 방식으로 ABAP 프로그램에서 사용 가능하다.

→ 즉, 데이터베이스 종류에 상관없이 코드가 호환됨!
이건 SAP가 내부적으로 그 차이를 알아서 처리해주기 때문!


🔹 "MANDT 필드"

  • MANDT는 클라이언트 번호(예: 100, 200, 800 등) 를 의미해요.
  • 그리고 이 MANDT 필드는 대부분의 거래 데이터(트랜잭션 테이블),
    마스터 데이터, 설정 테이블 등에 기본적으로 포함되어 있음

🔹 SQL에서의 MANDT 필드

ABAP에서는 굳이 MANDT를 SQL문에 명시하지 않아도 됨!

왜냐하면:

  • 내가 어떤 클라이언트(100번, 800번 등) 로 로그인하든,
  • SAP 시스템이 자동으로 MANDT 값을 기준으로 필터링함

즉, 내가 클라이언트 100번으로 로그인해서 프로그램을 돌리면,

SELECT * FROM ZEMPLOYEES.

SELECT * FROM ZEMPLOYEES WHERE MANDT = '100'.

아래 select문으로 자동필터링됨

 


🔹 "이 자동 필터링의 장점은?"

  • 보안성: 다른 클라이언트의 데이터를 실수로 접근할 일이 없어짐
  • 코드 간결함: MANDT를 따로 조건에 쓰지 않아도 됨!
  • 일관성: 여러 클라이언트에서 동일한 프로그램이 동일하게 작동!

✅ 요약


Open SQL DB 종류에 상관없이 ABAP에서 사용하는 SQL 문
MANDT 필드 클라이언트 번호, 대부분의 테이블에 자동 포함됨
자동 필터링 로그인한 클라이언트에 따라 MANDT는 자동으로 필터됨
프로그래머 역할 MANDT를 SQL문에 명시할 필요 없음
보안 효과 다른 클라이언트 데이터 접근 차단됨

✅ SAP에서의 Locking(잠금) 개념이란?

SAP 시스템은 동시에 여러 사용자가 동일한 데이터를 접근할 수 있기 때문에,
데이터 무결성과 일관성을 지키기 위해 잠금(Lock)이 필요함!


🔒 1. 데이터 잠금의 종류

구분설명
구분 설명
Database Lock (DB Lock) DB 자체의 잠금 기능 (단일 SQL 단계에서만 사용됨)
SAP Lock (Logical Lock, ENQUEUE/DEQUEUE) SAP 자체적인 잠금 개념. 여러 화면/단계 걸친 트랜잭션에 사용됨

 


🔷 2. 왜 DB Lock만으로는 부족할까?

SAP에서는 한 건의 입력이 여러 화면(SCREEN) 을 통해 이루어짐! 예를 들어:

  1. 첫 화면: 이름, 주소
  2. 두 번째 화면: 직급, 부서
  3. 세 번째 화면: 급여, 통화

그런데 사용자가 2화면까지만 입력하고 취소하면?
→ 일부 데이터만 DB에 저장되어 불완전한 상태가 될 수 있음 ❌

그래서 SAP는 단순한 DB Lock 대신,
트랜잭션 전체를 묶어서 잠그는 SAP Lock(논리적 잠금) 을 사용한다.


🧩 3. SAP Lock의 특징


특징 설명
✔ SAP 자체 Lock 테이블에 저장 ENQUEUE라는 함수로 설정됨
✔ 트랜잭션이 끝날 때까지 잠금 유지 모든 화면이 완료되기 전까지 DB에 저장하지 않음
✔ 여러 테이블 잠금 가능 전제: 외래키(Foreign Key)로 테이블이 연결되어 있어야 함
✔ ABAP Dictionary에서 Lock Object 생성 개발자가 생성하고 사용하는 구조체 개념

 


🛠️ 4. SAP Lock Object 구성

  1. ABAP Dictionary(SE11)에서 Lock Object 생성
  2. Lock Object는 자동으로 2개의 Function Module 을 생성:
    • ENQUEUE_객체명: 잠금 설정
    • DEQUEUE_객체명: 잠금 해제
  3. 개발자가 ABAP 코드에서 이 함수들을 직접 호출

예시:

CALL FUNCTION 'ENQUEUE_EZEMPLOYEES2' EXPORTING employee_id = '10001'. 

" ... 작업 수행 후 

CALL FUNCTION 'DEQUEUE_EZEMPLOYEES2' EXPORTING employee_id = '10001'.
 

💡 핵심 요약

항목설명
🔐 SAP Lock이 필요한 이유 여러 사용자의 동시 접근으로부터 데이터 보호
🧱 DB Lock 한계 단일 단계만 처리 가능, 다중 화면/다단계엔 부적합
🧰 SAP Lock Object ABAP Dictionary에서 생성, Function Module 자동 생성
📦 잠금 저장 위치 중앙 Lock 테이블 에 기록됨
👨‍💻 개발자 역할 ENQUEUE / DEQUEUE 함수 직접 호출해서 잠금 설정 및 해제

+ Recent posts