본문 바로가기
ERP-SAP/ABAP

<ABAP> AT NEW, SUM, AT END, AT FIRST, AT LAST

by 행복한워니의 기록 2011. 6. 15.
728x90
반응형
3-1. internal table을 read할 때 발생하는 event 

AT NEW f : internal table 을 읽을 때 특정 필드의 값이 새롭게 바뀔 때 발생 
SUM => 이후의 다른 필드가 나오기 전까지의 값을 모두 SUM 


AT END OF f : internal table 을 읽을 때 특정 필드의 값을마지막으로 읽을 때 발생
SUM => 이전의 모든 동일 필드의 값을 모두 SUM,즉 SUM함수의 결과값은AT NEW f 이벤트에서 사용한sum과 동일하다. 
다만 이벤트의 발생시점만 다르다. Sum 의 결과값은internal table 의header에들어가며 이때 명시된f‘ 이외의 문자필드에는*******’ 로 채워진다. 

AT FIRST :숫자필드를 제외한 필드의 값이 새롭게바뀔때 발생
SUM => 문자필드를 제외한 모든숫자필드의 값을 SUM. Internal table 의헤더에는숫자필드의합계만이들어가고 나머지 ‘ 필드는 모두*********’ 로 
채워짐.


AT LAST : 마지막행을 읽을 때 발생함.
SUM => AT FIRST 이벤트의 결과와 동일함

->위의 이벤트가 발생할 때sum 함수에 의해 채워진internal table header의 값은 모두ENDAT. 구문을 만나면 현재reading하고 있는 행의 값으로 
돌아가게 된다.



ON CHANGE OFf1 OR f2 OR…. OR fn
: internal 전용의 이벤트는 아님
:기술된 f1…fn 을 키값으로 새로운 값이들어왔을 때 발생하는 이벤트
: SUM 함수를 이용한 부분합을낼 수 없슴.


추가 사항으로 at new 를 사용할 수 없는 경우!!!!

AT new 같은 경우는 우선 필드가 가장 앞에 있어야 소스가 먹는다.
(당연히 matnr로 sort도 해야 함을 잊지 말자.)

가령  cnt  maktx lifnr matnr   이런식의 필드로 정렬되어 있을 때,

at new matnr
endat

하면 at new가 먹지 않는다는 것이다.  왜? 앞에 lifnr 이 바뀌거나 cnt가 바뀌었을 경우가 있어서
무조건 새로 만들어진 것으로 생각하기에 계속 저 at new 부분을 타는 것이다.
(원래 at new 라는게 같은게 나오다 새로운게 나올 때 타라고 쓰는 명령어니까..)

그렇기에 이런 경우에는 이런 소스를 생각해보자 
LOOP AT lt_zo1tvph INTO ls_zo1tvph. 

      IF ls_zo1tvph-matnr <> l_matnr.
      lv_cnt lv_cnt + 1.
      ls_item-cnt lv_cnt.
    ENDIF.
      l_matnr ls_zo1tvph-matnr. 

중략
     
    APPEND ls_item TO lt_item.
    CLEAR ls_item.
  ENDLOOP.


이러면 처음 루프를 탈 때는 l_matnr이 빈값이라서 무조건 if 안에 들어가서 lv_cnt를 타고
두번째부터는 l_matnr과 ls_zo1tvph-matnr 이 같아져서 if 문을 안탄다.
그리고 다음라인의 l_matnr을 계속 가지고 있다가 ls_zo1tvph-matnr과 l_matnr이 기존값과 다른게 나오면
if문 안을 타게 되니 새롭게 cnt를 한다.



728x90
반응형