Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze verschieben (https://www.delphipraxis.net/45401-datensaetze-verschieben.html)

hsbc 5. Mai 2005 15:11

Datenbank: Firebird • Zugriff über: Delphi 7 Professional + Zeos-Lib.

Datensätze verschieben
 
Hallo allerseits,

Ich möchte einen definierten Bereich von Datensätzen anhand der SATZNR verschieben. Das Datenfeld SATZNR ist durchgehend von 1 bis zur letzten SatzNr numeriert. Folgendes Beispiel:

6 VonNr
7
8
9
10 BisNr
11
12
13
14 EinfuegeNr
15

Ich möchte wie hier im Beispiel die Datensätze 6 bis 10 von ihrer Position ausschneiden und ab Position 14 (EinfuegeNr) einfügen. Am Ende sollte dann die physische Numerierung so aussehen:

11
12
13
6
7
8
9
10
14
15

Ich verwende dazu folgenden Quellcode: Da SatzNr 0 nicht verwendet wird, speichere ich mir zum Umnumerieren den temporären Satz in SatzNr 0 ab. Im Prinzip lese ich mir die einzelnen Datensätze ein, belege dann das Feld SATZNR mit dem neuen Wert und speichere wieder retour.

Delphi-Quellcode:
      FOR J := BisNr DOWNTO VonNr DO BEGIN
        FOR I := BisNr+1 TO EinfuegeNr-1 DO BEGIN
          DatenModul.ZQ_Anbote.Locate('SATZNR', J, []);
          DatenModul.ZQ_Anbote.Edit;
          DatenModul.ZQ_AnboteSATZNR.Value := 0;
          DatenModul.ZQ_Anbote.Post;

          DatenModul.ZQ_Anbote.Locate('SATZNR', I, []);
          DatenModul.ZQ_Anbote.Edit;
          DatenModul.ZQ_AnboteSATZNR.Value := J;
          DatenModul.ZQ_Anbote.Post;

          DatenModul.ZQ_Anbote.Locate('SATZNR', 0, []);
          DatenModul.ZQ_Anbote.Edit;
          DatenModul.ZQ_AnboteSATZNR.Value := I;
          DatenModul.ZQ_Anbote.Post;
        END;
      END;
Das Problem ist, dass zwar die ersten drei Sätze verschoben werden, die letzten beiden aber nicht.
Ideal wäre eine Routine, welche keine doppelte Schleife benötigt und in einem Aufwaschen die Neunumerierung durchführt.

Vielleicht hat jemand schon ein ähnliches Problem mal gelöst und könnte mir da ein paar Tips geben.

mfg
Herbert

marabu 6. Mai 2005 08:12

Re: Datensätze verschieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Herbert,

physisches Verschieben in einer relationalen Datenbank ist ein echtes Novum für mich. Ich verstehe deine Anfrage so, dass du die Reihenfolge deiner Sätze verändern möchtest - und das ist tatsächlich ein Standardproblem.

Üblicherweise liegt eine Tabelle mit Primärschlüssel PK und Sortierindex SI (candidate key) vor. Wegen der Basis 1 und wegen deines Beispiels nehme ich an, das die von dir gezeigte laufende Nummer der PK deiner Tabelle ist. Du brauchst dann noch eine Spalte SI vom Typ INTEGER, die von 0 ab fortlaufend befüllt wird. In deinem Beispiel gilt dann si = pk - 1.

Das Umordnen von Sätzen geschieht durch Manipulation des Sortierindex. Die Operation muss unbedingt durch eine Transaktion geschützt werden, da sonst die Integritätsbedingung (SI fortlaufend ab 0) nicht gewährleistet werden kann. Aus Performanzgründen solltest du für diesen Zweck eine Stored Procedure verwenden.

Wenn du versuchen willst die SP selbst zu implementieren, dann schau nicht in den Anhang. Meine Implementierung für Interbase OE erledigt die Verschiebung aus deinem Beispiel mit folgendem Befehl:
SQL-Code:
EXECUTE PROCEDURE MoveRecs(5, 12, 5)
Dabei werden die 5 Sätze an den Positionen 5 bis 9 hinter den Satz mit der Position 12 verschoben.

Grüße vom marabu

hsbc 6. Mai 2005 10:12

Re: Datensätze verschieben
 
Hallo marabu,

vorerst mal herzlichen Dank für deinen Beitrag. Ich werde mir deinen Anhang mal genau ansehen und versuchen.

mfg
Herbert

Tyler 6. Mai 2005 21:37

Re: Datensätze verschieben
 
Keine Lösung zu deinem Problem, aber mal ne Frage von draussen ;)

Wozu willst du die Datensätze "physisch" verschieben? Ich kann mir da beim besten Willen keine Anwendung für vorstellen, zumal diese "Umsortierung" doch sicherlich auch durch bestimmte Felder und Sortierkriterien erreich werden könnte, oder?

hsbc 7. Mai 2005 08:06

Re: Datensätze verschieben
 
Hi Tyler,

marabu hat genau erkannt, was mein Problem ist und mir auch bereits eine Lösung angeboten, welche ich für sehr gut finde. Das Wort "physisch" war von mir nicht gut gewählt. Im Prinzip handelt es sich bei meiner Datei um eine ANBOT-Datei, in welcher ALLE Angebote an ALLE Kunden gespeichert werden, und zwar so, dass das erste Feld (Primärindex) die ANBOTSNR ist und das zweite Datenfeld die SATZNR, wobei die SATZNR bei JEDEM Anbot von 1 an beginnt.

Beispiel:

ANBOTNR SATZNR

12345 - 1
12345 - 2
12345 - 3

12346 - 1
12346 - 2
12347 - 3
usw ...

Um eine Eindeutigkeit zu erzielen, habe ich die ANBOTNR und die SATZNR zusammen zu einem UNIQUE Schlüssel gepackt.

So - und jetzt kann es vorkommen, dass irgendein Anbot nochmals neu bearbeitet werden muss und es sich ergibt, dass eben Datensätze (SATZNR) eingefügt bzw. neu sortiert werden müssen. Bis jetzt behelfe ich mir so, dass ich mittels SQL nur die ANBOTNR des Anbots selektiere, welches ich gerade bearbeite. Es liegen demnach nur 1 mal die SATZNR von 1 bis x vor. Ich hoffe, ich habe meine Situation einigermassen beschreiben können.

Laut Beispiel von marabu werde ich jetzt wahrscheinlich zusätzlich noch ein Integerfeld einbauen müssen, da die SATZNR dafür vermutlich nicht dafür verwendet werden kann - muss mich da noch spielen.

Bei dieser Gelegenheit möchte ich noch etwas aussprechen - aber bitte schlägt mich nicht - ich weiss bei Gott nicht, wo ich den Code von marabu in meinen Quellcode bzw. im Projektinspektor eintippen kann. Ich habe eben Null Erfahrung mit Stored Procedures. Ich habe mir von Zeos ein Stored Procedure Objekt auf mein Formular gezogen, es mit dem ZConnect verbunden, den besagten Namen eingetragen und - ja und - in welche Eigenschaft des Objektes bzw. wie und wo im Quelltext soll ich jetzt den Code eintippen? Vielleicht hat jemand die Geduld und kann mir das auch noch erklären, würde mich sehr freuen.

mfg
Herbert

marabu 7. Mai 2005 17:38

Re: Datensätze verschieben
 
Hallo Herbert,

Zitat:

Zitat von hsbc
Laut Beispiel von marabu werde ich jetzt wahrscheinlich zusätzlich noch ein Integerfeld einbauen müssen, da die SATZNR dafür vermutlich nicht dafür verwendet werden kann - muss mich da noch spielen.

Die Stored Procedure funktioniert auch ohne die Null als Startnummer - ist ja noch keine Bereichsprüfung enthalten.

Zitat:

Zitat von hsbc
ich weiss bei Gott nicht, wo ich den Code von marabu in meinen Quellcode bzw. im Projektinspektor eintippen kann.

Die Stored Procedure wirst du beim Datenbank-Setup mit einspielen. Zum Testen kannst du sie per Admin-Tool (IBConsole, ...) einstellen. Die Zeos-Komponente gibt dir dann die Möglichkeit die SP mit deiner Parameterversorgung auszuführen.

Grüße vom marabu


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