Etats

Se reporter également à la rubrique Formulaires pour bien des astuces similaires

Globalité de l'état - Mise en page

Cumul

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

Numérotation des lignes

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.

Changer et sauvegarder les propriétés d'un état

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

Dessin de lignes

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)

Graphique à l'aide de la méthode Line

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

  1. Créer un état avec une section de regroupement par genre de fruit (on nomme cette section GROGenreFruit)
  2. Dans ce regroupement, mettre le champ Genre, ainsi qu'une zone Ab qui contient =Compte(NomFruit) (Nom : EDICompteFruit)
  3. Dans la section détail, mettre simplement le champ NomFruit (Que l'on a pas beosin de voir. On peut définir sa propriété visible à Non, mais par contre on ne peut pas reserrer le détail jusqu'à ce qu'il fasse 0Cm. Il DOIT faire au moins 0.02Cm, sinon la Zone Ab NE FONCTIONNE PAS)
  4. Mettre le code suivant dans "Au Formatage" de la section de regroupement :
  5. Private Sub GROGenreFruit_Format(Cancel As Integer, FormatCount As Integer)
    Me.ScaleMode = 3
    Me.Line (1, 1)-(EDICompteFruit * 10, 30), 255, BF
    End Sub

  6. Le résultat est qu'un rectangle rouge de taille relative au nombre de fruit apparaît à gauche de la catégorie du fruit.

Règles horizontales et verticales

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

Génération de marges par défaut

sans avoir besoin de les redéfinir à chaque état, il faut aller (en mode création) dans AFFICHAGE/OPTIONS/IMPRESSION

Garder en mémoire la mise en page (par exemple les tailles de marges)

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.

Impression sur plusieurs colonnes

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

En-têtes et regroupement

Exiger la répétition du titre en haut des pages et des 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

Evénement "Au Formatage"

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

Forcer le passage à la colonne suivante

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

Insérer un saut de page avant chaque 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

VB : Supprimer un saut de page seulement sur la première page

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

Eviter un détail vide dans un état avec regroupement

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

Affichage d'un groupe avec toutes ses données sur une seule page

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.

Regroupement par semaine

la semaine commence au lundi et se termine le dimanche

Source d'enregistrements sous-jacente

Problème de champs de même noms pour un état basé sur plusieurs tables

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]

Diverses astuces

Ecriture de texte dynamique : Print

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

Ecrire plusieurs lignes avec Print

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…