DBGrid Sortierung mittels Drag & Drop

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

DBGrid Sortierung mittels Drag & Drop

Beitrag von Bernie110 »

Hallo Zusammen,

ich hab schon einige Themen zur Sortierung eines DbGrids gefunden.
Jedoch leider noch keines welches die Sortierung mittels Drag & Drop in einem DBGrid behandelt.
Normalerweise sortiere ich meine Datensätze mittels SQL Statment ORDER BY.
Jedoch würde ich mir wünschen, eine Sortierung mittels Drag & Drop umzusetzen.
In meiner Datensatztabelle habe ich bereits ein Feld mit dem Namen Pos

Bei mir geht es um die Entladereihenfolge bei einem LKW.
Der hat z.b. folgende Entladeorte unsortiert in seinem DBGrid. :mrgreen:

Pos Entladetelle
0 Koblenz
0 Wiesbaden
0 Frankfurt


Cool wäre jetzt wenn man mittels drag and drop den Ort Frankfurt an die oberste Stelle ziehen könnte und die Pos den Wert 1 bekommt.
Dann Koblenz nach ganz unten mit dem Wert 3 usw.
damit es dann so aussieht.

Pos Entladetelle
1 Frankfurt
2 Wiesbaden
3 Koblenz

Hat jemand so etwas schon mal gemacht ? Bzw jemand eine Idee wie man das anstellen könnte?

Vorab danke für eure Antworten
Lg Bernie

wp_xyz
Beiträge: 5142
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid Sortierung mittels Drag & Drop

Beitrag von wp_xyz »

Schau dir diesen Thread mit Beispielprojekt an: https://forum.lazarus.freepascal.org/in ... #msg366537

Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

Re: DBGrid Sortierung mittels Drag & Drop

Beitrag von Bernie110 »

Hi wp_xyz herzlichen Dank für diesen Link !
Grüble schon seit Stunden über diesen Code.
Denke soweit habe ich das Prinzip verstanden.
Ich versuche mal das Ganze mit ein paar SQL Statements darzustellen.
Das Geheimnis liegt im Y-Wert aus GridRow := DBGrid2.MouseCoord(X,Y).Y;
Kann ja nicht so schwer sein :mrgreen:

Lg Bernie

wp_xyz
Beiträge: 5142
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid Sortierung mittels Drag & Drop

Beitrag von wp_xyz »

Hast du gesehen, dass im Kopf der Unit ein Link zu einem Blog-Artikel steht, in dem der Original-Autor (Cary Jensen) das alles erklärt? Und dort wird nochmals auf einen Vorgänger-Artikel verwiesen.

Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

Re: DBGrid Sortierung mittels Drag & Drop

Beitrag von Bernie110 »

wp_xyz hat geschrieben: Mi 19. Aug 2020, 00:07 Hast du gesehen, dass im Kopf der Unit ein Link zu einem Blog-Artikel steht, in dem der Original-Autor (Cary Jensen) das alles erklärt? Und dort wird nochmals auf einen Vorgänger-Artikel verwiesen.
Hi herzlichen dank, ja hab ich gelesen. Aber irgendwie ist mir das viel zu kompliziert.
Habs jetzt über mehrere SQL Statments gemacht. Mal so aus Spass.
Ich verpass meinen Datensätzen einen fortlaufenden Reihenfolgen_Index vom Typ float bevor ich das Drag and drop ausführe.
Also 1.0, 2.0 ,3.0 ,4.0 ,5.0 usw als Ganzzahl.
Bei Drag and drop ermittle ich den Y Wert mit DBGrid2.MouseCoord(X,Y).Y // das hat schon mal geholfen :-)
und addiere dem Reihenfolgen_Index entweder + 0.5 oder - 0,5. je nach dem ob ich nach oben oder unten ziehe.
Bring meine DS dann erneut in Reihenfolge und vergebe den Index per Schleife neu.
Scheint bisher alles zu funktionieren.
Muss nur noch über eine View die Datensätze besser einschränken, denn diese Tabelle wird Mio Ds haben :D

Kann man so machen oder ?
Lg Bernie

Code: Alles auswählen

procedure TFrm_TOUR_ERFASSUNG_BE_U_ENTLADESTELLEN.DBGrid2DragDrop(Sender,
  Source: TObject; X, Y: Integer);
var
  i : Integer;
  s : String;
  X_TOUR_POS : String;
