Ms access DLookup用于返回第一个值的记录顺序(访问VBA)
长期跟踪者,但第一次张贴在这里,所以为我的任何社交失礼道歉 我正在尝试使用DLookup使用VBA在表中搜索记录。我要查找的特定记录的日期最接近用户指定的日期,该日期也符合其他一些标准。可能有一些记录的日期在sdate之前,符合相同的标准,我只对按时间顺序最接近sdate的记录感兴趣 下面是我用来尝试实现这一点的代码的简化示例。我使用baseTestString,因为有很多类似的DLookup表达式,所以它可以节省键入的时间,并且至少可以对我稍微澄清一下代码Ms access DLookup用于返回第一个值的记录顺序(访问VBA),ms-access,vba,Ms Access,Vba,长期跟踪者,但第一次张贴在这里,所以为我的任何社交失礼道歉 我正在尝试使用DLookup使用VBA在表中搜索记录。我要查找的特定记录的日期最接近用户指定的日期,该日期也符合其他一些标准。可能有一些记录的日期在sdate之前,符合相同的标准,我只对按时间顺序最接近sdate的记录感兴趣 下面是我用来尝试实现这一点的代码的简化示例。我使用baseTestString,因为有很多类似的DLookup表达式,所以它可以节省键入的时间,并且至少可以对我稍微澄清一下代码 DoCmd.OpenTabl
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解决了我的问题。我的数据库最终不会保存大量数据,因此在这种情况下,速度并不是一个大问题。再次感谢你。我选择了你的回答作为答案,但我不能超过你,因为我还没有足够的声誉。