Esta es una conversación privada entre McPegasus y Buho sobre el tema de consultas en una MDB Primero: ¿Como crear una consulta permanente en una MDB? =============================================== Buho: 'Proposito. Crear una consulta permanente en una base de datos 'Este codigo se puede ejecutar desde otra MDB completamente ajena 'a la MDB donde se dese crear la consulta. 'Debe recibir como parametros, el nombre de la consulta y la instruccion SQL 'que deseamos que se convierta en consulta permamente Option Compare Database Option Explicit Function CreaNuevaConsulta(Name As String, Sql As String) Dim dbs As Database Dim qdfNuevo As QueryDef 'est si deseamos crearla en una base de datos ajena a esta que corre el codigo Set dbs = OpenDatabase("C:\Twpac\dsystem.Mdb") 'esto si deseamos crearla en la propia MDB que corre el codigo 'Set Dbs= CurrentDb() With dbs ' Crea una consulta permanente. Set qdfNuevo = .CreateQueryDef(Name, Sql) .Close End With End Function MCPEGASUS lo simplifica: Call CurrentDb.CreateQueryDef(strNombreQuery, strSql) y para borrar CurrentDb.QueryDefs.Delete (strNombreQuery) Luego surgió como recorrer todas las consultas y grabarlas, por ejemplo en un combo Búho dió estas Tres soluciones: (A) Sub DameConsultas() Dim ObjetoConsulta As AccessObject, Dbs As Object Set dbs = Application.CurrentData For Each ObjetoConsulta In dbs.AllQueries Debug.Print ObjetoConsulta.Name 'aqui carga en el combo con Additem el nombre Next ObjetoConsulta End Sub Pero esta que hemos visto no funciona en Access 97, así que ponemos esta otra que si funciona para Access 97: (B) Para Access 97 Sub OtraConDAO_Access97() Dim VarConsultas As QueryDef With CurrentDb For Each VarConsultas In .QueryDefs Debug.Print " " & VarConsultas.Name Next VarConsultas .Close End With End Sub Ojo a estas ultimas para Acces97 (En Access >2000 no ocurre este problema) Hay que filtrar las consultas que empiezan por "~sq_", estas son las consultas que se hacen dentro de controles de formularios e informes. (C) Private Function ListaQueries(Campo As Control, Id As Long, fila As Long, col As Long, código As Integer) Dim DescuentA As Integer, zx As Integer Static dbs(127), Entradas Dim ValRetorno ValRetorno = Null Select Case código Case LB_INITIALIZE 'Inicializar. Dim MIDB As Database, micontenedor As Container Set MIDB = CurrentDb() Entradas = MIDB.QueryDefs.Count DescuentA = 0 For zx = 0 To Entradas - 1 'If (midb.QueryDefs(zx).Attributes And DB_SYSTEMOBJECT) Or midb.TableDefs(zx).Name Like "MSys*" Then If (MIDB.QueryDefs(zx).Name Like "MSys*") Or (MIDB.QueryDefs(zx).Name Like "~*") Then DescuentA = DescuentA + 1 Else dbs(zx - DescuentA) = MIDB.QueryDefs(zx).Name End If Next zx Entradas = Entradas - DescuentA Me.NUmeroConsultas.Caption = "Total " & Entradas & " consultas" MIDB.Close Set MIDB = Nothing ValRetorno = Entradas Case LB_OPEN 'Abrir. ValRetorno = Timer 'ID único para control. Case LB_GETROWCOUNT 'Número de filas. ValRetorno = Entradas Case LB_GETCOLUMNCOUNT 'Número de columnas. ValRetorno = 1 Case LB_GETCOLUMNWIDTH 'Anchura de columna. ValRetorno = -1 'Usar la anchura predeterminada. Case LB_GETVALUE 'Obtener los datos. ValRetorno = dbs(fila) Case LB_END 'Terminar For Entradas = 0 To 127 dbs(Entradas) = "" Next End Select ListaQueries = ValRetorno End Function OBVIAMENTE SON MUCHO MAS SENCILLOS LOS DOS PRIMEROS METODOS Otra cuestion sobre consultas: McPegasus da una simple linea de codigo para ver si una consulta permamente existe en una MDB If Not IsNull(DLookup("Name", "MSysObjects", "Name = '" & strNombreQuery & "'")) Then mcBuscarConsulta = DLookup("Name", "MSysObjects", "Name = '" & strNombreQuery & "'") End If