SMW0 HTML양식 미리보기
CBO 프로그램에서 메일링, 전자결재 등등 HTML 페이지를 이용하여 무언가를 만들고자 할때,
일반적으로 SMW0에 HTML 양식을 올려놓고 해당 양식을 불러와서 ABAP 내에서 replace를 하여 사용하곤 합니다.
아래 프로그램은 SMW0에 등록된 HTML 양식을 빠르게 조회하여 HTML Viewer로 미리보기를 할수 리포트입니다.
# 소스코드
REPORT ydemo_html_template_list.
TABLES: wwwdata.
TYPES: BEGIN OF ts_data,
node_key TYPE tv_nodekey,
modu TYPE c LENGTH 50,
devclass TYPE tadir-devclass,
author TYPE tadir-author,
name_text TYPE v_username-name_text,
objid TYPE wwwdata-objid,
text TYPE wwwdata-text,
END OF ts_data.
DATA: go_column_tree TYPE REF TO cl_gui_column_tree,
go_html TYPE REF TO cl_proxy_xml_edit, "cl_gui_html_viewer,
* go_html2 TYPE REF TO zcl_cmz_editor,
go_xml_editor TYPE REF TO cl_proxy_xml_edit,
go_splitter TYPE REF TO cl_gui_splitter_container,
go_splitter2 TYPE REF TO cl_gui_splitter_container.
DATA: gt_data TYPE STANDARD TABLE OF ts_data,
gt_html TYPE soli_tab.
DATA: gt_exclude TYPE STANDARD TABLE OF sy-ucomm.
DATA: gt_nodes TYPE treev_ntab, "트리에 표시할 노드
gt_items TYPE STANDARD TABLE OF mtreeitm, "트리 노드의 컬럼
gs_hierarchy_header TYPE treev_hhdr, "트리의 Hierarchy 헤더
gv_hierarchy_column_name TYPE tv_itmname. "트리의 Hierarchy 컬럼 이름
SELECT-OPTIONS : s_objid FOR wwwdata-objid DEFAULT 'Z*' OPTION CP SIGN I OBLIGATORY.
SELECTION-SCREEN SKIP 1.
CLASS lcl_util DEFINITION.
PUBLIC SECTION.
CONSTANTS: BEGIN OF mc_w3_name,
extension TYPE string VALUE 'fileextension',
mimetype TYPE string VALUE 'mimetype',
filesize TYPE string VALUE 'filesize',
END OF mc_w3_name.
CLASS-METHODS:
get_web_object IMPORTING iv_relid TYPE indx_relid DEFAULT 'MI'
iv_object_name TYPE w3objid
EXPORTING ev_content_type TYPE csequence
ev_content_bintab TYPE solix_tab
ev_content_htmtab TYPE soli_tab
ev_content_length TYPE i
ev_description TYPE w3_text
ev_extension TYPE csequence
ev_dotextension TYPE csequence
RETURNING VALUE(rv_content_bin) TYPE xstring,
download_web_object IMPORTING iv_relid TYPE indx_relid DEFAULT 'MI'
iv_object_name TYPE w3objid
iv_window_title TYPE csequence OPTIONAL
iv_default_file_name TYPE csequence OPTIONAL
iv_initial_directory TYPE csequence OPTIONAL
EXPORTING ev_filename TYPE string
RETURNING VALUE(rv_fullpath) TYPE string
.
PRIVATE SECTION.
CLASS-METHODS:
raw_to_string IMPORTING it_solitab TYPE STANDARD TABLE
RETURNING VALUE(ev_string) TYPE string,
filename_replace_special_char IMPORTING iv_filename TYPE csequence OPTIONAL
RETURNING VALUE(rv_filename) TYPE string.
ENDCLASS.
CLASS lcl_util IMPLEMENTATION.
METHOD get_web_object.
SELECT
name, value
FROM wwwparams
WHERE relid EQ @iv_relid
AND objid EQ @iv_object_name
INTO TABLE @DATA(lt_wwwparams).
IF sy-subrc EQ 0.
SORT lt_wwwparams BY name.
ELSE.
RETURN.
ENDIF.
READ TABLE lt_wwwparams INTO DATA(ls_param) WITH KEY name = mc_w3_name-extension BINARY SEARCH.
IF sy-subrc EQ 0.
ev_dotextension = ls_param-value.
ev_extension = replace( val = ev_dotextension sub = '.' with = space occ = 0 ).
ENDIF.
READ TABLE lt_wwwparams INTO ls_param WITH KEY name = mc_w3_name-mimetype BINARY SEARCH.
IF sy-subrc EQ 0.
ev_content_type = ls_param-value.
ENDIF.
READ TABLE lt_wwwparams INTO ls_param WITH KEY name = mc_w3_name-filesize BINARY SEARCH.
IF sy-subrc EQ 0.
ev_content_length = ls_param-value.
ENDIF.
IF ev_content_bintab IS SUPPLIED OR ev_content_htmtab IS SUPPLIED OR rv_content_bin IS SUPPLIED.
DATA(ls_www_key) = VALUE wwwdatatab( relid = iv_relid
objid = iv_object_name ).
IF iv_relid EQ 'HT'.
CALL FUNCTION 'WWW_GET_SCRIPT_AND_HTML'
EXPORTING
obj_name = iv_object_name
TABLES
html = ev_content_htmtab
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
ELSE.
CALL FUNCTION 'WWWDATA_IMPORT'
EXPORTING
key = ls_www_key
TABLES
html = ev_content_htmtab
mime = ev_content_bintab
EXCEPTIONS
wrong_object_type = 1
import_error = 2
OTHERS = 3.
ENDIF.
IF sy-subrc NE 0.
RETURN.
ENDIF.
IF rv_content_bin IS SUPPLIED.
IF ev_content_bintab IS NOT INITIAL.
rv_content_bin = cl_bcs_convert=>solix_to_xstring( it_solix = ev_content_bintab
iv_size = ev_content_length ).
ELSEIF ev_content_htmtab IS NOT INITIAL.
TRY.
rv_content_bin = cl_bcs_convert=>string_to_xstring( raw_to_string( ev_content_htmtab ) ).
CATCH cx_bcs.
ENDTRY.
ENDIF.
ENDIF.
ENDIF.
IF ev_description IS SUPPLIED.
SELECT SINGLE text FROM wwwdata WHERE relid EQ @iv_relid AND objid EQ @iv_object_name
INTO @ev_description.
ENDIF.
ENDMETHOD.
METHOD download_web_object.
get_web_object(
EXPORTING
iv_relid = iv_relid
iv_object_name = iv_object_name
IMPORTING
* EV_CONTENT_TYPE = " Content type
ev_content_bintab = DATA(lv_bintab)
ev_content_htmtab = DATA(lv_htmtab)
ev_content_length = DATA(lv_length)
ev_description = DATA(lv_description)
ev_extension = DATA(lv_extension)
ev_dotextension = DATA(lv_dotextension)
).
IF sy-subrc NE 0.
EXIT.
ENDIF.
DATA: lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string.
cl_gui_frontend_services=>file_save_dialog(
EXPORTING
window_title = CONV #( iv_window_title )
default_extension = CONV #( lv_extension )
default_file_name = filename_replace_special_char(
COND string( WHEN iv_default_file_name IS NOT INITIAL THEN iv_default_file_name
ELSE lv_description && lv_dotextension ) )
file_filter = cl_gui_frontend_services=>filetype_html
initial_directory = CONV #( iv_initial_directory )
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5
).
IF sy-subrc <> 0 OR lv_fullpath IS INITIAL.
EXIT.
ENDIF.
IF iv_relid EQ 'HT'.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = lv_fullpath
filetype = 'ASC'
trunc_trailing_blanks = 'X'
write_lf = 'X'
CHANGING
data_tab = lv_htmtab
EXCEPTIONS
OTHERS = 1
).
ELSE.
cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = lv_length
filename = lv_fullpath
filetype = 'BIN'
CHANGING
data_tab = lv_bintab
EXCEPTIONS
OTHERS = 1
).
ENDIF.
IF sy-subrc <> 0.
EXIT.
ENDIF.
MOVE: lv_filename TO ev_filename,
lv_fullpath TO rv_fullpath.
ENDMETHOD.
METHOD raw_to_string.
ev_string = REDUCE string( INIT i = `` FOR <lfs> IN it_solitab
NEXT i = |{ i }{ COND #( WHEN i IS NOT INITIAL THEN cl_abap_char_utilities=>newline ) }{ CONV string( <lfs> ) }| ).
ENDMETHOD.
METHOD filename_replace_special_char.
rv_filename = replace( val = CONV string( iv_filename ) regex = '[/|:|*|?|"|<|>]' with = space occ = 0 ).
ENDMETHOD.
ENDCLASS.
CLASS lcl_tree_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS: handle_selection_changed FOR EVENT selection_changed OF cl_gui_column_tree IMPORTING node_key.
ENDCLASS.
CLASS lcl_tree_event_receiver IMPLEMENTATION.
METHOD handle_selection_changed.
READ TABLE gt_data INTO DATA(ls_data) WITH KEY node_key = node_key BINARY SEARCH.
IF sy-subrc NE 0.
EXIT.
ENDIF.
lcl_util=>get_web_object(
EXPORTING
iv_relid = 'HT' " 유형 : HT = HTML 템플릿, MI = 이진 데이터
iv_object_name = ls_data-objid
IMPORTING
ev_content_htmtab = gt_html " HTML Table
).
IF sy-subrc <> 0.
EXIT.
ENDIF.
DATA(lv_editor_content) = REDUCE string( INIT x = `` FOR ls IN gt_html NEXT x = |{ x }{ COND #( WHEN x IS NOT INITIAL THEN cl_abap_char_utilities=>newline ) }{ CONV string( ls ) }| ).
IF go_html IS NOT BOUND.
go_html = NEW #( parent = go_splitter2->get_container( row = 1 column = 1 )
source_type = 'HTML' ).
ENDIF.
go_html->clear( ).
go_html->set_text( CONV #( gt_html ) ).
IF go_xml_editor IS NOT BOUND.
go_xml_editor = NEW #( parent = go_splitter2->get_container( row = 2 "COND #( WHEN p_both EQ abap_true THEN 3 ELSE 2 )
column = 1 )
source_type = 'BSP' ).
ENDIF.
go_xml_editor->clear( ).
go_xml_editor->set_change_mode( abap_true ).
go_xml_editor->set_readonly( abap_false ).
go_xml_editor->set_text( CONV #( gt_html ) ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
CLEAR gt_html.
SELECT
a~objid,
CASE WHEN b~devclass EQ '$TMP' THEN b~devclass && ' ' && b~author
ELSE substring( b~devclass, 2, 2 ) END AS modu,
b~devclass,
CASE WHEN b~devclass EQ '$TMP' THEN b~author ELSE @space END AS author,
CASE WHEN b~devclass EQ '$TMP' THEN c~name_text ELSE @space END AS name_text,
a~text
FROM wwwdata AS a
INNER JOIN tadir AS b ON a~objid EQ b~obj_name
LEFT OUTER JOIN v_username AS c ON b~author EQ c~bname
WHERE a~relid EQ 'HT'
AND a~objid IN @s_objid
AND b~pgmid EQ 'R3TR'
AND b~object EQ 'W3HT'
GROUP BY b~devclass,
b~author,
c~name_text,
a~objid, a~text
ORDER BY b~devclass, a~objid
INTO CORRESPONDING FIELDS OF TABLE @gt_data.
IF sy-subrc NE 0.
EXIT.
ENDIF.
CLEAR: gt_nodes, gt_items, gs_hierarchy_header.
DATA(lv_idx) = VALUE i( ).
DATA lv_relatkey TYPE c LENGTH 12.
LOOP AT gt_data INTO DATA(ls_data) GROUP BY ( modu = ls_data-modu
name_text = ls_data-name_text
size = GROUP SIZE ) ASCENDING
ASSIGNING FIELD-SYMBOL(<lfs_group>).
lv_relatkey = |RE{ sy-tabix }|.
APPEND VALUE #( node_key = lv_relatkey
isfolder = abap_true
) TO gt_nodes.
"노드의 아이템(컬럼) 추가
APPEND VALUE #( node_key = lv_relatkey
item_name = 'OBJID'
class = cl_gui_column_tree=>item_class_text
text = <lfs_group>-modu ) TO gt_items.
APPEND VALUE #( node_key = lv_relatkey
item_name = 'TEXT'
class = cl_gui_column_tree=>item_class_text
text = COND #( WHEN <lfs_group>-name_text IS NOT INITIAL THEN <lfs_group>-name_text ELSE |{ <lfs_group>-size NUMBER = USER } EA| )
) TO gt_items.
LOOP AT GROUP <lfs_group> ASSIGNING FIELD-SYMBOL(<lfs_items>).
lv_idx += 1.
<lfs_items>-node_key = lv_idx.
APPEND VALUE #( node_key = <lfs_items>-node_key
relatkey = lv_relatkey
) TO gt_nodes.
"노드의 아이템(컬럼) 추가
APPEND VALUE #( node_key = <lfs_items>-node_key
item_name = 'OBJID'
class = cl_gui_column_tree=>item_class_text
text = <lfs_items>-objid ) TO gt_items.
APPEND VALUE #( node_key = <lfs_items>-node_key
item_name = 'TEXT'
class = cl_gui_column_tree=>item_class_text
text = <lfs_items>-text ) TO gt_items.
ENDLOOP.
ENDLOOP.
SORT gt_data BY node_key.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
CLEAR gt_exclude.
SET PF-STATUS '100' EXCLUDING gt_exclude.
IF go_column_tree IS NOT BOUND.
"Column tree의 hierarchy 컬럼 설정
gs_hierarchy_header-heading = 'HTML 양식'.
gs_hierarchy_header-width = 20.
gv_hierarchy_column_name = 'OBJID'.
go_splitter = NEW #( rows = 1 columns = 2 parent = cl_gui_container=>default_screen ).
go_splitter->set_column_width( id = 1
width = 20 ).
go_splitter2 = NEW #( rows = 2 "COND #( WHEN p_both EQ abap_true THEN 3 ELSE 2 )
columns = 1
parent = go_splitter->get_container( row = 1 column = 2 ) ).
"트리 오브젝트 생성
CREATE OBJECT go_column_tree
EXPORTING
* LIFETIME =
parent = go_splitter->get_container( row = 1 column = 1 )
* SHELLSTYLE =
node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
* HIDE_SELECTION =
item_selection = abap_false
hierarchy_column_name = gv_hierarchy_column_name
hierarchy_header = gs_hierarchy_header
EXCEPTIONS
lifetime_error = 1
cntl_system_error = 2
create_error = 3
illegal_node_selection_mode = 4
failed = 5
illegal_column_name = 6
OTHERS = 7.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
"트리 이벤트 등록
go_column_tree->set_registered_events( VALUE #( ( eventid = cl_gui_column_tree=>eventid_selection_changed appl_event = ' ' ) ) ).
DATA(lcl_tree_event) = NEW lcl_tree_event_receiver( ).
SET HANDLER lcl_tree_event->handle_selection_changed FOR go_column_tree.
"Hierarchy 외에 추가할 컬럼
go_column_tree->add_column(
EXPORTING
name = 'TEXT'
width = 40
header_text = '내역'
EXCEPTIONS
column_exists = 1
illegal_column_name = 2
too_many_columns = 3
illegal_alignment = 4
different_column_types = 5
cntl_system_error = 6
failed = 7
predecessor_column_not_found = 8
OTHERS = 9
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
"트리에 노드와 아이템(컬럼) 설정
go_column_tree->add_nodes_and_items(
EXPORTING
node_table = gt_nodes
item_table = gt_items
item_table_structure_name = 'MTREEITM'
EXCEPTIONS
failed = 1
cntl_system_error = 2
error_in_tables = 3
dp_error = 4
table_structure_name_not_found = 5
OTHERS = 6
).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
"루트 노드 펼치기
go_column_tree->expand_root_nodes( EXPORTING level_count = 1 ).
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_exit INPUT.
IF sy-ucomm EQ 'EXIT'.
LEAVE PROGRAM.
ELSE.
LEAVE TO SCREEN 0.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'DOWNLOAD'.
CLEAR sy-ucomm.
go_column_tree->get_selected_node(
IMPORTING
node_key = DATA(lv_selected_node_key)
EXCEPTIONS
failed = 1 " General Error
single_node_selection_only = 2 " Only Allowed with Single Node Selection
cntl_system_error = 3 " "
OTHERS = 4
).
IF sy-subrc <> 0.
EXIT.
ENDIF.
READ TABLE gt_data INTO ls_data WITH KEY node_key = lv_selected_node_key BINARY SEARCH.
IF sy-subrc NE 0.
EXIT.
ENDIF.
lcl_util=>download_web_object(
EXPORTING
iv_relid = 'HT' " 유형 : HT = HTML 템플릿, MI = 이진 데이터
iv_object_name = ls_data-objid " 오브젝트 이름
).
WHEN 'REFRESH'.
CLEAR sy-ucomm.
IF go_xml_editor IS BOUND AND go_html IS BOUND.
gt_html = go_xml_editor->get_text( ).
go_html->clear( ).
go_html->set_text( CONV #( gt_html ) ).
ENDIF.
ENDCASE.
ENDMODULE.
'ABAP > 소스코드' 카테고리의 다른 글
[Report] 소스코드 작성하여 바로 실행(YDIRECT_EXEC) (0) | 2024.10.24 |
---|---|
[Report] 운영에서 소스코드 편집 프로그램(YEDITPR) (0) | 2024.10.24 |
[Class] Internal Table/Structure 일괄 Conversion - ZCL_MASS_CONV_ALPHA (0) | 2023.11.22 |
[Class] Excel 업로드/다운로드 통합 Class - ZCL_EXCEL_UPDOWN (1) | 2023.11.22 |
[Report] 일괄 번역 편집기(MASS_TRANSLATE) (2) | 2023.11.15 |
댓글