Index auf ein ftDate Feld

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Index auf ein ftDate Feld

Beitrag von baba »

Moin, Moin,

warum nimmt Lazarus dies nicht`?

Code: Alles auswählen

Test.Active := True;
 
Test.AddIndex('ce_fahrt', 'DTOS(STARTDATE)', [ixPrimary]);
  oder so
Test.AddIndex('ce_fahrt', 'STARTDATE', [ixPrimary]);
  oder so
Test.AddIndex('ce_fahrt', 'STARTDATE;STARTTIME', [ixPrimary]);
  oder so
Test.AddIndex('ce_fahrt', 'STARTDATE+STARTTIME', [ixPrimary]);
  oder so
Test.AddIndex('ce_fahrt', 'DTOS(STARTDATE);STARTTIME', [ixPrimary]);
  oder so
Test.AddIndex('ce_fahrt', 'DTOS(STARTDATE)+STARTTIME', [ixPrimary]);
 
Test.Active := False;
Bekomme immer eine Laufzeitfehler. Kann Lazarus einen Index auf ein ftDate Feld nicht aufbauen? Wäre schade.

Gruß
Baba.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Index auf ein ftDate Feld

Beitrag von monta »

Wird ein Index nicht gesetzt, bevor die Verbindung aufgebaut wird und anschließend beim nächsten Öffnen geschrieben, also irgendwie so:

Code: Alles auswählen

Test.AddIndex('ce_fahrt', 'DTOS(STARTDATE)', [ixPrimary]);
Test.Active := True;
Test.Active := False;
Johannes

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Index auf ein ftDate Feld

Beitrag von baba »

Hallo Monta,

ein Auszug aus dem Datenbank-Wiki zu Lazarus.

Code: Alles auswählen

Das Hinzügen von Indexen ist ein wenig unterschiedlich von ihrer typischen TTable. Es muss getan werden, nachdem die Datenbank geöffnet wurde. Es ist auch die selbe Methode, die sie zum Erneuern der Indexe verwenden. Zum Beispiel:
 
   Dbf1.Exclusive := True;
   Dbf1.Open;
   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
   Dbf1.Close;
 
Der erste (primary) Index ist eine Datei mit dem Namen "dvdsname.mdx" und der zweite ist die Datei "rating.ndx". Daher müssen sie aufpassen in einer Mehrfach-Tabellen Datenbank, den selben Dateinamen nicht zweimal zu verwenden.
Delphi kann es so:

Code: Alles auswählen

Test.AddIndex('ce_fahrt', 'DTOS(STARTDATE)', [ixPrimary]);
Wenn ich den Index auf ein Characterfeld anlege funktioniert es unter Lazarus ohne murren:

Code: Alles auswählen

Test.AddIndex('ce_fahrt', 'NAME', [ixPrimary]);
Es muß also eine Umwandlung von ftDate nach String erfolgen, ist ja auch logisch. Nur wie?

Code: Alles auswählen

Test.AddIndex('ce_fahrt', 'DateToStr(STARTDATE)', [ixPrimary]);
Geht auch nicht.

Ich könnte das Datum als String speichern, dann funktioniert die Indexerstellung. Aber kann das wirklich der Sinn sein und was ist mit Zahlen wie zum Beispiel:

Code: Alles auswählen

Test.AddIndex('ce_fahrt', 'MITARBEITER + JAHRESGEHALT', [ixPrimary]);
oder wenn beides Zahlen sind, dann werden die Werte ID + Gehalt addiert.

Code: Alles auswählen

Test.AddIndex('ce_fahrt', 'MIT_ID + JAHRESGEHALT', [ixPrimary]);
Hmm, ...

Gruß
Baba.

Mea Culpa!!! (Meine Schuld)

Die Datenbank war Exclusive = False und da diese mit dem Index verknüpft wird, konnte es nicht funktionieren.

Code: Alles auswählen

Test.Exclusive := True;  //GANZ WICHTIG!!!
Test.Active := True;
Test.AddIndex('ce_fahrt', 'DTOS(STARTDATE)+STARTTIME', []);
Test.ce_fahrt.Active := False;
 
Ich habe mal wieder, wie schon so häufig, an der ganz falschen Stelle gesucht. :(

Antworten