Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Positionen Um-Sortieren (https://www.delphipraxis.net/32169-positionen-um-sortieren.html)

rocksoft 19. Okt 2004 21:28


Positionen Um-Sortieren
 
Hallo Delphi freunde,


ich suche eine form, wie man die Positionen in ein Grid sortieren kann, zb wenn die letzte position ganz nach oben soll zb.

von
Pos, Artikel
1 Erdbeeren
2 Äpfel
3 Bannanen

auf
Pos, Artikel
1 Bannanen
2 Erdbeeren
3 Äpfel

Als DB benutze ich DBISAM.

Danke für die Hilfe

MrSpock 20. Okt 2004 23:15

Re: Positionen Um-Sortieren
 
Hallo rocksoft,

eine Möglichkeit wäre eine Abfrage an die DB, in der die Felder die gewünschte Reihenfolge haben. Du kannst aber auch im Datenbankgrid manuell die Überschrift anklicken und an eine neue Stelle ziehen. Das geht auch zur Design-Time. Öffne einfach die Tabelle im OI (Active auf True setzen). Dann klicke mit der rechten Maustaste auf das Grid und wähle Spalteneditor. Klicke dort auf das Feld "Alle Felder hinzufügen" (3. Button in der Schalterleiste). Jetzt kannst du die Reihenfolge durch Verschieben der Felder an die entsprechende Stelle dauerhaft vorgeben. Das bleibt auch nach Schließen der Tabelle im OI erhalten.

rocksoft 21. Okt 2004 00:19

Re: Positionen Um-Sortieren
 
Hallo Albert,

Danke für deine Antwort ist aber nicht was ich gesucht habe, ich denke war nicht gerade gut beschrieben mein vorhaben :), ich versuche die Artikel positionen, nach wunsch zu sortieren, mit zwei buttons (hoch und runter). Es kommt ja öfters vor das man in eine Rechnung 10 Artikel eingibt und dann merkt man, das der 5 Artikel besser in der zweite position past, jetzt muss ich alle Artikel löschen und neu eingeben so das die positionen stimmen, ist dann ein wenig nervig :)

Pos, Artikel
1, WindowsXp: Sollte Pos 5 werden
2, Maus
3, Tastatur
4, Monitor : Sollte Pos 1 werden
5, PC ZXY : Sollte Pos 2 werden

wie bekomme ich jetzt die Pos 4, Monitor auf Position 1 ?

Danke für die Hilfe

MrSpock 21. Okt 2004 01:53

Re: Positionen Um-Sortieren
 
Hallo rocksoft,

dann wäre es sinnvoll die Position als Feld in der Datenbank mitzuführen. Wenn du jetzt einen Button "Aktuelle Position nach oben" anklickst und die aktuelle Position ist z.B. 5, dann suchst du zunächst Pos4 z.B. über und verschiebst den Satz an eine Position, die du sonst nicht nutzt:

Delphi-Quellcode:
myTable.FindKey([4]);
myTable.Edit;
myTable.FieldByName('Pos').AsInteger := 9999;
myTable.Post;
Dann verschiebst du den alten 5er an die Position 4:
Delphi-Quellcode:
myTable.FindKey([5]);
myTable.Edit;
myTable.FieldByName('Pos').AsInteger := myTable.FieldByName('Pos').AsInteger-1;
myTable.Post;
und jetzt holst du den Datensatz von ganz hinten wieder:
Delphi-Quellcode:
myTable.FindKey([9999]);
myTable.Edit;
myTable.FieldByName('Pos').AsInteger := 5;
myTable.Post;
Wenn du jetzt noch vorher

Delphi-Quellcode:
myTable.DisableControls;
und hinterher

Delphi-Quellcode:
myTable.EnableControls;
aufrufst, sieht der Nutzer von der Verschiebung erst nachdem alles wieder richtig positioniert ist.

rocksoft 21. Okt 2004 22:59

Re: Positionen Um-Sortieren
 
Hallo Albert,


Mensch darauf hätte ich selber drauf kommen können, leider geht es so nicht mit query, für Tables habe ich es jetzt so gemacht, für den fall das noch jemand interese daran hat, eventuell geht es noch eleganter aber laufen tut es schon mal.

Danke für die Hilfe

Delphi-Quellcode:
procedure TForm1.UpClick(Sender: TObject);
var
  CurrPos: integer;
begin
  myTable.DisableControls;
  CurrPos := myTable.FieldByName('Pos').AsInteger;
  try
    if CurrPos = 1 then exit;
    myTable.Edit;
    myTable.FieldByName('Pos').AsInteger := 9999;
    myTable.Post;

    myTable.FindKey([CurrPos - 1]);
    myTable.Edit;
    myTable.FieldByName('Pos').AsInteger := myTable.FieldByName('Pos').AsInteger + 1;
    myTable.Post;

    myTable.FindKey([9999]);
    myTable.Edit;
    myTable.FieldByName('Pos').AsInteger := CurrPos - 1;
    myTable.Post;
  finally
    myTable.EnableControls;
  end;
end;

procedure TForm1.DownClick(Sender: TObject);
var
  CurrPos: integer;
begin
  myTable.DisableControls;
  CurrPos := myTable.FieldByName('Pos').AsInteger;
  try
    if CurrPos = PosTab.RecordCount then exit;
    myTable.Edit;
    myTable.FieldByName('Pos').AsInteger := 9999;
    myTable.Post;

    myTable.FindKey([CurrPos + 1]);
    myTable.Edit;
    myTable.FieldByName('Pos').AsInteger := myTable.FieldByName('Pos').AsInteger - 1;
    myTable.Post;

    myTable.FindKey([9999]);
    myTable.Edit;
    myTable.FieldByName('Pos').AsInteger := CurrPos + 1;
    myTable.Post;
  finally
    myTable.EnableControls;
  end;
end;

BBoy 31. Mai 2011 11:51

AW: Positionen Um-Sortieren
 
Das funktioniert gut. Aber weiß jemand wie ich mehrere markierte Zeilen in der DBGrid gleichzeitig verschieben kann?
Also ich markiere in der DBGrid Zeile 5-8 und alle 4 Zeilen sollen gleichzeitig mit der obigen (oder einer anderen) methode verschoben werden.
Danke.

mkinzler 31. Mai 2011 16:09

AW: Positionen Um-Sortieren
 
Sollte mit Hilfe von bookmarks funktionieren

BBoy 3. Jun 2011 12:55

AW: Positionen Um-Sortieren
 
Habe ein DBGrid und markiere da mehrere Zeilen in folge und die Markierten sollen dann mit jedem Buttonklick nach oben bzw. nach unten verschoben werden. Noch leiber wäre mir ja ein Drag&Drop per Maus. Aber das scheint ja noch viel schwieriger zu sein.

Bookmarks, ok dann hätte ich die selektierten. Aber wie kann ich das umsetzen? Ein paar Codezeilen würden mir da weiterhelfen da ich überhaupt keinen anstatz habe.

BBoy 5. Jun 2011 14:15

AW: Positionen Um-Sortieren
 
Habe es nun so gelöst:

Delphi-Quellcode:
begin
  Table1.DisableControls;

for i := 0 to DBGrid2.SelectedRows.Count -1 do begin
    DBGrid2.DataSource.DataSet.GotoBookmark(Pointer(DBGrid2.SelectedRows.Items[i]));
    CurrPos := datamodule1.Table1.FieldByName('TourPos').AsInteger;
    if CurrPos = 1 then begin
      Table1.EnableControls;
      exit;
    end;
    datamodule1.Table1.Edit;
    datamodule1.Table1.FieldByName('TourPos').AsInteger := 9999;
    datamodule1.Table1.Post;
    datamodule1.Table1.FindKey([CurrPos - 1]);
    datamodule1.Table1.Edit;
    datamodule1.Table1.FieldByName('TourPos').AsInteger := Table1.FieldByName('TourPos').AsInteger + 1;
    datamodule1.Table1.Post;
    datamodule1.Table1.FindKey([9999]);
    datamodule1.Table1.Edit;
    datamodule1.Table1.FieldByName('TourPos').AsInteger := CurrPos - 1;
    datamodule1.Table1.Post;
end;
    Table1.EnableControls;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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