ABAP

[ABAP] TOP OF PAGE

셜록누나 2026. 5. 30. 21:02

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