Access-o-Mania

Access-Forum (Deutsch/German) => Access-Hilfe => Thema gestartet von: MrsProd am August 11, 2014, 15:56:43

Titel: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 11, 2014, 15:56:43
Hallo ihr lieben,

ich bin leider fast völliger Access-Neuling und stoße langsam an meine Grenzen..  ;D
Ich möchte eine Kontaktdatenbank erstellen und hab dafür meine Tabelle in Excel angelegt, die ich dann in Access importiert habe. Daraus hab ich dann meine Abfragen erstellen.
Als nächstes hab ich die Formulare erstellt - einmal ein Formular, in dem ich nach einzellnen Kritieren filter und noch ein andres, in dem ich eine Mehrfachauswahl treffen kann und danach filtern möchte. Letzters funktioniert leider nocht nicht richtig, da er einfach die ganze Tabelle ausspuckt und nicht nach meinen angegebenen Kriterien geflitert.

Ich hab mal ne Demo-Datenbank angelegt zur veranschaulichung!

https://www.dropbox.com/sh/9hy8ro6tq7u6vrt/AAAH_VDIueaqnz7nLz6ZzuTca (speichern und dann öffnen, funktioniert ansonsten anscheinend nicht)

Ich hoffe mir kann jemand helfen, weil ich langsam mit meinem Latein am Ende bin  :D

Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MaggieMay am August 13, 2014, 00:00:21
Hallo,

wie man Listenfelder mit Mehrfachauswahl ausliest, findest du in der Access.-Hilfe.
Dazu schaust du dir die Eigenschaft "ItemsSelected" und das Code-Beispiel dort an.

Für den Einsatz im SQL-Code setzt du die Werte zu einer komma-getrennten Liste
zusammen (inkl. Hochkommata, wo nötig) und fügst sie als Wertelliste einer IN-Klausel ein.

Hoffe, das hilft dir weiter.
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 13, 2014, 12:58:55
Hi Maggie,

leider finde ich nur das hier: http://support.microsoft.com/kb/827423/de und komm damit nicht wirklich zurecht, weil ich mehrere Listenfelder mit mehrfachauswahl in meinem Forumlar hab  :-[

Meinst du für die Werteliste, alle Eintragungen die vorkommen können in meinen verschiedenen Listenfelder?

Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: DF6GL am August 13, 2014, 13:12:46
Hallo,

ich würde grundsätzlich erst die Frage stellen wollen, was für einen Sinn solche Mehrfachauswahlen mit mehrfachen Listenfeldern ergeben sollen...
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 13, 2014, 13:52:11
Hallo:

Also mein Hintergrund ist folgender: ich hab mir eine Kontaktdatenbank erstellt, in der ein Kontakt eben verschiedene Kriteren hat, wie zum Beispiel Country, Company, CompanyCluster und co.
Jetzt möchte ich über ein Formular meine Kontakte nach bestimmten Kritieren filtern. Zum Beispiel soll es mir alle Kontakte die der Firma A und B angehören und gleichzeit aus dem Land Deutschland und Frankreich stammen und als Joblevel "Manager" haben.

Das ganze hab ich auch schon hinbekommen ohne Mehrfachauswahl mit Kombinationsfelder. Aber das mit den Listenfelder und Mehrfachauswahl bekomm ich einfach nicht gebacken.

Hier mal mein Code ohne Mehfachauswahl:
  Option Compare Database
Option Explicit


Private Sub Kombi_Click()
    Dim qdf         As DAO.QueryDef
    Dim strSQL      As String
    Dim strWHERE    As String
   
    'Abfrage loeschen falls vorhanden
    For Each qdf In CurrentDb.QueryDefs
        If qdf.Name Like "qryFilter" Then
            CurrentDb.QueryDefs.Delete "qryFilter"
            Exit For
        End If
    Next qdf
    strSQL = "SELECT *" _
            & " FROM Invitation_List_All"
    If Trim(Nz(Me.Company, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Company LIKE '" & Me.Company & "*'"
    End If
    If Trim(Nz(Me.Country, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Country LIKE '" & Me.Country & "*'"
    End If
    If Trim(Nz(Me.CompanyCluster, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND CompanyCluster LIKE '" & Me.CompanyCluster & "*'"
    End If
    If Trim(Nz(Me.Contactperson, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Contactperson LIKE '" & Me.Contactperson & "*'"
    End If
    If Trim(Nz(Me.Equipment, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Equipment LIKE '" & Me.Equipment & "*'"
    End If
     If Trim(Nz(Me.Technology, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Technology LIKE '" & Me.Technology & "*'"
    End If
    If Trim(Nz(Me.Joblevel, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Joblevel LIKE '" & Me.Joblevel & "*'"
    End If
    If Trim(Nz(Me.WorkingGroup, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND WorkingGroup LIKE '" & Me.WorkingGroup & "*'"
    End If
    If Trim(Nz(Me.Eventinvitation, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Eventinvitation LIKE '" & Me.Eventinvitation & "*'"
    End If
    If Trim(Nz(Me.Eventattendance, "")) <> "" Then
        strWHERE = strWHERE _
             & " AND Eventattendance LIKE '" & Me.Eventattendance & "*'"
    End If
    If strWHERE <> "" Then
        strSQL = strSQL & " WHERE" & Mid(strWHERE, 5)
    End If
    'Abfrage erstellen
    Set qdf = CurrentDb().CreateQueryDef("qryFilter")
    qdf.SQL = strSQL
    Set qdf = Nothing
    'Abfrage oeffnen
    DoCmd.OpenQuery "qryFilter", , acEdit
End Sub

Private Sub Zurueck_zu_Start_Formular_Click()
    'falls Aenderung noch nicht gespeichert, nachfragen
    If Me.Dirty Then
        Select Case MsgBox("Möchten Sie die Änderungen speichern?", vbYesNoCancel)
        Case vbYes
        'es wird gespeichert
        DoCmd.Close
        DoCmd.OpenForm "Startformular"
        Case vbNo
        'Die Aenderungen werden verworfen
        Me.Undo
        Cancel = True
        DoCmd.Close
        DoCmd.OpenForm "Startformular"
        Case vbCancel
        'es wird nicht gespeichert, Daten bleiben aber erhalten
        Cancel = True
        End Select
    'falls keine Aenderung bzw schon gespeichert, kehre zurueck
    Else
        DoCmd.Close acForm, Screen.ActiveForm.Name
        DoCmd.OpenForm "Startformular"
    End If
End Sub


allerdings funktioniert dabei mein Zurück zum startformular button nicht..  :-[
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: DF6GL am August 13, 2014, 14:39:31
Hallo,

ja, ich hab die Frage schon verstanden... Nur nicht, wozu neben der funktionierenden Kombifeld-Suche eine MEHRFACH-Auswahl pro Listenfeld vonnöten ist und welcher Sinn dahinter steckt...


PS: Weiterhin sehe ich die Methode, neue Abfrage-Objekte zu erstellen , denen einen SQL-String zuzuweisen und dann in  Abfrageansicht zu öffnen, alsnicht zielführend an.


WAS funktioniert beim Button-Klick nicht? "Dirty" alsFormular-Eigenschaft hat keinen Zusammenhang mit irgendeiner Manipulation an einer sonstigen Abfrage.
Zudem kommt mit das mehrfache Schliessen des akt. Forms etwas suspekt vor.
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 13, 2014, 14:45:30
Hallo,

also nebenher benötige ich das eig. nicht.. ich möchte die Kombifelder durch Listenfelder mit Mehfachauswahl ersetzen, weil mir erst im Nachhinein aufgefallen ist, dass ne Mehfachauswahl besser wäre.
Damit ich also mehrere Firmen und Länder gleichzeitig auswählen kann. 

Ich hoffe, ich konnte die Unklarheiten beseitigen  ;D

Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 19, 2014, 10:47:22
Hallo,

wie würdest du denn das ganze lösen? Ich hab wie gesagt leider absolut keinen Plan von der VBA Programmierung und hab mich nur mit irgendwelchen Tutorials zu meiner Lösung durchgekämpft  :P

Mittlerweile hab ich meinen Button und das Startformular und die Einzelnen-Filtern-Formular entfernt.. ich möchte das ganze über das eine Formular mit Mehrfachauswahl machen.
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: DF6GL am August 19, 2014, 11:46:16
Hallo,

ja, das ist alles klar...

Nur das(die Logik, die dahinter steckt):

Zitatweil mir erst im Nachhinein aufgefallen ist, dass ne Mehrfachauswahl besser wäre.

versteh ich nicht.

Was erwartest Du denn für Ergebnisse, wenn Du in z. B. 3 Listenfeldern (für die entspr. Spalten) je eine Mehrfachauswahl machst und danach filterst??


Soll da eine "UND" oder eine "Oder" -Verknüpfung benutzt werden; wie stellst Du Dir das vor?

Prinzipiell  würde das so gehen:

Jedes Listenfeld per VBA und mit einer Schleife  nach seinen selektierten Einträgen (Itemsselected) durchsuchen und mit den gefundenen Werten eine SQL-IN-Konstruktion als Where-Condition  zusammensetzen. Diesen Where-Condition-String dann als Where-Condition-Parameter (als Filter) in der OpenForm-Methode zum Öffnen des Forms heranziehen.


Schau mal hier nach den Beispielen, die sich allgemein und im Besonderen mit "Suchen" beschäftigen:

http://www.dbwiki.net/wiki/Access_Beispieldatenbanken
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 19, 2014, 12:47:59
Ich hatte zuerst eine normale auswahl über kombinationsfelder.. da konnte ich jeweils nur eine Firma aus dem Land XY ausspucken lassen.. jetzt möchte ich mir aber gleich mehrere Firmen aus dem Land XY und Land XYZ anzeigen lassen.

Meine Ausgabe soll so aussehen, wenn ich folgende Filter eingebe:
Listenfeld Company: Firma A, Firma C, Firma E
Listenfeld Country: Land XY, Land Z,
usw..
dann soll meine Ausgabe so aussehen, dass jeder Eintrag der Firma A und Firma B und Firma C enthält gleichzeitig aus dem Land XY und Z kommt, ausgespuckt wird.

Ich hab im Anhang mal ein Beispiel gepackt.

Meine Ausgabe funktioniert leider nur nicht, es spuckt mir immer alle vorhandenen Einträge in meiner Tabelle aus.
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: DF6GL am August 19, 2014, 14:09:15
Hallo,

ok, in diesem Fall heißt das Stichwort: Abhängige Kombifelder, bzw.abhängige Listenfelder.  Zudem geht es natürlich nicht, nur den Listenfeldnamen als Filterkriterium zu benutzen. Das abhängige (zweite)  Listenfeld ("Company") muss erst mit den Firmen gefüllt werden, die in den Ländern angesiedelt sind, die der Auswahl des ersten Listenfeldes ("Country") entsprechen. Erst dann kann (soll) die Filterung eines Formulares mit den ausgewählten Firmen erfolgen.


Im angegebenen Link (www.dbwiki.net)  findest Du ein Beispiel für das Suchen mit abhängigen Kombifeldern. Das müsste an Listenfelder angepasst werden.
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 19, 2014, 14:47:43
Jetzt versteh ich leider nicht mehr so ganz, was du meinst und was ich machen muss.  ;D
ich arbeite mich grad durch die Suche-Beispieldatenbank, aber leider versteh ich nicht so ganz, wie ich mehrere Listenfelder mit Mehrfachauswahl verknüpfen kann.
Meine Mehfachauswahl kann ich mit dem hier auslesen:

Private Sub Country_Click()
Dim I As Long
    For I = 1 To Me!Country.ListCount
    Me!Country.Selected(I) = False
  Next I
End Sub


das würde ich jetzt für jedes meiner Felder machen.. und dann hab ich leider keine ahnung, wie ich weiter vorgehen soll?

Tut mir leid für mein Unwissen, aber als kompletter VBA Neuling fällts mir leider sehr schwer, das ganze zu verstehen  :-[

Edit: okay, ich gebs glaub ich langsam auf, ich bekomm das einfach nicht hin^^
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: DF6GL am August 19, 2014, 15:49:27
Hallo,

lad mal Deine DB hier hoch...
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MaggieMay am August 19, 2014, 21:57:53
Hi,
ZitatMeine Mehfachauswahl kann ich mit dem hier auslesen:
Nein, damit wird die Auswahl gelöscht - sollte eigentlich nicht so schwer zu verstehen sein.

Ein Beispiel zum Auslesen der Mehrfachauswahl findest du in der Access-Hilfe.
So könnte das bspw. aussehen:Dim I As Long, strCountryList As String
    For Each I In Me!Country.ItemsSelected
        strCountryList = strCountryList & "," & Me!Country.ItemData(i)
        ' Auswahl entfernen - wenn gewünscht
        Me!Country.Selected(I) = False
    Next I
    ' 1. Komma entfernen
    strCountryList = Mid(strCountryList,2)
Wenn der Rückgabewert des Listenfeldes vom Typ Text ist, müssen die Werte in Hochkommata gesetzt werden.

Die so generierte Werteliste kann anschließend in einer dynamisch erzeugten Abfrage genutzt werden.
Aber das sagte ich ja alles schon...

Falls weitere Hilfe benötigt wird, bitte konkret nachfragen.
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 19, 2014, 22:32:41
Für mich ist's leider schon schwer zu verstehen.   :-[
Ich versuchs ja auch wirklich zu verstehen und zu erlernen, aber dafür fehlt mir wohl einfach einiges an Hintergrundwissen, wie das ganze von Grund auf funktioniert.

Anbei mal meine Datenbank mit der Tabelle gezippt, da ansonsten zu groß.
Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: DF6GL am August 20, 2014, 09:26:39
Hallo,

ich denke, Du musst Dir erst mal im Klaren darüber werden, WAS und vor allem WIE gefiltert werden soll, in Anbetracht der Datenzusammenhänge..

Anbei die DB mit zum Einen der Filterung der Companys in Abhängigkeit der Countries, zum Anderen eine zusammenhanglose Filterung nach den 3 aktiven Listenfeldern.  Die ausgeblendeten Listenfelder habe ich außen vor gelassen, die kannst Du selber nach dem gezeigten Prinzip  erweitern, sofern das wirklich nötig sein sollte...


Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 20, 2014, 10:59:08
Viiielen lieben Dank DF6GL für deine Hilfe, ohne dich wär ich wohl aufgeschmissen!  :)

Ich hab die Tabelle jetzt mal mit representativeren Daten gefüllt, dann wirds evtl etwas einfacher zu verstehen, was ich genau möchte.
Der Hintergrund meiner Datenbank ist folgender: ich möchte verschiedene Serieneinladungen zu verschiedenen Events versenden und meine Datenbank soll mir dazu dienen, die richtigen Leute zu finden für das passende Event. Daher sollte mein gefilteter Output in einer Tabelle (oder in einer Abfrage - was wäre dafür besser geeignet?) erfolgen, die ich dann in Word (oder einem andren Programm) als Datenquelle für einen Serienbrief nutzen kann.
Natürlich passt nicht jeder Kontakt zu jedem Event, daher die Mehrfachfilterung. Wenn ich z.b. zu einem Event einlade, das in Germany stattfindet, möchte ich jeweils nur Leute aus dem Näheren Umfeld (also Germany, Austria, Netherlands, Sweden usw.) einladen.
Dazu ist das evtl ein Event, das nur Leute interessiert die mit ein paar bestimmten Technologien zu tun haben oder einem bestimmten CompanyCluster oder einer WorkingGroup zugeordnet sind. Oder ich möchte speziell nur Leuter einiger Firmen die dem oberen und mittleren Management angehören und schon an vergangenen Events teilgenommen haben. Daher meine vielen Kriterien nach denen ich filtern möchte.

Jetzt ist bei mir auch der Groschen gefallen, was der genauer Unterschied zwischen einer Abhängigen und Unabhängigen Filterung ist. DANKE! 8)

Jetzt hab ich noch eine Frage: und zwar hab ich bei meinem CompanyCluster(und auch noch bei andren Feldern) ja folgenden Input:
End Customer, Project Management Consultant, FEED Contractor, EPC, OEM, System Integrator, Manufacture, Other
Einem Kontakt wird aber jetzt mehr als nur ein Kriterium zugeordnet, also z.b. in meiner Tabelle EPC, OEM, Other..
wie kann ich aber in meinem Formular vor der Filterung nur die oben genannten anzeigen lassen, ohne die mehrfachnennungen? Also damit wenn ich bei der Filterung EPC angebe, aber auch alle andren aufgerufen werden, die noch andere Kritieren haben. Sollte in der Demo-Datenbank genauer ersichtlich warden, was ich meine :)


Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MaggieMay am August 20, 2014, 17:10:15
Hallo,
Zitat von: MrsProd am August 20, 2014, 10:59:08
oder in einer Abfrage - was wäre dafür besser geeignet?
eine Abfrage sollte genügen.
Zitatdie ich dann in Word (oder einem andren Programm) als Datenquelle für einen Serienbrief nutzen kann
Warum kannst du dafür keinen Access-Bericht einetzen?
Zitatwie kann ich aber in meinem Formular vor der Filterung nur die oben genannten anzeigen lassen, ohne die mehrfachnennungen?
Das sollte sich durch den Zusatz "Select DISTINCT ..." in der Abfrage bewirken lassen.


Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 21, 2014, 11:13:57
Danke MaggieMay, mit select distinct funktionierts super!  :)

Wie kann ich denn meinen Output dann in einer Abfrage anzeigen lassen?
Ich hab jetzt folgenden Code verwendet, aber da spuckts mir leider alle Einträge meiner Tabelle aus.

DoCmd.OpenQuery "qryFilter", , acEdit

...und nochmal mein Problem genauer beschrieben mit den Mehrfachnennungen in meinen Listenfeldern. (siehe Bild)
am Beispiel Event Invitation: da werden jetzt alle aufgelistet, die so in meiner Tabelle vorkommen, also
Hanover Fair 14
R-Community 14
R-Community 14, Hanover Fair 14

ich möchte aber gern nur die zwei einzelnen anzeigen lassen, damit die Liste kleiner wird.  Es soll aber wenn ich R-Community auswähle in meiner Ausgabe alle anzeigen, bei denen R-Community vorkommt, also auch die, die noch bei der Hanover Fair 14 waren. Kann man das iwie programmieren?
So ist das ganze auch bei allen andren Feldern außer bei Firma und Country.


Wie setz ich denn alle meine Felder in Abhängigkeit von meiner Country auswahl?
Private Sub btnCompany_Click()
Dim Itm, strKrit As String

    For Each Itm In Me!lstCountry.ItemsSelected
        strKrit = strKrit & "','" & Me!lstCountry.Column(0, Itm)
    Next Itm

strKrit = Mid(strKrit, 3)

If Len(strKrit) Then strKrit = "Select distinct company from Invitation_list where country in (" & strKrit & "')"
Me!lstCompany.RowSource = strKrit


End Sub


Hab jetzt paar Möglichkeiten getestet die abhängige Filterung zu erweitern, die sich für mich als sinnvoll ergeben haben, aber hat leider nicht geklappt.. :o

Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: DF6GL am August 21, 2014, 13:32:37
Hallo,

also ich meine, Du solltest Dein Datenbank-Konzept nochmal genau durchdenken...

Deine Such-Methodik und überhaupt die Daten-Beziehungslogik erscheint nicht plausibel und datenbank-konform zu sein.


ZitatEs soll aber wenn ich R-Community auswähle in meiner Ausgabe alle anzeigen, bei denen R-Community vorkommt, also auch die, die noch bei der Hanover Fair 14 waren. Kann man das iwie programmieren?

Es ist ein Verstoß gegen die Daten-Normalisierung, in einem einzigen Feld mehrere Werte aufzulisten (und bringt daher Ärger und Verdruss).  Dafür ist eine weitere Tabelle herzunehmen, die für einen bestimmten Datensatz (Firma) die dazugehörenden Einladungen (eine pro Datensatz) zuordnet.


Um im gegenwärtigen Zustand die gewünschte Filterung zu erhalten, darf dann nicht mit der IN-Where-Condition gearbeitet werden, sondern es muss ein "Like"-Vergleich angestellt werden, im Prinzip beispielhaft etwa so:

... Where Invitation like '*" & Me!lstInvitation.Column(0,2) & "*'  Or Invitation like '*" & Me!lstInvitation.Column(0,3) & "*'"

Wobei die "2" und "3" die Itemsselected-Werte des entspr. Listenfeldes sein sollen.



ZitatWie setz ich denn alle meine Felder in Abhängigkeit von meiner Country auswahl?

Indem Du die Listenfelder mit der entspr. SQL in deren Eigenschaft "Rowsource" belegst:

.
.
If Len(strKrit) Then strKrit = "Select distinct Tabellenfeldname from Invitation_list where country in (" & strKrit & "')"
Me!lstListenfeld.RowSource = strKrit


Titel: Re: Mehrfachauswahl mit Formularabfrage
Beitrag von: MrsProd am August 21, 2014, 15:31:40
Zitatalso ich meine, Du solltest Dein Datenbank-Konzept nochmal genau durchdenken...

Deine Such-Methodik und überhaupt die Daten-Beziehungslogik erscheint nicht plausibel und datenbank-konform zu sein.

Wie sollte ich das denn am besten lösen? Hab mir das ganze einfach iwie zusammengereimt und drauf los programmiert, ohne große Gedanken dahinter. Bis lang macht es ja fast komplett alles, was ich möchte :)

Das abhängige filtern hab ich hinbekommen & funktioniert wunderbar, DANKE! :)

Jetzt fehlt mir nur noch die Ausgabe in einer Abfrage anstatt in der frm_Invitation_list, aber da gibt er einfach alle Werte aus..  :o


ich versteh leider nicht so ganz, wie das mit der like verknüpfung geht.. wo muss ich das jetzt beispielhaft hier einsetzen, bzw umschreiben?

Dim Itm, strKrit As String, strWC As String

    For Each Itm In Me!lstCountry.ItemsSelected
        strKrit = strKrit & "','" & Me!lstCountry.Column(0, Itm)
    Next Itm

strKrit = Mid(strKrit, 3)
If Len(strKrit) Then strWC = " And Country In (" & strKrit & "')"

strKrit = ""