Filtros modificables por el usuario

Siento molestar... Querría saber si me podrías echar una
mano con una base de datos. El problema que tengo es el
siguiente:
Tengo un formulario principal donde tengo textbox y cmb como por
ejemplo provincia, localidad, programa, numero de empleados
entre 'z' y 'Y', Convenio... Y tengo un botón que le he llamado
listado donde pulsándolo voy a un formulario donde están los
registros por los que quiero filtrar por los parámetros
introducidos en el formulario anterior. No se como hacerlo. He
probado a poner en el formulario de los registros, en origen de
control en cada campo poniendo el valor del textbox del otro
formulario o *, pero si algún campo se lo mando vacío por que en
ese momento no quiero filtrarlo por ese campo sino por otros o
por ninguno, no me muestra ningún dato, por que por lo visto
esta intentando buscar por vacío y no encuentra datos. Es decir
no se en que momento voy a necesitar buscar por una serie de
parámetros o ninguno. También he intentado en los textbox poner
valor por defecto * y en el origen de control poner solo el
valor del textbox, pero no funciona(no lo entiendo).
No se si me he explicado bien. Te agradecería un montón cualquier
tipo de ayuda o consejo que podrías darme. Gracias de antemano y
disculpe las molestias.

1 Respuesta

Respuesta
1

La solución que te doy se basa en una premisa: el formulario donde están los registros tiene su origen en una consulta. Si no es así deberías adaptarlo para que te funcione con esta sistemática, porque hacerlo por VB, si hay muchos campos de filtro, es una locura.

Te lo explico sólo con un campo ([provincia]), pero la mecánica es extrapolable al resto de campos.

Supongamos que tu formulario Principal se llama FPpal.

Te vas a la consulta y te sitúas en la línea de criterios correspondiente a la columna del campo [provincia]. Ahí escribes la siguiente expresión:

Como SiInm(EsNulo([Forms]![FPpal].[txtProvincia].[value]);"*";[Forms]![FPpal].[txtProvincia].[value])

Teniendo en cuenta que txtProvincia es el nombre del control, no el título. Para verlo te vas, en FPpal, al text box, sacas sus propiedades y -> Pestaña Otras -> Nombre.

Eso te debería filtrar por el valor del textbox, y si no hay valor te debería mostrar todos los registros.

Hola!

lo que me diste estuvo muy bien, si no es mucho pedir me gustaría que me dijeses como puedo introducirlo en el campo numero empleados, por que en el formulario principal pido que el numero de empleados este entre dos números.

El problema que me da el código que me diste, que en los registros tengo campos que no están rellenados como por ejemplo el convenio de la empresa(no tengo introducido en ningún registro) al introducir el código que me diste no me funciona, solo funciona en los registros que tienen ese campo rellenado.

Vamos por partes:

Los filtros con múltiples campos SIEMPRE dan problemas. Yo desaconsejo su utilización si son más de tres (tres porque permite un código VB complicado pero factible). Aún no me encontrado con la BD que, de inicio, no dé problemas con filtros con tantos campos.

Dicho lo anterior...

El código filtra por valores de tipo texto (String). De ahí que utilicemos el LIKE (Como) como pre-evaluador de la expresión IIF (SiInm).

Con los números, al ser precisamente números, y no cadenas de texto, la cosa se complica. Para poder filtrar por esos números debemos recurrir a un "truco"... yo diría más bien un apaño: debemos "inventarnos" los límites inferior y superior del rango.

Con el límite inferior no hay problema: será cero.

Con el límite superior debes pensar en un valor que nunca podrá ser superado por un valor existente en un registro. Supongamos que piensas que el número de empleados NUNCA podrá ser superior a 100000 (por ejemplo). Pues ese es el valor que utilizaremos.

La expresión pues debería quedarte:

>=<span class="scayt-misspell" data-scayt_word="SiInm" data-scaytid="208">SiInm</span>(EsNulo([Forms]![FPpal].[txtNumEmpleadosInf].[value]);0;[Forms]![FPal].[txtNumEmpleadosInf].[value]) Y <= SiInm(EsNulo([Forms]![FPpal].[txtNumEmpleadosSup].[value]);100000;[Forms]![FPal].[txtNumEmpleadosSup].[value])

El tema del campo nulo [convenio] lo puedes solventar de la siguiente manera:

En tu consulta, en el grid, te vas a una columna en blanco. En la primera línea, la correspondiente a "Campo:", escribes la siguiente expresión:

Conv: SiInm(EsNulo([Convenio]);" ";[Convenio])

Es a este campo calculado al que debes aplicarle el filtro, desmarcando el check de "Mostrar". El campo [Convenio], en el grid de la consulta, debe quedar con sólo el nombre del campo en la primera línea, y con su tabla de origen en la segunda línea (lo "normal", vamos).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas