Asignar criterio a una consulta con una función

Vuelvo a recurrir a tu ayuda.
Tengo una consulta de selección sobre una tabla a la que le aplico un criterio por medio de una función según necesite filtrar facturas "1", ofertas"2", proformas "3" etc.
El valor de la función se lo doy desde diferentes formularios por medio de la variable "st_ultimovd" según el tipo de documento que necesite filtrar.
Cuando el valor que le doy a la función es un número me lo filtra sin problemas.
ej: st_ultimovd = 1
Pero, como le asigno el valor >> Como "*" << a la variable para que la colsulta me muestre dodos los registros independientemente del tipo de documento que sea.

1 respuesta

Respuesta
1
Creo que en estos momentos tenemos un problema terminológico ;)
Para mí, una función es un procedimiento del tipo <<Public Function() As ...>>. Cuando me hablas de una función entiendo que quieres decir código, y que ese código está dentro un <<Private Sub ()>>
Lo que necesito saber es si tienes una consulta hecha que te filtra ese valor (1, 2, etc.) o si la consulta se ejecuta a través de Sql. Eso, suponiendo que lo que intuyo es cierto.
De todas maneras voy a darte, para adelantar trabajo (je, je... trabajo para ti, claro ;), un ejemplo:
Imagínate que el código crea una SQL. Cuando tú asignas un valor a la variable st_ultimovd la SQL debe de tener una estructura similar a esta:
SELECT Tabla.* FROM Tabla WHERE CampoX=st_ultimovd
Entonces lo único que hay que hacer es añadir al código un bloque If... EndIf que te tome una decisión. Por convención contigo mismo ;) el cero (0) significará que te muestre todos los registros. El esquema de lo anterior seria el siguiente:
If st_ultimovd<>0 Then
     SELECT Tabla.* FROM Tabla WHERE CampoX=st_ultimovd
Else
     SELECT Tabla.* FROM Tabla
End If
En la segunda sentencia simplemente le quitas el filtro para que te lo muestre todo.
A ver si con lo que te he dicho puedes hacer alguna adaptación a lo que tienes. Si tienes problemas me lo comentas, pero necesitaría ver ese código para saber qué debo "corregir".
Ya me dirás cosas.
Hola,
Quizás no me expliqué bien al principio o me faltaron datos, también he de decir que llevo poco tiempo trabando con access y lo que he aprendido ha sigo a golpe de google y puede que me patine la terminología :).
En un módulo tengo declarada la variable pública "st_ultimovd", a esta variable le asigno un valor diferentente desde cada formulario según que registros quiera filtrar en la consulta.
En ese mismo módulo tengo una ¿función? llamada "Function UltimoVD()" a la que le doy valor con la "st_ultimovd" (UltimoVD=st_ultimovd).
Y por último una consulta creada desde "Crear una consulta en vista diseño", en la que en los criterios del campo "ID_ventas_codumentos_tipo" le he colocado "UltimoVD()".
Esto me funciona bien cuando quiero filtrar "facturas" ID_ventas_codumentos_tipo = 0, "ofertas" ID_ventas_codumentos_tipo = 1, "proformas" ID_ventas_codumentos_tipo = 2, etc.
Sin en lugar de "UltimoVD()" en los criterios de la consulta le pongo "*" que luego lo traduce en " como "*" " la consulta me muestra todos los registros.
Pues bien, como le doy a la variable "st_ultimovd" el valor "*" o " como "*" " para que al abrir la consulta me muestre todos los registros.
He probado con comillas, dobles comillas y tal, pero no doy con la fórmula.
Espero haber sido más claro ahora ;)
Saludos.
Ante todo pedirte disculpas porque, al leer tu primera consulta, di por sentado que realizabas el proceso dentro de un procedimiento (Sub) y no dentro de una función (Function). Evidentemente supuse demasiado y lo que comentas es correcto, es una función. Sorry.
Te comento un par de cosas:
La cosa no te funciona por dos motivos, aunque el primero sólo lo intuyo y no sé si estaré en lo cierto. Además, este primero no es realidad la causa de que la cosa no pirule. Pero, por si acaso, te indico los dos. Allá vamos:
1.- Me dices que filtras por el campo "ID_...". Normalmente estos campos suelen ser numéricos. Si es así se produce un conflicto de tipos de datos, porque Access sí es capaz de darse cuenta de que si el dato que filtra, aunque sea string, es un número ("1", por ejemplo), sí ejecuta la consulta. El problema es cuando le pasas un valor puramente string (como "*", por ejemplo). Luego dice: ID->Numérico // "*"->String ---> Boommm!
2.- ¿Por qué te comento esto? Porque nuestro amigo Access, a no ser que se lo escribas directamente en la consulta (que es cuando comentas que te funciona sin problema), si se lo pasas como valor resultado, en tu caso, de una función, entiende que le estás pasando el valor literal. Es decir, si tu escribes directamente en la consulta <<Como "*">>, para Access eso es un carácter comodín; si el resultado viene de tu función Access entiende que quieres filtrar por "Como '*'". A no ser que tuvieras un ID que tuviera por valor "Como '*'" la consulta no te devolvería datos.
He estado haciendo un par de pruebas en una miniBD para ver si podía "engañar" a la consulta (he probado con el "Es No Nulo", con el IIf, con una mezcla de asteriscos, con el "como", y a su vez con una mezcla de todos los anteriores) pero los resultados han sido negativos.
Ante lo anterior te queda una solución, pero pasa por insertar un bloque IF... ENDIF en el código. Te explico genéricamente cómo funcionaría, suponiendo que utilizas el asterisco para mostrar todos los registros:
- Tenemos la consulta CCon Filtro y la consulta CSinFiltro. Ambas son copias idénticas de tu consulta, pero la CSinFiltro no tiene criterios de filtro.
- En el código del objeto escribimos algo así como
---
'Ya hemos pasado el parámetro a la función para que
'nos calcule el valor que devuelve ultimoVD()
Dim valor as String
valor=ultimoVD()
If valor="*" Then
    DoCmd.OpenQuery "CSinFiltro"
Else
    DoCmd.OpenQuery "CConFiltro"
End If
---
Espero que así te funcione. Ya me dirás cómo te ha ido.
Hola neckkito,
Ante todo agradezco la ayuda y el tiempo que me has dedicado.
No me has dado la solución que yo buscaba puesto que no era viable como bien explicabas, pero leyendo tu última respuesta se me encendió la bombillita y las pruebas que he hecho han sido positivas.
Nuevamente gracias,
Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas