【问题标题】:How to read record from one table and write to another table with the corresponding record?如何从一个表中读取记录并写入具有相应记录的另一张表?
【发布时间】:2016-09-28 17:28:27
【问题描述】:

我正在尝试从一个访问表中读取发送一封电子邮件“Email1”,然后将日期写入相应的记录“Email2”。要查找相应的记录,两个表中的字段 RecID 将匹配。我不断返回“语法错误”在“rs1.Edit where rs!MaxOfForm_Record_Number = rs1.MaxOfForm_Record_Number”下方突出显示这一行的错误

   Function EmailTest1()

    Dim rs As Recordset
    Dim strBody As String
    Dim strBody2 As String
    Dim strRecipient As String
    Dim rs1 As Recordset
    Set rs1 = CurrentDb.OpenRecordset("Email2")
    Set rs = CurrentDb.OpenRecordset("Email1")
    Dim strName As String
    Dim strProject As String
    Dim strLastDate As String
    Dim strNow As String
    Dim emailcheck As String

    rs.MoveLast
    rs.MoveFirst

    For i = 1 To rs.RecordCount

        If IsNull(rs!EmailStat) = True Then
         strNow = Now()
         strName = rs!Inspected_By
         strProject = rs!Site_Location
         strLastDate = rs!LastOfDate_Time_of_Inspection
         strBody2 = "BLah blah text "

         rs1.Edit where rs!RecID = rs1.RecID
         rs1![EmailStat].Value = strNow
         rs1.Update

         strBody = "blahblah"
         strRecipient = rs!Email
         DoCmd.SendObject , , , strRecipient, , , "Subject", strBody, False, False


         End If
         rs.MoveNext
    Next i

    Set rs = Nothing

    End Function

【问题讨论】:

    标签: sql ms-access vba


    【解决方案1】:

    我不会为简单的更新而为整个 OpenRecordset 交易而烦恼,我会这样做:

    DoCmd.RunSQL "UPDATE Email2 SET EmailStat=#" & strNow & "# WHERE RecID=" & rs!RecID
    

    补充说明: RecordCount 并不完全值得信赖。我更喜欢这样循环:

    rs.MoveFirst
    Do while Not rs.EOF
        {Do Stuff}
        rs. MoveNext
      Loop
    

    (这根本不检查没有记录,检查没有记录使用: rs.EOF=True AND rs.BOF=true 在 rs.MoveFirst 之前,否则会报错)

    【讨论】:

    • 谢谢!根据您的建议更改了循环。
    • “不为简单的更新而烦恼整个 OpenRecordset 交易”得到我的 +1
    【解决方案2】:

    您需要找到记录 - 然后对其进行编辑
    你不能像你正在尝试的那样在一行上做到这一点

    替换:

    rs1.Edit where rs!RecID = rs1.RecID
    

    与:

    rs1.FindFirst "RecID = " & rs!RecID
    rs1.Edit
    

    编辑 - 添加对 NoMatch 的检查

    注意 - 您还应该在 FindFirst 尝试后检查 rs1.NoMatch,
    除非你确定每条记录都有一个 RecID 匹配

    【讨论】:

    • 谢谢!出于某种原因,我不断收到“此对象不支持操作”,但是当我进入 Access 时,我可以看到它与 RecID 匹配。
    • rs1.FindFirst "RecID = " & rs!RecID
    • 您可能必须为您的记录集指定 dbOpenDynaset - 我假设两个记录集都只是表?
    • 是的,两者都只是表格
    • 将打开的记录集更改为Set rs1 = CurrentDb.OpenRecordset("Email2", dbOpenDynaset)
    猜你喜欢
    • 1970-01-01
    • 2010-12-31
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多