💡 Search함수 : 문자열 필드 안에서 특정 문자열 검색하는 방법 


SEARCH <field> FOR <string>.
SEARCH surname2 FOR 'Joe'.

 

- Search 문은 결과를 변수에 저장하지 않음

- 결과는 ABAP 시스템 필드를 통해 확인함

  • sy-subrc: 검색 성공 여부
  • sy-fdpos: 문자열이 시작되는 위치(인덱스)

필드명 의미

sy-subrc 0: 검색 성공 / 4: 검색 실패
sy-fdpos 검색된 문자열의 오프셋(시작 위치) 값 (0부터 시작)

예: sy-fdpos = 3이면, 해당 단어는 4번째 글자부터 시작됨 (인덱스 0 기준)

 

예제1 기본검색(공백무시)

surname2 = 'Mr. Joe Smith'.
SEARCH surname2 FOR 'Joe'.
This should be successful. sy-subrc = 0, and sy-fdpos = 3.
'Joe'는 존재하므로 성공,
Mr. 다음에 있는 'J'는 4번째 문자이므로 오프셋 3

 

예제2 공백포함검색

SEARCH surname2 FOR 'Joe    '.  " 공백 포함
실제 문자열에는 'Joe '만 있고 공백이 부족하므로 검색 실패
sy-subrc = 4 (실패)
sy-fdpos = 0

 

예제3 와일드카드 검색: *ith

SEARCH surname2 FOR '*ith'.  " ith로 끝나는 단어
‘Smith’가 ith로 끝나므로 검색 성공
sy-subrc = 0, sy-fdpos = 7 (공백 다음 단어 시작)

 

예제4 와일드카드 검색: smi*

SEARCH surname2 FOR 'Smi*'.  " Smi로 시작하는 단어
Smith에서 일치
sy-subrc = 0, sy-fdpos = 7

 

 

📌 오프셋 위치 해석

surname2 = 'Mr. Joe Smith'

→ 인덱스 기준:

0 1 2 3 4 5 6 7 8 9 ...
M r .   J o e   S m ...
  • Joe는 인덱스 3부터 시작
  • Smith는 인덱스 7부터 시작
  • (Joe 뒤 공백이 인덱스 6 → 그 다음인 7에서 시작)

구문 예시 /설명 /결과

smi*가 아니라 joe다!

SEARCH field FOR 'Joe'. 단어 ‘Joe’ 검색 sy-subrc = 0, sy-fdpos = 3
SEARCH field FOR 'Joe    '. 공백 포함 → 실패 sy-subrc = 4, sy-fdpos = 0
SEARCH field FOR '*ith'. ith로 끝나는 단어 sy-subrc = 0, sy-fdpos = 7
SEARCH field FOR 'Smi*'. Smi로 시작하는 단어 sy-subrc = 0, sy-fdpos = 7

💡 Replace: 문자열 내 특정 문자를 다른 문자로 바꾸는 함수


surname2 = 'Mr, Joe Smith . '.
replace ',' with '.' into surname2.
WRITE : surname2.
ULINE.

결과 : Mr. Joe Smith

,가 .로 변환되는 것을 볼 수 있다 

주의 ) 기본 REPLACE 는 첫 번째 항목만 바꿈

 

 

While sy-subrc = 0.
Endwhile.

 

 sy-subrc란?

  • sy-subrcABAP 시스템 필드
  • 어떤 문장(statement)의 실행 결과를 숫자로 반환해주는 역할을 함
  • 흔히 READ, SELECT, REPLACE, SEARCH 등과 함께 사용됨

 

🔢 sy-subrc 값 의미

0 성공 (작업이 잘 됨)
4 실패 (예: 원하는 항목 못 찾음)
그 외 문장에 따라 다양한 에러 코드 가능

 

🔁  WHILE sy-subrc = 0. 의미

"이전 문장이 성공했을 때만 계속 반복" => 항상 직전 문장에만 영향을 받음

 

💡 STRLEN : 문자열 길이 구하기 


len = strlen( surname ) .
WRITE : 'The length of the Surname field is', len.
ULINE.

결과: 5

 

