Avatar billede page Nybegynder
02. november 2006 - 22:31 Der er 15 kommentarer og
1 løsning

Variabel længde af array i ASP

Hey,

Jeg sidder og roder lidt med at få smidt noget data ind i en array fra min access db. Og det er sådan set også nemt nok.

Det der er mit problem er at angive en variabel længde, af mit array.
En længde der så skal passe på det antal rækker der er i min tabel.

Altså noget ala:

Dim arrNavn(variabel længde)


Jeg har, uden held, forsøgt mig med Redim.
------------------------------------------
Jeg starter med at definere mit array og i:

<%
    Dim arrNavn()
      Dim i
    i = "0"
%>
- snip en masse kode -
   
<%   
    'Hent fra databasen afhængig af værdien id fra URL
    strSQL = "Select * from tabel1 order by id;"
   
    Set rs = Conn.Execute(strSQL)
   
    ' Gennemløb Recordset (rs) med en løkke
    Do   

      Redim arrNavn(i)
    arrRang(i) = " " & rs("Navn") & " "
   

      i = i +1
   
      ' Gå til næste Record i rs
          rs.MoveNext

        ' Fortsæt indtil rs er gennemløbet (EOF = End Of File)
        Loop While Not rs.EOF
       
        ' Luk databaseforbindelse
        Conn.Close
        Set Conn = Nothing
%>
------------------------------------------

For på den måde at kunne øge længden af arrayet. Det virker også næsten, bortset fra at den kun smider det sidste række ind i arrayet.

Nogen der har et bud på en løsning? eller er det ren volapyk?
Avatar billede medions Nybegynder
02. november 2006 - 22:46 #1
Dim arrNavn()
ReDim arrNavn(UBound(arrNavnDuHar))

//>Rune
Avatar billede page Nybegynder
02. november 2006 - 23:04 #2
hmm jeg er ikke helt sikker på hvad du mener med det.

Skal jeg oprette et ny array der hedder arrNavnDuHar? I så fald er jeg vel lige vidt..

Eller skal jeg smide det ind istedet for:
    Redim arrNavn(i)
    arrNavn(i) = " " & rs("Navn") & " "

Gør jeg det, så får jeg denne fejl:

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'UBound'

/test.asp, line 64



mvh
Avatar billede thesurfer Nybegynder
03. november 2006 - 01:27 #3
En alternativ måde:

dim sNavn
sNavn = ""

do while not
  sNavn = sNavn & rs("Navn") & "¤"
  rs.movenext
loop

sNavn = split(sNavn, "¤")

Nu har du en array kaldet sNavn, der indeholder navnene fra databasen.


Et godt råd:
Bruger ALDRIG "DO.:.LOOP WHILE".. brug ALTID "DO WHILE...LOOP".. Forskellen?:

1) "DO...LOOP WHILE": Udfør koden 1 gang, og checker derefter om der er flere poster
2) "DO WHILE...LOOP": Check om der er poster, og udfør koden

Hvis der ikke er poster i databasen, vil du få en fejl med nummer 1, fordi den prøver på at hente det første navn, som ikke eksisterer..

Det gælder også alle de andre felter i databasen..
Avatar billede thesurfer Nybegynder
03. november 2006 - 01:32 #4
Rettelse:

if rs.bof or rs.eof then ' check om der overhovedet er nogen poster, med de valgte kriterier
' der er ikke nogen poster i databasen:
  response.write "Der er ikke nogen poster i databasen, med de valgte kriterier."
else
  ' yep.. der er poster..
  do while not rs.eof ' kør en loop, så længe at der er poster..
    sNavn = sNavn & rs("Navn") & "¤" ' tilføj navnet til strengen sNavn, og tilføj "¤"
    rs.movenext ' gå til næste post
  loop ' gentag afviklingen af koden
end if

sNavn = split(sNavn, "¤") ' split strengen op ved "¤" og omdan strengen til en array

Egentligt betyder både rs.bof or rs.eof at der ikke er poster.. men det er alligevel 2 forskellige ting..
Avatar billede thesurfer Nybegynder
03. november 2006 - 01:34 #5
Eksempel:

dim sNavn
sNavn = "Hans¤Ole¤Erik"

sNavn = split(sNavn, "¤")

response.write sNavn(0) ' udskriver: Hans
response.write sNavn(1) ' udskriver: Ole
response.write sNavn(2) ' udskriver: Erik

Du kan bruge et hvilken som helst tegn, i stedet for "¤".. men det skal være unikt, dvs, det findes ikke i navnene.. ellers går det galt..

Hvis man f.eks. splittede "Hans¤Ole¤Erik" ved "e", ville man få:
sNavn(0): Hans¤Ol
sNavn(1): ¤Erik
Avatar billede thesurfer Nybegynder
03. november 2006 - 01:36 #6
Hmm.. måske ville man få følgende, hvis man splittede ved "e":

sNavn(0): Hans¤ol
sNavn(1): ¤
sNavn(2): rik

ASp (VBScript) er jo case-insensitive.. dvs, der er ikke forskel på STORE og små bogstaver..

Eksempel: erik = Erik = eRik = erIk = eriK
Osv..
Avatar billede cpufan Juniormester
03. november 2006 - 09:38 #7
du skal ikke oprette dit array på den måde, hvor du redim'er hvor hver record

da en redim laver et ny array uden at slette det gl.
og den vil så blive utrolig tung/langsom hvis der er rigtig mange records.

Den mindst belastende måde, er at tælle dine records via din sql.

strSQL = "Select *, count(id) as antal from tabel1 order by id;"

og så dim arraynavn()

redim arraynavn(rs("antal"))
Avatar billede cpufan Juniormester
03. november 2006 - 09:47 #8
altså:

strSQL = "Select *, count(id) as antal from tabel1 order by id;"

og så dim arraynavn()

redim arraynavn(rs("antal"))
i=0
do while not rs.eof
arraynavn(i) = rs("kolonne")
i = i + 1
rs.movenext
loop
Avatar billede thesurfer Nybegynder
03. november 2006 - 09:48 #9
..og hvis det var at man ville redimme og bevar dataene, skal man bruge "preserve"..
Avatar billede page Nybegynder
03. november 2006 - 11:32 #10
Hey igen,
Jeg har ikke forsøgt mig med thesurfer's forslag, endnu.

Jeg testede istedet  den her:
cpufan
03/11-2006 09:38:45

Her er hvordan det endte med at se ud..
---------------------------------------------
    Dim i
    i = "0"
    dim arraynavn()

    'Hent fra databasen afhængig af værdien id fra URL
    strSQL = "Select *, count(id) as antal from tabel1 order by id;"
   
    Set rs = Conn.Execute(strSQL)
   
    ' Gennemløb Recordset (rs) med en løkke
    Do   
   
        redim arraynavn(rs("antal"))
       
        do while not rs.eof
            arraynavn(i) = rs("Navn")
            i = i + 1
            rs.movenext
        loop


    ' Fortsæt indtil rs er gennemløbet (EOF = End Of File)
    Loop While Not rs.EOF
       
    ' Luk databaseforbindelse
    Conn.Close
    Set Conn = Nothing
    %>
---------------------------------------------

Men det giver en fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Cannot group on fields selected with '*'.

/cms/test.asp, line 61


Hvor linie 61 er: Set rs = Conn.Execute(strSQL)
Avatar billede thesurfer Nybegynder
03. november 2006 - 15:17 #11
page> Prøv min metode.. :-)

Den kan næsten ikke slå fejl.. hvis den gør, er det fordi jeg har skrevet koden direkte på eksperten.dk, og ikke testet koden.. :-)
Avatar billede cpufan Juniormester
03. november 2006 - 22:28 #12
Dim i
    i = 0
    dim arraynavn()

    'Hent fra databasen afhængig af værdien id fra URL
strSQL = "Select * from tabel1 order by id;"
Set rs = Conn.Execute(strSQL)


SQLtael = "Select Count(id) from tabel1"
antalrecords = Conn.execute(SQLtael)

