OVH Cloud OVH Cloud

Problème de boucle dans vba

3 réponses
Avatar
Nadine
Bonjour =E0 tous,

Je cr=E9e une base de donn=E9es pour g=E9rer des dossiers, dans=20
une table =E9tape je regroupe toute les =E9tapes il y en a=20
18. Il y a une case =E0 cocher complet quand l'=E9tape est=20
termin=E9e.
Dans un formulaire je fais une recherche pour savoir =E0=20
quelle =E9tape je suis arriv=E9e et que je ne sois pas=20
oblig=E9e de faire toutes les =E9tapes avant d'arriver =E0=20
celle qui n'est pas encore encod=E9e.
La dificult=E9e est que si la case =E0 coch=E9e "complet" n'a=20
pas =E9t=E9 coch=E9e cela fonctionne tr=E8s bien, mais si la case=20
est coch=E9e je recois le message: il n'y a pas=20
d'enregistrement en court.

Voici le code:
Set Mb =3D CurrentDb()
Set Mr =3D Mb.OpenRecordset("T_etape", dbOpenTable)
Mr.Index =3D "Num_dossierindex"
Mr.Seek "=3D", Me!Num_dossieri
=20
Do
If Mr.NoMatch =3D False Then
If Mr![Num_ordre] < 18 Then
If Mr![Complet] =3D -1 Then
Mr.MoveNext
If Mr![Num_dossier] <> Me!Num_dossieri.Value Then
(avec ceci le programme revient au premier enregistrement)
=20
Mr.MovePrevious
MsgBox (Mr![Num_ordre] & " " & Mr![Num_dossier])
(ceci est test pour voir o=F9 arrive la boucle)
=20

DoCmd.OpenForm (Mr![Formulaire]), acNormal
Exit Do
End If
Else
MsgBox (Mr![Num_ordre] & " " & Mr![Num_dossier])(ceci=20
est test pour voir o=F9 arrive la boucle)
=20
DoCmd.OpenForm (Mr![Formulaire]), acNormal
Exit Do
End If

Else
MsgBox (" Ce dossier est termin=E9 !")
Exit Do
End If
Else
MsgBox (" Ce dossier n'existe pas !")
Exit Do
End If
Loop
Mr.Close

Quelqu'un peut-il m'aider svp :((?
Nadine

3 réponses

Avatar
Michel Gesnot
Bonjour Nadine

Apparemment, vous etes toujours en attente.


Si je comprends bien, un dossier en cours peut se trouver
a un des deux stades suivants :
- entre deux etapes, par ex. 11 complete et 12 pas
commencee
- etape 12 en cours.
Et vous gerez deux informations, la derniere etape
entreprise et son statut, complet ou non.
Le dossier n'est jamais complet s'il n'a pas parcouru les
18 étapes.


Pour revenir a votre message d'erreur, c'est Mr.Movenext
ou Mr.MovePrevious qui le genere.
Donc, vous devriez voir s'il passe le Mr.MoveNext : que se
passe-t-il si vous testez le dernier dossier en cours?
Vous atteignez le EOF. Non ? Et vous ne le gérez pas.
C'est une possibilite.

J'ai compris ceci : vous avez une cle qui reprend le n° de
dossier et son etape, votre boucle Do-Loop parcourt les
etapes du dossier jusqu'au dossier suivant et la, vous
revenez en arriere (MovePrevious) pour retrouver la
derniere etape du dossier recherche.

A mon avis, il y a plus simple :
- Soit les etapes sont stockees dans une table et vous
pouvez utiliser la fonction DLast sur la racine (n°
dossier) du champ Etape qui serait constitue du n° et de
l'index d'etape (00 a 18)
- Soit vous travaillez sur le recordset, mais avec
FindLast et la racine de l'index (n° dossier) comme
critere. Dans ce cas, il faut savoir que FindLast va
remplir tout le recordset a la premiere execution et il
faut donc voir si cela pose un probleme de delai d'acces
(nombre de dossiers tres important), ce qui m'etonnerait.
La vous tomberez d'emblee sur la derniere etape du dossier.
Enfin, vous pouvez travailler sur une requete, plutot que
sur la table, et ne retenir ainsi que les dossiers
incomplets, ce qui accelerera les choses.

Encore 3 observations :
1. voyez l'instruction With, qui simplifiera l'ecriture de
vos procedures.
2. pour faciliter la lecture, je testerais
If Mr.NoMatch then
ce dossier n'existe pas
Else
le traitement
End if

Et je veillerais a bien indenter, mais ce n'est peu-
etre que dans le post que vous n'avez pas indente
completetemnt.
3. Si vous ne les connaissez pas bien, allez voir les
fenetres de variables locales, d'exécution, les
possibilites d'execution ligne par ligne etc (F8, ctr-F8
etc) qui vous permettront de suivre votre procedure pas a
pas au lieu de passer par les MsgBox. (Il faut
reinitialiser le code pour revenir a la forme).

Si vous ne trouvez pas, et bien revenez.
Bon travail
Michel Gesnot





-----Message d'origine-----
Bonjour à tous,

Je crée une base de données pour gérer des dossiers, dans
une table étape je regroupe toute les étapes il y en a
18. Il y a une case à cocher complet quand l'étape est
terminée.
Dans un formulaire je fais une recherche pour savoir à
quelle étape je suis arrivée et que je ne sois pas
obligée de faire toutes les étapes avant d'arriver à
celle qui n'est pas encore encodée.
La dificultée est que si la case à cochée "complet" n'a
pas été cochée cela fonctionne très bien, mais si la case
est cochée je recois le message: il n'y a pas
d'enregistrement en court.

Voici le code:
Set Mb = CurrentDb()
Set Mr = Mb.OpenRecordset("T_etape", dbOpenTable)
Mr.Index = "Num_dossierindex"
Mr.Seek "=", Me!Num_dossieri

Do
If Mr.NoMatch = False Then
If Mr![Num_ordre] < 18 Then
If Mr![Complet] = -1 Then
Mr.MoveNext
If Mr![Num_dossier] <> Me!Num_dossieri.Value Then
(avec ceci le programme revient au premier enregistrement)

Mr.MovePrevious
MsgBox (Mr![Num_ordre] & " " & Mr![Num_dossier])
(ceci est test pour voir où arrive la boucle)


DoCmd.OpenForm (Mr![Formulaire]), acNormal
Exit Do
End If
Else
MsgBox (Mr![Num_ordre] & " " & Mr![Num_dossier])(ceci
est test pour voir où arrive la boucle)

DoCmd.OpenForm (Mr![Formulaire]), acNormal
Exit Do
End If

Else
MsgBox (" Ce dossier est terminé !")
Exit Do
End If
Else
MsgBox (" Ce dossier n'existe pas !")
Exit Do
End If
Loop
Mr.Close

Quelqu'un peut-il m'aider svp :((?
Nadine

.



Avatar
Daniel Carollo
Bonjour Michel (et Nadine)!

Attention au DLast! Contrairement a ce que le nom de cette fonction peut
nous faire croire, elle ne renvoie pas plus le dernier enregistrement que
DFirst ne renvoie le premier. Extrait de l'aide en ligne:
You can use the DFirst and DLast functions to return a random record from a
particular field in a table or query when you simply need any value from
that field.
La seule solution fiable est d'utiliser un TOP 1 sur une requete ordonnee,
ou un DMax/DMin.

Bonne continuation.

--
Daniel :-)

Computing Technologies International - www.computing-tech.com - We
provide solutions...

"Michel Gesnot" wrote in message
news:14ea501c4455a$ff541450$
Bonjour Nadine

Apparemment, vous etes toujours en attente.


Si je comprends bien, un dossier en cours peut se trouver
a un des deux stades suivants :
- entre deux etapes, par ex. 11 complete et 12 pas
commencee
- etape 12 en cours.
Et vous gerez deux informations, la derniere etape
entreprise et son statut, complet ou non.
Le dossier n'est jamais complet s'il n'a pas parcouru les
18 étapes.


Pour revenir a votre message d'erreur, c'est Mr.Movenext
ou Mr.MovePrevious qui le genere.
Donc, vous devriez voir s'il passe le Mr.MoveNext : que se
passe-t-il si vous testez le dernier dossier en cours?
Vous atteignez le EOF. Non ? Et vous ne le gérez pas.
C'est une possibilite.

J'ai compris ceci : vous avez une cle qui reprend le n° de
dossier et son etape, votre boucle Do-Loop parcourt les
etapes du dossier jusqu'au dossier suivant et la, vous
revenez en arriere (MovePrevious) pour retrouver la
derniere etape du dossier recherche.

A mon avis, il y a plus simple :
- Soit les etapes sont stockees dans une table et vous
pouvez utiliser la fonction DLast sur la racine (n°
dossier) du champ Etape qui serait constitue du n° et de
l'index d'etape (00 a 18)
- Soit vous travaillez sur le recordset, mais avec
FindLast et la racine de l'index (n° dossier) comme
critere. Dans ce cas, il faut savoir que FindLast va
remplir tout le recordset a la premiere execution et il
faut donc voir si cela pose un probleme de delai d'acces
(nombre de dossiers tres important), ce qui m'etonnerait.
La vous tomberez d'emblee sur la derniere etape du dossier.
Enfin, vous pouvez travailler sur une requete, plutot que
sur la table, et ne retenir ainsi que les dossiers
incomplets, ce qui accelerera les choses.

Encore 3 observations :
1. voyez l'instruction With, qui simplifiera l'ecriture de
vos procedures.
2. pour faciliter la lecture, je testerais
If Mr.NoMatch then
ce dossier n'existe pas
Else
le traitement
End if

Et je veillerais a bien indenter, mais ce n'est peu-
etre que dans le post que vous n'avez pas indente
completetemnt.
3. Si vous ne les connaissez pas bien, allez voir les
fenetres de variables locales, d'exécution, les
possibilites d'execution ligne par ligne etc (F8, ctr-F8
etc) qui vous permettront de suivre votre procedure pas a
pas au lieu de passer par les MsgBox. (Il faut
reinitialiser le code pour revenir a la forme).

Si vous ne trouvez pas, et bien revenez.
Bon travail
Michel Gesnot
Avatar
Michel Gesnot
Merci Daniel

Je vais aller relire cela.
En fait, je ne l'utilise pas, mais cela m'avait semblé
utilisable ici.
Autant pour moi et mes "esscuses" à Nadine.

M.

-----Message d'origine-----
Bonjour Michel (et Nadine)!

Attention au DLast! Contrairement a ce que le nom de
cette fonction peut

nous faire croire, elle ne renvoie pas plus le dernier
enregistrement que

DFirst ne renvoie le premier. Extrait de l'aide en ligne:
You can use the DFirst and DLast functions to return a
random record from a

particular field in a table or query when you simply need
any value from

that field.
La seule solution fiable est d'utiliser un TOP 1 sur une
requete ordonnee,

ou un DMax/DMin.

Bonne continuation.

--
Daniel :-)

Computing Technologies International - www.computing-
tech.com - We

provide solutions...

"Michel Gesnot"
wrote in message

news:14ea501c4455a$ff541450$
Bonjour Nadine

Apparemment, vous etes toujours en attente.


Si je comprends bien, un dossier en cours peut se trouver
a un des deux stades suivants :
- entre deux etapes, par ex. 11 complete et 12 pas
commencee
- etape 12 en cours.
Et vous gerez deux informations, la derniere etape
entreprise et son statut, complet ou non.
Le dossier n'est jamais complet s'il n'a pas parcouru les
18 étapes.


Pour revenir a votre message d'erreur, c'est Mr.Movenext
ou Mr.MovePrevious qui le genere.
Donc, vous devriez voir s'il passe le Mr.MoveNext : que se
passe-t-il si vous testez le dernier dossier en cours?
Vous atteignez le EOF. Non ? Et vous ne le gérez pas.
C'est une possibilite.

J'ai compris ceci : vous avez une cle qui reprend le n° de
dossier et son etape, votre boucle Do-Loop parcourt les
etapes du dossier jusqu'au dossier suivant et la, vous
revenez en arriere (MovePrevious) pour retrouver la
derniere etape du dossier recherche.

A mon avis, il y a plus simple :
- Soit les etapes sont stockees dans une table et vous
pouvez utiliser la fonction DLast sur la racine (n°
dossier) du champ Etape qui serait constitue du n° et de
l'index d'etape (00 a 18)
- Soit vous travaillez sur le recordset, mais avec
FindLast et la racine de l'index (n° dossier) comme
critere. Dans ce cas, il faut savoir que FindLast va
remplir tout le recordset a la premiere execution et il
faut donc voir si cela pose un probleme de delai d'acces
(nombre de dossiers tres important), ce qui m'etonnerait.
La vous tomberez d'emblee sur la derniere etape du
dossier.

Enfin, vous pouvez travailler sur une requete, plutot que
sur la table, et ne retenir ainsi que les dossiers
incomplets, ce qui accelerera les choses.

Encore 3 observations :
1. voyez l'instruction With, qui simplifiera l'ecriture de
vos procedures.
2. pour faciliter la lecture, je testerais
If Mr.NoMatch then
ce dossier n'existe pas
Else
le traitement
End if

Et je veillerais a bien indenter, mais ce n'est peu-
etre que dans le post que vous n'avez pas indente
completetemnt.
3. Si vous ne les connaissez pas bien, allez voir les
fenetres de variables locales, d'exécution, les
possibilites d'execution ligne par ligne etc (F8, ctr-F8
etc) qui vous permettront de suivre votre procedure pas a
pas au lieu de passer par les MsgBox. (Il faut
reinitialiser le code pour revenir a la forme).

Si vous ne trouvez pas, et bien revenez.
Bon travail
Michel Gesnot



.