Discussion:
Endlosformular: alle Eingaben verwerfen
(zu alt für eine Antwort)
FSDV
2008-04-09 13:42:04 UTC
Permalink
Hallo,

ich habe folgendes Problem:

Ich habe ein Endlosformular in dem Personen angezeigt werden. Über
Kombinationsfelder kann ich bestimmte Eigenschaften der Personen
beeinflussen. Jetzt möchte ich gern eine Abbrechen Schaltfläche realisieren.
Ich habe es dann einfach mit Me.Undo versucht, dann macht er aber immer nur
die letzte Aktion am letzten Datensatz rückgängig. Dann habe ich versucht
beim Laden des Formulars ein ungebundenes Recordset zu erstellen und die
Daten dort hinein zu kopieren. Beim Abbrechen soll dieses Recordset dann
wieder zurück geschrieben werden. Das hat aber auch nícht funktioniert, bzw.
ich bin daran gescheitert das Recordset zu kopieren / zurück zu kopieren.
Bitte keine Lösung mit einem Before Update Ereignis, da dieses Ereignis
seltsame Fehler in dem Formular verursacht.

Wie kann man das denn noch lösen?

Vielen Dank,
Michael Witzik
André Minhorst
2008-04-09 14:05:01 UTC
Permalink
Hi Michael,
Post by FSDV
Ich habe ein Endlosformular in dem Personen angezeigt werden. Über
Kombinationsfelder kann ich bestimmte Eigenschaften der Personen
beeinflussen. Jetzt möchte ich gern eine Abbrechen Schaltfläche
realisieren. Ich habe es dann einfach mit Me.Undo versucht, dann macht
er aber immer nur die letzte Aktion am letzten Datensatz rückgängig.
Dann habe ich versucht beim Laden des Formulars ein ungebundenes
Recordset zu erstellen und die Daten dort hinein zu kopieren. Beim
Abbrechen soll dieses Recordset dann wieder zurück geschrieben werden.
Das hat aber auch nícht funktioniert, bzw. ich bin daran gescheitert das
Recordset zu kopieren / zurück zu kopieren. Bitte keine Lösung mit einem
Before Update Ereignis, da dieses Ereignis seltsame Fehler in dem
Formular verursacht.
Wie kann man das denn noch lösen?
wenn Du den Datensatz wechselst, wird der vorherige Datensatz
gespeichert, da kann man nichts mehr rückgängig machen. Ausnahme: Die
ganze Geschichte läuft im Kontext einer Transaktion.

Eine solche auf ein Formular anzuwenden ist aber nicht trivial.

Ich habe mal ein Beispiel für ein Haupt-/Unterformular gemacht, wobei
die Änderungen im Unterformular (1:n-Beziehung) solange rückgängig
gemacht werden konnten, bis man den Datensatz des Hauptformulars
gewechselt hat.

Vielleicht kannst Du das für Dein Problem umsetzen:

http://www.access-entwicklerbuch.de/2007/index.php?page=buch&bookpage=Kap_04/07_02.html

Ciao
André
--
http://www.access-entwicklerbuch.de
http://www.access-im-unternehmen.de
Peter Doering
2008-04-09 15:28:15 UTC
Permalink
Hallo,
Post by FSDV
Ich habe ein Endlosformular in dem Personen angezeigt werden. Über
Kombinationsfelder kann ich bestimmte Eigenschaften der Personen
beeinflussen. Jetzt möchte ich gern eine Abbrechen Schaltfläche realisieren.
Ich habe es dann einfach mit Me.Undo versucht, dann macht er aber immer nur
die letzte Aktion am letzten Datensatz rückgängig. Dann habe ich versucht
beim Laden des Formulars ein ungebundenes Recordset zu erstellen und die
Daten dort hinein zu kopieren. Beim Abbrechen soll dieses Recordset dann
wieder zurück geschrieben werden. Das hat aber auch nícht funktioniert, bzw.
ich bin daran gescheitert das Recordset zu kopieren / zurück zu kopieren.
Bitte keine Lösung mit einem Before Update Ereignis, da dieses Ereignis
seltsame Fehler in dem Formular verursacht.
Warum gehst du nicht den umgekehrten Weg? Binde die Daten des Formulars an
eine temporaere Tabelle und spendiere dem Formular einen Update-Button.
Wenn der geklickt wird, schreib die Daten in die echte Tabelle.

Gruss - Peter
--
2. SQL Server-Entwickler-Konferenz
Nürnberg, 12./13.4.2008 + 19./20.4.2008
http://www.donkarl.com/SEK
FSDV
2008-04-10 09:00:09 UTC
Permalink
Hallo,

danke für eure Antworten. Ich habe aber noch eine andere Möglichkeit. Ich
erstelle beim Laden des Formulars ein Recordset mit den Daten aus der
Datenbank. Dieses Recordset verändert sich dann ja nicht mehr wenn sich die
Datenbank ändert.

Wie kann ich denn jetzt aber das Recordset zurück in die Datenbank
schreiben? Muss ich dass mit SQL machen?

Grüße,
Michael Witzik
Post by FSDV
Hallo,
Ich habe ein Endlosformular in dem Personen angezeigt werden. Über
Kombinationsfelder kann ich bestimmte Eigenschaften der Personen
beeinflussen. Jetzt möchte ich gern eine Abbrechen Schaltfläche
realisieren. Ich habe es dann einfach mit Me.Undo versucht, dann macht er
aber immer nur die letzte Aktion am letzten Datensatz rückgängig. Dann
habe ich versucht beim Laden des Formulars ein ungebundenes Recordset zu
erstellen und die Daten dort hinein zu kopieren. Beim Abbrechen soll
dieses Recordset dann wieder zurück geschrieben werden. Das hat aber auch
nícht funktioniert, bzw. ich bin daran gescheitert das Recordset zu
kopieren / zurück zu kopieren. Bitte keine Lösung mit einem Before Update
Ereignis, da dieses Ereignis seltsame Fehler in dem Formular verursacht.
Wie kann man das denn noch lösen?
Vielen Dank,
Michael Witzik
Peter Doering
2008-04-10 12:11:00 UTC
Permalink
Hallo,
Post by FSDV
danke für eure Antworten. Ich habe aber noch eine andere Möglichkeit. Ich
erstelle beim Laden des Formulars ein Recordset mit den Daten aus der
Datenbank. Dieses Recordset verändert sich dann ja nicht mehr wenn sich die
Datenbank ändert.
Nur, wenn es vom Typ Snapshot ist. Wenn du nichts angibst, wird es als
Dynaset angelegt und alle Felder bis auf den PK werden zur Laufzeit
nachgeladen.
Post by FSDV
Wie kann ich denn jetzt aber das Recordset zurück in die Datenbank
schreiben? Muss ich dass mit SQL machen?
Wiederum die Frage: warum willst du das Recordset zurueckschreiben? Du
musst bei Bedarf (Undo) doch nur die Ursprungswerte wieder zuruecksetzen.
Das wiederum kannst du, indem du die gebundenen Steuerelemente aus deinem
Snapshot aktualisierst. Beispiel:

Do While Not Rst.EOF
With Me
!Steuerelement1.Value = Rst.Fields("Feld1").Value
!Steuerelement2.Value = Rst.Fields("Feld2").Value
'usw.
End With
Rst.MoveNext
Loop

Gruss - Peter
--
2. SQL Server-Entwickler-Konferenz
Nürnberg, 12./13.4.2008 + 19./20.4.2008
http://www.donkarl.com/SEK
FSDV
2008-04-10 12:39:55 UTC
Permalink
Hallo,

das Problem ist aber, dass ich ein Endlosformular habe. Wie kann ich denn
dann die Steuerelemente jedes einzelnen Datensatzes ansprechen?

Grüße,
Michael Witzik
Post by FSDV
Hallo,
Post by FSDV
danke für eure Antworten. Ich habe aber noch eine andere Möglichkeit. Ich
erstelle beim Laden des Formulars ein Recordset mit den Daten aus der
Datenbank. Dieses Recordset verändert sich dann ja nicht mehr wenn sich die
Datenbank ändert.
Nur, wenn es vom Typ Snapshot ist. Wenn du nichts angibst, wird es als
Dynaset angelegt und alle Felder bis auf den PK werden zur Laufzeit
nachgeladen.
Post by FSDV
Wie kann ich denn jetzt aber das Recordset zurück in die Datenbank
schreiben? Muss ich dass mit SQL machen?
Wiederum die Frage: warum willst du das Recordset zurueckschreiben? Du
musst bei Bedarf (Undo) doch nur die Ursprungswerte wieder zuruecksetzen.
Das wiederum kannst du, indem du die gebundenen Steuerelemente aus deinem
Do While Not Rst.EOF
With Me
!Steuerelement1.Value = Rst.Fields("Feld1").Value
!Steuerelement2.Value = Rst.Fields("Feld2").Value
'usw.
End With
Rst.MoveNext
Loop
Gruss - Peter
--
2. SQL Server-Entwickler-Konferenz
Nürnberg, 12./13.4.2008 + 19./20.4.2008
http://www.donkarl.com/SEK
Thomas Möller
2008-04-10 16:32:59 UTC
Permalink
Hallo!
Post by FSDV
Post by Peter Doering
Do While Not Rst.EOF
With Me
!Steuerelement1.Value = Rst.Fields("Feld1").Value
!Steuerelement2.Value = Rst.Fields("Feld2").Value
'usw.
End With
Rst.MoveNext
Loop
das Problem ist aber, dass ich ein Endlosformular habe. Wie kann ich
denn dann die Steuerelemente jedes einzelnen Datensatzes ansprechen?
hast Du Peters Code schon einmal ausprobiert?

