PDA

Vollständige Version anzeigen : Unterformular über Textfeld im Hauptformular über alle Spalten filtern


fadass
22.11.2006, 16:29
Hallo allerseits.

Weil ich so verdammt stolz bin das ich das nach ewigen Rumgesuche und gemache hinbekommen hab hier mal eine BeispielDB zum Filtern eines Ufos über ein Textfeld im Hfo.

Einfach im Code die Feldnamen anpassen dann sollte das überall funzen :)



Option Compare Database

Private Sub TxKrit_Change()


Dim sSuchbegriff As String
Dim sSQL As String
Dim I As Integer
Dim Pos1 As Integer

sSuchbegriff = Trim$(TxKrit.Text)

If sSuchbegriff = "" Then Exit Sub

sSQL = " SELECT Abfrage.Feldname, Abfrage.Feldname2, " & _
" Abfrage.Feldname3, Abfrage.Feldname4 FROM Abfrage WHERE Abfrage.Feldname AND ("


I = 0
Pos1 = InStr(sSuchbegriff, " ")
While Pos1 > 0
I = I + 1

sSQL = sSQL & "(" & " [Feldname1] & [Feldname2] & [Feldname3] & [Feldname4] Like '*" & Left$(sSuchbegriff, Pos1 - 1) & "*') AND "

sSuchbegriff = Right$(sSuchbegriff, Len(sSuchbegriff) - Pos1)
Pos1 = InStr(sSuchbegriff, " ")
Wend

sSQL = sSQL & "(" & " [Feldname1] & [Feldname2] & [Feldname3] & [Feldname4] Like '*" & sSuchbegriff & "*') "

sSQL = sSQL & ") ORDER BY Abfrage.Feldname DESC; "



Me!Ufo.Form.RecordSource = sSQL
Me!Ufo.Form.Requery
Me!TxKrit.SetFocus

Exit_TxKrit_Change:
Exit Sub

Err_TxKrit_Change:
MsgBox Err.Description
Resume Exit_TxKrit_Change

End Sub



Verschiedene Kriterien können einfach per Leerzeichen getrennt werden.
MfG Udo

oli-zapp
14.12.2006, 14:18
hallo,
das ist ja super, danke.
eine frage noch wie kommen wieder alle datensätze des ufo zum vorschein.
liebe grüße
olo-zapp:)

fadass
18.12.2006, 09:49
Hi. Einfach diese Zeile entfernen dann werden bei leeren Kriterium wieder alle Datensätze angezeigt ;)

If sSuchbegriff = "" Then Exit Sub

oli-zapp
18.12.2006, 13:04
Hallo nochmals,
super, vielen dank nochmals und schöne Weihnachten.
Oliver

fadass
17.01.2007, 11:02
Hier nochmal ein Beispiel mit 3 Spalten die alle einzeln aber unter beachtung der anderen bereits gefilterten Spalten gefiltert werden.
(Formular PNummern)

slice1
22.02.2008, 15:15
Hallo,

habe mir nach diesem Muster + Code ein DB erstellt. Funktioniert auch.
Leider ist die Eingabe des Suchkriterium sehr langsam. Pro Eingabe eines Zeichens vergehen ca. 3-4 Sek. bevor ich ein weiteres Zeichen eingeben kann. Z.B. suche ich nach dem Wort Großhandel, pro Eingabe eines Zeichens, vergeht hier eine Zeit. Meine Tabelle beinhaltet ca. 40000 Datensätze. Liegt das daran?

Die Suche erfolgt über meine Abfrage die 5 Feldnamen beinhaltet, wobei das Suchkriterium über 2 Feldnamen erfolgt. Die dazugehörige Tabell besteht ohne Primärschlüssel.

Dürfte doch wohl nicht an der Größe der Datensätze liegen, oder?

Gruß
slice1

Arne Dieckmann
23.02.2008, 11:01
Dürfte doch wohl nicht an der Größe der Datensätze liegen, oder?Das bekommst du ganz einfach heraus, indem du eine Testdatenbank anlegst und die Datensätze auf 50 reduzierst. Ich habe mir das Beispiel nicht angeschaut, sondern betrachte nur den Code in Beitrag #1 - der ist auf jeden Fall nicht auf hohe Performance ausgelegt (selbst Indizies bringen dort nicht viel - das Sortierfeld sollte aber auf jeden Fall einen Index bekommen).

Könntest du noch einmal den Code zeigen, wie er bei dir zur Zeit aussieht?

Josef P.
23.02.2008, 11:06
@slice1: Wenn nach dem Eintrag jedes Zeichens die Datensätze gefiltert werden, darf man nicht überrascht sein, dass das etwas dauert. :)
Verlagere die Filterung von Change auf AfterUpdate oder gib dem User überhaupt die Freiheit zuerst alle Filterbedingungen einzugeben und dann erst die Filterauswertung zu starten.

BTW: Wenn man nicht sofort erkennt, was im Code abläuft, lässt sich das meist mittels Haltepunkten im Code sehr gut analysieren.

slice1
23.02.2008, 14:21
@arne: ist der gleiche Code wie oben. wie lege ich denn einen Index fest, geschweige denn kann ich diese Code besser perfomancen? Stehe am Anfang von Access.
@Josef: Wie verlagere ich den Filterung von Change auf AfterUpdate?

Gibt es eine Alternative, wonach es schneller geht?

Gruß
slice1

Josef P.
23.02.2008, 16:01
Private Sub TxKrit_Change()
...
TxKrit ist vermutlich das Steuerelement und mit TxKrit_Change() wird auf das Change-Ereignis reagiert. Change wird nach jeder Änderung ausgelöst.
Wenn du den Code in die Ereignisbehandlung von AfterUpate (Nach Aktualisierung) ausführst, wird nicht so oft aktualisiert.
Private Sub TxKrit_AfterUpdate()
...
(Anm.: in der Eigenschaft "Nach Aktualiserung" des Textfeldes muss [Ereignisprozedur] stehen.)

Noch ein Tipp: wenn du Code verwendest, dann solltest du immer veruschen den Ablauf zu verstehen. Sonst fügst du möglicherweise etwas ein, was du gar nicht willst. - Oder startest du jede auch Exe-Datei, die dir von einem unbekannten Absender geschickt wird?

PSViolon
08.12.2008, 11:05
Hallo,

kann mir mal jemand auf die Sprünge helfen, warum der Code bei mir nicht funktioniert? (In einem anderen Formular hatte ich überhaupt keine Probleme)

Laufzeitfehler 3141
Die Select-Anweisung schliesst ein reserviertes Wort oder Argumentnamen mit ein, daß mit falscher Zeichensetzung oder überhaupt nicht eingegeben wurde.


Private Sub PrktNr_GotFocus()

Me!TxKrit.SetFocus

End Sub

Private Sub TxKrit_AfterUpdate()


Dim sSuchbegriff As String
Dim sSQL As String
Dim I As Integer
Dim Pos1 As Integer

sSuchbegriff = Trim$(TxKrit.Text)

'If sSuchbegriff = "" Then Exit Sub

sSQL = " SELECT abfrPrktAuswahl.PMK, abfrPrktAuswahl.Status, " & _
" abfrPrktAuswahl.PrktNr, abfrPrktAuswahl.PrktName, FROM abfrPrktAuswahl WHERE abfrPrktAuswahl.PrktNr AND ("


I = 0
Pos1 = InStr(sSuchbegriff, " ")
While Pos1 > 0
I = I + 1

sSQL = sSQL & "(" & " [PMK] & [Status] & [PrktNr] & [PrktName] Like '*" & Left$(sSuchbegriff, Pos1 - 1) & "*') AND "

sSuchbegriff = Right$(sSuchbegriff, Len(sSuchbegriff) - Pos1)
Pos1 = InStr(sSuchbegriff, " ")
Wend

sSQL = sSQL & "(" & " [PMK] & [Status] & [PrktNr] & [PrktName] Like '*" & sSuchbegriff & "*') "

sSQL = sSQL & ") ORDER BY abfrPrktAuswahl.PrktNr DESC; "


Me!ufrmPrktAuswahl.Form.RecordSource = sSQL
Me!ufrmPrktAuswahl.Form.Requery


Exit_TxKrit_AfterUpdate:
Exit Sub

Err_TxKrit_AfterUpdate:
MsgBox Err.Description
Resume Exit_TxKrit_AfterUpdate

End Sub

Josef P.
08.12.2008, 11:23
Wie sieht die fertige SQL-Anweisung aus? (Ist z.B. das Komma vor From noch enthalten?)

PSViolon
08.12.2008, 11:41
.... peinlich :redface:

Danke!

natajakob
10.05.2009, 22:55
Es ist natürlich super. Aber es funktioniert nicht in einem ADP Projek, der auf SQL zurückgreift. (((((((

Arne Dieckmann
11.05.2009, 15:28
Vermutlich musst du nur die Wildcards ändern-> Setze statt "*" dann doch lieber "%" als Platzhalter ein.

natajakob
11.05.2009, 16:01
Habe ich ersetzt. Bekomme aber den gleicher Fehler.

natajakob
11.05.2009, 16:04
Habe ich ersetzt der Fehler immer noch da. (( SQL kommt irgend wie damit nicht klar: SELECT ItemNumber FROM Mainview_t1 WHERE Mainview_t1.CustomerNr AND ("

Arne Dieckmann
11.05.2009, 18:30
An der Stelle hat Udo (AKA "fadass") bewusst ein wirkungsloses Kriterium eingesetzt, sodass im weiteren Verlauf das eigentliche Kriterium (in dem die anderen Felder verknüpft werden) mittels AND angefügt werden kann - deshalb auch gleich das <span style="font-family:Courier New;color:#000080;">AND("</span> dahinter.

Vielleicht hat T-SQL damit tatsächlich Schwierigkeiten. Ebenfalls wirkungslos dürfte
SELECT ItemNumber FROM Mainview_t1 WHERE Mainview_t1.CustomerNr=Mainview_t1.CustomerNr AND ("
sein.


Probleme dürfte es anschliessend noch bei der Verknüpfung der Felder geben - T-SQL wird "&" nicht kennen. Hier müsstest du mit "+" arbeiten und ggf. die Datentypen noch konvertieren. Sinnvoll ist vielleicht auch die Nullwert-Behandlung mit IsNull() {Achtung - diese T-SQL-Funktion ist nicht mit der VBA-Funktion zu verwechseln}.

Beispiel zur Verknüpfung der Felder und zum Einsatz der IsNull-Funktion:
sSQL = sSQL & "(" & " IsNull([PMK],'') + IsNull([Status],'') + IsNull([PrktNr],'') Like '%" & Left$(sSuchbegriff, Pos1 - 1) & "%') AND "



Falls du immer noch Probleme hast, zeige bitte deinen jetzigen Code und gebe die Datentypen der beteiligten Felder an.

natajakob
12.05.2009, 10:37
ne funktioniert trotzdem nicht

natajakob
12.05.2009, 10:38
upps sorry den letzten Beitrag habe ich irgendwie übersehen. Ich werde es gleich probieren

natajakob
12.05.2009, 10:52
Ne es ist einfach zu hoch für mich. Ich bin hier leider keine Profi. Da ist meine Code .
Option Compare Database

Private Sub Text22_Change()

''On Error GoTo Err_TxKrit_Change

Dim sSuchbegriff As String
Dim sSQL As String
Dim I As Integer
Dim Pos1 As Integer

sSuchbegriff = Trim$(Text22.Text)



sSQL = " SELECT Mainview_t1.OrderNr, CustomerNr, ItemNumber FROM Mainview_t1 WHERE Mainview_t1.CustomerNr AND ("

I = 0
Pos1 = InStr(sSuchbegriff, " ")
While Pos1 > 0
I = I + 1

sSQL = sSQL & "(" & " IsNull([CustomerNr],'') Like '%" & Left$(sSuchbegriff, Pos1 - 1) + "&') AND "

sSuchbegriff = Right$(sSuchbegriff, Len(sSuchbegriff) - Pos1)
Pos1 = InStr(sSuchbegriff, " ")
Wend

sSQL = sSQL & "(" & " IdNull([CustomerNr],'')Like '%" & sSuchbegriff & "%') AND (isNull([OrderNr],'') Like '%" & [Forms]![Maintview]![Text26] & "%') AND(isnull([ItemNumber],'') Like '%" & [Forms]![Maintview]![Text24] & "%') "

sSQL = sSQL & ") "


Me.RecordSource = sSQL
Me.Requery
Me!Text22.SetFocus

If IsNull(Text22.Value) = False Then
Text22.SelStart = Len(Me.Text22.Value)
End If

Exit_TxKrit_Change:
Exit Sub

'Err_TxKrit_Change:
'MsgBox Err.Description
'Resume Exit_TxKrit_Change
End Sub

natajakob
12.05.2009, 10:54
Ich wollte es gern sowohl nach Textfelder, Zahlfelder und sowie Datumsfelder filtern.

Arne Dieckmann
12.05.2009, 18:23
Ein wenig mehr Sorgfalt beim Beantworten und Abschreiben/Anpassen des Codes wäre sicherlich ratsam.

Setzt du das 1. (wirkungslose) Kriterium, nicht so ein, wie ich es in Beitrag 18 (rot) markiert hatte
Schreibst du an einer Stelle IdNull() statt IsNull()
Solltest du auf Leerzeichen vor z.B. LIKE achten
Kenne ich immer noch nicht die Datentypen der jeweiligen Felder (Name und Felddatentyp sind gefragt)


Somit verweise ich erst einmal nur auf Debug.Print (Klick mich) (http://www.ardiman.de/datenbanken/grundlagen/vba.html#SEC5_4), dessen Ergebnis du auch im SQL-Bereich einer neuen Sicht verwenden kannst, um den diversen Fehlern auf die Schliche zu kommen. Wenn's noch Datentypenfehler gibt, verweise ich auf's T-SQL-Handbuch: Das Stichwort bzw. die Funktion Convert() sollte dir weiterhelfen.


Zum Schluss: Das nächste Mal bitte auch gleich darauf hinweisen, dass du den Code dahingehend veränderst, als das jetzt noch weitere (Formular-)Suchfelder benutzt werden.

qwe
05.08.2010, 11:48
Hallo zusammen,

kann mir jemand den Quellcode von ganz oben erklären?
Ich steige da nicht durch -.-

Option Compare Database

Private Sub TxKrit_Change()


Dim sSuchbegriff As String
Dim sSQL As String
Dim I As Integer
Dim Pos1 As Integer

sSuchbegriff = Trim$(TxKrit.Text)

If sSuchbegriff = "" Then Exit Sub

sSQL = " SELECT Abfrage.Feldname, Abfrage.Feldname2, " & _
" Abfrage.Feldname3, Abfrage.Feldname4 FROM Abfrage WHERE Abfrage.Feldname AND ("


I = 0
Pos1 = InStr(sSuchbegriff, " ")
While Pos1 > 0
I = I + 1

sSQL = sSQL & "(" & " [Feldname1] & [Feldname2] & [Feldname3] & [Feldname4] Like '*" & Left$(sSuchbegriff, Pos1 - 1) & "*') AND "

sSuchbegriff = Right$(sSuchbegriff, Len(sSuchbegriff) - Pos1)
Pos1 = InStr(sSuchbegriff, " ")
Wend

sSQL = sSQL & "(" & " [Feldname1] & [Feldname2] & [Feldname3] & [Feldname4] Like '*" & sSuchbegriff & "*') "

sSQL = sSQL & ") ORDER BY Abfrage.Feldname DESC; "



Me!Ufo.Form.RecordSource = sSQL
Me!Ufo.Form.Requery
Me!TxKrit.SetFocus

Exit_TxKrit_Change:
Exit Sub

Err_TxKrit_Change:
MsgBox Err.Description
Resume Exit_TxKrit_Change

End Sub