구조체, 내부테이블 선언이 너무 헷갈린다.

정리해보자.

ABAP에서의 구조체_Structure 

 

1. TYPE vs LIKE 차이

구분 type like
기능 데이터 타입 참조 기존 필드(변수 or 테이블 필드)의 속성 참조
사용 대상 도메인 / 데이터 요소 / 구조 / 테이블 구체적인 변수 또는 테이블의 실제 필드
독립성 독립적인 선언 종속적 (참조하는 대상이 바뀌면 영향 받음)
추천 용도 표준화된 구조나 도메인 기반 기존 필드를 그대로 따라야 할 때

 

예시 1 : TYPE 사용 (데이터 요소 기반)

TYPES: BEGIN OF ty_emp,
         name  TYPE zemployees-surname,
         birth TYPE zemployees-dob,
       END OF ty_emp.

- 데이터 요소를 직접 참조함

예시 2 : LIKE 사용 (테이블 필드 참조)

TYPES: BEGIN OF ty_emp,
         name  LIKE zemployees-surname,
         birth LIKE zemployees-dob,
       END OF ty_emp.

- zemployees 테이블 안의 필드속성(길이, 타입)을 그대로 따라감

 

이렇게 해도 조금 덜 이해가 가는 거 같다.

그래서 타입은  뭐고, like는 뭐란 말인가..🥲

Field Name
Type
Length
emp_id CHAR 6
name CHAR 20
age INT 3

 

예를 들어 zemployee라는 테이블이 위와 같이 있다고 쳐보자.

 

예제 1: TYPE 을 사용하는 경우

TYPES: BEGIN OF ty_emp_type,
         emp_id TYPE char6,
         name   TYPE char20,
         age    TYPE i,
       END OF ty_emp_type.

DATA: wa_emp TYPE ty_emp_type.

-TYPE으로 하면 직접 형식 명시가 가능하다.

-테이블이 없어도 구조는 동작한다. 

- 독립적

예제 2:  LIKE를 사용하는 경우

TABLES: zemployee.

TYPES: BEGIN OF ty_emp_like,
         emp_id LIKE zemployee-emp_id,
         name   LIKE zemployee-name,
         age    LIKE zemployee-age,
       END OF ty_emp_like.

DATA: wa_emp TYPE ty_emp_like.

- LIKE를 사용하면 테이블 필드를 그대로 참조한다.

- zemployee 테이블이 변경되면 구조도 자동 반영된다.

- 의존적

비교 type like
참조 대상 형식(Type) 실제 변수나 테이블 필드
독립성 독립적 의존적
유지보수 명시적, 명확 편하지만 위험 (의존성 큼)
주의할 점 테이블 필드 변경 시 반영 안 됨 테이블 없으면 오류남

 

그니까 결론적으로 

surname이 char10이라고 할 때,

TYPE zemployees-surname이라고 쓰는건 자동으로 길이와 타입을 가져오겠다는 의미다.

TYPE char10.  " <- 이걸 몰라도 자동으로 따라오게 해주는 것

이거랑 그냥 똑같다고 보면됨

DATA: name1 TYPE char10.                     " 수동 지정
DATA: name2 TYPE zemployees-surname.         " 참조 (추천)

WRITE: name1, name2.

 

즉, type으로하면 zemployees-surname을 참조하는 것이고, 

zemployees-surname의 타입이 바뀌면 그대로 쓸 수 있으므로 편하기 때문에 쓰는 것 

 

근데 여기서 또 궁금한 점이 생겼다.

zemployees타입이 변경되면 name1도 자동변경이 되는 것이라면, like처럼 똑같이 테이블 의존적인 것 아닌가?

 

항목 TYPE LIKE
구조 참조 기준 데이터 타입 (Domain/Element 기준) 필드 전체 (기술 속성까지)
쓰임 보통 TYPES에서 많이 사용 보통 DATA 선언 시 많이 사용
유연성 더 유연함 (필드 속성 말고 타입 중심) 더 엄격함 (정확히 같은 속성 사용)

 

정답은 그렇다! 다.

그대신 TYPE은 데이터타입만 참조해오고, LIKE는 기술 속성까지 참조해온다.

 

 

 

 

 

 

 

 

 

 

🔹 헤더 라인을 사용하는 내부 테이블의 동작 방식

  • 헤더 라인이 있는 내부 테이블을 사용할 때는,
    • 데이터를 읽을 때: 읽은 레코드는 자동으로 헤더 라인에 저장됨.
    • 데이터를 쓸 때: 헤더 라인에 값을 넣고 나서 APPEND 문으로 본문(table body)에 추가함.

 

🔹 배열 방식으로 한 번에 전체 데이터 가져오기 (Array Fetch)

SELECT * FROM zemployees INTO CORRESPONDING FIELDS OF TABLE itab1.
  • SELECT *: zemployees 테이블의 모든 필드를 선택.
  • INTO CORRESPONDING FIELDS OF TABLE itab1: 필드 이름이 같은 것끼리 자동 매칭해서 itab1 테이블에 한꺼번에 다 넣음.
  • 이건 반복문 없이 한 줄로 한 번에 여러 행을 가져오는 방식이야.
  • 이 방법을 Array Fetch 라고 부름.
  • itab1 테이블에는 원래 테이블보다 필드가 하나 더 (LOS, 근속연수) 있지만, 그 필드는 기본값 3으로 채워짐.

 

🔹 루프 + 개별 MOVE 방식 (루프를 돌면서 하나씩 넣기)

SELECT * FROM zemployees. wa-employee = zemployees-employee. wa-surname = zemployees-surname. ... APPEND wa TO itab. ENDSELECT.
  • 이 방식은 하나씩 SELECT → MOVE → APPEND하는 방식
  • 중요한 점:
    • MOVE만 하고 APPEND 안 하면 내부 테이블에 값이 저장되지 않음!
    • 그냥 헤더 레코드만 계속 덮어쓰게 됨.
    • 그래서 반드시 APPEND itab. 해줘야 함.
  • append하면 헤더레코드에 값이 그대로 남기 때문에, 다음 데이터 넣기 전에 CLEAR로 헤더 레코드 초기화하는 것이 안전함.

 

🔹 핵심 요약


방식 설명
SELECT ... INTO CORRESPONDING FIELDS OF TABLE 한 번에 전체 데이터를 내부 테이블에 넣는 방식 (Array Fetch)
SELECT ... + MOVE + APPEND 반복문으로 한 줄씩 읽고 옮겨서 넣는 방식
헤더 라인 사용 시 데이터는 헤더 라인에 들어가므로, APPEND로 테이블 본문에 꼭 추가해야 함

 

 

 

Old방식 - Header 포함 Internal Table

DATA: BEGIN OF itab01 OCCURS 0,
        surname LIKE zemployees-surname,
        dob     LIKE zemployees-dob,
      END OF itab01.

- Data : Begin of ... Occurs 0, .... end of.

=> 예전 방식, Internal Table선언할 때 사용

=> Occurs 0은 초기에 0행으로 시작, 나중에 데이터 추가하면 늘어난다.

- surname , dob = 각각의 필드 외부 zemployees의 필드를 참조해 타입을 결정함

- HeaderLine이라는 개념을 자동포함하여 itab01만 써도 현재 라인을 의미

=> 이 표현 방식은 구식이다.

 

 

New 방식 - Structure타입정의 

TYPES: BEGIN OF line01_typ,
         surname LIKE zemployees-surname,
         dob     LIKE zemployees-dob,
       END OF line01_typ.

- Types: 새로운 데이터 구조를 정의할 때 사용함

- line01_typ는 하나의 레코드를 정의한 구조

 

✅ 14~15: Internal Table 타입 정의 (Standard Table)

TYPES itab02_typ TYPE STANDARD TABLE OF line01_typ.

- itab02_typ는 line01_typ 구조를 여러 줄 가진 테이블 형식

- Standard Table은 일반적인 Internal table로, 순서 유지되고 인덱스로 접근이 가능하다.

 

✅ 16~17: Sorted Table 타입 정의

TYPES itab02_sorted_typ TYPE SORTED TABLE OF line01_typ
                         WITH UNIQUE KEY surname dob.

- sorted table: 항상 정렬된 상태로 유지되는 테이블

- with unique key : surname과 dob의 조합이 중복되지 않도록 보장한다.

=> 정렬되어 있어서 Read Table 등 조회성능이 높다.

 

✅ 20: Internal Table 선언 (New 방식)

DATA itab02 TYPE itab02_typ.

- itab02_type이라는 테이블 타입 기반으로 실제 internal table선언.

 

✅ 22: Work Area 선언

DATA wa TYPE line01_typ.  " work area (1줄 구조)

- itab02  한줄과 같은 work area선언

데이터 조작시에는 wa_itab02를 통해 데이터 작성후 append, read, modify등에 사용한다.

 

 

 

Selection-screen ULINE /40(8)

SELECTION-SCREEN COMMENT /40(15) text-001.

SELECTION-SCREEN COMMENT /40(15) comml.

 

같은 라인에 두고 싶다면?

selection-screen BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(15) text-001.

SELECTION-SCREEN COMMENT 20(10) comml.

PARAMETER abc(5).

SELECTION-SCREEN END OF LINE.

 

SELECTION-SCREEN position 35.

parameter abc(5).

 

 

프레임두기

SELECTION-SCREEN BEGIN OF BLOCK myblock1 WITh FRAME TITLE text-001.

---


SELECTION-SCREEN END OF BLOCK myblock1.

✅ SIGN, OPTION, LOW, HIGH


 

필드 의미 예시
SIGN 포함 여부를 나타냄 'I' → 포함
'E' → 제외
OPTION 조건의 종류를 나타냄 'EQ' (같다)
'BT' (사이)
'GE' (크거나 같다) 등
LOW 검색 조건의 하한값 '1000'
HIGH 검색 조건의 상한값 (옵션이 'BT'일 때 사용) '2000'

 

OPTION 코드 예시

코드 의미
EQ 같다
NE 같지 않다
GT 크다 (>)
GE 크거나 같다 (≥)
LT 작다 (<)
LE 작거나 같다 (≤)
BT 사이 (Between)
CP 패턴 비교 (Like)

🧾 문장 설명

SELECT-OPTIONS: my_dob FOR zemployees-dob.
  • my_dob는 선택화면에서 사용할 변수 이름 (선언된 내부 테이블임)
  • zemployees-dob는 기준 필드 (예: 생년월일)

📺 화면 출력 모습


sign option low high
I EQ / BT 등 1990-01-01 1999-12-31

 

 

selection-screen ULINE /1(8).

selection-screen skip 2.

직원들의 월급을 통화화폐에 맞춰서 계산해보자.

 

Zemployees3에 있는 직원들의 이름, 봉급, 통화화폐를 가져와서 계산한다.

위와 같이 작성하면 

위와 같이만 나옴!

 

 

현재 통화량을 가지고 있는 직원은 UONIE or EONIE밖에 없기 때문에,

UONIE와 EONIE만 나오고, USD만 계산할 예정이기에 UONIE의 월급을 표시해줄 것이다.

 

 

sap이 제공해주는 tcurr테이블에서 통화화폐를 가져와서 함께 계산해준다.

lv_converted = zemployees3-salary * lv_ukurs.

하게 되면 테이블에 있는 통화 * 급여를 곱할 수 있다. 

 

 

 

결과값은 EONIE만 나온다. 

19.575,47 받음

 

 

📆 1. DATE 필드 (DATS타입)

  • 타입명: DATS
  • 길이: 8자리
  • 형식: YYYYMMDD (예: 20250423)
  • 기능:
    • 날짜 연산 가능 (예: 날짜 간 차이 계산)
    • 날짜 포맷으로 표시 가능 (예: WRITE date_field USING EDIT MASK '__.__.____'.)
DATA my_date TYPE DATS.
my_date = '20250423'.
WRITE: / my_date. " 출력: 20250423

 

 

🕒 2. TIME 필드 (TIMS 타입)

  • 타입명: TIMS
  • 길이: 6자리
  • 형식: HHMMSS (예: 141530 → 14:15:30)
  • 기능:
    • 시간 연산 제한적 (보통 문자열로 다룸)
    • 포맷 변환 가능
DATA my_time TYPE TIMS.
my_time = '093045'.
WRITE: / my_time. " 출력: 093045

 

그렇다면 sy-datum과 sy-uzeit는 뭘까? 

 

 

🔹 SY-DATUM(오늘 날짜)

  • 의미: 현재 SAP 시스템의 날짜(Date)
  • 데이터 타입: DATS (8자리, YYYYMMDD)
  • 예시 값: 20250423
WRITE: / '오늘 날짜는:', sy-datum.

➡ 출력: 오늘 날짜는: 20250423

 

🔹 SY-UZEIT(현재 시간)

  • 의미: 현재 SAP 시스템의 시간(Time)
  • 데이터 타입: TIMS (6자리, HHMMSS)
  • 예시 값: 154530 (15시 45분 30초)
WRITE: / '현재 시간은:', sy-uzeit.

➡ 출력: 현재 시간은: 154530

 

날짜 차이 계산

DATA: today_date TYPE sy-datum,
      base_date  TYPE sy-datum VALUE '20250101',
      days_diff  TYPE i.

today_date = sy-datum.

days_diff = today_date - base_date.

WRITE: / '오늘 날짜:', today_date,
       / '기준 날짜:', base_date,
       / '일수 차이:', days_diff.
  • sy-datum이 예를 들어 20250423일 경우
  • base_date = '20250101'
  • days_diff = 112 (즉, 112일 차이)
todays_date+6(2)

- +6(2)는 6번째 자리부터 2글자를 추출하겠다는 뜻!

 

DATA: todays_date TYPE sy-datum.
todays_date = '20250423'.

WRITE: / '년:', todays_date+0(4),   "2025
       / '월:', todays_date+4(2),   "04
       / '일:', todays_date+6(2).   "23
  • todays_date+0(4) 👉 '2025'
  • todays_date+4(2) 👉 '04'
  • todays_date+6(2) 👉 '23'
  • todays_date가 숫자형이면 X. 꼭 문자열. (TYPE sy-datum은 문자열 기반)

 

함수적용하기 

🌟 1. 날짜 포맷 바꾸기 (YYYYMMDD → YYYY-MM-DD)

DATA: lv_date TYPE sy-datum VALUE '20250423',
      lv_formatted TYPE string.

CONCATENATE lv_date+0(4) '-' lv_date+4(2) '-' lv_date+6(2)
       INTO lv_formatted.

WRITE: / '포맷 변경:', lv_formatted.  " 👉 2025-04-23

 

🌟 2. 날짜 일부 추출해서 조건 비교

DATA: lv_date TYPE sy-datum VALUE '20250423'.

IF lv_date+4(2) = '04'.
  WRITE: / '4월 데이터입니다!'.
ENDIF.

 

🌟 3. 파일명에 날짜 붙이기

DATA: lv_filename TYPE string,
      lv_date     TYPE sy-datum.

lv_date = sy-datum.

CONCATENATE 'report_' lv_date+0(4) lv_date+4(2) lv_date+6(2) '.txt'
       INTO lv_filename.

WRITE: / '파일명:', lv_filename. " 👉 report_20250423.txt

 

 

🌟 4. 날짜값 가공해서 출력 (공백 제거 포함)

DATA: lv_date TYPE sy-datum VALUE '20250401',
      lv_result TYPE string.

CONCATENATE lv_date+0(4) '년' lv_date+4(2) '월' lv_date+6(2) '일'
       INTO lv_result
       SEPARATED BY space.

CONDENSE lv_result.

WRITE: / lv_result. " 👉 2025년04월23일

 

 

🌟 5. 시간값과 함께

DATA: lv_datetime TYPE string.

CONCATENATE sy-datum+0(4) '-' sy-datum+4(2) '-' sy-datum+6(2)
            sy-uzeit+0(2) ':' sy-uzeit+2(2) ':' sy-uzeit+4(2)
       INTO lv_datetime
       SEPARATED BY space.

WRITE: / '현재 일시:', lv_datetime.  " 👉 2025-04-23 13:50:33

 

'SAP' 카테고리의 다른 글

SAP ABAP SELECT-OPTIONS 화면 범위 검색 입력 필드  (0) 2025.04.23
SAP ABAP Quantity & Currency Fields in Calculations  (0) 2025.04.23
SAP ABAP SPLIT함수  (0) 2025.04.23
SAP ABAP SEARCH 함수  (0) 2025.04.23
SAP ABAP Replace함수  (0) 2025.04.23

🔹 SPLIT 함수란?

SPLIT은 문자열을 특정 구분자(delimiter) 기준으로 쪼개서 여러 변수(또는 internal table)에 저장할 수 있게 해주는 ABAP 명령어


🔸 기본 문법

SPLIT <source> AT <delimiter> INTO <target1> <target2> ... .
 
  • <source> : 나눌 문자열
  • <delimiter> : 기준이 될 구분자 (예: 공백, 쉼표 등)
  • <targetX> : 나눈 값을 담을 변수들

✅ 예제 1: 변수 여러 개에 나누기

 
DATA: text TYPE string VALUE 'apple,banana,grape', word1 TYPE string, word2 TYPE string, word3 TYPE string. 
SPLIT text AT ',' INTO word1 word2 word3.
WRITE: / word1, / word2, / word3.

🔹 출력 결과:

apple banana grape

✅ 예제 2: Internal Table에 나누기

DATA: fruits TYPE string VALUE 'apple banana grape', fruit_table 
TYPE STANDARD TABLE OF string WITH EMPTY KEY. 

SPLIT fruits AT space INTO TABLE fruit_table. 
LOOP AT fruit_table INTO DATA(fruit). 
WRITE: / fruit. 
ENDLOOP.
 
🔹 출력 결과:
 
apple banana grape

💡 활용 포인트

  • SPLIT은 문자열을 구조화하는 데 매우 유용
  • 파일에서 읽은 문자열, 사용자 입력값 등을 나눌 때 필수
  • Internal Table에 바로 나눠넣는 것도 굉장히 자주 쓴다.

⛔ 주의사항

  • 나눌 대상보다 타겟이 적으면 → 나머지는 무시
  • 타겟이 많으면 → 남은 자리는 빈 값으로 채워짐
  • AT에는 문자열, 공백(space), 하이픈('-'), 콤마(',') 등 다 가능!

'SAP' 카테고리의 다른 글

SAP ABAP Quantity & Currency Fields in Calculations  (0) 2025.04.23
SAP ABAP DATE&TIME Fields  (0) 2025.04.23
SAP ABAP SEARCH 함수  (0) 2025.04.23
SAP ABAP Replace함수  (0) 2025.04.23
SAP ABAP STRLEN - 문자열 길이 구하는 함수  (0) 2025.04.23

SEARCH 함수

: 문자열 안에서 특정 문자나 문자열을 찾을 때 사용하는 함수.

java에서는 indexOf()함수로 쓴다.

 

🔍 기본 문법

SEARCH <string> FOR <substring>.

 

1. 예시

DATA(text) TYPE string VALUE 'I love ABAP!'.
SEARCH text FOR 'love'.

IF sy-subrc = 0.
  WRITE: 'Found!'.
ELSE.
  WRITE: 'Not found!'.
ENDIF.
  • 'love'라는 문자열이 text 안에 있으면 sy-subrc = 0
  • 없으면 sy-subrc ≠ 0

 

 sy-fdpos

 : 문자열이  어디에서 시작하는지 위치를 알려줌 (못찾으면 -1)

DATA(text) TYPE string VALUE 'banana'.

SEARCH text FOR 'na'.

IF sy-subrc = 0.
  WRITE: 'Found at position:', sy-fdpos.
ENDIF.

결과 : Found at position: 2

 

2. 예시 2

DATA(txt) = 'banana'.

SEARCH txt FOR 'na' STARTING AT 3.

WRITE: sy-fdpos.

결과는

Found at position: 4

 

'SAP' 카테고리의 다른 글

SAP ABAP DATE&TIME Fields  (0) 2025.04.23
SAP ABAP SPLIT함수  (0) 2025.04.23
SAP ABAP Replace함수  (0) 2025.04.23
SAP ABAP STRLEN - 문자열 길이 구하는 함수  (0) 2025.04.23
SAP ABAP CONDENSE 함수  (0) 2025.04.23

REPLACE함수란?

문자열 안에서 특정 부분 문자열을 찾아서 다른 문자열로 바꾸는 함수

 

🔤 기본 문법:

REPLACE <old_substring> IN <target_string> WITH <new_substring>.

 

1. 방법1

DATA(text) = 'I love coffee'.
REPLACE 'coffee' IN text WITH 'tea'.
WRITE text.   " 결과: I love tea

2. 방법 2 : 한글자만 바꾸기

DATA(word) = 'banana'.
REPLACE 'a' IN word WITH 'o'.
WRITE word.   " 결과: bonana

기본 REPLACE문은 가장 첫번째 나오는 것 하나만 바꿈!

3. 방법 3: 모든 항목 바꾸기

- REPLACE ALL OCCURRENCES OF

REPLACE ALL OCCURRENCES OF 'a' IN word WITH 'o'.
WRITE word.   " 결과: bonono

4. 특정 위치에서 바꾸기

REPLACE SECTION OFFSET 2 LENGTH 3 OF text WITH 'XXX'.

- 3번째 문자부터 3글자를 XXX로 바꾼다.

DATA(text) = 'ABCDEFG'.

REPLACE SECTION OFFSET 2 LENGTH 3 OF text WITH 'XXX'.

WRITE text.

// ABXXXFG

✅ 여기서 중요한 포인트:

  • OFFSET0부터 시작되기 때문에 3번째 글자부터 바뀜
  • LENGTH바꿀 문자 수

'SAP' 카테고리의 다른 글

SAP ABAP SPLIT함수  (0) 2025.04.23
SAP ABAP SEARCH 함수  (0) 2025.04.23
SAP ABAP STRLEN - 문자열 길이 구하는 함수  (0) 2025.04.23
SAP ABAP CONDENSE 함수  (0) 2025.04.23
SAP ABAP CONCATENATE 함수  (0) 2025.04.23

+ Recent posts