Envío masivo de informes Access por mail

Me enfrento a un problema que no sé cómo resolver. Con el siguiente código:

DoCmd. OpenReport nombredoc, acPreview,,, acHidden
        DoCmd. OutputTo acOutputReport, nombredoc, acFormatPDF, rutaneta & "informe.pdf", False,,, acExportQualityPrint
        DoCmd. Close acReport, nombredoc

Trato de enviar a varios sujetos de mi base de datos un informe individualizado mediante un bucle.

En primer lugar abro el informe, que quiero que no se vea, por lo que uso acHidden. Pero el informe se ve y por la pantalla se van viendo todos los informes a mediada que el bucle avanza. No sé cómo evitar que los informes se vean.

En segundo lugar exporto el informe a un archivo pdf en una determinada ruta, para luego adjuntarlo al mail. Lo hago así en vez de usar directamente la opción SendObject, ya que

A) Con SendObject no se exportan todos los objetos del informe

B) Porque hacerlo así me supone recibir en cada iteración avisos de que salen correos, que para evitarlos me supondría tener que rebajar la seguridad de access y dejar mi ordenador bastante vulnerable.

Por último, cierro el informe, envío el fichero e itero.

Lo que me gustaría que me aclararais es el primer punto. ¿Cómo evito que se vean los informes a medida que se abren? Según he visto es necesario abrirlos para que se exporte al pdf todo el contenido del informe.

Respuesta
3

Por partes. La verdad, no lo entiendo. Por un lado dices que quieres enviar un informe personalizado, pero por otro lado no limitas el informe a quien quieres enviárselo.

Normalmente se usa el Docmd. Openreport... pero acompañado de algún criterio que limite a que "sujeto" se le va a enviar. Por ejemplo

Docmd.openreport "clientes",acpreview,,"[idcliente]=" & me.idcliente & ""

ó

docmd.openreport"clientes",acpreview,,"pais=""Alemania"""

Pero tambien puedes suprimir el acpreview

Si a cada uno le vas a remitir tal como está construido no te hace falta el docmd. Openreport, basta con la segunda línea. Por ejemplo, si tengo el formulario

y pulso el botón

Y lo único que le digo en el código es

Private Sub Comando13_Click()
DoCmd.OutputTo acOutputReport, "Clientes", acFormatPDF, "C:\users\....\documents\borrar\" & "informe.pdf", False, , , acExportQualityPrint
End Sub

Por otro lado, tendrás que decirle, de alguna forma que,se lo mande a una persona, que pase a ¿otro registro? y que se lo envíe al siguiente, etc.

Además, da la impresión que estás usando el Outlook que viene con el Office. Es preferible crear la función

Dim pola As Outlook.Application
    Dim pTaskItem, ptaskitemasig As Outlook.TaskItem
    Const olCreateTasks = 3
    Const olDialog = 1
    Const olSound = 8
    Set pola = CreateObject("Outlook.Application")
    sSubject = "" & Forms!clientes!Asunto & ""
    sBody = "" & Forms!clientes!Mensaje & ""
    dDue = Now()
    dStart = Now()
    sSoundFile = "alarm3"
    bReminderSet = True
    Set pTaskItem = pola.CreateItem(olCreateTasks)
        pTaskItem.Subject = sSubject
        pTaskItem.Body = sBody
        pTaskItem.DueDate = dDue
        pTaskItem.StartDate = dStart
        pTaskItem.ReminderSet = bReminderSet
        If bReminderSet Then
              pTaskItem.ReminderSoundFile = sSoundFile
              pTaskItem.ReminderTime = Now()
        End If
        pTaskItem.Recipients.Add ("" & Me.email & "")
        pTaskItem.Attachments.Add ("C:\users\.....\documents\borrar\clientes.pdf")
        pTaskItem.Save
        pTaskItem.Assign
        pTaskItem.Send
        Set pTaskItem = Nothing
        Set pola = Nothing
  

Gracias por tu respuesta Icue.

Probablemente no me he explicado bien. Te cuento el proceso completo e igual me explico mejor.

Se trata de una aplicación de socios y accionistas que estoy creando. Anualmente se les manda a cada uno un certificado al objeto de que puedan cumplimentar, si es el caso, la declaración del Impuesto sobre el Patrimonio. Esto ya lo tenía yo hecho, y me generaba en papel un informe en el que cada página es el certificado de un socio con todos sus datos. A partir de ahí se firmaban, ensobraban y se enviaban por correo postal los certificados., lo que en empresas de muchos socios supone un coste alto de tiempo y dedicación. Decidí por tanto explorar la posibilidad de enviar los certificados por mail. Como obtener las posiciones de cada socio a una fecha determinada tiene un proceso laborioso y un código largo, he querido aprovechar el proceso del informe inicial para meter, a solicitud del usuario, el proceso de envío por mail. El informe inicial en papel se obtiene a través de un bucle for - next que va añadiendo en cada iteración datos a una tabla que es la que posteriormente alimenta al informe. Lo que hago ahora es, antes de llegar al next, generar un informe individual de cada socio, con los datos del mismo obtenidos en la iteración actual.

Cuando el bucle general termina se me abre el informe principal en pantalla, para poder imprimirlo si lo deseo, pero simultáneamente ha ido enviando a cada socio por mail su certificado individual. Y ahí es donde radica mi problema, que en cada iteración, al generar el informe individual que se enviará por correo, éste aparece por pantalla, a pesar de haberle indicado con la expresión AcHidden que no se muestre. Realmente lo que quiero es que durante todo el tiempo  que dura la generación del informe principal no vayan apareciendo los informes individuales a los que me he referido.

Espero haberme explicado mejor.

Buen día y Saludos

He comprobado ejecutar tu consejo "Pero también puedes suprimir el acpreview", y entonces me desaparecen en la exportación varias partes del informe individual, como el anagrama de la empresa y varios campos independientes calculados al abrir el informe.

He comprobado todas las posibilidades y sólo con acviewpreview o con acviewReport se mantienen integro el informe al exportarlo. Pero no dejan de mostrarse en pantalla ni usando ac Hidden (oculto) ni acIcon (minimizado)

Asunto resuelto Icue.

Bastaba con un docmd.minimize al abrir el informe individual

Muchas gracias por todo

Siento retrasarme pero nada más contestarte tuve que salir pitando para París, mi hijo se había puesto malo. Y te estoy escribiendo con su ordenador. Te he preparado un ejemplo. Si quieres, repito si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te lo mando.

En esencia, supongamos que tengo la tabla

Con ella, o con lo que sea tengo un informe.

En el formulario Clientes, tengo un botón

Al pulsarlo va recorriendo los registros y me los pasa a la carpeta Informes

Y me los pasa al correo

Y todo esto sin que se abran para nada los informes.

Muchas gracias Icue. Antes que nada, deseo que tu hijo se encuentre ya perfectamente.

Por lo demás, no sé si se te ha pasado el breve correo que te envié de que ya todo estaba resuelto. El problema venía de que el informe lo copié de otro anterior en el que en uno de los eventos iniciales de pedía Docmd.maximize. Por mucho que pedía que los informes se ocultaran al abrirse el comando anterior lo anulaba. Ahora ya tengo el módulo listo, con la opción de emitir el informe en pantalla/papel para todos los socios, con o sin remisión por mail, incluso hacer sólo la remisió por mail. Además, como en determinados socios no se cuenta con su dirección de email, se genera finalmente un informe de reporte de los envíos realizados.

Te reitero mi agradecimiento y te deseo felices fiestas navideñas

La verdad es que fue sólo un susto, gordo sí, pero sólo eso. Los médicos me dijeron que sólo era un sincope.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas