Cuadro combinado filtra formulario como?

Tengo dos formularios (f1 y f2) independientes. En f1 hay un cuadro combinado con 3 opciones me gustaría programar que en función de la elección que haga en el cuadro combinado de f1, f2 se me filtren los resultados. De las 3 opciones 1 me gustaría que no filtrará nada y se puedan ver todos los registros, con la 2ª opción seleccionada en el cuadro combinado de f1, en f2 se me vayan a mostrar solo los resultados que tienen asociado la 2ª opción a su registro y lo mismo que la 2ª para la 3ª opción del cuadro combinado. No sé si podría ser o yo no me explico muy bien. Si puede ser explicado casi paso a paso, tengo algo de conocimientos pero esto se me escapa un poco.

1 respuesta

Respuesta
2

Supongamos que tu cuadro combinado se llama cboFiltroProvincia y sus opciones son "Todas","Madrid"y "Barcelona". Supongamos que tienes un botón en F1 para abrir fF2

En el evento "Al hacer click" del botón, le generas este código:

Select Case Me.cboFiltroProvincia
    Case "Todas"
        DoCmd.OpenForm "F2"  'Abres sin filtrar
    Case "Madrid","Barcelona"
        DoCmd.OpenForm "F2",,,"Provincia='" & Me.cboFiltroProvincia & "'" 'Filtras por el valor elegido
    Case Else
        MsgBox "No es un valor válido", vbCritical,"ERROR
End Select

Un saludo


pongo el código en el botón y siempre me manda al CASE ELSE, es como si no leyera las opciones del cuadro combinado, decir que el formulario es independiente y el cuadro combinado creo que también. No se si me puedes ayudar, gracias.

Tendría que saber el origen de los valores del cuadro combinado para poder decirte...

Viene de un tabla llamada TPrueba con sus registros de texto llamados USER y PASS y su código es: SELECT [TPrueba].[USER] FROM [TPrueba]; cboIden

Me explico un poco más, en f1 escojo como dices, todas, madrid, barcelona, f2 es un formulario con cuadros combinados y cuadros de texto que traen información sobre esas ciudades, me gustaría que cuando escoja madrid, y me abra f2, este formulario solo me muestre los registros relacionados con madrid. Espero que me puedan ayudar. Gracias

Pues si realmente lo tienes así, el código propuesto te tiene que funcionar.

Si quieres saber qué valor devuelve el cuadro combinado en cada caso, pon MsgBox Me. CboFiltroProvincia, y los valores que te devuelva son los que has de usar en los distintos "Case".

Si pones aquí el código que usas, quizás vea lo que te falla...

Ok, el código me funciona pero no me filtra, es como si no hiciera nada, f2 es como tu ejemplo de formulario de formularios independientes 1, con este código al abrir que igual puede ser culpa:

Private Sub Form_Load()

    Set rsDatos = CurrentDb.OpenRecordset("SELECT * FROM TDatos", dbOpenDynaset)

    misRegistros = rsDatos.RecordCount

    If misRegistros = 0 Then  ' Si no hay registros

        bolNuevo = True

        modoLectura False

        Me.EXPEDIENTE.SetFocus

    Else

        modoLectura True

    End If

End Sub

Y lo que me gustaría en el botón de aceptar en f1 para llevarme a f2 es que ademas del código de filtrar:

Private Sub Comando7_Click()

Select Case Me.cboUser.Value

    Case "Todas"

        DoCmd.OpenForm "F2"  'Abres sin filtrar

    Case "Madrid"

        DoCmd.OpenForm "F2", , , "Tuser='" & Me.cboUser & "'" 'Filtras por el valor elegido

    Case "Barcelona"

        DoCmd.OpenForm "F2", , , "Tuser='" & Me.cboUser & "'"

    Case Else

        MsgBox "No es un valor válido", vbCritical, "ERROR"

End Select

End Sub

Y además tenga el código(este me funciona perfectamente) para acceder con contraseña por elección también en combobox:

Dim vUser As Variant

    Dim vPass As Variant

    vUser = Me.cboUser.Value

    vPass = Me.txtpass.Value

    If IsNull(vUser) Then

        MsgBox "No ha seleccionado ningún usuario", vbInformation, "AVISO"

        Me.cboUser.SetFocus

        Exit Sub

    End If

    If IsNull(vPass) Then

        MsgBox "No ha introducido ninguna contraseña", vbInformation, "AVISO"

        Me.txtpass.SetFocus

        Exit Sub

    End If

    Dim rst As Recordset

    Set rst = CurrentDb.OpenRecordset("TPrueba", dbOpenSnapshot)

    If rst.RecordCount = 0 Then

        MsgBox "No existen usuarios", vbInformation, "AVISO"

        GoTo Salida

    End If

    rst.MoveFirst

    Do Until rst.EOF

        Dim Tuser, Tpass As String

        Tuser = rst.Fields(0).Value

        Tpass = rst.Fields(1).Value

        If Tuser = vUser Then

            If Tpass = vPass Then

                DoCmd.Close acForm, Me.Name

                DoCmd.OpenForm "F2"

            Else

                MsgBox "La contraseña introducida no es correcta", _

                    vbInformation, "INCORRECTO"

                Me.txtpass.SetFocus

                Me.txtpass.Value = Null

                GoTo Salida

            End If

        End If

       rst.MoveNext

    Loop

Salida:

    rst.Close

    Set rst = Nothing

End Sub

Espero que no sea muy engorroso y puedas ayudarme con el tema del filtrado de f2 a raiz de elección de un combox en f1, gracias.

F2 es como tu ejemplo de formulario de formularios independientes 1

Si hubieses empezado por ahí, te habría dado la solución a la primera, porque al ser los formularios independientes, es imposible que te filtre directamente sobre el formulario... Y de momento adivino no soy para saber cómo son las BDs de los usuarios que preguntan, jejeje...

Verás, con esta linea (Set rsDatos = CurrentDb.OpenRecordset("SELECT * FROM TDatos", dbOpenDynaset)), al abrir el formulario f2, cargas (en una variable rsDatos, que no en el formulario) todos los registros de la tabla TDatos, y luego más adelante (con cargaDatos) los vas mostrando en los controles del formulario.

Si quisieras filtrar solo los de "Madrid", la linea anterior tendría que ser:

Set rsDatos = CurrentDb.OpenRecordset("SELECT * FROM TDatos WHERE Provincia='Madrid'", dbOpenDynaset)

¿Ves por dónde voy?

Lo que has de hacer es comprobar, en el form_load de f2, varias cosas:

1º/ si f1 está cargado o no: si no lo está, cargas en el recordset todos los registros, y si lo está compruebas lo siguiente.

2º/ si el combo tiene un valor "todos" o no: si lo tiene, cargas todos los registros de la tabla, si no, cargas solo los del usuario (o provincia, o lo que quieras filtrar) seleccionado.

A ver si te sale.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas