DbRRollback()
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
DbRRollback()
Hi,
nachdem ich nun auch ein wenig im Wiki mitmische(n darf), bin ich gerade bei einer Auflistung auf die Funktion DbRRollback() (komisch, habe ich die ganze Zeit übersehen) gestossen. Hat jemand von euch damit schon tiefere Erkenntnisse sammeln können und könnte seine Erfahrung hier ausbreiten? Es klingt ja zunächst recht toll, aber ist es wirklich so einfach wie man vermuten könnte? Also wenn man jetzt z.B. eine Kette von DBF hat, in die abhängig voneinander Daten schreiben muß in einem Rutsch, aber eine davon Mucken macht, man dann wieder alles vorhergehende zurücksetzen kann mit dieser Funktion? Also ein ähnliches Verfahren wie bei einer SQL Datenbank, nur eben nicht selbst geschrieben.
nachdem ich nun auch ein wenig im Wiki mitmische(n darf), bin ich gerade bei einer Auflistung auf die Funktion DbRRollback() (komisch, habe ich die ganze Zeit übersehen) gestossen. Hat jemand von euch damit schon tiefere Erkenntnisse sammeln können und könnte seine Erfahrung hier ausbreiten? Es klingt ja zunächst recht toll, aber ist es wirklich so einfach wie man vermuten könnte? Also wenn man jetzt z.B. eine Kette von DBF hat, in die abhängig voneinander Daten schreiben muß in einem Rutsch, aber eine davon Mucken macht, man dann wieder alles vorhergehende zurücksetzen kann mit dieser Funktion? Also ein ähnliches Verfahren wie bei einer SQL Datenbank, nur eben nicht selbst geschrieben.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2824
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 95 Mal
- Danksagung erhalten: 13 Mal
Re: DbRRollback()
Hallo, Manfred -
so wie ich die Dokumentation verstehe, bezieht sich das immer nur auf die aktuelle Zeile (= Record) einer DBF-Datei. In wie weit man das kaskadieren kann, weiss ich nicht. Wenn Du z.B. eine Rechnung erzeugst, und den Kopfsatz und drei von vier Positionssätzen geschrieben hast, kannst Du m.E. nur den letzten Positionssatz, nicht aber die beiden davor, zurückrollen.
so wie ich die Dokumentation verstehe, bezieht sich das immer nur auf die aktuelle Zeile (= Record) einer DBF-Datei. In wie weit man das kaskadieren kann, weiss ich nicht. Wenn Du z.B. eine Rechnung erzeugst, und den Kopfsatz und drei von vier Positionssätzen geschrieben hast, kannst Du m.E. nur den letzten Positionssatz, nicht aber die beiden davor, zurückrollen.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: DbRRollback()
Es geht mir auch wenn erstmal darum nur 1 Satz zurück zu holen.
Meine Idee wäre, die DBF Namen in ein Array zu schreiben z.B., die alle abgearbeitet werden müssen. Das Array wird durchlaufen und schreibt DBF für DBF der Reihe nach zurück (würde bei mir einfach gehen, weil ich mit Klassen arbeite, die einfach nur einen Methode aufrufen und dann wissen, was gespeichert werden muß) und merkt sich welche zuletzt erfolgreich abgearbeitet wurde. Sollte an irgendeiner Stelle ein Problem auftauchen, wird rückwärts (oder wie auch immer) jede DBF, die schon geschrieben wurde (mit 1 Satz im Moment) "zurückgerollt". Das würde aber auch bedeuten, dass Xbase++ sich alle Felder einer DBF irgendwo im Cache hält mit den "alten" Daten. OK, sowas könnte man auch selbst programmieren, aber wenn es sowas vom System her gibt, warum dann nochmals das Rad neu erfinden?
Meine Idee wäre, die DBF Namen in ein Array zu schreiben z.B., die alle abgearbeitet werden müssen. Das Array wird durchlaufen und schreibt DBF für DBF der Reihe nach zurück (würde bei mir einfach gehen, weil ich mit Klassen arbeite, die einfach nur einen Methode aufrufen und dann wissen, was gespeichert werden muß) und merkt sich welche zuletzt erfolgreich abgearbeitet wurde. Sollte an irgendeiner Stelle ein Problem auftauchen, wird rückwärts (oder wie auch immer) jede DBF, die schon geschrieben wurde (mit 1 Satz im Moment) "zurückgerollt". Das würde aber auch bedeuten, dass Xbase++ sich alle Felder einer DBF irgendwo im Cache hält mit den "alten" Daten. OK, sowas könnte man auch selbst programmieren, aber wenn es sowas vom System her gibt, warum dann nochmals das Rad neu erfinden?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: DbRRollback()
@Manfred schau dir mal die Funktion AX_Transaction() von ADS an. Damit lassen sich viele Sätzte zurückholen
Cu Carlo
Cu Carlo
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: DbRRollback()
Ich habe es mal einfach ausprobiert. Satz geändert und direkt danach ein DbRRollback() wie im Handbuch beschrieben. Da hat sich nichts geändert auf den vorherigen Wert. Scheint also nicht mal so eben zu klappen. Oder gilt das nur, wenn ein Fehler mittendrin aufgetreten ist? So genau vermag ich das aus der Beschreibung nicht zu erkennen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2934
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: DbRRollback()
Hallo Manfred,
also ich verstehe das so, dass das nur klappt, wenn beim Schreiben eines Datensatzes ein Fehler passiert, also bei irgendeinem replace...with.. ein Laufzeitfehler entsteht (z. B. wenn du eine Datumsfeld mit einer Stringvariablen ersetzen willst). Dieses abgefangen durch BEGIN... RECOVER...END SEQUENCE, dann kannst du, bevor ein Commit() auf dem Datenatz erfolgt ist, diese Funktion benutzen. Sobald du jedoch alles geschrieben hast und den Satz abschließt/entsperrst (impliziert ein commit) geht das nicht mehr.
also ich verstehe das so, dass das nur klappt, wenn beim Schreiben eines Datensatzes ein Fehler passiert, also bei irgendeinem replace...with.. ein Laufzeitfehler entsteht (z. B. wenn du eine Datumsfeld mit einer Stringvariablen ersetzen willst). Dieses abgefangen durch BEGIN... RECOVER...END SEQUENCE, dann kannst du, bevor ein Commit() auf dem Datenatz erfolgt ist, diese Funktion benutzen. Sobald du jedoch alles geschrieben hast und den Satz abschließt/entsperrst (impliziert ein commit) geht das nicht mehr.
Viele Grüße
Wolfgang
Wolfgang
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: DbRRollback()
Hi Wolfgang,
im Beispiel steht aber ein Commit und danach kommt erst das Rollback. Oder sehe ich das jetzt falsch?
im Beispiel steht aber ein Commit und danach kommt erst das Rollback. Oder sehe ich das jetzt falsch?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2934
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: DbRRollback()
Ja, das siehst du falsch
Bei REPLACE... kommt der Fehler, damit wird DbCommit() nicht erreicht, es geht weiter beim RECOVER statement und da kommt dann DbRRollback().
Code: Alles auswählen
bErr := Errorblock( {|o| Break(o) } )
BEGIN SEQUENCE
REPLACE FIELD->TINYINT WITH nNumber
DbCommit()
ErrorBlock( bErr )
RECOVER USING oErr
ErrorBlock( bErr )
Alert( "Error: " + oErr:description )
DbRRollback()
ENDSEQUENCE
Viele Grüße
Wolfgang
Wolfgang
- Manfred
- Foren-Administrator
- Beiträge: 21186
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: DbRRollback()
Stimmt,
sollte mal meine Augen aufmachen.
Aber damit erübrigt sich meine anfängliche Frage, was möglich wäre, wenn man Kettenabläufe hat. Also mehrere Tabellen updatet und bei der letzten z.B. ein Problem auftaucht. Ich hatte angenomen, man könnte dann alles zurückspielen. Das ist aber dann nicht so und damit bringt die Funktion eigentlich nicht so richtig etwas. M.E.
sollte mal meine Augen aufmachen.
Aber damit erübrigt sich meine anfängliche Frage, was möglich wäre, wenn man Kettenabläufe hat. Also mehrere Tabellen updatet und bei der letzten z.B. ein Problem auftaucht. Ich hatte angenomen, man könnte dann alles zurückspielen. Das ist aber dann nicht so und damit bringt die Funktion eigentlich nicht so richtig etwas. M.E.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2828
- Registriert: Fr, 10. Feb 2006 9:51
- Wohnort: Aachen
- Hat sich bedankt: 259 Mal
- Danksagung erhalten: 12 Mal
- Kontaktdaten:
Re: DbRRollback()
Na ja...Manfred hat geschrieben:...Das ist aber dann nicht so und damit bringt die Funktion eigentlich nicht so richtig etwas. M.E.
Wenn man sich zumindest sicher sein kann, dass der Datensatz ganz oder gar nicht geändert wurde: das ist doch auch schon mal etwas
-
Aber so richtig klasse wird es erst, wenn man mit Transaktionen arbeitet. Und die können nun mal nur (verständlicherweise) Datenbankserver
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück