PDA

Vollständige Version anzeigen : Duplikate zusammenführen


cabotine
19.06.2012, 10:53
Hallo, ich hab eine Frage zu den Duplikaten.
Ich habe eine Duplikatsabfrage erstellt und würde jetzt aber gerne noch angezeigt haben in welchen abhängigen Tabellen Daten zu einem Fall enthalten sind.

Code:
SELECT tblSchueler.Nachname, tblSchueler.Vorname, tblSchueler.Geburtsdatum, tblSchueler.Schueler_ID
FROM tblSchueler
WHERE (((tblSchueler.Nachname) In (SELECT [Nachname] FROM [tblSchueler] As Tmp GROUP BY [Nachname],[Vorname] HAVING Count(*)>1 And [Vorname] = [tblSchueler].[Vorname])))
ORDER BY tblSchueler.Nachname, tblSchueler.Vorname;

Also z.B.
ein Feld wo die Anzahl der Datensätze mit Schueler_ID in der tblFoerdbedarf angezeigt wird und
ein Feld wo die Anzahl der Datensätze mit der Schueler_ID in der tblRueckstellung angezeigt wird.

Ziel ist überblicken zu können welche Daten zu einem Datensatz vorhanden sind bevor ich sie zusammenführe oder lösche.

Und noch eine zweite Frage, wie kann ich die IDs anzeigen von den Duplikaten?
Also ein Feld in dem alle IDs angezeigt werden, die ein Duplikat darstellen. Ich würde dann darüber die Prozedur starten, die ein Update auf die andere ID ausführt.

Vielen Dank
Frank J.

Atrus2711
19.06.2012, 11:09
Hi,

zur Frage: die Anzahl der Sätze je SchülerID in verschiedenen Detailtabellen könntest du mit einem Subselect herausfinden.

Schema:
SELECT *,
(SELECT Count(*) FROM Untertabelle U WHERE U.Nachname = S.Nachname AND U.Vorname = S.Vorname) AS AnzahlSätzeInUntertabelle
FROM tblSchueler S

Allerdings ist mir der Sinn des ganzen nicht klar. Geht es um eine Zusammenführung/Normalisierung einer nichtrelationalen Datenhaltung?

Und: dir ist klar, dass Vorname und Nachname nicht eindeutig sind?

cabotine
19.06.2012, 11:31
Hi Atrus,
Ich versuch es nochmal genauer zu beschreiben.
Ich habe mehrere Tabellen die über ein Feld Schueler_ID verknüpft sind.
Da in diese Tabellen von mehreren Leuten jeweils Daten eingegeben werden, kann es vorkommen, dass Daten zu einem Fall unter verschiedenen Schueler_IDs geführt werden.

Ich habe jetzt eine Duplikatssuche durchgeführt (Vorname, Nachname) und werde noch weitere einrichten (Nachname,Geburtsdatum und Vorname, Geburtsdatum) um Tippfehler oder unterschiedliche Namensschreibweisen identifizieren zu können.

Diese Duplikate sollen dann zusammengeführt werden in dem ich per Update die ID von dem zweiten durch die vom ersten ersetze. Die anderen Tabellen sollten ja dann automatisch mitgeändert werden, wenn ich das mit der referentiellen Integrität richtig verstanden habe.

Was ich jetzt machen will ist, zum einen ein Formular in dem nicht nur die Duplikate angezeigt werden sondern auch jeweils in welchen Tabellen Datensätze zu dem Fall enthalten sind.

Ich hab mal ein Bild angehängt wie ich es mir so vorstelle.
Vielen Dank für Deine Hilfe und viele Grüße
Frank J.

P.s.: Das mit der Nichteindeutigkeit ist klar, daher soll auch nicht alles einfach zusammengematscht werden sondern von Hand Duplikate zusammengefügt werden.

Atrus2711
19.06.2012, 11:39
Da in diese Tabellen von mehreren Leuten jeweils Daten eingegeben werden, kann es vorkommen, dass Daten zu einem Fall unter verschiedenen Schueler_IDs geführt werden.
Das stinkt doch schon... ein Schüler darf nur eine ID haben.

Diese Duplikate sollen dann zusammengeführt werden in dem ich per Update die ID von dem zweiten durch die vom ersten ersetze. Die anderen Tabellen sollten ja dann automatisch mitgeändert werden, wenn ich das mit der referentiellen Integrität richtig verstanden habe.
Wer sagt, dass es nur zwei "Duplikate" sind? Der Schüler kann doch auch unter 3 oder 10 IDs laufen?

