SAP Module Pool 프로그램에서 ALV Grid 상단에 요약 정보를 표시할 때 cl_dd_document를 사용합니다. HTML의 <div> 영역처럼 텍스트, 아이콘, 테이블, 링크 등을 자유롭게 배치할 수 있는 동적 문서 오브젝트입니다.
1. 전역 변수 선언
abap
DATA: gcl_top_con TYPE REF TO cl_gui_container, " 상단 컨테이너 (Splitter에서 꺼낸 것)
gcl_doc_top TYPE REF TO cl_dd_document. " TOP OF PAGE 문서 오브젝트
2. 오브젝트 생성 (FORM create_top_doc)
cl_dd_document는 프로그램 시작 시 한 번만 CREATE OBJECT 합니다.
set_top_page에서는 매번 initialize_document()로 초기화 후 재사용합니다.
abap
FORM create_top_doc.
CREATE OBJECT gcl_doc_top
EXPORTING
style = 'ALV_GRID' " ALV 스타일 적용
background_color = 1 " 배경색 코드 (아래 표 참조)
no_margins = space. " space = 여백 있음, 'X' = 여백 없음
ENDFORM.
background_color 코드표
숫자 코드로 배경색을 지정합니다. SAP GUI 테마에 따라 실제 색상은 다를 수 있습니다.
| 코드 | 색상 | 설명 |
|---|---|---|
| 0 | 흰색 | 기본 흰색 배경 |
| 1 | 연두 | ALV_GRID 기본 헤더 배경 |
| 2 | 연노랑 | 노란 배경 |
| 3 | 하늘 | 연파랑 |
| 4 | 연주황 | 오렌지 계열 |
| 5 | 연분홍 | 핑크 계열 |
| 6 | 연보라 | 보라 계열 |
| 7 | 연회색 | 그레이 계열 |
3. 문서 구성 메서드 전체 정리
3-1. 기본 텍스트 & 줄바꿈
abap
" 텍스트 추가
gcl_doc_top->add_text(
text = '텍스트 내용'
sap_fontsize = 'LARGE' " SMALL / MEDIUM / LARGE / X-LARGE
sap_emphasis = 'STRONG' " 굵게. 'X' = 기본 강조, 'STRONG' = 두껍게
sap_color = '5' ). " 글자 색상 코드 (아래 표 참조)
" 줄바꿈 (HTML의 <br>)
gcl_doc_top->new_line( ).
sap_color 글자 색상 코드표
| 코드 | 미리보기 | 설명 |
|---|---|---|
| '1' | 샘플텍스트 | 파랑 (Key/Link 강조) |
| '2' | 샘플텍스트 | 초록 (긍정/성공) |
| '3' | 샘플텍스트 | 빨강 (경고/오류) |
| '4' | 샘플텍스트 | 주황 (주의) |
| '5' | 샘플텍스트 | 보라 |
| '6' | 샘플텍스트 | 청록 |
| '7' | 샘플텍스트 | 회색 (보조 텍스트) |
sap_fontsize / sap_emphasis 조합
| 파라미터 | 값 | 결과 |
|---|---|---|
| sap_fontsize | 'SMALL' | 작은 글자 |
| 'MEDIUM' | 기본 크기 | |
| 'LARGE' | 큰 글자 | |
| 'X-LARGE' | 매우 큰 글자 | |
| sap_emphasis | '' (공백) | 일반 |
| 'X' | 강조 | |
| 'STRONG' | 굵게 |
3-2. 테이블 (다단 레이아웃)
abap
DATA: lcl_table TYPE REF TO cl_dd_table_element,
lcl_c1 TYPE REF TO cl_dd_area,
lcl_c2 TYPE REF TO cl_dd_area.
" 테이블 생성
gcl_doc_top->add_table(
EXPORTING
no_of_columns = 2 " 열 개수
border = '0' " '0' = 테두리 없음, '1' = 테두리 있음
IMPORTING
table = lcl_table ).
" 각 열 컬럼 추출 (width는 픽셀 단위 문자열)
lcl_table->add_column( EXPORTING width = '100' IMPORTING column = lcl_c1 ).
lcl_table->add_column( EXPORTING width = '200' IMPORTING column = lcl_c2 ).
" 각 컬럼에 내용 추가
lcl_c1->add_text( text = '라벨' sap_emphasis = 'X' ).
lcl_c2->add_text( text = '값' ).
" 다음 행으로 이동
lcl_table->new_row( ).
" 두 번째 행 내용 추가
lcl_c1->add_text( text = '라벨2' sap_emphasis = 'X' ).
lcl_c2->add_text( text = '값2' ).
주의: new_row() 이후에도 lcl_c1, lcl_c2 레퍼런스를 그대로 재사용합니다. 새로운 변수를 선언할 필요 없습니다.
3-3. 아이콘
abap
DATA: lcl_icon_area TYPE REF TO cl_dd_area.
lcl_table->add_column( IMPORTING column = lcl_icon_area ).
" 아이콘 추가 (SE37 → ICON_* 상수로 검색)
lcl_icon_area->add_icon( 'ICON_LED_GREEN' ). " 초록 LED
lcl_icon_area->add_icon( 'ICON_LED_RED' ). " 빨강 LED
lcl_icon_area->add_icon( 'ICON_DOC' ). " 문서 아이콘
lcl_icon_area->add_icon( 'ICON_OKAY' ). " 체크 아이콘
lcl_icon_area->add_icon( 'ICON_CANCEL' ). " X 아이콘
3-4. 링크 (Hotspot)
abap
DATA: lcl_link_area TYPE REF TO cl_dd_area.
lcl_link_area->add_link(
text = '자세히 보기'
href = 'LINK_DETAIL' " PAI에서 sy-ucomm으로 잡힘
tooltip = '클릭하면 상세 조회' ).
PAI에서 WHEN 'LINK_DETAIL'으로 이벤트 처리합니다.
3-5. 가로줄 (Horizontal Rule)
abap
gcl_doc_top->add_gap( width = 100 ). " 가로 여백 (픽셀)
gcl_doc_top->add_hr( ). " 구분선 (HTML의 <hr>)
4. 문서 렌더링 (display_document)
내용 구성이 끝나면 반드시 아래 두 메서드를 순서대로 호출합니다.
abap
" ① merge_document: 내부 버퍼 병합 (필수)
gcl_doc_top->merge_document( ).
" ② display_document: 실제 화면에 출력
gcl_doc_top->display_document(
EXPORTING
reuse_control = 'X' " 'X' = 기존 컨트롤 재사용 (깜빡임 방지)
parent = gcl_top_con ).
reuse_control = 'X' 를 반드시 넣어야 ALV 재조회 시 TOP OF PAGE가 깜빡이지 않습니다.
5. 초기화 패턴 (재사용 시)
set_top_page처럼 데이터가 바뀔 때마다 다시 그려야 하는 경우, initialize_document()로 초기화 후 재구성합니다.
abap
FORM set_top_page.
CHECK pa_check NE 'X'.
"*-- 변수 선언
DATA: lcl_table TYPE REF TO cl_dd_table_element,
lcl_icon TYPE REF TO cl_dd_area,
lcl_c1 TYPE REF TO cl_dd_area,
lcl_c2 TYPE REF TO cl_dd_area.
"*-- 집계 로직
DATA: lv_total_price TYPE p DECIMALS 2,
lv_total_accum TYPE p DECIMALS 2,
lv_depr_rate TYPE p DECIMALS 1.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs>).
lv_total_price += <fs>-aprice.
lv_total_accum += <fs>-accum.
ENDLOOP.
IF lv_total_price > 0.
lv_depr_rate = lv_total_accum / lv_total_price * 100.
ENDIF.
"*-- 문서 초기화 (매번 재호출 시 필수)
gcl_doc_top->initialize_document( ).
"*-- 타이틀
gcl_doc_top->add_text(
text = |{ pa_gjahr }년 자산관리 현황|
sap_fontsize = 'LARGE'
sap_emphasis = 'STRONG'
sap_color = '1' ).
gcl_doc_top->new_line( ).
gcl_doc_top->new_line( ).
"*-- 테이블 구성
gcl_doc_top->add_table(
EXPORTING no_of_columns = 3 border = '0'
IMPORTING table = lcl_table ).
lcl_table->add_column( EXPORTING width = '24' IMPORTING column = lcl_icon ).
lcl_table->add_column( EXPORTING width = '120' IMPORTING column = lcl_c1 ).
lcl_table->add_column( EXPORTING width = '100' IMPORTING column = lcl_c2 ).
"*-- 행 1
lcl_icon->add_icon( 'ICON_LED_GREEN' ).
lcl_c1->add_text( text = '감가상각율' sap_emphasis = 'X' ).
lcl_c2->add_text( text = |{ lv_depr_rate DECIMALS = 1 }%| sap_color = '3' ).
lcl_table->new_row( ).
"*-- 렌더링
gcl_doc_top->merge_document( ).
gcl_doc_top->display_document(
EXPORTING reuse_control = 'X' parent = gcl_top_con ).
ENDFORM.
6. initialize_document vs CREATE OBJECT 차이
| 구분 | CREATE OBJECT | initialize_document |
|---|---|---|
| 시점 | 프로그램 최초 실행 1회 | 데이터 변경 후 재렌더링마다 |
| 역할 | 오브젝트 인스턴스 생성 | 내부 버퍼 초기화 (내용 비움) |
| FORM | create_top_doc | set_top_page 상단 |
| 누락 시 문제 | 오브젝트 없음 → DUMP | 이전 내용 누적 → 중복 표시 |
7. 호출 순서 정리
abap
FORM create_alv.
PERFORM create_dock_con. " 1. 도킹 컨테이너 생성
PERFORM create_splitter. " 2. 화면 분할
PERFORM create_top_doc. " 3. cl_dd_document 오브젝트 생성 (1회)
PERFORM create_tree. " 4. 트리 생성
PERFORM create_grid. " 5. 그리드 생성
ENDFORM.
" 이후 데이터 조회/변경 시마다:
PERFORM set_top_page. " initialize → 구성 → merge → display
'ABAP' 카테고리의 다른 글
| [ABAP] SPLITTER 정리 (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 |