begin
   
   // Werte in die angezeigten Editfelder übernehmen
   edPos_old.text := dbgrid2.DataSource.DataSet.FieldbyName('TOUR_ENTLAD_POS').asString;
   edPos_New.text:= IntToStr(DBGrid2.MouseCoord(X,Y).Y);
   edTOUR_POS.text := dbgrid2.DataSource.DataSet.FieldbyName('TOUR_POS').asString;
   
   // Reihenfolge_Index.value = Typ SpinFloat
   // Prüfen ob nach oben oder nach unten gezogen wurde.
   if StrToInt(edPos_old.text) < StrToInt(edPos_New.text) then
   begin
   Reihenfolge_Index.value :=  StrToInt(edPos_New.text) + 0.5;
   end else
   begin
   Reihenfolge_Index.value :=  StrToInt(edPos_New.text) - 0.5;
   end;

   // Dem gezogenen Datensatz den Reihenfolge_Index.value geben
      s := 'UPDATE DT_TOUR_DISPO_TBL '
                      + ' SET'
                      + ' REINFOLGE_INDEX = :REINFOLGE_INDEX '
                      + ' WHERE '
                      + ' DISPO_TOUR_ID = '''+Frm_TOUR_ERFASSUNG.TOUR_ID.text+''' and '
                      + ' DISPO_TOUR_POS = '''+edTOUR_POS.text+''' '
                      + ' ;';

         frm_Hauptmenu.SQLQuery2.close;
         frm_Hauptmenu.SQLQuery2.SQL.Clear;
         frm_Hauptmenu.SQLQuery2.SQL.Add(s);

         frm_Hauptmenu.SQLQuery2.ParamByName('REINFOLGE_INDEX').AsFloat := Reihenfolge_Index.value;
         Frm_Hauptmenu.SQLQuery2.ExecSQL;
         frm_Hauptmenu.SQLTransaction2.Commit;

         // NEUE Entlade-REIHENFOLGE + neuen Index vergeben
         frm_Hauptmenu.SQLQuery1.close;
         frm_Hauptmenu.SQLQuery1.SQL.Clear;
         frm_Hauptmenu.SQLQuery1.SQL.Add('select * from DT_TOUR_DISPO_TBL where DISPO_TOUR_ID = '''+Frm_TOUR_ERFASSUNG.TOUR_ID.text+''' Order by REINFOLGE_INDEX ;' );
         frm_Hauptmenu.SQLQuery1.open;

         i := 0;

         While not frm_Hauptmenu.SQLQuery1.EOF do
         begin

                  X_TOUR_POS         := frm_Hauptmenu.SQLQuery1.FieldByName('DISPO_TOUR_POS').AsString;
                  i := i + 1 ;
                  s := 'UPDATE DT_TOUR_DISPO_TBL '
                               + ' SET '
                               + ' DISPO_TOUR_ENTLAD_POS = :DISPO_TOUR_ENTLAD_POS,'
                               + ' REINFOLGE_INDEX = :REINFOLGE_INDEX '
                               + ' WHERE '
                               + ' DISPO_TOUR_ID = '''+Frm_TOUR_ERFASSUNG.TOUR_ID.text+''' and '
                               + ' DISPO_TOUR_POS  = '''+X_TOUR_POS+'''; ';

                  frm_Hauptmenu.SQLQuery2.close;
                  frm_Hauptmenu.SQLQuery2.SQL.Clear;
                  frm_Hauptmenu.SQLQuery2.SQL.Add(s);               // INSERT TOUR

                  frm_Hauptmenu.SQLQuery2.ParamByName('DISPO_TOUR_ENTLAD_POS').AsInteger := i;
                  frm_Hauptmenu.SQLQuery2.ParamByName('REINFOLGE_INDEX').AsInteger := i;
                  Frm_Hauptmenu.SQLQuery2.ExecSQL;
                  frm_Hauptmenu.SQLTransaction2.Commit;
          frm_Hauptmenu.SQLQuery1.Next;
        end;

// DBGRID 2 Aktualisieren---------------------------------
       s := ' select * from v_TOUR_ENTLADEORTE '
          + ' WHERE '
          + ' TOUR_ID = '''+Frm_TOUR_ERFASSUNG.TOUR_ID.text+''' '
          + ' ORDER BY TOUR_ENTLAD_POS;';

       SQLQuery2.close;
       SQLQuery2.SQL.Clear;
       SQLQuery2.SQL.Add(s);
       SQLQuery2.open;

   DBGrid2.DataSource.DataSet.Locate('TOUR_POS', edTOUR_POS.text, []);


end;

Antworten