Hallo,
ich bin in Sachen Access ein Neuling und habe ein Problem mit einem Nachschlagefeld. Ich nutze Access 2013. Nach Möglichkeit möchte ich gern die Probleme ohne VBA lösen, da ich auf diesem Gebiet zumindest bis jetzt ziemlich unbewandert bin.
Situation:
Ich habe eine Tabelle für meine astronomischen Beobachtungen (tblBeobachtungen) erstellt. Eine weitere Tabelle nimmt die Daten meiner Teleskope auf (tblTeleskope). Die Tabelle "tblTeleskope" enthält ein JA/NEIN Ankreuzfeld für die Angabe, ob das jeweilige Instrument verfügbar ist oder nicht. Es kann nämlich sein, dass ich vor Jahren mal mit einem Teleskop beobachtet hatte, dieses aber nun schon verkauft wurde. Somitmöchte ich dieses also nicht löschen, sondern nur als "inaktiv" kennzeichnen. Von jeder dieser beiden Tabellen gibt es ein entsprechendes Formular.
Problem:
In der Tabelle "tblBeobachtungen" habe ich nun ein Nachschlagefeld für das verwendete Teleskop erstellt, welches die Werte aus der Tabelle "tblTeleskope" anzeigt. Und hier kommt das Problem. Ich möchte gern, dass im Nachschlagefeld nur die gerade "aktiven" Teleskope angezeigt werden. Bisher habe ich es so gelöst, dass ich das Nachschlagefeld nach Verfügbarkeit sortieren lasse, d.h., alle mit "JA" im Feld "Verfügbar" deklarierten Telekope werden zuerst aufgelistet, alle mit "NEIN" gekennzeichneten danach. Gibt es hier irgendeine Möglichkeit, die deaktivierten Teleskope im Nachschlagefeld auszublenden?
Ich hatte es auch schon über eine Abfrage versucht. Das hat auch funktioniert. In der Abfrage wurden mir dann nur die aktiven Teleskope angezeigt. In der Tabelle Beobachtungen habe ich dann als Quelle für das Nachschlagefeld nicht die Werte aus der Tabelle "tblTeleskope" sondern aus meiner erstellten Abfrage "qryTeleskopeAktiv" genommen. Das Problem hierbei war nur, dass irgendwie die Beziehungen zwischen verwendetem Telekop zur Beobachtung nicht richtig dargestellt wurden. Wenn ich jetzt z.B. automatisiert ein Formular für die Tabelle "tblTeleskope" erstelle, wird automatisch ein Unterformular für die "tblBeobachtungen" eingefügt, da es ja eine Beziehung zwischen den Tabellen "tblTelekope" und "tblBeobachtungen" gibt. Mit der Abfrage war scheinbar keine richtige Beziehung zwischen meinen Teleskopen und Beobachtungen vorhanden.
Über einen Lösungsvorschlag zu meinem Problem wäre ich sehr dankbar.
Gruß
Patric
Hallo pscharf
Willkommen hier im Forum
1.) Nachschlagefelder in Tabellen bringen immer viel Probleme mit sich, aus dem Grunde sind sie in den Tabellen zu Vermeiden.
2.) Die Eingabe sollte immer über Formulare erfolgen die an die entsprechnede Tabelle gebunden ist.
3.) In den Formular arbeitet man dann mit Kombi Felder, in dem man auch ohne VBA Code dein Vorhaben umsetzen kann.
Hallo Stefan,
vielen Dank für die schnelle Antwort. Die Möglichkeit, das ganze über Kombinationsfelder im Formular zu machen, werde ich mir mal ansehen.
Gruß
Patric
Hallo,
nicht nur ansehen, sondern auch machen... Ich kann nur unterstreichen, dass Nachschlagefelder in Tabellen nicht praktikabel sind (wie Du selber schon gemerkt hast)..
Grundsätzlich sollte der User keine Tabellen oder auch Abfragen in der "Ansicht" direkt zu sehen bekommen....
@Franz:
Wird gemacht! ;)
Eine Frage zum Kombinationsfeld im Formular habe ich noch. Bisher habe ich keine Möglichkeit in den Eigenschaften des Kombinationsfeldes gefunden, die Anzeige nach meinen Angaben zu konfigurieren. Läuft es dann so, dass ich, wie schon geschrieben, eine Abfrage erstelle, in der nur die aktiven Teleskope aus der Tabelle "tblTeleskope" angezeigt werden, und ich diese dann im Formular-Kombinationsfeld als Quelle nutze? Am Ende des Assistenten für die Erstellung des Kombi-Feldes wird ja gefragt, in welches Feld die Daten geschrieben werden sollen. Hier würde ich dann nun mein "Teleskop-Feld" in der Tabelle "tblBeobachtungen"angeben.
Gruß
Patric
Hallo pscharf
Du brauchst nicht unbedingt eine Abfrage erzeugen auf die du dann die Datenherkunft des Kombi Feld beziehst.
Wenn du ein Formular erzeugst das gebunden ist an deine Tabelle so kannst du jedes Feld ändern in ein Kombi Feld.
1.) Formular öffnen in der Entwurfsansicht.
2.) Zu ändernes Feld einmal anklicken
3.) Mit der rechten Maustaste Eigenschaftsfenster öffen
4.) Dann unter "Ändern zu" Kombifeld auswählen
5.) Nun unter Eigenschaft des Kombifeld, den Punkt "Datenherkunft" hinten auf die drei Punkte klicken.
6.) Es öffnet sich nun ein neues Fenster in der die Abfrage nach deinen Wünschen erstellen kannst.
7.) Fenster schließen und Formular speichern.
8.) Fertig
Hallo,
mhmm, nur zur Klarstellung: Das Kombifeld braucht (sinnvollerweise, wegen der Möglichkeit der selektierten Feld-Reihenfolge und der Sortierung/Filterung) eine Abfrage mit Basis zu tblTeleskope"(siehe Punkt 6) . Auch die aus Punkt 6 resultiertende Eingabe in der Datenherkunft ist eine Abfrage (SQL-String einer Abfrage) der als "interne Abfrage" auch abgegespeichert wird...
Wichtig bei der ganzen Geschichte ist, dass das Primärschlüsselfeld der Teleskop-Tabelle an erster Stelle der Selekt-Liste der Abfrage steht, die gebundene Spalte des Kombis auf 1 steht und als Steuerelement-Inhalt das Fremdschlüsselfeld aus "tblBeobachtungen" angegeben ist, damit dessen Wert in "tblBeobachtungen" abgespeichert werden kann.
Allerdings kommt es zu Anzeige-Problemen (es wird ein leeres Feld angezeigt) bei den Fällen, bei denen in tblBeobachtungen ein "Teleskop" steht, das zwischenzeitlich ungültig gesetzt wurde.
Denn ein solches gibt es ja nicht (mehr) in der Kombifeld-Datenherkunft, wenn die Abfrage dazu nur die gültigen lieferen soll.
Das kann man aber mit einem zweiten Kombi und einer Zeile VBA umgehen.
Hallo
@Franz Danke für die Ergänzung, wollte hier mit nur zum Ausdruck bringen, das wenn über den von mir beschrieben Weg die Abfrage nicht in der Übersicht "Abfragen" zu finden ist.
Also, aus meinem bisherigen Teleskop-Feld im Formular kann ich kein Kombi-Feld erzeugen. Es gibt unter "Ändern zu" nur die Auswahl, ein Listenfeld oder ein Textfeld zu erstellen. Also versuchte ich meine schon angegebene Methode. Ich erstellte mir, basierend auf die Tabelle "tblTeleskope" eine Abfrage mit dem Namen "qryTeleskopeVerfuegbar". Das Ausführen der Abfrage brachte auch das gewünschte Ergebnis - es werden nur alle aktiven Teleskope angezeigt.
Nun habe ich in der Tabelle "tblBeobachtungen" mein ursprüngliches Feld "beoTeleskop", welches ja per Nachschlage-Feld die Werte aus der Tabelle "tblTeleskope" anzeigte, erst einmal umbenannt in "beoTeleskop_Old". Nun erstellte ich ein neues Feld "beoTeleskop" mit dem Typ "Kurzer Text".
Im nächsten Schritt habe ich nun mein Formular "frmBeobachtungen" in der Entwurfsansicht geöffnet und ein neues Kombi-Feld erstellt, in dem die Werte aus meiner Abfrage "qryTeleskopeVerfuegbar" genommen werden sollen.
Als Feld, in das die Daten des Kombi-Feldes geschrieben werden sollen, wählte ich nun mein neu erstelltes Feld "beoTeleskop" aus der Tabelle "tblBeobachtungen" aus. Das ganze funktioniert auch einwandfrei. Zum Schluss änderte ich in den Beziehungen noch die Einstellung. Bisher gab es noch eine 1:n Beziehung zwischen der Tabelle "tblBeobachtungen" mit dem Feld "beoTeleskop_Old" zur Tabelle "tblTeleskope", Feld "telID". Diese muss ja nun eigentlich wieder zu meinem neu erstellten Feld "beoTeleskop" hergestellt werden. Danach löschte ich das Feld "beoTeleskop_Old" aus meiner Tabelle "tblBeobachtungen".
Und nun kam das Problem, welches ich schon vorher mal hatte: Wenn ich nun zum Testen einfach mal ein neues Formular auf Basis meiner Tabelle "tblTeleskope" erstellen möchte, kommt immer die folgende Meldung:
Dieser Ausdruck wurde falsch eingegeben, oder er ist zu komplex, um ausgewertet zu werden. Beispielsweise kann ein numerischer Ausdruck zu viele komplizierte Elemente enthalten. Vereinfachen Sie den Ausdruck, in dem Sie Teile des Ausdrucks Variablen zuweisen.
Bei meiner bisherigen Methode ohne Abfrage mit Nachschlagefeld wurde hier ein neues Formular mit einem integrierten Unterformular der Tabelle "tblBeobachtungen" erstellt.
Da kann doch irgend etwas nicht stimmen...
Gruß
Patric
Hallo,
vermutlich machst Du das viel zu kompliziert.
Lad die DB mal hier hoch, vorher komprimiert/repariert und gezippt. Wenn es sehr viel Daten gibt, dann eine DB-Version mit reduzierter aber trotzdem integren Datenmenge
Hallo Franz,
als Anlage kommt hier mal eine Version meiner Datenbank (auf fünf Datensätze reduziert). Sie befindet sich noch in meinem Zustand, so wie ich es gemacht habe, also mit Nachschlagefeldern.
Mein Problem mit der Anzeige der nur verfügbaren Geräte betreffen die Formularfelder "Beobachtungsgerät", "Okular", "Filter" und "Zubehör" aus dem Formular "frmBeobachtungen". Die dazu passenden Felder in der Tabelle "tblBeobachtungen" lauten "beoGeraet", "beoOkular", "beoFilter" und "beoZubehoer". Ich habe bisher immer von der Tabelle "tblTeleskope" gesprochen, das ist mit meiner hier hochgeladenen Tabelle gleichzusetzen mit der Tabelle "tblBeobGeraete".
Komisch ist nur folgendes: Eben habe ich einmal von vorn eine neue Tabelle erstellt mit nur einem Feld als Kombi-Feld und noch ein Feld für den namen des Gerätes, da hat es mit der Abfrage funktioniert. Diese von mir oben angegebene Fehlermeldung kam nicht bei der Erstellung des Formulars. Scheint so, als wenn meine Datenbank irgendwo zu "kompliziert" erstellt wurde.
Vielleicht siehst Du ja, wo mein Problem liegt.
Gruß
Patric
[Anhang gelöscht durch Administrator]
Hallo,
Du solltest erst mal die DB bereinigen.
- alle Nachschlagefelder entfernen
- das Mehrwertfeld (beoZubehoer) ist aus der Tabelle zu entfernen. Mit einer weiteren Tabelle ist eine n:m Beziehung anzulegen.
Mehrwertfelder sind in einer Tabelle absoluter Unsinn und noch viel schlimmer als normale Nachschlagefelder und verhindern den korrekten Aufbau einer DB.
- Alle Beziehungen mit referentieller Integrität anlegen.
Hallo,
habe das Beobachtungs-Form bzgl. des Beobachtgerätes entspr. meinem vorangegangenen Hinweises angepasst. Die Nachschlagefelder sind beim Erstellen des Forms als Kombifelder "übernommen" worden, so dass die Nachschlagefelder aus den Tabellen jetzt herausgenommen werden können.
Die Beziehungen habe ich um die ref. Int. erweitert. Die Wertelisten sollten auch in Form von Tabellen abgelegt werden. (Könnte ja sein, dass plötzlich ein weiterer Planet oder Ähnliches entdeckt wird oder einer explodiert... ;-) )
PS: die ZIP-Datei ist eine RAR-Datei. Deshalb bitte umbenennen und mit Winrar entpacken.
[Anhang gelöscht durch Administrator]
Hallo Franz,
ich hatte Dir noch eine PN mit einigen Fragen geschickt. Mittlerweile habe ich gesehen, dass Du für die Auswahl ein seperates Kombifeld erstellt hast, die Werte werden dann in das bisherige Feld geschrieben.
Momentan ist das ganze für mich noch nicht vollständig ersichtlich, wie Du es geschafft hast, das "Beobachtungsgeräte"-Feld so anzupassen. Aber trotzdem noch einmal vielen Dank - ich werd' mich schon reinarbeiten...
Gruß
Patric
Vielen Dank für Eure Tipps. Mittlerweile funktioniert das Ganze sehr gut.
Mittlerweile stellt sich mir noch eine weitere Frage: Kann man eigentlich im Formular zwei Kombi-Felder hintereinander aufrufen? Das Problem ist folgendes:
Ich habe eine Tabelle für die Beobachtungsobjekte. Diese Tabelle hat neben der ID nur zwei Felder, und zwar "Objekttyp" und dann den Namen des Objekts. Nun kann diese Liste irgendwann sehr lang werden. Man kann nun im Formular die Abfrage im Kombifeld zwar zuerst nach Typ und dann nach dem Namen sortieren, aber man muss dann eventuell irgendwann, wenn die Liste eben sehr lang ist, weit herunterscrollen.
Gibt es hier eine Möglichkeit, im Kombi-Feld im Formular zuerst den Objekttyp auszuwählen und dann in einem weitern Kombi-Feld, aufbauend auf die Abfrage des ersten Kombi-Feldes, die zugehörigen Objektnamen? Oder kann man das irgendwie auf eine andere Art lösen?
Gruß
Patric
Hallo,
empfehlenswert, wie auch die anderen Links in meiner Sig.:
http://www.donkarl.com, speziell für diese Frage: http://www.donkarl.com/?FAQ4.36
Hallo Franz,
Super! Besten Dank für den Tipp!
Gruß
Patric
Hallo nochmal,
mittlerweile ist noch ein kleines Problem aufgetaucht - deshalb noch einmal eine Frage betreffs "Referentieller Integrität".
Bisher hatte ich ja in meiner Datenbank nur zwischen der Tabelle "Beobachtungen" und "Sitzungen" die Option "referentielle Integrität" aktiviert, damit z.B. nach dem Löschen einer Sitzung, in der ja eine oder auch mehrere Beobachtungen enthalten sein können, diese auch mitaktualisiert werden. Denn Beobachtungen ohne Sitzung sind sinnlos.
Nun wurde hier aber geraten und auch umgesetzt, zwischen den Tabellen "Okulare" und "Beobachtungen" oder "Filter" und "Beobachtungen" die referentielle Integrität einzuschalten. Das Problem ist jetzt nur, wenn ich z.B. eine neue Beobachtung anlege, diese speichern möchte und ich keinen Filter eingegeben habe, da ich z.B. keinen genutzt habe, kommt die Fehlermeldung, dass der Datensatz nicht gespeichert werden kann, da das Feld "Filter" in Beziehung mit einem anderen Feld steht (oder so ähnlich). Nehme ich die referentielle Integrität zwischen Filtertabelle und Beobachtungstabelle raus, kommt die Meldung nicht.
Wieso sollte eigentlich die referentielle Integrität aktiviert werden. Die Sachlage zwischen den Tabellen "Sitzungen" und "Beobachtungen" habe ich ja oben erklärt, aber bei Filtern, Okularen etc. ist es doch so, dass, wenn ich z.B. ein Okular oder Filter lösche, soll natürlich weiterhin die Beobachtung stehen bleiben.
Gruß
Patric
Hallo,
nimm bei den Fremdschlüsselfeldern den Standardwert raus, da ist vermutlich einen 0 drin.
Bei der RI hast Du etwas missverstanden. Die Löschweitergabe geht immer von der 1-Seite zur n-Seite.
Löschen auf der 1-Seite mit RI werden auch die Detaildaten (n-Seite) gelöscht, aber niemals umgekehrt.
Auf der n-Seite kannst Du löschen was Du willst, da werden nur diese DS der n-Seite gelöscht, auch nicht bei eingestellter RI.
Löschweitergabe erfolgt also nur von oben nach unten, niemals umgekehrt.
Zitat von: MzKlMu am Juni 07, 2013, 09:42:08
Hallo,
nimm bei den Fremdschlüsselfeldern den Standardwert raus, da ist vermutlich einen 0 drin.
Bei der RI hast Du etwas missverstanden. Die Löschweitergabe geht immer von der 1-Seite zur n-Seite.
Löschen auf der 1-Seite mit RI werden auch die Detaildaten (n-Seite) gelöscht, aber niemals umgekehrt.
Auf der n-Seite kannst Du löschen was Du willst, da werden nur diese DS der n-Seite gelöscht, auch nicht bei eingestellter RI.
Löschweitergabe erfolgt also nur von oben nach unten, niemals umgekehrt.
OK, Danke für die Erklärung. Das werde ich mir heute abend gleich mal ansehen und abändern.
Gruß
Patric