본문 바로가기
SAP/ABAP - Util

ABAP 구문 - AT에 대하여(FIRST, NEW, END OF, LAST)

by Hkun 2022. 12. 15.
반응형

AT 구문에 대하여...

오늘은 ABAP구문 중에 AT에 대해서 알아 보겠습니다. AT은 BAPI 쓰는 구간에서도 꼭 한번씩 등장 하는 구문으로 잘 모르고 사용시에는 예상과는 다른 결과값을 보여서 고생을 하게 되는 구문입니다. F1을 누르면 그래도 설명이 잘 나와 있기는 하지만 우리는 영어와 친하지 않아서 이 곳에 오신 거겠죠? 

 

아무튼 거두절미 하고 AT 구문에 대해서 알아 보겠습니다.

 

AT은 Internal table에 사용되는 구문으로, 첫 시작, 끝, 그리고 특정 필드가 변경 되었을때 AT과 EDDAT 사이에 들어 오게 됩니다.

AT은 기본적으로 사용하려는 조건에 맞게 인터널 테이블을 구성해야 합니다. 이게 무슨 말이냐 하면, AT은 기본적으로 CHAR, NUMC 즉  TEXT 기반의 값이 변경되었을때 수행되며 NEW 또는 END OF 구성시에 사용되는 필드 기준으로 구조체의 필드들을 나열 했을때 앞 순서에 있는 필드들이 하나라도 변경 되면 수행됩니다. 그렇기 때문에 구성에 맞게 SORT가 반드시 선행 되어야 합니다.

 

아래 처럼 특정 인터널 테이블의 선언이 아래 되어 있다면 NEW, END OF 필드 구성을 CHARG로 한 경우에는 1,2,3 중에 하나라도 값이 변경되면 타게 됩니다. 단순히 CHARG값 만 가지고 변경 되지 않았는데 "왜 수행되는가" 라고 생각 할 수 있습니다. 

1 WERKS
2 MATNR
3 LGORT
4 CHARG

아래 결과 값을 보면서 FIRST 부터 LAST까지 어떻게 진행 되는지 이야기 해보도록 하겠습니다.

 

DATA : BEGIN OF LT_MCHB OCCURS 0,
         WERKS TYPE MCHB-WERKS,
         MATNR TYPE MCHB-MATNR,
         LGORT TYPE MCHB-LGORT,
         CHARG TYPE MCHB-CHARG,
         CLABS TYPE MCHB-CLABS,
       END OF LT_MCHB.

*-- SET DATA
LT_MCHB[] = VALUE #(

( WERKS = '1001' MATNR = 'MATERIAL_001' LGORT = 'L001' CHARG = 'BATCH' CLABS = 15 )
( WERKS = '1001' MATNR = 'MATERIAL_001' LGORT = 'L002' CHARG = 'BATCH' CLABS = 22 )
( WERKS = '1001' MATNR = 'MATERIAL_001' LGORT = 'L003' CHARG = 'BATCH' CLABS = 109 )
( WERKS = '1001' MATNR = 'MATERIAL_001' LGORT = 'L004' CHARG = 'BATCH' CLABS = 32 )
( WERKS = '1002' MATNR = 'MATERIAL_001' LGORT = 'L001' CHARG = 'BATCH' CLABS = 5000 )
( WERKS = '1002' MATNR = 'MATERIAL_002' LGORT = 'L001' CHARG = 'BATCH' CLABS = 4239 )
( WERKS = '1003' MATNR = 'MATERIAL_005' LGORT = 'L001' CHARG = 'BATCH' CLABS = 807 )
( WERKS = '1004' MATNR = 'MATERIAL_003' LGORT = 'L001' CHARG = 'BATCH1' CLABS = 500 )
( WERKS = '1004' MATNR = 'MATERIAL_003' LGORT = 'L001' CHARG = 'BATCH2' CLABS = 9876 )
( WERKS = '1004' MATNR = 'MATERIAL_003' LGORT = 'L001' CHARG = 'BATCH3' CLABS = 12345 )

).

ULINE.
WRITE : / 'Total Line : ', SY-TABIX.

ULINE.

*-- Write AT

LOOP AT LT_MCHB.

  AT FIRST.
    WRITE : / 'FIRST', LT_MCHB-WERKS, LT_MCHB-MATNR, LT_MCHB-LGORT, LT_MCHB-CHARG, LT_MCHB-CLABS.
    WRITE : / 'AT FIRST SY-TABIX : ', SY-TABIX.
  ENDAT.

  AT NEW WERKS.
    WRITE : / 'New WERKS', LT_MCHB-WERKS, LT_MCHB-MATNR, LT_MCHB-LGORT, LT_MCHB-CHARG, LT_MCHB-CLABS.
    WRITE : / 'New Werks SY-TABIX : ', SY-TABIX.
  ENDAT.

  AT NEW MATNR.
    WRITE : / 'New MATNR', LT_MCHB-WERKS, LT_MCHB-MATNR, LT_MCHB-LGORT, LT_MCHB-CHARG, LT_MCHB-CLABS.
    WRITE : / 'New MATNR SY-TABIX : ', SY-TABIX.
  ENDAT.

  AT NEW LGORT.
    WRITE : / 'New LGORT', LT_MCHB-WERKS, LT_MCHB-MATNR, LT_MCHB-LGORT, LT_MCHB-CHARG, LT_MCHB-CLABS.
    WRITE : / 'New LGORT SY-TABIX : ', SY-TABIX.
  ENDAT.

  AT END OF WERKS.
    WRITE : / 'END WERKS', LT_MCHB-WERKS, LT_MCHB-MATNR, LT_MCHB-LGORT, LT_MCHB-CHARG, LT_MCHB-CLABS.
    WRITE : / 'END Werks SY-TABIX : ', SY-TABIX.
    WRITE : /.
  ENDAT.


  AT LAST.
    WRITE : / 'LAST', LT_MCHB-WERKS, LT_MCHB-MATNR, LT_MCHB-LGORT, LT_MCHB-CHARG, LT_MCHB-CLABS.
    WRITE : / 'AT LAST SY-TABIX : ', SY-TABIX.
  ENDAT.
ENDLOOP.

 

1. AT FIRST

AT FIRST의 경우에는 Internal Table에서 첫번째 루프를 돌때 수행됩니다. (SY-TABIX) = 1 

이때 WorkArea에는 아무 값도 없이 *** 만 보이게 됩니다.

 

2. AT NEW (Field name)

위 설명에서도 언급 했지만, 지정한 필드 기준으로 자신까지 변경 사항이 있을 경우 수행됩니다.

WorkArea에서도 순서에 따라서 보이는 필드가 달라지게 됩니다. 예를들어 WERKS 수행중에는 WERKS만 보이고, MATNR 수행때는 WERKS, MATNR이 둘다 보이게 됩니다.

AT NEW시에 WorkArea에 **와 **아닌 값

 

3. AT END OF (Field name)

AT NEW와 동일한 방법으로 수행되지만 지정한 필드 기준으로 새로운 변경 사항이 나오기 직전에 호출됩니다.

END OF WERKS

위 그림처럼 새로운 플랜트 1002가 나오기 직전에 호출됩니다. 보통 BAPI 쓸때 PR(EBAN)으로 PO(EKKO)를 만든다고 할때 PR 번호가 종료 될때(여러 아이템 들을 아이템 인터널 테이블에 담고) END OF BANFN. 에서 BAPI 수행 구문을 넣도록 이런식으로 많이 쓰게 됩니다.

 

4. LAST

AT FIRST와 비슷하게 호출되고 Internal table의 마지막 라인이 시작 될때 호출됩니다.

 

5. SUM

추가로 잘 쓰지는 않지만 END OF, LAST에서 SUM 기능을 사용 할 수 있습니다. 

이 기능을 쓰게 되면 만약에 위 END OF WERKS 캡쳐 화면에서 플랜트 1001에 해당하는 SUB TOTAL값을 얻을 수 있습니다.

아래 소스를 보게 되면 END OF (field). 다음에 SUM. 구문을 이용하는데 이 아래에서는 sum된 값이 들어와서 Collect가 아닌 Append만 사용해도 Collect와 결과가 같음을 알 수 있습니다. 

*-- AT SUM
LOOP AT LT_MCHB.

  AT END OF WERKS.
    WRITE : / 'END WERKS', LT_MCHB-WERKS.
    WRITE : /.

    SUM.
    CLEAR LT_SUM_WERKS.
    LT_SUM_WERKS-WERKS = LT_MCHB-WERKS.
    LT_SUM_WERKS-CLABS = LT_MCHB-CLABS.
    APPEND LT_SUM_WERKS.

  ENDAT.

ENDLOOP.

*-- Collect 
LOOP AT LT_MCHB.

  CLEAR LT_SUM_WERKS2.
  LT_SUM_WERKS2-WERKS = LT_MCHB-WERKS.
  LT_SUM_WERKS2-CLABS = LT_MCHB-CLABS.
  COLLECT LT_SUM_WERKS2.

ENDLOOP.

 

AT SUM vs Collect

 

긴 글 읽어 주셔서 감사합니다.

반응형

'SAP > ABAP - Util' 카테고리의 다른 글

Internet Service Transaction Setting  (0) 2015.08.26
EXCEL 양식 출력시 행 고정  (0) 2015.08.19
현재 실행중인 Function Name  (0) 2015.07.17
SELECT-OPTIONS -> SQL WHERE 절로 변환  (0) 2015.07.17
ABAP TOTAL 구하기  (0) 2015.07.15

댓글