Avatar billede leasing Nybegynder
17. januar 2002 - 14:44 Der er 26 kommentarer og
1 løsning

Find tal i en streng

Hej
Jeg har en talstreng der eks. ser sådan ud:
1,2,4,6,7,9,10,12,13,15 (kommer fra database)
sådan en streng er tilknyttet hver bruger. Hvert tal indikere hvilken menulink de har adgang til.

Hvordan søger jeg i denne streng. Jeg afkrydser de checkboxe som ønsker søgt på. Feks. hvem har adgang til feks. 2,3,5.


Håber spørgsmålet er til at forstå.
Avatar billede aaen Nybegynder
17. januar 2002 - 14:46 #1
Avatar billede nute Nybegynder
17. januar 2002 - 14:47 #2
jeg regner med at du mener \"hvordan søker jeg med SQL etter hvem som har adgang til feks. 2,3,5\" ??
Avatar billede aaen Nybegynder
17. januar 2002 - 14:48 #3
Det var et svar :-)

Hvis du bruger Split(\"1,2,4,6,7,9,10,12,13,15\",\",\") returnerer den et array med alle tallene.
Avatar billede leasing Nybegynder
17. januar 2002 - 14:50 #4
Den har jeg også bikset lidt med, både med positiv og negativ forsøg. Alle menuer har jo en unik nøgle fra 1 og opefter. Men når jeg vil vide hvem der har adgang til 1 så får jeg også de brugere som har adgang til 10,11,12,13...osv. altså der hvor 1 indgår.
Ikke særlig smart.
Er der en anden måde det kan gøres på?
Avatar billede cool_casper Nybegynder
17. januar 2002 - 14:50 #5
Du laver et udtræk der søger efter talene i den kolonne de står i:

\' Opbygger en dynamisk SQL streng
strSQL = \"SELECT * FROM tabelnavn WHERE\"
strSQL = strSQL & \" (Talkolone LIKE \'%\" & tal1 & \"%\')\"
strSQL = strSQL & \" OR (Talkolone LIKE \'%\" & tal2 & \"%\')\"
strSQL = strSQL & \" OR (Talkolone LIKE \'%\" & tal3 & \"%\')\"


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

\' Skaber et recordset udfra SQL strengen
Set rs = myConn.Execute(strSQL)
Avatar billede nute Nybegynder
17. januar 2002 - 14:51 #6
aaen >> les hans spørsmål...\"Hvordan søger jeg i denne streng. Jeg afkrydser de checkboxe som ønsker søgt på. Feks. hvem har adgang til feks. 2,3,5\"...vil du så benytte denne fremgangsmåten for alle brukere ?? så blir det et langsomt script :-|
Avatar billede leasing Nybegynder
17. januar 2002 - 14:53 #7
nute: selvfølgelig
hvordan laver jeg den - er det som cool casper har lavet den eller?
Avatar billede nute Nybegynder
17. januar 2002 - 14:53 #8
cool_casper >> den vil ikke fungere særlig godt :-/. grunnen er:

hvis tal1 = 1, vil søket returnere alle tall som inneholder 1, dvs, 1, 10, 11, 12, 13, 14, 15 osv...du skal heller gjøre:

strSQL = \"SELECT * FROM tabelnavn WHERE\"
strSQL = strSQL & \" (Talkolone LIKE \'%,\" & tal1 & \",%\')\"
strSQL = strSQL & \" OR (Talkolone LIKE \'%,\" & tal2 & \",%\')\"
strSQL = strSQL & \" OR (Talkolone LIKE \'%,\" & tal3 & \",%\')\"

Avatar billede leasing Nybegynder
17. januar 2002 - 15:09 #9
nute: Det hjalp selvfølgelig lidt, men hvad d´med de brugere som kun har adgang til et menupunkt, der vil jo ikke være noget komma foran eller bagved.
Avatar billede nute Nybegynder
17. januar 2002 - 15:24 #10
UHA !!! når jeg ser på det du har skrevet og tenker litt på det, så er det rimelig vanskelig å få det til å fungere. hvorfor benytter du ikke mulighetene i databasen ved å bygge relasjonelle tabeller ??

for at det skal fungere ordentlig med søk i en tekststreng, så er du nødt til å lage strengen som ligger i databasen om til fx:

,1,2,4,6,7,9,10,12,13,15,

grunnen til det er at du ikke kan benytte wildcards i din SQL for å utføre søkningen, da disse vil returnere rekker som ikke er relevante
Avatar billede leasing Nybegynder
17. januar 2002 - 15:39 #11
Når jeg sætter komma foran og bagved tallene vil jeg stadig ikke få de brugere med som kun har adgang til et menupunkt.
Avatar billede nute Nybegynder
17. januar 2002 - 16:08 #12
hmmm....hva mener du ? hvordan bygger du din SQL ? manuelt eler dynamisk ?
Avatar billede leasing Nybegynder
18. januar 2002 - 09:35 #13
Så har jeg fået løst den store gåde. Der hvor det går galt er jo at de en-ciffrede tal (1-9) ikke kan bruges. Søger den på et 1-tal så får jeg også 10,11,12,13 osv. Det har både nute og jeg været inde på. Nu har jeg ikke så mange menupunkter, men bruger man nr. fra 10 og op til 99 så er problemet faktisk løst. Selvfølgelig en lidt dårlig løsning, for problemet er ikke helt løst, men virker korrekt når man kun har nr. fra 10-99.
Nute: Hvis du vil svare - så kan jeg få delt lidt point ud.
Tusind tak for den hjælp i har givet mig.
Avatar billede nute Nybegynder
18. januar 2002 - 09:39 #14
det var da godt du fikk det løst.

Normalt så vil en slippe for dette problem ved å skrive sine databaser \'korrekt\', men normalt vil en også alltid finne en vei utenom (selv om det ofte blir en laaang vei)

/nute
Avatar billede leasing Nybegynder
18. januar 2002 - 09:50 #15
Nute: Selvfølgelig skal databasen være korrekt. Det som jeg har gjort er, at alle menupunkter er i en tabel for sig med sit eget unikke nr. For hver bruger der er, er der et felt som fortæller hvilke menupunkter som vedkommende har adgang til. Dette felt skrives som en lang streng eks.: 1,4,6,8,9,10,14,23
Vil den kunne laves på en anden måde som er mere korrekt eller?
Avatar billede nute Nybegynder
18. januar 2002 - 10:19 #16
den korrekte måte er å lage en tabell (relasjonstabell) som mapper/linker en bruker til et menupunkt. Denne tabell vil typisk inneholde 3 kolonner:

ID
brugerID
menuID

deretter har du fx din bruker tabell:

ID
bruger
masseAnnet

og din menytabell

ID
menuPunkt

din relasjonstabell brukes på den måten at den inneholder mange rekker for en bruker. hver rekke representerer så hvert menypunkt. La oss si at bruker nummer 3 har adgang til menupunkt 1, 3, 5, 7 og 9. Så vil din relasjonstabell se sånn ut:

ID brugerID menuID
1__10_______1 
2__10_______3
3__10_______4
4__10_______5
5__10_______7
6__10_______9

legg merke til at ID er bare en unik identifikator som egentlig ikke brukes til noe.

forstår du hva jeg mener ?
Avatar billede leasing Nybegynder
18. januar 2002 - 10:30 #17
ja, jeg forstår udemærket ideen i det, men hvis du feks. har 100 bruger kan jeg godt forstille mig at det bliver en kæmpe database. Det må da have indvirkning på svartiden?
I dit eksempel kan jeg godt se, at jeg ikke vil få nogen problemer overhovedet med mit ID-nr. på menuen. Så det må jeg få lavet om så det funker korrekt.
Nu er det at jeg har et spørgsmål til som jeg håber du kan svare på nute - jeg lægger gerne flere point oven i. Jeg skal have søgningen lagt ind i en pageing. Jeg bruger det pageingeksempel som er på Activedeveloper.dk og det har jeg lidt probs med. Jeg kan sagtens få de brugere ud som har menuerne, men lige at få pageing til at køre som den skal har jeg lidt svært til. Har du en ide til hvordan jeg skal sætte det sammen?
Avatar billede nute Nybegynder
18. januar 2002 - 10:37 #18
det er tyngre for serveren å la ASP utføre søket enn om SQL joiner noen tabeller og utfører søket for deg. Uansett er dette metoden som *alle* store (relasjonelle) databaser er bygget opp rundt, så det skal du ikke tenke på.

jeg regner med at din paging ikke sender parametre over til \'neste\'/\'forrige\' side ?! det er du nødt til å gjøre...
Avatar billede leasing Nybegynder
18. januar 2002 - 13:02 #19
Nute: har lige siddet og bikset med pageing...sikke noget bøvl. Vil du kigge på min kode????
Avatar billede nute Nybegynder
18. januar 2002 - 13:05 #20
hvis du kan legge koden i en txt fil og legge den på en server et sted og smide linket her, så er det godt. så slipper man å poste en hel masse kode som fyller opp databasen på xperten i tillegg til at man ikke behøver å scrolle seg ihjel ;)
Avatar billede leasing Nybegynder
18. januar 2002 - 13:43 #21
Jeg har desværre ikke noget sted at lægge den ud. Så jeg er desværre nødt til at smide koden ind her. Håber ikke det gør noget.

<HTML>
<HEAD>
    <TITLE></TITLE>
</HEAD>
<BODY>
<%
intPage = Request(\"page\")
If isNumeric(intPage) = False Or intPage < 1 Then
    intPage = 1
End If

Set rs = Server.CreateObject(\"ADODB.RecordSet\")

menuID = request(\"access\")

\'Her findes de brugere der har de menupunkter der søges på
For each item in request(\"Access\")
a = a & item & \",\"
Next
tal = left(a,2)

    strSQL = \"SELECT * FROM MENUID WHERE (menuID=\" & tal & \")\"
        For each item in request(\"Access\")
        strSQL = strSQL & \" OR (menuID=\" & item & \")\"
      Next
\'Slut på søgning af brugere

strDSN = \"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\"&Server.MapPath(\"../../databaser/admin_test.mdb\")
rs.Open strSQL, strDSN, 1

    If Not (rs.BOF Or rs.EOF) Then
        rs.PageSize = 3
        rs.AbsolutePage = intPage
        intRecCount = rs.PageSize
        intPageCount = rs.PageCount
        Response.Write \"<p><b>Side \" & intPage & \" af \" & intPageCount & \"</b></p>\"
        Do While Not rs.EOF And intRecCount > 0
        Set rsFind = Server.CreateObject(\"ADODB.RecordSet\")
        rsFind.open \"SELECT * FROM BRUGER WHERE brugerID=\" & rs(\"brugerID\") & \";\", strDSN, 1

        Response.write \"<table><tr><td>\"
        Response.write rsFind(\"brugerID\") & \", \" & rsFind(\"username\") & \", \" & rs(\"menuID\") & \"<br>\"
        Response.Write \"</td></tr></table><br>\"
            intRecCount = intRecCount - 1
        rs.MoveNext
        Loop
    Else
    Response.write \"<font class=standard>Ingen brugere.\"
    End If
\'Her slutter pageing

\'Her starter Forrige og Næste knapperne
    Response.write \"<table><tr><td width=400 valign=left>\"
    Response.Write \"Gå til side \"
    For intNum = 1 To intPageCount
        Response.Write \"<a href=sog_computer.asp?page=\" & intNum & \">\" & intNum & \"</a>&nbsp;\"
    Next
    Response.write \"</td></tr></table>\"

    Response.Write \"<table><tr><td width=60 valign=left>\"
    If Clng(intPage) > 1 Then
        Response.Write \"<a href=sog_computer.asp?page=\" & intPage - 1 & \"&menuID=\" & request(\"access\") & \"><img src=image/knap_tilbage.gif border=0 height=15 width=55></a>\"
    End If

    Response.write \"</td><td width=280><td width=60 valign=right>\"

    If Clng(intPage) < Clng(intPageCount) Then
        Response.Write \"<a href=sog_computer.asp?page=\" & intPage + 1 & \"&menuID=\" & request(\"access\") & \"><img src=image/knap_naeste.gif border=0 height=15 width=55></a> \"
    End If
    Response.Write \"</td></tr></table></font></td></tr></table>\"
\'Her slutter Forrige og Næste knapperne
%>
</BODY>
</HTML>


Request(\"Access\") er det jeg får fra den side som indeholde checkboxe, de afkrydses og jeg får så en streng der kan se sådan ud: 10, 13, 15, osv.


Avatar billede nute Nybegynder
18. januar 2002 - 13:47 #22
prøv å bytt ut:

\'Her starter Forrige og Næste knapperne
    Response.write \"<table><tr><td width=400 valign=left>\"
    Response.Write \"Gå til side \"
    For intNum = 1 To intPageCount
        Response.Write \"<a href=sog_computer.asp?page=\" & intNum & \">\" & intNum & \"</a>&nbsp;\"
    Next
    Response.write \"</td></tr></table>\"

    Response.Write \"<table><tr><td width=60 valign=left>\"
    If Clng(intPage) > 1 Then
        Response.Write \"<a href=sog_computer.asp?page=\" & intPage - 1 & \"&menuID=\" & request(\"access\") & \"><img src=image/knap_tilbage.gif border=0 height=15 width=55></a>\"
    End If

    Response.write \"</td><td width=280><td width=60 valign=right>\"

    If Clng(intPage) < Clng(intPageCount) Then
        Response.Write \"<a href=sog_computer.asp?page=\" & intPage + 1 & \"&menuID=\" & request(\"access\") & \"><img src=image/knap_naeste.gif border=0 height=15 width=55></a> \"
    End If
    Response.Write \"</td></tr></table></font></td></tr></table>\"


med dette, så skal det kunne fungere:

\'Her starter Forrige og Næste knapperne
    Response.write \"<table><tr><td width=400 valign=left>\"
    Response.Write \"Gå til side \"
    For intNum = 1 To intPageCount
        Response.Write \"<a href=sog_computer.asp?page=\" & intNum & \"&access=\" & request(\"access\") & \">\" & intNum & \"</a>&nbsp;\"
    Next
    Response.write \"</td></tr></table>\"

    Response.Write \"<table><tr><td width=60 valign=left>\"
    If Clng(intPage) > 1 Then
        Response.Write \"<a href=sog_computer.asp?page=\" & intPage - 1 & \"&access=\" & request(\"access\") & \"><img src=image/knap_tilbage.gif border=0 height=15 width=55></a>\"
    End If

    Response.write \"</td><td width=280><td width=60 valign=right>\"

    If Clng(intPage) < Clng(intPageCount) Then
        Response.Write \"<a href=sog_computer.asp?page=\" & intPage + 1 & \"&access=\" & request(\"access\") & \"><img src=image/knap_naeste.gif border=0 height=15 width=55></a> \"
    End If
    Response.Write \"</td></tr></table></font></td></tr></table>\"


Avatar billede leasing Nybegynder
18. januar 2002 - 13:58 #23
Når jeg trykker på næste tager den kun det første tal med som er i request(\"access\") efterfuldt af et komma. Hvordan får jeg den til at requeste alle talene uden komma?
Avatar billede nute Nybegynder
18. januar 2002 - 14:21 #24
har du et form element som heter \"access\" og et som heter \"Access\" ??

Avatar billede leasing Nybegynder
18. januar 2002 - 14:23 #25
det er den ligeglad med. Resultatet er det samme.
Avatar billede nute Nybegynder
18. januar 2002 - 14:41 #26
kjør dette script, så vil du se at det skal fungere:

<html>
<body>
<form>
<input type=\"checkbox\" name=\"Access\"> test<br>
<input type=\"checkbox\" name=\"Access\"> test<br>
<input type=\"checkbox\" name=\"Access\"> test<br>
<input type=\"checkbox\" name=\"Access\"> test<br>
<input type=\"checkbox\" name=\"Access\"> test<br>
<input type=\"submit\" value=\"Klikk\">
</form><br>
<a href=\"?Access=<%= request(\"Access\") %>\"><%= request(\"Access\") %></a>
</body>
</html>

Gjør følgende:

1) Velg noen checkboxer
2) klikk submit
3) klikk på linket
( gjenta pkt 3 så ser du at det fungerer... )

/nute
3)
Avatar billede leasing Nybegynder
18. januar 2002 - 15:23 #27
Det er lidt pudsigt problem. Jeg kan simpelthen ikke få den til at vise flere flere tal en et tal og et komma bagefter. Har prøvet dit eksempel og det virker fint.
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