Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird Datensatz verschieben via PrimaryKey (https://www.delphipraxis.net/167275-firebird-datensatz-verschieben-via-primarykey.html)

Perlsau 22. Mär 2012 08:57

AW: Firebird Datensatz verschieben via PrimaryKey
 
Zitat:

Zitat von Nersgatt (Beitrag 1157671)
Hab mir gerade mal Deinen ersten Post nochmal angeschaut. So bombadierst Du natürlich die Datenbank mit UPDATEs. Je nachdem, wie viele Datensätze Du drin hast.

Vollkommen richtig, bei einer größeren Datensatzmenge dauert das ewig :lol:

Die Lösung mit der Zusatzspalte (SeitenNr) ist auf jeden Fall die bessere. Hab vielen Dank für deine Hinweise.:wink:

Blup 22. Mär 2012 11:14

AW: Firebird Datensatz verschieben via PrimaryKey
 
Die Bedingungen sollten meiner Meinung nach erfüllt werden:
- der Index auf das Sortierfeld ist eindeutig
- auf die Daten wird auch bei der Änderung über den Index zugegriffen
- die Änderung erfolgt innerhalb einer Transaktion

Ich würde das in einer Stored Procedure kapseln.
Code:
create procedure P_BILDER_VERSCHIEBEN (
    SRCINDEX integer,
    DSTINDEX integer)
AS
begin
  if (srcindex <> dstindex) then
  begin
    if (srcindex < dstindex) then
    begin
      update bilder
      set   idx = -idx
      where (idx >= :srcindex) and (idx <= :dstindex);
 
      dstindex = -dstindex;
      srcindex = -srcindex;
 
      update bilder
      set   idx = (-idx) - 1
      where (idx >= :dstindex) and (idx < :srcindex);
    end
    else
    begin
      update bilder
      set   idx = -idx
      where (idx >= :dstindex) and (idx <= :srcindex);
 
      dstindex = -dstindex;
      srcindex = -srcindex;
 
      update bilder
      set   idx = (-idx) + 1
      where (idx > :srcindex) and (idx <= :dstindex);
    end
 
    dstindex = -dstindex;
 
    update bilder
    set   idx = :dstindex
    where (idx = :srcindex);
  end
end

mkinzler 22. Mär 2012 11:19

AW: Firebird Datensatz verschieben via PrimaryKey
 
Jetzt hatten wir ihn gerade davon überzeugen können, dass man den Primärschlüssel tunlichst nicht anfassen sollte und sich dieser nicht zur Festlegung einer Anzeigereihenfolge eignet. Aber wir sind halt alle Idioten und haben keine Ahnung.

Perlsau 22. Mär 2012 11:46

AW: Firebird Datensatz verschieben via PrimaryKey
 
Zitat:

Zitat von mkinzler (Beitrag 1157927)
Jetzt hatten wir ihn gerade davon überzeugen können, dass man den Primärschlüssel tunlichst nicht anfassen sollte und sich dieser nicht zur Festlegung einer Anzeigereihenfolge eignet.

Keine Sorge, diesen Fehler mache ich nicht noch einmal :idea:
Zumal die Verschiebungen ja mit eingeschaltetem Filter geschehen und deshalb gar nicht alle PrimaryIndexes sichtbar sind:
Delphi-Quellcode:
DatasetBilder.Filter := 'PROJEKTIDX=' + StrToInt(ProjektIndex);
Zitat:

Zitat von mkinzler (Beitrag 1157927)
Aber wir sind halt alle Idioten und haben keine Ahnung.

Ganz im Gegenteil, ich profitiere seit Jahren von den Weisheiten der Forenprominenz :-D
(auch wenn sich der finanzielle Profit in Grenzen hält ...)

Blup 23. Mär 2012 09:31

AW: Firebird Datensatz verschieben via PrimaryKey
 
Zitat:

Zitat von mkinzler (Beitrag 1157927)
Jetzt hatten wir ihn gerade davon überzeugen können, dass man den Primärschlüssel tunlichst nicht anfassen sollte und sich dieser nicht zur Festlegung einer Anzeigereihenfolge eignet. Aber wir sind halt alle Idioten und haben keine Ahnung.

Bezieht sich das auf meinen Beitrag?
Das man den Primärschlüssel nicht verändert ist ja jetzt hoffentlich allen klar.
Es gibt noch weitere Gründe, die dagegen sprechen und noch nicht genannt wurden (z.B. Lock-Konflikte, OPF, Replication).

Demnach kann das Sortierfeld natürlich nicht der Primärschlüssel sein und ein zusätzlicher Index ist für den schnellen Zugriff auf jeden Fall sinnvoll. Ich schreibe "eindeutiger Index", weil hier sonst leicht Fehler gemacht werden, die den Datenzugriff ausbremsen.
Beispiel, mehrere Touren mit eigenen Anlaufstellen:
Code:
CREATE TABLE T_LIEFERWEG (
/* ... */
    TOUR_ID  INTEGER,
    POS      INTEGER
/* ... */
);

/* die Abfrage */
select * from T_LIEFERWEG where TOUR_ID = :ID order by POS;

/* der für diese Abfrage optimale Index */
CREATE UNIQUE INDEX IDX_LIEFERWEG ON T_LIEFERWEG (TOUR_ID, POS);

Perlsau 23. Mär 2012 09:51

AW: Firebird Datensatz verschieben via PrimaryKey
 
Liste der Anhänge anzeigen (Anzahl: 1)
Meine Sortierungsmethoden sind implementiert und funktionieren mit der zusätzlichen Spalte "SeitenNr" nun genau so, wie sie sollen:

Beim Hoch- und Runterschieben eines Datensatzes werden einfach die Seitennummern zweier untereinanderstehender Datensätze vertauscht. Die restlichen Methoden genauer zu erklären ist mir nun aber doch zu viel, weil es sich um recht viele Sortiermöglichkeiten handelt, wie das Bild im Anhang zeigt ...

Thema kann von mir aus geschlossen werden ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz