2014-02-17 101 views
1

長時間的潛行者,但是第一次在這裏發佈海報,所以我爲任何社交失禮道歉。DLookup用來返回第一個值的記錄順序(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)有沒有其他方法可以實現我在這裏要做的事情?

非常感謝您

回答

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 

您還可以檢查返回的記錄數,以防出現錯誤。

+0

謝謝你Remou。我並不完全理解你的代碼在做什麼,因爲我仍然是Access的新手,但是你提到的DMax已經解決了我的問題。我的數據庫不會最終保存大量的數據,所以在這種情況下速度並不是什麼大問題。再一次,謝謝你。我已經選擇了你的答案作爲答案,但由於我還沒有足夠的聲望,我無法贊成你。 – m4rkb4

相關問題