Neuen Datensatz in einem Formular anfügen

Hallo liebe Access-Interessierte!

Ich habe folgendes Problem: Ich habe das Formular „Projekte“ in Access 2002 erstellt. Die Daten dieses Formulars kommen aus einer Abfrage „Projekte“. Die Abfrage „Projekte“ kommt aus 6 Tabellen, die zueinander (mittels Beziehungen) verknüpft sind.

Genaueres über die Beziehungen: Die Namen der Tabellen sind: „Projektnummer“, „Aufgabenbeschreibung“, „Lieferantenauswahl“, „Verhandlung“, „Actual Status“ und „Verantwortliche“. Die Tabellen „Aufgabenbeschreibung“, „Lieferantenauswahl“, „Verhandlung“, „Actual Status“ und „Verantwortlichen“ sind mit der Tabelle „Projektnummer“ durch das Feld „Projektnummer“ verknüpft (mittels Beziehungen). Die Beziehungen zwischen diesen Tabellen sind 1:n–Beziehungen. Die Verknüpfung dieser 5 Tabellen mit der Tabelle „Projektnummer“ habe ich mit dem Nachschlage-Assistent in der Entwurfsansicht jeder Tabelle erstellt.

Bis dahin funktioniert das Formular ganz gut. Man öffnet es und kann Daten ändern und löschen. Dafür musste ich im Formularentwurf unter Eigenschaften\Daten\Recordsettyp die Option „Dynaset (Inkonsistente Aktualisierungen)“ wählen, damit die Benutzer Daten im Formular ändern dürfen, ohne zu der entsprechenden Tabelle gehen zu müssen (Die Benutzer kennen sich nicht mit Access aus). Ich habe auch ein Kombinationsfeld erstellt, mit dem man zu einem bestimmten Datensatz springen kann und den VBA-Code so programmiert, dass dieses Kombinationsfeld sich aktualisiert, wenn man mit dem Datensatznavigator zu einem anderen Datensatz geht.

So weit so gut. Der Albtraum fängt aber an, wenn man ein neues Projekt im Formular „Projekte“ eintragen möchte…

Wenn ich auf die von mir erstellte Taste „Neuen Datensatz anfügen“ klicke, komme ich zu einem neuen Datensatz. Im Feld „Projektnummer“ (das vom Feld „Projektnummer“ der Tabelle „Projektnummer“ kommt) trage ich die neue Projektnummer ein. In den weiteren Feldern (die aus den restlichen Tabellen kommen) trage ich die entsprechende Information ein.

Wenn ich das Formular zumache und wieder aufmache, sind die Daten (die ich gerade eingetragen hatte) weg. Wenn ich die Tabellen einzeln aufmache, sind die Daten da, aber in den Tabellen „Aufgabenbeschreibung“, „Lieferantenauswahl“, „Verhandlung“, „Actual Status“ und „Verantwortliche“ ist das Feld „Projektnummer“ leer. Ich vermute, weil das Feld „Projektnummer“ leer ist, sind die Tabellen in dem neuen Datensatz nicht verbunden und scheinen daher nicht im Formular. Ich könnte manuell in jeder Tabelle unter „Projektnummer“ die neue Projektnummer eintragen, und da taucht der neue Datensatz im Formular auf. Dies ist aber keine benutzerfreundliche Lösung (gerade, wenn der Benutzer sich mit Access nicht auskennt).

Ich denke, ich brauche einen VBA-Code der macht, dass die neue Projektnummer, die ich im Formular eingebe, sich automatisch in den restlichen Tabellen in einem neuen Datensatz speichert. Gibt es so was?

Ich hoffe ich habe mein Problem richtig formuliert und freue mich sehr auf jeden Vorschlag

Schöne Grüsse

Carlos

Hallo,

Vorschlag: wende dich von diesem Formular-Eintopf ab und erstelle für jede Tabelle ein Formular. Im „Haupt“-Formular, das ist das, das die hauptsächlichen Daten der DB verwalten soll (denke mal, hier sind es die Projekte) erstellst Du für jedes Formular der n-Tabellen ein UFO und verknüpfst diese über die Schlüsselfelder. Die Auswahl von Stammdaten (z. B. „Actual Status“ , btw: auf Leer- und Sonderzeichen in Namen verzichten) kann z. B. über gebundene Kombifelder passieren.

Die Daten dieses Formulars kommen aus
einer Abfrage „Projekte“. Die Abfrage „Projekte“ kommt aus 6
Tabellen, die zueinander (mittels Beziehungen) verknüpft sind.

problematisch, sihe oben.

