본문 바로가기
ERP-SAP/ABAP

<abap> 필드심볼 사용법과 실전코딩에서 사용하는 이유

by 행복한워니의 기록 2023. 9. 18.
728x90
반응형

일반적인 사용법에 대한 부분은 일반 data 선언하고 별 차이가 없다. 
그러나 코딩에서 동적활용을 하려면 (동적인 db명, 동적인 스트럭쳐명) 필드심볼 활용을 잘 해야 한다.
 
이 부분은 내 티스토리 abap에 동적활용 예시에 코딩을 해두었다. 
 
우선 예시 전에 동적활용을 하지 않는데도 필드심볼을 쓰는 이유부터 밝히겠다. 
 
hana 가 도입되기 전에 쿼리를 날릴때 db에 적게 다녀오는게 포인트였다. 
즉 loop 안에 select 를 넣거나 read 를 하며 DB 생성변경삭제 등등 원하는 행위를 하는 것 보다
한번에 전부 ITAB  에 담아두고 처리하는 방식이 훨씬 빨랐다. 
(가끔 대량으로 ITAB에 담아 덤프나는 경우는 제외하고... 일반적인 경우..)
 
그때 LOOP AT ITAB INTO STRUCTURE. 보다
 LOOP AT ITAB ASSIGN <FS>. 가 속도가 조금 더 빨랐고.
필드심볼을 쓰면 LOOP 내에서 값을  MODIFY 를 할 필요가 없다. 
 
예시를 들면 스트럭쳐에 담아 처리할 경우..
LOOP AT LT_BKPF INTO LS_BKPF. (스트럭쳐)
 
,,,(중간 코딩)
LS_BKPF-BKTXT = '1234567'. (뭔가 값을 바꿈)
 
MODIFY LT_BKPF FROM LS_BKPF INDEX SY-TABIX    <--- 이런 부분을 만들어줘야 한다. 
ENDLOOP. 
 
 
그러나 필드심볼은 저 ,MODIFY 부분이 없어도 된다. 왜?
값을 어디다 담고 있는 것이 아니라 그냥 원래 있는 값을 가리키고 있는 것이라...
LOOP AT LT_BKPF ASSIGN <FS_BKPF>.
,,,(중간 코딩)
FS_BKPF>.-BKTXT = '1234567'. (값을 바꿈)
ENDLOOP. 
 
이렇게 간단해지고 속도도 빨라지기에 LOOP 처리할때 필드심볼을 쓰면 좋다.
 
동적활용에서는 뭐 당연히 필드심볼을 쓸 수 밖에 없다....
아래 예시를 써봐야겠다. 
 
  1. ASSIGN f TO <fs>.
      단순히 field f의 값을 <fs>가 가리키도록 한다.
 
  2. ASSIGN (f) TO <fs>.
      동적 field를 이용한것인데 field f안의 값을 또 field명으로 보고 그 field의 값
      을 <fs>가 가리키도록 한다.
 
  3. ASSIGN TABLE FIELD (f) TO <fs>.
      2와 같은 경우이나 f 의 값이 table의 field명 일때 그 table field의 값을 
      <fs>가 가리키도록 한다.
 
  4. ASSIGN LOCAL COPY OF MAIN TABLE FIELD (f) TO <fs>.
      3와 같은 경우이나 tables로 선언된 main program의 table field값을 
      <fs>가 가리키는 것이 아니라 값만 복사 하여 사용하기 때문에 변경할 수 없다. 
 
  5. ASSIGN COMPONENT idx OF STRUCTURE rec TO <fs>.
      structure의 구성요소 순서를 idx에서 읽어 그 순서에 위치한 구성요소의 값을
      <fs>에 할당한다. 
 
  6. ASSIGN COMPONENT name OF STRUCTURE rec TO <fs>.
      structure의 구성요소명(field명)을 name에서 읽어 그 구성요소의 값을
      <fs>에 할당한다. 
 
  5번을 제외한 모든 경우는 field명을 사용하는 것이라서 field명에 규칙이 없으면  
  coding line 줄이는데 효과를 보지 못한다.  

4번의 경우  실제 써본적이 없다. 
 
5번활용이 생각보다 매우 많으니 이 부분을 가지고 참고했으면 한다. 
 
예제)
 FIELD-SYMBOLS : <FS1>, <FS2>.
 DATA:IDX1 LIKE SY-INDEX.     
 
 DATA: BEGIN OF ITAB1 OCCURS 0,
        CCYYMM(8),
        WERKS LIKE MARD-WERKS,
        MATNR LIKE MARD-MATNR,
        LABST LIKE MARD-LABST,
        UMLME LIKE MARD-UMLME,
        INSME LIKE MARD-INSME,
        EINME LIKE MARD-EINME,
        SPEME LIKE MARD-SPEME,
        RETME LIKE MARD-RETME,
        VMLAB LIKE MARD-VMLAB,
        VMUML LIKE MARD-VMUML,
        VMINS LIKE MARD-VMINS,
        VMEIN LIKE MARD-VMEIN,
        VMSPE LIKE MARD-VMSPE,
        VMRET LIKE MARD-VMRET,
      END OF ITAB1.
 
 DATA: ITAB2 LIKE ITAB1 OCCURS 0 WITH HEADER LINE.  
 

경우1) FIELD-SYMBOL 사용하지 않았을 경우
 
 LOOP AT ITAB1.
    READ TABLE ITAB2 WITH KEY CCYYMM = ITAB1-PERIOD
                              WERKS  = ITAB1-WERKS
                              MATNR  = ITAB1-MATNR
                              BINARY SEARCH.
 
    IF SY-SUBRC <> 0. 
      WRITE : / 'Not found in ITAB2 : ',
                 ITAB1-CCYYMM,
                 ITAB1-WERKS,
                 ITAB1-MATNR.                 
    ELSE.
        IF ITAB1-LABST <> ITAB2-LABST.
          WRITE : / SY-INDEX,
                    ITAB2-CCYYMM,
                    ITAB2-WERKS,
                    ITAB2-MATNR,
                    ITAB1-LABST,
                    ITAB2-LABST.
        ENDIF.
 
        IF ITAB1-UMLME <> ITAB2-UMLME.
          WRITE : / SY-INDEX,
                    ITAB2-CCYYMM,
                    ITAB2-WERKS,
                    ITAB2-MATNR,
                    ITAB1-UMLME,
                    ITAB2-UMLME.
        ENDIF.
      
 
        .............. 12번 반복 ........
 

    ENDIF.
 ENDLOOP.
 
경우2) FIELD-SYMBOL 사용했을 경우
 
 LOOP AT ITAB1.
    READ TABLE ITAB2 WITH KEY CCYYMM = ITAB1-PERIOD
                              WERKS  = ITAB1-WERKS
                              MATNR  = ITAB1-MATNR
                              BINARY SEARCH.
 
    IF SY-SUBRC <> 0. 
      WRITE : / 'Not found in ITAB2 : ',
                 ITAB1-CCYYMM,
                 ITAB1-WERKS,
                 ITAB1-MATNR.                 
    ELSE.
 
      IDX1 = 3.
     
      DO 12 TIMES.
        IDX1 = IDX1 + 1.
        ASSIGN COMPONENT IDX1  OF STRUCTURE ITAB1 TO <FS1>.
        ASSIGN COMPONENT IDX1  OF STRUCTURE ITAB2 TO <FS2>.
 
        IF <FS1> <> <FS2>.
          WRITE : / SY-INDEX,
                    ITAB2-CCYYMM,
                    ITAB2-WERKS,
                    ITAB2-MATNR,
                    <FS1>,
                    <FS2>.
        ENDIF.
      ENDDO.
    ENDIF.
 ENDLOOP.
 

728x90
반응형