Avatar billede butcher Nybegynder
23. april 2002 - 16:37 Der 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:

<html>
<head>
<title>Test</title>
</head>

<body style="font-family: Verdana; font-size: 8pt" bgcolor="#FFFFFF" text="#000000">

<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath ("server.mdb")
Conn.Open DSN

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") & "&nbsp;"
  Response.write rs("servernavn") & "&nbsp;"
  Response.write rs("ip") & "&nbsp;"
  Response.write rs("gemtdato") &  "&nbsp;"
  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
Avatar billede eagleeye Praktikant
23. april 2002 - 16:49 #1
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
Avatar billede tjaz Nybegynder
23. april 2002 - 16:52 #2
Avatar billede askhoej Praktikant
23. april 2002 - 16:57 #3
Avatar billede butcher Nybegynder
23. april 2002 - 17:50 #4
ok jeg er noget lost her eagleeye, jeg er kommet frem til:
<body>

<%
set cn = server.createobject("ADODB.Connection")
constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("server.mdb")
cn.connectionstring=constr
cn.open

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
Avatar billede butcher Nybegynder
23. april 2002 - 18:17 #5
jeg kigger lige på tjaz forslag, har faktisk fået det delvis til at virker, vender tilbage senere, skal lige se om jeg også forstår koden...

taxa
Avatar billede eagleeye Praktikant
23. april 2002 - 19:12 #6
du mangler ad fefinere Rs vdd: Set rs = Server.CreateObject("ADODB.RecordSet") sådan her:

set cn = server.createobject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
cn.connectionstring=constr
Avatar billede butcher Nybegynder
24. april 2002 - 09:54 #7
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
%>

</body>

så er der også lige en fordobling af points ;)
Avatar billede eagleeye Praktikant
24. april 2002 - 14:45 #8
Jo det kan jeg, du får det i aften hvis du kan vendte så lang tid.
Avatar billede eagleeye Praktikant
24. april 2002 - 19:36 #9
Her er lidt jeg har skrevet til scripet:


<%
'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>
Avatar billede butcher Nybegynder
24. april 2002 - 20:40 #10
Fantastisk, flot arbejde, mange tak for det.

Kig ind på http://www.eksperten.dk/spm/202776 så er der lidt ekstra der ;)
Avatar billede butcher Nybegynder
26. april 2002 - 18:18 #11
lige et ??? eagleeye hvorfor er det Rs.Open "SELECT * FROM server", Cn,1,3

hvorfor det 3 tal der?
Avatar billede eagleeye Praktikant
26. april 2002 - 18:37 #12
3 er  adLockOptimistic - locked during Update method.
Det er faktisk ikke nødvendigt i dette tilfølde da du bare skal skive ud fra recordsetet.

Du kan benytter 1 som er adLockReadOnly som betyder man ikke kan ændre i databasen. Det havde nok været mere korekt.


Prøv at kikke her så kan du se hvad de forskellige betyder.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adoce31/html/ado30ref_28.asp
Avatar billede butcher Nybegynder
26. april 2002 - 19:47 #13
mange tak
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