Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249231 (10667)

| Suchen
| Zurück zur Übersicht

Autor | Thema: dbIndex - Sortierung, Rückauflösungsproblem
Dirk
| 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
Sven Schmidts
| Datum:15.01.02 10:00 (schmidts@flat2serv.de) |
Hallo, hast Du den Index mit "DbUseIndex" als aktuellen gesetzt? Mfg. Sven Schmidts
Dirk
| 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
René Wagner
| 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é
Dirk
| 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
Stefan Schnell
| 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
Dirk
| 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
Stefan Schnell
| 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

| Zurück zur Übersicht