Búsqueda registros en varias tablas a la vez

Tengo 7 tablas y necesito buscar un registro en las 7 tablas y en varias columnas de ellas, ¿cómo hago el buscador para que solo al actualizar el cuadro de texto haga la búsqueda en todas las tablas?

3 Respuestas

Respuesta
4

Por aportar una idea diferente, y creo que más sencilla de implantar que la que te propone Jacinto (un saludo), ya que veo que comentas que tus tablas son iguales (y esto es un requisito casi imprescindible), es que hagas una consulta de UNION con las tablas que te interesen y luego hagas la búsqueda en esa consulta como si fuera una única tabla. Para buscar en los diferentes campos solo has de encadenar el criterio con el operador OR.

Básicamente sería así:

1º/ Creas la consulta de unión, así si tienen todas la misma estructura:

SELECT * FROM Tabla1 UNION ALL SELECT * FROM Tabla2 UNION ALL ...SELECT * FROM Tabla7

2º/ Esta consulta la guardas con el nombre que quieras, por ejemplo CTotal

3º/ Creas una nueva consulta sobre la anterior y la filtras (te pongo la idea en general, tendrás que adaptarla para que te coja el valor a buscar del formulario):

SELECT * FROM CTotal WHERE Campo1 LIKE *ValorBuscado* OR Campo2 LIKE *ValorBuscado* OR Campo1 LIKE *ValorBuscado*

Esta consulta filtrada la puedes usar como origen del cuadro de lista, combinado, subformulario... en el que quieras mostrar los registros que coincidan.

Si lo que quieres es saber en qué tabla está, en la consulta de unión puedes añadir un campo nuevo que sea el nombre de cada tabla, por ejemplo:

SELECT *, 'Tabla1' As NomTabla FROM Tabla1 UNION ALL SELECT *,'Tabla2' As NomTabla  FROM Tabla2 UNION ALL ...SELECT *,'Tabla7' As NomTabla  FROM Tabla7

Un saludo.


¡Gracias! lo voy a intentar

"3º/ Creas una nueva consulta sobre la anterior" .. y asi esta...

SELECT [CTOTAL].Control, [CTOTAL].Ref, [CTOTAL].FECHA, [CTOTAL].Beneficiario, [CTOTAL].Concepto, [CTOTAL].[Datos Bancarios], [CTOTAL].Ingreso, [CTOTAL].Egresos, [CTOTAL].Conciliado, [CTOTAL].[Impuesto Pag], [CTOTAL].[Registro es]
FROM CTOTAL;

 " y la filtras" ...ahora como le hago para que desde el formulario MENU busque por medio de un cuadro de texto que se llama "BUSCAR" y me diga en que tabla se encuentra el registro???

espero haber puesto lo necesario para terminar con esta unión de búsqueda en 6 tablas

estas son las tablas

Gracias

La solución ya te la di en el anterior mensaje:

Si lo que quieres es saber en qué tabla está, en la consulta de unión puedes añadir un campo nuevo que sea el nombre de cada tabla, por ejemplo:

SELECT *, 'Tabla1' As NomTabla FROM Tabla1 UNION ALL SELECT *,'Tabla2' As NomTabla  FROM T

O de otra forma, por si lo ves más claro:

SELECT Campo1, Campo2, ...CampoX, 'Tabla1' As Tabla FROM Tabla1 UNION ALL SELECT Campo1, Campo2, ...CampoX, 'Tabla2' As Tabla FROM Tabla2 UNION ALL SELECT Campo1, Campo2, ...CampoX, 'Tabla3' As Tabla FROM Tabla3 UNION ALL....

De cualquiera de ellas tendrás una nueva columna que te indica en qué tabla está el registro. Solo te faltaría añadir ese campo a tu buscador

Mil Disculpas pero no lo puedo hacer que me diga la tabla.. :(

así tengo los datos y se trae la información de momento use 2 tablas para hacerlo sencillo

pero no encuentro donde poner la información para que salga el nombre de la tabla

y este es el como esta en la consulta de unión:

SELECT Tabla1.Tipo, Tabla1.Control, Tabla1.Ref, Tabla1.Cliente, Tabla1.FECHA, Tabla1.Ingreso, Tabla1.Egresos, Tabla1.[Registro es]
FROM Tabla1;

UNION

SELECT Tabla2.Tipo, Tabla2.Control, Tabla2.Ref, Tabla2.Cliente, Tabla2.FECHA, Tabla2.Ingreso, Tabla2.Egresos, Tabla2.[Registro es]
FROM Tabla2;

te agradecería si me informar o donde pongo lo que me dices.

Gracias 

SELECT Tabla1.Tipo, Tabla1.Control, Tabla1.Ref, Tabla1.Cliente, Tabla1.FECHA, Tabla1.Ingreso, Tabla1.Egresos, Tabla1.[Registro es], 'Tabla1' AS Tabla
FROM Tabla1;

UNION

SELECT Tabla2.Tipo, Tabla2.Control, Tabla2.Ref, Tabla2.Cliente, Tabla2.FECHA, Tabla2.Ingreso, Tabla2.Egresos, Tabla2.[Registro es], 'Tabla2' AS Tabla
FROM Tabla2;

Respuesta
2

Alberto: He improvisado un procedimiento que te puede ayudar. Tu lo completas y lo adaptas a tus necesidades.

Como puedes ver se trata de recorrer "todas" las Tablas y todos los Registros y campos de todas las Tablas de la Base de datos. Si quieres restringir las Tablas a buscar puedes hacer una matriz con sus nombres o un ListBox o Combo y recorrer sus datos...

Public Sub BuscaEnVariasTablas(ElTexto As String)
Dim StrSQL As String
Dim NTabla As DAO.TableDef
Dim Rst As DAO.Recordset
Dim ElCampo As DAO.Field
On Error Resume Next
'DoCmd.Hourglass True  'Descomentar cuando funcione el Código
'Recorremos cada una de las Tablas
For Each NTabla In CurrentDb.TableDefs
        'Sondeamos que la Tabla no sea Temporal o de Sistema
        If Left(NTabla.Name, 1) <> "~" And Left(NTabla.Name, 4) <> "MSys" Then
                StrSQL = "SELECT * FROM " & NTabla.Name & ";"
                Set Rst = CurrentDb.OpenRecordset(StrSQL, dbOpenSnapshot)
                If Not Rst.EOF And Not Rst.BOF Then
                        Rst.MoveLast
                        Rst.MoveFirst
                        Do While Not Rst.EOF
                                For Each ElCampo In Rst.Fields
                                        If InStr(ElCampo.Value, ElTexto) > 0 Then
                                                If Err = 0 Then
                                                        MsgBox "El texto buscado está en la Tabla : " & NTabla.Name & vbCrLf & _
                                                        "Y el Número de Registro es el : " & Rst. AbsolutePosition + 1, vbInformation, "DATO ENCONTRADO"
                                                Else
                                                        Err.Clear
                                                End If
                                        End If
                                Next ElCampo
                                Rst.MoveNext
                                DoEvents
                        Loop
                Else
                        MsgBox "La tabla: " & NTabla.Name & " no tiene Registros", vbCritical, "TABLA SIN DATOS"
                End If
        End If
        DoEvents
Next NTabla
'DoCmd.Hourglass False   ''Descomentar cuando funcione el Código
Rst.Close
Set Rst = Nothing
Set NTabla = Nothing
Set ElCampo = Nothing
End Sub   'BuscaEnVariasTablas(ElTexto As String)

Para llamar al Procedimiento lo puedes hacer desde el After Update de un cuadro de Texto que puede llamarse por ejemplo TxtABuscar, en un Formulario

Private Sub TxtABuscar_AfterUpdate()
Call BuscaEnVariasTablas(Me.TxtAbuscar)
End Sub

Un saludo >> Jacinto

¡Gracias!  lo voy a probar

funciono... gracias..

mis datos son de 10 tablas y solo en 7 tablas (nombres de ejemplo: Tabla1, Tabla2,Tabla3,Tabla4,Tabla5,Tabla6,Tabla7)  y cada tabla tiene 10 columnas iguales y solo busque en (Ejemplo de Nombre de Columna: BENEFICIARIO,CONCEPTO,IMPORTE) como se acomodaría el código ???

Alberto: Te pongo el código modificado para elegir "las tablas". Te pongo una nota para que hagas algo similar con los "Campos" y así practicas un poco y con ello si te va dando errores, casi mejor, ya que te va a servir para el futuro. Si no lo logras, me comentas y mañana termino de adecuarte el código.

Public Sub BuscaEnVariasTablas(ElTexto As String)
Dim StrSQL As String
Dim NTabla As String
Dim Rst As DAO.Recordset
Dim ElCampo As DAO.Field
'JTJ: Pruebas para no recorrer todas las Tablas
Dim LasTablas As String
Dim MatrizTablas() As String
Dim I As Byte
LasTablas = "Productos, Proveedores, TAux, TClientes"
MatrizTablas() = Split(LasTablas, ",") 'JTJ Puede se cualquier separador,pero ha de coincidir con el de Origen
For I = 0 To UBound(MatrizTablas)
NTabla = MatrizTablas(I)
On Error Resume Next
'DoCmd.Hourglass True  'Descomentar cuando funcione el Código
        StrSQL = "SELECT * FROM " & NTabla & ";"
        Set Rst = CurrentDb.OpenRecordset(StrSQL, dbOpenSnapshot)
        If Not Rst.EOF And Not Rst.BOF Then
                Rst.MoveLast
                Rst.MoveFirst
                Do While Not Rst.EOF
                        'JTJ >> Si no se quiere buscar en todos los Campos: Recorrer los de una Matriz, con el diseño de la >> MatrizTablas**********
                        For Each ElCampo In Rst.Fields
                                If InStr(ElCampo.Value, ElTexto) > 0 Then
                                        If Err = 0 Then
                                                MsgBox "El texto buscado está en la Tabla : " & NTabla & vbCrLf & vbCrLf & _
                                                            "Y el Número de Registro es el : " & Rst. AbsolutePosition + 1, vbInformation, "DATO ENCONTRADO"
                                        Else
                                                Err.Clear
                                        End If
                                End If
                        Next ElCampo
                        Rst.MoveNext
                        DoEvents
                Loop
        Else
                MsgBox "La tabla: " & NTabla & " no tiene Registros", vbCritical, "TABLA SIN DATOS"
        End If
        DoEvents
Next I
'DoCmd.Hourglass False   ''Descomentar cuando funcione el Código
Rst.Close
Set Rst = Nothing
Set ElCampo = Nothing
End Sub   'BuscaEnVariasTablas(ElTexto As String)

Un saludo >> Jacinto

Respuesta

Para ello, ¿es necesario que todas las tablas tengan relaciones?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas