abap2xlsx/src/demos/zabap2xlsx_demo_show.prog.abap
Mike Pokraka 2710dd9717
Pretty print (#781)
Co-authored-by: Lars Hvam <larshp@hotmail.com>
2021-07-28 00:33:22 +02:00

281 lines
10 KiB
ABAP

*&---------------------------------------------------------------------*
*& Report ZABAP2XLSX_DEMO_SHOW
*&---------------------------------------------------------------------*
REPORT zabap2xlsx_demo_show.
*----------------------------------------------------------------------*
* CLASS lcl_perform DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_perform DEFINITION CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS: setup_objects,
collect_reports,
handle_nav FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row.
PRIVATE SECTION.
TYPES: BEGIN OF ty_reports,
progname TYPE reposrc-progname,
sort TYPE reposrc-progname,
description TYPE repti,
filename TYPE string,
END OF ty_reports.
CLASS-DATA:
lo_grid TYPE REF TO cl_gui_alv_grid,
lo_text TYPE REF TO cl_gui_textedit,
cl_document TYPE REF TO i_oi_document_proxy,
t_reports TYPE STANDARD TABLE OF ty_reports WITH NON-UNIQUE DEFAULT KEY.
CLASS-DATA:error TYPE REF TO i_oi_error,
t_errors TYPE STANDARD TABLE OF REF TO i_oi_error WITH NON-UNIQUE DEFAULT KEY,
cl_control TYPE REF TO i_oi_container_control. "Office Dokument
ENDCLASS. "lcl_perform DEFINITION
START-OF-SELECTION.
lcl_perform=>collect_reports( ).
lcl_perform=>setup_objects( ).
END-OF-SELECTION.
WRITE '.'. " Force output
*----------------------------------------------------------------------*
* CLASS lcl_perform IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_perform IMPLEMENTATION.
METHOD setup_objects.
DATA: lo_split TYPE REF TO cl_gui_splitter_container,
lo_container TYPE REF TO cl_gui_container.
DATA: it_fieldcat TYPE lvc_t_fcat,
is_layout TYPE lvc_s_layo,
is_variant TYPE disvariant.
FIELD-SYMBOLS: <fc> LIKE LINE OF it_fieldcat.
CREATE OBJECT lo_split
EXPORTING
parent = cl_gui_container=>screen0
rows = 1
columns = 3
no_autodef_progid_dynnr = 'X'.
lo_split->set_column_width( EXPORTING id = 1
width = 20 ).
lo_split->set_column_width( EXPORTING id = 2
width = 40 ).
* Left: List of reports
lo_container = lo_split->get_container( row = 1
column = 1 ).
CREATE OBJECT lo_grid
EXPORTING
i_parent = lo_container.
SET HANDLER lcl_perform=>handle_nav FOR lo_grid.
is_variant-report = sy-repid.
is_variant-handle = '0001'.
is_layout-cwidth_opt = 'X'.
APPEND INITIAL LINE TO it_fieldcat ASSIGNING <fc>.
<fc>-fieldname = 'PROGNAME'.
<fc>-tabname = 'REPOSRC'.
APPEND INITIAL LINE TO it_fieldcat ASSIGNING <fc>.
<fc>-fieldname = 'SORT'.
<fc>-ref_field = 'PROGNAME'.
<fc>-ref_table = 'REPOSRC'.
<fc>-tech = abap_true. "No need to display this help field
APPEND INITIAL LINE TO it_fieldcat ASSIGNING <fc>.
<fc>-fieldname = 'DESCRIPTION'.
<fc>-ref_field = 'REPTI'.
<fc>-ref_table = 'RS38M'.
lo_grid->set_table_for_first_display( EXPORTING
is_variant = is_variant
i_save = 'A'
is_layout = is_layout
CHANGING
it_outtab = t_reports
it_fieldcatalog = it_fieldcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4 ).
* Middle: Text with coding
lo_container = lo_split->get_container( row = 1
column = 2 ).
CREATE OBJECT lo_text
EXPORTING
parent = lo_container.
lo_text->set_readonly_mode( cl_gui_textedit=>true ).
lo_text->set_font_fixed( ).
* right: DemoOutput
lo_container = lo_split->get_container( row = 1
column = 3 ).
c_oi_container_control_creator=>get_container_control( IMPORTING control = cl_control
error = error ).
APPEND error TO t_errors.
cl_control->init_control( EXPORTING inplace_enabled = 'X'
no_flush = 'X'
r3_application_name = 'Demo Document Container'
parent = lo_container
IMPORTING error = error
EXCEPTIONS OTHERS = 2 ).
APPEND error TO t_errors.
cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL
no_flush = ' '
IMPORTING document_proxy = cl_document
error = error ).
APPEND error TO t_errors.
* Errorhandling should be inserted here
ENDMETHOD. "setup_objects
"collect_reports
METHOD collect_reports.
FIELD-SYMBOLS <report> LIKE LINE OF t_reports.
DATA t_source TYPE STANDARD TABLE OF text255 WITH NON-UNIQUE DEFAULT KEY.
DATA texts TYPE STANDARD TABLE OF textpool.
DATA description TYPE textpool.
* Get all demoreports
SELECT progname
INTO CORRESPONDING FIELDS OF TABLE t_reports
FROM reposrc
WHERE progname LIKE 'ZDEMO_EXCEL%'
AND progname <> sy-repid
AND subc = '1'.
LOOP AT t_reports ASSIGNING <report>.
* Check if already switched to new outputoptions
READ REPORT <report>-progname INTO t_source.
IF sy-subrc = 0.
FIND 'INCLUDE zdemo_excel_outputopt_incl.' IN TABLE t_source IGNORING CASE.
ENDIF.
IF sy-subrc <> 0.
DELETE t_reports.
CONTINUE.
ENDIF.
* Build half-numeric sort
<report>-sort = <report>-progname.
REPLACE REGEX '(ZDEMO_EXCEL)(\d\d)\s*$' IN <report>-sort WITH '$1\0$2'. " REPLACE REGEX '(ZDEMO_EXCEL)([^][^])*$' IN <report>-sort WITH '$1$2'.REPLACE REGEX '(ZDEMO_EXCEL)([^][^])*$' IN <report>-sort WITH '$1$2'.REPLACE
REPLACE REGEX '(ZDEMO_EXCEL)(\d)\s*$' IN <report>-sort WITH '$1\0\0$2'.
* get report text
READ TEXTPOOL <report>-progname INTO texts LANGUAGE sy-langu.
READ TABLE texts INTO description WITH KEY id = 'R'.
IF sy-subrc > 0.
"If not available in logon language, use english
READ TEXTPOOL <report>-progname INTO texts LANGUAGE 'E'.
READ TABLE texts INTO description WITH KEY id = 'R'.
ENDIF.
"set report title
<report>-description = description-entry.
ENDLOOP.
SORT t_reports BY sort progname.
ENDMETHOD. "collect_reports
METHOD handle_nav.
CONSTANTS: filename TYPE text80 VALUE 'ZABAP2XLSX_DEMO_SHOW.xlsx'.
DATA: wa_report LIKE LINE OF t_reports,
t_source TYPE STANDARD TABLE OF text255,
t_rawdata TYPE solix_tab,
wa_rawdata LIKE LINE OF t_rawdata,
bytecount TYPE i,
length TYPE i,
add_selopt TYPE flag.
READ TABLE t_reports INTO wa_report INDEX e_row-index.
CHECK sy-subrc = 0.
* Set new text into middle frame
READ REPORT wa_report-progname INTO t_source.
lo_text->set_text_as_r3table( EXPORTING table = t_source ).
* Unload old xls-file
cl_document->close_document( ).
* Get the demo
* If additional parameters found on selection screen, start via selection screen , otherwise start w/o
CLEAR add_selopt.
FIND 'PARAMETERS' IN TABLE t_source.
IF sy-subrc = 0.
add_selopt = 'X'.
ELSE.
FIND 'SELECT-OPTIONS' IN TABLE t_source.
IF sy-subrc = 0.
add_selopt = 'X'.
ENDIF.
ENDIF.
IF add_selopt IS INITIAL.
SUBMIT (wa_report-progname) AND RETURN "#EC CI_SUBMIT
WITH p_backfn = filename
WITH rb_back = 'X'
WITH rb_down = ' '
WITH rb_send = ' '
WITH rb_show = ' '.
ELSE.
SUBMIT (wa_report-progname) VIA SELECTION-SCREEN AND RETURN "#EC CI_SUBMIT
WITH p_backfn = filename
WITH rb_back = 'X'
WITH rb_down = ' '
WITH rb_send = ' '
WITH rb_show = ' '.
ENDIF.
OPEN DATASET filename FOR INPUT IN BINARY MODE.
IF sy-subrc = 0.
DO.
CLEAR wa_rawdata.
READ DATASET filename INTO wa_rawdata LENGTH length.
IF sy-subrc <> 0.
APPEND wa_rawdata TO t_rawdata.
ADD length TO bytecount.
EXIT.
ENDIF.
APPEND wa_rawdata TO t_rawdata.
ADD length TO bytecount.
ENDDO.
CLOSE DATASET filename.
ENDIF.
cl_control->get_document_proxy( EXPORTING document_type = 'Excel.Sheet' " EXCEL
no_flush = ' '
IMPORTING document_proxy = cl_document
error = error ).
cl_document->open_document_from_table( EXPORTING document_size = bytecount
document_table = t_rawdata
open_inplace = 'X' ).
ENDMETHOD. "handle_nav
ENDCLASS. "lcl_perform IMPLEMENTATION