【问题标题】:MS Access Date triggers emulationMS Access Date 触发仿真
【发布时间】:2013-11-03 12:40:03
【问题描述】:

我对 Access 完全陌生(对 SQL 服务器有一些经验)。

我不确定它在 MS Access 2010 中是否可行: 如果 table.dateField 之一是今天或更早 - 需要发送有关该记录的电子邮件。

广泛的挖掘并没有带来任何结果,似乎不可行,但希望对此有团体意见。 谢谢你

【问题讨论】:

  • Access 2010 数据宏有一个SendEmail 宏操作。你试过吗?
  • @GordThompson Tt 不符合我的要求 我的要求 - SendEmail 只会对特定记录的操作进行操作。即使数据库中没有任何活动,我也需要有一个触发器来通知日期是今天,并且无论如何都必须发送电子邮件......感谢您的评论,不幸的是,显而易见的选择不是我想要的。
  • 好的,感谢您的澄清。因此,当您说“即使数据库中没有任何活动”时,您的意思是这些电子邮件需要定期发送(例如,每天一次)即使没有人使用 Access 应用程序(即,电子邮件过程应该完全独立于用户与之交互的任何前端代码)?
  • 不,万一其中一条记录的日期是今天,应该发送电子邮件说这条记录已过期,并提供一些信息它是什么记录。谢谢

标签: sql ms-access ms-access-2010


【解决方案1】:

Microsoft Access 应用程序没有任何内置功能来自动扫描数据库并根据表中记录的状态发送电子邮件。但是,这并不意味着这样的功能对于存储在 Access 数据库中的信息“不可行”。事实上,实现这样的功能可以像这样简单:

以下 VBScript 代码可以在 Windows 下作为计划任务每​​天早上运行(通过cscript.exe)。它将扫描一个名为 [Patients] 的表,并向当天过生日的每个人发送一条“生日快乐”消息。

Option Explicit

Dim con  ' As ADODB.Connection
Dim rst  ' As ADODB.Recordset
Dim msg  ' As CDO.Message

Set con = CreateObject("ADODB.Connection")  ' New ADODB.Connection
con.Open _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\Users\Gord\Desktop\Database1.accdb;"
Set rst = CreateObject("ADODB.Recordset")  ' New ADODB.Recordset
rst.Open _
        "SELECT FirstName, Email " & _
        "FROM Patients " & _
        "WHERE Month(DOB) = Month(Date()) " & _
            "AND Day(DOB) = Day(Date())", _
        con
Do Until rst.EOF
    Set msg = CreateObject("CDO.Message")  ' New CDO.Message
    msg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    msg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.example.com"
    msg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    msg.Configuration.Fields.Update

    msg.To = rst("Email").Value
    msg.From = "admin@example.com"
    msg.Subject = "Happy Birthday!"
    msg.TextBody = "Hi, " & rst("FirstName").Value & ". We hope you have a great birthday today!"
    msg.Send

    Set msg = Nothing
    rst.MoveNext
Loop
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing

【讨论】:

    【解决方案2】:

    如果您的意思是您需要在表上执行一个查询,并且该查询将管理针对每个违规行发送电子邮件的执行 - 那么我认为您不会有太多运气;

    您可以通过访问打开电子邮件窗口,但这不会自行发送电子邮件。

    您的后端使用什么?如果它很灵活,并且您使用 SQL Server 作为后端,那么您可以使用调用存储过程的实际触发器来发送所需的电子邮件。

    除此之外,我能想到的就是

    • 创建一个查询来查找要发送电子邮件的行;
    • 创建一个 .net 可执行文件,它接收一组信息作为参数并根据该数据发送您需要的电子邮件,
    • 在应用程序的表单上,使用计时器事件定期执行打开查询的逻辑,使用类似 adodb.recordset 并循环遍历记录集并为查询返回的每一行调用 .net 可执行文件。

    希望对你有帮助

    【讨论】:

    • 感谢您的回复。我放弃了将访问作为后端的想法,现在它是 MSSQL。问题 - 如何定义一个触发器,该触发器将在表中的一个字段中的日期为今天或更少时触发我?谢谢!
    • @DisplayName 请注意,我在回答中提供的解决方案与 SQL Server 数据库一样适用于 Access 数据库。您真正需要做的就是更改connection string
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    相关资源
    最近更新 更多