2013-08-21 24 views
0

VBA小白(因爲這哀悼),VBA訪問獲得行來源找到查找此值

在MS Access我寫了一個測試功能,找到一些你在傳遞條件的備案基地的價值。

該函數似乎工作正常,除非在我正在搜索的列中查找的情況下。

基本上它可能會返回「19」,19對應於其他一些表值。

似乎列的RowSource是什麼後,所以我可以做第二次查詢來找到真正的價值。

有人可以指出我在尋找RowSource的正確方向,假設我知道列名,然後利用它找到值Im後?

編輯:看來,我不是解釋我自己清楚,這是什麼,我試圖讓編程 enter image description here

enter image description here

+0

不太確定我正確理解你的問題,但我試過你的代碼,它的工作原理。我想知道你的問題是不是你的SELECT實際上會帶回多於一行,並給你一個與你預期不同的價值。你的'recordSet'只會給你第一個記錄。要移動到下一個,你需要使用'recordSet.MoveNext'。嘗試在查詢中運行您的SELECT,並查看它是否僅返回一行。如果是這樣,試着更詳細地解釋這個問題。 – transistor1

+1

作爲一個方面說明 - 如果沒有任何結果,您將遇到麻煩 - 因此您還需要執行像'If not recordSet.EOF Then'result = recordSet(column)' – transistor1

+0

'的檢查我添加了圖片來解釋myslef更清晰lol – MichaelTaylor3D

回答

2

試試這個 - 我想,我終於明白,爲什麼你正在尋找的行來源 - 抱歉,我沒有「搞定」它在第一。您試圖拉取的字段是描述表中的外鍵。

該函數應該作爲所有這些字段的一般解決方案(假設RowSource總是首先有主鍵,其次是描述)。如果沒有RowSource,它將只提取該字段的值。

它基於您的原始代碼,而不是由@ron提出的更改,但它應該設置您正確的方向。另外,使用&符號(&)在VBA中將字符串連接在一起,以避免類似這樣的情況: abc = "1" + 1,其中abc現在等於2,而不是「11」,正如您期望的那樣,如果兩個項目都是字符串。

Public Function lookUpColumnValue(Database As Database, column As String, table As String, lookUpColumn As String, lookUpValue As String) As String 

    Dim sql As String 
    Dim recordSet As DAO.recordSet 
    Dim result As String 

    lookUpColumnValue = "" 'Return a blank string if no result 

    On Error Resume Next 

    sql = "SELECT [" & table & "].[" & column & "] FROM [" & table & "] WHERE [" & table & "].[" & lookUpColumn & "] = '" & lookUpValue & "'" 
    Set recordSet = Database.OpenRecordset(sql) 

    If Not recordSet.EOF Then 
     Dim td As DAO.TableDef 

     'this gives your number - say, 19 
     result = recordSet(column) 

     Set td = Database.TableDefs(table) 

     'Get the rowsource 
     Dim p As DAO.Property 
     For Each p In td.Fields(column).Properties 
      If p.Name = "RowSource" Then 
       RowSource = Replace(td.Fields(column).Properties("RowSource"), ";", "") 
       Exit For 
      End If 
     Next 

     If Not RowSource = "" Then 
      Dim rs2 As DAO.recordSet 
      Dim qd As DAO.QueryDef 

      Set qd = Database.CreateQueryDef("", RowSource) 
      Set rs2 = Database.OpenRecordset(RowSource) 

      If rs2.EOF Then Exit Function 

      PKField = rs2.Fields(0).Name 

      rs2.Close 
      qd.Close 

      sql = "SELECT * FROM (" & RowSource & ") WHERE [" & PKField & "]=[KeyField?]" 
      Set qd = Database.CreateQueryDef("", sql) 
      qd.Parameters("KeyField?").Value = result 

      Set rs2 = qd.OpenRecordset() 

      If Not rs2.EOF Then 
       'NOTE: This assumes your RowSource *always* has ID first, description 2nd. This should usually be the case. 
       lookUpColumnValue = rs2.Fields(1) 
      End If 
     Else 
      'Return the field value if there is no RowSource 
      lookUpColumnValue = recordSet.Fields(column) 
     End If 
    End If 

End Function 
+0

這幾乎就是我在找的東西!我得到的唯一問題是,我總是每次都得到第一個描述條目。例如,即使我的外鍵是19,它總會給我零值。我查看了你的代碼,看看我是否能夠理解爲什麼,看起來它應該是正確的,所以我想知道它的數據庫是否自己設計,現在給了我這個價值。它似乎遵循你的假設,雖然 – MichaelTaylor3D

+0

杜 - 你說得對。我沒有根據外鍵過濾RowSource。給我一分鐘。 – transistor1

+0

這應該做到這一點。正如羅恩所說的那樣,這個解決方案充其量只是黑客。你真的應該使用類似於DLookup的方式打2個電話 - 但我更喜歡回答問題,而不是試圖教授「最佳實踐」,當他們沒有被要求時。無論如何,不​​要在你的生產代碼中使用它。 – transistor1

2

如果我正確理解你的問題的照片,我想使用參數查詢將解決您的問題。使用參數是很好的做法,因爲它們將執行隱式數據類型轉換,並且還可以防止注入攻擊。

請注意,在下面的函數中,我將lookupValue更改爲Variant類型,它允許您將任何類型的值傳遞給該函數。

Public Function lookUpColumnValue(_ 
    database As DAO.database, _ 
    column As String, _ 
    table As String, _ 
    lookUpColumn As String, _ 
    lookUpValue As Variant) As String 

    Dim sql As String 
    Dim recordSet As DAO.recordSet 
    Dim result As String 
    Dim qd As QueryDef 
    Set qd = database.CreateQueryDef("") 
    sql = "SELECT [" + table + "].[" + column + "] FROM [" + table + "] " & _ 
      "WHERE [" + table + "].[" + lookUpColumn + "] = [parm1];" 
    qd.sql = sql 
    qd.Parameters![parm1] = lookUpValue 
    Set recordSet = qd.OpenRecordset() 

    result = recordSet(column) 

編輯

lookUpColumnValue = DLookup("Space Use Description", "Space Use Codes", result) 


End Function 
+0

雖然這真的是一個非常好的建議,但它回答了我提出的一些不相關的問題,我擔心它不是我所要求的,我很抱歉如果我沒有清楚地解釋它,想象一下數據庫列有不同的數字對應於一個類別名稱,除了該列鏈接到一個表格,該表格標識哪些名稱對應於該名稱數字。訪問數據庫然後在列中顯示名稱而不是數字。我相信它叫做查詢。我試圖獲得名稱值,但我的功能只返回數字。 – MichaelTaylor3D

+0

噢好吧,我想你要找的是Dlookup()函數:http://www.techonthenet.com/access/functions/domain/dlookup.php –

+0

我添加了一張圖片,這樣我就可以更清楚地解釋自己了, Dlookup功能仍然給我以前收到的相同結果。謝謝! – MichaelTaylor3D