dim arraynavn()     
redim arraynavn(antalrecords)
     
        do while not rs.eof
            arraynavn(i) = rs("Navn")
            i = i + 1
            rs.movenext
        loop
    ' Luk databaseforbindelse
    Conn.Close
    Set Conn = Nothing
    %>
Avatar billede cpufan Juniormester
03. november 2006 - 22:30 #13
årh for h.. da sår'n

Dim i
    i = 0
'Hent fra databasen afhængig af værdien id fra URL
strSQL = "Select * from tabel1 order by id;"
Set rs = Conn.Execute(strSQL)


SQLtael = "Select Count(id) from tabel1"
antalrecords = Conn.execute(SQLtael)

dim arraynavn()   
redim arraynavn(antalrecords)
   
        do while not rs.eof
            arraynavn(i) = rs("Navn")
            i = i + 1
            rs.movenext
        loop
    ' Luk databaseforbindelse
    Conn.Close
    Set Conn = Nothing
Avatar billede page Nybegynder
04. november 2006 - 01:26 #14
Hey,

Så har jeg igen fået tid til at kigge på det.
Først prøvede jeg at gå videre med :
cpufan
03/11-2006 22:30:57

Men da det ikke gav noget positivt resultat, forsøgte jeg med:
thesurfer
03/11-2006 01:34:43

Hvilket virkede fuldstændigt efter hensigten. Hvis nogen skulle kunne få nytte af det, så endte min færdige kode med at se sådan her ud:
___________________________________________________________
'Hent fra databasen afhængig af værdien id fra URL
    strSQL = "Select * from tabel1 order by id;"
    Set rs = Conn.Execute(strSQL)

    if rs.bof or rs.eof then 'tjekker om der overhovedet er nogen poster                        
          response.write "Der er ikke nogen poster i databasen, med de valgte kriterier."
    else
        ' yep.. der er poster..
          do while not rs.eof ' kør en loop, så længe at der er poster..
        sNavn = sNavn & rs("Navn") & "," ' tilføj navnet til strengen sNavn, og tilføj "¤"
        rs.movenext ' gå til næste post
          loop ' gentag afviklingen af koden
    end if
   
    sNavn = split(sNavn, ",")
   
    Dim arrLen                 'Finder længden af sNavn
    arrLen = Ubound(sNavn)   
   
    Dim t
        t = 0
        Do Until t = arrLen
              response.write("" & sNavn(t) & "<br>")
              t = t + 1
        Loop
    ' Luk databaseforbindelse
    Conn.Close
    Set Conn = Nothing

___________________________________________________________

Jeg takker mange gang for hjælpen.

Drop en svar, så du kan få dine point.

Mvh
page
Avatar billede thesurfer Nybegynder
04. november 2006 - 13:27 #15
Et svar er droppet.. :-)
Avatar billede thesurfer Nybegynder
04. november 2006 - 13:35 #16
Jeg er glad for at du fik det til at virke..

Hvis du vil optimere/forbedre koden lidt, kunne du gøre sådan her:


___________________________________________________________
'Hent fra databasen afhængig af værdien id fra URL
    strSQL = "Select * from tabel1 order by id;"
    Set rs = Conn.Execute(strSQL)

    if rs.bof or rs.eof then 'tjekker om der overhovedet er nogen poster                       
          response.write "Der er ikke nogen poster i databasen, med de valgte kriterier."
    else
        ' yep.. der er poster..
          do while not rs.eof ' kør en loop, så længe at der er poster..
        sNavn = sNavn & rs("Navn") & "," ' tilføj navnet til strengen sNavn, og tilføj "¤"
        rs.movenext ' gå til næste post
          loop ' gentag afviklingen af koden
    end if
   
        ' lukker forbindelsen til databasen, da der ikke længere er brug for den:
        set rs = nothing
    Conn.Close
    Set Conn = Nothing
   

    sNavn = split(sNavn, ",")

    dim i
        for i = 0 to ubound(sNavn)
            response.write sNavn(i) & "<br>"
        next



___________________________________________________________


Jeg husker ikke lige hvad der er hurtigst eller mindst ressource-krævende, FOR-NEXT eller DO-LOOP..

Normalt bruger jeg DO-LOOP til recordset og FOR-NEXT til alt andet..
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