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
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.
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?
Hallo,
ich würde grundsätzlich erst die Frage stellen wollen, was für einen Sinn solche Mehrfachauswahlen mit mehrfachen Listenfeldern ergeben sollen...
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.. :-[
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.
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
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.
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
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.
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.
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^^
Hallo,
lad mal Deine DB hier hoch...
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.
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ß.
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...
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 :)
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.
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
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
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 = ""