ACCESS - Macro para buscar un registro en varias tablas

Me gustaría si seria posible crear una macro en Access para buscar un registro en varias tablas. Todas estas tablas tienen los mismos campos. La idea es hacer un pequeño formulario para buscar dicho registro, con un objeto del tipo textbox y un botón. Se inserta el texto que se quiere buscar en campo de txt box y al clicar el botón que corra la macro y salte un Msgbox con el nombre de la tabla donde se encuentra dicho registro. El campo de búsqueda seria de tipo texto.

Una idea que se me occure es crear una tabla nueva, crear consultas de adici'on en dicha tabla todos los registros de las diferentes tablas con un campo anadido que seria el nombre de la tabla donde se encuentra dicho registro, y después crear una macro sencilla de búsqueda sobre esta nueva tabla. El problema de esto es que ahora mismo tengo 22 tablas, con la idea de acabar con 50. Tener que crear 50 consultas de adición me parece un poco absurdo. ¿Alguien tiene alguna idea?

1 respuesta

Respuesta
2

Yo haría un consulta de totales sobre todas tus tablas, ya que tienen la misa estructura, y añadiría a cada una un campo nuevo con el nombre de la tabla:

SELECT Campo1, Campo2, Campo3, ...., Campo X, "Tabla1" AS NombreTabla FROM Tabla1

UNION ALL

SELECT Campo1, Campo2, Campo3, ...., Campo X, "Tabla2" AS NombreTabla FROM Tabla2

UNION ALL

...

UNION ALL

SELECT Campo1, Campo2, Campo3, ...., Campo X, "TablaX" AS NombreTabla FROM TablaX

Luego haría la búsqueda en esa consulta.

Ahora bien, a tu planteamiento le veo un "fallo": dices que quieres un cuadro de texto para poner el valor a buscar y un botón, pero ¿en qué campo quieres buscar ese valor? ¿En uno concreto o en todos?

La pregunta no es banal, pues sabiendo eso se puede optimizar la consulta de totales para que se cargue más rápido.

También me queda la duda de si el valor puede estar en más de una tabla.

Un saludo.


Buenas Sveinbjorn El Rojo !

Mil gracias por tu respuesta! La verdad es que la consulta funciona a la perfección, y en el momento que la uso como fuente de datos para el list box queda perfecto. Ahora, la idea que ten'ia en la cabeza para encontrar dicho registro se me ha ido al garete o no se como solucionarlo. A ver que opinas tu.

En dicho formulario de búsqueda hay tres objetos, un Combobox, un Textbox y un ListBox.

El Combobox (Combo1) tiene como RowSource cualquiera de las tablas que se han usado para la consulta. El RowSourceType los campos de dicha tabla.

El Textbox (Text14) seria para insertar el valor buscado

El Listbox (List6) seria la lista de todos los valores que conicieran con el Textbox (Text14)

Lo ideal seria que la lista se actualizara cada vez que anadiera o cambiara algún carácter del Textbox. Con el evento sobre el Textbox (Text14) afterchange creo que seria posible, pero al tener una consulta de union no tengo ni idea de como hacerlo, si fuera directamente sobre una tabla no tendría problemas. ¿Alguna idea? Quizás creando una tabla con los registros resultantes de la consulta de union...

En el pasado lo había solucionado así:

Dim consulta As String
    If Not IsNull(Me.Combo4) Then
        consulta = "SELECT Villas.ID, Villas.Villa_Number, Villas.Guest_Name, Villas.Departure_Date, Villas.Excursion, Villas.booked_by, Villas.Liability FROM Villas"
        consulta = consulta & " WHERE " & Me.Combo4 & " Like '*" & Me.Text0 & "*'"
        Me.List2.RowSource = consulta
    End If
End Sub
Private Sub Text0_Change()
    If IsNull(Me.Combo4) Then
    MsgBox "Select field to search", vbInformation, "WARNING"
    Me.Text0 = Null
    Me.Combo4.SetFocus
    Else
    Me.List2.SetFocus
    Me.Text0.SetFocus
    Me.Text0.SelStart = 100
    End If
End Sub

¿Tienes alguna idea mejor?

Gracias por adelantado!

Si te he entendido bien, aprovechando el código al máximo y suponiendo que tienes las tablas Villas y Ciudades:

consulta = "SELECT Villas.ID, Villas.Villa_Number, Villas.Guest_Name, Villas.Departure_Date, Villas.Excursion, Villas.booked_by, Villas.Liability, "Villas" AS Tabla FROM Villas"
consulta = consulta & " WHERE " & Me.Combo4 & " Like '*" & Me.Text0 & "*'"
consulta = consulta & " UNION ALL "
consulta = consulta & "SELECT Ciudades.ID, Ciudades.Villa_Number, Ciudades.Guest_Name, Ciudades.Departure_Date, Ciudades.Excursion, Ciudades.booked_by, Ciudades.Liability, "Ciudades" AS Tabla FROM Ciudades"
consulta = consulta & " WHERE " & Me.Combo4 & " Like '*" & Me.Text0 & "*'"
Me.List2.RowSource = consulta

Como ves la idea es hacer "al vuelo" la consulta de UNION, teniendo en cuenta que en cada tabla que forma parte de la consulta de unión has de poner el WHERE, y se la asignas al cuadro de lista.

Permíteme un apunte para que la actualización de la lista se realice correctamente: si usas el evento "al cambiar" (change, que no afterchange), has de usar la propiedad .Text del control y no .Value (que es la predeterminada si no le indicas ninguna), es decir, que los WHERE te quedarían:

consulta = consulta & " WHERE " & Me.Combo4 & " Like '*" & Me.Text0.Text & "*'"

Por otro lado, comentarte que las consultas funcionan exactamente igual que las tablas, asi que lo que saber hacer con una tabla, lo saber hacer con una consulta.

Gracias Sveinbjorn El Rojo !

Aun no lo he probado, pero debería funcionar. Por lo menos lo he entendido perfectamente, je je. El tema es que el SQL para consultas aun no lo había tocado, y con una tabla que ya tiene todos los valores una sola "operacion" de SQL sin problemas, a la que son múltiples operaciones y con diferentes condiciones no tenia muy claro como hacerlo.

MIL GRACIAS! Seguro que ahora lo resuelvo en un periquete!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas