Einzelnen Beitrag anzeigen

MarkusT

Registriert seit: 11. Nov 2003
4 Beiträge
 
Delphi 7 Architect
 
#1

ClientDataSet und Indexdefs

  Alt 25. Feb 2004, 14:08
Ich möchte in einer Anwendung dem Benutzer die Möglichkeit geben, die Daten eines DBGrids nach seinen Bedürfnissen zu sortieren.
Zur besseren Übersichtlichkeit soll auch über mehrere Spalten sowie auf- und absteigend sortiert werden können. Die Auswahl geschieht in einem eigenen Dialog.
Da auch absteigend sortiert werden soll, fällt die Sortierung über IndexFieldNames weg.

Ich habe nun folgenden Codeabschnitt realisiert:
Delphi-Quellcode:
procedure TDM_Datenbanken.SetSuchergebnisSortierung(
 const IndexFelder: string; const Aufsteigend: boolean);
var
  IndexName: string;
begin
  if Aufsteigend then
    IndexName := 'IDX_A_' + IndexFelder
  else
    IndexName := 'IDX_D_' + IndexFelder;
  if IBQuery_Suche_Vertragsdaten.IndexDefs.IndexOf(IndexName) >= 0 then
    IBQuery_Suche_Vertragsdaten.IndexDefs.Delete(IBQuery_Suche_Vertragsdaten.IndexDefs.IndexOf(IndexName));
  if Aufsteigend then
    IBQuery_Suche_Vertragsdaten.IndexDefs.Add(IndexName, IndexFelder, [ixCaseInsensitive])
  else
    IBQuery_Suche_Vertragsdaten.IndexDefs.Add(IndexName, IndexFelder, [ixCaseInsensitive,
      ixDescending]);
  if IBQuery_Suche_Vertragsdaten.IndexDefs.IndexOf(IndexName) < 0 then
    IBQuery_Suche_Vertragsdaten.IndexDefs.Update;
  IBQuery_Suche_Vertragsdaten.IndexName := IndexName;
end;
procedure TDM_Datenbanken.SucheVertragsdatenClose;
begin
  IBQuery_Suche_Vertragsdaten.IndexName := '';
  IBQuery_Suche_Vertragsdaten.IndexDefs.Clear;
  IBQuery_Suche_Vertragsdaten.Close;
end;
Lasst Euch nicht von dem Namen täuschen IBQuery_Suche_Vertragsdaten ist ein TClientDataSet. Ich bin gerade dabei teile meines Programms von IBX-Komponenten auf DBX umzustellen.
Die Sortierung funktioniert grundsätzlich. Wählt man aber mehrere Spalten aus, so kommt es in der Zeile
IBQuery_Suche_Vertragsdaten.IndexName := IndexName; zu einer Index existiert nicht. Exception. Wählt man nur eine Spalte aus bzw. zwei Spalten die z.B. nur sehr kurze Strings enthalten, kommt keine Fehlermeldung.
Ich vermute, dass der Index im Speicher noch nicht vollständig generiert wurde. Kann man das irgendwie abfragen? "IndexOf" liefert sofort nach dem "Add" die Position, obwohl er noch nicht zugewiesen werden kann.

Ursprünglich wollte ich nur mit einem Index arbeiten, der modifiziert bzw. gelöscht wird.
Leider funktioniert es nicht, wenn man
Delphi-Quellcode:
IndexFieldNames := '';
Delete(x);
Clear;
durchführt. Bei "Add" kommt eine Fehlermeldung, dass der Index mit besagtem Namen bereits existiert.
Ich habe auch versucht an verschiedenen Stellen ein Update zu integrieren. Hat aber auch nichts geholfen. In einigen Newsgroupbeiträgen wird das Update nach dem Add durchgeführt. Bei mir ging dadurch aber immer der gerade hinzugefügte Index wieder verloren.

Kann mir jemand sagen, ob ich hier etwas falsch mache oder ob es eine andere Möglichkeit gibt.
Ich muss auf jeden Fall mit CDS arbeiten, da die zugrundeliegende SQL-Abfrage sehr komplex sein kann und so wiederkehrende DB-Abfragen mit ORDER-BY aus Performancegründen ausscheiden.

Ich arbeite mit D6 Enterprise Update Pack 2; Windows XP Prof. (alle Updates); Interbase 6.01 . Die Daten werden über eine TSQLQuery eingeladen.

Gruß Markus
  Mit Zitat antworten Zitat