‎2006 Jun 29 10:43 AM
Hi all,
I want to convert SAP Script output into pdf format to send it thro e-mail.
How to do it?
ravi,
‎2006 Jun 29 10:45 AM
‎2006 Jun 29 10:47 AM
You just need to enter the SPOOL request number from tcode SP01 and execute RSTXPDFT4 program from SE38.
‎2006 Jun 29 10:51 AM
Hi
After calling the fm CLOSE_FORM pick up the OTF data of your sapscript and convert it to pdf:
CALL FUNCTION 'CLOSE_FORM'
TABLES
otfdata = t_otfdata
CALL FUNCTION 'CONVERT_OTF_2_PDF'
IMPORTING
bin_filesize = filesize
TABLES
otf = job_output_info-otfdata
doctab_archive = doctab_archive
lines = t_pdf
EXCEPTIONS
err_conv_not_possible = 1
err_otf_mc_noendmarker = 2
OTHERS = 3.
Here you have your pdf, now you can send it.
You can use SO_NEW_DOCUMENT_ATT_SEND_API1 to send mail by SCOT:
docdata-obj_name = <NAME>.
docdata-obj_descr = 'Test including PDF Attachment'.
Main Text
objtxt = 'Test Document.'.
append objtxt.
objtxt = 'You will find an PDFL attachment in this message.'.
append objtxt.
objtxt = 'Have a nice day.'.
append objtxt.
Write Packing List (Main)
describe table objtxt lines tab_lines.
read table objtxt index tab_lines.
docdata-doc_size = ( tab_lines - 1 ) * 255 + strlen( objtxt ).
clear objpack-transf_bin.
objpack-head_start = 1.
objpack-head_num = 0.
objpack-body_start = 1.
objpack-body_num = tab_lines.
objpack-doc_type = 'RAW'.
append objpack.
Create Message Attachment
Write Packing List (Attachment)
att_type = 'PDF'.
describe table objbin lines tab_lines.
read table objbin index tab_lines.
objpack-doc_size = ( tab_lines - 1 ) * 255 + strlen( objbin ).
objpack-transf_bin = 'X'.
objpack-head_start = 1.
objpack-head_num = 0.
objpack-body_start = 1.
objpack-body_num = tab_lines.
objpack-doc_type = att_type.
objpack-obj_name = 'ATTACHMENT'.
objpack-obj_descr = 'Attached Document'.
append objpack.
Create receiver list
reclist-receiver = <address mail>.
reclist-rec_type = 'U'.
append reclist.
reclist-receiver = sy-uname.
reclist-rec_type = 'B'.
append reclist.
Send Message
call function 'SO_NEW_DOCUMENT_ATT_SEND_API1'
exporting
document_data = docdata
put_in_outbox = 'X'
commit_work = 'X' "used from rel. 6.10
tables
packing_list = objpack
object_header = objhead
contents_bin = t_pdf
contents_txt = objtxt
receivers = reclist
........
Max
‎2006 Jun 29 10:51 AM
Hai Ravi
Go through the following Code
REPORT ZRICH_0003.
DATA: ITCPO LIKE ITCPO,
TAB_LINES LIKE SY-TABIX.
Variables for EMAIL functionality
DATA: MAILDATA LIKE SODOCCHGI1.
DATA: MAILPACK LIKE SOPCKLSTI1 OCCURS 2 WITH HEADER LINE.
DATA: MAILHEAD LIKE SOLISTI1 OCCURS 1 WITH HEADER LINE.
DATA: MAILBIN LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE.
DATA: MAILTXT LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE.
DATA: MAILREC LIKE SOMLREC90 OCCURS 0 WITH HEADER LINE.
DATA: SOLISTI1 LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE.
PERFORM SEND_FORM_VIA_EMAIL.
************************************************************************
FORM SEND_FORM_VIA_EMAIL *
************************************************************************
FORM SEND_FORM_VIA_EMAIL.
CLEAR: MAILDATA, MAILTXT, MAILBIN, MAILPACK, MAILHEAD, MAILREC.
REFRESH: MAILTXT, MAILBIN, MAILPACK, MAILHEAD, MAILREC.
Creation of the document to be sent File Name
MAILDATA-OBJ_NAME = 'TEST'.
Mail Subject
MAILDATA-OBJ_DESCR = 'Subject'.
Mail Contents
MAILTXT-LINE = 'Here is your file'.
APPEND MAILTXT.
Prepare Packing List
PERFORM PREPARE_PACKING_LIST.
Set recipient - email address here!!!
MAILREC-RECEIVER = 'itsme@whatever.com'.
MAILREC-REC_TYPE = 'U'.
APPEND MAILREC.
Sending the document
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
DOCUMENT_DATA = MAILDATA
PUT_IN_OUTBOX = ' '
TABLES
PACKING_LIST = MAILPACK
OBJECT_HEADER = MAILHEAD
CONTENTS_BIN = MAILBIN
CONTENTS_TXT = MAILTXT
RECEIVERS = MAILREC
EXCEPTIONS
TOO_MANY_RECEIVERS = 1
DOCUMENT_NOT_SENT = 2
OPERATION_NO_AUTHORIZATION = 4
OTHERS = 99.
ENDFORM.
************************************************************************
Form PREPARE_PACKING_LIST
************************************************************************
FORM PREPARE_PACKING_LIST.
CLEAR: MAILPACK, MAILBIN, MAILHEAD.
REFRESH: MAILPACK, MAILBIN, MAILHEAD.
DESCRIBE TABLE MAILTXT LINES TAB_LINES.
READ TABLE MAILTXT INDEX TAB_LINES.
MAILDATA-DOC_SIZE = ( TAB_LINES - 1 ) * 255 + STRLEN( MAILTXT ).
Creation of the entry for the compressed document
CLEAR MAILPACK-TRANSF_BIN.
MAILPACK-HEAD_START = 1.
MAILPACK-HEAD_NUM = 0.
MAILPACK-BODY_START = 1.
MAILPACK-BODY_NUM = TAB_LINES.
MAILPACK-DOC_TYPE = 'RAW'.
APPEND MAILPACK.
Creation of the document attachment
This form gets the OTF code from the SAPscript form.
If you already have your OTF code, I believe that you may
be able to skip this form. just do the following code, looping thru
your SOLISTI1 and updating MAILBIN.
PERFORM GET_OTF_CODE.
LOOP AT SOLISTI1.
MOVE-CORRESPONDING SOLISTI1 TO MAILBIN.
APPEND MAILBIN.
ENDLOOP.
DESCRIBE TABLE MAILBIN LINES TAB_LINES.
MAILHEAD = 'TEST.OTF'.
APPEND MAILHEAD.
Creation of the entry for the compressed attachment
MAILPACK-TRANSF_BIN = 'X'.
MAILPACK-HEAD_START = 1.
MAILPACK-HEAD_NUM = 1.
MAILPACK-BODY_START = 1.
MAILPACK-BODY_NUM = TAB_LINES.
MAILPACK-DOC_TYPE = 'OTF'.
MAILPACK-OBJ_NAME = 'TEST'.
MAILPACK-OBJ_DESCR = 'Subject'.
MAILPACK-DOC_SIZE = TAB_LINES * 255.
APPEND MAILPACK.
ENDFORM.
************************************************************************
Form GET_OTF_CODE
************************************************************************
FORM GET_OTF_CODE.
DATA: BEGIN OF OTF OCCURS 0.
INCLUDE STRUCTURE ITCOO .
DATA: END OF OTF.
DATA: ITCPO LIKE ITCPO.
DATA: ITCPP LIKE ITCPP.
CLEAR ITCPO.
ITCPO-TDGETOTF = 'X'.
Start writing OTF code
CALL FUNCTION 'OPEN_FORM'
EXPORTING
FORM = 'ZTEST_FORM'
LANGUAGE = SY-LANGU
OPTIONS = ITCPO
DIALOG = ' '
EXCEPTIONS
OTHERS = 1.
CALL FUNCTION 'START_FORM'
EXCEPTIONS
ERROR_MESSAGE = 01
OTHERS = 02.
CALL FUNCTION 'WRITE_FORM'
EXPORTING
WINDOW = 'MAIN'
EXCEPTIONS
ERROR_MESSAGE = 01
OTHERS = 02.
Close up Form and get OTF code
CALL FUNCTION 'END_FORM'
EXCEPTIONS
ERROR_MESSAGE = 01
OTHERS = 02.
MOVE-CORRESPONDING ITCPO TO ITCPP.
CALL FUNCTION 'CLOSE_FORM'
IMPORTING
RESULT = ITCPP
TABLES
OTFDATA = OTF
EXCEPTIONS
OTHERS = 1.
Move OTF code to structure SOLI form email
CLEAR SOLISTI1. REFRESH SOLISTI1.
LOOP AT OTF.
SOLISTI1-LINE = OTF.
APPEND SOLISTI1.
ENDLOOP.
ENDFORM.
Thanks & regards
Sreenivasulu P
‎2006 Jun 29 10:54 AM
Hi Rave,
i use 2 ways.
when i have an Spool id try this exampe:
REPORT ZGRO_EMAIL_01.
*
************************************************************************
Eingabe festlegen
*
SELECTION-SCREEN: BEGIN OF BLOCK A01 WITH FRAME TITLE T_BLOCK1.
*
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: COMMENT 01(31) T_SPO_ID.
PARAMETERS: P_SPO_ID LIKE TSP01-RQIDENT.
SELECTION-SCREEN: END OF LINE.
*
SELECTION-SCREEN: END OF BLOCK A01.
*
************************************************************************
--- Parameter für SO_NEW_DOCUMENT_ATT_SEND_API1
DATA: OBJ_PACK LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
OBJ_BIN LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
OBJ_TXT LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
REC_LIST LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE,
DOC_DATA LIKE SODOCCHGI1.
Hilfsparameter
DATA: TAB_LINES LIKE SY-TABIX. " Anzahl Tabellenelemente
DATA: REAL_TYPE LIKE SOPCKLSTI1-DOC_TYPE.
*
************************************************************************
*
INITIALIZATION.
*
T_BLOCK1 = 'Datenselektion'.
T_SPO_ID = 'Spoolnummer'.
*
************************************************************************
Programmanfang
************************************************************************
*
START-OF-SELECTION.
*
email füllen
Betreff-Zeile
DOC_DATA-OBJ_NAME = 'ZGRO_EMAIL_01'.
CONCATENATE SY-SYSID '/' SY-MANDT ':'
'Übertragung von Testdaten'
INTO DOC_DATA-OBJ_DESCR SEPARATED BY SPACE.
Empfängerliste
CLEAR REC_LIST.
email-User (U)
CLEAR REC_LIST.
REC_LIST-RECEIVER = 'XXX@XXX.de'.
REC_LIST-REC_TYPE = 'U'.
APPEND REC_LIST.
*
*emailinhalt
OBJ_TXT-LINE = '1. Zeile in der email'.
APPEND OBJ_TXT.
OBJ_TXT-LINE = '2. Zeile in der email mit mehr Zeichen'.
APPEND OBJ_TXT.
*
PACKING_LIST: Eintrag für Inhalt von OBJ_TXT erstellen (email Inhalt)
CLEAR OBJ_PACK.
OBJ_PACK-HEAD_START = 1.
OBJ_PACK-HEAD_NUM = 0.
OBJ_PACK-BODY_START = 1.
OBJ_PACK-DOC_TYPE = 'RAW'.
DESCRIBE TABLE OBJ_TXT LINES TAB_LINES.
OBJ_PACK-BODY_NUM = TAB_LINES.
APPEND OBJ_PACK.
*
Anhang aus SPOOL-Datei, Format wird mit übernommen
CALL FUNCTION 'RSPO_RETURN_SPOOLJOB'
EXPORTING
RQIDENT = P_SPO_ID
IMPORTING
REAL_TYPE = REAL_TYPE
TABLES
BUFFER = OBJ_BIN
EXCEPTIONS
NO_SUCH_JOB = 1
JOB_CONTAINS_NO_DATA = 2
SELECTION_EMPTY = 3
NO_PERMISSION = 4
CAN_NOT_ACCESS = 5
READ_ERROR = 6
TYPE_NO_MATCH = 7
OTHERS = 8.
*
IF SY-SUBRC <> 0.
WRITE: / 'Fehler Lesen Spool. Code:', SY-SUBRC.
EXIT.
ENDIF.
*
PACKING_LIST: Eintrag für Inhalt von OBJ_BIN erstellen (Anhang Inhalt)
CLEAR OBJ_PACK.
OBJ_PACK-TRANSF_BIN = 'X'.
OBJ_PACK-HEAD_START = 1.
OBJ_PACK-HEAD_NUM = 1.
OBJ_PACK-BODY_START = 1.
OBJ_PACK-DOC_TYPE = REAL_TYPE.
OBJ_PACK-OBJ_NAME = 'Anhang'.
OBJ_PACK-OBJ_DESCR = 'Anhangname'.
DESCRIBE TABLE OBJ_BIN LINES TAB_LINES.
OBJ_PACK-BODY_NUM = TAB_LINES.
APPEND OBJ_PACK.
*
--- Versenden des Dokuments
ab 470 ist COMMIT_WORK zu setzen
und SO_DOCUMENT_SEND_API1 lt. 190669
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
DOCUMENT_DATA = DOC_DATA
PUT_IN_OUTBOX = 'X'
COMMIT_WORK = 'X'
TABLES
PACKING_LIST = OBJ_PACK
CONTENTS_TXT = OBJ_TXT
CONTENTS_BIN = OBJ_BIN
RECEIVERS = REC_LIST
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.
*
CASE SY-SUBRC.
WHEN 1.
WRITE: / 'Zu viele Empfänger, fehlende Berechtigung !'.
WHEN 2.
WRITE: / 'Das Dokument wurde nicht versendet !'.
WHEN 3.
WRITE: / 'Dokument- oder ein Anlagentyp existiert nicht !'.
WHEN 4.
WRITE: / 'Keine Berechtigung zum Senden/Anlegen !'.
WHEN 5.
WRITE: / 'Unzulässige Kombination von Parameterwerten !'.
WHEN 6.
WRITE: / 'Interner Fehler oder Datenbank-Inkonsistenz !'.
WHEN 7.
WRITE: / 'Benötigte Sperren konnten nicht gesetzt werden !'.
WHEN 8.
WRITE: / 'Unbekannter Fehler !'.
ENDCASE.
END-OF-SELECTION.
*
************************************************************************
when i create an sapscript in my report
i use this:
REPORT ZGRO_TEST_MAHN.
*
Druckparameter für Briefausgabe
DATA: BEGIN OF DR_PARAM.
INCLUDE STRUCTURE ITCPO.
DATA: END OF DR_PARAM.
*
Tabellenausgabe
DATA: OTFDATA LIKE SOLI OCCURS 0 WITH HEADER LINE.
DATA: PDFDATA LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE.
DATA: PDF_FILESIZE LIKE SOOD-OBJLEN.
*
*
--- Parameter für SO_NEW_DOCUMENT_ATT_SEND_API1
DATA: OBJ_PACK LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
OBJ_HEAD LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
OBJ_BIN LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
OBJ_TXT LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
REC_LIST LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE,
DOC_DATA LIKE SODOCCHGI1.
*
************************************************************************
*
DR_PARAM-TDDEST = 'LOCAL'. "Ausgabegerät
DR_PARAM-TDIMMED = ' '. "Sofort ausgeben
DR_PARAM-TDPREVIEW = 'X'. "Druckvoschau
DR_PARAM-TDGETOTF = 'X'. "Ausgabe in Tabelle
*
CALL FUNCTION 'OPEN_FORM'
EXPORTING
DEVICE = 'PRINTER'
DIALOG = ' '
OPTIONS = DR_PARAM
FORM = 'ZMEDRUCK_MAHN'
LANGUAGE = SY-LANGU
EXCEPTIONS
CANCELED = 01
DEVICE = 02
OTHERS = 03.
*
IF SY-SUBRC <> 0. WRITE: / SY-SUBRC. EXIT. ENDIF.
*
CALL FUNCTION 'WRITE_FORM'
EXPORTING
WINDOW = 'ADDRESS'
EXCEPTIONS
WINDOW = 1.
*
IF SY-SUBRC <> 0. WRITE: / SY-SUBRC. EXIT. ENDIF.
*
CALL FUNCTION 'WRITE_FORM'
EXPORTING
WINDOW = 'MAIN'
ELEMENT = 'ANSCHREIBEN_ANFANG'
EXCEPTIONS
WINDOW = 1.
*
IF SY-SUBRC <> 0. WRITE: / SY-SUBRC. EXIT. ENDIF.
*
CALL FUNCTION 'CLOSE_FORM'
TABLES
OTFDATA = OTFDATA.
*
exit.
*
CALL FUNCTION 'SX_OBJECT_CONVERT_OTF_PDF'
EXPORTING
FORMAT_SRC = 'OTF'
FORMAT_DST = 'PDF'
DEVTYPE = ''
LEN_IN = ''
IMPORTING
LEN_OUT = PDF_FILESIZE
TABLES
CONTENT_IN = OTFDATA
CONTENT_OUT = PDFDATA.
*
CALL FUNCTION 'RFC_MAIL' DESTINATION 'LOCAL_EXEC'
EXPORTING
USER = 'groehn@telerob.de'
TABLES
MAIL = PDFDATA.
exit.
email füllen
Betreff-Zeile
DOC_DATA-OBJ_NAME = 'Report: ZGRO_EMAIL_01'.
CONCATENATE SY-SYSID '/' SY-MANDT ':'
'Übertragung von Testdaten'
INTO DOC_DATA-OBJ_DESCR SEPARATED BY SPACE.
Empfängerliste
email-User (U)
CLEAR REC_LIST.
CLEAR REC_LIST.
REC_LIST-RECEIVER = 'XXX@XXX.de'.
REC_LIST-REC_TYPE = 'U'.
APPEND REC_LIST.
*
PACKING_LIST: 1. Zeile gilt immer für email-Inhalt
CLEAR OBJ_PACK.
OBJ_PACK-TRANSF_BIN = ' '.
OBJ_PACK-BODY_START = 01.
OBJ_PACK-BODY_NUM = 02.
OBJ_PACK-DOC_TYPE = 'RAW'.
APPEND OBJ_PACK.
*
PACKING_LIST: 2. und Folgezeilen gelten immer für Anlagen
Wird OBJ_PACK-TRANSF_BIN Feld gesetzt, wird aus OBJ_BIN genommen,
sonst OBJ_TXT
CLEAR OBJ_PACK.
OBJ_PACK-TRANSF_BIN = 'X'.
OBJ_PACK-BODY_START = 01.
Anzahl der Zeilen dynamisch ermitteln
DESCRIBE TABLE PDFDATA LINES OBJ_PACK-BODY_NUM.
OBJ_PACK-DOC_TYPE = 'PDF'.
Size ist bei PDF mit anzugeben
OBJ_PACK-DOC_SIZE = PDF_FILESIZE.
OBJ_PACK-OBJ_NAME = 'Anhang'. "Gilt nur für Anhänge
OBJ_PACK-OBJ_DESCR = 'Lieferantenmahnung'. "Gilt nur für Anhänge
APPEND OBJ_PACK.
*
*emailinhalt
OBJ_TXT-LINE = '1. Zeile in der email'.
APPEND OBJ_TXT.
OBJ_TXT-LINE = '2. Zeile in der email mit mehr Zeichen'.
APPEND OBJ_TXT.
*Anlageninhalt wird aus convertierte PDF-Datei genommen
LOOP AT PDFDATA.
OBJ_BIN-LINE = PDFDATA-LINE.
APPEND OBJ_BIN.
ENDLOOP.
--- Versenden des Dokuments
*
--- Versenden des Dokuments
ab 470 ist COMMIT_WORK zu setzen
und SO_DOCUMENT_SEND_API1 lt. 190669
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
DOCUMENT_DATA = DOC_DATA
PUT_IN_OUTBOX = 'X'
COMMIT_WORK = 'X'
TABLES
PACKING_LIST = OBJ_PACK
CONTENTS_TXT = OBJ_TXT
CONTENTS_BIN = OBJ_BIN
RECEIVERS = REC_LIST
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.
*
CASE SY-SUBRC.
WHEN 1.
WRITE: / 'Zu viele Empfänger, fehlende Berechtigung !'.
WHEN 2.
WRITE: / 'Das Dokument wurde nicht versendet !'.
WHEN 3.
WRITE: / 'Dokument- oder ein Anlagentyp existiert nicht !'.
WHEN 4.
WRITE: / 'Keine Berechtigung zum Senden/Anlegen !'.
WHEN 5.
WRITE: / 'Unzulässige Kombination von Parameterwerten !'.
WHEN 6.
WRITE: / 'Interner Fehler oder Datenbank-Inkonsistenz !'.
WHEN 7.
WRITE: / 'Benötigte Sperren konnten nicht gesetzt werden !'.
WHEN 8.
WRITE: / 'Unbekannter Fehler !'.
ENDCASE.
************************************************************************
Programmende *
************************************************************************
Regards, Dieter
Message was edited by: Dieter Gröhn