|
| Søgning - Flere kriterier i samme felt, fo~ Fra : Henrik B. H. |
Dato : 04-05-06 08:21 |
|
Hej, Jeg håber at I kan hjælpe med dette.
Jeg skal lave en søgefunktion, der giver brugeren mulighed for at søge på
flere kriterier.
Søgningen skal virkeindsnævrende - dvs. at jo flere kriterier der søges på,
jo færre resultatet/matches vil der være. Det skulle give muligheden for at
opnå et meget præcist resultat.
Tabellen der søges i, er således opbygget.
feltnavn
- ID (int)
- dataEntry (nvarchar)
- userID (int)
Der er flere poster i tabellen, der refererer til samme userID. Søgningen
skal "grupperes" efter userID, således at søgekriterierne skal tjekkes i
alle poster for hvert brugerID.
En søgning kunne se således ud: idræt+marketing+lærer = 3 søgekriterier.
Disse kriterier skal alle være opfyldt i resultatlisten. I praksis betyder
det at 2 af kriterierne findes i en post og det sidste en anden (for hvert
userID).
Jeg splitter søgekriterierne op på følgende måde:
- varExtSearchCriteria = trim(request.Form("ExtsearchTXT"))
- arrWords = split(varExtSearchCriteria,"+")
Jeg glæder mig meget til at høre fra jer, da jeg sidder godt og grundigt
fast i dette.
MVH / Henrik
PS: Jeg håber at mit spørgsmål er forklaret tilfredsstillende - I må endelig
sige til, hvis I savner information.
| |
Lars Hoffmann (04-05-2006)
| Kommentar Fra : Lars Hoffmann |
Dato : 04-05-06 10:24 |
|
Henrik B. H. wrote:
> Jeg splitter søgekriterierne op på følgende måde:
> - varExtSearchCriteria = trim(request.Form("ExtsearchTXT"))
> - arrWords = split(varExtSearchCriteria,"+")
Det du skal er således at opbygge en korrekt SQL streng for hver data
i dit array -
<%
dim word
varExtSearchCriteria = "idræt+marketing+lærer"
arrWords = split(varExtSearchCriteria,"+")
SQL = "SELECT ID, DataEntry, UserID "
SQL = SQL & "WHERE 1=1 "
for each word in arrWords
SQL = SQL & "AND dataEntry like '%" & replace(word,"'","''") & "'%' "
next
SQL = SQL & "ORDER BY UserID"
%>
et skulle give dig alle de records der overholder alle kriterierne.
Tricket med WHERE 1=1 er blot for at kunne starte alle efterfølgende
linier med AND.
Lad os antage at du indlæser det hele i et recordset kaldet ADORec.
Så looper du blot over ADORec og for hver gang dit UserID ændres,
udskriver du det for at vise grupperingen:
<%
dim prevUserId
prevUserId = 0
Do While not ADORec.EOF
IF (prevUserId <> ADORec.fields("UserId")) THEN
response.write("Bruger: " & ADORec.fields("UserId"))
END IF
prevUserId = ADORec.fields("UserId")
ADORec.MoveNext
loop
%>
Håber det kan bruges
Med venlig hilsen
Lars Hoffmann
| |
Lars Hoffmann (04-05-2006)
| Kommentar Fra : Lars Hoffmann |
Dato : 04-05-06 10:27 |
|
Lars Hoffmann wrote:
> SQL = "SELECT ID, DataEntry, UserID "
> SQL = SQL & "WHERE 1=1 "
Og jeg mangler naturligvis FROM delen:
SQL = "SELECT ID, DataEntry, UserID "
SQL = SQL & "FROM myTable "
SQL = SQL & "WHERE 1=1 "
| |
Henrik B. H. (04-05-2006)
| Kommentar Fra : Henrik B. H. |
Dato : 04-05-06 10:47 |
|
Hej Lars, Tak for dit hurtige svar.
Jeg får en type-fejl, når jeg prøver at afvikle koden.
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D)
Typer stemmer ikke overens
- line 34
linie 34 = strSQL1 = strSQL1 & "AND dataEntry like '%" &
replace(arrWords,"'","''") & "'%' "
----------------------- koden opdateret/tilpasset -----------------------
Dim varExtSearchCriteria, arrWords, word, prevUserId
varExtSearchCriteria = trim(request.Form("ExtsearchTXT"))
varExtSearchCriteria = replace(varExtSearchCriteria,"æ","æ")
varExtSearchCriteria = replace(varExtSearchCriteria,"ø","ø")
varExtSearchCriteria = replace(varExtSearchCriteria,"å","å")
session("ExtSearchCriteria") = varExtSearchCriteria
arrWords = split(varExtSearchCriteria,"+")
strSQL1 = "SELECT dataID, DataEntry, UserID "
strSQL1 = strSQL1 & "FROM tbl_cv_data "
strSQL1 = strSQL1 & "WHERE 1=1 "
for each word in arrWords
strSQL1 = strSQL1 & "AND dataEntry like '%" & replace(arrWords,"'","''")
& "'%' "
next
strSQL1 = strSQL1 & "ORDER BY UserID"
Set rsExtSearch = Connect.Execute(strSQL1)
prevUserId = 0
Do While not rsExtSearch.EOF
IF (prevUserId <> rsExtSearch.fields("UserId")) THEN
response.write("Bruger: " & rsExtSearch.fields("UserId"))
END IF
prevUserId = rsExtSearch.fields("UserId")
rsExtSearch.MoveNext
loop
----------------------- koden opdateret/tilpasset -----------------------
Håber du kan hjælpe.
MVH
Henrik
"Lars Hoffmann" <lars@intercambiodvd.com> skrev i en meddelelse
news:1146734839.082832.227830@v46g2000cwv.googlegroups.com...
> Lars Hoffmann wrote:
>
>> SQL = "SELECT ID, DataEntry, UserID "
>> SQL = SQL & "WHERE 1=1 "
>
>
> Og jeg mangler naturligvis FROM delen:
>
> SQL = "SELECT ID, DataEntry, UserID "
> SQL = SQL & "FROM myTable "
> SQL = SQL & "WHERE 1=1 "
>
| |
Lars Hoffmann (04-05-2006)
| Kommentar Fra : Lars Hoffmann |
Dato : 04-05-06 11:03 |
|
Henrik B. H. wrote:
> Hej Lars, Tak for dit hurtige svar.
> Jeg får en type-fejl, når jeg prøver at afvikle koden.
>
> Fejltype:
> Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D)
> Typer stemmer ikke overens
> - line 34
>
> linie 34 = strSQL1 = strSQL1 & "AND dataEntry like '%" &
> replace(arrWords,"'","''") & "'%' "
Du skal bruge "word" og ikke "arrWords" i den linie. word indeholder et
enkelt element fra dit array ved hver gennemløb og er en
strengvariabel, arrWords er jo et array, så det kan du ikke bruge i
replace.
Med venlig hilsen
Lars Hoffmann
| |
Henrik B. H. (04-05-2006)
| Kommentar Fra : Henrik B. H. |
Dato : 04-05-06 11:16 |
|
Hej igen,
Jeg har prøvet at ændre det, uden held.
Skal indholdet af "word" ikke defineres nogen steder?
---------------- Opdateret kode -----------------------
Dim varExtSearchCriteria, arrWords, word, prevUserId
varExtSearchCriteria = trim(request.Form("ExtsearchTXT"))
varExtSearchCriteria = replace(varExtSearchCriteria,"æ","æ")
varExtSearchCriteria = replace(varExtSearchCriteria,"ø","ø")
varExtSearchCriteria = replace(varExtSearchCriteria,"å","å")
session("ExtSearchCriteria") = varExtSearchCriteria
arrWords = split(varExtSearchCriteria,"+")
strSQL1 = "SELECT dataID, DataEntry, UserID "
strSQL1 = strSQL1 & "FROM tbl_cv_data "
strSQL1 = strSQL1 & "WHERE 1=1 "
for each word in arrWords
strSQL1 = strSQL1 & "AND dataEntry like '%" & replace(word,"'","''") &
"'%' "
next
strSQL1 = strSQL1 & "ORDER BY UserID"
Set rsExtSearch = Connect.Execute(strSQL1)
prevUserId = 0
Do While not rsExtSearch.EOF
IF (prevUserId <> rsExtSearch.fields("UserId")) THEN
response.write("Bruger: " & rsExtSearch.fields("UserId"))
END IF
prevUserId = rsExtSearch.fields("UserId")
rsExtSearch.MoveNext
loop
---------------- Opdateret kode -----------------------
"Lars Hoffmann" <lars@intercambiodvd.com> skrev i en meddelelse
news:1146736980.814838.84320@v46g2000cwv.googlegroups.com...
Henrik B. H. wrote:
> Hej Lars, Tak for dit hurtige svar.
> Jeg får en type-fejl, når jeg prøver at afvikle koden.
>
> Fejltype:
> Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D)
> Typer stemmer ikke overens
> - line 34
>
> linie 34 = strSQL1 = strSQL1 & "AND dataEntry like '%" &
> replace(arrWords,"'","''") & "'%' "
Du skal bruge "word" og ikke "arrWords" i den linie. word indeholder et
enkelt element fra dit array ved hver gennemløb og er en
strengvariabel, arrWords er jo et array, så det kan du ikke bruge i
replace.
Med venlig hilsen
Lars Hoffmann
| |
Lars Hoffmann (04-05-2006)
| Kommentar Fra : Lars Hoffmann |
Dato : 04-05-06 11:26 |
|
Henrik B. H. wrote:
> Hej igen,
>
> Jeg har prøvet at ændre det, uden held.
Samme fejl i samme linie?
> Skal indholdet af "word" ikke defineres nogen steder?
Det bliver det i din "for" sætning. Jeg prøvede det lokalt på min
maskine og det virkede fint.
Med venlig hilsen
Lars Hoffmann
| |
Henrik B. H. (04-05-2006)
| Kommentar Fra : Henrik B. H. |
Dato : 04-05-06 13:22 |
|
Hej Lars,
Nu har jeg lige prøvet at kopiere koden over på en anden Server og her
opstår type-fejlen ikke.
- Så langt, så godt.
Jeg kan nu se at sql-strengen ikke har den ønskede effekt.
Jeg få stadigvæk ikke nogen resultater, når jeg søger på 2 kriterier. De 2
kriterier er fordelt på to poster i databasen for samme bruger.
Har du et bud?
MVH
Henrik
"Lars Hoffmann" <lars@intercambiodvd.com> skrev i en meddelelse
news:1146738354.347794.40710@j73g2000cwa.googlegroups.com...
Henrik B. H. wrote:
> Hej igen,
>
> Jeg har prøvet at ændre det, uden held.
Samme fejl i samme linie?
> Skal indholdet af "word" ikke defineres nogen steder?
Det bliver det i din "for" sætning. Jeg prøvede det lokalt på min
maskine og det virkede fint.
Med venlig hilsen
Lars Hoffmann
| |
Lars Hoffmann (04-05-2006)
| Kommentar Fra : Lars Hoffmann |
Dato : 04-05-06 13:32 |
|
Henrik B. H. wrote:
> Jeg kan nu se at sql-strengen ikke har den ønskede effekt.
> Jeg få stadigvæk ikke nogen resultater, når jeg søger på 2 kriterier. De 2
> kriterier er fordelt på to poster i databasen for samme bruger.
Jeg troede netop at du ville lave en indskrænkende søgning, men jeg
kan se at jeg har misforstået problemstillingen.
Hvis du har f.eks følgende datasæt:
dataID, DataEntry, UserID
1,'en kold is',1
2,'en varm is,1
3,'en varm kage',2
og søger på 'is+varm', hvilket søgeresultat regner du så med at
finde?
| |
Henrik B. H. (04-05-2006)
| Kommentar Fra : Henrik B. H. |
Dato : 04-05-06 13:56 |
|
Hej Lars,
I dit eksempel, skulle mit ønskede resultat være 1 resultat - userID #1, da
vedkommende opfylder begge kriterier.
MVH
Henrik
"Lars Hoffmann" <lars@intercambiodvd.com> skrev i en meddelelse
news:1146745921.640900.129450@e56g2000cwe.googlegroups.com...
Henrik B. H. wrote:
> Jeg kan nu se at sql-strengen ikke har den ønskede effekt.
> Jeg få stadigvæk ikke nogen resultater, når jeg søger på 2 kriterier. De 2
> kriterier er fordelt på to poster i databasen for samme bruger.
Jeg troede netop at du ville lave en indskrænkende søgning, men jeg
kan se at jeg har misforstået problemstillingen.
Hvis du har f.eks følgende datasæt:
dataID, DataEntry, UserID
1,'en kold is',1
2,'en varm is,1
3,'en varm kage',2
og søger på 'is+varm', hvilket søgeresultat regner du så med at
finde?
| |
Henrik B. H. (05-05-2006)
| Kommentar Fra : Henrik B. H. |
Dato : 05-05-06 08:19 |
|
Hej,
Er jeg helt på afveje :)
MVH
Henrik
"Henrik B. H." <info@beammeup.dk> skrev i en meddelelse
news:4459f9c7$0$67259$157c6196@dreader2.cybercity.dk...
> Hej Lars,
>
> I dit eksempel, skulle mit ønskede resultat være 1 resultat - userID #1,
> da vedkommende opfylder begge kriterier.
>
> MVH
> Henrik
>
>
> "Lars Hoffmann" <lars@intercambiodvd.com> skrev i en meddelelse
> news:1146745921.640900.129450@e56g2000cwe.googlegroups.com...
> Henrik B. H. wrote:
>
>> Jeg kan nu se at sql-strengen ikke har den ønskede effekt.
>> Jeg få stadigvæk ikke nogen resultater, når jeg søger på 2 kriterier. De
>> 2
>> kriterier er fordelt på to poster i databasen for samme bruger.
>
> Jeg troede netop at du ville lave en indskrænkende søgning, men jeg
> kan se at jeg har misforstået problemstillingen.
>
> Hvis du har f.eks følgende datasæt:
>
> dataID, DataEntry, UserID
> 1,'en kold is',1
> 2,'en varm is,1
> 3,'en varm kage',2
>
> og søger på 'is+varm', hvilket søgeresultat regner du så med at
> finde?
>
>
| |
Ukendt (05-05-2006)
| Kommentar Fra : Ukendt |
Dato : 05-05-06 08:42 |
|
"Henrik B. H." <info@beammeup.dk> wrote in message
news:445afc74$0$60780$157c6196@dreader1.cybercity.dk...
> Hej,
>
Hej Henrik,
På min søgeside får jeg søgekritrierne med nedenstående
("Rs.Sourse" er SQL sætningen og "SeachString" er tekst der viser
søgekriterier):
Rs.Source = "SELECT * FROM tblIncidentLog WHERE 1=1"
if request.form("irNumber") <> "" then
Rs.Source = Rs.Source & " and IncidentNo="& request.form("irNumber") &""
SeachString = SeachString & " Incident No=" &
request.form("irNumber")
end if
if request.form("irStatus") <> "" then
Rs.Source = Rs.Source & " and Status='"& request.form("irStatus") &"'"
SeachString = SeachString & " Status=" & request.form("irStatus")
end if
if request.form("irFrom") <> "" and request.form("irTo") <> "" then
Rs.Source = Rs.Source & " and incidentDate BETWEEN #"& reverseFrom &"# AND
#" & reverseTo &"#"
SeachString = SeachString & " Date Between " &
request.form("irFrom") & " and " & request.form("irTo")
end if
IF SeachString = " Where:<br>" Then
SeachString = ""
End IF
Rs.Source = Rs.Source & " ORDER BY " & "IncidentNo DESC"
M.v.h.
Henning
| |
Henrik B. H. (05-05-2006)
| Kommentar Fra : Henrik B. H. |
Dato : 05-05-06 09:04 |
|
Hej Henning, Tak for dit indlæg.
Jeg kan se at du benytter flere form-værdier i dit script.
Kan du hjælpe med at tilpasse det til mig?
MVH
Henrik
"Henning Smed" <henning snabela smeds.dk> skrev i en meddelelse
news:445b01d7$0$10871$d40e179e@nntp02.dk.telia.net...
>
> "Henrik B. H." <info@beammeup.dk> wrote in message
> news:445afc74$0$60780$157c6196@dreader1.cybercity.dk...
>> Hej,
>>
> Hej Henrik,
>
> På min søgeside får jeg søgekritrierne med nedenstående
> ("Rs.Sourse" er SQL sætningen og "SeachString" er tekst der viser
> søgekriterier):
>
> Rs.Source = "SELECT * FROM tblIncidentLog WHERE 1=1"
> if request.form("irNumber") <> "" then
> Rs.Source = Rs.Source & " and IncidentNo="& request.form("irNumber") &""
> SeachString = SeachString & " Incident No=" &
> request.form("irNumber")
> end if
> if request.form("irStatus") <> "" then
> Rs.Source = Rs.Source & " and Status='"& request.form("irStatus") &"'"
> SeachString = SeachString & " Status=" & request.form("irStatus")
> end if
> if request.form("irFrom") <> "" and request.form("irTo") <> "" then
> Rs.Source = Rs.Source & " and incidentDate BETWEEN #"& reverseFrom &"#
> AND #" & reverseTo &"#"
> SeachString = SeachString & " Date Between " &
> request.form("irFrom") & " and " & request.form("irTo")
> end if
> IF SeachString = " Where:<br>" Then
> SeachString = ""
> End IF
>
> Rs.Source = Rs.Source & " ORDER BY " & "IncidentNo DESC"
>
> M.v.h.
> Henning
>
>
>
| |
Ukendt (05-05-2006)
| Kommentar Fra : Ukendt |
Dato : 05-05-06 10:25 |
|
"Henrik B. H." <info@beammeup.dk> wrote in message
news:445b070c$0$60778$157c6196@dreader1.cybercity.dk...
> Hej Henning, Tak for dit indlæg.
>
> Jeg kan se at du benytter flere form-værdier i dit script.
> Kan du hjælpe med at tilpasse det til mig?
>
Hej Henrik
Du skal selvføgelig tilpasse formularens "name=" og databasens feltnavne og
til din DB og indsætte IF Then sætninger for alle søgekategorier,
Her er min formular:
form name="form1" method="post" action="irResult.asp">
<table width="565" border="0" cellspacing="4">
<tr>
<td width="131" valign="baseline" align="right" nowrap>Incident
Number</td>
<td width="418"><input name="irNumber" type="text" id="irNumber"></td>
</tr>
<tr>
<td valign="baseline" align="right" nowrap>Status</td>
<td>
<select name="irStatus" class="px11" id="irStatus">
<option value=""></option>
<% do %>
<% if RsStatus.Fields.Item("StatusCode").Value = irstatus then %>
<option name="<%=(RsStatus.Fields.Item("StatusCode").Value)%>"
selected><%=(RsStatus.Fields.Item("StatusCode").Value)%></option>
<% else %>
<option
name="<%=(RsStatus.Fields.Item("StatusCode").Value)%>"><%=(RsStatus.Fields.Item("StatusCode").Value)%></option>
<% end if %>
<% RsStatus.MoveNext %>
<% Loop while not RsStatus.EOF %>
</select> </td>
</tr>
<tr>
<td valign="baseline" align="right" nowrap>Date Interval </td>
<td>From:
<input type="text" name="irFrom" size="10"
onblur="check_date(this)">
To:
<input type="text" name="irTo" size="10" onblur="check_date(this)">
(dd-mm-yyyy) </td>
</tr>
<tr>
<td valign="baseline" align="right" nowrap> </td>
<td><input name="Submit" type="submit">
<input type="reset" name="Submit2" value="Clear"></td>
M.v.h.
Henning
| |
|
|