Hallo zusammen,
ich habe eine Frage zu Microsoft Access. Aktuell bin ich gerade dabei, mir eine Datenbank aufzubauen. Dazu gibt es bisher die folgenden drei Tabellen:
tblProdukte
tblProduktgruppen
tblProduktklassen
Man kann es wie ein Baumdiagramm betrachten, in dem ganz oben die Produktklassen stehen, dann kommen die Produktgruppen und schließlich die Produkte selbst.
In der Tabelle tblProduktklassen gibt es zwei Spalten, die erste ist eine ID-Spalte (Primärschlüssel), die zweite gibt einfach die Bezeichnung der Produktklasse an und heißt "Produktklasse"
In der Tabelle tblProduktgruppen gibt es drei Spalten (1. Spalte: "ID", 2. Spalte: "Produktgruppe", 3. Spalte: "Produktklasse"). In dieser Tabelle habe ich über den Nachfrage-Assistenten eine Beziehung zur Tabelle tblProduktklassen, und zwar in der 3. Spalte mit der Bezeichnung "Produktklasse", sodass ich zu jeder Produktgruppe die entsprechende Produktklasse auswählen kann (per Auswahlmenü bzw. Kombinationsfeld).
Soweit funktioniert auch alles gut. Nun ist es aber so, dass jede Produktgruppe immer eindeutig einer Produktklasse zugeordnet ist (eine Produktklasse kann hingegen vielen Produktgruppen zugeordnet werden)
In der Tabelle tblProdukte habe ich jetzt vier Spalten (1. Spalte: "ID", 2. Spalte: "Produktname", 3. Spalte: "Produktgruppe", 4. Spalte: "Produktklasse")
Wie kann ich es nun schaffen, dass in der Tabelle tblProdukte bei Auswahl der Produktgruppe auch gleich in der 4. Spalte die in tblProduktgruppen zugeordnete Produktklasse angezeigt wird, d. h. eine Produktgruppe fest mit einer Produktklasse "verschmolzen" ist.
Würde mich über Eure Hilfe sehr freuen!
Viele Grüße
ChemSim
Hallo,
vergiss den Nachschlageassi, der ist in Tabellen tabu. Solche Abhängikeiten und Auswahlen werden ausschließlich in Formularen als Kombifelder angelegt.
Über Nachschlagefelder werden auch keine Beziehungen angelegt. Beziehungen werden im Beziehungsfenster (und nur dort) angelegt.
Zeige also bitte mal ein Bild des Beziehungsfensters.
Die 4. Spalte: "Produktklasse" ist überflüssig. Die Klasse ergibt sich automatisch und kann über eine Abfrage auch angezeigt werden.
Hier mal ein Tutorial:
https://www.access-tutorial.de/
Und hier noch was zum Nachschlageassi:
https://www.ms-office-forum.net/forum/showpost.php?p=2081877&postcount=2
Hallo MzKlMu,
danke für Deine Antwort. Ich habe die Methode mit dem Nachschlageassistenten von diversen YouTube-Tutorials, deswegen habe ich ihn benutzt. Ich habe nun die 4. Spalte "Produktklasse" in der Tabelle tblProdukte wieder entfernt. Anbei ein Bild des Feldes "Beziehungen".
Beziehungen.PNG
Viele Grüße
ChemSim
Hallo,
und wo ist die Beziehung zu den Produkten ?
Das war ja mein Problem. Ich hatte die Beziehung ursprünglich über den Nachschlageassistenten gesetzt, wie übrigens auch die Beziehung zwischen den Tabellen tblProduktklassen und tblProduktgruppen, aber ich habe diese jetzt gelöscht, weil es ja nicht so funktioniert hat wie ich will und ich gelernt habe, dass es anscheinend falsch ist, den Assistenten zu nutzen!
Wie bekomme ich nun die Verknüpfung so hin, wie ich es mir vorgestellt habe?
Hallo,
Beziehungen werden im Beziehungsfenster angelegt.
Zie dort einfach eine Beziehungslinie von der ID der Produktgruppen zur ProduktgruppenID der tblProdukte. Siehe Bild:
Nenne ID Felder nicht einfach ID sondern mit Bezug zur Tabelle.
ProduktgruppenID
ProduktKlassenID
ProduktID.
Für den Anfänger ist es vorteilhaft an die Fremdschlüsselfelder (n-Seite) ein _F anzuhängen. Damit man Primär- und Fremdschlüssel schon am Namen unterscheiden kann.
Hallo,
ich habe nun die IDs in den Tabellen jeweils umbenannt und dann von der ProduktgruppeID der Tabelle tblProduktgruppen eine Linie zur ProduktgruppenID der tblProdukte gezogen. Ist es so richtig?
Hallo
und noch RI einstellen, dann stimmt es.
Und das _F nicht vergessen.
Hallo,
ich habe die _F noch ergänzt, hoffe war so richtig gemeint. Allerdings kann ich die referenzielle Integrität nicht einstellen, da ich einen Fehler bekomme.
Fehler.PNG
Hallo,
die Fehlermeldung ist doch eindeutig. Einfach die Datentypen prüfen, muß auf beiden Seiten Longinteger sein.
Vielen Dank, ich habe es geändert und nun funktioniert es!
Beziehungen.PNG
Mein Ziel ist es nun, über ein Formular, und wie Du bereits gesagt hast über ein Kombinationsfeld, einen Eintrag und die Tabelle tblProdukte zu ermöglichen. Hierbei soll man das Produkt eingeben können und aus einer Liste die Produktgruppen auswählen können. Letztere sind jetzt bereits über die andere Tabelle mit den Produktklassen verbunden.
Dazu habe ich zunächst ein neues Formular mit dem Namem fmrNeuesProdukt erstellt und dieses mit der Tabelle tblProdukte als Datensatzquelle verknüpft. Anschließend habe ich ein neues Textfeld erstellt, in das ich den Produktnamen eingeben kann. Dann habe ich ein Kombinationsfeld erstellt und als Datenherkunft die tblProduktgruppen angegeben. Soweit funktioniert auch alles, allerdings habe ich gerade noch einen Button erstellt, welcher mit den eingebenen Eintrag abspeichert. Das Problem ist, dass die Einträge nicht in der Tabelle tblProdukte erscheinen.
Formular.PNG
Was habe ich falsch gemacht?
Hallo,
bei Acces braucht es keinen Speichernbutton. Access speichert mit gebundenen Formularen automatisch, sobald der Datensatz gewechselt (zu einem neuen DS z.B.) oder das Formular verlassen wird.
Schließe mal einfach das Formular wenn Du ein Produkt mit Gruppe eingegeben hast und schaue dann mal in der Tabelle nach.
Was macht denn der von Dir erstelle Speichern Button genau ?
Ich habe dem Formular einen Speicher-Button hinzugefügt und mit einem VBA-Code verknüpft, sodass die Eingabefelder automatisch geleert werden und für einen neuen Eintrag bereitstehen. Das hat tatsächlich so funktioniert wie ich wollte und ich kann nun neue Produkte in die Tabelle aufnehmen. In der Tabelle tblProdukte in der Spalte Produktgruppe steht jetzt eine Zahl, die genau der ID der Tabelle tblProduktgruppen zugeordnet ist. Von daher hat auch die Verknüpfung wie es scheint geklappt.
Jetzt bin ich gerade am rätseln, wie ich es am besten hinbekomme, die hinzugefügten Produkte wieder über ein Formular bearbeitbar zu machen, falls man sich mal vertippt oder so. Wenn ich einfach ein neues Formular erstelle und die beiden Felder "Produktname" und "Produktgruppe" nutze, habe ich das Problem, dass bei Produktgruppe nur Zahlen stehen, also die ID. Kann man das irgendwie Umstellen, dass ich dort auch eine Art Kombinationsfeld habe, aus dem ich die Produktgruppen auswählen kann?
Formular.PNG
PS: Wenn ich einfach ein Produkt in das Textfeld eingebe und eine Gruppe auswähle, dann das Formular schließe, wird es NICHT in die Tabelle eingetragen, nur wenn ich den Speichern Button nutze!
Hallo,
Du brauchst kein extra Formular, du kannst das bisher erstellte Formular auch zum ändern nutzen.
Zitat von: MzKlMu am Februar 10, 2024, 18:08:16Du brauchst kein extra Formular, du kannst das bisher erstellte Formular auch zum ändern nutzen.
Ja, aber dann müsste ich mein Textfeld und das Kombinationsfeld wieder entfernen und die vorhandenen Felder der Tabelle hinzufügen, wodurch ich das Problem habe, dass die bereits bestehenden Produkte auch angezeigt werden. Ich möchte die Eingabe eines neues Produktes aber davon trennen.
Weißt du, wie ich in dem zweiten Formular fmrProduktBearbeiten einstellen kann, dass bei Produktgruppe nicht 1, 2, 3 usw. sondern die entsprechend verknüpften Produktgruppen stehen, die man auswählen kann?
Hallo,
ZitatIch möchte die Eingabe eines neues Produktes aber davon trennen.
Öffne das Form einfach mit einem Filter, der immer "Falsch" ergibt
Filter = "1 = 0"
Beim Laden filtern = Ja
Zitatdass bei Produktgruppe nicht 1, 2, 3 usw. sondern die entsprechend verknüpften Produktgruppen stehen, die man auswählen kann?
Spaltenbreiten des Kombis anpassen; - 0cm;3cm (oder wie breit auch
immer du den Namen angezeigt bekommen willst.
gruss ekkehard
ZitatSpaltenbreiten des Kombis anpassen; - 0cm;3cm (oder wie breit auch
immer du den Namen angezeigt bekommen willst.
Es handelt sich aber um kein Kombinationsfeld, sondern um ein Textfeld. Warum weiß ich nicht, hat Access so gemacht ...
Unbenannt.PNG
Hallo,
ZitatIch möchte die Eingabe eines neues Produktes aber davon trennen.
Auch dann brauchst Du definitiv nur ein Formular. Ein Formular lässt sich (per VBA) zur Dateneingabe (nur neue Produkte) oder zur Bearbeitung bestehenden Produkte einstellen.
Im ersten Fall:
Dateneingabe auf Ja
Im zweiten Fall:
Dateneingabe auf Nein
Anfügen zulassen auch auf Nein
Ein Filter wie von Ekkehard vorgeschlagen braucht es da nicht.
Auch ein Speichernbutton halte ich zum jetzigen Zeitpunkt für überflüssig.
Ein solcher Button macht nur Sinn, wenn man das Speichern
verhindern bzw. abbrechen will.
Zeige mal den Code den Du zum Speichern verwendest.
Zitatkein Kombinationsfeld, sondern um ein Textfeld. Warum weiß ich nicht, hat Access so gemacht ...
Kombinationsfelder in Formularen musst Du selbst anlegen, das macht Access nicht automatisch.
Zitat von: MzKlMu am Februar 10, 2024, 19:16:07Zeige mal den Code den Du zum Speichern verwendest.
Anbei der Code, der dem Speichern Button zugewiesen ist. Aber nochmal zurück. Das eigentliche Problem ist ja, dass sobald ich ein einfaches Formular erstelle, als Datensatzquelle die Tabelle tblProdukte auswähle und über "Vorhandene Felder hinzufügen" alle Felder hinzufüge, das Feld Produktgruppe als Textfeld dargestellt wird, obwohl es ein Kombinationsfeld sein sollte. Und genau deswegen habe ich den Nachfrageassistenten verwenden (und sollte man auch), denn wird bereits in den Tabellen die Zuordnung richtig gemacht und dadurch dass ich jetzt in der Tabelle tblProdukte bei der ProduktgruppeID eine Zahl stehen habe, funktioniert gar nichts mehr ...
Private Sub NeuesProduktSpeichern_Click()
If Not IsNull(Me.txtProdukt) And Not IsNull(Me.cboProduktgruppe) Then
DoCmd.RunSQL "INSERT INTO tblProdukte (Produktname, ProduktgruppeID_F) VALUES ('" & Me.txtProdukt & "','" & Me.cboProduktgruppe & "')"
MsgBox "Das Produkt wurde erfolgreich hinzugefügt!", vbInformation
'Textfeld und Kombinationsfeld leeren
Me.txtProdukt = ""
Me.cboProduktgruppe = ""
'Optional: Formular aktualisieren, um die neuen Daten anzuzeigen
Me.Requery
Else
MsgBox "Bitte füllen Sie alle erforderlichen Felder aus.", vbExclamation
End If
End Sub
Hallo,
der gezeigte Code zum Speichern ist ersatzlos überflüssig. Du verwendest ja gebundene Formulare da braucht man kein "INSERT INTO ... Das ist falsch und so wird das Produkt 2x gespeichert. So kann man auch keine Pflichtfelder prüfen. Die Pflichtfelderprüfung muss als VBA Code zwingend in das Formularereignis "Vor Aktualisierung" weil nur dort das Speichern mit dem Cancel Parameter abgebrochen werden kann.
ZitatUnd genau deswegen habe ich den Nachfrageassistenten verwenden (und sollte man auch), denn wird bereits in den Tabellen die Zuordnung richtig gemacht und dadurch dass ich jetzt in der Tabelle tblProdukte bei der ProduktgruppeID eine Zahl stehen habe, funktioniert gar nichts mehr ...
Der Schluss ist falsch, den sollte man auf keinen Fall verwenden. Du kannst die Nachschlagefunktion auf die gleiche Art in Form von Kombinationsfeldern auch in Formularen anlegen, da gibt es keinen funktionellen Unterschied ob Tabelle oder Formular, Du kannst es nur noch nicht.
Du hast Du mit Deinen YouTube-Tutorials einiges durcheinander gebracht. Ich wäre auch skeptisch gegenüber diesen Videos. Da gibt es viele die nicht gut sind.
Beschäftige Dich besser mal mit dem Tutorial das ich in #1 verlinkt habe. Ich bin aber nicht der Verfasser.
Wenn Du nicht klar kommst, lade mal die DB hoch. Komprimiert/Repariert (Access Dienstprogramm) und gezippt.
Zitat von: MzKlMu am Februar 10, 2024, 19:38:29Wenn Du nicht klar kommst, lade mal die DB hoch. Komprimiert/Repariert (Access Dienstprogramm) und gezippt.
Ich hab alle Beziehungen, die ich mit dem Nachfrageassistenten erstellt habe, wieder gelöscht und die Tabellen über das Beziehungsfeld miteinander verbunden, so wie du es gesagt hast. Könntest du mir helfen, ein Formular zu erstellen, mit dem ich die Einträge in der Tabelle tblProdukte bearbeiten, ergänzen oder löschen kann? Ich komme echt nicht klar und wäre über eine Art Vorlage sehr dankbar!
Im Anhang die reparierte und komprimierte Datenbank
Vielen Dank!
Hallo,
ich werde es mir anschauen, aber erst morgen, für heute ist Feierabend :D
Ich kann im Moment nicht nachsehen, sind inder DB für die Gruppen und die Klassen Beispieldatensätze?
Wenn nicht bitte noch nachholen.
ZitatIch kann im Moment nicht nachsehen, sind inder DB für die Gruppen und die Klassen Beispieldatensätze?
Wenn nicht bitte noch nachholen.
Ja es sind Beispieldatensätze drin, aber ich gehe gerade das Tutorial durch, welches du mir geschickt hast im ersten Post und es hat mir sehr weitergeholfen. Ich habe an der Stelle mit den Kombinationsfeldern immer etwas falsch gemacht. Gerade bastle ich ein bisschen rum und es funktioniert soweit alles ganz gut. Könnte also sein, dass ich es bis morgen selbst noch hinbekomme ;)
Gruß
Simon
Hallo,
was hat es mit der Tabelle "tblTechnologien" auf sich ?
Du kannst ja jetzt nicht einfach eine weitere TAbelle ins Spiel bringen ohne das zu erklären.
Im Regelfall hat es in einer DB keine Tabelle(n) ohne Beziehung(en).
Nebenbei:
Hast Du was mit der BASF zu tun ?
Hallo,
im Anhang mal mein Vorschlag für ein einfaches Formular zur Erfassung neuer Produkte und der Bearbeitung bestehender Produkte.
Es gibt auch noch ein Kombifeld zur Suche von Produkten.
Der Button "Neues Produkt anlegen" stellt das Formular auf Dateneingabe. Dann Daten eingeben. Erneuter Druck auf den Button speichert den Datensatz (nach Prüfung) ab und zeigt wieder ein leeres Formular an.
Das Formular ist an eine Abfrage gebunden (qryFormular) damit automatisch auch die Klasse angezeigt wird.
Die Produktid und die Klasse ist in diesem Formular zur Bearbeitung gesperrt.
Anmerkung:
Bei einer Produktgruppe muss immer auch eine Klasse eingetragen werden, ich habe da mal jetzt willkürlich 1 oder 2 eingetragen. Ist keine Klasse bekannt, sollte es eine Klasse "Unbekannt geben", die dann bei den Gruppen eingetragen werden muss.
DB anbei
Zitat von: MzKlMu am Februar 11, 2024, 00:19:34was hat es mit der Tabelle "tblTechnologien" auf sich ? Du kannst ja jetzt nicht einfach eine weitere TAbelle ins Spiel bringen ohne das zu erklären. Im Regelfall hat es in einer DB keine Tabelle(n) ohne Beziehung(en).
Diese Tabelle möchte ich zu einem späteren Zeitpunkt noch nutzen und die habe ich schonmal erstellt.
Zitat von: MzKlMu am Februar 11, 2024, 00:19:34Nebenbei:
Hast Du was mit der BASF zu tun ?
Ne, mit der BASF habe ich nichts zu tun, wieso? ;D
Danke für Deine Hilfe und die Erstellung eines Musterformulars. Ich habe damit und mit dem Tutorial nun viel gelernt und konnte bisher alle meine Wünsche in die Tat umsetzen. Bei anderen aufkommenden Problemen würde ich ein neues Thema erstellen, dann mit spezifischeren Fragen! :D
Vielen Dank und viele Grüße
ChemSim
Hallo,
ZitatNe, mit der BASF habe ich nichts zu tun, wieso?
Auf Grund der Chemikalien könnte man auf die Idee kommen. Mit Caprolactam oder Acrylnitril z.B. hatte ich auch mal zu tun.
PS:
Bitte keine vollständigen Beiträge zitieren.
ZitatPS: Bitte keine vollständigen Beiträge zitieren.
Alles klar, danke für den Hinweis! Ne ich bin Chemiker, arbeite aber nicht bei der BASF ;D
Gruß
ChemSim