Announcement

Collapse
No announcement yet.

Datensätzreihenfolge in einem Grid per Maus verschieben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datensätzreihenfolge in einem Grid per Maus verschieben

    Hallo zusammen!

    Ich arbeite z.Z an einem Problem, das zwar gelöst ist, aber nicht besonders elegant. Vielleicht hat einer von Euch einen besseren Ansatz.

    Ich habe ein DBGrid, in dem ich z.B. Artikeldatensätze für einen Bericht anzeige.
    Jetzt möchte ich einen oder auch mehrere Datensätze (die Markiert werden(Multiselect)) innerhalb des Grid nach oben oder nach unten verschieben. Also die Reihenfolge der Datensätze ändern.
    Die Datensätze sind innerhalb der Tabelle über einen Index sortiert. Dieser Index ist leider auch ein Schlüssel- darf also nicht mehrfach vorkommen.

    Wie kann man die Datensatzposition innerhalb eines Record ändern.

    Ein Ansatz ist z.B. die zu bewegenden Datensätze in ein ClientDataSet zu schreiben und in der orig. Tabelle zu löschen.
    Dann per SQL in der Reihenfolge eine Lücke zu schaffen. Dann die Datensätze aus dem ClientDataset mit geänderter Reihenfolge in die Tabelle zurückschreiben.

    Kann man die Datensatzpointer in einem ClientDataset auch direkt umhängen? Also den Vektor bearbeiten?

    Oder kann man in einem TStringGrid mehrere Rows verschieben?

    Ich bin für jeden Ansatz dankbar!

    Danke in vorraus!

  • #2
    Hallo J.
    .
    Es ist eigentlich ganz einfach, aber nicht ganz einfach umzusetzen:
    .
    Das Multiselect gehst Du durch und merkst Dir die IDs der markierten Datensätze.
    Dann guckst Du, wie die erste und letzte ID ist.
    Nun auf diese IDs eine genügend hohe Integerzahl aufaddieren.
    Anschließend die gesamte Tabelle von hinten neu durchnummerieren (ID+1) bis zur gewünschten Position. Dieses solange wiederholen, bis alle markierten Datensätze in die neu geschaffene Lücke passen.
    .
    Anschließend können die "hochgeschaufelten" DS wieder nach unten in die Lücke eingepasst werden.
    .
    Der Vorteil dieser Methode ist, dass keine Datensätze verloren gehen können, falls die Kiste mal abschmiert.
    .
    mfg
    Michae

    Comment


    • #3
      Guter Ansatz!

      Man könnte den Vorgang komplett mit SQL lösen und in eine Transaktion verpacken. So sind alle Datensätze sicher vor Systemausfall.

      Ich werde den Ansatz mal umsetzen. Danke!

      Vielleicht gibt’s noch mehr Ansätze

      Comment


      • #4
        Hallo,
        wenn man statt ID+1 besser ID+<i>AnzahlMarkierteDS</i> verwendet, dann spart man noch die Schleife zum "vergrößern der Lücke"
        .
        Gruß Fal
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment

        Working...
        X