Genaueres über die Beziehungen: Die Namen der Tabellen sind:
„Projektnummer“, „Aufgabenbeschreibung“, „Lieferantenauswahl“,
„Verhandlung“, „Actual Status“ und „Verantwortliche“. Die
Tabellen „Aufgabenbeschreibung“, „Lieferantenauswahl“,
„Verhandlung“, „Actual Status“ und „Verantwortlichen“ sind mit
der Tabelle „Projektnummer“ durch das Feld „Projektnummer“
verknüpft (mittels Beziehungen). Die Beziehungen zwischen
diesen Tabellen sind 1:n–Beziehungen. Die Verknüpfung dieser 5
Tabellen mit der Tabelle „Projektnummer“ habe ich mit dem
Nachschlage-Assistent in der Entwurfsansicht jeder Tabelle
erstellt.

wirf die Nachschlagefelder aus den Tabellen und benutz Kombifelder im Formular.

Beziehungen werden auch im Beziehungsfenster erstellt und nicht mit dem Nachschlageassistenten.

Bis dahin funktioniert das Formular ganz gut. Man öffnet es
und kann Daten ändern und löschen. Dafür musste ich im
Formularentwurf unter Eigenschaften\Daten\Recordsettyp die
Option „Dynaset (Inkonsistente Aktualisierungen)“ wählen,

ja, das ist auf Dauer tötlich…

damit die Benutzer Daten im Formular ändern dürfen, ohne zu
der entsprechenden Tabelle gehen zu müssen (Die Benutzer
kennen sich nicht mit Access aus).

braucht er auch nicht, es ist Deine Aufgabe, ihn vernünftig durch Formulare per Ablaufsteuerung zu führen.

Ich habe auch ein
Kombinationsfeld erstellt, mit dem man zu einem bestimmten
Datensatz springen kann und den VBA-Code so programmiert, dass
dieses Kombinationsfeld sich aktualisiert, wenn man mit dem
Datensatznavigator zu einem anderen Datensatz geht.

So weit so gut. Der Albtraum fängt aber an, wenn man ein neues
Projekt im Formular „Projekte“ eintragen möchte…

eben, der bleibt, wenn Du nicht das Ganze wie vorgeschlagen änderst.

Wenn ich auf die von mir erstellte Taste „Neuen Datensatz
anfügen“ klicke, komme ich zu einem neuen Datensatz. Im Feld
„Projektnummer“ (das vom Feld „Projektnummer“ der Tabelle
„Projektnummer“ kommt) trage ich die neue Projektnummer ein.
In den weiteren Feldern (die aus den restlichen Tabellen
kommen) trage ich die entsprechende Information ein.

Die Daten aus den restlichen Tabellen ausgewählt werden können/sollen(–> Stammdaten) , müssen zwangsläufig voher gepflegt (angelegt) worden sein, auch wenn das genau im Moment vor der Auswahl passieren könnte.

Wenn ich das Formular zumache und wieder aufmache, sind die
Daten (die ich gerade eingetragen hatte) weg. Wenn ich die
Tabellen einzeln aufmache, sind die Daten da, aber in den
Tabellen „Aufgabenbeschreibung“, „Lieferantenauswahl“,
„Verhandlung“, „Actual Status“ und „Verantwortliche“ ist das
Feld „Projektnummer“ leer. Ich vermute, weil das Feld
„Projektnummer“ leer ist, sind die Tabellen in dem neuen
Datensatz nicht verbunden und scheinen daher nicht im
Formular. Ich könnte manuell in jeder Tabelle unter
„Projektnummer“ die neue Projektnummer eintragen, und da
taucht der neue Datensatz im Formular auf. Dies ist aber keine
benutzerfreundliche Lösung (gerade, wenn der Benutzer sich mit
Access nicht auskennt).

ja, Antwort siehe auch oben.

Ich denke, ich brauche einen VBA-Code der macht, dass die neue
Projektnummer, die ich im Formular eingebe, sich automatisch
in den restlichen Tabellen in einem neuen Datensatz speichert.

brauchst Du nicht, die UFOs, bzw. Kombis machen das bei richtigem Aufbau alleine.

Gibt es so was?

geben gibt es viel, nur ob sinnvoll oder nicht, wäre die bessere Frage.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Franz!

Vielen Dank für Deine Antwort und die Mühe, die Du Dir dabei gibst.

Ich habe folgendes gemacht:

  • Alle Namen von Tabellen, Abfragen und Formulare so geändert, dass es keine Leer- und Sonderzeichen mehr gibt.

  • Die Beziehungen (die ich mittels giftigem Nachschlage-Assistent erstellt hatte) habe ich gelöscht, und das Feld „Projektnummer“ in den Tabellen „Aufgabenbeschreibung“, „AuswahlAgentur“, „Verhandlung“, „ActualStatus“ und „Verantwortliche“ gelöscht. Ich habe dann im Beziehungsfenster 1:1 Beziehungen zwischen der Tabelle „Projektnummer“ und den 5 restlichen Tabellen durch das Feld „ID“ erstellt.

  • Ich habe ein Formular für jede Tabelle erstellt (inkl. die Tabelle „Projektnummer“, die in meiner alten Lösung mit den 5 restlichen Tabellen mittels Nachschlage-Assistent verknüpft war). Wenn ich es richtig verstanden habe, soll ich ein Formular „Projekte“ (Unter "Erstellt ein Formular in der Entwurfsansicht) erstellen, in dem diese 6 Formulare als Unterformulare sich befinden. Wie mache ich die Verknüpfung über die Schlüsselfelder zwischen diesen 6 Formularen im Hauptformular?

Langsam werde ich verlockt, die 6 Tabellen in einer Tabelle zu vereinen und das Formular „Projekte“ aus dieser riesen Tabelle zu erstellen. Das würde mein Problem lösen, ist aber datenbanktechnisch nicht korrekt, da diese Tabelle 32 Felder hätte. Wie viele Felder darf überhaupt (aus datenbanktechnischer Sicht) eine Tabelle haben?

Schöne Grüsse aus dem kalten Norden

Carlos

Hallo,

„im Beziehungsfenster 1:1 Beziehungen“

da kracht es im Gebälk und droht einzustürzen.

Überdenk die Datenzusammenhänge und lies dieses:
http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/ind…

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo,

auf die Zahl der Felder kommt es zunächst nicht an. Du musst Dich zunächst mit dem Aufbau einer Datenbank vertraut machen, damit es nicht zu Redundancen kommt. Ein kleines Beispiel.

Du hast zwei Tabellen: 1. Kunden und 2. Rechnungen

In die Kunden-Tabelle kommt jeder Kunde einmal rein und hat eine interne automatisch vergebebene Nummer. Wenn nun in der Rechnungen-Tabelle Rechnungen erstellt werden, dann müssen diese ja einem Kunden zugeordnet werden. Dies geschieht, indem die interne Nummer aus Datei 1 in ein Feld (z.B. Kunden-Nummer) der zweiten Tabelle eingefügt wird. Das macht man in dem Moment, wo der Kunde ausgewählt wird und ein Datensatz für die Rechnung erstellt wird. Die Kundennummer liegt ja dann vor und wird im Programm übertragen. So können viele Rechnungen einem Kunden zugeordnet werden.

Der Kunde darf mit seinen Daten nur einmal in der Datenbank auftauchen, ansonsten wird immer nur auf ihn referenziert. Denn sonst müsste man ja ständig die Kundendaten neu eingeben und bei einer Änderung viele Sätze anpacken.

Hoffe, es hilft Dir?

Rückmeldung erwünscht.

MB.

Hallo MB!

Danke sehr für Deine Antwort! Ich versuche meinen Fall zu Deinem Beispiel anzupassen:

Du hast zwei Tabellen: 1. Kunden und 2. Information (fällt mir keinen anderen Namen im Moment für diesen Namen).

In der Tabelle 1. Kunden hast Du folgende Felder: Kundennummer, Name, Nachname, Straße, PLZ, Wohnort, Land

In der Tabelle 2. Information hast Du folgende Felder: Bankverbindung, Bewertung der Kunden, Rabatt.

Jeder Datensatz der Tabelle 2 wird zu einem Datensatz der Tabelle 1 geordnet, also es geht hier um eine 1:1 Beziehung (Im Beziehungsfenster die Tabellen durch das Feld „ID“ verknüpfen). In deinem Beispiel ging es um eine 1:n Beziehung. Jeder Kunde darf in mehreren Datensätzen der Tabelle Rechnungen sein. Bei mir nicht.

Nun möchte ich ein Formular „Kunden“ erstellen, das aus beiden Tabellen kommt. (in der Entwurfsansicht unter „Erstellt ein Formular unter Verwendung des Assistenten“ und die beiden Tabellen wählen) In diesem Formular würde ich ein Register mit zwei Registerkarten erstellen: 1. Kunden und 2. Information. Das klappt mit der Navigation von Kunden zu Kunde und mit der Änderung der Daten wunderbar. Mein Problem hier wäre, wenn ich einen neuen Kunden eintragen möchte.

Mit dieser Lösung kann ich auf „Neuen Datensatz anfügen“ anklicken und die Daten des neuen Kunden eingeben.

Wenn ich mindestens in einem Feld in der Registerkarte „Kunden“ und in einem Feld der Registerkarte „Information“ eingebe, wird ein neuer Datensatz sowohl in der Tabelle „Kunden“ als auch in der Tabelle „Information“ angefügt. Ich mache das Formular zu und wieder auf und der neue Kunde ist da. Wunderbar…

Wenn ich aber einen neuen Kunde eingeben möchte, und nur seine Kundennummer, Namen und Adresse eingebe (also Daten nur in der Tabelle 1. Kunden eingebe) und in der Registerkarte „2. Information“ noch nichts eingebe passiert folgendes: Ich mache das Formular zu und wieder auf, und der neue Kunde ist nicht mehr da. Logisch, ich habe einen neuen Datensatz in der Tabelle „Kunden“ angefügt und die Tabelle „Information“ bleibt unberührt.

Das Programm muss so eingestellt werden, dass wenn man eine neue Kundennummer eingibt, in der Tabelle „2. Information“ ein neuer Datensatz automatisch angefügt wird.

Wie würdest Du das machen?

Schöne Grüsse,

Carlos

Das musst Du über einen Programmcode steuern. Suche Dir z.B. ein Feld bei der Kundenanlage aus, das unbedingt gefüllt sein muss, um einen Kunden anzulegen (vielleicht die KundenNummer). Bei diesem Feld gibst Du dann unter der Eigenschaft „Bei Aktualisierung“ den Programmcode ein, der in der zweiten Datei einen neuen Datensatz mit der KundenNummer anlegt. So in etwa. Kann hier natürlich keine vollständige Programmierung angeben. Aber vielleicht hilft es Dir schon:

Dim F As Form
Set F = Forms![DeinFormular] 'evtl. UnterformularDefinition

SQL = „SELECT [KundenNummer].Information“

Set MeineDatei = AktuelleDB.OpenRecordset(SQL, dbOpenDynaset)

MeineDatei.AddNew
MeineDatei![KundenNummer] = F.[Kundennummer] 'Feld aus dem Formular
MeineDatei.Update

Sorry, habe zu schnell auf absenden gedrückt. So jetzt der Code nochmal:

Dim AktuelleDB As Database
Dim MeineDatei As Recordset
Dim SQL As String
Dim F As Form

Set F = Forms![Dein Formular] 'evtl. Unterformuardefinition

SQL = „SELECT [Information].KundenNummer FROM [Information];“

Set AktuelleDB = DBEngine(0)(0)
Set MeineDatei = AktuelleDB.OpenRecordset(SQL, dbOpenDynaset)

MeineDatei.AddNew
MeineDatei![KundenNummer] = F.[SKundenNummer]
MeineDatei.Update

Hallo MB!

Danke für den Vorschlag! Ich hatte irgendwie keinen email-Bescheid bekommen, dass Du meine Nachricht beantwortet hattest und sehe deshalb erst jetzt Deine Antwort. Ich werde mir Deine Lösung angucken und sage Dir nächste Woche, ob es geklappt hat.

LG

Carlos

Hallo MB

Ich habe versucht, Deine Lösung umzusetzen. Habe aber Problemen mit den
Variablen. Hier ein Zitat von Dir:

Dim AktuelleDB As Database
Dim MeineDatei As Recordset
Dim SQL As String
Dim F As Form

Die Datei heißt „Kundeninformation.mdb“ . Die Tabellen heißen „Kunden“ und „Information“. Das Formular heißt „Kundeninformation“ (wie die Datei).

So: Was ist für Dich „AktuelleDB“? Die Dateiname? Und „Meine Datei“? Die Tabellenname, wo ein neuer Datensatz angefügt werden soll (in diesem Fall „Information“)?

Freue mich auf Deine Antwort

Grüsse

Carlos

Hallo MB!

Ich habe die Lösung irgendwie anders gefunden:

Ich habe (wie früher) ein Formular mit 2 Registerkarten aus diesen 2 Tabellen erstellt. Unter Eigenschaften bei „Kunden_Kundennummer“, bei „Nach Aktualisierung“ habe ich als VBA code geschrieben:

[Information_Kundennumer] = [Kunden_Kundennummer]

[Information_Kundennumer] ist das Feld „Kundennummer“ der Tabelle „Information“. [Kunden_Kundennummer] ist das Feld „Kundennummer“ der Tabelle „Kunden“.

Wenn ich eine neue Kundennummer in der Registerkarte „Kunden“ eingebe, wird ein neuer Datensatz in beiden Tabellen (Kunden und Information) automatisch angefügt.

Ist das eine profesionelle Lösung? Irgendwo habe ich gelesen (ich gebe zu: meine Access-Ausbildung besteht fast nur aus Blogs), dass die Frage bei Access ist nicht „Gibt es eine Lösung“ sondern „Welche von den vielen Lösung benutze ich?“.

MfG

Carlos