반응형

    Internal table의 기본 사용방법은 어느 정도 정리가 된 것 같습니다. 이번에는 Internal table 데이터 처리에 사용되는 유용한 구문들을 살펴보겠습니다. 첫 번째로 AT구문입니다.

     

    LOOP는 데이터에 전체를 순차적으로 접근하는 방식입니다. 좀 더 편리한 사용을 위해서 LOOP의 처음에 또는 특정 필드 값이 변하면과 같은 이벤트성의 Processing 구문인 AT이 있습니다. 

     

    원어로는 Control level processing이라 부르며 정의한 필드들을 그룹화한 계층구조로 만들어 처리하려는 의도입니다.

    말은 어려운데.. 프로그램상에서 3번째 필드까지를 사용하여 AT 구문을 쓰겠다 정의를 하였다면 1,2,3 필드를 오름차순 정렬을 하여 1->2->3 필드가 계층구조를 이룬 상태로 사용하여야 한다란 말이겠습니다.

     

    즉 원하는 필드 포함 앞의 필드까지 Sorting이 되어있어야 한다는 겁니다.

     

    1) AT 기본 구문

    구문이 위치할 곳을 봅시다.

    i)  AT FIRST ~ ENDAT.

    LOOP의 첫 번째로 수행될 때 발생하는 이벤트입니다.  

    ii) AT NEW 필드명 ~ ENDAT.

    해당 필드 포함 앞 필드의 값이 변경될 때마다 일어나는 이벤트입니다.

    iii) AT END OF 필드명 ~ ENDAT.

    해당 필드 포함 앞 필드의 값이 변경되기 전 마지막 데이터에서 일어납니다.

    iv) AT LAST ~ ENDAT.

    LOOP의 마지막 수행 시 발생되는 이벤트입니다.

     

    LT_STAND2의 MATNR 필드에 아래와 같은 데이터가 들어있다 예를 들어 보겠습니다.

    우측 SEQ는 이벤트가 일어난 순서입니다. MATKL 앞 필드인 MATNR까지 포함하여 5종류의 묶음이 가능합니다.

    그러므로 AT NEW와 AT END OF가 5번 반복이 되고 AT FIRST와 AT LAST 가 최초와 최후에 한번 발생함을 알 수 있습니다.

     

    하지만 이상하게도 각 이벤트에 디버깅을 잡고 Work Area값을 보면 MATKL필드 뒤의 CHAR필드는 모두 *로 마스킹되어 있음을 알 수 있습니다. 좌측은 AT FIRST와 AT LAST 우측은 AT NEW와 AT END OF 일 때이다.

    AT NEW 나 AT FIRST 안에서 정렬 필드 뒤인 MEINS필드의 값을 읽어 사용하려면 Work Area에 값이 없을 것입니다.

    이런 것을 방지하려면 LOOP 바로 밑에서 다른 Work Area에 값을 받아 사용하도록 합시다.

    AT의 사용빈도는 그리 많지는 않습니다. 반복적인 작업 예를 들어 자재의 자재명을 읽어야 하는데 동일 자재가 많으면 LOOP안에서 계속 읽을 필요 없이 AT NEW에서 한번 읽어 변수에 넣어 사용할 수도 있습니다. 

     

    이런 구문은 ALV Gride와 같은 컴포넌트가 나오기 전에 WRITE문으로 화면에 데이터를 출력하고자 할때 사용하던, 제목 줄은 한 번만 찍고(AT FIRST ) 구조화된(정렬된) 첫 번째 필드 관련 데이터를 찍고.... 다시 그것을 프린터( Dot Printer)로 출력하기 위한 오래된 구문입니다.

     

    아 이런 편리한 기능이 있네하고 사용하다 왠지 어색한 구조를 보고 이상함을 느끼기는 했습니다. 의도를 생각지 않고 보면 오래된 것과 현재의 필요성은 닮아 있나 봅니다.

     

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

    728x90
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기