Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: noob3k am Februar 14, 2011, 17:29:13

Titel: Mehrere Tabellen filtern?!?
Beitrag von: noob3k am Februar 14, 2011, 17:29:13
Aloha mal wieder,

meine Datenbank (Access 2007) ist mittlerweile schon auf einige Tabellen und Formulare angewachsen, aber ich stehe wieder mal vor einem Problem zu dem ich keinen Rat finde. Vermutlich ist es ein Denkfehler, drum muss ich mich an euch wenden :)

Ich habe eine Tabelle in der im Prinizip nur Vor- und Nachname stehen. Sämtliche andere Tabellen sind zu dieser verknüpft.
Ich habe also ein HF mit den Namen und 5 UFo mit anderen Daten (Adressen, Inventar, usw...).

Nun würde ich gerne eine umfangreiche Suche basteln mit der ich nach sämtlichen Daten Filtern kann. Da zur späteren Nutzung die Runtime angedacht ist muss ich mich um die Filter also selber kümmern. Werden dann im Endeffekt zahlreiche Text- und Häkchenfelder zum filtern.

Die einfachen Filter für das HF mit den Namen bekomme ich noch hin. Aber wie kombiniere ich dann die Filter für sämltiche Tabellen?

Also als Bsp. ich Suche nach dem Namen Peter (Tabelle Mitarbeiter) und als Kriterium soll ein Häkchenfeld "Handy" = JA sein (Tabelle Inventar).  Wie das als SQL aussieht ist mir an sich klar. Nur ich weiß nicht wie ich den SQL string in VBA zusammensetze.

Ich habe mir das Bsp. AccSampleSuchen angeguckt. Nur nach dem Namen filtern funktioniert. Ich bekomme bei mir die verschiedenen Tabellen
aber nicht in einen String zusammengesetzt.

Hoffe das war einigermaßen verständlich :)

Danke ....

Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: database am Februar 15, 2011, 11:08:58
Hallo,

das Zauberwort für dein Vorhaben heißt 'JOIN'.
Tabellen, die bereits im Datenmodell in Beziehung gesetz wurden lassen sich auf diese Weise in einer Abfrage (auch im SQL-String) leicht miteinander verbinden.
Ein einfaches Beispiel wäre die Verbindung zwischen Firmen und Kontaktpersonen.
Um alle Kontaktpersonen aus 2 in Beziehung stehenden Tabellen zu fischen (tblFirmen und tblKontaktpersonen) wäre folgende:


SELECT k.Nachname, k.Telefon, k.Mail FROM tblFirmen f
   INNER JOIN tblKontaktpersonen k
       ON k.FirmenID_FK = f.FirmenID
WHERE f.Firmenname= 'Microsoft'


In dem Fall stehen die Tabellen - wie erwartet - über Primär- und Fremdschlüssel in Beziehung.
Die Beziehung wird durch die Schlüsselworte 'INNER JOIN' angezeigt und ist durch die Feldverknüpfung hinter 'ON' definiert.
Das Abfrageergebnis würde für jede gefundene Kontaktperson der Firma 'Microsoft' eine Zeile (einen Datensatz) liefern.

Um den SQL-String in eine VBA-veständliche Schreibweise zu bringen benötigst du z.B. eine String-Variable:

Dim strSQL as String
strSQL = "SELECT k.Nachname, .... WHERE f.Firmenname='" & Me!Firmenname & "'"


Um den String zusammen zu basteln, wenn der Firmanname in einem Formularfeld namens 'Firmenname' steht.

Der so erstellte SQL-String kann dann in VERSCHIEDENSTER Weise eingesetzt werden - meistens dazu ein Recordset mit dem Ergebnis der Abfrage zu befüllen:


Dim rst As DAO.Recordset
Dim strSQL As String

   strSQL = "SELECT k.Nachname, .... WHERE f.Firmenname='" & Me!Firmenname & "'"

   Set rst = CurrentDB.OpenRecordset(strSQL)


Das auf diese Weise gewonnen Recordset kann dann wiederum für verschiedene Zwecke eingesetzt werden.

