[SAP] INTERNAL TABLE_제어

이안·2024년 2월 19일

SAP

목록 보기
7/30
post-thumbnail

1. IF

IF문은 비교를 하는 명령어로써 프로그램에서 가장 유용하게 사용됨. 조건에 대한 참과 거짓을 판단하여 참일 경우와 거짓일 경우의 실행 부분을 별도로 지정하여 변수의 값에 따라 다르게 처리할 수 있게 해주는 명령어

DATA : BEGIN OF GS_STUDENT,
	ZCODE LIKE ZEDT05_001-ZCODE, "출석번호
	ZKNAME LIKE ZEDT05_001-ZKNAME,
	ZENAME LIKE ZEDT05_001-ZENAME,
	ZGENDER LIKE ZEDT05_001-ZGENDER,
	ZGNAME TYPE C LENGTH 4,
	ZTEL LIKE ZEDT05_001-ZTEL,
END OF GS_STUDENT.
DATA : GT_STUDENT LIKE TABLE OF GS_STUEDNT.

CLEAR : GS_STUDENT, GT_STUDENT.

GS_STUDENT-ZCODE = 'CODE-01'.
GS_STUDENT-ZKNAME = '차은우'.
GS_STUDENT-ZENAME = 'CHA'.
GS_STUDENT-ZGENDER = 'M'.
GS_STUDENT-ZTEL = '01012345678'.

1) IF ~ ENDIF

* 기본구조
IF LOGICAL_EXPRESSION. "LOGICAL_EXPRESSION : 논리연산
    PROCESSING1.
ENDIF.

* 예시
IF GS_STUDENT-ZGENDER = 'M'. "M이 아닐경우에는 ZGNAME 빈칸
   GS_STUDENT-ZGNAME = '남자'.
ENDIF.
    
APPEND GS_STUDENT TO GT_STUDENT.
CLEAR : GS_STUDENT.

2) IF ~ ELSE ~ ENDIF

* 기본구조
IF LOGICAL_EXPRESSION. "LOGICAL_EXPRESSION : 논리연산
    PROCESSING1.
ELSE.
    PROCESSING2.
ENDIF.

* 예시
IF GS_STUDENT-ZGENDER = 'M'.
    GS_STUDENT-ZGNAME = '남자'.
ELSE.
    GS_STUDENT-ZGNAME = '여자'.
ENDIF.
    
APPEND GS_STUDENT TO GT_STUDENT.
CLEAR : GS_STUDENT.

3) IF ~ ELSEIF ~ ELSE ~ ENDIF

* 기본구조
IF LOGICAL_EXPRESSION. "LOGICAL_EXPRESSION : 논리연산
    PROCESSING1.
ELSEIF.
    PROCESSING2.
ELSE.
    PROCESSING3.
ENDIF.

* 예시
IF GS_STUDENT-ZGENDER = 'M'.
    GS_STUDENT-ZGNAME = '남자'.
ELSEIF GS_STUDENT-ZGENDER = 'F'.
    GS_STUDENT-ZGNAME = '여자'.
ELSE.
    GS_STUDENT-ZGNAME = '기타'.
ENDIF.
    
APPEND GS_STUDENT TO GT_STUDENT.
CLEAR : GS_STUDENT.

4) IF ~ AND ~ ENDIF

* 기본구조
IF ( LOGICAL_EXPRESSION1 ) AND ( LOGICAL_EXPRESSION2).
    PROCESSING1.
ENDIF.

* 예시
IF ( GS_STUDENT-ZGENDER = 'M' ) AND ( GS_STUDENT-KNAME = '차은우').
    GS_STUDENT-ZGNAME = '남자'.
ENDIF.
    
APPEND GS_STUDENT TO GT_STUDENT.
CLEAR : GS_STUDENT.

5) IF ~ OR ~ ENDIF

* 기본구조
IF ( LOGICAL_EXPRESSION1 ) OR ( LOGICAL_EXPRESSION2).
    PROCESSING1.
ENDIF.

* 예시
IF ( GS_STUDENT-ZGENDER = 'M' ) OR ( GS_STUDENT-KNAME = '차은우').
    GS_STUDENT-ZGNAME = '남자'.
ENDIF.

APPEND GS_STUDENT TO GT_STUDENT.
CLEAR : GS_STUDENT.

2. IF문 연산

1) EQ (=)

VAL1과 VAL2의 값이 같다.

IF VAL1 EQ VAL2.
IF VAL1 = VAL2.

2) LT (<)

VAL1이 VAL2의 값보다 작다.

IF VAL1 LT VAL2.
IF VAL1 < VAL2.

3) GT(>)

VAL1이 VAL2의 값보다 크다.

IF VAL1 GT VAL2.
IF VAL1 > VAL2.

4) LE (≤)

VAL1이 VAL2의 값보다 작거나 같다.

IF VAL1 LE VAL2.
IF VAL1 <= VAL2.

5) GE (≥)

VAL1이 VAL2의 값보다 크거나 같다.

IF VAL1 GE VAL2.
IF VAL1 >= VAL2.

6) NE (<>)

VAL1과 VAL2의 값이 다르다.

IF VAL1 NE VAL2.
IF VAL1 <> VAL2.

3. LOOP

인터널테이블을 순차적으로 1줄씩 읽기. 특정한 구문을 반복하여 처리할 필요가 있을 경우, 또는 인터널테이블에 있는 데이터에 대하여 처리할 필요가 있는 경우 사용하는 제어문. 프로그램 속도 저하의 원인이 되기도 함으로 접근성이 중요.

1) 기본 읽기

* 기본구조
LOOP AT GT_A (INTO GS_A).
ENDLOOP.

*예시
CLEAR : GS_STUDENT.
LOOP AT GT_STUENT INTO GS_STUDET.
    IF GS_STUDENT-ZGENDER = 'M'.
    	GS_STUDENT-ZGNAME = '남자'.
    ELSEIF GS_STUDENT-ZGENDER = 'F'.
    	GS_STUDENT-ZGNAME = '여자'.
    ENDIF.
    CLEAR : GS_STUDENT.
ENDLOOP.

2) WHERE 조건 절 제어 (WHERE절보다 IF제어 추천)

* 기본구조
LOOP AT GT_A(INTO GS_A)
    WHERE FIELD = 'VALUE'.
ENDLOOP.

*예시
CLEAR : GS_STUDENT.
LOOP AT GT_STUENT INTO GS_STUDET WHERE ZGENDER = 'F'.
    IF GS_STUDENT-ZGENDER = 'M'.
    	GS_STUDENT-ZGNAME = '남자'.
    ELSEIF GS_STUDENT-ZGENDER = 'F'.
    	GS_STUDENT-ZGNAME = '여자'.
    ENDIF.
    CLEAR : GS_STUDENT.
ENDLOOP.

3) INDEX로 읽기

* 기본구조
LOOP AT GT_A(INTO GS_A) FORM 1 TO 4.
ENDLOOP.

*예시
CLEAR : GS_STUDENT.
LOOP AT GT_STUENT INTO GS_STUDET FROM 2 TO 3.
    IF GS_STUDENT-ZGENDER = 'M'.
    	GS_STUDENT-ZGNAME = '남자'.
    ELSEIF GS_STUDENT-ZGENDER = 'F'.
    	GS_STUDENT-ZGNAME = '여자'.
    ENDIF.
    CLEAR : GS_STUDENT.
ENDLOOP.

4. AT

1) AT FIRST

LOOP내, 인터널테이블의 첫 번째 값이 실행될 때 수행

LOOP AT GT_STUDENT INTO GS_STUDENT.
    GS_STUDENT-ZGNAME = '성별구분'.
    
    AT FIRST.
    	GS_STUDENT-ZGNAME = '변경사항'.
    ENDAT.
    
    CLEAR : GS_STUDENT.
    
ENDLOOP.

2) AT LAST

LOOP내, 인터널테이블의 마지막 값이 실행될 때 수행

LOOP AT GT_STUDENT INTO GS_STUDENT.
    GS_STUDENT-ZGNAME = '성별구분'.
    
    AT LAST.
    	GS_STUDENT-ZGNAME = '변경사항'.
    ENDAT.
    
    CLEAR : GS_STUDENT.
ENDLOOP.

3) AT NEW F1

FIELD F1에 새로운 값이 들어올 때 수행
AT NEW구문은 사용한 필드 앞의 필드들이 하나라도 바뀌면 구문을 타기 때문에 SORT 필수

CLEAR : GS_STUDENT.
    
SORT GT_STUDENT BY ZCODE ZKNAME ZENAME ZGENDER. "정렬 필수
    
LOOP AT GT_STUDENT INTO GS_STDENT.
    GS_STUDENT-ZGNAME = '성별구분'.
    
    AT NEW ZENAME.
    	GS_STUDENT-ZGNAME = '변경사항'.
    ENDAT.
    
    CLEAR : GS_STUDENT.
ENDLOOP.

4) AT END OF F1

FIELD F1에 마지막 값이 들어올 때 수행

CLEAR : GS_STUDENT.
    
SORT GT_STUDENT BY ZCODE ZKNAME ZENAME ZGENDER. "정렬 필수
    
LOOP AT GT_STUDENT INTO GS_STDENT.
    GS_STUDENT-ZGNAME = '성별구분'.
    
    AT END OF ZENAME.
    	GS_STUDENT-ZGNAME = '변경사항'.
    ENDAT.
    
    CLEAR : GS_STUDENT.
ENDLOOP.

주의할 점

  • AT 구문 수행 시 TEXT 기반의 값이 변경되었을 때 수행되므로 기본적으로 사용하려는 조건에 맞게 INTERNAL 테이블을 구성 (SORT 필수)
  • AT 구문 수행시 CHAR TYPE의 필드는 ***처리 되므로 MODIFY할 떄 주의 필요

0개의 댓글