Just nu i M3-nätverket
Gå till innehåll

Filtrering


www.essential.se

Rekommendera Poster

www.essential.se

Jag har problem med nedanstående filtreringsfunktion.

Om jag vill filtrera på flera, tillexempel både för-och efternamn, så fungerar bara förnamns-filtret.

Min tanke är att den ska ge ett snävare urval om jag väljer flera.. Här är koden:

 

	Function filterArray(thisArray,f_namn,e_namn,lokalavd,alder,kon)
	Dim tmpArray(4,999)
	x = 0
	If len(f_namn)>0 AND NOT f_namn="alla" Then
		For i = 0 to uBound(thisArray,2)
			If uCase(thisArray(0,i))=uCase(f_namn) Then
				for j = 0 to 4
					tmpArray(j,x) = thisArray(j,i)
				Next
				x = x + 1
			End If
		Next
		thisArray = tmpArray
	End If
	x = 0
	If len(e_namn)>0 AND NOT e_namn="alla" Then
		For i = 0 to uBound(thisArray,2)
			If uCase(thisArray(1,i))=uCase(e_namn) Then
				for j = 0 to 4
					tmpArray(j,x) = thisArray(j,i)
				Next
				x = x + 1
			End If
		Next
		thisArray = tmpArray
	End If
	x = 0
	If len(lokalavd)>0 AND NOT lokalavd="alla" Then
		For i = 0 to uBound(thisArray,2)
			If uCase(thisArray(2,i))=uCase(lokalavd) Then
				for j = 0 to 4
					tmpArray(j,x) = thisArray(j,i)
				Next
				x = x + 1
			End If
		Next
		thisArray = tmpArray
	End If
	x = 0
	If len(alder)>0 AND NOT alder="alla" Then
		For i = 0 to uBound(thisArray,2)
			If uCase(thisArray(3,i))=uCase(alder) Then
				for j = 0 to 4
					tmpArray(j,x) = thisArray(j,i)
				Next
				x = x + 1
			End If
		Next
		thisArray = tmpArray
	End If
	x = 0
	If len(kon)>0 AND NOT kon="alla" Then
		For i = 0 to uBound(thisArray,2)
			If uCase(thisArray(4,i))=uCase(kon) Then
				for j = 0 to 4
					tmpArray(j,x) = thisArray(j,i)
				Next
				x = x + 1
			End If
		Next
		thisArray = tmpArray
	End If
	filterArray = thisArray
End Function

 

Länk till kommentar
Dela på andra webbplatser

Hej!

 

Det ser ut som om att du återanvänder X variabeln, vilket får till följd att du skriver över tidigare poster i din array.

 

Tror du skulle få en smidigare lösning om du lade in datat i ett vanligt recordset och sedan satte filter propertyn på det istället. Skulle definivt vara en snyggare lösning och säkert snabbare.

 

/foo

 

Länk till kommentar
Dela på andra webbplatser

www.essential.se

Jag skapar ju en ny array hela tiden

thisArray = tmpArray

 

Där när jag sedan använder X igen så är det mot en ny array. Detta för att jag först vill filtrera ut dom som f_namn stämmer på, och sen bland dom som stämmer, filtrera ut dom som e_namn stämmer på, osv...

 

Men den filtrerar bara en gång. Om jag filtrerar på f_namn och e_namn så reagerar den bara på f_namn.

 

Länk till kommentar
Dela på andra webbplatser

Hej!

 

Tyvärr är det bara en kopia av den temporära arrayen. Sedan jämför du din nya array med exempelvis efternamn, men återanvänder den temporära arrayen. Detta får till följd att gamla värden i temporär arrayen fortfarande finns kvar! Den enkla lösningen vore att redimma temporär arrayen. Dock är din lösning inte särskilt optimerad prestandamässigt.

 

Dina array iterationer kommer alltid att resultera i 999 jämförelser och strängkopieringar. Även din funktion kommer att returnera en jättelik array.

 

Jag tror att det skulle bli enklare att använda ett vanligt recordset samt sätta filter propertyn på det.

 

*********************

 

dim arsData : set arsData = server.createobject("adodb.recordset")

'adVarChar = 200

arsData.fields.append "f_namn", 200, 100

arsData.fields.append "e_namn", 200, 100

arsData.open

 

arsData.addNew

arsData("f_namn") = "foo"

arsData("e_namn") = "fighter"

 

arsData.addNew

arsData("f_namn") = "foo"

arsData("e_namn") = "bar"

 

arsData.addNew

arsData("f_namn") = "foo"

arsData("e_namn") = "fighter"

 

arsData.movefirst

arsData.filter = "f_namn = 'foo' AND e_namn = 'fighter'"

 

while not arsData.eof

response.write arsData(0) & " " & arsData(1) & "<br>"

arsData.movenext

wend

 

*********************

 

/foo

 

[inlägget ändrat 2003-03-15 15:45:18 av foo]

Länk till kommentar
Dela på andra webbplatser

Kan du inte använda den inbyggda Filter funktionen ?

 

"Returns a zero-based array containing a subset of a string array based on a specified filter criteria.

 

Filter(InputStrings, Value[, Include[, Compare]])"

 

Sen kommer väl datan från en databas från början antar jag ? Isåfall är det ju bättre att försöka filtrera redan där, dvs i sql frågan.

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...