Försöker att initiera värden i en två dimensions array men jag lyckas inte. Lite osäker här men jag tror nog samma sak gäller för ASP här som gäller för VB. Du KAN INTE omdimensionera en arrays första dimension, endast den sista dimensionen (den andra i detta fall) kan ÖKAS, om jag minns rätt så finns denna begränsning bara när du använder ReDim... Slängde ett öga på koden... Det vill sig inte ändå. Får samma felmeddelande. Är det inte så att du ökar din array med +1 i varje dimension. Jag kan förmodligen inte hantera fler dimensioner än en. Jag skulle skrivit så här:Flerdimensionella arrayer
Kan någon ge mig en hint vad jag gör fel. Så här ser koden ut som jag jobbar med.
Först en kod som funkar eftersom det då endast gäller en en-dimensionell array.
START FUNKAR ------------------------------------------------------
Dim arrData
Call main()
Private Sub main()
ReDim arrData(0)
Call CreateRS()
Call KillRS()
End Sub
Private Sub CreateRS()
Set objRS = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT TOP 5 * FROM ads ORDER BY IDAd DESC"
objRS.Open strSQL, objCon, adLockReadOnly, adCmdText
Do While Not objRS.EOF
ReDim Preserve arrData(UBound(arrData) + 1)
arrData(UBound(arrData)) = objRS("IDAd")
objRS.MoveNext
Loop
End Sub
SLUT FUNKAR -------------------------------------------------
I nedanstående kod vill jag jobba med en två dimensionell array och det är här felet uppstår.
START FUNKAR INTE -----------------------------------------
Dim arrData
Call main()
Private Sub main()
ReDim arrData(0,0)
Call CreateRS()
Call KillRS()
End Sub
Private Sub CreateRS()
Set objRS = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT TOP 5 * FROM ads ORDER BY IDAd DESC"
objRS.Open strSQL, objCon, adLockReadOnly, adCmdText
Do While Not objRS.EOF
ReDim Preserve arrData(UBound(arrData,1) + 1, arrData(UBound(arrData,2) + 1))
arrData(UBound(arrData,1)) = objRS("IDAd")
arrData(UBound(arrData,2)) = objRS("AdText")
objRS.MoveNext
Loop
End Sub
SLUT FUNKAR INTE --------------------------------------------------
Det gäller alltså sättet att initiera värden i en flerdimensionell array som jag inte får till.
Någon??!!
Tack på föhandSv: Flerdimensionella arrayer
Nu hann jag inte kika närmare på koden, det brukar finnas andra sätt att lösa problemet på som undviker ovanstående begränsning, i sista hand skulle du kanske annars få kopiera de gamla värdena till en helt ny, tom, array med rätt dimensioner, men detta brukar bli tidsödande när arrayerna blir lite större.
Anledningen till denna begränsning är hur data lagras internt i minnet av VB, har för mig att all data lagras successivt, och skulle du då öka på en inre dimension så måste all senare data flyttas, därför tillåts inte detta...
Det GÅR annars att skapa ett eget objekt, t ex nå'n länkad kedja som kan lösa ovanstående problem, fast då handlar det ju inte om arrayer längre... :-)
// QezSv: Flerdimensionella arrayer
Om jag såg rätt så vill du egentligen bara flytta över två värden från databasfrågan till en array?! och så ökar du arrayen för att få plats med dessa värden?! Du skulle väl kunna ta reda på hur många poster du fick tillbaka i ditt recordset och sedan bara göra en dimensionering för att få plats med alla dessa på en gång, och slippa reDim i varje varv i loopen!?
Vill du ändå ReDimma, så ändra den sista dimensionen enligt mitt förra svar, t ex:
<code>
Private Sub CreateRS()
Set objRS = Server.CreateObject("ADODB.Recordset")
' Undvik '*' i SQL-Queries, hämta bara de intressanta kolumnerna
strSQL = "SELECT TOP 5 IDAd, AdText FROM ads ORDER BY IDAd DESC"
objRS.Open strSQL, objCon, adLockReadOnly, adCmdText
Do While Not objRS.EOF
' Ökar sista dimensionen i arrayen, den första är fast på 2 platser
ReDim Preserve arrData(1 To 2, UBound(arrData,2) + 1)
' Minns inte om VB började RS-arrayen på 0 eller 1?!
arrData(1,UBound(arrData,2)) = objRS(0)
arrData(2,UBound(arrData,2)) = objRS(1)
objRS.MoveNext
Loop
End Sub
</code>
Hoppas detta hjälper nå't?!
// QezSv: Flerdimensionella arrayer
Jag får väl strunta i flerdimensionsarryer oc hitta på något annat.Sv: Flerdimensionella arrayer
Det betyder att din array ökar så här
array(1,1)
array(2,2)
array(3,3)
Du får ju då en array som blir mer än tvådimensionell..... du skulle bara öka storleken på arrayen där du matar in rader.
Ex:
array(1,2)
redim....
array(2,2)
redim....
array(3,2)
Annars får du ju en ofantligt stor array till slut.
Sen matar du in värden i platserna
Dim a
a = array
Redim a(4,2)
a(0,0) = "Måndag"
a(1,0) = "Onsdag"
a(2,0) = "Fredag"
a(3,0) = "Lördag"
a(0,1) = "2"
a(1,1) = "4"
a(2,1) = "6"
a(3,1) = "7"
response.write a(0,0)
Sen är det sant att du inte kan köra Redim Preserve på den första "kolumnen"
Du kan alltså inte Redim Preserve a(5,2)
Där emot kan du Redim Preserve a(4,3)
Däremot kan du köra Redim a(5,2), men då rensar du allt data från arrayen.Sv: Flerdimensionella arrayer
Tack alla som ville hjälpa. Jag gjorde så här istället - oklokt eller inte?
Kommentera gärna.
Dim arrDataID, arrDataText
Call main()
Private Sub main()
ReDim arrDataID(0)
ReDim arrDataText(0)
Call CreateRS()
Call KillRS()
End Sub
Private Sub CreateRS()
Set objRS = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT TOP 5 IDAd, AdText FROM ads ORDER BY IDAd DESC"
objRS.Open strSQL, objCon, adLockReadOnly, adCmdText
Do While Not objRS.EOF
ReDim Preserve arrDataID(UBound(arrDataID) + 1)
ReDim Preserve arrDataText(UBound(arrDataText) + 1)
arrDataID(UBound(arrDataID)) = objRS("IDAd")
arrDataText(UBound(arrDataText)) = CutString(objRS("AdText"))
objRS.MoveNext
Loop
End Sub
Sedan loopar jag ut innehållet i arrayerna så här:
For Each sItemText in arrDataText
If sItemText <> EMPTY Then
j = j + 1
For i = j To j
sItemID = arrDataID(i)
Response.Write sItemID & " " & sItemText
Next
End if
NextSv: Flerdimensionella arrayer
<code>
<%
Dim arrData
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1
Const adCmdText = 1
Call main
Private Sub main()
Dim objCon
Set objCon = Server.CreateObject("ADODB.Connection")
objCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Inetpub\wwwroot\AdDB.mdb"
arrData = CreateRS(objCon)
objCon.Close
Set objCon = Nothing
End Sub
Private Function CreateRS(objCon)
Dim objRS
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open "SELECT TOP 5 IDAd, AdText FROM ads ORDER BY IDAd DESC", _
objCon, _
adOpenForwardOnly, _
adLockReadOnly, _
adCmdText
If objRS.EOF Then
Else
CreateRS = objRS.GetRows()
End If
objRS.Close
Set objRS = Nothing
End Function
Dim Index
For Index = 0 To UBound(arrData, 2)
Response.Write arrData(0, Index) & " - " & arrData(1, Index) & "<br>" & vbCrLf
Next
%>
</code>