2012-10-15 118 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