Avatar billede w13 Novice
07. januar 2005 - 17:21 Der er 54 kommentarer og
1 løsning

Fejl: Subscript out of range: 'nummer'

Hey Eksperter, jeg har nogle problemer med denne kode, som automatisk skal vælge/vises "Dagens spil"... (Altså vise spillet med i dags dato, og hvis det ikke eksistere, så tildele et nyt i dags dato!)

Jeg har nu denne kode:
_______________________________

<%
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("db/database.mdb")

strSQL = "SELECT * FROM elements WHERE dagens = date()"
set rs = myConn.Execute(strSQL)

If (rs.BOF Or rs.EOF) Then

'angiv størrelse på array
dim id(50)

'vælg alle poster i databasen
set rs=myConn.execute("select * from elements order by id")

' Udskriv alle id til et array
do while not rs.bof or rs.eof
    nummer = nummer + 1
    id(nummer) = rs("id")
    rs.moveNext
loop

'find et tilfældigt tal mellem 1 og antallet af poster i databasen
randomize
tal = int(rnd*nummer)+1

Else

strSQL = "UPDATE elements SET dagens = date() WHERE id = '"&id(tal)&"'"
set rs = myConn.Execute(strSQL)

'udskriv en tilfældig post ( her er id ikke et nummer men en streng )
set rs=myConn.execute("select * from elements where id = '"&id(tal)&"'")

    Response.Write "<br><a class='black' href='element_profil.asp?id=" & rs("id") &"' title='Gå til &#34;" & rs

("navn") &"&#34;'>"
    Response.Write "<img border='0' alt='Gå til element' src='" & rs("picture") &"' width='100' height='100'>"
    Response.Write "</a><br>&nbsp;"

End If

myConn.Close
Set Conn = Nothing
%>
_______________________________

Men den siger:
Microsoft VBScript runtime error '800a0009'

Subscript out of range: 'nummer'

/includes/after01.htm, line 38
_______________________________

(  Det er denne linje: id(nummer) = rs("id")  )

Hvad er der galt i den?
Med venlig hilsen
  W13
Avatar billede thesurfer Nybegynder
07. januar 2005 - 17:35 #1
Husk ALTID at bruge Option Explicit, så du tvinges til at definere ALLE variablerne!

dim id(50)
dim nummer

for en sikkerhedsskyld (da arrays starter ved 0 og ikke 1:
nummer = -1

Så vil den automatisk lægge 1 til, og så bliver nummer til 0: nummer = nummer + 1

Så burde der ikke være problemer..
Avatar billede thesurfer Nybegynder
07. januar 2005 - 17:36 #2
PS: Option Explicit KAN KUN være første linie i ASP filen! :-)
Hvis du sætter andre linier før den, vil det gå galt.

Option Explicit er meget god, idet den hurtigt ganger stavefejl..
Avatar billede olebole Juniormester
07. januar 2005 - 17:38 #3
<ole>

... og mange gange kan man endda også *fange* en sdavøfajl med den  ;oD

/mvh
</bole>
Avatar billede thesurfer Nybegynder
07. januar 2005 - 17:40 #4
hahahahah :-)
hbos Eksprten baer brutge Option Explicit -):
Avatar billede w13 Novice
07. januar 2005 - 17:44 #5
Subscript out of range: '51'
Avatar billede thesurfer Nybegynder
07. januar 2005 - 17:45 #6
Det giver ingen mening.. "51" er ikke en variabel..?
Hvilken linie, og hvad står der?
Avatar billede w13 Novice
07. januar 2005 - 17:47 #7
line 39

Og før var det linje 38, som svarede til denne linje: "nummer = nummer + 1", men til gengæld er der kommet to nye linjer på... Så det er altså linjen før "nummer = nummer + 1", tror jeg...
Avatar billede thesurfer Nybegynder
07. januar 2005 - 17:52 #8
Du har sat id-arrayen til 50. Hvor mange records er der?

Tip: Brug en teksteditor med linienummer og syntax highlighting..
Shareware: EditPlus, www.editplus.com
Freeware: TSW WebPad / WebCode, www.tsw.dk
Avatar billede w13 Novice
07. januar 2005 - 17:56 #9
Der er intet som Notesblok =) Ellers tak. Men jeg fik også koden her fra eksperten.dk... Så ved ikke hvorfor den er sat til 50... Den skulle jo netop have været dynamisk, så den selv fandt ud af at vælge tilfældige poster... Kan du hjælpe, da jeg er helt lost lige nu!? Ville gerne forhøje pointene, men har ikke flere... :-(
Avatar billede thesurfer Nybegynder
07. januar 2005 - 18:00 #10
EditPlus og WebPad / WebCoder er lige som Notesblok, blot med flere funktioner, der kan hjælpe. Det er IKKE FrontPage-agtigt crap! :-)

Brug det her i stedet: dim id()
brug evt et andet navn i stedet for "id", f.eks. "myID".. "id" kunne jo være et reserveret ord..
Avatar billede w13 Novice
07. januar 2005 - 18:26 #11
Så nu er den:

<%
Option Explicit

dim myConn, sql, rs, conn, strSQL

Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("db/database.mdb")

strSQL = "SELECT * FROM elements WHERE dagens = date()"
set rs = myConn.Execute(strSQL)

If (rs.BOF Or rs.EOF) Then

'angiv størrelse på array
dim myid()
dim nummer

'vælg alle poster i databasen
set rs=myConn.execute("select * from elements order by id")

' Udskriv alle id til et array
do while not rs.bof or rs.eof
    nummer = nummer + 1
    myid(nummer) = rs("myid")
    rs.moveNext
loop

'find et tilfældigt tal mellem 1 og antallet af poster i databasen
randomize
tal = int(rnd*nummer)+1

Else

strSQL = "UPDATE elements SET dagens = date() WHERE id = '"&myid(tal)&"'"
set rs = myConn.Execute(strSQL)

'udskriv en tilfældig post ( her er id ikke et nummer men en streng )
set rs=myConn.execute("select * from elements where id = '"&myid(tal)&"'")

    Response.Write "<br><a class='black' href='element_profil.asp?id=" & rs("id") &"' title='Gå til &#34;" & rs

("navn") &"&#34;'>"
    Response.Write "<img border='0' alt='Gå til element' src='" & rs("picture") &"' width='100' height='100'>"
    Response.Write "</a><br>&nbsp;"

End If

myConn.Close
Set Conn = Nothing
%>

Men stadig fejl:
ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/includes/after01.htm, line 39
Avatar billede thesurfer Nybegynder
07. januar 2005 - 18:38 #12
Husk: I databasen, er "id" af typen tal. Dvs, der må ikke sættes ' tegn udenom det.. OG, værdien skal konverteres til Integer:

where id = " & CInt(myid(tal))

begge steder..

melder den altid fejl, eller er det kun nogen gange?
Avatar billede w13 Novice
07. januar 2005 - 18:38 #13
Altid... Men prøver lige
Avatar billede w13 Novice
07. januar 2005 - 18:42 #14
Stadig:

Microsoft VBScript runtime error '800a0009'

Subscript out of range

/includes/after01.htm, line 39
Avatar billede thesurfer Nybegynder
07. januar 2005 - 18:43 #15
hmm... kommer lige i tanke om noget.. da arrays starter ved 0 i stedet for 1, burde der vel stå "-1":

tal = int(rnd * nummer - 1)+1 - 1

som er det samme som:

tal = int(rnd * nummer - 1)

Det der kan ske, er at taller bliver større end antallet i arrayen.. så kan den ikke finde "item" i "collection"..
Avatar billede thesurfer Nybegynder
07. januar 2005 - 18:44 #16
eller, hvordan skal det nu se ud..? :-)

tal = int(rnd * nummer -1) +1 ... måske..?

Er ikke helt sikker.. prøv lige engang med de forskellig kombinationer..
Avatar billede thesurfer Nybegynder
07. januar 2005 - 18:46 #17
Alternativet er at tilføje alle værdier, separaret af f.eks. "," og til sidst, splitte den ved f.eks. ","
Så har du også en array.. det er det jeg plejer at gøre..

Eksempel: http://www.html.dk/tutorials/asp/lektion8.asp
Avatar billede w13 Novice
07. januar 2005 - 18:50 #18
Nu har jeg har ikke prøvet alternativet, da det ser ud til at være meget omfattende, men er fejlen ikke før "tal = int(rnd * nummer -1) +1" ?
Avatar billede thesurfer Nybegynder
07. januar 2005 - 18:51 #19
Hvor mange records har du i databasen?
Avatar billede w13 Novice
07. januar 2005 - 18:52 #20
58
Avatar billede thesurfer Nybegynder
07. januar 2005 - 18:57 #21
Hvad sker der, hvis du erstatter "tal" med "58", med "myid(tal)"?
Det burde stadig virke.. hvis det gør, prøv med "59" som burde melde (nogenlunde) samme fejl..
Avatar billede w13 Novice
07. januar 2005 - 19:00 #22
samme fejl
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:06 #23
OK.. "tal" må ikke være større end max..

1) bruger du nummer = -1 ?
2) hvis ja til #1, prøv at bytte om på disse linier:
    nummer = nummer + 1
    myid(nummer) = rs("myid")
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:07 #24
rettelse: "hvis nej til #1"..
Dvs, hvis nummer = 0, byt om..
Avatar billede w13 Novice
07. januar 2005 - 19:09 #25
fejl... nu er det bare linje 38 i stedet for 39. Ergo er det "myid(nummer) = rs("myid")" (som for resten er forkert og rettet til "myid(nummer) = rs("id")")der er forkert!
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:14 #26
bruger du nummer = -1 ? eller andet?
Avatar billede w13 Novice
07. januar 2005 - 19:16 #27
<%
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("db/database.mdb")

strSQL = "SELECT * FROM [elements] WHERE dagens = date()"
set rs = myConn.Execute(strSQL)

If (rs.BOF Or rs.EOF) Then

'angiv størrelse på array
dim myid()
dim nummer

'vælg alle poster i databasen
set rs=myConn.execute("select * from [elements] order by [id]")

' Udskriv alle id til et array
do while not rs.bof or rs.eof
    myid(nummer) = rs("id")
    nummer = nummer -1
    rs.moveNext
loop

'find et tilfældigt tal mellem 1 og antallet af poster i databasen
randomize
tal = int(rnd * nummer -1) +1

Else

strSQL = "UPDATE [elements] SET dagens = date() where [id] = " & CInt(myid(59)) & ""
set rs = myConn.Execute(strSQL)

'udskriv en tilfældig post ( her er id ikke et nummer men en streng )
set rs=myConn.execute("select * from [elements] where [id] = " & CInt(myid(59)) & "")

    Response.Write "<br><a class='black' href='element_profil.asp?id=" & rs("id") &"' title='Gå til &#34;" & rs

("navn") &"&#34;'>"
    Response.Write "<img border='0' alt='Gå til element' src='" & rs("picture") &"' width='100' height='100'>"
    Response.Write "</a><br>&nbsp;"

End If

myConn.Close
Set Conn = Nothing
%>
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:19 #28
Det skal være sådan her:

dim myid()
dim nummer
nummer = -1

og så:

do while not rs.bof or rs.eof
    nummer = nummer + 1
    myid(nummer) = rs("id")
    rs.moveNext
loop

Personligt fortrækker jeg:

if not (rs.bof or rs.eof) then ' undersøg om der er nogen poster
  do while not rs.eof ' kør loopen, sålænge at der er poster
    ...
  loop ' hop tilbage til "do"
else ' der er ikke fundet nogen poster:
  response.write "der er ikke fundet nogen poster"
end if
Avatar billede w13 Novice
07. januar 2005 - 19:21 #29
Jeg er ikke sikker på, jeg ser forskellen...
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:21 #30
hmm.. da nummer indeholder max, men starter ved 0, skal man vel trække 1 fra nummer, inden man bruge "tal":

do while not rs.bof or rs.eof
    nummer = nummer + 1
    myid(nummer) = rs("id")
    rs.moveNext
loop

nummer = nummer - 1 ' da vi starter på 0 og ikke 1

'find et tilfældigt tal mellem 1 og antallet af poster i databasen
randomize
tal = int(rnd * nummer) +1
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:22 #31
Hvis man ikke vil bruge nummer = nummer - 1, bruger man: tal = int(rnd * (nummer - 1)) +1
Avatar billede w13 Novice
07. januar 2005 - 19:23 #32
Desværre
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:24 #33
kan du ikke lave en dummy database (fjern de originale data, og erstat dem med andet) og uploade den, så jeg kan downloade den?

Så har jeg en bedre chance for at debugge..
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:25 #34
HUSK:
Ved fejl, skriv fejlmeddelelsen (kopier og sæt ind), linie nummer og selve linien.
Avatar billede w13 Novice
07. januar 2005 - 19:26 #35
Okidoki... Men kan de oprindelige data ikke bare blive der? Jeg laver det for en ven... Som du nok har gættet er det er det en spilhjemmeside. Men sletter lige de andre tabeller...
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:27 #36
Jeg skal bruge tabellerne med nogle data..
Hvis data'ene er vigtige/personlige, erstat dem med noget andet (ikke vigtigt/personligt)..
Avatar billede w13 Novice
07. januar 2005 - 19:37 #37
Sådan... http://www.profil.2biaz.dk/database.mdb ... Selve siden ligger også på http://www.profil.2biaz.dk
Avatar billede thesurfer Nybegynder
07. januar 2005 - 19:54 #38
hmmm.. forstår ikke helt det du vil..

1) hent de records, hvor dagens = dags dato
2) hvis der ikke er match
2a) opret array
2b) fyld array'en op med ALLE records
2c) sæt "tal" til et tilfældig tal, der passer i arrayen
3) ellers = der er fundet records med dags dato
-- fejl her da myid ikke er oprettet!

Hvad skal der ske, hvis den finder records? Skal den bare udskrive dem?
Avatar billede w13 Novice
07. januar 2005 - 19:59 #39
Ja, men har rettet fejlen efter at jeg skrev den herinde...

Og ja, systemet skal bare gøre sådan, at ejeren af hjemmesiden ikke selv skal vælge et spil. Så når en bruger besøger siden tjekker den, om der er valgt et spil, hvor "dagens" er sat til i dags dato... Hvis der ikke er, skal den vælge et tilfældigt og sætte dens dagens til i dags dato... Og derefter udskrive!

Altså:
- Findes spil med dags dato?
- Ja = Udskriv!
- Nej = Vælg nyt spil, giv dags dato og udskriv!
Avatar billede thesurfer Nybegynder
07. januar 2005 - 20:00 #40
Ahh... :-)
Kigger lige på det :-)
Avatar billede thesurfer Nybegynder
07. januar 2005 - 20:17 #41
Ang "- Ja = Udskriv!"..
Hvis den finder flere, der har dags dato, skal den vælge en tilfældig en?
Avatar billede thesurfer Nybegynder
07. januar 2005 - 20:20 #42
Altså:

- Findes spil med dags dato?
- Ja = udskriv en tilfældig record, af dem med dags dato
- Nej = udskriv en tilfældig record, af ALLE dem der er i databasen

Korrekt?
Avatar billede thesurfer Nybegynder
07. januar 2005 - 20:23 #43
..jeg fik det nemlig til at virke, lige før.. men kunne ikke helt se det smarte i det..
Avatar billede w13 Novice
07. januar 2005 - 20:38 #44
Der kommer vel ikke til at være flere med samme dags dato?
Avatar billede thesurfer Nybegynder
07. januar 2005 - 20:40 #45
Dvs, "nej" sætter 1 spil til dags dato.. og så er det KUN det spil der kan komme frem (den dag) ?
Avatar billede thesurfer Nybegynder
07. januar 2005 - 21:00 #46
Test: http://frip.dk/thesurfer/e/q/578281/index.asp

Virker det som det skal?
Avatar billede cpufan Juniormester
08. januar 2005 - 00:01 #47
så kan man vel bare lave en

myConn.execute("select rnd id from [elements] ")

så får man eet tilfældigt id,
som så bare skal sættes i til at være dagens bagefter

og alt det med array og tælle op og så videre er unødvendigt.
Avatar billede w13 Novice
08. januar 2005 - 01:27 #48
Ja, det virker perfekt...
Avatar billede thesurfer Nybegynder
08. januar 2005 - 04:38 #49
<%
Option Explicit
Response.Buffer = False
dim myConn, sql, rs, conn, strSQL, tal

Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("db/database.mdb")

strSQL = "SELECT * FROM [elements] WHERE dagens = #" & date() & "#" '#01-07-2001#"
set rs = myConn.Execute(strSQL)

'angiv størrelse på array
dim myid()
dim nummer
nummer = -1

If (rs.BOF Or rs.EOF) Then

    'vælg alle poster i databasen
    set rs = myConn.execute("select * from elements order by id")


    ' Udskriv alle id til et array
    do while not rs.eof
'            response.write "nummer: " & nummer & "<br>"
            nummer = CInt(nummer) + 1
            myid(nummer) = rs("id")
            rs.moveNext
    loop


    'find et tilfældigt tal mellem 1 og antallet af poster i databasen
    randomize
    tal = int(rnd * nummer -1) +1

response.write "Der er ikke fundet nogen spil med dags dato.<br>"
response.write "Ny dato indsat til spillet med id'en: " & myid(tal) & "<br><br>"

    strSQL = "UPDATE elements SET dagens = #" & date() & "# where id = " & CInt(myid(tal))
    set rs = myConn.Execute(strSQL)

    'udskriv en tilfældig post ( her er id ikke et nummer men en streng )
    set rs = myConn.execute("select * from elements where id = " & CInt(myid(tal)))

    Response.Write "<br><a class='black' href='element_profil.asp?id=" & rs("id") &"' title='Gå til &#34;" & rs("navn") & "&#34;'>"
    Response.Write "<img border='0' alt='Gå til element' src='" & rs("picture") &"' width='100' height='100'>"
    Response.Write "</a><br>&nbsp;"

Else

    Response.Write "Følgende spil blev fundet, med dagens dato:<br>"
    Response.Write "<br><a class='black' href='element_profil.asp?id=" & rs("id") &"' title='Gå til &#34;" & rs("navn") &"&#34;'>"
    Response.Write "<img border='0' alt='Gå til element' src='" & rs("picture") &"' width='100' height='100'>"
    Response.Write "</a><br>&nbsp;"

End If

set rs = nothing

myConn.Close
Set Conn = Nothing
%>


Mht points: snup du dem bare :-)
Avatar billede thesurfer Nybegynder
08. januar 2005 - 04:39 #50
..du kan bare slette: '#01-07-2001#"
(det var bare en test)
Avatar billede w13 Novice
08. januar 2005 - 09:31 #51
:-( får stadig at vide, subscriptet er "out of range"...
Avatar billede thesurfer Nybegynder
08. januar 2005 - 15:03 #52
- OK, prøv med dim myid(60)

- har ikke testet om 08/01-2005 00:01:51 virker

- omgås array-fejlen (tror jeg):

dim myid ' denne er ikke defineret som array!
...
myid = myid & rs("id") & "," ' i stedet for: myid(nummer) = rs("id")
rs.movenext
loop

myid = left(myid, len(myid) - 1) ' fjern det sidste komma
myid = split(myid, ",") ' lav myid om til en array!

Så kan du bruge myid(tal)..


-- tester lige når jeg kommer tilbage.. smutter et par timer..
Avatar billede w13 Novice
08. januar 2005 - 16:01 #53
Yes, det virker :-D Mange gange tak...

Men du ville ikke ha' point? Der er jo hele 5 på spil her ;-)
Avatar billede thesurfer Nybegynder
08. januar 2005 - 18:24 #54
Nah.. jeg springer over :-)
Så kan du bruge dem, på noget der er lidt svære :-)
Avatar billede w13 Novice
08. januar 2005 - 21:14 #55
Okidoki =)
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