Avatar billede zombien Juniormester
27. maj 2008 - 09:24 Der er 55 kommentarer og
2 løsninger

Arrays - multidimensionelt hvad går galt

Hej, jeg sidder og er igang med at oprette et array
som skal indeholde nogle forskellige informationer, men kan ikke lige få det til at fungere korrekt, så håber nogle herinde kan hjælpe mig

code:
Dim filer(2,4)
i = 0
' Nu finder vi alle filerne der er i mappen, samt oplysninger omkring filen, og gemmer i arrayet
For each file in objFolder.Files
i = i
   
    filer(0,i) = File.Name
    filer(1,i) = File.Type
    filer(2,i) = File.DateCreated
    filer(3,i) = File.DateLastModified
    filer(4,i) = File.Size
   
i = i + 1
Next

jeg får følgende fejl
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A0009)
Indekset er uden for området: '[number: 3]'
/small_stuff/infoserv/fileoverview.asp, line 34

og linje 34 er denne
filer(3,i) = File.DateLastModified
Avatar billede w13 Novice
27. maj 2008 - 09:28 #1
Du dim'er sådan her:

Dim filer(2,4)


Og det betyder jo, at du kun har 2 poster, med fire informationer knyttet til hver. Derfor får du fejl, da du bruger filer(3,i)

Prøv lige at ændre:
Dim filer(2,4)
til:
Dim filer(20,4)
og se, om fejlen ikke skulle forsvinde.
Avatar billede w13 Novice
27. maj 2008 - 09:30 #2
filer(0,i) = File.Name
    filer(1,i) = File.Type
    filer(2,i) = File.DateCreated
    filer(3,i) = File.DateLastModified
    filer(4,i) = File.Size

Bør så faktisk være:

    filer(i,0) = File.Name
    filer(i,1) = File.Type
    filer(i,2) = File.DateCreated
    filer(i,3) = File.DateLastModified
    filer(i,4) = File.Size

hvis jeg ikke husker helt galt.
Avatar billede w13 Novice
27. maj 2008 - 09:30 #3
Og så kan du beholde:
Dim filer(2,4)
Avatar billede zombien Juniormester
27. maj 2008 - 09:37 #4
hej w13, jeg takker for dit hurtige svar :-D og det var ganske korrekt de bare skulle byttes rundt, nu køre den i hvert fald igennem, så har jeg dog et andet problem

som jeg håber du vil tage tiden til at hjælpe mig med også
for nu er vi dernede hvor vi skal hente informationer fra et array

code:
for t = 0 to UBound(filer)
        response.write "<tr>"
    response.write "<td width='200px' align='left'>" &filer(0,t)& "</td>"
    response.write "<td width='200px' align='left'>" &filer(1,t)& "</td>"
    response.write "<td width='200px' align='left'>" &filer(2,t)& "</td>"
    response.write "<td width='200px' align='left'>" &filer(3,t)& "</td>"
    response.write "<td width='200px' align='right'>" &filer(4,t)& " kb.</td>"
    response.write "</tr>"
next

her får jeg følgende fejl
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D)
Typer stemmer ikke overens: 'UBound'
/small_stuff/infoserv/fileoverview.asp, line 69
Avatar billede w13 Novice
27. maj 2008 - 09:46 #5
Hvis "filer" - ved en fejl - ikke er et array, dvs. har længden 0, så kan du ikke bruge UBound på den, og så vil du få denne fejl.

Du kan evt. prøve:
  response.write TypeName(filer)
Avatar billede softspot Forsker
27. maj 2008 - 09:47 #6
Du skal hente UBound på en dimension og det gøres således:

for t = 0 to ubound(filer,2)

for at finde det maksimale indeks på den anden dimension af dit array.
Avatar billede w13 Novice
27. maj 2008 - 09:51 #7
Nå ja, glemte lige, at det jo havde flere dimensioner.
Avatar billede zombien Juniormester
27. maj 2008 - 09:55 #8
jeg ved ikke hvorfor men får stadig følgende besked

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D)
Typer stemmer ikke overens: 'UBound'
/small_stuff/infoserv/fileoverview.asp, line 69

og nu har jeg copy/pasted det softspot skrev...
Avatar billede w13 Novice
27. maj 2008 - 09:56 #9
Så prøv lige at se, hvad følgende udskriver:
response.write TypeName(filer)
Avatar billede w13 Novice
27. maj 2008 - 09:56 #10
Og evt. også:
response.write filer(0,1)
Avatar billede zombien Juniormester
27. maj 2008 - 09:57 #11
for vi er enige om det er skrevet som et array filer altså
Avatar billede zombien Juniormester
27. maj 2008 - 09:58 #12
den siger det er tomt :-S hvorfor gemmer den ikke informationen?
Avatar billede softspot Forsker
27. maj 2008 - 10:03 #13
Prøv lige at vise din kode som den ser ud nu...
Avatar billede zombien Juniormester
27. maj 2008 - 10:05 #14
Her er området hvor den sætter informationerne ind, dette er i en funktion

Dim filer(2,4)
i = 0
   
' Nu finder vi alle filerne der er i mappen, samt oplysninger omkring filen, og gemmer i arrayet
For each file in objFolder.Files
i = i
   
    filer(i,0) = File.Name
      filer(i,1) = File.Type
        filer(i,2) = File.DateCreated
        filer(i,3) = File.DateLastModified
        filer(i,4) = File.Size
       
i = i + 1
Next

og her skulle informationerne hentes ud.

response.write TypeName(filer)
' Her køre den igennem de forskellige informationer gemt i arrayet
'for t = 0 to ubound(filer,2)
'    response.write "<tr>"
'    response.write "<td width='200px' align='left'>" &filer(t,0)& "</td>"
'    response.write "<td width='200px' align='left'>" &filer(t,1)& "</td>"
'    response.write "<td width='200px' align='left'>" &filer(t,2)& "</td>"
'    response.write "<td width='200px' align='left'>" &filer(t,3)& "</td>"
'    response.write "<td width='200px' align='right'>" &filer(t,4)& " kb.</td>"
'    response.write "</tr>"
'next
Avatar billede w13 Novice
27. maj 2008 - 10:35 #15
Jamen så kan den vel ikke finde filerne i mappen, går jeg ud fa.
Avatar billede w13 Novice
27. maj 2008 - 10:38 #16
Du kan jo prøve at udskrive:

Response.Write objFolder.Files.Count
(mener jeg, det hedder)
Avatar billede zombien Juniormester
27. maj 2008 - 10:38 #17
jamen problemet er netop dette er jeg sikker på den kan...
eftersom jeg har prøvet at køre det igennem med at sætte et recordset op, og der fanger den alle filoplysningerne korrekt :-S

så hvorfor virker det ikke her
Avatar billede w13 Novice
27. maj 2008 - 10:41 #18
Fjern i øvrigt lige:
i = i
da det ingen forskel gør.
Avatar billede w13 Novice
27. maj 2008 - 10:41 #19
Det burde ikke kunne resultere i denne fejl, men det er jo altid godt at fjerne alle muligheder for fejl, og den gør alligevel ingenting.
Avatar billede zombien Juniormester
27. maj 2008 - 10:42 #20
det må simpelthen være, fordi jeg kalder den forkert ud af funktionen :-S
her kalder jeg min funktion a = GetSortedFiles(strFolder) og derinde i bliver array'et lavet...
Avatar billede w13 Novice
27. maj 2008 - 10:48 #21
Ja, så skal du Dim'e "filer" uden for funktionen.
Avatar billede zombien Juniormester
27. maj 2008 - 10:52 #22
hmm ændre ikke på at den er empty :-S
er det evt. i denne linje det går galt???

for t = 0 to ubound(filer,2)
Avatar billede w13 Novice
27. maj 2008 - 10:53 #23
Nej, den sletter jo ingenting. Den indleder blot en forløkke.

Vis os lige hele den funktion, som lægger data i "filer".
Avatar billede zombien Juniormester
27. maj 2008 - 10:57 #24
Function GetSortedFiles(mappen)
       
' Her starter vi Filsystemet
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
   
' Her definere vi, hvilken mappe scriptet skal finde filerne i
Set objFolder = objFSO.GetFolder(mappen)
   
' Her lukket vi for filsystemet igen, eftersom dette er vi færdig med ( spare resourcer )
Set objFSO = Nothing
       
' Her tæller vi filerne i mappen, og bestemmer hvor meget indhold arrayet skal indeholde
k = objFolder.Files.Count
   
Dim filer(2,4)
i = 0
   
' Nu finder vi alle filerne der er i mappen, samt oplysninger omkring filen, og gemmer i arrayet
For each file in objFolder.Files
       
  filer(i,0) = File.Name
  filer(i,1) = File.Type
  filer(i,2) = File.DateCreated
  filer(i,3) = File.DateLastModified
  filer(i,4) = File.Size
       
  i = i + 1
Next
           
' Her lukker vi for objFolder, eftersom vi er færdig med denne ( spare hukommelse )
Set objFolder = Nothing

End Function
Avatar billede softspot Forsker
27. maj 2008 - 10:58 #25
Husker du at returnere det array som funktionen danner? Altså noget i stil med:

function GetSortedFiles(path)
  dim arrFiles

  ' din magi...

  GetSortedFiles = arrFiles
end function
Avatar billede zombien Juniormester
27. maj 2008 - 10:59 #26
der tabte du mig lige
Avatar billede softspot Forsker
27. maj 2008 - 11:01 #27
Nej, det gjorde du så ikke ;-)

Du skal huske at returnre det array du lige har genereret i funktionen, da du erklærer det i funktionens scope, nytter det ikke noget at du har en global variabel som hedder filer, for det er den variabel som er erklæret i det nærmeste scope som benyttes. Derfor: slut din funktion med:


  ' Her lukker vi for objFolder, eftersom vi er færdig med denne ( spare hukommelse )
  Set objFolder = Nothing

  GetSortedFiles = filer
End Function
Avatar billede w13 Novice
27. maj 2008 - 11:04 #28
Jeg ville mene, at du kunne rykke:
  Dim filer(2,4)
op før:
  Function GetSortedFiles(mappen)

Men ellers skal du - som softspot skriver - sende dit array "files" tilbage til resten af siden med GetSortedFiles=filer

Så når du f.eks. kalder funktion:
  GetSortedFiles("sti/sti")
skal det i stedet være:
  filer=GetSortedFiles("sti/sti")

På den måde, har du stadig det rigtige indhold i "files".

Problemet er jo, at "filer" ellers kun kan bruges inde i funktioner, da det dér er en lokal variable.
Avatar billede zombien Juniormester
27. maj 2008 - 11:11 #29
hvis jeg som du siger w13 føre dim filer(2,4) uden for funktionen skriver den Variant() i stedet for empty, men hvis jeg så forsøger at loope igennem får jeg denne fejl

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A0009)
Indekset er uden for området: '3'
/small_stuff/infoserv/fileoverview.asp, line 69

som er response.write "<td width='200px' align='left'>" &filer(t,0)& "</td>"

hvis jeg derimod gør som softspot siger med at indsætte GetSortedFiles = filer
virker det ikke som om den har den store indflydelse, den fanger i hvert fald ingenting

og hvis jeg dertil retter a = GetSortedFiles("sti/sti") til  filer = GetSortedFiles("sti/sti")
siger den bare typerne ikke stemmer overens, gør jeg noget forkert her???
Avatar billede softspot Forsker
27. maj 2008 - 11:16 #30
Det er jo fordi du itererer arrayets første dimension (som har 3 elementer) med ubound af anden dimension (som jo er 4, dvs. 5 elementer), men du skal jo tage ubound(filer,1) til den løkke.
Avatar billede softspot Forsker
27. maj 2008 - 11:17 #31
Altså:

' Her køre den igennem de forskellige informationer gemt i arrayet
for t = 0 to ubound(filer,1)
    response.write "<tr>"
    response.write "<td width='200px' align='left'>" &filer(t,0)& "</td>"
    response.write "<td width='200px' align='left'>" &filer(t,1)& "</td>"
    response.write "<td width='200px' align='left'>" &filer(t,2)& "</td>"
    response.write "<td width='200px' align='left'>" &filer(t,3)& "</td>"
    response.write "<td width='200px' align='right'>" &filer(t,4)& " kb.</td>"
    response.write "</tr>"
