Recordset boucle sur premier et dernier record [Résolu]

Messages postés
299
Date d'inscription
lundi 14 juin 2004
Dernière intervention
5 juillet 2013
- - Dernière réponse : cs_lacomm
Messages postés
299
Date d'inscription
lundi 14 juin 2004
Dernière intervention
5 juillet 2013
- 26 août 2010 à 15:22
Hello

J'utilise un recordset que je parcours avec le code ci-dessous. Tout va très bien, sauf quand le premier et/ou le dernier enregistrement contiennent un champ vide: chaque ligne contient (champ x) une règle syntaxique dont les 4 éléments sont présents dans les autres champs.
champ x contient la règle: mot1 mot2 mot3 mot4
champ 1= mot1
champ 2= mot2
champ 3= mot3
champ 4= mot4

Mais quand le premier/dernier enregistrement contient une règle avec moins de 4 éléments et donc un champ vide au mois, ca boucle.

 Do Until elvar(1).EOF
                            motVar1 rsCombi("Mot1"):  élément(1) elvar(1)(motVar1)
                            txtmotcible = elvar(1)(motVar1)
                            Do Until elvar(2).EOF
                                motVar2 rsCombi("Mot2"):  élément(2) elvar(2)(motVar2)
                              Do Until elvar(3).EOF
                                    motVar3 rsCombi("Mot3"): élément(3) elvar(3)(motVar3)
                                    Do Until elvar(4).EOF
                                        motVar4 rsCombi("Mot4"): élément(4) elvar(4)(motVar4)
                                        maCombi = rsCombi("Regle")
                                        If NbElVar > 0 Then maCombi = Replace(maCombi, rsCombi("Mot1"), élément(1))
                                        If NbElVar > 1 Then maCombi = Replace(maCombi, rsCombi("Mot2"), élément(2))
                                        If NbElVar > 2 Then maCombi = Replace(maCombi, rsCombi("Mot3"), élément(3))
                                        If NbElVar > 3 Then maCombi = Replace(maCombi, rsCombi("Mot4"), élément(4)) 
If rsCombi("Mot4") = " " Then Exit Do
                                    elvar(4).MoveNext
                                    Loop

                                    
If rsCombi("Mot3") = " " Then Exit Do
                                    elvar(3).MoveNext: elvar(4).MoveFirst
                                Loop
                                If rsCombi("Mot2") = " " Then Exit Do
                                elvar(2).MoveNext: elvar(3).MoveFirst: elvar(4).MoveFirst
                            Loop
                            If rsCombi("Mot1") = " " Then Exit Do
                            
                            elvar(1).MoveNext: elvar(2).MoveFirst: elvar(3).MoveFirst: elvar(4).MoveFirst
                          Loop



merci à vous
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
72
3
Merci
Salut

"ça boucle" ??
Commence par supprimer un éventuel "On Error Resume Next" qui pourrait masquer le vrai problème.

De quel ttpes sont tes "rsCombi", "elvar()" and Co ?
(comment sont-ils dimensionnés ?)

Ah oui : Tu jongles avec les .MoveFirst, donc ça boucle à cause de ce genre de chose.
Là, il n'y a que toi qui puisse comprendre ce que tu fais dans ce code. Je te conseille de déboguer (*) et de voir par où passe le programme et si c'est normal.
Pense à vérifier si ton champ est nul avant de l'utiliser et, par conséquent, à prendre les décisions qui s'imposent en tel cas, genre
If Not IsNull(monRecordSet.Fields("monChamp")) Then

(*) débogage :
F9 sur une ligne de code
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
F8 pour avancer d'une ligne de code
F5 pour continuer normalement

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 123 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
299
Date d'inscription
lundi 14 juin 2004
Dernière intervention
5 juillet 2013
0
Merci
Merci de ton aide Jack

Oui il me semble que les recordsets sont bien dimensionnés, par exemple ceci pour le nombre maximum de champs (de 1 à 4)
For i = 1 To NbElVar
    elvar(i).Open "SELECT   * FROM Mots   ;", cnx: elvar(i).MoveFirst
Next i


Oui le débogage montre où ça boucle mais je ne comprends pas pourquoi: le recordset est bien Null ou = " ", mais les instructions
If Not IsNull(rsCombi("Mot3")) Then Exit Do

ou
If rsCombi("Mot3") = " " Then Exit Do

ne permettent pas de sortir de la boucle.

La routine tourne pour 3 et 4 éléments mais pas en dessous.
Commenter la réponse de cs_lacomm
Messages postés
299
Date d'inscription
lundi 14 juin 2004
Dernière intervention
5 juillet 2013
0
Merci
en fait oui ca venait des champs: un champ modifié à la main directement dans la base access "boucle", alors qu'un champ saisi et inséré par l'application passe très bien
Commenter la réponse de cs_lacomm
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
72
0
Merci
Tant mieux si tu as trouvé, mais je ne comprends toujours pas ce que sont rsCombi et elvar()
Tu nous dis qu'ils sont bien dimensionnés mais on ne sait pas en quoi !

rsCombi("Mot3"), dont le nom laisse à penser qu'il s'agit d'un RecordSet, voudrait dire que tu à des RecordSet indexés et sous forme d'une collection (puisque tu y accèdes par un nom)?
Très bizarre.

Si ton rsCombi n'est pas indexé, et pour accéder à un champ nommé "Mot3", la syntaxe est
rsCombi.Fields("Mot3")

Ne prends pas trop de raccourcis dans tes codes, tu finiras par avoir des soucis d'interprétation du compilateur.
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
72
0
Merci
rsCombi.Fields("Mot3").Value
pour être complet
Commenter la réponse de cs_Jack
Messages postés
299
Date d'inscription
lundi 14 juin 2004
Dernière intervention
5 juillet 2013
0
Merci
oui en effet j'ai trouvé mais c'est pas pour autant que je comprends pourquoi ça marche..

En fait, une table est parcourue sur base des champs d'une autre table.
rsCombi est un recordset dont la taille est variable et dont les champs contiennent un champ qui contient une règle syntaxique du genre mot1 mot2 mot3 mot4, un champ qui contient le nombre d'élément de cette règle, qui varie de 1 à 4 (elvar), et des champs qui contiennent les éléments eux-mêmes, dans ce cas-ci "mot1" pour rsCombi.mot1 etc. La valeur mot1, mot2 de ces champs rsCombi.mot1,rsCombi.mot2 etc sert à la requête dans une autre table et donc la valeur mot1, est remplacée par les valeurs du champ elvar.mot1 etc.
Les recordsets sont "dimensionnés" à l'avance, si "dimensionné" veut dire définition du nombre de champs.
Commenter la réponse de cs_lacomm

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.