23. april 2002 - 16:37Der er
12 kommentarer og 1 løsning
Udtræk 5 tilfældige poster?
Ok jeg skal udtrække 5 tilfældige poster fra en database, men problemmet er at det er en fra en celle, men fra en hel række (kolonne???) dette er dog også lykkedes med en post, da jeg kom frem til dette:
strSQL = "Select * from server" if Session("visID") <> "" then strSQL = strSQL & " WHERE ID NOT IN ("&Session("visID")&")" end if rs.Open strSQL, Conn, 3, 1 rndMax = CInt(rs.RecordCount) if rndMax > 0 then Randomize rndNumber = Int((RND * rndMax)) 'Find et random nummer rs.Move rndNumber 'Flyt til den valgte record
Response.Write rs("spil") & " " Response.write rs("servernavn") & " " Response.write rs("ip") & " " Response.write rs("gemtdato") & " " Response.write "<a href="& rs("url") & ">Link</a>" if Session("visID") = "" then Session("visID") = rs("ID") else Session("visID") = Session("visID") & "," & rs("ID") end if else Response.Write "Ikke flere record at vise, reload og begynd forfra" Session("visID") = "" end if rs.Close Set rs = Nothing Conn.Close Set Conn = Nothing %>
</body> </html>
Problemmet med denne kode er at den nogle gange skriver: "Ikke flere record at vise, reload og begynd forfra", hvilket i sig selv ikke ser så godt ud og at den kun skriver 1 post ud på siden. Jeg kunne naturligvis godt køre denne kode 5 gange på siden, men dette er ikke så pænt og jeg risikere at ende op med de 2 samme posts. Er der nogle som har en kode som kan trække 5 posts ud fra en database, men samtidigt skal det være fra flere felter i en post og helst uden sådan en "Ikke flere record at vise, reload og begynd forfra" tekst. Og så ikke så hardcore med jeres forklaringer, er temmeligt ny til asp :D
Efter ti år i London, Madrid, Paris og Utrecht kommer Sabios AI-fokuserede program af arrangementer om kundeoplevelser, ‘Disrupt’, for første gang til Danmark.
Jeg har lavet dette scrip som vælger 5 forskellige records, og når man trykker refresh er det 5 nye records:
Rs.Open "SELECT * FROM abbtabel", myConn,1,3 inDB = rs.RecordCount If inDB > 5 then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound <5 Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) myArr=split(strIndex,",",-1) For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1
Response.write " UDSKRIV DATA HER med rs(""FELT"") .... " next end if Rs.Close
Rs.Open "SELECT * FROM server", myConn,1,3 inDB = rs.RecordCount If inDB > 5 then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound <5 Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) myArr=split(strIndex,",",-1) For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1
Response.write rs("servernavn") next end if
RS.Close Set RS = Nothing Cn.Close Set Cn = Nothing %>
</body>
men et eller andet er det galt :D
jeg får følgende fejl:
Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8) Et objekt er obligatorisk: '' /random.asp, line 14
eagleeye det virker perfekt, kanon mange tak for det, men du gider ikke lige at gøre mig den kæmpe tjeneste at kommenter linie for linie i koden, da jeg skal bruge den til en skole opgave og helst skal vide helt præcist hvad de forskellige ting gør, og nogle af de koder du bruger er lige hardcore nok for en asp-newbie som mig, jeg har inkluderet den færdige kode her som virker:
<% Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("server.mdb") set cn = server.createobject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.RecordSet") cn.connectionstring=constr cn.open
Rs.Open "SELECT * FROM server", Cn,1,3 inDB = rs.RecordCount If inDB > 5 then Randomize timer newId = Int (rnd*inDB) strIndex = "," & newid & "," indexFound = 1 Do while indexFound <5 Do Newid = Int (rnd*inDB) Loop while inStr(strIndex,"," & newid & ",") > 0 strIndex = strIndex & newid & "," indexFound = indexFound + 1 Loop strIndex = mid (strIndex,2,len(strIndex)-2) myArr=split(strIndex,",",-1) For i = Lbound(myArr) to Ubound(myArr) rs.move myArr(i),1
Response.write "<a href=""" & rs("url") &""">"& RS("servernavn") &"</a><br>" next end if
RS.Close Set RS = Nothing Cn.Close Set Cn = Nothing %>
<% 'Princippet i dette script er at den hendter hele tabellen over i et recordset og 'finder antal records. 'Så finder man 5 tilfældige tal mellem 0 og antal records - 1 'Når de er fundet bruger man en funktion i recordset'et hvor man kan flytte til en 'en bestem record (det tilfældige tal mellem 0 og antal records - 1). 'Når man finde de tilfældige tal ligges de i en liste med ,TAL,TAL,TAL,TAl, det er 'for man med sikkerhed kan tjekke om et tal findes i forvejen i listen. 'Hivs det bare er TAL,TAL,TAL, kan man fra sortere nogle tal hvis andre er fundet. 'Eks: 11,20,15, Hvis vi nu finder 1 og søg på 1, i stengen vil 1, bliver fundet 'i 11,. Derfor er der et komma i starten: 'Eks ,11,20,15, Hvis vi nu igen finder 1 og søger skal vi søge efter ,1, og det 'kan ikke findes. 'Når man har fundet de 5 tal har man listen ,11,20,15,1,6, 'Så lavet er array hvor hver celle skal bestå af et af de tilfældige tal. 'For at lavet arrayet benyttes Split som kan dele en stren op ved en ønsked karater 'her vælges , 'Så for at ungå 2 tomme array celler fjernes første og sidste , og split benyttes herefter. 'Nu har man et array med 5 tilfældige tal i så er det abre at lave en For sætning som 'udvælger samt udskriver de 5 records som er i arrayet et tal af gangen %> <html> <head></head> <body> <% 'Dette er connection strengen til databasen Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("server.mdb") 'Definer connection og recordset obejct set cn = server.createobject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.RecordSet") 'Set og Åben connection til databasen cn.connectionstring=constr cn.open
'Åben et recordset med data fra databsen Rs.Open "SELECT * FROM server", Cn,1,3 'Find antallet af records i databasen inDB = rs.RecordCount 'Tjekker om der er 5 records i databasen If inDB >= 5 then 'Start randomize funktuionen. Her med Timer pga. den ellers har tendens til at 'give samme værdi flere gange i træk. Randomize timer 'Find først Tilfældige tal newId = Int (rnd*inDB) 'Gem tallet i en list med komma imellem. Listen kommer til at se sådan her ud når 'alle tal er fundet, altså med komma først så tal så komma, for man med sikkerhed 'kan sige om et tal finde i listen: ' ,2,8,3,6, strIndex = "," & newid & "," 'Tæller som angiver hvor mange tilfældige tal der er fundet. indexFound = 1 Do while indexFound < 5 Do 'Find Næste tilfældigetal. Newid = Int (rnd*inDB) 'Under søg om tallet er i liste ved at søge på ",TAL,". Igen deror listen laves 'med , før og efter tallet. 'Hvis tallet findes i strIndes så find et andet/ny tal. Loop while inStr(strIndex,"," & newid & ",") > 0 'Et nyt tilfældigt tal er fundet put det i listen strIndex strIndex = strIndex & newid & "," 'Tæl antal fundne tilfældige tal op med 1. indexFound = indexFound + 1 Loop 'Nu har man en list strIndex med 5 tilfældige tal med komma foran og bagved: 'eks: ,2,9,4,3,6, 'For at kunne bruge det listen til noget og og benytte split til at finde alle tal 'fjernes første og sidste komma så listen kommer til at se sådan her ud: 'eks: 2,9,4,3,6 strIndex = mid (strIndex,2,len(strIndex)-2) 'Så laves et array med med et index i hver celle... 'Array'et laves ud fra strIndex med split ved komma. myArr=split(strIndex,",",-1) 'Udskrive de tilfældige records. Lbound(myArr) finder første index i arrayet og 'Ubound(myArr) finder sidste index i arrayet. 'I dette tilfælde hvorantallet er 5 kunne man lige så godt skrive: For i = 0 to 4 'Det er for at gør den helt generel. Response.Write strIndex & "<br>" For i = Lbound(myArr) to Ubound(myArr) 'Flyt til den tilfældigt udvalgte record i recordset'et (databasen) rs.move myArr(i),1 'Udskriv data: Response.write "<a href=""" & rs("url") &""">"& RS("servernavn") &"</a><br>" next else 'Her kommer man kun hvis der er mindre END 5 record i databasen!! 'Udskriv de records som er i databasen, dog ikke i tilfældig række følge. do while not rs.EOF Response.write "<a href=""" & rs("url") &""">"& RS("servernavn") &"</a><br>" rs.MoveNext loop end if
'Ryd op; Luk recordset'et og connection samt set til Notning. RS.Close Set RS = Nothing Cn.Close Set Cn = Nothing %> </body> </html>
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.