31. januar 2007 - 08:47Der er
20 kommentarer og 1 løsning
Søgefunktion med selectbokse
Hej eksperter, Nu håber jeg dette er den korrekte kategori at putte mit sp. i.
Jeg har en HTML side der er koblet på en access DB meed ASP. Jeg står og skal lave en søgefunktion. Denne søgefunktion skal fungere via selectbokse. Jeg har ialt 9
selectbokse. Ideèn er at bruger skal kunne indskrænke sin søgning for at få bedste resultat. Dvs. jo
flere selectbokse der medtages jo mere indskrænket søgning. Hvis en selectboks ikke medtages skal den
ikke indgå i søgekriteriet. Selectboksene får deres værdier fra databasen med DISTINCT naturligvis.
Jeg har rodet lidt SQL og kan som sådan godt få det til at virke (rent teoretisk) hehe.. Jeg har forsøgt
at lade første valgmulighed i hver select være tom udfra tanken om at hvis man så ikke rør den så er der
ingen tekststreng at søge på. Problemet er jo så bare at den bliver taget med og så finder alle de steder
i kolonnen hvor feltet er tomt. (NULL værdier skal være tilladt).
Den ligger måske lige til højrebenet men jeg kan ikke lige greje den. Så kom endelig med nogle forslag
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Svært når du ikke skriver mere men kan du ikke bare skrive en værdi i value i det første valg som du er sikker på ikke findes i den kollonne der skal søges i i access
LN
Synes godt om
Slettet bruger
31. januar 2007 - 09:54#3
Du kunne opbygge en streng på baggrund af de udfyldte felter og bruge denne streng som filter og så køre requery!~)
ellers så brug thomas jepsens dynamiske søgning, som ligger til download på www.makeiteasy.dk
Du har fat i det rigtige. Når du trykker på din submit-knap sendes værdien af dine selectboxe med POST eller GET til resultatsiden (som kan være den samme side).
Du skal inspicere værdierne af dine selectboxe og opbygge din SQL. Værdien "Ingen" eller "Alle" kan f.eks. sættes til 0, hvilket formentlig ikke optræder som ID i din tabel.
Når dette sender til resultatsiden kan du opbygge din SQL således:
Dim SQL Dim iAND iAND=0 'styrer om det er det første kriterie der tilføjes
SQL = "SELECT * FROM tabel1 "
If request.querystring("frugt")<>0 Then If instr(SQL,"WHERE")=0 Then SQL = SQL & "WHERE " End if If iAND=0 Then SQL = SQL & " AND " iAND = iAND + 1 End if SQL = SQL & " frugt = '" & request.querystring("frugt") & "'" End if
Ovenstående klump indsættes for hver select-box. Som du kan se er det er par krumspring for at få "WHERE" og "AND" indføjet korrekt. Hvis du har flere kriterier vil WHERE og AND indføjes hvor de skal. Ovenstående er ikke testet.
Hej Jesper, jooeee hvis det virker så er det det jeg er ude efter ;). Jeg forstår bare ikke princippet 100%. Jeg har prøvet at sætte koden ind så det skulle virke med 2 af selectboksene. Men den selecter bare hele møjet når jeg submitter. Som om den kun bruger SELECT * FROM.
For at gøre det lidt nemmere vil jeg prøve at specificere det lidt:
Jeg har min "form" side med selectboksene. 2 af dem ser således ud:
[form_siden] --------------------------------------------------------------------------- <select name="search_article_number"> <% strSQL = "Select DISTINCT article_number from MIN_TABEL" Set rs = Conn.Execute(strSQL) %> <option value="0"></option> <%Do%> <option value="articleno"><%Response.Write rs("article_number")%></option> <% rs.MoveNext Loop While Not rs.EOF %> </select>
OG
<% strSQL = "Select DISTINCT supplier from MIN_TABEL" Set rs = Conn.Execute(strSQL) %> <option value="0"></option> <%Do%> <option value="supplier"><%Response.Write rs("supplier")%></option> <% rs.MoveNext Loop While Not rs.EOF %> </select> ----------------------------------------------------------------------
Disse to kriterier vil jeg så gerne anvende i en søgning. Hvis den ene udelades (value=0, som du skrev), skal den ikke medtages i søgningen, og begge skal selvfølgelig indkrænse resultatet.
Jeg har så min søge_resultatside, hvor jeg har forsøgt med dit forslag (uden helt at være 100% inde i det: --------------------------------------------------------------------------- Dim SQL Dim iAND iAND=0 'styrer om det er det første kriterie der tilføjes
SQL = "SELECT * FROM MIN_TABEL"
If request.querystring("search_article_number")<>0 Then If instr(SQL,"WHERE")=0 Then SQL = SQL & "WHERE " End if If iAND=0 Then SQL = SQL & " AND " iAND = iAND + 1 End if SQL = SQL & " search_article_number = '" & request.querystring("search_article_number") & "'" End if
Set rs = Conn.Execute(SQL)
Dim SQL2 Dim iAND2 iAND2=0 'styrer om det er det første kriterie der tilføjes
SQL2 = "SELECT * FROM MIN_TABEL"
If request.querystring("search_supplier")<>0 Then If instr(SQL2,"WHERE")=0 Then SQL2 = SQL2 & "WHERE " End if If iAND2=0 Then SQL2 = SQL2 & " AND " iAND2 = iAND2 + 1 End if SQL2 = SQL2 & " search_supplier = '" & request.querystring("search_supplier") & "'" End if
Set rs = Conn.Execute(SQL2) ------------------------------------------------------------------------
Efter denne kode har jeg så nogle Response.Write som udskriver de rækker hvor de valgte kriterier er opfyldt. Det der sker er dog bare at den udskriver ALT, altså formentlig kun bruger SELECT * FROM MIN_TABEL.
Kan du evt. præsicere hvad du mener, for jeg er som sagt ikke helt med.
således at når man vælger et artikelnummer så sendes dette nummer også videre med formularen. Som det er nu er det altid teksten "articleno" du sender videre og det kan jo ikke bruges til at finde en bestemt post i en database. Som jeg lsæer din SQL skal den lede efter artikelnummer.
Du kan rette: <option value="0"></option> til <option value="0">Ikke angivet</option> hvis den øverste valgmulighed skal gøre at der ikke søges på dette kriterie.
Du skrev: ...altså formentlig kun bruger SELECT * FROM MIN_TABEL.... Det er tit smart at udskrive din SQL med response.write SQL & "<br>" på siden - så kan du se om den bruger den SQL, som du har tænkt dig.
Videre til opbygning af SQL-sætningen:
Du skal bare bruge Dim SQL Dim iAND Dim iSearch_article_number Dim iSearch_supplier
én gang (skrot SQL2 og iAND2)
Hvis du opbygge din SQL med search_article_number og search_supplier vil jeg bruge følgende:
'læg evt. disse i variabler, så de er nemmere at arbejde med iSearch_article_number=request.querystring("search_article_number") iSearch_supplier=request.querystring("search_supplier")
'Articlenumber If iSearch_article_number <> 0 Then If iAND = 0 Then SQL = SQL & "WHERE " Else SQL = SQL & "AND " End If SQL = SQL & search_article_number=" & iSearch_article_number & " " iAND = iAND + 1 End If
'Supplier If iSearch_supplier <> 0 Then If iAND = 0 Then SQL = SQL & "WHERE " Else SQL = SQL & "AND " End If SQL = SQL & search_supplier=" & iSearch_supplier & " " iAND = iAND + 1 End If
og så kan du lige på siden udskriv din SQL og se om den bliver til
SELECT * FROM MIN_TABEL WHERE search_article_number = 55 AND search_supplier = 60 (for eksempel)
---------------------------------------------------------------------------------- Dim SQL Dim iAND Dim iSearch_article_number = Request.querystring("search_article_number") Dim iSearch_supplier = request.querystring("search_supplier")
'Articlenumber If iSearch_article_number <> 0 Then If iAND = 0 Then SQL = SQL & "WHERE " Else SQL = SQL & "AND " End If SQL = SQL & search_article_number=" & iSearch_article_number & " " iAND = iAND + 1 End If
'Supplier If iSearch_supplier <> 0 Then If iAND = 0 Then SQL = SQL & "WHERE " Else SQL = SQL & "AND " End If SQL = SQL & search_supplier=" & iSearch_supplier & " " iAND = iAND + 1 End If
Error Type: Microsoft VBScript compilation (0x800A0401) Expected end of statement /stephan/search_results.asp, line 18, column 27 Dim iSearch_article_number = Request.querystring ("search_article_number") --------------------------^
<select name="search_supplier"> <% strSQL = "Select DISTINCT supplier from complaints07" Set rs = Conn.Execute(strSQL) %> <option value="0"></option> <%Do%> <option value="<%Response.Write rs("supplier")%>"><%Response.Write rs("supplier")%></option> <% rs.MoveNext Loop While Not rs.EOF %> </select> -----------------------------------------------------------------------------
[Søge_resultatsiden] ------------------------------------------------------------------------ Dim SQL Dim iAND Dim isearch_article_number Dim isearch_supplier
P.S. Det er ikke fordi der et sted står complaint07 istedet for MIN_TABEL. Det var bare for overskuelighedens skyld at jeg rettede til MIN_TABEL, men glemte så bare en. I mit egen eksempel ER de ens ;)
YEP! nu virker det. Havde som sagt lidt svært ved at se hvor du ville hen (manglende/for lidt erfaring), men "Response.write`erne" afslører det jo fint....og løsningen er dælme smart ;). Der var lige nogle små syntax`ere jeg lige måtte rette (Den første if -sætning i supplier delen manglede nogle "" omkring 0).
Du har været en KANON hjælp og du skal have dine point. Jeg vil gerne give dig op til 60, så jeg ved ikke om jeg lige skal oprette et proforma sp. til uddeling af ekstra 40 point til dig??
Selv tak Stephan. Godt at høre det virker! Og ja response.write'r er gode til at afsløre hvad der foregår undervejs. Pyt med ekstrapoint - det kan være jeg kan hjælpe en anden gang :-)
Synes godt om
Ny brugerNybegynder
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.