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_text 의 sap_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_document → add_text → new_line → merge_document → display_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 스탠다드 데모 프로그램으로 텍스트 편집기 컨트롤 사용 패턴 참조용입니다.