23. Jak sprawdzić, że baza jest już otwarta w innym oknie?

Sposobów jest kilka.

  1. Sposób oparty na dynamicznej wymianie danych (DDE).
    Przedstawił: Piotr Lipski
  2. Function CheckOtherInstances() As Boolean
    ' sprawdza, czy w systemie aktywne sa inne instancje biezacej bazy
        Dim chan As Long
    
        Application.SetOption "Ignore DDE Requests", True 'żeby nie gadało samo ze sobą
        On Error GoTo CheckOtherInstances_NoInstance
        chan = DDEInitiate("MSAccess", "<tu nazwa pliku bazy danych - bez .MDB na końcu>")
        DDETerminate chan
        CheckOtherInstances = True
        GoTo CheckOtherInstances_End
    
    CheckOtherInstances_NoInstance:
        CheckOtherInstances = False
    
    CheckOtherInstances_End:
        Application.SetOption "Ignore DDE Requests", False
    
    End Function
  3. Drugi sposob korzysta z tego, ze GetObject zwraca zawsze odwolanie do pierwszej instancji aplikacji.
    Przedstawił: Krzysztof Pozorek
  4. ' Access 97 (NIE UŻYWAĆ W WYŻSZYCH WERSJACH)
    If hWndAccessApp <> GetObject(CurrentDb.Name).hWndAccessApp Then 
        MsgBox "Baza juz otwarta w innej instancji Accessa" 
        DoCmd.Quit
    End If
  5. Sposób wykorzystujący blokowanie tabeli.
    Przedstawił: Krzysztof Pozorek
  6. Opis realizacji: Jest sobie głowny Panel oparty na lokalnej tabeli i otwarty z blokowaniem rekordów. Przy próbie ponownego otwarcia bazy wywoła sie procedura zdarzenia 'Form_Error', która wyświetla odpowiedni komunikat i zakmyka bazę.
  7. Sposób korzystający z metody OpenSchema (ADO).
    Przedstawił: SWid
  8. Od Acc2k wzwyż (ADO) kłania się metoda OpenSchema obiektu Connection, z której pomocą można uzyskać info (na podstawie pliku *.LDB) m. in. i o tym kto i z jakiego komputera "odpalił" plik bazy (i front i end...):
    Set rs = cn.OpenSchema(adSchemaProviderSpecific, , _
    "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
    
    ' Output the list of all users in the current database.
    Debug.Print rs.Fields(0).Name, "", rs.Fields(1).Name, _
    "", rs.Fields(2).Name, rs.Fields(3).Name