SAP/ABAP 기초

(ABAP) AT FIRST, AT NEW, AT END OF, AT LAST 정리

haramang 2021. 6. 13. 16:18

문바이님 블로그에서 퍼온 자료입니다.

https://blog.daum.net/rightvoice/338

 

Loop 내의 Event(at first, at last, etc)에 대해서 알아보자.

LOOP.  AT FIRST.  AT NEW qmata.  AT END OF qmat.  At LAST. EndLoop. 이런 명령 왜 필요한가? 모두가 알다시피 SAP는 1970년대 부터 개발되어 사용되어진 프로그램 이다. 그때 당시에는 GUI라는 개념이 없..

blog.daum.net

 

 

LOOP.

   AT FIRST.

   AT NEW qmata.

   AT END OF qmat.

   At LAST.

EndLoop.

 

이런 명령 왜 필요한가?

모두가 알다시피 SAP는 1970년대 부터 개발되어 사용되어진 프로그램 이다.

그때 당시에는 GUI라는 개념이 없었기 때문에 모든 화면은 SCREEN이라는 Cursor가 깜박이는 화면을 사용하였다.

초기 MS-DOS처럼 화면을 ASCII코드를 통해 그려야 했다.

ERP에서 가장 많이 사용하는 것은 Table형태의 표를 보여주는 것인데, 

표를 그리다 보면 항상 [Column Header]를 그리고, 중간에 그룹별 [중간합계]를 표시해 주고 가장 마지막에는 [총합계]를 표시해 주는 일이 가장 흔하게 사용되는 방법이었다. 

그때 당시 사용하던 대표적인 명령이 Loop ~ EndLoop를 통해 itab의 내용을 Write명령으로 출력해주는 것이었다.

LOOP.

   AT FIRST. 

       "표의 Column Header를 출력해주고, 작업시작전 초기화 작업을 수행한다.

   ENDAT.

 

   AT NEW qmata.

      "[그룹]의 시작점에 초기화 작업을 수행한다.

   ENDAT.

 

   AT END OF qmata.

      "[그룹]의 마지막 시점에 중간합계를 출력해 준다.

   ENDAT.

 

   At LAST.

      "표의 마지막에 총합계[Grand Total]을 출력해 준다.

   ENDAT.

 

EndLoop.

이러한 Event를 통해 Write명령으로 위와 같은 이미지를 쉽게 그릴 수 있다.

 

 

 

 

 

 

Loop at Event 정리표.  

[이것은 key로 sort된 상태에서 동작하므로] 사용상의 주의가 필요한다.
(Sort가 되었다 하더라도, 정렬된 항목이 여러 개인 경우 정상동작하지 안할수 있으므로 항시 사용전 체크가 필요하다 )

 

QMATA LIFNR Event (qmata) Event (lifnr) Event
        At First
DQM010 1002647 at new qmata at new lifnr  
DQM010 1002647   at end of lifnr  
DQM010 1002981   at new lifnr  
DQM010 1002981      
DQM010 1002981      
DQM010 1002981   at end of lifnr  
DQM010 1003988   at new lifnr  
DQM010 1003988   at end of lifnr  
DQM010 1081096   at new lifnr  
DQM010 1081096   at end of lifnr  
DQM010 1081658   at new lifnr, at end of lifnr  
DQM010 1083591   at new lifnr, at end of lifnr  
DQM010 1090769 at end qmata at new lifnr, at end of lifnr  
DQM040 1000550 at new qmata at new lifnr  
DQM040 1000550   at end of lifnr  
DQM040 1087400 at end qmata at new lifnr, at end of lifnr  
        AT Last

 

[At New]대신에  [on change of]를 사용하는 것이 더 유리할 수도 있다. [on change of는 폐기된 유형임] 
 
AT NEW LIFNR. 
  "itab에 있는 qmarta & lifnr이 변경될 때 자동으로 호출되므로, itab의 문자열 데이터의 정렬순서가 매우 중요하다 
EndAt 
 

 

 

Loop의 Event를 사용하지 않고 변경점의 처리방법. 

( Loop Event가 믿음이 가지 않을 때 사용한다. )


   "최초값을 읽어들인다. 이를 통해 과거의 값을 비교대상 structure에 저장한다.  
   "이때 Loop를 통해 가공되야할 데이터의 초기값도 넣어주어야 한다.  
   MOVE-CORRESPONDING ls_lifnr to ls_input.  
   READ TABLE lt_itab into ls_before INDEX 1.  
  
   loop at lt_itab into ls_itab.  
      lv_idx sy-tabix.  
  
  
"Lifnr가 값이 변경될때 자동으로 Row를 삽입해 준다. 

"[최초에는 다를수 없으나, 만약을 대비해서 > 1 조건을 넣어준다.  
      if ls_itab-lifnr <> ls_before-lifnr  and lv_idx > .  
          "지금까지 가공된 ls_input의 내용을 lt_input에 반영한다.  
          append ls_input to lt_input.  
  
          "ls_input에 초치값을 넣어준다.  
          MOVE-CORRESPONDING ls_lifnr to ls_input.  
          CLEAR ls_input.  
  
          "before값에 지금현재의 값을 넣어준다.  
          MOVE-CORRESPONDING ls_itab to ls_before.  
      endif.  
  
  
      "Lifnr값이 동일한 항목끼리 처리해야될 루틴을 넣어준다.  
      ls_input-idx ls_input-idx + 1.  
  
   Endloop.  
  
  
   "마지막 수치를 넣어준다.-------------------------------  
   if lv_idx lineslt_itab ).  
      "마지막 정리내역을 Append해 준다.  
       append ls_input to lt_input.  
   endif.