Supportnet / Forum / Datenbanken
Form nach mehreren Parametern filtern
Frage
Da ich die Originaldaten nicht veröffentlichen kann, hier eine kleine Abstrahierung meines Problems:
Ich habe eine Tabelle1 :
ID | Postleitzahlt | Name
1 | 12345 | Mayer
2 | 34251 | Müller
3 | 12345 | Köhler
4 | 27590 | Bäcker
5 | 34251 | Mustermann
und eine Tabelle2 :
ID | Werbeaktion | Aktionsreichweite
1 | Aktion1 | 12345
2 | Neueröffnung | 12345;34251;27590
3 | Rabattaktion | 27590;12345
In FormA kann eine Werbeaktion aus Tabelle1 in einem Dropdownfeld ausgewählt werden. Ein Button in FormA soll nun FormB aufrufen und ihr die zugehörigen Postleitzahlen übergeben, so dass in FormB nur die Kunden mit einer entsprechenden Postleitzahl angezeigt werden.
Für "Rabattaktion" müsste die Tabelle in FormB also wie folgt aussehen:
ID | Postleitzahlt | Name
1 | 12345 | Mayer
3 | 12345 | Köhler
4 | 27590 | Bäcker
Das ganze unter Access 2007
Antwort 1 von lorf55
Hallo Floriel,
also mal grob skizziert:
Eine Variante wäre, mit dem Formular-Filter zu arbeiten. Dabei würde man in FormB
einen Button zum Formularöffnen in FormA einfügen.
Eine andere Variante wäre, indem du eine Befehlsschaltfläche für Formularoperationen -> Formularöffnen in FormA einfügst und dabei die Abfrage oder die Tabelle für FormA verwendest und denn auswählst "Das Formular öffnen und bestimmte Daten suchen und anzeigen" und denn wird ein passendes Klick-Ereignis in FormA eingefügt.
Am Einfachsten ist wohl Variante 2 für dich.
Gruß
lorf
also mal grob skizziert:
Eine Variante wäre, mit dem Formular-Filter zu arbeiten. Dabei würde man in FormB
- unter Eigenschaften - Daten - Datenherkunft denselben Eintrag wie in FormA machen und
unter Filter ="Postleitzahl="&Formulare!FormA!Postleitzahl und
unter Filter zulassen Ja eintragen
einen Button zum Formularöffnen in FormA einfügen.
Eine andere Variante wäre, indem du eine Befehlsschaltfläche für Formularoperationen -> Formularöffnen in FormA einfügst und dabei die Abfrage oder die Tabelle für FormA verwendest und denn auswählst "Das Formular öffnen und bestimmte Daten suchen und anzeigen" und denn wird ein passendes Klick-Ereignis in FormA eingefügt.
Am Einfachsten ist wohl Variante 2 für dich.
Gruß
lorf
Antwort 2 von Floriel
Ein Problem bei beiden Varianten (wenn ich das richtig sehe) ist die Form in der die Postleitzahlen in Tabelle2 gespeichert sind: ein String bestehend aus ein oderer mehreren Postleitzahlen, die durch Semikolon getrennt sind.
Antwort 3 von lorf55
Hallo Floriel,
diesen String der Postleitzahlen musst du umwandeln in die WHERE-Klausel einer SQL-Abfrage und denn als Filter eintragen, d.h. aus 12345;34251;27590
wird der Filter:
((Postleitzahl='12345') OR (Postleitzahl='34251') OR (Postleitzahl='27590'))
bzw. die Anweisung im Klickereignis bei Variante 2:
Falls die PLZ nicht einzeln vorliegen, muss man die natürlich noch aus dem String auslösen, aber ich glaube das kannst du.
Oder?
Gruß
lorf
diesen String der Postleitzahlen musst du umwandeln in die WHERE-Klausel einer SQL-Abfrage und denn als Filter eintragen, d.h. aus 12345;34251;27590
wird der Filter:
((Postleitzahl='12345') OR (Postleitzahl='34251') OR (Postleitzahl='27590'))
bzw. die Anweisung im Klickereignis bei Variante 2:
stLinkCriteria = "[Postleitzahl]=" & "'" & Me![PLZ1] & "') OR ([Postleitzahl]=" & "'" & Me![PLZ2] & "') OR ([Postleitzahl]=" & "'" & Me![PLZ3] & "')"
DoCmd.OpenForm stDocName, , , stLinkCriteriaFalls die PLZ nicht einzeln vorliegen, muss man die natürlich noch aus dem String auslösen, aber ich glaube das kannst du.
Oder?
Gruß
lorf
Antwort 4 von lorf
Falls dir das String auflösen nicht so leicht von der Hand geht,
habe ich hier eine Variante, wie man es auch machen kann:
Dem s-String musst du denn noch deinen String aus FormA
übergeben.
Gruß
lorf
habe ich hier eine Variante, wie man es auch machen kann:
Dim s As String
Dim is1 As Long
Dim stLinkCriteria As String
's = "12345;34251;27590"
's = "12345;34251"
's = "12345"
start = 1
stLinkCriteria = ""
Do
is1 = InStr(start, s, ";")
If is1 = 0 Then is1 = Len(s) + 1
If start > 1 Then stLinkCriteria = stLinkCriteria & " OR "
stLinkCriteria = stLinkCriteria & "([Postleitzahl]=" & "'" & Mid$(s,
start, is1 - start) & "')"
start = is1 + 1
Loop While (is1 < Len(s))
DoCmd.OpenForm stDocName, , , stLinkCriteriaDem s-String musst du denn noch deinen String aus FormA
übergeben.
Gruß
lorf
Antwort 5 von Floriel
So, ich habs jetzt ganz anderst gelöst, für alle die ein änliches Problem haben:
Zuerst hab ich die n:m Verknüfung "Aktionsreichweite" normalisiert:
Tabelle1 :
ID | Postleitzahl | Name
1 | 12345 | Mayer
2 | 34251 | Müller
3 | 12345 | Köhler
4 | 27590 | Bäcker
5 | 34251 | Mustermann
Tabelle2 :
ID | Werbeaktion
1 | Aktion1
2 | Neueröffnung
3 | Rabattaktion
Tabelle3:
ID | Werbeaktion | Postleitzahl
1 | Aktion1 | 12345
2 | Neueröffnung | 12345
3 | Neueröffnung | 34251
4 | Neueröffnung | 27590
5 | Rabattaktion | 27590
6 | Rabattaktion | 12345
Die Übergabe der ausgewählten Aktion erfolgt dann über die SQL Anweisung der Datensatzquelle von FormB (Einfach die komplette SQL Anweisung als String zusammensetzen und an Forms![FormB].Form.RecordSource übergeben).
Zuerst hab ich die n:m Verknüfung "Aktionsreichweite" normalisiert:
Tabelle1 :
ID | Postleitzahl | Name
1 | 12345 | Mayer
2 | 34251 | Müller
3 | 12345 | Köhler
4 | 27590 | Bäcker
5 | 34251 | Mustermann
Tabelle2 :
ID | Werbeaktion
1 | Aktion1
2 | Neueröffnung
3 | Rabattaktion
Tabelle3:
ID | Werbeaktion | Postleitzahl
1 | Aktion1 | 12345
2 | Neueröffnung | 12345
3 | Neueröffnung | 34251
4 | Neueröffnung | 27590
5 | Rabattaktion | 27590
6 | Rabattaktion | 12345
Die Übergabe der ausgewählten Aktion erfolgt dann über die SQL Anweisung der Datensatzquelle von FormB (Einfach die komplette SQL Anweisung als String zusammensetzen und an Forms![FormB].Form.RecordSource übergeben).
Antwort 6 von lorf55
Ist ja tatsächlich gaaanz anderst.
Surprise, surprise.
Surprise, surprise.

