Sortierung Tabelle Zeos

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
Andysg
Beiträge: 6
Registriert: Sa 31. Aug 2024, 20:44
OS, Lazarus, FPC: Linux Mint, L 3.4
CPU-Target: 64Bit
Wohnort: NRW

Sortierung Tabelle Zeos

Beitrag von Andysg »

Bin ratlos!

Ich habe eine Tabelle mit allen PLZ in DE die ich asc oder desc sortieren möchte.
Das unabhängig von einer Seletion.
Die Fehlermeldung ist : Identifier not found "stAscending".

Benutze Zeos

Code: Alles auswählen

procedure TFPlz.Grid1TitleClick(Column: TColumn);
begin
    if dmplz.sqlPlz.State=dsbrowse then begin

     dmplz.sqlPlz.SortedFields:=grid1.Columns.Items[column.Index].FieldName;

     if grid1.Columns.Items[column.Index].Tag=0 then begin
           dmplz.sqlPlz.SortType:=stDescending; <--funktioniert nicht
           grid1.Columns.Items[column.Index].Tag:=1;
           dmplz.sqlPlz.First;
     end
     else begin
           dmplz.sqlPlz.SortType:=[stAscending]; <--funktioniert auch nicht
           grid1.Columns.Items[column.Index].Tag:=0;
           dmplz.sqlPlz.First;
     end;
     
end;
end;
Zuletzt geändert von Andysg am So 15. Sep 2024, 11:51, insgesamt 1-mal geändert.
Glaube wenig, recherchiere alles; Denke selbst.

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Sortierung Tabelle Zeos

Beitrag von Sieben »

Entweder benutzt du tatsächlich die falschen Bezeichner oder die Unit, in der sie definiert sind, ist nicht in deiner uses-Liste. Ich tippe auf letzteres, da ich meine, diese Bezeichner schon irgendwo in Zusammenhang mit Zeos gesehen zu haben.

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Sortierung Tabelle Zeos

Beitrag von paweld »

Hinzufügen der Einheit ZAbstractRODataset zum Abschnitt uses.
Grüße / Pozdrawiam
paweld

charlytango
Beiträge: 1084
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Sortierung Tabelle Zeos

Beitrag von charlytango »

ich verstehe das technische Problem und dafür gibt es ja offensichtlich schon eine Lösung.
Nur.... 28.278 Postleitzahlen (lt Bing Copilot) in einer Abfrage macht für mich so gar keinen Sinn, was jetzt nicht heissen muß dass es dafür gar keine Anwendungsfälle gibt.

PS: @Andysg Bitte pack den Code in den entsprechenden Tag

Benutzeravatar
Andysg
Beiträge: 6
Registriert: Sa 31. Aug 2024, 20:44
OS, Lazarus, FPC: Linux Mint, L 3.4
CPU-Target: 64Bit
Wohnort: NRW

Re: Sortierung Tabelle Zeos

Beitrag von Andysg »

paweld hat geschrieben: So 15. Sep 2024, 06:37 Hinzufügen der Einheit ZAbstractRODataset zum Abschnitt uses.
Danke . Klappt super.
Glaube wenig, recherchiere alles; Denke selbst.

Benutzeravatar
Andysg
Beiträge: 6
Registriert: Sa 31. Aug 2024, 20:44
OS, Lazarus, FPC: Linux Mint, L 3.4
CPU-Target: 64Bit
Wohnort: NRW

Re: Sortierung Tabelle Zeos

Beitrag von Andysg »

[gelöst]

uses ..., ZAbstractRODataset;

Das funktioniert prima.

Code: Alles auswählen

procedure TFPlz.Grid1TitleClick(Column: TColumn);
begin
    if dmplz.sqlPlz.State = dsbrowse then begin
       // Nur ausführen, wenn der Status der Tabelle dsBrowse ist.

    case dmplz.sqlPlz.SortedFields = grid1.Columns.Items[column.Index].FieldName of
         // Prüfen, ob der Wert in sortedField der Tabelle gleich dem Feldnamen der Spalte ist
         True: begin
                    case dmplz.sqlPlz.SortType = stAscending of // Prüfen, ob die Sortierung aufsteigen ist
                         true: begin
                                    dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
                                       // Feldname aktualiseren
                                    dmplz.sqlPlz.SortType := stDescending;
                                      // SortType umkehren und so geht es darunter weiter
                               end;
                         false: begin
                                    dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
                                    dmplz.sqlPlz.SortType := stAscending;
                                end;
                    end;
               end;
         False: begin
                    case dmplz.sqlPlz.SortType = stDescending of
                         true: begin
                                    dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
                                    dmplz.sqlPlz.SortType := stAscending;
                               end;
                         false: begin
                                    dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
                                    dmplz.sqlPlz.SortType := stDescending;
                                end;
                    end;
               end;
         end;

        dmplz.sqlPlz.First;

    end;
end;    
Glaube wenig, recherchiere alles; Denke selbst.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Sortierung Tabelle Zeos

Beitrag von Zvoni »

Kürzer (jedoch ungetestet)

Code: Alles auswählen

procedure TFPlz.Grid1TitleClick(Column: TColumn);
begin
    if dmplz.sqlPlz.State = dsbrowse then begin       
    	dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
	If dmplz.sqlPlz.SortType = stDescending Then dmplz.sqlPlz.SortType := stAscending Else dmplz.sqlPlz.SortType := stDescending;
        dmplz.sqlPlz.First;
    end;
end;    
Erklärung: Deine zwei geschachtelten Case Of sind überflüssig.
In deinem äusseren Case Of prüfst du ob der Wert in SortedField derselbe ist wie der Feldname der Spalte. Wozu?
Im inneren Case Of setzt du nämlich jedesmal SortedField auf den Feldnamen der geclickten Spalte, egal in welchem Ast der Case Of's du bist
Bedeutet:
dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
wird IMMER ausgeführt.
Dasselbe für die Umkehrung von SortType.

Bin mir nicht einmal sicher, ob der Code das macht, was du willst.
Du hast auf zweite Spalte geclickt, und sortierst aufsteigend. Du clickst nochmal drauf, und es sortiert absteigend.
Du clickst auf Spalte 4, und es sortiert AUFSTEIGEND, weil der letzte SortType absteigend war.

Denk nochmal darüber nach ob es das ist was du willst.

Könnte mir vorstellen, dass immer wenn zum ersten Mal auf eine Spalte geclickt wird, IMMER aufsteigend sortiert werden soll, egal welcher SortType vorher war.

EDIT: Und im Vergleich zum ersten Post setzt du jetzt im letzten Versuch nirgends das Tag (falls du das überhaupt brauchst).
Weil wenn ich deinen ersten Post lese, ist es eigentlich genau das, was ich oben im letzten Satz gemeint habe

Code: Alles auswählen

procedure TFPlz.Grid1TitleClick(Column: TColumn);
begin
    if dmplz.sqlPlz.State = dsbrowse then begin       
    	dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
	if grid1.Columns.Items[column.Index].Tag=0 then begin
           dmplz.sqlPlz.SortType:=stDescending; 
           grid1.Columns.Items[column.Index].Tag:=1;           
     	end
     	else begin
           dmplz.sqlPlz.SortType:=stAscending; 
           grid1.Columns.Items[column.Index].Tag:=0;           
     	end;        
	dmplz.sqlPlz.First;
    end;
end;    
Könnte man wahrscheinlich noch weiter abkürzen mit einem
grid1.Columns.Items[column.Index].Tag:=BoolToInt(Not IntToBool(Integer(dmplz.sqlPlz.SortType))); (oder so ähnlich. Spinne nur gerade etwas herum)
so dass man nur das setzen des SortType innerhalb des If-Then-Else hat
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Andysg
Beiträge: 6
Registriert: Sa 31. Aug 2024, 20:44
OS, Lazarus, FPC: Linux Mint, L 3.4
CPU-Target: 64Bit
Wohnort: NRW

Re: Sortierung Tabelle Zeos

Beitrag von Andysg »

Ne Ne. Der Code ist sauber und funktioniert mit jedem DBGrid..
Du hast einen Denkfehler.

Code: Alles auswählen

procedure TFPlz.Grid1TitleClick(Column: TColumn);
begin
    if dmplz.sqlPlz.State = dsbrowse then begin       
    	dmplz.sqlPlz.SortedFields := grid1.Columns.Items[column.Index].FieldName;
    	
    	{Hier ist dein Denkfehler. Du schiebst einfach den Feldnamen in die Sortierung,
	    	ohne zu wissen, wie das alte Feld vorher sortiert war. Wenn ich eine Sortierung Auf/Ab
	    		für ein Feld ändere, sind alle anderen Felder unsortiert.
	    			also muss ich vorher prüfen, welches Feld und wie sortiert war.
		    			Dein Code sortiert alle Columns absteigend!!!}
	    		
	If dmplz.sqlPlz.SortType = stDescending Then dmplz.sqlPlz.SortType := stAscending Else dmplz.sqlPlz.SortType := stDescending;
        dmplz.sqlPlz.First;
    end;
end;    
Meine Versuche mit dem TAG kann man ignorieren.
Da wußte ich noch nicht, das stAscending und stDescending in der unit ZAbstractRODataset zu finden sind.

Danke an paweit
Glaube wenig, recherchiere alles; Denke selbst.

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Sortierung Tabelle Zeos

Beitrag von Sieben »

Der Einwand scheint mir nicht ganz schlüssig - vorausgesetzt dass im vorliegenden Falle immer nur nach genau einem Feld sortiert werden soll, wäre mein Vorschlag:

Code: Alles auswählen

procedure TFPlz.Grid1TitleClick(Column: TColumn);
begin
  begin
    if (dmplz.sqlPlz.State = dsbrowse) then
    begin
      // eine neue/andere Spalte wird gewählt
      if (dmplz.sqlPlz.SortedFields <> grid1.Columns.Items[Column.Index].FieldName) then
      begin
        // das entsprechende neue Feld wird zugewiesen
   	dmplz.sqlPlz.SortedFields := grid1.Columns.Items[Column.Index].FieldName;
        // und die Anfangssortierung ist in diesem Fall immer aufsteigend
        dmplz.sqlPlz.SortType := stAscending;
      end else
      begin
        // Feld ist gleich geblieben, nur die Sortierung wird geändert
	if (dmplz.sqlPlz.SortType = stAscending) then
          dmplz.sqlPlz.SortType := stDescending
        else
          dmplz.sqlPlz.SortType := stAscending;
      end;
      dmplz.sqlPlz.First;
    end;
  end;
end;
Und wenn man schon so weit ist, dass der Code 'mit jedem DBGrid funktioniert', kann man es auch gleich mal in einem eigenen TDBGrid-Abkömmling implementieren und hat es dann gleich in jeder neuen Anwendung automatisch zur Verfügung ohne eine weitere Zeile dazu schreiben zu müssen. Nutze die Möglichkeiten!

Antworten