2Datensätze vergleichen, Dopplungen löschen

Hallo liebe wer-weiß-was-Gemeinde,

ich mal wieder.
Ich habe eine Tabelle in der Dopplungen vorkommen, aber nur unterbestimmten Kriterien. Denn die Datensätze haben eine Nummer, eine Phase und einen Zeitstempel. Nun kann es passieren, das in der Tabelle. Mehrfach die gleiche Nummer mit der gleichen Phase und zwei unterschiedlichen Zeitstempeln gefunden werden. Wenn dem so der Fall ist, soll er den Datensatz mit dem früheren Zeitstempel löschen und den anderen in der Tabelle behalten.

Mit dem unten angegebenen Quellcode, macht er irgendwie nur mist. Entweder er nimmt nicht die richtigen Daten oder er sagt mir das der Datensatz den ich versuche zu vergleichen schon gelöscht ist.

Ich hoffe mir kann jemand helfen. Wenn Ihr mehr Informationen braucht dann sagt Bescheid. :smile:

Call Verbinden

DatenMail.MoveLast
Anzahl = DatenMail.RecordCount
DatenMail.MoveFirst

Anzahl1 = Anzahl - 1

For i = 1 To Anzahl1

For x = 1 To Anzahl1

a = DatenMail!No
c = DatenMail!Phase
e = DatenMail!ID
DatenMail.MoveNext
b = DatenMail!No
d = DatenMail!Phase

If a = b Then
If c = d Then
Zaehler = 1
End If
End If

Next x

If Zaehler = 1 Then
Call UmleitenFehler(e)
Call Löschen(e)
End If

Zaehler = 0
x = 0
DatenMail.MoveFirst
Next i

End Sub

Sub UmleitenFehler(e)

DoCmd.SetWarnings False
strsql = „Insert Into Fehler_Dopplungen (ID, No, Phase, Zeitstempel)“
strsql = strsql & " Select NumPhase_sortiert.ID, NumPhase_sortiert.VNo, NumPhase_sortiert.Phase, NumPhase_sortiert.Zeitstempel"
strsql = strsql & " From NumPhase_sortiert"
strsql = strsql & " Where (((NumPhase_sortiert.ID)= " & e & „));“

DoCmd.RunSQL (strsql)

strsql = „Update NumPhase_sortiert.*;“
DoCmd.RunSQL (strsql)

Hallo, Shiny!

Ganz kurze Frage: Unten schreibst Du was vom Sichern/Protokollieren. Soll/muss das so sein?

Generell fasse ich noch mal zusammen, was Du willst: Du hast eine Tabelle mit Nummer, Phase und Zeitstempel, z. B. so:

Nr Phase Zeit
 1 2 10:00:00
 1 2 10:10:10
 1 3 10:00:00

Dann soll der erste Datensatz gelöscht werden.

Ich würde mir dann vielleicht eine Hilfsabfrage bauen, in der Du die betroffenen Datensätze (gleiche Nummer, gleiche Phase, mehrfache Zeitstempel) heraussuchst (SELECT Nummer, Phase, Count(Zeitstempel)… mit Count>1).

Mit SELECT Nummer, Phase, Max(Zeitstempel) und (Nummer, Phase) in obiger Abfrage bekommst Du die gültigen Datensätze. Die zu löschenden sind dann (Nummer, Phase, Zeitstempel) aus der Gesamttabelle mit (Nummer, Phase) in der Abfrage der gültigen Datensätze und ungleichem Zeitstempel.

Klingt ein wenig kompliziert, sollte aber machbar (und sowieso performance-optimierbar) sein. Falls Du nicht klarkommst, melde Dich noch mal.

Gruß, Manfred

Hallo, Shiny!

So, Rechner rechnet gerade, hab kurz Zeit. Ich habe mal Deine Tabelle „Tabelle1“ genannt mit den Feldern Nr, Phase, Zeit. Weitere Felder gerne nach Bedarf, aber für folgendes nicht nötig.

Dann erzeugst Du folgende Abfrage „qryDupes“:

SELECT Tabelle1.Nr, Tabelle1.Phase, Max(Tabelle1.Zeit) AS MaxvonZeit, Count(Tabelle1.Zeit) AS AnzahlvonZeit
FROM Tabelle1
GROUP BY Tabelle1.Nr, Tabelle1.Phase
HAVING (((Count(Tabelle1.Zeit))\>1))

Diese beinhaltet alle Datensätze nach dem Tupel (Nr, Zeit) (, d. h. die Kombination Nr und Zeit ist eindeutig) mit dem Maximum von Zeit (also dem spätesten Zeitstempel) und wenigstens zwei verschiedenen Zeitstempeln.

Die Abfrage „qryValid“ sieht wie folgt aus:

SELECT Tabelle1.Nr, Tabelle1.Phase, Tabelle1.Zeit
FROM Tabelle1 LEFT JOIN qryDupes ON (Tabelle1.Nr=qryDupes.Nr) AND (Tabelle1.Phase=qryDupes.Phase)
WHERE (((qryDupes.Nr) Is Null) And ((qryDupes.Phase) Is Null)) Or (((Tabelle1.Zeit)=qryDupes!MaxvonZeit))

Diese beinhaltet alle gültigen Datensätze; ergänze die SELECT-Klausel, falls Du weitere Felder hast. Der Name dieser Abfrage wäre übrigens egal. „qryDupes“ wurde hier benötigt, diese sollte also so heißen.

Die Abfrage „qryInvalid“ sieht dann wie folgt aus:

SELECT Tabelle1.Nr, Tabelle1.Phase, Tabelle1.Zeit
FROM Tabelle1 INNER JOIN qryDupes ON (Tabelle1.Phase = qryDupes.Phase) AND (Tabelle1.Nr = qryDupes.Nr)
WHERE (((Tabelle1.Zeit)[qryDupes]![MaxvonZeit]))

Sie beinhaltet alle zu löschenden Datensätze.

Hoffe, das hilft Dir weiter.

Gruß, Manfred

Hallo lieber Manfred,

erstmal herzlichen Dank für Deine Hilfsbereitschaft, das was Du mir da geschickt hast funktioniert auch einwandfrei. Vielen Vielen Dank, aber ich habe noch ein Problem.

Zusätzlich zu Deinen drei Abfragen habe ich versucht noch zwei hinzuzufügen. Und zwar mache ich eine Fehlerauswertung, das heißt wenn Phasen zweifach gemeldet sind ist das ja einmal ein Fehler. Deshalb habe ich die Abfrage „qryInvalid“ noch als Anfüge Abfrage für die Tabelle „FehlerDopplungen“ umgeschrieben.
Das funktioniert auch einwandfrei. Nun will ich aber die doppelten Datensätze auch aus der Haupttabelle gelöscht wissen. Da dachte ich mir ich könnte auch diesmal mit Hilfe der Abfrage „qryInvalid“ eine Löschabfrage machen. Doch das funktioniert mal wieder nicht. :frowning: Hätte ja so schön sein können.
Ich bekomme immer den Fehler, „Geben Sie die Tabelle an die zu löschen ist“ oder so ähnlich. Nach ganz viel rumbiegen kommt nun die Fehlermeldung „Aus diesen Tabellen kann nicht gelöscht werden“

Was muss ich tun?

Danke im voraus

Musste den Inner Join auflösen in eine geschachtelte Delete-Anweisung. Jetzt funzt.

Vielen Dank noch mal.

Liebe Grüße shiny