Autor | Thema: dbIndex - Sortierung, Rückauflösungsproblem | | Datum:15.01.02 09:29 
(DiGe@gmx.net) | |
Hi Profanis,
Ich habe gerade ein kleines Problem mit Sortierungen
via dbindex...
Eine 3-spaltige Tabelle [WKN, KURS, DATUM]
(1) 710000 71.00 20010304
(2) 542700 13.00 20010304
(3) 848188 30.00 20010304
wird nach Kurs sortiert in Tabellenform angezeigt.
(1) 710000 71.00 20010304
(2) 848188 30.00 20010304
(3) 542700 13.00 20010304
Wenn ich jetzt nach dem Kurswert 30.00 suche erhalte ich
als Rückgabewert 3, da dieser Wert in der 3. Zeile der
Tabelle gefunden wurde.
Meine Frage lautet nun, wie bekomme ich heraus in welcher Zeile
der Wert 30.00 nun aber in der Index-Sortierung zu finden ist?
Das Ergbnis müsste denn 2 lauten.
dbfind und dbseek bringen aber immer nur den Wert 3.
Könnt Ihr helfen?
MfG Dirk
|
| | Datum:15.01.02 10:00 
(schmidts@flat2serv.de) | |
Hallo,
hast Du den Index mit "DbUseIndex" als aktuellen gesetzt?
Mfg.
Sven Schmidts
|
| | Datum:15.01.02 10:36 
(DiGe@gmx.net) | |
> Datum:15.01.02 10:00 (schmidts@flat2serv.de)
> hast Du den Index mit "DbUseIndex" als aktuellen gesetzt?
Ja, aber mit @dbIndex(S)...
Der Index wird ja verwendet, denn die Tabelle wird sortiert
ausgegeben.
Meine Frage nochmal, wie kann ich ermitteln in welcher Zeile
(bzw. ab welcher Position) ein bestimmter Wert im Index enthalten ist?
Gruß Dirk
|
| | Datum:15.01.02 13:32 
(apollo@rw-net.de) | |
Afaik geht das gar nicht.
Ich habe mir damit geholfen, die Tabelle selbst zu sortieren. Das kann bei grossen Datenaufkommen aber recht zeitintensiv werden.
mfG, René
|
| | Datum:16.01.02 08:49 
(DiGe@gmx.net) | |
>Datum:15.01.02 13:32 (apollo@rw-net.de)
>Afaik geht das gar nicht.
>Ich habe mir damit geholfen, die Tabelle selbst zu sortieren.
Hmm, heisst das also das es definitiv keine Möglichkeit gibt
abzufragen, an welcher Position ein Element im Index steht?
Schade ... das wird dann richtig schwierig .. hmm ...
Trozdem Danke für Eure Hilfe.
Gruß Dirk
|
| | Datum:20.01.02 12:47 
(mail@stschnell.de) | |
Hallo Dirk,
ich meine Dein Problem ist recht einfach zu lösen.
Du hast eine Datenbank mit einem Index, nun sortierst Du die Datenbank, ich vermute mal mit einer eigenen Routine oder einem externen Programm, da ich keine Möglichkeit in Profan kenne (so etwa @dbSort). Nachdem Du die Datenbank sortierst hast, hast Du ja nun auch die Reihenfolge der Datensätze geändert (wolltest Du ja auch). Dem Index hast Du aber diese Änderung nicht mitgeteilt und dieser speichert (so vermute ich) nur Zuordnungen, also indexierter Inhalt ist zu finden in Datensatz 4711. Suchst Du nun über den Index, so findest Du nur die alten Positionen und nicht mehr die neuen.
Welche Lösung könnte Dir nun helfen:
1. Du könntest einfach einen neuen Index über die gewünschten Felder bilden und hättest dann auch das richtige Ergebnis.
2. Du verwendest einen Sortieralgorithmus, der den Index automatisch mit aktualisiert (wäre eigentlich die bessere Methode, wird so auch in jedem professionellem Datenbanksystem gemacht).
Hier ein Quelltext in dem ich einfach eine kleine Fiesität vornehme, die aber die Datenbank völlig aus dem Ruder bringt:
Assign #1, "TEST.STR"
Rewrite #1
Print #1, "ROW1; C; 10; 0"
Print #1, "ROW2; C; 10; 0"
Print #1, "ROW3; C; 10; 0"
Close #1
dbCreate "TEST.STR" > "TEST.DBF"
@dbOpen(#2, "TEST.DBF")
@dbUse(#2)
Decimals 2
WhileLoop 3
@dbAppendBlank()
@dbPut("ROW1", @Str$(&Loop))
@dbPut("ROW2", @Str$(5 * &Loop))
@dbPut("ROW3", @Str$(10 * &Loop))
@dbPutRec(0)
EndWhile
dbCreateIndex "ROW1" > "I1TEST"
dbIndex("I1TEST")
Print @dbFind("2", 1)
@dbClose(#2)
WaitKey
Assign #1, "TEST.DBF"
Erase #1
dbCreate "TEST.STR" > "TEST.DBF"
@dbOpen(#2, "TEST.DBF")
@dbUse(#2)
WhileLoop 3
@dbAppendBlank()
@dbPut("ROW1", @Str$(3 * &Loop))
@dbPut("ROW2", @Str$(15 * &Loop))
@dbPut("ROW3", @Str$(20 * &Loop))
@dbPutRec(0)
EndWhile
dbIndex("I1TEST")
Print @dbFind("2", 1)
@dbClose(#2)
WaitKey
'*Ende*************************************************************************
End
Hier erzeuge ich eine Datenbank und indexiere Sie, lösche sie dann, erzeuge eine Datenbank mit gleichem Aufbau aber unterschiedlichem Inhalt, öffne dazu den gleichen Index und erhalte das gleiche aber völlig falsche Ergebnis.
Ich hoffe ich konnte Dir helfen.
Tschüss
Stefan Schnell
|
| | Datum:21.01.02 09:26 
(DiGe@gmx.net) | |
Hallo Stefan,
erstmal vielen Dank für Deine ausführliche Hilfe. Leider habe
ich wohl mein Problem missverständlich dargelegt.
Bei mir geht es darum, das ich eine Kursdatentabelle über
eine beliebige Spalte indizieren lasse und diese dann
sortiert nach dieser Spalte, in einer grafischen Oberfläche
zur Ansicht als anklickbare Tabelle, ausgeben lasse.
Wenn ich jetzt in meiner Indizierten Tabelle nach einem
bestimmten Wert suche, erhalte ich als Ergebnis immer die
Datensatznummer, unter der dieser Wert 'physikalisch' in der
der unsortierten dBase Datei enthalten ist. Dies ist ja auch
nicht falsch, aber ich benötige jetzt die Zeilennummer
unter der der gesuchte Datensatz im Index einsortiert wurde
und folglich auch in der angezeigten Tabellenzeile enthalten
sein muss.
Das ganz nochmal mit einem Beispiel zur Verdeutlichung:
In einer nicht indizierten dBase-Tabelle befindet sich der
Wert 123.45 in Zeile=Datensatznummer 34.
Wird die Tabelle indiziert (sortiert) wird der Wert 123.45
an der 17. Stelle ausgegeben.
Mein Problem ist nun dies Zahlenmässig zu erfassen, also
die 17 herauszubekommen...
Praktisch nachvollziehen kannst Du dieses Problem, wenn Du
Lust & Zeit hast, mit meinem betreffenden Programm
(www.StQuote.de.vu). Indem Du Kursdaten editierst und bei
der Suche nach einem Wert in der falschen Zeile landest.
Gruß Dirk
|
| | Datum: 21.01.02 23:42 
(mail@stschnell.de) | |
Hallo Dirk,
okay, jetzt verstanden worum es geht. Insgesamt wird dadurch die Sache etwas komplizierter aber nicht unlösbar.
Als erstes hier eine WebAdress, in der die Struktur einer NDX-Datei erläutert wird:
http://www.startech.keller.tx.us/xbase/xbase_c6.html
Ich habe mir parallel dazu mal Dein Programm downgeloaded und denke, das es sich wohl um die Datei DEPOT_1.DBF handelt. Dann habe ich über die Datei im Feld KRS einen Index gebildet:
@dbOpen(#1, "DEPOT_1.DBF")
@dbUse(#1)
dbCreateIndex "KRS" > "IKRS"
@dbClose(#1)
End
Ab Adresse 512 findest Du dann die Sortierung der Datensatznummern (in diesem Fall 1, 4, 5, 3, 6, 2) und damit bekommst Du dann die Zuordnung 1=1, 4=2, 5=3, 3=4, 6=5, 2=6, d. h. z. B. in der Tabelle Position 2, in dem ScreenListing Position 6 (hier war der Kurswert 33.00).
So bekommst Du auf jedenfall eine Zuordnung, aber nur in dem Du binär in die NDX-Datei reingreifst, dass ist natürlich nicht die feinste Methode, aber immerhin löst es Dein Problem.
Eine StandardFunktion die so etwas ermittelt ist mir nicht bekannt, da die Indizes die Sortierreihenfolge bestimmen und die schnelle Suche ermöglichen. Ein Arbeiten mit IndexDateien ist so nicht möglich (und auch nicht vorgesehen, wie ich vermute; habe gerade nochmal in meiner uralt ClipperDokumentation geblättert...)
Hoffe Du bist jetzt einen Schritt weiter.
Tschüss
Stefan
|
|
|