Um nun die Syntax von SQL-Befehlen zu lernen stehen verschiedene einschlägige Werke zur Verfügung - online kann ich dir empfehlen:

http://www.sql-und-xml.de/sql-tutorial/ (http://www.sql-und-xml.de/sql-tutorial/)
und
http://www.w3schools.com/sql/default.asp (http://www.w3schools.com/sql/default.asp)

ZitatNun würde ich gerne eine umfangreiche Suche basteln mit der ich nach sämtlichen Daten Filtern kann
Setzt in erster Linie ein richtig konfiguriertes und normalisiertes Datenmodell voraus.
Sollte es daran kranken empfehle ich die Links #1 und 2# in der Signatur von DF6GL eingehend durchzuarbeiten und etwaige
anstehende Änderungen an deinen Tabellen gemäß den daraus gewonnen Erkenntnissen vorzunehmen.

HTH
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: noob3k am März 01, 2011, 15:33:59
Aloha,

danke für die ausführliche Antwort!!!   

Ich habe nur irgendwie nach wie vor einen kleinen Denkfehler bzw. Hänger in der Denkweise. 
Wie schaffe ich es, dass der Teil mit dem SELECT FROM nur auf die Tabellen angewendet wird die ich gerade benötige?   Also zb dass Tabelle Inventar nur in den sqlString gehangen wird wenn ich in der Suche irgendwas aus der der Tabelle als Kriterium auswähle.

Im Endeffekt brauche/möchte ich eine umfassende Suche mit ca 15-20 Kriterien. Also Textfelder für Namen, Adressen usw und ein paar Häckchenfelder.  Sämtliche Daten kommen aber jeweils aus verschiedenen Tabellen. Wird der sqlString dann nur für diese Tabellen zusammengesetzt aus denen ich was benötige (zB aus den Tabellen Adressen, Inventar, Kunden) oder setze ich den String immer komplett aus allen Tabellen zusammen und nur die Kriterien werden dynamisch angehangen?  Wäre es denn auch ein Weg eine fertige Abfrage über alle Tabellen zu erstellen und diese als Grundlage für das Suchformular zu nehmen? Wäre das in irgendeiner Form sinnvoll oder was bringt diese Variante für Nachteile mit sich?

So eine zweite Frage hat sich mir dann auch noch gestellt. Vermutlich eine einfache Lösung aber ich steh grad auf dem Schlauch. Wie suche/filter ich denn Daten aus einer Zwischentabelle?

Also eine n:m Beziehung.... zu einem Mitarbeiter gehören mehrere Adressen. Die Adressen habe ich in einer seperaten Tabelle vorgegeben. In der Zwischentabelle werden dann nur die ID's von Mitarbeiter und den Adressen gespeichert. Wenn ich die Suche nutze sollten aber wenn möglich die Adressen und nicht nur deren ID's ausgegeben werden.

Ach und noch was...

Wenn ich hierbei die oben genannte Variante nutze, eine Abfrage über alle Tabellen zu erstellen, dann tauchen natürlich Mitarbeiter mehrfach auf, nur mit verschiedenen Adressen bzw. für jede Adresse ein mal. Scheitert es hier schon an dem Aufbau meiner DB oder gibt es dort noch einen Trick den ich übersehen habe?  Oder ist das einfach so? Weil an sich hoffe ich, dass der Aufbau mittlerweile ganz in Ordnung sein müsste.

Ich hoffe irgendjemand versteht worauf ich hinaus will und kann mir helfen :)

vielen vielen Dank
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: DF6GL am März 03, 2011, 10:23:34
Hallo,

am Besten experimentierst Du ein bisschen herum (oder studierst ein Tutorial):

Geh in den Abfrageentwurf, füge alle Tabellen hinzu, aus denen Du Daten brauchst, ziehe diese Felder in die Abfragespalten einschließlich der Felder, die durch einen Kriteriumswert gefiltert werden sollen. Die Kriterienwerte schreibst Du ins Feld "Kriterium" bei der entspr. Spalte. Im Fenster Ansicht/SQL-Ansicht sieht Du dann den SQL-String, der diese Abfrage darstellt.

Eine "Zwischentabelle" zu filtern ist auch nicht anderes als eine (inner join) Verknüpfung über 3 Tabellen in der Abfrage.

