본문 바로가기

ABAP New Syntax - Value

반응형

 

ABAP 신문법(New Syntax)인 Value구문에 대한 설명이다.

Value문은 Insert/Append와 유사한 기능을 한다. Internal Table 또는 Structure에 초기 데이터를 생성하거나 데이터를 추가할 수 있는 기능을 가지고 있다.

지금까지는 workarea를 통해서 Internal Table과 Structure에 행을 삽입하였을 것이다. 하지만 Value문은 workarea가 필요하지 않다.

workarea를 꼭 써야 Internal Table에 Insert가 가능하다는 패러다임을 바꿔 줄 구문이다.


● Structure에 데이터 할당

*type 선언
TYPES: BEGIN OF l_type,
         field1 TYPE char10,
         field2 TYPE char10,
         field3 TYPE char10,
         field4 TYPE char10,
         field5 TYPE char10,
       END OF l_type.

*Structure 선언
DATA: ls_old TYPE l_type.

*값할당
ls_old-field1 = '첫번째 필드'.
ls_old-field2 = '두번째 필드'.
ls_old-field3 = '세번째 필드'.
ls_old-field4 = '네번째 필드'.
ls_old-field5 = '다섯번째 필드'.

(구 문법)

*type 선언
TYPES: BEGIN OF l_type,
         field1 TYPE char10,
         field2 TYPE char10,
         field3 TYPE char10,
         field4 TYPE char10,
         field5 TYPE char10,
       END OF l_type.

*Structure 선언
DATA: ls_new TYPE l_type.

*값 할당
ls_new = VALUE #( field1 = '첫번째 필드' field2 = '두번째 필드'
                  field3 = '세번째 필드' field4 = '네번째 필드' 
                  field5 = '다섯번째 필드'
                ).

(Value 문법)

위 두 코드는 동일한 기능을 하는 코드이다.

이런 식으로 Structure에 값을 할당할 때 Value문을 사용하면 한 줄로 (Structure형태 그대로) 값을 지정할 수 있다.

 

말했다시피 위 구문은 Structure ls_new에 대하여 값을 할당(초기값을 설정)하겠다는 뜻이다.

#은 operand type(피 연산자 type)이다. 여기서 피 연산자란 ls_new를 가리키고 있다. 정리하자면

'Structure ls_new에 'l_type'이라는 type(ls_new의 type)으로 데이터를 설정/추가하겠다'라는 뜻으로 해석할 수 있다.

 

정리하자면 아래의 구문과 동일하다.

 

◆ #자리에 Type이 아닌 Structure이나 Internal Table을 삽입 시 다음과 같은 에러가 발생한다.

Type만 쓸 수 있다.

 


● Table에 데이터 할당

*type 선언
TYPES: BEGIN OF l_type,
         field1 TYPE char10,
         field2 TYPE char10,
         field3 TYPE char10,
         field4 TYPE char10,
         field5 TYPE char10,
       END OF l_type.

DATA: ls_old TYPE l_type,
      lt_old TYPE TABLE OF l_type.

ls_old-field1 = '첫번째 필드'.
ls_old-field2 = '두번째 필드'.
ls_old-field3 = '세번째 필드'.
ls_old-field4 = '네번째 필드'.
ls_old-field5 = '다섯번째 필드'.

INSERT ls_old INTO TABLE lt_old.

CLEAR ls_old.

ls_old-field1 = '여섯번째 필드'.
ls_old-field2 = '일곱번째 필드'.
ls_old-field3 = '여덞번째 필드'.
ls_old-field4 = '아홉번째 필드'.
ls_old-field5 = '열번째 필드'.

INSERT ls_old INTO TABLE lt_old.

(구 문법)

*type 선언
TYPES: BEGIN OF l_type,
         field1 TYPE char10,
         field2 TYPE char10,
         field3 TYPE char10,
         field4 TYPE char10,
         field5 TYPE char10,
       END OF l_type.

DATA lt_new TYPE TABLE OF l_type.

lt_new = VALUE #(
( field1 = '첫번째 필드' field2 = '두번째 필드' field3 = '세번째 필드'
  field4 = '네번째 필드' field5 = '다섯번째 필드'
)
( field1 = '여섯번째 필드' field2 = '일곱번째 필드' field3 = '여덞번째 필드'
  field4 = '아홉번째 필드' field5 = '열번째 필드' )

  field1 = '고정값'
( field2 = '필드값'  field3 = '필드값'  field4 = '필드값'  field5 = '필드값'  )
( field2 = '필드값2' field3 = '필드값2' field4 = '필드값2' field5 = '필드값2' )
                ).

(Value 문법)

데이터는 괄호 한 묶음씩 추가가 된다. 즉 여섯 개의 데이터(행)가 있는 테이블이다.

밑에서 네 번째 줄에 field1 = '고정값'구문은 괄호에서 빠져있다.

괄호 밖에 명시되고 있는 필드는 필드 아래의 행들에 대하여 모두 추가가 된다.(Default와 유사)

해당 Value문을 디버깅해보면 다음과 같은 테이블이 만들어진다.

lt_new

 

코드가 훨씬 줄어들고, 가독성도 많이 좋아졌다. insert를 위한 structure는 생성조차 하지 않았다. 확실히 코딩 효율도 올라갈 것이라고 생각한다.


● Inline선언 활용

앞서 배운 Inline선언을 활용하면 Structure/Table 선언과 동시에 데이터 초기화가 가능하다.

*type 선언
TYPES: BEGIN OF l_type,
         field1 TYPE char10,
         field2 TYPE char10,
         field3 TYPE char10,
         field4 TYPE char10,
         field5 TYPE char10,
       END OF l_type.

DATA(ls_new) = VALUE l_type( field1 = '첫번째 필드' field2 = '두번째 필드' 
                             field3 = '세번째 필드' field4 = '네번째 필드' 
                             field5 = '다섯번째 필드'
                            ) .

(Structure Inline 선언)

*type 선언
TYPES: BEGIN OF l_type,
         field1 TYPE char10,
         field2 TYPE char10,
         field3 TYPE char10,
         field4 TYPE char10,
         field5 TYPE char10,
       END OF l_type.

*Table type 선언
TYPES l_t_type TYPE TABLE OF l_type WITH NON-UNIQUE KEY field1.

DATA(lt_new) = VALUE l_t_type(
( field1 = '첫번째 필드' field2 = '두번째 필드' field3 = '세번째 필드'
  field4 = '네번째 필드' field5 = '다섯번째 필드'
)
( field1 = '여섯번째 필드' field2 = '일곱번째 필드' field3 = '여덞번째 필드'
  field4 = '아홉번째 필드' field5 = '열번째 필드' )

  field1 = '고정값'
( field2 = '필드값'  field3 = '필드값'  field4 = '필드값'  field5 = '필드값'  )
( field2 = '필드값2' field3 = '필드값2' field4 = '필드값2' field5 = '필드값2' )
                             ).

(Internal Table Inline 선언)

 

ABAP New Syntax - Inline 선언

안녕하세요 쿄신입니다. ABAP의 신문법(New Syntax)인 Inline선언에 대한 설명입니다. Inline선언이란 미리 data(Field Symbol)를 선언하지 않고 line에서 선언하는 문법입니다. 담고자 하는 값의 유형에 따라 da..

kyoshins.tistory.com

 


● Base문

*type 선언
TYPES: BEGIN OF l_type,
         field1 TYPE char10,
         field2 TYPE char10,
         field3 TYPE char10,
         field4 TYPE char10,
         field5 TYPE char10,
       END OF l_type.

*Table type 선언
TYPES l_t_type TYPE TABLE OF l_type WITH NON-UNIQUE KEY field1.

DATA(lt_new) = VALUE l_t_type(
( field1 = '첫번째 필드' field2 = '두번째 필드' field3 = '세번째 필드'
  field4 = '네번째 필드' field5 = '다섯번째 필드'
)
( field1 = '여섯번째 필드' field2 = '일곱번째 필드' field3 = '여덞번째 필드'
  field4 = '아홉번째 필드' field5 = '열번째 필드' )

  field1 = '고정값'
( field2 = '필드값'  field3 = '필드값'  field4 = '필드값'  field5 = '필드값'  )
( field2 = '필드값2' field3 = '필드값2' field4 = '필드값2' field5 = '필드값2' )
).

lt_new = VALUE #( BASE lt_new
( field1 = '추가 필드' field2 = '추가 필드' field3 = '추가 필드' 
  field4 = '추가 필드' field5 = '추가 필드')
                             ).

두 번째 Value문에 Base를 사용하고 있다.

Value에 Base를 쓸 경우 Base 뒤에 나오는 인터널 테이블의 값(현재 lt_new)을 가지고 추가로 Insert 된다.

위 구문은 4개의 행을 가지고 있는 lt_new 테이블를 base로 하나의 행이 추가되는 코드이다.

lt_new

 


궁금한 사항들은 댓글을 남겨주시면 친절히 답변드리겠습니다.^^

반응형

'SAP > ABAP New Syntax' 카테고리의 다른 글

ABAP new syntax line_exists  (0) 2021.11.12
Open SQL CASE문 사용법  (0) 2021.09.29
ABAP New syntax - filter  (0) 2020.11.15
ABAP New syntax - switch, cond  (0) 2020.11.08
ABAP New Syntax - Inline 선언  (5) 2020.03.24
댓글