Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Datensatz duplizieren mit Anfügeabfrage.......

Begonnen von derilzemer, April 18, 2015, 15:26:23

⏪ vorheriges - nächstes ⏩

derilzemer

Hallo,
ich hatte die Frage hier in der Vergangenheit schon mal gestellt, jedoch ohne "Endlösung". Um die Frage vorab zu beantworten, wer so etwas benötigt, kann ich kurz und knapp mit ich beantworten. Ich sammle Kartenspiele, muss beim anlegen eines neuen Spieles mind. 20 Felder befüllen. Letzendlich aber unterscheidet sich der Datensatz in wenigen Feldern.
In der Regeln kommen dann immer 10-20 Spiele auf einen Schlag rein, dann ist solch eine Duplikatefunktion schon ganz nett.
Seit ich auf accdb umgestellt habe, sehe ich dass dies mit Makro gemacht werden muss. Wer kann mir dazu etwas an Hintergrund liefern? Im Netz habe ich dazu wenig bis nichts gefunden. Was ich gefunden habe, hat mich nicht weitergebracht. Einen Button mit der Datensatzfunktion duplizieren macht wohl nur das Hauptformular und gerneriert bei mir einen Fehler im bestehenden VBA Teil (siehe Bilder).Wer kann mich hier ein wenig unterstützen?
Vielen Dank vorab.

mfG
Andreas Müller
Grüße und Dank im voraus
Andreas

MaggieMay

#1
Hallo Andreas,

die Fehlermeldung entspricht ja wohl den Tatsachen, aber ich kann da (zunächst einmal) keinen Zusammenhang zu dem markierten VBA-Code erkennen.

Allerdings basiert die Abfrage zum Hauptformular auf vier Tabellen, so einfach wird es mit dem Kopieren wohl nicht werden. Im Grunde willst du doch nur das Spiel kopieren und nicht die ganzen Datensätze aus den damit verknüpften Tabellen, oder? Das solltest du dann wohl besser mit einer Anfügeabfrage per VBA lösen.

ZitatSeit ich auf accdb umgestellt habe, sehe ich dass dies mit Makro gemacht werden muss.
Wie kommst du da drauf? Du kannst weiterhin Ereignisprozeduren und VBA-Code einsetzen. Darfst halt den Assistenten nicht mehr benutzen.
Freundliche Grüße
MaggieMay

derilzemer

Guten morgen Maggie,
ja, da hast du recht. Das habe ich mir gestern abned auch noc gesagt. Mir würde es reichen die Datzensätze des Hauptformulars zu kopieren. Du hast auch recht, dass man nicht zwingend Makro nutzen muss. Zwingend ist es nur über den Assistenten, korrekt.
Die Anfügeabfragen welche ich so im YouTube oder wo auch immer mir angeschaut habe, mit denen macht man aber nicht klassisch Datensätze kopieren, eher kombinieren, oder? Es muss ja ein Datzensatz geclont werden und dann wohl mit der Anfügeabfrage angefügt werden, oder? Hast du ein Example wo ich mir das mal anschauen kann?

Gruß Andreas
Grüße und Dank im voraus
Andreas

derilzemer

Hi Maggie,
eventuell muss ich nochmal erwähnen, dass ich die Daten NICHT in eine andere Tabelle kopieren, sondern in die gleiche Tabelle, also als neuen Datensatz anfügen möchte!
Ich habe mal im 1. Schritt eine Abfrage mit all den relevanten Feldern die ich vom existierenden Datensatz übernehmen kann erstellt. Ich gehe hoffentlich richtig in der Annahme, dass die ID des zu duplizierenden Datensatzes nicht mit in die Abfrage muss, oder? Ich habe diese dann in eine Anfügeabfrage umgewandelt. Diese Abfrage erzeugt beim ausführen erst mal Fehler (siehe Bilder).
Die Abfrage beinhaltet 9 Felder der Tabelle. Die Meldung redet von 9 Zeilen :(. Da ja viele Felder Fremdkeys aus anderen Tabellen sind, kann ich mir vorstellen, warum er meckert (Bild2) und würde mir sagen, es wird kein neuer Key vergeben.
Was oder wie muss ich da jetzt vorgehen bzw. kann mich da jemand unterstützen, da mein VBA einfach begrenzt bis mind ist?
Gruß Andreas
Grüße und Dank im voraus
Andreas

MaggieMay

Hi,

das erste ist keine Fehlermeldung, sondern ein Aktualisierungs-Nachfrage.
Erstaunlich finde ich nur, dass 9 Datensätze angefügt werden sollen.
Ist das so geplant? Ein Kriterium hast du wohl nicht eingesetzt, oder?

Bei Abfragen bitte immer den SQL-Code zeigen, mit dem Entwurfsfenster kann man nicht viel anfangen.

Ist die Abfrage denn nun die Antwort auf meine Frage:
ZitatIm Grunde willst du doch nur das Spiel kopieren und nicht die ganzen Datensätze aus den damit verknüpften Tabellen, oder?
nämlich, dass nur Spiele kopiert werden sollen?
ZitatMir würde es reichen die Datzensätze des Hauptformulars zu kopieren.
Das Hauptformular basiert wie gesagt auf einer Abfrage, in der vier Tabellen verknüpft werden. Diese Abfrage kann aber - zumindest in der vorliegenden Form - nicht für einen Insert verwendet werden.
Zitatmit denen macht man aber nicht klassisch Datensätze kopieren, eher kombinieren, oder?
Ich weiß doch gar nicht was du dir im Internet auf YouTube angeschaut hast.
ZitatEs muss ja ein Datzensatz geclont werden und dann wohl mit der Anfügeabfrage angefügt werden
Das ist ein Vorgang, in der Anfügeabfrage werden die Daten direkt übernommen. Kopieren und Einfügen muss man nur bei manueller Vorgehensweise.
ZitatIch gehe hoffentlich richtig in der Annahme, dass die ID des zu duplizierenden Datensatzes nicht mit in die Abfrage muss
Ja, das ist richtig, es muss ja eine neue generiert werden.
Freundliche Grüße
MaggieMay

derilzemer

Hi,
hat mich zuerst auch gewundert, dass er 9 DS einfügen will. Er kopiert alle vorhandenen Datensätze, aktuell 9 Stück in der DB. Kriterien hatte ich keine gesetzt.
Zitatdass nur Spiele kopiert werden sollen
Ja, nur das Spiel, mehr nicht.
ZitatIch weiß doch gar nicht was du dir im Internet auf YouTube angeschaut hast.
Da werde ich zukünftig zumindest den Link posten wenn es relevant sein sollte, da hast du recht.
ZitatDas ist ein Vorgang, in der Anfügeabfrage werden die Daten direkt übernommen. Kopieren und Einfügen muss man nur bei manueller Vorgehensweise.
Okay, ich habe in der Anfügeabfrage qryDSDuplizieren alle Felder der Tabelle Spiele übernommen und mal ausgeführt, und die Abfrage hat 9 Datensätze hinzugefügt! Wie oben erwähnt, dupliziert die Abfrage alle Datensätze, wenn man nicht explizit sagt, dass sie nur den aktuell angezeigten Datensatz duplizieren soll, oder? Zumindest sind es aktuell in der Test-DB 9 datensätze, ergo nimmt er alle 9. Hier muss ich dann wohl mit den von dir schon angesprochenen Kritereien arbeiten, oder?
Mit welchem Code kann ich übrigens die Anfügeabfrage an einen Commandbutton binden?
Hier mal der SQL Code der aktuelle Anfügeabfrage qryDSDuplizieren:
INSERT INTO tblSpiele ( KategorieID_F, HaendlerID_F, SerieVerlagID_F, VarianteID_F, RSMotiveID_F, SchachtelID_F, KartenFormatID_F, SpielNr, SpTitel, Ausgabejahr, Preis, Porto, Kaufdatum, Zustand, Komplett, Bestand, Katalog, Info, Kartenzahl, LetzteAenderung )
SELECT tblSpiele.KategorieID_F, tblSpiele.HaendlerID_F, tblSpiele.SerieVerlagID_F, tblSpiele.VarianteID_F, tblSpiele.RSMotiveID_F, tblSpiele.SchachtelID_F, tblSpiele.KartenFormatID_F, tblSpiele.SpielNr, tblSpiele.SpTitel, tblSpiele.Ausgabejahr, tblSpiele.Preis, tblSpiele.Porto, tblSpiele.Kaufdatum, tblSpiele.Zustand, tblSpiele.Komplett, tblSpiele.Bestand, tblSpiele.Katalog, tblSpiele.Info, tblSpiele.Kartenzahl, tblSpiele.LetzteAenderung
FROM tblSpiele;

Gruß und Danke
Andreas

Grüße und Dank im voraus
Andreas

MaggieMay

ZitatWie oben erwähnt, dupliziert die Abfrage alle Datensätze, wenn man nicht explizit sagt, dass sie nur den aktuell angezeigten Datensatz duplizieren soll
Das ist einigermaßen logisch konsequent - oder? ;-)

