' tb-screen: 80x25
' tb-tempdir
' ISAM (Spec isam-datenbank, Anforderungen "Cursorbewegung in der Ordnung
' des aktiven Index" und "Schluesselsuche"): MOVE-Familie, Einfuegereihen-
' folge ohne aktiven Index, EOF/BOF an den Raendern, SEEK-Familie mit
' Praefixsuche, erfolglose Suche und Suche ohne aktiven Index.
' Laeuft in einem temporaeren Verzeichnis.
TYPE Satz
    Schluessel AS INTEGER
    Nachname AS STRING * 6
    Vorname AS STRING * 6
END TYPE
DIM s AS Satz

ON ERROR GOTO Handler
OPEN "cursor.isam" FOR ISAM Satz "Werte" AS #1

' Einfuegereihenfolge 30, 10, 20 — damit sie sich von der Indexordnung
' unterscheidet.
s.Schluessel = 30
s.Nachname = "Cesar"
s.Vorname = "Carl"
INSERT #1, s
s.Schluessel = 10
s.Nachname = "Adam"
s.Vorname = "Anna"
INSERT #1, s
s.Schluessel = 20
s.Nachname = "Adam"
s.Vorname = "Bert"
INSERT #1, s

CREATEINDEX #1, "NachSchluessel", 1, "Schluessel"
CREATEINDEX #1, "NachName", 0, "Nachname", "Vorname"

' --- 6.3: Bewegung ohne aktiven Index folgt der Einfuegereihenfolge ---
SETINDEX #1
PRINT "ohne Index:";
MOVEFIRST #1
DO WHILE NOT EOF(1)
    RETRIEVE #1, s
    PRINT s.Schluessel;
    MOVENEXT #1
LOOP
PRINT

' --- 6.2: Durchlauf in der Ordnung des aktiven Index ---
SETINDEX #1, "NachSchluessel"
PRINT "vorwaerts:";
MOVEFIRST #1
DO WHILE NOT EOF(1)
    RETRIEVE #1, s
    PRINT s.Schluessel;
    MOVENEXT #1
LOOP
PRINT

PRINT "rueckwaerts:";
MOVELAST #1
DO WHILE NOT BOF(1)
    RETRIEVE #1, s
    PRINT s.Schluessel;
    MOVEPREVIOUS #1
LOOP
PRINT

' --- 6.4: MOVENEXT am Ende setzt EOF, Cursor unpositioniert ---
MOVELAST #1
MOVENEXT #1
PRINT "EOF nach MOVENEXT am Ende:"; EOF(1); "BOF:"; BOF(1)
RETRIEVE #1, s

' --- 6.4: MOVEPREVIOUS am Anfang setzt BOF, Cursor unpositioniert ---
MOVEFIRST #1
MOVEPREVIOUS #1
PRINT "BOF nach MOVEPREVIOUS am Anfang:"; BOF(1); "EOF:"; EOF(1)
RETRIEVE #1, s

' --- 6.5: SEEKGT, SEEKGE, SEEKEQ mit den Schluesseln 10, 20, 30 ---
SETINDEX #1, "NachSchluessel"
SEEKGT #1, 20
RETRIEVE #1, s
PRINT "SEEKGT 20 ->"; s.Schluessel

SEEKGE #1, 20
RETRIEVE #1, s
PRINT "SEEKGE 20 ->"; s.Schluessel

SEEKGE #1, 15
RETRIEVE #1, s
PRINT "SEEKGE 15 ->"; s.Schluessel

SEEKEQ #1, 10
RETRIEVE #1, s
PRINT "SEEKEQ 10 ->"; s.Schluessel

' --- 6.5: Praefixsuche ueber einen mehrspaltigen Index ---
SETINDEX #1, "NachName"
SEEKGE #1, "Adam"
RETRIEVE #1, s
PRINT "Praefix Adam ->"; RTRIM$(s.Nachname); "/"; RTRIM$(s.Vorname)
' SEEKEQ mit unvollstaendigem Schluessel schlaegt immer fehl (Original-Hilfe).
SEEKEQ #1, "Adam"
PRINT "SEEKEQ mit Praefix, EOF:"; EOF(1)
' Mit beiden Werten findet SEEKEQ den Satz.
SEEKEQ #1, "Adam", "Bert"
RETRIEVE #1, s
PRINT "SEEKEQ Adam/Bert ->"; s.Schluessel

' --- 6.6: erfolglose Suche setzt EOF, Cursor unpositioniert ---
SETINDEX #1, "NachSchluessel"
SEEKGT #1, 30
PRINT "SEEKGT 30, EOF:"; EOF(1)
RETRIEVE #1, s

' --- 6.7: Suche ueber den NULL-Index meldet 87 ---
SETINDEX #1
SEEKEQ #1, 10

CLOSE #1
PRINT "fertig"
END

Handler:
PRINT "ERR="; ERR
RESUME NEXT
