Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

While converting spool to PDF, no data is coming in the PDF file.

Former Member
0 Kudos
487

Hi All,

I am submitting a z program ZPR022_INNCOMETAX_REPORT_COPY1 (which has some output display) from Z_ITSLIP_MAIL. I am creating a job, submitting the above program via JOB to SAP-SPOOL.

In program ZPR022_INNCOMETAX_REPORT_COPY1 , I am getting the run time job information and from there I am getting the spool id. Now I am converting the spool id to a PDF. This PDF should contain the output of the program ZPR022_INNCOMETAX_REPORT_COPY1. This output is normal output using Write statement only. But once the program is executed, I could find no data in the PDF file. When I check in SM37 and SP02, both the JOB and the SPOOL are created. What I feel is the program is not picking the spool id at the run time. Could any one help me in this regard how to proceed.

Please find the code below.

Program 1.

LOOP AT pernr.

CLEAR p_job.

p_stim = p_stim + 120.

CONCATENATE'ITSlip' pernr-low p_job sy-datum INTO p_job SEPARATED BY

space.

CALL FUNCTION 'JOB_OPEN'

EXPORTING

jobname = p_job

sdlstrtdt = p_sdat

sdlstrttm = p_stim

IMPORTING

jobcount = l_jobcount.

SUBMIT ZPR022_INNCOMETAX_REPORT_COPY1

WITH pnptimr6 = 'X'

WITH pnpbegda = period-low

WITH pnpendda = period-high

WITH pnppernr-low = pernr-low

WITH pnpabkrs-low = 'IN'

VIA JOB p_job

NUMBER l_jobcount

TO SAP-SPOOL WITHOUT SPOOL DYNPRO

SPOOL PARAMETERS ls_params

WITH immediately = 'X'

  • KEEP IN SPOOL = 'X'

AND RETURN.

CALL FUNCTION 'JOB_CLOSE'

EXPORTING

jobcount = l_jobcount

jobname = p_job

strtimmed = 'X'

  • PRDMINS = 2.

sdlstrtdt = p_sdat

sdlstrttm = p_stim.

ENDLOOP.

Program 2.

IF sy-batch EQ 'X'.

LOOP AT pnppernr.

SELECT SINGLE * FROM pa0105

WHERE pernr EQ pnppernr-low

AND subty EQ '0010'

AND endda EQ '99991231'.

p_email1 = pa0105-usrid_long..

PERFORM get_job_details.

PERFORM obtain_spool_id.

PERFORM convert_spool_to_pdf.

PERFORM process_email.

  • IF sy-sysid = c_dev.

WAIT UP TO 5 SECONDS.

SUBMIT rsconn01 WITH mode = 'INT'

WITH output = 'X'

AND RETURN.

  • ENDIF.

ENDLOOP.

ELSE.

SKIP.

WRITE:/ 'Program must be executed in background in-order for spool'

,

'request to be created.'.

  • EXPORT gd_spool_nr TO MEMORY ID 'SPOOLTOPDF'.

ENDIF.

ENDFORM. " SEND_MAIL

&----


*& Form get_job_details

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM get_job_details .

  • Get current job details

CALL FUNCTION 'GET_JOB_RUNTIME_INFO'

IMPORTING

eventid = gd_eventid

eventparm = gd_eventparm

external_program_active = gd_external_program_active

jobcount = gd_jobcount

jobname = gd_jobname

stepcount = gd_stepcount

EXCEPTIONS

no_runtime_info = 1

OTHERS = 2.

ENDFORM. " get_job_details

&----


*& Form obtain_spool_id

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM obtain_spool_id .

CHECK NOT ( gd_jobname IS INITIAL ).

CHECK NOT ( gd_jobcount IS INITIAL ).

SELECT * FROM tbtcp

INTO TABLE it_tbtcp

WHERE jobname = gd_jobname

AND jobcount = gd_jobcount

AND stepcount = gd_stepcount

AND listident <> '0000000000'

ORDER BY jobname

jobcount

stepcount.

READ TABLE it_tbtcp INTO wa_tbtcp INDEX 1.

IF sy-subrc = 0.

MESSAGE s004(zdd) WITH gd_spool_nr.

gd_spool_nr = wa_tbtcp-listident.

MESSAGE s004(zdd) WITH gd_spool_nr.

ELSE.

MESSAGE s005(zdd).

ENDIF.

ENDFORM. " obtain_spool_id

&----


*& Form convert_spool_to_pdf

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM convert_spool_to_pdf .

CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'

EXPORTING

src_spoolid = gd_spool_nr

no_dialog = c_no

dst_device = c_device

IMPORTING

pdf_bytecount = gd_bytecount

TABLES

pdf = it_pdf_output

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.

CHECK sy-subrc = 0.

  • Transfer the 132-long strings to 255-long strings

LOOP AT it_pdf_output.

TRANSLATE it_pdf_output USING ' ~'.

CONCATENATE gd_buffer it_pdf_output INTO gd_buffer.

ENDLOOP.