next
Avatar billede w13 Novice
27. maj 2008 - 11:17 #32
Indekset er uden for området: '3'
betyder at den i hvert fald kører de 2 første, så noget er da rigtigt.
Avatar billede zombien Juniormester
27. maj 2008 - 11:18 #33
der er jo så kun 2 filer, så den skulle jo gerne stoppe :-D og ikke forsætte
Avatar billede w13 Novice
27. maj 2008 - 11:20 #34
Prøv softspots foreslag.
Avatar billede softspot Forsker
27. maj 2008 - 11:22 #35
zombien, læs lige mit indlæg... du benytter det forkerte indeks og får derfor for mange iterationer.
Avatar billede zombien Juniormester
27. maj 2008 - 11:24 #36
ITS WORKING :-D  TAK TAK TAK TAK TAK TAK TAK TAK TAK TAK :-P
Avatar billede softspot Forsker
27. maj 2008 - 11:26 #37
Velbekomme :)
Avatar billede zombien Juniormester
27. maj 2008 - 11:26 #38
kan man så få den til at sortere efter sidst ændret i et array???

så den man sidst har redigeret i kommer øverst??
Avatar billede zombien Juniormester
27. maj 2008 - 11:29 #39
okay, hvis jeg tilføjer 6 filer laver den problemer, men det er vel formentlig fordi der max kan være 4 filer, korrekt???

er der en måde at lave dette variabelt, så den selv sætter max efter hvor mange filer der er
det må være denne her der skal ændres i Dim filer(2,4)
Avatar billede softspot Forsker
27. maj 2008 - 11:29 #40
Der er ikke nogen indbygget sorteringsfunktion i VBScript, så det skal du selv flikket sammen.
Avatar billede softspot Forsker
27. maj 2008 - 11:32 #41
Der er faktisk kun plads til 3 filer i dit array (upper bound er jo sat til 2).

Du har godt nok lagt op til at der optælles hvormange filer der er i resultatet (objFiles.Count), men du bruger det ikke til at dimensionere dit array. Jeg er ikke helt sikker på om dit array er skruet sådan sammen at man let kan dimensionere det, da jeg tror man kun kan redimensionere den sidste dimension af arrayet, men det er jo ikke det du vil ændre størrelse af - det er det første.
Avatar billede w13 Novice
27. maj 2008 - 11:33 #42
Så skal du bruge:
Redim filer(Server.CreateObject("Scripting.FileSystemObject").GetFolder("sti/sti").files.count,4)
i stedet for:
Dim(2,4)
Avatar billede zombien Juniormester
27. maj 2008 - 11:37 #43
Redim filer(Server.CreateObject("Scripting.FileSystemObject").GetFolder("./files").files.count,4)

så kan den ikke finde mappen :-S
Avatar billede zombien Juniormester
27. maj 2008 - 11:39 #44
så rettes den lidt, så nu får jeg
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A0005)
Procedurekaldet eller argumentet er ugyldigt
/small_stuff/infoserv/fileoverview.asp, line 11
Avatar billede softspot Forsker
27. maj 2008 - 11:42 #45
Man må ikke benytte variable til at dimensionere et array. Der skal benyttes konstanter.
Avatar billede w13 Novice
27. maj 2008 - 11:42 #46
Du kan lige starte med at response.write indholdet af:
Server.CreateObject("Scripting.FileSystemObject").GetFolder("./files").files.count
indtil vi har den rigtige.
Avatar billede zombien Juniormester
27. maj 2008 - 11:45 #47
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A0005)
Procedurekaldet eller argumentet er ugyldigt
/small_stuff/infoserv/fileoverview.asp, line 11

den melder jo denne fejl, så svært at skrive noget, når den ikke vil gå videre derfra
Avatar billede w13 Novice
27. maj 2008 - 11:45 #48
Hvad hvis du retter:
./files
til:
/
Avatar billede softspot Forsker
27. maj 2008 - 11:46 #49
Jeg ville nok vælge en lidt anden tilgangsvinkel ifht. erklæring og brug af arrays i dit tilfælde. Jeg ville nok nøjes med en enkelt dimension og så vælge det variante array, samt putte filobjekterne direkte i arrayet i stedet for at overføre værdierne. Altså noget i stil med:

Function GetSortedFiles(mappen)
       
' Her starter vi Filsystemet
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
   
' Her definere vi, hvilken mappe scriptet skal finde filerne i
Set objFolder = objFSO.GetFolder(mappen)
   
' Her lukket vi for filsystemet igen, eftersom dette er vi færdig med ( spare resourcer )
Set objFSO = Nothing
       
' Her tæller vi filerne i mappen, og bestemmer hvor meget indhold arrayet skal indeholde
k = objFolder.Files.Count
   
Dim filer()
ReDim filer(k-1)
 
' Nu finder vi alle filerne der er i mappen, samt oplysninger omkring filen, og gemmer i arrayet
For each file in objFolder.Files
  set filer(i) = file
Next
           
' Her lukker vi for objFolder, eftersom vi er færdig med denne ( spare hukommelse )
Set objFolder = Nothing

GetSortedFiles = filer
End Function


Løkken ville jeg så lave således:

' Her køre den igennem de forskellige informationer gemt i arrayet
for each file in filer
    response.write "<tr>"
    response.write "<td width='200px' align='left'>" &file.Name& "</td>"
    response.write "<td width='200px' align='left'>" &file.Type& "</td>"
    response.write "<td width='200px' align='left'>" &file.CreatedDate& "</td>"
    response.write "<td width='200px' align='left'>" &file.LastModified& "</td>"
    response.write "<td width='200px' align='right'>" &file,Size& " kb.</td>"
    response.write "</tr>"
next


Så bliver det også mere intuitivt at læse koden.
Avatar billede w13 Novice
27. maj 2008 - 11:48 #50
Ja, hvis det fungerer er det meget bedre.

file,Size
skal lige være:
file.Size
Avatar billede softspot Forsker
27. maj 2008 - 11:48 #51
Ups! CreatedDate skal naturligvis være DateCreated og LastModified skal være DateLastModified...

' Her køre den igennem de forskellige informationer gemt i arrayet
for each file in filer
    response.write "<tr>"
    response.write "<td width='200px' align='left'>" &file.Name& "</td>"
    response.write "<td width='200px' align='left'>" &file.Type& "</td>"
    response.write "<td width='200px' align='left'>" &file.DateCreated& "</td>"
    response.write "<td width='200px' align='left'>" &file.DateLastModified& "</td>"
    response.write "<td width='200px' align='right'>" &file.Size& " kb.</td>"
    response.write "</tr>"
next
Avatar billede zombien Juniormester
27. maj 2008 - 11:57 #52
den melder ingen fejl nu :-D

men det er som om den ikke helt fanger filerne længere :-S
der dukker i hvert fald ingenting op
Avatar billede softspot Forsker
27. maj 2008 - 12:00 #53
Der var også en lille fejl i den funktion jeg lavede til dig. Ret den til:

Function GetSortedFiles(mappen)
       
' Her starter vi Filsystemet
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
   
' Her definere vi, hvilken mappe scriptet skal finde filerne i
Set objFolder = objFSO.GetFolder(mappen)
   
' Her lukket vi for filsystemet igen, eftersom dette er vi færdig med ( spare resourcer )
Set objFSO = Nothing
       
' Her tæller vi filerne i mappen, og bestemmer hvor meget indhold arrayet skal indeholde
k = objFolder.Files.Count
   
Dim filer()
ReDim filer(k-1)
 
' Nu finder vi alle filerne der er i mappen, samt oplysninger omkring filen, og gemmer i arrayet
i = 0
For each file in objFolder.Files
  set filer(i) = file
  i = i + 1
Next
           
' Her lukker vi for objFolder, eftersom vi er færdig med denne ( spare hukommelse )
Set objFolder = Nothing

GetSortedFiles = filer
End Function
Avatar billede zombien Juniormester
27. maj 2008 - 12:02 #54
Så er den der :-D super.... og mange tak :-D
så må jeg igang med sorterings arbejdet
Avatar billede softspot Forsker
27. maj 2008 - 12:14 #55
Tak for point :)
Avatar billede w13 Novice
27. maj 2008 - 12:18 #56
Tak! :)
Avatar billede zombien Juniormester
27. maj 2008 - 12:45 #57
i har da gjort jer fortjent til dem :-) så mig der takker
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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