본문 바로가기

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

[chapter10] Field Symbol & Data Reference

최초 작성일: 23년 2월 22일

최종 작성일:

필드 심볼과 데이터 참고는 고오급 기술에 속하며 ABAP 프로그램에서 데이터 오브젝트에 동적으로 접근할 수 있게 한다.

이것은 데이터 이름과 타입을 프로그램 실행 시점까지 알 수 없을 경우에 사용된다.

이러한 동적 할당을 통해 중복되는 스크립트를 간소화하는 역할도 수행하게 된다.

 

01. overview

01-1. 필드 심볼이란?

필드 심볼은 일반 필드의 위임 또는 상징적인 이름으로 정의된다.

필드 심볼은 다음과 같은 특성을 가지고 있다.

  • 필드 심볼은 ABAP 프로그램 내에서 변수에 동적인 접근이 가능하게 한다.
  • 필드 심볼은 자기 자신을 위한 메모리 공간을 점유하지 않는다.
  • 필드 심볼의 데이터 이름과 속성은 실행 시점(Runtime)에 결정된다.
  • 필드 심볼은 모든 데이터 오브젝트에 지정될 수 있다.
  • 일단 필드 심볼이 할당되면 데이터 오브젝트와 필드 심볼 간에는 차이가 없다.
  • move와 같은 abap 명령어도 같이 사용할 수 있다.
  • 필드 심볼은 타입을 명시하여 선언하거나, 타입 없이 생성할 수 있다. 타입이 명시되지 않으면 하당되는 필드(오브젝트)의 타입을 그대로 상속받는다.

임꺽정이라는 변수와 그 변수에 대한 필드 심볼인 임거정이 있다고 가정했을때,

프로그램을 실행하면 메모리 주소 100번지에 '의적'이라는 문자 값을 가지는 '임꺽정'이라는 변수가 생성된다.

그리고 필드 심볼에 할당하게 되면 필드 심볼은 데이터 오브젝트의 또 다른 이름의 껍데기만 있는 오브젝트가 생성된다.(자기 자신만을 위한 메모리 공간을 점유하지 않아서 껍데기라고 표현한듯)

 

임꺽정 이라는 변수는 일명 임거정 이라고도 한다.

즉, 프로그램 내에서 임꺽정과 임거정은 이름만 다를 뿐 메모리에 공간을 차지하는 같은 데이터 오브젝트는 의미한다.

( 필드 심볼은 자기 자신만을 위한 메모리는 점유 안하니까 target 변수의 메모리를 같이 점유하는 건가)

따라서 필드 심볼의 값을 변경하면 메모리 주소 100번지에 저장된 값에 직접 접근하여 변경하게 된다.

 

01-2. 필드 심볼 할당

아래 그림과 같이 field - symbols 구문을 선언하게 된다.

선언만 된 상태에서 필드 심볼은 다른 데이터 오브젝트를 가리킬 수 있는 포인터만 생성된다.

프로그램이 실행되고 assign 구문을 만나게 되면 포인터가 데이터 오브젝트에 연결된다.

그리고 필드 심볼의 값을 변경하게 되면 그림과 같이 gv_var 변숫값이 'A'에서 'B'로 변경 된다.

출처: 이지 아밥 2.0

REPORT  ZFIELDSYMBOL.

DATA: gv_var TYPE C VALUE 'A'.
FIELD-SYMBOLS : <fs> TYPE C.

ASSIGN gv_var TO <fs>.

<fs> = 'B'.

WRITE : 'gv_var is : ', gv_var.

02.필드 심볼 선언과 할당

02-01. 필드 심볼 선언

필드 심볼을 선언하는 구문이다. 필드 심볼 변수는 표제 괄호(<>) 기호를 사용하여 정의한다.

[TYPE]구문은 필드 심볼의 타입을 선언하며 선택적으로 사용할 수 있다. 

필드 심볼 타입은 generic type과 fully type 두 가지 유형으로 분류된다.

FIELD-SYMBOLS <fs> [TYPE].

02-01-01. generic type field symbol

필드 심볼을 선언할 때 타입을 지정하지 않고 할당 되는 데이터 오브젝트 유형에 따라 기술적인 속성을 상속받게 된다.

'FIELD-SYMBOL <fs2> TYPE ANY [TABLE]을 사용하려면 ASSIGN 구문에서 할당하는 오브젝트가 인터널 테이블 타입으로 선언되어야 한다.

