Access - Ejecutar consultas ya existentes en access desde vb

 
Vista:

Ejecutar consultas ya existentes en access desde vb

Publicado por petdunk (4 intervenciones) el 27/05/2015 10:23:47
Buenos días a todos,

Aunque he buscado mucho antes de preguntar, no he sido capaz de encontrar la solución a mi consulta, espero me podáis ayudar.

No soy ningún experto ni en access ni en VBA, y lo que voy haciendo, casi siempre lo consigo después de mucho navegar y ver ejemplos e ir probando.

Tengo una base de datos access, en la que ya tengo guardadas varias consultas de selección, las cuales, al abrirlas en vista diseño, e indicándoles un valor en el fila criterio del campo que quiero filtrar, me da los resultados correctamente.

Mi consulta es cómo conseguir esos mismos resultados desde código VBA, sin tener que escribir el código sql en el cuerpo del módulo de access que estoy creando. Es decir, desde código VBA, ejecutar esa consulta de selección, pasándole también el valor que quiero utilizar como criterio para filtrar los resultados.

Después, una vez ejecutada la consulta con el filtro, que es el valor de una variable, recorreré el recordset e iré escribiendo los datos en un archivo Excel, pero lo único que no he conseguido es ejecutar la consulta y pasarle el valor de la variable como filtro.

Si no es mucho pedir, no quiero molestaros, ¿me podríais poner un ejemplo de código, por favor?. Tampoco he hecho nunca las conexiones, estoy un poco pez aún.

Muchísimas gracias por todo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ejecutar consultas ya existentes en access desde vb

Publicado por GOOO (46 intervenciones) el 28/05/2015 19:32:12
Bueno: Hay páginas de algunos programadores que tiene ejemplos de lo que pretendes.

un sencillo ejemplo de ejecutar una consulta desde un formulario sería así:
1 Formulario Principal (Padre)
1 Formulario Hijo (Subformulario)
1 Texbox (Cuadro de texto ) para los criterios
1 CommanButtom (Botòn de comando)
Tu tabla de origen (ejemplo solamente) donde halla: IdRegistro (Numérico), Nombre(Texto),Apellido(Texto)

En el botòn de comando

Dim strSQL As String
strSQL="SELECT * FROM tuTabla WHERE IdRegistro=" & TuTexBox

Me.TuSubformulario.Form.RecordSource=strSQL

Esto es una base. Lo demás corre por tu cuenta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar consultas ya existentes en access desde vb

Publicado por Pedro Tapias (4 intervenciones) el 29/05/2015 11:03:51
Hola GOOO,

Muchas gracias por tu respuesta, pero no era eso lo que quería hacer. Tengo un módulo en access, que es donde quiero escribir el código que haga lo que decía en el primer post, no tengo formularios, ni botones, ni nada, simplemente el módulo con el código, que ejecuto cuando quiero obtener los resultados.

Lo único que quiero hacer es, desde el código vb del módulo, llamar a esa consulta de selección ya creada y guardada en access (en la misma base de datos donde está el módulo con el código), es decir, ejecutarla pasándole el valor de la variable Año, y que la consulta me filtre los resultados de ese año que yo le paso como filtro, y me dé los resultados.

Supongo que no será muy difícil, pero no he encontrado la solución por mucho que he consultado por internet. Igual que se puede ejecutar una consulta con DoCmd.OpenQuery, supongo que habrá algún comando o instrucción para ejecutarla pasándole como parámetro para filtrar el valor del año que quiero consultar, pero no lo he encontrado.

No sé si me he explicado bien, pero creo que debe de ser tan simple como escribir una línea de código donde se dé la instrucción de ejecutar esa consulta guardada, donde se puede pasar el valor del año, y después con el recordset obtenido, ya iré recorriéndolo y escribiendo los resultados.

Espero me podáis ayudar.

Muchas gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar consultas ya existentes en access desde vb

Publicado por GOOO (46 intervenciones) el 01/06/2015 17:23:29
Ok. Yo he usado una forma para exportar datos de access a excel y para ello necesito actualizar una consulta. (que es lo que quieres según veo)

Proceso:
1 Verifico si la consulta existe,
Si existe la elimino y creo una nueva con los parámetros que necesito
Si No existe la creo con los parámetros que necesito.

2 Uso esa consulta para poder exportar los registros a excel.

Uso esto para eliminar una consulta:
DoCmd.DeleteObject acQuery, "NombredelaConsulta"

Uso esto para crear una consulta nueva (aquí aplico los criterios que necesito)
Dim strSQL As String
strSQL="SELECT * FROM Consulta WHERE Campo=Criterios"
CurrentDb.CreateQueryDef "NombredelaConsulta", strSQL

En Resumen quedaría asi:
Nota: (La función ExisteConsulta, la encontré en internet. la puedes buscar y aplicarla)
Naturalmente esto me funciona a mí, puedes probar si te parece.
Recuerda hacer una copia o un back-up siempre, antes de aplicar cosas nuevas en tu bd.

If ExisteConsulta("", "UnaConsulta") = -1 Then
DoCmd.DeleteObject acQuery, "UnaConsulta"
CurrentDb.CreateQueryDef "UnaConsulta", strSQL
'Aquí pueden aplicar lo que quieres hacer.
'Esto es para abrir la consulta ya con los parámetros
DoCmd.OpenQuery "UnaConsulta"
Else
CurrentDb.CreateQueryDef "UnaConsulta", strSQL
'Aqui puedes aplican lo que quieres hacer
'Esto es para abrir la consulta ya con los parámetros
DoCmd.OpenQuery "UnaConsulta"
End If
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar consultas ya existentes en access desde vb

Publicado por Petdunk (1 intervención) el 01/06/2015 20:49:49
Muchas gracias GOOO por tu respuesta,

Lo tengo hecho así, con el código sql, y funciona perfectamente, pero como hay muchísimas lineas de código, lo que quería era borrar todas las líneas de código sql y substituirlas por una llamada a la consulta, porque está creada y guardada en la base de datos (de hecho, el código sql lo he obtenido de dicha consulta) y así eliminar tantas líneas porque hace ilegible el programa.

Veo que se puede hacer con DoCmd.OpenQuery, pero no se le puede pasar el valor para filtrar el año, eso sería lo ideal y lo que pretendo, ejecutar esa consulta guardada en access, pero pudiéndole pasar el año.

Saludos y muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar consultas ya existentes en access desde vb

Publicado por GOOO (46 intervenciones) el 05/06/2015 22:53:12
ok.

En tu consulta crea un nuevo campo algo asi:

Año:Format(TuCampoFecha,"aaaa") Te dará 2015, 2014, 2013 depende de la fecha del registro

En la parte inferior en Criterios escribe lo siguiente:

=[Formularios]![TuFormulario]![TuControlQueHaceReferenciaalAño]

En TuControlQueHaceReferenciaalAño de TuFormulario, escribes el año que quieres consultar y luego
abres tu consulta y ¡LISTO!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar consultas ya existentes en access desde vb

Publicado por petdunk (4 intervenciones) el 09/06/2015 11:01:27
Hola GOOO,

Gracias de nuevo por tu respuesta, pero creo que no me llego a explicar bien. No tengo formularios, no tengo nada, simplemente tengo una base de datos con una consulta de selección ya creada y guardada, y lo que quiero, es a través de un módulo de código que he creado en la misma base de datos, ejecutarla pasándole el año que quiero consultar, pero sin tener que escribir en el módulo el código sql, simplemente ejecutarla desde ese código vb.

He visto que se pueden ejecutar consultas con DoCmd.OpenQuery "nombre de la consulta", pero no se le pueden pasar valores para filtrar la consulta de selección.

Mi consulta es si existe alguna instrucción similar con la que sí que le pueda pasar el valor del año, para que me devuelva los resultados de la consulta de selección filtrados por el año que le he pasado.

O sea, que lo que quiero es llamar a la consulta desde el código vb, obtener los resultados en el recordset, e ir recorriendo el recordset.

Lo tengo hecho con el código sql de la consulta en el módulo, y funciona perfectamente, pero quiero eliminar todas las línes de código sql (que son muchas), y dejar una única instrucción que ejecute la consulta pasándole el valor, y obtener el recordset.

Igual te he liado aún más, pero bueno, si no existe esa instrucción similar al DoCmd.OpenQuery, lo dejaré como lo tengo, lo que pretendo es "limpiar" un poco el módulo de código, y hacerlo más inteligible.

Saludos y gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar consultas ya existentes en access desde vb

Publicado por GOOO (46 intervenciones) el 09/06/2015 18:16:17
Hola de nuevo.
La forma como yo te puedo ayudar aquí te lo dejo.

En un módulo Estándar pega lo siguiente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
'(Función para saber si existe o no existe una consulta)
 
Option Compare Database
Option Explicit
       '********************************************************
      ' FUNCTION: IsTableQuery()
      ' PURPOSE: Determine if a table or query exists.
      ' ARGUMENTS:
      '   DbName: The name of the database. If the database name
      '           is "" the current database is used.
      '    TName: The name of a table or query.
      ' RETURNS: True (it exists) or False (it does not exist).
      '
      '********************************************************
      Function ExisteConsulta(DbName As String, TName As String) As Integer
         Dim db As Database, Found As Integer, Test As String
         Const NAME_NOT_IN_COLLECTION = 3265
 
         ' Assume the table or query does not exist.
         Found = False
 
         ' Trap for any errors.
         On Error Resume Next
 
         ' If the database name is empty...
         If Trim$(DbName) = "" Then
            ' ...then set Db to the current Db.
            Set db = CurrentDb()
         Else
            ' Otherwise, set Db to the specified open database.
            Set db = DBEngine.Workspaces(0).OpenDatabase(DbName)
 
            ' See if an error occurred.
            If Err Then
               MsgBox "Could not find database to open: " & DbName
               ExisteConsulta = False
               Exit Function
            End If
         End If
 
         ' See if the name is in the Tables collection.
         Test = db.TableDefs(TName).Name
         If Err <> NAME_NOT_IN_COLLECTION Then Found = True
 
         ' Reset the error variable.
         Err = 0
 
         ' See if the name is in the Queries collection.
         Test = db.QueryDefs(TName$).Name
         If Err <> NAME_NOT_IN_COLLECTION Then Found = True
 
         db.Close
 
         ExisteConsulta = Found
 
      End Function
 
'(Función para lo que tu necesitas)
Public Function AbrirConsulta(strAño As String)
Dim strSQL As String
strSQL = "SELECT * FROM Tabla1 WHERE Format(Fecha,'yyyy')='" & strAño & "'"
 
'Aqui determinamos is la consulta ya existe,
'Si existe la elimina y crea una nueva con los nuevos parámetros
If ExisteConsulta("", "UnaConsulta") = -1 Then
DoCmd.DeleteObject acQuery, "UnaConsulta"            'Linea para eliminar la consulta
CurrentDb.CreateQueryDef "UnaConsulta", strSQL       'Linea para crear la nueva consulta
DoCmd.OpenQuery "UnaConsulta"                        'Linea para abrir la consulta
Else
'Si la consulta no existe, la crea
CurrentDb.CreateQueryDef "UnaConsulta", strSQL       'Lìnea para crear la nueva consulta
DoCmd.OpenQuery "UnaConsulta"                        'Linea para abrir la consulta
End If
End Function

y llamas a la función con la siguiente línea
1
Call AbrirConsulta("2015")

aquí lo puedes cargar desde una macro, o de donde tu quieras.
Tendrás que reescribir aquí las líneas de tu código, pero al final desde cualquier parte de tu aplicación puedes llamar la consulta y mostrar los registros según el año que tu hayas escrito

Espero te sirva.
(Nota: toma lo que te ofrecen y trata de ponerlo en práctica, si realmente no te funciona entonces deséchalo)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ejecutar consultas ya existentes en access desde vb

Publicado por petdunk (4 intervenciones) el 11/06/2015 13:33:20
Muchas gracias de nuevo por tu respuesta GOOO.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lenin

Ejecutar consultas ya existentes en access desde vb

Publicado por Lenin (1 intervención) el 04/10/2017 19:31:29
Hola Petdunk !!!

Esta es la forma correcta de hacer lo que quieres, yo he tratado de hacer lo mismo desde hace mucho tiempo y no encontraba la solucion a eso, pero gracias a un foro en inglés di con la solucion, espero te ayude a pesar de la antigüedad de la pregunta, puede que otros usuarios de Access tengan la misma necesidad.

Me.cmdClienteID.Value es el nombre del control con el parámetro que quieres pasar a la consulta guardada (NombreConsulta)

Assuming that your query is correctly requesting a parameter, you can do the following code in the AfterUpdate event (if you're using DAO):

1
2
3
4
5
6
7
8
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
 
With CurrentDb.QueryDefs("NombreConsulta")
    .Parameters("ParameterTextHere") = Me.cmdClienteID.Value
    .Execute
End With
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar