DLookup用于返回第一个值的记录顺序(Access VBA)

时间:2014-02-17 11:48:06

标签: vba ms-access access-vba

很长一段时间跟踪者,但是第一次在这里发布海报,为我所做的任何社交失礼道歉。

我正在尝试使用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)还有其他方法可以实现我在这里尝试做的事情吗?

非常感谢

1 个答案:

答案 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

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