#148 - Changing the demoreports

git-svn-id: https://subversion.assembla.com/svn/abap2xlsx/trunk@274 b7d68dce-7c3c-4a99-8ce0-9ea847f5d049
This commit is contained in:
Stefan Schmöcker 2012-03-23 22:17:00 +00:00
parent 455cb220d3
commit d03563a434

View File

@ -0,0 +1,338 @@
<?xml version="1.0" encoding="iso-8859-2"?>
<PROG NAME="ZDEMO_EXCEL_OUTPUTOPT_INCL" VARCL="X" SUBC="I" CNAM="K2_SCHMOECK" CDAT="20120318" UNAM="K2_SCHMOECK" UDAT="20120323" VERN="000080" RMAND="007" RLOAD="E" SDATE="20120323" STIME="211219" IDATE="20120323" ITIME="211219" UCCHECK="X">
<textPool>
<language SPRAS="E">
<textElement ID="R" ENTRY="Include ZDEMO_EXCEL_OUTPUTOPT_INCL" LENGTH="34 "/>
</language>
</textPool>
<source>*&amp;---------------------------------------------------------------------*
*&amp; Include ZDEMO_EXCEL_OUTPUTOPT_INCL
*&amp;---------------------------------------------------------------------*
CLASS lcl_output DEFINITION CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS: output IMPORTING cl_excel TYPE REF TO zcl_excel,
f4_path RETURNING value(selected_folder) TYPE string,
parametertexts.
PRIVATE SECTION.
METHODS: download_frontend,
download_backend,
display_online,
send_email.
DATA: xdata TYPE xstring, &quot; Will be used for sending as email
t_rawdata TYPE solix_tab, &quot; Will be used for downloading or open directly
bytecount TYPE i. &quot; Will be used for downloading or open directly
ENDCLASS. &quot;lcl_output DEFINITION
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE txt_bl1.
PARAMETERS: rb_down RADIOBUTTON GROUP rb1 DEFAULT &apos;X&apos; USER-COMMAND space.
PARAMETERS: rb_back RADIOBUTTON GROUP rb1.
PARAMETERS: rb_show RADIOBUTTON GROUP rb1.
PARAMETERS: rb_send RADIOBUTTON GROUP rb1.
PARAMETERS: p_path TYPE string LOWER CASE MODIF ID pat.
PARAMETERS: p_email TYPE string LOWER CASE MODIF ID ema.
PARAMETERS: p_backfn TYPE text40 NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK bl1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF rb_down IS INITIAL AND screen-group1 = &apos;PAT&apos;.
screen-input = 0.
screen-invisible = 1.
ENDIF.
IF rb_send IS INITIAL AND screen-group1 = &apos;EMA&apos;.
screen-input = 0.
screen-invisible = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
INITIALIZATION.
cl_gui_frontend_services=&gt;get_sapgui_workdir( CHANGING sapworkdir = p_path ).
cl_gui_cfw=&gt;flush( ).
lcl_output=&gt;parametertexts( ). &quot; If started in language w/o textelements translated set defaults
sy-title = gc_save_file_name.
txt_bl1 = &apos;Output options&apos;(bl1).
p_backfn = gc_save_file_name. &quot; Use as default if nothing else is supplied by submit
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
p_path = lcl_output=&gt;f4_path( ).
*----------------------------------------------------------------------*
* CLASS lcl_output IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_output IMPLEMENTATION.
METHOD output.
DATA: cl_output TYPE REF TO lcl_output,
cl_writer TYPE REF TO zif_excel_writer.
CREATE OBJECT cl_output.
CREATE OBJECT cl_writer TYPE zcl_excel_writer_2007.
cl_output-&gt;xdata = cl_writer-&gt;write_file( cl_excel ).
* After 6.40 via cl_bcs_convert
cl_output-&gt;t_rawdata = cl_bcs_convert=&gt;xstring_to_solix( iv_xstring = cl_output-&gt;xdata ).
cl_output-&gt;bytecount = XSTRLEN( cl_output-&gt;xdata ).
* before 6.40
* CALL FUNCTION &apos;SCMS_XSTRING_TO_BINARY&apos;
* EXPORTING
* buffer = cl_output-&gt;xdata
* IMPORTING
* output_length = cl_output-&gt;bytecount
* TABLES
* binary_tab = cl_output-&gt;t_rawdata.
CASE &apos;X&apos;.
WHEN rb_down.
cl_output-&gt;download_frontend( ).
WHEN rb_back.
cl_output-&gt;download_backend( ).
WHEN rb_show.
cl_output-&gt;display_online( ).
WHEN rb_send.
cl_output-&gt;send_email( ).
ENDCASE.
ENDMETHOD. &quot;output
METHOD f4_path.
DATA: new_path TYPE string,
repid TYPE syrepid,
dynnr TYPE sydynnr.
* Get current value
dynnr = sy-dynnr.
repid = sy-repid.
CALL FUNCTION &apos;GET_DYNP_VALUE&apos;
EXPORTING
i_field = &apos;P_PATH&apos;
i_repid = repid
i_dynnr = dynnr
CHANGING
o_value = new_path.
selected_folder = new_path.
cl_gui_frontend_services=&gt;directory_browse(
EXPORTING
window_title = &apos;Select path to download EXCEL-file&apos;
initial_folder = new_path
CHANGING
selected_folder = new_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4
).
cl_gui_cfw=&gt;flush( ).
CHECK new_path IS NOT INITIAL.
selected_folder = new_path.
ENDMETHOD. &quot;f4_path
METHOD parametertexts.
* If started in language w/o textelements translated set defaults
* Furthermore I don&apos;t have to change the selectiontexts of all demoreports.
DEFINE default_parametertext.
if %_&amp;1_%_app_%-text = &apos;&amp;1&apos; or
%_&amp;1_%_app_%-text is initial.
%_&amp;1_%_app_%-text = &amp;2.
endif.
END-OF-DEFINITION.
default_parametertext: rb_down &apos;Save to frontend&apos;,
rb_back &apos;Save to backend&apos;,
rb_show &apos;Direct display&apos;,
rb_send &apos;Send via email&apos;,
p_path &apos;Frontend-path to download to&apos;,
p_email &apos;Email to send xlsx to&apos;.
ENDMETHOD. &quot;parametertexts
METHOD: download_frontend.
DATA: filename TYPE string.
* I don&apos;t like p_path here - but for this include it&apos;s ok
filename = p_path.
* Add trailing &quot;\&quot; or &quot;/&quot;
IF filename CA &apos;/&apos;.
REPLACE REGEX &apos;([^/])\s*$&apos; IN filename WITH &apos;$1/&apos; .
ELSE.
REPLACE REGEX &apos;([^\\])\s*$&apos; IN filename WITH &apos;$1\\&apos;.
ENDIF.
CONCATENATE filename gc_save_file_name INTO filename.
* Get trailing blank
cl_gui_frontend_services=&gt;gui_download( EXPORTING bin_filesize = bytecount
filename = filename
filetype = &apos;BIN&apos;
CHANGING data_tab = t_rawdata ).
ENDMETHOD. &quot;download_frontend
METHOD download_backend.
DATA: bytes_remain TYPE i.
FIELD-SYMBOLS: &lt;rawdata&gt; LIKE LINE OF t_rawdata.
OPEN DATASET p_backfn FOR OUTPUT IN BINARY MODE.
CHECK sy-subrc = 0.
bytes_remain = bytecount.
LOOP AT t_rawdata ASSIGNING &lt;rawdata&gt;.
AT LAST.
CHECK bytes_remain &gt;= 0.
TRANSFER &lt;rawdata&gt; TO p_backfn LENGTH bytes_remain.
EXIT.
ENDAT.
TRANSFER &lt;rawdata&gt; TO p_backfn.
SUBTRACT 255 FROM bytes_remain. &quot; Solix hat Länge 255
ENDLOOP.
CLOSE DATASET p_backfn.
IF sy-calld = &apos;X&apos;. &quot; no need to display anything if download was selected and report was called for demo purposes
LEAVE PROGRAM.
else.
MESSAGE &apos;Data transferred to default backend directory&apos; TYPE &apos;I&apos;.
ENDIF.
ENDMETHOD. &quot;download_backend
METHOD display_online.
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,&quot;OIContainerCtrl
cl_document TYPE REF TO i_oi_document_proxy. &quot;Office Dokument
c_oi_container_control_creator=&gt;get_container_control( IMPORTING control = cl_control
error = error ).
APPEND error TO t_errors.
cl_control-&gt;init_control( EXPORTING inplace_enabled = &apos;X&apos;
no_flush = &apos;X&apos;
r3_application_name = &apos;Demo Document Container&apos;
parent = cl_gui_container=&gt;screen0
IMPORTING error = error
EXCEPTIONS OTHERS = 2 ).
APPEND error TO t_errors.
cl_control-&gt;get_document_proxy( EXPORTING document_type = &apos;Excel.Sheet&apos; &quot; EXCEL
no_flush = &apos; &apos;
IMPORTING document_proxy = cl_document
error = error ).
APPEND error TO t_errors.
* Errorhandling should be inserted here
cl_document-&gt;open_document_from_table( EXPORTING document_size = bytecount
document_table = t_rawdata
open_inplace = &apos;X&apos; ).
WRITE: &apos;.&apos;. &quot; To create an output. That way screen0 will exist
ENDMETHOD. &quot;display_online
METHOD send_email.
* Needed to send emails
DATA: bcs_exception TYPE REF TO cx_bcs,
errortext TYPE string,
cl_send_request TYPE REF TO cl_bcs,
cl_document TYPE REF TO cl_document_bcs,
cl_recipient TYPE REF TO if_recipient_bcs,
cl_sender TYPE REF TO cl_cam_address_bcs,
t_attachment_header TYPE soli_tab,
wa_attachment_header LIKE LINE OF t_attachment_header,
attachment_subject TYPE sood-objdes,
sood_bytecount TYPE sood-objlen,
mail_title TYPE so_obj_des,
t_mailtext TYPE soli_tab,
wa_mailtext LIKE LINE OF t_mailtext,
send_to TYPE adr6-smtp_addr,
sent TYPE os_boolean.
mail_title = &apos;Mail title&apos;.
wa_mailtext = &apos;Mailtext&apos;.
APPEND wa_mailtext TO t_mailtext.
TRY.
* Create send request
cl_send_request = cl_bcs=&gt;create_persistent( ).
* Create new document with mailtitle and mailtextg
cl_document = cl_document_bcs=&gt;create_document( i_type = &apos;RAW&apos; &quot;#EC NOTEXT
i_text = t_mailtext
i_subject = mail_title ).
* Add attachment to document
* since the new excelfiles have an 4-character extension .xlsx but the attachment-type only holds 3 charactes .xls,
* we have to specify the real filename via attachment header
* Use attachment_type xls to have SAP display attachment with the excel-icon
attachment_subject = gc_save_file_name.
CONCATENATE &apos;&amp;SO_FILENAME=&apos; attachment_subject INTO wa_attachment_header.
APPEND wa_attachment_header TO t_attachment_header.
* Attachment
sood_bytecount = bytecount. &quot; next method expects sood_bytecount instead of any positive integer *sigh*
cl_document-&gt;add_attachment( i_attachment_type = &apos;XLS&apos; &quot;#EC NOTEXT
i_attachment_subject = attachment_subject
i_attachment_size = sood_bytecount
i_att_content_hex = t_rawdata
i_attachment_header = t_attachment_header ).
* add document to send request
cl_send_request-&gt;set_document( cl_document ).
* set sender in case if no own email is availabe
* cl_sender = cl_cam_address_bcs=&gt;create_internet_address( &apos;sender@sender.sender&apos; ).
* cl_send_request-&gt;set_sender( cl_sender ).
* add recipient(s) - here only 1 will be needed
send_to = p_email.
IF send_to IS INITIAL.
send_to = &apos;no_email@no_email.no_email&apos;. &quot; Place into SOST in any case for demonstration purposes
ENDIF.
cl_recipient = cl_cam_address_bcs=&gt;create_internet_address( send_to ).
cl_send_request-&gt;add_recipient( cl_recipient ).
* Und abschicken
sent = cl_send_request-&gt;send( i_with_error_screen = &apos;X&apos; ).
COMMIT WORK.
IF sent IS INITIAL.
MESSAGE i500(sbcoms) WITH p_email.
ELSE.
MESSAGE s022(so).
MESSAGE &apos;Document ready to be sent - Check SOST or SCOT&apos; TYPE &apos;I&apos;.
ENDIF.
CATCH cx_bcs INTO bcs_exception.
errortext = bcs_exception-&gt;if_message~get_text( ).
MESSAGE errortext TYPE &apos;I&apos;.
ENDTRY.
ENDMETHOD. &quot;send_email
ENDCLASS. &quot;lcl_output IMPLEMENTATION</source>
</PROG>