Ms access DLookup用于返回第一个值的记录顺序(访问VBA)

Ms access DLookup用于返回第一个值的记录顺序(访问VBA),ms-access,vba,Ms Access,Vba,长期跟踪者,但第一次张贴在这里,所以为我的任何社交失礼道歉 我正在尝试使用DLookup使用VBA在表中搜索记录。我要查找的特定记录的日期最接近用户指定的日期,该日期也符合其他一些标准。可能有一些记录的日期在sdate之前,符合相同的标准,我只对按时间顺序最接近sdate的记录感兴趣 下面是我用来尝试实现这一点的代码的简化示例。我使用baseTestString,因为有很多类似的DLookup表达式,所以它可以节省键入的时间,并且至少可以对我稍微澄清一下代码 DoCmd.OpenTabl

长期跟踪者,但第一次张贴在这里,所以为我的任何社交失礼道歉

我正在尝试使用DLookup使用VBA在表中搜索记录。我要查找的特定记录的日期最接近用户指定的日期,该日期也符合其他一些标准。可能有一些记录的日期在sdate之前,符合相同的标准,我只对按时间顺序最接近sdate的记录感兴趣

下面是我用来尝试实现这一点的代码的简化示例。我使用baseTestString,因为有很多类似的DLookup表达式,所以它可以节省键入的时间,并且至少可以对我稍微澄清一下代码

    DoCmd.OpenTable ("Results")
    DoCmd.SetOrderBy "[Survey_Date] Desc"
    DoCmd.Close acTable, ("Results")

    'set a new criteria for baseline testing using Dlookup
    basetestString = "[Equipment_ID] = '" & equipID & "' AND [Baseline?] = True _
        AND     format([Survey_Date],""ddmmyyyy"") < format(" _
        & sdate & ",""ddmmyyyy"")"

    'set variables
    [Forms]![results]![text_A] = Nz(DLookup("[Input]", "[results]", _
        basetestString))
我可能天真地认为DLookup会返回它找到的第一条符合指定条件的记录。因此,我的代码设计为按时间顺序对表进行排序,认为这就是DLookup循环记录的顺序

但是,每次运行代码时,都会返回与标准匹配的最低日期,而不是最接近sdate的日期。经过一番尝试后,我认为DLookup使用主键作为循环记录的基础。较早的日期输入较早,因此使用比较晚日期更低的自动编号给出主键

这就引出了我的问题

1当我返回错误记录时,我正确地认为这就是所发生的事情

2有没有一种方法可以像我尝试的那样使用DLookup?我可以选择用于为DLookup订购记录的字段吗?无法将日期字段指定为主键,因为日期可能并不总是唯一的

3有没有其他方法可以实现我在这里的目标


非常感谢

依赖关系数据库中的记录顺序总是不安全的。您可以使用DMax获取所需的日期,但我认为在这种情况下,记录集会更快

Dim rs As DAO.Recordset
Dim db As Database
Dim ssql As String

Set db = CurrentDB
ssql=" SELECT input" _
& " FROM   results" _
& " WHERE  results.[baseline?] = true" _
& "        AND results.equipment_id = '" & equipID & "'" _
& "        AND results.survey_date = (SELECT" _
& "            Max(results.survey_date) " _
& "        FROM   results" _
& "        WHERE  results.[baseline?] = true" _
& "        AND results.equipment_id = '" & equipID & "'" _
& "        AND results.survey_date <#" & Format(sdate,"yyyy/mm/dd") & "#)"

Set rs = db.OpenRecordset(ssql)

strInput = rs("Input")
Debug.Print strInput

如果出现错误,您还可以检查返回的记录数。

谢谢。我不完全理解你的代码在做什么,因为我还是Access的新手,但你提到的DMax解决了我的问题。我的数据库最终不会保存大量数据,因此在这种情况下,速度并不是一个大问题。再次感谢你。我选择了你的回答作为答案,但我不能超过你,因为我还没有足够的声誉。