ABAP

[SAP_ABAP] DELETE itab WHERE조건에서 두 값을 제외하고 지워주고 싶을 때

universe8 2023. 6. 15. 21:00

ABAP에서 DELETE itab WHERE~ 구문을 쓰다가 두가지 조건을 제외하고 모두 DELETE해주고싶은 경우가 생겼다.

 

데이터를 보면서 예를 들면,

 SELECT  CARRID,
         CONNID,
         COUNTRYFR,
         CITYFROM,
         AIRPFROM,
         COUNTRYTO,
         CITYTO,
         AIRPTO
    FROM SPFLI
    INTO TABLE @DATA(GT_SPFLI).
    SORT GT_SPFLI BY CARRID.

위와같이 SELECT를 해서 값이 담긴 인터널 테이블 GT_SPFLI 의 데이터가 아래와 같을때,

CARRID = 'AA' 인것과 CARRID = 'DL' 인것을 제외하고 모두 지워주고 싶다.

 

해결방법 #1. WHERE 조건에 괄호 ( ) 이용해서 조건 여러개 주기.

DELETE GT_SPFLI WHERE ( CARRID NE 'AA' ) AND ( CARRID NE 'DL' ).

이렇게 써주면 된다!

디버깅을 통해 테이블에 담긴 데이터를 확인해보면 원하는 CARRID = 'AA' , CARRID = 'DL' 값만 남아있는걸 확인할 수 있다.

 

사실 WHERE 조건을 AND로 안주고 (바보같이) OR로줘서... 어 왜 데이터가 다 지워지지???? 이러면서 헤맸다..

 

DELETE GT_SPFLI WHERE ( CARRID NE 'AA' ) AND ( CARRID NE 'DL' ).
DELETE GT_SPFLI WHERE ( CARRID NE 'AA' ) OR ( CARRID NE 'DL' ).

위의 두 줄을 그림을 그려서 이해해보면 아래와 같고!

CARRID NE 'AA' AND CARRID NE 'LH' ).

는 초록색에 해당하고

CARRID NE 'AA' OR CARRID NE 'DL' )

는 초록색, 노란색, 빨간색을 다 합친색에 해당한다.

 

그래서 OR 조건을 주면 모든 데이터가 다 지워지는게 맞음. (그것도 모르고 두번째 방법으로 해결한다음에 포스팅하면서 깨달음..)

 

해결방법 #2. WHERE 조건에 RANGE변수 이용.

두번째 방법은 (첫번째 방법에 뭔가 문제가 있는줄알고..) 두개의 조건을 RANGE변수에 넣어준다음, 'RANGE변수에 해당하지 않는것만 지워준다' 로 조건을 주면 되겠군 하고 짰던 로직.

 

  RANGES R_CARRID FOR SPFLI-CARRID.
  
  R_CARRID-SIGN = 'I'.
  R_CARRID-OPTION = 'EQ'.
  R_CARRID-LOW = 'AA'.
  APPEND R_CARRID. CLEAR R_CARRID.

  R_CARRID-SIGN = 'I'.
  R_CARRID-OPTION = 'EQ'.
  R_CARRID-LOW = 'DL'.
  APPEND R_CARRID.
  
  DELETE GT_SPFLI WHERE CARRID NOT IN R_CARRID.

RANGE변수 R_CARRID에  CARRID 'AA' , CARRID 'DL'  두 조건을 넣어주고

이 조건에 해당하지 않으면 지워주는 방식.

 

디버깅해서 보면,

R_CARRID에는 두 조건이 담겨있다.

그리고 DELETE진행하면

1번방법으로 했을때와 똑같이 5건만 남아있는것 확인 가능하고, 

GT_SPFLI 더블클릭하면!

이렇게 원하는 데이터만 남아있는것 확인 가능하다!

 

조건줄때 생각을 더 깊게 해보자..!!

끝.

반응형