Avatar billede crunch Nybegynder
16. januar 2002 - 10:47 Der er 23 kommentarer og
1 løsning

udklip af søgening,,,

hej.

jeg har en db hvor jeg laver nogle søgninger i. Det jeg godt kunne tænke mig var at der i dbén hvor tekststrengen matches, der udskrives ca. 30 tegn der viser den sammenhæng søgningen er fundet i. (som på google).

er der nogle der har et eksempel. ?
Avatar billede tmceu Praktikant
16. januar 2002 - 11:02 #1
Hvad med noget i stil med dette:

strSoeg = \"Søgeord\"

intPos = inStr(objRS(\"Felt\"), strSoeg)
strTemp = Mid(objRS(\"Felt\"), (intPos - 10), 30)

Dette vil vise 30 karakterer omkring søgeordet.

Den kan selvfølgelig forfines til at håndtere at søgeordet findes flere gange i feltet og til kun at vise hele ord i de ca. 30 karakterer.

Men du skulle kunne få en ide ud fra ovenstående.
Avatar billede crunch Nybegynder
16. januar 2002 - 11:19 #2
burde dette virke ???

strSQL = \"SELECT referid, html, filename FROM htmlcode WHERE\"
strSQL = strSQL & \" (html LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (filename LIKE \'%\" & strKeyword & \"%\')\"
Set rs = cn.Execute(strSQL)

strSoeg = strKeyword
intPos = inStr(rs(\"html\"), strSoeg)
strTemp = Mid(rs(\"html\"), (intPos - 10), 30)
response.write strKeyword


\'jeg får en :

error \'80020009\'
Exception occurred.

/webeditor/includefunctions/search-www.shtm, line 43
Avatar billede crunch Nybegynder
16. januar 2002 - 11:21 #3
ups. mener:

strSoeg = strKeyword
intPos = inStr(rs(\"html\"), strSoeg)
strTemp = Mid(rs(\"html\"), (intPos - 10), 13)
response.write strTemp
Avatar billede tmceu Praktikant
16. januar 2002 - 11:35 #4
Øhh, nej. Jeg glemte et par ting. Du bør lige indsætte en check for om intPos er 0, bare for en sikkerheds skyld. Og så er der også lige det med store/små bogstaver :-) Ny version...

strSoeg = strKeyword
intPos = inStr(LCase(rs(\"html\")), LCase(strSoeg))
If intPos > 0 Then
strTemp = Mid(rs(\"html\"), (intPos - 10), 13)
response.write strTemp
End If
Avatar billede crunch Nybegynder
16. januar 2002 - 11:49 #5
jeg burde vel kunne skrive det som:

intPos = inStr(LCase(rs(\"html\")), LCase(strKeyword))
If intPos > 0 Then
strTemp = Mid(rs(\"html\"), (intPos - 10), 13)
response.write strTemp
End If

- men i begge tilfælde får jeg en \"Exception occurred.\" i linien:

intPos = inStr(LCase(rs(\"html\")), LCase(strKeyword))

eller (med dit forslag)

intPos = inStr(LCase(rs(\"html\")), LCase(strSoeg))
Avatar billede tmceu Praktikant
16. januar 2002 - 12:25 #6
Det skyldes sikkert at intPos - 10 giver mindre end 0, d.v.s. at søgeordet står tidligt i feltet. Retter den lige til. Øjeblik...
Avatar billede tmceu Praktikant
16. januar 2002 - 12:29 #7
Så skulle den være der.

intNum = 10
intPos = inStr(LCase(rs(\"html\")), LCase(strKeyword))

If intPos > 0 And intPos >= intNum Then
    strTemp = Mid(rs(\"html\"), (intPos - intNum), 13)
ElseIf intPos > 0 And intPos < intNum Then
    intNum = intPos
    strTemp = Mid(rs(\"html\"), intNum, 13)
End If

response.write strTemp
Avatar billede crunch Nybegynder
16. januar 2002 - 13:02 #8
desværre... får stadig samme fejl i samme linie.
Avatar billede tmceu Praktikant
16. januar 2002 - 13:09 #9
Prøv at poste den eksakte fejlmeddelelse, for den virker hos mig.
Avatar billede crunch Nybegynder
16. januar 2002 - 13:12 #10
ok. her er fejlen:

error \'80020009\'
Exception occurred.

/webeditor/includefunctions/search-www.shtm, line 52
Avatar billede tmceu Praktikant
16. januar 2002 - 13:16 #11
Kan du prøve at poste din kode også, i det mindste linie 1-52 ?
Avatar billede crunch Nybegynder
16. januar 2002 - 13:34 #12
jo da. Jeg har godt nok lige sat din kode nederst mens jeg testede. Det ser sådan her ud:

<%
\' Henter værdien
strKeyword = Trim(Request.Form(\"a\"))

If Len(strKeyword) = 0 Then
    \' Hvis der ikke er skrevet i feltet
    Response.Clear
    Response.Redirect(\"index.asp\")
Else
    \' Hvis der er skrevet i feltet
    strKeyword = Replace(strKeyword,\"\'\",\"\'\'\")
End If

\' Opbygger en dynamisk SQL streng
strSQL = \"SELECT referid, html, filename FROM htmlcode WHERE\"
strSQL = strSQL & \" (html LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (filename LIKE \'%\" & strKeyword & \"%\')\"


\'find de aktuelle poster omkring....


\' Skaber et recordset udfra SQL strengen
Set rs = cn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then
    \' Hvis der er fundet poster på søgningen
    Response.Write \"<table border=1>\"
    Response.Write \"<tr><th>Søgeresultat</th></tr>\"
    Do While Not rs.EOF
        SQL2 = \"SELECT title, id FROM html WHERE id = \"&rs(0)&\"\"
    set rs2 = cn.execute(SQL2)
    Response.Write \"<tr><td>\" & \"<a href=\"\"index.asp?id=\" & (rs2(1)) & \"\"\">\" & (rs2(0)) & \"</a></td>\"
    rs2.close
      Response.Write \"<tr><td>\" & rs(\"html\") & \"</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

\'udvælg tekstområde..
intNum = 10
intPos = inStr(LCase(rs(\"html\")), LCase(strKeyword))

If intPos > 0 And intPos >= intNum Then
  strTemp = Mid(rs(\"html\"), (intPos - intNum), 13)
ElseIf intPos > 0 And intPos < intNum Then
intNum = intPos
    strTemp = Mid(rs(\"html\"), intNum, 13)
End If
response.write strTemp

rs.close
%>
Avatar billede tmceu Praktikant
16. januar 2002 - 14:05 #13
Du er nødt til at smide min kode indenfor din If blok.

Da den ligger i bunden af koden, og du allerede har kørt dit recordset igennem med din do-while, har du ikke noget recordset når du når ned til koden i bunden.
Avatar billede crunch Nybegynder
16. januar 2002 - 14:12 #14
nååee. ja selvfølgelig. det ser nu sådan ud;

<%
\' Henter værdien
strKeyword = Trim(Request.Form(\"a\"))

If Len(strKeyword) = 0 Then
    \' Hvis der ikke er skrevet i feltet
    Response.Clear
    Response.Redirect(\"index.asp\")
Else
    \' Hvis der er skrevet i feltet
    strKeyword = Replace(strKeyword,\"\'\",\"\'\'\")
End If

\' Opbygger en dynamisk SQL streng
strSQL = \"SELECT referid, html, filename FROM htmlcode WHERE\"
strSQL = strSQL & \" (html LIKE \'%\" & strKeyword & \"%\')\"
strSQL = strSQL & \" OR (filename LIKE \'%\" & strKeyword & \"%\')\"


\'find de aktuelle poster omkring....


\' Skaber et recordset udfra SQL strengen
Set rs = cn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then
    \' Hvis der er fundet poster på søgningen
    Response.Write \"<table border=1>\"
    Response.Write \"<tr><th>Søgeresultat</th></tr>\"
 
    Do While Not rs.EOF
       
    SQL2 = \"SELECT title, id FROM html WHERE id = \"&rs(0)&\"\"
    set rs2 = cn.execute(SQL2)
    Response.Write \"<tr><td>\" & \"<a href=\"\"index.asp?id=\" & (rs2(1)) & \"\"\">\" & (rs2(0)) & \"</a></td>\"
    rs2.close
   
      Response.Write \"<tr><td>\"
      \'udvælg tekstområde..
intNum = 10
intPos = inStr(LCase(rs(\"html\")), LCase(strKeyword))

If intPos > 0 And intPos >= intNum Then
  strTemp = Mid(rs(\"html\"), (intPos - intNum), 13)
ElseIf intPos > 0 And intPos < intNum Then
  intNum = intPos
  strTemp = Mid(rs(\"html\"), intNum, 13)
End If
response.write strTemp
response.write\"</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

rs.close
%>

men jeg får fejlmeddelelsen:


Microsoft VBScript runtime error \'800a0005\'

Invalid procedure call or argument: \'Mid\'

/webeditor/includefunctions/search-www.shtm, line 43


- jeg kan ikke lige helt gennemskue hvad der sker.
Avatar billede tmceu Praktikant
16. januar 2002 - 14:38 #15
Jeg forstår det ikke helt, da den virker hos mig.

Men du kan prøve med flg. somforetager en \"textual comparison\"

intNum = 10
intPos = inStr(1, LCase(rs(\"html\")), LCase(strKeyword), 1)

If intPos > 0 And intPos >= intNum Then
  strTemp = Mid(rs(\"html\"), (intPos - intNum), 13)
ElseIf intPos > 0 And intPos < intNum Then
  intNum = intPos
  strTemp = Mid(rs(\"html\"), intNum, 13)
End If
response.write strTemp

Du kan også prøve blot at teste om den finder noget, ved at indsætte dette i stedet:

response.write inStr(LCase(rs(\"html\")), LCase(strKeyword))
Avatar billede crunch Nybegynder
16. januar 2002 - 15:01 #16
jeg kan se at der er flg. problem.

- hvis f.eks. jeg søger på et sted, så skal der være der være 13 tegn foran, ellers får jeg en fejl.

- i det tilfælde at der ikke kommer fejl (hvis jeg sætter tallet til f.eks. 3), så udskrives der ikke noget.

har du nogen idé om hvorfor ?
Avatar billede tmceu Praktikant
16. januar 2002 - 15:31 #17
Det passer ikke helt.

Det antal karakterer der skal være foran, er intNum.
- intNum er enten 10
- eller den position som strengen du søger efter findes i.

13 er det antal karakterer den skal returnere fra start positionen.
- Startpositionen er enten intPos minus intNum
- eller = intPos, altså positionen som strengen findes i

Hvis der ikke er 13 karakterer fra startpositionen, returnerer den blot det antal karakterer der nu er.

Se dette eksempel med 30 karakterer

strStreng = \"AAA BBB CCC DDD EEE FFF GGG\"
strKeyword = \"eee\"

intNum = 10
intPos = inStr(1, LCase(strStreng), LCase(strKeyword), 1)

If intPos > 0 And intPos >= intNum Then
  strTemp = Mid(strStreng, (intPos - intNum), 30)
ElseIf intPos > 0 And intPos < intNum Then
  intNum = intPos
  strTemp = Mid(strStreng, intNum, 30)
End If
response.write strTemp

Resultatet er dette

1. intPos er = 17

2. Så køres strTemp = Mid(strStreng, (17 - 10), 30)

3. Dette returnerer \"B CCC DDD EEE FFF GGG\" som kun er 21 lang

Hvis du i stedet kører den med

strStreng = \"AAA EEE\"

Vil resultatet være dette:

1. intPos er = 5

2. intNum bliver sat = 5

3. Så køres strTemp = Mid(strStreng, 5, 30)

4. Dette vil resultere \"EEE\" som kun er 5 lang!

Hmm, glemte at trække fra der, så den også tog det foran ordet med. Den er rettet her. Men så skal det f..... også virke :-)

intNum = 10
intPos = inStr(1, LCase(strStreng), LCase(strKeyword), 1)

If intPos > 0 And intPos >= intNum Then
  strTemp = Mid(strStreng, (intPos - intNum), 30)
ElseIf intPos > 0 And intPos < intNum Then
  intNum = 1
  strTemp = Mid(strStreng, intNum, 30)
End If
response.write strTemp
Avatar billede crunch Nybegynder
16. januar 2002 - 16:21 #18
Nu genererer den ikke fejl mere. jeg er godt nok ked af at sige det men jeg får stadig væk ikke skrevet noget ud... suk.
nå men tak for dine forsøg på at hjælpe. Det kan være jeg finder ud af det på et tidspunkt.
Avatar billede tmceu Praktikant
16. januar 2002 - 16:24 #19
Jamen vi skal da have det til at virke. Hvordan ser din kode ud nu og hvordan ser resultatet ud, gerne koden fra browserens view source ?
Avatar billede crunch Nybegynder
16. januar 2002 - 16:25 #20
jeg kan se at recordsættet er smuttet ud fra det sidste eksempel. skal:


strTemp = Mid(rs(\"html\"), intNum, 13)

ikke være der ?
Avatar billede crunch Nybegynder
16. januar 2002 - 16:27 #21
der udskrives.:

<table border=1><tr><th>Søgeresultat</th></tr><tr><td><a href=\"index.asp?id=417\">asdsad</a></td><tr><td></td></tr></table>
Avatar billede tmceu Praktikant
16. januar 2002 - 16:47 #22
Alle de steder der står strStreng i mit eksempel, skal du udskifte med rs(\"html\") - jeg har ikke et recordset liggende med det navn og feltnavn, så jeg har brugt en variabel i stedet.

Hvis du ikke har gjort det, vil den aldrig udskrive noget :-)
Avatar billede crunch Nybegynder
16. januar 2002 - 17:21 #23
dette her virker ikke...

response.write rs(\"html\")
strStreng = rs(\"html\")
     
intNum = 10
intPos = inStr(1, LCase(rs(\"html\")), LCase(strKeyword), 1)


If intPos > 0 And intPos >= intNum Then
  strTemp = Mid(strStreng, (intPos - intNum), 30)
ElseIf intPos > 0 And intPos < intNum Then
  intNum = 1
  strTemp = Mid(strStreng, intNum, 30)
End If
response.write strTemp


den kan godt udskrive rs(\"html\")  i toppen, men nedest i koden udskrives strTemp ikke. mærkeligt.
Avatar billede crunch Nybegynder
16. januar 2002 - 20:07 #24
- nu fandt jeg løsningen. rigtig mange tak for hjælpen.!
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