[Access 97] Doppelter Datensatz

Hallo!

Tabellen:
tblA 1 - m tblB m - 1 tblC

tblB speichert zwei numerische Werte, die die Primaerschluessel von tblA und tblC sind.

Problem:
tblB bekommt die zu speichernden Werte durch ein Formular zugewiesen. Das Problem ist jetzt, dass immer der zuletzt eingegebene Datensatz quasi doppelt vorhanden ist.

Beispiel (tblB):
4 | 15
4 | 20
54 | 1
1126 | 20
1126 | 20
1421 | 20

Jetzt bekommt die tblB vom Formular die Werte 198 und 15 zugewiesen und die Tabelle sieht folgendermassen aus:

4 | 15
4 | 20
54 | 1
198 | 15
198 | 20
1126 | 20
1421 | 20

Bei der naechsten Eingabe wuerde 198 | 20 wieder verschwinden und die erste Zahl durch den neuen Wert ersetzt sowie ein neuer Datensatz angelegt, usw.

Woher kommt dieses seltsame Verhalten und wie laesst sich das abstellen??? Ich bin mal wieder dankbar fuer jegliche Tips.

Tanja

Hallo Tanja,
Dein Problem konnte ich leider nicht ganz nachstellen, aber vielleicht habe ich einen anderen Lösungsansatz gefunden, den Du verwenden kannst.

Dein Ziel ist ja, in der tblB, die in den anderen beiden Tabellen gespeicherten Werte, einander zuzuordnen. Ich habe dazu ein Hauptformular mit drei Unterformularen erstellt.

Unterformular 1 enthält nur ein Feld; und zwar den Primärschlüssel aus tblA
Unterformular 2 enthält nur ein Feld; und zwar den Primärschlüssel aus tblC
Unterformular 3 enthält die zwei Felder der tblB (= Zuordnungen zwischen tblA und tblC)
Das Hauptformular enthält keine Felder, außer den drei Unterformularen.

Das Unterformular 3 (im Hauptformular) kannst Du nun für die Eingabe der Zahlenpaare verwenden. Enthält ein Zahlenpaar, das Du eingeben möchtest eine neue Zahl – also eine Zahl, die noch nicht in der tblA (tblC) enthalten ist, kommt eine Fehlermeldung und Du must zuerst in Unterformular 1 (oder 2) die neue Zahl anlegen.

Gruß
Lorraine

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Dein Problem konnte ich leider nicht ganz
nachstellen, aber vielleicht habe ich
einen anderen Lösungsansatz gefunden, den
Du verwenden kannst.

Danke, aber irgendwie hilft mir das nicht so richtig weiter. Vielleicht ist es besser, wenn ich das Problem noch einmal genauer erläutere. Also, in der DB werden in einem Hauptformular Daten einer bestimmten Firma angezeigt. Durch Drücken eines Buttons wird ein weiteres Formular geöffnet, das dem Benutzer nun ermöglicht dieser Firma bestimmte Aktivitäten (wie z. B. Mailings, Zertifizierung,…) zuzuordnen. Intern wird dann nur der Primärschlüssel der Firma und die ausgewählte AktivitätenID gespeichert. Dies funktionierte in meinen Tests auch einwandfrei.

Jetzt befindet sich auf dem Hauptformular noch ein Subformular, in dem die Daten verschiedener Mitarbeiter dieser Firma angezeigt werden. Nun soll es auch möglich sein, diesen Mitarbeitern bestimmte Aktivitäten zuzuordnen. Da es im Prinzip das gleiche ist wie bei der Firma, habe ich einfach die Formulare und Tabellen kopiert, der Code ist genau gleich, ich habe nur ein paar Namen entsprechend geändert. In der Tabelle kommen ja auch die richtigen Werte an, nur tritt nun leider dieses seltsame Speicherproblem mit den doppelten Datensätzen auf, das ich im ersten Posting beschrieben habe :frowning:((

Woran liegt das nun? Auf mich wirkt das ganze wie ein Access-Bug. Da das ganze mit der Firma bereits wunderbar funktioniert, sollte es doch mit den Mitarbeitern auch gehen.

Es wäre super, wenn jemand eine Idee hätte, dann wäre ich nämlich endlich mit der Weiterentwicklung dieser schrecklichen DB fertig und ich würde Euch auch nicht mehr so schnell mit weiteren doofen Access-Fragen nerven. :wink:

Tanja

Woran liegt das nun? Auf mich wirkt das
ganze wie ein Access-Bug. Da das ganze
mit der Firma bereits wunderbar
funktioniert, sollte es doch mit den
Mitarbeitern auch gehen.

Es wäre super, wenn jemand eine Idee
hätte, dann wäre ich nämlich endlich mit
der Weiterentwicklung dieser
schrecklichen DB fertig und ich würde
Euch auch nicht mehr so schnell mit
weiteren doofen Access-Fragen nerven. :wink:

Für mich sieht das so aus, als ob entweder etwas im Tabellendesign nicht stimmt (Beziehungen falsch definiert o.ä.) oder die Verknüpfungseigenschaften der Formulare falsch gesetzt sind. Es ist aber schwer, dazu aus der Entfernunng Genaueres zu sagen…

Reinhard

Hallo!

Für mich sieht das so aus, als ob
entweder etwas im Tabellendesign nicht
stimmt (Beziehungen falsch definiert
o.ä.) oder die Verknüpfungseigenschaften
der Formulare falsch gesetzt sind.

Danke fuer Deine Hilfe. Wenn ich dieses Problem geloest habe, werde ich Dich nicht mehr so schnell mit meinen seltsamen Access-Problemen nerven, versprochen :smile:

Die Vernkuepfungseigenschaften der Formulare habe ich ueberprueft, diejenigen fuer die Anzeige der Kontaktaktivitaeten entsprechen denen der Firmenaktivitaeten (nach Anpassung der SQL-Queries). Bei den Firmenaktivitaeten funktioniert alles wunderbar, bei Kontaktaktivitaeten kommt es zu diesem ominoesen doppelten Datensatz.

Die Beziehungsansicht sieht folgendermassen aus: http://www.fh-furtwangen.de/~schaett/db.gif
Ich habe tblContactActivity, tblCompanyActivity und tblActivity neu zu der bestehenden DB hinzugefuegt. Es handelt sich dabei immer um 1:m Beziehungen mit referentieller Integritaet und einer Verknuepfung vom Typ 1 („Include only rows where joined fields from both tables are equal.“). Kann es vielleicht daher kommen, dass Companies, EuroPa, tblContactActivity, tblCompanyActivity und tblActivity praktisch eine „Kreis-Verknuepfung“ bilden?

Tanja

Danke fuer Deine Hilfe. Wenn ich dieses :stuck_out_tongue:roblem geloest habe, werde ich Dich nicht :mehr so schnell mit meinen seltsamen :Access-Problemen nerven, versprochen :smile:

Kein Problem - wenn’s mich nervt, brauche ich ja nicht zu antworten. Ausserdem ist das Forum ja für solche Fragen gedacht…

Die Beziehungsansicht sieht
folgendermassen aus:
http://www.fh-furtwangen.de/~schaett/db.gif
Ich habe tblContactActivity,
tblCompanyActivity und tblActivity neu zu
der bestehenden DB hinzugefuegt. Es
handelt sich dabei immer um 1:m
Beziehungen mit referentieller
Integritaet und einer Verknuepfung vom
Typ 1 („Include only rows where joined
fields from both tables are equal.“).
Kann es vielleicht daher kommen, dass
Companies, EuroPa, tblContactActivity,
tblCompanyActivity und tblActivity
praktisch eine „Kreis-Verknuepfung“
bilden?

Die Beziehungen sehen schon OK aus (sie gehen ja auch nicht wirklich im Kreis - die 1-Seite ist ja mal rechts und mal links…). Allerdings mag es an der Datenquelle des Unterformulars liegen. Die besteht ja aus einem JOIN von EuroPa und tblContactActivity über ID, nehme ich mal an. Dabei wird dann immer ein neuer Datensatz für tblContactActivity angelegt, wenn einer für EuroPa angelegt wird. Es kann auch daran liegen, dass du die falsche Seite der Verknüpfung in die Abfrage aufgenommen hast. Du könntest auch versuchen, die Abfrage als Outer Join aufzubauen…

Generell verhalten sich Abfragen als Datenquellen von Unterformularen immer etwas merkwürdig - speziell beim Anlegen neuer Datensätze. Einiges findest du in der Hilfe unter „Aktualisieren von Daten in einer Abfrage über Tabellen mit einer 1:n-Beziehung“.

Ich habe in meinen Datenbanken die Möglichkeit zum Anlegen neuer Datensätze aus den Unterformularen entfernt und verwende dafür spezielle Schaltflächen bzw. Ereignisprozeduren, in denen die Datensätze dann per Code angelegt werden. Da hat man dann bessere Möglichkeiten der Vorbesetzung und Fehlerbehandlung und kann so etwas Ähnliches wie Insert-Trigger realisieren…

Reinhard

Hallo!

Nach hartnaeckigem Kampf mit Access, ist es mir jetzt tatsaechlich gelungen, dieses seltsame Speicherproblem in den Griff zu kriegen, es funktioniert jetzt ohne Probleme! :smile:)

Allerdings mag es an der
Datenquelle des Unterformulars liegen.
Die besteht ja aus einem JOIN von EuroPa
und tblContactActivity über ID, nehme ich
mal an. Dabei wird dann immer ein neuer
Datensatz für tblContactActivity
angelegt, wenn einer für EuroPa angelegt
wird.

Die Datenquelle war:
SELECT DISTINCTROW tblContactActivity.ActivityID, tblContactActivity.ID,
EuroPa.[FIRST NAME],EuroPa.SURNAME, tblActivities.[Activity Name],
tblActivities.[Activity Date]
FROM tblActivities
INNER JOIN
(EuroPa INNER JOIN tblContactActivity ON EuroPa.ID = tblContactActivity.ID)
ON tblActivities.[Activity ID] = tblContactActivity.ActivityID
ORDER BY tblContactActivity.ActivityID;

FIRST NAME und SURNAME habe ich auch in den Query einbezogen, weil diese Daten auf dem Formular angezeigt wurden. Jetzt habe ich stattdessen einfach „tblCompanyActivity“ als Datenquelle verwendet und das seltsame Phaenomen mit den doppelten Datensaetzen ist verschwunden!!! *wunder In einem Subformular dieses Formulars wird dann die Aktivitaeten# angezeigt und automatisch eine Beschreibung + Datum dazu ergaenzt.

Der Nachteil ist nur noch, dass FIRST NAME und SURNAME nun nicht mehr im Hauptformular angezeigt werden koennen, aber auf das kann ich notfalls auch verzichten.

Generell verhalten sich Abfragen als
Datenquellen von Unterformularen immer
etwas merkwürdig

Da hast Du recht, das habe ich mittlerweile auch herausgefunden!

Tanja

Die Datenquelle war:
SELECT DISTINCTROW
tblContactActivity.ActivityID,
tblContactActivity.ID,
EuroPa.[FIRST NAME],EuroPa.SURNAME,
tblActivities.[Activity Name],
tblActivities.[Activity Date]
FROM tblActivities
INNER JOIN
(EuroPa INNER JOIN tblContactActivity
ON EuroPa.ID = tblContactActivity.ID)
ON tblActivities.[Activity ID] =
tblContactActivity.ActivityID
ORDER BY tblContactActivity.ActivityID;

Versuch mal, den ID aus EuroPa und nicht aus tblContactActivity zu nehmen, also so:
SELECT DISTINCTROW
tblContactActivity.ActivityID, EuroPa.ID, EuroPa.[FIRST NAME],EuroPa.SURNAME, tblActivities.[Activity Name], tblActivities.[Activity Date]
FROM tblActivities
INNER JOIN (EuroPa INNER JOIN tblContactActivity ON EuroPa.ID = tblContactActivity.ID)
ON tblActivities.[Activity ID] = tblContactActivity.ActivityID
ORDER BY tblContactActivity.ActivityID;

Der Nachteil ist nur noch, dass FIRST
NAME und SURNAME nun nicht mehr im
Hauptformular angezeigt werden koennen,
aber auf das kann ich notfalls auch
verzichten.

Du kannst die Felder ja auch per DLookup in berechnete Feldinhalte stellen, also etwa so:
=Wenn(IstNull(ID);"";DomWert(„NAME“;„EuroPa“;"ID = " & ID))

Reinhard

Vielen Dank!

Hallo Reinhard!

Ich wollte mich noch einmal bei Dir bedanken. Du hast wirklich immer super Tips parat und kennst Dich sehr gut aus.

Meine DB macht jetzt endlich mal das, was ich will. :smile: Die fehlenden Daten habe ich noch mittels der DLookup-Funktion noch auf das Formular geholt.

Gruesse, Tanja

Bug beim INSERT?
Hallo!

Ich habe die DB jetzt noch einmal von jemand anderem testen lassen. Leider traten dann diese seltsamen doppelten Datensaetze wieder auf. Bei mir hatte es zuvor ohne Probleme funktioniert. Anscheinend hat mein Versuch, dem Formular ein anderes SQL-Statement zugrunde zu legen doch nicht geholfen. :frowning:

Mir ist jetzt noch etwas anderes aufgellen. Die Daten in tblCompanyActivity und tblContactActivity werden anders gespeichert, obwohl doch fast
genau der gleich Code, Formualare & Tabellen zugrundeliegen. tblCompanyActivity speichert fuer jeden Datensatz der aufgerufen wurde noch ein Leerfeld unter ActivityID ab, bei
tblContactActivity ist dies nicht der Fall.

Also z. B: tblCompanyActivity
Unternehmen1|20
Unternehmen1|
Unternehmen2|20
Unternehmen2|

tblContactActivity
15|20
23|20

Warum speichert Access im oberen Fall immer noch eine Leerzeile mit ab und im unteren nicht? Dass es sich im ersten Fall im Strings handelt und im zweiten um Integer, duerfte ja eigentlich nichts ausmachen. In beiden Faellen werden Primaerschluesseln Aktivitaeten zugeordnet. Fuer das INSERT gibt es in der DB keinen Code, das geschieht „Access-intern“, sobald der Benutzer einen neue Aktivitaet eintraegt.

Liesse sich das Problem vielleicht loesen, indem man Access dazu bringt die Datensaetze in tblContactActivity genau so zu speichern wie in tblCompanyActivity (wo ja alles funktioniert)? Falls ja, wie mache ich das am besten?

Tanja