** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Demasiadas bases abiertas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Demasiadas bases abiertas

 Responder Responder
Autor
Mensaje
arodrigu Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 04/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 599
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita arodrigu Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Demasiadas bases abiertas
    Enviado: 18/Noviembre/2021 a las 10:29
Buenos días,
Tengo un formulario con el que voy colocando en una mesa de reuniones a los asistentes. 

Lo hago a través de cuadros combinados que van iluminando, o no, y cambiando el color de la etiqueta que corresponde a cada asiento en una representación de la mesa en el mismo formulario.

Cuando elijo un asistente en un cuadro combinado, éste desaparece del origen del resto de cuadro combinados y así sucesivamente.

Si la base la tengo ubicada en local, tablas y diseño en el mismo archivo, ésto funciona perfectamente, pero como yo tengo las tablas en una unidad de red y el diseño en local, cuando llego al sexto asistente, me devuelve un error que dice "ya no se pueden abrir más bases de datos".

¿Me podéis decir qué quiere decir ésto y cómo puedo solucionarlo?.
Gracias.

Este código lo pongo en el evento al activar registro del formulario.


            'Enviamos parámetros a la nube
            TempVars!IdAmbito = 1 'Corresponde a las medidas para este formulario, exclusivamente.
            '--------------------------------------------------------------------------------------------------
            'Enviamos la configuración mínima parametrada en la tabla correspondiente a la sala.
            TempVars!ConfiguracionMinima = DMin("AsientosConfiguracion", "TPropiedadesS", "IdSala = TempVars!IdSala And IdAmbito = TempVars!IdAmbito")
            '--------------------------------------------------------------------------------------------------
            'Traemos el número de asientos de la sala.
            TempVars!TotalAsientosSala = DLookup("TotalAsientos", "TSalas", "IdSala = TempVars!IdSala")
            '--------------------------------------------------------------------------------------------------
            'Traemos el Idconfiguración correspondiente
            TempVars!IdConfiguracion = DLookup("IdConfiguracion", "TPropiedadesS", "IdSala = TempVars!IdSala And IdAmbito = TempVars!IdAmbito And AsientosConfiguracion = TempVars!TotalAsientosSala")
           ''=========================================================================================================================================================================
           ' 'Elegimos la configuración de la sala dependiendo de los contactos confirmados.
           ' If TempVars!Confirmados >= TempVars!TotalAsientos Then
           '    'Hay confirmados los mismos, o más, asistentes que asientos tiene la sala, así que traemos la configuración que ocupa todos los asientos.
           '    TempVars!IdConfiguracion = DLookup("IdConfiguracion", "TPropiedadesS", "IdSala = TempVars!IdSala And IdAmbito = TempVars!IdAmbito And AsientosConfiguracion = TempVars!TotalAsientos")
           ' Else
           '         '----------------------------------------------------------------------------------------------------
           '         'Hay confirmados menos asistentes que asientos tiene la sala. Traemos la configuración que corresponda.
           '         If TempVars!ConfiguracionMinima >= TempVars!Confirmados Then
           '            'Vienen igual o menos asistentes que la menor parametrización guardada en la TPropiedadesS, así que ponemos la mínima configuración
           '            TempVars!IdConfiguracion = DLookup("IdConfiguracion", "TPropiedadesS", "IdSala = TempVars!IdSala And IdAmbito = TempVars!IdAmbito And AsientosConfiguracion = TempVars!ConfiguracionMinima")
           '         Else
           '            'Vienen menos asistentes que asientos tiene la sala pero más de la parametrización mínima. Ponemos la que corresponda.
           '            TempVars!IdConfiguracion = DLookup("IdConfiguracion", "TPropiedadesS", "IdSala = TempVars!IdSala And IdAmbito = TempVars!IdAmbito And AsientosConfiguracion = TempVars!Confirmados")
           '         End If
           '         '-----------------------------------------------------------------------------------------------------
           ' End If
            '=========================================================================================================================================================================
            'CONFIGURAMOS LA MESA
            '-----------------------------------------------------------------------------------------
            'Traemos los colores de los asientos.
            '----------------
            'Asiento vacío.
            TempVars!ColorAsientoL = DLookup("ColorAsientoL", "TSalas", "IdSala = TempVars!IdSala")
            '----------------
            'Asiento ocupado.
            TempVars!ColorAsientoO = DLookup("ColorAsientoO", "TSalas", "IdSala = TempVars!IdSala")
            '-----------------------------------------------------------------------------------------
            'Abrimos un recordset gestionar el formato de los campos. (Pongo el SQL porque con la consulta no conoce los criterios de las variables.
            Set dbs = CurrentDb
            Set rst = dbs.OpenRecordset("SELECT * FROM TPropiedadesS WHERE IdConfiguracion =" & TempVars!IdConfiguracion)
   
                Do Until rst.EOF
                    
                    '--------------------------------------------------------------------------------------------------
                    'Dimensionamos la mesa y traemos la imagen correspondiente
                    With Me
                         .MarcoMesa.Top = rst!MarcoMesaSuperior
                         .MarcoMesa.Left = rst!MarcoMesaIzquierda
                         .MarcoMesa.Width = rst!MarcoMesaAncho
                         .MarcoMesa.Height = rst!MarcoMesaAlto
                         .MarcoMesa.Picture = TempVars!Ruta32 & DLookup("ImagenMesa", "TSalas", "IdSala =" & TempVars!IdSala)
                    End With
                    '--------------------------------------------------------------------------------------------------
                    'Gestionamos los campos trayendo las propiedades de la tabla.
                       For i = 1 To TempVars!TotalAsientos
                           'Comprobamos que si hay más confirmados que asientos.
                         '  If i > TempVars!TotalAsientos Then
                         '     'El confirmado no tiene asiento. Abandonamos el for.
                         '     Exit For
                         '  Else
                              'Sentamos al contacto
                              Me("E" & i).Top = rst("E" & i & "Superior")
                              Me("E" & i).Left = rst("E" & i & "Izquierda")
                              'Gestionamos los colores de las etiquetas.
                              If IsNull(Me("A" & i)) Or Me("A" & i) = 0 Or Me("A" & i) = "" Then
                                 'El asiento está vacío. Ponemos el color del asiento.
                                 Me("E" & i).BackColor = TempVars!ColorAsientoL
                                 Me("EA" & i).BackColor = TempVars!ColorAsientoL
                              Else
                                 'El asiento está ocupado. Lo ponemos en AZUL
                                 Me("E" & i).BackColor = TempVars!ColorAsientoO
                                 Me("EA" & i).BackColor = TempVars!ColorAsientoO
                              End If
                          ' End If
                       Next
                    '--------------------------------------------------------------------------------------------------
            
            rst.MoveNext
            Loop
            rst.Close
            Set rst = Nothing
            Set dbs = Nothing
            'Acaba el Recordset
            '--------------------------------------------------------------------------------------------------


