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/CANC → LEAVE 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_CONTAINER 의 DOCK_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) 테이블이라 운영 시스템에는 없을 수 있으니, 실무 적용 시 운영 테이블로 교체하시기 바랍니다.