2013-01-03 11 views
5

Schnelle Frage hier, in der Hoffnung auf eine präzise vernünftige Lösung.Schließen eines gebundenen Formulars ohne Speichern von Änderungen

Ich habe eine gebundene Form rein für die Dateneingabe (Datensätze können nicht durchsuchen, nur einfügen). Ich werde viele Benutzer haben, die vermasseln. Um schmutzige Daten zu vermeiden, möchte ich, dass sie bestätigen, dass das Formular korrekt ist, bevor Sie den Datensatz senden.

Problem ist, sobald ich ALLES auf dem Formular eingegeben habe, erstellt und speichert ein Zugriff einen Datensatz.

Ich möchte, dass der Datensatz nur gespeichert und festgeschrieben wird, wenn der Benutzer auf "Senden" klickt. Wenn sie auf "Schließen" klicken oder die Anwendung beenden, möchte ich diesen unvollständigen Datensatz nicht in der Datenbank speichern.

Ohne Verwendung eines ungebundenen Formulars und Aufruf einer Einfügefunktion, gibt es eine einfache Lösung?

+1

Sie können einen Datensatz rückgängig machen, solange Sie kein Unterformular haben. – Fionnuala

+0

@remou Wie wirkt sich das auf die automatische Nummerierung aus? Angenommen, ich habe zwei gleichzeitige Benutzer im Formular. Benutzer 1 Öffnet das Formular und beginnt zuerst, Daten einzugeben. Benutzer 2 öffnet dann das Formular und gibt die Daten selbst ein. Benutzer 1 entscheidet, dass er bessere Dinge zu tun hat als Dateneingabe und klickt auf die Schaltfläche "Rückgängig machen". Ich schätze, das würde zu einer Lücke in den Zahlen führen (wie ein Einfügen dann ein Löschen, anstatt ein Rollback oder fehlendes Commit?) – Scotch

+0

Überprüfen Sie auch [: Sie könnten einen boolean haben, bevor Formular aktualisiert werden] (http://bytes.com/topic/access/insights/891249-how-stop-bound-forms-updating-automatically). In Bezug auf die Konsistenz von Autoincrementer, könnten Sie immer eine Validierung haben, bevor eine Einfügung stattfindet ... – bonCodigo

Antwort

6

Eine Auto-Nummer ist eindeutig, nicht sequentiell. Wenn Sie eine fortlaufende Nummer benötigen, verwenden Sie keine automatische Nummerierung. Die automatische Nummer sollte dem Benutzer niemals angezeigt werden. Man kann sich niemals darauf verlassen, dass alles andere als einzigartig ist, und wenn man sich genug damit beschäftigt, nicht einmal das.

Private Sub Form_BeforeUpdate(Cancel As Integer) 
If Me.AText = "Invalid" Then 
    Me.Undo 
    Cancel = True 
End If 
End Sub 

Hinweis, dass ein Formular mit einem Unterformular nicht mit Undo arbeiten kann, da der Datensatz auf Wechsel vom Unterformular mit dem Hauptformular und umgekehrt verpflichtet ist und es wird ziemlich kompliziert.

+0

Ja, ich habe ein Unterformular mit einer viel-eins-Beziehung zum Elternformular. Wenn jemand stornieren/rückgängig machen würde, bezweifle ich, dass sie bis zum Punkt des Ausfüllens des Unterformulars gekommen wären, also könnte dies genug sein. Wenn nicht, könnte ich vor dem Rückgängigmachen einfach eine Löschabfrage in der zugehörigen Tabelle ausführen. Vielen Dank. – Scotch

3

Remou Methode ist definitiv der schnellste, hier ist eine andere basiert auf meinen Kommentar;)

Option Explicit 

Private blnGood As Boolean 

Private Sub cmdSubmit_Click() 
    blnGood = True 
    Call DoCmd.RunCommand(acCmdSaveRecord) 
    blnGood = False 
End Sub 

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    If Not blnGood Then 
     Cancel = True 
     Call MsgBox(Prompt:="click submit to save the record", Title:="Before Update") 
    End If 
End Sub 
2

Sie den folgenden Code verwenden, um eine Löschtaste zu erstellen, falls der Benutzer einen Fehler gemacht und möchte die klar ganze Form und neu beginnen.

Private Sub btnClear_Click() 
    If Me.Dirty = True Then 
    DoCmd.RunCommand acCmdUndo 
    Exit Sub 
    End If 
End Sub` 

ich manchmal das BEFORE_UPDATE Veranstaltung seltsam wirken so im Allgemeinen deaktiviere ich die Nähe (x), um in den Eigenschaften und fügen Sie eine Schaltfläche zum Schließen von meiner eigenen, das den Benutzer auffordert, wenn er die Daten verlassen will auf Bildschirm.

Private Sub close_Click() 
Dim Answer As Integer 
If Me.Dirty = True Then 
    Dim Response As Integer 
    ' Displays a message box with the yes and no options. 
    Response = MsgBox(Prompt:="Do you wish to discard data?", Buttons:=vbYesNo) 
    ' If statement to check if the yes button was selected. 
    If Response = vbYes Then 
     DoCmd.RunCommand acCmdUndo 
     DoCmd.Close 
     Else 
     Me.Clear.SetFocus 
    End If 
Else 
    ' The no button was selected. 
    DoCmd.Close 
    End If 
End Sub 
Verwandte Themen