06. oktober 2006 - 14:15Der 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.
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
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
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
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
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
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
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 :)
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.