SAP/ABAP

[ABAP] ALV 출력하기 - Custom Container 사용

살구 연구소장 2025. 9. 13. 17:49

안녕하세요 이번 포스팅은 

ABAP 중에 가장 많이 사용하는 ALV 출력하기 입니다.

 

도킹 / 스플릿 도 있지만 이번에는

가장 기초인 Custom Container 를 이용해서 ALV를 출력하겠습니다.

 

결과화면

ㄴSCARR 테이블을 그대로 출력하는 소스입니다.

코드

 

메인

 

아밥 이벤트들이 있습니다.

해당하는 개념들은 따로 포스팅으로 정리하겠습니다.

*&---------------------------------------------------------------------*
*& Report ZALV_BASIC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALV_BASIC.

INCLUDE ZALV_BASIC_TOP.
INCLUDE ZALV_BASIC_SCR.
INCLUDE ZALV_BASIC_C01.
INCLUDE ZALV_BASIC_O01.
INCLUDE ZALV_BASIC_I01.
INCLUDE ZALV_BASIC_F01.

*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
* INITIALIZATION
*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
INITIALIZATION.

*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
* AT SELECTION-SCREEN OUTPUT
*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
AT SELECTION-SCREEN OUTPUT.

*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
* AT SELECTION-SCREEN
*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
AT SELECTION-SCREEN.

*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
* START-OF-SELECTION
*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
START-OF-SELECTION.
  PERFORM SELECT_DATA.
*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
* END-OF-SELECTION.
*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*
END-OF-SELECTION.
  CALL SCREEN 0100.

 

TOP - 변수들이 선언되어있는 곳

 

 

*&---------------------------------------------------------------------*
*& Include          ZALV_BASIC_TOP
*&---------------------------------------------------------------------*

TABLES SCARR.

DATA GS_SCARR LIKE SCARR,
           GT_SCARR  LIKE TABLE OF GS_SCARR.

DATA GR_GRID TYPE REF TO CL_GUI_ALV_GRID,
           GR_CON1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

DATA GS_VARIANT TYPE DISVARIANT.

DATA GS_LAYOUT  TYPE LVC_S_LAYO.

DATA OK_CODE LIKE SY-UCOMM.

 

SCR 

 

SCR의 경우 Selection Screen 관련된 코드들이 있습니다.

 

하지만 여기에서는 Selcetion - Screen을 만들지 않아 소스가 없습니다.

또한 TOP에 같이 적는 경우도 있습니다

.

이건 개발자 취향인 거 같습니다.

 

저는 개인적으로 분할해두는 걸 좋아해서 따로 분리합니다.

 

C01

 

클래스 관련한 소스들을 모아두빈다.

여기서는 핫스팟 / 더블클릭 등 이벤트를 넣지 않았기 떄문에 아무런 소스가 없습니다.

 

O01

 

PBO 입니다.

Screen 이 나오기 전에 작동하는 로직을 모아둡니다.

 

나중에 100번 화면을 만들면 Flow Logic 이 존재하는데 거기 넣어둡니다

.플로우 로직에서는 로직을 추가할 수 없습니다. - MODULE 로 추가해줌

 

밑에 코드를 누면 OK_CODE라는 유저의 Fcuntion Code를 저장하는 변수를 Clear 해주는 로직 / Status라고 화면에 제목

그리고 어플리케이션 툴바 관련된 로직들을 넣을 수 있습니다.

 

 

*&---------------------------------------------------------------------*
*& Include          ZALV_BASIC_O01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'PF_0100'.
  SET TITLEBAR 'TT_0100'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module CLEAR_OK_CODE OUTPUT
*&---------------------------------------------------------------------*
MODULE clear_ok_code OUTPUT.
  CLEAR OK_CODE.
ENDMODULE.

 

I01 

PAI 라고 화면이 나오고 버튼을 누르거나 거기서 유저가 어떤 이벤트를 작동시킬 때 넣어두는 로직들입니다.

 

*&---------------------------------------------------------------------*
*& Include          ZALV_BASIC_I01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
MODULE exit INPUT.

  CASE OK_CODE.
    WHEN 'BACK' OR 'CANC'.
      LEAVE TO SCREEN 0.

    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.

ENDMODULE.

 

F01

PERFORM 문을 모아둔 곳입니다.

가장 소스가 긴 곳입니다.

 

*&---------------------------------------------------------------------*
*& Include          ZALV_BASIC_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SELECT_DATA
*&---------------------------------------------------------------------*
FORM select_data .

  " 인터널 테이블 초기화
  REFRESH GT_SCARR.

  " 데이터 가져오기
  SELECT CARRID
                CARRNAME
                CURRCODE
                URL
     FROM SCARR
     INTO CORRESPONDING FIELDS OF TABLE GT_SCARR.


ENDFORM.
*&---------------------------------------------------------------------*
*& Module INIT_ALV OUTPUT
*&---------------------------------------------------------------------*
MODULE init_alv OUTPUT.

  IF GR_GRID IS INITIAL.

    PERFORM SET_VARIANT.
    PERFORM SET_LAYOUT.

    " 컨테이너 생성
    PERFORM CREATE_CONTAINER.
    " ALV 컨테이너 생성
    PERFORM CREAET_ALV.
    " ALV 생성
    PERFORM DISPLAY_ALV.


  ENDIF.

ENDMODULE.
*&---------------------------------------------------------------------*
*& Form SET_VARIANT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM set_variant .

  CLEAR GS_VARIANT.
  GS_VARIANT-HANDLE     '1'.
  GS_VARIANT-REPORT     SY-REPID.
  GS_VARIANT-USERNAME SY-UNAME.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_LAYOUT
*&---------------------------------------------------------------------*
FORM set_layout .
  CLEAR GS_LAYOUT.

  GS_LAYOUT-SEL_MODE    'D'.
  GS_LAYOUT-ZEBRA           'X'.
  GS_LAYOUT-CWIDTH_OPT 'X'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREATE_CONTAINER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM create_container .

  CREATE OBJECT GR_CON1
    EXPORTING
      CONTAINER_NAME 'CONT'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CREAET_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM creaet_alv .

  CREATE OBJECT GR_GRID
    EXPORTING
      I_PARENT GR_CON1.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM display_alv .

  CALL METHOD GR_GRID->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      I_STRUCTURE_NAME      'SCARR'  " Internal Output Table Structure Name
      IS_VARIANT                    =  GS_VARIANT   " Layout
      I_SAVE                           =   'A'  " Save Layout
      I_DEFAULT                     =   'X'    " Default Display Variant
      IS_LAYOUT                    =   GS_LAYOUT  " Layout
    CHANGING
      IT_OUTTAB                     =  GT_SCARR.

ENDFORM.

 

100번 화면

위에서 말한 PBO 와 PAI 로직들이 모인 곳입니다.

 

 

Custome Container 는 화면에다가 컨테이너를 그려줘야하고 

해당 버튼을 눌러서 그려줍니다.

그리고 더블클릭을 하면 이름을 넣어 줄 수 있습니다.

해당하는 부분을 컨테이너 생성할 때 넣어줘야합니다.

 

 

그리고 100번 화면에 요소리스트에

해당하는 OK_CODE를 넣어줘야 뒤로가기나 다른 이벤트들이 작동합니다.

 

아까 위에 PBO에 나온 부분인데

 

일단 STATUS를 통해 뒤로가기 / 취소하기 버튼을 추가할 수 있습니다.

여기서 선언을 한뒤에 PAI에 저기 화면에 적어둔 BACK / EXIT / CANC 을 이용해 로직을 적습니다.

 

그리고 해당 버튼을 더블클릭해서 기능유형을 명령어로 해줘야합니다. 저기 3개만 BACK은 안하시는분들도 있습니다.

이렇게 설정하고

해당 키워드를 씁니다.

 

저 키워드를 쓴다는 건 다른 로직들은 무시하고 그냥 나가겠다라는 뜻입니다.

 

그리고 TT_0100 은 ALV 화면에 제목을 적습니다.

 

여기에 해당하는 부분입니다.

 

ALV 구조를 보면 아시겠지만

ALV를 생성할 때 컨테이너 생성하고

GR_CON1이라는 컨테이너 객체를 생성 아까 스크린 100번 화면에 커스텀 컨테이너 영역과 매핑

 

그 후 ALV 객체 GR_GRID에 위에서 생성한 컨테이너 GR_CON1과 연결해줍니다.

 

 

생성된 ALV 객체를 SET_TABLE_FOR_FIRST_DISPLAY 메소드를 이용해 ALV를 출력해줍니다.

 

저기는 제일 간단한 파라미터만 쓴건데 요액하자면 ALV 필드 카탈로그들을 아밥디셕너리 'SCARR' 를 참조해서 만들고

GS_VARIANT 라는 변수를 사용해 ALV VARIANT 설정 , GS_LAYOUT 변수를 사용해 LAYOUT 지정

 

IT_OUTTAB에 매핑된 변수는 출력할 데이터들입니다.

 

 

혹시 모르시는 부분이 있으시면 댓글 남겨주시면 답변 드리겠습니다.

 

감사합니다.