Entwickler-Ecke

Datenbanken - Sortierung in TTable !!!


Jagg - Mi 20.11.02 17:58
Titel: Sortierung in TTable !!!
Hallo,Leute !

Wie sortiere ich die Datensätze einer TTable ?

Vielleicht so :

Quelltext
1:
Table1.AddIndex('IndexArtist','Artist', []);                    


...aber dann sagt er die Fehlermeldung "Tabelle ist in Gebrauch" !

Jagg !


MrSpock - Mi 20.11.02 23:08

Hallo Jagg,

grundsätzlich ist ein Index der richtige Weg. Um eine Tabelle umzustrukturieren, muss ein exklusiver Zugriff möglich sein. Kein anderer User oder Prozess darf zu diesem Zeitpunkt auf die Tabelle zugreifen. Hast du z.B. in der IDE Active auf True gesetzt, blockiert die IDE die Tabelle. Hast du in deinem Programm vor Hinzufügen des Indexes die Tabelle mit Open geöffnet, musst du sie erst wieder mit Close schließen.

Außerdem muss du nach Hinzufügen eines Indexes auch den Index noch auswählen, damit er zur Sortierung herangezogen wird. Standardmäßig ist der Primary Key gewählt, sofern er angelegt ist.


Jagg - Do 21.11.02 11:22

ok danke !

Jagg !


Jagg - Do 21.11.02 14:44

Beim Starten des Programmes ist die Tabelle schon geöffnet,aber wenn ich dann diesen Code :

Quelltext
1:
2:
3:
4:
5:
6:
7:
    Table1.Close;
    Table1.Exclusive := true;
    Table1.DeleteIndex ('IndexA');
    Table1.AddIndex ('IndexA','Artist',[ixExpression]);
    Table1.Active := True;
    Table1.IndexName := 'IndexA';
    DBGrid1.SetFocus;


...aufrufe sagt er die Meldung : "Tabelle in Gebrauch !"

Wieso ?

Jagg !

PS : Das Programm läuft einwandfrei,wenn ich die Tabelle beim Start öffne !


LCS - Do 21.11.02 14:49

Hi
das Hinzufügen eines Index auf diese Weise funktioniert nur wenn du die Tabelle neu erzeugst. Um zur Laufzeit einen zusätzlichen Index zu erzeugen müssest du die BDE-Funktion dbiDoRestructure aufrufen.

Borland hat folgendes geschrieben:

AddIndexDef ist nur für die Erstellung von Indexdefinitionen für Tabelle zulässig, die mit einem nachfolgenden Aufruf der Methoden CreateTable oder CreateDataSet erzeugt werden. Mit AddIndexDef können keine Indizes zu bereits vorhandenen Tabellen hinzugefügt werden.


Wenn du zur Laufzeit verschiedene Sortierfolgen benötigst, könntest du entweder die Indizes bereits beim Entwurf der Tabelle erzeugen, oder anstelle der TTable eine TQuery Komponente verwenden.

Gruss Lothar


LCS - Do 21.11.02 14:53

Nochmal ich
Sorry :oops: hab gerade gelesen, dass du AddIndex verwendest. Damit sollte das eigentlich funktionieren. Ich würde mal anstelle von [ixExpression], [ixCaseInsenitive] verwenden.

Gruss Lothar


Jagg - Do 21.11.02 14:59

...anstelle von [ixCaseInsensitve] sagt er auch dieselbe Fehlermeldung !
muss ich vor dem Aufruf eine neue Tabelle erstellen oder wie hast du das gemeint !

Jagg !


MrSpock - Do 21.11.02 18:58

Hallo Jagg,

du musst erst den Index auswählen und darfst erst dann Active wieder auf True setzen :D


Jagg - Fr 22.11.02 09:56

Hi !

Also,ich habe es so gemacht wie Mr. Spock gesagt hat,erst den Index auswählen und dann Active auf True setzen,funktioniert aber trotzdem nicht !
Ich glaube,der Fehler liegt woanders,wenn ich debugge,dann bleibt er bei AddIndex stehen und sagt mir dann die Fehlermeldung !
...und was ich euch noch nicht gesagt habe,ich habe in der Datenbankoberfläche schon den Index gesetzt,also den AnfangsIndex (nennt man den auch "PrimärIndex" ?)

Kann es denn daran liegen oder noch woanders ?

Jagg !


LCS - Fr 22.11.02 11:24

Hi
Ich habs mal ausprobiert (Table1 hat Exklusiven Zugriff):

Quelltext
1:
2:
3:
4:
5:
6:
with table1 do begin
  active  := False;
  AddIndex('IDX_TEST', 'Common_Name', [ixCaseInsensitive]);
  IndexName := 'IDX_TEST';
  Active  := True;
end;

Funktioniert wunderbar.

Gruss Lothar


Jagg - Fr 22.11.02 11:54

Code :

Quelltext
1:
2:
3:
4:
Table1.Active := False;
Table1.AddIndex ('IndexA','Artist',[ixExpression]);
Table1.IndexName := 'IndexA';
Table1.Active := True;


...auch wenn ich Table1 zur Entwurfszeit (Exclusive := True),sagt er immer noch den Fehler !

Jagg !


LCS - Fr 22.11.02 12:10

Hi
Dann ist deine Tabelle noch an irgendeiner anderen Stelle geöffnet. Kontrollier mal ob sie im DB Explorer der IDE geschlossen ist.

Gruss Lothar


Jagg - Fr 22.11.02 12:14

Also...die Tabelle ist schon geöffnet,wenn das Programm starte !
Mit deinem Code funktioniert es nur,wenn ich die Tabelle zur Laufzeit öffne,das will ich aber nicht !
Ich glaube,wir haben uns falsch verstanden :-)

Jagg !


wwerner - Fr 22.11.02 12:22

Hi Jagg,

ich glaube, du solltest dir mal noch ein paar Gedanken zur "robusten" Programmierung machen. Warum willst du die Tabelle nicht zur Laufzeit öffen? Das hat u. a. den Vorteil, das du viel leicher eine Fehlerbehandlung durchführen kannst, wenn z.B. die Tabelle fehlt!


:lol: Und jetzt sag nicht, bei dir fehlt die Tabelle NIE.


LCS - Fr 22.11.02 12:29

Dem kann ich nur zustimmen :!:


Jagg - Fr 22.11.02 12:39

Ja,Ok !

...aber kann man das denn so machen wie ich es will ?

Jagg !


wwerner - Fr 22.11.02 12:41

Jagg hat folgendes geschrieben:
Also...die Tabelle ist schon geöffnet,wenn das Programm starte !

Jagg hat folgendes geschrieben:

auch wenn ich Table1 zur Entwurfszeit (Exclusive := True),sagt er immer noch den Fehler !



Dann ist deine Tabelle auch in der IDE offen und du kannst nie exclusiven Zugriff auf die Tabelle erhalten


Jagg - Fr 22.11.02 12:48

axo ok !