Ich würde da eher eine zentrale Schülertabelle schaffen, deren ID gilt. Diese IF trägst du der Reihe nach und einmalig in alle Untertabellen ein, am einfachsten mit Hilfe von AKtualisierungsabfragen.

cabotine
19.06.2012, 11:46
Hallo,
es gibt eine zentrale Schülertabelle, deren ID gilt.
Die doppelten entstehen durch zwei Wege, zum einen den Import der bestehenden vier Listen (wo es noch überhaupt keine IDs gibt) und zum anderen
weil die Kollegin X den Schüler einträgt (ID1) und die Kollegin Y den Schüler nochmal einträgt weil sie die Krakelhandschrift der Schulsekretärin nicht lesen kann und denkt das Kind heisst Möller und nicht Müller. Ich habe schon eine Warnmeldung für mögliche Duplikate eingebaut, aber mit all den Möglichkeiten können doch immer mal wieder welche entstehen und die würde ich dann gerne zusammenführen können und nicht einfach nur löschen. Da die Kolleginnen unterschiedliche Bereiche bearbeiten sollte eine Zusammenführung auch keine Probleme bereiten.

Das der Schüler auch unter mehr als 2 IDs laufen kann stimmt, daher würde ich gerne die ID zum zusammenführen auswählen können.

Vielen Dank und viele Grüße
Frank J.

cabotine
19.06.2012, 11:52
Hier noch die Datenbankstruktur. Das sind die Tabellen, die mit den Schülern verlinkt sind. Es gibt noch ein paar andere aber die haben nicht direkt mit der tblSchueler zu tun.

Atrus2711
19.06.2012, 12:01
Und wie wird der Name dann richtig erkannt? "Das ist Hans Möller, nur dass er nicht Hans heißt, sondern Frank, und nicht Möller, sondern Müller... ?!"

cabotine
19.06.2012, 12:09
Naja es gibt die drei Duplikatsabfragen wie beschrieben:
Name und Vorname gleich aber Geburtsdatum vertippt
Name und Geburtsdatum gleich aber Vorname vertippt
Vorname und Geburtsdatum gleich aber Nachname vertippt

Diese drei werden jeweils in der Tabelle angezeigt
und dann kann man auswählen ob es sich tatsächlich um Duplikate handelt, die zusammengeführt werden sollen oder nicht.
Hans Müller 28.11.79
Hanns Müller 28.11.79
kann man wohl nur per Augenschein machen oder?

Und ich sehe keinen anderen Weg es zu verhindern.

Daher ist meine Frage, wie ich die IDs in tblSchueler finden kann, die den gleichen Vornamen, Nachnamen haben wie der aktuelle Datensatz.
Und wie ich rauskriege welche Tabellen Angaben zum Schüler mit der aktuellen Schueler_ID enthalten.

Vielen Dank für Deine Geduld und viele Grüße
Frank J.

Atrus2711
19.06.2012, 12:24
Und wer bei allen drei Feldern danebengreift?
Hans Müller 28.11.1979 -> Hanns Möller 28.12.1979 -> gleich oder nicht?

Und ich sehe keinen anderen Weg es zu verhindern.
Du verhinderst es ja nicht, du reparierst es. Verhindern wäre, die Mehrfacherfassung in irgendwelchen Excelsheets zu unterlassen und zu einer zentralen Erfassung zu wechseln...

Die Anlage eines Schülers - auch in dezentralen Listen - kann doch im übrigen auch nicth so einfach zulässig sein. "Möller, Ralf - kenn ich nicht, muss ein neuer sein" -> vielleicht ist es Müller, Rolf? Fragt sich das nicht schon der Erfasser?

Wer kann überhaupt einen Schüler als neu kategorisieren und anlegen, wenn er keine Schülergesamtliste zur Hand hat? Ich würde das als Eigenmacht verbieten.

cabotine
19.06.2012, 12:37
Hallo,
also die momentanen Excellisten werden abgeschafft. Diese werden also nur einmal importiert, aber auch für die müssen ja die Duplikate erstmal gefunden werden.

