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.
9 svar · 519 visningar · startad av devotion
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
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.
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
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
:)
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
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'
Jag tycker det ser bra ut nu. :)