Hallo Zusammen,
Ich bin relativ neu im Umgang mit Access 2007 und habe ein Problem, das ich selbst nach mehreren unterschiedlichen Ansätzen nicht lösen konnte.
Ich habe eine Tabelle erstellt, die mit der ID-Spalte 3 Spalten hat. Die 2. Spalte heißt Marke und zeigt die Marke eines Autos an. In 3. Spalte stehen verschiedene Modelle, die zu den Marken in der 2. Spalte zugeordnet sind. In der Marken-Spalte kommen also mehrmals die gleichen Marken vor.
Ich möchte nun durch die Auswahl in einem Kombinationsfeld (Name: cf_Marke) in einem Formular (Name: Autoformular), das die Marke anzeigt, eine Abfrage steuern. Die Abfrage soll die ausgewählte Marke im Kombinationsfeld nehmen und dann die entsprechenden Modelle aus der Tabelle anzeigen.
In der Abfrage sind die ID, Marke und Modell der Tabelle angegeben, in der Kriteriumszeile des Modells steht [Formulare]![Autoformular]![cf_Marke]
Eigentlich müsste dies doch reichen, um beim Anzeigen der Abfrage nach Aktualisieren des Kombinationsfeldes die zur ausgewählten Marke dazugehörenden Modelle anzuzeigen. Leider funktioniert das aber nicht.
Ich bin dankbar für jede Hilfe!
Eric1985
Hallo,
nein, das reicht nicht aus...
Woher soll das Formular wissen, dass es jetzt die DS mit der ausgewählten Marke anzeigen soll.
Nötig ist noch ein Aktualisieren des Form(-Recordset)s:
Sub cf_Marke_Afterupdate()
Me.Requery
End Sub
Alternative (aber nur zur Info, eher nicht zu empfehlen): Ein Aktualisieren-Makro beim "Nach Aktualisiserung"-Ereignis des Kombis angeben.
Außerdem muß der Kombifeld-Verweis in der Abfrage nicht unter "Modell" stehen, sondern unter "Marke", denn die(se Daten) soll(en) ja gefiltert werden.
Als Tipp (wenn nicht schon umgesetzt)
Es kommt die "Marke" öfters in der Tabelle vor. Damit in der Kombiliste jede Marke nur einmal vorkommt, sollte die Abfrage (der SQL-String) für das Kombi (Datensatzherkunft) etwa so aussehen:
Select Distinct Marke from tblAutos order by Marke
(Weiterhin rate ich vorsorglich dazu, beim weiteren Ausbau der DB auf die Umsetzung der Normalisierungsregeln zu achten)
Hallo DF6GL,
Danke für die schnelle Hilfe. Nun funktioniert meine Abfrage richtig. Allerdings habe ich nun Probleme mit einem 2. Kombifeld, das die Abfrageergebnisse anzeigen soll.
Die richtigen Modelle werden nur bei der 1. Auswahl angezeigt, wenn ich das 1.Kombifeld ändere, ändern sich die Modelle nicht mit.
Ich hab alle Ereignisse beim 1. Kombifeld ausprobiert, hat leider nichts gebracht.
Das 2. Kombifeld habe ich mit dem Code
Private Sub cf_Modell_AfterUpdate()
cf_Modell.Requery
End Sub
versehen habe. Leider wird es nicht aktualisiert, wenn ich im 1. Kombifeld den Eintrag ändere.
Wenn ich beim 1. Kombifeld mit dem Klick-Ereignis die Abfrage öffnen lasse, ist das richtige Modell auch nur dabei, wenn ich die Abfrage schließe und erneut über das 1. Kombifeld öffne.
Wie kann ich die Abfrage aktualisieren, ohne sie zu schließen und neu zu öffnen?
Das mit der distinct Auswahl ist gut, werde ich umsetzen, da die Datenbank an der ich arbeite sehr umfangreich ist.
Hallo,
mhmm, das ist jetzt aber einen andere Situation.
Ich interpretiere jetzt, dass Du zwei Kombis hast. Mit dem ersten willst Du die Liste des zweiten Kombis entspr. der Auswahl im ersten einschränken und nach Auswahl im zweiten Kombi ein bestimmtes Auto mit dem Formular anzeigen...
Das nennt sich "abhängige Kombifelder" und ist z. B. hier beschrieben:
http://www.donkarl.com/?FAQ4.36
In Deinem Fall etwa so:
Sub cf_Marke_Afterupdate()
Me!cf_Modell.Requery 'Der Verweis auf das Kombi muß in der Spalte "Marke" der Kombifeldabfrage stehen
End Sub
Kombi "cf_Modell":
Datensatzherkunft: Select ID, Modell from tblAutos order by Modell
Spaltenanzahl: 2
Spaltenbreiten: 0cm;4cm
Private Sub cf_Modell_AfterUpdate()
Me.Requery 'In der Abfrage für das Form muß der Verweis auf das Kombi "cf_Modell" im Kriteriumsfeld der Spalte "ID" stehen
End Sub
Hallo,
Danke für die schnelle und effektive Hilfe!
Ich habe leider noch eine Frage, die ich bisher mit Tutorials nicht hinbekommen habe.
Die Kombinationsfelder funktionieren nun so wie sie sollen, die Abfrage wird aktualisiert und die richtigen Daten entsprechend angezeigt.
Nun habe ich zu den Modellen noch die unterschiedliche Austattung in eine Tabellenspalte hineingepackt, jetzt kommen also mehrmals die Marke und das Modell vor, die unterste Ebene ist jetzt die Ausstattung.
Die Markeabfrage liefert nun mehrmals das gleiche Modell.
Gibt es eine Möglichkeit in der Abfrage jedes Modell immer nur einmal anzeigen zu lassen?
Ich will versuchen, das Ganze für mehrere Ebenen einer Tabelle umzusetzen.
Ich hab versucht einfach das Abfrageergebnis nochmal abzufragen, allerdings habe ich keine Möglichkeit gefunden ein passendes Kriterium zu erstellen.
Eric1985
Hallo,
befürchte, Du machst einen nicht gutzumachenden Fehler:
"Ich will versuchen, das Ganze für mehrere Ebenen einer Tabelle umzusetzen."
Du solltest MEHRERE Tabelle in 1:n-Beziehung verwenden.. (Siehe u. st. Links 1 und 1a)
Um mehrfach vorhandene DS in der Anzeige zu unterdrücken:
Datensatzherkunft: Select DISTINCT Modell from tblAutos order by Modell
Beachte aber, dass dann "ID" nicht mehr in der Liste auftauchen darf, weil dadurch sonst die DS ja nicht "mehrfach" sind.
Hallo ,
Nochmals danke für deine Hilfe. Ich hab meine Tabellen jetzt mit Beziehungen aufgebaut und die Kombifelder entsprechend referenziert.
Nun funktioniert alles so wie es soll.
Jetzt habe ich noch 1 Frage, es handelt sich um eine If-Abfrage, die ich für jedes Kombifeld erstellt habe.
Dabei muss man nacheinander Werte in den Feldern wählen und am Ende den "Save" button drücken. Falls nichts gewählt wurde (Standardwert ="") soll eine Meldung rausgegeben werden. Mit den Kombifeldern, die nur Text enthalten funktioniert das Ganze wunderbar. Allerdings habe ich Probleme bei einer Datums- und einer Zeitbox. Für diese Kombifelder steht in der If-Abfrage folgendes:
If breakdowndate.Value = "" Then
MsgBox "Please enter date of breakdown. ", vbOKOnly, "Breakdown history record"
Forms!breakdown!breakdowndate.SetFocus
Exit Sub
End If
Da das Kombifeld an Anfang leer ist, sollte doch die Abfrage die Textbox anzeigen, oder?
Ich habe in den Eigenschaften das Eingabeformat geprüft und dann statt If breakdowndate.Value = "" Then
If breakdowndate.Value = "__/__/____" eingegeben also passend zum Eingabeformat.
Mach ich das was grundsätzlich falsch, oder muss einfach nur das richtige Eingabeformat für meine If-Abfrage finden?
Danke nochmals, du hast mir wirklich sehr geholfen!
Hallo,
Sub btnSave_Click()
.
.
.
.
If Nz(Me!breakdowndate,"") = "" Then
MsgBox "Please enter date of breakdown. ", vbOKOnly, "Breakdown history record"
Me!breakdowndate.SetFocus
Exit Sub
End If
.
.
.
End Sub