1

我正在尝试制作一个表单,用于搜索数据库中所有表中的值(有多个表)。结果将显示为其中出现的表的名称。如果有人可以帮助我,那就太好了。

简而言之,我有一个带有文本框和按钮的表单。我输入搜索字符串(例如 183939)并单击按钮。它在数据库表的所有字段中搜索值(183939),如果找到该值,则显示它出现的表的名称。感谢您的帮助。

4

2 回答 2

1

我认为这是一个坏主意,因为它可能需要很长时间,并且由于还要搜索系统表而提供令人困惑的结果......但是以下函数将返回包含搜索词的所有表名的数组,或者如果它是没找到。调用示例是这样的:theTables = containingTable("hello")其中 theTables 是一个变体。一个限制是这对于多值字段将失败。

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))where searchTermis what you are search.

于 2012-10-15T19:42:10.023 回答
0

我也一样,我不知道你为什么想做那样的事情......

我认为 Daniel Cook 发布的解决方案是正确的,我只是采取了稍微不同的方法。你需要像我一样匹配确切的值吗?无论如何,这是我的代码:

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

您应该过滤掉重复的值,以防函数在同一个表中多次匹配相同的字段。

于 2012-10-15T20:26:55.200 回答