![]() |
Erstellung eines Index bei Paradox / DBase III+ Dateien
Hallo,
ich habe ein großes Problem.Und zwar möchte ich eine Spalte einer bestehenden Paradox 7 Datenbank indizieren (um z.B. alphabetisch nach Namen zu sortieren) Ich habe also eine TTable-Komponente , die mit der Tabelle verknüpft ist.Das ganze sieht dann im Code so aus : -- tblParadox.Close; //PRIMÄRINDEX erzeugen... tblParadox.AddIndex('Nameindx', 'NAME', [ixPrimary,ixNonMaintained]); //SEKUNDÄRINDEX erzeugen... tblParadox.AddIndex('PLZindx' , 'PLZ' , [ixUnique ]); tblParadox.Open; -- Nun meine 1.Frage : WO wird die indexDatei Nameindx und PLZindx abgelegt auf der Festplatte?? Wenn ich nun etwa nach PLZ sortieren möchte also : -- tblParadox.IndexName:='PLZindx'; -- so funktioniert das auch ein mal.Wenn ich dann aber wieder nach Name sortieren möchte : -- tblParadox.IndexName:='Nameindx'; -- So wird mir die Fehlermeldung ausgegeben , dass die IndexDatei Nameindx NICHT EXISTIERT. Wer kann mir helfen beim Indizieren von Paradox , bzw. DBase-Dateien (die haben ja keinen Primärindex , aber damit hab ich nur noch mehr Probleme , deswegen konvertiere ich die schon in Paradox Format) Über eine rasche Antwort wäre ich mehr als dankbar!!! :-)) (P.S.: Vielleicht hattet ihr auch schonmal soviel Ärger mit TTable.Addindex(); ) |
Hi DBMan,
bei Paradox werden die Indexe im Arbeitsverzeichnis der Datenbank (also dort wo die Datenbankdateien auch abgelegt sind), gespeichert. Für den Primär-Index einer Tabelle wird eine Datei angelegt, die den gleichen Namen wie die Tabellendatei erhält, jedoch die Extentions "PX" für primary index erhält. Ein Primär Index hat keinen Namen, den kannst Du entsprechende auch nicht auswählen. Falls kein Index verwendet wird, verwendet Paradox bzw. die TTable Komponente grundsätzlich den Primär-Index. Die Sekundär-Indexe erhalten einen Namen zugewiesen und können über diesen auch expliziert angewählt werden, wie du es richtig gemacht hast. Die zugehörigen Dateien werden ebenfalls im Verzeichnis gespeichert, in dem die Tabelle steht. Für jeden sekundär Index werden zwei Dateien mit der Endung "XG0" und "YG0" für den ersten, "XG1" und YG1" für den zweiten .... angelegt. Alles klar ? Falls nicht, fragen :wink: grüsse hacki |
Danke....aber trotzdem noch eine Frage
Hallo Hacki,
Du hast mir schon einen Schritt weitergeholfen.Aber ich habe trotzdem noch eine Frage... und zwar wenn ich jetzt zwischen der Name-Indizierung und der PLZ-Indizierung einige Male "hin und herspringe" während der Laufzeit , so erhalte ich nach etwa 10 mal "hin und hersortieren" eine Exception der Klasse EAccesViolation , die anderen Male funktioniert das sortieren perfekt.... irgendwie eigenartig , findest du nicht auch? Woran könnte das denn liegen. Hast du darauf vielleicht auch noch einen Rat? Wäre wirklich toll :-) Vielen Dank DBman |
Hallo DBMan,
hab ich momentan leider nicht. Bin aber leider auch nur auf dem Sprung - schaue später nochmal rein und versuche das nachzustellen. :( gruss hacki |
Hallo DBMan,
zunächst einmal herzlich willkommen im Dephi-PRAXIS Forum. Nun zu deiner Frage: Ich habe eine ganze Reihe von Programmen, bei denen die Umschaltung -auch mehrfach hintereinander- problemlos funktioniert. Die Frage ist deshalb, in welchem Tabellenmode tritt dieser Fehler auf? Bist du z.B. immer im dsBrowse Mode (nur Anzeige von Daten) oder auch manchmal im dsInsert oder einem anderen Mode? In deinem Codeschnipsel ist der Postleitzahlindex als "eindeutig" angelegt, ist das korrekt? Außerdem würde ich einen häufig benutzten Index immer als "gewartet" markieren. |
...lag nur am ExclusiveMode ... aber noch mal eine Frage
Mr Spock ,
ersteinmal danke für die ausführliche Antwort,aber das mit der Exception lag nur daran dass ich die Tabelle nicht im Exclusive Modus geöffnet hatte. Ich habe aber dennoch nochmal eine Frage und zwar: Ich habe eine Paradox 7 Tabelle der ich im Code einen Primärindex und zwei Sekundärindizes zuweise.
Delphi-Quellcode:
tblParadox.AddIndex('Primeindx','NAME',[ixPrimary,ixNonMaintained]);
tblParadox.AddIndex('Nameindx' , 'NAME' , [ixUnique]); tblParadox.AddIndex('PLZindx' , 'PLZ' , [ixUnique]); Sortiere nun nach dem Sekundärindex PLZindex:
Delphi-Quellcode:
Nun möchte ich die Indizes löschen (also nur die Sekundärindizes) mit DeleteIndex....und es soll dann nach dem Primärindex wieder sortier werden.
tblParadox.Close;
tblParadox.IndexName:='PLZindx'; tblParadox.Open;
Delphi-Quellcode:
Wenn ich diesen Schritt aber mache , so erhalte ich eine Exception EDBEngineError.
tblParadox.Close;
tblParadox.Exclusive:=true; tblParadox.DeleteIndex('Nameindx'); tblParadox.DeleteIndex('PLZindx'); tblParadox.Close; tblParadox.Open; Das Programm sortiert also nicht automatisch nach dem Primärindex , sondern scheint noch irgendwie die Information zu haben dass es nach PLZindx sortieren soll (dieser existiert ja aber nicht mehr). Nun meine Fragen: Wieso denkt das Programm noch dass es nach PLZindx sortieren soll , und wo steht diese Information (im Datei-Header vielleicht oder wo??) Kann ich den Primärindex auch irgendwie löschen?(Über deleteindex geht das ja nicht) :-( Ich wäre über einen Lösungsvorschlag sehr erfreut. PS:Lob an den jenigen der dieses tolle Forum in die Welt gesetzt hat und nochmal Danke an alle die mir schon gute Tips gegeben haben. -DBman |
Hallo DBMan,
nach dem Löschen der Indizes musst du noch die Eigenschaft IndexName anpassen:
Delphi-Quellcode:
Denn dort steht ja noch der Name des Indizes, den du zuvor gelöscht hast.
tblParadox.IndexName:='';
|
Danke...aber ist es eigentlich NICHT möglich auch den Primärindex zu löschen?
|
Hilfe!!?
Hallo Mr.Spock,
irgendwie komme ich über meine anfänglichen Schwierigkeiten immer noch nicht hinüber weg. Beim erstellen eines Primärindexes :
Delphi-Quellcode:
erhalte ich folgende Fehlermeldung:
TblParadox.Exclusive:=True;
TblParadox.Active:=true; TblParadox.AddIndex('Ersterix','B',[ixPrimary,ixNonMaintained]); Im projekt test.exe ist exception EDBEngineError. Meldung : 'Zahl außerhalb des gültigen Bereichs' Index nicht vorhanden. Index : Ersteix.Prozeß wurde angehalten. Ich wäre Ihnen äußerst dankbar , wenn sie mir ein kleines funktionierendes Beispielprogramm (mit Code) schicken könnten , indem einer Paradox7 Tabelle mit Memofeld mit TTable.Addindex ein Primär- und Sekundärindex hinzugefügt wird. Und dann mit Indexname nach den Indizes sortiert wird... Ich wäre darüber wirklich sehr sehr dankbar. :roll: Danke DBman. |
Ein Primärindex zeichnet sich dadurch aus, dass er keinen Namen hat, jedenfalls bei Paradox. Also für den Namen einfach einen Leerstring übergeben, schon sollte es gehen.
ixNonMaintained steht doch für nicht gewartet. Das geht bei einem Primärindex auch nicht. Weiterhin muss der Primärindex zwingend über die ersten Felder der Datenbank gehen. Feld 1 ->geht Feld 1 und 2 -> geht Feld 1 und 3 -> geht nicht!!! Feld 1..3 -> geht Vielleicht hilft Dir auch noch Beispiel 12: ![]() Jetzt ein Beispiel zusammenzuschreiben, ist zeitlich leider nicht drin :cry: |
Primärindex nur für erste Spalte?
Ich habe selber nochmal ein wenig rumprobiert und herausbekommen , dass es bei mir mit der Indexerzeugung nur funktioniert , wenn sich mein Primärindex das erste Feld der Tabelle bezieht.... macht das Sinn ?
Naja egal hauptsache es funktioniert so. Aber da ist mal wieder ein neues Problem hervorgekommen ich versuche schon durch rumgetüftel das wieder rauszukriegen , aber vielleicht weiß ja einer von euch genauer woran es liegen könnte: Ich habe 2 Tabelle tblKuDa und tblKuPe , wobei in beiden Tabellen das Feld KUNKZ existiert. Das erste Feld von tblKuDa heisst KUNKZ , das erste Feld von tblKuPe heisst NR. Bei der Indexerzeugung von tblKuDa gibts jetzt (wo ich als Primärindex die erste Spalte genommen habe ) eigentlich keine Probleme. Nur wenn ich die bei tblKuPe auskommentierte Zeile entkommentiere , so wird mir eine Fehlermeldung ausgegeben : Der Index sei bereits vorhanden. Das finde ich aber ziemlich komisch weil das KUNKZ oben hat mit dem KUNKZ unten ja nichts zu tun. Es ist ja von einer anderen ParadoxTabelle.Hm... muss irgendwie daran liegen dass der Primärindex auch nach KUNKZ indiziert is... aber halt nach dem anderen von der anderen tabelle..... Macht für mich also wenig Sinn. Eine Auflösung des Rätsels wäre toll.
Delphi-Quellcode:
PS:Es ist glaub ich egal ob ich bei AddIndex dem Primärindex nen Namen zuweise oder nicht , (ich spreche ich später sowieso über '' an oder??
tblKuDa.Exclusive:=True;
tblKuDa.Close; tblKuDa.AddIndex('','KUNKZ',[ixPrimary]); tblKuDa.AddIndex('KunkzDAIndx','KUNKZ',[ixCaseInSensitive]); tblKuDa.AddIndex('FirmaDAIndx','FIRMA',[ixCaseInSensitive]); tblKuDa.AddIndex('TelDAIndx','TEL' , [ixCaseInSensitive]); tblKuDa.Open; tblKuPe.Exclusive:=True; tblKuPe.Close; tblKuPe.AddIndex('','NR',[ixPrimary]); //tblKuPe.AddIndex('KPEindx','KUNKZ',[ixCaseInSensitive]); //<-Kommentar tblKuPe.AddIndex('NamePEIndx','NAME',[ixCaseInSensitive]); tblKuPe.AddIndex('TelPEIndx','TEL',[ixCaseInSensitive]); tblKuPe.Open; |
Ein Grossteil Deiner Fragen sollte sich klären, wenn Du Dir mein Posting noch mal durchliest.
Auf den ersten Blick sieht alles sauber aus. Die einzige Möglichkeit, welche ich sehe: Die Tabelle hat den Index wirklich bereits. Eine Zusammenhang mit der anderen Tabelle sollte eigentlich nicht bestehen. Das kannst Du aber leicht überprüfen, wenn Du die Index-Erstellung bei erster Tabelle einmal nicht durchführst. |
Mario du hattest irgendwie recht.
Ich habe einfach die Indizes nochmal manuell in dem Verzeichnis gelöscht dann ging es. Aber die Indexe SOLLEN JA AUCH EXISTIEREN. Ich will die ja bei jedem Programmstart mit Addindex neu überschreiben. Also das was ich da geschrieben habe steht bei mir in der FormCreate -Methode. Deswegen verstehe ich nicht , weshalb ich eine Fehlermeldung bekomme , von wegen der Index existiert bereits , wenn ich ihn doch überschreiben will (Die anderen indizes Existierten ja auch alle bereits).... Hm , naja so ganz klar ist mir das noch nich. :freak: |
Überschreiben wird nicht gehen. Du musst erst alle nicht benötigten oder veralteten Indizes löschen (evtl. DeleteIndex?).
|
Jetzt startet zwar das Programm ohne Fehlermeldung , wenn ich jedoch nach 'NamePEIndx' sortieren möchte bekomme ich die Fehlermeldung
'NamePEIndx' Index nicht vorhanden.... Aber der wurde doch gerade mit Addindex erzeugt?? Also ich werde daraus nicht schlau |
noch mal eine kleine frage...
Ich hab das jetzt doch hingekriegt.Danke nochmal für die Tips.
Aber ich habe nochmal eine kleine Frage , und zwar habe ich eine DBase Datei in Paradox konvertiert. Bei Dbase Dateien gibts ja keinen Primärindex. Naja und in dieser (Detail-)Tabelle stehen nun auch teilweise gleiche Datensätze drin. Wenn ich nun über den Primärindex sortiere , so werden die "doppelten" Datensätze aber ja quasi "rausgeschmissen" Also nehmen wir an : Ich habe eine Master Tabelle in der die Kunden drin stehen , und eine DetailTabelle in der die Bestellungen drin stehen. In der Master Tabelle steht nun KundenNr / VornnameNachname / Telefon In der Detail Tabelle steht nun Nr / KundenNr / Name (des Produkts) nun dürfen die doppelten Datensätze in der DetailTabelle jetzt ja aber nicht "rausgeschmissen" werden... In einem Buch hab ich dazu folgendes gefunden : Zitat:
Aber wie geht das , dass automatisch die Datensatznummer in diesem Feld steht , ich will ja schließlich nicht ein Feld namens Nummer erzeugen und dann da 1 , 2, 3,4 ,5..... reinschreiben.. Ich hoffe meine Frage ist nicht zu dumm , um in diesem Forum gestellt zu werden. :spin: PS:Vielen Dank nochmal an alle guten Tips! :wink: |
Hallo DBMan,
das kannst du am besten über die Datenbankoberfläche machen. Ein Feld hinzufügen, dann an den Anfang schieben. Als Typ wählst du "Zähler" (+) und dann klickst du noch in die rechte Spalte, um aus diesem Feld den Primärindex (ggf. zusammen mit der alten Nummer als zusammengesetzten Index). Wenn du später mal eine Satz löscht, wird die Nummerierung aber nicht geändert und die Lücke im Zähler auch nicht mehr benutzt. Aber das sollte ja egal sein. Oder? |
hm..naja
Danke für die Hilfe Mr.Spock ,
aber was meinst du damit , dass wenn ich einen Satz lösche dass das dann nicht mehr angepasst wird?Also das Feld Nummer sollte schon immer die Datensatznummer haben... Naja ich spiel damit mal ein bisschen rum. Dankschön ;-) |
Hallo DBMan,
ich meine das so: Der Zähler wird NIE zurückgesetzt. Angenommen du hast 100 Datensätze und löscht alle 100. Dann bekommt der nächste (erste) Datensatz die Nummer 101. |
Ahso ne das is ja eigentlich egal.
Passt in diese Thema jetzt zwar nich direkt rein , aber kannst du mir zufällig noch sagen wie man bei einem DBGrid die Farbe Spaltenüberschrift verändern kann? Oder sollte ich da mal nach neuen Komponenten auf delphipages nachschauen? |
Hallo DBman,
probier's mal damit:
Code:
mfg
procedure TForm1.sbChgTitelClick(Sender: TObject);
begin DBGrid1.TitleFont.Color := clYellow; DBGrid1.TitleFont.Style := DBGrid1.TitleFont.Style + [fsBold]; DBGrid1.FixedColor := clBlue; end; eddy |
Ich meinte jetzt aber eigentlich für einzelen Spalten... Also : Spalte 1 z.b. weiss machen ,wenn sie aktiviert wird...
|
Hallo DBman,
Spalten oder Titel oder Spalte unter dem Titel? Du weißt zwar, was Du wissen willst, aber Du mußt es auch formulieren! Vielleicht hilft das weiter:
Code:
mit dbg : TDBGrid
dbg.Columns.Items[j].Title.Font.Color := clBlue;
und j = [0 .. dbg.Columns.Count - 1] Die Anweisung bewirkt, daß in der mit j angwählten Spalte der Titel in blauer Schrift dargestellt wird. mfg eddy |
Ja Eddy , auch wenn ich mich vielleicht nicht präzise ausgedrückt habe :chat: -tut mir leid - aber genau das meinte ich.
Danke :hello: :coder: |
Hi Eddy , weisst du zufällig auch , wie man die Titelfarbe nicht nur über den Index ansprechen kann , sondern auch über den Feldnamen??
Mit Fieldbyname oder sowas kriege ich das irgendwie nicht hin und in der Hilfe find ich dazu auch nichts. also z.b. Die 'PLZ' - Spaltenüberschrift clBlue machen.... :nerd: Ich glaube ich sollte mal ein neues Thema machen... |
Hallo DBman,
Antwort in Deinem Beitrag "Farbeinstellungen im DBGrid" ![]() mfg eddy |
Hi
lege meine Indexe immer nach fogendem Muster an : In der Tabelle habe ich immer ein Feld, das einen eindeutigen Index erzeugt. (beim Erstellen der Tabelle muß das ein AutoincFeld sein , hier nIndex: = Autoinc)
Delphi-Quellcode:
Die Sortierungen werden im gleichen Verzeichnis abgelegt, wie die eigentliche Tabelle.
procedure Chk4IndexAdressen;
Begin With TTable.Create(Nil) Do Begin try databasename:=''; TableName :='C:\daten\TblName.db'; Exclusive := True; Open; indexdefs.update; if IndexDefs.Count = 0 then begin IndexDefs.Clear; // nindex ist ein Feldtype Autoinc AddIndex('','NIndex', []+[ixPrimary]+[ixUnique]); AddIndex('Adresse','Ort;Name', []); AddIndex('Name','Name;Ort', []); end; Close; finally Free; end; End; end; Zu erkennen an gleichem Tabellennamen mit den Endungen *.px, *.y* und *.x* [edit=MrSpock]Code Tags hinzugefügt.[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz