PDA

Vollständige Version anzeigen : Optionsfelder für verschiedene Filter


mikeboy
08.08.2001, 10:36
Servus !

Ich möchte gerne ca 20 Optionsfelder in mein Formular einfügen um dem Benutzer eine einfache Möglichkeit des Filterns zu bieten. Es müssen allerdings beliebig viele Felder anklickbar sein (weshalb die Optionsgruppe wegfällt), und somit auch mehrere Filter verbunden werden. Und genau da fängt mein Problem an.Ich kann einen Filter setzen, aber sobald ich den 2.aktiviere, hauts den 1. wieder raus.
hier mein bisheriger code:

Private Sub Option152_Click()
If Option152 = True Then
Me.Filter = "KdGr=1"
Me.FilterOn = True
Else
Me.FilterOn = False
End If

End Sub

Private Sub Option154_Click()
If Option154 = True Then
Me.Filter = "KdGr=2"
Me.FilterOn = True
Else
Me.FilterOn = False
End If
End Sub

Weiß jemand wie es weiter gehen könnte??

Gruß Mike

thk
08.08.2001, 11:32
Hallo Mike,

nimm doch einfach CheckBoxes

Gruß
Thomas

flori
08.08.2001, 11:52
Hallo!

Probier es mal so:

Private Sub filter_start()

Dim filter1 As String, filter2 As String, filteralle As String

filteralle = "0"

If Option152= True Then
filter1 = "([KdGr] = 1)"
If filteralle <> "0" Then
filteralle = filteralle + " and " + filter1
Else
filteralle = filter1
End If
End If

If Option154 = True Then
filter2 = "([KdGr] = 2)"
If filteralle <> "0" Then
filteralle = filteralle + " and " + filter2
Else
filteralle = filter2
End If
End If

If filteralle <> "0" Then
DoCmd.ApplyFilter , filteralle
Else
DoCmd.ShowAllRecords
End If

End Sub

Da kannst du auch noch weitere Bedingungen mit einfügen!!

mikeboy
08.08.2001, 12:18
Hi,

Danke für eure Antworten.
Zu Thomas: Bei den Checkboxen hab ich ja das gleiche Problem, daß sich meine Filter nicht verbinden, oder??

Zu Flori: Das sieht sehr gut aus, aber wie spreche ich die Geschichte denn an ?
Mit Private Sub Filter_start spreche ich die Prozedur doch nur an wenn ein Filter gestartet wird, aber dann kann ich ja nix mehr klicken ! Oder bin ich auf dem falschen Dampfer ?
Zumindest hauts grad nicht hin...
Gruß Mike

flori
08.08.2001, 12:36
Hallo!

du kannst das doch in der Art machen:

Private Sub option152_change()
filter_start
End Sub

Du kannst anstatt change auch update verwenden, müsste auch klappen.
Und das machst du eben bei allen Optionsfeldern und hast den Code für das Filtern aber nur einmal.
Das filter_start ist nicht an einen Button oder sonstiges gebunden, sondern eine "selbstgeschriebene" Funktion.
Jetzt klar?

Kurt aus Kienitz
08.08.2001, 12:43
Hallo miteinander,

Zu diesem Thema habe ich auch was und möchte eure Meinung dazu einholen.

Folgender Vorschlag:

Benenne die Checkboxen irgendwie alle gleich (z.B. CbFilter1, CbFilter2, CbFilter3).
Gebe in den Eigenschaften der Checkbox unter Marke die Bedingung an ([KdNr]=2 etc.)
Implementiere die Ereignisprozedur Beim Klick der Checkboxen ungefähr so:

Private Sub CbFilter1_Click()
SetFilter
End Sub

Durch die quasi Namensgleichheit läßt sich daß Ganze für die übrigen Checkboxen mit Cut&Paste schnell erledigen.

Die Procedur SetFilter sieht dann so aus:

Private Sub SetFilter()

Dim AktCtrl As Control
Dim AktFilter As String

AktFilter = ""
For Each AktCtrl In Me.Controls

If Left$(AktCtrl.Name, 8) = "CbFilter" Then

If AktCtrl.Value = True Then

AktFilter = AktFilter & AktCtrl.Tag & " AND "

End If

End If

Next AktCtrl

AktFilter = Left$(AktFilter, Len(AktFilter) - 5)

MsgBox AktFilter

End Sub

Hier wird der Filter zwar in eine MsgBox ausgegeben aber vom Prinzip her ist klar was passieren soll.

Vorteil währe, daß man die Prozeduren nicht anpassen muß wenn mal eine Checkbox dazukommt oder wegfällt.

Also, was mein ihr ?

mikeboy
08.08.2001, 13:11
Hi,

zu Flori: Soweit klappts aber Dein Statement
"Und das machst du eben bei allen Optionsfeldern und hast den Code für das Filtern aber nur einmal." versteh ich nicht. Was meinst Du mit "hast den Code nur einmal"?
Ich habs jetzt so gelöst, aber die Option 154 reagiert immer noch nicht !

zu Kurt: Es hört sich ganz gut an, ich werds nachher probieren und dann meine Meinung posten.

Gruß Mike

thk
08.08.2001, 13:19
zu Mike: Ich war jetzt vollkommen auf dem falschen Dampfer...
zu Kurt: Es gibt auch noch die ControlType-Eigenschaft. Dann würde das äüßere if-Statement so aussehen:

If AktCtrl.ControlType = acCheckBox Then
.....
End If
allerdings wird dann jede Checkbox auf der Form angesprochen, auch wenn die nichts mit dem Filter zu tun hat.

Auf jeden Fall spart die Lösung von Kurt eine Menge Schreibarbeit ;-)

Gruß
Thomas

flori
08.08.2001, 13:46
zu Kurt: sieht ganz gut aus, ob es klappt kann ich aber nicht sagen, habe es nicht ausprobiert!

zu mikeboy: ich meine es so, dass du für jedes Optionsfeld diesen Code schreibst, nur eben mit den richtigen Nummern. Und warum es nicht klappt: hast du in den Eigenschaften auch bei "nachaktualisieren" oder "beiänderung" eingegeben, dass danach eine Ereignisprozedur ist?

mikeboy
08.08.2001, 13:55
Hi Flori,

so hatte ich es auch verstanden.
Nur erhalte ich jetzt folgende Meldung:

Syntaxfehler (fehlender Operator)in Abfrageausdruck 'and ([KdGr]=2)'

Hier mein Code:

Private Sub Option152_AfterUpdate()


Dim filter1 As String, filter2 As String, filteralle As String

filteralle = "0"

If Option152 = True Then
filter1 = "([KdGr] = 1)"
If filteralle <> "0" Then
filteralle = filteralle + " and " + filter1
Else
filteralle = filter1
End If
End If
If filteralle <> "0" Then
DoCmd.ApplyFilter , filteralle
Else
DoCmd.ShowAllRecords
End If

End Sub

Private Sub Option154_AfterUpdate()
Dim filter1 As String, filter2 As String, filteralle As String
If Option154 = True Then
filter2 = "([KdGr] = 2)"
If filteralle <> "0" Then
filteralle = filteralle + " and " + filter2
Else
filteralle = filter2
End If
End If

If filteralle <> "0" Then
DoCmd.ApplyFilter , filteralle
Else
DoCmd.ShowAllRecords
End If

End Sub

Was muß ich denn jetzt noch einfügen ?

Gruß Mike

flori
08.08.2001, 14:02
Du hast jetzt alles durcheinander gewürfelt.
Also noch einmal.

Der Code sollte so aussehen:

'damit rufst du die Filterfunktion auf
Private Sub Option152_AfterUpdate()
filter_start
End Sub


Private Sub Option154_AfterUpdate()
filter_start
End Sub

'Filterfunktion
Private Sub filter_start()

Dim filter1 As String, filter2 As String, filteralle As String

filteralle = "0"

If Option152= True Then
filter1 = "([KdGr] = 1)"
If filteralle <> "0" Then
filteralle = filteralle + " and " + filter1
Else
filteralle = filter1
End If
End If

If Option154 = True Then
filter2 = "([KdGr] = 2)"
If filteralle <> "0" Then
filteralle = filteralle + " and " + filter2
Else
filteralle = filter2
End If
End If

If filteralle <> "0" Then
DoCmd.ApplyFilter , filteralle
Else
DoCmd.ShowAllRecords
End If

End Sub

Kopiere den Code komplett und probiere es noch einmal aus, bei mir in einer Datenbank klappt es auch.

mikeboy
08.08.2001, 14:32
Sorry Flori,

ich versuch mein bestes. Ich arbeite erst seit 8 Wochen mit Access, und das mit VBA is noch nich so mein Ding...

Ich hab Deinen Code kopiert, aber sobald ich das 2.Feld, egal os es 152 oder 154 ist aktiviere, bekomm ich ein total leeres Formular, wie wenn er keine Daten findet.
Könnte es daran liegen, daß meine zugrundeliegende Tabelle eine verknüpfte Textatbelle ist ? Oder muß ich am Formularfeld KdGr was ändern ?

Gruß Mike

flori
08.08.2001, 14:39
Warte mal, vielleicht habe ich dich falsch verstanden.
Noch einmal von vorne. Du filterst über das Optionsfeld die Daten. Wenn du ein neues Optionsfeld aktivierst soll das andere deaktiviert werden und der neue Filter angewendet werden?
Weil jetzt ist es so, dass beide Filter zusammengenommen werden und somit auch kein Datensatz gefunden wird.

mikeboy
08.08.2001, 14:50
Also,

so sollte es funktionieren:

Ich wähle option 152 aus, also KdGr 2 und es werden mir die entsprechenden Daten angezeigt. Jetzt klick ich auf option 154, also KdGr 3, und erwarte, daß mir nun zusätzlich die Daten von dieser KdGr angezeigt werden. Es sollten also eigentlich beide Filter greifen !

Ich hoffe jetzt ist es klarer ?!

Gruß Mike

flori
08.08.2001, 15:06
Als erstes fällt mir dabei auf, dass der Code dann wohl nicht ganz richtig ist.
Wenn du Option 152 auswählst soll KdGr 2 (im Code steht 1) angezeigt werden und bei bei Option154 KdGr 3 (im Code steht eine 2), das musst du noch ändern.
Und änder mal bei: filteralle = filteralle + " and " + filter2
das " and " in ein " or ".

Probier es aus, sollte jetzt aber klappen!

mikeboy
08.08.2001, 15:31
Hi Flori,

die Sache mit den KdGr1,... ist nicht so tragisch, da ich noch mehrere KdGrs habe !

Aber mit der Änderung "or" klappt es wunderbar - herzlichen Dank !!

Jetzt will ich aber weitere hinzufügen, ist da noch etwas zu beachten, weil einfach durch kopieren klappts nicht, da bekomm ich wieder Fehlermeldungen.

Ich check es nochmal durch....

Nochmal Thanx für den höchst strapaziösen Nachmittag!! Grüße Mike

mikeboy
08.08.2001, 15:39
Hi Flori,

ich hab`s soeben herausgefunden.
Ich muß nur immer bei

Else
filteralle=filter1+filter2+filter3+...

den zusätzlichen Filter anfügen!

Einen schönen Abend !

Gruß Mike

flori
08.08.2001, 15:43
Kein Problem!!

Eine Abwechslung ist immer willkommen.
Das Anfügen neuer Filter funktioniert so, dass du diese Sachen nocheinmal einfügen musst:

Dim filter3 as String 'mit zu den Dim-Anweisungen

If Option155 = True Then
filter3 = "([KdGr] = 2)"
If filteralle <> "0" Then
filteralle = filteralle + " or " + filter3
Else
filteralle = filter3
End If
End If

Das schreibst du hier zwischen:

filteralle = filter2
End If
End If

/*hier den oberen Code einfügen*/

If filteralle <> "0" Then
DoCmd.ApplyFilter , filteralle
Else
DoCmd.ShowAllRecords
End If

Und dann natürlich noch das Ereignis in den Eigenschaften von dem Optionsfeld angeben, aber das kannst du so kopieren wie es bei den anderen schon ist.
Der Code wird etwas länger damit!

Gruss und einen schönen Feierabend