SAP GUI 안에서 외부 웹 페이지나 HTML 문서를 띄우고 싶을 때 쓰는 클래스가 CL_GUI_HTML_VIEWER 입니다. SAPscript 미리보기, 매뉴얼 페이지 임베드, 사내 포털 호출, 동적 HTML 리포트 출력 같은 케이스에 자주 씁니다. ALV Grid 가 표 출력 전용이라면 HTML Viewer 는 자유 HTML 표시 + 브라우저 이벤트 수신 까지 가능한 더 자유로운 컨트롤.
핵심은 세 갈래입니다. (1) show_url — URL 한 줄로 외부 페이지 표시, (2) load_data + show_url — ABAP 에서 만든 HTML 을 메모리에 로드해 표시, (3) load_mime_object — MIME Repository(SE80) 에 올려둔 정적 HTML 표시.
이 글에서는 컨테이너 + HTML Viewer 생성 → URL 표시 → 이벤트 핸들러(navigate_complete) 등록 → 클릭한 URL 받기까지 정리합니다. 예시는 SAP Help Portal(help.sap.com) 같은 공개 페이지 표시 기준.
핵심 — HTML Viewer 의 3가지 표시 방식
| 방식 | 메소드 | 용도 |
|---|---|---|
| URL 표시 | show_url |
외부 URL · 사내 포털 · SAP Help Portal 직접 호출 |
| 메모리 HTML | load_data + show_url |
ABAP 에서 만든 동적 HTML 문자열 표시 |
| MIME 객체 | load_mime_object |
SE80 MIME Repository 에 업로드한 정적 HTML/이미지 |
전체 흐름은 다음과 같습니다.
[ Screen 200 ]
┌─────────────────────────────────────┐
│ MY_CONTAINER (Custom Container) │
│ ┌─────────────────────────────┐ │
│ │ CL_GUI_HTML_VIEWER │ │
│ │ → show_url(...) 호출 시 │ │
│ │ 외부 페이지 / 사내 페이지 │ │
│ │ / 메모리 HTML 표시 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
↓ 사용자가 페이지 안 링크 클릭
NAVIGATE_COMPLETE 이벤트 발생 (URL importing)
↓
이벤트 핸들러 클래스 → URL 받아서 처리
핵심 객체 + 이벤트는 4개만 알면 끝.
| 요소 | 역할 |
|---|---|
CL_GUI_CUSTOM_CONTAINER |
SE51 Custom Control 을 잡는 컨테이너 (HTML Viewer 의 부모) |
CL_GUI_HTML_VIEWER |
HTML 표시 컨트롤 본체 |
CNTL_SIMPLE_EVENTS |
받을 이벤트 목록을 담는 테이블 타입 |
navigate_complete |
페이지 로드 완료 이벤트 (URL 받아옴) |
1단계 — 컨테이너 + HTML Viewer 생성
SE51 의 Screen 200 에 Custom Control CCONT 한 개 배치. PBO 모듈에서 컨테이너 + HTML Viewer 두 객체 생성.
DATA : html_control TYPE REF TO cl_gui_html_viewer,
my_container TYPE REF TO cl_gui_custom_container.
* 컨테이너
CREATE OBJECT my_container
EXPORTING container_name = 'CCONT'.
* HTML Viewer
CREATE OBJECT html_control
EXPORTING parent = my_container.
CL_GUI_HTML_VIEWER 의 생성자는 parent 만 받으면 끝. 다른 옵션(saphtmlp = 'X' 등) 은 SAP 내부 HTML 처리용으로 보통 비워둡니다.
2단계 — URL 표시 (가장 간단)
외부 URL 을 띄우는 게 가장 짧은 패턴. show_url 한 줄.
html_control->show_url(
EXPORTING
url = 'https://help.sap.com'
in_place = abap_true ). " 같은 컨트롤 안에 표시 (외부 브라우저 X)
in_place = abap_true 가 없으면 SAP GUI 의 디폴트 브라우저(Internet Explorer 등) 가 별창으로 열립니다. HTML Viewer 컨트롤 안에 표시하려면 필수.
사내 포털·SharePoint·매뉴얼 페이지 등 어떤 URL이든 OK. 단, SAP GUI 가 호스트 PC 의 브라우저 엔진(IE Webview / Edge Webview2) 을 호출하는 구조라 일부 최신 JS·SVG 기능은 호환성 이슈가 있을 수 있습니다.
3단계 — 메모리 HTML 표시 (동적 컨텐츠)
ABAP 에서 만든 HTML 문자열을 직접 표시하려면 load_data 로 메모리에 올린 뒤 받은 URL 로 show_url 합니다.
DATA : lt_html TYPE STANDARD TABLE OF w3html,
lv_url TYPE c LENGTH 200.
* HTML 라인 채우기
APPEND '<html><head><title>SAP Report</title></head>' TO lt_html.
APPEND '<body style="font-family:Arial">' TO lt_html.
APPEND '<h1 style="color:#4338ca">조회 결과</h1>' TO lt_html.
APPEND '<p>SFLIGHT 항공편 조회 완료</p>' TO lt_html.
APPEND '</body></html>' TO lt_html.
* 메모리에 로드 → URL 받기
html_control->load_data(
IMPORTING
assigned_url = lv_url
CHANGING
data_table = lt_html ).
* 받은 URL 로 표시
html_control->show_url( url = lv_url ).
load_data 가 임시 캐시 URL(sap://...) 을 만들어 assigned_url 로 돌려주고, 그 URL 을 show_url 에 넘기는 흐름. ALV 결과나 동적 보고서를 HTML 로 깔끔하게 보여주고 싶을 때 유용합니다.
4단계 — MIME Repository 객체 표시
SE80 → MIME Repository 에 미리 업로드한 정적 HTML / 이미지 / CSS 를 표시할 때.
html_control->load_mime_object(
EXPORTING
object_id = 'ZHELP_PAGE.HTM' " MIME Repo 의 파일명
object_url = 'help.htm'
IMPORTING
assigned_url = lv_url
EXCEPTIONS
object_not_found = 1
OTHERS = 2 ).
html_control->show_url( url = lv_url ).
회사 표준 매뉴얼 페이지나 자주 안 바뀌는 안내 페이지를 SAP 안에 임베드할 때 자주 씁니다. DB 에 BLOB 저장하는 것보다 MIME Repo 가 운영·전송에 깔끔.
5단계 — 이벤트 핸들러 등록 (navigate_complete)
사용자가 페이지 안 링크를 클릭해 URL 이 바뀌면 navigate_complete 이벤트가 발생합니다. 핸들러 클래스로 받아서 클릭한 URL 을 ABAP 변수에 저장 가능.
핸들러 클래스 정의
CLASS cl_myevent_handler DEFINITION.
PUBLIC SECTION.
METHODS on_navigate_complete
FOR EVENT navigate_complete OF cl_gui_html_viewer
IMPORTING url.
ENDCLASS.
CLASS cl_myevent_handler IMPLEMENTATION.
METHOD on_navigate_complete.
evurl = url. " 전역 변수에 URL 저장
ENDMETHOD.
ENDCLASS.
DATA : evt_receiver TYPE REF TO cl_myevent_handler,
evurl TYPE c LENGTH 2048.
FOR EVENT navigate_complete OF cl_gui_html_viewer IMPORTING url 이 핵심 시그니처. URL 길이는 2048 자 정도 잡아두면 안전.
이벤트 등록 + 핸들러 연결
DATA : event TYPE cntl_simple_event,
events TYPE cntl_simple_events.
event-eventid = cl_gui_html_viewer=>m_id_navigate_complete.
event-appl_event = 'X'. " 애플리케이션 이벤트
APPEND event TO events.
html_control->set_registered_events(
EXPORTING events = events ).
CREATE OBJECT evt_receiver.
SET HANDLER evt_receiver->on_navigate_complete FOR html_control.
cl_gui_html_viewer=>m_id_navigate_complete 가 이벤트 ID 상수. SIMPLE TREE 와 동일한 패턴 — appl_event = 'X' 박아야 ABAP 핸들러가 호출됩니다.
자주 빠뜨리는 함정
in_place 누락 — 외부 브라우저로 열림
in_place = abap_true 안 박으면 컨트롤 안이 아니라 별창(시스템 디폴트 브라우저) 으로 페이지가 떠 버립니다. HTML Viewer 안에 표시할 거면 무조건.
appl_event = 'X' 누락
이벤트 등록 시 appl_event = 'X' 빠뜨리면 시스템 이벤트로 처리되어 ABAP 핸들러가 호출되지 않습니다. SAP GUI 컨트롤 이벤트의 공통 함정.
load_data 의 W3HTML 길이
W3HTML 의 라인 길이는 보통 255 자. 한 줄에 긴 HTML 박지 말고 여러 라인으로 쪼개서 APPEND. 길어지면 줄이 잘려 표시 깨짐.
한글 인코딩
ABAP 에서 만든 HTML 에 한글이 들어가면 인코딩 헤더가 필요할 수 있습니다. <meta charset="UTF-8"> 을 <head> 안에 박아두는 게 안전. 운영 SAP 가 Unicode 가 아니면 EUC-KR 처리 필요.
URL 길이
이벤트로 받는 URL 은 1024~2048 자가 안전. 쿼리스트링이 긴 페이지(GET 파라미터 많음) 는 자릴 수 있으니 충분히 잡기.
CL_GUI_CUSTOM_CONTAINER 이름 — 대문자
SE51 의 Custom Control 이름과 코드의 container_name = 'CCONT' 가 대문자 정확 일치. 소문자나 오타면 컨테이너가 안 잡혀서 HTML Viewer 가 빈 화면에 그려집니다.
detach_url_in_browser — 외부 브라우저 분리
컨트롤 안 페이지를 외부 브라우저로 띄우고 싶을 때 detach_url_in_browser 메소드 사용. 이때는 in_place 와 반대 동작이 됩니다.
전체 코드 — 복사용 통합본
화면(CALL SCREEN) 이 있는 모듈풀 구조라 SAP 스탠다드 INCLUDE 6분할(T / C / SCR / O / I / F). SE51 에서 Screen 200 + Custom Container CCONT + Flow Logic 에 status_0200 · set_html (PBO) · user_command_0200 (PAI).
*&---------------------------------------------------------------------*
*& Report ZRXX_ALV_HTML (메인)
*&---------------------------------------------------------------------*
REPORT zrxx_alv_html.
INCLUDE zrxx_alv_html_t. " TOP - 전역 선언
INCLUDE zrxx_alv_html_c. " CLASS - 이벤트 핸들러 클래스
INCLUDE zrxx_alv_html_scr. " SCR - 셀렉션 스크린 (사용 안 함)
INCLUDE zrxx_alv_html_o. " PBO - OUTPUT 모듈
INCLUDE zrxx_alv_html_i. " PAI - INPUT 모듈
INCLUDE zrxx_alv_html_f. " FORM - 서브루틴
START-OF-SELECTION.
CALL SCREEN 200.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_T (TOP)
*&---------------------------------------------------------------------*
DATA : html_control TYPE REF TO cl_gui_html_viewer, " HTML Viewer
my_container TYPE REF TO cl_gui_custom_container.
DATA : myevent_tab TYPE cntl_simple_events,
evurl TYPE c LENGTH 2048. " 이벤트로 받은 URL
DATA : ok_code LIKE sy-ucomm.
DATA : evt_receiver TYPE REF TO cl_myevent_handler.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_C (CLASS)
*&---------------------------------------------------------------------*
CLASS cl_myevent_handler DEFINITION.
PUBLIC SECTION.
METHODS on_navigate_complete
FOR EVENT navigate_complete OF cl_gui_html_viewer
IMPORTING url.
ENDCLASS.
CLASS cl_myevent_handler IMPLEMENTATION.
METHOD on_navigate_complete.
evurl = url.
ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_SCR (SCR)
*&---------------------------------------------------------------------*
* (이 글에서는 셀렉션 스크린 사용 안 함)
* Screen 200 은 SE51 에서 정의 — Custom Container 이름 'CCONT'
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_O (PBO)
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
SET PF-STATUS 'S200'.
SET TITLEBAR 'T200'.
ENDMODULE.
MODULE set_html OUTPUT.
PERFORM create_html.
ENDMODULE.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_I (PAI)
*&---------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
CASE ok_code.
WHEN 'BACK' OR 'EXIT' OR 'CANC'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_HTML_F (FORM)
*&---------------------------------------------------------------------*
FORM create_html.
CHECK html_control IS INITIAL.
* 1) 컨테이너 + HTML Viewer 생성
CREATE OBJECT my_container
EXPORTING container_name = 'CCONT'.
CREATE OBJECT html_control
EXPORTING parent = my_container.
* 2) 이벤트 등록 — navigate_complete
DATA : event TYPE cntl_simple_event.
event-eventid = cl_gui_html_viewer=>m_id_navigate_complete.
event-appl_event = 'X'.
APPEND event TO myevent_tab.
html_control->set_registered_events(
EXPORTING events = myevent_tab ).
CREATE OBJECT evt_receiver.
SET HANDLER evt_receiver->on_navigate_complete FOR html_control.
* 3) URL 표시 (가장 간단한 패턴)
html_control->show_url(
EXPORTING
url = 'https://help.sap.com'
in_place = abap_true ).
* (대안) 메모리 HTML 표시 패턴 — 아래 주석 풀어서 사용
* DATA : lt_html TYPE STANDARD TABLE OF w3html,
* lv_url TYPE c LENGTH 200.
*
* APPEND '<html><head><meta charset="UTF-8"></head>' TO lt_html.
* APPEND '<body><h1>조회 결과</h1>' TO lt_html.
* APPEND '<p>SFLIGHT 항공편 데이터</p>' TO lt_html.
* APPEND '</body></html>' TO lt_html.
*
* html_control->load_data(
* IMPORTING assigned_url = lv_url
* CHANGING data_table = lt_html ).
*
* html_control->show_url( url = lv_url ).
ENDFORM.

요약
| 단계 | 위치 | 핵심 |
|---|---|---|
| 1 | 컨테이너 + Viewer | CL_GUI_CUSTOM_CONTAINER('CCONT') + CL_GUI_HTML_VIEWER |
| 2 | URL 표시 | show_url( url = 'https://...' in_place = abap_true ) |
| 3 | 메모리 HTML | load_data( CHANGING data_table ) → show_url( url = assigned_url ) |
| 4 | MIME 객체 | load_mime_object( object_id = 'ZHELP_PAGE.HTM' ) → show_url |
| 5 | 이벤트 | m_id_navigate_complete + appl_event='X' + set_registered_events + SET HANDLER |
HTML Viewer 의 본질은 "SAP GUI 안의 임베디드 브라우저". URL 한 줄(show_url) 로 외부 페이지 띄우고, 메모리 HTML(load_data) 로 동적 컨텐츠, MIME(load_mime_object) 으로 정적 자산 — 세 갈래 패턴이 다입니다. 사용자 클릭 URL 추적은 navigate_complete 이벤트로. in_place 와 appl_event 두 옵션만 잘 챙기면 사내 포털 임베드부터 동적 HTML 리포트까지 깔끔하게 만들 수 있습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
CL_GUI_HTML_VIEWER · CL_GUI_CUSTOM_CONTAINER · 메소드(show_url·load_data·load_mime_object·set_registered_events·detach_url_in_browser) · 이벤트 ID m_id_navigate_complete · CNTL_SIMPLE_EVENT/CNTL_SIMPLE_EVENTS · W3HTML 타입은 NetWeaver 스탠다드 정의(ECC 6.0 / S/4HANA on-premise 기준) 입니다. HTML 렌더링 엔진은 SAP GUI 가 호스트 PC 의 브라우저 컨트롤(IE Webview / Edge Webview2) 을 호출하는 구조라 일부 최신 JS·CSS·SVG 기능 호환성 차이가 있을 수 있으니 실제 적용 시 운영 PC 환경에서 사전 테스트를 권장합니다. 외부 URL 호출 시 사내 보안 정책(프록시·방화벽) 확인 필요.