Cambiar campos vinculados en subformularios
No sé si se podrá hacer o quizá haya algo más fácil pero no he logrado hallar nada.
Tengo una base de datos de libros y deseo "filtrar" esos libros mediante varios campos (ID del libro, título, ISBN, etc.). Para esto he creado un formulario por cada caso pero no sólo es muy engorroso sino que hace más pesada innecesariamente la BdD.
¿Hay alguna forma de cambiar el campo principal y/o el campo secundario de vinculación entre el form principal (que tiene el campo de filtro) y el subform (que tiene el contenido a mostrar)?
1 Respuesta
Pon un cuadro combinado, llámalo por ejemplo cboSelCampo, al que que asignas los nombres de los campos por los que quieres filtrar.
Pon un cuadro de texto (txtBuscar) para escribir lo que vas a buscar.
Luego en el código de tu botón, en vez de hacer referencia a un campo concreto, lo haces al valor seleccionado en el combo.
Sería algo así:
1º/ Tipo de Origen de fila de cboSelCampo: Lista de valores. Origen de la fila: "ID";"ISBN";"Título";"Autor"...
2º/ Código del botón:
Private Sub cmdBuscar_Click() 'Definimos las variables Dim vCamp As String, vText As String Dim miFiltro As String 'Cogemos los valores seleccionados vCamp = Nz(Me.cboSelCampo.Value, "") vText = Nz(Me.txtBuscar.Value, "") 'Si no hay valor en el combo o en el textbox sale del proceso If vCamp = "" Or vText = "" Then Exit Sub 'Distinguimos si se ha elegido el campo [ISBN] If vCamp = "ISBN" OR vCamp="ID" Then 'Creamos el filtro para una coincidencia exacta miFiltro = "[" & vCamp & "]='" & vText & "'" Else 'Si es cualquier otro campo creamos el filtro por aproximación miFiltro = "[" & vCamp & "] LIKE '* " & vText & " *' OR" miFiltro = miFiltro & "[" & vCamp & "] LIKE '" & vText & "*' OR " '1ª Palabra empieza por... miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "*' OR " miFiltro = miFiltro & "[" & vCamp & "] LIKE '" & vText & "*' OR " miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "' OR " miFiltro = miFiltro & "[" & vCamp & "]= '" & vText & "'" End If 'Aplicamos el filtro al subformulario Me.NombreSubformulario.Form.Filter = miFiltro 'Activamos el filtro Me.NombreSubformulario.Form.FilterOn = True End Sub
Sólo tienes que adaptarlo a tus nombres.
Le he dado vueltas al tema y no logro obtener el resultado. Sin duda, es mi falta de conocimiento.
El form más representativo de lo que necesito es este:
Como verás, tengo botones de opción que lo único que hacen es cerrar el form de origen y abrir el que contiene el filtro en cuestión. El campo de filtrado en todos los forms donde uso un TextBox, combobox o lo que sea se llama txtFiltro y vincula el subformulario que se muestra en forma de tabla de acuerdo a si lo que busco es por ISBN, ID del libro (en imagen), calidad y rotura.
Entonces, si hay alguna forma de, por ejemplo, seleccionar un botón de opción y que el campo secundario de vinculación en el subformulario se adecué a ello, sería lo que necesito. De esta forma, elimino 3 formularios. Y al adecuar esto a otros, podría eliminar hasta 12 formularios más, y añadir más filtros a mis formularios generales.
El método que te propuse es mucho más sencillo que lo que pretendes, y sólo te exige tener un formulario y un subformulario. Te lo explico con más detalle:
1º/ Creas un formulario que tendrá "la cabecera" e incluirá el formulario del punto 2 como subformulario. Esto ya lo tienes
2º/ Creas un formulario sobre la tabla/consulta que me muestre todos los datos que quieres mostrar (esto ya lo tienes hecho, coge uno de los subformularios que ya tienes, porque imagino que tendrán todos los mismos campos...). Supongamos que le llamas subFResultados.
3º/ Insertas en el formulario principal el subformulario, pero no lo vincules por ningún campo. Le cambias su propiedad Visible a No.
4º/ Supongamos que los valores que devuelve tu marco de opciones (le llamará mrcCampos) son: 1->para Libro, 2->para ISBN, 3->para Calidad y 4-> para Rotura, y que el cuadro de texto se llama txtBuscar. El código anterior (código del botón), pero adaptado a estos nombres y al marco de opciones sería:
Private Sub cmdBuscar_Click() 'Definimos las variables Dim vCamp As String, vText As String Dim miFiltro As String 'Cogemos los valores seleccionados vCamp = Nz(Me.mrcCampos.Value, "") vText = Nz(Me.txtBuscar.Value, "") 'Si no hay valor en el marco o en el textbox sale del proceso If vCamp = "" Or vText = "" Then Exit Sub 'Coges el campo en función del marco Select Case Me.mrcCampos Case 1 '1->Libro (ID) vCamp="ID" Case 2 '2->ISBN vCamp="ISBN" Case 3 '3->Calidad vCamp="Calidad" Case 4 vCamp="Rotura" 'Añade tantos cases como necesites, siguiendo el esquema End Select 'Distinguimos si se ha elegido un campo que busques por coincidencia exacta 'en este caso ISBN e ID (los otros no sé cómo son) If vCamp = "ISBN" OR vCamp="ID" Then 'Creamos el filtro para una coincidencia exacta miFiltro = "[" & vCamp & "]='" & vText & "'" Else 'Aquí podrían ir Titulo, Autor... 'Si es cualquier otro campo creamos el filtro por aproximación miFiltro = "[" & vCamp & "] LIKE '* " & vText & " *' OR" miFiltro = miFiltro & "[" & vCamp & "] LIKE '" & vText & "*' OR " '1ª Palabra empieza por... miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "*' OR " miFiltro = miFiltro & "[" & vCamp & "] LIKE '" & vText & "*' OR " miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "' OR " miFiltro = miFiltro & "[" & vCamp & "]= '" & vText & "'" End If 'Aplicamos el filtro al subformulario Me.subFResultados.Form.Filter = miFiltro 'Activamos el filtro Me.subFResultados.Form.FilterOn = True 'Muestras el subformulario para ver los resultados Me.subFResultados.Form.Visible=True End Sub
A ver si te sale, si no mañana te preparo un ejemplo.
Un saludo.
Un nuevo foro de access, visítanos: http://nksvaccessolutions.com/Foro/
Probé lo que me indicas y ha sucedido lo siguiente:
Los botones de opción no se tornan seleccionables. No puedo pasar de uno a otro.
Pero dejando, para probar, la opción predeterminada 'Libro', el clic en el botón me devuelve error '3709 La clave de búsqueda no se encontró en ningún registro'.
Sobre la línea:
'Aplicamos el filtro al subformulario Me.subFResultados.Form.Filter = miFiltro
Seguramente haya algo mal en la construcción del filtro. Verifica que los nombres que usé dentro de Select sean realmente los que tienes en tu BD (yo eso no lo puedo saber).
Verifica también que el subformulario (el control subformulario, no el formulario que hace de subformulario) se llama subFResultados.
Te dejo el ejemplo prometido (con menos campos) y dos opciones: la primera que te comentaba, con un cuadro combinado para seleccionar el campo, y la segunda con un marco de opciones. http://www.filebig.net/files/hevbCCigsZ
He probado. Funcionó con lo que corresponde a Estado y al ISBN. Obtiene resultados correctos. Pero en ID (Libro) y Calidad no obtiene resultados. En ID busca el ID del libro y el otro muestra la calidad del ejemplar: Tapa dura, rústica, de bolsillo...
En ID me vuelve a marcar exactamente el mismo error.
Te paso una porción del trabajo. He quitado forms y tablas irrelevantes.
https://mega.nz/#!gJ4D3bRR!knBtNOfsNUoecg0GrFqMuHYWqhF28Rp1_aHClVmOwvU
No puedo abrir tu archivo con access 2007, por lo que hasta la tarde-noche no lo podré mirar.
Pero te doy unas indicaciones sobre lo que has de cambiar del código que te pasé al tuyo:
1º/ En el Select Case Me. MrcCampos, en cada case tienes que poner el valor que te devuelve cada botón de opción (de 1 a ... si no los cambiaste) y en cada caso asignar a la variable vCamp el nombre exacto que tiene el campo en tu tabla/consulta origen del formulario que hace de subformulario.
2º/ En el Select Case vCamp, que es donde creas el filtro, tienes que distinguir 3 casos:
a) Búsqueda por coincidencia exacta para un campo numérico, como puede ser ID:
miFiltro = "[" & vCamp & "]=" & vText
Ó en vez de usar la variable vCamp (que contiene el nombre del campo), lo pones directamente:
miFiltro = "[ID]=" & vText
b) Búsqueda por coincidencia exacta para un campo de texto, como puede ser ISBN (si lo tienes definido como texto en la tabla):
miFiltro = "[" & vCamp & "]='" & vText & "'"
miFiltro = "[ISBN]='" & vText & "'"
Fíjate que la diferencia está en que los valores de texto tienen que ir entre comillas simples.
c) Búsqueda por aproximación para un campo de texto, como puede ser Autor:
miFiltro = "[" & vCamp & "] LIKE '*" & vText & "*'"
o si lo quieres más completo:
miFiltro = "[" & vCamp & "] LIKE '* " & vText & " *' OR"
miFiltro = miFiltro & "[" & vCamp & "] LIKE '" & vText & "*' OR "
miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "*' OR "
miFiltro = miFiltro & "[" & vCamp & "] LIKE '" & vText & "*' OR "
miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "' OR "
miFiltro = miFiltro & "[" & vCamp & "]= '" & vText & "'"
Cada una de estas 3 opciones la pondrías en un Case del Select, por ejemplo
Select Case vCamp
case "ID" 'seria el caso a
miFiltro=...
Case "ISBN" 'Sería el caso b
miFiltro=...
Case "Autor","Titulo","Original 'seria el caso c
miFiltro=...
End Select
Como ves, en cada case, puedes poner, separados por comas, todos los campos que se incluyan en cada caso. Si lo haces así, has de usar la opción que lleva el vCamp en vez del nombre concreto del campo.
Con estas indicaciones, tendrías que ser capaz de adaptar el ejemplo a tu caso concreto.
Si no lo consigues, por la noche veo lo que me mandas y te digo.
Te devuelvo la BD: http://www.filebig.net/files/2yFQNZCJsX
Como comentarios decirte que el fallo al buscar por Id lo tienes explicado arriba (tienes que distinguir el caso a del b) y a mí sí me funciona la búsqueda por Calidad sin problemas.
¡GENIAL! Eres un genio.
Ahora a analizar el código con mayor detenimiento y adaptarlo a lo que necesito.
Este trabajo que me ha llevado meses empezó viendo 'que pasa si'... Los tutos hechos por personas como tú simplemente ayudan a los que no sabemos a resolver problemas.
¡MUCHÍSIMAS GRACIAS! Hasta resuelto otro gran embrollo en el que yo mismo me he metido.
Vuelve el perro arrepentido... Y mil perdones por volver a molestarte.
Ha funcionado de maravilla en donde pude aplicar el mismo método. Pero en otros forms se me presenta un problema diferente y similar a la vez:
Cada botón de opción representa el propio filtro (en, por ejemplo, el form Con_Check_Selec_Antol del ejemplo que te pasé). Es decir, botón de opción 1 mostrará sólo los libros marcados como 'Leídos' en el subformulario.
¿Cómo puedo hacer ese filtro?
Al cambiar de botón de opción, el grupo adopta un valor entre 1 y 5 (¿puede adoptar otros valores?) y debe generar que se filtren los libros Leídos, best-Sellers, favoritos, etc.
No acabo de entender lo que me dices, pero lanzo un par de ideas al aire.
Para hacer un filtro por un campo Tipo Sí/No (como Leido), necesitas otro case distinto en el select, que sería
Case "Leido","Best-Seller"
miFiltro = "[" & vCamp & "]=True"
El valor de los botones de opción (siempre que estén dentro de un marco de opciones) le puedes asignar tú los que quieras, no tienen por qué empezar siempre en 1. Se los puedes cambiar si sacas sus propiedades, vas a la pestaña Datos y modificas "valor de la opción".
En el formulario que mencionas, los botones no forman parte de un marco de opciones y no tienes esa posibilidad
- Compartir respuesta