Monday, June 15, 2015

Save Report Output to a PDF File

Save Report Output to a PDF File

This report takes another report as input, and captures the output of that report. The output is then converted to PDF and saved to a local file. This shows how to use some of the PDF function modules, as well as an easy way to create PDF files.

One thing I am not thrilled about is how the spool number is retrieved. If anyone has any better method, please let me know! Until I actually have a production use for a program like this, I will not try to find a better way.

Source Code Listing

report zabap_2_pdf.
*-- Enhancements: only allow to be run with variant.  Then called
*-- program will be transparent to users
*-- TABLES
tables:
tsp01.
*-- STRUCTURES
data:
mstr_print_parms like pri_params,
mc_valid(1)      type c,
mi_bytecount     type i,
mi_length        type i,
mi_rqident       like tsp01-rqident.
*-- INTERNAL TABLES
data:
mtab_pdf    like tline occurs 0 with header line,
mc_filename like rlgrap-filename.
*-- SELECTION SCREEN
parameters:
p_repid like sy-repid, " Report to execute
p_linsz like sy-linsz default 132, " Line size
p_paart like sy-paart default 'X_65_132'.  " Paper Format
start-of-selection.
concatenate 'c:\'
p_repid
'.pdf'
into mc_filename.
*-- Setup the Print Parmaters
call function 'GET_PRINT_PARAMETERS'
exporting
authority= space
copies   = '1'
cover_page                   = space
data_set = space
department                   = space
destination                  = space
expiration                   = '1'
immediately                  = space
in_archive_parameters        = space
in_parameters                = space
layout   = space
mode     = space
new_list_id                  = 'X'
no_dialog= 'X'
user     = sy-uname
importing
out_parameters               = mstr_print_parms
valid    = mc_valid
exceptions
archive_info_not_found       = 1
invalid_print_params         = 2
invalid_archive_params       = 3
others   = 4.
*-- Make sure that a printer destination has been set up
*-- If this is not done the PDF function module ABENDS
if mstr_print_parms-pdest = space.
mstr_print_parms-pdest = 'LOCL'.
endif.
*-- Explicitly set line width, and output format so that
*-- the PDF conversion comes out OK
mstr_print_parms-linsz = p_linsz.
mstr_print_parms-paart = p_paart.
submit (p_repid) to sap-spool without spool dynpro
spool parameters mstr_print_parms
via selection-screen
and return.
*-- Find out what the spool number is that was just created
perform get_spool_number using sy-repid
sy-uname
changing mi_rqident.
*-- Convert Spool to PDF
call function 'CONVERT_ABAPSPOOLJOB_2_PDF'
exporting
src_spoolid= mi_rqident
no_dialog  = space
dst_device = mstr_print_parms-pdest
importing
pdf_bytecount                  = mi_bytecount
tables
pdf        = mtab_pdf
exceptions
err_no_abap_spooljob           = 1
err_no_spooljob                = 2
err_no_permission              = 3
err_conv_not_possible          = 4
err_bad_destdevice             = 5
user_cancelled                 = 6
err_spoolerror                 = 7
err_temseerror                 = 8
err_btcjob_open_failed         = 9
err_btcjob_submit_failed       = 10
err_btcjob_close_failed        = 11
others     = 12.
call function 'DOWNLOAD'
exporting
bin_filesize            = mi_bytecount
filename                = mc_filename
filetype                = 'BIN'
importing
act_filename            = mc_filename
tables
data_tab                = mtab_pdf.
*---------------------------------------------------------------------*
*       FORM get_spool_number *
*---------------------------------------------------------------------*
*       Get the most recent spool created by user/report              *
*---------------------------------------------------------------------*
*  -->  F_REPID               *
*  -->  F_UNAME               *
*  -->  F_RQIDENT             *
*---------------------------------------------------------------------*
form get_spool_number using f_repid
f_uname
changing f_rqident.
data:
lc_rq2name like tsp01-rq2name.
concatenate f_repid+0(8)
f_uname+0(3)
into lc_rq2name separated by '_'.
select * from tsp01 where  rq2name = lc_rq2name
order by rqcretime descending.
f_rqident = tsp01-rqident.
exit.
endselect.
if sy-subrc ne 0.
clear f_rqident.
endif.
endform." get_spool_number

No comments:

Post a Comment