Avatar billede lassethostrup Nybegynder
16. september 2010 - 15:22 Der er 1 kommentar og
1 løsning

Subscrit out of range

Hej alle eksperter :)

Jeg har et lille problem med en hjemmeside der lyder:

Det er et galleri hvor billeder bliver sat i rækker med 5 billeder i hver række, men jeg er stødt ind i et problem når jeg kommer over 30 billeder.
Fejlkoden:

Microsoft VBScript runtime error '800a0009'

Subscript out of range: 'i'

/cases.asp, line 147

Her er koderne:


bid = request.QueryString("subid")

dim tab(30,30)


sql = "SELECT * FROM img where i_menuid = "&bid&""
set rs = Conn.Execute(sql)
do while rs.eof = false
i = i + 1
tab(i,1) = rs("i_img") <-------------------------- linje 147
tab(i,2) = rs("i_imgthumb")
tab(i,3) = rs("i_navn")
rs.movenext
loop

sql1 = "SELECT COUNT(*) AS Antal FROM img where i_menuid = "&bid&""
set rs1 = Conn.Execute(sql1)
%>


<table border="0" cellpadding="0" cellspacing="0" width="90%">
<%for i = 1 to CINT(rs1("Antal")) step 5%>
<tr>
<td width="20%" align="center" style="font-size:11px;">
<%if tab(i,1) <> "" then%>
<a href="images/gallery/<%=tab(i,1)%>" rel="lightbox[Billedserie]" title="<%=tab(i,3)%>" >
<img  src="images/gallery/<%=tab(i,2)%>" style="border:solid 1px #666666;" /></a>
<%end if%>
</td>
<td width="20%"  align="center"  style="font-size:11px;">
<%if tab(i+1,1) <> "" then%>
<a href="images/gallery/<%=tab(i+1,1)%>" rel="lightbox[Billedserie]" title="<%=tab(i+1,3)%>" >
<img  src="images/gallery/<%=tab(i+1,2)%>" style="border:solid 1px #666666;" /></a>
<%end if%>
</td>
<td width="20%" align="center"  style="font-size:11px;">
<%if tab(i+2,1) <> "" then%>
<a href="images/gallery/<%=tab(i+2,1)%>" rel="lightbox[Billedserie]" title="<%=tab(i+2,3)%>" >
<img  src="images/gallery/<%=tab(i+2,2)%>" style="border:solid 1px #666666;" /></a>
<%end if%>
</td>
<td width="20%" align="center"  style="font-size:11px;">
<%if tab(i+3,1) <> "" then%>
<a href="images/gallery/<%=tab(i+3,1)%>" rel="lightbox[Billedserie]" title="<%=tab(i+3,3)%>" >
<img  src="images/gallery/<%=tab(i+3,2)%>" style="border:solid 1px #666666;" /></a>
<%end if%>
</td>
<td width="20%" align="center"  style="font-size:11px;">
<%if tab(i+4,1) <> "" then%>
<a href="images/gallery/<%=tab(i+4,1)%>"  rel="lightbox[Billedserie]" title="<%=tab(i+4,3)%>" >
<img  src="images/gallery/<%=tab(i+4,2)%>" style="border:solid 1px #666666;" /></a>
<%end if%>
</td>
</tr>
<tr>
<td style="font-size:11px;"  align="center" >
<%if tab(i,1) <> "" then%>
<a href="images/gallery/<%=tab(i,1)%>" rel="lightbox[Billedseriet]" title="<%=tab(i,3)%>"><%=tab(i,3)%></a>
<%end if%>
</td>
<td style="font-size:11px;"  align="center" >
<%if tab(i+1,1) <> "" then%>
<a href="images/gallery/<%=tab(i+1,1)%>" rel="lightbox[Billedseriet]" title="<%=tab(i+1,3)%>"><%=tab(i+1,3)%></a>
<%end if%>
</td>
<td  style="font-size:11px;"  align="center" >
<%if tab(i+2,1) <> "" then%>
<a href="images/gallery/<%=tab(i+2,1)%>" rel="lightbox[Billedseriet]" title="<%=tab(i+2,3)%>"><%=tab(i+2,3)%></a>
<%end if%>
</td>
<td style="font-size:11px;"  align="center" >
<%if tab(i+3,1) <> "" then%>
<a href="images/gallery/<%=tab(i+3,1)%>" rel="lightbox[Billedseriet]" title="<%=tab(i+3,3)%>"><%=tab(i+3,3)%></a>
<%end if%>
</td>
<td style="font-size:11px;"  align="center" >
<%if tab(i+4,1) <> "" then%>
<a href="images/gallery/<%=tab(i+4,1)%>" rel="lightbox[Billedseriet]" title="<%=tab(i+4,3)%>"><%=tab(i+4,3)%></a>
<%end if%>
</td>
</tr>
<%next%>
</table>
Avatar billede lassethostrup Nybegynder
16. september 2010 - 15:23 #1
Undskyld hvis det ser lidt rodet ud, men havde lidt svært ved at gøre det stykke kode overskueligt..

Håber meget at der er nogle kloge hoveder der vil hjælpe :)
Avatar billede softspot Forsker
16. september 2010 - 15:47 #2
Det er umiddelbart fordi du kun har dimensioneret dit array til at kunne indeholde 31 elementer (rækker), men til gengæld har du dimensioneret det til at indeholde væsentlig flere kolonner end nødvendigt! :-)

Du kan komme omkring det ved at benytte den indbyggede funktion på et recordset, GetRows, der returnerer et 2-dimensionelt array med kolonnerne i dit udtræk, nogenlunde således:

dim tab
sql = "SELECT i_img, i_imgthumb, i_navn FROM img WHERE i_menuid = "&bid&""
set rs = Conn.Execute(sql)
tab = rs.GetRows()
rs.close
set rs = nothing

NB: kolonnerne trækkes ud i array'et i den rækkefølge de forekommer i SQL-sætningen, derfor vælger jeg at angive kolonnerne eksplicit. Desuden er det oftest mere effektivt kun at trække det ud man skal bruge (med mindre man skal bruge alle felter).

GetRows returnerer imidlertid et array som indekserer kolonnerne først, hvilket vil sige at der kun er 3 elementer i den første dimension og et antal elementer svarende til antallet af rækker i udtrækket i den anden dimension. Det betyder helt konkret at du skal indeksere array'et omvendt end du pt. gør for at få det til at fungere.

Eksempelvis vil tab(0, 100) aflæse i_img fra række nr. 101 i dit udtræk (forudsat der er 101 eller flere rækker naturligvis :-)).

I øvrigt er det ikke nødvendigt at kalde databasen igen for at finde antallet af rækker, det antal kan du bare aflæse af array'et med ubound(tab, 2) for at finde antal rækker i udtrækket. HUSK at arrays ALTID er nulbaserede i VBScript, dvs. første element ligger på indeks 0 og ubound returnerer ligeledes et nulbaseret antal, dvs. hvis ubound(tab) returnerer 99, så er der 100 elementer i arrayet.
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