(ABAP) AT FIRST, AT NEW, AT END OF, AT LAST 정리
문바이님 블로그에서 퍼온 자료입니다.
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 > 1 .
"지금까지 가공된 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 = lines( lt_itab ).
"마지막 정리내역을 Append해 준다.
append ls_input to lt_input.
endif.