본문 바로가기

SAP셀프스터디/22일만에 이지아밥 1회독 하기

[chapter02] Data Type

최초 작성일: 23.01.23

최종 작성일: 23.01.27

 

목적:데이터 타입 정의하고 데이터 타입을 이용해 변수를 선언하는 방법 학습

01.overview

1. data type

2. data variable

3. data type의 종류

4. data variable 선언

5. data 구문

6. abap naming rule

 

02. Predefined ABAP type

1.고정길이를 가지는 기본 predefined abap type

2.numeric data type

3.character type

4.가변 길이를 가지는 predefined ABAP type

5. 16진수 type

 

03. 프로그램의 local type

1. type 선언

2. structured type 선언

 

04. ABAP Dictionary의 TYPE

1. table, view를 이용한 type 선언.

2. data type을 이용한 type 선언

3. Type group을 이용한 type 선언

4. abap dictionary type vs ABAP type.

 

05. Assigning Value

1. assigning value (값 할당)

2. offset을 이용한 값 할당

3. 구조체의 산술 계산

 

06. 기타 변수 선언

1.constants

2.staticts

3.tables.

 

abap 프로그램에서는 data type과 data variable(data object)이 존재 한다.

data type: 프로그램에서 사용할 수 있는 데이터의 타입을 정의

data variable: data type을 참고하여 값을 저장할 수 있는 변수

 

TYPES dtype [TYPE type| LIKE dobj]

DATA var [TYPE type | LIKE dobj]

*[]은 옵션을 의미하고 |은 OR의 의미를 지니고 있음

 

Paragraph 1. Data Type

data type은 data variable과 독립적으로 선언하게 되며, data variable은 data type을 참고하여 선언하게 된다.

프로그램에서 types 구문을 사용하여 data type을 선언하면 해당 프로그램에서만 사용할 수 있기 대문에 local data type이라고 부른다.

 

테이블 구조를 그대로 변수로 사용할 수도 있음

 

2. data variable

data type을 참고하여 프로그램에서 사용할 수 있는 변수 이다.

data variable은 프로그램의 실행 시점에 메모리를 차지하는 데이터 변수를 의미한다.

abap 프로그램에서는 data variable의 이름을 통해서 값에 접근할 수 있다(data type을 해석하는 작업이 선행된다.)

 

 

3. data object

data object는 abap프로그램이 실행되는 동안 메모리를 점유하게 되는 물리적인 단위이다.

abap구문은 data object 의 이름을 이요해 주소를 확인하고 data type을 참고해 필드 길이와 소수 자릿수 등과 같은 정보로 contents를 해석하게 된다.

 

4. data type의 종류

4-1) predefined abap type

kernel 레벨에서 정의되어 있는 기본 데이터 타입. 예를 들어 interger , character 등.

4-2) local data type in program

predefined abap type을 조합하여 여러필드가 추가된 structure 타입을 정의하여 사용한다. 프로그램내에서 선언한 type을 like나 type등을 사용해서 쓰는 것.

4-3) global data type in abap dictionary.

모든 abap 프로그램에서 사용할 수 있는 global data type 이다.

abap dictionary data type은 abap 프로그램 내에서 type 구문을 이용할 수 있다. 예를들어 sflight나 mara등 abap dictionary data type을 인용해서 사용 가능. 예를 들어 ' DATA: scarr TYPE sflight-carrid. ' 이런 식으로 사용 가능.

 

5.data variable 선언

data type을 이용하여 abap 변수를 선언하는 방법 3가지

1) predefined abap type 이용하여 변수 선언

DATA: gv_num TYPE i, * integer
gv_deci TYPE f, * function
gv_data TYPE d, * date
gv_time TYPE d * date

 

2) 프로그램의 local type을 이용하여 변수 선언

local 프로그램에서 자주 사용하게 되는 데이터 및 구조를 type으로 선언하여, 프로그램 내에서만 abap 기본 데이터 타입 처럼 사용 할 수 있다.

TYPES: BEGIN OF t_struct,
col1 TYPE c,
col2 TYPE i,
col3 TYPE d,
end of struct.

3)abap dictionary의 type을 이용하여 변수 선언

ABAP dictionary(table, structure, data element 등)는 모든 프로그램에서 선언하여 사용 할 수 있다.

DATA: gv_carried TYPE s_carr_id,
gv_connid TYPE sflight-carrid,
gv_matnr TYPE mara-matnr.

6. DATA구분

데이터 변수를 선언할 때 사용하는 구문으로 변수 명은 언더라인 기호를 포함하여 30자 까지 가능하다.

1) TYPE type

DATA : gv_num  TYPE: i.

콜론 기호를 동일한 명령러를 쉼표로 구분하여 마침표를 만날때 까지 실행하도록 한다.

 

2)  LIKE num

앞에서 생성한 data variable인 gv_num과 동일한 타입의 변수를 사용할때 사용한다.

DATAl gv_num2 LIKE gv_num2

3)VALUE int

모든 데이터 타입은 initial value가 존재한다.

data 구문을 사용할때 value 옵션을 사용하면 기본 initial value 대신에 int로 초깃값을 설정한다

value is initial 구문을 사용하면 data type의 initial value로 지정된다(생략 가능)

constant 변수를 선언할 때에는 value 옵션을 필수 사항이다

DATA  gv_ num TYPE i VLAUE 123,
              gv_flag  VALUE 'X',
              GV_VAL value is not initial,
              gv_idx  LIKE su-tabix   VALUE 45.

4) LENGTH n

필드의 길이를 설정한다. C,N,P,X 타입에만 사용할 수 있음.

 

5)DECIMALS n

data type P에서만 사용가능하며 1~14 사이의 소수 자리 수를 설정한다.

 

TYPES t_var TYPE c LENGTH 20. * 길이는 20, character인 t_var라는 type 선언
DATA gv_var TYPE t_var.   * 위에 선언한 type을 적용한 gv_var라는 데이터 선언
gv_var  = 'hello abap'.  * gv_var에 'hello abap'이라는 변수 선언
WRITE gv_var. *화면에 'gv_var'이라는 변수 보이게 하기

6. abap naming rule

abap dictionary의 naming rule은 'z' 또는 'y' 로 시작하는 것을 기본으로 하고 있으며,

insert/append와 같은 keyword는 사용 할 수 없도록 하는 필수적인 사항이 있다.

abap 프로그램에 사용하 ㄹ수 있는 변수명은 언더라인 기호를 포함하여 30자까지 가능함.

 

6.1 전역 변수 정의 (global variable)

전역 변수라 함은 하나의 프로그램 또는 함수 그룹 내에서 접근할 수 있는 데이터 유형을 의미한다.

프로그램이 활성화 되어 있는 상태에서는 전역 변수를 항상 메모리를 점유하고 있다.

 

6.2 지역 변수 정의 ( local variable)

지역 변수는 프로그램이 모듈 내에서만 유효한 변수를 의미한다.

모듈이란 말을 함수나 서브루틴 같이 단위 기능을 구현하기 위해 스크립트를 그룹화 한것 이다.

 

6.3 naming rule점검(code inspector)

t-code: sci 실행 요

 

 

 

Paragraph 02. Predefined ABAP TYPE

ABAP kernel 레벨에서 정의 되어 있는 데이터 타입이며, 모든 abap 프로그램에서 사용할 수 있다.

 

1. 고정길이를 가지는 기본 predefined abap type

abap은 고정 길이를 가지는 8 가지 기본 data type을 제공하고 있음

Numeric type 초기 길이 가능 길이 초깃값 의미
I 4 4 0 interger( whole number)
F 8 8 0 floating point number
P 8 1-16 0 packed number(소수 자리를 허용)
C 1 1-65535 '...' text field
D 8 8 '000000' data field
N 1 1-65535 '0....0' numeric text field
T 6 6 '000000'  
X 1 1-65535    

데이터 타입 D,F,I는 이미 기술적 속성이 정의되어 있어서 프로그램에서 필드 길이를 정의하지 않고 바로 사용할 수 있다.

그리고 type p는 decimals를 명시하지 않으면 소수 자리를 인식하지 못한다.

DATA gv_num TYPE I.
DATA gv_num TYPE p DECIMALS 2.

2. numeric data type

1) integers of Type I

정수 타입만 지원

2)packed number of type P

소수 자리를 허용

3)floating point number of type F

지수 형태로 표현되므로 FLTP_CHAR_CONVERSION과 같은 function monule을 이용해 다른 데이터 타입으로 변환하여 출력함.

높은 정확도를 요구한다면 type p를 사용해야하며, 매우 작거나 큰 수라면 type f 사용을 권장함.

2.1 numeric data type 더 살펴보기

TYPE N( Numeric text field)이 조전ㅎ하는 데, 이것은 숫자 한자리를 1 byte로 표현하는 character type 이다.

2.2 numeric operation(연산자)

1)basic arthmetic operation

기호 의미 사용 예
+ 더하기 <p>=<n>+<n>
- 빼기 <p>=<n> - <n>
* 곱하기 <p> = <n>*<n>
/ 나누기 <p> = <n> /<n>
div integer 나누기 <p>= <m> div <n>
mod integer  나누기의 나머지 <p> = <m> mod <n>
** 제곱 <p> = <m> ** <n>

2) numeric data type 함수

함수 내역 사용예
ABS 절댓값 리턴  
SIGN 부호에 대한 결과를 리턴한다  
CEIL 해당 값보다 작지 않은 가장 큰 정수를 리턴한다 CEIL(13), CEIL(1.7)은 모두 2를 리턴
FLOOR CEIL의 반대  
TRUNC 소수점을 버리고 정수를 남긴다  
FRAC 소수점 이하 자리만 남긴다 flac(2.9)면 0.9를 리턴함
     

3.character type

C: 문자, 숫자, 특수문자에 사용

N: 숫자를 C 타입으로 표현. Integer 형태를 문자 타입으로 보여줌.

D: 날짜 타입을 표현

T: 시간 타입을 표현

c 타입은 데이터 선언 시에 문자 길이를 명시적으로 선언해야한다. 문자 길이를 지정하지 않거나 data type을 선언하지 않으면 기본적으로 character 1 자리로 정의 된다.

DATA gv_fd.
DATA gv_fd TYPE C.
DATA gv_fd(1) TYPE C.
DATA gv_fd TYPE C LENGTH 1.

integer에서 숫자 길이 제한은 () 요렇게 안해서 무시됨

 

MOVE 명령은 = 기호와 동일하게 데이터를 할당하는 명령어 이다.

이와 유사한 역할을 하는 MOVE-CORRESPONDING 구문은 구조체나 헤더라인이 존재하는 INTERNAL TABLE에 사용되는 구문이며, 동일한 필드명에 데이터를 할당하는 명령이다. -> 이게 무슨 의미 인지 이해 요망

STRLEN명령어는 문자의 길이를 반환하는 기능을 수행

/기호는 New line을 의미한다.

 

-> 코딩의 결과 값은 저장후 activate한 다음에 f8을 선택하면 보인다..

 

REPORT Z02_03.

DATA: gv_num TYPE I.
DATA: gv_num1 TYPE N LENGTH 4.

gv_num = 89.
gv_num1 = 89.

WRITE: gv_num, gv_num1.

결과 값

DATA: gv_date TYPE D.

gv_date = sy-datum.

WRITE: gv_date.

gv_date = gv_date + 3.

WRITE: gv_date.

DATA: gv_time TYPE T.

gv_time = sy-uzeit.
WRITE : gv_time.

결과값2

-시스템 변수 sy-datum과 sy-datlo의 차이점

sy-datum 시스템 변수는 img에서 설정한 systme time zone을 기준으로 시간이 설정되고,

sy-datlo 시스템 변수는 img에서 설정한 user's time default time 또는 사용자 프로파일에 설정된 time zone을 기준으로 시간이 설정 된다.

 

4. 가변 길이를 가지는 predefined abap type

