' tb-screen: 80x25 ' tb-tempdir ' ISAM (Spec isam-datenbank, Anforderung "Transaktionen mit Ruecknahme"): ' BEGINTRANS/COMMITTRANS schreibt fest, ROLLBACK ALL stellt Saetze und ' Indizes wieder her und beendet die Transaktion, SAVEPOINT liefert eine ' Kennung und ROLLBACK kennung setzt nur bis dorthin zurueck. ' Laeuft in einem temporaeren Verzeichnis. TYPE Posten Nr AS INTEGER Text AS STRING * 6 END TYPE DIM p AS Posten ON ERROR GOTO Handler OPEN "buch.isam" FOR ISAM Posten "Posten" AS #1 CREATEINDEX #1, "NachNr", 1, "Nr" SETINDEX #1, "NachNr" ' --- 8.1: COMMITTRANS schreibt fest; nach erneutem Oeffnen ist alles da --- BEGINTRANS p.Nr = 1 p.Text = "eins" INSERT #1, p p.Nr = 2 p.Text = "zwei" INSERT #1, p COMMITTRANS CLOSE #1 OPEN "buch.isam" FOR ISAM Posten "Posten" AS #1 SETINDEX #1, "NachNr" PRINT "nach COMMITTRANS:"; GOSUB Durchlauf ' --- 8.3: ROLLBACK ALL nimmt Einfuegen und Loeschen zurueck --- BEGINTRANS p.Nr = 3 p.Text = "drei" INSERT #1, p SEEKEQ #1, 1 DELETE #1 PRINT "in der Transaktion:"; GOSUB Durchlauf ROLLBACK ALL PRINT "nach ROLLBACK ALL:"; GOSUB Durchlauf ' Die Transaktion ist beendet — ein weiteres ROLLBACK ist unzulaessig. ROLLBACK ALL ' --- 8.4: SAVEPOINT und ROLLBACK kennung --- BEGINTRANS p.Nr = 4 p.Text = "vier" INSERT #1, p s% = SAVEPOINT PRINT "Sicherungspunkt:"; s% p.Nr = 5 p.Text = "fuenf" INSERT #1, p p.Nr = 6 p.Text = "sechs" INSERT #1, p PRINT "vor ROLLBACK:"; GOSUB Durchlauf ROLLBACK s% PRINT "nach ROLLBACK s:"; GOSUB Durchlauf ' Die Transaktion laeuft weiter und laesst sich festschreiben. COMMITTRANS PRINT "nach COMMITTRANS:"; GOSUB Durchlauf CLOSE #1 PRINT "fertig" END Durchlauf: MOVEFIRST #1 DO WHILE NOT EOF(1) RETRIEVE #1, p PRINT " "; RTRIM$(p.Text); MOVENEXT #1 LOOP PRINT RETURN Handler: PRINT "ERR="; ERR RESUME NEXT