Consultas a través de formularios

Por cuestiones de tiempo, aunque tengo gran experiencia en access, me gustaría contactar con algún experto que disponga de alguna aplicación/código de ejemplo para la siguiente cuestión.
Quisiera que mis usuarios puedan, mediante un formulario con cuadros combinados:
.- Seleccionar la tabla o query para la consulta. Es decir, que en un cuadro combinado les aparezca todas las tablas y querys de la mdb para seleccionar una. No descarto que el Administrador pueda ocultar o limitar el número de tablas/Querys disponibles para el Usuario.
.-En el siguiente paso y del mismo modo, seleccione los campos de la/s tabla/s query/s seleccionadas previamente y escoja tantos campos para filtrar como desee ( ¿Check box? )
.- Para cada campo seleccionado, un list box que le permita filtrar por los diferentes criterios preestablecidos.
.- Generar la query por código ( evidentemente mediante variables temporales ) y visualizar el resultado en otro formulario que a su vez contenga opciones de exportar en formatos excel, imprimir, etc. Esto último no es necesario contestar pues conozco sobradamente como hacerlo.

5 Respuestas

Respuesta
1
Primero disculpa el retraso. Tu pregunta es de cierto nivel y he preferido atender antes otras más básicas y rápidas.
Para lo que quieres en tu primera parte de la consulta, necesitas primero llenar tu combo con los nombres de las tablas de que dispones. Asumo que sabes ya agregar elemenos a combos, así que paso a mostrarte como puedes obtener los nombres de la tablas en tiempo de ejecución:
Dim MiBase As Database
Dim cont As Integer
Dim NombreTabla As String
Set MiBase = CurrentDb
For cont = 6 To MiBase.TableDefs.Count - 1
NombreTabla = MiBase.TableDefs(cont).Name
'....
Next cont
En los ... deberás poner el código para agregar esa tabla a tu combo, o lista o lo que quieras usar para presentarlo al usuario.
Para seleccionar los campos, debes seguir un procedimiento parecido, pero tomando como parámetro la tabla seleccionada antes. El for en este caso quedaria asi:
For cont = 0 To MiBase.TableDefs("TablaSeleccionada").Fields.Count - 1
MsgBox MiBase.TableDefs("TablaSeleccionada").Fields(cont).Name
'....
Next cont
Bien, ya tenemos seleccionada la tabla y mostrados los campos que contiene. Ahora quieres seleccionar algunos campos y filtrarlos por algunos criterios preestablecidos. Esto admite múltiples soluciones dependiendo de la imaginación de cada uno. Se me ocurre que una forma podría ser que en el momento de marcar uno de los criterios, por ejemplo con una casilla de verificación, en ese instante, sabiendo la tabla, el campo y el criterio, se genere una cadena de texto tipo "select campo from tabla where campo cumple el criterio". Yo lo haría en dos partes, es decir, por una parte el 'select from' y por otro el 'where', para luego concatenarlos al final (juntarlos) y que quede la SQL completa.
Tienes que controlar si es la primera vez que tratas de generar la cadena para en el select poner o no el "select .. from tabla" o solo añadir el campo a la cadena previamnete creada, y en el where, para controlar si poner el "Where ..." o solo " and campo2 cumple..." y concatenarlo con el where ya generado antes.
De este modo estarías generando por código la consulta tal como querías.
Ahora solo tienes que pasar esa cadena de texto generada que contiene tu query al origen de datos del otro formulario (podría estar en el mismo, es cuestión de gustos). Te recomiendo que bases ese otro form en una consulta creada previamente y que en código simplemente cambies el contenido de esa consulta. Así no tendrías que tocar nada del segundo formulario, pues su origen de datos seria siempre "Consulta1" (por ejemplo) y seria esa "Consulta1" la que cambie cada vez.
Perfecto !. Gracias. Te diré que ya lo tenía pero de un modo un poco más chapuza. Usando los Sources de reportes previamente creados y trasladando el Source ( Como variable pública ) a un formulario. Los campos del formulario de presentación de datos leen de los campos del formulario de selección de campos, etc. Tu forma de plantearlo me parece la más sensata y así lo haré. Lamento haberte hecho dedicarme tanto tiempo y esfuerzo. Mereces llamarte EXPERTO. Gracias de nuevo !
Respuesta
1
Lo cierto es que con las tres cuestiones que planteas hay para desarrollar una app completa. Disculpa si lo único que se me ocurre es redirigirte a la siguiente dirección: http://www.mile50.com/access/index.htm, ya que como tu dices, lo que necesitas son aplicaciones hechas.
Aunque no estoy seguro de ello, puedo recomendarte que veas las siguientes:
RFil is a report filtering utility for Access databases (rfil97v5.mdb)
Otras:
http://support.microsoft.com/default.aspx?scid=http://download.microsoft.com/download/access97/example/1/WIN98/EN-US/Qbf.exe
Enormemente agradecido. Eres un amigo ( virtual ).
Has comprendido mi necesidad a la perfección. No intentaba que me dieran la solución terminada y realizada. Tan solo una orientación o ejemplo que me referenciara sobre el asunto. Nos mantendremos en contacto y no dudes en contar conmigo para lo que necesites. Un saludo.
Respuesta
1
Hombre, parece que no tienes tanta experiencia en Access como dices.
Por código es bastante sencillo utilizando DAO (con ADO es más rápido, pero más complicado)
Simplemente te paso unas porciones de código comentadas y aplícalas (verás como es muy sencillo)
Necesitarás dos combos y un cuadro de texto (o similares)
Primero: creas una colección de tablas por código y la asignas a uno de los combos
Dim tdf As DAO.TableDef
For Each tdf In CurrentDb.TableDefs
combo1.AddItem tdf.Name
Next
ahora, según la tabla que se seleccione de este combo, tomamos sus campos:
(Este procedimiento será la respuesta a un evento posterior a la selección de la tabla en el comobo1)
Dim fld As DAO.Field
Dim tdf As DAO.TableDef
Set tdf = CurrentDb.TableDefs(combo1.Text)
For Each fld In tdf.Fields
combo2.AddItem fld.Name
Next
Ahora necesitas ir almacenando la lista de campos que se van seleccionado de este combo.
Ahora necesitas construir la cadena SQL con la que ejecutar una consulta. Yo suelo jugar con cadenas de texto (tienen que estar accesibles a nivel de módulo)
Public strSQL As String
Public strFrom As String
Public strSELECT As String
Public strWhere As String
(El siguiente código es una respuesta a un evento posterior a la selección de un campo en el combo2 y a la introducción de un criterio en el cuadro de texto. Sólo sirve si quieres que se cumpla la condición Igual A, si quieres otras condiciones, simplemente añada otro cuadro de texto en el que introducir el criterio)
If strWhere <> "" Then
strWhere = strWhere & " and " & combo2.Text & " = " & Text
Else
strWhere = combo2.Text & " = " & Text
End If
(El if anterior es, como sabrás, para introducir los AND necesarios en SQL para seleccionar más de un criterio)
una vez que quieras lanzar la consulta, constrúyela así:
strSELECT="la lista de los campos que quieres que se devuevan en la consulta"
strFROM=combo1.text
strSQL=strSELECT & " " & strFROM & " "& strWHERE
Con lo que te mando tienes graves limitaciones:
1º sólo puedes seleccionar campos de una tabla.
2º en caso de que quisieras de varias tablas tendrías que programar el tipo de relaciones que quieres entre ellas
3º ya digo que sólo se ha contemplado la opción Igual A
Hay un truco que funciona para esto, pero que es mucho más lento:
Si quieres unir varias tablas, almacena en Access una consulta de selección con todos los posibles campos de los que quieres dar opción. Pero ahora se complican las cosas en código porque el objeto TableDef ya no nos vale.
Si te gusta este tipo de procedimientos (yo los uso mucho para cualquier tipo de aplicación que se considere medianamente buena) hay una manera bastante más profesional de hacerlo:
Crea una tabla en la base de datos (sólo la tendrás que rellenar una vez) en la que los campos almacenen los distintos nombres de las tablas y sus campos, y utiliza luego esta tabla para hacer todas las posibles combinaciones de cadenas SQL que quieras.
Hay muchos modelos de este tipo de tablas. Pero lo mejor es que te crees tú la tuya porque nadie programa como tú.
En caso de que esto no te sirva para nada, no dudes en seguir preguntando.
Gracias mmaynard, aunque creo que te sobra algún que otro comentario candencioso. No obstante probaré lo que me dices y... si, nadie como uno mismo para crearse sus propias cosas. Te recuerdo que aludí a TIEMPO y te agradezco enormemente que me hayas orientado al respecto. La guía me será de gran utilidad. GRACIAS !
Respuesta
1
En principio access permite hacer eso aunque para mi entender son temas algo avanzados, comienza por darle un vistazo a las colecciones field y tabledef
Donde podrás ver como tratar esos objetos desde visual basic
Respuesta
1
En mi caso no dispongo de nada desarrollado pero creo que no tendría inconvenientes en desarrollarlo. En este caso deberíamos acordar un presupuesto y plazo ya que no se trata de un desarrollo trivial.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas