본문 바로가기
ALV · 화면 · 리포트

[SAP ABAP] CL_GUI_DOCKING_CONTAINER 단독 사용 — SE51 없이 ALV 한 개 빠르게 띄우기 (DOCK_AT_LEFT · extension · IS NOT BOUND)

by Song.sh 2026. 5. 27.

ALV 그리드를 메인 화면에 가장 빠르게 띄우는 컨테이너가 CL_GUI_DOCKING_CONTAINER 입니다. 이름 그대로 "Dock(부두에 배 대듯이) 화면 한 쪽에 영역을 자동으로 붙여주는" 컨테이너 — SE51 의 Custom Control 'AREA' 를 그릴 필요 없이 코드 한 줄로 부착됩니다.

 

Custom Container · Splitter · Easy Splitter 가 모두 SE51 Layout 에 Custom Control 을 먼저 배치해야 한다면, Docking 은 SE51 화면을 빈 상태로 두고 코드만으로 ALV 영역을 만들 수 있다 는 점이 가장 큰 강점. 빠른 시제품(prototype) · 표준 보고서 · 간단한 한 페이지짜리 ALV 출력에 가장 자주 쓰이는 패턴입니다.

 

이 글에서는 Docking 단독 사용 패턴 — 컨테이너 계층 → 5단계 생성 흐름 → DOCK_AT_* 4방향 상수 → extension 파라미터의 의미 → IS NOT BOUND 가드 패턴까지 정리합니다.

다중 ALV(2 분할 이상) 가 필요하면 [SAP ABAP] CL_GUI_SPLITTER_CONTAINER + DOCKING 글의 Splitter 조합 패턴을 참고. 데이터는 SAP 표준 학습 환경 테이블 SFLIGHT(항공편) 예시.

핵심 — Docking 의 단독 사용 구조

계층 클래스 역할
1. 화면 Screen 100 (빈 Layout) SE51 Custom Control 배치 X — Flow Logic 만 정의
2. Docking cl_gui_docking_container 화면 4면 중 한 쪽에 영역 자동 부착
3. ALV Grid cl_gui_alv_grid Docking 영역 안에 ALV 한 개 부착 (i_parent = go_dock)

다중 분할(좌/우 2개 ALV 등) 이 필요하면 Docking 안에 Splitter 를 한 단계 더 끼우는 [SAP ABAP] CL_GUI_SPLITTER_CONTAINER + DOCKING 글의 패턴으로 갑니다. 이 글은 가장 단순한 한 개 ALV 시나리오.

그림으로 정리하면:

Screen 100 (빈 화면)
  └ go_dock (cl_gui_docking_container)
      └ go_grid (cl_gui_alv_grid)
            ↑
        i_parent = go_dock 로 직접 부착
        Splitter 같은 중간 컨테이너 없음

Custom Container 패턴에서는 "SE51 'AREA' → cl_gui_custom_container → cl_gui_alv_grid" 3단계가 필요하지만, Docking 은 SE51 단계가 통째로 빠진 2단계 구조라 코드가 더 짧습니다.


1단계 — SE51 Screen 100 준비 (Layout 빈 상태)

Custom Container 시리즈와 가장 다른 점이 이 단계. CL_GUI_CUSTOM_CONTAINER 는 SE51 Layout 에 Custom Control 을 그려야 하지만, Docking 은 빈 Layout 으로 OK.

[1] T-Code SE51 → Program · Screen 100 (없으면 신규)

[2] Screen 100 의 Layout 은 빈 상태 (Custom Control 배치 X)

[3] Flow Logic 에 모듈 연결:
    PROCESS BEFORE OUTPUT.
      MODULE status_0100.
      MODULE create_alv.

    PROCESS AFTER INPUT.
      MODULE user_command_0100.

[4] 활성화

Docking 이 PBO 시점에 화면 한 쪽에 영역을 자동으로 잡아주므로, Layout 은 정말 빈 상태로 두면 됩니다.


2단계 — DATA 선언

ALV 한 개니까 Grid · Docking · Field Catalog · 데이터 테이블 각 한 세트만 필요. 다중 ALV 가 아니어서 코드가 매우 단순.

DATA: go_grid TYPE REF TO cl_gui_alv_grid,
      go_dock TYPE REF TO cl_gui_docking_container.

* ALV Layout / Sort / Field Catalog
DATA: g_layo TYPE lvc_s_layo,
      g_sort TYPE lvc_s_sort,
      gt_fcat TYPE lvc_t_fcat,
      gs_fcat TYPE lvc_s_fcat.

* 데이터 — SFLIGHT
DATA: gt_data TYPE TABLE OF sflight,
      ok_code TYPE sy-ucomm.

다중 ALV 컨테이너(Splitter/Easy Splitter) 와 달리 Grid/Field Catalog/데이터 테이블이 "단수" 로만 들어갑니다.


3단계 — START-OF-SELECTION → 데이터 조회 → CALL SCREEN

START-OF-SELECTION.

* ALV 표시할 데이터 조회 — SFLIGHT
  SELECT *
    INTO TABLE @gt_data
    FROM sflight.

END-OF-SELECTION.
  CALL SCREEN 100.

데이터를 채운 뒤 CALL SCREEN 100. 화면 100 의 PBO 가 돌면서 Docking → ALV 가 그려집니다.


4단계 — PBO 모듈에서 Docking + ALV 생성

PBO 의 두 모듈. status_0100 에서 GUI Status / Titlebar 를 세팅하고, create_alv 에서 Docking + ALV 를 생성.

MODULE status_0100 OUTPUT.
  SET PF-STATUS 'S100'.
  SET TITLEBAR  'T100'.
ENDMODULE.

MODULE create_alv OUTPUT.

  IF go_dock IS NOT BOUND.              " 첫 PBO 에서만 1회 생성

* 1) Docking Container — side 기본값 = DOCK_AT_LEFT
    go_dock = NEW #(
      dynnr     = sy-dynnr
      extension = 3000 ).               " 영역 두께 — 매우 크게 = 거의 전체 화면

* 2) ALV Grid 를 Docking 안에 직접 부착
    go_grid = NEW #( i_parent = go_dock ).

* 3) ALV 표시 — i_structure_name 으로 Field Catalog 자동 생성
    go_grid->set_table_for_first_display(
      EXPORTING
        i_structure_name = 'SFLIGHT'
      CHANGING
        it_fieldcatalog = gt_fcat
        it_outtab       = gt_data ).

  ENDIF.

ENDMODULE.

DOCK_AT_* 4방향 상수 — 어느 면에 부착할지

Docking 의 핵심 파라미터인 side 는 화면 4면 중 어느 쪽에 영역을 붙일지 결정합니다.

상수 부착 위치 extension 의미
dock_at_left 1 (기본) 화면 왼쪽 영역 너비
dock_at_top 2 화면 위쪽 영역 높이
dock_at_bottom 4 화면 아래쪽 영역 높이
dock_at_right 8 화면 오른쪽 영역 너비

side 를 지정하지 않으면 기본값 DOCK_AT_LEFT. 위 예시 코드처럼 side 를 생략하고 extension 만 매우 크게(3000) 주면, 왼쪽 영역이 화면을 거의 다 차지하면서 사실상 전체 화면 ALV 처럼 보입니다.

extension 의 의미 — 픽셀 단위, 충분히 크게 주면 전체 화면

extension 은 부착된 면의 "두께"(픽셀 단위, METRIC 기본값 기준):

  • DOCK_AT_LEFT · DOCK_AT_RIGHT 일 때 = 영역의 너비
  • DOCK_AT_TOP · DOCK_AT_BOTTOM 일 때 = 영역의 높이

기본값은 50 (매우 좁음). ALV 가 거의 안 보이므로 실무에서는 보통 500~1500 정도. 단일 ALV 를 거의 전체 화면처럼 쓰려면 예시처럼 3000 같이 충분히 큰 값을 주면 됩니다 — SAP 가 자동으로 화면 크기에 맞춰 클립하기 때문에 너무 커도 문제 없음.

IS NOT BOUND vs IS INITIAL — 객체 참조 가드 패턴

PBO 가 여러 번 도는 화면에서 매번 NEW 호출하면 컨테이너가 중복 생성되므로 가드가 필수. 위 예시에는 IF go_dock IS NOT BOUND 를 사용했는데, IS INITIAL 도 동작은 합니다 — 다만 의미상 객체 참조에는 IS BOUND 계열이 더 정확.

표현 의미 권장 사용
go_dock IS NOT BOUND 참조 변수가 객체를 가리키지 않음 객체 참조 변수 (REF TO …)
go_dock IS INITIAL 참조 변수가 초기값(NULL) 상태 동작은 동일하나 의미상 일반 데이터 변수에 더 적합
go_dock IS BOUND 참조 변수가 살아있는 객체를 가리킴 컨테이너 재사용 분기 시

둘 중 어느 것을 쓰든 동작 결과는 같지만, OO 코드에서는 IS NOT BOUND 가 의도를 더 명확히 표현합니다.


5단계 — PAI 모듈 (BACK / EXIT / CANCEL 처리)

ALV 화면을 종료할 수 있도록 PAI 에서 표준 ok_code 처리.

MODULE user_command_0100 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK' OR 'CANC' OR 'EXIT'.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.

LEAVE TO SCREEN 0 으로 화면 종료. GUI Status 'S100' 에 BACK/EXIT/CANCEL 펑션키를 미리 설정해두어야 동작합니다.


자주 빠뜨리는 함정

IS NOT BOUND 가드 누락 — 컨테이너 중복 생성

PBO 가드 없이 매번 NEW 하면 Docking 영역이 화면에 겹쳐 생성되어 ALV 가 점점 작아지거나 깜빡임 발생. IF go_dock IS NOT BOUND 또는 IS INITIAL 가드 필수.

extension 기본값 50 사용

파라미터를 생략하면 extension = 50 이 적용되는데, 이게 너무 작아서 ALV 가 거의 안 보입니다. 실무에서는 500~3000 사이를 명시적으로 줘야 함.

side 와 extension 의 매칭

DOCK_AT_LEFT/RIGHT 일 때 extension 은 "너비", DOCK_AT_TOP/BOTTOM 일 때는 "높이". 헷갈리면 의도와 다른 방향으로 영역이 잡힘.

repid/dynnr 누락 시 라이프타임

dynnr 만 넘기고 repid 를 생략해도 동작은 합니다 — Docking 이 호출 프로그램을 자동 추정하기 때문. 하지만 라이프타임 결합을 명확히 하려면 repid = sy-cprog 를 같이 넘기는 게 권장.

다중 ALV 가 필요해진 경우

Docking 단독으로는 ALV 한 개만 가능. 좌/우 또는 상/하로 ALV 두 개 이상이 필요하면 Docking 안에 Splitter 를 한 단계 더 끼우는 [SAP ABAP] CL_GUI_SPLITTER_CONTAINER + DOCKING 글의 조합 패턴으로 가야 합니다.

Background 실행 시 덤프

이 패턴은 Dialog 전용. 배치 잡으로 돌리면 SAPGUI 가 없어서 Docking 생성 시점에 덤프 발생. 배치 호환이 필요하면 [SAP ABAP] ALV 백그라운드 DUMP 방지 글의 cl_gui_alv_grid=>offline( ) 분기 패턴을 함께 적용.

Custom Control 과 동시 사용

같은 화면에 SE51 Custom Control 도 있고 Docking 도 있으면 영역이 겹쳐 화면이 깨질 수 있음. Docking 단독 패턴을 쓸 때는 Layout 을 빈 상태로 두는 게 안전.


전체 코드 — 복사용 통합본

아래 통합본은 SE38 에 그대로 붙여 활성화 가능. Screen 100 의 Layout 은 빈 상태로 두고, Flow Logic 에 status_0100 · create_alv · user_command_0100 모듈 연결 + GUI Status 'S100' 에 BACK/EXIT/CANCEL 펑션키 등록 + Titlebar 'T100' 등록만 추가하면 완성. 컨테이너 시리즈 중 가장 짧은 코드.

*&---------------------------------------------------------------------*
*& Report ZRXX_ALV_DOCKING (예시)
*&---------------------------------------------------------------------*
*& Docking Container — ALV 한 개를 화면에 빠르게 표시
*&---------------------------------------------------------------------*
REPORT zrxx_alv_docking.

* ★ 1) DATA 선언 — 단일 Grid + Docking + Field Catalog + 데이터
DATA: go_grid TYPE REF TO cl_gui_alv_grid,
      go_dock TYPE REF TO cl_gui_docking_container.

DATA: g_layo  TYPE lvc_s_layo,
      g_sort  TYPE lvc_s_sort,
      gt_fcat TYPE lvc_t_fcat,
      gs_fcat TYPE lvc_s_fcat.

DATA: gt_data TYPE TABLE OF sflight,
      ok_code TYPE sy-ucomm.

* ★ 2) 데이터 조회 → CALL SCREEN
START-OF-SELECTION.
  SELECT *
    INTO TABLE @gt_data
    FROM sflight.

END-OF-SELECTION.
  CALL SCREEN 100.

* ★ 3) PBO — Status / Titlebar
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'S100'.
  SET TITLEBAR  'T100'.
ENDMODULE.

* ★ 4) ★ 핵심: PBO — Docking + ALV 생성
MODULE create_alv OUTPUT.

  IF go_dock IS NOT BOUND.              " 첫 PBO 에서만 1회 생성

* 4-1) Docking — side 기본값(DOCK_AT_LEFT) + extension 충분히 크게
    go_dock = NEW #(
      repid     = sy-cprog
      dynnr     = sy-dynnr
      extension = 3000 ).               " 거의 전체 화면 사용

* 4-2) ALV Grid 를 Docking 안에 직접 부착
    go_grid = NEW #( i_parent = go_dock ).

* 4-3) ALV 표시 (Field Catalog 자동)
    go_grid->set_table_for_first_display(
      EXPORTING
        i_structure_name = 'SFLIGHT'
      CHANGING
        it_fieldcatalog = gt_fcat
        it_outtab       = gt_data ).

  ENDIF.

ENDMODULE.

* ★ 5) PAI — BACK / EXIT / CANCEL 처리
MODULE user_command_0100 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK' OR 'CANC' OR 'EXIT'.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.

요약

단계 위치 핵심 행동
1 SE51 Screen 100 Layout 빈 상태 + Flow Logic 에 모듈만 연결
2 DATA 선언 go_dock + go_grid (각 1개씩)
3 START-OF-SELECTION SELECT * sflight + CALL SCREEN 100
4 PBO create_alv (IS NOT BOUND 가드) docking_container(side/extension) → go_grid 직접 부착
5 PAI user_command_0100 BACK/EXIT/CANCLEAVE TO SCREEN 0

Docking 단독 사용의 본질은 "SE51 손도 안 대고 화면 한 쪽에 ALV 한 개 빠르게 띄우기" 한 줄. side 로 부착 방향, extension 으로 영역 두께, IS NOT BOUND 가드로 PBO 재실행 보호. 컨테이너 시리즈 중 가장 단순한 패턴이라 빠른 시제품·표준 보고서·한 페이지 ALV 출력에 가장 자주 쓰입니다.

다중 ALV 가 필요해지면 Docking 안에 Splitter 를 추가하는 "[SAP ABAP] CL_GUI_SPLITTER_CONTAINER + DOCKING" 조합 패턴으로 자연스럽게 확장 가능.


Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.

CL_GUI_DOCKING_CONTAINERDOCK_AT_* 상수값(LEFT=1/TOP=2/BOTTOM=4/RIGHT=8) 과 생성자 파라미터(side·extension·repid·dynnr) 는 NetWeaver 표준 정의(ECC 6.0 / S/4HANA on-premise 기준) 입니다. 적용 환경 버전에 따라 일부 차이가 있을 수 있으니 실제 적용 시 SE24 의 클래스 정의를 확인하시기 바랍니다. SFLIGHT 는 SAP 표준 학습 환경(IDES) 테이블이라 운영 시스템에는 없을 수 있으니, 실무 적용 시 운영 테이블로 교체하시기 바랍니다.