Avatar billede razser Nybegynder
22. januar 2005 - 12:05 Der er 20 kommentarer og
1 løsning

Vis 3 tilfældige billeder fra database

Jeg skal have vist 3 tilfældige billeder fra en access-database. Jeg kan godt få vist 1 tilfældigt billede, men hvordan får jeg vist 3?  Til visning af 1 billed benytter jeg følgende kode:

<%
Option Explicit
Response.Buffer = True
%>
<html>
<head>
</head>
<body>
<%
Const adCmdText = &H0001
Dim query, connStr
query = "select image from RandomRec"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("random.mdb")

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open query, connStr, 3, , adCmdText
       
Dim intRnd
Randomize Timer
intRnd = (Int(RND * rs.RecordCount))
       
rs.Move intRnd
Response.Write rs("image")       
rs.Close
Set rs = Nothing
%>
</body>
</html>
Avatar billede michaelfp Nybegynder
22. januar 2005 - 16:26 #1
Prøv med følgende kode:

Dim intRnd, C, Pet, Pto, Ptre
Randomize Timer
For C = 1 To 3
  intRnd = (Int(RND * rs.RecordCount))
  Select case C
    Case 1 Pet = IntRnd
    Case 2 Pto = IntRnd
    Case 3 Ptre = IntRnd
  End select
Next     

rs.Move Pet
Response.Write rs("image") 
rs.Move Pto
Response.Write rs("image")   
rs.Move Ptre
Response.Write rs("image") 
rs.Close
Set rs = Nothing

i stedet for

Dim intRnd
Randomize Timer
intRnd = (Int(RND * rs.RecordCount))
       
rs.Move intRnd
Response.Write rs("image")       
rs.Close
Set rs = Nothing

(Jeg har ikke selv testet det!  :-)
Avatar billede razser Nybegynder
23. januar 2005 - 06:37 #2
Indsættes dit script opstår der følgende fejl: "ADODB.Field (0x80020009)
Enten er BOF eller EOF sand, eller den aktuelle post er blevet slettet. Den anmodede handling kræver en aktuel post." 

Jeg har forsøgt at indsætte sætningen "If Not (rs.BOF Or rs.EOF) Then..." men det kører ikke rigtigt. I dit script er der i øvrigt statistisk mulighed for at 2 af det samme billede vises. Det skal være 3 forskellige...
Avatar billede michaelfp Nybegynder
23. januar 2005 - 12:38 #3
Hvormange billeder har du i tabellen? noget tyder på, at intRnd får en position, som ligger udenfor sidste post!

M.h.t at sikre, at værdien ligger indenfor antallet af poster og for at undgå at
samme billede vises tre gange så prøv med:
For C = 1 To 3
  intRnd = (Int(RND * rs.RecordCount))
  intRnd = IntRnd - C ' så undgår du at samme billede vises tre gange
  Select case C
    Case 1 Pet = IntRnd
    Case 2 Pto = IntRnd
    Case 3 Ptre = IntRnd
  End select
  If Pet > Rs.recordcount Then
    Pet = 1 ' kunne også være noget matematik som udregner ny pos
  End if
  If Pto > Rs.recordcount Then
    Pet = 2 ' kunne også være noget matematik som udregner ny pos
  End if
  If Ptre > Rs.recordcount Then
    Pet = 3 ' kunne også være noget matematik som udregner ny pos
  End if
Next
Avatar billede razser Nybegynder
23. januar 2005 - 13:23 #4
Der kommer desværre stadig samme fejlmeddelelse:
"Fejltype:
ADODB.Field (0x80020009)
Enten er BOF eller EOF sand, eller den aktuelle post er blevet slettet. Den anmodede handling kræver en aktuel post."

Når jeg klikker på opdater et par gange, lykkedes det at fremvise billeder, men så pludselig fejler scriptet igen med ovenstående fejlmeddelelse...jeg klikker atter på opdater et par gange, og så vises billeder igen, men jeg får stadig vist 2 og endda 3 af det samme billede....???

Der ligger af "test-grunde" ikke mere end 6 billeder i databasen, hvilket i princippet burde være tilstrækkeligt...
Avatar billede michaelfp Nybegynder
23. januar 2005 - 14:01 #5
Sorry - nogen gange går det for stærkt!

Prøv lige at ændre:
  If Pet > Rs.recordcount Then
    Pet = 1 ' kunne også være noget matematik som udregner ny pos
  End if
  If Pto > Rs.recordcount Then
    Pet = 2 ' kunne også være noget matematik som udregner ny pos
  End if
  If Ptre > Rs.recordcount Then
    Pet = 3 ' kunne også være noget matematik som udregner ny pos
  End if

til

  If Pet > Rs.recordcount Then
    Pet = 1 ' kunne også være noget matematik som udregner ny pos
  End if
  If Pto > Rs.recordcount Then
    Pto = 2 ' kunne også være noget matematik som udregner ny pos
  End if
  If Ptre > Rs.recordcount Then
    Ptre = 3 ' kunne også være noget matematik som udregner ny pos
  End if

Hvis det stadig ikke virker så lad mig lige se din kode.
Avatar billede razser Nybegynder
23. januar 2005 - 14:20 #6
Det virker stadig ikke.... men her er koden:

<%
Option Explicit
Response.Buffer = True
%>
<html>
<head></head>
<body>
<%
Dim query, connStr
query = "select image from RandomRec"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("randomImg.mdb")

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open query, connStr, 1
       
Dim IntRnd, C, Pet, Pto, Ptre

Randomize Timer
For C = 1 To 3
  IntRnd = (Int(RND * rs.RecordCount))
  IntRnd = IntRnd - C
  Select Case C
    Case 1 Pet = IntRnd
    Case 2 Pto = IntRnd
    Case 3 Ptre = IntRnd
  End select
  If Pet > Rs.recordcount Then
    Pet = 1
  End if
  If Pto > Rs.recordcount Then
    Pto = 2
  End if
  If Ptre > Rs.recordcount Then
    Ptre = 3
  End if
Next

rs.Move Pet
Response.Write rs("image") 
rs.Move Pto
Response.Write rs("image")   
rs.Move Ptre
Response.Write rs("image")

rs.Close
Set rs = Nothing
%>

</body>
</html>
Avatar billede michaelfp Nybegynder
23. januar 2005 - 17:09 #7
Prøv med følgende. Den eneste forskel er, at nu tages højde for
negative værdier:

<%
Option Explicit
Response.Buffer = True
%>
<html>
<head></head>
<body>
<%
Dim query, connStr
query = "select image from RandomRec"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("randomImg.mdb")

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open query, connStr, 1
       
Dim IntRnd, C, Pet, Pto, Ptre

Randomize Timer
For C = 1 To 3
  IntRnd = (Int(RND * rs.RecordCount))
  IntRnd = IntRnd - C
  Select Case C
    Case 1 Pet = IntRnd
    Case 2 Pto = IntRnd
    Case 3 Ptre = IntRnd
  End select
  If (Pet < 1) or (Pet > Rs.recordcount) Then
    Pet = 1
  End if
  If (Pto < 1) or (Pto > Rs.recordcount) Then
    Pto = 2
  End if
  If (Ptre < 1) or (Ptre > Rs.recordcount) Then
    Ptre = 3
  End if
Next

rs.Move Pet
Response.Write rs("image") 
rs.Move Pto
Response.Write rs("image")   
rs.Move Ptre
Response.Write rs("image")

rs.Close
Set rs = Nothing
%>

</body>
</html>
Avatar billede razser Nybegynder
23. januar 2005 - 17:36 #8
Hmmm, fejlen er der stadig: 
Fejltype:
ADODB.Field (0x80020009)
Enten er BOF eller EOF sand, eller den aktuelle post er blevet slettet. Den anmodede handling kræver en aktuel post.

Men det synes på rette vej...
Avatar billede michaelfp Nybegynder
23. januar 2005 - 19:09 #9
Prøv følgende debug kode:

<%
Option Explicit
Response.Buffer = True
%>
<html>
<head></head>
<body>
<%
Dim query, connStr
query = "select image from RandomRec"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("randomImg.mdb")

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open query, connStr, 1
       
Dim IntRnd, C, Pet, Pto, Ptre

Randomize Timer
For C = 1 To 3
  IntRnd = (Int(RND * rs.RecordCount))
  IntRnd = IntRnd - C
  Select Case C
    Case 1 Pet = IntRnd
    Case 2 Pto = IntRnd
    Case 3 Ptre = IntRnd
  End select
  If (Pet < 1) or (Pet > Rs.recordcount) Then
    Pet = 1
  End if
  If (Pto < 1) or (Pto > Rs.recordcount) Then
    Pto = 2
  End if
  If (Ptre < 1) or (Ptre > Rs.recordcount) Then
    Ptre = 3
  End if
Next

Response.write Pet
Response.write Pto
Response.write Ptre

rs.Move Pet
Response.Write rs("image") 
rs.Move Pto
Response.Write rs("image")   
rs.Move Ptre
Response.Write rs("image")

rs.Close
Set rs = Nothing
%>

</body>
</html>

hvad er værdierne når den fejler? og findes der data i de records?
Avatar billede razser Nybegynder
23. januar 2005 - 19:25 #10
Når siden fejler, ses kun følgende:
Fejltype:
ADODB.Field (0x80020009)
Enten er BOF eller EOF sand, eller den aktuelle post er blevet slettet. Den anmodede handling kræver en aktuel post.

Ellers skifter de 3 værdier mellem 1 og 3...???
Avatar billede michaelfp Nybegynder
23. januar 2005 - 19:35 #11
skal det forstås således, at så snart værdierne er <> 1 til 3 så fejler scriptet?
Avatar billede razser Nybegynder
23. januar 2005 - 19:38 #12
Det kunne godt være konklusionen....
Avatar billede razser Nybegynder
23. januar 2005 - 19:45 #13
I stedet for Response.Write rs("image") skriver jeg nu:

Response.Write "<a href=" & "'" & rs("url") & "'" & " target=" & "'" & "_blank" & "'" & ">" & rs("image") & "</a>"    da jeg skal have et link på billedet.

Men da får jeg kun denne fejlmeddelelse....???

Fejltype:
(0x80020009)
Undtagelse opstod.
Avatar billede michaelfp Nybegynder
23. januar 2005 - 19:50 #14
prøv at ændre rnd kaldet til:

<%
Option Explicit
Response.Buffer = True
%>
<html>
<head></head>
<body>
<%
Dim query, connStr
query = "select image from RandomRec"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("randomImg.mdb")

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open query, connStr, 1
       
Dim IntRnd, C, Pet, Pto, Ptre

Randomize Timer
For C = 1 To 3
  IntRnd = Int((rs.RecordCount * Rnd) + 1)
  Select Case C
    Case 1 Pet = IntRnd
    Case 2 Pto = IntRnd
    Case 3 Ptre = IntRnd
  End select
  If (Pet < 1) or (Pet > Rs.recordcount) Then
    Pet = 1
  End if
  If (Pto < 1) or (Pto > Rs.recordcount) Then
    Pto = 2
  End if
  If (Ptre < 1) or (Ptre > Rs.recordcount) Then
    Ptre = 3
  End if
Next

Response.write Pet
Response.write Pto
Response.write Ptre

rs.Move Pet
Response.Write rs("image") 
rs.Move Pto
Response.Write rs("image")   
rs.Move Ptre
Response.Write rs("image")

rs.Close
Set rs = Nothing
%>

</body>
</html>
Avatar billede michaelfp Nybegynder
23. januar 2005 - 19:55 #15
M.h.t 19:45:05
I din sql henter du kun "Image" og derfor kan du i linket ikke referere til "URL".
Ændre din sql statement til:
query = "select * from RandomRec" så får du alle felter fra recordsettet med.
Avatar billede razser Nybegynder
23. januar 2005 - 19:57 #16
Det blev desværre værre, sådan forstået, at jeg skal klikke 20-30 gange på opdater for at se billeder....derefter fejler den umiddelbart efter en visning ???
Avatar billede michaelfp Nybegynder
23. januar 2005 - 19:59 #17
Der er en anden lille fejl i mit forslag og indtil videre skal det se således ud:

