webForumDet fria alternativet

förbättra sökvariabler och SQL-fråga

ASP

9 svar · 519 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Hej! :)

Har följnade kod som tar hand om en söksträng och villkor för sökningen.

'Ta emot sökordet
strSearchField = SQLSafe(Trim(Request.querystring("searchField")))

If SQLSafe(Request.querystring("searchOption")) = "eNumber" then
   strOption = "tblExArticle.eNumber = '" & strSearchField & "'"
End if

If SQLSafe(Request.querystring("searchOption")) = "articleName" then
    strOption = "tblExArticle.articleName LIKE '%" & strSearchField & "%'"
End If

If SQLSafe(Request.querystring("order")) = "eNumber" then
  strOrder = "tblExArticle.eNumber"
End If 
 
If SQLSafe(Request.querystring("order")) = "articleName" then
  strOrder = "tblExArticle.articleName, tblExArticle.eNumber"
End if

If pricesetting = 0 then
	strOrderBy = 8
Else
	strOrderBy = 9
End if

Själva SQL-frågan ser ut så här:

strSQL = 	"SELECT DISTINCT tblExArticle.eNumber, tblExArticle.articleName, tblExArticle.articleUnit, tblExPrice.articlePrice, " &_ 
			"tblExSupplier.SupplierName, tblExPrice.articleCategory, tblExDiscount.articleDiscount, articlePrice*0.01 " &_ 
			"AS articleNetPrice, iif(articleDiscount is null, 0.01*articlePrice, 0.01*[articlePrice]*(1-([articleDiscount]*0.01))) " &_
		 	"AS articlePriceWithDiscount " &_ 
			"FROM ((tblExArticle INNER JOIN tblExPrice ON tblExArticle.eNumber = tblExPrice.eNumber) " &_ 
			"LEFT JOIN tblExDiscount ON tblExPrice.articleCategory = tblExDiscount.articleCategory) " &_
         	"INNER JOIN tblExSupplier ON tblExPrice.articleSupplierId = tblExSupplier.SupplierId WHERE " & strOption & " " &_
			"ORDER BY " & strOrder & ", " & strOrderBy & " ASC"

Det fungerar så som jag vill ha det, men jag tycker det är lite klumpigt....

Hur skulle man kunna förbättra/snygga till det hela?
och
Hur "brukar man göra" med sql-frågor som har olika sökalternativ?

Mvh
henrik

Medlem sedan dec. 19996 721 inlägg
#2

Det är väl helt OK, men

-Onödigt att använda SQLSafe i if-satserna. Det är ju inget som ingår i SQL-frågan
-Det blir fel om "searchOption" eller "order" varken är "eNumber" eller "articleName".
-Använd ElseIf i stället för flera If.

Medlem sedan jan. 20013 582 inlägg
#3

:)

Ska titta på det.... Tack så länge

Mvh
henrik

Medlem sedan jan. 20013 582 inlägg
#4

tjabbarangs!

Nu ser koden ut så här:

'Ta emot sökordet
sSearchField = SQLSafe(Trim(Request.querystring("searchField")))

'Ta emot sökvillkor
sSearchOption = Request.querystring("searchOption")
sSearchOrder = Request.querystring("order")

'Kod för att sätta hur priser ska visas (ordinarie eller avtal)
if Request.Cookies("sydostelPrice")("PriceSetting") = "" then
	iPriceSetting = 0
else
	iPriceSetting = cint(Request.Cookies("sydostelPrice")("PriceSetting"))
end if

'Sätta defaultvärden
sOption = "tblExArticle.eNumber"
sOrder1 = "tblExArticle.eNumber"

'Sätta sökvillkor. Sökning på eNumber eller articleName
If sSearchOption = "eNumber" then
	sOption = "tblExArticle.eNumber = '" & sSearchField & "'"
ElseIf sSearchOption = "articleName" then
    sOption = "tblExArticle.articleName LIKE '%" & sSearchField & "%'"
End If

'Sätta första sorteringsvillkoret
If sSearchOrder = "eNumber" then
	sOrder1 = "tblExArticle.eNumber"
ElseIf sSearchOrder = "articleName" then
	sOrder1 = "tblExArticle.articleName, tblExArticle.eNumber"
End if

'Sätta andra sorteringsvillkoret
If iPriceSetting = 0 then
	sOrder2 = "8"
Else
	sOrder2 = "9"
End if

och sql-frågan

strSQL = 	"SELECT DISTINCT tblExArticle.eNumber, tblExArticle.articleName, tblExArticle.articleUnit, tblExPrice.articlePrice, " &_ 
			"tblExSupplier.SupplierName, tblExPrice.articleCategory, tblExDiscount.articleDiscount, articlePrice*0.01 " &_ 
			"AS articleNetPrice, iif(articleDiscount is null, 0.01*articlePrice, 0.01*[articlePrice]*(1-([articleDiscount]*0.01))) " &_
		 	"AS articlePriceWithDiscount " &_ 
			"FROM ((tblExArticle INNER JOIN tblExPrice ON tblExArticle.eNumber = tblExPrice.eNumber) " &_ 
			"LEFT JOIN tblExDiscount ON tblExPrice.articleCategory = tblExDiscount.articleCategory) " &_
         	"INNER JOIN tblExSupplier ON tblExPrice.articleSupplierId = tblExSupplier.SupplierId WHERE " & sOption & " " &_
			"ORDER BY " & sOrder1 & ", " & sOrder2 & " ASC"

Är det rätt, eller fel... ;)

och kan det förbättras ännu mer?

Mvh
henrik

Medlem sedan dec. 20025 483 inlägg
#5

Att sätta sOption = "tblExArticle.eNumber" som defaultvärde kommer inte att fungera. Det du vill ha är sOption = "tblExArticle.eNumber = '" & sSearchField & "'". Från bl.a. det följer att vi kan förenkla if-satserna en aning.

'Kod för att sätta hur priser ska visas (ordinarie eller avtal)
if Request.Cookies("sydostelPrice")("PriceSetting") = "" then
	iPriceSetting = 0
else
	iPriceSetting = cint(Request.Cookies("sydostelPrice")("PriceSetting"))
end if

'Ta emot sökordet
sSearchField = SQLSafe(Trim(Request.querystring("searchField")))

'Ta emot sökvillkor
sSearchOption = Request.querystring("searchOption")
sSearchOrder = Request.querystring("order")

'Sätta defaultvärden
sOption = "tblExArticle.eNumber = '" & sSearchField & "'"
sOrder1 = "tblExArticle.eNumber"

'Sätta sökvillkor. Sökning på eNumber eller articleName
If sSearchOption = "articleName" then
    sOption = "tblExArticle.articleName LIKE '%" & sSearchField & "%'"
End If

'Sätta första sorteringsvillkoret
If sSearchOrder = "articleName" then
	sOrder1 = "tblExArticle.articleName, " & sOrder1
End if

'Sätta andra sorteringsvillkoret
If iPriceSetting = 0 then
	sOrder2 = "8"
Else
	sOrder2 = "9"
End if

:)

Medlem sedan jan. 20013 582 inlägg
#6

Att sätta sOption = "tblExArticle.eNumber" som defaultvärde kommer inte att fungera. Det du vill ha är sOption = "tblExArticle.eNumber = '" & sSearchField & "'".

Kan du förklara det?

Mvh
henrik

Medlem sedan dec. 20025 483 inlägg
#7

Japp :)

Antag att searchOption = "foobar". Då kommer defaultvärdet att användas vilket resulterar i följande:

WHERE " & sOption & " " &_
     =>
WHERE tblExArticle.eNumber (<- vad skall detta betyda?)

Du vill ju nämligen jämföra tblExArticle.eNumber med något, t.ex.:

WHERE tblExArticle.eNumber [b]=[/b] 'hejhopp'
Medlem sedan jan. 20013 582 inlägg
#8

:r

Jo! det är klart!

Inget annat som kan förbättras?

Mvh
henrik

Medlem sedan dec. 20025 483 inlägg
#9

Jag tycker det ser bra ut nu. :)

Medlem sedan jan. 20013 582 inlägg
#10

dåså....

Tackar!

Mvh Henrik :)

257 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)