Problème de redimensionnement tableau à 2 dimensions [Résolu]

Signaler
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005
-
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005
-
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

Messages postés
1642
Date d'inscription
samedi 6 novembre 2004
Statut
Modérateur
Dernière intervention
28 avril 2011
2
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 !
Messages postés
1642
Date d'inscription
samedi 6 novembre 2004
Statut
Modérateur
Dernière intervention
28 avril 2011
2
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 !
Messages postés
1642
Date d'inscription
samedi 6 novembre 2004
Statut
Modérateur
Dernière intervention
28 avril 2011
2
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 !
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

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 !
Messages postés
1642
Date d'inscription
samedi 6 novembre 2004
Statut
Modérateur
Dernière intervention
28 avril 2011
2
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 !
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

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

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 !
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

Oki merci beaucoup pour la précision !
Je retourne me prendre la tête .
Messages postés
122
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
8 août 2014

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
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

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 ???
Messages postés
122
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
8 août 2014

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.
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

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.
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

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
Messages postés
1642
Date d'inscription
samedi 6 novembre 2004
Statut
Modérateur
Dernière intervention
28 avril 2011
2
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 !
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

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é
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
Messages postés
33
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
5 juillet 2005

Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !