본문 바로가기
카테고리 없음

ABAP New Syntax #9 - FILTER/REDUCE Operator

by SAPortal 2024. 3. 6.

목차

    1. FILTER/REDUCE Operator 란?

    FILTER 연산자는 내부 테이블이나 표준 테이블에서 특정 조건을 만족하는 행만을 선택하여 새로운 테이블을 생성하는 데 사용됩니다.

    이 연산자는 데이터를 필터링하고 결과를 새로운 테이블 인스턴스로 반환함으로써, 데이터 처리 작업을 간소화하고 코드의 가독성을 향상시킵니다.

     

    REDUCE 연산자는 여러 값을 하나의 값으로 축약(또는 집계)하는 데 사용되는 함수형 프로그래밍 기법입니다.

    이 연산자는 내부 테이블의 요소를 순회하며 각 요소에 대해 연산을 수행하고, 그 결과를 단일 값으로 반환합니다.

    REDUCE는 복잡한 데이터 집계 작업을 간결하고 효율적으로 처리할 수 있게 해줍니다.

     

    2. FILTER/REDUCE Operator 예제

    예제1) FILTER Operator 기본문법

    DATA: LT_SPFLI TYPE SORTED TABLE OF SPFLI WITH NON-UNIQUE KEY CARRID.
    DATA: LT_RESULT TYPE TABLE OF SPFLI.
    
    SELECT *
      FROM SPFLI
      INTO TABLE @LT_SPFLI.
    
    LT_RESULT = FILTER #( LT_SPFLI WHERE CARRID = 'LH ' ).

    이 예제에서 LT_SPFLI 내부 테이블에는 항공사 정보가 저장되어 있습니다.

    FILTER 연산자를 사용하여 항공사코드가 'LH' 인 DATA만을 선택하고, 이를 새로운 테이블 LT_RESULT에 저장합니다.

    주의할점은 FILTER 연산자를 사용할 때, FILTER의 대상이 되는 테이블은 SORTED 또는 HASHED TABLE이어야 합니다.

    STANDARD TABLE에 대해서는 FILTER 연산자를 직접 사용할 수 없습니다.

    이는 FILTER 연산자가 효율적인 검색을 위해 내부적으로 테이블의 키를 사용하기 때문입니다.

    SORTED TABLEHASHED TABLE은 키를 기반으로 데이터를 관리하기 때문에, FILTER 연산자와 함께 사용할 때 더 높은 성능을 제공합니다.

     

    LT_RESULT = FILTER #( LT_SPFLI WHERE CARRID = 'LH ' ).

    FILTER 연산자의 WHERE조건에 사용할 수 있는 필드는 SORTED, HASHED TABLE의 KEY로 선언한 필드만 사용할 수 있습니다.

    그리고 위 소스를 보면 특이한게 보입니다. CARRID = 'LH ' 이부분인데요. LH뒤쪽에 공란이 하나 있습니다. 

    CARRID필드 티입이 CHAR 3자리이기 때문에 공란을 하나 추가해줘야 합니다.

    공란을 빼고 그냥 'LH'만 하게되면 에러가 납니다.

    이런 번거로움을 피하기 위해서 아래와 같이 CONV 연산자를 사용합니다.

    CONV 연산자는 TYPE 변환 연산자인데 다음시간에 상세히 다루도록 하겠습니다.

     

    LT_RESULT = FILTER #( LT_SPFLI WHERE CARRID = CONV S_CARR_ID('LH') ).

    'LH'를 S_CARR_ID 타입으로 변환해서 WHERE조건에 대입합니다.

    이렇게 하면 LH다음에 공란을 굳이 안붙여도 됩니다.

     

     

    예제2) FILTER Operator IN TABLE조건

    DATA: LT_SFLIGHT TYPE TABLE OF SFLIGHT,
          LT_SPFLI TYPE SORTED TABLE OF SPFLI WITH NON-UNIQUE KEY CARRID CONNID,
          LT_RESULT TYPE TABLE OF SFLIGHT.
    
    SELECT * FROM SFLIGHT
             INTO TABLE @LT_SFLIGHT.
    
    SELECT * FROM SPFLI
             INTO TABLE @LT_SPFLI.
    
    LT_RESULT = FILTER #( LT_SFLIGHT IN LT_SPFLI WHERE CARRID = CARRID
                                                   AND CONNID = CONNID ).

    특정 테이블의 값으로 FILTER를 걸수 있습니다.

    위 예제는 LT_SPFLI테이블의 CARRID, CONNID의 값으로 LT_SFLIGHT테이블을 찾아 조건에 맞는 값만 추출합니다.

    이 기능을 사용하지 않으면 중첩 LOOP 또는 LOOP안에서 READ TABLE을 해야 하지만 FILTER 연산자를 사용하면 좀더 편리하게 결과값을 얻을수 있습니다.

    이경우에는 FILTER의 대상이 되는 테이블인 LT_SFLIGHT가 SORTED 또는 HASHED 테이블로 선언해야 하는게 아니라 FILTER의 조건이 되는 LT_SPFLI 테이블을 SORTED 또는 HASHED테이블로 선언해야 합니다.

     

     

    예제3) REDUCE Operator 테이블 ROW 카운트

    SELECT *
      FROM SPFLI
      INTO TABLE @DATA(LT_SPFLI).
    
    DATA(LV_SUM) = REDUCE I( INIT SUM = 0 FOR WA IN LT_SPFLI
                             WHERE ( CARRID = 'LH' )
                             NEXT SUM = SUM + 1 ).

    이 예제는 LT_SPFLI 테이블에서 CARRID값이 'LH'인 ROW값을 LV_SUM변수로 리턴받습니다.

    SUM변수는 LT_SPFLI의 ROW값만큼 1씩 증가시키는 누적변수로 사용되었습니다.

     

     

    예제4) REDUCE Operator 필드값 집계

    SELECT *
      FROM SFLIGHT
      INTO TABLE @DATA(LT_SFLIGHT).
    
    DATA(LV_TOTAL_PRICE) = REDUCE S_PRICE( INIT SUM = 0 FOR WA IN LT_SFLIGHT
                                           WHERE ( CARRID = 'LH' )
                                           NEXT SUM = SUM + WA-PRICE ).

    이 예제는 LT_SFLIGHT 테이블에서 CARRID값이 'LH'인 PRICE값을 SUM해서 LV_TOTAL_PRICE변수에 리턴합니다.

     

    3. FILTER/REDUCE Operator 장점

    [FILTER Operator]

    코드 간결성: 복잡한 루프와 조건문 없이도 특정 조건을 만족하는 데이터를 쉽게 선택할 수 있습니다.

    가독성 향상: FILTER 연산자를 사용하면 의도가 명확한 코드를 작성할 수 있어, 다른 사람이 코드를 이해하기 쉬워집니다.

    데이터 처리 효율성: 필요한 데이터만을 선택하여 새로운 테이블에 저장함으로써, 메모리 사용량과 처리 시간을 최적화할 수 있습니다.

     

    [REDUCE Operator]

    코드 간결성: 복잡한 루프와 조건문 없이도 데이터를 효율적으로 축약할 수 있습니다.

    가독성 향상: REDUCE 연산자를 사용하면 의도가 명확한 코드를 작성할 수 있어, 다른 사람이 코드를 이해하기 쉬워집니다.

    데이터 처리 효율성: 다양한 데이터 집계 및 축약 작업을 단일 표현식으로 처리할 수 있어, 코드의 실행 효율성을 높일 수 있습니다.