![]() |
Datenbank: Absolute Database • Version: 5.14 • Zugriff über: ABSTable, DataSource
vorhandenen Index ermitteln
Hallo,
suche nach einer Möglichkeit, während der Laufzeit vorhandene Indexe zu ermitteln (IndexDefs) auslesen. Dieser Index soll dann in Table.IndexName eingesetzt werden. Ist kein Index vorhanden so wird mit AddIndex... ein neuer Index erstellt und dort eingesetzt. Hat die DatenTabelle keinen Index, so ist das OK. Index wird erstellt und die Daten erscheinen sortiert. Mein Problem ist es, einen vorhandenen Index zu ermitteln. Mit Query sicher kein Problem, muß aber Table sein. Hoffe auf entsprechende Hinweise. Fritz |
Re: vorhandenen Index ermitteln
Hallo,
wo ist das Problem ? ![]() also ABSTable.Update und dann per Schleife (IndexDefs ist ja ein array) durdchsuchen. Zeig mal deinen bisherigen Code. Heiko |
Re: vorhandenen Index ermitteln
@hoika,
danke für die Antwort. Der Link hat mir nicht wirklich weiter geholfen. Beim bisherigen Code gibts ja noch nicht viel zu sehen.
Delphi-Quellcode:
das funktioniert, solange keine Indexe vorhanden sind. Dann kommt das Problem!
procedure TForm1.GridTitleClick(Column: TColumn);
var sName : String; begin sName := Column.Field.FieldName; // GridTitleName Label1.Caption := sName; // vorhandenen Index suchen // if {index für das Feld vorhanden} then // begin // Label1.Caption := 'Index vorhanden'; // Table.IndexFieldNames := //vorhandener Index; // end // else {Index nicht vorhanden} then // begin // Index erstellen Table.AddIndex(sName, sName, []); Table.IndexFieldNames := sName; // end; // hier alle neu erstellten indexe löschen end; Sollte ich eine kl. Demo anhängen? Fritz |
Re: vorhandenen Index ermitteln
Hallo,
ich benutze deine DB nicht.
Delphi-Quellcode:
das ganze in die Funktion
var
IndexDef : TIndexDef; iIndexDef : Integer; bIndexExists:= False; Table.Update; //Table.IndexDefs ist ein array von Records, for i:= Low(Table.IndexDefs) to High(Table.IndexDefs) do begin IndexDef := Table.IndexDefs[iIndexDefs]; if CompareText(IndexDef.Name,DeinGesuchterIndwxName)=0 then begin bIndexExists:= True; break; end; end; function IndexExists(theTable: TABSTabl; const theIndexName: String: Boolean; kannst du wohl selber machen. Ahja, nimm IndexName statt IndexFieldName, ist einfacher. Heiko |
Re: vorhandenen Index ermitteln
Hallo hoika,
erstmal danke. Habs gleich testen wollen, aber gleich in der ersten Zeile
Delphi-Quellcode:
gibt es schon Fehlermeldungen.
function IndexExists(theTable: TABSTabl; const theIndexName: String: Boolean;
In dieser Zeile, sehe ich das richtig, muß man da einen Indexnamen vorgeben?
Delphi-Quellcode:
besser wäre, den vorhandenen Index für das Feld (ganz gleich welcher Name) auslesen und dann bei Table.IndexName eintragen.
if CompareText(IndexDef.Name,DeinGesuchterIndwxName)=0 then
Am Ende sollte das unabhängig von den Datentabellen und Feldnamen funktionieren. Schau Dir das doch bitte nochmal an. Gruß aus Ahlhorn Fritz |
Re: vorhandenen Index ermitteln
Hallo,
> erstmal danke. Habs gleich testen wollen, aber gleich in der ersten Zeile > Delphi-Quellcode: markieren > function IndexExists(theTable: TABSTabl; const theIndexName: String: Boolean; > gibt es schon Fehlermeldungen. welche nun TABSTabl muss heissen TABSTable > In dieser Zeile, sehe ich das richtig, muß man da einen Indexnamen vorgeben? Jepp, da du den Index erzeugst, warum umständlich, der Name heisst z.B. idx_FeldName also bei Name idx_Name > besser wäre, den vorhandenen Index für das Feld (ganz gleich welcher Name) auslesen und dann bei > Table.IndexName eintragen. Warum ? > Am Ende sollte das unabhängig von den Datentabellen und Feldnamen funktionieren. > Schau Dir das doch bitte nochmal an. Nuja, dann viel Spass beim Basteln. Ich habe das IndexField.Name aus der Bde-Hilfe für TTable geholt, dass soll ja kompatibel sein. Suche mal nach TIndexDef (ohne das s) Dort gibt es ein property Fields Du musst beachten, dass es auch einen zusammengestezten Index geben kann. Bsp. Tabelle Person: Name,Vorname Index idx_FullName -> Fields für Name und Vorname Name;Vorname wenn es keine zusammengesetzten Indizes gibt, kannst du über
Delphi-Quellcode:
rausbekommen, ob dein Feld (theFieldName) im Index drinsteht.
if Pos(theFieldName, IndexField.Fields)=1
Heiko |
Re: vorhandenen Index ermitteln
Hallo hoika,
danke für die schnelle Antwort. Das muß ich erst mal verdauen, werde mich gleich dransetzen. Mal sehen was ich davon machen kann, der Abend ist noch lang. Melde mich dann wieder. Fritz |
Re: vorhandenen Index ermitteln
Hallo,
übrigens habe ich das alles über die normale Delphi-Hilfe herausbekommen. Absolute DB ist ja als BDE-Ersatz gedacht, d.h. die meisten TTable-Methoden / - Properties sind auch vorhanden. Heiko |
Re: vorhandenen Index ermitteln
Hallo,
habe gestern noch lange gelesen und gebastelt mit dem Ergennis:
Delphi-Quellcode:
Das funktioniert aber nur teilweise, ich weiß nicht weiter!
procedure TForm1.GridTitleClick(Column: TColumn);
var sName : String; I : integer; begin sName := Column.Field.FieldName; // Feldname // vorhandenen Index suchen Table.Active := False; Table.Exclusive := True; Table.IndexDefs.Update; //------------------- 1) Index für dieses Feld vorhanden for I := 0 to Table.IndexDefs.Count -1 do // vorhandenen Index suchen if Table.IndexDefs.Items[I].Fields = sName then begin Table.IndexName := sName; //vorhandener Index einsetzen; Table.Exclusive := False; Table.Open; Label1.Caption:= ''; Label2.Caption:= ''; Label1.Caption := 'Index vorhanden'; end //------------------- 2) Index nicht vorhanden else // begin Label1.Caption:= ''; Label2.Caption:= ''; Label1.Caption:='Index nicht vorhanden'; Label2.Caption:='Index erstellen'; // Table.AddIndex(sName, sName,[]); // <-- // Table.IndexName := sName; // <-- Table.Exclusive := False; Table.Open; end; end; end. Da steckt noch ein Fehler drin, den ich aber nicht sehen kann. 1. Ist in der Tabelle ein Index vorhanden, so dürfen die Zeilen <-- nicht aktiv sein 2. Ist in der Tabelle kein Index vorhanden und die Zeilen <-- sind aktiv, so wird ein Index erstellt, eingesetzt. Die Label sind nur zur Kontrolle. If else end wird ignoriert, auch wenn Index vorhanden geht es immer in Teil 2) da muß wohl der Fehler sein!!?? Fritz |
Re: vorhandenen Index ermitteln
Moin :)
Bei ABSTable kann der Index für ein Feld auch der Methode FindIndexForFields gefunden/gesucht werden:
Delphi-Quellcode:
Der try---except-Block muss sein, weil sonst die ABS-DB bei nicht vorhandenem/gefundenen Index eine Fehlermeldung auf das Formular setzt.
ABSTable1.IndexDefs.Update;
//--alle vorhandenen Index auflisten ABSTable1.IndexDefs.GetItemNames(Combobox1.Items); try ABSTable1.IndexName := ABSTable1.IndexDefs.FindIndexForFields(FeldName).Name; //--oder ABSTable1.IndexFieldNames := ABSTable1.IndexDefs.FindIndexForFields(FeldName).Fields; except // Function zum Erstellen des Index aufrufen; p_IndexErstellen(ABSTable1, FeldName); end; .... p_IndexErstellen(const Tabelle: TABSTable; const FeldNAme: String); begin Tabelle.AddIndex('idx_'+FeldName, FeldName, []); //--Updaten, damit beim nächsten Überprüfen der neue Index gefunden wird Tabelle.IndexDefs.Update; Tabelle.IndexNAme := 'idx_'+FeldName; end; ... [EDIT] zu #9 Diese Art der Schleife ist nicht unbedingt praktikabel - weil: selbst bei passendem/gefundenem Index werden die weiteren Einträge in der IndexDef durchsucht - und es dürfte dann klar sein, dass dann nix (mehr) gefunden wird und der Index (zum wiederholten) Mal erstellt wird! Das dürfte mit sicherheit ne Fehlermeldung produzieren! Besser wäre dann so:
Delphi-Quellcode:
[/EDIT]
procedure TForm1.GridTitleClick(Column: TColumn);
var sName : String; I : integer; bVorhanden: Boolean; begin bVorhanden := false; sName := Column.Field.FieldName; // Feldname // vorhandenen Index suchen Table.IndexDefs.Update; for I := 0 to Table.IndexDefs.Count -1 do // vorhandenen Index suchen if Table.IndexDefs.Items[I].Fields = sName then begin bVorhanden := True; break; //-- durchaus erlaubt, weil Forstezung der Suche ja nicht mehr sinnvoll *gg* end; if bVorhanden then begin Table.IndexName := sName; //vorhandener Index einsetzen geht auch bei geöffneter Tabelle!!! end //------------------- 2) Index nicht vorhanden else // begin Table.CLose; Table.Exclusive := true; Table.AddIndex(sName, sName,[]); // <-- Table.IndexName := sName; // <-- Table.Exclusive := False; Table.Open; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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