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
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;