CS Student’s SAP&Tech Journey✨
[SAP] ALV (4) 시각적 제어 기능 - 신호등, 컬러 강조, FREE 함수 / 코드 리펙토링 본문
SAP에서 데이터를 더 직관적으로 전달하기 위해 ALV의 다양한 시각적 제어 기능을 활용할 수 있습니다. 이번 포스팅에서는 신호등, 컬러 강조, 체크박스 아이콘 출력, 그리고 필드 카탈로그 조작을 통해 ALV를 더 풍부하게 구성하는 방법을 정리해보겠습니다.
✅ ALV 객체 제거 - FREE 함수
ALV와 Container 객체는 화면을 나가기 전 반드시 메모리에서 해제해줘야 합니다. 그렇지 않으면 BACK할 때마다 ALV 객체가 중복 생성됩니다.
▶ XXXXXI01 (PAI)
PATTERN 사용하여 FREE 함수 호출합니다.
WHEN 'BACK'.
" 100번 화면에서 생성한 객체 파괴하고 떠나야 합니다.
" ALV, Container 두개의 객체 파괴해야한다.
" 파괴 순서 : ALV -> Container
CALL METHOD go_alv->free. " ALV "
CALL METHOD go_con->free. " Container "
LEAVE TO SCREEN 0.
✅ ALV Layout 옵션 설정
▶ XXXXXO01(PBO)
GS_LAYOUT-CWIDTH_OPT = 'X'. " 줄 맞춤
GS_LAYOUT-ZEBRA = 'X'. " 얼룩말 패턴
GS_LAYOUT-GRID_TITLE = 'Flight Connections'.
GS_LAYOUT-TOTALS_BEF = 'X'. " 합계 위에 출력
GS_LAYOUT-SEL_MODE = 'A'. " 라인 선택 모드 (A, D: 가능)
▶ 확인
✅ 신호등 (Threshold) 설정
조건별 색상 시각화 1: 빨간색, 2: 주황색, 3: 초록색으로 설정합니다.
▶ TOP
TYPES: BEGIN OF GTY_CONN.
INCLUDE TYPE SDYN_CONN.
TYPES LIGHT TYPE C LENGTH 1.
TYPES: END OF GTY_CONN.
DATA GT_CONN TYPE TABLE OF GTY_CONN. "신호등을 위한 컬럼 1개 추가
인터널 테이블을 정의합니다.
▶ LOOP 내 조건 설정
LOOP AT GT_CONN INTO GS_CONN.
IF GS_CONN-distance > 6000.
GS_CONN-light = 1.
ELSEIF GS_CONN-distance > 3000.
GS_CONN-light = 2.
ELSE.
GS_CONN-light = 3.
ENDIF.
MODIFY GT_CONN FROM GS_CONN TRANSPORTING light.
ENDLOOP.
▶ XXXXXO01(PBO) : Layout 설정
신규로 추가한 신호등 컬럼 이름을 ALV에게 알려줘야 합니다.
GS_LAYOUT-excp_fname = 'LIGHT'.
GS_LAYOUT-excp_led = 'X'. " 1구 신호등
▶ 확인
✅ 특정 라인 컬러 강조
노란색 강조: 전세기(Charter fit)인 경우 컬러 부여
▶ TOP
TYPES LCOLOR TYPE C LENGTH 4.
▶ XXXXXO01(PBO) : Layout 설정
신규로 추가한 라인 컬럼 이름을 ALV에게 알려줘야 합니다.
GS_LAYOUT-info_fname = 'LCOLOR'.
▶ LOOP 내 조건 설정
LOOP AT gt_conn INTO gs_conn.
IF gs_conn-distance > 6000.
gs_conn-light = 1.
ELSEIF gs_conn-distance > 3000.
gs_conn-light = 2.
ELSE.
gs_conn-light = 3.
ENDIF.
" 전세기(Charter Flight)인 경우 노란색으로 출력하기
IF gs_conn-fltype = 'X'.
gs_conn-lcolor = 'C300'.
ENDIF.
MODIFY gt_conn FROM gs_conn
TRANSPORTING light lcolor.
ENDLOOP.
▶ 확인
✅ ALV 기본 버튼 숨기기 (툴바 제어)
▶ TOP
DATA GT_EXCLUDED TYPE ui_functions.
▶ XXXXXO01(PBO) : Layout 설정
툴바에서 숨길 버튼 추가해야 합니다. 프린트 버튼을 숨겨보겠습니다.
APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT TO GT_EXCLUDED.
▶ SET_TABLE_FOR_FIRST_DISPLAY 연결
MODULE init_control OUTPUT.
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SDYN_CONN'
is_variant = GS_VARIANT
i_save = GV_SAVE
is_layout = GS_LAYOUT
it_toolbar_excluding = GT_EXCLUDED " 추가 "
CHANGING
it_outtab = gt_conn.
ENDMODULE.
▶ 프린트 버튼 보이지 않는 것 확인
📌 Perform 사용하여 코드 리펙토링 하기
✔️ 기존 코드
▶ XXXXXO01(PBO)
MODULE init_control OUTPUT.
IF GO_CON IS INITIAL.
" Layout 설정
GS_LAYOUT-CWIDTH_OPT ='X'. " 줄 맞춤
GS_LAYOUT-ZEBRA = 'X'. " 얼룩말 레이아웃 지원
GS_LAYOUT-GRID_TITLE = 'Flight Connections'. "AVL 타이틀
GS_LAYOUT-TOTALS_BEF = 'X'.
GS_LAYOUT-SEL_MODE = 'A'.
GS_LAYOUT-info_fname = 'LCOLOR'.
GS_VARIANT-report = SY-CPROG. " 'ZALV_BASIC_07'
GS_VARIANT-variant = PA_LAY. " 화면에서 입력받은 값
GV_SAVE = 'A'. "일단 A로 고정
GS_LAYOUT-excp_fname = 'LIGHT'.
GS_LAYOUT-excp_led = 'X'. " 1구 신호등
APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT TO GT_EXCLUDED.
" 기존 init_control 모듈 "
CREATE OBJECT go_con
EXPORTING
container_name = 'MY_CON'.
CREATE OBJECT go_alv
EXPORTING
i_parent = go_con.
" display_control 모듈 "
GS_LAYOUT-CWIDTH_OPT ='X'.
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SDYN_CONN'
is_variant = GS_VARIANT
i_save = GV_SAVE
is_layout = GS_LAYOUT
it_toolbar_excluding = GT_EXCLUDED
CHANGING
it_outtab = gt_conn.
ENDIF. " 추가 "
ENDMODULE.
✔️ 코드 리펙토링
▶ XXXXXO01(PBO)
MODULE init_control OUTPUT.
IF GO_CON IS INITIAL.
" 1. 객체 2개 생성한다.
PERFORM INIT_CONTROL.
" 2. ALV 제어한다.
PERFORM SET_ALV.
" 3. ALV 출력한다.
PERFORM DISPLAY_ALV.
ENDIF.
ENDMODULE.
▶ FORM init_control : 객체 ALV, Container 생성 역할
FORM init_control .
CREATE OBJECT go_con
EXPORTING
container_name = 'MY_CON'.
CREATE OBJECT go_alv
EXPORTING
i_parent = go_con.
ENDFORM.
▶ FORM set_alv : ALV 제어 역할
FORM set_alv .
GS_LAYOUT-CWIDTH_OPT ='X'.
GS_LAYOUT-ZEBRA = 'X'. " 얼룩말 레이아웃 지원
GS_LAYOUT-GRID_TITLE = 'Flight Connections'. "AVL 타이틀
GS_LAYOUT-TOTALS_BEF = 'X'.
GS_LAYOUT-SEL_MODE = 'A'.
GS_VARIANT-report = SY-CPROG. " 'ZALV_BASIC_07'
GS_VARIANT-variant = PA_LAY. " 화면에서 입력받은 값
GV_SAVE = 'A'. "일단 A로 고정
" 신규로 추가한 신호등 컬럼 이름을 ALV에게 알려주기
GS_LAYOUT-excp_fname = 'LIGHT'.
GS_LAYOUT-excp_led = 'X'. "1구 신호등으로 변경.
" 신규로 추가한 라인 컬럼 이름을 ALV에게 알려주기
GS_LAYOUT-info_fname = 'LCOLOR'.
" 툴바에서 숨길 버튼 추가하기.
APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT TO GT_EXCLUDED.
ENDFORM.
▶ FORM display_alv : ALV 출력 역할
FORM display_alv .
GS_LAYOUT-CWIDTH_OPT ='X'.
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SDYN_CONN'
is_variant = GS_VARIANT
i_save = GV_SAVE
is_layout = GS_LAYOUT
it_toolbar_excluding = GT_EXCLUDED
CHANGING
it_outtab = gt_conn.
ENDFORM.
'SAP > ALV' 카테고리의 다른 글
[SAP] ALV (5) 사용자 정의 컬럼 구성 - Field Catalog 설정 및 아이콘 출력하기 (0) | 2025.03.28 |
---|---|
[SAP] ALV (3) 사용자별 레이아웃 저장 / Layout Variant 설정 (IS_VARIANT, I_SAVE) (0) | 2025.03.28 |
[SAP] ALV (2) 화면 갱신 / refresh_table_display 메서드로 데이터 반영하기 (0) | 2025.03.25 |
[SAP] ALV (1) 기본 개념 / 객체지향 ALV(CL_GUI_ALV_GRID)로 화면 구성하기 (0) | 2025.03.21 |