' 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
