Just nu i M3-nätverket
Jump to content

Filtrering


www.essential.se

Recommended Posts

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

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

 

Link to comment
Share on other sites

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]

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...