Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Carl am Juli 30, 2019, 15:58:02

Titel: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: Carl am Juli 30, 2019, 15:58:02
Hallo,

ich habe eine Frage.

Ich benutze den unten stehenden Code um auf Knopfdruck abzufragen, ob in einer Tabelle tbl_instanzen ein Datensatz existiert und wenn ja, diesen zu löschen und dann die DB zu schließen. Damit wird eine zuvor auf nur eine Instanz begrenzte DB wieder für einen anderen Nutzer frei gegeben. Die Gründe für die Begrenzung auf nur eine zulässige Instanz sollen hier nicht besprochen werden. (Es wird beim schließen eine statistische Funktion ausgeführt, die nur geht, wenn ein vollständiger Datensatz zugefügt wurde und kein weiterer offen ist.)

Der Code ist unter einem "Schließen"-Button und funktioniert einwandfrei:


    Me.RecordSource = "SELECT *" & " FROM abf_Instanzen"            'Datensatzherkunft im Formular einstellen auf Instanzen-Abfrage
    If DCount("*", "abf_Instanzen") > 0 Then                        'Prüfen, ob Datensätze in Instanzen-Abfrage vorhanden sind
        DoCmd.RunCommand acCmdRecordsGoToLast                       'Letzten Datensatz aufrufen
        DoCmd.SetWarnings False                                     'Warnmeldungen deaktivieren (sonst würde Pop-Up erscheinen)
        DoCmd.RunCommand acCmdDeleteRecord                          'Datensatz löschen
        DoCmd.SetWarnings True                                      'Warnmeldungen reaktivieren
        Me.RecordSource = Empty                                     'Datensatzherkunft im Formular leeren
    End If                                                          '(Wenn keine DS in Abfrage (Admin-Zugang? Bug?), direkt Schließ


Jetzt wird der Datensatz in der tbl_instanzen aber LEIDER NICHT gelöscht, wenn der User zum Schließen eine andere Methode als nur den Button verwendet.

Ich möchte daher ein öffentliches Modul, das immer beim Datenbankschließen ausgeführt wird, egal bei welcher Form des Schließens. Folgender Code funktioniert aber nicht. Was ist daran fehlerhaft?

Er soll
* immer beim Schließen der DB
* und niemals beim Schließen eines Formulars ausgeführt werden.



Public Function Form_Unload(Cancel As Integer)
    Me.RecordSource = "SELECT *" & " FROM abf_Instanzen"            'Datensatzherkunft im Formular einstellen auf Instanzen-Abfrage
    If DCount("*", "abf_Instanzen") > 0 Then                        'Prüfen, ob Datensätze in Instanzen-Abfrage vorhanden sind
        DoCmd.RunCommand acCmdRecordsGoToLast                       'Letzten Datensatz aufrufen
        DoCmd.SetWarnings False                                     'Warnmeldungen deaktivieren (sonst würde Pop-Up erscheinen)
        DoCmd.RunCommand acCmdDeleteRecord                          'Datensatz löschen
        DoCmd.SetWarnings True                                      'Warnmeldungen reaktivieren
        Me.RecordSource = Empty                                     'Datensatzherkunft im Formular leeren
    End If                                                          '(Wenn keine DS in Abfrage (Admin-Zugang? Bug?), direkt Schließ
End Function


Carl
Titel: Re: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: ebs17 am Juli 30, 2019, 16:22:40
ZitatDer Code ... funktioniert einwandfrei
Naja, die DoCmd-Orgie ließe sich durch eine einfache Löschabfrage ersetzen. Das wäre unaufwändiger und übersichtlicher.
Für das Schließen einer Anwendung gibt es kein nutzbares Ereignis. Daher wäre es eine Möglichkeit, mit Start der Anwendung ein verborgenes Formular (frmHidden) zu starten. Das kann schon mal nicht per Oberfläche geschlossen werden, und relevante Codes sollten das auch nicht tun.
Mit Schließen der Anwendung tritt das Unload dieses Formulars ein und würde somit zielgenau nutzbar sein.
Titel: Re: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: Carl am Juli 30, 2019, 18:20:26
hm ... also ein unsichtbares Formular. okay, ich versuche es.

Bei diesem Fall erscheint eine Fehlermeldung, wahrscheinlich weil das Hintergrund zuletzt geschlossen wird und die Abfrage zu dem Zeitpunkt nicht mehr da ist ... :-(
Titel: Re: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: Beaker s.a. am Juli 30, 2019, 21:45:50
Hallo Carl,
Private Sub Form_Unload(Cancel As Integer)
'    Me.RecordSource = "SELECT *" & " FROM abf_Instanzen"
'eine DS-Herkunft braucht das Formular nicht
    If DCount("*", "tbl_Instanzen") > 0 Then 
        CurrentDb.Execute("DELETE FROM tbl_Instanzen"), dbFailOnError
    End If                     
End Sub


gruss ekkehard
Titel: Re: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: Carl am Juli 30, 2019, 22:06:33
Danke, Ekki, der Tag ist gerettet!

Ist bekannt, welche Probleme in der Anwendung eintreten können, wenn man mit diesem Design die Anzahl der Benutzer auf 1 begrenzt?

Ich kann mir vorstellen, dass einmal der Tabelleneintrag nicht gelöscht wird und dann die anderen ausgesperrt sind.

Oder dass jemand das frontend offen lässt, und die anderen dann nicht nachrücken können.

Grund für das Design ist, dass ich versuchen möchte, eine statistische Funktion einzubauen und die kann nicht mit mehr als einem Benutzer zur Zeit umgehen.

Carl

Titel: Re: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: ebs17 am Juli 30, 2019, 22:52:50
@ekkehard:
Eine Löschabfrage hat kein Problem damit, wenn keine Datensätze da sind => DCount ist unnötiger Ballast.

ZitatIch kann mir vorstellen, dass einmal der Tabelleneintrag nicht gelöscht wird
Ich nicht.

ZitatIst bekannt, welche Probleme in der Anwendung eintreten können, wenn man mit diesem Design die Anzahl der Benutzer auf 1 begrenzt?
Ein Einnutzerbetrieb ist regelmäßig unproblematischer als ein Mehrnutzerbetrieb. Hast Du andere Erwartungen?
"Dieses Design" ist welches?

Zitateine statistische Funktion einzubauen und die kann nicht mit mehr als einem Benutzer zur Zeit umgehen
Wenn Du das sagst ...
Wobei nicht auszuschließen ist, dass das nur an Deiner persönlichen Umsetzung liegt.
Titel: Re: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: Beaker s.a. am Juli 31, 2019, 21:10:02
Hallo Eberhard,
Danke, mal wieder zu schnell (ohne Nachdenken) geschrieben.  :(
gruss ekkehard
Titel: Re: code beim Schließen einer DB ausführen aber sonst nie
Beitrag von: Carl am August 05, 2019, 08:21:21
Zitat von: ebs17 am Juli 30, 2019, 22:52:50
Zitateine statistische Funktion einzubauen und die kann nicht mit mehr als einem Benutzer zur Zeit umgehen
Wenn Du das sagst ...
Wobei nicht auszuschließen ist, dass das nur an Deiner persönlichen Umsetzung liegt.

Natürlich liegt es an meiner Umsetzung, woran denn sonst. Ich bin auch fachfremd und habe 8 Stunden Patienten.

Carl