<%
Option Explicit
Response.Buffer = True
%>
<html>
<head></head>
<body>
<%
Dim query, connStr
query = "select image from RandomRec"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("randomImg.mdb")

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open query, connStr, 1
       
Dim IntRnd, C, Pet, Pto, Ptre

Randomize Timer
For C = 1 To 3
  IntRnd = Int((rs.RecordCount * Rnd) + 1)
  Select Case C
    Case 1 Pet = IntRnd
    Case 2 Pto = IntRnd
    Case 3 Ptre = IntRnd
  End select
Next
If (Pet < 1) or (Pet > Rs.recordcount) Then
  Pet = 1
End if
If (Pto < 1) or (Pto > Rs.recordcount) Then
  Pto = 2
End if
If (Ptre < 1) or (Ptre > Rs.recordcount) Then
  Ptre = 3
End if

Response.write Pet
Response.write Pto
Response.write Ptre

rs.Move Pet
Response.Write rs("image") 
rs.Move Pto
Response.Write rs("image")   
rs.Move Ptre
Response.Write rs("image")

rs.Close
Set rs = Nothing
%>

</body>
</html>
Avatar billede razser Nybegynder
23. januar 2005 - 19:59 #18
Har ændret "select * from RandomRec" - det er ikke der problemet er...
Avatar billede michaelfp Nybegynder
23. januar 2005 - 20:02 #19
Virker din
Response.Write "<a href=" & "'" & rs("url") & "'" & " target=" & "'" & "_blank" & "'" & ">" & rs("image") & "</a>" 

efter du har ændret select??
Avatar billede razser Nybegynder
24. januar 2005 - 18:48 #20
Jeg er gået lidt andre veje, eftersom scriptet, der skal udvælge 3 tilfældige tal ikke er helt skudsikkert. Der opstår en udtagelse, når der er 2 eller 3 tal der falder sammen - og så fejler siden.

Nedenstående ses et nyt script, der udskriver 3 tilfældige tal ud fra det samlede antal records i databasen. Problemet er så at få disse 3 tal til at være dem, der udvælger 3 records i databasen og derved skriver billeder ud på siden. Jeg har lidt dog problemer med at splitte array'et... så hvis nogen kan hjælpe....? Måske er der andre måder at gøre det på...?

Hvis man udkommentere databasen, kan man køre scriptet...og det er gennemtestet!
Scripter er pt. sat til at skulle vælge mellem 6 tal..( se i bunden: GenNos 3,6,500
hvor 3 er antallet af tal, der udskrives; 6 er det samlede antal, der kan vælges i mellem, og 500 har noget med "sandsynligheds-regning" at gøre?)

<%
Dim query, connStr
query = "select * from RandomRec"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("randomImg.mdb")

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open query, connStr, 1
       
Sub GenNos(Number,MaxNumber,Factor)
  Randomize

Redim aHolder(MaxNumber) 
  For I = 1 to MaxNumber
      aHolder(I) = I 
  Next 

For I = 1 to Factor
    intRand1 = CInt((Rnd()*(MaxNumber-1))+1)
    intRand2 = CInt((Rnd()*(MaxNumber-1))+1)
   
    Temp1 = aHolder(intRand1)
    aHolder(intRand1) = aHolder(intRand2)
    aHolder(intRand2) = Temp1
  Next
 
Redim aNumbersUsed(Number)
    For I = 1 to number
      aNumbersUsed(I) = aHolder(I)
    Next 
   
For I = 1 to Number
    For A = I+1 to Number
      If aNumbersUsed(A) < aNumbersUsed(I) then
          C =  aNumbersUsed(I)
          aNumbersUsed(I)=  aNumbersUsed(A)
          aNumbersUsed(A) = C
      End If
    Next
  Next
 
For I = 1 to number
strNumbers = aNumbersUsed(I) & "<br>"
Response.Write strNumbers
Next

End Sub
'GenNos 3,Rs.recordcount,500
GenNos 3,6,500
rs.Close
Set rs = Nothing
%>
Avatar billede razser Nybegynder
25. januar 2005 - 18:22 #21
Jeg har selv fundet ud af det, så sagen er nu lukket....!
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