fal91
Messages postés33Date d'inscriptionjeudi 21 avril 2005StatutMembreDernière intervention 5 juillet 2005
-
15 juin 2005 à 10:18
fal91
Messages postés33Date d'inscriptionjeudi 21 avril 2005StatutMembreDernière intervention 5 juillet 2005
-
5 juil. 2005 à 17:28
Bonjour,
Je n'arrive pas à redimmensionner un tableau à 2 dimensions. J'obtiens l'erreur suivante : Erreur d'exécution Microsoft VBScript (0x800A0009)
Indice en dehors de la plage
Voilà mon code:
redim batiment(50,2)
i=0
Do While not objRecordset01.eof
batiment(i,0)=objRecordset01("NAME0")
batiment(i,1)=objRecordset01("ID0")
objRecordset01.MoveNext
i=i+1
loop
ReDim Preserve batiment(i,2)
J'avais eu la même erreur avec un tableau à 1D, il fallait juste déclarer le tableau avec redim au lieu de dim .
cs_Nurgle
Messages postés1642Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention28 avril 20114 15 juin 2005 à 16:59
C'est mieux de se trimballer d'énormes tableaux !!
La boucle en elle même n'a rien de spécial, mais c'est juste que tu
utilises ton objet recordset dedans, et c'est ça qui réduit vachement
les performances.
Si 50 est vraiment trop grand, essaye de faire une approximation plus
proche de la valeur que pourrait avoir i. Et bien sûr, si à un moment
tu fais ajouter des enregistrement à cette table, arrange toi pour
qu'il n'y ait jamais plus de 50 lignes, sinon : ERROR !! :p
Nurgle
C'est une grande folie que de vouloir être sage tout seul !
cs_Nurgle
Messages postés1642Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention28 avril 20114 15 juin 2005 à 16:09
tu peux obtenir le nombre d'enregistrement par la propriété objRecordSet01.RecordCount.
Donc tu peux dès le début faire : Dim batiment(objRecordset01.RecordCount, 2)
comme ça tu n'auras pas de redim à faire
(cette propriété n'est pas prise en charge par tous les types de BD malheureusement...)
Ah aussi : tu ne peux pas redimensionner un tableau en un tableau plus
petit tout en voulant préserver les données. Donc si à la fin de ta
boucle, i < 50, ça va planter.
Nurgle
C'est une grande folie que de vouloir être sage tout seul !
cs_Nurgle
Messages postés1642Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention28 avril 20114 15 juin 2005 à 16:34
il te retourne -1, donc ça marche pas
Quelle est environ la valeur de i à la fin de ta boucle ?
Si à la fin i < 50, alors, tu auras des lignes vides dans ton tableau, mais c'est pas bien grave...donc ça irait.
Si i > 50, alors il y aurait un moment dans ta boucle ou par
exemple i 53, où cette ligne ne fonctionnerais pas : batiment(1,2) objRecordset01("ID0") car il est déclaré comme batiment(50,2)
Sinon il faudrait faire une première boucle qui ne servirait à qu'à
trouver le nombre de ligne de ton recordset, puis créer le tableau avec
directement le bon nombre de lignes, puis le remplir avec une 2e boucle
(celle que tu utilises actuellement).
ça c'est sûr de marcher, mais c'est la solution la moins rapide...
Nurgle
C'est une grande folie que de vouloir être sage tout seul !
fal91
Messages postés33Date d'inscriptionjeudi 21 avril 2005StatutMembreDernière intervention 5 juillet 2005 15 juin 2005 à 16:42
Bah mon i est largement < à 50, j'ai mis 50 pour prévoir large. Je vais finalement opter pour la méthode de barbare alors avec une seconde boucle juste pour compter les éléments.
A ton avis, d'un point de vue optimisation, il te semblerait plus adapter de faire la 2nde boucle et d'avoir des tableaux pile à la bonne taille, ou bien de se trimballer d'énormes tableaux
cs_FPatrick
Messages postés122Date d'inscriptionmercredi 27 novembre 2002StatutMembreDernière intervention 8 août 20141 16 juin 2005 à 10:36
Bonjour à vous.
Pour le REDIM, il y une particularité; on ne peut pas redimensionner un tableau à plusieurs dimensions sur les dimensions inférieures. je m'explique :
DIM TOTO(0,0)
REDIM TOTO(10,2) OK
REDIM TOTO(10,10) OK
REDIM TOTO(11,10) ERREUR
On ne peut qu'augmenter la valeur supérieur d'un tableau.
Pour ton cas, j'inverserai les valeurs; je ferais batiment(2,i) dont i peut être redimensionnable (valeur suppérieur du tableau)
REDIM batiment(2,10), REDIM batiment(2,17) ,REDIM batiment(2,24) tout ca ok
J'espère avoir été assez clair dans mes explications confuses.
fal91
Messages postés33Date d'inscriptionjeudi 21 avril 2005StatutMembreDernière intervention 5 juillet 2005 16 juin 2005 à 10:51
ok merci Patrick. Je regarde ça dès que je peux. Autrement dit, il faudrait que je déclare mon tableau ainsi : Dim batiment(0,0), et que je le redimensionnes ainsi Redim Preserve batiment(2,i) ???
PS: j'ai une petite question de newbie, (0,0) lors de la déclaration du tableau, c'est bien pour déclarer tableau sans taille prédifinie ???
fal91
Messages postés33Date d'inscriptionjeudi 21 avril 2005StatutMembreDernière intervention 5 juillet 2005 16 juin 2005 à 11:16
Bah justement, j'avais eu un problème avec la déclaration sans taille dim toto(), je pensai que tu avais une autre solution .
Merci encore. Je regardes ça dès demain.
fal91
Messages postés33Date d'inscriptionjeudi 21 avril 2005StatutMembreDernière intervention 5 juillet 2005 21 juin 2005 à 12:29
Bonjour,
Je viens d'essayer Patrick (Pas eu le temps avant grrrrrrrr), j'ai l'erreur suivante au redim : Tableau fixe ou temporairement verrouillé.
Voilà mon code
dim objRecordset01
set objRecordset01 = Server.CreateObject("ADODB.Recordset")
objRecordSet01.activeConnection= "DRIVER={Microsoft Access Driver (*.mdb)};
DBQ=C:\Documents and Settings\All Users\Documents\bd2.mdb ;User ID='';Password='';"
objRecordset01.source= "SELECT * FROM SITE0 WHERE TYPE0=1 AND PARENTSITE0="&ID&""
objRecordset01.open
Dim batiment(3,50)
i=0
Do While not objRecordset01.eof
batiment(0,i)=objRecordset01("NAME0")
batiment(1,i)=objRecordset01("ID0")
objRecordset01.MoveNext
i=i+1
loop
REDIM PRESERVE batiment(3,i)
set objRecordset01=nothing
Donc en gros, je déclare un tableau trop grand, je le remplis (pas complètement), je compte le nombre d'éléments afin de pouvoir le redimensionner juste à la bonne taille.
Je comprends vraiment pas
Merci pour votre aide
Bonne journée