From 2d5fb26d4ea903ba3f680b65fc9bcc0a76778b1c Mon Sep 17 00:00:00 2001 From: Gregor Wolf Date: Sun, 1 Jul 2012 10:44:33 +0000 Subject: [PATCH] Ready to test #185 git-svn-id: https://subversion.assembla.com/svn/abap2xlsx/trunk@320 b7d68dce-7c3c-4a99-8ce0-9ea847f5d049 --- ZA2X/PROG/ZDEMO_CALENDAR.slnk | 724 +++++++++++++------------- ZA2X/PROG/ZDEMO_CALENDAR_CLASSES.slnk | 706 ++++++++++++------------- 2 files changed, 723 insertions(+), 707 deletions(-) diff --git a/ZA2X/PROG/ZDEMO_CALENDAR.slnk b/ZA2X/PROG/ZDEMO_CALENDAR.slnk index 23f02bc..e8b012e 100644 --- a/ZA2X/PROG/ZDEMO_CALENDAR.slnk +++ b/ZA2X/PROG/ZDEMO_CALENDAR.slnk @@ -1,359 +1,365 @@ - - - - - - - - - - - - - - - - - - *&---------------------------------------------------------------------* -*& Report ZDEMO_CALENDAR -*& abap2xlsx Demo: Create Calendar with Pictures -*&---------------------------------------------------------------------* -*& This report creates a monthly calendar in the specified date range. -*& Each month is put on a seperate worksheet. The pictures for each -*& month can be specified in a tab delimited file called "Calendar.txt" -*& which is saved in the Export Directory. By default this is the SAP -*& Workdir. The file contains 3 fields: -*& -*& Month (with leading 0) -*& Image Filename -*& Image Description -*& -*& The Images should be landscape JPEG's with a 3:2 ratio and min. -*& 450 pixel height. They must also be saved in the Export Directory. -*& In my tests I've discovered a limit of 20 MB in the -*& cl_gui_frontend_services=>gui_download method. So keep your images -*& smaller or chnage to a server export using OPEN DATASET. -*&---------------------------------------------------------------------* - -REPORT zdemo_calendar. - -TYPE-POOLS: abap. -INCLUDE zdemo_calendar_classes. - -DATA: lv_workdir TYPE string. - -PARAMETERS: p_path TYPE zexcel_export_dir. -PARAMETERS: p_from TYPE demo_cr_date_from DEFAULT '20120101', - p_to TYPE demo_cr_date_to DEFAULT '20121231'. - -AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. - lv_workdir = p_path. - cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir - CHANGING selected_folder = lv_workdir ). - p_path = lv_workdir. - -INITIALIZATION. - cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). - cl_gui_cfw=>flush( ). - p_path = lv_workdir. - -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_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. - - 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_col TYPE zexcel_cell_column_alpha, - to_col_int TYPE i. - - DATA: month_names TYPE TABLE OF t247. - FIELD-SYMBOLS: <month_name> LIKE LINE OF month_names. - - TYPES: BEGIN OF tt_datatab, - month_nr TYPE fcmnr, - filename TYPE string, - descr TYPE string, - END OF tt_datatab. - - DATA: image_descriptions TYPE TABLE OF tt_datatab. - FIELD-SYMBOLS: <img_descr> LIKE LINE OF image_descriptions. - - CONSTANTS: lv_default_file_name TYPE string VALUE 'Calendar', "#EC NOTEXT - from_row TYPE zexcel_cell_row VALUE 28, - from_col TYPE zexcel_cell_column_alpha VALUE 'C', - c_height TYPE i VALUE 450, " Image Height - c_factor TYPE f VALUE '1.5'. " Image Ratio, default 3:2 - - IF p_path IS INITIAL. - p_path = lv_workdir. - ENDIF. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). - CONCATENATE p_path lv_file_separator lv_default_file_name '.xlsx' INTO lv_full_path. "#EC NOTEXT - - " Read Image Names for Month and Description - CONCATENATE p_path lv_file_separator lv_default_file_name '.txt' INTO image_descr_path. "#EC NOTEXT - cl_gui_frontend_services=>gui_upload( - EXPORTING - filename = image_descr_path " Name of file - filetype = 'ASC' " File Type (ASCII, Binary) - has_field_separator = 'X' - read_by_line = 'X' " File Written Line-By-Line to the Internal Table - CHANGING - data_tab = image_descriptions " 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 <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - - " Creates active sheet - CREATE OBJECT lo_excel. - - " Create Styles - " Create an underline double style - lo_style_month = lo_excel->add_new_style( ). - " lo_style_month->font->underline = abap_true. - " lo_style_month->font->underline_mode = zcl_excel_style_font=>c_underline_single. - lo_style_month->font->name = zcl_excel_style_font=>c_name_roman. - lo_style_month->font->scheme = zcl_excel_style_font=>c_scheme_none. - lo_style_month->font->family = zcl_excel_style_font=>c_family_roman. - lo_style_month->font->bold = abap_true. - lo_style_month->font->size = 36. - lv_style_month_guid = lo_style_month->get_guid( ). - " Create border object - CREATE OBJECT lo_border_dark. - lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. - lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. - "Create style with border - lo_style_border = lo_excel->add_new_style( ). - lo_style_border->borders->allborders = lo_border_dark. - lo_style_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. - lo_style_border->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. - lv_style_border_guid = lo_style_border->get_guid( ). - "Create style alignment center - lo_style_center = lo_excel->add_new_style( ). - lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. - lo_style_center->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. - lv_style_center_guid = lo_style_center->get_guid( ). - - - " Get Month Names - CALL FUNCTION 'MONTH_NAMES_GET' - TABLES - month_names = month_names. - - zcl_date_calculation=>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 <= month. - IF count = 1. - " Get active sheet - lo_worksheet = lo_excel->get_active_worksheet( ). - ELSE. - lo_worksheet = lo_excel->add_new_worksheet( ). - ENDIF. - - lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. - - title = count. - value = count. - CONDENSE title. - CONDENSE value. - lo_worksheet->set_title( title ). - lo_worksheet->set_print_gridlines( abap_false ). - lo_worksheet->sheet_setup->paper_size = zcl_excel_sheet_setup=>c_papersize_a4. - lo_worksheet->sheet_setup->margin_top = '0.80'. - lo_worksheet->sheet_setup->margin_left = '0.55'. - lo_worksheet->sheet_setup->margin_right = '0.05'. - lo_worksheet->sheet_setup->margin_bottom = '0.30'. - lo_worksheet->get_column_dimension( 'A' )->set_width( '1.0' ). - lo_worksheet->get_column_dimension( 'B' )->set_width( '2.0' ). - lo_worksheet->get_column_dimension( 'K' )->set_width( '3.0' ). - lo_worksheet->sheet_setup->horizontal_centered = abap_true. - - " Add Month Name - month_nr = date_from+4(2). - READ TABLE month_names WITH KEY mnr = month_nr ASSIGNING <month_name>. - CONCATENATE <month_name>-ltx ` ` date_from(4) INTO value. - row = from_row - 2. - lo_worksheet->set_cell( - EXPORTING - ip_column = from_col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = lv_style_month_guid - ). - - to_col_int = zcl_excel_common=>convert_column2int( from_col ). - to_col = zcl_excel_common=>convert_column2alpha( to_col_int + 7 ). - - lo_worksheet->set_merge( - EXPORTING - ip_column_start = from_col " Cell Column Start - ip_column_end = to_col " Cell Column End - ip_row = row " Cell Row - ip_row_to = row " Cell Row - ). - - " Add drawing from a XSTRING read from a file - UNASSIGN <img_descr>. - READ TABLE image_descriptions WITH KEY month_nr = month_nr ASSIGNING <img_descr>. - IF <img_descr> IS ASSIGNED. - value = <img_descr>-descr. - row = from_row - 4. - lo_worksheet->set_cell( - EXPORTING - ip_column = from_col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ). - lo_worksheet->get_row_dimension( row )->set_row_height( '18.0' ). - - CONCATENATE p_path lv_file_separator <img_descr>-filename INTO image_path. - lo_drawing = lo_excel->add_new_drawing( ). - lo_drawing->set_position( ip_from_row = 1 - ip_from_col = 'B' ). - - lv_content = zcl_helper=>load_image( image_path ). - width = c_height * c_factor. - lo_drawing->set_media( ip_media = lv_content - ip_media_type = 'jpg' - ip_width = width - ip_height = c_height ). - lo_worksheet->add_drawing( lo_drawing ). - ENDIF. - - " Add Calendar - CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH' - EXPORTING - day_in = date_from - IMPORTING - last_day_of_month = date_to. - - zcl_helper=>add_calendar( - EXPORTING - i_date_from = date_from - i_date_to = date_to - i_from_row = 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 - ). - - count = count + 1. - date_from = date_to + 1. - ENDWHILE. - - lo_excel->set_active_sheet_index_by_name( '1' ). - - CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. - lv_file = lo_excel_writer->write_file( lo_excel ). - - " Convert to binary - CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' - EXPORTING - buffer = lv_file - IMPORTING - output_length = lv_bytecount - TABLES - binary_tab = lt_file_tab. -* " This method is only available on AS ABAP > 6.40 -* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). -* lv_bytecount = xstrlen( lv_file ). - - " Save the file - cl_gui_frontend_services=>gui_download( - EXPORTING bin_filesize = lv_bytecount - filename = lv_full_path - filetype = 'BIN' - CHANGING data_tab = lt_file_tab - EXCEPTIONS - file_write_error = 1 - no_batch = 2 - gui_refuse_filetransfer = 3 - invalid_type = 4 - no_authority = 5 - unknown_error = 6 - header_not_allowed = 7 - separator_not_allowed = 8 - filesize_not_allowed = 9 - header_too_long = 10 - dp_error_create = 11 - dp_error_send = 12 - dp_error_write = 13 - unknown_dp_error = 14 - access_denied = 15 - dp_out_of_memory = 16 - disk_full = 17 - dp_timeout = 18 - file_not_found = 19 - dataprovider_exception = 20 - control_flush_error = 21 - not_supported_by_gui = 22 - error_no_gui = 23 - OTHERS = 24 -). - IF sy-subrc <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - + + + + + + + + + + + + + + + + + + *&---------------------------------------------------------------------* +*& Report ZDEMO_CALENDAR +*& abap2xlsx Demo: Create Calendar with Pictures +*&---------------------------------------------------------------------* +*& This report creates a monthly calendar in the specified date range. +*& Each month is put on a seperate worksheet. The pictures for each +*& month can be specified in a tab delimited file called "Calendar.txt" +*& which is saved in the Export Directory. By default this is the SAP +*& Workdir. The file contains 3 fields: +*& +*& Month (with leading 0) +*& Image Filename +*& Image Description +*& +*& The Images should be landscape JPEG's with a 3:2 ratio and min. +*& 450 pixel height. They must also be saved in the Export Directory. +*& In my tests I've discovered a limit of 20 MB in the +*& cl_gui_frontend_services=>gui_download method. So keep your images +*& smaller or chnage to a server export using OPEN DATASET. +*&---------------------------------------------------------------------* + +REPORT zdemo_calendar. + +TYPE-POOLS: abap. +INCLUDE zdemo_calendar_classes. + +DATA: lv_workdir TYPE string. + +PARAMETERS: p_path TYPE zexcel_export_dir. +PARAMETERS: p_from TYPE dfrom DEFAULT '20120101', + p_to TYPE dto DEFAULT '20121231'. + +AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path. + lv_workdir = p_path. + cl_gui_frontend_services=>directory_browse( EXPORTING initial_folder = lv_workdir + CHANGING selected_folder = lv_workdir ). + p_path = lv_workdir. + +INITIALIZATION. + cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_workdir ). + cl_gui_cfw=>flush( ). + p_path = lv_workdir. + +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, + 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. + + 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_col TYPE zexcel_cell_column_alpha, + to_col_int TYPE i. + + DATA: month_names TYPE TABLE OF t247. + FIELD-SYMBOLS: <month_name> LIKE LINE OF month_names. + + TYPES: BEGIN OF tt_datatab, + month_nr TYPE fcmnr, + filename TYPE string, + descr TYPE string, + END OF tt_datatab. + + DATA: image_descriptions TYPE TABLE OF tt_datatab. + FIELD-SYMBOLS: <img_descr> LIKE LINE OF image_descriptions. + + CONSTANTS: lv_default_file_name TYPE string VALUE 'Calendar', "#EC NOTEXT + from_row TYPE zexcel_cell_row VALUE 28, + from_col TYPE zexcel_cell_column_alpha VALUE 'C', + c_height TYPE i VALUE 450, " Image Height + c_factor TYPE f VALUE '1.5'. " Image Ratio, default 3:2 + + IF p_path IS INITIAL. + p_path = lv_workdir. + ENDIF. + cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_file_separator ). + CONCATENATE p_path lv_file_separator lv_default_file_name '.xlsx' INTO lv_full_path. "#EC NOTEXT + + " Read Image Names for Month and Description + CONCATENATE p_path lv_file_separator lv_default_file_name '.txt' INTO image_descr_path. "#EC NOTEXT + cl_gui_frontend_services=>gui_upload( + EXPORTING + filename = image_descr_path " Name of file + filetype = 'ASC' " File Type (ASCII, Binary) + has_field_separator = 'X' + read_by_line = 'X' " File Written Line-By-Line to the Internal Table + CHANGING + data_tab = image_descriptions " 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 <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + + " Creates active sheet + CREATE OBJECT lo_excel. + + " Create Styles + " Create an underline double style + lo_style_month = lo_excel->add_new_style( ). + " lo_style_month->font->underline = abap_true. + " lo_style_month->font->underline_mode = zcl_excel_style_font=>c_underline_single. + lo_style_month->font->name = zcl_excel_style_font=>c_name_roman. + lo_style_month->font->scheme = zcl_excel_style_font=>c_scheme_none. + lo_style_month->font->family = zcl_excel_style_font=>c_family_roman. + lo_style_month->font->bold = abap_true. + lo_style_month->font->size = 36. + lv_style_month_guid = lo_style_month->get_guid( ). + " Create border object + CREATE OBJECT lo_border_dark. + lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black. + lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin. + "Create style with border + lo_style_border = lo_excel->add_new_style( ). + lo_style_border->borders->allborders = lo_border_dark. + lo_style_border->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_right. + lo_style_border->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. + lv_style_border_guid = lo_style_border->get_guid( ). + "Create style alignment center + lo_style_center = lo_excel->add_new_style( ). + lo_style_center->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center. + lo_style_center->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top. + lv_style_center_guid = lo_style_center->get_guid( ). + + + " Get Month Names + CALL FUNCTION 'MONTH_NAMES_GET' + TABLES + month_names = month_names. + + zcl_date_calculation=>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 <= month. + IF count = 1. + " Get active sheet + lo_worksheet = lo_excel->get_active_worksheet( ). + ELSE. + lo_worksheet = lo_excel->add_new_worksheet( ). + ENDIF. + + lo_worksheet->zif_excel_sheet_properties~selected = zif_excel_sheet_properties=>c_selected. + + title = count. + value = count. + CONDENSE title. + CONDENSE value. + lo_worksheet->set_title( title ). + lo_worksheet->set_print_gridlines( abap_false ). + lo_worksheet->sheet_setup->paper_size = zcl_excel_sheet_setup=>c_papersize_a4. + lo_worksheet->sheet_setup->margin_top = '0.80'. + lo_worksheet->sheet_setup->margin_left = '0.55'. + lo_worksheet->sheet_setup->margin_right = '0.05'. + lo_worksheet->sheet_setup->margin_bottom = '0.30'. + lo_col_dim = lo_worksheet->get_column_dimension( 'A' ). + lo_col_dim->set_width( '1.0' ). + lo_col_dim = lo_worksheet->get_column_dimension( 'B' ). + lo_col_dim->set_width( '2.0' ). + lo_col_dim = lo_worksheet->get_column_dimension( 'K' ). + lo_col_dim->set_width( '3.0' ). + lo_worksheet->sheet_setup->horizontal_centered = abap_true. + + " Add Month Name + month_nr = date_from+4(2). + READ TABLE month_names WITH KEY mnr = month_nr ASSIGNING <month_name>. + CONCATENATE <month_name>-ltx ` ` date_from(4) INTO value. + row = from_row - 2. + lo_worksheet->set_cell( + EXPORTING + ip_column = from_col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = lv_style_month_guid + ). + + to_col_int = zcl_excel_common=>convert_column2int( from_col ) + 7. + to_col = zcl_excel_common=>convert_column2alpha( to_col_int ). + + lo_worksheet->set_merge( + EXPORTING + ip_column_start = from_col " Cell Column Start + ip_column_end = to_col " Cell Column End + ip_row = row " Cell Row + ip_row_to = row " Cell Row + ). + + " Add drawing from a XSTRING read from a file + UNASSIGN <img_descr>. + READ TABLE image_descriptions WITH KEY month_nr = month_nr ASSIGNING <img_descr>. + IF <img_descr> IS ASSIGNED. + value = <img_descr>-descr. + row = from_row - 3. + lo_worksheet->set_cell( + EXPORTING + ip_column = from_col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ). + lo_row_dim = lo_worksheet->get_row_dimension( row ). + lo_row_dim->set_row_height( '22.0' ). + + CONCATENATE p_path lv_file_separator <img_descr>-filename INTO image_path. + lo_drawing = lo_excel->add_new_drawing( ). + lo_drawing->set_position( ip_from_row = 1 + ip_from_col = 'B' ). + + lv_content = zcl_helper=>load_image( image_path ). + width = c_height * c_factor. + lo_drawing->set_media( ip_media = lv_content + ip_media_type = 'jpg' + ip_width = width + ip_height = c_height ). + lo_worksheet->add_drawing( lo_drawing ). + ENDIF. + + " Add Calendar + CALL FUNCTION 'SLS_MISC_GET_LAST_DAY_OF_MONTH' + EXPORTING + day_in = date_from + IMPORTING + last_day_of_month = date_to. + + zcl_helper=>add_calendar( + EXPORTING + i_date_from = date_from + i_date_to = date_to + i_from_row = 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 + ). + + count = count + 1. + date_from = date_to + 1. + ENDWHILE. + + lo_excel->set_active_sheet_index_by_name( '1' ). + + CREATE OBJECT lo_excel_writer TYPE zcl_excel_writer_2007. + lv_file = lo_excel_writer->write_file( lo_excel ). + + " Convert to binary + CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' + EXPORTING + buffer = lv_file + IMPORTING + output_length = lv_bytecount + TABLES + binary_tab = lt_file_tab. +* " This method is only available on AS ABAP > 6.40 +* lt_file_tab = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_file ). +* lv_bytecount = xstrlen( lv_file ). + + " Save the file + cl_gui_frontend_services=>gui_download( + EXPORTING bin_filesize = lv_bytecount + filename = lv_full_path + filetype = 'BIN' + CHANGING data_tab = lt_file_tab + EXCEPTIONS + file_write_error = 1 + no_batch = 2 + gui_refuse_filetransfer = 3 + invalid_type = 4 + no_authority = 5 + unknown_error = 6 + header_not_allowed = 7 + separator_not_allowed = 8 + filesize_not_allowed = 9 + header_too_long = 10 + dp_error_create = 11 + dp_error_send = 12 + dp_error_write = 13 + unknown_dp_error = 14 + access_denied = 15 + dp_out_of_memory = 16 + disk_full = 17 + dp_timeout = 18 + file_not_found = 19 + dataprovider_exception = 20 + control_flush_error = 21 + not_supported_by_gui = 22 + error_no_gui = 23 + OTHERS = 24 +). + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + diff --git a/ZA2X/PROG/ZDEMO_CALENDAR_CLASSES.slnk b/ZA2X/PROG/ZDEMO_CALENDAR_CLASSES.slnk index 5622f69..ed3ef40 100644 --- a/ZA2X/PROG/ZDEMO_CALENDAR_CLASSES.slnk +++ b/ZA2X/PROG/ZDEMO_CALENDAR_CLASSES.slnk @@ -1,348 +1,358 @@ - - - - - - - - *&---------------------------------------------------------------------* -*& Include ZDEMO_CALENDAR_CLASSES -*&---------------------------------------------------------------------* - -*&---------------------------------------------------------------------* -*& Class ZCL_DATE_CALCULATION -*&---------------------------------------------------------------------* -* Text -*----------------------------------------------------------------------* -CLASS zcl_date_calculation DEFINITION. - PUBLIC SECTION. - CLASS-METHODS: months_between_two_dates - IMPORTING - i_date_from TYPE datum - i_date_to TYPE datum - i_incl_to TYPE flag - EXPORTING - e_month TYPE i. -ENDCLASS. "ZCL_DATE_CALCULATION - - -*----------------------------------------------------------------------* -* CLASS ZCL_DATE_CALCULATION IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_date_calculation IMPLEMENTATION. - METHOD months_between_two_dates. - DATA: date_to TYPE datum. - DATA: BEGIN OF datum_von, - jjjj(4) TYPE n, - mm(2) TYPE n, - tt(2) TYPE n, - END OF datum_von. - - DATA: BEGIN OF datum_bis, - jjjj(4) TYPE n, - mm(2) TYPE n, - tt(2) TYPE n, - END OF datum_bis. - - e_month = 0. - - CHECK NOT ( i_date_from IS INITIAL ) - AND NOT ( i_date_to IS INITIAL ). - - date_to = i_date_to. - IF i_incl_to = abap_true. - date_to = date_to + 1. - ENDIF. - - datum_von = i_date_from. - datum_bis = date_to. - - e_month = ( datum_bis-jjjj - datum_von-jjjj ) * 12 - + ( datum_bis-mm - datum_von-mm ). - ENDMETHOD. "MONTHS_BETWEEN_TWO_DATES -ENDCLASS. "ZCL_DATE_CALCULATION IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS zcl_date_calculation_test DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_date_calculation_test DEFINITION FOR TESTING - RISK LEVEL HARMLESS - DURATION SHORT. - PUBLIC SECTION. - METHODS: - months_between_two_dates FOR TESTING. -ENDCLASS. "zcl_date_calculation_test DEFINITION -*----------------------------------------------------------------------* -* CLASS zcl_date_calculation_test IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_date_calculation_test IMPLEMENTATION. - METHOD months_between_two_dates. - - DATA: date_from TYPE datum VALUE '20120101', - date_to TYPE datum VALUE '20121231'. - DATA: month TYPE i. - - zcl_date_calculation=>months_between_two_dates( - EXPORTING - i_date_from = date_from - i_date_to = date_to - i_incl_to = abap_true - IMPORTING - e_month = month - ). - - cl_aunit_assert=>assert_equals( - exp = 12 " Data Object with Expected Type - act = month " Data Object with Current Value - msg = 'Calculated date is wrong' " Message in Case of Error - ). - - ENDMETHOD. "months_between_two_dates -ENDCLASS. "zcl_date_calculation_test IMPLEMENTATION -*----------------------------------------------------------------------* -* CLASS zcl_helper DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_helper DEFINITION. - PUBLIC SECTION. - CLASS-METHODS: - load_image - IMPORTING - filename TYPE string - RETURNING value(r_image) TYPE xstring, - add_calendar - IMPORTING - i_date_from TYPE datum - i_date_to TYPE datum - i_from_row TYPE zexcel_cell_row - i_from_col TYPE zexcel_cell_column_alpha - i_day_style TYPE zexcel_cell_style - i_cw_style TYPE zexcel_cell_style - CHANGING - c_worksheet TYPE REF TO zcl_excel_worksheet, - add_calender_week - IMPORTING - i_date TYPE datum - i_row TYPE zexcel_cell_row - i_col TYPE zexcel_cell_column_alpha - i_style TYPE zexcel_cell_style - CHANGING - c_worksheet TYPE REF TO zcl_excel_worksheet. -ENDCLASS. "zcl_helper DEFINITION - -*----------------------------------------------------------------------* -* CLASS zcl_helper IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS zcl_helper IMPLEMENTATION. - METHOD load_image. - "Load samle image - DATA: lt_bin TYPE solix_tab, - lv_len TYPE i. - - CALL METHOD cl_gui_frontend_services=>gui_upload - EXPORTING - filename = filename - filetype = 'BIN' - IMPORTING - filelength = lv_len - CHANGING - data_tab = lt_bin - 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 <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - - CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' - EXPORTING - input_length = lv_len - IMPORTING - buffer = r_image - TABLES - binary_tab = lt_bin - EXCEPTIONS - failed = 1 - OTHERS = 2. - IF sy-subrc <> 0. - MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno - WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. - ENDIF. - ENDMETHOD. "load_image - METHOD add_calendar. - DATA: row TYPE zexcel_cell_row, - col_int TYPE zexcel_cell_column, - from_col_int TYPE zexcel_cell_column, - col TYPE zexcel_cell_column_alpha. - DATA: lv_date TYPE datum, - value TYPE string, - weekday TYPE wotnr, - weekrow TYPE wotnr VALUE 1, - day TYPE i, - width TYPE f, - height TYPE f. - DATA: hyperlink TYPE REF TO zcl_excel_hyperlink. - - DATA: day_names TYPE TABLE OF t246. - FIELD-SYMBOLS: <day_name> LIKE LINE OF day_names. - - lv_date = i_date_from. - from_col_int = zcl_excel_common=>convert_column2int( i_from_col ). - " Add description for Calendar Week - c_worksheet->set_cell( - EXPORTING - ip_column = i_from_col " Cell Column - ip_row = i_from_row " Cell Row - ip_value = 'CW'(001) " Cell Value - ip_style = i_cw_style - ). - - " Add Days - CALL FUNCTION 'DAY_NAMES_GET' - TABLES - day_names = day_names. - - LOOP AT day_names ASSIGNING <day_name>. - row = i_from_row. - col_int = from_col_int + <day_name>-wotnr. - col = zcl_excel_common=>convert_column2alpha( col_int ). - value = <day_name>-langt. - c_worksheet->set_cell( - EXPORTING - ip_column = col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = i_cw_style - ). - ENDLOOP. - - WHILE lv_date <= i_date_to. - day = lv_date+6(2). - CALL FUNCTION 'FIMA_X_DAY_IN_MONTH_COMPUTE' - EXPORTING - i_datum = lv_date - IMPORTING - e_wochentag_nr = weekday. - - row = i_from_row + weekrow. - col_int = from_col_int + weekday. - col = zcl_excel_common=>convert_column2alpha( col_int ). - - value = day. - CONDENSE value. - - c_worksheet->set_cell( - EXPORTING - ip_column = col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_style = i_day_style " Single-Character Indicator - ). - - IF weekday = 7. - " Add Calender Week - zcl_helper=>add_calender_week( - EXPORTING - i_date = lv_date - i_row = row - i_col = i_from_col - i_style = i_cw_style - CHANGING - c_worksheet = c_worksheet - ). - weekrow = weekrow + 1. - ENDIF. - lv_date = lv_date + 1. - ENDWHILE. - " Add Calender Week - zcl_helper=>add_calender_week( - EXPORTING - i_date = lv_date - i_row = row - i_col = i_from_col - i_style = i_cw_style - CHANGING - c_worksheet = c_worksheet - ). - " Add Created with abap2xlsx - row = row + 2. - value = 'Created with abap2xlsx. Find more information at http://abap2xlsx.org.'(002). - hyperlink = zcl_excel_hyperlink=>create_external_link( 'http://abap2xlsx.org' ). "#EC NOTEXT - c_worksheet->set_cell( - EXPORTING - ip_column = i_from_col " Cell Column - ip_row = row " Cell Row - ip_value = value " Cell Value - ip_hyperlink = hyperlink - ). - col_int = from_col_int. - WHILE col_int <= from_col_int + 7. - col = zcl_excel_common=>convert_column2alpha( col_int ). - IF sy-index = 1. - width = '5.0'. - ELSE. - width = '11.4'. - ENDIF. - - c_worksheet->get_column_dimension( col )->set_width( width ). - col_int = col_int + 1. - ENDWHILE. - row = i_from_row + 1. - WHILE row <= i_from_row + 6. - height = 50. - c_worksheet->get_row_dimension( row )->set_row_height( height ). - row = row + 1. - ENDWHILE. - ENDMETHOD. "add_calendar - - METHOD add_calender_week. - DATA: week TYPE kweek, - week_int TYPE i, - value TYPE string. - " Add Calender Week - CALL FUNCTION 'DATE_GET_WEEK' - EXPORTING - date = i_date " Date for which the week should be calculated - IMPORTING - week = week. " Week for date (format:YYYYWW) - value = week+4(2). - week_int = value. - value = week_int. - CONDENSE value. - c_worksheet->set_cell( - EXPORTING - ip_column = i_col " Cell Column - ip_row = i_row " Cell Row - ip_value = value " Cell Value - ip_style = i_style - ). - ENDMETHOD. "add_calender_week -ENDCLASS. "zcl_helper IMPLEMENTATION - + + + + + + + + *&---------------------------------------------------------------------* +*& Include ZDEMO_CALENDAR_CLASSES +*&---------------------------------------------------------------------* + +*&---------------------------------------------------------------------* +*& Class ZCL_DATE_CALCULATION +*&---------------------------------------------------------------------* +* Text +*----------------------------------------------------------------------* +CLASS zcl_date_calculation DEFINITION. + PUBLIC SECTION. + CLASS-METHODS: months_between_two_dates + IMPORTING + i_date_from TYPE datum + i_date_to TYPE datum + i_incl_to TYPE flag + EXPORTING + e_month TYPE i. +ENDCLASS. "ZCL_DATE_CALCULATION + + +*----------------------------------------------------------------------* +* CLASS ZCL_DATE_CALCULATION IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_date_calculation IMPLEMENTATION. + METHOD months_between_two_dates. + DATA: date_to TYPE datum. + DATA: BEGIN OF datum_von, + jjjj(4) TYPE n, + mm(2) TYPE n, + tt(2) TYPE n, + END OF datum_von. + + DATA: BEGIN OF datum_bis, + jjjj(4) TYPE n, + mm(2) TYPE n, + tt(2) TYPE n, + END OF datum_bis. + + e_month = 0. + + CHECK NOT ( i_date_from IS INITIAL ) + AND NOT ( i_date_to IS INITIAL ). + + date_to = i_date_to. + IF i_incl_to = abap_true. + date_to = date_to + 1. + ENDIF. + + datum_von = i_date_from. + datum_bis = date_to. + + e_month = ( datum_bis-jjjj - datum_von-jjjj ) * 12 + + ( datum_bis-mm - datum_von-mm ). + ENDMETHOD. "MONTHS_BETWEEN_TWO_DATES +ENDCLASS. "ZCL_DATE_CALCULATION IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS zcl_date_calculation_test DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_date_calculation_test DEFINITION FOR TESTING + " DURATION SHORT + " RISK LEVEL HARMLESS + "#AU Duration Medium + "#AU Risk_Level Harmless + . + PUBLIC SECTION. + METHODS: + months_between_two_dates FOR TESTING. +ENDCLASS. "zcl_date_calculation_test DEFINITION +*----------------------------------------------------------------------* +* CLASS zcl_date_calculation_test IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_date_calculation_test IMPLEMENTATION. + METHOD months_between_two_dates. + + DATA: date_from TYPE datum VALUE '20120101', + date_to TYPE datum VALUE '20121231'. + DATA: month TYPE i. + + zcl_date_calculation=>months_between_two_dates( + EXPORTING + i_date_from = date_from + i_date_to = date_to + i_incl_to = abap_true + IMPORTING + e_month = month + ). + + cl_aunit_assert=>assert_equals( + exp = 12 " Data Object with Expected Type + act = month " Data Object with Current Value + msg = 'Calculated date is wrong' " Message in Case of Error + ). + + ENDMETHOD. "months_between_two_dates +ENDCLASS. "zcl_date_calculation_test IMPLEMENTATION +*----------------------------------------------------------------------* +* CLASS zcl_helper DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_helper DEFINITION. + PUBLIC SECTION. + CLASS-METHODS: + load_image + IMPORTING + filename TYPE string + RETURNING value(r_image) TYPE xstring, + add_calendar + IMPORTING + i_date_from TYPE datum + i_date_to TYPE datum + i_from_row TYPE zexcel_cell_row + i_from_col TYPE zexcel_cell_column_alpha + i_day_style TYPE zexcel_cell_style + i_cw_style TYPE zexcel_cell_style + CHANGING + c_worksheet TYPE REF TO zcl_excel_worksheet, + add_calender_week + IMPORTING + i_date TYPE datum + i_row TYPE zexcel_cell_row + i_col TYPE zexcel_cell_column_alpha + i_style TYPE zexcel_cell_style + CHANGING + c_worksheet TYPE REF TO zcl_excel_worksheet. +ENDCLASS. "zcl_helper DEFINITION + +*----------------------------------------------------------------------* +* CLASS zcl_helper IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS zcl_helper IMPLEMENTATION. + METHOD load_image. + "Load samle image + DATA: lt_bin TYPE solix_tab, + lv_len TYPE i. + + CALL METHOD cl_gui_frontend_services=>gui_upload + EXPORTING + filename = filename + filetype = 'BIN' + IMPORTING + filelength = lv_len + CHANGING + data_tab = lt_bin + 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 <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_len + IMPORTING + buffer = r_image + TABLES + binary_tab = lt_bin + EXCEPTIONS + failed = 1 + OTHERS = 2. + IF sy-subrc <> 0. + MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno + WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. + ENDIF. + ENDMETHOD. "load_image + METHOD add_calendar. + DATA: row TYPE zexcel_cell_row, + row_max TYPE i, + col_int TYPE zexcel_cell_column, + col_max TYPE i, + from_col_int TYPE zexcel_cell_column, + col TYPE zexcel_cell_column_alpha, + lr_col_dim TYPE REF TO zcl_excel_worksheet_columndime, + lr_row_dim TYPE REF TO zcl_excel_worksheet_rowdimensi. + DATA: lv_date TYPE datum, + value TYPE string, + weekday TYPE wotnr, + weekrow TYPE wotnr VALUE 1, + day TYPE i, + width TYPE f, + height TYPE f. + DATA: hyperlink TYPE REF TO zcl_excel_hyperlink. + + DATA: day_names TYPE TABLE OF t246. + FIELD-SYMBOLS: <day_name> LIKE LINE OF day_names. + + lv_date = i_date_from. + from_col_int = zcl_excel_common=>convert_column2int( i_from_col ). + " Add description for Calendar Week + c_worksheet->set_cell( + EXPORTING + ip_column = i_from_col " Cell Column + ip_row = i_from_row " Cell Row + ip_value = 'CW'(001) " Cell Value + ip_style = i_cw_style + ). + + " Add Days + CALL FUNCTION 'DAY_NAMES_GET' + TABLES + day_names = day_names. + + LOOP AT day_names ASSIGNING <day_name>. + row = i_from_row. + col_int = from_col_int + <day_name>-wotnr. + col = zcl_excel_common=>convert_column2alpha( col_int ). + value = <day_name>-langt. + c_worksheet->set_cell( + EXPORTING + ip_column = col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = i_cw_style + ). + ENDLOOP. + + WHILE lv_date <= i_date_to. + day = lv_date+6(2). + CALL FUNCTION 'FIMA_X_DAY_IN_MONTH_COMPUTE' + EXPORTING + i_datum = lv_date + IMPORTING + e_wochentag_nr = weekday. + + row = i_from_row + weekrow. + col_int = from_col_int + weekday. + col = zcl_excel_common=>convert_column2alpha( col_int ). + + value = day. + CONDENSE value. + + c_worksheet->set_cell( + EXPORTING + ip_column = col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_style = i_day_style " Single-Character Indicator + ). + + IF weekday = 7. + " Add Calender Week + zcl_helper=>add_calender_week( + EXPORTING + i_date = lv_date + i_row = row + i_col = i_from_col + i_style = i_cw_style + CHANGING + c_worksheet = c_worksheet + ). + weekrow = weekrow + 1. + ENDIF. + lv_date = lv_date + 1. + ENDWHILE. + " Add Calender Week + zcl_helper=>add_calender_week( + EXPORTING + i_date = lv_date + i_row = row + i_col = i_from_col + i_style = i_cw_style + CHANGING + c_worksheet = c_worksheet + ). + " Add Created with abap2xlsx + row = row + 2. + value = 'Created with abap2xlsx. Find more information at http://abap2xlsx.org.'(002). + hyperlink = zcl_excel_hyperlink=>create_external_link( 'http://abap2xlsx.org' ). "#EC NOTEXT + c_worksheet->set_cell( + EXPORTING + ip_column = i_from_col " Cell Column + ip_row = row " Cell Row + ip_value = value " Cell Value + ip_hyperlink = hyperlink + ). + col_int = from_col_int. + col_max = from_col_int + 7. + WHILE col_int <= col_max. + col = zcl_excel_common=>convert_column2alpha( col_int ). + IF sy-index = 1. + width = '5.0'. + ELSE. + width = '11.4'. + ENDIF. + lr_col_dim = c_worksheet->get_column_dimension( col ). + lr_col_dim->set_width( width ). + col_int = col_int + 1. + ENDWHILE. + row = i_from_row + 1. + row_max = i_from_row + 6. + WHILE row <= row_max. + height = 50. + lr_row_dim = c_worksheet->get_row_dimension( row ). + lr_row_dim->set_row_height( height ). + row = row + 1. + ENDWHILE. + ENDMETHOD. "add_calendar + + METHOD add_calender_week. + DATA: week TYPE kweek, + week_int TYPE i, + value TYPE string. + " Add Calender Week + CALL FUNCTION 'DATE_GET_WEEK' + EXPORTING + date = i_date " Date for which the week should be calculated + IMPORTING + week = week. " Week for date (format:YYYYWW) + value = week+4(2). + week_int = value. + value = week_int. + CONDENSE value. + c_worksheet->set_cell( + EXPORTING + ip_column = i_col " Cell Column + ip_row = i_row " Cell Row + ip_value = value " Cell Value + ip_style = i_style + ). + ENDMETHOD. "add_calender_week +ENDCLASS. "zcl_helper IMPLEMENTATION +