Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 02:37 Uhr.
Seite 2 von 2     12   

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