실행 시전까지 고정 길이를 알 수 없는 가변 길이의 data type으로 string이 대표적임.

string은 가변 길이를 가지는 data type C와 유사하며, 아주 긴 문자열을 표현 할 경우에는 STRING을 사용하면 유용하다.

STRING 타입과 DATA TYPE C와의 차이점은 프로그램이 실행된 환경에서 동적 메모리가 할당된다는 점이다.

 

REPORT Z02_03.

gv_str = 'ABAP'.
gv_chr = 'BBAP'.

REPLACE 'ABAP' with gv_chr INTO gv_str.
WRITE: gv_str, gv_chr.



gv_str = 'ABAP'.
SHIFT gv_str.
WRITE: gv_str.

gv_str = 'AB   AP'.
CONDENSE gv_str NO-GAPS.
WRITE: gv_str.

gv_str = ' B P'.
gv_chr = 'AAAA'.
OVERLAY gv_str with gv_chr.
WRITE: gv_str.

Paragraph 3. 프로그램의 local type

1.type 선언

프로그램 내에서 local type을 선언하여 로컬 프로그램에서만 특별한 타입으로 사용하기 위해, types 구문을 이용한다.

 

TYPES t_char10 (10) TYPE C. * t_char10 이라는 새로운 타입 선언
DATA gv_var1 TYPE t_char(1). * type을 이용하여 gv_var1이라는 새로운 변수(object) 선언
DATA gs_val2 LIKE gv_var1. * data object를 이용해서 gv_val2 object(변수) 선언

2.structured type 선언

TYPES : BEGIN OF t_ren,
name TYPE C LENGTH 20,
country TYPE C LENGTH 10,
city TYPE C LENGTH 10,

END OF t_ren.

DATA gs_people TYPE t_ren.

gs_people-country = 'KOREA'.
gs_people-city = 'SEOUL'.

WRITE: gs_people-name,gs_people-country,gs_people-city.

 

구조체 타입을 사용하지 않고 DATA BEGIN OF ~ END OF 구문을 이용하여 바로 구조체 변수를 선언할 수도 있다.

DATA : BEGIN OF ge_people,
        name TYPE C LENGTH 10,
        country    TYPE C LENGTH 5,
        phone  TYPE C LENGTH 10,

END OF ge_people.

ge_people-name = 'OHJOOYONG'.
ge_people-country = 'SEOUL'.
ge_people-phone ='1072107288'.

WRITE: ge_people-name,ge_people-country,ge_people-phone.

include type구문을 이용해 nested structure 타입을 선언할 수 있다.

TYPES: BEGIN OF t_ren,
    name TYPE c LENGTH 20,
    country TYPE c LENGTH 20,
    city TYPE c LENGTH 10,
  END OF t_ren.

*nested 구조체 type 선언

TYPES: BEGIN OF t_info.
  INCLUDE TYPE t_ren as ren.
TYPES: phone TYPE c LENGTH 10,
END OF t_info.

*구조체 object 선언

DATA gs_people TYPE t_info.

gs_people-ren-name = 'ohjooyong'.
gs_people-ren-country = 'korea'.
gs_people-ren-city = 'seoul'.
gs_people-ren-phone = '01072107288'.

WRITE: / gs_people-ren-name, gs_people-ren-country,
         gs_people-ren-city, gs_people-ren-phone.

INCLUDE STRUCTURE구문을 이용하면 DATA로 선언된 구조체나 ABAP Dictionary 구초제를 nested structure로 포함 할 수 있다.

data: BEGIN OF gs_ren,
  name TYPE C LENGTH 20,
  country TYPE C LENGTH 10,
  city TYPE c LENGTH 10,
  END OF gs_ren.
  
DATA: BEGIN OF gs_people.
  INCLUDE STRUCTURE gs_ren AS ren.
DATA: phone TYPE C LENGTH 10,
END OF gs_people.

gs_people-ren-name = 'ohjooyong'.
gs_people-ren-country = 'korea'.
gs_people-ren-city = 'seoul'.
gs_people-ren-phone = '01072107288'.

WRITE: / gs_people-ren-name, gs_people-ren-country,
         gs_people-ren-city, gs_people-ren-phone.

 INCLUDE STRUCTURE gs_ren AS ren. -> 'AS ren'을 지우고 값을 할당 할때도 'gs_people-ren-phone'이 아니가 ' gs_people_phone으로 할것
data: BEGIN OF gs_ren,
  name TYPE C LENGTH 20,
  country TYPE C LENGTH 10,
  city TYPE c LENGTH 10,
  END OF gs_ren.
  
DATA: BEGIN OF gs_people.
  INCLUDE STRUCTURE gs_ren.
DATA: phone TYPE C LENGTH 10,
END OF gs_people.

gs_people-name = 'ohjooyong'.
gs_people-country = 'korea'.
gs_people-city = 'seoul'.
gs_people-phone = '01072107288'.

WRITE: / gs_people-name, gs_people-country,
         gs_people-city, gs_people-phone.

 

 

Paragraph 4. ABAP Dictionary의 Type.

4-1. table, view를 이용한 type 선언

database table과 view 전체를 참고하여 구조체 및 인터널 테이블을 선언하 ㄹ수 있다.

그리고 table의 필드만 참고하여 선언할 수 있다.

DATA: BEGIN OF test,
carrid TYPE sflight-carrid,
conname TYPE sflight-conname,
END OF test.

SELECT SINGLE * FROM sflight INTO test WHERE carrid = AA.

WRITE: /test-carrid, test-conname.

table과  view의 전체 구조를 참고할 수도 있지만, table의 개별 필드를 참고하여 변수를 선언할 수도 있다.

DATA: gv_carrid TYPE sflight_carrid,
	 gv_conname TYPE sflight-conname.
 
 gv_carrid = 'AA'.
 gv_conname = '0017'.
 
 WRITE: / gv_carrid, gv_conname.

4-2. data type을 이용한 type 선언.

data type은 abap dictionary를 정의하는 실질적인 타입이다.

4-2-1. data element.

abap dictionary에서 data element는 개별 필드를 정의한다.

data element 의 타입은 domain을 참고하게 된다(data element 레벨에서 타입을 정의 할수 도 있다)

같은 domain을 여러 data element에서 사용할 수도 있고

같은 data element를 여러 개의 테이블 필드에서 사용할 수 있다.

*data element를 이용하여 변수 선언
DATA gs_carrid TYPE sflight_carrid.
gs_carrid = 'AA'.

WRITE: 'Carrid :' , gs_carrid.

4-2-2. structure를 이용한 type선언

structure는 여러 개의 table에 존재하는 필드들을 조합할 필요성이 있을 경우에 자주 사용하게 된다.

abap dictionary structure를 생성한 후, 프로그램내에서 types구문을 사용하여 구조체를 선언할 수 있다.

DATA test TYPE zstruct.

test-col1 = 1.
test-col1 = 'asg'.

WRITE: test-col1,test-col2.

4-2-3. type group을 이용한 type 선언 -> 이건 ALV할때 다시 공부하자

type group은 모든 프로그램에서 사용할 수 있는 global data type 이다.

TYPE-POOLS name.

4-2-4. abap dictionary VS ABAP TYPE.

요건 개발자 입장에서는 별 차이가 없으니 패스

 

 

Paragraph 5. Assigning value.

5-1.Assignng value(값 할당)

변수를 선언할 때 value 구문을 통하여 초깃값을 정의할 수 있고

실제 데이터를 처리하는 프로그램 구문 내에서는 move 또는 write to 구문을 이용하여 변수에 값을 할당하게 된다.

 

MOVE-CORRESPONDING 구문은 구조체에서 값을 할당 할때 많이 사용되며, 각 구조체의 같은 필드에 값이 복사 된다.

만약 구조체의 필드 이름 및 순서가 다른 경우  MOVE 구문을 사용하게 되면, 필드 이름에 관계 없이 순서대로 할당이 일어나므로 주의해서 사용해야함.

 

MOVE 구문을 이용하여 형변화(TYPE CONVERSION)을 할 수가 있다.

<f1>의 data type은 <f2>의 data type으로 변경된다.

abap에서는 type d(date)와 type t(time)간의 형변환이 불가능하지만 다른 type 변경과 length 조정을 자동으로 지원한다.

<f2> = <f1>
MOVE <f1> TO <f2>.
MOVE-CORRESPONDING <STRING1> TO <STRING2>. ** field string 값을 copy하는 경우에는 move-corresponding 구문을 사용할 수 있다. 이때 string 1과 string2의 필드명은 같지 않아도 된다. move-corresponding 구문은 구조체에서 값을 할당할 때 많이 사용되며, 각 구조체의 같은 필드에 값이 복사된다.
WRITE <f1> TO <f2>.[<option>].

WRITE구문은 Output to a list (리스트 출력), output to a field of internal table(변수 할당) 두가지 용도로 사용 된다.

DATA: BEGIN OF gs_ren,
      name(20) VALUE 'OH JOOYONG',
      country(10) VALUE 'korea',
      city(20) VALUE 'SEOUL',
END OF gs_ren.
  
DATA: BEGIN OF gs_info,
     name(20),
     country(10),
     phone(20) VALUE '01072107288',
  END OF gs_info.
  
 MOVE-CORRESPONDING gs_ren TO gs_info.
 WRITE: gs_info-name, gs_info-country, gs_info-phone.

5-2. offset을 이용한 값 할당

offset과 lengths를 이용하여 필드의 일부 값을 정의 할 수 있다.

MOVE <f1>[+<p1>][(<l1>)] TO <f2>[+<p2>][(<l2>)].
*f1필드 p1부터 시작하여 길이 l1 까지 복사하여 f2필드 p2부터 시작하여 l2까지 할당하는 구문
*offset(시작위치)를 지정하는 p1값은 0부터 시작한다. 즉 1번째 자리는 0을 의미한다.

DATA: f1(8) VALUE 'ABCDEFG'.
	f2(8).
MOVE f1+2(3) TO f2.
*CDE를 f2에 할당하는 것

5-3. 구조체의 산술 계산

MOVE-CORRESPONDING 구문을 통하여 구조체 간에 필드 값을 할당 할수 있는 것과 같이 다음 구문으로 구조체 간에 연산이 가능한다.

  • ADD-CORRESPONDING
  • SUBTRACT-CORRESPONDING
  • MULTIPLY-CORRESPONDING
  • DIVIDE-CORRESPONDING
DATA: BEGIN OF gs_rate,
  KIM TYPE f VALUE '0.8',
  HONG TYPE f VALUE '0.7',
  END OF gs_rate.
  
DATA: BEGIN OF gs_result,
  KIM TYPE i VALUE 10,
  HONG TYPE i VALUE 9,
END OF gs_result.

MULTIPLY-CORRESPONDING gs_result by gs_rate.

WRITE: gs_result-kim, gs_result-hong.

 

Paragraph 6. 기타 변수 선언.

1.constants

상수로 선언하게 되면 프로그램 내에서 변경 할 수 없다.

CONSTANTS : c_company(10) VALUE 'EASY ABAP'.
CONSTANTS: BEGIN OF c_people,
		 name(20) VALUE 'MINJIHONG',
         country(10) VALUE 'KOREA',
        END OF c_people.
 WRITE: c_company,c_people-name,c_people-country.

2.statics -> subroutine으로 대체

subroutine(form구문) 내에 선언된 변수 lv_val은 perform 구문으로 호출될 때 마다, 초기화 되지 않고 이전의 값을 지속적으로 저장하고 있다.

3.tables

table구문을 사용하여 abap dictionary table, view, structure를 선언하게 되면 abap dictionary 타입과 같은 data object를 생성하게 된다. 이것을 table work area라고 부르며 프로그램 내에서 구조체 처럼 사용할 수 있다.

TABLES: scarr.

SELECT * FROM scarr.
	WRITE: / scarr-carrid, scarr-carrname.
END SELECT.