AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi vorhandenen Index ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

vorhandenen Index ermitteln

Ein Thema von Fritz01 · begonnen am 20. Nov 2007 · letzter Beitrag vom 25. Nov 2007
Antwort Antwort
Seite 1 von 3  1 23      
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#1

vorhandenen Index ermitteln

  Alt 20. Nov 2007, 13:10
Datenbank: Absolute Database • Version: 5.14 • Zugriff über: ABSTable, DataSource
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
Fritz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: vorhandenen Index ermitteln

  Alt 20. Nov 2007, 13:25
Hallo,

wo ist das Problem ?

http://www.componentace.com/help/abs..._indexdefs.htm

also

ABSTable.Update

und dann per Schleife (IndexDefs ist ja ein array) durdchsuchen.
Zeig mal deinen bisherigen Code.


Heiko
Heiko
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#3

Re: vorhandenen Index ermitteln

  Alt 20. Nov 2007, 15:25
@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:
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;
das funktioniert, solange keine Indexe vorhanden sind. Dann kommt das Problem!
Sollte ich eine kl. Demo anhängen?
Fritz
Fritz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: vorhandenen Index ermitteln

  Alt 20. Nov 2007, 15:53
Hallo,

ich benutze deine DB nicht.

Delphi-Quellcode:
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;
das ganze in die Funktion

function IndexExists(theTable: TABSTabl; const theIndexName: String: Boolean;

kannst du wohl selber machen.

Ahja, nimm IndexName statt IndexFieldName, ist einfacher.


Heiko
Heiko
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#5

Re: vorhandenen Index ermitteln

  Alt 20. Nov 2007, 18:22
Hallo hoika,
erstmal danke. Habs gleich testen wollen, aber gleich in der ersten Zeile
function IndexExists(theTable: TABSTabl; const theIndexName: String: Boolean; gibt es schon Fehlermeldungen.

In dieser Zeile, sehe ich das richtig, muß man da einen Indexnamen vorgeben?

if CompareText(IndexDef.Name,DeinGesuchterIndwxName)=0 then besser wäre, den vorhandenen Index für das Feld (ganz gleich welcher Name) auslesen und dann bei Table.IndexName eintragen.
Am Ende sollte das unabhängig von den Datentabellen und Feldnamen funktionieren.
Schau Dir das doch bitte nochmal an.
Gruß aus Ahlhorn
Fritz
Fritz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: vorhandenen Index ermitteln

  Alt 20. Nov 2007, 19:25
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

if Pos(theFieldName, IndexField.Fields)=1 rausbekommen, ob dein Feld (theFieldName) im Index drinsteht.


Heiko
Heiko
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#7

Re: vorhandenen Index ermitteln

  Alt 20. Nov 2007, 19:42
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
Fritz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: vorhandenen Index ermitteln

  Alt 21. Nov 2007, 07:23
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
Heiko
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#9

Re: vorhandenen Index ermitteln

  Alt 21. Nov 2007, 09:55
Hallo,
habe gestern noch lange gelesen und gebastelt mit dem Ergennis:

Delphi-Quellcode:
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.
Das funktioniert aber nur teilweise, ich weiß nicht weiter!

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
Fritz
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#10

Re: vorhandenen Index ermitteln

  Alt 21. Nov 2007, 10:32
Moin
Bei ABSTable kann der Index für ein Feld auch der Methode FindIndexForFields gefunden/gesucht werden:
Delphi-Quellcode:
    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;
...
Der try---except-Block muss sein, weil sonst die ABS-DB bei nicht vorhandenem/gefundenen Index eine Fehlermeldung auf das Formular setzt.

[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:
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;
[/EDIT]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz