REPORT z3week_hw.
TABLES: sbook.
TYPE-POOLS: slis, vrm. " ALV 및 VRM 관련 선언
* 데이터 선언
TYPES: BEGIN OF t_join,
carrid TYPE sbook-carrid,
connid TYPE sbook-connid,
fldate TYPE sbook-fldate,
bookid TYPE sbook-bookid,
customid TYPE sbook-customid,
cancelled TYPE sbook-cancelled,
END OF t_join.
DATA: it_book TYPE STANDARD TABLE OF t_join, " 출력용 테이블
wa_book TYPE t_join.
* 리스트박스 관련 데이터
DATA: gt_list TYPE vrm_values,
gs_list TYPE vrm_value.
* ALV 데이터 선언
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.
* 선택화면 설정
SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN SKIP.
PARAMETERS: p_carrid(3) TYPE c VISIBLE LENGTH 3 DEFAULT 'AA' MATCHCODE OBJECT H_SCARR,
p_connid(8) TYPE i VISIBLE LENGTH 8 DEFAULT 17 AS LISTBOX,
p_fldate(8) TYPE d DEFAULT '20171219'.
SELECTION-SCREEN END OF BLOCK part1.
SELECTION-SCREEN BEGIN OF BLOCK part2 WITH FRAME TITLE TEXT-002.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS s_custid FOR sbook-CUSTOMID.
PARAMETERS: r1 RADIOBUTTON GROUP rad DEFAULT 'X',
r2 RADIOBUTTON GROUP rad,
r3 RADIOBUTTON GROUP rad.
SELECTION-SCREEN END OF BLOCK part2.
INITIALIZATION.
PERFORM populate_connid_list.
AT SELECTION-SCREEN OUTPUT.
PERFORM populate_connid_list.
*&---------------------------------------------------------------------*
*& Form populate_connid_list
*&---------------------------------------------------------------------*
FORM populate_connid_list.
DATA: lt_connid TYPE TABLE OF sbook-connid,
wa_connid TYPE sbook-connid.
" 리스트박스 초기화
CLEAR gt_list.
" SBOOK 테이블에서 CONNID 리스트 가져오기
SELECT DISTINCT connid FROM sbook INTO TABLE lt_connid.
" 리스트박스에 값 추가
LOOP AT lt_connid INTO wa_connid.
gs_list-key = wa_connid.
gs_list-text = wa_connid.
APPEND gs_list TO gt_list.
ENDLOOP.
" 리스트박스 값 설정
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_CONNID' " 리스트박스 필드 ID
values = gt_list.
ENDFORM.
START-OF-SELECTION.
PERFORM data_retrieval.
PERFORM build_fieldcatalog.
PERFORM build_layout.
PERFORM display_alv_report.
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
FORM build_fieldcatalog.
fieldcatalog-fieldname = 'CARRID'.
fieldcatalog-seltext_m = 'Airline Code'.
fieldcatalog-col_pos = 0.
fieldcatalog-outputlen = 10.
APPEND fieldcatalog TO fieldcatalog.
CLEAR fieldcatalog.
fieldcatalog-fieldname = 'CONNID'.
fieldcatalog-seltext_m = 'Flight Connection Number'.
fieldcatalog-col_pos = 1.
fieldcatalog-lzero = 'X'.
APPEND fieldcatalog TO fieldcatalog.
CLEAR fieldcatalog.
fieldcatalog-fieldname = 'BOOKID'.
fieldcatalog-seltext_m = 'Booking number'.
fieldcatalog-col_pos = 2.
APPEND fieldcatalog TO fieldcatalog.
CLEAR fieldcatalog.
fieldcatalog-fieldname = 'CUSTOMID'.
fieldcatalog-seltext_m = 'Customer Number'.
fieldcatalog-col_pos = 3.
APPEND fieldcatalog TO fieldcatalog.
CLEAR fieldcatalog.
fieldcatalog-fieldname = 'CANCELLED'.
fieldcatalog-seltext_m = 'Cancelation flag'.
fieldcatalog-col_pos = 4.
APPEND fieldcatalog TO fieldcatalog.
CLEAR fieldcatalog.
ENDFORM. " BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
*& Form BUILD_LAYOUT
*&---------------------------------------------------------------------*
FORM build_layout.
gd_layout-no_input = 'X'.
gd_layout-colwidth_optimize = 'X'.
gd_layout-zebra = 'X'.
ENDFORM. " BUILD_LAYOUT
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV_REPORT
*&---------------------------------------------------------------------*
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_book
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
ENDFORM. " DISPLAY_ALV_REPORT
*&---------------------------------------------------------------------*
*& Form DATA_RETRIEVAL
*&---------------------------------------------------------------------*
FORM data_retrieval.
DATA: lv_cancelled TYPE sbook-cancelled.
" r1: 모든 예약 조회 (취소 여부 상관없음)
" r2: 유효한 예약 조회 (취소되지 않은 것만)
" r3: 취소된 예약 조회 (취소된 것만)
IF r1 = 'X'.
lv_cancelled = ''.
ELSEIF r2 = 'X'.
lv_cancelled = space. " 취소되지 않은 예약
ELSEIF r3 = 'X'.
lv_cancelled = 'X'. " 취소된 예약
ENDIF.
" 데이터 조회
IF r1 = 'X'.
SELECT carrid connid fldate bookid customid cancelled
FROM sbook
INTO TABLE it_book
WHERE carrid = p_carrid
AND connid = p_connid
AND fldate = p_fldate
AND customid IN s_custid.
ELSE.
SELECT carrid connid fldate bookid customid cancelled
FROM sbook
INTO TABLE it_book
WHERE carrid = p_carrid
AND connid = p_connid
AND fldate = p_fldate
AND customid IN s_custid
AND cancelled = lv_cancelled.
ENDIF.
ENDFORM. " DATA_RETRIEVAL
SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN SKIP.
PARAMETERS: p_carrid(3) TYPE c VISIBLE LENGTH 3 DEFAULT 'AA' MATCHCODE OBJECT H_SCARR,
p_connid(4) TYPE c VISIBLE LENGTH 4 DEFAULT '17' AS LISTBOX,
p_fldate TYPE d DEFAULT '20171219'.
SELECTION-SCREEN END OF BLOCK part1.
INITIALIZATION.
PERFORM populate_connid_list.
*&---------------------------------------------------------------------*
*& Form populate_connid_list
*&---------------------------------------------------------------------*
FORM populate_connid_list.
DATA: lt_connid TYPE TABLE OF sbook-connid,
wa_connid TYPE sbook-connid.
" SBOOK 테이블에서 CONNID 리스트 가져오기
SELECT DISTINCT connid FROM sbook INTO TABLE lt_connid.
" 리스트박스에 값 추가
LOOP AT lt_connid INTO wa_connid.
APPEND wa_connid TO p_connid. " 리스트박스 값 추가
ENDLOOP.
ENDFORM.
"p_connid is not an internal table"이 발생하는 이유는 p_connid가 단일 값(파라미터)이기 때문
p_connid는 리스트박스의 선택된 값을 저장하는 단일 변수일 뿐, 내부 테이블이 아니므로 APPEND로 직접 값을 넣을 수 없다.
=> 리스트박스를 설정하기위해 VRM_SET_VALUES 함수를 사용
ABAP에서 리스트박스(LISTBOX)나 드롭다운 필드의 값(옵션들)을 동적으로 설정하는 함수.
즉, 선택 가능한 값들을 동적으로 채워야 할 때 사용하는 함수로, SELECTION-SCREEN의 AS LISTBOX 파라미터에 값을 설정하는 역할을 한다. 키-값 구조로 리스트를 설정한다.
📌 사용 방법
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_CONNID' " 리스트박스를 적용할 필드명 (파라미터 ID)
values = gt_list. " 리스트박스에 들어갈 값 목록
📌 예제: VRM_SET_VALUES를 활용한 리스트박스 값 설정
TYPE-POOLS: vrm.
DATA: gt_list TYPE vrm_values, " 리스트박스 값을 저장할 내부 테이블
gs_list TYPE vrm_value. " 리스트박스의 개별 값을 저장할 구조체
SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_connid TYPE sbook-connid AS LISTBOX.
SELECTION-SCREEN END OF BLOCK part1.
INITIALIZATION.
PERFORM populate_connid_list.
*&---------------------------------------------------------------------*
*& Form populate_connid_list
*&---------------------------------------------------------------------*
FORM populate_connid_list.
DATA: lt_connid TYPE TABLE OF sbook-connid,
wa_connid TYPE sbook-connid.
" 리스트박스 값 초기화
CLEAR gt_list.
" SBOOK 테이블에서 CONNID 리스트 가져오기
SELECT DISTINCT connid FROM sbook INTO TABLE lt_connid.
" 리스트박스에 값 추가
LOOP AT lt_connid INTO wa_connid.
gs_list-key = wa_connid. " 키 (실제 선택될 값)
gs_list-text = wa_connid. " 표시될 텍스트
APPEND gs_list TO gt_list.
ENDLOOP.
" 리스트박스에 값 설정
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_CONNID' " 리스트박스 필드 ID
values = gt_list.
ENDFORM.
INITIALIZATION -> AT SELECTION-SCREEN OUTPUT -> START-OF-SELECTION 순서로 호출