ABAP

[ABAP] SPLITTER 정리

셜록누나 2026. 5. 30. 20:51
ABAP GUI Module Pool

SAP ABAP Splitter Container 완벽 가이드

cl_gui_splitter_container로 화면을 상하·좌우·중첩 분할하는 모든 방법

개요

SAP Module Pool 프로그램에서 하나의 화면을 여러 영역으로 나눌 때 cl_gui_splitter_container를 사용합니다. 이 클래스는 HTML의 grid/flex 레이아웃과 유사하게, rows × columns 격자로 화면을 분할하고 각 셀에서 컨테이너를 꺼내 자식 GUI 오브젝트(ALV Grid, Tree, Chart 등)를 붙이는 방식으로 동작합니다.

핵심 원칙: Splitter는 부모 컨테이너를 분할하는 도구입니다. 최상위 부모는 보통 cl_gui_docking_container 또는 SE51에서 정의한 cl_gui_custom_container입니다.

1. 기본 구조 이해

Splitter를 생성하면 rows × columns 개의 셀이 만들어집니다. get_container로 원하는 셀의 컨테이너 레퍼런스를 꺼내 사용합니다.

cl_gui_docking_container (부모) cl_gui_splitter_container rows=2, columns=1 row=1 col=1 → gcl_top_con row=2 col=1 → lcl_bottom_con height% height%
ABAP — 기본 상하 2분할
" 1) Splitter 오브젝트 생성 (부모 컨테이너에 붙임)
CREATE OBJECT gcl_splitter
  EXPORTING
    parent  = gcl_dock_container  " 부모 컨테이너
    rows    = 2                  " 행 개수
    columns = 1                  " 열 개수
  EXCEPTIONS
    OTHERS  = 1.

" 2) 각 셀에서 컨테이너 레퍼런스 추출
gcl_splitter->get_container(
  EXPORTING row = 1 column = 1
  RECEIVING container = gcl_top_con ).   " 상단

gcl_splitter->get_container(
  EXPORTING row = 2 column = 1
  RECEIVING container = lcl_bottom_con ). " 하단

" 3) 비율 설정 (합산 100 권장)
gcl_splitter->set_row_height( id = 1 height = 20 ). " 상단 20%
gcl_splitter->set_row_height( id = 2 height = 80 ). " 하단 80%

2. 비율 설정 메서드

행/열 크기는 절댓값(px)이 아닌 상대 비율입니다. 합산이 100이 되도록 설정하는 것이 일반적입니다.

메서드파라미터설명
set_row_heightid, heightid번째 행의 높이 비율 설정
set_column_widthid, widthid번째 열의 너비 비율 설정
나머지 열은 자동으로 채움
주의: set_column_width는 지정한 열 하나만 설정하면 나머지가 자동으로 균등 배분됩니다. 모든 열을 명시적으로 설정하려면 각각 호출하세요.

3. 패턴별 전체 코드

패턴 A — 좌우 2분할 (트리 + 그리드)

col=1 gcl_tree_con col=2 gcl_right_con width=35% / width=65% (자동)
ABAP — 좌우 2분할
DATA: lcl_lr_splitter TYPE REF TO cl_gui_splitter_container.

CREATE OBJECT lcl_lr_splitter
  EXPORTING
    parent  = lcl_bottom_con  " 분할할 부모 컨테이너
    rows    = 1
    columns = 2
  EXCEPTIONS
    OTHERS  = 1.

lcl_lr_splitter->get_container(
  EXPORTING row = 1 column = 1
  RECEIVING container = gcl_tree_con ).  " 좌측: 트리

lcl_lr_splitter->get_container(
  EXPORTING row = 1 column = 2
  RECEIVING container = gcl_right_con ). " 우측: 그리드

" 좌측 35%, 우측은 자동으로 65%
lcl_lr_splitter->set_column_width( id = 1 width = 35 ).

패턴 B — 중첩 스플리터 (상단 Header + 하단 좌우 분할)

실무에서 가장 많이 쓰이는 구조입니다. 외부 스플리터로 상하를 나누고, 하단 컨테이너를 다시 내부 스플리터로 좌우로 분할합니다.

gcl_splitter (outer, rows=2 cols=1) row=1 → gcl_top_con (Header / HTML Doc) lcl_bottom_con → lcl_lr_splitter (inner, rows=1 cols=2) col=1 gcl_tree_con col=2 gcl_right_con
ABAP — 중첩 스플리터 전체 코드 (FORM create_splitter)
FORM create_splitter.
  DATA: lcl_bottom_con     TYPE REF TO cl_gui_container,
        lcl_lr_splitter    TYPE REF TO cl_gui_splitter_container.

  " ① 외부 스플리터: 상하 2분할
  CREATE OBJECT gcl_splitter
    EXPORTING
      parent  = gcl_dock_container
      rows    = 2
      columns = 1
    EXCEPTIONS
      OTHERS  = 1.

  gcl_splitter->get_container(
    EXPORTING row = 1 column = 1
    RECEIVING container = gcl_top_con ).     " 상단: HTML Doc 영역
  gcl_splitter->get_container(
    EXPORTING row = 2 column = 1
    RECEIVING container = lcl_bottom_con ).  " 하단: 좌우 분할 예정

  gcl_splitter->set_row_height( id = 1 height = 20 ).
  gcl_splitter->set_row_height( id = 2 height = 80 ).

  " ② 내부 스플리터: 하단을 좌우 2분할 (트리 35% / 그리드 65%)
  CREATE OBJECT lcl_lr_splitter
    EXPORTING
      parent  = lcl_bottom_con
      rows    = 1
      columns = 2
    EXCEPTIONS
      OTHERS  = 1.

  lcl_lr_splitter->get_container(
    EXPORTING row = 1 column = 1
    RECEIVING container = gcl_tree_con ).
  lcl_lr_splitter->get_container(
    EXPORTING row = 1 column = 2
    RECEIVING container = gcl_right_con ).

  lcl_lr_splitter->set_column_width( id = 1 width = 35 ).
ENDFORM.

패턴 C — 3중 중첩 (상단 Header + 하단 좌우 + 우측 상하 분할)

ZRE3FI0002에서 사용하는 구조입니다. 우측 영역을 다시 그리드/차트로 상하 분할합니다.

gcl_splitter (outer) gcl_top_con (Header) gcl_tree_con lcl_right_splitter (rows=2 cols=1) gcl_right_con (그리드) gcl_chart_con (차트)
ABAP — 3중 중첩 전체 코드
FORM create_splitter.
  DATA: lcl_bottom_con     TYPE REF TO cl_gui_container,
        lcl_lr_splitter    TYPE REF TO cl_gui_splitter_container,
        lcl_right_splitter TYPE REF TO cl_gui_splitter_container.

  " ① 외부: 상단(20%) / 하단(80%) 분할
  CREATE OBJECT gcl_splitter
    EXPORTING
      parent  = gcl_dock_container
      rows    = 2
      columns = 1
    EXCEPTIONS
      OTHERS  = 1.

  gcl_splitter->get_container(
    EXPORTING row = 1 column = 1
    RECEIVING container = gcl_top_con ).
  gcl_splitter->get_container(
    EXPORTING row = 2 column = 1
    RECEIVING container = lcl_bottom_con ).

  gcl_splitter->set_row_height( id = 1 height = 20 ).
  gcl_splitter->set_row_height( id = 2 height = 80 ).

  " ② 중간: 하단을 좌(트리 35%) / 우(65%) 분할
  CREATE OBJECT lcl_lr_splitter
    EXPORTING
      parent  = lcl_bottom_con
      rows    = 1
      columns = 2
    EXCEPTIONS
      OTHERS  = 1.

  lcl_lr_splitter->get_container(
    EXPORTING row = 1 column = 1
    RECEIVING container = gcl_tree_con ).
  lcl_lr_splitter->get_container(
    EXPORTING row = 1 column = 2
    RECEIVING container = gcl_right_con ).

  lcl_lr_splitter->set_column_width( id = 1 width = 35 ).

  " ③ 내부: 우측을 상(그리드 50%) / 하(차트 50%) 분할
  CREATE OBJECT lcl_right_splitter
    EXPORTING
      parent  = gcl_right_con  " ②에서 꺼낸 우측 컨테이너가 부모
      rows    = 2
      columns = 1
    EXCEPTIONS
      OTHERS  = 1.

  lcl_right_splitter->get_container(
    EXPORTING row = 1 column = 1
    RECEIVING container = gcl_right_con ).  " 변수 재사용 (그리드 컨테이너)
  lcl_right_splitter->get_container(
    EXPORTING row = 2 column = 1
    RECEIVING container = gcl_chart_con ).

  lcl_right_splitter->set_row_height( id = 1 height = 50 ).
  lcl_right_splitter->set_row_height( id = 2 height = 50 ).
ENDFORM.
gcl_right_con 재사용 포인트: lcl_right_splitter 생성 시 parent = gcl_right_con으로 넘기고, get_container row=1 결과를 다시 gcl_right_con에 받습니다. 이렇게 하면 별도 변수 없이 기존 전역 변수를 재활용할 수 있습니다.

4. pa_check 조건 분기 패턴

Selection Screen 파라미터로 레이아웃을 동적으로 전환할 때 사용합니다. 체크박스가 ON이면 분할 없이 단일 컨테이너로, OFF면 전체 분할 레이아웃으로 동작합니다.

ABAP — pa_check 조건 분기
IF pa_check EQ 'X'.
  " 체크박스 ON: 스플리터 없이 전체를 하나의 컨테이너로 사용
  lcl_bottom_con = gcl_dock_container.
ELSE.
  " 체크박스 OFF: 상하 분할 후 하단 컨테이너를 lcl_bottom_con에 배정
  CREATE OBJECT gcl_splitter
    EXPORTING
      parent  = gcl_dock_container
      rows    = 2
      columns = 1
    EXCEPTIONS
      OTHERS  = 1.

  gcl_splitter->get_container(
    EXPORTING row = 1 column = 1
    RECEIVING container = gcl_top_con ).
  gcl_splitter->get_container(
    EXPORTING row = 2 column = 1
    RECEIVING container = lcl_bottom_con ).

  gcl_splitter->set_row_height( id = 1 height = 20 ).
  gcl_splitter->set_row_height( id = 2 height = 80 ).
ENDIF.

" 이후 lcl_bottom_con을 동일하게 사용 →
" 분기와 관계없이 나머지 코드는 동일하게 유지

5. 전역 변수 선언 참고

ABAP — 전역 컨테이너 변수 선언
DATA: gcl_dock_container TYPE REF TO cl_gui_docking_container,
      gcl_splitter       TYPE REF TO cl_gui_splitter_container,
      gcl_top_con        TYPE REF TO cl_gui_container,  " 상단 Header
      gcl_tree_con       TYPE REF TO cl_gui_container,  " 좌측 트리
      gcl_right_con      TYPE REF TO cl_gui_container,  " 우측 ALV 그리드
      gcl_chart_con      TYPE REF TO cl_gui_container,  " 우측 하단 차트
      gcl_grid           TYPE REF TO cl_gui_alv_grid,
      gcl_tree           TYPE REF TO cl_gui_alv_tree.

요약: 스플리터 생성 3단계

단계코드역할
1. 생성 CREATE OBJECT splitter EXPORTING parent rows columns 부모 컨테이너를 rows×columns로 분할
2. 추출 splitter->get_container( row col RECEIVING container ) 원하는 셀의 컨테이너 레퍼런스 획득
3. 비율 splitter->set_row_height / set_column_width 행/열 크기 비율 지정 (합산 100 권장)

'ABAP' 카테고리의 다른 글

[ABAP] TOP OF PAGE  (0) 2026.05.30
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS' 말일 계산 FUNCTION  (0) 2026.05.16
[ABAP] ALV TREE , EVENT  (0) 2026.05.09
[ABAP] CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'  (0) 2026.04.19
[ABAP] FCAT 필드 값 바꾸기  (0) 2026.04.19