Automatización de respuesta mediante un correo, adjuntar informe en pdf y adicionar gráficos en el informe cada 8 horas

346 views
Skip to first unread message

Rafael Carballo

unread,
Mar 20, 2015, 12:08:07 PM3/20/15
to publice...@googlegroups.com
Hola a todos.
Me han puesto un reto un cliente y tal vez me pueden ayudar.

1. Estoy desarrollando una aplicación de recurso humanos conectados a lector de huella digital.
    a) Cada 10 minutos estoy conectándome automáticamente a los lectores para bajar las marcas y luego las preparo con los turnos de entrada y salidas del personal es una fabrica
    b) Al validarlas obtengo quienes marcaron y quienes no, quienes se pasaron del tiempo de entrada o salida o se fueron antes o no marcaron
    c) Prepara los informes de inconsistencias para enviarlos a los correos de jefes de áreas, gerencia y recursos humanos para conocer en tiempo preciso si alguien no vino a trabajar o          se halla quedado en la fabrica, todo eso ya esta controlado
2. Paso para envió automático es el que he tenido problema
    a) Generar los reportes en pdf automáticamente e ir uniendo un pdf a otro pdf ( Según en una información que encontré una vez se puede unir reportes para formar uno solo pero no tengo esa información hoy que la necesito)
    b) Las inconsistencias las quiere también en gráfico básico de barras 
    c) Luego que las envié a cada correo asignado o autorizado para que le este llegando la información sin necesidad de pedirla a un usuario que lo este imprimiendo y enviando.

Espero de sus comentarios que siempre han sido de gran ayuda o el código de algunas funciones si alguien ya lo ha hecho, las ejecuciones las trabajo con tareas de trabajo automáticas en el servidor algunas y otras tengo un timer en un formulario abierto que esta ejecutando cada tiempo cierta tarea según la programación que se tenga de tareas,

Rafael Carballo
El Salvador, C.A.



Jorge Kiernan

unread,
Mar 21, 2015, 12:32:26 PM3/21/15
to publicesvfoxpro
Para gráficos, con FOXcharts (publicado en este foro, excelente) te permite generar graficos de lo que se te ocurra y guardarlo como jpg, ya sea para mandarlo directamente o incluirlo en otro documento, como puede ser una salida de un reporte con los datos, y el gráfico en una banda de cierre del informe.
Mandar correos, vas a ver numerosas opciones, yo uso la automatización del MsOutlook, te pongo un ejemplo tomado de la emision de pagos.
IF VARTYPE(thisform.outlook) = 'L'     && esto es para crear el objeto una sola vez
TRY 
thisform.outlook= GETOBJECT( ,"Outlook.Application") 
CATCH TO loerror 
TRY 
thisform.outlook= Createobject("Outlook.Application") 
CATCH TO loerror
ENDTRY 
ENDTRY 
IF VARTYPE(thisform.outlook) <> 'O'
MESSAGEBOX('No pudo abrir el outlook para mandar el mail',16,'')
RETURN
ENDIF
ENDIF
TRY 
lcdireccion = ''
FOR lni = 1 TO 3   && esto lo deberias variar para tomar la lista completa de tus direcciones
IF !EMPTY(lacuenta[lni])
lcdireccion = lcdireccion + IIF(!EMPTY(lcdireccion),';','') + lacuenta[lni]
ENDIF 
ENDFOR 

*envia el mail que armo
oEmail = thisform.outlook.CreateItem(0) 
With oEmail 
.Subject = "Tiene disponible el pago "+ curopcab.optipo+" "+trans(curopcab.opce,'@L 9999')+trans(curopcab.opnro,'@L -99999999')+' ' + gcNomemp
.Importance = 1 
.Body = lccuerpo  &&es un texto armado previamente
.to =  lcdireccion 
FOR lni = 1 TO 5    &&en tu caso, serian los pdf y jpg que quieras incluir
IF !EMPTY(laadjuntos[lni])
.attachments.add(laadjuntos[lni])
ENDIF 
ENDFOR 
.Send 
EndWith 
Release oEmail 
oMAPI = thisform.outlook.GetNameSpace("MAPI") 
oCarpeta = oMAPI.GetDefaultFolder(4) 
oCarpeta.display
CATCH TO loerror
=MESSAGEBOX('No puede completar el envio del Correo '+CHR(13)+loerror.message,64,'PROBLEMAS CON EL OUTLOOK')
ENDTRY 

Miguel A.

unread,
Mar 21, 2015, 1:25:03 PM3/21/15
to publice...@googlegroups.com
Hola,
Vayamos por partes, como decía Jack...
Generar reportes en pdf, puedes hacerlo con foxyPreviewer, con xfrx u otras aplicaciones que circulan por ahí, no es difícil, cuando te decidas por qué usar en este propio foro puedes encontrar mucha información.
Generar los gráficos de barras ya te han contestado. 
Y enviar el email, tendrás que decidir también si lo quieres enviar con CDO, o si tienes Outlook instalado también lo puedes enviar automáticamente y quedarte con copia en los elementos enviados. También en este foro puedes encontrar multitud de respuestas sobre estos y otros supuestos.

Siempre puedes pedir ayuda en este foro, pero  te recomiendo que hagas preguntas de temas más concretos y no plantees el asunto tan general, máxime cuando el algoritmo de tu problema ya lo tienes resuelto.

Saludos,
Miguel A.

Luis la Romana

unread,
Mar 21, 2015, 2:20:39 PM3/21/15
to publice...@googlegroups.com
Los de ITR El Salvador trabajan mucho con aplicaciones de relojes marcadores, ellos basicamente trabajan con SQL como db y desarrollan creo en VisualBasic una versión viejita, pero lo bueno es el enfoque que tienen del tema, en armar horarios y organizar el sistema para tener una visión general muy bien pensada, sería bueno que los contactaras a ver qué tienen ya hecho en lo que te interesa.
Message has been deleted

Rafael Carballo

unread,
Mar 22, 2015, 7:04:41 PM3/22/15
to publice...@googlegroups.com
He logrado hacer la función de envió por correo automático el archivo pdf, espero esta función les pueda ayudar a otros que lo necesiten
la parte que me falta es generar el gráfico, ademas de adicionar captura de foto de la web cam y escaneo desde visual foxpro
Otra cosa que siempre he luchado para poder hacer en visual foxpro es que capture la voz para hacer interactivo los sistemas con comandos de voz así como el siri de iphone

Si lo logramos todos asi demostramos que visual foxpro no es una herramienta obsoleta como algunos opinan ahí.

****************************************************
FUNCTION _Enviar_pdfXCorreo

PARAMETERS cursor_tabla,_reporte,_archivo,_destino,_Asunto,_Contenido
** Cursor o Tabla : Resultado de envio a reportar
** _reporte       : Nombre del reporte a utilizar ejemplo : informes\reporte.frx
** _archivo       : Nombre que se le asignara al archivo pdf a generar Ejemplo : archivo.pdf
** _destino       : Destino será 1=Normal, 2= Solo PDF , 3=Enviar automaticamente el PDF

SELECT (cursor_tabla) 

IF EMPTY(_destino)
_destino=1
ENDIF
DO CASE 
CASE _destino=1  && reporte normal
REPORT FORM (_reporte) TO PRINTER PROMPT NOCONSOLE PREVIEW 
CASE _destino=2  && archivo pdf generado
** Crear directorio si no existe y borrar asi existe ya el archivo
ldirectorio=SYS(5)+SYS(2003)+'\pdf\'  && verifico directorio
IF !DIRECTORY(ldirectorio)
MKDIR &ldirectorio
ENDIF
** asignar nombre y ubicacion del archivo a generar pdf
xpdf=ldirectorio+'\'+_archivo+'.pdf' && le asigno un nombre
** si ya existe lo borrar del directorio
IF FILE(xpdf)
ERASE &xpdf
ENDIF
REPORT FORM (_reporte) OBJECT TYPE 10 TO FILE &xpdf
CASE _destino=3 && enviar archivo pdf por correo automaticamente
** Crear directorio si no existe y borrar asi existe ya el archivo
ldirectorio=SYS(5)+SYS(2003)+'\pdf\'  && verifico directorio
IF !DIRECTORY(ldirectorio)
MKDIR &ldirectorio
ENDIF
** asignar nombre y ubicacion del archivo a generar pdf
xpdf=ldirectorio+'\'+_archivo+'.pdf' && le asigno un nombre
** si ya existe lo borrar del directorio
IF FILE(xpdf)
ERASE &xpdf
ENDIF
REPORT FORM (_reporte) OBJECT TYPE 10 TO FILE &xpdf
IF !EMPTY(_Asunto)
_Asunto="Envio automatico del archivo adjunto "+_archivo
ENDIF
IF !EMPTY(_Contenido)
_Contenido="Adjunto encontrara la informacion solicitada " 
ENDIF
DO LOCFILE("FoxyPreviewer.App")