"Mehrere Mitarbeiter":   das ist auch richtig so, wenn das Kriterium auf ein Feld in der n-Tabelle wirkt. Die Frage stellt sich hier, was Du nun als Ergebnis sehen willst.
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: noob3k am März 03, 2011, 23:10:20
Hi,

vielen Dank mal wieder.

Wie die Abfragen im Generator zusammengebastelt werden und wie diese aussehen ist mir ja bereits klar. Mein Hauptproblem liegt darin, dass ich nicht weiß was ich für das Suchformular als Grundlage nehmen soll.  Im Prinzip brauche ich ein Suchformular in dem ich nach allem Möglichen suchen kann.
Wenn ich eine statische Abfrage mit allen Tabellen erstelle komme ich locker auf 200 oder mehr Felder. Ist das zu viel oder ist das normal?
Deshalb war die Überlegung die Abfrage jeweils dynamisch zu generieren damit ich nur die Felder angezeigt bekomme die ich wirklich benötige. Also an Hand der Kriterien die der Nutzer in der Suche eingibt. Oder ist das im Endeffekt die schlechtere Lösung, rein Leistungs- bzw. Geschwindigkeitstechnisch?
Welche Variante macht mehr Sinn????

Wie könnte ich denn die statische Abfrage über alle Tabellen anhand meiner gesuchten Kriterien immer so ändern, dass nur die Felder angezeigt werden die ich sehen will.  Also zB der Nutzer möchte nur alle Mitarbeiter die Peter heißen und deren Handynummern.   Die Suche an sich bekomm ich ja hin. Nur ich möchte dann nicht den Kompletten Datensatz mit Adressen und Kunden usw usw sondern nur den Namen und die Tel.nummer.    Oder ist das totaler Blödsinn und ich bin auf dem falschen Weg?

Problem ist halt, dass ich keine festen Abfragen vorgeben kann weil der Nutzer hinterher nach x-beliebigen Variationen filtern möchte.

Weiß grad nicht mehr recht weiter.....hoffe jmd hat Rat

Gruß
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: imp666 am März 04, 2011, 09:22:44
Wie groß sind denn die Datenmengen in den Tabellen?
Was sind für Beziehungen zwischen den Tabellen? (Also hat jeder nur eine Handynummer oder beliebig viele?)
Lässt sich das Problem bei dir nicht mit Unterformular(en) lösen? (man kann Unterformulare ja dynamisch auswechseln)
Oder mit Kombinationsfeldern? (auch hier lässt sich die "RowSource", also die darin angezeigten Daten, dynamisch ändern)

Beispiel für ein dynamisch geändertes Unterformular (Namens "ufChange"):

    Me.Painting = False
    Me!ufChange.ControlType = acSubform
    ' erfahrungsgemäss ist es besser erst alles auf Leerstring zusetzen
    Me!ufChange.SourceObject = ""
    Me!ufChange.LinkChildFields = ""
    Me!ufChange.LinkMasterFields = ""
    ' dann werden die Feldverknüpfungen gesetzt (wenn diese in allen deiner Unterformulare gleich heissen kannst du das sogar weglassen)
    Me!ufChange.LinkChildFields = "childid"
    Me!ufChange.LinkMasterFields = "masterid"
    ' und nun zu guter letzt setzen wir das neue Unterformular ein
    Me!ufChange.SourceObject = "mein_unterformular"
    Me.Painting = True


Beispiel für ein dynamisch geändertes Kombinationsfeld (das funktioniert auch in Endlosformularen):

    Me!mein_feld.RowSource="SELECT handynr FROM inventar WHERE inventar.nutzerid=" & Me!nutzer_nutzerid
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: DF6GL am März 05, 2011, 09:41:45
Hallo,

"umfangreiches Suchformular"  bedeutet auch "umfangreiche" Programmierung:


http://www.dbwiki.de/upload/AccSampleSearchPopUp2.zip
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: noob3k am März 16, 2011, 15:53:32
Aloha,

ich danke euch bis hierhin erstmal für die Antworten.

Ich habe aber eine neue dumme Frage in der Hoffnung, dass ihr nen cleveren Rat für mich habt.

Und zwar sollen die Suchergebnisse in Excel exportiert werden. Deshalb bringt mir das mit den Unterformularen usw. leider nichts. Das wäre zwar hübscher aber es soll halt später in Excel weiter verwendet werden. Warum auch immer :)

Deshalb hab ich mich entschieden, doch eine Abfrage über all meine benötigten Spalten zu erstellen und auf diese dann meine Filterkriterien anzuwenden. Bisher funktioniert das auch ganz gut. Ob das eine gute/elegante Lösung ist kann ich nicht einschätzen, dass müsst ihr mir sagen.

So nun zu meinem Problem. Ich habe ein paar 1:n-Beziehungen also zB ein Mitarbeiter hat mehrere Adressen. Nun taucht natürlich in der Datenblattansicht meiner Abfrage ein Mitarbeiter für all seine Adressen mehrfach auf.  Kann ich das irgendwie umgehen und den Datensatz pro Mitarbeiter auf eine Zeile reduzieren? Ich dachte daran, dass die weiteren Adressen vlt. in Spalten/Felder an den Datensatz angehangen werden.  Also wenn er mehr als eine Adresse hat, dass weitere Felder angelegt werden.  Ist das möglich?

Oder habt ihr einen anderen Ratschlag wie ich das regeln könnte?

Mal wieder vielen Dank

Gruß
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: noob3k am März 22, 2011, 19:39:51
Ich muss leider nochmal nachfragen.....

hab mich an der Sache richtig festgefahren und es geht nicht mehr vorwärts, weil ich nichts richtiges dazu finde. Will aber auch nicht extra nen neuen Thread öffnen.

Also ich hänge nach wie vor an der Stelle, dass ich über eine Abfrage meine kompletten Tabellen als ein Datenblatt anzeigen lasse (für den Export nach Excel).  Dummerweise hab ich aber immernoch keinen Weg gefunden die 1:n- Beziehungen in einen Datensatz hintereinander zusammen zu fassen.

Ich habe im Forum dieses gefunden  http://www.access-o-mania.de/forum/index.php?topic=12917.0 .... das geht auch schon in die richtige Richtung. Aber statt die Daten in ein Feld zusammen zu fassen will/müsste ich sie in weiteren Feldern anhängen.

Ist das denn irgendwie möglich dynamisch Felder zu erstellen? Also wenn zb mehr als eine Adresse vorhanden ist, dass die anderen dynamisch angehangen werden???
Also so in diesem Stil:         ID | Nachname | Adresse | Adresse2

Oder habt ihr noch eine ganz andere Idee wie ich die Daten aufbereiten kann für den Export nach Excel ? Soll halt eine Gesamtübersicht sein.

Ich hoffe irgendjemand kann mir helfen.

Viele Grüße
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: DF6GL am März 22, 2011, 21:14:02
Hallo,

wenn Du partout eine "horizontale Liste" von Datensatzwerten in verschiedenen Zellen  erstellen willst, dann wird Dir wohl nichts anderes übrig bleiben, als das Ganze über Excel-Automation  und mit Hilfe eines Recordsets (--> "SQLListe") so zu bewerkstelligen, dass die einzelnen Werte nicht als String zusammengesetzt , sondern in die einzelnen Excel-Zellen übertragen werden.

"Soll halt eine Gesamtübersicht sein."   und dafür brauchst Du Excel?
Titel: Re: Mehrere Tabellen filtern?!?
Beitrag von: noob3k am März 22, 2011, 21:34:12
Hi,

ich brauch Excel weil der spätere Nutzer der DB das gern so hätte. Weil der dann in Excel mit den Daten weiter arbeiten will. Sicher auch nur für Sachen die in Access genau so gut umzusetzen wären. Wahrscheinlich weil sie das schon kennen/können , keine Ahnung. Es wird halt so gewünscht.

Scheint also nicht ganz so einfach zu sein wie es scheint. Hatte gehofft, dass man in VBA was basteln kann um die Felder dymanisch anzuhängen oder sowas?!?!

Habt ihr denn eine andere Idee??

vielen vielen Dank