General

6.165 Evitare una multisessione di Access
  Giorgio Rancati

Richiamando la funzione che segue all'apertura di un database Access, si verisfica se tale database è già aperto, nel qual caso il database viene subito richiuso evitando che venga aperta una seconda sessione di tale database.
Function IsMultisession() AS Boolean
 'Questa Routine è stata sviluppata da GIORGIO RANCATI	
 '
    Dim   NomeLdb as String
    Dim   i AS Integer
    NomeLdb = Application.CurrentDb.Name
    Mid(NomeLdb, Len(NomeLdb) - 2, 3) = "Ldb"
    'Apro l'LDB e controllo che non sia maggiore di 64 byte
    'Ogni 64 byte è un accesso al Db
    Open NomeLdb For Binary Access Read Write As #1
    If LOF(1) > 64 Then i = -1
    Close #1
    If i Then
        MsgBox "Impossibile aprire il database nello stesso tempo più di una volta"
     Application.Quit
    'Non serve ritornare nessun parametro perchè
    'l'applicazione viene interrotta brutalmente
   End If
 IsMultisession=False
 End Function
In alternativa alla funzione di cui sopra scritta da Giorgio Rancati, per non aprire un database in multisessione si può usare le funzioni che seguono, di autore non conosciuto e basate su DDE.
'***********************************************************************
' As duas funções a seguir rodam em qualquer versão do Access e servem
' para checar se já existe uma instância do arquivo mdb aberta.
' Caso positivo, a função IsRunning() não permite a nova abertura
' do banco de dados.
'
' FUNÇÕES: IsRunning() e TestDDELink(ByVal strAppName$)
'
'***********************************************************************

Function IsRunning()
    Dim db As DAO.Database
    Set db = CurrentDb()
    If TestDDELink(db.Name) Then
        MsgBox "Avviso:" & "@@L'aplicativo è già in esecuzione in" _
                & vbCrLf & "un'altra istanza di Windows!", vbCritical, "Seconda istanza di un applicativo"
        Application.Quit acQuitSaveNone
    End If
End Function

' Função Auxiliar de IsRunning()
Function TestDDELink(ByVal strAppName$) As Integer
    Dim varDDEChannel
    On Error Resume Next
    Application.SetOption ("Ignore DDE Requests"), True
    varDDEChannel = DDEInitiate("MSAccess", strAppName)
   ' When the app isn't already running this will error
    If Err Then
       TestDDELink = False
    Else
        TestDDELink = True
        DDETerminate varDDEChannel
        DDETerminateAll
    End If
    Application.SetOption ("Ignore DDE Requests"), False
End Functio

La funzione IsRunning() fa riferimento alla libreria Microsoft DAO quindi, se si usa una versione di Access successiva ad Access 97, occorre aggiungere ai riferimenti del database tale libreria.


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.