Beruflich Dokumente
Kultur Dokumente
Como siempre, vamos primero a preparar nuestro “espacio de trabajo” para poder desarrollar
el ejemplo. Esta preparación es común para ambos sistemas, por lo que así “mataremos dos
pájaros de un tiro”.
PREPARATIVOS INICIALES
1.- Creamos una nueva tabla, y la guardamos como TDatos. En ella incluimos los siguientes
campos:
– [Id] → Autonumérico y clave principal
– [NomCont] → Texto (nos recogerá el nombre del contacto)
– [MailCont] → Texto (nos recogerá la dirección de correo electrónico del contacto)
– [Dep] → Texto (nos recogerá el departamento del contacto)
Llenamos esa tabla con algunos datos, teniendo en cuenta que, para el ejemplo, yo emplearé
dos departamentos: Producción y Comercial
Voy a desarrollar el ejemplo con el máximo de opciones posibles. No haría falta “complicarlo”
tanto, pero así podréis ver casi todos los elementos que intervendrán en el código:
1.- Situamos nuestro formulario FDatos en vista diseño y, en la cabecera del mismo (la
agrandamos si no nos cabe) añadimos un cuadro de texto. Este cuadro de texto nos servirá
para introducir el asunto del mensaje. Sacamos las propiedades y nos vamos a la pestaña
Otras → Nombre, y le escribimos txtAsunto
2.- Copiamos y pegamos el cuadro de texto anterior. Este textBox nuevo nos servirá para
escribir un breve cuerpo de mensaje. Sacamos de nuevo sus propiedades y en la pestaña
Otras → Nombre le llamamos txtMsg
1
Visítame en http://siliconproject.com.ar/neckkito/
– Buscar los valores en una tabla o consulta
– Seleccionamos la tabla TDatos
– Seleccionamos los campos [NomCont] y [MailCont]
– Ordenamos por nombre de contacto
– Ocultamos la columna clave y redimensionamos para
poder ver la información
– Recordamos el valor para utilizarlo más adelante
– Como nombre del combo escribirmos: Con copia a:
– Finalizamos
¿Por qué un 3? Porque el combo nos “muestra” tres columnas (aunque no podamos ver la
primera), que son:
• Identificador (columna 1)
• Nombre (columna 2)
• Mail (columna 3)
Como nosotros necesitamos el valor correspondiente al mail, por ello debemos decirle que
realmente el valor que queremos almacenar temporalmente es el que devuelve la columna 3.
4.- Copiamos y pegamos ese combo. Este nuevo combo nos servirá para incluir una copia
oculta. Sacamos sus propiedades y nos vamos a pestaña Otras → Nombre, y le escribimos
cboCCO
5.- Ahora, en nuestro formulario FDatos en vista diseño, insertamos un botón de comando.
6.- Sacamos las propiedades de ese botón de comando y nos vamos a la pestaña Otras →
Nombre, y ahí le escribimos cmdMailReport
7.- Nos vamos a la pestaña Eventos → Al hacer click, y le generamos el siguiente código 2:
...
Private Sub cmdMailReport_Click()
On error goto sol_err
Dim vDest As String, vCC As String, vCCO As String
Dim miAsunto As String, miMsg As String
'Cogemos el valor del destinatario
vDest = Nz(Me.MailCont.Value, "")
'Cogemos el valor de la copia
vCC = Nz(Me.cboCC.Value, "")
'Cogemos el valor de la copia oculta
vCCO = Nz(Me.cboCCO.Value, "")
'Cogemos el valor del asunto
miAsunto = Nz(Me.txtAsunto.Value, "")
'Cogemos el valor del cuerpo del mensaje
miMsg = Nz(Me.txtMsg.Value, "")
'Si no existe mail para el destinatario lanza un mensaje de aviso y sale del proceso
2 Para generar código nos ponemos en la parte en blanco junto al evento que queramos, y veremos cómo nos
aparece un pequeño botón de puntos suspensivos. Si hacemos click sobre él nos aparecerá una ventana. Le
decimos que queremos generar código.
Se nos abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). Esas dos líneas no deben
tocarse. El código lo escribimos entre dichas líneas
2
Visítame en http://siliconproject.com.ar/neckkito/
If vDest = "" Then
MsgBox "No existe mail donde enviar el informe", vbCritical, "AVISO"
Exit Sub
End If
'Realizamos el envío
DoCmd.SendObject acSendReport, "RDatos", , vDest,
vCC, vCCO, miAsunto, miMsg, 0
sol_err:
Exit Sub
End Sub
…
– Como el ejemplo está pensado para enviar un informe, y por ello hemos utilizado la
constante de VB acSendReport. Podríamos haber utilizado otra constante de VB para enviar un
formulario, una tabla, etc. Sólo hay que elegir la constante de VB adecuada.
– Entre “Rdatos” y vDest hay un espacio “en blanco” delimitado por dos comas. Eso nos
permite que Access nos solicite qué formato de archivo queremos enviar. Si quisiéramos un
formato preestablecido deberíamos indicárselo ahí, de manera que, si queremos enviar el
informe siempre en formato snapshot, deberíamos haber escrito:
Truco: si nos situamos, con el cursor, sobre la palabra SendObject, y pulsamos F1, la ayuda
nos mostrará información adicional de cómo podemos enviar un objeto en diferentes formatos,
entre otras cosas.
- El último argumento, el cero (0), significa que no queremos editar el mensaje de mail. Si, por
lo que fuera, quisiéramos modificar el mensaje a través del cliente de correo electronico,
deberíamos cambiar ese cero por el valor -1, de manera que la línea de código quedaría escrita
de la siguiente manera:
8.- Creamos una consulta que, para nuestro ejemplo, nos va a filtrar los destinatarios en
función de su departamento. Los enviaremos al departamento comercial 3. Guardamos esa
consulta como CComercial.
9.- Creamos un nuevo formulario un blanco, que guardaremos con el nombre de FEnvio.
10.- Con ese formulario en vista diseño añadimos un botón de comando. Sacamos sus
propiedades y nos vamos a la pestaña Otras → Nombre, y le escribimos cmdEnvioMasivo
11.- Nos vamos ahora la pestaña Eventos → Al hacer click, y le generamos el siguiente código 4:
…
Private Sub cmdEnvioMasivo_Click()
3 Doy por supuesto que sabéis cómo realizar este tipo de consulta de selección con filtros. De todas maneras, si
tenéis alguna duda, podéis visitar el siguiente enlace y buscar los artículos dedicados a las Consultas.
4 Si no sabemos cómo se hace eso revisad lo especificado en la nota 2 de este mismo documento
3
Visítame en http://siliconproject.com.ar/neckkito/
On Error GoTo sol_err
'El informe lo enviaremos en formato snapshot
Dim vMail As Variant
Dim vAsunto As Variant
Dim vMensaje As Variant
Dim rst As Recordset
'Creamos el recordset
Set rst = CurrentDb.OpenRecordset("CComercial")
'Si la consulta no devuelve ningun registro nos sale un
mesaje de advertencia
'y sale del proceso
If rst.RecordCount = 0 Then
MsgBox "No existen destinatarios en la consulta",
vbCritical, "AVISO"
GoTo Salida
End If
'Pedimos al usuario que especifique el asunto
vAsunto = InputBox("Indique el asunto", "ASUNTO")
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(vAsunto) = 0 Then GoTo Salida
'Pedimos al usuario que especifique el cuerpo del mensaje
vMensaje = InputBox("Indique el cuerpo del mensaje", "CUERPO")
'Detectamos si se ha pulsado el botón CANCELAR
If StrPtr(vMensaje) = 0 Then GoTo Salida
'Si no se especifica nada los valores se convierten a cadena de texto vacía
If IsNull(vAsunto) Then vAsunto = ""
If IsNull(vMensaje) Then vMensaje = ""
'Nos movemos al primer registro
rst.MoveFirst
'Iniciamos el recorrido de registros
Do Until rst.EOF
'Cogemos el valor del destinatario
vMail = rst.Fields("MailCont").Value
'Si no existiera el mail pasamos al siguiente registro
If IsNull(vMail) Then GoTo Siguiente
'Lanzamos el mail
DoCmd.SendObject acSendReport, "RDatos", acFormatSNP, vMail, , , vAsunto, vMensaje,
0
Siguiente:
'Nos movemos al registro siguiente
rst.MoveNext
Loop
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
Exit Sub
sol_err:
Resume Salida:
End Sub
…
– En el envío masivo sería un “latazo” que nos pidiera cada vez que formato de archivo
queremos utilizar para convertir el informe. Es por ello por lo que lo mejor es establecer
4
Visítame en http://siliconproject.com.ar/neckkito/
un formato de archivo predeterminado.
– También sería muy incómodo que cada vez tuviéramos que
editar el mensaje en el cliente de correo. Por ello la opción
que hemos establecido es “no editar el mensaje”, a través
del cero (0) de la línea del Docmd.SendObject...
– He establecido un control de errores muy básico. No lo
complicaremos más porque no es el objetivo del ejemplo.
– Para usuarios de Access 2003 y anteriores, si el código
anterior nos da error en el recordset, tendremos que utilizar
un DAO recordset. Para ello:
● Deberemos registrar la biblioteca “Microsoft DAO 3.6 Objet
Library”5, si no la tenemos ya registrada
● Deberemos definir el recordset de la siguiente manera:
◦ Añadir la línea: Dim dbs As DAO.Database
◦ Añadir la línea: Set dbs = CurrentDb
Estas dos líneas las debemos añadir antes del “Set rst...”
◦ Modificar la línea Dim rst As Recordset por Dim rst As DAO.Recordset
◦ Modificar la línea Set rst = CurrentDb.OpenRecordset("CComercial") por
Set rst = dbs.OpenRecordset(“CComercial”)
◦ Cambiar el contenido de la etiqueta Salida por lo siguiente:
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
dbs.Close
Set rst = Nothing
Set dbs = Nothing
Exit Sub
¡Suerte!
5 Para ello, en el editor de VB, nos vamos a menú Herramientas → Referencias... Ahí deberemos buscar esa
referencia, marcar su check y aceptar
5
Visítame en http://siliconproject.com.ar/neckkito/