Avatar billede andersasp Nybegynder
14. januar 2005 - 00:02 Der er 32 kommentarer og
5 løsninger

Søgning på flere værdier ord1, ord2, ord3

Hejsa!

Jeg har en søgefunktion hvor man skal kunne vælge flere værdier fra en liste som så bliver komma sep. i en QueryString

Men hvis man vælger flere værdier vil den ikke vise resultaterne??

Jeg bruger nedenstående nu????????  Håber der er nogle der kan hjælpe!

if request.QueryString("soegeord") = "" then
medlemmer.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & request.QueryString("kommunenr") & " ORDER BY Virksomhedsnavn ASC"
else
medlemmer.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & request.QueryString("kommunenr") & " AND Fservices LIKE '%" & request.QueryString("soegeord") & "%' ORDER BY Virksomhedsnavn ASC"
end if
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 00:08 #1
Du skal bruge IN istedet for LIKE i din SQL.
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 00:15 #2
Husk at dersom request.QueryString("soegeord") returnerer tekst, skal du have enkelt plinger rundt hvert element: "'tekst1',  'tekst2', 'tekst3'".
Dette er nok nemmest at lave i den asp der genererer soegeord.
Avatar billede andersasp Nybegynder
14. januar 2005 - 00:15 #3
ok! men hvis jeg skriver således:

Fservices IN (" & request.QueryString("soegeord") & ") ORDER BY Virksomhedsnavn ASC"

kommer den med fejlen "No value given for one or more required parameters."
Avatar billede andersasp Nybegynder
14. januar 2005 - 00:17 #4
Ups fik ikke lige dit sidste svar med!

er det en måde at "replace" de komma tegn med 'ord'???
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 00:23 #5
Kan du prøve noget i retning af:
Fservices In ('" & Replace(request.QueryString("soegeord"), ",", "','") & "') ORDER BY Virksomhedsnavn ASC"
Avatar billede andersasp Nybegynder
14. januar 2005 - 00:30 #6
Nu kommer der ingen fejl, men desværre heller ingen resultater:(

Hvis jeg ændrer det til LIKE får jeg et hit med det første søgeord, men når jeg ændrer det til IN og søger på det samme ord, er der ingen resultater!!
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 00:37 #7
Hvis du bruger LIKE, søger du efter forekomster af Fservices, der indeholder teksten i LIKE. Det er ikke det du ønsker, vil jeg mene. Du ønsker vel forekomster af Fservices hvor Fservices er indeholdt i request.QueryString("soegeord"), ",", "','") ?
Hvad med at skrive ud Replace(request.QueryString("soegeord"), ",", "','") og se hvad den indeholder? Eller skriv ud medlemmer.Source med Response.Write, og test direkte mod databasen? Send eventuelt resultatet af Replace(request.QueryString("soegeord"), ",", "','") til eksperten, så kigger jeg på det. Men jeg går nok i seng om lidt.
Avatar billede andersasp Nybegynder
14. januar 2005 - 00:41 #8
Ok! jeg prøvede bare lige LIKE for at se om der nu også kom nogle resultater:)

Når jeg skriver replace sætnigen ud ser det således ud!!

'sogeor1',' sogeor2',' sogeor3','

Tak for hjælpen indtil videre!!
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 00:48 #9
Du har et komme for meget til sidst. Kan du klare at fjerne det sidste komme inden du sender det i query string, eller skal der bruges noget VBScript til at fjerne det siste tegn i søgestrengen?
Du kan eventuelt lave en variabel hvor du overfører værdien:

Dim sogeord
sogerord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord")-1))

og så i din SQL kan du have:
Fservices In ('" & Replace(soegeord), ",", "','") & "') ORDER BY Virksomhedsnavn ASC"
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 00:49 #10
Beklager skrivefejl. Det er komma jeg mener og ikke komme. På tide at komme sig i seng ;-)
Avatar billede kjulius Novice
14. januar 2005 - 02:15 #11
Som jeg ser det, så har du en ikke-optimal tabel (medlemmer), hvor du har et stort tekstfelt med alle aktuelle services, altså f.eks. 'service1, service3, service7'. Det er absolut ikke måden at gøre det på, hvis du er interesseret i en hurtig forespørgsel, for så er du som du selv er inde på nødt til at bruge LIKE funktionen. For det første er LIKE ikke under nogen omstændigheder optimal, da den ikke kan bruge indekser, men skal søge alle rows som opfylder evt. andre kriterier.

Det ville være meget bedre at flytte denne information til en selvstændig tabel som der så kan joines til (en row pr service). Så ville du kunne bruge IN instruktionen, som lorentsnv er inde på.

Hvis du derimod fastholder den nuværende struktur, er du nødt til at oprette en LIKE for hver funktion der søges på. Altså .. AND (Fservice LIKE '%Service1%' OR Fservice LIKE '%Service8%')
Det kræver selvsagt noget mere kode. Det kunne f.eks. ligne dette:

sql = "SELECT * FROM medlemmer WHERE kommunenr =" & _
        request.QueryString("kommunenr")
If request.QueryString("soegeord") <> "" Then
    inp = request.QueryString("soegeord")
    Filter = " AND (Fservices LIKE '%"
    Do
        ' Søg efter et komma...
        pos = InStr(pos + 1, inp, ",")
        If pos > 0 Then
            If prevpos > 0 Then
                Filter = Filter & " OR fServices LIKE '%"
            End If
            Filter = Filter & Trim(Mid(inp, prevpos + 1, pos - prevpos - 1)) & "%'"
            prevpos = pos
        Else
            ' Ikke flere søgeord...
            Filter = Filter & " OR fServices LIKE '%" & _
                Trim(Mid(inp, prevpos + 1, Len(inp) - prevpos)) & "%')"
        End If
    Loop Until pos = 0
    sql = sql & Filter
End If
sql = sql & " ORDER BY Virksomhedsnavn ASC"
medlemmer.source = sql

Disclaimer: Koden er ikke gennemtestet...
Avatar billede kjulius Novice
14. januar 2005 - 02:23 #12
Tilføjelse:

prevpos bør initieres i starten af rutinen, altså:
prevpos = 0
Avatar billede kjulius Novice
14. januar 2005 - 09:24 #13
Okay, ved nærmere eftertanke kan det faktisk gøres meget lettere ved at bruge Replace instruktionen, som lorentsv også brugte:

If request.QueryString("soegeord") = "" Then
    medlemmer.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & request.QueryString("kommunenr") & " ORDER BY Virksomhedsnavn ASC"
Else
    medlemmer.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & _
        " AND (Fservices LIKE '%" & _
        Replace(request.QueryString("kommunenr"), ",", " AND Fservices LIKE '%") & _
        "%') ORDER BY Virksomhedsnavn ASC"
End If
Avatar billede kjulius Novice
14. januar 2005 - 09:26 #14
Argh, det der skal replaces er selvfølgelig søgeord:

If request.QueryString("soegeord") = "" Then
    medlemmer.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & request.QueryString("kommunenr") & " ORDER BY Virksomhedsnavn ASC"
Else
    medlemmer.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & _
        " AND (Fservices LIKE '%" & _
        Replace(request.QueryString("soegeord"), ",", " AND Fservices LIKE '%") & _
        "%') ORDER BY Virksomhedsnavn ASC"
End If
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 09:28 #15
Jeg kan nu se at der er et blankt tegn/space forran søgeord 2 og 3. Jeg tror derfor du skal have en space med i din søgestreng i Replace:  ', '

Dim sogeord
sogerord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord")-1))

og så i din SQL kan du have:
Fservices In ('" & Replace(soegeord), ", ", "','") & "') ORDER BY Virksomhedsnavn ASC"

Ellers er jeg ikke helt enig i hvad kjulius skriver.

Du ville bruge LIKE hvis din søgestreng indeholdt en substreng af feltet Fservices. Hvis din søgestreng indeholdt 'anders' kunne du søge frem alle forekomster af Fservices der 'anders' var en del af teksten ved følgende SQL:

SELECT * FROM medlemmer WHERE Fservices LIKE '%anders%'

Som jeg forstår det, får du en liste med søgeord returneret fra din QueryString, og du vil søge frem alle forekomster af Fservices der indeholder et af ordene i listen. Jeg går ud fra at de enkelte søgeord ikke kun er en substring af hvad du vil søge i i Fservices. I så fald har jeg misforstået, og så skal du bruge LIKE. Hvis din substring er 'sogeor1','sogeor2','sogeor3', og du har værdier i Fservices som er enten 'sogeor1' elle 'sogeor2' eller 'sogeor3', skal du bruge IN.
Avatar billede andersasp Nybegynder
14. januar 2005 - 10:38 #16
Jeg tror jeg vil få IN til at virke til at starte med!

når jeg smider:
Dim sogeord
sogerord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord")-1))

i toppen og:

Fservices In ('" & Replace(soegeord), ", ", "','") & "') ORDER BY Virksomhedsnavn ASC"

ind i SQLen kommer den med fejlen:

Microsoft VBScript compilation error '800a0401'

Expected end of statement

her: Fservices In ('" & Replace(soegeord), <--
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 10:42 #17
Unskyld, jeg har fået en parantes for meget med, efter soegeord. Det skla være:

Fservices In ('" & Replace(soegeord, ", ", "','") & "') ORDER BY Virksomhedsnavn ASC"
Avatar billede andersasp Nybegynder
14. januar 2005 - 11:06 #18
Nu kommer den med fejl i "dim" sætningen ??

Microsoft VBScript runtime error '800a000d'

Type mismatch: '[string: "sogeord1"]'

/tester/normalsoegning.asp, line 8
Avatar billede andersasp Nybegynder
14. januar 2005 - 11:07 #19
således ser query ud: normalsoegning.asp?soegeord=sogeord1&Kommunenr=727
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 11:12 #20
Det skyldes måske en skrivefejl jeg lavet i nat:
Dim sogeord
sogerord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord")-1))


I linie 2 har jeg skrevet sogerord. Det skal være sogeord. Prøv med:
Dim sogeord
sogeord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord")-1))
Avatar billede andersasp Nybegynder
14. januar 2005 - 11:21 #21
Det havde jeg nu rettet, så den kommer desværre stadig med samme fejl!!
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 11:27 #22
Kan du ikke vise de første 15-20 liner af denne asp-fil?
Avatar billede andersasp Nybegynder
14. januar 2005 - 11:33 #23
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="Connections/medslemsd.asp" -->
<%
Dim sogeord
sogeord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord")-1))

Dim medlemmerne
Dim medlemmerne_numRows

Set medlemmerne = Server.CreateObject("ADODB.Recordset")
medlemmerne.ActiveConnection = MM_medlemsd_STRING
if request.QueryString("soegeord") = "" then
medlemmerne.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & request.QueryString("kommunenr") & " ORDER BY Virksomhedsnavn ASC"
else
medlemmerne.Source = "SELECT * FROM medlemmer WHERE kommunenr =" & request.QueryString("kommunenr") & " AND Fservices In ('" & Replace(sogeord , ", ", "','") & "') ORDER BY Virksomhedsnavn ASC"
end if
medlemmerne.CursorType = 0
medlemmerne.CursorLocation = 2
medlemmerne.LockType = 1
medlemmerne.Open()

medlemmerne_numRows = 0
%>
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 11:44 #24
Kan du forsøge at sette ind følgende efter  linie 5 ( sogeord = Left.....)
Response.Write(sogeord)
Response.End

Jeg tror ikke det er selve Dim funktoinen som fejlen opstår i. Det kunne være interessant at se hvad sogeord indeholder.
Avatar billede andersasp Nybegynder
14. januar 2005 - 11:47 #25
Det kan den ikke udskrive, fejlen sker også i linie 5!
Avatar billede andersasp Nybegynder
14. januar 2005 - 11:48 #26
Type mismatch: '[string: ""]'

/tester/normalsoegning.asp, line 5
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 11:55 #27
Prøv først:
sogerord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord"))-1)

(jeg har flyttet en parantes)
Avatar billede andersasp Nybegynder
14. januar 2005 - 12:02 #28
Nu kommer den ikke med fejl :) - men den viser heller ikke nogle resultater.. Det resultat som jeg fik med LIKE, kommer ikke frem nu :(

Og når jeg smider denne ind midt på siden Response.Write(sogeord) udskriver den:

sogeord1, sogeord2,
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 12:07 #29
Vi må få fjernet det siste komma. Måske skulle du forsøge
sogerord = Left(request.QueryString("soegeord"), Len(request.QueryString("soegeord"))-2)

for at fjerne de siste 2 tegn af QueryStringen. Det ser ud som soegeord oprindelig har ", " i slutningen, og så skal vi fjerne 2 karakterer.

Ellers skal du kigge i den asp som genererer soegeord, og sørge for at siste søgeord ikke er efterfulgt af ", "

Ellers må du lave en Response.Write på medlemmerne.Source, så jeg kan se din SQL.
Avatar billede andersasp Nybegynder
14. januar 2005 - 12:21 #30
Såeledes udskrives den med Len(request.QueryString("soegeord"))-2)

SELECT * FROM medlemmer WHERE kommunenr =727 AND Fservices In ('soegeord1','soegeord2','soegeord3') ORDER BY Virksomhedsnavn ASC
Avatar billede lorentsnv Nybegynder
14. januar 2005 - 12:31 #31
SQL setningen ser rigtig ud nu. Får du ingen resultater?

Forstår jeg dig rigtig når jeg forventer at Fservices direkte skal kunne sammenlignes med 'soegeord1' eller 'soegeord2' eller 'soegeord3', således at du eventelt også kunne få samme resultat med følgende SQL?

SELECT *
FROM medlemmer
WHERE kommunenr =727
AND (Fservices = 'soegeord1' or Fservices  = 'soegeord2' or Fservices ='soegeord3') ORDER BY Virksomhedsnavn ASC
Avatar billede andersasp Nybegynder
14. januar 2005 - 12:40 #32
Nej jeg får desværre ingen resultater!

Nej ikke helt, grunden til at jeg brugte LIKE i starten var at hvert medlem har x antal søgeord i Fservices sepereret med komma! derfor kan dette vel ikke virke:

soegeord1 = Fservices
soegeord1 = sogeord1, sogeord2, sogeord3, osv..
Avatar billede andersasp Nybegynder
14. januar 2005 - 13:47 #33
Tusinde tak for hjælpen begge to!!!  jeg fik dog godt nok kjulius til at virke ret hurtigt, så jeg deler points! håber det er fair!!
Avatar billede kjulius Novice
14. januar 2005 - 23:42 #34
Helt i orden, du har jo fået input fra os begge. :-)
Avatar billede lorentsnv Nybegynder
15. januar 2005 - 12:10 #35
Det er helt fint.
Hvis du får mange data i din base, skal du måske overveje at 'normailsere' din database, ved at du legger Fservices i en egen tabel som linkes til medlemstabellen. i Fservices vil du så have en record for hver søgeord. Dermed vil du kunne søge med IN-funktionen, og få en væsentlige bedre performance. Hvis din database ikke er så stor, har det måske ikke noget særlig betydning.
Avatar billede lorentsnv Nybegynder
31. januar 2005 - 13:50 #36
Du bør måske tænke på at lukke dette spørgsmål efte hånden ;-)
Avatar billede andersasp Nybegynder
31. januar 2005 - 15:41 #37
Sorry! det havde jeg helt glemt, troede faktisk jeg havde give points!
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