If Dir("C:\Prueba\Prueba.doc") = "" Then Msgbox "El archivo no existe" Else Msgbox "El archivo existe" End If
Más información en:
If Dir("C:\Prueba\Prueba.doc") = "" Then Msgbox "El archivo no existe" Else Msgbox "El archivo existe" End If
=DLookUp("campo","tabla","un_campo = 'un_valor'")
Kill("TestFile")
DoCmd.OpenReport "Anexo_AML", acViewPreview, , "[ID]=" & Me("ID")
El propósito de este artículo es describir un método para automatizar el envío de correos electrónicos a partir de información disponible en una base de datos SQL Server, lo cual puede ser muy útil si utilizan Access con SQL Server.
En este primer artículo, explicaremos cómo configurar el servicio de DatabaseMail de SQL Server 2008 R2 Express. Probaremos dos configuraciones:
En un segundo artículo, vamos a explicar como enviar los datos a partir de información disponible en nuestra base de datos, cómo darle formato al correo y cómo automatizar su envío.
Comencemos…
En la versión Express de SQL Server no disponemos del asistente para configurar DatabaseMail, por lo cual deberemos hacer el trabajo en forma manual. Primero abrimos SQL Server Management Studio y nos conectamos:
Con el botón derecho del mouse sobre el nombre de nuestro servidor ir a la opción Facets. Es posible que esta opción se demore en abrir:
Luego vamos a la opción Surface Area Configuration / DatabaseMailEnabled.
Ponemos el valor True.
Luego reiniciamos SQL Server con el botón derecho del mouse sobre el servidor, haciendo clic en Restart.
Dentro de la base msdb vamos a utilizar un conjunto de procedimientos almacenados para configurar el correo, en este caso usando GMail como SMTP:
sysmail_add_account_sp
@account_name = 'Prueba',
@email_address = 'micuenta@gmail.com' ,
@display_name = 'Prueba DataBaseMail' ,
@replyto_address = 'noresponder@gmail.com' ,
@mailserver_name = 'smtp.gmail.com',
@mailserver_type = 'SMTP' ,
@port = 587,
@username = 'micuenta@gmail.com',
@password = '-----',
@enable_ssl = TRUE
sysmail_add_profile_sp @profile_name = 'Profile de prueba'
sysmail_add_profileaccount_sp
@profile_name = 'Profile de prueba' ,
@account_name = 'Prueba',
@sequence_number = 1
Para enviar un correo de prueba, podemos utilizar un procedimiento como el siguiente, siempre dentro de la base de datos msdb:
EXEC sp_send_dbmail @profile_name='Profile de prueba',
@recipients='jpussacq@gmail.com',
@subject='Mensaje de prueba',
@body='Mi primer prueba de Database Mail'
Y obtendremos un mensaje como el siguiente:
Mail queued.
Si todo funcionó bien, recibiremos el correo sin problemas. Sino, podemos explorar algunas de las opciones de la siguiente sección.
Las siguientes consultas, nos pueden ayudar a hacer un análisis de los problemas y a conocer en qué estado quedaron nuestros correos:
select * from msdb.dbo.sysmail_sentitems
select * from msdb.dbo.sysmail_unsentitems
select * from msdb.dbo.sysmail_faileditems
Esta consulta nos puede brindar más información si el estado es failed:
SELECT
items.subject,
items.last_mod_date,
l.description
FROM dbo.sysmail_faileditems as items
INNER JOIN dbo.sysmail_event_log AS l
ON items.mailitem_id = l.mailitem_id
Si reciben un error como el siguiente “The server response was: 5.7.0 Must issue a STARTTLS command first”, lo más probable es que hayamos olvidado configurar la opción de SSL en la cuenta.
Es similar al caso de Gmail, pero con las opciones de Blue Host.
USE msdb
GO
sysmail_add_account_sp
@account_name = 'Blue Host Mail',
@email_address = 'cuenta@midominio.com' ,
@display_name = '---' ,
@replyto_address = 'noresponder@---' ,
@mailserver_name = 'mail.midominio.com',
@mailserver_type = 'SMTP' ,
@port = 26,
@username = 'cuenta@midominio.com',
@password = '---',
@enable_ssl = FALSE
GO
sysmail_add_profile_sp @profile_name = 'Perfil Blue Host'
GO
sysmail_add_profileaccount_sp
@profile_name = 'Perfil Blue Host' ,
@account_name = 'Blue Host Mail',
@sequence_number = 1
GO
EXEC sp_send_dbmail @profile_name='Perfil Blue Host',
@recipients='jpussacq@gmail.com',
@subject='Mensaje de prueba',
@body='Este es un mensaje de prueba del sistema'
Private Sub Reporte_Click() Dim intnewrec As Integer intnewrec = Me.NewRecord If intnewrec = False Then On Error Resume Next DoCmd.OpenReport "Nota_Componentes", acViewPreview, , "[ID Nota]=" & Me("ID") If Err = 2501 Then Err.Clear DoCmd.Maximize DoCmd.RunCommand acCmdZoom100 End If End Sub
DoCmd.OpenReport "Nota_Componentes", acViewPreview, , "[ID Nota]=" & Me("ID") DoCmd.Maximize DoCmd.RunCommand acCmdZoom100
On Error Resume Next DoCmd.OpenReport "Nota_Componentes", acViewPreview, , "[ID Nota]=" & Me("ID") If Err = 2501 Then Err.Clear
Private Sub Report_NoData(Cancel As Integer) MsgBox "No existen datos suficientes para generar el reporte." Cancel = True End Sub
<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'> <head><title>Reporte 1</title> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Print</w:View> <w:Zoom>90</w:Zoom> </w:WordDocument> </xml><![endif]--> <style> p.MsoFooter, li.MsoFooter, div.MsoFooter { margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:center 3.0in right 6.0in; font-size:12.0pt; } @page Section1 { size:8.5in 11.0in; margin:1.0in 1.0in 1.0in 1.0in; mso-header-margin:.5in; mso-footer-margin:.5in; /* mso-title-page:yes; */ mso-header: h1; mso-footer: f1; /* mso-first-header: fh1; mso-first-footer: ff1; */ mso-paper-source:0; } div.Section1 { page:Section1; } table#hrdftrtbl { margin:0in 0in 0in 900in; width:1px; height:1px; overflow:hidden; } </style></head> <body lang=EN-US style='tab-interval:.5in'> <div class=Section1> <p> CONTENT
<p>hola mundo</p> <p>hola mundo</p> <p>hola mundo</p> <p>hola mundo</p> <p>hola mundo</p> <p>hola mundo</p> </p> <br/> <table id='hrdftrtbl' border='0' cellspacing='0' cellpadding='0'> <tr><td> <div style='mso-element:header' id=h1 > <p class=MsoHeader ><p> CABECERA</p></p> </div> </td> <td> <div style='mso-element:footer' id=f1> <p> PIE</p> <p class=MsoFooter> <span style=mso-tab-count:2></span> Pag. <span style='mso-field-code: PAGE '><span style='mso-no-proof:yes'></span></span> de <span style='mso-field-code: NUMPAGES '></span> </p> </div> <!-- PRIMERA PAGINA DISTINTA <div style='mso-element:header' id=fh1> <p class=MsoHeader><span lang=EN-US style='mso-ansi-language:EN-US'> CABECERA (primera hoja)<o:p></o:p></span></p> </div> <div style='mso-element:footer' id=ff1> <p class=MsoFooter><span lang=EN-US style='mso-ansi-language:EN-US'> PIE (primera hoja)<o:p></o:p></span></p> </div> --> </td></tr> </table> </body></html>
Dim camino Dim archivo Dim archivoHTML Dim archivoDOCX ' Obtengo el path en donde se ejecuta la aplicación camino = CurrentProject.Path + "\" archivo = "temporal_30" archivoHTML = camino + archivo + ".html" archivoDOCX = camino + archivo + ".docx" Log.Caption = "Path detectado." + vbNewLine ' Abro el archivo HTML DoCmd.OutputTo acOutputReport, "Informe1", acFormatTXT, archivoHTML Dim theWord As Object Set theWord = CreateObject("Word.Application") Dim theDoc As Object Set theDoc = theWord.Documents.Open(archivoHTML) Log.Caption = Log.Caption + "Archivo HTML abierto." + vbNewLine ' Incrusto las imágenes en el documento For Each shapeLoop In theDoc.InlineShapes With shapeLoop .LinkFormat.SavePictureWithDocument = True .LinkFormat.BreakLink Log.Caption = Log.Caption + "Imagen incrustada (InlineShape)." + vbNewLine End With Next shapeLoop ' Incrusto las imágenes en el documento (Headers) For Each sectionsLoop In theDoc.Sections Log.Caption = Log.Caption + "Sección detectada." + vbNewLine With sectionsLoop For Each headersLoop In .Headers Log.Caption = Log.Caption + "Header detectado." + vbNewLine With headersLoop For Each shapeheaderLoop In .Range.InlineShapes With shapeheaderLoop .LinkFormat.SavePictureWithDocument = True .LinkFormat.BreakLink Log.Caption = Log.Caption + "Imagen incrustada (InlineShape / Header)." + vbNewLine End With Next shapeheaderLoop End With Next headersLoop End With Next sectionsLoop ' Convierto el archivo HTML en DOCX theDoc.SaveAs FileName:=archivoDOCX, FileFormat:=wdFormatDocument Log.Caption = Log.Caption + "Archivo DOCX generado." + vbNewLine ' Cierro todo theWord.Documents(archivoDOCX).Close theWord.Quit Set theWord = Nothing Log.Caption = Log.Caption + "Archivo DOCX cerrado." + vbNewLine ' Abro Word con el archivo DOCX convertido Application.FollowHyperlink archivoDOCX Log.Caption = Log.Caption + "Documento abierto en Word." + vbNewLine
DoCmd.OpenForm "Inicio", acNormal DoCmd.BrowseTo ObjectType:=acBrowseToForm, ObjectName:="Inicio_Propuestas", PathToSubformControl:="Inicio.NavigationSubform"