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

fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 15 juin 2005 à 10:18 - Dernière réponse : fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention
- 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
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 15 juin 2005 à 16:59
3
Merci
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 !

Merci cs_Nurgle 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_Nurgle
Meilleure réponse
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 5 juil. 2005 à 17:16
3
Merci
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 !

Merci cs_Nurgle 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_Nurgle
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 15 juin 2005 à 14:11
0
Merci
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 !
Commenter la réponse de cs_Nurgle
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 15 juin 2005 à 15:55
0
Merci
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 !
Commenter la réponse de fal91
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 15 juin 2005 à 16:09
0
Merci
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 !
Commenter la réponse de cs_Nurgle
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 15 juin 2005 à 16:25
0
Merci
ça marche avec access en théorie ou pas ? Parce que là RecordCount me retourne -1. Ca aurait pu être niquel sinon
Commenter la réponse de fal91
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 15 juin 2005 à 16:34
0
Merci
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 !
Commenter la réponse de cs_Nurgle
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 15 juin 2005 à 16:42
0
Merci
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 !
Commenter la réponse de fal91
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 15 juin 2005 à 17:03
0
Merci
Oki merci beaucoup pour la précision !
Je retourne me prendre la tête .
Commenter la réponse de fal91
cs_FPatrick 122 Messages postés mercredi 27 novembre 2002Date d'inscription 8 août 2014 Dernière intervention - 16 juin 2005 à 10:36
0
Merci
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
Commenter la réponse de cs_FPatrick
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 16 juin 2005 à 10:51
0
Merci
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 ???
Commenter la réponse de fal91
cs_FPatrick 122 Messages postés mercredi 27 novembre 2002Date d'inscription 8 août 2014 Dernière intervention - 16 juin 2005 à 11:01
0
Merci
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.
Commenter la réponse de cs_FPatrick
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 16 juin 2005 à 11:16
0
Merci
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.
Commenter la réponse de fal91
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 21 juin 2005 à 12:29
0
Merci
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
Commenter la réponse de fal91
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 29 juin 2005 à 18:51
0
Merci
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 !
Commenter la réponse de cs_Nurgle
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 5 juil. 2005 à 16:22
0
Merci
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é
Commenter la réponse de fal91
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 5 juil. 2005 à 17:28
0
Merci
Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
Commenter la réponse de fal91
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 5 juil. 2005 à 17:28
0
Merci
Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
Commenter la réponse de fal91
fal91 33 Messages postés jeudi 21 avril 2005Date d'inscription 5 juillet 2005 Dernière intervention - 5 juil. 2005 à 17:28
0
Merci
Merci !!!!!!!! Ca marche enfin !!!!!!!!!!!!
Bon maintenant au moins, je maitrise les tableaux en ASP
Merci encore pour ton aide Nurgle !
Commenter la réponse de fal91

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.