Die Anlage eines neuen Schülers erfolgt nachdem man in der Liste der bisher im System erfassten Kinder nachgesehen hat, weil man einen Antrag für das Kind auf dem Tisch hat. Antrag für Schüler X, Schüler X ist nicht im System, dann neuer Eintrag für Schüler X, 2 Wochen Später entdeckt die Kollegin oder der war doch schon im System nur mit nem Tippfehler.

Eine offizielle Gesamtliste gibt es nicht und wird es auch nicht geben, da es durch Zu- und Wegzüge immer neue Kinder dazukommen und auch für die Datenbank nicht alle Kinder benötigt werden sondern nur die die besondere Hilfen erhalten.

Viele Grüße
Frank J.

Atrus2711
19.06.2012, 12:51
2 Wochen Später entdeckt die Kollegin oder der war doch schon im System nur mit nem Tippfehler.
Naja, aber wie heißt er denn dann richtig? Ist der frühere Eintrag der Tippfehler, oder der spätere?

Nebenbei: in diesen Augenblick sind dann doch beide IDs bekannt! Da würde ich doch dann den Erfasser deklarieren lassen: "die 14 und die 38 sind gleichbedeutend; es gilt die 38". -> alle 14er-IDs in allen Tabellen werden durch die 38 ersetzt (Aktualisierungsabfrage).

Im Nachhinein wird es ziemlich mühsam werden, die "Kreativität" der Tippfehler auszugleichen. Es ist vielleicht auch etwas voreilig, die Neuanlage eines Schülers so einfach zu ermöglichen. Eine "Zwangssuche" mit Fehlertoleranz würde da vielleicht einige Duplikate verhindern.

Eine offizielle Gesamtliste gibt es nicht und wird es auch nicht geben, da es durch Zu- und Wegzüge immer neue Kinder dazukommen und auch für die Datenbank nicht alle Kinder benötigt werden sondern nur die die besondere Hilfen erhalten.
Gut, dann halt nur eine Gesamtliste der Schüler mit Hilfsbedarf :)

Und schließlich:
den Schüler nochmal einträgt weil sie die Krakelhandschrift der Schulsekretärin nicht lesen kann
wie wärs mit Blockbuchstaben/Kästchen auf dem Papier?

cabotine
19.06.2012, 13:14
Hallo Atrus,
Nebenbei: in diesen Augenblick sind dann doch beide IDs bekannt! Da würde ich doch dann den Erfasser deklarieren lassen: "die 14 und die 38 sind gleichbedeutend; es gilt die 38". -> alle 14er-IDs in allen Tabellen werden durch die 38 ersetzt (Aktualisierungsabfrage).

Ja genau dafür möchte ich ja gerne in der Duplikatssuche die Ids angezeigt bekommen. Damit ich dann über ein Auswahlfeld auswählen kann welche ID mit dem aktuellen Datensatz zusammengeführt wird. (falls mehr als ein Duplikat vorhanden ist). Dann soll ein Knopfdruck eine Prozedur auslösen, die per Update alle 14er zu 38er macht.

Kannst Du mir sagen, wie ich ein solches Auswahlfeld hinbekommen könnte, was mir die IDs der anderen Duplikate zur Auswahl anbietet?

Wie das Kind richtig heisst muss man dann über eine Nachfrage bei der Schule klären.

Bei der Neuanlage weist das Formular schon auf ein paar mögliche Duplikate hin. Das kann man sicher noch ausbauen.

Vielen Dank und viele Grüße
Frank J.

Atrus2711
19.06.2012, 13:41
Mit den IDs ist es ja nicht getan. Es müssten die kompletten Schülerinfos dieser ID gezeigt werden. Die ID sagt zu wenig aus, um festzustellen, welche die richtige ist.

Grobplan:

Import
Feststellen der möglichen Doppelgänger-IDs (anhand der Gleichheit von Nachname, Nachname und Vorname, Nachname und Geburtsdatum etc)
Anzeigen der Infos zu den Doppelgänger-IDs
bei Erkennung eines Doppelgängers: Anstoßen einer UPDATE-Abfrage, die die Werte in den betroffenen Tabellen ändert. Die Anzahl und Namen der Tabellen sind ja bekannt, also würde ich immer alle durchackern lassen, und wenn es mal in einer Tabelle keine Treffer gibt, schadet das ja auch nicht.

