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

cs_lacomm 299 Messages postés lundi 14 juin 2004Date d'inscription 5 juillet 2013 Dernière intervention - 24 août 2010 à 14:45 - Dernière réponse : cs_lacomm 299 Messages postés lundi 14 juin 2004Date d'inscription 5 juillet 2013 Dernière intervention
- 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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 24 août 2010 à 20:25
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)

Merci cs_Jack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_Jack
cs_lacomm 299 Messages postés lundi 14 juin 2004Date d'inscription 5 juillet 2013 Dernière intervention - 25 août 2010 à 12:20
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
cs_lacomm 299 Messages postés lundi 14 juin 2004Date d'inscription 5 juillet 2013 Dernière intervention - 25 août 2010 à 15:59
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 août 2010 à 19:01
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 25 août 2010 à 19:02
0
Merci
rsCombi.Fields("Mot3").Value
pour être complet
Commenter la réponse de cs_Jack
cs_lacomm 299 Messages postés lundi 14 juin 2004Date d'inscription 5 juillet 2013 Dernière intervention - 26 août 2010 à 15:22
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.