WITH _Screen.oFoxyPreviewer
.lEmailAuto     = .T.   && Automatically generates the report output file
.cEmailType     = "PDF" && The file type to be used in Emails (PDF, RTF, HTML or XLS)
.nEmailMode     = 2     && 1 = MAPI, 2 = CDOSYS HTML, 3 = CDOSYS TEXT, 4 = Custom procedure

.cEmailTo= 'correo@hotmail.com'
.cSMTPServer = "smtp.gmail.com"
.cEmailFrom= correo@gmail.com'
.cEmailSubject =_Asunto && Aqui va el Asunto del correo
.cEmailBody= _Contenido && Aqui va el cuerpo del correo
.nSMTPPort      = 465
.lSMTPUseSSL    = .t.
.cSMTPUserName  = 'correo@gmail.com'
.cSMTPPassword  = 'passowrd'

.lReadReceipt   = .T.
.lPriority      = .T.

lcDefaultPath = Sys(5)+Sys(2003)
.SendEmailUsingCDO(xpdf)  && aqui pongo el archivo adjunto del reporte generado

ENDWITH
endcase

Saludos a todos

Rafael Carballo
El Salvador

Hitiel Hernández

unread,
Mar 23, 2015, 9:46:24 AM3/23/15
to publice...@googlegroups.com
Buen día a todos, yo tengo muchas dudas en esto, la verdad nunca he logrado hacer nada de lo que nuestro amigo Rafael nos plantea, pero aprovechando el hilo me gustaría saber si alguien me puede explicar cómo hago para enviar correos desde mi aplicación, resulta que tengo archivos en ZIP que genera mi aplicación pero no se cómo enviarla, hasta el momento los usuarios lo hacen desde afuera y si me gustaría que todo se hiciera automotizado.
Estaré muy agradecido por su ayuda.
--
Sabiduría ante todo; adquiere sabiduría

Jorge Kiernan

unread,
Mar 24, 2015, 9:29:26 PM3/24/15
to publicesvfoxpro
Hitiel, si tu problema es como generar el .zip, te mando un ejemplo, donde arma un archivo .zip en una carpeta (direnvio) numerado correlativamente (que se guarda en una tabla testigo con la fecha en que se genera) con una lista de archivos copiados previamente a una carpeta de trabajo, que calculo en tu caso será directamente la carpeta de datos del sistema, eso se pone en "archivosincluir" 
TRY 
lclote    = ADDBS(alltr(nvconfig.direnvio))+lcNomlote 
thisform.zip1.ArchivosExcluir = ''
thisform.zip1.ArchivosIncluir = alltr(nvconfig.direnvio)+'\tablas\*.*'
thisform.zip1.ArchivoZip  = lclote    
thisform.zip1.Comprimir()
CATCH TO LOERROR
       =messagebox('Problemas para compactar la informacion'+
              +chr(13)+loerror.message,64,'ATENCION, PROBLEMAS')
ENDTRY 
El THISFORM.ZIP1 sale de pegar la clase ZIP en el formulario.
Para funcionar requiere las DLL de winzip instalada en la carpeta donde este el ejecutable (o declarada en el windows, como cualquier DLL
Suerte.
zip.VCT
zip.vcx
zip32dll.rar

Hitiel Hernández

unread,
Mar 24, 2015, 9:53:17 PM3/24/15
to publice...@googlegroups.com
ok, gracias Jorge

La función para comprimir los archivos ya la tengo, el problema ahora es cómo hacer para enviar ese archivo ZIP desde mi aplicación hacia un correo X

Jorge Kiernan

unread,
Mar 24, 2015, 11:57:41 PM3/24/15
to publicesvfoxpro
Yo como servicio de correos uso el Ms Outlook, que más arriba en este hilo vas a ver un ejemplo que publiqué.
En el caso tuyo, como attachment iría el .zip que generaste.
.attachments.add('tuarchivo.zip')
Hay otras maneras de hacerlo, pero yo prefiero pasar por el outlook como una manera de permitirle a mi cliente configurar accesos, pautas de auditoria y lo que se le ocurra, sin que este pensando que yo por atrás estoy mandando cosas sin que se enteren, puesto que soy proveedor externo.
Suerte con eso.

Rafael Carballo

unread,
Mar 25, 2015, 11:24:50 AM3/25/15
to publice...@googlegroups.com
Hola Hitiel Hernandez 

A tu sugerencia le he agregado en el mismo parametro de condicion la opcion 4 para que puedas enviar el arhivo que necesitas enviar ya sea zip u otro aca te pongo el codigo modificado de acuerdo a tu necesidad

****************************************************
FUNCTION _Enviar_pdfXCorreo

PARAMETERS cursor_tabla,_reporte,_archivo,_destino,_Asunto,_Contenido
** Cursor o Tabla : Resultado de envio a reportar
** _reporte       : Nombre del reporte a utilizar ejemplo : informes\reporte.frx
** _archivo       : Nombre que se le asignara al archivo pdf a generar Ejemplo : archivo.pdf
** _destino       : Destino será 1=Normal, 2= Solo PDF , 3=Enviar automaticamente el PDF 4=Enviar archivo ZIP u cualquiera sin generar reporte

if _destino<>4  && como no hay reporte evita abrir el cursor o la tabla y el destino como solo es enviar el archivo ya esta defino cuando viene en el parametro
SELECT (cursor_tabla) 

IF EMPTY(_destino)
_destino=1
ENDIF
endif
.cEmailTo= cor...@hotmail.com'
.cSMTPServer = "smtp.gmail.com"
.cEmailFrom= 'cor...@gmail.com'
.cEmailSubject =_Asunto && Aqui va el Asunto del correo
.cEmailBody= _Contenido && Aqui va el cuerpo del correo
.nSMTPPort      = 465
.lSMTPUseSSL    = .t.
.cSMTPUserName  = 'cor...@gmail.com'
.cSMTPPassword  = 'password'

.lReadReceipt   = .T.
.lPriority      = .T.

lcDefaultPath = Sys(5)+Sys(2003)
.SendEmailUsingCDO(xpdf)  && aqui pongo el archivo adjunto del reporte generado

ENDWITH
CASE _destino=4 && enviar archivo cualquiera por correo automaticamente sin generar reporte
** Crear directorio si no existe y borrar asi existe ya el archivo
IF !EMPTY(_Asunto)
_Asunto="Envio automatico del archivo adjunto "+_archivo
ENDIF
IF !EMPTY(_Contenido)
_Contenido="Adjunto encontrara la informacion solicitada " 
ENDIF
DO LOCFILE("FoxyPreviewer.App")

WITH _Screen.oFoxyPreviewer
.lEmailAuto     = .T.   && Automatically generates the report output file
.cEmailType     = "PDF" && The file type to be used in Emails (PDF, RTF, HTML or XLS)
.nEmailMode     = 2     && 1 = MAPI, 2 = CDOSYS HTML, 3 = CDOSYS TEXT, 4 = Custom procedure

.cEmailTo= 'cor...@hotmail.com'
.cSMTPServer = "smtp.gmail.com"
.cEmailFrom= 'cor...@gmail.com'
.cEmailSubject =_Asunto && Aqui va el Asunto del correo
.cEmailBody= _Contenido && Aqui va el cuerpo del correo
.nSMTPPort      = 465
.lSMTPUseSSL    = .t.
.cSMTPUserName  = 'cor...@gmail.com'
.cSMTPPassword  = password'

.lReadReceipt   = .T.
.lPriority      = .T.

lcDefaultPath = Sys(5)+Sys(2003)
.SendEmailUsingCDO(_archivo)  && aqui pongo el archivo adjunto del reporte generado

ENDWITH
endcase


El viernes, 20 de marzo de 2015, 10:08:07 (UTC-6), Rafael Carballo escribió:

Hitiel Hernández

unread,
Mar 25, 2015, 11:47:41 AM3/25/15
to publice...@googlegroups.com
Solo un detalle, no uso FoxiPreviewer porque aún trabajo con VFP 8. 
Existe alguna otra forma?

Javier Bernal

unread,
May 1, 2015, 7:43:55 PM5/1/15
to publice...@googlegroups.com
jkiernan, esto puede funcionar en un .prg
Reply all
Reply to author
Forward
0 new messages