Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Mehrfachauswahl mit Formularabfrage

Begonnen von MrsProd, August 11, 2014, 15:56:43

⏪ vorheriges - nächstes ⏩

MrsProd

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


MaggieMay

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.
Freundliche Grüße
MaggieMay

MrsProd

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?


DF6GL

Hallo,

ich würde grundsätzlich erst die Frage stellen wollen, was für einen Sinn solche Mehrfachauswahlen mit mehrfachen Listenfeldern ergeben sollen...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MrsProd

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..  :-[

DF6GL

#5
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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MrsProd

#6
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


MrsProd

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.

DF6GL

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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MrsProd

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.

DF6GL

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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MrsProd

#11
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^^

DF6GL

Hallo,

lad mal Deine DB hier hoch...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MaggieMay

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.
Freundliche Grüße
MaggieMay

MrsProd

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ß.