Avatar billede l_domino_l Nybegynder
12. februar 2007 - 12:57 Der er 15 kommentarer og
1 løsning

Select Vælger ALT fra db.

Jeg har en  SQLsætning:
strSQLStudents = "Select * from tbl_Students where tbl_StudentCity ='" & Request.Form("req_City") & "'"

Men hvad nu hvis Request.Form("req_City") = "Alle" Så cracher min SQL...

Hvad kan jeg gøre ved det?

Der skal den jo gå ind og lave *...
Avatar billede softspot Forsker
12. februar 2007 - 13:00 #1
Du må lave en betinget opbygning af din SQL:

strSQLStudents = "Select * from tbl_Students"
if lcase(Request.Form("req_City")) <> "alle" then
  strSQLStudents = strSQLStudents & " where tbl_StudentCity ='" & Request.Form("req_City") & "'"
end if
Avatar billede l_domino_l Nybegynder
12. februar 2007 - 13:03 #2
Ja... men problemet er bare at jeg har flere "Alle"...

ByNavn
Postnummer
Klasse
osv
Avatar billede softspot Forsker
12. februar 2007 - 13:18 #3
Du er nok nød til at uddybe lidt. Jeg kan ikke gennemskue hvad du mener med at en by kan være Alle og at der kan være flere af dem. Vær meget specifik i dine krav til hvad der skal ske og på hvilket grundlag - så er det lettere at hjælpe dig :)
Avatar billede l_domino_l Nybegynder
12. februar 2007 - 13:22 #4
Jeg har 3 listeboxe, i dem er der Bynavne, Postnumre, Klasser (altså 5. klasse9, 6. klasse osv)

I min database har jeg så:
Navn, By, Postnummer, Klasse.

Så skal man kunne vælge en eller flere listeboxe, trykke Vis, og så filtrer den alle den Recordsets som passer med det der er valg i ListeBoxne.
Avatar billede softspot Forsker
12. februar 2007 - 13:23 #5
Men hvis du mener at der er flere felter som udgør kriterier for dit opslag, så er det bare et spørgsmål om at lave flere betingelser under opbygningen af din SQL. Du skal så lige holde styr på om der overhovedet er nogle betingelser (for at kunne vide om WHERE skal med eller ej).

strSQLWhere = ""
strSQLStudents = "Select * from tbl_Students"
if lcase(Request.Form("req_City")) <> "alle" then
  strSQLWhere = strSQLWhere & " tbl_StudentCity ='" & Request.Form("req_City") & "'"
end if
if lcase(Request.Form("req_Bynavn")) <> "alle" then
  if len(strSQLWhere) > 0 then
    ' Angiv at alle kriterier skal være opfyldt
    ' (hvis det er enten eller, så benyttes OR i stedet for AND)
    strSQLWhere = strSQLWhere & " AND "
  end if
  strSQLWhere = strSQLWhere & " tbl_StudentBynavn ='" & Request.Form("req_Bynavn") & "'"
end if

' Hvis der var nogle kriterier, så læg dem til den grundlæggende SQL-sætning
if len(strSQLWhere) > 0 then
  strSQLStudents = strSQLStudents & strSQLWhere
end if
Avatar billede l_domino_l Nybegynder
12. februar 2007 - 13:23 #6
Hvis man så vælger:
ByNavn = Alle
PostNr = Alle
Klasse = 6. Klasse

Skal den vise alle dem der går i 6. klasse.

Hvis man så vælger:
ByNavn = Holstebro
PostNr = Alle
Klasse = 3. Klasse

Skal den vise alle dem der går i 3. Klasse der bor i Holstebro

Osv osv osv
Avatar billede softspot Forsker
12. februar 2007 - 13:24 #7
OK, så vil jeg mene det skal være som ovenstående, men blot hvor du lige udskifter den sidste IF-sætning:

if len(strSQLWhere) > 0 then
  strSQLStudents = strSQLStudents & strSQLWhere
end if

med denne her (der mangler lige et WHERE i den ovenstående streng):

if len(strSQLWhere) > 0 then
  strSQLStudents = strSQLStudents & " WHERE " & strSQLWhere
end if
Avatar billede softspot Forsker
12. februar 2007 - 14:04 #8
Kom du videre med det?
Avatar billede l_domino_l Nybegynder
12. februar 2007 - 14:06 #9
Hmmm

<%

strSQLWhere = ""
strSQLStudents = "Select * from tbl_Students"

if Request.Form("req_City") <> "Alle" then
  strSQLWhere = strSQLWhere & " tbl_StudentCity ='" & Request.Form("req_City") & "'"
end if

if Request.Form("req_City") <> "Alle" then
  if len(strSQLWhere) > 0 then
    ' Angiv at alle kriterier skal være opfyldt
    ' (hvis det er enten eller, så benyttes OR i stedet for AND)
    strSQLWhere = strSQLWhere & " AND "
  end if
  strSQLWhere = strSQLWhere & " tbl_StudentCity ='" & Request.Form("req_City") & "'"
end if

if Request.Form("req_ZipCode") <> "Alle" then
  if len(strSQLWhere) > 0 then
    ' Angiv at alle kriterier skal være opfyldt
    ' (hvis det er enten eller, så benyttes OR i stedet for AND)
    strSQLWhere = strSQLWhere & " AND "
  end if
  strSQLWhere = strSQLWhere & " tbl_StudentZipCode ='" & Request.Form("req_ZipCode") & "'"
end if

if Request.Form("req_Grade") <> "Alle" then
  if len(strSQLWhere) > 0 then
    ' Angiv at alle kriterier skal være opfyldt
    ' (hvis det er enten eller, så benyttes OR i stedet for AND)
    strSQLWhere = strSQLWhere & " AND "
  end if
  strSQLWhere = strSQLWhere & " tbl_StudentsClassGrade ='" & Request.Form("req_Grade") & "'"
end if

' Hvis der var nogle kriterier, så læg dem til den grundlæggende SQL-sætning
if len(strSQLWhere) > 0 then
  strSQLStudents = strSQLStudents & " WHERE " & strSQLWhere
end if

Set rsStudents = Conn.Execute(strSQLStudents)

FEJL:
Fejltype:
(0x80020009)
Undtagelse opstod.
/students.asp, line 137
Avatar billede l_domino_l Nybegynder
12. februar 2007 - 14:22 #10
AHA! Nu kom den sgu.
Avatar billede l_domino_l Nybegynder
12. februar 2007 - 14:25 #11
Men hvis nu jeg vælger noget der ikke kan lade sig gøre dør den.

Kan man ikke lave noget:

If rsStudents.count < 1 Then
response.write "Ingen"
Else
bla bla bla
End If
Avatar billede softspot Forsker
12. februar 2007 - 14:25 #12
Du har kriteriet for req_City med to gange i din SQL-sætning.

Ret koden til dette:

<%

strSQLWhere = ""
strSQLStudents = "Select * from tbl_Students"

if Request.Form("req_City") <> "Alle" then
  strSQLWhere = " tbl_StudentCity ='" & Request.Form("req_City") & "'"
end if

if Request.Form("req_ZipCode") <> "Alle" then
  if len(strSQLWhere) > 0 then
    ' Angiv at alle kriterier skal være opfyldt
    strSQLWhere = strSQLWhere & " AND "
  end if
  strSQLWhere = strSQLWhere & " tbl_StudentZipCode ='" & Request.Form("req_ZipCode") & "'"
end if

if Request.Form("req_Grade") <> "Alle" then
  if len(strSQLWhere) > 0 then
    ' Angiv at alle kriterier skal være opfyldt
    strSQLWhere = strSQLWhere & " AND "
  end if
  strSQLWhere = strSQLWhere & " tbl_StudentsClassGrade ='" & Request.Form("req_Grade") & "'"
end if

' Hvis der var nogle kriterier, så læg dem til den grundlæggende SQL-sætning
if len(strSQLWhere) > 0 then
  strSQLStudents = strSQLStudents & " WHERE " & strSQLWhere
end if

Set rsStudents = Conn.Execute(strSQLStudents)

%>
Avatar billede softspot Forsker
12. februar 2007 - 14:28 #13
Det er altid en god idé at undersøge om den handling man skal igang med er mulig INDEN man udfører den - det sparer oftest resurser ifht. at fejlhåndtere sig ud af situationen.

Derfor bør du udføre et check på om rs.eof = true inden du begynder at læse resultatet.

<%

' OPBYGNINGEN AF SQL-SÆTNINGEN ER GIVET SOM OVENFOR

Set rsStudents = Conn.Execute(strSQLStudents)

if not rs.eof then
  do while not rs.eof
    '
    ' GØR HVAD DER SKAL GØRES MED UDTRÆKKET...
    '
    rs.movenext
  loop
else
  Response.Write "Der var ingen resultater af forespørgslen."
end if
Avatar billede l_domino_l Nybegynder
12. februar 2007 - 14:33 #14
takker
Avatar billede softspot Forsker
12. februar 2007 - 14:42 #15
Velbekomme :)

...og så lige en version som bruger de rigtige variabelnavne og rydder ordentlig op efter sig:

Set rsStudents = Conn.Execute(strSQLStudents)

if not rsStudents.eof then
  do while not rsStudents.eof
    '
    ' GØR HVAD DER SKAL GØRES MED UDTRÆKKET...
    '
    rsStudents.movenext
  loop
else
  Response.Write "Der var ingen resultater af forespørgslen."
end if

rsStudents.close
set rsStudents = nothing
%>
Avatar billede softspot Forsker
19. februar 2007 - 19:41 #16
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester