Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 16. Jan 2011, 18:36
TQuery und 'Order by UPPER()' ??
Vielen Dank, das hat geholfen!

Verwende zwar kein TQuery, sondern weiterhin TDataset und kann auch für alle anderen Spalten weiterhin DoSort verwenden. Diese eine Spalte, in der Groß- und Kleinschreibung vorkommt, unterziehe ich jetzt einer Sonderbehandlung, indem ich sie aus dem CASE-Construct ausgliedere und die Sortierung direkt dem SelectSQL-String zuweise.

Vorher:
Delphi-Quellcode:
PROCEDURE Sort_Titel(Spalte : INTEGER);

VAR
   Merk : INTEGER;
   Aus : STRING;

BEGIN
     Merk := DatMod.FibSet_Titel.FieldByName('INDEX').AsInteger;
     IF Spalte = SortIndex THEN SortOrder := NOT SortOrder ELSE SortOrder := TRUE;

     CASE Spalte OF
      0 : DatMod.FibSet_Titel.DoSort(['INDEX'], [SortOrder]);
      1 : DatMod.FibSet_Titel.DoSort(['TITEL'], [SortOrder]);
      2 : BEGIN
               MeldungEin;
               DatMod.FibSet_Titel.DoSort(['VRegie'], [SortOrder]);
               MeldungAus;
          END;
      ...
      END;
Nachher:
Delphi-Quellcode:
PROCEDURE Sort_Titel(Spalte : INTEGER);

VAR
   Merk : INTEGER;
   Aus : STRING;

BEGIN
     Merk := DatMod.FibSet_Titel.FieldByName('INDEX').AsInteger;
     IF Spalte = SortIndex THEN SortOrder := NOT SortOrder ELSE SortOrder := TRUE;

     IF (Spalte <> 1) AND (SortIndex = 1) THEN
     BEGIN
          DatMod.FibSet_Titel.Close;
          DatMod.FibSet_Titel.SQLs.SelectSQL.Text := 'SELECT * FROM TITEL';
          DatMod.FibSet_Titel.Open;
     END ELSE
     IF Spalte = 1 THEN
     BEGIN
          DatMod.FibSet_Titel.Close;
          Aus := 'SELECT * FROM TITEL ORDER BY LOWER(TITEL) ';
          IF SortOrder THEN Aus := Aus + 'ASCELSE Aus := Aus + 'DESC';
          DatMod.FibSet_Titel.SQLs.SelectSQL.Text := Aus;
          DatMod.FibSet_Titel.Open;
     END;

     CASE Spalte OF
      0 : DatMod.FibSet_Titel.DoSort(['INDEX'], [SortOrder]);
      {ausgeklammert: 1 : DatMod.FibSet_Titel.DoSort(['TITEL'],          [SortOrder]);}
      2 : BEGIN
               MeldungEin;
               DatMod.FibSet_Titel.DoSort(['VRegie'], [SortOrder]);
               MeldungAus;
          END;
      ...
      END;
Kurze Erläuterung: SortIndex ist die Spaltennummer, nach der aktuell sortiert ist und die nach jeder neuen Sortierung gesetzt wird. SortOrder hat bei ASC den Wert TRUE und bei DESC den Wert FALSE. Beide Variablen sind global. So kann ich wie bei Excel durch einen Klick auf den Spaltentitel die Sortierung vornehmen, wobei ein zweiter Klick auf denselben Spaltentitel die Sortierung umkehrt.
  Mit Zitat antworten Zitat