작성일 | 2025.02.18 |
버전 | 1.0 |
1. 개요
•
프로그램명: ZALV_C_D##
•
설명: ALV Grid (Custom Container)를 활용하여 항공권 예약 정보(SBOOK 테이블)를 조회하고 출력하는 프로그램
2. 기능
•
사용자로부터 항공사 ID (CARRID), 예약 ID (BOOKID)를 입력받아 조회
•
중요: 조회 필드는 CONNID가 아닌 BOOKID임 (주의 메시지 있음)
•
ALV Grid 상에서 다양한 기능과 인터랙션 제공
3. 조회조건 화면 구성
•
항공사 ID / 예약 ID를 범위로 조회할 수 있도록 구성
•
기본 초기값 설정:
◦
예약 ID: 1부터 20
◦
항공사 ID: 조회된 결과가 AA, JL만 나오도록 필터링
4. 기능 상세 정리
4.1 신호등 아이콘 추가
•
luggweight 값에 따라 신호등 아이콘 다르게 표시
◦
<=10: 초록색 (정상)
◦
>10 and <=20: 노란색 (경고)
◦
>20: 빨간색 (위험)
•
필드 이름은 Lug weight로 ALV Grid 상에서 사용
4.2 흡연자 아이콘 표시
•
흡연자 필드는 icon_warning 아이콘으로 표시
•
해당 필드 순서는 7번으로 고정
5. ALV 정렬 기준
•
기본 정렬 우선순위
1.
항공사 ID (CARRID)
2.
항공편 ID (CONNID)
3.
예약 ID (BOOKID)
6. UI 관련 기능
6.1 셀 단위 스타일 적용
•
고객 타입에 따라 CUSTOMID 필드에 스타일 적용
◦
B(비즈니스): 버튼 필드 스타일 및 아이콘 추가
◦
P(일반): 일반 텍스트 표시
6.2 셀 색상 지정
•
luggweight > 25인 경우 해당 셀만 색상 지정
6.3 라인 색상 지정
•
fdate와 order_date가 년/월이 같을 경우, 한 줄 전체에 색상 지정
•
참조값: col_negative, inv = 0 또는 1
7. Toolbar 기능
7.1 평균 수하물 무게 (AVG Luggage)
•
선택된 행들의 luggweight 평균 계산
•
행 선택하지 않으면 메시지 출력
7.2 평균 금액 (AVG Amount)
•
동일한 carrid, connid, bookid 조합에 대해 loccuram 평균 계산
•
사용자 입력값 기반
8. Context Menu
•
우 클릭 시 CUSTOMID 컬럼에 대해 Context Menu 표시
•
고객 정보 출력
9. Double Click 이벤트
•
행 더블 클릭 시 주요 정보 메시지 출력
10. 버튼 클릭 이벤트
•
버튼 클릭 시 고객 정보가 비즈니스 고객인 경우 별도 프로그램 호출
•
호출 프로그램명: /1bcdwb/dbsbook
•
customid를 넘겨 해당 고객의 예약 전체 조회
주요 기능
1. 데이터 시각화 기능
신호등 아이콘 구현 (ZALV_C_D25_F01의 make_data 부분)
FORM make_data .
LOOP AT gt_sbook INTO gs_sbook.
IF gs_sbook-luggweight <= 10.
gs_sbook-light = '3'." 초록색(정상)
ELSEIF gs_sbook-luggweight LE 20.
gs_sbook-light = '2'." 노란색(경고)
ELSEIF gs_sbook-luggweight GT 20.
gs_sbook-light = '1'." 빨간색(위험)
ENDIF.
...
ABAP
복사
화물 무게에 따라 시각적 신호등을 구현하여 사용자가 즉시 상태를 파악할 수 있도록 했습니다. 10kg 이하는 초록색, 10-20kg은 노란색, 20kg 초과는 빨간색으로 표시됩니다.
2. 조건부 스타일 적용
고객 타입별 스타일 적용 (ZALV_C_D25_F01의 make_data 부분)
IF gs_sbook-custtype = 'B'.
gs_style-fieldname = 'CUSTOMID'.
gs_style-style = alv_style_font_bold.
INSERT gs_style INTO TABLE gs_sbook-it_style.
gs_style-fieldname = 'BNT_TEXT'.
gs_style-style = cl_gui_alv_grid=>mc_style_button.
gs_sbook-bnt_text = icon_create_position.
INSERT gs_style INTO TABLE gs_sbook-it_style.
ELSE.
gs_style-fieldname = 'CUSTOMID'.
gs_style-style = alv_style_font_underlined.
INSERT gs_style INTO TABLE gs_sbook-it_style.
ENDIF.
ABAP
복사
비즈니스 고객(B)과 개인 고객(P)을 시각적으로 구분하여 비즈니스 고객은 굵은 글씨와 버튼, 개인 고객은 밑줄로 표시하도록 구현했습니다.
3. 데이터 강조 효과
특정 조건별 색상 지정 (ZALV_C_D25_F01의 make_data 부분)
" 라인 색상 지정
IF gs_sbook-fldate(6) = gs_sbook-order_date(6).
gs_sbook-color = 'C710'.
ENDIF.
" 셀 색상 지정
IF gs_sbook-luggweight >= 25.
gs_col-fname = 'LUGGWEIGHT'.
gs_col-color-col = col_negative.
gs_col-color-int = 1.
gs_col-color-inv = 0.
APPEND gs_col to gs_sbook-it_col.
ENDIF.
ABAP
복사
중요한 정보는 색상으로 강조하여 예약일과 비행일이 같은 월인 경우 행 전체를 색상으로 표시하고, 25kg 이상의 화물 무게는 셀에 특별 색상을 적용하여 주의를 끌도록 했습니다.
4. 사용자 인터랙션 기능
사용자 정의 툴바 버튼 구현 (ZALV_C_D25_F02의 on_toolbar 부분)
FORM on_toolbar USING po_object TYPE REF TO cl_alv_event_toolbar_set.
DATA : ls_button TYPE stb_button.
ls_button-butn_type = 3." 구분선
INSERT ls_button INTO TABLE po_object->mt_toolbar.
CLEAR ls_button.
ls_button-function = 'AVG_LUGGAGE'.
ls_button-text = 'AVG_LUGGAGE'(avg).
ls_button-quickinfo = 'Calculate average luggage weight'(t02).
ls_button-butn_type = 0.
INSERT ls_button INTO TABLE po_object->mt_toolbar.
CLEAR ls_button.
ls_button-function = 'AVG_AMOUNT'.
ls_button-text = 'Avg Amount'(mar).
ls_button-quickinfo = 'Calculate average amount by route'(t03).
ls_button-butn_type = 0.
INSERT ls_button INTO TABLE po_object->mt_toolbar.
ENDFORM.
ABAP
복사
사용자가 쉽게 접근할 수 있는 맞춤형 툴바 버튼을 추가하여 평균 화물 무게 계산과 항공편별 평균 금액 계산 기능을 구현했습니다.
5. 데이터 분석 기능
평균 화물 무게 계산 기능 (ZALV_C_D25_F02의 avg_luggage 부분)
FORM avg_luggage .
DATA: lt_row_no TYPE lvc_t_roid,
ls_row_no TYPE lvc_s_roid,
lv_luggweight TYPE p DECIMALS 2,
lv_cnt TYPE i,
lv_avg TYPE p DECIMALS 2,
lv_text TYPE string.
CLEAR: lv_luggweight, lv_cnt, lv_avg.
go_alv_grid->get_selected_rows( IMPORTING et_row_no = lt_row_no ).
IF lt_row_no IS INITIAL.
MESSAGE '하나라도 선택해줘' TYPE 'I'.
EXIT.
ENDIF.
lv_cnt = lines( lt_row_no ).
LOOP AT lt_row_no INTO ls_row_no.
READ TABLE gt_sbook INTO gs_sbook INDEX ls_row_no-row_id.
IF sy-subrc = 0.
lv_luggweight = lv_luggweight + gs_sbook-luggweight.
ENDIF.
ENDLOOP.
lv_avg = lv_luggweight / lv_cnt.
lv_text = '평균 무게 : ' && lv_avg.
MESSAGE lv_text TYPE 'I'.
ENDFORM.
ABAP
복사
선택한 항공권 예약에 대한 평균 화물 무게를 계산하여 사용자에게 제공하는 기능입니다. 사용자가 선택한 행들의 데이터를 분석하여 유용한 인사이트를 제공합니다.
6. 컨텍스트 메뉴 기능
우클릭 메뉴 구현 (ZALV_C_D25_F02의 on_context_menu_request 부분)
FORM on_context_menu_request USING po_object TYPE REF TO cl_ctmenu
CHANGING pv_rowid TYPE i.
cl_ctmenu=>load_gui_status(
EXPORTING
program = sy-cprog
status = 'CUSTOMER_INFO'
menu = po_object
).
" 현재 선택된 행 정보 가져오기
DATA : ls_col TYPE lvc_s_col.
DATA : lv_value(20), lv_col TYPE i,
ls_row_id TYPE lvc_s_row,
ls_row_no TYPE lvc_s_roid.
DATA : lv_rowid TYPE i.
go_alv_grid->get_current_cell(
IMPORTING
e_row = lv_rowid
e_value = lv_value
e_col = lv_col
es_row_id = ls_row_id
es_col_id = ls_col
es_row_no = ls_row_no
).
pv_rowid = ls_row_no-row_id.
ENDFORM.
ABAP
복사
사용자가 특정 행에서 우클릭 시 컨텍스트 메뉴를 표시하여 추가 정보나 기능에 접근할 수 있도록 했습니다.
7. 이벤트 처리 및 사용자 상호작용
버튼 클릭 이벤트 처리 (ZALV_C_D25_F02의 on_button_click 부분)
FORM on_button_click USING ps_col TYPE lvc_s_col
ps_row_no TYPE lvc_s_roid.
CASE ps_col-fieldname.
WHEN 'BNT_TEXT'.
READ TABLE gt_sbook INTO gs_sbook INDEX ps_row_no-row_id.
IF sy-subrc NE 0.
MESSAGE i075(bc405_408).
EXIT.
ENDIF.
SUBMIT /1bcdwb/dbsbook
WITH i5 = gs_sbook-customid
AND RETURN.
ENDCASE.
ENDFORM.
ABAP
복사
비즈니스 고객의 경우 버튼 클릭 시 해당 고객의 모든 예약 정보를 조회할 수 있는 별도 프로그램을 호출하여 상세 정보에 쉽게 접근할 수 있도록 구현했습니다.
8. 클래스 기반 이벤트 핸들러 구현
이벤트 핸들러 클래스 (ZALV_C_D25_C01)
CLASS : lcl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-DATA : gv_rowid TYPE i.
CLASS-METHODS : on_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object.
CLASS-METHODS : on_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
CLASS-METHODS : on_context_menu_request FOR EVENT context_menu_request OF cl_gui_alv_grid IMPORTING e_object.
CLASS-METHODS : on_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING es_row_no e_column e_row.
CLASS-METHODS : on_button_click FOR EVENT button_click OF cl_gui_alv_grid IMPORTING es_col_id es_row_no.
ENDCLASS.
ABAP
복사