Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatz Sortierreihenfolge ändern und verschieben (https://www.delphipraxis.net/144678-datensatz-sortierreihenfolge-aendern-und-verschieben.html)

DevStar 14. Dez 2009 09:11

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:
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
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.

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

mkinzler 14. Dez 2009 09:12

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Erweitere die Tabelle um ei entsprechendes Feld, nachdem du dann sortierst

DevStar 14. Dez 2009 09:13

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Ja, das Feld Sortorder gibt es ja schon.

Sharky 14. Dez 2009 09:28

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von DevStar
Ja, das Feld Sortorder gibt es ja schon.

Das dürfte nicht so leicht sein.
Wenn Du einen Datensatz verschieben möchtest musst Du ja bei allen Datensätzen das "Sortierfeld" in der Tabelle updaten.

Angel4585 14. Dez 2009 09:34

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.

DeddyH 14. Dez 2009 09:39

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Wieso bei allen? IMHO dürften doch die beiden auszutauschenden genügen, oder irre ich mich? Beispiel:
Code:
1 Erster DS
2 Zweiter DS
3 Dritter DS
4 Vierter DS
Wenn man nun z.B. 2 und 3 tauschen möchte, könnte das doch so funktionieren (erstes Update):
Code:
1 Erster DS
0 Zweiter DS //temporär auf 0 oder eine andere nicht existente Zahl
3 Dritter DS
4 Vierter DS
Zweites Update:
Code:
1 Erster DS
0 Zweiter DS
2 Dritter DS //alter Wert des "0"-DS
4 Vierter DS
Drittes Update:
Code:
1 Erster DS
3 Zweiter DS //alter Wert des anderen DS
2 Dritter DS
4 Vierter DS
In Reihenfolge dann:
Code:
1 Erster DS
2 Dritter DS
3 Zweiter DS
4 Vierter DS

Sharky 14. Dez 2009 10:03

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von DeddyH
Wieso bei allen? IMHO dürften doch die beiden auszutauschenden genügen, oder irre ich mich? ...

Im zweifell irrst immer Du :duck:
Ne, ich hatte erst einen halben Kaffee und da war mein "Gehirn" noch nicht auf voller Leistung.

Sharky meint dazu
DeddyH hat recht

DeddyH 14. Dez 2009 10:09

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von Sharky
Ne, ich hatte erst einen halben Kaffee und da war mein "Gehirn" noch nicht auf voller Leistung.

Verständlich, da war ich Dir 1 1/2 Tassen voraus :mrgreen:

DevStar 14. Dez 2009 11:35

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von DeddyH
Wieso bei allen? IMHO dürften doch die beiden auszutauschenden genügen, oder irre ich mich?

Stimmt, 2 reichen.

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;

Angel4585 14. Dez 2009 11:48

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.

DeddyH 14. Dez 2009 11:59

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von DeddyH
Code:
1 Erster DS
0 Zweiter DS //temporär auf 0 oder eine andere nicht existente Zahl
3 Dritter DS
4 Vierter DS

Ich hatte mir schon etwas dabei gedacht ;)

DevStar 14. Dez 2009 13:47

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von DeddyH
Ich hatte mir schon etwas dabei gedacht ;)

Danke - so klappt es.

Delphi-Quellcode:
          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) + '';
Es waren also drei Schritte nötig.

Und für die andere Richtung einfach:
Delphi-Quellcode:
iNewSortorder := iSortorder-2;
Ein Nachteil noch: Das dbGrid flackert leider.

Nachteule 14. Dez 2009 17:34

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Ein Nachteil noch: Das dbGrid flackert leider.
Delphi-Quellcode:
kunden.disableControls;
   ... tuwas
kunden.enableControls;

DevStar 14. Dez 2009 21:57

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von Nachteule
Zitat:

Ein Nachteil noch: Das dbGrid flackert leider.
Delphi-Quellcode:
kunden.disableControls;
   ... tuwas
kunden.enableControls;

Ja, das passt. Super. Danke.

DevStar 14. Dez 2009 22:04

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;

alzaimar 15. Dez 2009 05:56

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)

mkinzler 15. Dez 2009 06:31

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Das sollte so in FB genauso gehen

DevStar 16. Dez 2009 19:19

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von alzaimar
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)

Hmm, :gruebel:
wie bau ich das denn in den Delphi-Quellcode ein?
Wo übergebe ich meine Variablen (iNewSortorder und iOldSortorder)?

DevStar 18. Dez 2009 13:35

Re: Datensatz Sortierreihenfolge ändern und verschieben
 
Zitat:

Zitat von DevStar
Zitat:

Zitat von alzaimar
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)

Hmm, :gruebel:
wie bau ich das denn in den Delphi-Quellcode ein?
Wo übergebe ich meine Variablen (iNewSortorder und iOldSortorder)?

Möglicherweise als Stored Procedure?
Hat jemand ein Beispiel?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz