Se reporter également à la rubrique Formulaires pour bien des astuces similaires
Dans la section détail, on installe des champs. Certains de ces champs sont numériques. Il est possible, plutôt que d'avoir le contenu du champ, d'avoir le cumul de ses valeurs depuis le début de l'état.
Le cumul est une propriété du champ lui-même, et son comportement va changer selon le tableau suivant
Exemple :
Valeur de Cumul : | Non (Normal) | En continu | Par Groupe | |
Janvier | ||||
Pommes | 4 |
4 |
4 |
|
Poires | 8 |
12 |
12 |
|
Bananes | 3 |
15 |
15 |
|
Février | ||||
Pommes | 7 |
22 |
7 |
|
Bananes | 10 |
32 |
17 |
Une excellente astuce de cumul pourrait servir à numéroter les lignes des états. Pour ce faire, il suffit d'installer dans le détail une zone d'édition Ab, et d'y indiquer =1. Ensuite on définit simplement Cumul à "En continu" de cette zone.
Si on avait défini le cumul par groupe, on aurait une numérotation qui recommençait à chaque changement de données dans le groupe.
Exemple :
DoCmd OpenReport "E_NomDeLEtat", A_DESIGN ' Ouverture en
modification
Etats![E_NomDeLEtat].NomDePropriété = AttributNomDePropriété ' Changement d'une
propriété
SendKeys "{ENTER}" ' Envoi de ENTER pour confirmation de la boîte de
dialogue de confirmation de changement de propriété qui suit
DoCmd Close A_REPORT, "E_NomDeLEtat" ' Fermeture de la conception
DoCmd OpenReport "E_NomDeLEtat", A_PREVIEW ' Réouverture en
visualisation
Il est possible de dessiner par programmation dans un état. Ici, nous allons dessiner des lignes (et des rectangles par extension)
Admettons que dans chaque détail, nous désirons insérer un rectangle, il faut mettre l'instruction LINE dans l'événement AuFormatage du détail :
Me.Line (1, 10)-(100, 1000), 255, B
Explication des paramètres :
Me.Line (A, B)-(C, D), E, F
A : Si A vaut 1, alors le rectangle commencera complètement à gauche de l'état. S'il vaut plus, il commencera de plus en plus à droite
B : Si B vaut 1, alors le rectangle commencera complètement contre le haut de la section dans laquelle le code est inséré. S'il vaut plus, il commencera de plus en plus bas.
C : Si C vaut 1, alors le rectangle se terminera complètement à gauche de l'état. S'il vaut plus, il se terminera de plus en plus à droite. Il est idiot de mettre C à 1, puisque la coordonnée A est déjà sensée représenter cette valeur
D : Si B vaut 1, alors le rectangle se terminera complètement contre le haut de la section dans laquelle le code est inséré. S'il vaut plus, il se terminera de plus en plus bas. Même commentaire que pour C
E : Couleur du pourtour du rectangle. Elle peut-être exprimée sous la forme RGB(255,0,0) - (pour du rouge par exemple)
F : Si F est représenté par la lettre "B", le rectangle sera vide. Si F est représenté par "BF", il sera plein (ne pas mettre les guillemets)
Une application fort intéressante serait de créer des rectangles colorés de tailles différentes, relatives au nombre d'articles d'une certaine catégorie par exemple.
Imaginons une table des fruits avec différents noms de fruits, chaque fruit faisant partie d'une catégorie de fruits (Pomme, poire, etc.)
Private Sub GROGenreFruit_Format(Cancel As
Integer, FormatCount As Integer)
Me.ScaleMode = 3
Me.Line (1, 1)-(EDICompteFruit * 10, 30), 255, BF
End Sub
Pour ne pas afficher les règles verticales et horizontales en mode création, on peut faire AFFICHAGE/OPTIONS/CREATION DE FORMULAIRE-D'ETAT et AFFICHER LES REGLES
sans avoir besoin de les redéfinir à chaque état, il faut aller (en mode création) dans AFFICHAGE/OPTIONS/IMPRESSION
Il faut se mettre en mode APERCU AVANT IMPRESSION, aller dans FICHIER/CONFIGURATION DE L'IMPRIMANTE, changer ce qu'on veut changer, faire OK, et faire CTRL-S.
Access 2 :
Il faut aller dans FICHIER/CONFIGURATION DE L'IMPRIMANTE/AUTRE>> et NOMBRE DE COLONNES : ce qu'on veut et ne pas oublier DISPOSITION VERTICAL
Access 97 :
Fichier/Mise en page/Colonnes
Dans le cas ou le contenu d'une section dépasse la taille restante d'une page ou d'une colonne, il est possible d'exiger sa répétion (pour rappel) sur la page ou la colonne suivante (une seule propriété pour les deux choses). Marche à suivre :
Dans la propriété du groupe concerné : Mettre Répéter section à Oui
Du code qui est placé sur l'événement "Au formatage" d'un groupe sera exécuté à chaque impression ou visualisation d'un nouveau groupe. Par exemple, lorsqu'on clique sur le bouton pour aller visualiser la page suivante, et que sur cette page suivante, il y a 3 groupes, le code sera exécuté 3 fois de suite
Exemple :
Cet exemple permet d'écrire la ligne courante dans une couleur différente de la précédente
Private Sub ETADetail_Format(Cancel As
Integer, FormatCount As Integer)
Static Ctr
Ctr = Ctr + 10000
ETADetail.BackColor = Ctr
End Sub
Si on voulait par exemple que chaque nouvelle section commence en haut d'une nouvelle colonne, il faut faire comme ceci :
- Sélectionner l'en-tête de groupe concerné
- Demander la propriété NvLig ou col : avant Section
Si on fait glisser un saut de page juste au dessus d'un texte de titre de section, on obtient effectivement le titre en haut de chaque page, mais également juste avant le premier titre, ce qui fait que la première page est blanche. Une solution en VB est compliquée (voir VB : Supprimer un saut de page seulement sur la première page). Il existe une solution tout à fait simple et pratique : Demander les propriétés de la sectioon au dessus de la quelle vous voulez un saut de page, et définissez Saut de page : avant section. (Après section placera le titre en dessous de chaque page suivi d'un saut de page ... Inutile), et Avant & Après section isolera les titres sur une page à part : ce qui peut être utile parfois pour des états extrêmements gros
Il est possible de déterminer par programmation dynamiquement ce qui peut se passer dans une certaine section. Par exemple, on pourrait insérer un saut de page dans une certaine section de regroupement, mais on ne désire pas ce saut de page dans le premier groupe (pour une raison quelconque)
Il faut donc installer d'abord le saut de page dans la section comme si de rien n'était, et ensuite, il faut pouvoir le désactiver seulement sur la première section. Pour désactiver un saut de page, il faut mettre sa propriété Visible à False.
Voici donc le code à installer dans l'événement "Au formatage" de la section désirée
Private Sub EntêteGroupe0_Format(Cancel As
Integer, FormatCount As Integer)
If Page = 1 Then
SautPage.Visible = False
Else
SautPage.Visible = True
End If
VARSautPage = 1
End Sub
MoveLayout
Dans le cas ou on désire un état avec des sections principales et un détail, il arrive que l'on ait à imprimer les sections principales alors qu'il n'y a pas de détail correspondant. C'est possible, mais le problème est que l'état prend de toute façon au moins une ligne de détail vide lors de l'impression. Pour éviter cette perte de place inutile, voici ce qu'il faut faire : (J'ai pris l'exemple d'un état qui imprime tous les clients d'Info 3000, accompagnés de toutes les personnes qui travaillent dans ces entreprises clientes).
Nous allons utiliser la propriété MoveLayout, disponible uniquement par programmation. Il faut insérer le code suivant dans l'événement AuFormatage de la section de détail
If IsNull(NomPersonneContact) Then
Me.MoveLayout = False
Else
Me.MoveLayout = True
End If
Si on ne dit rien, Access va afficher les états de façon à ce qu'un en-tête de groupe ne soit pas forcément sur la même page que les détails qui le composent. Pour remédier à cela, il faut aller dans AFFICHAGE/TRIER ET REGROUPER, choisir le groupe qui doit apparaître de façon homogène sur une seule page, et choisir SECTION INSECABLE/GROUPE ENTIER.
la semaine commence au lundi et se termine le dimanche
Il est possible que l'on doive créer un état se composant de plusieurs tables, mais que certains champs de tables différentes portent le même nom. Dans ce cas, il est bien sûr possible de placer les différents champs séparément sur l'état, et ceux ci seront alors précédés d'un point et du nom de la table d'origine, mais lorsqu'il s'agit de les concaténer en un seul champ, avec &, c'est impossible. La seule solution consiste à baser l'état sur une requête, laquelle possède des titres de colonnes comme des expressions concaténées contenant les champs des 2 tables :
Dans ce exemple, j'ai une table T_Client, liée avec elle-même (pourqu'un client puisse avoir un client responsable de lui). Comme je n'arrive pas à concaténer l'IDClient, Nom et prénom dans une seule case, dans ma requête, je prépare le terrain comme ceci :
Responsable: [t_client].[idclient] & " " & [t_client].[nomclient] & " " & [t_client].[prenom]
Grâce à la méthode Print (Me.Print), il est possible d'écrire du texte dans n'importe quelle partie de l'état.
Exemple 1 :
Cet exemple permet de numéroter les enregistrements les uns à la suite des autres. Le même résultat peut être obtenu grâce à la propriété d'une zone Ab
Private Sub Détail_Format(Cancel As
Integer, FormatCount As Integer)
Static Ctr
Ctr = Ctr + 1
Me.Print Ctr
End Sub
Pour se permettre d'écrire plusieurs lignes, on peut bien sûr utiliser plusieurs fois de suite la méthode Print, mais par contre, on constate que il garde la position verticale ou il était à la ligne précédente. Ainsi
Me.Print "Ok"
Me.Print "Ok2"
Ne fonctionnerait pas (ne s'allignerait pas), par contre
Me.Print "Ok"
Me.CurrentX = 0
Me.Print "Ok2"
Donnerait un résultat parfaitement convaincant. Mais Il faut bien prévoir suffisamment de place en hauteur dans la section pour pouvoir écrire plusieurs lignes avec Print, car sinon, le texte est tronqué. Je pensais qu'en définissant la propriété de la section à AutoExtensible : Oui, ça réglerait le problème, mais en fait, non