TRANSLATE gd_buffer USING '~ '.

DO.

it_mess_att = gd_buffer.

APPEND it_mess_att.

SHIFT gd_buffer LEFT BY 255 PLACES.

IF gd_buffer IS INITIAL.

EXIT.

ENDIF.

ENDDO.

ENDFORM. " convert_spool_to_pdf

&----


*& Form process_email

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM process_email .

DESCRIBE TABLE it_mess_att LINES gd_recsize.

CHECK gd_recsize > 0.

PERFORM send_email USING p_email1.

ENDFORM. "process_email

********************

FORM send_email USING p_email.

CHECK NOT ( p_email IS INITIAL ).

REFRESH it_mess_bod.

  • Default subject matter

gd_subject = 'Subject'.

gd_attachment_desc = 'IT Declaration'.

CONCATENATE 'ITSLIP' ' ' INTO gd_attachment_name.

it_mess_bod = 'IT FORM for this month'.

APPEND it_mess_bod.

it_mess_bod = 'Message Body text, line 2...'.

APPEND it_mess_bod.

  • If no sender specified - default blank

IF p_sender EQ space.

gd_sender_type = space.

ELSE.

gd_sender_type = 'INT'.

ENDIF.

  • Send file by email as .xls speadsheet

PERFORM send_file_as_email_attachment

TABLES it_mess_bod

it_mess_att

USING p_email1

'MindTree Payroll team'

'PDF'

gd_attachment_name

gd_attachment_desc

p_sender

gd_sender_type

CHANGING gd_error

gd_reciever.

ENDFORM. " process_email

&----


*& Form send_file_as_email_attachment

&----


  • text

----


  • -->P_IT_MESS_BOD text

  • -->P_IT_MESS_ATT text

  • -->P_P_EMAIL text

  • -->P_4422 text

  • -->P_4423 text

  • -->P_GD_ATTACHMENT_NAME text

  • -->P_GD_ATTACHMENT_DESC text

  • -->P_P_SENDER text

  • -->P_GD_SENDER_TYPE text

  • <--P_GD_ERROR text

  • <--P_GD_RECIEVER text

----


FORM send_file_as_email_attachment TABLES it_message

it_attach

USING p_email

p_mtitle

p_format

p_filename

p_attdescription

p_sender_address

p_sender_addres_type

CHANGING p_error

p_reciever.

DATA: ld_error TYPE sy-subrc,

ld_reciever TYPE sy-subrc,

ld_mtitle LIKE sodocchgi1-obj_descr,

ld_email LIKE somlreci1-receiver,

ld_format TYPE so_obj_tp ,

ld_attdescription TYPE so_obj_nam ,

ld_attfilename TYPE so_obj_des ,

ld_sender_address LIKE soextreci1-receiver,

ld_sender_address_type LIKE soextreci1-adr_typ,

ld_receiver LIKE sy-subrc.

DATA: t_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,

t_contents LIKE solisti1 OCCURS 0 WITH HEADER LINE,

t_receivers LIKE somlreci1 OCCURS 0 WITH HEADER LINE,

t_attachment LIKE solisti1 OCCURS 0 WITH HEADER LINE,

t_object_header LIKE solisti1 OCCURS 0 WITH HEADER LINE,

w_cnt TYPE i,

w_sent_all(1) TYPE c,

w_doc_data LIKE sodocchgi1.

ld_email = p_email.

ld_mtitle = p_mtitle.

ld_format = p_format.

ld_attdescription = p_attdescription.

ld_attfilename = p_filename.

ld_sender_address = p_sender_address.

ld_sender_address_type = p_sender_addres_type.

  • Fill the document data.

w_doc_data-doc_size = 1.

  • Populate the subject/generic message attributes

w_doc_data-obj_langu = sy-langu.

w_doc_data-obj_name = 'SAPRPT'.

w_doc_data-obj_descr = ld_mtitle .

w_doc_data-sensitivty = 'F'.

  • Fill the document data and get size of attachment

CLEAR w_doc_data.

READ TABLE it_attach INDEX w_cnt.

w_doc_data-doc_size =

( w_cnt - 1 ) * 255 + STRLEN( it_attach ).

w_doc_data-obj_langu = sy-langu.

w_doc_data-obj_name = 'SAPRPT'.

w_doc_data-obj_descr = ld_mtitle.

w_doc_data-sensitivty = 'F'.

CLEAR t_attachment.

REFRESH t_attachment.

t_attachment[] = it_attach[].

  • Describe the body of the message

CLEAR t_packing_list.

REFRESH t_packing_list.

t_packing_list-transf_bin = space.

t_packing_list-head_start = 1.

t_packing_list-head_num = 0.

t_packing_list-body_start = 1.

DESCRIBE TABLE it_message LINES t_packing_list-body_num.

t_packing_list-doc_type = 'RAW'.

APPEND t_packing_list.

  • Create attachment notification

t_packing_list-transf_bin = 'X'.

t_packing_list-head_start = 1.

t_packing_list-head_num = 1.

t_packing_list-body_start = 1.

DESCRIBE TABLE t_attachment LINES t_packing_list-body_num.

t_packing_list-doc_type = ld_format.

t_packing_list-obj_descr = ld_attdescription.

t_packing_list-obj_name = ld_attfilename.

t_packing_list-doc_size = t_packing_list-body_num * 255.

APPEND t_packing_list.

  • Add the recipients email address

CLEAR t_receivers.

REFRESH t_receivers.

t_receivers-receiver = ld_email.

t_receivers-rec_type = 'U'.

t_receivers-com_type = 'INT'.

t_receivers-notif_del = 'X'.

t_receivers-notif_ndel = 'X'.

APPEND t_receivers.

CALL FUNCTION 'SO_DOCUMENT_SEND_API1'

EXPORTING

document_data = w_doc_data

put_in_outbox = 'X'

sender_address = ld_sender_address

sender_address_type = ld_sender_address_type

commit_work = 'X'

IMPORTING

sent_to_all = w_sent_all

TABLES

packing_list = t_packing_list

contents_bin = t_attachment

contents_txt = t_attachment

  • contents_txt = it_message

receivers = t_receivers

EXCEPTIONS

too_many_receivers = 1

document_not_sent = 2

document_type_not_exist = 3

operation_no_authorization = 4

parameter_error = 5

x_error = 6

enqueue_error = 7

OTHERS = 8.

  • Populate zerror return code

ld_error = sy-subrc.

  • Populate zreceiver return code

LOOP AT t_receivers.

ld_receiver = t_receivers-retrn_code.

ENDLOOP.

ENDFORM. "send_file_as_email_attachment

Points will be rewarded.

Regards,

Balaji

9 REPLIES 9

former_member223537
Active Contributor
0 Kudos
324

Hi,

I think you are retrieving the spool before the entire spool is generated.

Put the following logic to retrieve spool iD

  • CHECK WHETHER STATUS OF JOB IS COMPLETED OR CANCELLED

WHILE 1 = 1.

  • GET THE JOB STEPLIST WHICH HAS THE SPOOL NUMBER

CALL FUNCTION 'BP_JOB_READ'

EXPORTING

job_read_jobcount = w_jobcount

job_read_jobname = w_jobname

job_read_opcode = '35'

  • JOB_STEP_NUMBER =

IMPORTING

job_read_jobhead = wa_jobhead

TABLES

job_read_steplist = i_jobsteplist

  • CHANGING

  • RET =

EXCEPTIONS

invalid_opcode = 1

job_doesnt_exist = 2

job_doesnt_have_steps = 3

OTHERS = 4

.

IF sy-subrc <> 0.

  • MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

  • WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

      • BEGIN OF INSERTION U179942 E1BK928781

  • IF STATUS OF JOB IS COMPLETED(F) OR CANCELLED(A)

  • READ THE JOBSTEPLIST & GET THE SPOOL NUMBER

IF wa_jobhead-status = c_a OR wa_jobhead-status = c_f.

READ TABLE i_jobsteplist INTO wa_jobsteplist INDEX 1.

CHECK wa_jobsteplist-listident <> space.

w_spool_number = wa_jobsteplist-listident.

EXIT.

ENDIF.

ENDWHILE.

Best regards,

Prashant

0 Kudos
324

Hi Prasanth,

thanks for your reply. Actually I am taking the spool id from table TBTCP.

but only when the job is completed the spool id is getting into this table until then it is 0 only. I ll try the logic given by you. Shall I copy the code as it is?

Regards,

Balaji

sreeramkumar_madisetty
Active Contributor
0 Kudos
324

Hi

In Close_form use Otf data and convert otf to PDf using

Convert_otf_2_pdf.

this can solve ur problem.

Regards,

Sreeram

former_member223537
Active Contributor
0 Kudos
324

Hi,

Yes please, but you need to change variable & internal table names according to your program.

Best regards,

Prashant

0 Kudos
324

Hi Prashant,

I did the same logic and executed the program. When I see in SM37, the job is still in active status only and not getting completed at all and the spool number got created but with 0 pages. But previously the spool was getting created with the records.

Regards,

Balaji

0 Kudos
324

Hi Prasant,

The Problem is solved. I just put a wait of 200 seconds before selecting the records from TBTCP. By the time the spool id was getting created.

thanks for your help.

0 Kudos
324

Hi all,

The Problem is solved. I just put a wait of 200 seconds before selecting the records from TBTCP. By the time the spool id was getting created.

thanks for your help

0 Kudos
324

Hi balaji,

I got the same problem. I cannot see the contents in pdf file when i run in background. But when I run the pgm in debug mode contents are found in pdf file. I tried ur soln and put the wait stmt before the select stmt of tbtcp but still the problem prevails. Can u help me. thanks.

former_member223537
Active Contributor
0 Kudos
324

Hi Balaji,

Please refer this program. It might help you.

http://www.sapdevelopment.co.uk/reporting/rep_spooltopdf.htm

Best regards,

Prashant