Skip to Content
0
Aug 20, 2015 at 09:39 PM

SAP Workflow - Send mail PDF file corrupted

369 Views

Good Evening,

I have some issues in generating PDF files and sending as an email through Workflow. It's working sometimes and sometime the files seems corrupted. I'm not sure if I need to add anything on my code to avoid this, Again I just wanted to insist, that it's not an permanent issue, it's sporadic.

Can you please point me out, if I have to add anything , here?

Scenaro: Workflow Send Mail step, has an exit which calls the Smartforrms and make as an attachment to the email.

Workflow Exit Code:

method IF_SWF_IFS_WORKITEM_EXIT~EVENT_RAISED.

* data type decleration for task element

data:

lv_task_id type sww_wiid, " task id number

lv_taskhdr_id type swr_wihdr,

lv_task_container type ref to if_swf_ifs_parameter_container. " container

* data type for document attachment

data: lv_doc_info type sofolenti1,

lv_object_header type standard table of solisti1,

lv_soxobjcont type soxobj,

lv_exception type ref to cx_swf_cnt_container,

lv_document_data type sodocchgi1,

lv_folder_id_1 type soodk,

lv_folder_id_2 type soobjinfi1-object_id,

lv_objtype type swo_objtyp ,

lv_objkey type swo_typeid,

lv_sofm type swo_objhnd,

lv_obj_record type obj_record,

lv_swotreturn type swotreturn,

it_solix_tab type solix_tab,

lv_qmnum type qmnum,

lt_simple type table of swr_cont,

lt_all_objects type table of swr_cont,

lv_container_line type swr_cont,

lv_return_code type syst-subrc,

lv_extn(5) type c.

* read task id

call method im_workitem_context->get_header

receiving

re_workitem_header = lv_taskhdr_id " structure for transferring work item to wlc

.

call method im_workitem_context->get_workitem_id

receiving

re_workitem = lv_task_id.

* read container

call method im_workitem_context->get_wi_container

receiving

re_container = lv_task_container.

call function 'sap_wapi_read_container'

exporting

workitem_id = lv_task_id

* language = sy-langu

* user = sy-uname

* buffered_access = 'x'

importing

return_code = lv_return_code

* ifs_xml_container =

* ifs_xml_container_schema =

tables

simple_container = lt_simple

* message_lines =

* message_struct =

* subcontainer_bor_objects =

subcontainer_all_objects = lt_all_objects.

.

* if lv_return_code ne 0.

* raise not_found.

* endif.

loop at lt_simple into lv_container_line

where element = 'NOTIF_NUM'.

endloop.

if sy-subrc = 0.

write lv_container_line-value to lv_qmnum.

endif. " sy-subrc = 0.

if lv_qmnum is not initial.

"get adobe form

me->get_pdf_xstring(

exporting

iv_event = im_event_name " field length 18

iv_qmnum = lv_qmnum " notification no

importing

ev_pdf_solix = it_solix_tab " gbt: solix as table type

).

* identify the folder id

call function 'so_folder_root_id_get'

exporting

owner = sy-uname

region = 'B'

importing

folder_id = lv_folder_id_1.

* convert the field format acceptable by function module so_document_insert_api1

lv_folder_id_2 = lv_folder_id_1.

* prepare object header

lv_soxobjcont-objkey = lv_qmnum.

append lv_soxobjcont to lv_object_header.

*prepare document data- contain description and sensitivity

lv_document_data-obj_name = 'INITIAL'.

lv_document_data-sensitivty = 'O'.

lv_extn = '.PDF'.

concatenate lv_qmnum lv_extn into lv_document_data-obj_descr.

" lv_document_data-obj_descr = lv_qmnum.

call function 'so_document_insert_api1'

exporting

folder_id = lv_folder_id_2

document_data = lv_document_data

document_type = 'EXT'

importing

document_info = lv_doc_info

tables

object_header = lv_object_header

contents_hex = it_solix_tab

exceptions

folder_not_exist = 1

document_type_not_exist = 2

operation_no_authorization = 3

parameter_error = 4

x_error = 5

enqueue_error = 6

others = 7.

if sy-subrc <> 0.

message id sy-msgid type sy-msgty number sy-msgno

with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

endif.

* populate object type and object key for create an instance

lv_objtype = 'SOFM'.

lv_objkey = lv_doc_info-doc_id.

* create an instance

call function 'swo_create'

exporting

objtype = lv_objtype

objkey = lv_objkey

importing

object = lv_sofm

return = lv_swotreturn

exceptions

no_remote_objects = 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.

* prepare for attaching the object to container

lv_obj_record-header = 'OBJH'.

lv_obj_record-type = 'SWO'.

lv_obj_record-handle = lv_sofm.

call method lv_task_container->set

exporting

name = '_ATTACH_OBJECTS'

value = lv_obj_record.

call method lv_task_container->set

exporting

name = 'ATTACHMENTS'

value = lv_obj_record.

*commit the changes

call method im_workitem_context->do_commit_work.

endif.

endmethod.

Code to call the Smart forms and convert to SOLIX_TAB:

method GET_PDF_XSTRING.

data:

l_fm_name TYPE rs38l_fnam,

l_formname TYPE fpname ,

fp_docparams TYPE sfpdocparams,

fp_formoutput TYPE fpformoutput,

fp_outputparams TYPE sfpoutputparams.

data:

im_notif_long_txt type zpm_notif_longtext_tt,

im_notif_hdr type bapi2080_nothdre,

im_notif_hdr_txt type bapi2080_nothdtxte,

im_notif_item type zpm_notif_item_tt.

data:

lv_event(18) type c.

"Get the notification details.

call method zcl_pm_notification=>get_notification_detail

exporting

i_qmnum = iv_qmnum

importing

e_notification_long_txt = im_notif_long_txt

e_notification_hdr = im_notif_hdr

e_notification_hdr_txt = im_notif_hdr_txt

e_notification_item = im_notif_item.

"Send the notification event to FORM

if iv_event cs 'NOTIFCREATE'.

lv_event = 'NEW'.

elseif iv_event cs 'CLOSED'.

lv_event = 'FINAL'.

else.

lv_event = 'DELAYED'.

endif.

l_formname = c_form_name.

*&---------------------------------------------------------------------*

*& Get Function Module Name

*&---------------------------------------------------------------------*

CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'

EXPORTING

i_name = l_formname

IMPORTING

e_funcname = l_fm_name.

fp_outputparams-nodialog = 'X'.

fp_outputparams-getpdf = 'X'.

*&---------------------------------------------------------------------*

*& Open Job

*&---------------------------------------------------------------------*

CALL FUNCTION 'FP_JOB_OPEN'

CHANGING

ie_outputparams = fp_outputparams

EXCEPTIONS

cancel = 1

usage_error = 2

system_error = 3

internal_error = 4

OTHERS = 5.

IF sy-subrc <> 0.

CASE sy-subrc.

WHEN OTHERS.

ENDCASE. " CASE sy-subrc

ENDIF.

fp_docparams-langu = 'X'.

fp_docparams-country = 'US'.

fp_docparams-fillable = 'X'.

*&---------------------------------------------------------------------*

*& Get the PDF

*&---------------------------------------------------------------------*

CALL FUNCTION l_fm_name

EXPORTING

/1BCDWB/DOCPARAMS = fp_docparams

NOTIFICATION_HEADERTXT = im_notif_hdr_txt

NOTIFICATION_TEXT = im_notif_long_txt

NOTIFICATION_HEADER = im_notif_hdr

NOTIFICATION_ITEM = im_notif_item

NOTIF_EVENT = lv_event

IMPORTING

/1BCDWB/FORMOUTPUT = FP_FORMOUTPUT

EXCEPTIONS

USAGE_ERROR = 1

SYSTEM_ERROR = 2

INTERNAL_ERROR = 3

OTHERS = 4

.

IF SY-SUBRC <> 0.

* Implement suitable error handling here

ENDIF.

*&---------------------------------------------------------------------*

*& Close Job

*&---------------------------------------------------------------------*

CALL FUNCTION 'FP_JOB_CLOSE'

* IMPORTING

* E_RESULT = result

EXCEPTIONS

usage_error = 1

system_error = 2

internal_error = 3

OTHERS = 4

.

IF sy-subrc <> 0.

CASE sy-subrc.

WHEN OTHERS.

ENDCASE. " CASE sy-subrc

ENDIF. " IF sy-subrc <> 0.

*&---------------------------------------------------------------------*

*& Convert Xstring to SOLIX Tab

*&---------------------------------------------------------------------*

call method cl_document_bcs=>xstring_to_solix

exporting

ip_xstring = fp_formoutput-pdf " XSTRING

receiving

rt_solix = ev_pdf_solix " SOLIX Table

.

endmethod.

Thanks for your help!

-Justin