Die Abfrage sollte also folgendermaßen aussehen:
INSERT INTO tblSpiele ( KategorieID_F, HaendlerID_F, SerieVerlagID_F, VarianteID_F, RSMotiveID_F, SchachtelID_F, KartenFormatID_F, SpielNr, SpTitel, Ausgabejahr, Preis, Porto, Kaufdatum, Zustand, Komplett, Bestand, Katalog, Info, Kartenzahl, LetzteAenderung )
SELECT tblSpiele.KategorieID_F, tblSpiele.HaendlerID_F, tblSpiele.SerieVerlagID_F, tblSpiele.VarianteID_F, tblSpiele.RSMotiveID_F, tblSpiele.SchachtelID_F, tblSpiele.KartenFormatID_F, tblSpiele.SpielNr, tblSpiele.SpTitel, tblSpiele.Ausgabejahr, tblSpiele.Preis, tblSpiele.Porto, tblSpiele.Kaufdatum, tblSpiele.Zustand, tblSpiele.Komplett, tblSpiele.Bestand, tblSpiele.Katalog, tblSpiele.Info, tblSpiele.Kartenzahl, tblSpiele.LetzteAenderung
FROM tblSpiele
WHERE tblSpiele.SpielID = Forms!frmErfassung!spielID;


Und die Ereignisprozedur zum Klick-Ereignis eines Duplizier-Buttons könnte folgendermaßen aussehen:
Private Sub btnCopy_Click()
    DoCmd.OpenQuery "qryDSDuplizieren"
End Sub
Freundliche Grüße
MaggieMay

derilzemer

Hi Maggie,
das geht soweit. Ich musste jetzt noch 2 Sachen hinzufügen, da es nach dem hinzufügen im Formular nicht ersichtlich war, ob er es auch gemacht hat, auch wenn keine Fehlermeldung kam.
Private Sub cmdDuplizieren_Click()
    DoCmd.OpenQuery "qryDSDuplizieren"
    [b]Me.lstSpielAuswahl.Requery
    Forms!frmErfassung.Requery[/b]
End Sub

Nach den zusätzlichen Requerys klappt das jetzt auch.
Wenn ich nun aber gleich zu dem neuen Datensatz springen will, wie macht man das? Wenn, dann kann/muss man das ja auch in die Aktion Private Sub cmdDuplizieren_Click() einfügen, oder?
Gruß Andreas
Grüße und Dank im voraus
Andreas

MaggieMay

Hallo Andreas,

probiere es mal mit diesem Befehl am Ende der Prozedur:
DoCmd.RunCommand acCmdRecordsGotoLast
Freundliche Grüße
MaggieMay

derilzemer

Hi,
that works, was dir ja klar war ;). Ich habe den Code nach bestem Wissen und Gewissen aus anderen Codesequenzen erweitert, wenn der Duplizieren Vorgang abgebrochen wird. Ich denke mal dass es passt. Wenn man das anders macht, dann sag mir vielleicht kurz wie, ansonsten ist der Thread für für mich gelöst.

Private Sub cmdDSDuplizieren_Click()
On Error GoTo Err_cmdDSDuplizieren_Click

    DoCmd.OpenQuery "qryDSDuplizieren"
    Me.lstSpielAuswahl.Requery
    Forms!frmErfassung.Requery
    DoCmd.RunCommand acCmdRecordsGoToLast

Exit_cmdDSDuplizieren_Click:
    Exit Sub

Err_cmdDSDuplizieren_Click:
    MsgBox Err.Description
    Resume Exit_cmdDSDuplizieren_Click

End Sub


Gruß Andreas
Grüße und Dank im voraus
Andreas