PDA

Vollständige Version anzeigen : Daten von tabelle x in Tabelle y schreiben


Juergen65
06.06.2012, 19:19
Hallo zusammen
Bräuchte da mal Hilfe, mit nachfolgendem Code lösche ich alle Datensätze die älter als 3 Tage sind, was auch soweit funktioniert.
'Löschen Datensätze von Tabelle tbl_Click_Produkte die älter als 3 Tage sind !!
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tbl_Click_Produkte WHERE tbl_Click_Produkte.SeDatum < Now() - 3"
DoCmd.SetWarnings True

Nun möchte ich vor dem löschen, alle Datensätze die älter als 3 Tage sind in einer neuen tabelle tbl_Gesamt_Click_Produkte kopieren oder anfügen.

Kann mir jemand helfen ?

Danke Gruß
Jürgen
:)

Storch
06.06.2012, 20:28
Aus dem Bauch heraus und nur Luftcode:

strSQL = "Insert Into tbl_Gesamt_Click_Produkte(*) Values " & _
"(Select * From tbl_Click_Produkte WHERE tbl_Click_Produkte.SeDatum < Now() - 3)"
'''Anschließend das Löschen vornehmen.

Vom Prinzip wäre das ein Anfügeabfrage. Insert fügt die Daten an, die mit der Selektanweisung geholt werden. Ob das mit den Sternchen so funktioniert, vor allem die in dem Insert-Teil, habe ich nie getestet. Alternativ könne die Datenfelder auch benannt werden, dann sollte das Prinzip auf jeden Fall klappen.

strSQL = "Insert Into tbl_Gesamt_Click_Produkte(FeldX, FeldY) Values " & _
"(Select FeldX, FeldY From tbl_Click_Produkte WHERE tbl_Click_Produkte.SeDatum < Now() - 3)"
'''Anschließend das Löschen vornehmen.

ebs17
06.06.2012, 20:47
Die Kombination von VALUES und SELECT ist wirklich nur Luft. Man müsste sich schon für eines entscheiden. wobei man mit VALUES nur genau einen Datensatz anfügen kann.

Generell müsste man aber die Frage stellen, wozu das Ganze gut sein soll. Läuft die Tabelle über? Datenbanktabellen vertragen sehr (sehr) viele Datensätze.

Juergen65
06.06.2012, 22:01
Hallo Eberhard

Es geht um Protokolle die an Maschinen erfasst werden. In der tabelle sind mitlerweile 70.000 Datensätze erfasst und jeden Tag werden es mehr.

Nun musste ich feststellen das die Geschwindigkeit mit zunehmender Anzahl an Datensätzen langsamer wird.

Meine Idea war alle Datensätze die älter sind als 3 Tage, in einer neuen tabelle mit gleichem Aufbau zu schreiben. Die Geschwindigkeit würde um einiges schneller werden, dieses habe ich getestet. Nun möchte ich diese Funktion mit VBA umsetzten.

Nur so richtig komme ich nicht weiter,

Gruss
Jürgen

Storch
07.06.2012, 05:50
Ich hab, wegen Eberhards Einwand, das bei mir mal im Abfragegenerator nachgestellt. Rausgekommen ist folgendes:

INSERT INTO tbl_gruppen (grp_name, sort)
SELECT tbl_Untergruppen.ugr_name, tbl_Untergruppen.sort
FROM tbl_Untergruppen
WHERE (((tbl_Untergruppen.sort)=1));


Ich finde, das mein Prinzip nicht ganz so falsch war, aber Values ist natürlich völliger Quatsch und das mit den Sternchen funktioniert auch nicht. Zum einen gibt das einen Syntaxfehler, zum anderen würden, wenn es ginge, die Sternchen alle Felder mit einschließen, somit auch Primärschlüssel etc. Diese werden aber bei Insert Into von der Zieltabelle automatisch vergeben(zumindest wenn dort Autowert eingestellt ist)

Das Beispiel oben selektiert alle DS aus tbl_Untergruppen, deren Wert in [sort] = 1 ist und fügt diese anschließend an die Tabelle tbl_gruppen an.

Rein in VBA-Code sieht das dann so aus:

strSQL = "INSERT INTO tbl_gruppen (grp_name, sort) SELECT ugr_name, sort FROM tbl_Untergruppen WHERE sort = 1"

