MUNDOSAP

MUNDOSAP (foro/index.php)
-   Trucos, Consejos y Advertencias (foro/forumdisplay.php?f=7)
-   -   Tip de la semana - Como pasar el resultado de un report a pdf en sap (foro/showthread.php?t=548)

Jesus 15/04/08 09:09:36

Hola LAVR:

Entra en la tx. SP02 y ves tus ordenes de Spool. Mira el numero de la que necesitas y ya está.

Carlos J. Ortega González 22/04/08 17:33:43

Aqui mando unas rutinas, esto recupera el número de spool, convierte el spool a PDF, abre el Outlook, y agrega el archivo a un mail.

Lo importante de esta rutina son las funciones utilizadas.


Saludos
CJOG ;)




*&---------------------------------------------------------------------*
*& Form OKCODE_CPDF
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM okcode_cpdf.
REFRESH i_rsporq.
CLEAR vc_user.
CONCATENATE 'ZSDSAPMV7' sy-uname(3) INTO vc_user.
CALL FUNCTION 'RSPO_FIND_SPOOL_REQUESTS'
EXPORTING
allclients = '410'
rq2name = vc_user "'ZSDSAPMV7CIP'
rqowner = sy-uname
TABLES
spoolrequests = i_rsporq.
IF i_rsporq[] IS INITIAL.
MESSAGE i998(sp01r)
WITH 'Es necesario mandar a imprimir previamente'.
ELSE.
IF s_kunnr-high NE space.
MESSAGE i532(ou) WITH text-m01.
sy-lsind = sy-lsind - 1.
IF NOT i_rsporq[] IS INITIAL.
PERFORM borra_spool.
ENDIF.
EXIT.
ENDIF.
LOOP AT i_rsporq.
MOVE i_rsporq-rqcretime(8) TO vd_fecha.
IF vd_fecha LT sy-datum.
DELETE i_rsporq INDEX sy-tabix.
CONTINUE.
ELSE.
MOVE: i_rsporq-rqident TO vi_spool,
i_rsporq-rqident TO st_spool-rqident.
CONCATENATE 'C:\P' i_rsporq-rqident '.PDF'
INTO vc_file.
* SUBMIT rstxpdft4
* WITH spoolno = vi_spool
* WITH download = 'X'
* WITH p_file = vc_file "skip selection-screen
* AND RETURN.
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
src_spoolid = vi_spool
no_dialog = ' '
IMPORTING
pdf_bytecount = v_lines
pdf_spoolid = vc_spool
btc_jobname = vc_jobnm
btc_jobcount = vi_jobcn
TABLES
pdf = i_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.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CALL FUNCTION 'RSPO_IDELETE_SPOOLREQ'
EXPORTING
spoolreq = st_spool.
CONCATENATE 'C:\' i_rsporq-rqident '.PDF'
INTO vc_file.
CONDENSE vc_file.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = v_lines
filename = vc_file
filetype = 'BIN'
TABLES
data_tab = i_pdf.
IF sy-subrc EQ 0.
READ TABLE s_kunnr INDEX 1.
MOVE s_kunnr-low TO vc_kunnr.
CLEAR: kna1, adr6.
SELECT SINGLE adrnr name1 name2
INTO (kna1-adrnr, kna1-name1, kna1-name2)
FROM kna1
WHERE kunnr EQ vc_kunnr.
IF sy-subrc EQ 0.
SELECT SINGLE smtp_addr INTO adr6-smtp_addr
FROM adr6
WHERE addrnumber EQ kna1-adrnr
AND persnumber EQ space
AND date_from GT '00010101'
AND consnumber EQ '001'.
ENDIF.
CLEAR vc_fecha.
CONCATENATE sy-datum+6(2) '/' sy-datum+4(2) '/'
sy-datum(4) INTO vc_fecha.
CONCATENATE 'al' vc_fecha INTO vc_fecha
SEPARATED BY space.
CONCATENATE text-r01 vc_fecha
INTO vc_subject SEPARATED BY space.
CONCATENATE kna1-name1 kna1-name2 ':'
INTO i_body-line SEPARATED BY space.
APPEND i_body.
CLEAR i_body.
APPEND i_body.
MOVE text-r02 TO i_body-line.
APPEND i_body.
CLEAR i_body.
MOVE text-r03 TO i_body-line.
APPEND i_body.
CLEAR i_body.
MOVE text-r04 TO i_body-line.
APPEND i_body.
CLEAR i_body.
MOVE adr6-smtp_addr TO i_address.
APPEND i_address.
CLEAR i_address.
MOVE vc_file TO i_attachs.
APPEND i_attachs.
CLEAR i_attachs.
CALL FUNCTION 'Z_OUTLOOK'
EXPORTING
subject = vc_subject
TABLES
email_body = i_body
email_address = i_address
email_attachments = i_attachs
EXCEPTIONS
invalid_pathname = 1
download_failed = 2
execution_failed = 3
OTHERS = 4.
CLEAR: v_lines, vc_file.
REFRESH: i_pdf, i_body, i_address, i_attachs.
ENDIF.
CLEAR: vd_fecha, v_lines, i_pdf, vc_file.
REFRESH i_pdf.
ENDIF.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
sy-lsind = sy-lsind - 1.
ENDFORM. " OKCODE_CPDF


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

FUNCTION z_outlook.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(SUBJECT) TYPE C OPTIONAL
*" TABLES
*" EMAIL_BODY STRUCTURE SOLI OPTIONAL
*" EMAIL_ADDRESS STRUCTURE SOLI OPTIONAL
*" EMAIL_ATTACHMENTS STRUCTURE SOLI OPTIONAL
*" EXCEPTIONS
*" INVALID_PATHNAME
*" DOWNLOAD_FAILED
*" EXECUTION_FAILED
*"----------------------------------------------------------------------
*- Documentación.-
* Mediante esta función podemos enviar a través del Outlook un mail
* indicando el Asunto, Destinatarios, Cuerpo del mensaje, Archivos adj.
* Tan solo es necesario pasar los parámetros que queramos y automát.
* nos dejará en la pantalla de envio de mensajes de Outlook con todos
* los datos rellenos
CONSTANTS: BEGIN OF con_hex,
tab(1) TYPE x VALUE '09',
END OF con_hex.
DATA: g_file(120),
g_translate(2),
t_vbs LIKE STANDARD TABLE OF soli WITH HEADER LINE,
g_last,
g_vbs_filename LIKE rlgrap-filename,
commandline(1000).
*- Prepara un código para traducir una comilla en hexadecimal
*- para que pueda ser traducido de nuevo en comillas dobles.
CONCATENATE '"' con_hex-tab INTO g_translate.
APPEND: 'Dim myolapp ' TO t_vbs,
'Dim olNamespace ' TO t_vbs,
'Dim myItem ' TO t_vbs,
'Dim myRecipient ' TO t_vbs,
'Dim myAttachments ' TO t_vbs,
' ' TO t_vbs,
'Set myolapp = CreateObject("Outlook.Application") '
TO t_vbs,
'Set olNamespace = myolapp.GetNamespace("MAPI") '
TO t_vbs,
'Set myItem = myolapp.CreateItem(olMailItem) '
TO t_vbs,
' ' TO t_vbs.
*- Destinatarios del mensaje
LOOP AT email_address.
IF email_address = space.
CONTINUE.
ENDIF.
CONCATENATE 'Set myRecipient = myItem.Recipients.Add("'
email_address '")' INTO t_vbs.
APPEND t_vbs.
ENDLOOP.
*- Asunto del mensaje
CONCATENATE 'myItem.Subject = "' subject '"' INTO t_vbs.
APPEND t_vbs.
*- Archivos adjuntos
APPEND 'Set myAttachments = myItem.Attachments' TO t_vbs.
*- Chequeo de existencia de archivos adjuntos
LOOP AT email_attachments.
g_file = email_attachments-line.
CALL FUNCTION 'WS_QUERY'
EXPORTING
filename = g_file
query = 'FE'
EXCEPTIONS
inv_query = 1
no_batch = 2
frontend_error = 3
OTHERS = 4.
IF sy-subrc EQ 0.
CONCATENATE 'myAttachments.Add("' email_attachments
'")' INTO t_vbs.
APPEND t_vbs.
ELSE.
MESSAGE i000(38) WITH 'No se ha podido adjuntar el archivo'
email_attachments.
ENDIF.
ENDLOOP.
*- Cuerpo del email
CLEAR: g_last, t_vbs.
APPEND t_vbs.
LOOP AT email_body.
AT FIRST.
APPEND 'myitem.body = _' TO t_vbs.
ENDAT.
AT LAST.
g_last = 'X'.
ENDAT.
*- Comillas dobles(") causan un error en VBScript
*- Reemplzar con un hexadecimal y luego reemplaza con
*- 2 comillas dobles ("")
TRANSLATE email_body USING g_translate.
WHILE sy-subrc EQ 0.
REPLACE con_hex-tab WITH '""' INTO email_body.
ENDWHILE.
IF g_last = 'X'.
CONCATENATE '"' email_body '" &vbCrLf '
INTO t_vbs.
ELSE.
CONCATENATE '"' email_body '" &vbCrLf &_'
INTO t_vbs.
ENDIF.
APPEND t_vbs.
ENDLOOP.
APPEND 'myItem.Display' TO t_vbs.
* -- Posibilidad de mostrar un MsgBox al abrir el Outlook
* APPEND 'Dim myVar' TO t_vbs.
* DATA: aux(255).
* aux = 'Aquí podemos poner el mensaje que queramos'.
* CONCATENATE 'myVar = MsgBox ("' aux '", 0, "Advertencia")' INTO aux.
* APPEND aux TO t_vbs.

*- Prepara el nombre de archivo vbscript para descargarlo
*- y ejecutarlo, llamando a la variable de entorno de Windows
*- TEMP
CLEAR g_vbs_filename.
CALL FUNCTION 'WS_QUERY'
EXPORTING
environment = 'TEMP'
query = 'EN'
IMPORTING
return = g_vbs_filename
EXCEPTIONS
inv_query = 1
no_batch = 2
frontend_error = 3
OTHERS = 4.
IF sy-subrc GT 0.
RAISE invalid_pathname.
ENDIF.
CONCATENATE g_vbs_filename '\mail.vbs' INTO g_vbs_filename.
commandline = g_vbs_filename.
PERFORM sapgui_progress(rstxldmc) USING 10
'Realizando download de fichero...'.
*- Descarga el archivo vbscript
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = g_vbs_filename
filetype = 'DAT'
mode = 'S'
TABLES
data_tab = t_vbs
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_table_width = 4
invalid_type = 5
no_batch = 6
unknown_error = 7
OTHERS = 8.
IF sy-subrc GT 0.
RAISE download_failed.
ENDIF.
* Abre el Outlook
PERFORM sapgui_progress(rstxldmc) USING 50
'Abriendo Outlook... Espere por favor'.
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
commandline = commandline
program = 'WSCRIPT.EXE'
EXCEPTIONS
frontend_error = 1
no_batch = 2
prog_not_found = 3
illegal_option = 4
OTHERS = 5.
IF sy-subrc GT 0.
RAISE execution_failed.
ENDIF.
MESSAGE s000(38) WITH 'Abriendo Outlook... Espere por favor'.
ENDFUNCTION.

jamostos 03/06/08 16:55:05

Varias Ordenes SPOOL
 
Habeis conseguido alguno generar un PDF que contengan varias ordenes SPOOL???

bisonye 03/06/08 16:58:56

Si por cada orden de spool consigues una tabla interna con los datos lo único que tienes que hacer es copiar todas las tablas con las órdenes en una sola.
Debería funcionar...

jamostos 04/06/08 07:17:07

Pues no ya lo intente pero solo me guarda la ultima orden, vamos que me machaca las anteriores

bisonye 04/06/08 07:23:33

No me has entendido. Lo que tienes que hacer es guardar en diferentes tablas las diferentes órdenes de spool y luego esas tablas las juntas en una sola,

Saludos

jamostos 04/06/08 07:56:45

No no si ya he realizado eso, me he hecho un loop con un append y al final paso la tabla global al la funcion, el tamaño del fichero es el correcto ( la suma de todos) pero solo contiene la ultima orden spool de las anteriores nada de nada. No se si cada fichero contiene un EON y un EOF y al intentar meterlo en uno solo me machaca los anteriores o que....

bisonye 04/06/08 08:01:50

Vaya, el que no te había entendido era yo.
Pues es muy posible que tengas un principio y fin de fichero. El problema va a ser reconocerlo...
¿Con que función descargas el PDF?
Veo que en la GUI download hay un parámetro que es APPEND que por defecto tiene space. Prueba a marcarlo con X y haces tantos downloads como ordenes de spool tengas añadiendo al mismo archivo.
Creo que los datasets tambien tenían algún parámetro que indicaba si el archivo se sobreescribía o se anexaba.

A ver si así funciona.

cramr 19/08/08 10:58:59

Vale, y pongamos que adjunto el archivo correctamente, pero como puede hacer para darle un nombre, en que parametro de que tabla pongo el nombre que aparecerá a posteriori en el email??

Y una duda, en la tabla "object_header" que se le pasa?

muchas gracias

ABPdelCerro 25/08/09 10:02:26

¿Y si lo quiero dejar en el servidor?
 
Hola.
Creo que en este tema siempre se está hablando de dejar el PDF en local. ¿Alguien sabe como se podría dejar en el servidor?

Gracias a todos.


Husos Horarios son GMT. La hora en este momento es 03:45:03.

www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web