본문 바로가기
ABAP/소스코드

[Report] SMW0 HTML양식 미리보기(ydemo_html_template_list)

by name_text 2024. 10. 24.

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.

 

댓글