Marsu65
07.06.2012, 06:59
Nun musste ich feststellen das die Geschwindigkeit mit zunehmender Anzahl an Datensätzen langsamer wird.
Das ist der Zeitpunkt, um sich Gedanken über geeignete Indizes und Abfragestrukturen zu machen:
http://www.szweb.de/Wissen-Tipps/Datenbankperformance-Seite-188.html

Meine Termintabellen mit mehreren 100k Datensätzen haben selbst bei komplexen Abfrage darauf keine Bremse entwickelt.

Wenn´s denn trotzdem sein soll:
... die Sternchen alle Felder mit einschließen, somit auch Primärschlüssel etc. Diese werden aber bei Insert Into von der Zieltabelle automatisch vergeben(zumindest wenn dort Autowert eingestellt ist)
Ich hoffe mal das die Primärschlüsselwerte sehr wohl mit "exportiert" werden (und somit in der Zieltabelle das Schlüsselfeld kein Autowert ist).
Braucht man doch irgendwann einmal alle Daten, hätte man sonst große Freude an doppelten Schlüsseln. ;)

Storch
07.06.2012, 07:29
....... hätte man sonst große Freude an doppelten Schlüsseln. ;)
Also ich freue mich sehr, das ich meinen Wohnungsschlüssel doppelt habe :grins: :grins: :grins:

Juergen65
07.06.2012, 08:50
Hallo zusammen
und danke für die Hilfe
@ Uwe
Also ich freue mich sehr, das ich meinen Wohnungsschlüssel doppelt habe
Das wäre für mich garnicht Lustig !!

In meiner Anwendung ist es auch wichtig, das beim übertragen der Daten in einer neuen Tabelle, keine Daten verloren gehen und in der Grundtabelle keine gelöscht werden, wenn das übertragen der Daten fehlgeschlagen ist.

@Marsu
Meine Termintabellen mit mehreren 100k Datensätzen haben selbst bei komplexen Abfrage darauf keine Bremse entwickelt.

Man sollte nicht Äpfel mit Birnen vergleichen. In jedem Prüfbericht muss einiges Dokomentiert werden.

Trotzdem würde ich mich über weitere Anregungen freuen.

Gruss
Jürgen

Juergen65
07.06.2012, 10:40
Hallo zusammen

Ich bin da am testen und auch schon weitergekommen. Folgender Code
überträgt die Daten in die Tabelle Historie.

CurrentDb.Execute "INSERT INTO Historie SELECT * FROM tbl_Test_Click;"

Den Code steuere ich zur Zeit zum testen über eine Schaltfläche. Nun mein Problem, drücke ich zweimal auf die schaltfläche, so werden die gleichen Daten nochmal in die Tabelle Historie geschrieben, stehen dort jetzt doppelt drin was ich natürlich nicht möchte. Wie müsste ich den Code erweitern, damit vorm übertragen die Protokoll_Nr überprüft wird und nur neue Datensätze hinzugefügt werden.

Ich hoffe ich habe es verständlich erklärt.

Gruss
Jürgen

Marsu65
07.06.2012, 13:55
Hallo Jürgen,
mach dein Schlüsselfeld in der Exporttabelle zum Primärschlüssel.
Dann ist es per Tabellendefinition nicht möglich, den gleichen Datensatz zweimal anzufügen.

Einen Ansatz, wie du in der Insert-Abfrage nur Datensätze berücksichtigen kannst, die noch nicht exportiert wurden, findest du hier:
FAQ 3.16 - Datensätze aus A, die nicht in B sind (http://www.donkarl.com/FAQ/FAQ3TAbfragen.htm#3.16)

In meiner Anwendung ist es auch wichtig, das beim übertragen der Daten in einer neuen Tabelle, keine Daten verloren gehen und in der Grundtabelle keine gelöscht werden, wenn das übertragen der Daten fehlgeschlagen ist.
Das kannst du sicherstellen, indem du Transaktionen verwendest.
Bitte sieh dir die Onlinehilfe dazu an.
Auch hier im Forum gibt es einige Beiträge dazu.

Man sollte nicht Äpfel mit Birnen vergleichen. In jedem Prüfbericht muss einiges Dokomentiert werden.
Das sagt nichts über die von dir verwendeten Indizes, Abfragestrukturen ... aus!?!
Trotzdem würde ich mich über weitere Anregungen freuen.
Wenn du die Anregungen aus o.a. Link alle beherzigt und umgesetzt hast, solltest du schon ein Stückchen Performance gewonnen haben