Neuigkeiten:

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

Mobiles Hauptmenü

mit VBA Datensatz von einer Tabelle in eine andere Tabelle verschieben

Begonnen von Dreamer19, Februar 20, 2024, 17:40:33

⏪ vorheriges - nächstes ⏩

Dreamer19

Hallo, ich habe ein Problem mit meiner VBA und finde den Fehler nicht  :'(

Ich hab eine Tabelle "Planungsdaten" mit den Spalten:
1-Nr
2-Projekt
3-Beschreibung
4-Notiz
5-Datum Start
6-Datum Ende
7-Prio
8-Status
usw...

genau die gleichen Spalten hab ich in der Tabelle "Archiv"
Wenn ich nun in meinem Formular auf die Schaltfläche klicke "Befehl22",
dann soll die VBA überprüfen in der Tabelle Planungsdaten in welchen Zeilen alles in der Spalte "Status"
ein "beendet" drin steht.
Diese Zeilen soll der Code dann kopieren und in der Tabelle "Archiv" hinzufügen, danach soll er die Datensätze in der Tabelle "Planungsdaten" löschen.

Die Zelle in der Spalte Status sind mit einem Nachlage-Assistent eingerichtet
es kann über ein Kombinationsfeld 4 Aktionen ausgewählt werden:
(Der Felddatentyp ist "Kurzer Text")
1-nicht begonnen
2-in Vorplanung
3-läuft
4-beendet

meine VBA sieht folgendermaßen aus:

Private Sub Befehl22_Click()
    Dim db As Database
    Dim rsSource As Recordset
    Dim rsArchive As Recordset
    Dim strSQL As String

    ' Datenbank öffnen
    Set db = CurrentDb

    ' SQL-Abfrage für die zu archivierenden Datensätze
    strSQL = "SELECT * FROM Planungsdaten WHERE [Status] = 'beendet';"

    ' Datensätze aus Planungsdaten auswählen
    Set rsSource = db.OpenRecordset(strSQL)

    ' Überprüfen, ob Datensätze gefunden wurden
    If Not rsSource.EOF Then
        ' Archiv-Recordset öffnen
        Set rsArchive = db.OpenRecordset("Archiv", dbOpenDynaset)

        ' Durch die gefundenen Datensätze iterieren und ins Archiv kopieren
        Do Until rsSource.EOF
            rsArchive.AddNew
            For i = 0 To rsSource.Fields.Count - 1
                rsArchive.Fields(i).Value = rsSource.Fields(i).Value
            Next i
            rsArchive.Update
            rsSource.MoveNext
        Loop

        ' Recordsets schließen
        rsArchive.Close
        rsSource.Close

        ' Datensätze in Planungsdaten löschen
        db.Execute "DELETE FROM Planungsdaten WHERE [Status] = 'beendet';"

        MsgBox "Datensätze wurden ins Archiv verschoben.", vbInformation
    Else
        MsgBox "Keine Datensätze mit 'beendet' gefunden.", vbInformation
    End If

    ' Datenbank schließen
    Set db = Nothing
End Sub

Vielleicht kann mir jemand helfen oder hat einen anderen rat für mich.

Grüße
Mario

markusxy

Gibts eine Fehlermeldung?

Weshalb Schleifen über Recordsets und keine Anfügeabfrage?

Der Primärschlüssel wird wie ich sehe auch kopiert - ist das Feld im Archiv ohne AutoID?

Warum verwendest du keine Transaktion?

MzKlMu

Hallo,
wozu muss man Datensätze in ein Archiv verschieben?
Wenn es Beziehungen gibt, könnte das auch zu Problemen führen.
Da Du auch in die gleiche DB kopierst, gewinnst Du noch nicht mal Platz.

Datensätze mit dem Status "Beendet" können einfach ausgeblendet werden. Dann sind diese Datensätze in der normalen Ansicht auch nicht mehr zusehen.

PS :
Nachschlagefelder sind nur in Formularen sinnvoll und haben in Tabellen nichts zu suchen. Für den Status sollte auch eine Tabelle angelegt werden.
Gruß Klaus

Dreamer19

@ Markusxy
Ja es gibt eine Fehlermeldung:
Laufzeitfehler 3464 = Datentypenkonflikt in Kriterienausdruck.

Die Verwendung von Schleifen über Recordsets anstelle einer Anfügeabfrage ermöglicht flexiblere Auswahlkriterien, zeilenweise Datenbearbeitung vor dem Archivieren, Benutzerinteraktion und -rückmeldung sowie eine präzisere Transaktionskontrolle.

Genau der Primärschlüssel wird hier mitkopiert, kann das Problem daran liegen ?

Mit Transaktionen kenn ich mich noch nicht aus.


@MzKlMu

ich habe in meiner Planungsdatentabelle über 400 Zeilen mit Daten, zur Übersicht möchte ich die beendeten Projekte am besten aus der Tabelle raus haben. Sollte ich aber später nach einem alten Projekt suchen, wäre es Hilfreich wenn ich die Datei noch habe, darum möchte ich mir ein Archiv anlegen.
Ich habe auch noch weitere Tabellen die ich damit verbinden möchte. Aber erstmal möchte ich die eine Tabelle zum laufen bekommen bevor ich mich auf alle Tabellen stürze.

Für den Status habe ich eine Tabelle angelegt.


MzKlMu

Hallo,
Das Vorhaben ist ersatzlos überflüssig und bringt Dir nicht den geringsten Vorteil. Wenn Du die Datensätze mit dem Status "Beendet" ausfilterst hast genau die von Dir gewünschte Übersicht. Und die mit dem Status "Beendet" kannst Du direkt alleine anzeigen, in dem die DS mit dem Status <4 ausgefiltert werden.
Sobald Beziehungen angelegt sind, wird bei eingestellter referentieller Integrität (wie es sein sollte) Dein Vorhaben ohnehin nicht möglich sein.

Dringender Rat, lasse es sein, Du kriegst nur Probleme.

Wenn du eine Tabelle für den Status angelegt hast, sollt die Tabelle 2 Spalten haben, einen Primärschlüssel (Zahl) und ein Feld für den Klartext. Als Status wird aber die Zahl gespeichert.

Und ein weiterer dringender Rat, wirf die Nachschlagefelder in den Tabellen raus.
Gruß Klaus