Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

code beim Schließen einer DB ausführen aber sonst nie

Begonnen von Carl, Juli 30, 2019, 15:58:02

⏪ vorheriges - nächstes ⏩

Carl

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

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Carl

#2
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 ... :-(

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Carl

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


ebs17

@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.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

Hallo Eberhard,
Danke, mal wieder zu schnell (ohne Nachdenken) geschrieben.  :(
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Carl

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