OVH Cloud OVH Cloud

je mélange mes IF ...

9 réponses
Avatar
fth
Bonjour,

Dans la procédure suivante, je cafouille dans mes "IF" ( à mon avis..)
Le but étant de n'imprimer QUE les contrats des contacts visible dans ma
liste (après filtrage)

Une aide matinale serait la bienvenue ...

merci beaucoup,

Frédéric


Private Function ContratPrint()
Dim NumContrat
Dim Tcontrat As String
Dim rst As Recordset

Tcontrat = Me.ContratType

Set rst = Me.RecordsetClone


With rst
If Not .BOF Then
.MoveFirst
Do Until .EOF


If ContratSend = True Then
MsgBox "Contrat déjà rédigé", vbInformation, "Contrat"

Else

If Tcontrat = "Bénévole" Then
DoCmd.OpenReport "RptContratBenevole", acViewPreview
Me.ContratSend = True
Else

If Tcontrat = "Bénévole/défrayé" Then
DoCmd.OpenReport "RptContratBenevDef", acViewPreview
Me.ContratSend = True
Else

If Tcontrat = "Chauffeur" Then
DoCmd.OpenReport "RptContratChauffeur", acViewPreview
Me.ContratSend = True

End If
End If
End If

Loop
End If
End With

End Function

9 réponses

Avatar
François Saintier
Bonjour,

Dans la procédure suivante, je cafouille dans mes "IF" ( à mon avis..)
Le but étant de n'imprimer QUE les contrats des contacts visible dans ma
liste (après filtrage)

Une aide matinale serait la bienvenue ...

merci beaucoup,

Frédéric


Private Function ContratPrint()
Dim NumContrat
Dim Tcontrat As String
Dim rst As Recordset

Tcontrat = Me.ContratType

Set rst = Me.RecordsetClone


With rst
If Not .BOF Then
.MoveFirst
Do Until .EOF


If ContratSend = True Then
MsgBox "Contrat déjà rédigé", vbInformation, "Contrat"

Else

If Tcontrat = "Bénévole" Then
DoCmd.OpenReport "RptContratBenevole", acViewPreview
Me.ContratSend = True
Else

If Tcontrat = "Bénévole/défrayé" Then
DoCmd.OpenReport "RptContratBenevDef", acViewPreview
Me.ContratSend = True
Else

If Tcontrat = "Chauffeur" Then
DoCmd.OpenReport "RptContratChauffeur", acViewPreview
Me.ContratSend = True

End If
End If
End If

Loop
End If
End With

End Function


De mémoir d'amateur, quand les imbrications de IF sont très compliquées
la méthode Case est plus simple, et me semble plus adaptée dans ton
exemple.
Amicalement
François

Avatar
Gilles MOUGNOZ
Bonjour,
Dans la procédure suivante, je cafouille dans mes "IF" ( à mon avis..)
Le but étant de n'imprimer QUE les contrats des contacts visible dans ma
liste (après filtrage)
Une aide matinale serait la bienvenue ...
merci beaucoup,
Frédéric

Private Function ContratPrint()
Dim NumContrat
Dim Tcontrat As String
Dim rst As Recordset
Tcontrat = Me.ContratType
Set rst = Me.RecordsetClone
With rst
If Not .BOF Then
.MoveFirst
Do Until .EOF
If ContratSend = True Then
MsgBox "Contrat déjà rédigé", vbInformation, "Contrat"
Else
If Tcontrat = "Bénévole" Then
DoCmd.OpenReport "RptContratBenevole", acViewPreview
Me.ContratSend = True
Else
If Tcontrat = "Bénévole/défrayé" Then
DoCmd.OpenReport "RptContratBenevDef", acViewPreview
Me.ContratSend = True
Else
If Tcontrat = "Chauffeur" Then
DoCmd.OpenReport "RptContratChauffeur", acViewPreview
Me.ContratSend = True
End If
End If
End If
Loop
End If
End With
End Function


Bonjour, Frédéric

Sans entrer dans le détail, j'ai vu qu'une partie de tes IFs imbriqués
portait sur le même élément.
Dans ce cas, il est préférable d'utiliser SELECT CASE qui sera à la fois
plus efficace et plus lisible.
Ici cela donnerait:

Select Case Tcontrat
Case "Bénévole":
'ton code
Case "Bénévole/défrayé":
'ton code
Case "Chauffeur":
'ton code
Case Else:
' tous les autres cas non prévus
End Select

Bonne continuation

Avatar
fth
Bonjour,

et merci pour la piste...

Il me reste un soucis:
pas moyen de limiter l'impression au record selectionné...

j'ai donc modifié comme ceci:
Private Function ContratPrintCASE()

If ContratSend = True Then
MsgBox "Contrat déjà rédigé", vbInformation, "Contrat"

Else

Select Case ContratType

Case "Bénévole":
DoCmd.OpenReport "RptContratBenevole", acViewPreview
Me.ContratSend = True

Case "Bénévole/défrayé":
DoCmd.OpenReport "RptContratBenevDef", acViewPreview
Me.ContratSend = True

Case "Chauffeur":
DoCmd.OpenReport "RptContratChauffeur", acViewPreview
Me.ContratSend = True

'Case Else:
' tous les autres cas non prévus

End Select
End If

End Function

puis je fais ceci:

Private Sub BtPrintAll_Click()
Dim rst As Recordset
Set rst = Me.RecordsetClone

With rst
If Not .BOF Then
.MoveFirst
Do Until .EOF

ContratPrintCASE ' la proc modifiée en CASE

.MoveNext
Loop
End If
End With
'rst.Close: Set rst = Nothing
'Me.Refresh

End Sub

Frustrant ... chte jure!

merci pour tout

Frederic


"Gilles MOUGNOZ" wrote in message
news:%
Bonjour,
Dans la procédure suivante, je cafouille dans mes "IF" ( à mon avis..)
Le but étant de n'imprimer QUE les contrats des contacts visible dans ma
liste (après filtrage)
Une aide matinale serait la bienvenue ...
merci beaucoup,
Frédéric

Private Function ContratPrint()
Dim NumContrat
Dim Tcontrat As String
Dim rst As Recordset
Tcontrat = Me.ContratType
Set rst = Me.RecordsetClone
With rst
If Not .BOF Then
.MoveFirst
Do Until .EOF
If ContratSend = True Then
MsgBox "Contrat déjà rédigé", vbInformation, "Contrat"
Else
If Tcontrat = "Bénévole" Then
DoCmd.OpenReport "RptContratBenevole", acViewPreview
Me.ContratSend = True
Else
If Tcontrat = "Bénévole/défrayé" Then
DoCmd.OpenReport "RptContratBenevDef", acViewPreview
Me.ContratSend = True
Else
If Tcontrat = "Chauffeur" Then
DoCmd.OpenReport "RptContratChauffeur", acViewPreview
Me.ContratSend = True
End If
End If
End If
Loop
End If
End With
End Function


Bonjour, Frédéric

Sans entrer dans le détail, j'ai vu qu'une partie de tes IFs imbriqués
portait sur le même élément.
Dans ce cas, il est préférable d'utiliser SELECT CASE qui sera à la fois
plus efficace et plus lisible.
Ici cela donnerait:

Select Case Tcontrat
Case "Bénévole":
'ton code
Case "Bénévole/défrayé":
'ton code
Case "Chauffeur":
'ton code
Case Else:
' tous les autres cas non prévus
End Select

Bonne continuation




Avatar
Gilles MOUGNOZ
Bonjour,
et merci pour la piste...
Il me reste un soucis:
pas moyen de limiter l'impression au record selectionné...
....................................


Re-bonjour, Frédéric

Il faut qu'un champ (de préférence une clef) se trouve à la fois dans la
source de ton form et de tes états.
En supposant que ce champ s'appelle "TaClef":

DoCmd.OpenReport "TonEtat", acViewPreview, , "TaClef=" &
.Fields("TaClef")

Attention à bien mettre toutes les virgules, elles ne sont pas optionnelles!

Bonne continuation

Avatar
fth
Re bonour Gilles,

c'est ce que j'utilise quand je veux imprimer un contrat pour un contact.
Est ce valable pour une selection de contact, puis-je l'insérer dans la
précédure vue tout à l'heure?

d'avance merci
(je désespere un peu ...)


"Gilles MOUGNOZ" wrote in message
news:%23kW$
Bonjour,
et merci pour la piste...
Il me reste un soucis:
pas moyen de limiter l'impression au record selectionné...
....................................


Re-bonjour, Frédéric

Il faut qu'un champ (de préférence une clef) se trouve à la fois dans la
source de ton form et de tes états.
En supposant que ce champ s'appelle "TaClef":

DoCmd.OpenReport "TonEtat", acViewPreview, , "TaClef=" &
.Fields("TaClef")

Attention à bien mettre toutes les virgules, elles ne sont pas
optionnelles!

Bonne continuation




Avatar
fth
..suite...

Voici le code que je met sur l'évenement de mon bouton..
dans le secret espoir qu'il passe d'un record à l'autre ...
et uniquement dans les records sélectionnés..

Je rêve?

Merci

Frederic

"Gilles MOUGNOZ" wrote in message
news:%23kW$
Bonjour,
et merci pour la piste...
Il me reste un soucis:
pas moyen de limiter l'impression au record selectionné...
....................................


Re-bonjour, Frédéric

Il faut qu'un champ (de préférence une clef) se trouve à la fois dans la
source de ton form et de tes états.
En supposant que ce champ s'appelle "TaClef":

DoCmd.OpenReport "TonEtat", acViewPreview, , "TaClef=" &
.Fields("TaClef")

Attention à bien mettre toutes les virgules, elles ne sont pas
optionnelles!

Bonne continuation




Avatar
Gilles MOUGNOZ
..suite...

Voici le code que je met sur l'évenement de mon bouton..
dans le secret espoir qu'il passe d'un record à l'autre ...
et uniquement dans les records sélectionnés..

Je rêve?

Merci

Frederic


Euh... il est où, le code ?
Bon, en relisant ton code initial, j'ai vu que tu ne changeais pas
l'enregistrement courant.
A la fin de la boucle, il faut ajouter : rst.MoveNext
Je ne sais pas si ton problème est là mais ne désespère pas, on avance, non?

Bonne continuation

Avatar
fth
Re! (et re merci aussi)
Petit résumé:

j'ai donc modifié mon code bouré de IF par ta solution:
Private Function ContratPrintCASE()

If ContratSend = True Then
MsgBox "Contrat déjà rédigé", vbInformation, "Contrat"

Else

Dim rst As Recordset
Set rst = Me.RecordsetClone

With rst
Do Until .EOF

Select Case ContratType

Case "Bénévole":
DoCmd.OpenReport "RptContratBenevole", acViewPreview
Me.ContratSend = True

Case "Bénévole/défrayé":
DoCmd.OpenReport "RptContratBenevDef", acViewPreview
Me.ContratSend = True

Case "Chauffeur":
DoCmd.OpenReport "RptContratChauffeur", acViewPreview
Me.ContratSend = True

'Case Else:
' tous les autres cas non prévus

End Select

.MoveNext
Loop
End With
End If

End Function

Le soucis n'est pas de passer d'un record à l'autre mais de n'imprimer que
la sélection que j'ai à l'écran.
Actuellement, il imprime tout la liste (400 records) alors que je fais des
selections (click droit sur un champ-filter) par pacquet de 20 à 50 records
(auquels j'appliques qq modifs)

je me demandais si qq chose genre recordset clone ou qui ferait réference a
la form en cours ..

..je désepsère toujours Pfff
merci de ton aide

Frédéric


"Gilles MOUGNOZ" wrote in message
news:
..suite...

Voici le code que je met sur l'évenement de mon bouton..
dans le secret espoir qu'il passe d'un record à l'autre ...
et uniquement dans les records sélectionnés..

Je rêve?

Merci

Frederic


Euh... il est où, le code ?
Bon, en relisant ton code initial, j'ai vu que tu ne changeais pas
l'enregistrement courant.
A la fin de la boucle, il faut ajouter : rst.MoveNext
Je ne sais pas si ton problème est là mais ne désespère pas, on avance,
non?

Bonne continuation




Avatar
Gilles MOUGNOZ
Re! (et re merci aussi)
Petit résumé:
j'ai donc modifié mon code bouré de IF par ta solution:
...


Si tu reviens sur ma réponse de 16:18, je te donnais une solution: il faut
ajouter un paramètre à tes OpenReport.
Bien sûr, il faut adapter à ton cas, je ne connais pas la structure de tes
tables.
Dans ton code, sélectionne un OpenReport et tapes sur F1, tu devrais trouver
quelques infos utiles...
Regarde aussi si les sites de Raymond et 3Stone s'ils ne propose pas un
petit didactitiel sur le sujet.

Bon et long week-end et à mardi !