I. Introduction▲
L'utilisation du contrôle d'onglet est souvent très intéressante lorsqu'on a besoin d'afficher beaucoup d'informations sur un formulaire. Hormis l'organisation des champs à afficher par thème afin d'alléger l'interface, celui-ci permet aussi d'organiser l'affichage du résultat d'une requête concernant plusieurs thèmes différents.
À partir de là, comment savoir dans quel onglet la requête retourne des informations ?
Quelle galère pour l'utilisateur, s'il doit cliquer sur chaque onglet afin de voir si un enregistrement est renvoyé pour un thème donné.
L'objectif de ce petit article est donc de montrer comment afficher un repère dans le ou les onglets qui contiennent une information répondant au critère posé.
II. Le cahier des charges▲
Notre base de données gère une petite bibliothèque.
Afin de faciliter le travail du bibliothécaire, nous devons afficher dans un sous-formulaire, le résultat de la recherche des ouvrages écrits par un auteur sélectionné.
Afin de rendre plus pratique sa recherche, nous devons :
- lui mettre à disposition une liste déroulante affichant les auteurs disponibles ;
- ventiler le résultat par catégorie de lecteurs (Adulte - Adolescent - Enfant).
|
Le formulaire de consultation (cf. l'image ci-contre) affichera donc : |
III. Les tables▲
Afin de prendre en main la base et les tables qui entrent en jeu, vous trouverez ci-dessous le modèle relationnel.
IV. Le formulaire de consultation▲
Le formulaire se compose donc d'une liste déroulante qui nous permettra de sélectionner un auteur et d'un contrôle d'onglets contenant les sous-formulaires (tous identiques, un par catégorie de lecteur) affichant les résultats des différentes requêtes.
IV-A. La liste déroulante▲
Cette liste déroulante est basée sur une requête qui récupère les données de la table T_Auteur.
Pour les débutants, nous allons reprendre les différentes étapes de la construction de la liste, puis nous allons contrôler les différentes propriétés modifiées et enfin nous allons intervenir directement dans le contenu de la source afin d'afficher le nom et le prénom de l'auteur concaténés comme demandé dans le cahier des charges.
IV-A-1. Étape 1 : Sélection du type de la source des données▲
|
Nous allons créer un nouveau formulaire indépendant (c'est-à-dire sans source attachée à celui-ci). |
Petit rappel sur les choix disponibles :
Choix « Je veux que la liste déroulante recherche… » : la liste sera dynamique (fonction du contenu de la table source) ;
Choix…« Je taperai les valeurs … » : liste statique, la mise à jour de la liste devra passer par une séquence de code (voir dans la F.A.Q : Ajouter une valeur dans une liste).
Puis cliquez sur « Suivant ».
IV-A-2. Étape 2 : Choisir la table source▲
|
Lors de cette étape, il nous faut choisir la table source de notre liste déroulante. |
IV-A-3. Étape 3 : Choisir les champs sources de la liste déroulante▲
|
Il est temps maintenant de sélectionner les champs qui s'afficheront dans notre liste déroulante. |
IV-A-4. Étape 4 : Choisir les clés de tri▲
|
Nous passerons l'étape 4 qui permet de choisir de trier le contenu de la liste sur un ou plusieurs champs. |
IV-A-5. Étape 5 : Modifier la largeur de colonne▲
|
Cette étape a pour but de redimensionner les colonnes de la liste. On ne perdra pas de vue que seule la première colonne visible sera affichée dans la liste, mais que toutes les autres seront affichées lors de l'ouverture de la liste déroulante. |
IV-A-6. Étape 6 : Changer la légende de la liste▲
|
Durant cette étape, nous saisissons la légende de notre contrôle et non le nom de l'objet qu'il faudra modifier via les propriétés. |
IV-A-7. Que s'est-il passé au niveau du contrôle ?▲
Lors de la création de notre liste déroulante, tout en suivant les différentes étapes de la création, Access a modifié les propriétés de notre contrôle.
Passons en revue les modifications.
|
En affichant la fenêtre des propriétés (clic droit sur le contrôle puis clic sur Propriétés), on trouvera deux onglets concernés par les modifications. |
|
2) L'onglet Format : |
Nous avions choisi deux champs (nom_auteur et prenom_auteur). Rappelons-nous qu'Access avait ajouté d'office la clé primaire !
IV-A-8. Modifier le nom de notre contrôle liste déroulante▲
|
Lors de l'étape 6 nous avions, à la demande de l'assistant, modifié l'étiquette de notre liste déroulante. J'avais alors insisté sur le fait qu'il était nécessaire de nommer tout objet placé sur le formulaire (ou sur un état). |
IV-A-9. Concaténation des deux champs▲
IV-A-9-a. Définition▲
La concaténation est une opération permettant la juxtaposition de deux expressions alpha ou numérique. Le résultat sera une expression de type texte.
L'opérateur à utiliser : &
Exemples :
bon & jour -> bonjour
1 & 2 -> 12
La modification du contenu de la liste (donc de la syntaxe SQL générée automatiquement par ACCESS) peut se faire en direct dans la propriété correspondante ou par l'intermédiaire de l'assistant requête.
J'opte pour cette seconde solution, plus simple pour les débutants.
IV-A-9-b. Étape 1 : Afficher la requête source de la liste▲
|
Pour afficher notre requête, il nous faut passer par la fenêtre des propriétés : |
IV-A-9-c. Étape 2 : Modifier la structure de la requête▲
|
Dans cette étape nous procèderons à trois opérations : |
Les modifications de la structure de la requête étant terminées, il suffit de fermer l'interface et répondre par l'affirmative à la demande de sauvegarde des modifications de la syntaxe SQL. De retour à la fenêtre des Propriétés, validez la nouvelle syntaxe en faisant Entrée.
Nous mettons un espace entre guillemets afin de séparer le nom et le prénom lors de la concaténation.
IV-A-9-d. Étape 3 : Modifier les propriétés de la liste déroulante▲
|
La structure étant modifiée, les paramètres des propriétés enregistrées lors de l'utilisation de l'assistant sont devenus obsolètes. |
Remarquez que les dimensions de colonnes sont indiquées en cm. Il est inutile de saisir cette unité, Access l'ajoute automatiquement.
Voilà, nous en avons terminé avec notre liste déroulante, vous pouvez fermer votre formulaire et l'enregistrer sous le nom de F_Consultation. Nous allons maintenant créer les différents sous-formulaires que nous insèrerons dans un contrôle à onglets.
IV-B. Les sous-formulaires par catégorie▲
Afin de simplifier la mise en forme, l'affichage des sous-formulaires sera de type feuille de données.
Les trois sous-formulaires étant identiques, on pourra procéder à une copie de l'objet et seul le critère de sélection dans la requête source sera à modifier.
IV-B-1. Création de la requête source▲
|
Nous allons créer une nouvelle requête. |
La requête étant terminée, sauvegardez celle-ci sous le nom : R_OuvragesEnfant.
Procédez à la copie de cette requête deux fois en prenant soin de modifier la valeur du critère de sélection de la catégorie.
Sauvegardez ces copies en les nommant successivement : R_OuvragesAdo et R_OuvragesAdulte.
IV-B-2. Création du sous-formulaire▲
|
Créez un nouveau formulaire en lui donnant comme source : R_OuvragesEnfant. |
IV-B-3. Modifier les propriétés du formulaire▲
Le cahier des charges nous demande un affichage en mode feuille de données. Pour optimiser l'affichage, nous allons modifier quelques propriétés. |
Ce sous-formulaire étant terminé, enregistrez -le sous le nom de F_OuvragesEnfant.
Il ne reste plus qu'à copier cet objet et à changer la source en conséquence.
Sauvegardez les copies sous les noms de F_OuvragesAdo et F_OuvragesAdulte.
IV-C. L'insertion des sous-formulaires▲
IV-C-1. Implantation du contrôle Onglet▲
|
|
Pour créer le contrôle, cliquez :
- Version 2007 : dans le ruban sur l'onglet Outils de création de formulaire puis onglet Créer puis sur l'outil Contrôle d'onglet ;
- Versions antérieures : dans la boîte à outils, clic sur l'outil Contrôle Onglet.
Cliquez ensuite sur le formulaire et redimensionnez l'objet créé en fonction de la dimension des sous-formulaires à incorporer puis renommez le contrôle ctlConsultation (voir l'image ci-dessus à droite).
Enfin, nous avons besoin de trois onglets pour afficher les résultats de nos requêtes. Il nous faut en insérer un supplémentaire :
cliquez à droite du dernier onglet avec le bouton droit de la souris puis, dans le menu contextuel, choisissez : Insérer une page (voir l'image ci-dessus à gauche).
Il faut maintenant identifier les onglets :
|
Affichez la fenêtre des Propriétés et cliquez sur l'onglet Toutes. |
Recommencez cette opération pour les trois onglets en donnant successivement :
- Nom : pgAdo / Légende : Adolescent ;
- Nom : pgAdulte / Légende : Adulte.
Dans Access, les onglets sont appelés des pages.
IV-C-2. Implantation du sous-formulaire dans le contrôle Onglet▲
|
|
L'insertion d'un sous-formulaire dans un contrôle d'onglet est une opération simple.
- Activez l'onglet qui doit recevoir le sous-formulaire.
- Suivant la version :
Antérieures à 2007 : affichez la fenêtre base de données (F11) puis cliquez maintenu sur le nom du sous-formulaire ;
Version 2007 : cliquez maintenu sur le nom du sous-formulaire affiché dans le volet de gauche.
Glissez dans le sous-formulaire. Lorsque le cadre noir apparaît, lâchez la souris.
Maintenant, il nous faut relier le formulaire principal et le sous-formulaire.
Pour cela, affichez la fenêtre des Propriétés :
- cliquez sur l'onglet Données ;
- modifiez les deux propriétés ci-dessous :
- Champs pères : saisir cboAuteur (nom de la liste déroulante);
- Champs Fils : saisir code_auteur (champ présent dans la requête source du sous-formulaire).
L'implantation est terminée. Il suffit de renouveler ces opérations sur les deux autres onglets avec les deux autres sous-formulaires sans oublier de modifier les propriétés.
IV-D. Le code d'affichage des repères▲
IV-D-1. À l'ouverture du formulaire▲
Ouvrez le formulaire principal en mode création et affichez la fenêtre des propriétés du formulaire, cliquez sur l'onglet Évènements et recherchez dans la liste l'évènement Sur ouverture. Cliquez dans la ligne puis sur le bouton liste déroulante (voir image ci-contre) et choisissez Procédure évènementielle. Enfin cliquez sur le bouton affichant les points de suspension. |
Nous sommes dans l'éditeur de VBA (interface VBE : Visual Basic Editor). C'est ici que nous allons saisir les lignes de code permettant d'implanter les images à l'ouverture du formulaire. Le curseur étant placé entre deux lignes présaisies :
Private
Sub
Form_Open
(
Cancel As
Integer
)
End
Sub
Saisir les lignes suivantes :
' Initialisation des images des onglets
Me.pgEnfant.Picture
=
CurrentProject.Path
&
"\image\livreferme.ico"
Me.pgAdo.Picture
=
CurrentProject.Path
&
"\image\livreferme.ico"
Me.pgAdulte.Picture
=
CurrentProject.Path
&
"\image\livreferme.ico"
Pour avoir de plus amples informations sur la gestion des images dans une base de données, je vous conseille la lecture du tuto de Caféine : Gestion des images et des photos.
IV-D-2. Après sélection d'un auteur▲
Ce code concerne la liste déroulante. Chaque fois que je choisis un nouvel auteur, les sous-formulaires se mettent à jour grâce au lien champ père/Champ fils, mais je ne sais pas qui contient des enregistrements.
Nous allons écrire une procédure qui va calculer le nombre d'enregistrements récupérés par chaque requête source des sous-formulaires.
Cette procédure sera placée sur l'évènement Après MAJ de la liste déroulante.
Affichez les propriétés de la liste déroulante et cliquez sur l'onglet Évènements. Positionnez-vous dans l'évènement Après MAJ et choisissez Procédure évènementielle puis cliquez sur les points de suspension. (Idem que ci-dessus pour la procédure sur l'ouverture du formulaire.)
La procédure se divise en plusieurs parties :
1) Déclaration des variables ;
2) Initialisation des variables ;
3) Traitement.
IV-D-2-a. Déclaration des variables▲
Nous allons exécuter en arrière-plan les requêtes sources des sous-formulaires. Pour cela nous aurons besoin de zones de travail (dites variables en programmation).
' Déclaration des variables
' Variable représentant la base de données en cours
Dim
MaBase As
DAO.Database
' Variables contenant des enregistrements
Dim
rsEnfant As
DAO.Recordset
, rsAdo As
DAO.Recordset
, rsAdulte As
DAO.Recordset
' Variables stockant le nombre d'enregistrements récupérés
Dim
intEnfant As
Integer
, intAdo As
Integer
, intAdulte As
Integer
' Variables de type texte permettant de stocker les syntaxes des requêtes
' Variable représentant la partie SELECT de la requête
Dim
strRequete As
String
' 2 Variables pour la catégorie Enfant : la partie condition et la concaténation de la requête de base et la partie conditionnelle
Dim
strWhereEnfant As
String
,strEnfant As
String
' 2 Variables pour la catégorie Adolescent : la partie condition et la concaténation de la requête de base et la partie conditionnelle
Dim
strWhereAdo As
String
, strAdo As
String
' 2 Variables pour la catégorie Adulte : la partie condition et la concaténation de la requête de base et la partie conditionnelle
Dim
strWhereAdulte As
String
, strAdulte As
String
' Variable représentant un onglet
Dim
pgOnglet As
Page
IV-D-2-b. Initialisation des variables▲
Une fois les variables déclarées, nous allons les initialiser :
' Initialisation de la Variable Base de données
Set
MaBase =
CurrentDb
' Intitalisation de la partie commune de la requête
strRequete =
"SELECT T_Auteur.code_auteur, T_Livres.titre, T_Genre.genre FROM "
_
&
"T_Categorie INNER JOIN "
_
&
"(T_Genre INNER JOIN "
_
&
"(T_Auteur INNER JOIN T_Livres "
_
&
"ON T_Auteur.code_auteur = T_Livres.code_auteur) "
_
&
"ON T_Genre.code_genre = T_Livres.code_genre) "
_
&
"ON T_Categorie.code_categorie = T_Livres.code_categorie "
' Création de la clause de condition avec récupération de la valeur stockée dans la liste déroulante (Concaténation)
strWhereEnfant =
"WHERE T_Categorie.code_categorie = 1 AND T_Auteur.code_Auteur = "
&
Me.cboAuteur
' Concaténation de la requête de base et de la clause WHERE
strEnfant =
strRequete &
strWhereEnfant &
";"
' Création de la clause de condition avec récupération de la valeur stockée dans la liste déroulante (Concaténation)
strWhereAdo =
"WHERE T_Categorie.code_categorie = 2 AND T_Auteur.code_Auteur = "
&
Me.cboAuteur
' Concaténation de la requête de base et de la clause WHERE
strAdo =
strRequete &
strWhereAdo &
";"
' Création de la clause de condition avec récupération de la valeur stockée dans la liste déroulante (Concaténation)
strWhereAdulte =
"WHERE T_Categorie.code_categorie = 3 AND T_Auteur.code_Auteur = "
&
Me.cboAuteur
' Concaténation de la requête de base et de la clause WHERE
strAdulte =
strRequete &
strWhereAdulte &
";"
IV-D-2-c. Traitement▲
Les éléments pour faire le traitement sont prêts. Celui-ci se déroule en quatre temps :
1) Exécution des requêtes ;
2) Récupération du nombre d'enregistrements ;
3) Affichage des repères ;
4) Fermeture et libération des RecordSet.
IV-D-2-c-i. Exécution des requêtes▲
' exécution des requêtes
Set
rsEnfant =
MaBase.OpenRecordset
(
strEnfant)
Set
rsAdo =
MaBase.OpenRecordset
(
strAdo)
Set
rsAdulte =
MaBase.OpenRecordset
(
strAdulte)
IV-D-2-c-ii. Récupération du nombre d'enregistrements▲
' repérage du nombre d'enregistrements de chaque requête
intEnfant =
rsEnfant.RecordCount
intAdo =
rsAdo.RecordCount
intAdulte =
rsAdulte.RecordCount
IV-D-2-c-iii. Affichage des images▲
' Affichage des images
Set
pgOnglet =
Me.pgEnfant
' Empêche Access de redessiner l'onglet à chaque appel de la procédure
Me.Painting
=
False
' Appel de la routine d'affichage
Call
AfficherRepere
(
pgOnglet, intEnfant)
Set
pgOnglet =
Me.pgAdo
Call
AfficherRepere
(
pgOnglet, intAdo)
Set
pgOnglet =
Me.pgAdulte
Call
AfficherRepere
(
pgOnglet, intAdulte)
' Met à jour les onglets en une seule fois
Me.Painting
=
True
On peut remarquer dans cette procédure l'instruction : Call AfficherRepere(pgOnglet, intAdulte)
Cet appel évite de réécrire plusieurs fois les mêmes instructions. Cette procédure est écrite à la suite des autres procédures évènementielles.
Ci-dessous le détail de la procédure :
Sub
AfficherRepere
(
pgOnglet As
Page, NbrEnregistrements As
Integer
)
' Teste le nombre d'enregistrements dans la requête
If
NbrEnregistrements =
0
Then
pgOnglet.Picture
=
CurrentProject.Path
&
"\image\livreferme.ico"
Else
pgOnglet.Picture
=
CurrentProject.Path
&
"\image\livreouvert.ico"
End
If
End
Sub
IV-D-2-c-iv. Fermeture et libération des RecordSet▲
' Fermeture et libération des Recordset
rsEnfant.Close
Set
rsEnfant =
Nothing
rsAdo.Close
Set
rsAdo =
Nothing
rsAdulte.Close
Set
rsAdulte =
Nothing
IV-D-2-d. Intégralité de la procédure▲
Voici ci-dessous l'intégralité de la procédure :
Private
Sub
cboAuteur_AfterUpdate
(
)
' Déclaration des variables
Dim
MaBase as
DAO.CurrentDb
Dim
rsEnfant As
DAO.Recordset
, rsAdo As
DAO.Recordset
, rsAdulte As
DAO.Recordset
Dim
intEnfant As
Integer
, intAdo As
Integer
, intAdulte As
Integer
Dim
strRequete As
String
Dim
strEnfant As
String
, strWhereEnfant As
String
Dim
strAdo As
String
, strWhereAdo As
String
Dim
strAdulte As
String
, strWhereAdulte As
String
Dim
pgOnglet As
Page
' Initialisation des variables
Set
MaBase =
CurrentDb
strRequete =
"SELECT T_Auteur.code_auteur, T_Livres.titre, T_Genre.genre FROM "
_
&
"T_Categorie INNER JOIN "
_
&
"(T_Genre INNER JOIN "
_
&
"(T_Auteur INNER JOIN T_Livres "
_
&
"ON T_Auteur.code_auteur = T_Livres.code_auteur) "
_
&
"ON T_Genre.code_genre = T_Livres.code_genre) "
_
&
"ON T_Categorie.code_categorie = T_Livres.code_categorie "
strWhereEnfant =
"WHERE T_Categorie.code_categorie = 1 AND T_Auteur.code_Auteur = "
&
Me.cboAuteur
strEnfant =
strRequete &
strWhereEnfant &
";"
strWhereAdo =
"WHERE T_Categorie.code_categorie = 2 AND T_Auteur.code_Auteur = "
&
Me.cboAuteur
strAdo =
strRequete &
strWhereAdo &
";"
strWhereAdulte =
"WHERE T_Categorie.code_categorie = 3 AND T_Auteur.code_Auteur = "
&
Me.cboAuteur
strAdulte =
strRequete &
strWhereAdulte &
";"
' Traitement
'----------------
' exécution des requêtes
Set
rsEnfant =
MaBase.OpenRecordset
(
strEnfant)
Set
rsAdo =
MaBase.OpenRecordset
(
strAdo)
Set
rsAdulte =
MaBase.OpenRecordset
(
strAdulte)
' repérage du nombre d'enregistrements du résultat
intEnfant =
rsEnfant.RecordCount
intAdo =
rsAdo.RecordCount
intAdulte =
rsAdulte.RecordCount
' Affichage des images
Set
pgOnglet =
Me.pgEnfant
' Empêche Access de redessiner l'onglet à chaque appel de la procédure
Me.Painting
=
False
' Appel de la routine d'affichage
Call
AfficherRepere
(
pgOnglet, intEnfant)
Set
pgOnglet =
Me.pgAdo
Call
AfficherRepere
(
pgOnglet, intAdo)
Set
pgOnglet =
Me.pgAdulte
Call
AfficherRepere
(
pgOnglet, intAdulte)
' Met à jour les onglets en une seule fois
Me.Painting
=
True
' Libération des Recordset
rsEnfant.Close
Set
rsEnfant =
Nothing
rsAdo.Close
Set
rsAdo =
Nothing
rsAdulte.Close
Set
rsAdulte =
Nothing
End
Sub
V. Conclusion▲
L'utilisation du contrôle Onglet est évidente dans la création des interfaces contenant beaucoup d'informations. J'espère que cette petite application vous ouvrira de nouveaux horizons dans la création de vos futures interfaces.
VI. Remerciements▲
Je voudrais remercier l'ensemble de l'équipe DVP qui fait un travail énorme, qui a fait de Développez.com ce qu'il est aujourd'hui et qui nous tire toujours vers le haut.
Merci également à Arkham46, Philippe Jochmans, User et Tofalu pour leurs précieux conseils.
Merci à Chtulus et Claude Leloup pour leur relecture attentive.
VII. Téléchargement▲
La base exemple est disponible en suivant ce lien :
Afficher les repères dans les onglets