
SAP에서 ALV (ABAP List Viewer)는 데이터를 리스트 형식으로 유연하고 인터랙티브하게 보여주는 강력한 도구입니다.
정렬, 필터링, 레이아웃 변경과 같은 기능을 제공하여 사용자의 편의성을 높입니다.
이번 포스팅에서는 MSEG 테이블에서 데이터를 가져와 ALV 그리드에 표시하는 간단한 예제를 단계별로 구현해 보겠습니다.
이 예제에서는 데이터 조회, 표시, 편집, 저장 등의 기능을 포함합니다.
ALV는 ABAP List Viewer의 약자로, 내부 테이블에 있는 데이터를 보기 쉽게 출력해주는 도구입니다.
고전적인 리포트에 비해 더 많은 기능을 제공하며, 그 중 몇 가지는 다음과 같습니다:
이 코드는 SAP ABAP 환경에서 MSEG 테이블의 데이터를 조회하여 ALV 그리드에 표시하는 리포트를 작성하는 데 중점을 둡니다.
또한, ALV 그리드와 Funtion Module을 통해 사용자가 데이터를 선택하고 저장하는 기능을 포함하고 있습니다.
먼저 리포트 이름을 정의하고, 데이터 조회와 출력 로직을 처리하는 두 개의 서브 모듈을 포함시킵니다.
ALV 출력은 START-OF-SELECTION 이벤트에서 get_data와 display_data 폼을 호출하여 실행됩니다.
*&---------------------------------------------------------------------*
*& Report YALV_FM
*&---------------------------------------------------------------------*
REPORT yalv_fm.
INCLUDE yalv_fm_top.
INCLUDE yalv_fm_f01.
INITIALIZATION.
START-OF-SELECTION.
PERFORM get_data CHANGING gt_mseg.
PERFORM display_data.
먼저, MSEG 테이블에서 가져올 데이터 구조를 정의합니다.
이 구조는 자재 문서 번호, 문서 연도, 자재 번호, 공장, 저장 위치 등의 필드를 포함합니다.
TYPES: BEGIN OF gts_mseg,
mblnr TYPE mblnr, " 자재 문서 번호
mjahr TYPE mjahr, " 자재 문서 연도
matnr TYPE matnr, " 자재 번호
werks TYPE werks_d, " 공장
lgort TYPE lgort_d, " 저장 위치
END OF gts_mseg.
ALV에 표시할 데이터를 관리하기 위해 선택 필드가 추가된 구조를 정의합니다.
TYPES: BEGIN OF gts_mseg_alv,
sel TYPE c LENGTH 1, " 선택 필드
INCLUDE TYPE gts_mseg. " MSEG 구조 포함
END OF gts_mseg_alv.
데이터를 저장할 내부 테이블을 선언하고, 사용자가 조회할 데이터를 입력할 수 있도록 선택 옵션을 설정합니다.
DATA: gt_mseg TYPE TABLE OF gts_mseg, " MSEG 데이터 저장
gt_mseg_alv TYPE TABLE OF gts_mseg_alv. " ALV용 MSEG 데이터 저장
SELECT-OPTIONS: s_mblnr FOR gd_mblnr, " 자재 문서 번호 범위
s_mjahr FOR gd_mjahr, " 자재 문서 연도 범위
s_matnr FOR gd_matnr, " 자재 번호 범위
s_werks FOR gd_werks. " 공장 범위
MSEG 테이블에서 데이터를 조회하여 내부 테이블에 저장하는 폼을 정의합니다.
사용자 입력에 따라 필터링된 데이터를 조회할 수 있습니다.
FORM get_data CHANGING c_gt_mseg LIKE gt_mseg.
SELECT
mblnr,
mjahr,
matnr,
werks,
lgort
FROM mseg
INTO TABLE @c_gt_mseg
WHERE mblnr >= s_mblnr-low AND mblnr <= s_mblnr-high.
IF sy-subrc <> 0.
MESSAGE 'MSEG Data not found' TYPE 'E'.
ENDIF.
ENDFORM.
이 폼에서는 MSEG 테이블에서 자재 문서 번호 범위를 기준으로 데이터를 가져옵니다.
조회된 데이터는 c_gt_mseg 테이블에 저장됩니다.
get_fieldcat과 get_layout 서브 폼을 호출하여 필드 카탈로그와 레이아웃을 준비합니다.
필드 카탈로그는 ALV 그리드의 구조를 정의하고,
레이아웃은 ALV의 외형을 설정합니다.
gt_mseg 테이블의 데이터를 gt_mseg_alv 테이블로 변환합니다.
여기서 CORRESPONDING 구문을 사용하여 구조가 다른 두 테이블 간의 데이터를 매핑합니다.
gt_mseg_alv는 선택 필드(sel)가 추가된 구조이기 때문에, 이를 통해 ALV 그리드에서 선택 기능을 사용할 수 있습니다.
call_fm_for_display 폼을 호출하여 ALV 그리드를 화면에 표시합니다.
이때, 필요한 매개변수로 데이터 테이블, 필드 카탈로그, 레이아웃 구조를 전달합니다.
FORM display_data.
PERFORM get_fieldcat CHANGING gt_fieldcat.
PERFORM get_layout CHANGING gs_layout.
gt_mseg_alv = CORRESPONDING #( gt_mseg ).
PERFORM call_fm_for_display CHANGING gt_mseg_alv
gt_fieldcat
gs_layout.
ENDFORM.
ALV 그리드에서 데이터를 표시하기 위해서는 필드 카탈로그를 설정해야 합니다.
필드 카탈로그는 ALV 그리드에 표시할 각 컬럼의 속성을 정의합니다.
FORM get_fieldcat CHANGING c_gt_fieldcat LIKE gt_fieldcat.
DATA: lw_int TYPE int1.
CLEAR: gt_fieldcat[].
PERFORM build_catalog USING 'MBLNR' 'GT_MSEG' TEXT-T01 abap_false CHANGING lw_int gt_fieldcat.
PERFORM build_catalog USING 'MJAHR' 'GT_MSEG' TEXT-T02 abap_false CHANGING lw_int gt_fieldcat.
PERFORM build_catalog USING 'MATNR' 'GT_MSEG' TEXT-T03 abap_true CHANGING lw_int gt_fieldcat.
PERFORM build_catalog USING 'WERKS' 'GT_MSEG' TEXT-T04 abap_true CHANGING lw_int gt_fieldcat.
PERFORM build_catalog USING 'LGORT' 'GT_MSEG' TEXT-T05 abap_false CHANGING lw_int gt_fieldcat.
ENDFORM.
여기서는 필드명, 테이블명, 필드 설명, 편집 가능 여부 등을 각각의 필드에 대해 설정합니다.
이 예제에서는 자재 문서 번호(MBLNR), 자재 문서 연도(MJAHR), 자재 번호(MATNR), 공장(WERKS), 저장 위치(LGORT)를 ALV 그리드에 표시하도록 필드 카탈로그를 설정했습니다.
ALV 그리드에 표시할 각 필드의 속성을 정의하고, 이를 필드 카탈로그에 추가하여 최종적으로 ALV에 필요한 정보를 구성하는 역할을 합니다.
FORM build_catalog USING VALUE(p_fieldname)
VALUE(p_tabname)
VALUE(p_text)
VALUE(p_edit)
CHANGING c_lw_int 현재 필드의 위치를 나타내는 정수 값
c_gt_fieldcat LIKE gt_fieldcat. "필드 카탈로그를 저장할 테이블
DATA: ls_fieldcat LIKE LINE OF gt_fieldcat.
ls_fieldcat-col_pos = c_lw_int. " 필드 위치
ls_fieldcat-fieldname = p_fieldname. " 필드명
ls_fieldcat-tabname = p_tabname. " 테이블명
ls_fieldcat-seltext_m = p_text. " 필드 설명
ls_fieldcat-edit = p_edit. " 편집 가능 여부
APPEND ls_fieldcat TO c_gt_fieldcat. " 필드 카탈로그에 추가
CLEAR: ls_fieldcat.
c_lw_int = c_lw_int + 1. " 다음 필드 위치로 증가
ENDFORM.
ALV의 레이아웃을 설정하는 폼을 작성합니다.
컬럼 너비를 자동으로 조정하고, 선택 필드를 추가합니다.
FORM get_layout CHANGING c_gs_layout TYPE slis_layout_alv.
c_gs_layout-colwidth_optimize = abap_true. " 컬럼 너비 자동 조정
c_gs_layout-box_fieldname = 'SEL'. " 선택 필드 지정
ENDFORM.
이 설정을 통해 컬럼의 너비가 자동으로 조정되며,
선택 필드를 통해 사용자는 특정 데이터를 선택할 수 있게 됩니다.
ALV 데이터를 실제로 표시하는 부분입니다.
SAP 표준 함수 REUSE_ALV_GRID_DISPLAY를 호출하여 그리드 형식으로 데이터를 화면에 표시합니다.
FORM call_fm_for_display USING VALUE(p_gt_mseg) LIKE gt_mseg_alv "ALV로 출력할 데이터 테이블
VALUE(p_gt_fieldcat) LIKE gt_fieldcat "ALV 필드 카탈로그 (각 필드의 정보와 속성)
VALUE(p_gs_layout) TYPE slis_layout_alv. "ALV 레이아웃 설정 (컬럼 너비 및 외형 옵션)
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog " 현재 프로그램 이름
is_layout = p_gs_layout " 설정된 레이아웃
it_fieldcat = p_gt_fieldcat " 필드 카탈로그
i_callback_user_command = 'USER_COMMAND' " 사용자 명령 처리
i_callback_pf_status_set = 'SET_PF_STATUS' " 상태 설정
TABLES
t_outtab = p_gt_mseg
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'Error ALV' TYPE 'E'.
ELSE.
MESSAGE 'Success ALV' TYPE 'S'.
ENDIF.
ENDFORM.
이 함수는 화면에 데이터를 그리드 형식으로 출력하며,
사용자가 데이터를 선택하거나 명령어를 실행할 수 있도록 설정합니다.
특정 이벤트에 대한 동작을 정의하고, 사용자가 입력한 명령에 따라 다양한 기능을 수행합니다.
여기서 주요한 사용자 명령으로는 데이터 저장, 트랜잭션 호출, 화면 종료 등이 포함됩니다.
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lt_mseg_insert TYPE TABLE OF ztb_mseg, " 데이터 저장 테이블
ls_mseg_insert TYPE ztb_mseg. " 데이터 저장 구조
CASE r_ucomm.
WHEN '&IC1'. " 특정 이벤트 처리
IF rs_selfield-fieldname = 'MBLNR'. " 자재 문서 번호 클릭 시
CALL TRANSACTION 'SE38' AND SKIP FIRST SCREEN. " SE38 트랜잭션 호출
ENDIF.
WHEN '&BACK' OR '&EXIT' OR '&CANCEL'. " 뒤로 가기, 종료, 취소
LEAVE TO SCREEN 0.
WHEN '&SAVE'. " 저장 버튼
PERFORM check_change_data_alv. " 변경된 데이터 확인
lt_mseg_insert = VALUE #( FOR ls_mseg_alv IN gt_mseg_alv WHERE ( sel = 'X' ) ( CORRESPONDING #( ls_mseg_alv ) ) ). " 선택된 데이터 저장
MODIFY ztb_mseg FROM TABLE lt_mseg_insert. " 테이블 업데이트
IF sy-subrc = 0.
MESSAGE: 'Success!' TYPE 'S'.
ENDIF.
WHEN 'DELETE'.
PERFORM delete. " 삭제 기능 호출
WHEN OTHERS.
ENDCASE.
rs_selfield-refresh = 'X'. " ALV 새로고침하여 그리드에 반영된 상태 확인
ENDFORM.
ZTB_MSEG 테이블