cabotine
19.06.2012, 13:53
Hallo,
zu sehen was für Informationen ein Datensatz noch enthält wollte ich ja die Zahl der Einträge zur ID in den anderen Zellen anzeigen lassen.
Das hab ich jetzt so gelöst:
SELECT tblSchueler.Nachname, tblSchueler.Vorname, tblSchueler.Schueler_ID, tblSchueler.Geburtsdatum, (SELECT Count(*) FROM tblFoerderbedarf WHERE tblFoerderbedarf.Schueler_ID = tblSchueler.Schueler_ID) AS DatenFoerderbedarf,
(SELECT Count(*) FROM tblErziehungsberechtigte WHERE tblErziehungsberechtigte.Schueler_ID = tblSchueler.Schueler_ID) AS DatenErziehungsberechtigte,
(SELECT Count(*) FROM tblRueckstellung WHERE tblRueckstellung.Schueler_ID = tblSchueler.Schueler_ID) AS DatenRueckstellung,
(SELECT Count(*) FROM tblSchulhelfer WHERE tblSchulhelfer.Schueler_ID = tblSchueler.Schueler_ID) AS DatenSchulhelfer,
(SELECT Count(*) FROM tblErgaenzB WHERE tblErgaenzB.Schueler_ID = tblSchueler.Schueler_ID) AS DatenErgaenzB,
(SELECT Count(*) FROM tblPosteingang WHERE tblPosteingang.Schueler_ID = tblSchueler.Schueler_ID) AS DatenPost
FROM tblSchueler
WHERE (((tblSchueler.Nachname) In (SELECT [Nachname] FROM [tblSchueler] As Tmp GROUP BY [Nachname],[Vorname] HAVING Count(*)>1 And [Vorname] = [tblSchueler].[Vorname])))
ORDER BY tblSchueler.Nachname, tblSchueler.Vorname;

Und außerdem kann man auch noch die Angaben anzeigen wer den Datensatz angelegt und als letztes bearbeitet hat, die stehen in der Tabelle tblSchueler.

Kannst Du mir nen Tipp geben wie ich jetzt noch die IDs auslesen kann, die denselben Vornamen, Nachnamen haben wie der aktuelle Datensatz?

Da die Übersicht die IDs ja mitanzeigt kann man sich dann für das Zusammenführen ja daran orientieren.

Vielen Dank und viele Grüße
Frank J.

Atrus2711
19.06.2012, 14:31
Kannst Du mir nen Tipp geben wie ich jetzt noch die IDs auslesen kann, die denselben Vornamen, Nachnamen haben wie der aktuelle Datensatz?
in einem Formular könnte das z.B. ein Ufo übernehmen, das sich synct anhand der Felder Vorname und Nachname (= Eintrag in die Eigenschaften VerknüpfenVon und VerknüpfenNach).

cabotine
19.06.2012, 16:14
Hi Atrus,
das hab ich noch nicht verstanden als Formular würde ich ein geteiltes Formular nehmen?
Wie muss das Ufo dann aufgebaut sein?
Vielen Dank!
Frank J.

cabotine
19.06.2012, 17:04
Hallo Atrus,
ich hab mal rumprobiert aber es nicht hinbekommen.
Ich habe in meinem ufo ein Kombinationfeld mit der Datensatzquelle SELECT [Duplikate suchen für tblSchueler neu].Schueler_ID FROM [Duplikate suchen für tblSchueler neu]; da werden dann aber alle 4 IDs der doppelten Einträge

und ich habe ein Textfeld wo nur die ID drin steht, wo ich dann aber nur über die Datensatznavigation zur nächsten ID wechseln kann.

Kurz ich stelle mich zu dusslig an das Kombinationsfeld mit dem richtigen Inhalt zu erzeugen.

Achso und dann wäre es toll wenn die aktuelle ID gar nicht mit angezeigt wird.

Thomas Möller
19.06.2012, 17:23
Hallo,

Ich habe in meinem ufo ein Kombinationfeld mit der Datensatzquelle SELECT [Duplikate suchen für tblSchueler neu].Schueler_ID FROM [Duplikate suchen für tblSchueler neu]; da werden dann aber alle 4 IDs der doppelten Einträge

schau Dir mal bitte dieses Add-In und die dadurch erzeugten SQL-Strings näher an:
http://abiss.dasat.com/dasat/index.php?cid=100128&conid=0&sid=ae70f2ad9e7ce3eb0425117c776c4300

HTH

Atrus2711
20.06.2012, 07:53
Ein geteiltes Formular hat mit Ufos nichts zu tun, sondern zeigt nur eine "Vorschau" auf alle Sätze an, die im (Einzel-)Formular dann einzeln gezeigt werden. Das geteilte Formular ist ein Formular, während ein Haupt-/Ufo-Konstrukt zwei Formulare beinhaltet.

Der Gedanke ist der:

du hast ein Formular, das die Schüler zeigt. Das ist das Hauptform.
du hast ein zweites Formular, das die "möglichen Duplikate" zeigt, d.h. die Sätze, die möglicherweise gleichbedeutend sind mit dem aktuellen Satz des Hauptforms. Das wird das Ufo. Du kannst es erstmal als völlig normales Formular aufbauen und die Felder da anzeigen, die du haben willst.
Damit das Ufo die Duplikate des aktuellen Hauptform-Satzes zeigt, muss es sich mit dem Hauptform "abstimmen" (synchronisieren). Zu dem momentan im Hauptform sichtbaren Satz gehören die Ufo-Sätze, die in Nachname und Vorname den Hauptform-Werten entsprechen. Füge also das Ufo in das Hauptform ein (ohne Assistent!), und trage die Felder Nachname;Vorname in die Eigenschaften VerknüpfenVon und VerknüpfenNach ein. Dann sollte das funktionieren.

cabotine
20.06.2012, 11:07
Hallo Atrus,
jetzt hab ich den Ansatz verstanden.

Dabei hab ich zwei Probleme. Zum einen schaffe ich es nicht in dem Ufo ein Kombinationsfeld einzufügen, dass die IDs zur Auswahl stellt. Ich habe immer nur einen Datensatz der mir angezeigt wird.
Siehe Bild
Und zum anderen würde ich gerne den Datensatz filtern, der im Hauptformular ausgewählt ist.

Vielen Dank und viele Grüße
Frank J.

Atrus2711
20.06.2012, 11:09
Im Bild sehe ich weder ein Kombi, noch ist das ein Ufo... wenn du das gebaut haben willst, lad mal hoch.

cabotine
20.06.2012, 13:24
Hallo,
ich hab es schon fast so hinbekommen wie ich es wollte

In einer Liste (Formular Mehrere Elemente) mit den Duplikaten ein Kombifeld anzeigen wo die IDs der anderen Duplikate drinstehen.

Leider funktioniert es bloß für den ersten Datensatz und nicht für die folgenden.
Vermutlich ist das Kombifeld nicht mit dem Datensatz verbunden, aber ich weiß leider nicht wie ich das hinkriege.

SELECT qryDuplikate.Schueler_ID
FROM qryDuplikate
WHERE (((qryDuplikate.Schueler_ID)<>[Forms]![frmDuplikate]![Schueler_ID]) AND ((qryDuplikate.Vorname)=[Forms]![frmDuplikate]![Vorname]) AND ((qryDuplikate.Nachname)=[Forms]![frmDuplikate]![Nachname]));


Ich habe das ganze mal unter http://www.lehrevaluation.net/Database10.zip hochgeladen, da sie 10kb zu groß ist für ein Attachment hier.

Vielen Dank und viele Grüße
Frank J.

Atrus2711
20.06.2012, 13:49
Hab hier im Büro kein 2010, ich guck vielleicht später mal drüber...

cabotine
21.06.2012, 09:18
Das wäre toll, ich hab probiert es zu 2003 zu exportieren, aber dabei treten leider Fehler auf.
Vielen Dank und viele Grüße
Frank J.

cabotine
01.07.2012, 10:40
Hallo,
hättest Du vielleicht nochmal Gelegenheit zu gucken?
Wäre echt toll.
Vielen Dank und viele Grüße
Frank J.

Beaker s.a.
01.07.2012, 15:10
Hallo Frank,
Schau mal ob dies das ist was Du willst.
UFo in frmSchuelerdetails eingefügt; -
Herkunftsobjekt: frmDuplikate (solltest Du vielleicht noch umbenennen in ufrmDuplikate)
Verknüpft von: Vorname; Nachname
Verknüpft nach: Vorname; Nachname
Also alles so, wie von Martin angeregt.
hth
gruss ekkehard

cabotine
09.07.2012, 12:34
Hallo Martin,
vielen Dank. Ich habe es dann über ein aktualisieren der Abfrage gelöst, wenn man das Kombifeld auswählt.
Vielen Dank und viele Grüße
Frank J.