밥린이의 아밥TIP

[율밥퍼] ABAP 필드심볼 - FIELDSYMBOL 3 (Feat. 역참조)

율밥퍼 2023. 9. 3. 21:16

 

 

냐하하~~

 

또 이러다가 언제 업뎃할지 모르겠지만..

시간날때 업뎃해야지..

 

나의 동기들에게 많은 요청을 받았ㄸ ㅏ.

 

역참조에 대해서 알려달라구.

 

어느순간 동기들 사이에서 필드심볼 박사가 되어버린 ㄴ ㅏ.

 

ㅋㅋㅋ

 

앞서서 1탄과 2탄의 필드심볼 강의가 이어졌다.

 

이제서야 다들~~~ 기다리던 역참조를 알려주고자 한당.

 

일단 1탄 2탄 궁금하면 보고 오세용.

 

  1. 필드심볼 기초 https://yulbaper.tistory.com/3

   2. 필드심볼 심화 https://yulbaper.tistory.com/4

 

 

여기 적어놓은것만 봐도 

자칭.. 필심 마스터가 될 수 있을듯?

 

 

 

 

역참조

이것까지 알 필요 없다고 쓸일 없다고 하는 이야기를 들었당.

그래도 알아두면 유용하니 블로그에 작성해 두려한다.

 

 

 

나는 예전 교육생 시절. 

모듈화에 미쳐있었다.

 

어떻게 하면 하나의 퍼폼문으로 공통되게 쓸 수 있을 까 고민을 많이 했던 것 같다.

내가 역참조에 대해 공부하게 된 계기가.

 

두 개의 서로 다른 구조를 가진 테이블이 있었다.

두 개의 다른 구조를 가진 테이블이지만 엑셀 업로드를 통해

데이터를 ALV를 띄워줘야했당.

 

구조는 다르지만 

ALSM_EXCEL_TO_INTRERNAL_TABLE펑션을 이용해

가져온 엑셀 데이터를

ALV에 띄우기 좋게 테이블로 데이터를 옮겨주는 작업을 해야하는데

 

코드는 똑같지만 

테이블이 달라 퍼폼문을 두개 만들어야 했던 상황이었다.

 

나는 이것이 굉장ㅎㅣ 불편했다.

 

그때는 ECC여서 뉴신텍스가 안먹혔다..

지금이야 뭐 PERFORM문 PARAMETER로 테이블 받아서 LOOP문에 DATA바로 선언해서

WORK AREA 만들어서 써도 되고,,, ASSIGNING 해도 가능하지만..

 

초보였던 나는 아주아주 고민하며 테이블을 동적으로 받아와서 쓰자는 기특한 생각을 했다

(지금 생각하면 그때의 나는 돌아돌아 돌아에몽임)

 

 

 

(아무말 대잔치)

 


그니깐 코드는 같지만 동적으로 테이블을 받아와야 하는 상황에서 역참조는 엄청 유용할 것 같다..

 

일단 역참조에 대해 설명하기 전에 알아야할 

구문이 있다.

 

바로 

 

  1. CREATE DATA

 

CREATE DATA는 객체를 참조할 수 있는 변수를 선언하는 오브젝트를 생성하는 구문이라고 할 수 있다..

말이 어렵지..

 

편하게 생각한다면~~ 동적으로 뭘 담는다거나.. 동적으로 뭘 한다거나.. 동적.. 동... 動..암튼

 

 

막 동적으로 뭘 할때,

어떤 타입이든 올 수있도록 변수?를 셋팅?해주는 작업이라고 생각하면 좋을듯?????

 

일단 CREATE DATA를 하기 위해선

DATA를 참조하는 변수를 선언해주어야한당..

 

읭 싶지?

 

요렇게 하면된다.

일단 동적인 테이블 혹은 스트럭쳐를 따라갈 수 있는 

변수를 선언해주고~

 

동적으로 타입을 가지는 변수를 CREATE 해준다고 

이해하면 될 것 같당.

(참조변수를 이용해 데이터 객체를 만드는 것이당!)

 

내가 LS_ALV를 PT_ALV의 STRUCTURE 타입으루 쓸거라고 했당.

 

(여기서 PT_ALV는 서브루틴으로 받아오는 

테이블이당.

동적으로 서로 다른 테이블을 받아올거당.)

 

 

 

정리를 하자면!!!!!!!!!!!!!!!!!


1. 참조변수 선언

DATA : LS_ALV TYPE REF TO DATA.

 

2. 참조객체 만들기

CREATE DATA LS_ALV LIKE LINE OF PT_TABLE


여기서 중요한거!!!!!!!!!!!!!!!!

참조변수와 참조객체는 이름이 같아야 한다.

잊지마시길.

(LS_ALV 말하는거 ㅎㅎ)

 

 

 

 

 

이렇게 하면 일단 준비 는 끝.

 

그러고나서 나는 필드심볼을 이용해 역참조를 해줬다.

 

근데 필드심볼을 사용하기 전에 일단 필드심볼을 선언해주고.. 총총..

 

역참조 연산자(->*)를 사용해 ASSIGN 시켜준당

 

(여기서 내가 선언한 <FS_S_ALV>는 어느 타입이든 가능하도록 TYPE을 ANY로 선언해 두었당 ㅎㅎ)

 

그 다음 ASSIGN을 시켜주면 되는데!

거기에 역참조 연산자를 사용해 주면 된다!

 

LS_ALV는 내가 아까 CREATE ALV를 하면서 동적으로 받아오는 서브루틴의 PT_TABLE의 라인타입을 따라간당!

 

요렇게하면 동적인 스트럭쳐를 사용할 수 있다

 

 

굿 잘했어요..

 DATA : BEGIN OF LS_TABLE1,
           DMBTR TYPE DMBTR,
         END OF LS_TABLE1,
         LT_TABLE1 LIKE TABLE OF LS_TABLE1,

         BEGIN OF LS_TABLE2,
           MATNR TYPE MATNR,
         END OF LS_TABLE2,
         LT_TABLE2 LIKE TABLE OF LS_TABLE2.

  PERFORM WRITE USING : LT_TABLE1,
                        LT_TABLE2.

*&---------------------------------------------------------------------*
*& Form WRITE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM WRITE  USING PT_TABLE TYPE STANDARD TABLE.

  DATA : LT_TABLE TYPE REF TO DATA.

  CREATE DATA LT_TABLE LIKE PT_TABLE.

  FIELD-SYMBOLS <FS_T_TABLE> TYPE STANDARD TABLE.

  ASSIGN LT_TABLE->* TO <FS_T_TABLE>.

  LOOP AT <FS_T_TABLE> INTO DATA(LS_TABLE).
(생략)
  ENDLOOP.

ENDFORM.
 

이런식으로 하나의 퍼폼문이고 내부에 사용하는 로직은 같지만,

테이블이나 스트럭쳐 등등 타입을 정확히 선언해 주지 않으면 

서브루틴이 안먹히는 경우들이 있다.

 

이럴때 사용해주면 굉장히 편합니당.

 

 

암튼 이때 공부한걸 기초로 더욱(?) 풍부한

나의 ABAP지식이 만들어(?)져 가고있다..

 

나중에 기억안나면 나도 보러와야딩 히히

 

서러웠던 나의 주니어 시절을 잊지 않겠다……

다 기억할거야