이렇게 선언된 필드 심볼은 그 자체가 인터널 테이블이 되어 READ와 같은 구문을 사용할 수 있다.

TABLE 키워드를 삭제하고 TYPE ANY만 사용하면 LINE 타입의 구조체로 활용할 수 있다.

TYPE ANY를 이용하여 필드 심볼을 선언하는 것과 같은 Generic type을 이용하면, abap 프로그램에서 정적으로 주소를 호출하여 사용할 수 없다.

 

FIELD-SYMBOL <fs1>.
FIELD-SYMBOL <fs2> TYPE ANY [TABLE].

ASSIGN으로 할당하는 테이블이 인터널 테이블이 아니라서 생긴 이슈(즉, gv_var이 인터널 테이블이었어야함)
인터널 테이블에 할당해보았더니 이상없음..(당연히)
인터널 테이블에 할당해봐도 오류남

02-01-02. full type field symbol.

필드 심볼을 정의할때 부터 타입이 완전히 정해진 형태로 선언한다. 필드 심볼의 기술적인 속성은 할당되는 데이터 오브젝트와 같아야 한다.

필드 심볼 fs3은 sflight 테이블과 같은 구조를 가지는 구조체 타입으로 선언된다.

fs4는 인터널 테이블 gt_tab과 같은 구조를 가지는 line 타입의 필드 심볼을 선언하게 된다.

변수 이름은 메모리의 정적인 주소를 가리키고 있다. (변수 이름 = 메모리 주소))

fully type을 이용하면 다음 구문과 같이 명시적으로 구조체의 필드명을 호출하여 사용할 수 있다.

FIELD-SYMBOLS <fs3> TYPE SFLIGHT.
FIEDL-SYMBOLS <fs4> LIKE LINE OF gt_tab.

MOVE <fs3>-carrid TO <fs4>-carrid.

LIKE와 LIKE LINE OF의 차이점

아래 구문에서 LIKE line of와 LIKE의 차이점은 무엇일까?

이 두가지 구문은 인터널 테이블에 Header line이 없을 때만 차이점이 있다.(header line이 있을 때는 두 구문의 기능이 같다)

header line이 없으면 like line of는 구조체의 work area를 선언하지만, like 구문을 사용하게 되면 인터널 테이블을 선언하게 된다.

그러므로 header line이 없는 인터널 테이블을 사용할 때는 like 구문의 사용은 자제하는 것이 좋다???

 

FIELD-SYMBOLS <fs> LIKE LINE OF gt_tab.
FIELD-SYMBOLS <fs> LIKE gt_tab.

 

02-02. 필드 심볼 할당

필드 심볼을 선언하여 프로그램 내에서 사용하려면 반드시 assign 구문을 이용하여 오브젝트를 할당하여야 한다.

TYPES : BEGIN OF t_line,
col1 TYPE C,
col2 type C,
END OF t_line.

DATA: gs_wa TYPE t_line,
gt_itab TYPE HASHED TABLE OF LINE with UNIQUE key col1,
key(4) TYPE c value 'col1'.

FIELD-SYMBOLS <fs> type ANY TABLE.
ASSIGN gt_itab TO <fs>.

필드 심볼에 오브젝트를 할당하려면 assign구문을 활용한다.

assign구문은 크게 다음 3가지 기능으로 분류한다.

  • assign 구문의 기본구조
  • 구조체 필드를 필드 심볼에 assign
  • 필드 심볼과 casting

02-03. assign 구문의 기본 구조

02-03-01. static assign

필드명을 아는 경우

assign이 성공하면 시스템 변수 sy-subrc는 0을 실패하면 4를 반환한다.

assign dobj to <fs>.

offset을 이용한 static assign

필드 일부분만을 필드심볼에 assign을 할 경우가 있다.

DATA: BEGIN OF line,
 col1(12) TYPE C VALUE 'ABCDEFGHI',
END OF line.

FIELD-SYMBOLS : <fs>.

ASSIGN line-col1+6(*) TO <fs>.
WRITE: <fs>.


ASSIGN line-col1+6(1) TO <fs>.
WRITE: <fs>.

ASSIGN line-col1+5(5) TO <fs>.
WRITE: <fs>.

ASSIGN line-col1+6(6) TO <fs>.
WRITE: <fs>.

offset사용시 가져올 글자수를 꼭 같이 명시해야함
offset이 0보다 큰 값이 할당된 경우에 필드 심볼 assing을 사용하려면 * 문자를 사용하여야 한다. 이것은 필드 심볼이 오브젝트의 길이를 넘어서는 것을 방지해준다

02-03-02. assign 구문의 동적인 사용

필드 심볼에 할당하는 필드명을 알 수 없는 경우(프로그램 내에서 동적으로 할당되는 경우)에는 동적 assign 구문을 이용한다.

DATA: gv_1 TYPE C VALUE 'A',
      gv_2 TYPE C VALUE 'B',
      gv_3 TYPE C VALUE 'C',
      gv_4 TYPE C VALUE 'D'.
DATA: gv_fname TYPE C LENGTH 10.
DATA: gv_index TYPE n.

FIELD-SYMBOLS : <fs>.

DO 4 TIMES.
   clear : gv_fname.
   gv_fname = 'GV_'.
   gv_index = sy-index.
   CONCATENATE gv_fname gv_index into gv_fname.

ASSIGN (gv_fname) TO <fs>.

WRITE : / 'gv_fname:', <fs>.

ENDDO.

assign할때 gv_fname에 괄호 붙이지 않을때
assign할때 gv_fname에 괄호 붙일때

테이블의 필드를 동적으로 assign할 경우에는 다음 구문을 이용하면 된다.

ASSIGN TABLE FIELD (dobj) TO <fs>.
REPORT  ZFIELDSYMBOL.

TABLES sflight.

DATA: gv_name1 TYPE C VALUE 'SFLIGHT-CARRID'.
DATA: gv_name2 TYPE C VALUE 'NAME1'.

FIELD-SYMBOLS <fs> TYPE ANY.

ASSIGN (gv_name1) TO <fs>.
IF sy-subrc  EQ 0.
  write: / ' suecess to find table field'.
ENDIF.

ASSIGN (gv_name2) to <fs>.
IF sy-SUBRC NE 0.
  write: / 'no sucess to find table field'.
ENDIF.

값이 할당되어있는 필드의 길이보다 더 길다는 뜻인데 (gv_name1,2 선언시 길이를 따로 할당하지 않아 생긴 이슈 같음)

REPORT  ZFIELDSYMBOL.

TABLES sflight. * 여기서 테이블을 선언한거는 선언한 테이블 내에서 아래 조건문을 돌리겠다는 뜻임

DATA: gv_name1(20) TYPE C VALUE 'SFLIGHT-CARRID'.
DATA: gv_name2(10) TYPE C VALUE 'NAME1'.

FIELD-SYMBOLS <fs> TYPE ANY.

ASSIGN TABLE FIELD (gv_name1) TO <fs>.
IF sy-subrc  EQ 0.
  write: / ' suecess to find table field'.
ENDIF.

ASSIGN TABLE FIELD (gv_name2) to <fs>.
IF sy-SUBRC NE 0.
  write: / 'no sucess to find table field'.
ENDIF.

'assign table field (gv_name1) to <fs>.'구문에서 sflight-carrid 라는 필드가 존재하므로 sy-subrc= 0 값을 반환하게 된다. 그리고 변수 gv_name2의 값이 'name1'이라는 테이블 필드가 존재하지 않으므로 시스템 변수 sy-subrc가 4를 반환한다.

02-04. 구조체의 필드를 필드 심볼에 assign

구조체의 개별 필드를 필드 심볼에 ASSIGN 할 수 있다.

다음 구문은 구조체 struc의 comp(필드)를 필드 심볼 <fs>에 할당하는 것을 보여준다.

필드 심볼 타입을 구조체로 선언한 경우나 type any로 선언한 경우에는 피드 심볼을 structure 구조로 할당할 수 있다.

comp 항목에 올 수 있는 것은 line의 순번이나 컬럼명이다.

 

ASSIGN COMPONENT comp OF STRUCTURE struc TO <fs>.
REPORT  ZFIELDSYMBOL.

DATA: BEGIN OF gs_str,
col1 TYPE Char10 VALUE 'Korea',
col2 TYPE Char10  value 'SEOUL',
col3 TYPE Char20 value 'seongnam',
END OF gs_str.

FIELD-SYMBOLS: <fs1> LIKE gs_str,
               <fs2> TYPE ANY.
ASSIGN gs_str TO <fs1>.

DO 3 TIMES.
  ASSIGN COMPONENT sy-index OF STRUCTURE <fs1> TO <fs2>.
  WRITE: <fs2>.
ENDDO.

필드 심볼 <fs1>구조는 gs_str과 같다. loop횟수를 가진 시스템 변수 sy-index를 통해 구조체 필드를 차례대로 필드 심볼에&nbsp; assign하고 있다.

REPORT  ZFIELDSYMBOL.

DATA: BEGIN OF gs_str,
col1 TYPE Char10 VALUE 'Korea',
col2 TYPE Char10  value 'SEOUL',
col3 TYPE Char20 value 'seongnam',
END OF gs_str.

DATA: gv_fname type C LENGTH 10, 
      gv_idx type n.

FIELD-SYMBOLS: <fs1> LIKE gs_str,
               <fs2> TYPE ANY.
ASSIGN gs_str TO <fs1>.

DO 3 TIMES.
*  ASSIGN COMPONENT sy-index OF STRUCTURE <fs1> TO <fs2>.
*  WRITE: <fs2>.
clear: gv_fname.
gv_idx = sy-index.
gv_fname = 'COL'.
CONCATENATE gv_fname gv_idx INTO gv_fname.

ASSIGN COMPONENT gv_fname of STRUCTURE <fs1> TO <fs2>.
WRITE: <fs2>.

ENDDO.

02-05. 필드 심볼과 casting

데이터 오브젝트를 필드심볼에 ASSIGN할 경우에, CAST를 이용해 모든 데이터 타입을 필드 심볼에 ASSIGN 할 수 있다.

'CAST'라는 영단어 뜻을 볼때 '나 자신을 버리고 새로운 틀에 맞게 변형한다'라고 해석할 수 있는데,

프로그램 용어로 CAST는 암묵적 형 변환과 명시적 형 변화 2가지로 분류되어 사용된다.

 

02-05-1.암묵적 형 변환

타입이 정해진 필드 심볼과 데이터 오브젝트 타입이 다른 경우에는 CASTONG 구문을 이용하여 ASSIGN 해야한다.

ASSIGN <var> TO <fs> CASTING.

02-05-02. 명시적 형 변환

casting type 구문을 이용해 정해진 타입으로 형 변화을 수행하는 것을 명시적 형 변화 이라고 한다.

FIEDL-SYMBOLS: <f1> TYPE ANY.
ASSIGN ADDR TO <f1> CASTING TYPE line.

03.필드 심볼과 인터널 테이블(= 필드 심볼의 동적 타입 선언과 generic type 필드 심볼)

변수와 같이 인터널 테이블도 같은 과정으로 필드 심볼에 할당하여 사용할 수 있다.

필드 심볼을 이용하여 인터널 테이블을 변경하게 되면 work area로 복사하는 과정이 생략되기 때문에 성능이 향상된다.

일반적인 파입의 필드심볼이며, 프로그램 실행 시점에 필드 심볼의 타입을 동적으로 할당하는 기술을 의미한다.

아래 구문에서 필드 심볼<fs>은 타입이 정해지지 않은 인터널 테이블로 선언되었다.(type any table)

그리고 ASSIGN 구문을 통해 인터널 테이블 itab이 필드 심볼에 할당된다.

이후 필드 심볼<fs>는 col1을 키 필드로 하는 인터널 테이블의 메모리 주소에 동적으로 연결되게 된다.

타입이 정해지지 않은 line 타입은 field-symbols<fs> type any.구문을 활용할 수 있다.

 

TYPES: BEGIN OF t_line,
	col1 TYPE C,
    col2 TYPE C,
    END OF t_line.
   
 DATA: gs_wa TYPE t_line,
 		gt_itab TYPE HASHED TABLE OF t_line WITH UNIQUE KEY col1,
        gv_key(4) TYPE C VALUE 'COL1'.
  FIELD-SYMBOL: <fs> TYPE ANY TABLE.
  ASSIGN gt_itab TO <fs>.
  READ TABLE <fs> WITH TABLE KEY (gv_key) = 'X' INTO wa.
REPORT  ZFIELDSYMBOL.
TYPES: BEGIN OF t_line,
col1 type c,
col2 type c,
END OF t_line.

DATA: gs_str TYPE t_line,
      gs_fname(4) TYPE c  VALUE 'COL1',
      gt_itab1 TYPE SORTED TABLE OF t_line WITH UNIQUE KEY col1,
      gt_itab2 TYPE HASHED TABLE OF t_line WITH UNIQUE KEY col1,
      gt_itab3 TYPE STANDARD TABLE OF t_line,
      gt_itab4 TYPE t_line OCCURS 0 WITH HEADER LINE. -> 후 필드 심볼 선언하면 assing이나 read table이 작동하지 않는다(형변화 에러 발생 -> 에러 구문 'are type-incompatible')

FIELD-SYMBOLS <fs> TYPE ANY TABLE. * 필드 심볼 선언/ 이때 TYPE ANY TABLE로 선얼되어야 필드 심볼이 인터널 테이블 역할을 수행하게 되고 필드 심볼에서 READ구문을 사용할 수 있다.
ASSIGN gt_itab1 to <fs>.

READ TABLE <fs> with TABLE KEY (gv_fname) = 'X' INTO gt_str. * 필드 심볼이 generic type으로 선언되었기 때문에 (gv_fname)을 사용하여 동적 구문을 사용해야한다.

따라서 header라인이 존재하는 인터널 테이블을 선언한 후 해당 테이블은 필드 심볼에 할당하는 경우에는 assign시 아래 구문 추가 해야한다.

ASSIGN gt_itab4[] TO <FS>.

인터널 테이블을 필드심볼에 assign할 때, 동적 할당이 가능하다.

DATA: gv_tname(10) TYPE C.
DATA: gt_itab TYPE STANDARD TABLE OF t_line.
FIELD-SYMBOLS <fs> TYPE STANDARD TABLE.

gv_tname = 'GT_ITAB'.
ASSIGN (gv_tname) TO <fs>.

04.필드 심볼과 구조체

필드 심볼을 구조체에 할당하여 사용하려면 다음 구문을 활용한다.

필드 심볼과 구조체는 즉 필드 심볼의 정적 타입과 fully type 필드 심볼 선언이다.

이것은 필드 심볼의 타입이 이미 정의되어 있으면, 필드 심볼과 기술적 정의가 같은 데이터 오브젝트만이 필드 심볼에 할당될 수 있음을 의미한다.

필드 심볼 타입을 선언하지 않으면 프로그램이 실행된 시점 이후 데이터 오브젝트가 할당되어야 필드 심볼은 내부 구조를 가지게 된다.

즉, 프로그램 소스 코드에서 ,<fs>-col1처럼 명시적으로 구조체 필드를 선언하여 사용하려면 필드 심볼 타입을 완전하게 정의해야한다.

DATA: BEGIN OF gs_line,
col1(1) TYPE C,
col2(1) TYPE C VALUE 'X',
END OF gs_line.

FIELD-SYMBOL : <fs> LIKE gs_line.
ASSING gs_line to <fs>.
MOVE <fs>-col1 TO <fs>-col2.

05. 필드 심볼 활용

05-1. 비용 구조 테이블

FIELD-SYMBOLS <fs>.
DATA: fname(10),
	sum LIKE cosp-wtg001.
    
DO 12 TIMES.
	CC = SY-INDEX.
    CONCATENATE 'cops-wtg0' CC INTO fname.
   
 ASSIGN (fname) TO <fs>.
 sum = sum +<fs>.
 CLEAR: fname, <fs>.
 ENDDO.

이거 이전에 코딩한거 참고해서 수정해봐야겠다.

필드 심볼을 사용하게 되면, modify구문으로 인터널 테이블을 변경해줄 필요가 없다.

이미 학습하였듯이 필드 심볼은 메모리에 저장된 값을 바로 변경하기 때문이다.

loop구문을 이용하여 필드 심볼에 데이터를 move 시키려면, assigning 구문을 사용한다.

필드 심볼을 활용하면 인터널 테이블을 work area로 복사하고 modify하는 과정이 생략되므로 높은 성능을 제공하게 된다.

05-2. 인터널 테이블 loop 처리

06.데이터 참조

데이터 참조는 데이터 오브젝트에 대한 포인터 이다.

포인터는 직접 접근하여 컴퓨터의 메모리를 간결하고 효율성 있게 제어하는 기능을 제공한다.

포인터 데이터 형은 다른 변수의 메모리상의 주소 번지를 갖는 데이터 형으로서

포인터를 사용하면 사용하고자 하는 대상에 직접 접근할 수 있다.

이러한 포인터를 abap 프로그램에서 유사핳게 적용한 것을 데이터 참고 라고 한다.

앞에서 필드 심볼도 포인터로 정의하였는데 데이터 참조와의 차이점은 필드 심볼은 포인터만 가지고 있으며 assign된 데이터 오브젝트의 메모리에서 작업하는 반면에,

데이터 참조는 포인터를 값으로 가지는 참조 변수이며 자신의 메모리 영역을 가지게 된다.

 

필드심볼과 데이터 참조는 abap 프로그램에서 데이터 오브젝트를 동적으로 생성하고 접근할 수 있게 한다.

