États: Imprimer le numéro de la première et de la dernière page d'un
groupe |
Author(s) James H Brooks |
|
---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 mentoinné 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 pied 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, puisque Access ne peut pas
connaître le nombre de pages avant d'avoir effectivement formaté le tout. On
peut se servir de cette procédure pour créer la pagination des groupes.
Puisque le code utilise la propriété Pages (nombre total de page), forcément
l'état est formaté 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édente, 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 cela rend-il le code plus difficile à maintenir et à
"déverminner", mais il le rend également moins ré-utilisable. Les vecteurs sont
souvent des substituts avantageux en comparaison à ces tables.
Code complet:
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
*** 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).
|