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…