PDA

Vollständige Version anzeigen : Abfrage


Heinrich2k1
06.11.2001, 23:57
Hi,

ich weiß, der Titel sagt nicht viel aus.
Ich habe folgende (ACCESS2k)Datenbank (vereinfacht):

3 Tabellen

n:m Beziehung zwichen Tabelle1 und Tabelle3 über Tabelle3

Die Schlüssel:
Tabelle1:
Primärschlüssel (String)
weitere Daten
Tabelle2:
zusammengesetzter Primärschlüssel aus den Primärschlüsseln der Tabellen 1 und 3
Tabelle 3
Primärschlüssel (Integer)
Name

Ich habe jetzt vor eine Abfrage mit Formular zu bauen.
Eingabe:
Mehrere Namen, die in Tabelle3 vorhanden sind

Ausgabe:
Daten aus Tabelle1, die ALLE mit eingegebenen Namen verknüpft sind.

So, hört sich kompliziert an. Ich könnte die Sache mit VBA lösen, indem ich erst nach einem Namen abfrage, die Sachen in eine Zwischentabelle speichern. Und diese dann erneut filtern, scheint mir aber zu aufwendig. Gibt es dazu eine einfachere Lösung? (SQL oder so?).

Und noch eine einfachere Frage, denke ich.
Wenn ich ein Formular habe, habe ich ja so eine schöne Navigationsleiste. Wie heist die Ereignisprozedur die bei dem Laden (anzeigen) eines neuen Datensatze aufgerufen wird?

Danke bereits im voraus

Heinrich

Bernd Koch
08.11.2001, 01:29
zur ersten Frage

Idee 1
Würde nicht schon eine Mehrfachparameterabfrage reichen (die du natürlich auch mit einem entsprechenden Suchformular verbinden kannst? Im Abfrageentwurf im Feld "Name" in der Zeile Kriterien:

[Name1 eingeben] ODER [Name2 eingeben] Oder ... usw.

Halt so viele, wie du max. abfragen willst. Nehmen wir an, es wären max. 5 Namen - aber natürlich will man nicht immer 5 Namen eingeben; dann gibst du z.B. zwei Namen ein und drückst dreimal die Return-Taste.

Idee 2
Eine andere Sache, dann mit VBA, wären natürlich Inputboxen - ist im Grunde aber nix anderes als Idee 1.

Idee 3
Ein Suchformular mit mehreren ungebundenen Textfeldern (Suchfeld1, Suchfeld2 usw.); im Abfrageentwurf im Feld "Name" bei Kriterien:

wie [Forms]![Suchformular]![Suchfeld1] ODER [Forms]![Suchformular]![Suchfeld2] ODER usw.

dann schreibst du im Suchformular in die Suchfelder nur die gesuchten Namen rein; es können auch felder leer bleiben.

Generell: ich würde aber als Feldname nicht das Wort "Name" verwenden, denn das ist in Access ein geschützes Wort und könnte dir Ärger bereiten. Verwende lieber "Nachname" oder sowas.


zur zweiten Frage

Ich vermute, du meinst:

DoCmd.RunCommand acCmdRecordsGoToNew


Bernd

Heinrich2k1
08.11.2001, 23:16
Danke soweit.
Soweit hatte ich das auch. So zeigt er mir aber Alle Datensätze an, die einer der Parameter entspricht!

zu 2: Es war form_current(), habe ich dann doch gefunden *g*

Bernd Koch
09.11.2001, 00:04
Tja, dann verstehe ich deinen Satz:

"Ausgabe:
Daten aus Tabelle1, die ALLE mit eingegebenen Namen verknüpft sind"

nicht, der ja ohnehin irgendwie etwas seltsam klingt. Gib doch mal ein konkretes Beispiel, was in Tab1 drin ist, was du an Namen eingeben willst und was dann als Ergebnis rauskommen soll.


Zur zweiten Frage:
auch etwas ungenau: ein n e u e r Datensatz (auch in der Diktion von Access: "New") ist einer, der noch nicht vorhanden ist und jetzt angelegt werden soll.
Gehst du vom vorhanden DS 1 zum vorhandenen DS 2 oder umgekehrt, so ist das für Access der nächste oder der vorherige DS (Next, Previous usw.) oder generell ein a n d e r e r DS.


Also, gib mal ein Beispiel zu Frage 1, dann wird vielleicht transparenter, was du brauchst.

Bernd

Heinrich2k1
09.11.2001, 02:14
Sorry, die Beschreibung is wirklich etwas verwirrend.
Also Tabelle 1:
Kürzel is Primärschlüssel und ein Text
Name
Vorname
usw
Tabelle 2 (zwischentabelle für 1->3 n:m)
Kürzel Text \
> Primärschlüssel
Sprache Integer /

Tabelle 3:
Sprache Zahl Primärschlüssel
Name (der Sprache) Text

Ich habe also feste Sprachen (Englisch, Deutsch, Spanisch usw.) Die ich den Leuten aus Tabelle1 zuordnen will (n:m, klar).
Die Abfrage soll mir alle Leute anzeigen, die z.b. Englisch _und_ Deutsch können!

Ich habe das jetzt mit einigen (vielen) Zeilen VBA und Hilfstabellen gebastelt. Falls es da eine geschicktere Lösung gibt(ich denke diese wär auch schneller als mein Code), poste bitte einen Ansatz oder so.
thx
Heinrich

Bernd Koch
09.11.2001, 15:22
So, jetzt habe ich zumindest verstanden, was du möchtest und auch eine Teillösung. Leider konnte ich aber bisher keinen Weg finden, das noch besser hinzukriegen. Vielleicht hilft es dir aber ein wenig.

Normalerweise will man ja bei einer Abfrage so flexibel wie möglich sein/bleiben und in deinem Fall mal Personen finden, die die Sprache A UND B können, mal Sprache A UND C und mal Sprache A UND B UND E usw.

Diese Flexibilität habe ich leider bisher NICHT hingekriegt. Es geht nur pro Abfrage eine beliebige aber immer gleich bleibende Kombination. Für die obigen drei Beispiele brauchst du also auch drei Abfragen. Falls du damit leben kannst, weil du immer nur die gleichen Sprachkombinationen abfragen willst, sieh dir die nachfolgende Lösung an.

Zunächst ein paar Vorbemerkungen:

Meine Feldnamen:
tblPerson, PID (PersonID), Nachname
tblSprache, SID(SprachID), Sprache
tverPersonSprache (Verbindungstabelle) mit PID und SID

Die drei Tabellen entsprechend im Beziehungsfenster verbinden und dann auch die drei Tabellen im Abfrageentwurf (= qry1) aufrufen.
Dort kommen PID und SID aus der Verbindungstabelle nach unten und Nachname und Sprache aus den jeweiligen Stammtabellen.

Nunmehr sind dort in der Anzeige z.B. zwei Zeilen mit Müller, der die Sprachen Englisch und Französisch hat; drei Zeilen mit Meier (Englisch, Französisch, Chinesisch) usw.

So weit hast du das wahrscheinlich auch schon.

Dein Problem besteht ja jetzt darin, dass PRO ZEILE für die jeweilige Person immer nur EINE Sprache aufgeführt ist, daher hilft auch die normale Mehrfachparameterabfrage nix, wie sich inzwischen rausgestellt hat.

Also müssen wir Access „überlisten“:

1.
du erstellst als nächstes eine Kreuztabellenabfrage mit Datenbasis „qry1“:
Zeilenüberschrift = Nachname
Spaltenüberschrift = Sprache
Wert von Sprache = Anzahl

Die Kreuztabelle speicherst du als qry2. Du siehst, dass nun die Sprachen NEBENEINANDER aufgelistet sind und an entsprechender Stelle eine 1 aufweisen. Im Entwurf wird aber klar, dass es nur EINE Spalte „Sprache“ gibt. Man könnte jetzt auf die Idee kommen, in dieser Spalte (Zeile Kriterien) eine Mehrfachparameterabfrage zu installieren, nach dem Motto:
- gib die erste Sprache ein (Englisch)
- gib die zweite Sprache ein (Französisch)
usw.. Das klappt aber nicht!!

2.
Also erstellst du eine dritte Afrage (qry3) auf Basis von „qry2“. Und siehe da, hier sind im Entwurf alle vorhandenen Sprachen als einzelne Felder aufgeführt.

Bis hierhin ganz vielversprechend, denn wenn du nun das Feld Nachname und alle Sprachen (nehmen wir an, du hättest die drei Sprachen Englisch, Französisch und Russisch) runterziehst, stehen sie ja endlich nebeneinander und man könnte jetzt in jede Spalte der Sprachen eine Parameterabfrage, z.B. [Englisch] [Französisch] [Russisch ] reinschreiben. Wechselst du nun in die Normalansicht und möchtest alle Personen, die Englisch UND Französisch können, so gibst du in die Eingabefenster Englisch und Französisch je eine 1 ein und wenn dann das Fenster Russisch kommt, drückst du nur RETURN (vorher müsstest du allerdings unbedingt noch in der Entwurfsansicht im Menü/Abfrage/Parameter die Parameter Englisch, Französisch und Russisch auf den Dateityp Integer stellen!!).

Diese Lösung funktioniert aber leider NICHT und daran hakt die ganze Sache generell. Denn die „1“ die in manchen Feldern steht ist ja der berechnete Wert „Anzahl“ aus der Kreuztabellenabfrage und dort wo nichts steht, ist das der Wert „Null“. Den kannst du aber nicht ins Eingabefenster bei Russisch eingeben. Druckst du aber nur RETURN, so werden überhaupt keine Datensätze angezeigt.

An dieser Stelle bin ich bisher nicht weiter gekommen, denn auch Versuche nach dem Motto: Wenn der Wert „Null“ ist, so schreibe in die entsprechende Zelle eine „0“ nimmt Access nicht an, da das ja berechnete Felder/Zellen sind.

Somit kannst du dir natürlich die ganze Sache mit den Parametern sparen, in der Entwurfsansicht nur die Sprachen runterziehen, die du brauchst und dort dann bei Kriterien jeweils eine „1“ eingeben.

Du müsstest dann halt so viele Abfragen erstellen, wie du Kombinationen hast und für die jeweilige Abfrage hinterher im Formular eine Schaltfläche schaffen etc.

Tja, vielleicht besser als nix aber auch nicht so richtig befriedigend. Vielleicht kommst du oder jemand anderes im Forum noch auf eine bessere Lösung - dann aber bitte auf jeden Fall veröffentlichen ... das würd mich nämlich auch interessieren.

Bernd

Heinrich2k1
10.11.2001, 18:50
Hm, des is auch nicht das wahre.
Ich habe jetzt meine VBA-Lösung ein wenig optimiert. Ich poste sie heute Abend vieleicht, da ich sie jetzt nicht zur Verfügung habe.
Es sieht bei mir so aus, das ich 5 Comboboxen mit alle Möglichkeiten habe, die ich dann auswählen kann.

doktor
10.11.2001, 19:39
Hi

Ich habe sowas auf eine praktische weise gelöst.

person1
Sprache1-Englisch
Sprache2-Italienisch
Sprache3-Englisch und Italienisch
person2
Sprache1-Englisch


So kann man die Personen genau zuordnen
Mit Hilfe einer weiteren Tabelle könnte man die Zuordnung der zusammengehörenden Sprachen generieren, bei mir ist es aber nicht notwendig
doc

Heinrich2k1
15.11.2001, 22:56
Ähm, ich arbeite noch dran.

Zu meinem Vorredner: Es gibt mitlerweile relationale Datenbanken :o
Laut Normalformen dürfen keine Felder 2 mal vorkommen. Was ist, wenn einer 4 Sprachen kann ?? *g*