ADODB & Recordset.Filter -> Problem mit Verkettung

28/10/2007 - 22:30 von Matthias V. | Report spam
Hallo zusammen,
ich habe gerade ein kleines "Problemchen" mit einer Filtersetzung in
klassischem ASP. Ich habe ein stàndig geöffnete Recordset in einer
Anwendungsvariablen. Dieses wird vor der Abfrage einmal geklont (RS.Clone).
Aufgrund einer extrem großen Tabelle ist das anders leider nicht sinnvoll.
Ein neues öffnen des Recordset´s nach einer Suche fàllt also flach. Nun
dachte ich mir, ich kann meinen ganz normalen Filter auch per
Recordset.Filter auf meinen Recordset-Clone anwenden.
Ich möchte natürlich mehrere Suchbegriffe zulassen (in meinem Falle getrennt
durch ein Leerzeichen). Wenn ich aber () UND () Verkettungen ausführen möchte
kommt kein Resultat (Recordset.Filter ist danach 0). Wenn ich hingegen () OR
() verkette funktioniert es - hilft mir aber nichts. Ich möchte Filter wie
z.B.
(S1 like '%W1%' OR S2 like '%W1%') AND (S1 like '%W2%' OR S2 like '%W2%')
wenn ich eine Spalte S1 und eine S2 habe und nach den Werten W1 und W2
filtern möchte.
Bislang mußte ich mich mit dieser Art des Filtern´s nie auseinandersetzen,
daher vermute ich eine Einschrànkung - ich finde nur keine.
Kennt irgendjemand dafür eine Lösung?

Vielen Dank
Matthias


Zur Verdeutlichung nochmal die Generierung des Filters:

SuchBegriffe=split(request.querystring("Filter")," ")

for x=lbound(SuchBegriffe) to ubound(SuchBegriffe)
Begriff="'%" & replace(SuchBegriffe(x),"'","''") & "%'"
SB=SB & "([S1] like " & Begriff & " OR [S2] like " & Begriff & ") AND "
next
if not SB="" then SB=mid(SB,1,len(SB)-4)

rs.filter=SB
 

Lesen sie die antworten

#1 Peter Götz
29/10/2007 - 10:32 | Warnen spam
Hallo Matthias,

Ich habe ein stàndig geöffnete Recordset in einer
Anwendungsvariablen. Dieses wird vor der Abfrage
einmal geklont (RS.Clone).
Aufgrund einer extrem großen Tabelle ist das anders
leider nicht sinnvoll. Ein neues öffnen des Recordset´s
nach einer Suche fàllt also flach. Nun dachte ich mir,
ich kann meinen ganz normalen Filter auch per
Recordset.Filter auf meinen Recordset-Clone anwenden.



Ja, natürlich kann man das.

Hier ein kleines Beispiel:

' /// Code in einer leeren VB-Form (Form1)
' /// Die Form enthàlt 1 DataGrid "DGridRS"
' /// und ein DataGrid "DGridRSC"

Option Explicit
Private mRS As ADODB.Recordset
Private mRSc As ADODB.Recordset

Private Sub Form_Load()
CreateData
Set DGridRS.DataSource = mRS
Set DGridRSC.DataSource = mRSc
End Sub

Private Sub CreateData()
Dim i As Long
Set mRS = New ADODB.Recordset
With mRS
.Fields.Append "ID", adInteger
.Fields.Append "Bezeichnung", adVarChar, 24

.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic

.Open

For i = 1 To 12
.AddNew
.Fields(0).Value = i
.Fields(1).Value = MonthName(i)
.Update
Next i
End With

Set mRSc = mRS.Clone
mRSc.Filter = "Bezeichnung Like 'M%'"
End Sub

Private Sub Form_QueryUnload _
(Cancel As Integer, _
UnloadMode As Integer)

Set DGridRSC.DataSource = Nothing
Set DGridRS.DataSource = Nothing
Set mRSc = Nothing
mRS.Close
End Sub

' \\\ E N T E


Ich möchte natürlich mehrere Suchbegriffe zulassen
(in meinem Falle getrennt durch ein Leerzeichen).
Wenn ich aber () UND () Verkettungen ausführen möchte
kommt kein Resultat (Recordset.Filter ist danach 0).
Wenn ich hingegen () OR () verkette funktioniert es -
hilft mir aber nichts. Ich möchte Filter wie z.B.
(S1 like '%W1%' OR S2 like '%W1%') AND
(S1 like '%W2%' OR S2 like '%W2%')



Ausdrücke wie '%xyz%' sind für RS-Filter nicht erlaubt.
Die Online-Hilfe zu RS-Filter sagt:

If Operator is LIKE, Value can use wildcards.
Only the asterisk (*) and percent sign (%) wild
cards are allowed,
and they must be the last character in the string.

Was dann also z.B. so was wàre: 'xyz%'

wenn ich eine Spalte S1 und eine S2 habe und
nach den Werten W1 und W2 filtern möchte.
Bislang mußte ich mich mit dieser Art des Filtern´s
nie auseinandersetzen, daher vermute ich eine
Einschrànkung - ich finde nur keine.



Die Online-Hilfe zu ADODB.Recordset.Filter beschreibt
eigentlich schon recht gut die verfügbaren Filtermöglich-
keiten und zeigt sogar Beispiele. Schau Dir das vielleicht
noch mal etwas genauer an.

Kennt irgendjemand dafür eine Lösung?



s.oben:
Platzhalter (wildcards) im Filterausdruck
nur als letztes Zeichen.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen