Ver Mensaje Individual
  #32  
Viejo 22/04/08, 18:33:43
Avatar de Carlos J. Ortega González
Carlos J. Ortega González Carlos J. Ortega González is offline
Junior Member
 
Fecha de Ingreso: jun 2006
Mensajes: 28
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.
Responder Con Cita