Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Unterformular filtern ?

Begonnen von asiat, Februar 17, 2011, 19:39:32

⏪ vorheriges - nächstes ⏩

asiat

Hallo,

ich habe im Hauptformular ein Unterformular mit einer Tabelle, im HF  Habe ich mehere Textfelder und Kombifelder: Vorname, Nachname, Staße, PLZ, Ort ...und viel mehr.
Wenn ich was in irgendein Textfeld eintippe soll Unterformular gefiltert werden, dabei soll gleichzeitig auch berücksichtig werden was in anderen Felder steht.
man könnte das auch so lösen

Private Sub Nachname_Change()
' Waehrend der Eingabe Unterformular filtern
Form_frm_eingabe_unterformular.filter = "Nachname LIKE '*" & Me.Nachname.text & "*'" & _
                                        "AND Vorname LIKE '*" & Me.Vorname & "*'" & _
                                        "AND Ort LIKE '*" & Me.Ort & "*'"
Form_frm_eingabe_unterformular.FilterOn = True

End Sub


dabei muss ich aber für jedes Feld das eintippen und der Filter wird immer größer und größer.

diese Frage habe ich schon mal gestellt, bin aber jezt mit der Lösung nich zufrieden.

hat jemand noch Lust mir zu helfen ?

asiat


database

Hallo,

dir ist aber schon klar, dass diese Art Aufruf bei JEDEM Tastendruck die gesamte Routine ausführt?
Private Sub Nachname_Change

DF6GL hat mal einen ähnlichen Thread sinngemäß mit folgenden Worten beantwortet ---->  Umfangreiches Suchformular umfangreiche Programmierung ...

Was stellst du dir vor?
Zitatdabei muss ich aber für jedes Feld das eintippen und der Filter wird immer größer und größer
Wenn du auf JEDE Änderung in einem der betreffenden Felder reagieren willst, musst du in die entsprechenden Ereignisse deinen Filtercode einbringen.

"Nachname LIKE '*" & Me.Nachname.text & "*'"

.Text kannst du weglassen

asiat

#3
Zitatdir ist aber schon klar, dass diese Art Aufruf bei JEDEM Tastendruck die gesamte Routine ausführt?
ja, ist so gewollt. wo ist das Problem ?
ich habe paar Felder im Hauptformular  in dem auch ein Unterformular Tabelle (Endlosformular) befindet, wenn ich in Feld Name was eintippe dan werden die Ergebnisse im Unterformular angezeigt.

ZitatWenn du auf JEDE Änderung in einem der betreffenden Felder reagieren willst, musst du in die entsprechenden Ereignisse deinen Filtercode einbringen.
so wie ich es bis jetzt auch gemacht habe.
nur wenn ich 14 Felder habe dann wird der Filter sehr lang sein und den muss ich noch 14 mal für jedes Feld kopieren ...scrollen ohne Ende :-\

Zitat.Text kannst du weglassen
ohne .text geht der Filter nicht, es wird nur berücksichtig  was in Feldern sschon steht und nicht was ich gerade eingebe und was in den Feldern schon steht. weißt du was ich meine ?



database

Hi,

Zitatja, ist so gewollt. wo ist das Problem ?
Ich hab' damit kein Problem aber vielleicht wird die ganze Sache bei vielen Daten etwas zäh laufen

Zitatohne .text geht der Filter nicht
Habe überlesen, dass die Routine vom betreffenden Feld aus gestartet wird.  :-\

Zitatnur wenn ich 14 Felder habe dann ...
sicher musst du da auf einiges aufpassen und es ist ein wenig Arbeit damit verbunden ... aber stell dir vor das wären 28 Felder  ;)

Du könntest den Zusammenbau des Filters auch auslagern und dir in die jeweilige Ereignisprozedur den Filterstring zurückliefern lassen.
Wenn ich aber da an die Verschachtelei denke, würde ich die Variante Copy, Paste & Edit vorziehen

imp666

Du kannst mit einer FOR..NEXT Schleife auf die "Controls"-Struktur des Formulars zugreifen und aus den Such-Eingabefeldern die zu durchsuchenden Felder als String zusammenbasteln, ungefähr so:

FOR EACH ctl IN Me.Controls

Den Namen des Feldes bekommt man dann mit: (anhand dessen kann man festmachen, ob es sich um ein Suchfeld handelt)

ctl.Name

Den Inhalt des Controls bekommt man mit:

ctl.Value


Das könnte dann so ähnlich aussehen: (ACHTUNG: Schneller wirds dadurch NICHT!)

DIM s AS String
DIM t AS String
s=""
t=""
FOR EACH ctl IN Me.Controls
   ' Die Eingabefelder für die Suchbegriffe müssen mit "such" beginnen,
   ' dahinter muss dann der Name des zu durchsuchenden Feldes verwendet werden
   ' also z.B. "suchName" -> durchsucht wird im Filter-Query nach "Name"
   IF LEFT(ctl.name,4)="such" THEN
       IF LEN(ctl.value & "")>0 THEN
           s = s & t & RIGHT(ctl.name,len(ctl.name)-4) & " LIKE '*" & ctl.value & "*'"
           t = " AND "
       END IF
   END IF
NEXT

asiat

#6
hallo imp666,

wow eine elegante Lösung, nur wenn man die von anfang an benutzt, denn ich muss alle meine "such" Felder umbenennen, ich habe viele Prozeduren die mit Feldern verknüpft sind aber auch das würde sich lohnen  wenn

