En este grupo En todos

Foro de Access



Enviar emails utilizando un campo de una tabla de access

Petswanson
A Coruña, España
Escrito por Petswanson
el 27/09/2008

Amigo Abraham,


No soy capaz de avanzar con un tema que me trae loco. Quiero montar una querie en Access 97 que cogiendo las direcciones de email de un campo de una tabla que tengo en la bbdd, lo haga automatico. Utilizo "Enviar Objeto", pero auqnue pruebo distintas cosas, no se como poner la referencia del campo y la tabla en "Para" al montar la queyr.


Mil gracias de antemano

Juan Cots
Valencia, España
Escrito por Juan Cots
el 27/09/2008

Hola Petswanson.

Yo creo que lo más fácil es con un Recordset. Pones un nuevo botón en cualquier formulario que te venga bien de tu base de datos y en el Evento "Al hacer click" del mismo pones lo siguiente:

Dim rst As DAO. Recordset
Dim strSql As String
Dim Correo as String
strSql = "SELECT * FROM NombreTabla"
Set rst = CurrentDb. OpenRecordset(strSql, dbOpenDynaset)
If rst. EOF = False Then
rst. MoveLast
rst. MoveFirst
Do Until rst. EOF
Correo = rst! NombreCampoPara
DoCmd. SendObject acSendReport, "NombreInforme", acFormatHTML, Correo, , , _
    "Asunto: Envio de Informe ", , True
End If
rst. MoveNext
Loop
End If
rst. Close
 

Solo tienes que cambiar lo que está en negrita por el Nombre real de tu tabla, el campo donde tienes las direcciones de correo y el nombre del informe que quieres enviar

Un saludo

Petswanson
A Coruña, España
Escrito por Petswanson
el 29/09/2008

Al ejecutar el codigo, me da un error 3131 en tiempo de ejecución (Error sintaxis en clausula From) y se identifica la sentencia "Set rst = CurrentDb. OpenRecordset(strSql, dbOpenDynaset)" como punto de error.


Te paso la instruccion fijada:

Private Sub Comando71_Click()
Dim rst As DAO. Recordset
Dim strSql As String
Dim Correo As String
strSql = "SELECT * FROM PolizasPendientes-RequiereBoletin-Oficinas"
Set rst = CurrentDb. OpenRecordset(strSql, dbOpenDynaset)


If rst. EOF = False Then
rst. MoveLast
rst. MoveFirst
Do Until rst. EOF
Correo = rst! E_Mail
DoCmd. SendObject acSendReport, "Polizas Pendientes -Requiere Boletin-Oficinas", acFormatHTML, Correo, , , _
    "Asunto: Envio de Informe ", , True
rst. MoveNext
Loop
End If
rst. Close

End Sub




Juan Cots
Valencia, España
Escrito por Juan Cots
el 29/09/2008

Necesitas activar la referencia Microsoft Dao 3. X Object Library.   Para eso abre la ventana de VBA ves a la opción de menú Referencias, busca la que te menciono y la marcas. Cierras y vuelves a abrir la bbdd y ya debe funcionar.

Un saludo

Juan Cots
Valencia, España
Escrito por Juan Cots
el 29/09/2008

Y otra cosa, si alguno de tus objetos tiene espacios ponlo entre corchetes. [Polizas Pendientes -Requiere Boletin-Oficinas]

Un saludo

Petswanson
A Coruña, España
Escrito por Petswanson
el 29/09/2008

Gracias. ¡Funciona ¡Pero ahora tenemos otro problema: ejecuta el report "del tiron" de forma que al primer mail de la lista le envia todos los reports, no el primer report. ¿Como podríamos hacer para que a cada registro de la tabla solo le envie un report, no todos?


Mil gracias

Juan Cots
Valencia, España
Escrito por Juan Cots
el 29/09/2008

Disculpa pero no entiendo lo que me dices. ¿Le envía todos los reports?.   Solo puede enviar uno. Eso sí con todas las páginas que tenga y a todos los destinatarios de la tabla. ¿No es así como lo quierías?

Un saludo

Petswanson
A Coruña, España
Escrito por Petswanson
el 29/09/2008
"Disculpa pero no entiendo lo que me dices. ¿Le envía todos los reports?.   Solo puede enviar uno. Eso sí con todas las páginas que tenga y a todos los destinatarios de la tabla. ¿No es así como lo quierías?
Un saludo
"

por Juan Cots (Septiembre 2008)

Queria que a cada email le envie solo un report, el que le corresponde. Si por ejemplo tengo 3 registros en la tabla, con 3 emails y 3 datos distintos, a cada email le envia un solo report, construido con los datos del registro de la tabla que se asocian a ese email. Por ejmplo, al email en posición 2 le envia report basado en datos del registro 2 de la tabla. Y asi sucesivamente


Juan Cots
Valencia, España
Escrito por Juan Cots
el 29/09/2008
La tabla en la que basas el informe tiene un indice o campo principal? Es decir un campo autonumérico Id o algún otro tipo de identificador único. Si es así dime su nombre.
Petswanson
A Coruña, España
Escrito por Petswanson
el 29/09/2008

IdCotitzacio es el campo Indice.


Gracias por todo

Juan Cots
Valencia, España
Escrito por Juan Cots
el 29/09/2008

La cosa se complica un poco, pero no mucho. Lo primero haz una copia de tu bbdd y trabaja con ella. Para que funcione el siguiente código, lo que tienes que hacer es  una consulta de tu tabla "PolizasPendientes-RequiereBoletin-Oficinas". Le añades todos los campos y la guardas con el nombre "ConsultaCorreo". Ahora te vas al informe y en vista diseño Propiedades/Datos/Origen del Registro... Eliges la consulta que acabamos de crear. Lo cierras y si lo vuelves a abrir verás que funciona exactamente como antes.

Y ahora sí. Utiliza este código. Lo que hace es cambiar cada vez el origen de datos del informe para que solo envíe a cada uno el que le toca. También he cambiado de True a False la última línea de SendObject para que envíe sin abrir el programa de correo

Aquí tienes un ejemplo del mismo

Para que funcione el ejemplo debes poner en la tabla las direcciones mail que quieras para probar.

El código sería este

Dim dbs As Database
Dim qdfNew As QueryDef
Dim rst As DAO. Recordset
Dim strSql As String
Dim Correo As String
Dim identificador As Long
Set dbs = CurrentDb

StrSql = "SELECT * FROM [PolizasPendientes-RequiereBoletin-Oficinas]"
Set rst = CurrentDb. OpenRecordset(strSql, dbOpenDynaset)
If rst. EOF = False Then
rst. MoveLast
rst. MoveFirst
Do Until rst. EOF
dbs.QueryDefs.Delete ("ConsultaCorreo")
identificador = rst! IdCotitzacio
Set qdfNew = dbs. CreateQueryDef("ConsultaCorreo", _
         "SELECT * FROM [PolizasPendientes-RequiereBoletin-Oficinas] WHERE [PolizasPendientes-RequiereBoletin-Oficinas]. IdCotitzacio = " & identificador)
Correo = rst! Email
DoCmd. SendObject acSendReport, "PolizasPendientes-RequiereBoletin-Oficinas", acFormatHTML, Correo, , , _
    "Asunto: Envio de Informe ", , False
rst. MoveNext
Loop
End If
dbs. Close
rst. Close

Petswanson
A Coruña, España
Escrito por Petswanson
el 29/09/2008

Mil MIllones de Gracias. Funciona. De verdad, no sabes lo agradecido que estoy,


Gracias

Lucano
Córdoba, España
Escrito por Lucano
el 29/01/2009

Estimado Juan Cots, he utilizado tu código para enviar un informe por correo electrónico utilizando una tabla de access, y no me funciona.

Cuando el pograma comienza a enviar los informes por correo electrónico, comete errores enviando el mismo informe a varios usuarios, curiosamente suelen estar contiguos en la tabla indexada. He estado investigando y no encuentro ninguna pauta lógica, en un envío lo hace con unos registros y en otro lo hace con otros. Sí es cierto que la mayoría de los correos los remite correctamente, pero siempre hay varios usuarios que reciben en su correo el informe de otro. Esta forma de proceder es un tanto molesta, porque el código está pensado para que a cada usuario le llegue su información y no la de su vecino.

Por lo poco que he podido investigar, el problema puede ser de versiones. Este código es para ACCESS 97 y yo lo he estado probando en ACCESS 2007, que ofrece la posibilidad de remitir el informe en PDF, importante para mí porque el informe que remito también tiene un cuadro.

También me pregunto si será un problema entre los códigos DAO, más propio de access 97 y ADO que es el que se uliza en la actualidad.

Te ruego me informes cómo puedo adaptar este código, que tan últil me resultaría si funcionase, a la versión ACCESS 2007.

Juan Cots
Valencia, España
Escrito por Juan Cots
el 29/01/2009

Hola Lucano.

En principio no debería ser ese el problema, yo lo construí con Access 2007 y aparentemente no da ningún error. ¿Has probado la consulta a ver si te da los resultados esperados? (en el ejemplo es SELECT * FROM [PolizasPendientes-RequiereBoletin-Oficinas] WHERE [PolizasPendientes-RequiereBoletin-Oficinas]. IdCotitzacio = " & identificador))

Si quieres pega aquí tu código y le pegamos un vistazo
Un saludo

Rolo
Argentina
Escrito por Rolo
el 04/03/2009

Por si le sirve a alguien les dejo este codigo, el unico problema es que si le pongo false al DoCmd. SendObject me pregunta que un programa esta trantando de enviar un mail a ver si lo manda cada vez que manda uno.

Private Sub Comando2_Click()


Dim rst As DAO. Recordset
Dim strSql As String
Dim stWhere As String
Dim stSaldo As String
Dim stVencimiento As String
Dim stPeriodo As String
Dim stCliente As String
Dim EmailSubjectvalue As String
Dim EmailMessagevalue As String

Set rst = CurrentDb. OpenRecordset("clientes")

If rst. EOF = False Then
rst. MoveLast
rst. MoveFirst
Do Until rst. EOF

stCliente = rst! Nombre
stSaldo = rst! Saldo
stLinkCriter = rst! Mail

stVencimiento = DLookup("Vencimiento", "Periodo")
stPeriodo = DLookup("Periodo", "Periodo")

EmailSubjectvalue = "Vencimiento Factura - " & stPeriodo
EmailMessagevalue = "Estimado Sr. /Sra. " & stCliente & vbCrLf & vbCrLf & _
" Nos dirigimos a Usted con el fin de hacerle llegar a través de la " & vbCrLf & _
"presente que el saldo del periodo " & stPeriodo & " figura como impago. " & vbCrLf & vbCrLf & _
" VENCIMIENTO : " & stVencimiento & vbCrLf & vbCrLf & _
" SU SALDO A PAGAR ES DE " & stSaldo & vbCrLf & vbCrLf & _
"Por cualquier duda o consulta al respecto, por favor no dude en comunicarse. " & vbCrLf & vbCrLf & _

DoCmd. SendObject , "", "", stLinkCriter, "", "", EmailSubjectvalue, EmailMessagevalue, True



rst. MoveNext

Loop
End If

rst. Close

End Sub

Juan Cots
Valencia, España
Escrito por Juan Cots
el 04/03/2009

Gracias por compartir tu código Rolo.
Un saludo

Norberto Burle
Experto: dirección de compras y logíst...
Escrito por Norberto Burle
el 20/12/2009

Hola Juan

He leido y tratado de aplicar esta rutina pero tengo un problema , me sale "End IF with out a block If". (se planta en la linea End If luego del DoCmd...).
Alguna idea como salir de esto?

Juan Cots
Valencia, España
Escrito por Juan Cots
el 21/12/2009

Hola Norberto.

Tendrás que poner todo el código, al parecer alguna pareja de If... End If , la tienes desparejada.

Un saludo

Norberto Burle
Experto: dirección de compras y logíst...
Escrito por Norberto Burle
el 22/12/2009

Gracias Juan , lo he hecho pero aun asi no funciona, para colmo ahora recibo un mensaje de que "alguien mas utiliza el sistema" (cosa imposible pues esta en desarrollo en mi propia PC) por lo que no puedo activar la referencia Microsoft Dao 3. X Object Library.....
Si alguien en el foro sabe como arreglarlo lo agradeceria
Felices fiestas

Norberto

Juan Cots
Valencia, España
Escrito por Juan Cots
el 22/12/2009

Abre la bbdd con la tecla shift presionada y antes de que te de algún problema y se ponga en modo depuración (en esa situación no se puede acceder a las referencias), abres una ventana de VBA y activas la referencia.

El mensaje de error que te da, en ocasiones se produce al ejecutar consultas de actualización sobre tablas que en esa momento están activas (por ejemplo con un formulario que la tenga como origen de datos), Access interpreta que otra persona ha modificado el registro.

Para poder ayudarte más es necesario saber lo que estás haciendo

Un saludo