본문 바로가기

SAP/ABAP

sort + collect

최종 작성일: 2024-06-30

목표: sort와 collect 구문 이해하기

 

 

sort의 종류

 

1. 집계완료한 테이블에 ' SORT 집계 테이블 BY 정렬 대상 칼럼' 을 통해서 정렬하기

-> 안좋은 점은 집계 방법이 'LOOP AT 테이블 INTO 한행 돌아가면서 COLLECT 한행 INTO 테이블 '을 통해서 진행하는 경우, 정렬이 안된 값을 LOOP 돌려가면서 COLLECT 하면 오류가 발생 할 수 있음. ( 예를 들어 AA,AC, DH , AC이렇게 칼럼값이 열거 되어 있는 경우, 정렬 안하고 LOOP-COLLECT 사용하면 집계 값 오류 발생할 수 있음)

 

2. SELECT 문에서 'ORDER BY 칼럼' 구문을 통해 정렬하기

-> LOOP- COLLECT 문의 경우, 보통 정렬 후에 집계 진행하는 것이 맞음. 따라서 이게 정석일 수 있고 오류도 최소화 할 수 있음.

 

3. 데이터 선언부에서 해당 테이블을 'sorted table' 및 ' non-unique key'로 선언하여 원본 데이터 자체를 정렬한 상태로 불러오기.

-> ' table 명 TYPE SORTED TABLE OF WITH NON-UNIQUE KEY' 및 'table 명 TYPE SORTED TABLE OF WITH UNIQUE KEY'의 차이점 확인하기

 

 

carrid, connid 에 unique key 값을 설정했는데,해당 테이블 확인해보면 두 칼럼 값 이외에 fldate 등으로 데이터가 분류됨. 따라서 with non unique key 값으로 선언해야 오류가 발생하지 않음.

SORT + Loop In & Collect 구문

 

Collect 구문 만들 때 유의 사항

 

1. 집계 테이블이 안만들어 지는 경우가 있는 데 그때는 참조하는 칼럼의 수가 많아서 임.

2. 급 궁금한거는 collect 구문을 통해 internal table 만들 때 with header line(행의 타이틀 과 테이블의 타이틀이 동일해야하는 거 아닌 지 급 궁금)  -> with header line으로 테이블 생성 안했는데 이상은 없었음.

*&---------------------------------------------------------------------*
*& Report ZREVIEW_SORT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZREVIEW_SORT.

TABLES : Sbook.

TYPE-POOLS: slis.                                 "ALV Declarations

*Data Declaration
*----------------
TYPES: BEGIN OF t_sbook,
  carrid TYPE sbook-carrid,
  connid TYPE sbook-connid,
  forcuram TYPE sbook-forcuram,
  forcurkey TYPE sbook-forcurkey,
    "Used to store row color attributes
 END OF t_sbook.

DATA: it_sbook TYPE STANDARD TABLE OF t_sbook INITIAL SIZE 0,
      it_collect type STANDARD TABLE OF t_sbook,
      wa_sbook TYPE t_sbook.

*ALV data declarations
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE slis_layout_alv,
      gd_repid     LIKE sy-repid.


DATA : t TYPE slis_t_sp_group_alv .

SELECTION-SCREEN  BEGIN OF BLOCK part1 WITH FRAME TITLE test-001.
  SELECT-OPTIONS s_carrid FOR sbook-carrid.
SELECTION-SCREEN end of block part1.
 INITIALIZATION.


************************************************************************
*Start-of-selection.
START-OF-SELECTION.

  PERFORM data_retrieval.
  PERFORM build_fieldcatalog.
  PERFORM build_layout.
  PERFORM display_alv_report.

*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
*       Build Fieldcatalog for ALV Report
*----------------------------------------------------------------------*
FORM build_fieldcatalog.

  fieldcatalog-fieldname   = 'carrid'.
  fieldcatalog-seltext_m   = 'airlinecode'.
  fieldcatalog-col_pos     = 1.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'connid'.
  fieldcatalog-seltext_m   = 'flight connection number'.
  fieldcatalog-col_pos     = 2.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.



  fieldcatalog-fieldname   = 'forcuram'.
  fieldcatalog-seltext_m   = 'forcuram'.
  fieldcatalog-col_pos     = 5.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'forcurkey'.
  fieldcatalog-seltext_m   = 'forcurkey'.
  fieldcatalog-col_pos     = 6.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.


ENDFORM.                    " BUILD_FIELDCATALOG


*&---------------------------------------------------------------------*
*&      Form  BUILD_LAYOUT
*&---------------------------------------------------------------------*
*       Build layout for ALV grid report
*----------------------------------------------------------------------*
FORM build_layout.

  gd_layout-no_input          = 'X'.
  gd_layout-colwidth_optimize = 'X'.
  gd_layout-zebra = 'X'.
*  gd_layout-info_fieldname =      'LINE_COLOR'.
*  gd_layout-def_status = 'A'.

ENDFORM.                    " BUILD_LAYOUT


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV_REPORT
*&---------------------------------------------------------------------*
*       Display report using ALV grid
*----------------------------------------------------------------------*
FORM display_alv_report.
  gd_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = gd_repid
      is_layout          = gd_layout
      it_fieldcat        = fieldcatalog[]
      i_save             = 'X'
    TABLES
      t_outtab           = it_collect
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


ENDFORM.                    " DISPLAY_ALV_REPORT


*&---------------------------------------------------------------------*
*&      Form  DATA_RETRIEVAL
*&---------------------------------------------------------------------*
*       Retrieve data form EKPO table and populate itab it_ekko
*----------------------------------------------------------------------*
FORM data_retrieval.

  SELECT  carrid connid forcuram forcurkey
    FROM sbook
    INTO TABLE it_sbook
    WHERE carrid in s_carrid.
   SORT it_sbook by carrid connid.

  LOOP AT it_sbook INTO wa_sbook.
    COLLECT wa_sbook INTO it_collect.
  ENDLOOP.

ENDFORM.                    " DATA_RETRIEVAL

 

 

'SAP > ABAP' 카테고리의 다른 글

[WIP]Read Table의 기본  (0) 2024.06.04
[WIP]Read Table  (0) 2024.06.04
ALV로 집계테이블 만들기 (LOOP AT, COLLECT)  (0) 2024.05.31
Loop 구문과 Collect 구문의 구조  (0) 2024.05.29
COLLECT 구문  (0) 2024.05.29