Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Madmán am April 30, 2019, 09:06:00

Titel: Nur Werte zulassen die in anderen Tabellen vorhanden sind
Beitrag von: Madmán am April 30, 2019, 09:06:00
Guten Tag liebe Gemeinde,

ich schlage mich seit einiger Zeit mit Access rum und konnte bisher auch alle Probleme lösen. Nun scheitere ich an folgender Sache:

Ich habe 3 Tabellen:

Erledigte Jobs, Register 1, Register 2

Alle 3 enthalten Typ & Seriennummer. Da aber Register 1 noch komplett andere Werte als 2 enthält, lässt sich dies nur unsauber in einer Tabelle vereinen.
Ich möchte nun, dass im Backend in der Tabelle erl. Jobs, prinzipiell nur Werte enthalten sein können, die entweder in tbl_Register_1 oder tbl_Register_2 vorhanden sind. Seriennummern können Typenübergreifend mehrfach vorkommen.
Wenn ich es über die referentielle Integrität probiere, müssen die gleichen Werte in beiden Tabellen vorhanden sein. Ich will aber das sie nur in 1 oder 2 vorhanden sein müssen.

Jetzt könnte man über Kriterien im Eingabeformular (Frontend) definieren, dass nur Werte eingegeben werden können, die in einer der beiden Tabellen vorhanden sein müssen. Nur optimal fände ich die Lösung nicht, da ja theoretisch trotzdem Werte enthalten sein könnten, die es nach meiner Definition nicht geben darf.

Entschuldigt wenn das Problem schon anderswo beschrieben wurde. Ich habe gesucht und bin nicht fündig geworden. Vielleicht habe ich auch einfach die falschen Suchbegriffe verwendet.


Vielen Dank vorab!
Titel: Re: Nur Werte zulassen die in anderen Tabellen vorhanden sind
Beitrag von: PhilS am April 30, 2019, 16:06:03
Zitat von: Madmán am April 30, 2019, 09:06:00
Alle 3 enthalten Typ & Seriennummer. Da aber Register 1 noch komplett andere Werte als 2 enthält, lässt sich dies nur unsauber in einer Tabelle vereinen.
Deine bisherige Lösung ist m.M. noch unsauberer, als es die Vereinigung der beiden Tabellen je sein könnte.

Du kannst eine Basistabelle "Register" erstellen und darin alle Basisdaten speichern und die für beide Typen vorhanden sind und die jeweiligen Detaildaten in zwei verschiedene Detailtabellen auslagern. Oder du erstellst alle Detailfelder in der Tabelle "Register" und füllst nur die, die für den jeweiligen Typ passend sind. - Beides nicht ideal, aber IMO besser als der bisherige Ansatz.

Dann kannst du einen Fremdschlüssel definieren, um sicherzustellen, dass nur die vorhandenen  Typ & Seriennummer erfasst werden können. Ein Fremdschlüssel (Referenzielle Integrität!) ist die beste Lösung für das hier formulierte Problem!


Zitat von: Madmán am April 30, 2019, 09:06:00
Jetzt könnte man über Kriterien im Eingabeformular (Frontend) definieren, dass nur Werte eingegeben werden können, die in einer der beiden Tabellen vorhanden sein müssen. Nur optimal fände ich die Lösung nicht, da ja theoretisch trotzdem Werte enthalten sein könnten, die es nach meiner Definition nicht geben darf.
Du meinst, dass in Register1/2 vorhandene Werte geändert werden, ohne die referenzierenden Werte in Jobs geändert werden? - Ja, das ist ein Problem, dass sich am besten über Referenzielle Integrität verhindern lässt.

Eine weitere Lösung wäre ein Check-Constraint der das Vorhandensein der Werte prüft. Siehe dazu: Erweiterte Check Constraints mit ADO (https://codekabinett.com/rdumps.php?Lang=1&targetDoc=access-tabelle-gueltigkeitsregel#check-constraints-ado). - Ich würde einen klarer Fremdschlüssel deutlich bevorzugen.