다시 말해, 데이터 속성과 이름을 프로그램 실행 시점에 정의하여 데이터 오브젝트를 다양하게 활용할 수 있게 한다.

예를들어 사용자가 테이블 이름을 직접입력해서 원하는 데이터를 조회하고자 하는 상황이 발생하였다고 할때, 경웅에 따라 선택하는 스크립트를 구현하는 것은 무모하고 데이터 오브젝트를 동적으로 생성한다면 간단하게 해결 할 수 있다.

 

데이터 참조를 사용하지 않고 필드 심볼만으로 테이블 이름을 동적으로 지정하는 것은 불가능하다.

왜냐하면, 피드 심볼은 데이터 오브젝트가 생성된 후에 assign이 가능하기 때문이다.

그러나 데이터 참조를 사용하면, CREATE DATA dref TYPE (p_tname). 구문과 같이 데이터 오브젝트 자체를 프로그램 실행 도중에 동적으로 생성하게 된다.

이 경우를 프로그램 용어로 재해석 하면 다음과 같다.

필드 심볼은 데이터 오브젝트에 담겨 있는 메모리 저장소에서 작업을 한다.

즉 필드 심볼은 데이터 오브젝트의 또 다른 상징적인 이름이다. 

데이터 참조는 자신의 메모리 저장소를 가지는 독립적인 오브젝트로서 데이터 참조를 변수값으로 저장하고 있다.

데이터 참조 (출처: 이지아밥2)

PARAMETERS: p_tname(30) DEFAULT 'SFLIGHT'.
DATA: dref TYPE REF TO data.

FIELD-SYMBOLS : <fs1> TYPE ANY, <fs2> TYPE ANY.

CREATE DATA dref TYPE(p_tname).
ASSIGN dref -> * TO <fs1>.

SELECT * FROM (p_tname) INTO <fs1> UP TO 3 ROWS.

DO
	ASSIGN COMPONENT sy-index OF STRUCTURE <fs1> TO <FS2>.
    IF sy-subrc NE 0.
    	SKIP.
        EXIT.
    ENDIF.
    WRITE: <fs2>.
ENDDO.
ENDSELECT.

 

06-01. 참조 변수

일반 변수(Data variable)가 변수값을 저장하는 메모리 방이라고 하면,

참조 변수는 메모리 방의 주솟값을 저장하는 변수라고 할 수 있다.

참조 변수에 저장된 항목은 abap 프로그램에서 보이지 않는다.

abap은 데이터 참조를 가지로 있을뿐이다.

이러한 이유때문에 참조 변수가 가리키는 값에 접근하려면 반드시 피드 심볼을 이용해야 한다.

  • 데이터 참조 타입 생성
TYPES t_dref TYPE REF TO DATA.

 

  •  참조 변수 생성
DATA dref TYPE REF TO t_dref.
DATA dref TYPE REF TO DATA.

 

  • POINT(오브젝트에 연결)
CREATE DATA dref {TYPE type} | {LIKE dodj}.

참조 변수는 elementary data type과 같은 오브젝트와 동일하게 사용된다.

즉, 참조 변수는 구조체, 인터널 테이블, 필드의 항목으로 사용 될 수 있다.

위 구문까지 선언된 dref는 아직 오브젝트에 연결(point)되지 않은 상태이므로 사용할 수가 없다.

CREATE DATA dref TYPE SFLIGHT와 같은 구문을 선언하여, 참조 변수가 데이터 오브젝트에 연결되도록 해야한다.

06-02. 역참조

역참조(dereference)는 프로그래밍 언어에서 프로그램 포인터가 가리키는 번지에 저장된 데이터에 접근하는 것으로 정의된다.

즉, 데이터 참조가 가리키는 데이터 오브젝트의 변수값에 접근하려면 dereference과정(=필드 심볼에 assign)을 거쳐야 한다.

필드심볼의 casting 기능도 동일하게 사용할 수 있다.

ASSIGN dref ->* TO <fs> [CASTING ...].

CASTING을 사용하여 참조 변수를 필드 심볼에 ASSIGN한다는 것은 동적으로 생성된 데이터 오브젝트의 값에 접근할 때 필드 심볼의 데이터 타입을 참고하게 된다는 의미이다.

Derefernce(assign)가 성공하게 되면 sy-subrc변수는 0을 실패하면 4를 반환한다.

(' ->*  ' 기호는 dereference operator 라고 한다.)