SAP/Abap Cookbook

3.1 Working with Field Symbols

Radler 2023. 1. 29. 14:59

3.1.1 필드심볼이란?

 

*데이터 = data obj.

 

특정 데이터의 alias, 쌍둥이.

특정 데이터의 '값'을 가진다.

 

즉, 익히 생각하는 포인터 개념 아님.

포인터는 특정 데이터의 '값'이 아닌 특정 데이터의 '주소'를 가짐.

따라서, 특정 데이터의 값을 조작하기 위해서는 역참조(dereference)가 필요. 

 

 

한 줄 요약 : 필드심볼은 역참조된 포인터임.


 

3.1.2 필드심볼 선언 

 

Generically하게 선언된 필드심볼은 매 런타임마다 자신이 assign되어있는 데이터의 속성을 물려받음.

 

Q. 아니 그럼, 다 generically 하게 선언(Type any / Type any table)하지, 뭐하러 statically하게 빌트인이나 커스텀 타임으로 선언해줌? 

A. 다 개발자 편하려고. 나중에 컴파일러가 개발자 의도대로 필드심볼이 적절하게 쓰여지고 있는 지 가이드해줄 수 있음. 

 

한 줄 요약 : 가능한 statically하게 선언하는 게 좋다.


3.1.3 필드심볼을 데이터 오브젝트에 Assign

 

*Statical Assignments (Working with Var./Str./Tab.)

Assign lv_connid to <lfs>.

 

*Dymaical Assignments

Assign (lv_name) to <lfs>.

 

*Cross FS Assignments

Assign <lfs_1> to <lfs_2>.

 

한 줄 요약 : 필드심볼이 멋진 이유는 동적 assign이 가능하기 때문이다.

 


3.1.4 캐스팅

 

data obj. 와 필드심볼의 타입이 compatible 할 경우(alignment 와 length 모두 compatible), casting 문법을 이용하여, 필드심볼이 물려받을 타입을 선택해 줄 수 있다. 

 

Casting의 의미

필드 심볼에 내가 원하는 타입 입힐거야! (lv_a 가 아니라 lv_b의 타입을 입히고 싶다!)

 

DATA lv_a(5TYPE c,
            lv_b(4TYPE c.

FIELD-SYMBOLS <lfs_b>         LIKE lv_b,
                               <lfs_generic> TYPE any.

 

"서로 incompatible 하기 때문에 컴파일 에러 발생.
ASSIGN lv_a TO <lfs_b>.                                           
UNASSIGN <lfs_b>.

 

"<lfs_b>의 type은 lv_b의 타입과 같다.
ASSIGN lv_a TO <lfs_b> CASTING.                            
UNASSIGN <lfs_b>.

 

"<lfs_generic>의 type은 lv_a의 타입과 같다.
ASSIGN lv_a TO <lfs_generic>.                                   
UNASSIGN <lfs_generic>.


"<lfs_generic>의 type은 lv_b의 타입과 같다.

"(Generic 하게 선언된 필드 심볼이니깐 캐스팅시에는 Fully Typed로 explicit하게 Casting해줘야 한다.)
ASSIGN lv_a TO <lfs_generic> CASTING LIKE lv_b.   
UNASSIGN <lfs_generic>.

 

한 줄 요약 : casting은 필드심볼에 내가 원하는 타입 입히고 싶을 때 사용한다.


모르는 단어 정리

 

demistify 쉽게 설명하다
delve into 찾으려고 뒤지다

deprecate 반대하다

contiguous 근접한

introspection 내성, 본성

stipulation 규정
alignment 정렬, 순서