Avatar billede staf Nybegynder
31. januar 2007 - 08:47 Der 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

gerne kodestumper.



På forhånd tak

Mvh. Stephan
Avatar billede terry Ekspert
31. januar 2007 - 08:51 #1
If you want to search from your ASP pages then I think its in that category you have the best chance of getting an answer Stephan
Avatar billede lordnelson Seniormester
31. januar 2007 - 09:40 #2
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
Avatar billede 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
Avatar billede Slettet bruger
31. januar 2007 - 09:55 #4
Den hedder filter- og søgefunktion!~)
Avatar billede jesperfjoelner Nybegynder
31. januar 2007 - 10:38 #5
Staf>

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.

HTML for en selectbox kunne være:

<Select name="frugt">
<option value='0' selected>Alle</option>
<option value='1'>Æbler</option>
<option value='2'>Pærer</option>
<option value='3'>Bananer</option>
</select>

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.

Og til sidst

rs.open SQL

Do while rs.EOF...
osv

Var det noget i den stil du var efter?
Avatar billede staf Nybegynder
31. januar 2007 - 15:35 #6
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.


På forhånd tak
Avatar billede jesperfjoelner Nybegynder
31. januar 2007 - 16:23 #7
Første sektion hvor du laver din dropdownboks ser helt fin ud.
Dog tror jeg du skal have rettet dette

<%Do%>
<option value="articleno"><%Response.Write rs("article_number")%></option>

til

<%Do%>
<option value="<%response.write rs("article_number") %>"><%Response.Write rs("article_number")%></option>

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)
Avatar billede staf Nybegynder
31. januar 2007 - 20:38 #8
Hej Jesper, nu har jeg pr&#248;vet flg.:

----------------------------------------------------------------------------------
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

'SQL = "SELECT * FROM MIN_TABEL"
'Set rs = Conn.Execute(SQL)
Response.Write(SQL)
-----------------------------------------------------------------------------


Men jeg f&#229;r desv&#230;rre flg. fejlmeddelse:

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")
--------------------------^
Avatar billede jesperfjoelner Nybegynder
31. januar 2007 - 22:12 #9
Det må ikke sættes på samme linje - det skal være:

Dim iSearch_article_number
Dim iSearch_supplier

iSearch_article_number = Request.querystring("search_article_number")
iSearch_supplier = request.querystring("search_supplier")
Avatar billede staf Nybegynder
31. januar 2007 - 22:52 #10
OK! nu har jeg slettet (udkommenteret) alt andet p&#229; min s&#248;ge_resultatside og har kun min DB tilgang og nedenst&#229;ende:

Dim SQL
Dim iAND
Dim iSearch_article_number 
Dim iSearch_supplier


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

Response.Write(SQL)



N&#229;r jeg k&#248;rer dette skriver den intet ud ???

P.S. Jeg er naturligvis villig til at smide flere point til dig n&#229;r det virker.....kald mig bare desperat ;)

Forl&#248;bigt tak for din hj&#230;lp  :)
Avatar billede jesperfjoelner Nybegynder
31. januar 2007 - 23:10 #11
Du skal også lige have

SQL = "SELECT * FROM tabel1" i starten

prøv at ændre det til:

Dim SQL
Dim iAND
Dim iSearch_article_number
Dim iSearch_supplier


iSearch_article_number = request.querystring("search_article_number")
iSearch_supplier = request.querystring("search_supplier")

response.write iSearch_article_number & "<br>"
response.write iSearch_supplier & "<br>"

for at se hvad værdierne er.
Avatar billede jesperfjoelner Nybegynder
31. januar 2007 - 23:21 #12
Du kan evt. vise mig hjemmesiden, hvis du synes det kunne hjælpe.
Avatar billede staf Nybegynder
01. februar 2007 - 13:12 #13
Jeg har desværre ikke mulighed for at give dig et link da jeg kun har det lokalt. Jeg har nu prøvet nedenstående:


[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="<%Response.Write rs("article_number")%>"><%Response.Write rs("article_number")%></option>

<%
rs.MoveNext
Loop While Not rs.EOF                       
%>
</select>
</td>
<td width="100px" colspan="3"></td>
</tr>
<tr><td height="8px"></td></tr>

<tr>
<td width="20px">&nbsp;</td>                       
<td class="globaltext_in_search" width="200px">Supplier:</td>
<td width="200px" align="left">

<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

isearch_article_number  = request.querystring("'search_article_number'")
isearch_supplier = request.querystring("'search_supplier'")


SQL = "SELECT * FROM MIN_TABEL"
'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
Set rs = Conn.Execute(SQL)
DO

response.write iarticle_number & "<br>"
response.write isupplier & "<br>"

'&"<br>"
  rs.MoveNext
  Loop While Not rs.EOF                       

Conn.Close
Set Conn = Nothing   
---------------------------------------------------------------------------

Det giver mig ingen fejlmeddelelse men heller intet output, blot en blank side!?
(Form action er i orden, så det er ikke der problemet ligger)

Jeg har svært ved at prøve forskellige ting i forhold til dit forslag da jeg ikke helt har fat i pricippet.
Avatar billede staf Nybegynder
01. februar 2007 - 13:15 #14
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 ;)
Avatar billede jesperfjoelner Nybegynder
01. februar 2007 - 17:35 #15
Jeg er lige ved at kigge på det, vender snart tilbage.
Avatar billede jesperfjoelner Nybegynder
01. februar 2007 - 18:39 #16
<form method="post">

<select name="search_article_number">
<%
strSQL = "Select DISTINCT article_number from tabel1"
Set rs = Conn.Execute(strSQL)
%>
<option value="0"></option>
<%Do%>
<option value="<%Response.Write rs("article_number")%>"><%Response.Write rs("article_number")%></option>

<%
rs.MoveNext
Loop While Not rs.EOF                     
%>
</select>
</td>
<td width="100px" colspan="3"></td>
</tr>
<tr><td height="8px"></td></tr>

<tr>
<td width="20px">&nbsp;</td>                     
<td class="globaltext_in_search" width="200px">Supplier:</td>
<td width="200px" align="left">

<select name="search_supplier">
<%
strSQL = "Select DISTINCT supplier from tabel1"
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>
<input type="submit" name="submit" value="Søg"
</form>




<%
If request.form("submit")<>"" Then

Dim SQL
Dim iAND
Dim article_number
Dim supplier

article_number = request.form("search_article_number")
supplier = request.form("search_supplier")


SQL = "SELECT * FROM tabel1"
response.write SQL & "<br>"
response.write "article_number: " & article_number & "<br>"
response.write "supplier: " & supplier & "<br>"
'response.end

'Articlenumber
If article_number <> "0" Then
    If iAND = 0 Then
        SQL = SQL & "WHERE "
    Else
        SQL = SQL & "AND "
    End If
    SQL = SQL & "article_number = '" & article_number & "' "
    iAND = iAND + 1
End If


'Supplier
If supplier <> 0 Then
    If iAND = 0 Then
        SQL = SQL & "WHERE "
    Else
        SQL = SQL & "AND "
    End If
    SQL = SQL & "supplier = " & supplier & " "
    iAND = iAND + 1
End If

response.write SQL & "<br>"
Set rs = Conn.Execute(SQL)

Do while not rs.eof
    response.write rs("article_number") & " " & rs("supplier") & "<br>"
    rs.MoveNext
Loop                     

Conn.Close
Set Conn = Nothing 


End if


%>
Avatar billede jesperfjoelner Nybegynder
01. februar 2007 - 18:41 #17
hov skift lige disse til


'Articlenumber
...
    SQL = SQL & "article_number = " & article_number & " "
...


'Supplier
...
    SQL = SQL & "supplier = " & supplier & " "
...


hvis supplier og article_number altså er tal (?)
hvis det er tekst (felttype i tabellen) skal det være hhv.:

'Articlenumber
...
    SQL = SQL & "article_number = '" & article_number & "' "
...


'Supplier
...
    SQL = SQL & "supplier = '" & supplier & "' "
...
Avatar billede staf Nybegynder
01. februar 2007 - 19:01 #18
OK! super.
skal lige have pr&#248;vet det igennem og vender tilbage :)
Avatar billede staf Nybegynder
03. februar 2007 - 23:11 #19
Hej Jesper,
Har ikke glemt tråden, men kommer først til min PC igen i morgen søndag.
Avatar billede staf Nybegynder
04. februar 2007 - 21:28 #20
YEP! nu virker det. Havde som sagt lidt sv&#230;rt ved at se hvor du ville hen (manglende/for lidt erfaring), men "Response.write`erne" afsl&#248;rer det jo fint....og l&#248;sningen er d&#230;lme smart ;). Der var lige nogle sm&#229; syntax`ere jeg lige m&#229;tte rette (Den f&#248;rste if -s&#230;tning i supplier delen manglede nogle "" omkring 0).

Du har v&#230;ret en KANON hj&#230;lp og du skal have dine point. Jeg vil gerne give dig op til 60, s&#229; jeg ved ikke om jeg lige skal oprette et proforma sp. til uddeling af ekstra 40 point til dig??

Mvh.
Stephan
Avatar billede jesperfjoelner Nybegynder
04. februar 2007 - 21:38 #21
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 :-)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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