Ich bin neu in Access, aber habe langjährige Erfahrung mit "Enterprise" -Datenbanken. Ich habe Probleme bei der Umsetzung einer einfachen Aufgabe und vermute, dass meine Vorurteile dazu führen, dass ich den Punkt verpasse, deshalb bitte ich um Hilfe.Access Forms - Catch 22 versucht, Daten in mehrere verwandte Tabellen einzufügen
Die einfache Aufgabe verwendet Access-Formulare für die Dateneingabe, die zwei Tabellen füllt: Customer und CustomerAddress (kann mehrere Adressen pro Kunde sein).
Die Kundentabelle hat den Primärschlüssel CustomerID. Die CustomerAddress-Tabelle hat den Primärschlüssel CustomerAddressID und CustomerID als Fremdschlüssel mit RI für diese Beziehung.
Form1 ist an die Customer-Tabelle gebunden. Nach der Eingabe von Informationen für verschiedene Felder kann der Benutzer auf eine Schaltfläche klicken, um Form2 anzuzeigen, die an CustomerAddress gebunden ist und die Dateneingabe für mehrere Adressen ermöglicht.
Form1 übergibt die CustomerID (von Access zugewiesen) an Form2. Form2 ist kein Unterformular aufgrund der Größe, aber es könnte sein, wenn das das Problem lösen würde.
In einer perfekten Welt möchte ich, dass alle neuen Daten von Form1 und Form2 zusammen festgelegt werden. Vermutlich könnte ich dies mit ungebundenen Formularen tun und die Einfügeanweisungen innerhalb einer einzigen Transaktion codieren.
Frage 1: Gibt es eine Möglichkeit, dies mit gebundenen Formen zu tun?
Wenn ich Form1 verwende, ohne jemals auf die Schaltfläche "Adresse" zu klicken, wird eine Zeile erfolgreich zur Tabelle Customer hinzugefügt. Das Problem tritt auf, wenn versucht wird, CustomerAddress-Zeile (n) in Form2 hinzuzufügen, bevor die Customer-Zeile der Tabelle hinzugefügt wurde.
Wenn in Form2 die CustomerID nicht verwendet wird, liegt ein Einfügefehler vor, da eine CustomerAddress-Zeile ohne eine CustomerID nicht hinzugefügt werden kann. Wenn die CustomerID verwendet wird, liegt ein Einfügefehler vor, da die CustomerID noch nicht in der Kundentabelle vorhanden ist (obwohl die ID anscheinend "reserviert" ist).
Es ist nicht praktikabel, die Customer-Zeile vor dem Öffnen von Form2 zu erzwingen, da an diesem Punkt im Workflow einige Felder für den Kunden nicht vorhanden sind.
Frage 2: Gibt es einen Weg um dies? Es scheint eine allgemeine Anforderung zu sein.
Ich könnte dies umgehen, indem Sie die RI entfernen, so dass die CustomerAddress-Zeilen zuerst hinzugefügt werden können, aber dies scheint schlechte DB-Design und ich würde auch Bereinigungslogik für den Fall, dass der Kunde hinzufügen wird später abgebrochen.
Wie bereits erwähnt, vermisse ich wahrscheinlich den Punkt und es gibt einen besseren Ansatz. Jede Hilfe wird sehr geschätzt.
Vielen Dank für die Beantwortung. Der Grund, warum ich die Frage gestellt habe, ist, dass andere RDBMS, die ich verwendet habe, eine Lösung für dieses Problem haben. d. h. Zeilen zu verschiedenen Tabellen innerhalb einer einzelnen Transaktion hinzufügen. Das DBMS gibt den automatisch generierten Schlüssel zurück, wenn jeder Datensatz eingefügt wird. Die Änderung wird jedoch erst dauerhaft, wenn sie festgeschrieben wird. Sie Vorschlag re Temp Tabellen ist hilfreich - danke. Ich bin nicht ganz damit einverstanden, dass es hier ein Designproblem gibt - das Hinzufügen von Zeilen zu mehreren Tabellen in der gleichen Transaktion ist in einer normalisierten Datenbank sehr üblich. Es zeigt jedoch, dass ich meine Vorgehensweise bei der Verwendung von Access ändern muss. Danke noch einmal. – Grayman
Sie können innerhalb einer Transaktion in Access in zwei Tabellen einfügen. Innerhalb dieser Transaktion muss der übergeordnete Datensatz immer noch vor dem Detaileintrag eingefügt werden. Dies ist jedoch nicht Ihr Fall. Sie versuchen, es mit zwei getrennten nicht gebundenen gebundenen Formen zu tun. Es ist keine einzelne Transaktion beteiligt. Sie müssten das über Code tun. – AVG