OVH Cloud OVH Cloud

Une solution pour les paginations d'états

1 réponse
Avatar
dip
Bonjour,

Pour répondre à une question qui revient assez régulièrement mais dont la
réponse semble avoir été perdue : imprimer N°page / Nbre total de page mais
en se référant à un groupe et non à l'ensemble de l'état.

Un truc pour paginer un état en fonction des groupes créés que j'ai trouvé
dans les archives :
NB : il faut garder un contrôle caché avec =[pages] pour forcer le
reformatage avant impression


"Soumis par James H Brooks---
Imprimer le numéro de la première et de la dernière page d'un
groupe.
Il est souvent nécessaire de pagine pour un groupe
d'enregistrements, et non pour tout l'état. Access n'offre aucune
solution pré-établie et parfois, une solution de rechange peut
devenir ardue. Voici un exemple qui, utilisant une structure (array)
pour y parvenir.Ouvrir un état en mode design vecteur et ajouter le
code comme mentionné plus bas.
Note: la ligne Me!Salesperson doit être changée pour le nom du
contrôle de groupe qui gouverne la numérotation de page. De même,
Me!ctlGrpPages est le nom du contrôle du peid de page qui contiendra
le numéro de page.
Le code fonctionne en maintenant deux vecteurs: GrpArrayPage()
maintient le numéro de page pour le groupe et GrpArrayPages()
maintient le nombre total de pages pour le groupe.
Quand Access formate l'état, il est requis d'effectuer deux passes
pour obtenir l'information du genre Page 1 de 10, puisqu'Access ne
peut pas connaître le nombre de pages avant d'avoir effectivement
formatté le tout. On peut se servir de cette procédure pour cérer la
pagination des groupes. Puisque le code utilise la propriété Pages
(nombre total de page), forcément l'état est formatté deux fois.
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
Puisque la dimension de ces vecteurs est dynamique, nous utilisons
Preserve pour conserver l'information accumulée lors de la première
passe.
If Me.Pages = 0 Then
...
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
Fonctionnement du code:
Tant qu'Access n'a pas terminé la première passe, la valeur de la
propriété Pages est de 0. On peut donc utiliser ce fait pour
différencier entre la première et la seconde passe. La première
passe est expliquée avec plus de détails ci-dessous. La seconde
passe se contente d'assigner les valeurs appropriées au pied de
page.
À la première passe de l'état, le code utilise le nom de groupe et
la propriété Page (pas de s) pour construire la pagination désirée.
Chaque page réelle de l'état set d'index pour le vecteur qui
fournira le numéro à imprimer.
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
Ce code simplement assigne le prochain numéro de page pour le
groupe, soit un de plus que celui de la page précédante,
GrpArrayPage(Me.Page - 1).
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next I
GrpPages, une variable temporairement utilisée pour emmagasiner le
numéro de page est alors assigné au numéro de la page actuelle. La
boucle assigne la valeur de GrpArrayPages à la valeur de GrpPages
pour tous les items du vecteur.
Ainsi, s'il y a trois pages dans un groupe, les données devraient
être:
GrpArrayPage( ) GrpArrayPages( )
1 3
2 3
3 3
et lorsqu'on passe à une quatrième page:
GrpArrayPage( ) GrpArrayPages( )
1 4
2 4
3 4
...et ainsi de suite.
Le code détecte un changement du nom de groupe, " GrpNameCurrent <>
GrpNamePrevious", il remet alors la pagination à 1.
Les vecteurs sont souvent mésestimés lorsqu'on développe du code.
Les gens ont tendance à préférer des tables pour manipuler des
données temporaires, mais non seulement celè rend-il le code plus
dificile à maintenir et à débugger, mais il le rend également moins
ré-utilisable. Les vecteurs sont souvent des substituts avanageux en
comparaison à ces tables.
Code complet:
'************ Code Start *************
Option Compare Database
Option Explicit

Dim GrpArrayPage(), GrpArrayPages()
Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant
Dim GrpPage As Integer, GrpPages As Integer

Private Sub PageFooter_Format(Cancel As Integer, FormatCount As
Integer)
Dim i As Integer
If Me.Pages = 0 Then
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
GrpNameCurrent = Me!Salesperson
If GrpNameCurrent = GrpNamePrevious Then
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next i
Else
GrpPage = 1
GrpArrayPage(Me.Page) = GrpPage
GrpArrayPages(Me.Page) = GrpPage
End If
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
GrpNamePrevious = GrpNameCurrent
End Sub
'************ Code End *************
*** Note: Changer Me!Salesperson pour le nom du contrôle du groupe
gouvernant la pagination. Me!ctlGrpPages est le nom du contrôle
placé en pied d'état pour recevoir le numéro de page (vous pouvez le
modifier pour refléter votre choix personnel)."


---
Courrier sortant certifié sans virus
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.754 / Virus Database: 504 - Release Date: 06/09/2004

1 réponse

Avatar
Raymond [mvp]
Bonjour.

tu en trouveras une toute aussi simple avec documentation en ligne sur :
http://access.vba.free.fr/pagination_groupe.htm qui te propose deux
solutions dont 1 avec table et 1 avec tableau.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"dip" a écrit dans le message de
news:41401e32$0$1289$
Bonjour,

Pour répondre à une question qui revient assez régulièrement mais dont la
réponse semble avoir été perdue : imprimer N°page / Nbre total de page
mais

en se référant à un groupe et non à l'ensemble de l'état.

Un truc pour paginer un état en fonction des groupes créés que j'ai trouvé
dans les archives :
NB : il faut garder un contrôle caché avec =[pages] pour forcer le
reformatage avant impression


"Soumis par James H Brooks---
Imprimer le numéro de la première et de la dernière page d'un
groupe.
Il est souvent nécessaire de pagine pour un groupe
d'enregistrements, et non pour tout l'état. Access n'offre aucune
solution pré-établie et parfois, une solution de rechange peut
devenir ardue. Voici un exemple qui, utilisant une structure (array)
pour y parvenir.Ouvrir un état en mode design vecteur et ajouter le
code comme mentionné plus bas.
Note: la ligne Me!Salesperson doit être changée pour le nom du
contrôle de groupe qui gouverne la numérotation de page. De même,
Me!ctlGrpPages est le nom du contrôle du peid de page qui contiendra
le numéro de page.
Le code fonctionne en maintenant deux vecteurs: GrpArrayPage()
maintient le numéro de page pour le groupe et GrpArrayPages()
maintient le nombre total de pages pour le groupe.
Quand Access formate l'état, il est requis d'effectuer deux passes
pour obtenir l'information du genre Page 1 de 10, puisqu'Access ne
peut pas connaître le nombre de pages avant d'avoir effectivement
formatté le tout. On peut se servir de cette procédure pour cérer la
pagination des groupes. Puisque le code utilise la propriété Pages
(nombre total de page), forcément l'état est formatté deux fois.
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
Puisque la dimension de ces vecteurs est dynamique, nous utilisons
Preserve pour conserver l'information accumulée lors de la première
passe.
If Me.Pages = 0 Then
...
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
Fonctionnement du code:
Tant qu'Access n'a pas terminé la première passe, la valeur de la
propriété Pages est de 0. On peut donc utiliser ce fait pour
différencier entre la première et la seconde passe. La première
passe est expliquée avec plus de détails ci-dessous. La seconde
passe se contente d'assigner les valeurs appropriées au pied de
page.
À la première passe de l'état, le code utilise le nom de groupe et
la propriété Page (pas de s) pour construire la pagination désirée.
Chaque page réelle de l'état set d'index pour le vecteur qui
fournira le numéro à imprimer.
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
Ce code simplement assigne le prochain numéro de page pour le
groupe, soit un de plus que celui de la page précédante,
GrpArrayPage(Me.Page - 1).
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next I
GrpPages, une variable temporairement utilisée pour emmagasiner le
numéro de page est alors assigné au numéro de la page actuelle. La
boucle assigne la valeur de GrpArrayPages à la valeur de GrpPages
pour tous les items du vecteur.
Ainsi, s'il y a trois pages dans un groupe, les données devraient
être:
GrpArrayPage( ) GrpArrayPages( )
1 3
2 3
3 3
et lorsqu'on passe à une quatrième page:
GrpArrayPage( ) GrpArrayPages( )
1 4
2 4
3 4
...et ainsi de suite.
Le code détecte un changement du nom de groupe, " GrpNameCurrent <>
GrpNamePrevious", il remet alors la pagination à 1.
Les vecteurs sont souvent mésestimés lorsqu'on développe du code.
Les gens ont tendance à préférer des tables pour manipuler des
données temporaires, mais non seulement celè rend-il le code plus
dificile à maintenir et à débugger, mais il le rend également moins
ré-utilisable. Les vecteurs sont souvent des substituts avanageux en
comparaison à ces tables.
Code complet:
'************ Code Start *************
Option Compare Database
Option Explicit

Dim GrpArrayPage(), GrpArrayPages()
Dim GrpNameCurrent As Variant, GrpNamePrevious As Variant
Dim GrpPage As Integer, GrpPages As Integer

Private Sub PageFooter_Format(Cancel As Integer, FormatCount As
Integer)
Dim i As Integer
If Me.Pages = 0 Then
ReDim Preserve GrpArrayPage(Me.Page + 1)
ReDim Preserve GrpArrayPages(Me.Page + 1)
GrpNameCurrent = Me!Salesperson
If GrpNameCurrent = GrpNamePrevious Then
GrpArrayPage(Me.Page) = GrpArrayPage(Me.Page - 1) + 1
GrpPages = GrpArrayPage(Me.Page)
For i = Me.Page - ((GrpPages) - 1) To Me.Page
GrpArrayPages(i) = GrpPages
Next i
Else
GrpPage = 1
GrpArrayPage(Me.Page) = GrpPage
GrpArrayPages(Me.Page) = GrpPage
End If
Else
Me!ctlGrpPages = "Group Page " & GrpArrayPage(Me.Page) & " of "
& GrpArrayPages(Me.Page)
End If
GrpNamePrevious = GrpNameCurrent
End Sub
'************ Code End *************
*** Note: Changer Me!Salesperson pour le nom du contrôle du groupe
gouvernant la pagination. Me!ctlGrpPages est le nom du contrôle
placé en pied d'état pour recevoir le numéro de page (vous pouvez le
modifier pour refléter votre choix personnel)."


---
Courrier sortant certifié sans virus
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.754 / Virus Database: 504 - Release Date: 06/09/2004