CU
--
Thomas

Homepage: www.Team-Moeller.de
Peter Doering
2008-04-10 22:32:07 UTC
Permalink
Hallo,
"Peter Doering" ...
Post by Peter Doering
Post by FSDV
danke für eure Antworten. Ich habe aber noch eine andere Möglichkeit. Ich
erstelle beim Laden des Formulars ein Recordset mit den Daten aus der
Datenbank. Dieses Recordset verändert sich dann ja nicht mehr wenn sich die
Datenbank ändert.
Nur, wenn es vom Typ Snapshot ist. Wenn du nichts angibst, wird es als
Dynaset angelegt und alle Felder bis auf den PK werden zur Laufzeit
nachgeladen.
Post by FSDV
Wie kann ich denn jetzt aber das Recordset zurück in die Datenbank
schreiben? Muss ich dass mit SQL machen?
Wiederum die Frage: warum willst du das Recordset zurueckschreiben? Du
musst bei Bedarf (Undo) doch nur die Ursprungswerte wieder zuruecksetzen.
Das wiederum kannst du, indem du die gebundenen Steuerelemente aus deinem
Do While Not Rst.EOF
With Me
!Steuerelement1.Value = Rst.Fields("Feld1").Value
!Steuerelement2.Value = Rst.Fields("Feld2").Value
'usw.
End With
Rst.MoveNext
Loop
das Problem ist aber, dass ich ein Endlosformular habe. Wie kann ich denn
dann die Steuerelemente jedes einzelnen Datensatzes ansprechen?
Ja, das Beispiel war nur als Anregung gedacht, das mit dem Recordset war
deine Idee ;-) In diesem Fall musst du halt zwei Recordsets durchlaufen,
einmal das Snapshot, und gleichzeitig den RecordsetClone. In diesem Fall
waere SQL in der Tat besser, und noch besser waere, meinen Vorschlag mit
der Temp-Tabelle umzusetzen. ;-)

Gruss - Peter
--
2. SQL Server-Entwickler-Konferenz
Nürnberg, 19./20.4.2008
http://www.donkarl.com/SEK
FSDV
2008-04-11 09:13:35 UTC
Permalink
Ok,

ich habe gestern folgendes probiert:

Ein Recordset als Snapshot erstellt und beim Abbrechen Ereignis per SQL alle
Werte aus dem Recordset in die DB zurückgeschrieben. Soweit hat alles
funktioniert. ABER: Immer beim Schließen des Formulars hat er die Änderungen
am letzten veränderten Datensatz wieder rückgängig gemacht. Ich habe alles
versucht, aber Access hat immer den letzten Datensatz wiederhergestellt und
meine SQL-Änderung wieder verworfen.

Jemand ne Ahnung warum?

Grüße,
Michael Witzik
Post by FSDV
Hallo,
"Peter Doering" ...
Post by Peter Doering
Post by FSDV
danke für eure Antworten. Ich habe aber noch eine andere Möglichkeit. Ich
erstelle beim Laden des Formulars ein Recordset mit den Daten aus der
Datenbank. Dieses Recordset verändert sich dann ja nicht mehr wenn sich die
Datenbank ändert.
Nur, wenn es vom Typ Snapshot ist. Wenn du nichts angibst, wird es als
Dynaset angelegt und alle Felder bis auf den PK werden zur Laufzeit
nachgeladen.
Post by FSDV
Wie kann ich denn jetzt aber das Recordset zurück in die Datenbank
schreiben? Muss ich dass mit SQL machen?
Wiederum die Frage: warum willst du das Recordset zurueckschreiben? Du
musst bei Bedarf (Undo) doch nur die Ursprungswerte wieder
zuruecksetzen.
Das wiederum kannst du, indem du die gebundenen Steuerelemente aus deinem
Do While Not Rst.EOF
With Me
!Steuerelement1.Value = Rst.Fields("Feld1").Value
!Steuerelement2.Value = Rst.Fields("Feld2").Value
'usw.
End With
Rst.MoveNext
Loop
das Problem ist aber, dass ich ein Endlosformular habe. Wie kann ich denn
dann die Steuerelemente jedes einzelnen Datensatzes ansprechen?
Ja, das Beispiel war nur als Anregung gedacht, das mit dem Recordset war
deine Idee ;-) In diesem Fall musst du halt zwei Recordsets durchlaufen,
einmal das Snapshot, und gleichzeitig den RecordsetClone. In diesem Fall
waere SQL in der Tat besser, und noch besser waere, meinen Vorschlag mit
der Temp-Tabelle umzusetzen. ;-)
Gruss - Peter
--
2. SQL Server-Entwickler-Konferenz
Nürnberg, 19./20.4.2008
http://www.donkarl.com/SEK
Peter Doering
2008-04-12 23:53:47 UTC
Permalink
Hallo,
"Peter Doering" ...
Post by Peter Doering
"Peter Doering" ...
Post by Peter Doering
Post by FSDV
danke für eure Antworten. Ich habe aber noch eine andere Möglichkeit. Ich
erstelle beim Laden des Formulars ein Recordset mit den Daten aus der
Datenbank. Dieses Recordset verändert sich dann ja nicht mehr wenn sich die
Datenbank ändert.
Nur, wenn es vom Typ Snapshot ist. Wenn du nichts angibst, wird es als
Dynaset angelegt und alle Felder bis auf den PK werden zur Laufzeit
nachgeladen.
Post by FSDV
Wie kann ich denn jetzt aber das Recordset zurück in die Datenbank
schreiben? Muss ich dass mit SQL machen?
Wiederum die Frage: warum willst du das Recordset zurueckschreiben? Du
musst bei Bedarf (Undo) doch nur die Ursprungswerte wieder
zuruecksetzen.
Das wiederum kannst du, indem du die gebundenen Steuerelemente aus deinem
Do While Not Rst.EOF
With Me
!Steuerelement1.Value = Rst.Fields("Feld1").Value
!Steuerelement2.Value = Rst.Fields("Feld2").Value
'usw.
End With
Rst.MoveNext
Loop
das Problem ist aber, dass ich ein Endlosformular habe. Wie kann ich denn
dann die Steuerelemente jedes einzelnen Datensatzes ansprechen?
Ja, das Beispiel war nur als Anregung gedacht, das mit dem Recordset war
deine Idee ;-) In diesem Fall musst du halt zwei Recordsets durchlaufen,
einmal das Snapshot, und gleichzeitig den RecordsetClone. In diesem Fall
waere SQL in der Tat besser, und noch besser waere, meinen Vorschlag mit
der Temp-Tabelle umzusetzen. ;-)
Gruss - Peter
Ein Recordset als Snapshot erstellt und beim Abbrechen Ereignis per SQL alle
Werte aus dem Recordset in die DB zurückgeschrieben. Soweit hat alles
funktioniert. ABER: Immer beim Schließen des Formulars hat er die Änderungen
am letzten veränderten Datensatz wieder rückgängig gemacht. Ich habe alles
versucht, aber Access hat immer den letzten Datensatz wiederhergestellt und
meine SQL-Änderung wieder verworfen.
Jemand ne Ahnung warum?
Vermutlich, weil der letzte DS zum Zeitpunkt des Updates dirty war und beim
Schliessen der aktuelle Inhalt nochmal ueber deinen restaurierten
druebergeschrieben hat. Eigentlich haettest du eine entsprechende Meldung
in der Art "dieser Datensatz wurde durch einen anderen Benutzer veraendert
... ueberschreiben / in die Zwischenablage / verwerfen?" bekommen muessen,
aber sei's drum.

Wenn du den Weg weiterverfolgen willst, solltest du dafuer Sorge tragen,
dass der zuletzt editierte DS entweder geschrieben oder verworfen wird:

Me.Dirty = False 'schreibt
Me.Undo 'verwirft.

Gruss - Peter
--
2. SQL Server-Entwickler-Konferenz
Nürnberg, 19./20.4.2008
http://www.donkarl.com/SEK
Loading...