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
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.
"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;
- Compartir respuesta
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
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
- Compartir respuesta
- Compartir respuesta
Adri: No es necesaria esa vinculación en éste caso concreto. Un saludo >> Jacinto - Jacinto Trillo Jareño