AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensätze schnell einfügen bzw. ersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Datensätze schnell einfügen bzw. ersetzen

Ein Thema von messie · begonnen am 4. Mai 2014 · letzter Beitrag vom 27. Mai 2014
Antwort Antwort
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Datensätze schnell einfügen bzw. ersetzen

  Alt 25. Mai 2014, 13:08
Moin,

das Update mit Parametern dauert jetzt eine halbe Stunde und ist erst zu einem Drittel fertig. Da muss wohl eine Tabellenlösung her.
@jobo: hast Du da ein etwas konkreteres Beispiel für mich?

Danke, Messie
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Datensätze schnell einfügen bzw. ersetzen

  Alt 25. Mai 2014, 16:57
st erst zu einem Drittel fertig. Da muss wohl eine Tabellenlösung her.
@jobo: hast Du da ein etwas konkreteres Beispiel für mich?
"etwas konkreter" ist ja dehnbar.

also hier mein Vorschlag von oben:
Zitat:
* da empfiehlt sich ggF eine extra Importtabelle fürs Laden (alles rein, ohne Abgleich)

* im 2. Schritt dann die erwähnten Merges / Update or Insert Statements und zwar nicht Satz für Satz, sondern die komplette Zwischentabelle in einem Rutsch. Abgleich über fachliche Schlüsselfelder, ggf mehrere
konkreter:
1. CSV Import über externes File wie z.B. hier nach Tabelle 'Neudat<en':
http://www.delphipraxis.net/180125-w...-firebird.html

2. korreliertes Update des Bestandes
über deine 3(?) Parameter
Code:
UPDATE Bestandsdaten
   SET <column> = N.<NewColumn>
            ..
   FROM bestandsdaten AS B INNER JOIN Neudaten As N
   On B.NR = N.NR ...
3. Delete der NeuDaten, die bereits für Update verwendet wurden.
Statement (vor allem Join) wie oben nur eben delete

4. Insert der Restdaten
Code:
insert into Bestandsdaten <columns>
select <columns> from Neudaten
5. Leeren der restlichen Neudaten
Code:
delete / truncate Neudaten
So mal als Idee. Kann man ausbauen oder abändern, wenn man mehr Kontrolle braucht.
z.B. "sind meine 3 Parameter eindeutig?", ...
Wenn man beim Bestand unsicher ist, ob die Kriterien hinreichend sind, kann man z.B. auf das Delete (Step3) verzichten, das Insert komplexer abgleichen und damit die gesamte Tabelle "Neudaten" für Prüfungen bewahren.
Ist man nicht sicher, dass die Eindeutigkeit der Neudaten über die gewünschten Kriterien gegeben ist, kann nach dem Import erstmal Prüfstatements drüberlaufen lassen.
Gruß, Jo
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Datensätze schnell einfügen bzw. ersetzen

  Alt 25. Mai 2014, 17:22
Moin,

ich habe das Problem jetzt aufgeteilt. Es gibt zwei Situationen, das nachträgliche händische Ändern von Messwerten und den Datenimport. Letzterer ist einmalig, also nicht ganz so wichtig. Da muss ich dann eben warten.
Bei den nachträglich geänderten Werten hole ich mit jetzt die Daten in eine Query und vergleiche den Messwert mit dem neuen Wert im Array. So muss ich nur auf der DB schreiben wenn sich die Werte tatsächlich geändert haben. Und da man in dieser Situation eher nur wenige Werte ändert, ist das kein Problem bei der Performance mehr.

Danke für die Unterstützung

Grüße, Messie
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Datensätze schnell einfügen bzw. ersetzen

  Alt 26. Mai 2014, 17:28
Ätsch, so schnell kann es gehen
Ich habe jetzt doch zwei andere Stellen wo ich ein paar tausend Datensätze auf einmal einfügen muss.
Daher zuerst die Frage für die Update or Insert-Variante: wie bekomme ich den vom Trigger angelegten Index des Datensatzes im returning zurück? Das Feld ID wird mir verweigert.

Grüße, Messie
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.882 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Datensätze schnell einfügen bzw. ersetzen

  Alt 26. Mai 2014, 17:33
Bei IBDAC wird dieser in dem Parameter RET_ID zurückgegeben.
Markus Kinzler
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Datensätze schnell einfügen bzw. ersetzen

  Alt 26. Mai 2014, 17:51
Bei IBDAC wird dieser in dem Parameter RET_ID zurückgegeben.
Danke!

Noch ein komischer Fehler:
Code:
UPDATE OR INSERT INTO table (P_ID,ST_NO,MEASUREMENTS) VALUES(:P_ID,:ST_NO,:MEASUREMENTS) MATCHING (P_ID,ST_NO) returning RET_ID into :ID;
wirft mir einen Fehler "unexpected end of command line" an am Komma zwischen den beiden matching-Spalten. Ohne returning läuft es problemlos durch.

Grüße, Messie

Edit: wenn ich kürzere Variablen verwende, bleibt das Problem an derselben Spalte.

Geändert von messie (26. Mai 2014 um 18:12 Uhr)
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Datensätze schnell einfügen bzw. ersetzen

  Alt 26. Mai 2014, 18:42
Moin,

hat mal jemand ein funktionierendes Beispiel für ein Update od Insert mit einer matching und returning-Klausel?
Möglichst so, dass es auch im Flamerobin zu testen ist, denn das bekomme ich gerae nicht hin.
(Ich kann mir die angemessene Geduld heute nicht leisten, sorry)

Grüße, Messie
  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 06:06 Uhr.
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