최종 작성일: 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'의 차이점 확인하기
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 |