Form nach mehreren Parametern filtern
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 schreiben
Antwort 1 von lorf55 vom 22.10.2020, 13:41 Options
Hallo Floriel,
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
und
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 vom 23.10.2020, 12:46 Options
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 vom 23.10.2020, 22:07 Options
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:
stLinkCriteria = "[Postleitzahl]=" & "'" & Me![PLZ1] & "') OR ([Postleitzahl]=" & "'" & Me![PLZ2] & "') OR ([Postleitzahl]=" & "'" & Me![PLZ3] & "')"
DoCmd.OpenForm stDocName, , , stLinkCriteria
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
Antwort 4 von lorf vom 24.10.2020, 00:12 Options
Falls dir das String auflösen nicht so leicht von der Hand geht,
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, , , stLinkCriteria
Dem s-String musst du denn noch deinen String aus FormA
übergeben.
Gruß
lorf
Antwort 5 von Floriel vom 30.10.2020, 12:03 Options
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).
Antwort 6 von lorf55 vom 30.10.2020, 22:08 Options
Ist ja tatsächlich gaaanz anderst.
Surprise, surprise.