ASAP

[ABAP] Virtual Sort 하는 법, sort 할 때 key 다르게 설정하는 법 본문

SAP(ABAP)/문법

[ABAP] Virtual Sort 하는 법, sort 할 때 key 다르게 설정하는 법

에이SAP 2023. 6. 7. 15:17
728x90

간혹 sort할 때 지금 있는 데이터 기준이 아닌 다른 key를 주고 sort를 하고 싶을 때가 있을 것이다. 

그럴 때 abap 7.52에 나온 virtual sort를 사용하면 된다. (아래 링크 참고)

https://blogs.sap.com/2017/09/20/abap-news-for-release-7.52-virtual-sorting-of-internal-tables/

 

ABAP News for Release 7.52 – Virtual Sorting of Internal Tables | SAP Blogs

19 15 12,484 SAP NetWeaver AS for ABAP 7.52 is available now. It is mainly a “major step on the way to efficient development of SAP HANA optimized SAP Fiori apps is the use of the new RESTful ABAP programming model which includes technologies such as CDS

blogs.sap.com

 

클래스 CL_ABAP_ITAB_UTILITIES의 VIRTUAL_SORT라는 new method이다. 

이 메소드는 인터널테이블을 바꾸지 않고 정렬을 하는데, 즉 기존 데이터에 영향을 주지 않는다. 

 

아래는 virtual sort 를 이용해서 sort하는 예제 구문이다. 

spfli 테이블 데이터에서 carrid로 정렬하는데 사용자가 지정한 대로 정렬하고자 하는 상황이다. 

 

lt_sort_key에다가 순서를 정의를 하고 

lt_sort_rule에다가 데이터대로 순서를 정의를 하자. 

TYPES: BEGIN OF gty_s_sort_key.
TYPES: number TYPE n,
       carrid TYPE spfli-carrid.
TYPES : END OF gty_s_sort_key.
TYPES : gty_t_sort_key TYPE STANDARD TABLE OF gty_s_sort_key WITH EMPTY KEY.

DATA: lt_sort_key  TYPE gty_t_sort_key, "특정 방법으로 Sorting 할 Key 정의
      lt_sort_rule TYPE gty_t_sort_key. "원천데이터와 Sorting 할 Key 값 맵핑
DATA: lt_data  TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY,
      lt_final TYPE TABLE OF spfli.

* Sort 순서 정의
lt_sort_key[] = VALUE #( ( number = 1 carrid = 'LH' )
                         ( number = 2 carrid = 'JL' )
                         ( number = 3 carrid = 'AA' )
                         ( number = 4 carrid = 'AZ' )
                         ( number = 5 carrid = 'QF' )
                         ( number = 6 carrid = 'SQ' )
                         ( number = 7 carrid = 'DJ' )
                         ( number = 8 carrid = 'UA' )
                         ( number = 8 carrid = 'DL' )
                         ).

SELECT DISTINCT carrid,
                connid,
                cityfrom,
                cityto
  FROM spfli
  INTO CORRESPONDING FIELDS OF TABLE @lt_data.

lt_sort_rule[] = VALUE #( FOR data IN lt_data
                          FOR sort_key IN lt_sort_key WHERE ( carrid = data-carrid )
                                                            ( number = sort_key-number carrid = data-carrid ) ).

DATA(lt_sort_idx) = cl_abap_itab_utilities=>virtual_sort(
                      im_virtual_source = VALUE #( ( source     = REF #( lt_sort_rule[] )
                                                     components = VALUE #( ( name = 'NUMBER' ) ) )
                                                   ( source     = REF  #( lt_data[] )
                                                     components = VALUE #( ( name = 'CARRID' ) ) )
                                                 ) ).

lt_final = VALUE #( FOR idx IN lt_sort_idx ( lt_data[ idx ] ) ).

원래 데이터는 아래와 같았는데

virtual sort로 정렬을 하면 아래와 같다. 

사용자가 지정해준 대로 정렬이 잘 되는 걸 확인할 수 있다. 

 

이때 주의할 점은 lt_sort_rule의 데이터수와 lt_data의 데이터수가 일치해야 한다. 

그러기 위해선 lt_sort_key에 모든 carrid의 순서를 지정해야 한다. 이렇게 하지 않으면 dump가 뜬다 ㅋㅋ

728x90

'SAP(ABAP) > 문법' 카테고리의 다른 글

[ABAP] LOOP AT GROUP BY 사용법 + 예제  (0) 2023.03.07
[SAP/ABAP] ALV Subtotal 맨 위에 표기  (0) 2023.01.11
[ABAP] CLEAR vs REFRESH vs FREE  (2) 2022.08.22