PDA

Vollständige Version anzeigen : Speichern v. Daten verhindern


Maxs
25.06.2001, 14:30
hi hi leute
...wie kann ich es erreichen - dass daten nicht in der tabelle abgespeichert werden - wenn das formular geschlossen wird
ich möchte dem user doch bloss die möglichkeit geben seine eingegebenen daten verwerfen zu können - wenn er in der msgbox auf "Abbrechen" klickt
wäre nett - wenn mir jemand auf die sprünge helfen könnte
:-) danke schon mal

A.S.
25.06.2001, 14:33
Hallo Max,

es währe Dir, und allen anderen, Hilfreich, wenn Du uns denn Mitteilen würdest, was Du bereits alles ausprobiert hast. Dann würden Dir diese unergiebigen Vorschläge erspart bleiben ;)

------------------
HTH

Arno

AWSW
25.06.2001, 16:31
Hallo,
schau mal hier nach, vielleicht hilft es ja:

Bitte helft mir (Datenspeichern) (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=45440)

Maxs
25.06.2001, 17:23
hallo AWSW
erstmal danke für Deine hilfe
ich hab gerade nochmal nachgeschaut - und die von Dir angesprochene frm-Eigenschaft ist auf "Keine Sperrung" eingestellt.

ich wollte das ganze aber auch noch mit einer msgbox (vbyesnoCancel)verbinden; wenn der user dann auf "Nein" klickt - das dann das frm geschlossen wird und die änderungen halt nicht übernommen werden
kannst Du mir helfen ?
ich hoffe es jetzt ein wenig deutlicher geworden
- sorry - das vorhin so knapp war
:-)
mfg maxs

AWSW
25.06.2001, 18:00
Hallo Maxs,
also es reicht mir, wenn Du die Postings in Deinem Beitrag jeweils einmal setzt. In meinem mit der Maus, bei der ich mittlerweile echt am Rad drehe (entschuldige den Kalauer :)), muss das dann nicht noch mal sein. Das verwirrt die anderen Teilnehmer und Du machst Dir zu viel Arbeit... Wäre gut wenn Du dein Posting in meinem Beitrag durch das Edittieren des gleichen wieder löschen könntest. Ich schau immer wieder zwischen durch in die Beiträge rein, die ich mit meinem bescheidenen Wissen versuche zu beantowrten... Macht aber nichts ;)

Also, dass mit Deiner Abrage könnte ich mir wie folgt vorstellen:


Private Sub Befehl225_Click()
On Error GoTo Err_Befehl225_Click

If MsgBox("Möchten Sie den eben eingegebenen Datensatz wieder löschen ???", vbQuestion + vbYesNo + vbDefaultButton1, "Wichtige Frage") = vbYes Then
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.Close , "Dein_Dateneingaben_Formular"
DoCmd.OpenForm "Dein_Folge_Formular"
Else
MsgBox "Löschvorgang abgebrochen. Der Datensatz wurde gespeichert", vbInformation, "Hinweis"
DoCmd.Close , "Dein_Dateneingaben_Formular"
DoCmd.OpenForm "Dein_Folge_Formular"
end if

Exit_Befehl225_Click:
Exit Sub

Err_Befehl225_Click:
MsgBox Err.Description
Resume Exit_Befehl225_Click

Ich hoffe das hilft Dir...

AWSW
25.06.2001, 20:17
Hallo Maxs,
ich schreibe mal hier weiter, da ich denke dass Dein Extra-Beitrag bestimmt geschlossen wird, da es für die Übersichtlichkeit des Forums hier besser ist nur 1 Beitrag zu 1 Problem zu führen...

Zu dem von Dir getippten Text:
Ich füge ihn hier einfach noch mal ein, da er dann nicht genz aus dem Zusammenhang verloren geht...

hi hi AWSW
also ich hab es probiert den beitrag zu löschen - aber es kommt immer wieder die Meldung - nur der Admin kann Einträge löschen - tut mir leid - also mich lassen sie nichts löschen

nun zu deinem Quellcode
wenn ich das richtig verstanden habe
werden die daten gelöscht wenn Ja geklickt
wird
und nein geklickt wird werden die daten gespeichert - richtig ?!?

das wäre dann die lösung für mein datenlöschproblem
danke !!!
aber ich wollte ganz gern wissen - wie man ein frm schließt ohne das die daten in tabelle übernommen werden
denn access macht das irgendwie automatisch
ich hab es so versucht:
Dim stDocName1 As String
stDocName1 = "HF_Mitglieder_aendern" DoCmd.close acForm, stDocName1, acSaveNo

aber das acSaveNo bezieht sich anscheinend nur auf die frm und nicht auf die daten

Private Sub close_Click()
Dim stDocName1 As String

Dim ant As String

ant = MsgBox(" Sind die eingegebenen Daten korrekt@ und können gespeichert werden ?@" + _" ", vbYesNo, "Datespeicherung")
If ant = vbYes Then
stDocName1 = "HF_Daten_aendern"
DoCmd.close acForm, stDocName1, acSaveYes
ELSE
' was müßte hier reinkommen - so das die daten nicht gespeichert werden

End If
End Sub

weißt Du was ich meine?

ich hoffe Du kannst mir helfen
mfg maxs

---------------------------------------------

Zum Löschen :)
Schau mal hier: Editieren.jpg Ich meinte eigentlich, hab mich auch blöd ausgedrückt, dass Du den Beitrag bitte editierst und dann den "Inhalt" löscht. <<< Mein Fehler, sorry. Im Bild siehst Du auch wo das geht...

Zum Löschen des Datensatzes

Eigentlich hatte ich auch gedacht, dass das mit dem "acSaveNo" beim Schließen sich darauf bezieht den DS zu speichern... Laut Hilfe hab ich auch eben noch was gelernt, bezieht sich wohl doch auf das Formular... :D

Mal eine andere Frage...:
Kannst Du nicht einfach einige für Dich wichtige Felder auf "Eingabe erforderlich" setzen ? Dann kannst Du doch schon mal fast sicherstellen, dass der Anwender nur einen Datensatz (DS) anlegt, wenn er es wirklich Daten eingeben will & dann würde ich dann die schon geschilderte Abfrage (Löschen Ja/Nein) einbauen beim Beenden.
Mir ist eben nur eingefallen, dass es vieleicht sinniger ist, zu fragen: "ob gespeichert werden soll..." ??? Wenn der User dann auf Nein klickt wird der DS wie gezeigt gelöscht, Du must dann nur die Aktionen über und unter ELSE tauschen...


Ich hoffe das Hilft Dir, muss leider los...
Probier das mal, sollte eigentlich klappen...

kama
26.06.2001, 06:29
Hollo und guten Morgen
Warum Arbeitest du nicht mit einer Temporären Tabelle und einer Anfügeabfrage.
Gehe folgendermaßen vor:
Erstelle dir eine kopie deiner Ursprungstabelle über
Bearbeiten/Kopieren/Einfügen
Wähle nur Structur und erweiter den Nmaen um TEMP
Kopiere dein Formular ebenfalls, wenn du es für etwas anderes als die Dateneingabe Brauchst und Arbeite mit dieser Kopie weiter.
Stelle die Eigenschaft Datenherkunft=
auf deine Neue Tabelle
Deises Formular benutzt du zur Dateneingabe.
Erstelle eine Anfügeabfrage die die Daten aus der TEMPTAbelle an deine Datentabelle anfügt.
Erstelle eine Löschabfrage die die Daten aus deiner Temptabelle Löscht

An die Eigenschaft beim schließen bindest du folgenden Code
Dim Klickergebnis
Beep
Klickergebnis = MsgBox("Möchten sie die soeben eingegebenen daten wirklich übernehmen?", vbOKCancel, "Daten gültig?")
If Klickergebnis = 1 Then
DoCmd.OpenQuery "Anfügeabfrage", acNormal, acEdit
Else
DoCmd.OpenQuery "Löschabfrage", acNormal, acEdit
End If
DoCmd.OpenQuery "Löschabfrage", acNormal, acEdit

Das ist mein Standardverfahren das ich mit gutem Erfolg Anwende

cpetit
26.06.2001, 07:14
Hallo,
habe das gleiche Problem und eine Lösung gefunden.
Gehe in dein Formular,
Ansicht Code und gib den gunten aufgeführten Code ein.
Bei der SQL-Anweisung mußt du statt Kunde deine Tabelle einfügen.
Bei mir funktioniert es.

Option Compare Database
Option Explicit

Private boolFrmDirty As Boolean
Private boolFrmSaved As Boolean


Private adoConnection As New ADODB.Connection
Private adoRecordset As New ADODB.Recordset

Private Sub Form_AfterDelConfirm(Status As Integer)
If Me.Saved = False Then Me.Saved = (Status = acDeleteOK)
End Sub

Private Sub Form_AfterUpdate()
Me.Saved = True
End Sub

Private Sub Form_Delete(Cancel As Integer)
If Me.Dirtied = False Then adoConnection.BeginTrans
Me.Dirtied = True
End Sub

Private Sub Form_Dirty(Cancel As Integer)
If Me.Dirtied = False Then adoConnection.BeginTrans
Me.Dirtied = True
End Sub

Private Sub Form_Open(Cancel As Integer)
Dim strConnect As String

' Sie müssen die folgende Zeichenfolge so abändern, dass der
' Server Name, die Benutzer ID, und das Passwort korrekt sind.
strConnect = "DATA PROVIDER=SQLOLEDB;DATA SOURCE=Myserver;" & _
"UID=sa;PWD=;DATABASE=Pubs"

adoConnection.Provider = "MSDataShape"
adoConnection.Open strConnect
adoRecordset.Open "SELECT * FROM Authors", adoConnection, _
adOpenKeyset, adLockOptimistic
Set Me.Recordset = adoRecordset
Me.UniqueTable = "Authors"
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim msg As Integer
If Me.Saved Then
msg = MsgBox("Möchten Sie die vorgenommenen Änderungen speichern?", _
vbYesNoCancel)
Select Case msg
Case vbYes
adoConnection.CommitTrans
Case vbNo
adoConnection.RollbackTrans
Case vbCancel
Cancel = True
End Select
Else
If Me.Dirtied Then adoConnection.RollbackTrans
End If
End Sub

Public Property Get Dirtied() As Boolean
Dirtied = boolFrmDirty
End Property

Public Property Let Dirtied(ByVal boolNewValue As Boolean)
boolFrmDirty = boolNewValue
End Property

Public Property Get Saved() As Boolean
Saved = boolFrmSaved
End Property

Public Property Let Saved(ByVal boolNewValue As Boolean)
boolFrmSaved = boolNewValue
End Property

Maxs
26.06.2001, 07:51
hallo cpetit
erstmal vielen dank an Dich und alle anderen
die mir helfen - ich werd mich gleich mal ran machen und schauen wie was es klappt

hmmmm cpetit - also ich weiß nich
bist Du Dir sicher das ich den kompletten von Dir gezeigten Code brauche oder doch nur diesen abschnitt als Bsp.:

Private Sub Form_Unload(Cancel As Integer)
Dim msg As Integer
If Me.Saved Then
msg = MsgBox("Möchten Sie die vorgenommenen Änderungen speichern?", _
vbYesNoCancel)
Select Case msg
Case vbYes
adoConnection.CommitTrans
Case vbNo
adoConnection.RollbackTrans
Case vbCancel
Cancel = True
End Select
Else
If Me.Dirtied Then adoConnection.RollbackTrans
End If
End Sub

oder versteh ich da etwas falsch denn mit server`n und connection dieser hab ich gerade nichts zu tun
Du machst wohl "solche ASP-Geschichten" oder ähnliches ?:-)?

trotzdem - nochmal danke an alle

mfg maxs

Birgit Dannenberg
26.06.2001, 07:58
Hallo Max,

hast Du es schon mal mit der UnDo-Methode probiert, oder ist Dir das zu simpel?! ;)

Birgit

cpetit
26.06.2001, 08:18
Habe dir den falschen Code gesendet
Tut mir leid
Aber du brauchst alles von dem Code.

Hier der richtige Code
Private boolFrmDirty As Boolean
Private boolFrmSaved As Boolean

Private Sub Form_AfterDelConfirm(Status As Integer)
If Me.Saved = False Then Me.Saved = (Status = acDeleteOK)
End Sub

Private Sub Form_AfterUpdate()
Me.Saved = True
End Sub

Private Sub Form_Delete(Cancel As Integer)
If Me.Dirtied = False Then DBEngine.BeginTrans
Me.Dirtied = True
End Sub

Private Sub Form_Dirty(Cancel As Integer)
If Me.Dirtied = False Then DBEngine.BeginTrans
Me.Dirtied = True
End Sub

Private Sub Form_Open(Cancel As Integer)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Kunden", dbOpenDynaset)
Set Me.Recordset = rs
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim msg As Integer
If Me.Saved Then
msg = MsgBox("Möchten Sie die vorgenommenen Änderungen speichern?", vbYesNoCancel)
Select Case msg
Case vbYes
DBEngine.CommitTrans
Case vbNo
DBEngine.Rollback
Case vbCancel
Cancel = True
End Select
Else
If Me.Dirtied Then DBEngine.Rollback
End If
End Sub

Public Property Get Dirtied() As Boolean
Dirtied = boolFrmDirty
End Property

Public Property Let Dirtied(boolFrmDirtyIn As Boolean)
boolFrmDirty = boolFrmDirtyIn
End Property

Public Property Get Saved() As Boolean
Saved = boolFrmSaved
End Property

Public Property Let Saved(boolFrmSavedIn As Boolean)
boolFrmSaved = boolFrmSavedIn
End Property