![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: Delphi
Datensatz Sortierreihenfolge ändern und verschieben
Hallo,
ich habe ein dbGrid mit einer Spalte "Sortorder", d.h. in dieser Reihenfolge werden die Datensätze angezeigt.
SQL-Code:
Jettz möchte ich die Reihenfolge eines Datensatz verschieben, indem ich ihn nach oben oder unten verschiebe. Am besten über einen Button bzw. zwei Button.
Lfd. Nummer Name Vorname Sortorder
1 Müller Lieschen 1 2 Maier Peter 5 <--------- 3 Schulze Jan 2 4 Werner Otto 3 5 Ellenberger Markus 4 In diesem Fall müssten sich die nachfolgenden Werte von Sortorder aber auch immer mitändern. :gruebel: Ich habe das mal bei einer Paradox-DB gesehen und das ging dort sehr schnell. Gruß DEVSTAR |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Erweitere die Tabelle um ei entsprechendes Feld, nachdem du dann sortierst
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Ja, das Feld Sortorder gibt es ja schon.
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
Wenn Du einen Datensatz verschieben möchtest musst Du ja bei allen Datensätzen das "Sortierfeld" in der Tabelle updaten. |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Ich mach das so, dass dieses Sortfeld ein flieskommafeld ist. wenn ich jetz en datensatz verschiebe nimm ich einfach den wert der nächsten und übernächsten und gib dem eintrag die hälfte davon.
Irgendwann gibts dann aber ne berechnungsgrenze, dann muss man einfach einmal mit ner funktion drüber und alles durchnummerieren. |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Wieso bei allen? IMHO dürften doch die beiden auszutauschenden genügen, oder irre ich mich? Beispiel:
Code:
Wenn man nun z.B. 2 und 3 tauschen möchte, könnte das doch so funktionieren (erstes Update):
1 Erster DS
2 Zweiter DS 3 Dritter DS 4 Vierter DS
Code:
Zweites Update:
1 Erster DS
0 Zweiter DS //temporär auf 0 oder eine andere nicht existente Zahl 3 Dritter DS 4 Vierter DS
Code:
Drittes Update:
1 Erster DS
0 Zweiter DS 2 Dritter DS //alter Wert des "0"-DS 4 Vierter DS
Code:
In Reihenfolge dann:
1 Erster DS
3 Zweiter DS //alter Wert des anderen DS 2 Dritter DS 4 Vierter DS
Code:
1 Erster DS
2 Dritter DS 3 Zweiter DS 4 Vierter DS |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
Ne, ich hatte erst einen halben Kaffee und da war mein "Gehirn" noch nicht auf voller Leistung. Sharky meint dazu DeddyH hat recht |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
Klappt nur nicht..... :gruebel: Code für "Nach-Oben-Schieben" im Grid
Delphi-Quellcode:
with DataModule.DataSet do
begin Open; if Locate('SORTORDER', IntToStr(iSortorder), [loCaseInsensitive]) then iSortorder := FieldByName ('SORTORDER').AsInteger; iOldSortorder := iSortorder; iNewSortorder := iSortorder-1; sSQL_Befehl1 := 'UPDATE kunden SET sortorder = ' + IntToStr(iNewSortorder) + ' '+ 'WHERE sortorder = ' + IntToStr(iOldSortorder) + ''; sSQL_Befehl2 := 'UPDATE kunden SET sortorder = ' + IntToStr(iOldSortorder) + ' '+ 'WHERE sortorder = ' + IntToStr(iNewSortorder) + ''; end; |
Re: Datensatz Sortierreihenfolge ändern und verschieben
vor dem zweiten update bzw nach dem ersten dürften die zahlen gleich sein, weswegen das zweite dann beide wieder auf das andere macht.
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
Delphi-Quellcode:
Es waren also drei Schritte nötig.
sSQL_Befehl1 := 'UPDATE kunden SET sortorder = ' + IntToStr(iTempSortorder) + ' '+
'WHERE sortorder = ' + IntToStr(iOldSortorder) + ''; sSQL_Befehl2 := 'UPDATE kunden SET sortorder = ' + IntToStr(iOldSortorder) + ' '+ 'WHERE sortorder = ' + IntToStr(iNewSortorder) + ''; sSQL_Befehl3 := 'UPDATE kunden SET sortorder = ' + IntToStr(iNewSortorder) + ' '+ 'WHERE sortorder = ' + IntToStr(iTempSortorder) + ''; Und für die andere Richtung einfach:
Delphi-Quellcode:
Ein Nachteil noch: Das dbGrid flackert leider.
iNewSortorder := iSortorder-2;
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
Delphi-Quellcode:
kunden.disableControls;
... tuwas kunden.enableControls; |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Hier die ganze Procedur, falls sie jemand braucht.
Delphi-Quellcode:
procedure TfrmKunden.SortorderKunden (richtung: boolean);
var iAktuellerDatensatz, iSortorder, iOldSortorder, iNewSortorder, iTempSortorder: integer; sID, sSQL_Befehl1, sSQL_Befehl2, sSQL_Befehl3: string; begin if not VarIsNull(DBGrid1.DataSource.DataSet.FieldByName('SORTORDER').Value) then begin iAktuellerDatensatz := DBGrid1.DataSource.DataSet.FieldByName('ID').Value; iSortorder := DBGrid1.DataSource.DataSet.FieldByName('SORTORDER').Value; iTempSortorder := 0; end else begin ShowMessage ('Datensatz hat keine Identnummer!'); exit; end; DBGrid1.DataSource.DataSet.DisableControls; if iAktuellerDatensatz <> 0 then begin with DataModuleKunden.DataSetAnlagen do begin Open; if Locate('SORTORDER', IntToStr(iSortorder), [loCaseInsensitive]) then iSortorder := FieldByName ('SORTORDER').AsInteger; iOldSortorder := iSortorder; case richtung of true : iNewSortorder := iSortorder-1; //up false : iNewSortorder := iSortorder+1; //down else exit; end; sSQL_Befehl1 := 'UPDATE kunden SET sortorder = ' + IntToStr(iTempSortorder) + ' '+ 'WHERE sortorder = ' + IntToStr(iOldSortorder) + ''; sSQL_Befehl2 := 'UPDATE kunden SET sortorder = ' + IntToStr(iOldSortorder) + ' '+ 'WHERE sortorder = ' + IntToStr(iNewSortorder) + ''; sSQL_Befehl3 := 'UPDATE kunden SET sortorder = ' + IntToStr(iNewSortorder) + ' '+ 'WHERE sortorder = ' + IntToStr(iTempSortorder) + ''; try ModifySQL.Clear; ModifySQL.Text := sSQL_Befehl1; Open; Edit; UpdateRecord; Post; ModifySQL.Clear; ModifySQL.Text := sSQL_Befehl2; Open; Edit; UpdateRecord; Post; ModifySQL.Clear; ModifySQL.Text := sSQL_Befehl3; Open; Edit; UpdateRecord; Post; except MessageDlg ('Der Eintrag kann nicht geändert verschoben werden, ' + 'da ein anderer Benutzer auf den Datensatz zugreift.', mtError,[mbOK], 0); end; end; //Close; DataModuleKunden.KundenTransaction.Commit; end; with DBGrid1.DataSource.DataSet do begin Open; case richtung of true : Prior; //up false : Next; //down else exit; end; Locate('SORTORDER', iNewSortorder, [loCaseInsensitive]); end; DBGrid1.DataSource.DataSet.EnableControls; end; |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Wenn die LfdNr eindeutig ist (Primary Key), reichen 2 Updates, ok. eigentlich nur einer.
In T-SQL (MS SQL Server ginge das so)
SQL-Code:
Update Kunden set
Sortorder = case when LfdNr = :Von then SortOrder + 1 when LfdNr = :Nach then SortOrder - 1 else SortOrder end where LfdNr in (:Von, :Nach) |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Das sollte so in FB genauso gehen
|
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
wie bau ich das denn in den Delphi-Quellcode ein? Wo übergebe ich meine Variablen (iNewSortorder und iOldSortorder)? |
Re: Datensatz Sortierreihenfolge ändern und verschieben
Zitat:
Hat jemand ein Beispiel? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz