결론 : 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<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~ 구문이 타게된다!!
'ABAP' 카테고리의 다른 글
[SAP_ABAP] Make repairs in the non-original system only if they are urgent (2) | 2022.10.19 |
---|---|
[SAP_ABAP] SE11에서 테이블 조회할때 선택화면 필드 추가하기 (0) | 2022.10.13 |
[SAP_ABAP]SELECT후 이름이 다른 필드에 값을 넣어주고 싶을 때! (0) | 2022.08.30 |
[SAP_ABAP]테이블 유지보수기(Table Maintenance Dialog) #2. Event 추가하여 데이터 추가시 Time Stamp 자동 생성되도록 하는법 (0) | 2022.08.29 |
[SAP_ABAP]테이블 유지보수기(Table Maintenance Dialog) #1. 만드는 방법 (1) | 2022.08.28 |