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 ?
weiß wirklich keiner?
Hallo,
dir ist aber schon klar, dass diese Art Aufruf bei JEDEM Tastendruck die gesamte Routine ausführt?
Private Sub Nachname_ChangeDF6GL 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
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 ?
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
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
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
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
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 ?
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.
:-\ 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).
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?
(http://www1.minpic.de/bild_anzeigen_thumb.php?img=140378.gif)
Danke sehr !
Vielen Dank für deine schnelle antworten
ich hatte schon vor das aufzugeben und das ganze per COPY PASTE zu machen.
Das ist für mich auch Interessant.
Es sind neue Erkenntnisse über "IIF".
Herzlichen Dank in deisem Sinne fürs Ausprobieren.