Zitat
Den Inhalt des Controls bekommt man mit:
ctl.Value

ja, aber was ist mit dem Inhalt denn ich gerade in einen Feld eingebe?
das geht nur mit ctl.text (bin der Meinung)



DO YOU SPEAK VBA ?
kann man das vereinfachen?
Public Function trefferliste(feldname As String) As String

If feldname = "Vorname" Then

trefferliste = "Vorname LIKE '*" & Me.Vorname.text & "*'" & _
                "AND Nachname LIKE '*" & Me.Nachname & "*'" & _
                "AND Ort LIKE '*" & Me.Ort & "*'"
ElseIf feldname = "Nachname" Then

trefferliste = "Vorname LIKE '*" & Me.Vorname & "*'" & _
                "AND Nachname LIKE '*" & Me.Nachname.text & "*'" & _
                "AND Ort LIKE '*" & Me.Ort & "*'"
ElseIf feldname = "Ort" Then

trefferliste = "Vorname LIKE '*" & Me.Vorname & "*'" & _
                "AND Nachname LIKE '*" & Me.Nachname & "*'" & _
                "AND Ort LIKE '*" & Me.Ort.text & "*'"
End If

End Function


Private Sub Vorname_Change()
' Waehrend der Eingabe Unterformular filtern
Form_frm_eingabe_unterformular.filter = trefferliste("Vorname")
Form_frm_eingabe_unterformular.FilterOn = True
End Sub

Private Sub Nachname_Change()
' Waehrend der Eingabe Unterformular filtern
Form_frm_eingabe_unterformular.filter = trefferliste("Nachname")
Form_frm_eingabe_unterformular.FilterOn = True
End Sub

Private Sub Ort_Change()
' Waehrend der Eingabe Unterformular filtern
Form_frm_eingabe_unterformular.filter = trefferliste("Ort")
Form_frm_eingabe_unterformular.FilterOn = True
End Sub

imp666

Die obere Funktion könnte man derart ändern: (das würde dann auch das Hinzufügen weiterer Felder vereinfachen)

Public Function trefferliste(feldname As String) As String
dim felder as variant
dim s as string
dim t as string

felder=array("Vorname","Nachname","Ort")
s=""
t=""

For a=0 to ubound(felder)
s = s & t & felder(a) & " LIKE '*" & iif(feldname=felder(a),me(felder(a)).text,me(felder(a)) & "*'"
t = " AND "
Next
trefferliste=s
end function


Du könntest natürlich auch auf den Rückgabewert verzichten und den Filter in der Sub (ehemals Function) Trefferliste setzen, da es ja immer der gleiche Filter ist.

Public Sub trefferliste(feldname As String)
dim felder as variant
dim s as string
dim t as string

felder=array("Vorname","Nachname","Ort")
s=""
t=""

For a=0 to ubound(felder)
s = s & t & felder(a) & " LIKE '*" & iif(feldname=felder(a),me(felder(a)).text,me(felder(a)) & "*'"
t = " AND "
Next
Form_frm_eingabe_unterformular.filter=s
Form_frm_eingabe_unterformular.filteron=true
End Sub

Private Sub Vorname_Change()
trefferliste("Vorname")
End Sub

...


Konnte den Code  jetzt leider nicht austesten, hoffe es sind keine Tippfehler drin

asiat

#8
genial ! imp666 , das ist genau was ich brauche, leider funktioniert das bei mir nicht.

der VBA Editor sagt mir bei

s = s & t & felder(a) & " LIKE '*" & iif(feldname=felder(a),me(felder(a)).text,me(felder(a)) & "*'"
Syntaxfehler

und Variable a nicht definiert, die habe ich aber als dim a as integer deklariert, war das richtig ?

imp666

okay, da muss vermutlich folgendes stehen:

s = s & t & felder(a) & " LIKE '*" & iif(feldname=cstr(felder(a)),me(cstr(felder(a))).text,me(cstr(felder(a)))) & "*'"

Das mit dem Dim a als integer ist vollkommen okay.

asiat

#10
 :-\ jetzt kommt DAS

Laufzeitfehler '2185'

Sie können auf die Eigenschaften oder Methoden eines Steuerelements nur verweisen,
wenn das Steuerelement den Fokus hat

so wie ich das verstehe greift die schleifen einen feld mit eigenschaft .text an was gerade nicht aktiv ist (also wo ich gerade nichts reinschreibe).

imp666

Dann müssen wir das wohl vorher abfangen.
Ersetze bitte mal die zeile mit dem IIF durch folgendes:

if feldname=cstr(felder(a)) then
    s = s & t & felder(a) & " LIKE '*" & me(cstr(felder(a))).text & "*'"
else
    s = s & t & felder(a) & " LIKE '*" & me(cstr(felder(a))) & "*'"
end if


Hier ist auf jeden Fall garantiert, dass das ".text" ausschliesslich dann im Programmablauf vorkommt wenn das Feld das rcihtige ist.
Ich dachte zwar auch, dass es bei IIF genauso wäre, aber da kann ich mich geirrt haben.
klappt das? Wenn nicht, dann übergibst du vielleicht den falschen Feldnamen?

asiat


Danke sehr !
Vielen Dank für deine schnelle antworten
ich hatte schon vor das aufzugeben und das ganze per COPY PASTE zu machen.

imp666

Das ist für mich auch Interessant.
Es sind neue Erkenntnisse über "IIF".
Herzlichen Dank in deisem Sinne fürs Ausprobieren.