AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensätze verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

Datensätze verschieben

Ein Thema von hsbc · begonnen am 5. Mai 2005 · letzter Beitrag vom 7. Mai 2005
Antwort Antwort
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#1

Datensätze verschieben

  Alt 5. Mai 2005, 16:11
Datenbank: Firebird • Zugriff über: Delphi 7 Professional + Zeos-Lib.
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Datensätze verschieben

  Alt 6. Mai 2005, 09:12
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:
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
Angehängte Dateien
Dateityp: zip sp-moverecs_203.zip (388 Bytes, 21x aufgerufen)
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#3

Re: Datensätze verschieben

  Alt 6. Mai 2005, 11:12
Hallo marabu,

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

mfg
Herbert
  Mit Zitat antworten Zitat
Benutzerbild von Tyler
Tyler

Registriert seit: 19. Jun 2003
Ort: Berlin
241 Beiträge
 
#4

Re: Datensätze verschieben

  Alt 6. Mai 2005, 22:37
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?
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#5

Re: Datensätze verschieben

  Alt 7. Mai 2005, 09:06
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Datensätze verschieben

  Alt 7. Mai 2005, 18:38
Hallo Herbert,

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 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 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