Avatar billede radiohead Nybegynder
06. oktober 2006 - 14:15 Der er 33 kommentarer og
1 løsning

Avanceret søgefunktion - vil jeg tro

Hvis jeg har input-felt, hvor jeg skriver f.eks. "omtta", vil jeg have returneret alle de ord fra en database, hvor bogstaverne "o", "m", "t", "t", og "a" indgår.

Dvs, hvis ordet "tomat" findes i databasen, skal det udskrives. Og hvis ordet "tam" findes, skal det ligeledes udskrives. (Netop fordi bogstaverne "omtta" indgår i disse ord.


Spørgsmålet er stillet før for ikke så længe siden. Men opgaven er lidt anderledes nu hvor det er fra database.
Avatar billede radiohead Nybegynder
06. oktober 2006 - 14:32 #1
måske er det noget RegExp?
hvad ved jeg... :)
Avatar billede softspot Forsker
06. oktober 2006 - 14:34 #2
du skal nok ud i noget med at generere dine SQL-kriterier, f.eks.:

kriterier = Request.Form("kriterier")
sql = "SELECT * FROM tabel"
if len(kriterier) > 0 then
  sql = sql & " WHERE "
  sqlWhere = ""
  for i=1 to len(kriterier)
    if len(sqlWhere) > 0 then
      sqlWhere = sqlWhere & " AND "
    end if
    sqlWhere = sqlWhere & " feltet LIKE '*" & mid(kriterier,i,1) & "*' "
  next
end if
Avatar billede softspot Forsker
06. oktober 2006 - 14:34 #3
Ups! Man skal jo lige sammensætte SQL med Where-delen inden den kan bruges:

sql = sql & sqlWhere
Avatar billede radiohead Nybegynder
06. oktober 2006 - 14:39 #4
Prøver at kigge på det
Avatar billede softspot Forsker
06. oktober 2006 - 14:46 #5
Hmmm... det går vist ikke særlig godt for mig lige nu :/

Der skal nok benyttes OR i stedet for AND, da ikke alle bogstaver nødvendigvis skal fremgå. Jeg vil derfor mene at denne version er mere korrekt:

kriterier = Request.Form("kriterier")
sql = "SELECT * FROM tabel"
if len(kriterier) > 0 then
  sql = sql & " WHERE "
  sqlWhere = ""
  for i=1 to len(kriterier)
    if len(sqlWhere) > 0 then
      sqlWhere = sqlWhere & " OR "
    end if
    sqlWhere = sqlWhere & " feltet LIKE '*" & mid(kriterier,i,1) & "*' "
  next
  sql = sql & sqlWhere
end if
Avatar billede radiohead Nybegynder
06. oktober 2006 - 14:54 #6
hmm nummer 2 ser ud til at fungere

Men min løkken til udtræk smider ingenting ud? hmm
Avatar billede softspot Forsker
06. oktober 2006 - 14:58 #7
Hvordan ser din løkke ud? :)
Avatar billede radiohead Nybegynder
06. oktober 2006 - 14:59 #8
While NOT rs.EOF
Response.Write rs("ord")
rs.Movenext
wend
rs.Close
:)
Avatar billede softspot Forsker
06. oktober 2006 - 15:05 #9
OK, det ser jo fornuftigt nok ud.

Kan du ikke lige prøve at vise hele koden, dvs. opbygning af SQL-sætningen og løkken?

Desuden bør du også lige sikre dig at der er data som matcher dine kriterier. Kommer der f.eks. noget ud hvis du ikke angiver nogle kriterier?

Har du også rettet alle navne på kolonner, tabeller og formfelter?
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:08 #10
Hvis jeg intet angiver, kommer hele smøren.

Det hele skulle være rettet til, og jeg har prøvet med 2 forskellige databaser.
--------------------

kriterier = Request.Form("ordet")
        sql = "SELECT * FROM ordliste"
            if len(kriterier) > 0 then
              sql = sql & " WHERE "
              sqlWhere = ""
              for i=1 to len(kriterier)
                if len(sqlWhere) > 0 then
                  sqlWhere = sqlWhere & " OR "
                end if
                sqlWhere = sqlWhere & " ord LIKE '*" & mid(kriterier,i,1) & "*' "
              next
              sql = sql & sqlWhere
            end if

   
   
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open sql, database
   
        While NOT rs.EOF
            Response.Write rs("ord") & "<br>"
        rs.Movenext
        wend
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:11 #11
Og forbindelsen til databasen er selvf included længere oppe i koden :)
Avatar billede softspot Forsker
06. oktober 2006 - 15:11 #12
Prøv lige at rette den linie:

    sqlWhere = sqlWhere & " ord LIKE '*" & mid(kriterier,i,1) & "*' "

til:

    sqlWhere = sqlWhere & " [ord] LIKE '*" & mid(kriterier,i,1) & "*' "
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:14 #13
Stadig ingenting. :(

Er ked af det, hvis jeg har rodet dig ud i noget træls :D
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:15 #14
hele smøren kommer stadig, hvis jeg intet angiver i formen.
Avatar billede softspot Forsker
06. oktober 2006 - 15:18 #15
Hvilken database arbejder du med? Asterisk (*) benyttes vist kun i Access. Rent faktisk kan det være ADO sørger for, at du bare altid skal bruge procent (%) til wildcards, hvilket ville betyde at flg. linie

    sqlWhere = sqlWhere & " [ord] LIKE '*" & mid(kriterier,i,1) & "*' "

skulle ændres til

    sqlWhere = sqlWhere & " [ord] LIKE '%" & mid(kriterier,i,1) & "%' "
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:22 #16
Jeg bruger Access, og hvis jeg erstatter med % bliver det hele smidt ud, uanset om jeg skriver noget i inputfeltet eller ej
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:24 #17
Hmm.. har lige bemærket at hvis jeg indtaster et tal, kommer der ingenting

Hvis jeg skriver "kjhkjhkhkjhkjh", ser det ud til at alt kommer ud
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:26 #18
Nææh hov...

Der sker noget mystisk nu. Taster jeg eksempelvis "kaoiskk", ser det ud til at den udelukkende tager første bogstav derfra. Altså "K" og smider alt der indeholder et "k" ud
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:27 #19
Nej
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:28 #20
Aha sådan

Hvis bare ét af bogstaverne, som jeg taster ind i formen, passer ind i ordet i databasen, bliver det smidt ud.

Gav det mening?
Avatar billede softspot Forsker
06. oktober 2006 - 15:29 #21
:D

Hvad sker der hvis du bare starter med at indtaste et bogstav?
Avatar billede softspot Forsker
06. oktober 2006 - 15:29 #22
Ja, det var sådan jeg havde opfattet opgaven :)
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:30 #23
Dvs at f.eks ordet "kone" vil blive spyttet ud hvis jeg indtaser f.eks "lksa" - udelukkende fordi der optræder et "k" begge steder
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:31 #24
Nå for dælen, det må du undskylde!
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:31 #25
men smid endelig et svar for ulejligheden
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:33 #26
Det er vel sådan set bare at ændre "OR" til "AND" - så kombinere den bogstaverne
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:35 #27
så tager den godt nok ikke højde for om man skriver et bogstav mere end én gang.

mm vil feks returnere "tomat", selvom der ikke optræder 2 m'er
Avatar billede softspot Forsker
06. oktober 2006 - 15:36 #28
Well, der er vist ingen grund til at undskylde, men der var bare noget i opgavebeskrivelsen som ikke helt hang sammen (vi er ude i noget med detaljer og flueknepperi lige nu - jeg undskylder på forhånd :)).

Først står der: "...alle de ord fra en database, hvor bogstaverne "o", "m", "t", "t", og "a" indgår."

Dernæst er kravet at "...hvis ordet "tomat" findes i databasen, skal det udskrives", hvilket er fair nok og stemmer overens med det første udsagn. Men efterfølgende skriver du så: "...hvis ordet "tam" findes, skal det ligeledes udskrives", hvilket så ikke passer med det første udsagn (da bogstavet o ikke indgår i tam). Derfor konkluderede jeg at det måtte være "hvis bare et af bogstaverne indgår, så skal ordet udskrives...

Hvorom alt er, så burde det kunne klares ved at ændre linie

    sqlWhere = sqlWhere & " OR "

til(bage til):

    sqlWhere = sqlWhere & " AND "
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:39 #29
Du havde vist forstået det rigtigt, tror jeg :) hehe
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:39 #30
du kan jo også lave ordet "tam" ud fra "tomat" forresten :D
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:41 #31
Læg et svar

Glæder mig til den dag, hvor jeg selv har kapacitet til at lave den slags SQL sætninger :) hehe
Avatar billede softspot Forsker
06. oktober 2006 - 15:49 #32
OK, jeg kan se du er kommet til samme konklusion mht. OR og AND :)

Ja, det at den skal tage højde for antallet af forkomster af de enkelte bogstaver gør unægtelig opgaven lidt mere kompleks - og jeg sidder og tænker lidt på om regular expressions ikke er det du skal bruge, men her kan jeg desværre ikke lige hjælpe - for det fatter jeg ikke meget af :)

jf. 06/10-2006 15:39:47 >> ordet "tam" lever ikke op til de krav du stiller først (og efterfølgende i kommentaren 06/10-2006 15:35:58) i.o.m. ordet "tam" ikke indeholder bogstavet o ej heller to t'er, så derfor blev min lille hjerne forvirret :)
Avatar billede radiohead Nybegynder
06. oktober 2006 - 15:57 #33
Havde også selv overvejet regexp, men det her er fint nok til mig lige nu.

Tak for hjælpen endnu en gang. Det var super! :)
Avatar billede softspot Forsker
06. oktober 2006 - 17:16 #34
Velbekomme og tak for point :)
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