Function StringFind(ptblName As String, pStrToFind As String)
'*******************************************
'Name: StringFind (Function)
'Purpose: Search all text and memo fields
' for specific string
'Inputs: in Northwind debug.window
' ? stringfind("Products", "ot")
'Output: All records containing "ot"
'*******************************************
Dim db As Database, rs As Recordset, tblName As String
Dim test As String, strSQL As String, fld As Field
Dim primHold As String, primType As String, qd As QueryDef, fldHold As String
Set db = CurrentDb
' Trap for any errors.
On Error Resume Next
tblName = "z_tblTempHold"
'Does table tblname exist? If true, delete it;
test = db.TableDefs(tblName).Name
If Err <> 3265 Then 'the specified table exists
DoCmd.DeleteObject acTable, tblName
End If
'Find name of primary key
primHold = PrimKey(ptblName)
'SQL string to create new table
strSQL = "CREATE TABLE " _
& tblName _
& "(ThePrim INTEGER, TheField Text); "
' & "(ThePrim INTEGER CONSTRAINT MyFieldConstraint " _
' & "PRIMARY KEY, TheField Text); "
'create the table
db.Execute strSQL
'open target table
Set rs = db.OpenRecordset(ptblName, dbOpenDynaset)
'create query for each text and memo field
For Each fld In rs.Fields
If fld.Name <> primHold And (fld.Type = 10 Or fld.Type = 12) Then
fldHold = fld.Name
strSQL = "INSERT INTO " & tblName & " ( ThePrim, TheField ) " _
& "SELECT " & primHold & ", " & "'" & fldHold & "' FROM " & ptblName & " WHERE " _
& "(((Instr([" & fld.Name & "], '" & pStrToFind & "'))>0));"
db.Execute strSQL
End If
Next fld
rs.Close
'get field names found
fldHold = StringEm(tblName, "theField")
'create select query SQL for records selected
'limit fields displayed to only those found
strSQL = "SELECT " & primHold & ", TheField AS WhereFound, " & fldHold _
& " FROM " & ptblName & " INNER JOIN " & tblName & " ON " & ptblName _
& "." & primHold & "= " & tblName & ".ThePrim" _
& " ORDER BY z_tblTempHold.ThePrim;"
'create query def
Set qd = Nothing
DoCmd.DeleteObject acQuery, "queryXXX"
Set qd = db.CreateQueryDef("queryXXX", strSQL)
db.QueryDefs.Refresh
'run the query
DoCmd.OpenQuery "queryXXX", acViewNormal
db.Close
End Function
Function PrimKey(tblName As String)
'*******************************************
'Name: primkey (Function)
'Purpose: Programatically determine a
' table's primary key
'Author: rAskew
'Inputs: from Northwind's debug window:
' ? PrimKey("Products")
'Output: "ProductID"
'*******************************************
Dim db As Database
Dim td As TableDef
Dim idxLoop As Index
Set db = CurrentDb
Set td = db.TableDefs(tblName)
For Each idxLoop In td.Indexes
If idxLoop.Primary = True Then
PrimKey = Mid(idxLoop.Fields, 2)
Exit For
End If
Next idxLoop
db.Close
Set db = Nothing
End Function
Function StringEm(ptblName As String, pfldName As String) As String
'*******************************************
'Name: StringEm (Function)
'Purpose: Build a string of field names
' displayed in a record set
'Author: raskew
'Called by: Function StringFind()
'*******************************************
Dim db As Database, rs As Recordset
Dim strSQL As String, strHold As String
Dim n As Integer, i As Integer
Set db = CurrentDb
strSQL = "SELECT distinct " & pfldName & " FROM " & ptblName _
& " ORDER BY " & pfldName & "; "
Set rs = db.OpenRecordset(strSQL)
rs.MoveLast
n = rs.RecordCount
rs.MoveFirst
If n > 0 Then
For i = 1 To n
strHold = strHold & rs(pfldName) & ", "
rs.MoveNext
Next i
strHold = Left(strHold, Len(Trim(strHold)) - 1)
StringEm = strHold
End If
rs.Close
db.Close
Set db = Nothing
End Function