ABAP

[SAP_ABAP] 테이블 중간에 있는 필드 AT END OF 사용하고 싶을 때

universe8 2022. 8. 31. 21:00

결론 :  ON CHANGE OF 구문을 사용하면 된다!

 

LOOP 안에서 유용하게 쓸 수 있는 AT 구문들이 있는데, 이지아밥에 소개가 되어있는것은 이 네가지이다.

그래서 지금부터는 이 네가지 이외에 ON CHANGE OF 라는 구문을 몰라서 고생한썰...

 

참고

AT FIRST.  :  인터널 테이블의 맨 처음 값이 실행될 때 수행된다 .
AT NEW <field>.  :  필드 <field> 에 새로운 값이 들어올 때 수행된다.
AT END OF <field>. :  필드 <field> 의 값이 마지막일 때 수행된다 .
AT LAST. 인터딜 테이블의 마지막 값이 실행될 때 수행된다.

 

상황

위의 데이터를 BAPI_GOODSMVT_CREATE (상품출고) 바피에 돌려야 했는데,

이 [ BAPI_GOODSMVT_CREATE]는 상품을 출고하는 BAPI라서 ITAB 데이터를  한 라인별로 BAPI를 돌릴수도 있고, 날짜별로(BLDAT) 상품을 묶어서  한번에 BAPI를 태울수도 있다!

컨의 요청은 [날짜별로 상품을 묶어서 BAPI를 진행해주세요]였는데,

 

그래서 일단 BLDAT로 데이터를 정렬을 한 후,

LOOP를 돌려서 AT END OF BLDAT 를 하면,

아래 표시한 BLDAT = 2014.10.16인 5개의 라인 중 맨 마지막 라인을 탔을 때 AT END OF가 먹힐 줄 알았다,

하지만 BLDAT = 2014.10.16인 매 라인마다  AT END OF BLDAT 구문이 탔다...

 

AT END OF BLDAT구문을 쓰면서 SORT 정렬도

기존 itab의 정렬도

SORT  itab  BY  PRUEFLOS  INPUT_DATE. 에서

SORT  itab  BY BLDAT.  로 바꿔줬는데 뭐가 문제인지 한참 헤맸는데,

 

이유는 [ AT END OF<field> 는 이전 필드 모두의 중복이 끝나는 시점에 탄다.] 였다.

 

여기서 '이전필드' 라는 말은 [필드 <field> 의 앞에 위치해 있는 필드를 말한다.]

그림으로 설명하면

[AT END OF bldat]의 이전필드는 BLDAT필드 앞에 위치해 있는 필드인  MANDT, PRUEFLOS, INPUT_DATE, VCODE 필드를 말한다!

[AT END OF bldat]의 이전필드는 MANDT, PRUEFLOS, INPUT_DATE, VCODE를 말한다.

 

그리고  [ AT END OF<field> 는 이전 필드 모두의 중복이 끝나는 시점에 탄다.] 에서 모두의 중복이 끝나는 시점에 탄다 라는 말은, 이전필드들 모두를 기준으로, 하나라도(한 라인이라도) 값이 바뀌게 되면 AT END OF 이벤트가 탄다는 뜻이다!

 

위의 그림을 보면 필드PRUEFLOS의 값은 매 라인 데이터가 다 다르다! 그래서 매 라인 AT END OF 이벤트가 탔던것!.

 

 

해결방법 #1. 비추..

그래서 내가 생각해낸 첫번째 해결방법은..

BLDAT필드가 맨 앞에 위치한 새로 인터널테이블을 선언해줘서 거기에 데이터를 담아주고 그 새로운 인터널테이블로 BAPI를 돌리는 거였다!

BLDAT필드가 맨 앞에 위치한 새로 인터널테이블을 선언해줘서 거기에 데이터를 담아주고 그 새로운 인터널테이블로 BAPI를 돌리는 거였다!

이렇게 해서 안되는건 아닌데....로직이 백만줄된다.

LOOP 돌리면서 한줄씩 MOVE-CORRESPONDING~구문으로 한줄씩 옮겨 담아줘야 하고...너무 복잡하다.

 

해결방법 #2. ON CHANGE OF 구문 사용

ON CHANGE OF 구문은 AT END OF 구문과는 다르게 이전필드들의 값 변경에 영향이 없다!

그리고 LOOP 를 돌리기 전에 ON CHANGE OF <field>에 해당하는 <field> 기준으로 잘 정렬만 해주면 된다!

 

아래 그림에 있는 ITAB처럼 BLDAT필드를 기준으로 SORT 후에 LOOP 돌리고 LOOP 안에서 ON CHANGE OF 구문을 사용하면 된다!

그리고 ON CHANGE OF<field> 의 주의점은 맨 처음값도 로직이 탄다는 것이다. 

 

위의 그림에서는 맨 첫 라인에  BLDAT = 2014.10.16 인 데이터부터 ON CHANGE OF~ 구문이 타게되고, 그 이후에 BLDAT = 2022.06.01인 데이터에서 ON CHANGE OF~ 구문이 타게된다!!

 

 

 

반응형