' tb-screen: 80x25
' tb-tempdir
' ISAM (Spec isam-datenbank, Anforderung "Indexverwaltung"): CREATEINDEX
' mit einer und mit mehreren Spalten, eindeutig und mehrdeutig, auf- und
' absteigend; SETINDEX/GETINDEX$, DELETEINDEX und die Fehler 83 und 84.
' Laeuft in einem temporaeren Verzeichnis.
TYPE Person
    Nachname AS STRING * 8
    Vorname AS STRING * 8
    Alter AS INTEGER
END TYPE
DIM p AS Person

ON ERROR GOTO Handler
OPEN "leute.isam" FOR ISAM Person "Leute" AS #1

p.Nachname = "Meier"
p.Vorname = "Anna"
p.Alter = 30
INSERT #1, p
p.Nachname = "Meier"
p.Vorname = "Bert"
p.Alter = 50
INSERT #1, p
p.Nachname = "Adam"
p.Vorname = "Cara"
p.Alter = 40
INSERT #1, p

' --- 5.2: eine Spalte, mehrdeutig, aufsteigend ---
CREATEINDEX #1, "NachName", 0, "Nachname"
SETINDEX #1, "NachName"
PRINT "einspaltig aufsteigend:";
GOSUB Durchlauf

' --- 5.2: eine Spalte, absteigend ---
CREATEINDEX #1, "AlterAb", 0, "-Alter"
SETINDEX #1, "AlterAb"
PRINT "absteigend nach Alter:";
GOSUB Durchlauf

' --- 5.2: mehrspaltig, eindeutig ---
CREATEINDEX #1, "VollName", 1, "Nachname", "Vorname"
SETINDEX #1, "VollName"
PRINT "mehrspaltig eindeutig:";
GOSUB Durchlauf

' --- 5.2: mehrspaltig gemischte Richtung ---
CREATEINDEX #1, "NachAbAlter", 0, "Nachname", "-Alter"
SETINDEX #1, "NachAbAlter"
PRINT "Nachname auf, Alter ab:";
GOSUB Durchlauf

' --- 5.4: GETINDEX$ liefert den aktiven Index zurueck ---
SETINDEX #1, "NachName"
PRINT "aktiv: ["; GETINDEX$(1); "]"
' Ohne Namen gilt der NULL-Index (Einfuegereihenfolge).
SETINDEX #1
PRINT "NULL-Index: ["; GETINDEX$(1); "]"

' --- 5.4: nach SETINDEX ist der erste Satz der neuen Ordnung aktuell ---
SETINDEX #1, "NachName"
RETRIEVE #1, p
PRINT "erster nach NachName: "; RTRIM$(p.Nachname); "/"; RTRIM$(p.Vorname)
SETINDEX #1, "AlterAb"
RETRIEVE #1, p
PRINT "erster nach AlterAb: "; RTRIM$(p.Nachname); "/"; RTRIM$(p.Vorname)
SETINDEX #1
RETRIEVE #1, p
PRINT "erster im NULL-Index: "; RTRIM$(p.Nachname); "/"; RTRIM$(p.Vorname)

' --- 5.5: unbekannter Index meldet 83 ---
SETINDEX #1, "GibtsNicht"

' --- 5.5: unbekannte Spalte meldet 84 ---
CREATEINDEX #1, "Falsch", 0, "GibtsNicht"

' --- 5.3: DELETEINDEX; danach ist der Index nicht mehr setzbar ---
DELETEINDEX #1, "NachName"
PRINT "Index geloescht"
SETINDEX #1, "NachName"

CLOSE #1
PRINT "fertig"
END

' Sätze in der Ordnung des aktiven Index ausgeben.
Durchlauf:
MOVEFIRST #1
DO WHILE NOT EOF(1)
    RETRIEVE #1, p
    PRINT " "; RTRIM$(p.Nachname); "/"; RTRIM$(p.Vorname); p.Alter;
    MOVENEXT #1
LOOP
PRINT
RETURN

Handler:
PRINT "ERR="; ERR
RESUME NEXT
