/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Søgefunktion der ikke virker
Fra : Zodiax


Dato : 06-08-03 11:34

Jeg er ved at lave en søgefunktion på min side, der skal fungere med en
accessdb.

Den søger i 2 kolonner i db'en "Navn" og "Vejnavn"

Lad os sige der står: "Poul B. Hansen" i "Navn".

Hvis brugeren søger på 'Poul' virker det fint.
Hvis brugeren søger på 'Hansen' virker det fint.
Hvis brugeren søger på 'Poul B. Hansen' virker det fint

Men hvis man søger på 'Poul Hansen' virker det ikke!.

Er der nogle der har gode fifs til at løse problemet? Jeg vil gerne have at
selvom man indtaster fx. 7 søgeord, så giver det et resultat hvis bare et af
ordene matcher.


Min kode, der er copy/pasted fra forskellige indlæg, og som slet ikke
virker:
----------------------------------------------------------------------------
-

keyw = Trim(Request.Form("searchfield"))

keyw = Replace(keyw, " ", "+")

nysearch = Split(keyw, "+", -1, 1)

antalarray = Ubound(nysearch)

for i=1 to antalarray
keyw = nysearch(i)
response.write(i)

strSQL = "Select * from personer where Navn LIKE '%" & keyw & "%' or
Vejnavn LIKE '%" & keyw & "%'"

next

----------------------------------------------------------------------------
-

Mvh.
--
Zodiax



 
 
Falcon (06-08-2003)
Kommentar
Fra : Falcon


Dato : 06-08-03 11:44

Flg. burde virke :

strSQL = "SELECT Navn, Vejnavn FROM personer WHERE"
strSQL = strSQL & " (Navn LIKE '%" & strKeyw & "%')"
strSQL = strSQL & " OR (ISO Vejnavn '%" & strKeyw & "%')"


Falcon



Zodiax (06-08-2003)
Kommentar
Fra : Zodiax


Dato : 06-08-03 12:20

"Falcon" <hp@fjerndettepopx.dk> wrote
> Flg. burde virke :
>
> strSQL = "SELECT Navn, Vejnavn FROM personer WHERE"
> strSQL = strSQL & " (Navn LIKE '%" & strKeyw & "%')"
> strSQL = strSQL & " OR (ISO Vejnavn '%" & strKeyw & "%')"

Jeg får følgende fejl:

Syntax error (missing operator) in query expression '(Navn LIKE '%John
Hansen%') OR (ISO Vejnavn '%John Hansen%')'.


--
Zodiax



Jens Gyldenkærne Cla~ (06-08-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 06-08-03 12:20

Zodiax skrev:

> Er der nogle der har gode fifs til at løse problemet? Jeg vil
> gerne have at selvom man indtaster fx. 7 søgeord, så giver det
> et resultat hvis bare et af ordene matcher.

Så skal du kigge på IN-operatoren i din forespørgsel:

SELECT foo FROM bar WHERE baz IN ('v1', 'v2', 'v3', ...)

For at konvertere inddata fra dit søgefelt til en IN-parentes kan
du bruge split og join:

' Hent formværdi. Sammensætningen med "" er en sikring mod
' nullværdier
   keyw = Request.Form("searchfield") & ""

' Indeholdte enkeltanførselstegn skal escapes
   keyw = Replace(keyw, "'", "''")

' Opdeling i array
   keyArray = Split(keyw, " ")

' Sammensætning af søgestreng
   searchTerm = "IN ('%" & join(keyArray, "%', '%") & "%')"

' Endelig søgestreng:

   strSQL = "SELECT * FROM personer WHERE navn " & _
       searchTerm & " OR Vejnavn " & searchTerm



NB: Ovenstående er ikke testet. Det anbefales at udskrive
searchterm og evt også strSQL inden du sender den til databasen
første gang. Du skal også være opmærksom på at søgninger med
dobbelt wildcard ('%foo%') tager forholdsvis mange resurser at
eksekvere. Hvis du har 7 søgeord der alle skal tjekkes mod to
felter, får du således op til 14 gennemsøgninger af tabellen i én
forespørgsel.


> Min kode, der er copy/pasted fra forskellige indlæg, og som
> slet ikke virker:

Et par kommentarer til hvorfor.

> keyw = Replace(keyw, " ", "+")
>
> nysearch = Split(keyw, "+", -1, 1)

Først erstatter du " " med "+" - og derefter splitter du på "+" -
hvorfor det?


> antalarray = Ubound(nysearch)
>
> for i=1 to antalarray
> keyw = nysearch(i)
> response.write(i)
>
> strSQL = "Select * from personer where Navn LIKE '%" & keyw &
> "%' or
> Vejnavn LIKE '%" & keyw & "%'"
>
> next

Hvis for-løkken ovenfor skal have nogen effekt, skal du også udføre
sql-sætningen. Men det kan på ingen måde betale sig at køre en
række sql-sætninger lige efter hinanden i dette tilfælde. Det er
langt mere effektivt at samle kriterierne i én sql-sætning.

Som koden står nu, indeholder strSQL efter løkken kun det sidste
element.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Zodiax (06-08-2003)
Kommentar
Fra : Zodiax


Dato : 06-08-03 13:08

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote:

> NB: Ovenstående er ikke testet. Det anbefales at udskrive
> searchterm og evt også strSQL inden du sender den til databasen
> første gang. Du skal også være opmærksom på at søgninger med
> dobbelt wildcard ('%foo%') tager forholdsvis mange resurser at
> eksekvere. Hvis du har 7 søgeord der alle skal tjekkes mod to
> felter, får du således op til 14 gennemsøgninger af tabellen i én
> forespørgsel.

Okay nu har jeg prøvet at sætte din kode ind, og har udskrevet strSQL og
searchTerm med disse resultater:

SELECT * FROM personer WHERE Navn IN('%John%', '%B.%', '%Hansen%') OR
Vejnavn IN('%John%', '%B.%', '%Hansen%')

IN('%John%', '%B.%', '%Hansen%')

Der kommer ingen fejlmeddelelse, men heller ingen resultater, selvom navnet
findes i databasen?
Mon jeg gør noget forkert?

> Først erstatter du " " med "+" - og derefter splitter du på "+" -
> hvorfor det?

Tjaaa, det er som sagt noget jeg har fundet på nettet, så jeg ved ikke
hvorfor

--
Zodiax



Chrisser (06-08-2003)
Kommentar
Fra : Chrisser


Dato : 06-08-03 13:19

Zodiax wrote:
> Okay nu har jeg prøvet at sætte din kode ind, og har udskrevet
> strSQL og searchTerm med disse resultater:
>
> SELECT * FROM personer WHERE Navn IN('%John%', '%B.%', '%Hansen%')
> OR Vejnavn IN('%John%', '%B.%', '%Hansen%')
>
> IN('%John%', '%B.%', '%Hansen%')
>
> Der kommer ingen fejlmeddelelse, men heller ingen resultater,
> selvom navnet findes i databasen?
> Mon jeg gør noget forkert?

Gad vide om Access vil "kende" wildcards i en IN(....) - min MS-SQl vil
ikke ( den finder intet på den måde )
- det går dog ganske glimrende hvis jeg fjerner alle %.

Nu fremgår det ikke tydeligt hvordan du forestiller dig din søgning, men
hvis du f.eks. vil søge på 'Hans', skal den så finde alle der hedder Hans,
eller skal den finde alle der indeholder Hans ( såsom Hansen og Hansine )?
Hvis den kun skal finde de der hedder Hans kan du bruge Jens' forslag - bare
uden %-tegnene ( med forbehold for at syntaksen er den samme i Access som i
MS-SQL).


Chrisser




Chrisser (06-08-2003)
Kommentar
Fra : Chrisser


Dato : 06-08-03 13:31

Chrisser wrote:
> Gad vide om Access vil "kende" wildcards i en IN(....) - min
> MS-SQl vil ikke ( den finder intet på den måde )
> - det går dog ganske glimrende hvis jeg fjerner alle %.

Der hvor jeg vil hen med ovenstående er:

Bliver tegnet '%' ikke opfattet som et helt almindeligt tegn, med mindre den
er en del af en LIKE ?

Chrisser



Zodiax (06-08-2003)
Kommentar
Fra : Zodiax


Dato : 06-08-03 13:39


"Chrisser" <cbj@egdatainform.dk> wrote:
> Nu fremgår det ikke tydeligt hvordan du forestiller dig din søgning, men
> hvis du f.eks. vil søge på 'Hans', skal den så finde alle der hedder Hans,
> eller skal den finde alle der indeholder Hans ( såsom Hansen og Hansine )?
> Hvis den kun skal finde de der hedder Hans kan du bruge Jens' forslag -
bare
> uden %-tegnene ( med forbehold for at syntaksen er den samme i Access som
i
> MS-SQL).

Det er fint nok den kun finder dem der fx. hedder Hans.

Jeg har fjernet %-tegnene og hvis min db kun indeholder et ord i 'Navn'
feltet, fx. Kaj, så finder den Kaj. Også hvis man søger på 'Kaj Børge'

Hvis der derimod står 2 ord i databasen, fx. 'John Hansen' giver det ingen
resultater uanset om man søger på 'John', 'Hansen' eller 'John Hansen'

searchTerm udskrevet ser sådan ud: IN('John', 'Hansen')

--
Zodiax



Chrisser (06-08-2003)
Kommentar
Fra : Chrisser


Dato : 06-08-03 13:49

Zodiax wrote:
> Jeg har fjernet %-tegnene og hvis min db kun indeholder et ord i
> 'Navn' feltet, fx. Kaj, så finder den Kaj. Også hvis man søger på
> 'Kaj Børge'
>
> Hvis der derimod står 2 ord i databasen, fx. 'John Hansen' giver
> det ingen resultater uanset om man søger på 'John', 'Hansen' eller
> 'John Hansen'
>
> searchTerm udskrevet ser sådan ud: IN('John', 'Hansen')

Ja selvfølgelig - den var ikke gennemtænkt, så kan jeg kun se at du skal ud
i noget med substrings mm. i din forespørgsel, og jeg sidder som sagt ikke
med access så jeg ved ikke hvad den kan på det område....

Med mindre Jens mener at vildcards kan bruges i en IN (?), så synes jeg du
skulle stille spørgsmålet i
dk.edb.database.ms-access, der er sikkert nogle der er bedre til det end os.


Chrisser



Jens Gyldenkærne Cla~ (08-08-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-08-03 22:38

Chrisser skrev:

> Med mindre Jens mener at vildcards kan bruges i en IN (?)

Det kan de ikke (hvad jeg glemte at tænke på da jeg skrev mit svar
i onsdags).

Søgningen kan foretages ved at lave strengsammensætning med LIKE i
stedet - men sætningen bliver lang (og tager som før nævnt tid at
køre)

SELECT ... WHERE navn LIKE '%kaj%' OR navn LIKE '%peter%' OR
vejnavn LIKE '%kaj%' OR vejnavn LIKE '%peter%' ...
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Chrisser (11-08-2003)
Kommentar
Fra : Chrisser


Dato : 11-08-03 08:35

Jens Gyldenkærne Clausen wrote:
> Chrisser skrev:
>
>> Med mindre Jens mener at vildcards kan bruges i en IN (?)
>
> Det kan de ikke (hvad jeg glemte at tænke på da jeg skrev mit svar
> i onsdags).

Alt i orden - jeg var i tvivl da jeg ikke sidder med Access

> Søgningen kan foretages ved at lave strengsammensætning med LIKE i
> stedet - men sætningen bliver lang (og tager som før nævnt tid at
> køre)
>
> SELECT ... WHERE navn LIKE '%kaj%' OR navn LIKE '%peter%' OR
> vejnavn LIKE '%kaj%' OR vejnavn LIKE '%peter%' ...

Det vil jeg ikke give dig ret i. Zodiax ønsker at en indtastning: 'Poul
Hansen'
finder personen: 'Poul B. Hansen'

- og det vil ovenstående ikke gøre. Jeg vil mene at man så skal ud noget med
at dele indholdet af navnefeltet op i substrings sådan at 'Poul B. Hansen'
giver tre substrings: 'Poul' , 'B.' og 'Hansen'.
I disse tre kan man så søge for et direkte match (læs: '=' da 'Hans' ikke
skal finde 'Hansine').

Men jeg har ingen anelse om hvad Access kan på dette område...derfor har jeg
anbefalet ham at spørge i access-gruppen.


Chrisser



Jens Gyldenkærne Cla~ (17-08-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 17-08-03 21:50

Chrisser skrev [for en lille uge siden]:

[Jens G. Clausen]
>> Søgningen kan foretages ved at lave strengsammensætning med
>> LIKE i stedet - men sætningen bliver lang (og tager som før
>> nævnt tid at køre)
>>
>> SELECT ... WHERE navn LIKE '%kaj%' OR navn LIKE '%peter%' OR
>> vejnavn LIKE '%kaj%' OR vejnavn LIKE '%peter%' ...

> Det vil jeg ikke give dig ret i. Zodiax ønsker at en
> indtastning: 'Poul Hansen'
> finder personen: 'Poul B. Hansen'

Ja, og til det formål skal han bruge to ting:
   a) en metode til at splitte søgestrengen i enkeltord
   b) en metode til at søge efter flere ord i en database (hvor
successkriteriet er at blot et enkelt ord skal matche)


> - og det vil ovenstående ikke gøre.


Jo. En søgning på 'Poul Hansen' vil finde 'Poul B. Hansen'. Samme
søgning vil også finde 'Mads Hansen', 'Poul S. Jensen' og 'Jens
Poulsen' - men Zodiak var tilsyneladende ude efter alle mulige
match.


> Jeg vil mene at man så skal ud noget med at dele indholdet af
> navnefeltet op i substrings sådan at 'Poul B. Hansen' giver
> tre substrings: 'Poul' , 'B.' og 'Hansen'.

Bestemt. Det gøres i asp med split-funktionen, og fremgik både af
det oprindelige indlæg og af mit første svar.


> I disse tre kan man så søge for et
> direkte match (læs: '=' da 'Hans' ikke skal finde 'Hansine').

Det kan man gøre hvis det er det man vil. Det er selvfølgelig en
fordel at man slipper for match som 'Hans' => 'Hansine' (el. for
den sags skyld 'Hansen') - men til gengæld kræver man at det
enkelte navn skal indtastes korrekt i en søgning.


> Men jeg har ingen anelse om hvad Access kan på dette
> område...derfor har jeg anbefalet ham at spørge i
> access-gruppen.

Access kan ikke (i et sql-kald) opdele en streng - men det kan
sagtens gøres i asp.


NB: Jeg har været på ferie og svarer derfor først nu.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Chrisser (19-08-2003)
Kommentar
Fra : Chrisser


Dato : 19-08-03 11:34

Jens Gyldenkærne Clausen wrote:
> Jo. En søgning på 'Poul Hansen' vil finde 'Poul B. Hansen'. Samme
> søgning vil også finde 'Mads Hansen', 'Poul S. Jensen' og 'Jens
> Poulsen' - men Zodiak var tilsyneladende ude efter alle mulige
> match.

Selvfølgelig - jeg nærlæste vist ikke den sidste sql helt.....

>> Jeg vil mene at man så skal ud noget med at dele indholdet af
>> navnefeltet op i substrings sådan at 'Poul B. Hansen' giver
>> tre substrings: 'Poul' , 'B.' og 'Hansen'.
>
> Bestemt. Det gøres i asp med split-funktionen, og fremgik både af
> det oprindelige indlæg og af mit første svar.

Nu mente jeg i selve sql'en - altså dele indholdet af databasefeltet op, det
er så det du skriver at access ikke kan

> NB: Jeg har været på ferie og svarer derfor først nu.

Ja det kan vi jo alle komme ud for

Chrisser



Falcon (06-08-2003)
Kommentar
Fra : Falcon


Dato : 06-08-03 14:07

Hejsa

Har en gammel søgefunktion der virker, du kan omskrive den og bruge den.


<% Response.Buffer = True %>
<html><head>
<title>Søgeresultat</title>
<meta name="Microsoft Theme" content="highway 011">
</head><body></body>
<%
' Henter værdien fra soeg.htm
strKeyword = Trim(Request.Form("Keyword"))

If Len(strKeyword) = 0 Then
' Hvis der ikke er skrevet i feltet
Response.Clear
Response.Redirect("search-fri.htm")
Else
' Hvis der er skrevet i feltet
strKeyword = Replace(strKeyword,"'","''")
End If

' Opbygger en dynamisk SQL streng
strSQL = "SELECT ID, DIN, ISO, Diameter, Længde, Antal, Pris, Tekst, Hoved,
Stålkvalitet FROM Tabel1 WHERE"
strSQL = strSQL & " (DIN LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (ISO LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Diameter LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Laengde LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Antal LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Pris LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Tekst LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Hoved LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Stålkvalitet LIKE '%" & strKeyword & "%')"

' Skaber DSNLess forbindelse til DBen
strDSN = "DRIVER={Microsoft Access Driver
(*.mdb)};DBQ="&Server.MapPath("search.mdb")
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open strDSN


' Skaber et recordset udfra SQL strengen
Set rs = myConn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then
' Hvis der er fundet poster på søgningen
Response.Write "<p></p>"
Response.Write "<table border=1>"
Response.Write
"<tr><th>DIN</th><th>ISO</th><th>Diameter</th><th>Længde</th><th>Antal</th><
th>Pris</th><th>Tekst</th><th>Hoved</th><th>Stålkvalitet</tr>"
Do While Not rs.EOF
Response.Write "<tr><td>" & rs("DIN") & "</td>"
Response.Write "<td>" & rs("ISO") & "</td>"
Response.Write "<td>" & rs("Diameter") & "</td>"
Response.Write "<td>" & rs("Længde") & "</td>"
Response.Write "<td>" & rs("Antal") & "</td>"
Response.Write "<td>" & rs("Pris") & "</td>"
Response.Write "<td>" & rs("Tekst") & "</td>"
Response.Write "<td>" & rs("Hoved") & "</td>"
Response.Write "<td>" & rs("Stålkvalitet") & "</td></tr>"
rs.MoveNext
Loop
Response.Write "</table>"
Else
' Hvis der ikke er fundet poster på søgningen
Response.Write "<p>Der er ikke fundet noget på denne søgning</p>"
End If

' Rydder op efter os
myConn.Close
Set myConn = Nothing
%>

</html>

Falcon



Chrisser (06-08-2003)
Kommentar
Fra : Chrisser


Dato : 06-08-03 14:13

Falcon wrote:
> Hejsa
>
> Har en gammel søgefunktion der virker, du kan omskrive den og bruge
> den.
[snip kode]

Den ville heller ikke finde 'Poul B. Hansen' hvis man søgte på 'Poul Hansen'

- ret mig hvis jeg tager fejl, det har jeg jo gjort én gang i denne tråd
Chrisser



Falcon (06-08-2003)
Kommentar
Fra : Falcon


Dato : 06-08-03 14:20

Du har sikkert ret, har desværre ikke mulighed for a teste den.

Falcon



Jørn Andersen (06-08-2003)
Kommentar
Fra : Jørn Andersen


Dato : 06-08-03 17:51

On Wed, 6 Aug 2003 12:34:01 +0200, "Zodiax"
<zodiax@jesspar*fjern_dette*.dk> wrote:

>Jeg er ved at lave en søgefunktion på min side, der skal fungere med en
>accessdb.
>
>Den søger i 2 kolonner i db'en "Navn" og "Vejnavn"
>
>Lad os sige der står: "Poul B. Hansen" i "Navn".
>
>Hvis brugeren søger på 'Poul' virker det fint.
>Hvis brugeren søger på 'Hansen' virker det fint.
>Hvis brugeren søger på 'Poul B. Hansen' virker det fint
>
>Men hvis man søger på 'Poul Hansen' virker det ikke!.

I tillæg til de andre indlæg i denne tråd vil jeg klart foreslå, at du
deler navn op i fornavn og efternavn. Udover at det vil give dig nogle
bedre sorteringsmuligheder, kan du også lave en mere nuanceret søgning
- fx:
.... WHERE fornavn LIKE 'Poul%' AND efternavn LIKE 'Hansen%'

Good luck!

--
Jørn Andersen,
Brønshøj

Zodiax (06-08-2003)
Kommentar
Fra : Zodiax


Dato : 06-08-03 22:14

"Jørn Andersen" <jorn@jorna.dk> wrote:
> I tillæg til de andre indlæg i denne tråd vil jeg klart foreslå, at du
> deler navn op i fornavn og efternavn. Udover at det vil give dig nogle
> bedre sorteringsmuligheder, kan du også lave en mere nuanceret søgning
> - fx:
> ... WHERE fornavn LIKE 'Poul%' AND efternavn LIKE 'Hansen%'

Ja, det kan jeg godt se, men det er mine brugere der selv skal indtaste
data, og hvad vi nu hvis der er en der f.eks. hedder "Johan Sebastian Bach
Knudsen", så skal skal der vel noget mere til, og det kan jeg ikke lige
overskue.

--
Zodiax



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408932
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste