Home
Home

---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)
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).