Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Malina am August 10, 2025, 10:25:24

Titel: Automatisches speichern verhindern
Beitrag von: Malina am August 10, 2025, 10:25:24
Hallo zusammen
Ich habe ein kleines und hoffentlich gut lösbares Problem.
Meine Datenbank enthält folgende Tabellen mit Feldern:
- tbl_Mitarbeiter / ID_Mitarbeiter, Name
- tbl_Aufnahme / ID_Aufnahme
- tbl_Rolle / ID_Rolle
- tbl_Beteiligung / ID_Beteiligung, ID_Aufnahme_F, ID_Mitarbeiter_F, ID_Rolle_F

Über ein Formular tragen die Mitarbeiter schlussendlich ein, falls eine Aufnahme gemacht wurde. Sie erhalten dabei automatisch die Rolle "Aufnahme durchgeführt".
Nun gibt es Mitarbeiter, welche einer Fachgruppe angehören und die Aufnahmen der Mitarbeiter kontrollieren. Im Formular frm_Aufnahmen tragen diese dann jeweils die Ergebnisse ein.
Dieses Formular besteht aus dem Hauptformular mit den wesentlichen Angaben und ist beim Öffnen geschützt damit nicht Kreti und Pleti was ändern können. Über einen Button wird dann schlussendlich die Bearbeitung freigegeben.
Beim Kontrolldatum kann nun das Datum eingegeben, über Bemerkung eine Bemerkung hinterlassen werden u.s.w.
Dann wird über ein Unterformular ufo_Aufnahmen_Kontrolle in einem Dropdown der Mitarbeiter ausgewählt, welcher die Kontrolle durchführt. In diesem Dropdown erscheinen nur jene Mitarbeiter, welcher auch der entsprechenden Fachgruppe angehören und erhalten anschliessend automatisch die Rolle "kontrolliert durch".
Nun das Problem, ich habe einen Sub Form_BeforeUpdate eingebaut um abzufragen, ob das Formular geschlossen werden soll wenn die Daten nicht gespeichert wurden. Damit man einfach das Formular auch ohne die Änderungen zu speichern verlassen kann. Dann habe ich logischerweise den Speicher-Button mit welchem die Eintragungen gespeichert werden.
Dieser Sub sieht folgendermassen aus:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    'Wenn Speichern NICHT auf erlaubt gesetzt wurde, fragen ob das Formular trotzdem geschlossen werden soll
    If Not allowSave Then
        Dim Antwort As VbMsgBoxResult
        Antwort = MsgBox("Es hat noch ungespeicherte Daten." & vbCrLf & "Möchtest du das Formular trotzdem verlassen?" & vbCrLf & "Die Daten gehen dabei verloren.", _
            vbYesNo + vbQuestion, "Verlassen bestätigen")
           
        Select Case Antwort
            Case vbYes
            'Anwort ja -> trotzdem schliessen
                Me.Undo
                FormularSchliessenErlaubt = True 'Formular schliessen IST jetzt erlaubt
            Case vbNo
            'Antwort nein -> schliessen verhindern
                Cancel = True
                Exit Sub
            Case vbCancel
                Cancel = True
        End Select
    End If
End Sub

Wenn ich ja aber jetzt im Unterformular etwas eingeben will, verlasse ich ja das Hauptformular und es kommt dazu, dass dieser Sub aufgerufen wird und logischerweise kommt dann die Meldung, dass noch nicht gespeicherte Daten vorhanden sind.

Wie kann ich dies einfach verhindern?

Ich hoffe ihr wisst was ich meine und könnt mir helfen!
Ich habe euch die anonymisierte Datenbank angehängt. Da ist noch ganz viel mehr vorhanden. Den Rest muss man aber nicht beachten, geht wirklich vor allem über das Problem beim frm_Aufnahme. In der Navigation auf Übersicht über die Aufnahmen klicken und dann eine entsprechende Aufnahme doppelklicken. Im Kopf auf Bearbeitung aktivieren, Passwort ist daahep.

Bin wirklich kein Access-Profi und vermutlich würdet ihr ganz vieles besser machen ::) Aber ich gebe mir mit meinen begrenzten Kenntnisse die grösste Mühe etwas halbwegs schlaues und funktionierendes hinzukriegen  :)

Ganz herzlichen Dank und liebe Grüsse
Nicole
Titel: Re: Automatisches speichern verhindern
Beitrag von: Knobbi38 am August 10, 2025, 16:48:34
Hallo Nicole,

das automatische Update bei Änderungen aushebeln zu wollen und dann einen extra Button zum Speichern einzusetzen, ist m.E. keine so gute Idee. Die Logik sollte anders herum sein. Wenn einer keine Berechtigung hat, wird das Formular Readonly geöffnet und anders herum. So werden Änderungen von vornherein unterbunden und das automatische Speichen braucht auch nicht kompliziert unterdrückt werden; der Speicher Button entfällt komplett. Dafür gibt es im Formular die Allow... Eigenschaften. So ein Verhalten entspricht eher dem Standard von Access und läßt sich relativ einfach umsetzen.

Gruß Knobbi38
Titel: Re: Automatisches speichern verhindern
Beitrag von: Malina am August 10, 2025, 18:23:55
Hallo Knobbi
Besten Dank für deine Antwort. Dann werde ich mir diese Idee wohl über Board werfen. Jedenfalls bei diesem Formular. Ich kenne leider unsere Leutchen, die gewissen drücken einfach ein bisschen herum und dann habe ich unter Umständen Daten, die ich gar nicht haben will. Aber das krieg ich hin. Kann ja immer noch bei dem Haupteintrag ein explizites Speichern verlangen und nur den Mitarbeitern der Fachgruppe das löschen und ändern erlauben. Mit nur drei Nasen, welche die Möglichkeit zur Änderung haben sollte es ja auch klappen  :)
Sonst melde ich mich wieder.
Herzlichen Dank und beste Grüsse
Nicole
Titel: Re: Automatisches speichern verhindern
Beitrag von: Bitsqueezer am August 10, 2025, 22:49:51
Hallo Nicole,

das Problem ist aber auch in Deinem Code, wenn Du das Schliessen per Flag erlaubst, machst Du davor ein Undo, damit bleibt das Formular geöffnet und von da an ist Schliessen erlaubt. Der User kann jetzt wieder etwas eingeben und doch speichern. Ich würde ebenfalls vermeiden, globale oder modulglobale Variablen zu verwenden, wenn nicht abgesichert ist, wann und wo sie gesetzt werden. Zumal Du außerdem noch ein "allowSave" hast.

Wenn Du die Msgbox auf "vbYesNo + vbQuestion" setzt, gibt es keinen Cancel-Button. (Es sei denn [X] löst Cancel aus, weiß ich gerade nicht.)

Denk dran, daß die "Allow"-Eigenschaften auch ungebundene Elemente zur Eingabe sperren, wenn Du also etwa eine ungebundene Filter-Kombobox hast, kann diese auch nicht mehr verwendet werden.

Das Speichern zwischen Wechsel von HFO auf UFO läßt sich nicht verhindern. Das passiert auch umgekehrt. Ein HFO und ein UFO sind zwei Datensätze, die im Formular getrennt behandelt werden. Daher kannst Du nicht beispielsweise Daten im HFO verändern, stehenlassen und im UFO auch Daten verändern. Entsprechend ist es schon richtig, daß dann Form_BeforeUpdate für das HFO aufgerufen wird (umgekehrt auch).

Damit verhindert Access u.a., daß Du Daten änderst, die für den Link zwischen den Formularen benötigt werden.

Ich würde die Meldung nicht in Form_BeforeUpdate einbauen, denn die besagt ja nicht, daß das Formular geschlossen wird, wie es Deine Meldung sagt, sondern daß ein Datensatz gespeichert werden soll, was man damit verhindern kann.

Wenn wirklich das Formular geschlossen werden soll, kannst Du Form_Close verwenden, was auch einen Cancel-Parameter hat. Hier wäre die richtige Stelle, das echte Formular-Schließen abzufangen. Wenn Du hier Cancel=True einsetzt mit Deiner Messagebox, bleibt das Formular geöffnet und es wird dann auch nichts gespeichert (dennoch wird wohl Form_BeforeUpdate aufgerufen, daher darf hier die Meldung nicht erfolgen, hier behandelt man Validierungen der Eingaben).

Gruß

Christian