En el evento al recibir el foco de cada cuadro combinado tengo el siguiente código:

        
'-------------------------------------------------------
        'Llamamos a la función que nos dice cual es el control activo
        fuControlActivo
        '-------------------------------------------------------
        'Damos origen al combo
        Me(TempVars!ControlActivo).Requery
        '-------------------------------------------------------
        'Valoramos las variables del IdContactoUnido
        TempVars!IdContactoUnido = Me(TempVars!ControlActivo).Value
        '-------------------------------------------------------
        'Actualizamos
        fuOrigenUbicacion (TempVars!ControlActivo)
        '----------------------------------------------------------------------------

Ésta es la función que devuelve el control activo

Public Function fuControlActivo() As String

        '----------------------------------------------------------------------------------------
        'Función que envía a la nube el nombre del formulario activo y del control activo.
        '----------------------------------------------------------------------------------------
         Set vaFActivo = Screen.ActiveForm
             TempVars!FormularioActivo = vaFActivo.Name
         Set vaCActivo = Screen.ActiveControl
             TempVars!ControlActivo = vaCActivo.Name
        '----------------------------------------------------------------------------------------


Ésta es la función que actualiza el origen de la fila de los combos de los asientos.

Public Function fuOrigenUbicacion(Asiento As String) As String

       '------------------------------------------------------------------------------------                
               'Actualizamos.
               Forms!FReuniones8(Asiento).RowSource = "SELECT IIf([TAgrupaciones11].[IdContactoUnido]>=50000,[CAgendaR].[Contacto2],[CAgenda].[Contacto2]) AS NombreApellidos, IIf([TAgrupaciones11].[IdContactoUnido]>=50000,[CAgendaR].[Empresa],[CAgenda].[Empresa]) AS Empresa, TAgrupaciones11.IdContactoUnido, TAgrupaciones11.IdReunion, TAgrupaciones11.Ubicado, TAgrupaciones11.Asistente, TAgrupaciones11.Presencia FROM (TAgrupaciones11 LEFT JOIN CAgenda ON TAgrupaciones11.IdContacto = CAgenda.IdContacto) LEFT JOIN CAgendaR ON TAgrupaciones11.IdContactoR = CAgendaR.IdContactoR WHERE (((TAgrupaciones11.IdContactoUnido)=" & Asiento & ") AND ((TAgrupaciones11.IdReunion)=" & TempVars!IdReunion & ") AND ((TAgrupaciones11.Ubicado)=True) AND ((TAgrupaciones11.Asistente)=True) AND ((TAgrupaciones11.Presencia)=1)) OR (((TAgrupaciones11.IdReunion)=" & TempVars!IdReunion & ") AND ((TAgrupaciones11.Ubicado)=False) AND ((TAgrupaciones11.Asistente)=True) AND ((TAgrupaciones11.Presencia)=1))" _
                                                       & "ORDER BY IIf([TAgrupaciones11].[IdContactoUnido]>=50000,[CAgendaR].[Empresa],[CAgenda].[Empresa])"
               '--------------------------------------------------


En el evento después de actualizar de cada cuadro combinado tengo el siguiente código.


        '----------------------------------------------------------------------------
        'Envío el nuevo valor del campo a la nube para usarlo en las consultas.
        TempVars!IdContactoUnidoNuevo = Me(TempVars!ControlActivo).Value
        '----------------------------------------------------------------------------
        'Llamamos a las funciones que actualizan los combos y sus orígenes.
        fuActualizaUbicacion
        '----------------------------------------------------------------------------

Ésta es la función que actualiza la ubicación del asistente


Public Function fuActualizaUbicacion() As String

'-------------------------------------------------------------------------------------------------------------------------
'Función que actualiza la ubicación del contacto en una sala.
'------------------------------------------------------------------------------------

                
                '--------------------------------------------------------------------
                'Llamamos a la función que devuelve los nombres del formulario y del control activos.
                fuControlActivo
                '--------------------------------------------------------------------
                'Extraemos el número del nombre del campo activo y lo aplicamos a las variables que controlan las etiquetas.
                'Etiqueta de la mesa.
                TempVars!NumeroEtiqueta = Mid(TempVars!ControlActivo, InStrRev(TempVars!ControlActivo, "A") + 1)
                '--------------------------------------------------------------------
                'Comprobamos que el campo no está vacío.
                '--------------------------------------------------------------------
                If IsNull(TempVars!IdContactoUnidoNuevo) Or TempVars!IdContactoUnidoNuevo = "" Or TempVars!IdContactoUnidoNuevo = 0 Then
                   '--------------------------------------------
                   'El campo ESTÁ vacío. Levantamos al contacto.
                   DoCmd.RunSQL "UPDATE TAgrupaciones11 SET Ubicado = False, Asiento = '' WHERE IdReunion = TempVars!IdReunion AND IdContactoUnido = TempVars!IdContactoUnido"
                   Forms!FReuniones8(TempVars!ControlActivo) = 0
                   '--------------------------------------------
                   'Cambiamos los colores de las etiquetas correspondientes al campo activo. Ponemos el color del asiento.
                   Forms!FReuniones8("E" & TempVars!NumeroEtiqueta).BackColor = TempVars!ColorAsientoL
                   Forms!FReuniones8("EA" & TempVars!NumeroEtiqueta).BackColor = TempVars!ColorAsientoL
                   Forms!FReuniones8.Requery
                   '--------------------------------------------
                Else
                   '--------------------------------------------
                   'El campo NO está vacío. Actualizamos los asientos.
                   DoCmd.RunSQL "UPDATE TAgrupaciones11 SET Ubicado = True, Asiento = TempVars!ControlActivo WHERE IdReunion = TempVars!IdReunion AND IdContactoUnido = TempVars!IdContactoUnidoNuevo"
                   '--------------------------------------------
                   'Cambiamos los colores de las etiquetas correspondientes al campo activo. Lo ponemos azul.
                   Forms!FReuniones8("E" & TempVars!NumeroEtiqueta).BackColor = TempVars!ColorAsientoO
                   Forms!FReuniones8("EA" & TempVars!NumeroEtiqueta).BackColor = TempVars!ColorAsientoO
                   '--------------------------------------------
                End If
                '--------------------------------------------------------------------
                'Eliminamos la variable
                TempVars.Remove "TempVars!NumeroEtiqueta"
                '--------------------------------------------------------------------

Fuerza y honor.
Saludos de Arturo desde Madrid
Arriba
dokk Ver desplegable
Habitual
Habitual


Unido: 15/Mayo/2020
Localización: Hendaye
Estado: Sin conexión
Puntos: 166
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita dokk Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 18/Noviembre/2021 a las 17:54
Hola Arturo:

Tenía un problema similar (con subformularios) e hice lo que dice ricardohzsz en este post http://es.uwenku.com/question/p-rejiypsg-br.html

Supongo que por ahí pueden ir los tiros de la solución a tu problema. Por lo que he entendido de tu código cuando un cuadro combinado recibe el foco le asignas el rowsource. ¿Se queda asignado permanentemente? Si es así al recibir el foco varios cuadros combinados, cada uno de ellos mantiene una conexión abierta con la base de datos (una conexión para los humanos, no sé cuantas para Access), y llega el momento en que se agotan las 2048 conexiones que Access puede abrir.

Si puedes prescindir de que el rowsource esté cargado una vez que has seleccionado lo que necesitabas del combo, puede ser que te ayude. Quizás sea tan sencillo como asignar rowsource="" en el evento lostfocus.

Te doy ideas pero no soy un experto. Igual alguien ve otra solución.

Un saludo y ánimo.
Albert Hostein
Aprendiendo cayendo
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable