Duda en función sendobject
Buenos días
He usado con éxito en varias ocasiones esta función para generar emails automáticos, pero nunca había necesitado algo como lo de ahora y realmente no tengo idea de cómo hacerlo.
El email lo genero en dos pasos, primero con un botón donde en un formulario en pantalla se general el Asunto, destinatario, destinatario de copia y el cuerpo del documento, donde en caso de querer editar algo de esto pues puedo hacerlo antes de darle a enviar y que así esas cosas queden registradas.
La duda la tengo en el cuerpo del documento. Necesito que además de otros textos, aparezca una relación de datos. En concreto tengo una tabla con cuentas de bancos de clientes y quiero que de ese cliente al que se van a mandar el email aparezca a modo de tabla la información de las cuentas que de él tenemos. Por ejemplo si el cliente tiene dos bancos pues que apareca:
BANCO 1 IBAN NºXXXXXXXXXXXXXX
BANCO 2 IBAN Nº XXXXXXXXXXXXX
Y eso para cualquier cliente considerando que habrá clientes que no tengan ninguna cuenta y otros que pueden tener siete u ocho de alta
Gracias por cualquier ayuda que me puedan dar
1 Respuesta
Con código puedes realizar lo que pides. Te comento conceptualmente como realizarlo (si necesitas ayuda con el código házmelo saber).
Debes de crear una SQL que recoja los datos de la tabla de cuentas de banco de clientes del cliente en concreto que desees. Creas un recordset basado en esa consulta y lo recorres desde el primero al último registro. En cada 'pasada' del bucle, es decir, en cada registro, tomas el valor del nombre del banco y el número de cuenta y los vas concatenando con salto de línea y avance de carro (& vblf & vbcrlf &) de modo que el resultado final sea como el que muestras.
Este texto obtenido lo unes con el salto de línea y avance de carro tras el texto que ya tengas definido para el cuerpo, de modo que se muestre primeramente el texto que ya tengas, para en las siguientes líneas mostrarse las cuentas del cliente seleccionado.
Si necesitas ayuda con el código necesitaría mas datos, a priori el nombre de la tabla de las cuentas bancarias, nombre de los campos de esa tabla a incluir, nombre del campo en donde estás introduciendo el texto del cuerpo del mensaje y del formulario que lo contiene y nombre del campo del formulario que identifica al cliente y que permitirá la búsqueda de sus registros en la tabla de cuentas.
Una vez tienes 'concatenado' lo que escribes en el campo del formulario y los valores de las cuentas del cliente seleccionado el resto es similar a lo que estés haciendo hasta ahora.
Cordiales saludos.
Gracias por tu respuesta
Lo cierto es que en código no es que sea muy experto, pero prefiero estrujarme la cabeza unos días intentándolo con tus indicaciones. Ya te informo si lo consigo o necesito más ayuda
Buenos días
Pues he estado haciendo pruebas pero esto se me escapa así que te voy voy a pedir por favor que me esboces al menos un poco como sería. Te pongo los datos que me pides:
Tabla cuentas bancarias: TblCCC
Campos a incluir: "Entidad", "IBAN"
Campo del texto del cuerpo: "cuerpo"
Formulario que contiene ese campo: "FormEmailAviso"
Campo que identifica al cliente: "IdCliente"
Muchas gracias
Perdona que no te lo solicitase en la respuesta anterior. Es más sencillo y práctico que me envíes el código que estas usando en el botón que mencionas, ya que tan importante como generar el recorset que obtiene los datos que vas a incluir, es donde colocar el resultado obtenido uniendolo al resto del cuerpo del email. El resto de datos que necesito ya me los has aportado (nombre tabla, campos...) por lo que con el código del botón me es suficiente.
Doy por hecho que el campo que identifica al cliente (IdCliente) está tanto en la tabla como en el formulario FormEmailAviso desde donde generas el email, este visible o no en pantalla, para así poder hacer referencia al mismo usando Me. IdCliente en código.
Puedes anexarlo en esta página o enviarmelo a [email protected].
Cordiales saludos.
Como el código completo es bastante largo corto un trozo que entiendo no es de interés para el caso que nos ocupa. Y prefiero ponerlo aquí más que en un email por si alguien más tiene interés en verlo y ver tu solución.
´Comentarte que yo uso Sendobject en dos pasos, con un primer botón (el que pego el código) genero todos los datos que irían en ese email para verlo todo en pantalla y por si quiero editar algo y luego ya el segundo botón el que ejecutaría el envío del email con los datos que tengo en pantalla. El código de se primer botón sería algo así (como digo corto trozos para abreviar):
Private Sub Comando135_Click()
Me.EmailEnvio.Value = DLookup("[EmailCliente]", "Tblemais", "[IdCliente]=" & Me.IdCliente)
If Me.ImporteDeclaracion.Value > 0 Then
Select Case Me.IdModelo.Value
Case 1
Me.AsuntoEmail.Value = "Nueva declaración terminada con resultado A INGRESAR: Modelo 111. Retenciones de trabajadores y profesionales"
Case 2
......
Case Else
MsgBox "Este modelo no está configurado para enviar el email"
DoCmd.CancelEvent
End Select
' DENTRO DE LA OPCIÓN DE QUE LA DECLARACIÓN ES POSITIVA RELLENAMOS EL CUERPO DEL DOCUMENTO
Me.CuerpoEmail.Value = "Estimado Cliente" & vbCrLf & vbCrLf & _
"Le informamos tenemos terminada una nueva declaración de Hacienda que pasamos a detallar: " & vbCrLf & vbCrLf & _
"Empresa: " & Me.Cliente.Value & vbCrLf & _
"Modelo: " & Me.NumeroModelo.Value & vbCrLf & _
"Resultado: " & Me.ImporteDeclaracion.Value & vbCrLf & _
"Fecha tope presentación y pago: " & Me.VencimientoDeclaracion.Value & vbCrLf & vbCrLf & _
"Al tener un resultado positivo rogamos nos responda a este mail cuanto antes indicando la opción de pago o fraccionamiento elegida." & vbCrLf & vbCrLf & _
POR EJEMPLO AQUÍ ME GUSTARÍA PONER LAS CUENTAS CORRIENTES QUE TENEMOS REGISTRADAS Y QUE PUEDEN ELEGIR PARA EL PAGO
"Sin otro particular, reciban un saludo cordial"
'ASUNTO DEL EMAIL CUANDO EL RESULTADO ES NEGATIVO
Else
Select Case Me.IdModelo.Value
Case 1
Me.AsuntoEmail.Value = "Nueva declaración terminada con resultado NEGATIVO: Modelo 111. Retenciones de trabajadores y profesionales"
.........
Case Else
MsgBox "Este modelo no está configurado para enviar el email"
DoCmd.CancelEvent
End Select
' DENTRO DE LA OPCIÓN DE QUE LA DECLARACIÓN ES NEGATIVA O CERO RELLENAMOS EL CUERPO DEL DOCUMENTO
Me.CuerpoEmail.Value = "Estimado Cliente" & vbCrLf & vbCrLf & _
"Le informamos tenemos terminada una nueva declaración de Hacienda que pasamos a detallar: " & vbCrLf & vbCrLf & _
"Empresa: " & Me.Cliente.Value & vbCrLf & _
"Modelo: " & Me.NumeroModelo.Value & vbCrLf & _
"Resultado: " & Me.ImporteDeclaracion.Value & vbCrLf & _
"Fecha tope presentación: " & Me.VencimientoDeclaracion.Value & vbCrLf & vbCrLf & _
"Al tener un resultado negativo nosotros realizamos la presentación telemática de la misma no siendo necesaria ninguna gestión por su parte " & vbCrLf & vbCrLf & _
"Sin otro particular, reciban un saludo cordial"
End If
End Sub
Te copio el código que puedes insertar en el lugar en donde dices POR EJEMPLO AQUÍ ME GUSTARÍA PONER LAS CUENTAS CORRIENTES QUE TENEMOS REGISTRADAS Y QUE PUEDEN ELEGIR PARA EL PAGO
He modificado un poco el código antes de ese punto para definir variables para poder concatenar los texto de un modo más claro.
El resultado que he obtenido (viendo el valor de la variable miCuerpoEmail que uso para el texto del cuerpo en la ventana de inmediato) es el siguiente:
Estimado Cliente
Le informamos tenemos terminada una nueva declaración de Hacienda que pasamos a detallar:
Empresa: clientecillo
Modelo: modelillo
Resultado: 1234
Fecha tope presentación y pago: 12/12/2014
Al tener un resultado positivo rogamos nos responda a este mail cuanto antes indicando la opción de pago o fraccionamiento elegida.
BANCO 1 IBAN NºXXXXXXXXXXXXX1
BANCO 2 IBAN NºXXXXXXXXXXXXX3
Sin otro particular, reciban un saludo cordial
En mi ejemplo el cliente solo tiene dos cuentas, pero aparecerán todas las registradas en la tabla TblCCC. Te queda ajustar los vbcrlf que desees para dar la apariencia que desees al texto.
Te copio el código generado.
' Dentro de la opción de que la declaración es positiva rellenamos el cuerpo del documento Dim miCuerpoEmail As String miCuerpoEmail = "Estimado Cliente" & vbCrLf & vbCrLf & _ "Le informamos tenemos terminada una nueva declaración de Hacienda que pasamos a detallar: " & vbCrLf & vbCrLf & _ "Empresa: " & Me.Cliente.Value & vbCrLf & _ "Modelo: " & Me.NumeroModelo.Value & vbCrLf & _ "Resultado: " & Me.ImporteDeclaracion.Value & vbCrLf & _ "Fecha tope presentación y pago: " & Me.VencimientoDeclaracion.Value & vbCrLf & vbCrLf & _ "Al tener un resultado positivo rogamos nos responda a este mail cuanto antes indicando la opción de pago o fraccionamiento elegida." & vbCrLf & vbCrLf Dim miBD As Database, misRegistros As Recordset, miSQL As String, miEntidad As String, miIBAN As String Set miBD = CurrentDb miSQL = "SELECT TblCCC.Entidad, TblCCC.IBAN FROM TblCCC WHERE TblCCC.IdCliente = " & Me.IdCliente & " WITH OWNERACCESS OPTION;" 'OJO SI IdCliente es texto en lugar de numérico anadir comilla simple antes y despues de IdCliente. 'Quedaría como la siguiente linea que pongo en comentario 'miSQL = "SELECT TblCCC.Entidad, TblCCC.IBAN FROM TblCCC WHERE TblCCC.IdCliente = '" & Me.IdCliente & "' WITH OWNERACCESS OPTION;" Set misRegistros = miBD.OpenRecordset(miSQL, dbOpenSnapshot) With misRegistros If .EOF And .BOF Then .Close Else Do Until .EOF = True miEntidad = !Entidad miIBAN = !IBAN miCuerpoEmail = miCuerpoEmail & vbCrLf & miEntidad & " " & miIBAN .MoveNext Loop .Close End If End With Set miBD = Nothing 'por ejemplo aquí me gustaría poner las cuentas corrientes que tenemos registradas y que pueden elegir para el pago miCuerpoEmail = miCuerpoEmail & vbCrLf & vbCrLf & "Sin otro particular, reciban un saludo cordial" Me.CuerpoEmail.Value = miCuerpoEmail 'ASUNTO DEL EMAIL CUANDO EL RESULTADO ES NEGATIVO
Fíjate en la anotación que hago por si IdCliente es texto en lugar de numérico.
Pues copié el código tal cual y me sale el siguiente mensaje de error que no consigo corregir: "Se ha producido el error '3061' en tiempo de ejecución: Pocos parámetros. Se esperaba 1
Respecto a lo del IdCliente sí es campo autonumérico
Supongo que este error se te presenta en las líneas de código que has añadido ya que no lo has mencionado antes. Ello implica que está en la select que usas como origen del recordset representado en la variable misRegistros.
Lo primero es que al principio del módulo tras Option Compare Database añadas una nueva línea en la que escribas Option Explicit
Esto hará que al compilar el código se compruebe si tienes todas las variables que usas en el código declaradas correctamente.
Para ver donde está el error tienes que ver el código en ejecución. Pon un punto de interrupción y mira si la cadena SQL se completa correctamente. Debe de aparecerte algo así como:
SELECT TblCCC.Entidad, TblCCC.IBAN FROM TblCCC WHERE TblCCC.IdCliente =1 WITH OWNERACCESS OPTION;
Luego si sigues el código línea a línea presionando F8 puedes ir viendo si las variables miEntidad y miIBAN van tomando los valores adecuados.
Toma para hacer otra prueba el valor de la cadena miSQL (ponle una inspección o hazle un Debug. Print miSQL y mira su valor en la ventana de inmediato). Créate una nueva consulta teniendo el código interrumpido (así te aseguras que tienes el formulario desde el que haces todo esto abierto) y pega la cadena miSQL en la ventana de diseño de SQL. Tienen que aparecerte los registros con los campos Entidad e IBAN del IdCliente que tengas seleccionado en el formulario. Si ese Cliente tiene cuentas registradas y no aparecen en la consulta es que no se está accediendo al valor del campo IdCliente del formulario (representado por Me. IdCliente).
No se que más decirte. Ya te comenté que me cree la tabla TblCCC con los dos campos, un formulario donde ubicar el botón y seleccionar un IdCliente y esa parte del código me devolvía el mensaje que te escribí antes, por lo que el código no debiera darte errores.
Repito mi ofrecimiento si quieres que lo revise. No necesito datos... solo los objetos implicados (formulario...).
Cordiales saludos.
- Compartir respuesta