Sommaire
- Démonstration théorique des sous-formulaires
- Création indépendante d'un formulaire qui servie de sous-forumulaire
- Incrustation d'un sous formulaire dans un formulaire
- Gestion de la liaison des données entre le sous-formulaire et le formulaire principal : Champ père et chanp fils
- Amélioration de l'aspect des sous-formulaires avec Access 2000
- Subtilités de sélection du sous-formulaire
- Schéma récapitulatif de l'utilisation d'un sous-formulaire
- Pré-détermination du champ fils dans le sous-formulaire
- Erreur : Testons un changement de champ-fils intempestivement
- Fonctionnement du sous-formulaire lors de la création d'un nouvel enregistrement dans le formulaire principal
- Dangers liés au changement possible des données du champ fils
- Il devient impossible d'utiliser le sous-formulaire comme un formulaire indépendant
- Astuce : Masquer le champ fils pour éviter les confusions et les erreurs de saisie
- Visualisation d'un sous-formulaire imbriqué dans un formulaire principal de manière conviviale
Enfin ! Depuis le temps que j'en entend parler de ces sous-formulaires !
Démonstration théorique des sous-formulaires
Eh bien, c'est enfin le moment d'aborder le sujet. Pour vous donner une idée de ce que sera le résultat final, le voici, sans fioritures :
Le principe est simple : Dans la partie de gauche, vous avec le formulaire principal : Il s'agit d'un formulaire en mode Colonne (Je vous conseille de réviser la leçon 29 pour vous remémorer la différence entre un formulaire en mode Colonne et en mode Tableau). Cette partie de gauche est en fait un formulaire tout simple, basé sur T_Cours. Nous ne voyons d'ailleurs que les détails du Cours numéro 1. La partie de droite est constituée par ce fameux sous formulaire : C'est en fait un formulaire en mode Tableau qui est incrusté dans le formulaire principal, mais qui possède l'indispensable particularité de n'afficher QUE les élèves du cours numéro 1, car il s'agit dans la partie de droite du cours numéro 1. Le sous-formulaire est donc dépendant au niveau de l'IDCours de son formulaire principal. Il y a donc bien 2 formulaires bien distincts, mais dans ce contexte, l'un est incrusté dans l'autre, ce qui lui confère l'appellation de sous-formulaire. Vous l'aurez compris : Inutile d'essayer de rêver à songer d'imaginer un formulaire avec sous-formulaire si la structure sous-jacente des tables n'est pas parfaitement comprise et appliquée, ce qui explique pourquoi vous avez fait tant de leçons avant d'en arriver là.
Compris. Alors, commente ça se passe, concrètement ?
Avant de commencer, je vous conseille peut-être de réviser les leçons sur les formulaires, afin de ne pas devoir réfléchir sur des choses qui sont normalement acquises. Je pense aux leçons 29, 30 et31 surtout.OK. Je me suis rafraîchi la mémoire, allons-y !
Bien. Pour commencer, vous allez créer un nouveau formulaire, basé sur T_Cours, qui va avoir a peu près cette apparence :
Création indépendante d'un formulaire qui servie de sous-forumulaire
Maintenant, tout à fait indépendamment, vous allez créer, avec le formulaire assistant tableau, un formulaire basé sur T_Eleve, qui va ressemble à ceci en mode création :

Actuellement, vous avez donc à disposition deux formulaires distincts, qui fonctionnent parfaitement l'un sans l'autre, il n'y a actuellement aucune interaction entre eux : F_Cours liste les cours, un cours par écran, F_Eleve liste les élèves et leur numéro de cours, plusieurs enregistrements par écran, tout bêtement. Jusque-là, rien de magique, donc.
Mais maintenant, on va incruster F_Eleve dans F_Cours, c'est ça ?
Incrustation d'un sous formulaire dans un formulaire
C'est ça. Ouvrez F_Cours en mode création. Affichez la boîte à outils (Affichage/Boîte à outils). Cliquez sur la baguette magique de manière à ce qu'elle ne donne pas l'impression d'être enfoncée :
Cliquez sur le contrôle sous-formulaire de la boîte à outils :


C'est juste maintenant que la magie va opérer : Nous allons préciser à Access que ce sous formulaire va contenir en fait le formulaire en mode tableau F_EleveSF.
Gestion de la liaison des données entre le sous-formulaire et le formulaire principal : Champ père et chanp fils
Pour ce faire, en mode création, demandez les propriétés de ce grand rectangle blanc (Bouton droit/propriétés). Dans l'onglet Donnée, il y a 3 propriétés qui vons nous intéresser : Objet source, Champ père et Champ fils :





Amélioration de l'aspect des sous-formulaires avec Access 2000
ATTENTION : avec Access 2000, vous continuerez à voir le sous formulaire correctement :
Nous allons donc faire un test amusant : allez dans les propriétés du sous formulaire. Attention encore, ne cliquez pas deux fois sur le sous formulaire en mode création, car dans le cas ou vous avez access 2000, c'est carrément le sous formulaire qui va s'activer (exactement comme les graphiques à la leçon 55), et dans le cas d'Access 97, il va carrément s'ouvrir devant l'autre, dans une nouvelle fenêtre.
Subtilités de sélection du sous-formulaire
En fait, c'est vachement délicat : Je m'afresse ici aux utilisateurs d'Access 2000 : en mode création :- Si vous ne cliquez pas sur le sous formulaire, il ressemble à ça :

- Si vous cliquez une fois sur le sous formulaire, c'est la zone d'accueil du sous-formulaire qui est sélectionnée :

- Et si vous recliquez encore une fois sur ce sous formulaire, il apparait comme ceci :

Dans notre cas, pour faire l'expérience amusante que je vous proposais, il s'agit de demander les propriétés de la zone d'accueil du sous formulaire :



Remettez maintenant le champ père et fils à IDCours :

Schéma récapitulatif de l'utilisation d'un sous-formulaire
Voici un schéma récapitulatif sur par exemple le cours numéro 3 :
Pré-détermination du champ fils dans le sous-formulaire
Alors là, je vois qu'en dessous de Jacques Bondernier, il y a une place vide, mais il y a déjà le numéro 3
, qu'est ce que ça veut dire ?
Ca veut dire que c'est très bien fait ! En fait, cette ligne n'existe pas encore - comme dans les tables, la dernière ligne n'est pas une vraie ligne, c'est juste un espace pour écrire. Eh bien ici, c'est pareil, sauf que grâce à cette histoire de champ père champ fils, Access à l'extrême bon goût de déjà nous indiquer que le prochain élève fera partie du numéro 3. On le sait que c'est le numéro 3, puisque dans F_Cours, c'est ce qui est écrit, mais je vous rappelle quand même qu'il est indispensable de répéter ce numéro dans la table T_Eleve pour faire la liaison... Alors, on dit Merci Access !Faison un test. Pour le cours numéro 3, il y a Maria Potache qui s'inscrit. Ajoutez-là, et surtout, à l'instant ou vous écrivez la première lettre P de Potache, remarquez qu'une nouvelle ligne apparait pour encore ajouter quelqu'un


Et dans la table T_Eleve, elle s'est rajoutée au numéro 3 ?
Exactement. regardez la table :
Erreur : Testons un changement de champ-fils intempestivement
Et qu'est-ce qui se passe si dans le cours numéro 3, je change le 3 de Potache Maria en 1 par exemple, comme ceci :
?
Il va se laisser faire. Mais quand vous allez changer d'enregistrement, par exemple vous placer sur le cours numéro 4, et revenir sur le 3, vous aurez la surprise de voir que Maria Potache à disparu! Eh oui, c'est normal, parce que le champ père champ fils, ce n'est pas bien compliqué : En numéro 3, il voit 3 personnes, il les affiche, point. Et par contre, dans la même logique, si vous vous posistionnez sur le premier cours, vous allez constater que Maria Potache est maintenant inscrite au cours 1 : 
Fonctionnement du sous-formulaire lors de la création d'un nouvel enregistrement dans le formulaire principal
Et comment est-ce que ça se passe quand je suis sur un NOUVEAU cours ?
Très simplement. Déplacez-vous sur un nouveau cours :


C'est vraiment très cool ! Et donc, je suis en train d'y penser, on ne peut pas commencer à écrire les élèves sans que le cours ne soit rempli, ou en tout cas pas tant qu'il n'y a pas de numéro attribué à ce cours
Effectivement, vous avez saisi : Si vous essayez d'entrer des élèves alors que le cours n'a pas de numéro, ça va très mal se passer. Vous pouvez essayer pour voir ce que ça fait, et ensuite aller voir dans les tables ce qui s'est passé. Comme vous voulez...Dangers liés au changement possible des données du champ fils
OK. Je reviens juste à ce qu'on disait tout à l'heure : Si on change un IDCours dans F_EleveSF, cet élève se verra tout à coup inscrit dans un autre cours.... C'est pas un peu dangereux, ça ?
Ah ben si... On pourrait bloquer le champ IDCours de T_Eleve (Activé = Non, verrouillé = Oui : C'était à la leçon 37)Ou alors... ne pourrait-on pas carrément l'effacer du sous-formulaire ? Comme ça, y'a plus de doutes...
Essayons. En mode création, les utilisateurs d'Access 2000 n'auront pas rop de difficultés à effacer IDCours et son étiquette, mais les utilisateurs d'Access 97 devront cliquer deux fois sur la zone d'accueil du sous-formulaire pour l'activer, et ensuite fermer le formulaire F_EleveSF pour revenir à F_Cours.Bref, dans un cas comme dans l'autre, effacez l'étiquette et le champ IDCours de manière à avoir cet affichage :

Il devient impossible d'utiliser le sous-formulaire comme un formulaire indépendant
D'accord : Mais, est-ce que si j'ajoute un nouvel élève à un cours existant, par exemple j'ajoute Kevin Cankre à ce cours, va-t-il bien se comporter ?
Essayons :

Astuce : Masquer le champ fils pour éviter les confusions et les erreurs de saisie
Vous allez le remettre en place (en le faisant glisser depuis la liste des champs) : attention, parce que comme vous n'avez pas beaucoup de place pour le poser, je vous conseille la manière suivante :- Faites glisser le champ IDCours dans le pied de formulaire :
- Coupez-collez l'étiquette IDCours dans l'en-tête de formulaire :
- Réduisez le champ IDCours de manière à ce qu'il rentre à côté de IdentiteEleve :
- Faites glisser à la souris le champ IDCours dans le Détail, à côté de IdentiteEleve :
- Et enfin, réduisez le pied de formulaire (la grille) :







Visualisation d'un sous-formulaire imbriqué dans un formulaire principal de manière conviviale
Vous voià avec un formulaire et sous formulaire tout beau et tout convivial :
Nous allons nous arrêter là pour cette leçon vous pouvez tout fermer.
Bon... Hem... On peut résumer ?
Qui dit "Un objet qui a un certain nombre de sous-objets" dit "Deux tables" et dit par conséquent "Formulaire avec sous formulaire". Le sous formulaire est un outil terriblement efficace pour entrer les données dans deux tables "A la fois". Effectivement, quand on saisit les données dans un formualire avce sous formulaire, on a vraiment l'impression qu'on est dans une seule table. Le formualire principal est toujours en mode Colonne (un enregistrement par écran), tandis que le sous formulaire est quasiment toujours en mode tableau (plusieurs enregistrement par écran, ligne par ligne). C'est ce qu'on a vu : Nous ne voyons d'un seul coup d'oeil qu'un seul cours, mais nous voyens en même temps tous les élèves de ce cours. Le sous-formulaire n'est d'ailleurs rien d'autre qu'un formulaire tout bête en mode tableau que nous incrustons dans un autre formulaire avec l'icône Sous-formulaire/sous-état que nous trouvons dans la boîte à outils des formulaires. Il est bien endendu qu'il est exclu de créer des sous formulaires si la structure des tables n'est pas parfaitement cofhérentes : La plupart du temps il faut qu'il y ait une relation avec intégrité référentielle entre la table principale qui va servir de base au formualire principal, et la sous-table qui va servir de base au sous formulaire. Le schéma est toujours le même à de très rares exceptions près : Un objet X contient des sous objets Y : La table qui contient les X sera à la base du formulaire principal, et la sous table des Y sera la base du sous formulaire. Une fois que vous avez compris ça, vous avez compris pas mal de choses. |
Avez-vous bien compris ?
|
Exercice
L'exercice consiste à reprendre les deux bases de données de l'exercice de la leçon précédente : Critique.mdb, et ViveLamour.mdb. Vous allez simplement créer, pour chacune des deux bases de données un formulaire avec sous formulaire. Le formulaire avec sous formulaire de Critique.mdb devra ressembler à ça :![]() ![]() |
0 commentaires:
Enregistrer un commentaire