我正在尝试使用DLookup使用VBA在表中搜索记录。我所追踪的特定记录是最接近sdate(用户指定日期)的记录,它也符合其他一些标准。在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)还有其他方法可以实现我在这里尝试做的事情吗?
非常感谢
答案 0 :(得分:2)
依赖关系数据库中的记录顺序总是不安全的。您可以使用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
如果发生错误,您还可以检查返回的记录数。