如何通过MDB查询更新BegAtt和EndAtt值?

时间:2019-05-22 17:00:49

标签: ms-access

我想通过查询基于MDB中的“控制开始”,“控制停止”,“应用程序”和“记录类型”字段来更新BegAtt和EndAtt值。 以下是我的MDB数据库的记录集,我要根据其中具有Record Type = Email的父记录来更新BegAtt和EndAtt值:

Application             Record Type         Control Start       Control Stop        BegAtt  EndAtt
Outlook Mail Document   Email               3rd-Party_00000040  3rd-Party_00000040      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000041  3rd-Party_00000044      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000045  3rd-Party_00000045      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000046  3rd-Party_00000049      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000050  3rd-Party_00000181      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000182  3rd-Party_00000223      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000224  3rd-Party_00000243      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000244  3rd-Party_00000250      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000251  3rd-Party_00000460      
Outlook Mail Document   Email               3rd-Party_00000461  3rd-Party_00000461      
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000462  3rd-Party_00000611      

BegAtt值应该是主记录的第一个值(记录类型=电子邮件),EndAtt值应该是族的最后一个值(记录类型=电子邮件附件)。以下是理想的结果:

Application             Record Type         Control Start       Control Stop        BegAtt              EndAtt
Outlook Mail Document   Email               3rd-Party_00000040  3rd-Party_00000040  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000041  3rd-Party_00000044  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000045  3rd-Party_00000045  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000046  3rd-Party_00000049  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000050  3rd-Party_00000181  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000182  3rd-Party_00000223  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000224  3rd-Party_00000243  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000244  3rd-Party_00000250  3rd-Party_00000040  3rd-Party_00000460
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000251  3rd-Party_00000460  3rd-Party_00000040  3rd-Party_00000460
Outlook Mail Document   Email               3rd-Party_00000461  3rd-Party_00000461  3rd-Party_00000461  3rd-Party_00000611
Adobe Acrobat Document  Email-Attachment    3rd-Party_00000462  3rd-Party_00000611  3rd-Party_00000461  3rd-Party_00000611

我尝试了下面的代码,但结果不正确。

SELECT [3rd-Party001_Main].[Record Type], Min([3rd-Party001_Main].[Control Start]) AS [MinOfControl Start], Max([3rd-Party001_Main].[Control Stop]) AS [MaxOfControl Stop]
FROM [3rd-Party001_Main]
GROUP BY [3rd-Party001_Main].[Record Type];

1 个答案:

答案 0 :(得分:0)

由于没有“家庭”标识符,仅查询对象将无法完成您想要的操作。需要VBA代码遍历记录集检查,以便在值更改时确定“家庭”组的开始,设置StartAtt字段的值并运行UPDATE操作SQL来设置EndAtt字段。根据数据样本,请考虑:

Sub SetRange()
Dim rs As DAO.Recordset, strStart As String, strEnd As String, strApp As String
Set rs = CurrentDb.OpenRecordset("SELECT * FROM [3rd-Party001_Main] WHERE BegAtt Is Null ORDER BY ControlStart;")
Do
    If rs!Application Like "Outlook*" Then
        strStart = rs!ControlStart
    End If
    strEnd = rs!ControlStop
    rs.Edit
    rs!StartAtt = strStart
    rs.Update
    rs.MoveNext
    If Not rs.EOF Then strApp = rs!Application
    If (Not rs.EOF And strApp Like "Outlook*") Or rs.EOF Then 
        CurrentDb.Execute "UPDATE [3rd-Party001_Main] SET EndAtt = '" & strEnd & "' WHERE StartAtt='" & strStart & "'"
    End If
Loop Until rs.EOF
End Sub

建议在命名约定中不要使用空格或标点/特殊字符。