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