2012-10-15 63 views
1

我試圖讓該搜索中的所有數據庫中的表值的形式搜索數據庫中的所有表中值的形式(有超過1個表)。結果將顯示爲出現的表格的名稱。如果有人能幫助我,那將會很好。我怎麼會做這在訪問

總之,我有一個文本框和按鈕的形式。我輸入搜索字符串(例如183939)並單擊按鈕。它搜索數據庫中表中所有字段內的值(183939),如果找到該值,則會顯示出現的表的名稱。感謝您的幫助。

回答

1

我認爲這是一個壞主意,因爲它可能需要很長的時間,並提供由於還搜索系統表混亂的結果......但是下面的函數將返回所有的表名的包含搜索詞的數組或如果沒有找到,就沒有任何問題調用示例如下:theTables = containingTable("hello")其中表是變體。一個限制是,這將失敗的多值字段。

Function containingTables(term As String) 
    Dim db As Database 
    Dim tds As TableDefs 
    Dim td As TableDef 
    Set db = CurrentDb 
    Set tds = db.TableDefs 
    For Each td In tds 
     For Each f In td.Fields 
      On Error Resume Next 
      If DCount("[" & f.Name & "]", "[" & td.Name & "]", "[" & f.Name & "] LIKE '*" & term & "*'") Then 
       If Err.Number <> 0 Then 
        Debug.Print Err.Number, Err.Description 
        Err.Clear 
        On Error GoTo 0 
       Else 
        containingTables = containingTables & td.Name & "," 
        Exit For 
       End If 
      End If 
     Next 
    Next 
    Set tds = Nothing 
    Set db = Nothing 
    'Alternate Version 
    if Len(containgingTables) then containingTables = Left(containingTables, Len(containingTables) - 1) 
    'Original Version 
    'if Len(containgingTables) then containingTables = Split(Left(containingTables, Len(containingTables) - 1), ",") 
End Function 

要顯示與另一個版本的結果,只需使用:Msgbox(containingTables(searchTerm))其中searchTerm是無論你正在尋找。

+0

感謝您的快速回復。我知道這是一個糟糕的主意,但我無法做到這一點,因爲它對我來說很重要。所以我需要做的就是將這段代碼粘貼到VBA頁面中,然後當我運行表單並按搜索時,結果會彈出? – nonion

+0

不,這僅僅是你可以用它來獲得一個字符串數組有有搜索詞爲一些外地(不含多值字段)的部分內容中的所有表的名稱的功能。你需要處理數組。或者,如果您在最後一行中刪除了Split,則可以使用逗號分隔的字符串返回,而不是隻顯示在msgbox中...我會更新我的答案以向您顯示。 –

+2

您可以調整它以處理多值字段。如果'f.Properties( 「AllowMultipleValues」)= TRUE',然後使用'DCOUNT()'表達的變體:'DCOUNT( 「[」 &f.Name& 「]」, 「[」 &td.Name& 「]」, 「[」 f.Name& 「] .value的LIKE '*」 和術語 「*'」)' – HansUp

0

我以及我不知道你爲什麼會想要做這樣的事情......

我想發表丹尼爾·庫克的解決方案是正確的,我只花了稍微不同的方法。你需要像我一樣匹配確切的價值嗎?總之,這裏是我的代碼:

Function searchTables(term as String) 
    Dim T As TableDef 
    Dim Rs As Recordset 
    Dim Result() As String 
    Dim Counter 

    Counter = 0 
    For Each T In CurrentDb.TableDefs 
    If (Left(T.Name, 4) <> "USys") And (T.Attributes = 0) Then 

     Set Rs = T.OpenRecordset 
     While Not Rs.EOF 
     For Each Field In Rs.Fields 
      If Rs(Field.Name) = term Then 
      Counter = Counter + 1 
      ReDim Preserve Result(Counter) 
      Result(Counter) = T.Name & "," & Field.Name 
      End If 
     Next 
     Rs.MoveNext 
     Wend 
     Rs.Close 

    End If 
    Next 
    If Counter = 0 Then 
    searchTables = Null 
    Else 
    searchTables = Result 
    End If 
End Function 

你應該過濾掉重複的值,如果函數多次在同一個表提交的同相匹配。

+0

另外,還可以在發現結果使用'rs.MoveLast'和'退出For'到去下一張桌子。 –

+0

我沒有讀你評論,所以我更新我的!是的,如果他只需要顯示錶格名稱,而不是字段名稱,那麼一旦他找到匹配字段,他就可以跳過整個表格的閱讀。 – fthiella