Neuigkeiten:

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

Mobiles Hauptmenü

Formular speicherung lässt sich nicht verhindern

Begonnen von dafra, Januar 28, 2025, 14:33:38

⏪ vorheriges - nächstes ⏩

dafra

zuerst einmal ein dickes Hallo hier ins Forum

Mein Problem:
Ich habe ein Formular mit dem man Daten in eine Tabelle schreiben kann. Aber wenn ich das Formular ohne speichern schließen möchte, z.b. durch drücken des Kreuzes (X) oben im Fenster, erstellt Access dennoch einen Eintrag in der Tabelle. Wie kann ich das Unterbinden?

Erklärung zum Aufbau und Code:
Ich habe eine Tabelle (tblRechAusgaben) mit den gewünschten Spalten/Felder erstellt. Da ich das erste mal mit Access arbeite habe ich, der Einfachheit halber, aus der Tabelle heraus ein Formular erstellt (Tabelle markiert/geöffnet -> Erstellen -> Formular). Somit wurden mir schon die passenden Felder erstellt und verknüpft/verbunden. Dann das Layout mit "Layout entfernen" aufgebrochen und mein eigenes Layout erstellt. Dann hab ich u.a. bei den Einstellungen das Formular folgende Einstellungen getätigt, "Popup: Ja" und "Daten eingeben: Ja". Dies hab ich gemacht, weil ich das Formular nur für das Erfassen neuer Rechnungen möchte und nicht um bestehende Rechnungen (also Einträge in der Tabelle) zu bearbeiten.
Nun wollte ich, dass wenn jemand das Formular öffnet ,aber nichts eingibt und wieder schließt oder etwas eingibt aber dann merkt das er keine Rechnung anlegen muss/will, kein Eintrag in der Tabelle vorgenommen wird.
Wenn jemand das Formular öffnet und nichts darin macht (weil er es aus versehen geöffnet hat), also keinen Eintrag vornimmt, wird KEIN Eintrag in der Tabelle erstellt. Wenn er jedoch irgendwo eine Angabe macht oder z.b. ein Betrag ins Feld einträgt und dann aber das Fenster schließt, erstellt er einen Eintrag.

Darauf hin hab ich folgendes probiert:
Private Sub Form_Unload(Cancel As Integer)
    ' Verwerfen aller Eingaben
    If Me.Dirty Then
        Me.Undo
    End If
End Sub
Nach mehreren Fehlschlägen hab ich dann gemerkt, das er die Schleife gar nicht nutzt.
 
Darauf hin hab ich dann folgendes versucht und jeden schritt mit der MsgBox abgefangen:
Private Sub Form_Unload(Cancel As Integer)
       
        MsgBox "Ich bin eine testbox"
       
        Dim Antwort As Integer
        Antwort = MsgBox("Möchten Sie die Änderungen speichern?", vbYesNoCancel, "Speichern?")
        Select Case Antwort
            Case vbYes
                ' Änderungen speichern
                MsgBox "Ich möchte speichern"
                DoCmd.RunCommand acCmdSaveRecord
            Case vbNo
                ' Änderungen verwerfen
                MsgBox "Ich möchte verwerfen"
                Me.Undo
            Case vbCancel
                ' Schließen verhindern
                MsgBox "Ich möchte canceln"
                Cancel = True
        End Select
   
End Sub
Leider funktioniert auch dass nicht. Zwar nutzt er je nach Eingabe in der MsgBox, den jeweiligen Abzweig, Aber wenn man z.b. eine Summe eingetragen hat und dann das Fenster schließt ohne zu speichern, erstellt er denoch einen Eintrag in der Tabelle.

Ich habe den Eindruck, dass Access, sobald man etwas in einem der Felder des Formulars schreibt/einträgt, automatisch oder umgehend ein neuer Eintrag in der Tabelle erstellt wird.
Ist dass so? und wenn ja wie kann ich das unterbinden?
Muss ich da etwas spezielles in den Einstellungen des Formulars einstellen?
oder mach ich einen anderen Fehler?

Wenn ihr es bis hierhin geschafft habt, möchte ich mich schon mal bedanken und hoffe ihr könnt mir weiterhelfen.

LG Daniel

Knobbi38

Hallo Daniel,

mit der Form.Undo Methode kannst du alle Änderungen in einem Formular rückgängig machen. Siehe dir mal die Beispiele aus der Doku an.

Aber, und jetzt wird es eventuell etwas unangenehm. Wenn du in dieser Weise ein Formular öffnest, wird automatisch ein neuer DS angefangen und zum editieren benutzt. Eventuelle Autowerte sind damit bereits inkrementiert worden, selbst wenn du jetzt alle Edit- und Insert Aktionen abbrichst. Das läßt sich so nicht verhindern.

Gruß Knobbi38

PhilS

Zitat von: dafra am Januar 28, 2025, 14:33:38Private Sub Form_Unload(Cancel As Integer)
      ' Verwerfen aller Eingaben
Form_Unload ist viel zu spät für diese Aktion. Da sind die Daten schon längst gespeichert.
Form_BeforeUpdate wäre dafür eher geeignet.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

dafra

Hallo

Entschuldigt die späte Antwort. Aber im Geschäft hat man gedacht die Welt geht unter.  ;D

Aber jetzt konnte ich es ausprobieren.

Erst einmal euch BEIDEN vielen Dank. Es hatten ja beide recht und PhilS hatte sogar noch die perfekte Lösung dazu!

Zitat von: PhilS am Januar 28, 2025, 16:13:43Form_BeforeUpdate wäre dafür eher geeignet.
Das war die Lösung! DANKE!

lg Daniel