22. januar 2005 - 12:05Der 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:
Flere kommuner går nu i gang med at bruge AI-understøttet dokumentation. Målet er, at sagsbehandlere skal bruge mindre tid på referater og registrering – og mere tid på nærvær i mødet med borgeren.
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
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...
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
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...
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.
<% 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
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
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.
<% 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
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.
<% 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
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.
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 ???
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
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 %>
Jeg har selv fundet ud af det, så sagen er nu lukket....!
Synes godt om
Ny brugerNybegynder
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.