💡 공백정리 CONDENSE문


spaced_name(40) TYPE c VALUE 'Mr                    Joe            Smith.   . '.
CONDENSE spaced_name .
WRITE spaced_name .
uline .

이렇게 하면 결과물은
'Mr Joe Smith'가 된다.

 

💡 NO-GAPS 옵션사용


no-gaps는 모든 공백을 완전히 제거한다

CONDENSE spacename NO-GAPS.
WRITE: / spacename.

결과는 'MrJoeSmith' 가된다.

ABAP 문자열을 분석 & 조작

문자열 연결 (concatenating)

공백 제거 (condensing)

길이 구하기 (finding length)

문자열 내 문자 바꾸기 (replacing characters)

문자 검색 (searching)

문자열 이동 (shifting left/right)

문자열 분할 (splitting)

부분 문자열 추출 (subfields)


문자열 연결_concatenating

DATA: title(15)     TYPE c VALUE 'Mr',
      surname(40)   TYPE c VALUE 'Smith',
      forename(40)  TYPE c VALUE 'Joe',
      sep,
      destination(200) TYPE c.

✅ title(15) TYPE c VALUE 'Mr'

변수 이름: title

타입: c (문자형)

길이: 15자

초기값: 'Mr' → 즉, title 변수는 문자열 15자 크기의 필드이고, 값은 "Mr"로 초기화되어있음

Mr 뒤에는 자동으로 공백이 13칸이 들어감

 

✅ surname(40) TYPE c VALUE 'Smith'

이름: surname

타입: 문자형(c)

길이: 40자

값: 'Smith'

'Smith' 뒤에 35칸 공백이 들어감

 


✅ forename(40) TYPE c VALUE 'Joe'

→ 위와 동일, 'Joe' + 공백 37자

 

✅ destination(200) TYPE c.

결과 문자열을 저장할 변수

최대 200자까지 저장 가능

초기값은 공백

 

✅ sep 구분자 공백 1칸 

CONCATENATE title surname forename INTO destination SEPARATED BY sep.

=> 출력결과 Mr Smith Joe

 

destination의 문자열에 title + surname + forename 이 합쳐져서 들어간 것이라고 생각하면 된다.

sep이 들어가면 구분자 공백1값이 들어감

ABAB의 문자열 데이터 타입에는 두가지가 있다.

- C

- N

 

문자열 타입 C

: 영문자, 숫자 등 모든 문자를 담을 수 있는 타입

길이는 최소 1자, 최대 65,535자까지 가능


- C타입 포함 선언방법

DATA mychar1(10) TYPE c.

 

- C타입 생략 선언

DATA mychar1.

 

- 길이와 타입을 생략하면 기본 값은 길이 1의 C타입

DATA mychar2 TYPE c.          " 1자리 문자
DATA mychar3(5).              " TYPE c는 생략, 길이만 지정

 

- 테이블 필드 구조 그대로 복사 (LIKE 사용)

DATA my_surname(40) TYPE c.

기존에 있던 ZEMPLOYEES에 surname이라는 CHAR(40)필드가 있음

DATA my_surname LIKE zemployees-surname.

- LIKE 문을 사용해서 테이블 필드의 구조를 그대로 복사할 수 있다.

 

숫자형 문자열 타입 N 


- Numc타입은 문자형이지만, 숫자만 저장할 수 있는 특수 타입

- 입력 값은 오른쪽 정렬됨

- 숫자만 담고 계산은 하지 않을 때 이상적임

DATA znumber1(8) TYPE n.
DATA znumber1 LIKE zemployees-employee.

 

- C 타입과 달리, N타입은 초기값이 공백이 아니라 0

 

타입 설명 예시 특징
C 일반 문자 (알파벳, 숫자 등) DATA name(10) TYPE c. 공백으로 채워짐, 왼쪽 정렬
N 숫자 전용 문자 DATA empid(8) TYPE n. 숫자만 허용, 오른쪽 정렬, 초기값은 0
LIKE 기존 테이블 필드 구조 복사 DATA var LIKE table-field. 길이, 타입 자동 설정

 

 

왜 굳이 C가 있는데 N이 필요할까?

- SAP에서는 숫자로된  문자열 값을 다룰 일이 많기 때문

사원번호, 거래번호, 세금코드 등. 

 

 

ABAP에서는 숫자를 나눌 수 있는 3가지 방식이 있음

  1. 일반 나눗셈 ( / )
  2. 정수 나눗셈 ( DIV )
  3. 나머지 ( MOD ) 

이를 통해 소수점이 있는 결과, 정수결과, 나머지 값을 구분해 다룰 수 있음

 

기본 나눗셈 ( / )

`result2 = num3 / num4 .` : 일반적인 나눗셈 결과가 나옴 

 

정수 나눗셈 ( DIV )

` result3 = num3 DIV num4 `: 몫(정수부분)만 반환하고 소수점은 버림

 

나머지 연산 ( MOD )

` result4 = num5 MOD num6 ` : 나머지 값만 반환

REPORT z_division_example.

DATA: numa     TYPE p DECIMALS 2 VALUE '5.45',
      numb     TYPE p DECIMALS 2 VALUE '1.48',
      result1  TYPE p DECIMALS 2,   " 일반 나눗셈 결과
      result2  TYPE i,              " 정수 나눗셈 결과
      result3  TYPE p DECIMALS 2.   " 나머지 결과

" 일반 나눗셈 (소수 포함)
result1 = numa / numb.
WRITE: / '1. 일반 나눗셈 (/):', result1.

" 정수 나눗셈 (DIV)
result2 = numa DIV numb.
WRITE: / '2. 정수 나눗셈 (DIV):', result2.

" 나머지 계산 (MOD)
result3 = numa MOD numb.
WRITE: / '3. 나머지 계산 (MOD):', result3.

데이터 타입과 변환의 중요성

- 호환되지 않는 타입끼리의 계산은 피해야 함

- 타입 불일치로 문법 오류 or 런타임 오류가 발생함 

 

자동변환

SAP ABAP에는 표준 데이터 타입들 간에 자동으로 변환되는 기능이 내장되어있음

= 소스필드의 값을 대상 필드로 어떻게 옮기는지 결정하는 사전 정의된 로직

 

 

result1은 반올림되어 3이 되고,

num1이 5.5인 경우는 result1 = 6이 된다.

이처럼 ABAP은 자동으로 변환 규칙을 적용하기 때문에, 사용하는 데이터타입에 대한 이해가 필요하다.

 

내용설명

데이터 타입은 호환되어야 함 정수 × 문자 = ❌
자동 변환 있음 소수 → 정수 자동 변환 (반올림 또는 버림)
예시 5.55 → 6, 3.33 → 3
주의 자동 변환이 항상 적절한 건 아니므로, 상황에 따라 직접 가공 필요

 

뺄셈은 덧셈과 마찬가지로 result에 - 를 붙이면 된다.

integer01 = 22;

packed_decimal = -5.5

 

결과.

 

이와같이 결과가 나온다.

ABAP에서는 숫자를 출력할 때 음수기호 -를 뒤에 붙이는 형식을 사용하기 때문에,

4.0- & 121,0- 로 나온다

 

1. 새 변수 선언

2. LIKE 사용하여 기존 변수 타입따르기

 

DATA result LIKE packed_decimal01.

 

계산식 작성

 

result = integer01 + packed_decimal01.

연산의 규칙

1. 산술 연산에서는 항상  = (대입연산자) 가 필요함

2. 결과를 저장할 변수는 = 왼쪽에 있어야함

3. 실제 계산식은 = 오른쪽 위치함

4. 계산 후에는 왼쪽 변수에만 결과가 저장됨

5. 기호 앞뒤에는 공백을 반드시 넣어야함

6. +, -, *, / 같은 연산자 앞뒤에도 공백을 넣어야함

7. 계산식이 복잡해지면 괄호도 씀 => 괄호 앞뒤에도 반드시 공백을 넣어야함

 

결과

 

변수 + '뉴메릭 숫자' 넣었을 때

 

 

위와 같은 결과가 나온다.

+ Recent posts