ALV에서 사용자가 데이터를 수정했는지 확인하는 기능을 수행합니다.
ALV에서 데이터를 편집한 후, 변경된 내용이 있는지를 체크하고,
필요한 경우 후속 처리를 진행하는 데 유용합니다.
FORM check_change_data_alv.
DATA: lref_grid TYPE REF TO cl_gui_alv_grid,
lw_valid TYPE c.
IF lref_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lref_grid.
ENDIF.
IF NOT lref_grid IS INITIAL.
CALL METHOD lref_grid->check_changed_data
IMPORTING
e_valid = lw_valid.
ENDIF.
ENDFORM.
ALV에서 데이터를 삭제할 때 사용자에게 확인 팝업을 띄우고, 삭제 작업을 실행하거나 취소하는 기능을 담당합니다.
FORM DELETE.
DATA: LW_ANSWER TYPE CHAR1.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
TITLEBAR = 'Warning Message' " 팝업 제목
TEXT_QUESTION = 'Are you sure?' " 질문 텍스트
TEXT_BUTTON_1 = 'Yes' " 첫 번째 버튼: Yes
TEXT_BUTTON_2 = 'No' " 두 번째 버튼: No
DEFAULT_BUTTON = '2' " 기본 선택: No
DISPLAY_CANCEL_BUTTON = ''
IMPORTING
ANSWER = LW_ANSWER " 사용자 응답
EXCEPTIONS
TEXT_NOT_FOUND = 1
OTHERS = 2.
CASE LW_ANSWER.
WHEN '1'.
" 삭제 전 ALV 데이터 변경 사항 확인
PERFORM CHECK_CHANGE_DATA_ALV.
" 데이터 삭제 후 확인
PERFORM CHECK_DATA_AFTER_DEL CHANGING GT_MSEG_ALV.
WHEN '2'.
" 삭제 취소 시 메시지 출력
MESSAGE 'The action is cancel.' TYPE 'S' DISPLAY LIKE 'E'.
WHEN OTHERS.
" 기타 경우
ENDCASE.
ENDFORM.
ALV에서 선택된 데이터를 삭제한 후의 처리를 담당합니다.
선택된 데이터가 실제 테이블에 있는지 확인한 다음, 테이블에 없는 데이터만 ALV에서 삭제하며, 삭제 후 데이터를 다시 확인하는 역할을 합니다.
FORM CHECK_DATA_AFTER_DEL CHANGING C_GT_MSEG_ALV LIKE GT_MSEG_ALV.
DATA: LT_MSEG_ALV_1 LIKE GT_MSEG_ALV.
" 선택된 ALV 데이터 가져오기
LT_MSEG_ALV_1 = VALUE #( FOR LS_MSEG_ALV IN GT_MSEG_ALV WHERE ( SEL = 'X' )
( CORRESPONDING #( LS_MSEG_ALV ) ) ).
IF LT_MSEG_ALV_1[] IS NOT INITIAL.
" 데이터베이스에서 자재 문서 번호 조회
SELECT MBLNR
FROM ZTB_MSEG
FOR ALL ENTRIES IN @LT_MSEG_ALV_1
WHERE MBLNR = @LT_MSEG_ALV_1-MBLNR
INTO TABLE @DATA(LT_MBLNR).
ENDIF.
" 첫 번째 조회 결과 확인
READ TABLE LT_MBLNR INTO DATA(LS_MBLNR) INDEX 1.
IF SY-SUBRC = 0.
" 데이터베이스에 존재할 경우 오류 메시지 출력
MESSAGE 'This data record already exists in the table' TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
" 존재하지 않을 경우 선택된 데이터 삭제
DELETE C_GT_MSEG_ALV WHERE SEL = 'X'.
" 변경 사항 확인
PERFORM CHECK_CHANGE_DATA_ALV.
MESSAGE 'Delete success!' TYPE 'S'.
ENDIF.
ENDFORM.
ALV 화면에서 사용자 인터페이스의 상태(PF-STATUS)를 설정하는 역할을 합니다.
SAP ALV에서 인터페이스 상태는 사용자가 상호작용할 수 있는 버튼이나 기능을 정의하는 중요한 요소입니다.
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'GUI_SATATUS_TESTING'. " 상태 설정
ENDFORM.
GUI Status


SAP ABAP에서 ALV를 사용하여 데이터를 조회하고 표시하는 방법을 알아보았습니다.
이 과정에서 필드 카탈로그와 레이아웃을 설정하고,
데이터를 조회하여 ALV 그리드에 출력하는 전 과정을 다뤘습니다.
또한, ALV 그리드에서 데이터를 편집하고 저장하는 방법도 살펴보았습니다.