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

[SAP ABAP] 셀렉션 스크린 아래 실시간 미리보기 — WRITE + TEXT GRID (Docking + CL_DD_DOCUMENT)

by Song.sh 2026. 6. 4.

SAP 클래식 리포트(WRITE 출력) 에서 셀렉션 스크린 아래에 읽기 전용 텍스트 영역 을 띄우고 싶을 때가 있습니다. 사용자가 셀렉션 조건을 바꾸면 그 아래 텍스트 영역이 실시간으로 갱신되는 식 — 미리보기 패널이나 빠른 조회 화면에 적합합니다.

 

핵심은 두 가지입니다. (1) CL_GUI_DOCKING_CONTAINER 로 화면 아래쪽에 영역을 붙이고, (2) CL_DD_DOCUMENT 로 그 안에 텍스트를 그립니다. INITIALIZATION 시점에 한 번 만들어 두고 AT SELECTION-SCREEN OUTPUT 마다 내용만 갈아끼우면 됩니다 — 컨테이너 재생성 없이.

 

이 글에서는 두 가지 패턴을 다룹니다. (a) Docking + DD Document 로 간단한 텍스트 라인 출력 그리드 를 만드는 방법(셀렉션 스크린 아래 미리보기), (b) CL_GUI_TEXTEDIT실제 텍스트 편집기 그리드(TEXT GRID) 를 띄우는 방법. 데이터는 SAP 스탠다드 학습 환경 SPFLI 항공편 스케줄 예시.

핵심 — WRITE 리포트 + Docking + DD Document

WRITE 리포트(REPORT) 의 셀렉션 스크린 단계에서 화면을 분할해 텍스트 영역을 추가하는 흐름은 다음과 같습니다.

시점 하는 일 호출 메소드
INITIALIZATION Docking 컨테이너 + DD Document 한 번 생성 NEW cl_gui_docking_container · NEW cl_dd_document
AT SELECTION-SCREEN OUTPUT 셀렉션 조건 따라 데이터 조회 + 문서 다시 그리기 initialize_document · add_text · new_line
병합 + 출력 조각 문서를 병합해 컨테이너에 출력 merge_document · display_document(reuse_control=abap_true)
START-OF-SELECTION F8 후 본 리포트 진행 (Docking 영역은 자동 해제) 사용자가 F8 실행 시 일반 WRITE 진행

흐름을 그림으로 정리하면:

[ 셀렉션 스크린 화면 ]                   ← 사용자가 P_CARR 입력
┌────────────────────────────┐
│  P_CARR  [ AA   ]          │
│                            │
└────────────────────────────┘
[ Docking 영역 (ratio=85) ]              ← 입력값 바뀔 때마다 갱신
┌────────────────────────────┐
│ write page docking container│        ← cl_dd_document 헤딩
│ ─────────────────────────── │        ← underline
│ AA/0017/JFK                │        ← add_text + new_line
│ AA/0064/SFO                │
│ ...                        │
└────────────────────────────┘

핵심은 reuse_control = abap_true 옵션. 같은 컨테이너에 문서를 다시 출력할 때 컨테이너 자체를 재생성하지 않고 내용만 갈아끼웁니다. 빠뜨리면 셀렉션 조건 한 번 바꿀 때마다 컨테이너가 새로 만들어져 화면이 깜빡입니다.


1단계 — INITIALIZATION: Docking + DD Document 생성

리포트 시작 시 한 번만 실행되는 INITIALIZATION 이벤트에서 Docking 컨테이너와 DD Document 를 만들어 둡니다.

INITIALIZATION.

  DATA(o_cnt) = NEW cl_gui_docking_container(
                       no_autodef_progid_dynnr = abap_true
                       side  = cl_gui_docking_container=>dock_at_bottom
                       ratio = 85 ).

  DATA(o_doc) = NEW cl_dd_document(
                       background_color = cl_dd_area=>col_textarea ).

  o_doc->display_document( parent = o_cnt ).
파라미터 의미
no_autodef_progid_dynnr = abap_true 셀렉션 스크린에는 정식 화면 번호가 없으니 자동 등록 끄기 (default_screen 패턴과 동일 이유)
side = dock_at_bottom 화면 아래쪽에 붙이기 (top / left / right 도 가능)
ratio = 85 전체 화면 대비 비율 — 85 면 85% 차지 (메인 5~15%, 텍스트 영역 85%)
background_color = cl_dd_area=>col_textarea 텍스트 영역 표준 배경색 (흰색 톤). 다른 상수도 가능 — col_negative·col_positive·col_total

마지막 o_doc->display_document( parent = o_cnt ) 한 줄로 빈 문서가 일단 컨테이너에 붙습니다. 셀렉션 스크린이 처음 떴을 때 빈 영역이 보이고, 이후 사용자가 입력하면 내용이 채워지는 구조.


2단계 — AT SELECTION-SCREEN OUTPUT: 텍스트 갱신

AT SELECTION-SCREEN OUTPUT 은 셀렉션 스크린이 그려질 때마다(= 처음 + 사용자가 Enter 칠 때마다) 발생하는 이벤트입니다. 여기서 셀렉션 조건에 맞게 데이터를 조회하고 DD Document 를 새로 채워 줍니다.

AT SELECTION-SCREEN OUTPUT.

  SELECT * FROM spfli
    INTO TABLE @lt_spfli
    WHERE carrid LIKE @p_carr.

* ★ 1) 문서 초기화 — 이전 내용 지우기
  o_doc->initialize_document(
    background_color = cl_dd_area=>col_textarea ).

* ★ 2) 헤딩
  o_doc->add_text(
    text      = 'write page docking container'
    sap_style = cl_dd_document=>heading ).

  o_doc->underline( ).

* ★ 3) 본문 — 한 줄씩
  LOOP AT lt_spfli ASSIGNING FIELD-SYMBOL(<fs_data>).
    o_doc->add_text(
      text      = |{ <fs_data>-carrid }/{ <fs_data>-connid }/{ <fs_data>-airpfrom }|
      sap_style = cl_dd_document=>standard ).
    o_doc->new_line( ).
  ENDLOOP.

* ★ 4) 병합 + 출력 (reuse 옵션으로 컨테이너 재사용)
  o_doc->merge_document( ).
  o_doc->display_document(
    reuse_control      = abap_true
    reuse_registration = abap_true
    parent             = o_cnt ).

핵심 순서가 (초기화 → 추가 → 병합 → 출력) 4단계로 고정. 이 순서를 지키지 않으면 이전 내용이 누적되거나 빈 화면이 그려집니다.


3단계 — add_text 의 sap_style 옵션

add_textsap_style 인자는 CL_DD_DOCUMENT 의 사전 정의 스타일 상수 중 하나를 받습니다. 헤딩·본문·강조·키 텍스트 등이 미리 정의되어 있어 색·크기·굵기를 따로 박지 않아도 일관된 톤이 나옵니다.

sap_style 상수 출력 톤
cl_dd_document=>heading 큰 제목 (페이지 헤더)
cl_dd_document=>standard 일반 본문 라인
cl_dd_document=>key 키 텍스트 (라벨)
cl_dd_document=>emphasis 강조 (굵게)
underline( ) 메소드 호출 — 줄긋기 한 줄 추가 (제목 아래 구분선)

스타일을 안 박고 add_text( text = '...' ) 만 호출하면 standard 기본값. 헤딩 다음 줄에는 거의 항상 underline( ) 을 호출해서 구분선을 그려 시각적 위계를 살립니다.


4단계 — merge_document + display_document 의 reuse 옵션

DD Document 는 조각(각 add_text 호출 결과) 을 모아 한 문서로 만들고 그 다음 화면에 그립니다. 이 두 단계가 merge_document + display_document.

o_doc->merge_document( ).
o_doc->display_document(
  reuse_control      = abap_true
  reuse_registration = abap_true
  parent             = o_cnt ).
옵션 의미
reuse_control = abap_true 이미 만든 컨트롤(HTML viewer) 을 재사용 — 깜박임 방지
reuse_registration = abap_true 이벤트 등록 정보 재사용 — 두 번째 호출부터 다시 등록 안 함
parent = o_cnt 그릴 부모 컨테이너 — INITIALIZATION 에서 만든 Docking 참조

처음 한 번 display_document( parent = o_cnt ) 를 호출해 컨테이너에 컨트롤을 붙이고, 두 번째부터는 reuse_* 옵션을 켜서 컨테이너만 재활용. 셀렉션 스크린이 매번 그려지는 상황에서 깜박임 없이 부드럽게 갱신됩니다.


5단계 (보너스) — 진짜 텍스트 편집기: CL_GUI_TEXTEDIT

읽기 전용 출력이 아니라 사용자가 직접 텍스트를 편집 할 수 있는 그리드가 필요하면 CL_GUI_TEXTEDIT 를 씁니다. SAPscript 텍스트와 결합해 SE51 화면에 텍스트 편집기 컨트롤로 띄우는 패턴.

패턴 용도
Docking + DD Document (위 1~4단계) 읽기 전용 요약 / 미리보기 출력 — 선택 화면 아래 빠른 정보
Custom Container + CL_GUI_TEXTEDIT 실제 편집 가능한 텍스트 영역 — SAPscript 텍스트 저장/조회

TEXT GRID 의 핵심 선언:

DATA : g_textcontainer TYPE REF TO cl_gui_custom_container,   " 텍스트 컨테이너
       g_editor        TYPE REF TO cl_gui_textedit,           " 텍스트 그리드
       g_header        LIKE thead,                            " SAPscript 헤더 키
       gt_text         TYPE TABLE OF tline-tdline,            " 텍스트 라인 저장용
       gt_itftext      TYPE TABLE OF tline,                   " ITF 라인 읽을 테이블
       gs_itftext      TYPE tline.

THEAD · TLINE 은 SAPscript 표준 텍스트 저장 구조라 READ_TEXT·SAVE_TEXT FM 으로 DB 에도 그대로 저장됩니다. 편집기 컨트롤은 SAP 스탠다드 데모 프로그램 SAPTEXTEDIT_DEMO_1(개발 클래스 SAPTEXTEDIT) 에 패턴이 잘 정리되어 있어 참조하기 좋습니다.

핵심 호출 흐름은 다음과 같습니다.

* 컨테이너 + 편집기 생성
g_textcontainer = NEW #( container_name = 'CCONT' ).
g_editor        = NEW #( parent = g_textcontainer ).

* 텍스트 읽기 (SAPscript)
CALL FUNCTION 'READ_TEXT'
  EXPORTING id = '001' language = sy-langu name = '...'
            object = 'TEXT'
  TABLES    lines = gt_itftext.

* ITF → 일반 텍스트 변환
CALL FUNCTION 'CONVERT_ITF_TO_ASCII'
  TABLES it_itf_text = gt_itftext et_ascii_text = gt_text.

* 편집기에 적용
g_editor->set_text_as_r3table( table = gt_text ).

* 저장 시 — 편집된 텍스트 받아오기
g_editor->get_text_as_r3table( IMPORTING table = gt_text ).

set_text_as_r3table · get_text_as_r3table 두 메소드가 편집기 ↔ ABAP 테이블 양방향 전송의 핵심.


자주 빠뜨리는 함정

INITIALIZATION 누락

Docking + DD Document 생성을 AT SELECTION-SCREEN OUTPUT 에 박으면 사용자가 Enter 칠 때마다 컨테이너가 새로 만들어집니다. 반드시 한 번만 실행되는 INITIALIZATION 에서.

initialize_document 누락

AT SELECTION-SCREEN OUTPUT 의 첫 줄에 initialize_document 빠뜨리면 이전 라인이 누적됩니다. 사용자가 셀렉션 조건을 바꿔도 이전 결과가 그대로 남아 있으니 무조건 초기화 먼저.

reuse_control / reuse_registration 누락

두 번째 호출부터 이 옵션을 안 켜면 컨테이너가 매번 새로 만들어져 화면이 깜박입니다. 더 심하면 GUI 핸들 누수까지 발생. display_document 호출 시 두 옵션을 짝지어 박아 두는 게 안전.

no_autodef_progid_dynnr 누락

셀렉션 스크린은 정식 화면 번호가 없으므로 no_autodef_progid_dynnr = abap_true 빠뜨리면 Docking 이 자기 부모를 못 찾아 그려지지 않습니다.

parent 인자 빠짐

두 번째 display_document 호출 시 parent = o_cnt 인자를 빼면 컨테이너 연결이 끊어집니다. 매번 명시.

merge_document 누락

add_text 만 호출하고 merge_document 없이 바로 display_document 하면 조각이 합쳐지지 않아 일부만 그려질 수 있습니다.

CL_GUI_TEXTEDIT — ITF vs ASCII

SAPscript 의 ITF 텍스트(TLINE) 는 포맷 코드가 섞여 있어 그대로 편집기에 박으면 코드까지 표시됩니다. CONVERT_ITF_TO_ASCII FM 으로 한 번 변환 후 사용. 저장 시에는 반대로 CONVERT_TEXT 또는 CONVERT_STREAM_TO_ITF_TEXT 로 ITF 복원.


전체 코드 — 복사용 통합본

셀렉션 스크린 + Docking + DD Document 패턴의 단일 REPORT 통합본. CALL SCREEN 이 없는 단순 REPORT 라 INCLUDE 6분할은 적용하지 않습니다.

*&---------------------------------------------------------------------*
*& Report ZRXX_WRITE_TEXT_GRID
*&---------------------------------------------------------------------*
REPORT zrxx_write_text_grid.

DATA : lt_spfli TYPE TABLE OF spfli.

PARAMETERS p_carr TYPE spfli-carrid DEFAULT '%'.

DATA : o_cnt TYPE REF TO cl_gui_docking_container,
       o_doc TYPE REF TO cl_dd_document.

*-----------------------------------------------------------------------*
* INITIALIZATION — 컨테이너 + 문서 한 번만 생성
*-----------------------------------------------------------------------*
INITIALIZATION.

  o_cnt = NEW cl_gui_docking_container(
                no_autodef_progid_dynnr = abap_true
                side  = cl_gui_docking_container=>dock_at_bottom
                ratio = 85 ).

  o_doc = NEW cl_dd_document(
                background_color = cl_dd_area=>col_textarea ).

  o_doc->display_document( parent = o_cnt ).

*-----------------------------------------------------------------------*
* AT SELECTION-SCREEN OUTPUT — 사용자 입력마다 텍스트 갱신
*-----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

  SELECT *
    FROM spfli
    INTO TABLE @lt_spfli
    WHERE carrid LIKE @p_carr.

* 1) 초기화
  o_doc->initialize_document(
    background_color = cl_dd_area=>col_textarea ).

* 2) 헤딩
  o_doc->add_text(
    text      = 'write page docking container'
    sap_style = cl_dd_document=>heading ).

  o_doc->underline( ).

* 3) 본문
  LOOP AT lt_spfli ASSIGNING FIELD-SYMBOL(<fs_data>).
    o_doc->add_text(
      text      = |{ <fs_data>-carrid }/{ <fs_data>-connid }/{ <fs_data>-airpfrom }|
      sap_style = cl_dd_document=>standard ).
    o_doc->new_line( ).
  ENDLOOP.

* 4) 병합 + 출력 (재사용 옵션)
  o_doc->merge_document( ).
  o_doc->display_document(
    reuse_control      = abap_true
    reuse_registration = abap_true
    parent             = o_cnt ).

*-----------------------------------------------------------------------*
* START-OF-SELECTION — F8 실행 시 본 리포트 (이 글에서는 비움)
*-----------------------------------------------------------------------*
START-OF-SELECTION.
* 본 리스트 출력은 비워둠 — 사용자가 셀렉션 스크린에서 미리보기만 사용


요약

단계 이벤트 핵심
1 INITIALIZATION NEW cl_gui_docking_container( no_autodef_progid_dynnr = abap_true · side = dock_at_bottom · ratio = 85 ) + NEW cl_dd_document
2 AT SELECTION-SCREEN OUTPUT initialize_documentadd_textnew_linemerge_documentdisplay_document
3 스타일 sap_style = cl_dd_document=>heading / standard / key / emphasis + underline( )
4 재출력 display_document( reuse_control = abap_true · reuse_registration = abap_true · parent = o_cnt )
5 편집형 변형 CL_GUI_TEXTEDIT + THEAD/TLINE + set_text_as_r3table / get_text_as_r3table

WRITE + TEXT GRID 의 본질은 "셀렉션 스크린이 떠 있는 동안에도 데이터 미리보기를 보여주기". INITIALIZATION 에 컨테이너·문서 생성 한 번 + AT SELECTION-SCREEN OUTPUT 에 4단계(초기화→추가→병합→출력) + reuse_control = abap_true 옵션 — 이 세 가지만 챙기면 깜박임 없는 실시간 미리보기 화면을 만들 수 있습니다. 단순 표시는 DD Document, 사용자 편집까지 받으려면 CL_GUI_TEXTEDIT 로 갈아타면 됩니다.


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

CL_GUI_DOCKING_CONTAINER · CL_DD_DOCUMENT(initialize_document·add_text·new_line·underline·merge_document·display_document) · CL_DD_AREA(col_textarea) · CL_GUI_TEXTEDIT(set_text_as_r3table·get_text_as_r3table) · THEAD · TLINE · READ_TEXT · CONVERT_ITF_TO_ASCII 는 NetWeaver 스탠다드 정의(ECC 6.0 / S/4HANA on-premise 기준) 입니다. SPFLI 는 SAP 스탠다드 학습 환경(IDES) 테이블이며 실무 적용 시 운영 테이블로 교체하시기 바랍니다. SAPTEXTEDIT_DEMO_1 은 SAP 스탠다드 데모 프로그램으로 텍스트 편집기 컨트롤 사용 패턴 참조용입니다.