Problème de redimensionnement tableau à 2 dimensions

Résolu
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005 - 15 juin 2005 à 10:18
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Derniè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 .

Merci pour votre aide

19 réponses

cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
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 !
3
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
5 juil. 2005 à 17:16
et si tu mes au début :



Dim batiment() au lieu de Dim batiment(3,0)

(dans le code que je t'ais donné dans mon précédent post )


Nurgle
C'est une grande folie que de vouloir être sage tout seul !
3
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
15 juin 2005 à 14:11
tu obtiens une erreur au premier "Redim" ou au 2e "Redim"



Met Dim batiment(50,2) au début

(je pense pas que tu ais besoin du premier redim cette fois ci )


Nurgle
C'est une grande folie que de vouloir être sage tout seul !
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
15 juin 2005 à 15:55
J'obtiens une erreur au 2ème ReDim, j'avais déjà éssayé avec juste Dim au 1ier, j'ai retesté là, mais ca ne marche pas

Merci pour ton aide !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
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 !
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
15 juin 2005 à 16:25
ça marche avec access en théorie ou pas ? Parce que là RecordCount me retourne -1. Ca aurait pu être niquel sinon
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
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 !
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Derniè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

Merci encore !
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
15 juin 2005 à 17:03
Oki merci beaucoup pour la précision !
Je retourne me prendre la tête .
0
cs_FPatrick Messages postés 122 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 8 août 2014 1
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.

Bonne journée
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Derniè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 ???
0
cs_FPatrick Messages postés 122 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 8 août 2014 1
16 juin 2005 à 11:01
Pour la déclaration sans taille:

dim toto()

si tu fais dim toto(0,0) , tu n'auras que la valeur toto(0,0) de disponible, autrement dit une variable.

tu peux faire

dim toto()

redim toto(2,1) et ....

Bonne journée.
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Derniè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.
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Derniè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
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
29 juin 2005 à 18:51
met le Redim batiment(3,i) dans la boucle !!

du genre :



Dim batiment(3,0)

i=0

Do While not objRecordset01.eof

Redim Preserve batiment(3,i)

batiment(0,i)=objRecordset01("NAME0")

batiment(1,i)=objRecordset01("ID0")

objRecordset01.MoveNext

i=i+1

loop

set objRecordset01=nothing



à chaque boucle tu ré-augmente la dimension du tableau...

j'ai pas vérifier mais ça doit être un truc dans ce genre là

Nurgle
C'est une grande folie que de vouloir être sage tout seul !
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
5 juil. 2005 à 16:22
Merci Nurgle.
C'est vrai que c'est pas bête comme solution, mais malheuresement ca ne marche toujours pas grrrrrrrrr.

Type d'erreur :
Erreur d'exécution Microsoft VBScript (0x800A000A)
Tableau fixe ou temporairement verrouillé
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
5 juil. 2005 à 17:28
Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
5 juil. 2005 à 17:28
Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
0
fal91 Messages postés 33 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
5 juil. 2005 à 17:28
Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
0
Rejoignez-nous