-
01. SAP Data Type 02SAP 2021. 7. 27. 22:59
02. Predefined ABAP Type
-> ABAP Kernel 레벨에서 정의되어 있는 데이터 타입이며, 모든 ABAP 프로그램에서 사용할 수 있다.
프로그램에서 필요한 Local Type을 정의하기 위해 Predefined ABAP Type을 사용할 수 있다.
1. 고정 길이를 가지는 기본 Predefined ABAP Type
ABAP은 고정 길이를 가지는 8가지 기본 Data Type을 제공하고 있다.
모든 필드 길이는 byte 단위로 구분된다.
데이터 타입 D, F, I는 이미 기술적 속성이 정의되어 있어서 프로그램에서 필드 길이를 정의하지 않고 바로 사용할 수 있다.
반면 일반적인 데이터 타입인 C, N, X를 사용할 때에는 필드 길이를 정해야 한다.
그리고 TYPE P는 DECIMALS를 명시하지 않으면 소수자리를 인식하지 못한다.
DATA gv_num TYPE I.
DATA gv_num TYPE p DECIMALS 2.
타입 초기길이 가능길이 초깃값 의미 numeric types I 4 4 0 integer (whole number) F 8 8 0 Floating point number - 그냥 소수점 인식하는 숫자 P 8 1 - 16 0 Packed number character types C 1 1 - 65535 '...' Text Field (alphanumeric characters) D 8 8 '00000000' Date field (Format : YYYYMMDD) N 1 1 - 65535 '0....0' Numeric text field (numeric characters) T 6 6 '000000' (format : HHMMSS) hexadecimal type X 1 1 - 65535 X'0...0' Hexadecimal field 2. Numeric Data Type
- Integers (while numbers) of Type I
- 값의 범위는 -2^31 ~ 2^31-1
- 정수 타입만 지원
- 정수가 아닌 것은 반올림(Round)
- Counter, Item 수, Index 등에 쓰임
- Packed numbers of Types P
- 소수 자리를 허용
- 가용 Size 1~16byte이며, 소수는 최대 14자리 설정 가능
- 프로그램 속성 Setting 시 Fixed point arithmetic 체크를 해야 한다. 그렇지 않을 경우 Type P는 Integer로 표현됨
- 정확한 계산을 요하는 Business Calculation 목적으로 사용됨
- Floating point number of Type F
- 값의 범위는 1 * 10^-307 ~ 1 * 10^308
- 지수 형태로 표현되므로 FLTP_CHAR_CONVERSION과 같은 Function Module을 이용해 다른 데이터 타입으로 변환하여 출력함
- Type F는 내부적으로 Binary System으로 전환될 때 반올림 에러가 발생할 수 있음 (Rough Calculation)
- 높은 정확도를 요구한다면 Type P를 사용해야 하며, 매우 작거나 큰 수라면 Type F 사용을 권장함
- Value 범위가 넓은 경우나, 반올림 오류(rounding)가 중요한 사용이 아닐 경우 Type F를 사용함(실수 값에 대한 근삿값을 가지는 타입이기 때문에 주의)
Tip. Type F, I는 기계코드에 더 근접하기 때문에 연산 수행 시 Type F,I가 P보다 속도가 빠르다.
Tip2. 프로그램 생성 시 Fixed point arithmetic 체크하지 않고, Packed numbers를 연산에 사용하게 되면 소수점 자릿수를 무시하게 된다. 소수점 사용하고 싶을 시 체크 필수!
ex)
DATA gv_1 Type p DECIMALS 1 VALUE '1.1'. DATA gv_2 Type p DECIMALS 1 VALUE '2.1'. DATA gv_3 TYPE p. gv_3 = gv_1 * gv_2. WRITE gv_3.
2.1 Numeric Data Type 더 살펴보기
위의 타입 외에 숫자를 표현할 수 있는 TYPE N이 존재하는데, 이것은 숫자 한 자리를 1byte로 표현하는 Character type이다.
- TYPE I
2^32까지 수 표현 가능, 음수까지 포함하면 -2^31 ~ 2^31-1 범위의 수 표현 가능하다.
- TYPE P
Two decimal digits are packed into one byte라는 영어 표현에서 TYPE P 유래되었다.
2자리 수가 1byte로 구성되고 마지막 자리 수는 부호를 포함하여 1byte로 표현된다.
즉, 16byte까지 사용할 수 있다는 것은 2 *12 = 32 자리 수까지 표현할 수 있다는 것.
대신 TYPE P 연산 시 소프트웨어 개입이 필요하기 때문에 TYPE I, F보다 속도가 느리다는 단점이 있다.
가용 Size라는 것은 변수명 다음에 변수 길이를 1~16byte 사이에 선언할 수 있다는 것이다.
DATA gv_p(16) TYPE P.
위처럼 괄호 안에 자리수를 선언하지 않으면 기본 8byte로 선언된다.
DATA gv_p TYPE P.
소수는 최대 14자리까지 사용할 수 있으며, 소수점을 표현할 때는 DECIMALS 옵셥 추가해야 한다.
DATA gv_p TYPE P DECIMALS 2. * 소수점 2자리 변수 선언
ex)
REPORT Z02_3 DATA gv_1 TYPE p. * 변수 길이 선언 X -> 디폴트 8byte = 15자리 DATA gv_2 TYPE p DECIMALS 14. * 소수점 14자리 변수 선언 DATA gv_3(16) TYPE p. * 1~16byte 사이 변수 선언 gv_1 = '123456789012345' gv_2 = '0.12345678901234' gv_3 = '1234567890123456789012345678901' WRITE :/ gv_1. WRITE :/ gv_2. WRITE :/ gv_3.
만약 gv_1 = '1234567890123456'.처럼 TYPE p가 표현할 수 있는 길이를 넘어서게 되면
"Overflow when converting from 1234567890123456"라는 Overflow Dump Error가 발생하게 된다.
- TYPE F
1 * 10^-307 ~ 1 * 10^308 범위이고, 지수 형태로 표현되므로 FLTP_CHAR_CONVERSION과 같은 Function Module을 이용해 다른 데이터 타입으로 변환하여 출력해야 한다.
Type F는 내부적으로 Binary System으로 전환될 때 반올림 에러(Rough Calculation)가 발생할 수 있다.
높은 정확도를 원한다면 Type p를 이용해야 한다.
매우 크거나 작은 수라면 Type f를 추천한다.
부동소수점(Floating Point Number)는 소수점 위치를 움직일 수 있게 함으로써 한정된 비트의 수로 정밀도를 보다 높게 표시할 수 있다.
ex) 12345 = 12345 X 10^0 or 1234500 X 10^-2 or 0.012345 X 10^6
그런데 예를 들어 123.45 X 10^+2에서 마지막 2자리 45는 지수를 위한 자릿수로 양보하게 된다.
그래서 부동소수점은 정밀도가 낮아져서 값이 유실될 수 있다.
2.2 Numeric Operation (연산자)
- Basic Arithmetic Operation
기호 의미 사용 예 기호와 동일한 키워드 + 더하기 = + . ADD TO . - 빼기 = - . SUBTRACT FROM . * 곱하기 = * . MULTIPLY BY . / 나누기 = / . DIVIDE BY . DIV Integer 나누기 = DIV . MOD Integer 나누기의 나머지 = MOD . ** 제곱 = ** . ex)
REPORT Z02_04. DATA: gv_int1 TYPE i VALUE 2. DATA: gv_int2 TYPE i VALUE 3. DATA: gv_iresult TYPE i. gv_iresult = gv_int1 + gv_int2. WRITE : / '1 : ', gv_iresult. ADD 1 TO gv_iresult. WRITE : / '2 : ', gv_iresult. DATA: gv_pack1 TYPE p DECIMALS 2 VALUE '2.17'. DATA: gv_pack2 TYPE p DECIMALS 2 VALUE '5.43'. DATA: gv_presult TYPE p DECIALS 2. gv_presult = gv_pack2 / gv_pack2. WRITE : / '3 : ', gv_presult. MULTIPLY gv_presult by gv_pack2. WRITE : / '4 : ', gv_presult. DATA: gv_float1 TYPE f VALUE '1.337'. DATA: gv_float2 TYPE f VALUE '2.7'. DATA: gv_fresult TYPE f. DATA: gv_cresult TYPE c LENGTH 16. gv_fresult = gv_float2 * gv_float1. WRTIE : / '5 : ', gv_fresult. CALL FUNCTION 'FLTP_CHAR_CONVERSION' EXPORTING DECIM = 2 INPUT = gv_fresult IMPORTING FLSTR = gv_cresult. WRITE :/ '6 : ', gv_cresult. * TYPE f 사용 시 'FLTP_CHAR_CONVERSION' 함수 호출해 문자형으로 변환 후 출력해야 한다. 함수 호출 시 DECIM 파라미터에 숫자 전달 시 해당 소수점 자리의 결과를 반올림해서 보여준다.
- Numeric Data Type 함수
함수 내역 사용예 ABS 절댓값을 리턴한다. ABS(-100) => 100 SIGN 부호에 대한 결과를 리턴한다. 마이너스 -1, 0 0, 플러스 + 리턴 CEIL 해당 값보다 작지 않은 가장 큰 정수를 리턴한다. CEIL(1.3) OR CEIL(1.7) => 2 FLOOR CEIL과 반대 FLOOR(1.3) OR FLOOR(1.7) => 1 TRUNC 소수점을 버리고 정수만 남긴다. TRUNC(1.3) OR FLOOR(1.7) => 1 FRAC 소수점 이하 자리만 남긴다. FRAC('2.9') => 0.9 - Floating-Point 함수
함수 Meaning ACOS, ASIN, ATAN; COS, SIN, TAN 삼각함수 COSH, SINH, TANH 쌍곡선함수 EXP 지수함수 LOG 자연로그함수 with base e. LOG10 상용로그함수 with base 10. SQRT 제곱근함수 3. Character Type
- C
- 문자, 숫자, 특수문자에 사용.
- N
- 숫자를 C타입으로 표현. Integer 형태를 문자 타입으로 보여줌.
- D
- 날짜 타입을 표현
- T
- 시간 타입을 표현
C타입은 데이터 선언 시 문자 길이를 명시적으로 선언해야 한다.
문자 길이를 지정하지 않거나 Data Type을 선언하지 않으면 기본적으로 Character 1자리로 정의된다.
TYPE c의 문자 길이를 지정할 경우에는 변수 뒤에 길이를 입력하거나, LENGTH 옵션을 이용하여 선언할 수 있다.
LENGTH 키워드는 C, N, X, P 타입에서 사용 가능하며 변수 길이를 정의한다.
* 모두 1자리 문자 DATA gv_fd. DATA gv_fd TYPE c. DATA gv_fd(1) TYPE c. DATA gv_fd TYPE c LENGTH 1.
ex)
REPORT Z02_05. DATA gv_f0. DATA gv_f1 TYPE c. DATA gv_f2(1) TYPE c. DATA gv_f3(2) TYPE c. DATA gv_f4 TYPE c LENGTH 2. DATA gv_f5(5). DATA gv_len TYPE i. MOVE : 'KOREA' TO gv_f0, 'KOREA' TO gv_f1, 'KOREA' TO gv_f2, 'KOREA' TO gv_f3, 'KOREA' TO gv_f4, 'KOREA' TO gv_f5. WRITE : / gvf0, / gv_f1, / gv_f2, / gv_f3, / gv_f4, / gv_f5. gv_len = STRLEN(gv_f5). WRITE / gv_len.
실행결과
K K K KO KO KOREA 5
MOVE 명령은 = 기호와 동일하게 데이터를 할당하는 명령어이다.
이와 비슷한 MOVE-CORRESPONDING 구문은 구조체나 헤더라인이 존재하는 Internal Table에 사용되는 구문이며 동일한 필드명에 데이터를 할당하는 명령이다.
Strlen 명령어는 문자의 길이를 반환하는 기능을 수행한다.
WRITE는 데이터를 LIST에 쓰는 역할을 수행한다.
/는 New Line을 의미한다.
ex) TYPE N은 숫자를 문자로 표현
REPORT Z02_06. DATA: gv_num1 TYPE i. DATA: gv_num2 TYPE n LENGTH 4. gv_num1 = 89. WRITE :/ gv_num1. gv_num2 = 89. WRITE :/ gv_num2.
실행결과
89 0089 => TYPE I를 선언하면 LIST에 출력 시 변수 자릿수만큼만 출력이 되나, TYPE N 타입의 변수에서 공백은 0으로 표현되어 문자 길이만큼 LIST에 조회된다.
ex) 날짜타입 D와 시간타입 T
REPORT Z02_07. * 1. 날짜 계산 DATA: gv_date TYPE d. dv_date = sy-datum. WRITE: / gv_date. dv_date = gv_date + 3. WRITE: / gv_date. * 2. 시간 계산 DATA: gv_time TYPE t. gv_time = sy.uzeit. WRITE: / gv_time. gv_time = gv_time - 60. WRITE: / gv_time.
실행결과
20210721 20210724 211803 211703
- 날짜 타입
- sy-datum은 시스템 변수로 시스템의 오늘 날짜를 저장하고 있다. 날짜 타입 변수에 숫자를 연산자와 함께 사용하면 일자를 계산하게 된다.
- 시간 타입
- sy-uzeit 시스템 변수는 현재 시간이 포함되어 있다. 시간 타입 변수에 연산하게 되면 초 단위를 계산하게 되다.
4. 가변 길이를 가지는 Predefined ABAP Type
실행 시점까지 고정 길이를 알 수 없는 가변 길이의 Data Type으로, String이 대표적이다.
String은 가변 길이를 가지는 Data Type C와 유사하며, 아주 긴 문자열을 표현할 경우 String을 사용하면 유용하다.
둘의 차이점은 String을 사용할 땐 프로그램이 실행된 환경에서 동적 메모리가 할당된다는 점이다.
명령어 의미 FIND IN STRING. 원하는 글자(STR1)가 해당 단어(STRING)에 있으면 시스템 변수 SY-SUBRC = 0 반환 REPLACE WITH INTO STRING. STR1을 STR2로 바꾼 후 STRING에 바뀐 글자 삽입 TRANSLATE TO UPPPER/LOWER CASE. 대소문자 변경. SHIFT 왼쪽으로 글자를 한 칸씩 옮김 CONDENSE 공백을 제거하여 왼쪽으로 정렬, NO-GAPS와 주로 사용되며 SPACE 제거 OVERLAY character의 빈 곳을 채우고, 채워져 있는 곳을 덮어쓰지 않음 CONCATENATE 문자열 연결 SPLIT 기준 문자 중심으로 문자 나눔 ex)
REPORT Z02_08. DATA : gv_str TYPE string, gv_chr(4) TYPE c. gv_str = 'ABAP'. gv_chr = 'B'. FIND gv_chr IN gv_str. IF sy_subrc EQ 0. WRITE 'B found'. ENDIF. * B found gv_str = 'ABAP'. gv_chr = 'BBAP'. REPLACE 'ABAP' WITH gv_chr INTO gv_str. WRITE / gv_str. * BBAP gv_str = 'ABAP'. TRANSLATE gv_str TO LOWER CASE. WRITE / gv_str. * abap gv_str = 'ABAP'. SHIFT gv_str. WRITE / gv_str. * BAP gv_str = 'AB AP'. CONDENSE gv_str NO-GAPS. WRITE / gv_str. * ABAP gv_str = ' B P'. gv_chr = 'AAAA'. OVERLAY gv_str WITH gv_chr. WRITE / gv_str. * ABAP gv_str = 'AB'. gv_chr = 'AP'. CONCATENATE gv_str gv_chr INTO gv_str. WRTIE / gv_str. gv_str = 'AB,AP'. SPLIT gv_str AT ',' INTO gv_str gv_chr. WRITE :/ gv_str, gv_chr. * AB AP
작은따옴표와(') 그레이브 기호(`)의 차이점
DATA gv_char(32) TYPE c. gv_char = 'This is a'. CONCATENATE gv_char 'text ' INTO gv_char SEPARATED BY space. * This is a text CONCATENATE gv_char `text ` INTO gv_char SEPARATED BY space. * This is+s a text
그레이브 기호를 사용하면 문자열 내에 포함되어 있는 SPACE를 모두 인식한다.
'SAP' 카테고리의 다른 글
select-options (0) 2021.11.03 함수에 변수 사용하기 (0) 2021.09.28 SAP GUI 실습 화면과 같도록 테마 설정하기 (0) 2021.08.24 01. SAP Data Type 01 (0) 2021.07.18