' tb-screen: 80x25 ' tb-tempdir ' ISAM (Spec isam-datenbank, Anforderung "Satzoperationen auf dem aktuellen ' Satz"): INSERT/RETRIEVE feldgleich, UPDATE/DELETE mit unpositioniertem ' Cursor danach, Fehler 85 ohne aktuellen Satz, Fehler 86 bei Verstoss gegen ' einen eindeutigen Index mit unveraendertem Bestand, und Indexnachfuehrung ' nach jeder Satzoperation. Laeuft in einem temporaeren Verzeichnis. TYPE Artikel Nr AS LONG Name AS STRING * 8 Preis AS DOUBLE Menge AS INTEGER END TYPE DIM a AS Artikel, g AS Artikel ON ERROR GOTO Handler OPEN "lager.isam" FOR ISAM Artikel "Artikel" AS #1 CREATEINDEX #1, "NachNr", 1, "Nr" CREATEINDEX #1, "NachName", 0, "Name" ' --- 7.1: einfuegen, per SEEKEQ finden und feldgleich zurueckelesen --- a.Nr = 100 a.Name = "Schraube" a.Preis = 1.25 a.Menge = 7 INSERT #1, a a.Nr = 200 a.Name = "Mutter" a.Preis = 0.5 a.Menge = 3 INSERT #1, a SETINDEX #1, "NachNr" SEEKEQ #1, 100 RETRIEVE #1, g PRINT "gelesen:"; g.Nr; RTRIM$(g.Name); g.Preis; g.Menge PRINT "feldgleich:"; (g.Nr = 100) AND (RTRIM$(g.Name) = "Schraube") AND (g.Preis = 1.25) AND (g.Menge = 7) ' --- 7.3: RETRIEVE ohne positionierten Cursor meldet 85 --- ' Hinter dem letzten Satz gibt es keinen aktuellen Satz mehr. MOVELAST #1 MOVENEXT #1 RETRIEVE #1, g ' --- 7.3: UPDATE ohne positionierten Cursor meldet 85 --- MOVELAST #1 MOVENEXT #1 UPDATE #1, a ' --- 7.3: DELETE ohne positionierten Cursor meldet 85 --- MOVELAST #1 MOVENEXT #1 DELETE #1 ' --- 7.5: UPDATE der indizierten Spalte fuehrt den Index nach --- SETINDEX #1, "NachName" PRINT "vor UPDATE:"; GOSUB Namen SEEKEQ #1, "Schraube" RETRIEVE #1, g g.Name = "Anker" UPDATE #1, g PRINT "nach UPDATE:"; GOSUB Namen ' --- 7.4: Verstoss gegen einen eindeutigen Index meldet 86 --- PRINT "Bestand vor 86:"; LOF(1) a.Nr = 200 a.Name = "Doppelt" a.Preis = 9 a.Menge = 1 INSERT #1, a PRINT "Bestand nach 86:"; LOF(1) ' --- 7.2: UPDATE und DELETE; Cursor danach unpositioniert --- SETINDEX #1, "NachNr" SEEKEQ #1, 200 RETRIEVE #1, g g.Menge = 99 UPDATE #1, g SEEKEQ #1, 200 RETRIEVE #1, g PRINT "nach UPDATE Menge:"; g.Menge ' Der Satz mit Nr 200 ist im Index NachNr der letzte; nach seinem Loeschen ' steht der Cursor am Ende der Tabelle und es gibt keinen aktuellen Satz. SEEKEQ #1, 200 DELETE #1 PRINT "nach DELETE Bestand:"; LOF(1); "EOF:"; EOF(1) RETRIEVE #1, g ' Wird dagegen ein Satz mit Nachfolger geloescht, wird dieser der aktuelle. SETINDEX #1, "NachNr" a.Nr = 300 a.Name = "Duebel" a.Preis = 2 a.Menge = 5 INSERT #1, a SEEKEQ #1, 100 DELETE #1 RETRIEVE #1, g PRINT "nach DELETE ist aktuell:"; g.Nr CLOSE #1 PRINT "fertig" END ' Namen in der Ordnung des Index NachName ausgeben. Namen: MOVEFIRST #1 DO WHILE NOT EOF(1) RETRIEVE #1, g PRINT " "; RTRIM$(g.Name); MOVENEXT #1 LOOP PRINT RETURN Handler: PRINT "ERR="; ERR RESUME NEXT