[6주차] SAP ERP: 항공편 조회

j_wisdom_h·2025년 2월 26일
0

SAP

목록 보기
1/8

[6주차] SAP ERP: 항공편 조회 결과화면

1. 데이터 선언 및 선택 화면 설정

REPORT z3week_hw.

TABLES: sbook.

TYPE-POOLS: slis, vrm.  " ALVVRM 관련 선언

* 데이터 선언
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.

2. 초기화 및 화면 출력 준비

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.

3. 데이터 조회 및 ALV 관련 설정

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

4. ALV 리포트 출력 및 데이터 조회

*&---------------------------------------------------------------------*
*&      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

에러1 : p_connid is not an internal table.

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 함수를 사용

VRM_SET_VALUES

ABAP에서 리스트박스(LISTBOX)나 드롭다운 필드의 값(옵션들)을 동적으로 설정하는 함수.

즉, 선택 가능한 값들을 동적으로 채워야 할 때 사용하는 함수로, SELECTION-SCREEN의 AS LISTBOX 파라미터에 값을 설정하는 역할을 한다. 키-값 구조로 리스트를 설정한다.

  • KEY : 실제 선택될 값 (데이터베이스 저장 값)
  • TEXT : UI에 표시될 텍스트

📌 사용 방법

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 순서로 호출

  • INITIALIZATION: 프로그램 시작 시 초기화 작업 (파라미터 초기화, 기본값 설정 등).
  • AT SELECTION-SCREEN OUTPUT: 선택화면을 그리기 전에 동적 조작 (리스트박스 항목 추가, UI 수정 등).
  • START-OF-SELECTION: 사용자가 선택 후 실제 로직 처리 (데이터 조회, 리포트 출력 등).
profile
뚜잇뚜잇

0개의 댓글