abap2xlsx/ZA2X/PROG/ZDEMO_CALENDAR.slnk
StefanSchmoecker af00a56683 Issue #379 - obsolete function modules
Added new class/method to wrap obsolete function GUID_CREATE and use replacement class SAP provides.  Old function call still found in wrapper class commented out for use in older releases, which don't have the new methods from SAP yet ( 7.01 does not have it for example )
Replaced calls to function by calls to wrapper-method
Changed calculation of last date in month in ZDEMO_CALENDAR since it was calling an obsoleted function as well.
2015-06-16 16:03:05 +02:00

413 lines
18 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<PROG NAME="ZDEMO_CALENDAR" VARCL="X" SUBC="1" RSTAT="T" RMAND="001" RLOAD="E" FIXPT="X" UCCHECK="X">
<textPool>
<language SPRAS="D">
<textElement ID="I" KEY="000" ENTRY="Ausrichtung" LENGTH="11 "/>
<textElement ID="I" KEY="001" ENTRY="KW" LENGTH="4 "/>
<textElement ID="I" KEY="002" ENTRY="Erzeugt mit abap2xlsx. Weitere Informationen unter http://abap2xlsx.org." LENGTH="100 "/>
<textElement ID="R" ENTRY="abap2xlsx Demo: Erzeugen eines Kalenders mit Bildern" LENGTH="70 "/>
<textElement ID="S" KEY="P_LANDS" ENTRY=" Querformat" LENGTH="18 "/>
<textElement ID="S" KEY="P_PORTR" ENTRY=" Hochformat" LENGTH="18 "/>
<textElement ID="S" KEY="P_FROM" ENTRY="D ." LENGTH="17 "/>
<textElement ID="S" KEY="P_PATH" ENTRY="D ." LENGTH="24 "/>
<textElement ID="S" KEY="P_TO" ENTRY="D ." LENGTH="15 "/>
</language>
<language SPRAS="E">
<textElement ID="I" KEY="000" ENTRY="Orientation" LENGTH="11 "/>
<textElement ID="I" KEY="001" ENTRY="CW" LENGTH="4 "/>
<textElement ID="I" KEY="002" ENTRY="Created with abap2xlsx. Find more information at http://abap2xlsx.org." LENGTH="100 "/>
<textElement ID="R" ENTRY="abap2xlsx Demo: Create Calendar with Pictures" LENGTH="45 "/>
<textElement ID="S" KEY="P_FROM" ENTRY="D ." LENGTH="17 "/>
<textElement ID="S" KEY="P_LANDS" ENTRY=" Landscape" LENGTH="17 "/>
<textElement ID="S" KEY="P_PATH" ENTRY="D ." LENGTH="24 "/>
<textElement ID="S" KEY="P_PORTR" ENTRY=" Portrait" LENGTH="16 "/>
<textElement ID="S" KEY="P_TO" ENTRY="D ." LENGTH="15 "/>
</language>
</textPool>
<source>*&amp;---------------------------------------------------------------------*
*&amp; Report ZDEMO_CALENDAR
*&amp; abap2xlsx Demo: Create Calendar with Pictures
*&amp;---------------------------------------------------------------------*
*&amp; This report creates a monthly calendar in the specified date range.
*&amp; Each month is put on a seperate worksheet. The pictures for each
*&amp; month can be specified in a tab delimited file called &quot;Calendar.txt&quot;
*&amp; which is saved in the Export Directory. By default this is the SAP
*&amp; Workdir. The file contains 3 fields:
*&amp;
*&amp; Month (with leading 0)
*&amp; Image Filename
*&amp; Image Description
*&amp; URL for the Description
*&amp;
*&amp; The Images should be landscape JPEG&apos;s with a 3:2 ratio and min.
*&amp; 450 pixel height. They must also be saved in the Export Directory.
*&amp; In my tests I&apos;ve discovered a limit of 20 MB in the
*&amp; cl_gui_frontend_services=&gt;gui_download method. So keep your images
*&amp; smaller or change to a server export using OPEN DATASET.
*&amp;---------------------------------------------------------------------*
REPORT zdemo_calendar.
TYPE-POOLS: abap.
CONSTANTS: gc_save_file_name TYPE string VALUE &apos;Calendar.xlsx&apos;.
INCLUDE zdemo_excel_outputopt_incl.
INCLUDE zdemo_calendar_classes.
DATA: lv_workdir TYPE string.
PARAMETERS: p_from TYPE dfrom DEFAULT &apos;20130101&apos;,
p_to TYPE dto DEFAULT &apos;20131231&apos;.
SELECTION-SCREEN BEGIN OF BLOCK orientation WITH FRAME TITLE orient.
PARAMETERS: p_portr TYPE flag RADIOBUTTON GROUP orie,
p_lands TYPE flag RADIOBUTTON GROUP orie DEFAULT &apos;X&apos;.
SELECTION-SCREEN END OF BLOCK orientation.
INITIALIZATION.
cl_gui_frontend_services=&gt;get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ).
cl_gui_cfw=&gt;flush( ).
p_path = lv_workdir.
orient = &apos;Orientation&apos;(000).
START-OF-SELECTION.
DATA: lo_excel TYPE REF TO zcl_excel,
lo_excel_writer TYPE REF TO zif_excel_writer,
lo_worksheet TYPE REF TO zcl_excel_worksheet,
lo_col_dim TYPE REF TO zcl_excel_worksheet_columndime,
lo_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi,
hyperlink TYPE REF TO zcl_excel_hyperlink,
lo_drawing TYPE REF TO zcl_excel_drawing.
DATA: lo_style_month TYPE REF TO zcl_excel_style,
lv_style_month_guid TYPE zexcel_cell_style.
DATA: lo_style_border TYPE REF TO zcl_excel_style,
lo_border_dark TYPE REF TO zcl_excel_style_border,
lv_style_border_guid TYPE zexcel_cell_style.
DATA: lo_style_center TYPE REF TO zcl_excel_style,
lv_style_center_guid TYPE zexcel_cell_style.
DATA: lv_file TYPE xstring,
lv_bytecount TYPE i,
lt_file_tab TYPE solix_tab.
DATA: lv_full_path TYPE string,
image_descr_path TYPE string,
lv_file_separator TYPE c.
DATA: lv_content TYPE xstring,
width TYPE i,
lv_height TYPE i,
lv_from_row TYPE zexcel_cell_row.
DATA: month TYPE i,
month_nr TYPE fcmnr,
count TYPE i VALUE 1,
title TYPE zexcel_sheet_title,
value TYPE string,
image_path TYPE string,
date_from TYPE datum,
date_to TYPE datum,
row TYPE zexcel_cell_row,
to_row TYPE zexcel_cell_row,
to_col TYPE zexcel_cell_column_alpha,
to_col_end TYPE zexcel_cell_column_alpha,
to_col_int TYPE i.
DATA: month_names TYPE TABLE OF t247.
FIELD-SYMBOLS: &lt;month_name&gt; LIKE LINE OF month_names.
TYPES: BEGIN OF tt_datatab,
month_nr TYPE fcmnr,
filename TYPE string,
descr TYPE string,
url TYPE string,
END OF tt_datatab.
DATA: image_descriptions TYPE TABLE OF tt_datatab.
FIELD-SYMBOLS: &lt;img_descr&gt; LIKE LINE OF image_descriptions.
CONSTANTS: lv_default_file_name TYPE string VALUE &apos;Calendar&apos;, &quot;#EC NOTEXT
c_from_row_portrait TYPE zexcel_cell_row VALUE 28,
c_from_row_landscape TYPE zexcel_cell_row VALUE 38,
from_col TYPE zexcel_cell_column_alpha VALUE &apos;C&apos;,
c_height_portrait TYPE i VALUE 450, &quot; Image Height in Portrait Mode
c_height_landscape TYPE i VALUE 670, &quot; Image Height in Landscape Mode
c_factor TYPE f VALUE &apos;1.5&apos;. &quot; Image Ratio, default 3:2
IF p_path IS INITIAL.
p_path = lv_workdir.
ENDIF.
cl_gui_frontend_services=&gt;get_file_separator( CHANGING file_separator = lv_file_separator ).
CONCATENATE p_path lv_file_separator lv_default_file_name &apos;.xlsx&apos; INTO lv_full_path. &quot;#EC NOTEXT
&quot; Read Image Names for Month and Description
CONCATENATE p_path lv_file_separator lv_default_file_name &apos;.txt&apos; INTO image_descr_path. &quot;#EC NOTEXT
cl_gui_frontend_services=&gt;gui_upload(
EXPORTING
filename = image_descr_path &quot; Name of file
filetype = &apos;ASC&apos; &quot; File Type (ASCII, Binary)
has_field_separator = &apos;X&apos;
read_by_line = &apos;X&apos; &quot; File Written Line-By-Line to the Internal Table
CHANGING
data_tab = image_descriptions &quot; Transfer table for file contents
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19
).
IF sy-subrc &lt;&gt; 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
&quot; Creates active sheet
CREATE OBJECT lo_excel.
&quot; Create Styles
&quot; Create an underline double style
lo_style_month = lo_excel-&gt;add_new_style( ).
&quot; lo_style_month-&gt;font-&gt;underline = abap_true.
&quot; lo_style_month-&gt;font-&gt;underline_mode = zcl_excel_style_font=&gt;c_underline_single.
lo_style_month-&gt;font-&gt;name = zcl_excel_style_font=&gt;c_name_roman.
lo_style_month-&gt;font-&gt;scheme = zcl_excel_style_font=&gt;c_scheme_none.
lo_style_month-&gt;font-&gt;family = zcl_excel_style_font=&gt;c_family_roman.
lo_style_month-&gt;font-&gt;bold = abap_true.
lo_style_month-&gt;font-&gt;size = 36.
lv_style_month_guid = lo_style_month-&gt;get_guid( ).
&quot; Create border object
CREATE OBJECT lo_border_dark.
lo_border_dark-&gt;border_color-rgb = zcl_excel_style_color=&gt;c_black.
lo_border_dark-&gt;border_style = zcl_excel_style_border=&gt;c_border_thin.
&quot;Create style with border
lo_style_border = lo_excel-&gt;add_new_style( ).
lo_style_border-&gt;borders-&gt;allborders = lo_border_dark.
lo_style_border-&gt;alignment-&gt;horizontal = zcl_excel_style_alignment=&gt;c_horizontal_right.
lo_style_border-&gt;alignment-&gt;vertical = zcl_excel_style_alignment=&gt;c_vertical_top.
lv_style_border_guid = lo_style_border-&gt;get_guid( ).
&quot;Create style alignment center
lo_style_center = lo_excel-&gt;add_new_style( ).
lo_style_center-&gt;alignment-&gt;horizontal = zcl_excel_style_alignment=&gt;c_horizontal_center.
lo_style_center-&gt;alignment-&gt;vertical = zcl_excel_style_alignment=&gt;c_vertical_top.
lv_style_center_guid = lo_style_center-&gt;get_guid( ).
&quot; Get Month Names
CALL FUNCTION &apos;MONTH_NAMES_GET&apos;
TABLES
month_names = month_names.
zcl_date_calculation=&gt;months_between_two_dates(
EXPORTING
i_date_from = p_from
i_date_to = p_to
i_incl_to = abap_true
IMPORTING
e_month = month
).
date_from = p_from.
WHILE count &lt;= month.
IF count = 1.
&quot; Get active sheet
lo_worksheet = lo_excel-&gt;get_active_worksheet( ).
ELSE.
lo_worksheet = lo_excel-&gt;add_new_worksheet( ).
ENDIF.
lo_worksheet-&gt;zif_excel_sheet_properties~selected = zif_excel_sheet_properties=&gt;c_selected.
title = count.
value = count.
CONDENSE title.
CONDENSE value.
lo_worksheet-&gt;set_title( title ).
lo_worksheet-&gt;set_print_gridlines( abap_false ).
lo_worksheet-&gt;sheet_setup-&gt;paper_size = zcl_excel_sheet_setup=&gt;c_papersize_a4.
lo_worksheet-&gt;sheet_setup-&gt;horizontal_centered = abap_true.
lo_worksheet-&gt;sheet_setup-&gt;vertical_centered = abap_true.
lo_col_dim = lo_worksheet-&gt;get_column_dimension( &apos;A&apos; ).
lo_col_dim-&gt;set_width( &apos;1.0&apos; ).
lo_col_dim = lo_worksheet-&gt;get_column_dimension( &apos;B&apos; ).
lo_col_dim-&gt;set_width( &apos;2.0&apos; ).
IF p_lands = abap_true.
lo_worksheet-&gt;sheet_setup-&gt;orientation = zcl_excel_sheet_setup=&gt;c_orientation_landscape.
lv_height = c_height_landscape.
lv_from_row = c_from_row_landscape.
lo_worksheet-&gt;sheet_setup-&gt;margin_top = &apos;0.10&apos;.
lo_worksheet-&gt;sheet_setup-&gt;margin_left = &apos;0.10&apos;.
lo_worksheet-&gt;sheet_setup-&gt;margin_right = &apos;0.10&apos;.
lo_worksheet-&gt;sheet_setup-&gt;margin_bottom = &apos;0.10&apos;.
ELSE.
lo_col_dim = lo_worksheet-&gt;get_column_dimension( &apos;K&apos; ).
lo_col_dim-&gt;set_width( &apos;3.0&apos; ).
lo_worksheet-&gt;sheet_setup-&gt;margin_top = &apos;0.80&apos;.
lo_worksheet-&gt;sheet_setup-&gt;margin_left = &apos;0.55&apos;.
lo_worksheet-&gt;sheet_setup-&gt;margin_right = &apos;0.05&apos;.
lo_worksheet-&gt;sheet_setup-&gt;margin_bottom = &apos;0.30&apos;.
lv_height = c_height_portrait.
lv_from_row = c_from_row_portrait.
ENDIF.
&quot; Add Month Name
month_nr = date_from+4(2).
IF p_portr = abap_true.
READ TABLE month_names WITH KEY mnr = month_nr ASSIGNING &lt;month_name&gt;.
CONCATENATE &lt;month_name&gt;-ltx ` ` date_from(4) INTO value.
row = lv_from_row - 2.
to_col = from_col.
ELSE.
row = lv_from_row - 1.
to_col_int = zcl_excel_common=&gt;convert_column2int( from_col ) + 32.
to_col = zcl_excel_common=&gt;convert_column2alpha( to_col_int ).
to_col_int = to_col_int + 1.
to_col_end = zcl_excel_common=&gt;convert_column2alpha( to_col_int ).
CONCATENATE month_nr &apos;/&apos; date_from+2(2) INTO value.
to_row = row + 2.
lo_worksheet-&gt;set_merge(
EXPORTING
ip_column_start = to_col &quot; Cell Column Start
ip_column_end = to_col_end &quot; Cell Column End
ip_row = row &quot; Cell Row
ip_row_to = to_row &quot; Cell Row
).
ENDIF.
lo_worksheet-&gt;set_cell(
EXPORTING
ip_column = to_col &quot; Cell Column
ip_row = row &quot; Cell Row
ip_value = value &quot; Cell Value
ip_style = lv_style_month_guid
).
* to_col_int = zcl_excel_common=&gt;convert_column2int( from_col ) + 7.
* to_col = zcl_excel_common=&gt;convert_column2alpha( to_col_int ).
*
* lo_worksheet-&gt;set_merge(
* EXPORTING
* ip_column_start = from_col &quot; Cell Column Start
* ip_column_end = to_col &quot; Cell Column End
* ip_row = row &quot; Cell Row
* ip_row_to = row &quot; Cell Row
* ).
&quot; Add drawing from a XSTRING read from a file
UNASSIGN &lt;img_descr&gt;.
READ TABLE image_descriptions WITH KEY month_nr = month_nr ASSIGNING &lt;img_descr&gt;.
IF &lt;img_descr&gt; IS ASSIGNED.
value = &lt;img_descr&gt;-descr.
IF p_portr = abap_true.
row = lv_from_row - 3.
ELSE.
row = lv_from_row - 2.
ENDIF.
IF NOT &lt;img_descr&gt;-url IS INITIAL.
hyperlink = zcl_excel_hyperlink=&gt;create_external_link( &lt;img_descr&gt;-url ).
lo_worksheet-&gt;set_cell(
EXPORTING
ip_column = from_col &quot; Cell Column
ip_row = row &quot; Cell Row
ip_value = value &quot; Cell Value
ip_hyperlink = hyperlink
).
ELSE.
lo_worksheet-&gt;set_cell(
EXPORTING
ip_column = from_col &quot; Cell Column
ip_row = row &quot; Cell Row
ip_value = value &quot; Cell Value
).
ENDIF.
lo_row_dim = lo_worksheet-&gt;get_row_dimension( row ).
lo_row_dim-&gt;set_row_height( &apos;22.0&apos; ).
&quot; In Landscape mode the row between the description and the
&quot; dates should be not so high
IF p_lands = abap_true.
row = lv_from_row - 3.
lo_worksheet-&gt;set_cell(
EXPORTING
ip_column = from_col &quot; Cell Column
ip_row = row &quot; Cell Row
ip_value = &apos; &apos; &quot; Cell Value
).
lo_row_dim = lo_worksheet-&gt;get_row_dimension( row ).
lo_row_dim-&gt;set_row_height( &apos;7.0&apos; ).
row = lv_from_row - 1.
lo_row_dim = lo_worksheet-&gt;get_row_dimension( row ).
lo_row_dim-&gt;set_row_height( &apos;5.0&apos; ).
ENDIF.
CONCATENATE p_path lv_file_separator &lt;img_descr&gt;-filename INTO image_path.
lo_drawing = lo_excel-&gt;add_new_drawing( ).
lo_drawing-&gt;set_position( ip_from_row = 1
ip_from_col = &apos;B&apos; ).
lv_content = zcl_helper=&gt;load_image( image_path ).
width = lv_height * c_factor.
lo_drawing-&gt;set_media( ip_media = lv_content
ip_media_type = zcl_excel_drawing=&gt;c_media_type_jpg
ip_width = width
ip_height = lv_height ).
lo_worksheet-&gt;add_drawing( lo_drawing ).
ENDIF.
&quot; Add Calendar
* CALL FUNCTION &apos;SLS_MISC_GET_LAST_DAY_OF_MONTH&apos;
* EXPORTING
* day_in = date_from
* IMPORTING
* last_day_of_month = date_to.
date_to = date_from.
date_to+6(2) = &apos;01&apos;. &quot; First of month
add 31 to date_to. &quot; Somewhere in following month
date_to = date_to - date_to+6(2). &quot; Last of month
IF p_portr = abap_true.
zcl_helper=&gt;add_calendar(
EXPORTING
i_date_from = date_from
i_date_to = date_to
i_from_row = lv_from_row
i_from_col = from_col
i_day_style = lv_style_border_guid
i_cw_style = lv_style_center_guid
CHANGING
c_worksheet = lo_worksheet
).
ELSE.
zcl_helper=&gt;add_calendar_landscape(
EXPORTING
i_date_from = date_from
i_date_to = date_to
i_from_row = lv_from_row
i_from_col = from_col
i_day_style = lv_style_border_guid
i_cw_style = lv_style_center_guid
CHANGING
c_worksheet = lo_worksheet
).
ENDIF.
count = count + 1.
date_from = date_to + 1.
ENDWHILE.
lo_excel-&gt;set_active_sheet_index_by_name( &apos;1&apos; ).
*** Create output
lcl_output=&gt;output( lo_excel ).</source>
</PROG>