Envío de mail por Access y código vba

En una tabla (con campo Id como índice numérico) de prueba tengo un formulario y también una consulta que extrae un informe (aquí están los datos que pretendo enviar), con el siguiente código:

Private Sub Comando_Click()
Dim dbs As Database
Dim qdfNew As QueryDef
Dim rst As DAO.Recordset
Dim strSql As String
Dim Correo As String
Dim Id As Long
Set dbs = CurrentDb

strSql = "SELECT * FROM Tabla"
Set rst = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
If rst.EOF = False Then
rst.MoveLast
rst.MoveFirst
Do Until rst.EOF
dbs.QueryDefs.Delete ("Consulta")
identificador = rst!Id
Set qdfNew = dbs.CreateQueryDef("Consulta", _
"SELECT * FROM Tabla WHERE Tabla. Id = & identificador )
Correo = rst!Email
DoCmd.SendObject acSendReport, "Informe1", acFormatSNP, Correo, , , _
"Asunto: Envio de Informe ", , False
rst.MoveNext
Loop
End If
Dbs. Close
Rst. Close

End Sub

La tabla origen contiene un registro con los mails de los destinatarios para enviar los campos que seleccione a través de un informe. Previo a ello un formulario con botón "onclick" para que sea enviado. El origen del informe es una consulta.

En cada registro viene un mail. Cada mail -enviado por outlook - debe recibir solamente su registro.

El fallo siempre me viene en esta línea:

Set qdfNew = dbs.CreateQueryDef("Consulta", _
"SELECT * FROM Tabla WHERE Tabla. Id = " & identificador)

No doy con ello. En principio es una prueba para adaptarlo a otra tabla más compleja.

Alguien puede echarme un cable.

Gracias ¡ Y Saludos.

1 respuesta

Respuesta
2

Daniel:Para ver si hay algún fallo de Nombre en el Identificador, prueba primero sin él.

Set qdfNew = dbs.CreateQueryDef("Consulta", "SELECT * FROM Tabla" )

Si no te diera error, entonces lo pruebas completo, asegurando que los nombres sean los correctos, le añades el Me. Porque supongo que estás en un Formulario, que tiene ese Identificador.

Y lo puedes hacer sin la variable, en éste caso.

Set qdfNew = CurrentDB.CreateQueryDef("Consulta", "SELECT * FROM Tabla WHERE Tabla.Id = " & Me.Identificador )

Si es que el Identificador fuera de tipo Texto, entonces la parte final debe ser:

.......Tabla.Id = '" & Me.Identificador & "'")

Si es que copias desde aquí ten presente que en ocasiones no traduce la comilla simple y la doble correctamente, con lo cual has de reescribirlo en el Editor de VBA. Un saludo >> Jacinto

Daniel: Se me ha olvidado comentarte que para evitar ambigüedades, declares la variable >>

Dim qdfNew As QueryDef >> como Dim qdfNew As DAO.QueryDef

Un saludo >> Jacinto

Gracias Jacinto, por tu tiempo y colaboración.

El código me ha quedada de tal manera:

Private Sub Comando_Click()
Dim dbs As Database
Dim qdfNew As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strSql As String
Dim Correo As String
Dim Id As Long
Set dbs = CurrentDb

strSql = "SELECT * FROM Tabla"
Set rst = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
If rst.EOF = False Then
rst.MoveLast
rst.MoveFirst
Do Until rst.EOF
dbs.QueryDefs.Delete ("Consulta")
identificador = rst!Id
Set qdfNew = dbs.CreateQueryDef("Consulta", _
"SELECT * FROM Tabla WHERE Tabla.Id = " & Me.Id)
Correo = rst!mail
DoCmd.SendObject acSendReport, "Informe1", acFormatPDF, mail, , , _
"Asunto: Envio de Informe ", , False
rst.MoveNext
Loop
End If
dbs.Close
rst.Close

-----------------

El caso es que a la hora de enviar el registro activo que tuviera en pantalla, cuando clikeo me envía todos los registros seleccionando su mail respectivo. El campo que tengo como identificador -como verás en el código es "Id".  Y  el campo "mail" es donde se encuentra la cuenta de correo del contacto que debe recibir el registro que le toca.  Pensé que con el identificador sólo seleccionaría  el registro activo del formulario que finalizo en ese momento. 

Voy a mirar cómo solucionarlo. Si se te ocurre algo te lo agradezco.

Gracias y saludos,

Daniel: Si lo que quieres es enviar "solo" el registro activo no necesitas ni la consulta ni el Recordset ni la mayoría del código que tienes. Basta con que busques la dirección de correo con un DLookup y el Id que ya tienes en el Formulario, y de ahí elijas el resto de datos.

Miraré con un poco más de calma el proceso que tienes, pero me parece que la consulta que estás creando ni la usas. Quizá sea esta tarde o mañana porque ando un poco liado.

Si lo estoy entendiendo mal, me comentas. Un saludo >> Jacinto

Gracias de nuevo Jacinto.

La consulta la tengo configurada por el informe que adjunto. Aunque sí que es posible que no fuera necesaria. En la tabla hay 5 campos: Id(clave autonumérica), mail, objeto, telf, mensaje.

Cuando abro el formulario quisiera que al agregar uno nuevo, cuando clikeo se envíe a la dirección de mail que va en ese registro. Con el código configurado lo que hago es adjuntar el informe con origen de la consulta.  

El código es el siguiente ya que he desarrollado el mail que reciben los clientes:

Option Compare Database

Private Sub Comando_Click()
Dim dbs As Database
Dim qdfNew As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strSql As String
Dim Correo As String
Dim Id As Long
Set dbs = CurrentDb
strSql = "SELECT * FROM Tabla"
Set rst = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
If rst.EOF = False Then
rst.MoveLast
rst.MoveFirst
Do Until rst.EOF
dbs.QueryDefs.Delete ("Consulta")
identificador = rst!Id
MsgBox identificador
Set qdfNew = dbs.CreateQueryDef("Consulta", _
"SELECT * FROM Tabla WHERE Tabla.Id= " & identificador)
Correo = rst!mail
DoCmd.SendObject acSendReport, "Informe1", acFormatPDF, mail, , , "Información sobre el pesaje en báscula ELTC", "Estimado/a Sr. /Sra. :" _
& vbCrLf _
& vbCrLf _
& "Para su información se le remite el resumen detallado de la compra " _
& "correspondiente al período que se indica en el documento adjunto,  " _
& vbCrLf _
& vbCrLf _
& "Un saludo. ", False
rst.MoveNext
Loop
End If
dbs.Close
rst.Close

End Sub

------------------------------------------------------------------------

Puede que me esté complicando con tanto código. Estoy bloqueado ahora mismo...

Gracias no obstante...

Daniel: Entre tanto yo puedo analizar el código, mira éste par de ejemplos que tengo en Mediafire.

http://www.mediafire.com/file/ccja396gccjzwfu/EMailConOutLook.rar 

http://www.mediafire.com/file/6vthvvskp3hopdo/EnvInformesFiltrados.rar 

Si con ellos no solucionas el problema, me comentas, ya que tengo un par de días muy cargados.

Un saludo >> Jacinto

Ok, en fin. Y por muy pesado que sea ...nuevamente, gracias¡

Las mereces. 

Hola Jacinto,  en el caso de suprimir la consulta y haciendo uso de la regla DLookup el código  "Select ..." quedaría fuera del código? 

Saludos,

Daniel: Ahora con ésta pregunta, no sé a lo que te refieres.

Si al final has elegido algún método y ahí está el SELECT, dime donde es y veo de orientarte.

...estoy estancado en el siguiente código.  es el que mejor resulta pero con la pesquisa que me envía por mail todos los registros de la tabla. Sólo pretendo enviar por mail el registro activo cuando lo finalizo. El mail al que debe ser enviado puede ir en la misma tabla, es como lo tengo...

Saludos,

------------------

Private Sub Comando_Click()
Dim dbs As Database
Dim qdfNew As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strSql As String
Dim Correo As String
Dim Id As Long
Set dbs = CurrentDb
strSql = "SELECT * FROM Tabla"
Set rst = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
If rst.EOF = False Then
rst.MoveLast
rst.MoveFirst
Do Until rst.EOF
dbs.QueryDefs.Delete ("Consulta")
identificador = rst!Id
MsgBox identificador
Set qdfNew = dbs.CreateQueryDef("Consulta", _
"SELECT * FROM Tabla WHERE Tabla.Id= " & identificador)
Correo = rst!mail
DoCmd.SendObject acSendReport, "Informe1", acFormatPDF, mail, , , "Información sobre el pesaje en báscula ELTC", "Estimado/a Sr. /Sra. :" _
& vbCrLf _
& vbCrLf _
& "Para su información se le remite el resumen detallado de la compra " _
& "correspondiente al período que se indica en el documento adjunto,  " _
& vbCrLf _
& vbCrLf _
& "Un saludo. ", False
rst.MoveNext
Loop
End If
dbs.Close
rst.Close

End Sub

-------------------------

Daniel: Una forma rápida que tendríamos de salir de esa situación sería que me enviaras si quieres claro está, tu BD a [email protected]

Donde digo tu BD, me refiero a los objetos necesarios para hacer el proceso. Tabla, Formulario etcc.

Los que intervengan, con algunos datos inventados. Espero tu comentario. Jacinto

¡Gracias! 

Ok, Jacinto, te  enviaré por mail la tabla real desde la que quiero operar realmente. Ya que esta tabla se encuentra en otra oficina.  Pediré que me la envíen por mail. 

En esta tabla verás numerosos campos de los cuales seleccionaré solamente 5, 6 campos como mucho. En la misma tabla mí idea es incluir el mail del cliente en otro campo. 

Saludos,

Daniel: Esta pregunta quedó en la via muerta y la tengo en espera de que me envíes la documentación. Si te parece yo dejo de seguirla y cuando puedas ya me mandarás el Fichero.

Cuando lo hagas, por favor pones el link de ésta pregunta, por si me hiciera falta el historial. Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas