---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 mentinné pluc 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)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).