Recordset boucle sur premier et dernier record

Résolu
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 - 24 août 2010 à 14:45
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre 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

6 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
24 août 2010 à 20:25
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)
3
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
25 août 2010 à 12:20
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.
0
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
25 août 2010 à 15:59
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 août 2010 à 19:01
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.
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 août 2010 à 19:02
rsCombi.Fields("Mot3").Value
pour être complet
0
cs_lacomm Messages postés 298 Date d'inscription lundi 14 juin 2004 Statut Membre Dernière intervention 5 juillet 2013 1
26 août 2010 à 15:22
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.
0
Rejoignez-nous