Como buscar registros con dos condiciones

Tengo un código, que cogí de otra página que me funciona muy bien, tengo un TextBox que meto un valor y busca por varias columnas de cada registro y me lo pasa a una tabla, que a su vez me lo muestra en un formulario. En el formulario elijo uno de los registros, me lo filtra y me lo muestra en el formulario principal.

Lo que yo quiero hacer en poner otro TxtBox para pasar otra condición si lo deseo, y si no deseo pasar otra condición, que funcione como ahora. ¿Me podés ayudar a modificar el código? O alguna idea como tengo que hacerlo. Gracias

Os copio el código.

'Declaramos las variables
    Dim elValor As String
    Dim elValor2 As String
    Dim miSql As String
    Dim i As Long
    Dim a As Long
    Dim losCampos(1 To 3) As String
        'Cogemos el valor del textbox
    elValor = Nz(Me.TxtBuscar.Value, "")
    elValor2 = Nz(Me.TxtBuscar2.Value, "")
        'Si no hay valor salimos
    If elValor = "" Then Exit Sub
        'Eliminamos los valores que pudiera haber en TAux
    CurrentDb.Execute ("DELETE FROM IdentificadosBuscar")
        'Nos rellenamos la matriz con los nombres de los campos
        'sobre los que queremos realizar la búsqueda en TClientes
    losCampos(1) = "Nombre"
    losCampos(2) = "Apellidos"
    losCampos(3) = "N_DNI"
        'Como vamos a buscar sobre 3 campos realizamos un bucle FOR con
        '3 pasadas
    For i = 1 To 3
            'Creamos la SQL que buscará sobre los sucesivos campos
        miSql = "INSERT INTO IdentificadosBuscar (IdAux, NombreAux, ApellidosAux, F_NacimientoAux, N_DNIAux, ApodoAux)" _
            & " SELECT Identificados.Id_Identificado, Identificados.Nombre, Identificados.Apellidos," _
                        & " Identificados.Fecha_Nacimiento, Identificados.N_DNI, Identificados.Apodo FROM Identificados" _
                        & " WHERE Identificados.[" & losCampos(i) & "] LIKE '*" & elValor & "*'"
            'Ejecutamos la consulta
        CurrentDb. Execute (miSql)
    Next i
        'Abrimos el formulario de resultados. Nos aseguramos de abrirlo en modo
 'sólo lectura para que no se puedan modificar los datos.
    DoCmd. OpenForm "IdentificadosBuscar",,,, acFormReadOnly

Se me ocurre declarar otra variable, que recoja el valor del nuevo TextBox, pero no como pasarlo por el for y modificar la consulta sql

2 respuestas

Respuesta
2

Jesús: Una solución en alguna más es repetir el Bloque:

For I = 1 To 3 , para otra Variable que puedes llamar ElValor2 y que sea la que tome lo que haya en tu segundo TexBox. Mis saludos >> Jacinto

Jesús: Se me ha olvidado comentarte, aunque supongo lo tendrás en cuenta, que la parte de arriba de ese código, si dejas en blanco el TxtBuscar, aunque informes el TxtBuscar2, no te va a hacer nada, porque te saltará en la línea:

If elValor = "" Then Exit Sub

Controla los Nulos ovacios de otro modo, y si de momento ves que te vas a complicar, dejalo así y ten en cuenta de llenar siempre TxBuscar. Un saludo >> Jacinto

Respuesta
2

También puedes modificar la SQL para añadirle en el WHERE el otro criterio cuando lo haya:

If elValor2<>"" Then miSQL=miSQL & " AND ....."

y pones el segundo criterio (o con OR, si fuera el caso)

Eso lo harías dentro del propio For Next.

Un saludo


Muchas gracias a los dos me habéis ayudado mucho, os paso el código para que veáis como lo llevo. Ya me funciona más o menos.  Con el if paso la condición de si el segundo TextBuscar2 tiene contenido o no. Eso me funciona bien. Pero en la segunda opción, tal como lo he puesto me podría valer, lo que en realidad quiero es que pase el primer valor (TextBuscar) y  si pongo el segundo (TextBuscar2) el registro cumpla los dos requisitos, vamos usar AND, pero no consigo hacer correctamente bien la consulta conSQL

'Declaramos las variables
    Dim elValor As String
    Dim elValor2 As String
    Dim miSql As String
    Dim i As Long
    Dim a As Long
    Dim losCampos(1 To 5) As String
        'Cogemos el valor del textbox
    elValor = Nz(Me.TxtBuscar.Value, "")
    elValor2 = Nz(Me.TxtBuscar2.Value, "")
        'Si no hay valor salimos
    If elValor = "" Then Exit Sub
        'Eliminamos los valores que pudiera haber en TAux
    CurrentDb.Execute ("DELETE FROM IdentificadosBuscar")
        'Nos rellenamos la matriz con los nombres de los campos
        'sobre los que queremos realizar la búsqueda en TClientes
    losCampos(1) = "Nombre"
    losCampos(2) = "Apellidos"
    losCampos(3) = "N_DNI"
    losCampos(4) = "Fecha_Nacimiento"
    losCampos(5) = "Apodo"
        'Como vamos a buscar sobre 5 campos realizamos un bucle FOR con
        '5 pasadas
        'Con el if condiciono si hay valor en el TxtBuscar2 o no
    If elValor2 = "" Then
    For i = 1 To 5
            'Creamos la SQL que buscará sobre los sucesivos campos
        miSql = "INSERT INTO IdentificadosBuscar (IdAux, NombreAux, ApellidosAux, F_NacimientoAux, N_DNIAux, ApodoAux)" _
            & " SELECT Identificados.Id_Identificado, Identificados.Nombre, Identificados.Apellidos," _
                        & " Identificados.Fecha_Nacimiento, Identificados.N_DNI, Identificados.Apodo FROM Identificados" _
                        & " WHERE Identificados.[" & losCampos(i) & "] LIKE '*" & elValor & "*'"
            'Ejecutamos la consulta
        CurrentDb.Execute (miSql)
    Next i
    Else
    For a = 1 To 5
            'Creamos la SQL que buscará sobre los sucesivos campos
        miSql = "INSERT INTO IdentificadosBuscar (IdAux, NombreAux, ApellidosAux, F_NacimientoAux, N_DNIAux, ApodoAux)" _
            & " SELECT Identificados.Id_Identificado, Identificados.Nombre, Identificados.Apellidos," _
                        & " Identificados.Fecha_Nacimiento, Identificados.N_DNI, Identificados.Apodo FROM Identificados" _
                        & " WHERE Identificados.[" & losCampos(a) & "] LIKE '*" & elValor2 & "*'"
    Next a
    For i = 1 To 5
        miSql = "INSERT INTO IdentificadosBuscar (IdAux, NombreAux, ApellidosAux, F_NacimientoAux, N_DNIAux, ApodoAux)" _
            & " SELECT Identificados.Id_Identificado, Identificados.Nombre, Identificados.Apellidos," _
                        & " Identificados.Fecha_Nacimiento, Identificados.N_DNI, Identificados.Apodo FROM Identificados" _
                        & " WHERE Identificados.[" & losCampos(i) & "] LIKE '*" & elValor2 & "*'"
            'Ejecutamos la consulta
        CurrentDb.Execute (miSql)
    Next i
    End If
        'Abrimos el formulario de resultados. Nos aseguramos de abrirlo en modo
        'sólo lectura para que no se puedan modificar los datos.
    DoCmd.OpenForm "IdentificadosBuscar", , , , acFormReadOnly

Lo de repetir el segundo For Next, ¿Fue un error de pegado? Porque no le veo sentido.

Tampoco le veo mucho sentido al proceso que usas de búsqueda, porque lo encuentro deficiente: si en el cuadro de texto pones una fecha, es obvio que no te va a encontrar coincidencias en los campos, Nombre, Apelliods, DNI... Lo mismo se pones un DNI, no te encontrará coincidencias en Fecha Nacimiento, Nombre...

Y si le añades dos condiciones, el proceso es aún menos eficiente, pues tiene que buscar en todas las combinaciones de los 5 campos, de las que solo una de las 25 posibles te devolverá resultados. Por ejemplo: si pones una Fecha y un DNI, solo obtendrás coincidencias en una de las consultas como mucho.

Yo optaría por un filtro múltiple, como este de Neckkito: http://siliconproject.com.ar/neckkito/index.php/component/content/article/93-ejemplos-explicados/ejemplos-de-formularios/194-crear-un-filtro-multiple 

Pero bueno, tus motivos tendrás para hacerlo así. Este sería tu código adaptado:

'Declaramos las variables
    Dim elValor As String
    Dim elValor2 As String
    Dim miSql As String
    Dim i As Long
    Dim a As Long
    Dim losCampos(1 To 5) As String
        'Cogemos el valor del textbox
    elValor = Nz(Me.TxtBuscar.Value, "")
    elValor2 = Nz(Me.TxtBuscar2.Value, "")
        'Si no hay valor salimos
    If elValor = "" Then Exit Sub
        'Eliminamos los valores que pudiera haber en TAux
    CurrentDb.Execute ("DELETE FROM IdentificadosBuscar")
        'Nos rellenamos la matriz con los nombres de los campos
        'sobre los que queremos realizar la búsqueda en TClientes
    losCampos(1) = "Nombre"
    losCampos(2) = "Apellidos"
    losCampos(3) = "N_DNI"
    losCampos(4) = "Fecha_Nacimiento"
    losCampos(5) = "Apodo"
    'Como vamos a buscar sobre 5 campos realizamos un bucle FOR con
        '5 pasadas
    For i = 1 To 5
        'Creamos la SQL que buscará sobre los sucesivos campos
        miSql = "INSERT INTO IdentificadosBuscar (IdAux, NombreAux, ApellidosAux, F_NacimientoAux, N_DNIAux, ApodoAux)" _
                    & " SELECT Identificados.Id_Identificado, Identificados.Nombre, Identificados.Apellidos," _
                    & " Identificados.Fecha_Nacimiento, Identificados.N_DNI, Identificados.Apodo FROM Identificados" _
                    & " WHERE Identificados.[" & losCampos(i) & "] LIKE '*" & elValor & "*'"
        If elValor2 = "" Then
             'Ejecutamos la consulta
            CurrentDb.Execute (miSql)
        Else
            For a = 1 To 5
                miSql = miSql & " AND Identificados.[" & losCampos(a) & "] LIKE '*" & elValor2 & "*'"
                 'Ejecutamos la consulta
                CurrentDb.Execute (miSql)
            Next a
        End If
    Next i
        'Abrimos el formulario de resultados. Nos aseguramos de abrirlo en modo
'sólo lectura para que no se puedan modificar los datos.
    DoCmd. OpenForm "IdentificadosBuscar",,,, acFormReadOnly

Un saludo


Añade tu respuesta

Haz clic para o

Más respuestas relacionadas