webForumDet fria alternativet

Dynamisk arrya, Redim fungerar ej andra gången

3 svar · 289 visningar · startad av Daniel78

Daniel78Medlem sedan jan. 2001200 inlägg
#1

Hej!

Jag försöker att hämta information från olika SELECT satser och trycka in detta i en gemensam Array. Den första SELECT satsen lagras korrrekt och utökar Arrayn dynamiskt. Men så fort det kommer ett resultat från den andra SELECT satsen och jag kör en REDIM på Arrayen med det nya antalet poster så får jag bara felet "Subscript Out of Range". Jag kan inte lösa detta genom att skapa EN gemensam SELECT sats därför behöver jag få detta med Array att fungera.

		Dim i,RsCount
		Dim myArray()
		i = 0
		'Lägg in värden från tblPostLista
		MySQL = Hämta Info från databasen
		Set MyRs = Server.CreateObject("ADODB.RecordSet")
		MyRs.Open MySQL, MyConn, 3
		RsCount = MyRs.RecordCount - 1
		redim preserve MyArray(RsCount,7)

		Do While Not MyRs.EOF
			'Lägg in värdena från databasen i arrayen
		MyRs.MoveNext
		i = i + 1
		Loop
	
		MyRs.Close
	
  		MySQL = Hämta ny info från databasen
		Set MyRs = Server.CreateObject("ADODB.RecordSet")
		MyRs.Open MySQL, MyConn, 3
		RsCount = RsCount + MyRs.RecordCount
		'Lägg in värden från tabellen
		[B]redim preserve MyArray(RsCount,7)[/B]

		Do While Not MyRs.EOF
			'Lägg in värdena från databasen i arrayen
		MyRs.MoveNext
		i = i + 1
		Loop

Det är alltså den markerade Redim:en som ger felet, vad jag vet så ska man väl kunna köra Redim hur många gånger som helst, så det borde väl inte vara några problem? Värdet som kommer från strängen RsCount är också korrekt.

tohaMedlem sedan dec. 1999707 inlägg
#2

Läste det här om ReDim:

If you use the Preserve keyword, you can resize only the last array dimension, and you can't change the number of dimensions at all. For example, if your array has only one dimension, you can resize that dimension because it is the last and only dimension. However, if your array has two or more dimensions, you can change the size of only the last dimension and still preserve the contents of the array.

Daniel78Medlem sedan jan. 2001200 inlägg
#3

Då är alltså det enda alternativet att köra SELECT satserna innan och lägga antalet kolumner i en variabel och skapa Arrayen dynamiskt EN gång och sen köra SELECT-satserna igen men då för att hämta datan.

tohaMedlem sedan dec. 1999707 inlägg
#4

Kan du inte hämta data först och dimm arrayen efter antal rader i de bägge recordset:en och sedan loopa igenom dom för att lägga in datat i arrayen? På så sätt behöver man inte redimma med preserve. Typ såhär (har inte testat):

		Dim i,RsCount
		Dim myArray()

		'Lägg in värden från tblPostLista
		MySQL = Hämta Info från databasen
		Set MyRs1 = Server.CreateObject("ADODB.RecordSet")
		MyRs1.Open MySQL, MyConn, 3

  		MySQL = Hämta ny info från databasen
		Set MyRs2 = Server.CreateObject("ADODB.RecordSet")
		MyRs2.Open MySQL, MyConn, 3
		RsCount = MyRs1.RecordCount + MyRs2.RecordCount - 1
		redim MyArray(RsCount,7)

		i = 0
		Do While Not MyRs1.EOF
			'Lägg in värdena från databasen i arrayen
		MyRs1.MoveNext
		i = i + 1
		Loop
		Do While Not MyRs2.EOF
			'Lägg in värdena från databasen i arrayen
		MyRs2.MoveNext
		i = i + 1
		Loop
	
		MyRs1.Close
		MyRs2.Close
130 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)