Académique Documents
Professionnel Documents
Culture Documents
EXPLOITATION
D’UN SCHÉMA DE DONNÉES
TRAVAUX PRATIQUES
Retrouvez la liste de nos formations sur www.cned.fr
Pour plus d’informations, appelez le 05 49 49 94 94
Du lundi au vendredi, 8 h 30-18 h.
Coût d’une communication ordinaire.
*82949TGPA0013*
Sommaire
Conseils généraux 3
TP 1 : Logiciel de gestion de DVD 5
TP 2 : Optimisation par les contraintes de la base « Tour de France » 25
Les cours du CNED sont strictement réservés à l’usage privé de leurs destinataires et ne sont pas destinés à une utilisation collective.
Les personnes qui s’en serviraient pour d’autres usages, qui en feraient une reproduction intégrale ou partielle, une traduction sans
le consentement du CNED, s’exposeraient à des poursuites judiciaires et aux sanctions pénales prévues par le Code de la propriété
intellectuelle. Les reproductions par reprographie de livres et de périodiques protégés contenues dans cet ouvrage sont effectuées
par le CNED avec l’autorisation du Centre français d’exploitation du droit de copie (20, rue des Grands Augustins, 75006 Paris).
© CNED 2013
Conseils généraux
Importance des TP
Dans le cadre du cours, vous avez eu l’occasion d’approfondir certaines notions (aussi
bien au niveau du SQL que du MCD) et de découvrir l’utilisation du logiciel de modé-
lisation WinDesign. Les TP représentent une mise en pratique qui va vous donner l'op-
portunité de manipuler concrètement ces notions. Au niveau de l’examen, il faut que
vous arriviez à montrer au jury que vous avez une certaine expérience. Ce sont les TP de
chaque module qui vont vous permettre d’acquérir cette expérience.
Organisation du fascicule
Ce fascicule contient 2 TP.
Le premier TP représente la création d’une petite application de gestion de DVD. Le
but est de vous faire utiliser le logiciel de modélisation WinDesin pour contrôler que les
connaissances abordées dans le cours sont acquises, puis vous faire exploiter une base de
données dans une application. La base de données sera au format PostgreSQL. Pour cette
première application réalisée spécifiquement dans l’option SLAM, vous allez travailler
avec VB6 que vous avez découvert dans le module 2944 « Base de la programmation ».
Si vous n’avez pas fait le TP sur VB6 dans le module 2944, vous devez le faire avant d’at-
taquer celui-ci car les connaissances abordées dans le module 2944 sur ce langage sont
considérées comme acquises. Le but ici n’est pas de vous faire découvrir un nouveau
langage ni d’aborder des fonctionnalités complexes, mais de vous montrer comment
gérer une application qui exploite une base de données. Le choix du langage a été fait
pour que vous puissiez vous concentrer sur l’aspect base de données. Dans le module
suivant (2950 « Programmation objet »), vous attaquerez un nouveau langage (Java) où
Conseils généraux
vous aborderez des notions de programmation nettement plus complexes. Vous pouvez
télécharger la correction de ce TP directement sur le site du Cned, au même endroit que Page 3
ce fascicule.
Le second TP représente le travail que vous pourriez avoir à faire sur une base de don-
nées existante. Le but est de vous faire appliquer les contraintes découvertes dans la
partie cours. Vous verrez les manipulations graphiques ainsi que les instructions SQL
correspondantes.
Le dessin du petit professeur vous signalera les étapes de tests à réaliser.
Logiciels nécessaires
Pour réaliser les TP, vous allez avoir besoin de plusieurs outils que vous avez norma-
lement déjà installés puisqu’ils ont été utilisés soit dans le cours correspondant à ce
module, soit dans des modules précédents. Voici tout de même quelques rappels pour
récupérer et installer ces outils.
WinDesign
Le logiciel est téléchargeable à l’adresse suivante :
http://www.win-design.com/fr/NEW_dl_WD.htm
C’est la version 10.04 qui a été utilisée dans ce module.
Si vous ne l’avez pas encore installé, référez-vous aux conseils généraux et à la séquence 2
du fascicule de cours.
8 2949 TP PA 00
PostgreSQL
SGBDR gratuit et téléchargeable sur le site officiel (http://www.postgresql.fr/accueil). Ce
cours a utilisé la version 9.1 mais vous pouvez a priori récupérer la version la plus récente.
Ce SGBDR est l’un des plus connus et des plus appréciés dans le monde gratuit : il est très
puissant et multiplateforme.
Vous l’avez normalement déjà installé.
Visual Basic 6
Vous avez déjà installé Visual Basic 6 dans le module 2944 « Base de la programmation ».
Si ce n’est pas le cas, référez-vous aux conseils généraux du fascicule de TP du module
2944.
Ce langage est récupérable grâce à l’abonnement étudiant msdnaa dont vous bénéficiez
par le Cned.
Bon courage à tous !
Conseils généraux
Page 4
8 2949 TP PA 00
TP 1
Logiciel de gestion de DVD
Cette séquence va vous permettre de mettre en pratique les connaissances acquises dans
les séquences 1, 2 et 3 du cours. Vous allez en particulier utiliser le logiciel WinDesign et
créer une application qui accède et manipule une base de données sous PostgreSQL. Le
Langage VB6 a été choisi pour ce TP pour 2 raisons : vous avez déjà abordé ce langage
dans le module 2944 « Base de la programmation » Et, surtout, il est très simple, le but,
ici, n’étant pas d’aborder des aspects complexes de la programmation mais plutôt d’in-
sister sur l’aspect accès aux données. Les codes sources de cette application sont téléchar-
geables sur le site, au même endroit que ce fascicule de TP.
X Contenu
1. Création de la base de données ...................................................................... 6
2. Création de l’application ................................................................................ 10 TP 1
3. VB6 : complément de mémento .................................................................... 23
Logiciel
de gestion
de DVD
Page 5
8 2949 TP PA 00
Vous allez créer une petite application de gestion de DVD qui va exploiter une base de
données.
Voici les étapes que vous allez suivre pour créer cette application :
• création du schéma conceptuel de données sous WinDesign ;
• génération du schéma logique de données correspondant ;
• génération du script SQL ;
• création de la base de données sous PostgreSQL à partir du script ;
• création de l’application qui exploite cette base de données.
Page 6
8 2949 TP PA 00
À partir de ces indications, créez, sous WinDesign, le schéma correspondant et testez-le
avec l’outil de contrôle. Pensez à l’enregistrer sous le nom "gestionDvd", dans le dossier
de votre choix.
Génération du MLD
Générez le MLD correspondant, en choisissant le SGBDR PostgreSQL (sans oublier de
sélectionner l’utilisation par défaut des types de cette base de données).
Vous devriez obtenir le schéma suivant :
TP 1
Enregistrez ce MLD aussi sous le nom de "gestionDvd" (c’est en fait l’extension qui Logiciel
change). de gestion
de DVD
Génération du script SQL
Vous pouvez maintenant générer le script mais attention, gardez toutes les options Page 7
par défaut (ne décochez rien, contrairement à ce que vous aviez fait dans le cours, à la
séquence 2). Pensez tout de même à bien sélectionner le dossier qui va recevoir le fichier
de script.
Allez sur le disque et ouvrez le fichier SQL qui vient d’être créé. Il contient entre autres
tous les ordres de création des tables. Vous allez apporter une petite modification au
fichier en supprimant les lignes qui permettent de détruire et de créer la base de don-
nées (alors que vous allez créer la base de données vous-même sous PostgreSQL). Donc,
en début de fichier, supprimez les lignes qui commencent par :
drop database...
create database...
8 2949 TP PA 00
Démarrage
Dans le menu Démarrer/Programmes/PostgreSQL, sélectionnez "lancer le service". Une
fois le service lancé, dans le même menu, sélectionnez "pgAdmin III" qui est l’interface
graphique de postgreSQL. Vous obtenez la fenêtre suivante :
TP 1
Logiciel
de gestion
de DVD
Page 8
8 2949 TP PA 00
Une nouvelle fenêtre s’ouvre (comme celle-ci).
Donnez à votre base le nom GESTIONDVD, sélec-
tionnez dans "Propriétaire" le seul que vous devez
avoir (normalement "postgres") et prenez dans
Tablespace celui par défaut (pg_default). Cliquez
sur OK.
GESTIONDVD doit s’être ajouté en dessous de "Bases
de données".
Ouvrez GESTIONDVD en cliquant sur le "+" à gauche.
Vous obtenez des sous-parties dont "Schémas".
Dans une base de données, il est possible de créer
plusieurs "schémas" qui regroupent un ensemble de
tables. Dans notre exemple, un seul schéma suffira.
Pour le moment, laissez GESTIONDVD sélectionné :
on va exécuter sur cette base de données le script
qui a été précédemment créé.
Récupération du script
Pour exécuter du SQL sous pgAdmin, cliquez l’icone qui représente le SQL. Une nouvelle
fenêtre s’ouvre, qui permet d’exécuter des requêtes SQL. TP 1
Pour récupérer le script précédent, allez dans Fichier/ouvrir et allez chercher le fichier
Logiciel
gestionDvd.sql. Vous devriez obtenir dans la zone de visualisation l’ensemble du contenu de gestion
du fichier. Cliquez sur la flèche verte pour exécuter le script . Normalement, excepté de DVD
des messages précisant certaines créations automatiques (de séquences pour les clés
SERIAL et d’index pour les clés primaires), vous devriez obtenir le message final indiquant Page 9
que la requête s’est exécutée avec succès. Ne vous inquiétez pas si vous avez en complé-
ment de message qu’elle ne renvoie aucun résultat : c’est normal (il n’y a pas de requête
SELECT qui retourne un résultat).
Si, au contraire, vous obtenez un message d’erreur, c’est que votre script n’est pas cor-
rect : corrigez-le et recommencez.
Contrôlons que tout s’est bien passé : cliquez sur la double flèche de réactualisation et,
dans le navigateur d’objets, ouvrez "Schémas" avec le "+" puis ouvrez "public" (qui est
le schéma par défaut) avec le "+". Vous remarquez que vous avez entre autres "Tables".
Ouvrez-le : vous devez obtenir les 4 tables de la base de données.
Création des premiers tuples
Normalement, le travail sous PostgreSQL est terminé car la gestion du contenu de la base
de données va se faire dans l’application. Cependant, pour que l’on puisse voir dès le
début du programme que certains points fonctionnent, avant même d’utiliser les ordres
d’ajouts et de modification, vous allez remplir un peu les tables sous PostgreSQL.
Sélectionnez la table acteur dans la partie "Tables" du navigateur.
Cliquez sur l’icône "afficher les données de l’objet sélectionné". Normalement, une
nouvelle fenêtre apparaît, qui permet de visualiser le contenu de la table (vide,
pour le moment) mais aussi de saisir des informations. Saisissez 3 acteurs mais attention,
surtout ne saisissez pas d’informations dans la colonne numacteur (elle doit être auto-
8 2949 TP PA 00
matiquement gérée par PostgreSQL mais si vous saisissez des numéros, la numérotation
automatique ne marchera plus). Voici un exemple de ce que vous devez obtenir (mettez
les noms que vous voulez) :
Pour voir la numérotation automatique gérée par PostgreSQL, cliquez sur le bouton
rafraîchir (la double flèche rouge et verte). Vous allez voir apparaître des numéros dans
la première colonne. Vous pouvez maintenant fermer la fenêtre.
Avec la même logique, remplissez la table GENRE. Pour la table DVD, en la remplissant,
faites attention de mettre dans la colonne genre_numgenre un numéro de genre qui cor-
respond au genre du DVD. D’ailleurs, vous pouvez tester de mettre un numéro qui n’existe
TP 1 pas : vous allez obtenir une erreur car la contrainte d’intégrité créée avec la clé étrangère
n’est pas respectée. Enfin, pour la table ACTEUR_DVD, mettez dans les 2 champs des numé-
Logiciel ros qui correspondent respectivement à des acteurs et des DVD. Essayez de créer au moins
de gestion 2 acteurs pour un même DVD et 2 DVD pour un même acteur.
de DVD
Page 10
2. Création de l’application
Pour réaliser cette partie, pensez à vous référer au mémento VB6 qui se trouve à la fin
du fascicule de TP du module 2944 "Base de la programmation". À la fin de ce TP, vous
trouverez également un complément de mémento pour l’accès aux bases de données.
Pensez également à le regarder en cas de besoin.
Lancez VB6 et créez un projet en nommant la première fenêtre frmMenu et le projet
prjFilm (donnez ces noms aux fichiers en sauvant, mais aussi aux objets concernés dans
VB6). Ce projet va permettre de gérer la base de données de façon conviviale, à travers
des fenêtres et du code que vous allez créer.
8 2949 TP PA 00
Choisir le type de lien (middleware) avec le SGBDR
Il existe en effet différentes méthodes pour accéder aux bases de données. Généralement,
il faut installer un fichier qui est un driver de base de données (appelé aussi "mid-
dleware"), qui va servir d’interface entre le SGBDR et le langage, afin que les deux puis-
sent communiquer entre eux.
Installer et configurer le driver
Une fois votre choix fait (ici, il va vous être imposé), il faut installer et configurer ce
middleware. Allez dans le menu Démarrer/Programmes/PostgreSQL et sélectionnez
"constructeur de la pile applicative".
Dans la nouvelle fenêtre, dans la liste, sélectionnez PostgreSQL et cliquez sur suivant.
Un accès internet se fait pour récupérer la liste de tous les ajouts possibles à PostgreSQL.
Dans databasedriver, sélectionnez PgOleDB puis suivez les étapes d’installation.
Dans le langage, créer le lien en utilisant le bon middleware
Retournez dans votre projet VB6. Allez dans le menu Projet/Références. Dans la nouvelle
fenêtre, sélectionnez les 2 références suivantes :
Normalement, après avoir écrit As et mis un espace, dans la liste des propositions,
vous avez dû trouver ADODB. Si ce n’est pas le cas, c’est qu’il y a un problème avec le
middleware, donc vous avez mal fait une étape précédente. Si vous avez bien ADODB,
placez-vous dessus et utilisez la touche TAB, puis placez le point : vous devez avoir à
nouveau une liste dans laquelle vous pouvez trouver Connection. Utilisez à nouveau la
touche TAB. Vous n’êtes pas obligé d’avoir recours à ces assistants à la saisie, cependant
ils sont bien pratiques pour éviter les fautes de frappe, pour contrôler que l’on prend les
bons outils et aussi lorsque l’on a oublié le nom de certains outils. Je vous conseille donc
d’utiliser ces facilités.
8 2949 TP PA 00
Cet objet (dbFilm) va permettre de faire la connexion directement avec votre base de
données créée sous PostgreSQL.
Une fois la connexion créée (on va écrire le code de la connexion plus loin), il faudra
manipuler des curseurs pour accéder, par des requêtes, au contenu des différentes tables.
C’est, bien évidemment, le but principal de cette application.
Déclarez les curseurs suivants (un recordset est un curseur) :
Sub main()
End Sub
Remarquez qu’après avoir écrit la première ligne et validé, la seconde ligne s’est auto-
matiquement écrite.
Dans ce main, vous allez "créer" l’objet dbFilm de la façon suivante :
TP 1 Set dbFilm = New ADODB.Connection
Logiciel
Vous avez certainement l’impression de ne rien faire de plus que la ligne de déclara-
de gestion
de DVD tion. En réalité, vous venez d’"instancier" l’objet, c’est-à-dire de réellement le créer en
mémoire, alors que, lors de la déclaration, vous n’avez fait que signaler qu’il y aura dans
Page 12 votre programme un objet de type ADODB.Connection.
Une fois l’objet créé, il faut l’utiliser pour faire le lien avec votre base de données. Ce lien
se fait par ce qu’on appelle une "chaîne de connexion", dans laquelle il faut préciser un
certain nombre de choses comme le nom du SGBDR, l’adresse ip du serveur qui contient
la base, le nom de la base de données, le nom de l’utilisateur de la base de données et
son mot de passe.
Voici donc la chaîne de connexion :
Remplacez toutes les valeurs en couleur et surlignés, par les bonnes valeurs (si
vous avez suivi les étapes précédentes, vous n’avez que le user et password à changer en
mettant ceux que vous avez utilisés sous PostgreSQL). Remarquez au passage l’utilisation
du "_" en fin de ligne, qui permet tout simplement de dire à VB6 que le code de cette
ligne continue à la ligne suivante. Le signe & permet la concaténation de chaîne (et non
pas le +).
Une fois la connexion établie, les recordsets utilisant cette connexion permettront d’ac-
céder aux données. On s’en occupera directement dans les fenêtres du projet.
8 2949 TP PA 00
Après cette connexion, le programme doit ouvrir la première fenêtre de l’application,
c’est-à-dire frmMenu. Donc, en fin de Sub main, utilisez la méthode Show sur l’objet
frmMenu (vérifiez que vous avez bien renommé la fenêtre). En tapant frmMenu suivi
d’un point, si une liste apparaît contenant Show, c’est que vous l’avez bien renommé.
Testez l’application : si tout va bien, vous ne devriez pas avoir d’erreur et une fenêtre
vide devrait s’ouvrir.
Avant même de commencer à coder chaque formulaire, vous allez au moins les créer
pour les insérer dans votre projet : dans le menu Projet, choisissez "Ajouter une feuille".
Dans l’onglet "Nouveau", "Form" est sélectionné, cliquez sur Ouvrir. Une nouvelle feuille
s’est ouverte et s’est aussi insérée dans la liste de droite, dans le projet. Renommez cette
feuille en frmFilm et enregistrez-la. Changez aussi son titre (Caption) en Films.
Avec la même méthode, créez les formulaires frmGenre et frmActeur.
Formulaire du menu
Revenez sur frmMenu. Le premier formulaire va juste contenir des boutons pour per-
mettre d’accéder aux différentes fenêtres de l’application. Au passage, ce n’est pas du
tout une bonne méthode de présentation (abandonnée depuis au moins 20 ans :-) )
mais, pour démarrer, elle va nous faciliter la vie et montrer comment ouvrir et fermer TP 1
des fenêtres. Par la suite, vous verrez qu’il est préférable de regrouper les informations.
Logiciel
Donc, présentez cette fenêtre de la façon suivante (attention, surtout ne faites pas de
de gestion
copier/coller pour créer les boutons) : de DVD
Page 13
Renommez les objets en suivant les normes (cmdFilm pour le bouton Films…). Pensez à
le faire correctement dans tout votre projet.
Derrière le bouton "Films", mettez le code qui permet de cacher la fenêtre du menu
(avec la méthode hide sur frmMenu) et de faire apparaître la fenêtre des films (avec la
méthode Show sur frmFilm).
Avec la même logique, codez les autres boutons. Mettez End derrière le bouton Quitter.
Testez l’application. Normalement, vous ne devez pas avoir d’erreur au démarrage et,
en cliquant sur un bouton, la nouvelle fenêtre doit s’ouvrir : elle est vide mais contrôlez
que son titre est correct (il correspond au bouton utilisé). En revanche, ne voyant plus
le menu, vous ne pouvez pas tester les autres boutons, sauf en fermant et en relançant
l’application. Pour cela, fermer la fenêtre ne suffit pas : vous devez cliquer sur le carré
qui s’appelle "fin" et qui se trouve à droite de la flèche que vous avez utilisée pour lan-
cer l’application. Pour le moment, procédez ainsi pour tester tous les boutons.
8 2949 TP PA 00
Formulaire des DVD
Passons au formulaire le plus important, et le plus copieux en code.
Dans ce formulaire, vous allez afficher les DVD, en permettant à l’utilisateur de navi-
guer entre les DVD. Pour chacun, vous allez afficher son titre, sa durée, son genre et ses
acteurs. Le formulaire doit aussi permettre de modifier les informations d’un DVD, de
supprimer ou d’ajouter un nouveau DVD, mais aussi d’ajouter de nouveaux genres ou
de nouveaux acteurs (afin de faciliter la saisie, plutôt que de devoir aller dans les formu-
laires Acteurs et Genres).
Commencez par construire l’interface suivante (nommez correctement tous les objets
graphiques en suivant la logique habituelle) :
Vous pouvez tout de suite coder le bouton Quitter, qui doit fermer (et non juste cacher)
le formulaire actuel (utiliser la procédure Unload avec, comme paramètre, la fenêtre à
fermer) et doit faire réapparaître (avec la méthode Show) le menu.
TP 1
Logiciel
de gestion
de DVD
Page 14
Chargement du formulaire
Créez le code qui va s’exécuter au chargement de la fenêtre (pour cela, il suffit de
double-cliquer sur une zone vide de la fenêtre, pour créer le Form_load).
Dans cette méthode événementielle, on veut remplir le combo des genres, le combo des
acteurs et remplir le curseur des films pour afficher le premier film. Travaillons étape par
étape.
8 2949 TP PA 00
Combo des genres
Comme on risque d’avoir plusieurs fois besoin de réinitialiser ce combo, on va mettre
le code dans un module non événementiel. Créez la procédure non événementielle
remplirGenre(). Dans cette procédure, commencez par vider le combo des genres. Vous
allez ensuite initialiser le recordset rsGenre avec une requête exécutée sur l’objet de
connexion à la base de données. Voici la syntaxe :
Une fois le recordset ainsi initialisé, faites une boucle pour le parcourir et remplissez le
combo avec les libellés des genres. Après la boucle, fermez le recordset.
Revenez au module form_load et appelez votre procédure remplirGenre.
Testez pour vérifier que le combo est bien rempli des genres que vous avez insérés dans
la base de données.
Les combos, comme les listes, possèdent une propriété bien sympathique : un tableau
caché, qui fonctionne en parallèle du tableau des valeurs affichées. On peut mettre ce
que l’on veut dans ce tableau caché. C’est évidemment bien pratique pour y mémori-
ser les clés primaires des informations affichées (donc le numgenre). Dans la boucle de
chargement du combo des genres, juste après avoir ajouté le libellé dans le combo, vous TP 1
allez remplir ce tableau caché avec les numgenre. Aidez-vous du mémento et pensez à
Logiciel
utiliser la propriété NewIndex. de gestion
Combo des acteurs de DVD
En suivant exactement la même logique que pour le combo des genres, remplissez le Page 15
combo des acteurs.
8 2949 TP PA 00
le titre ou la durée : cela ne sera possible que si on clique sur le bouton modif. Pour cela,
créez une procédure nommée activation qui reçoit en paramètre état de type booléen.
Suivant les besoins, on appellera cette procédure en lui envoyant true ou false, pour faire
basculer l’état des différents objets (accessible ou non). Dans cette procédure, affectez le
paramètre etat à la propriété Enabled de tous les objets de la fenêtre, sauf les 3 objets
suivants, auxquels vous allez affecter le contraire de la propriété état (donc, not etat) :
titre, durée et le combo des genres. N’affectez rien au bouton Quitter, qui doit toujours
rester accessible.
De retour dans initDvd, à l’endroit où vous étiez, appelez la procédure activation en lui
envoyant False en paramètre.
Vous étiez dans un si (si la fin du curseur est atteinte), écrivez maintenant le sinon. En
effet, dans le cas où il y a des DVD, il faut s’en occuper. Commencez par vous position-
ner sur la bonne ligne du curseur (si le paramètre numDvd contient autre chose que
0) : Donc, faites un test sur numDvd car, s’il est différent de 0, faites une boucle sur le
curseur pour vous positionner sur le tuple dont le numdvd est égal au numDvd passé en
paramètre. A priori, si le numDvd est différent de 0, vous êtes sûr de le trouver. Après
cette boucle et ce test, appelez la procédure activation mais, cette fois, en envoyant true
dans le paramètre.
Il faut maintenant s’occuper d’afficher les informations du DVD sur lequel on est posi-
tionné. Encore une fois, comme cette manipulation risque de se répéter plusieurs fois,
faites une procédure nouvFilm sans paramètre.
TP 1 Dans cette procédure, commencez par déclarer une variable i de type entier. Comme
vous êtes positionné sur une ligne du curseur rsDvd, il suffit de remplir simplement les
Logiciel zones de texte du titre et de la durée avec les informations récupérées dans le curseur.
de gestion
de DVD Ensuite, faites une boucle sur le combo des genres pour trouver le genre dont le numéro
est égal au numgenre du curseur rsDvd (n’oubliez pas que les numéros de genre sont
Page 16 dans le tableau caché du combo). Une fois le genre trouvé, affectez l’indice de la ligne
dans la propriété ListIndex du combo des genres, pour que le bon genre s’affiche.
Il faut maintenant s’occuper des acteurs du film. Pour cela, initialiser le curseur rsAc-
teurFilm avec les noms et numéros des acteurs de ce film. La requête vous est donnée,
non pas parce que vous ne savez pas l’écrire (théoriquement, vous savez) mais parce
qu’elle utilise des concaténations et des retours à la ligne que vous auriez peut-être du
mal à trouver. Prenez donc bien le temps de comprendre comment cette requête est
construite. La concaténation en VB6 est soit & (qui se moque des types concaténés), soit
+ (qui est sensible aux types). Voici l’exemple avec + :
Une fois le curseur initialisé, videz la liste des acteurs du film et remplissez-la avec les
noms récupérés dans le curseur. Pensez en parallèle à remplir la liste cachée avec les
numacteur.
Après la boucle, pensez à fermer le curseur.
Il reste à appeler la procédure nouvFilm à l’endroit où vous étiez dans initDvd (en fin de
sinon).
8 2949 TP PA 00
Revenez dans le form_load : à la fin de la procédure, appelez initDvd en lui envoyant le
paramètre 0.
Testez pour voir si toutes les informations du premier DVD s’affichent (titre, durée,
genre, acteurs).
Cela sous-entend donc que, avant de supprimer le DVD, il faut supprimer tous les liens
qui existent entre lui et les acteurs. Juste avant la requête de suppression du DVD, faites
une requête de suppression dans acteur_dvd pour supprimer toutes les lignes qui concer-
nent ce DVD.
8 2949 TP PA 00
Testez à nouveau. Cette fois, il n’y a plus d’erreur (sauf, bien sûr, si vous vous êtes
trompé dans la requête !). En revanche, le DVD est toujours là… et, même si vous
utilisez les boutons de navigation, il est toujours là… mais sans les acteurs ! Bizarre !
Allez voir dans PostgreSQL si le film a bien été effacé : c’est le cas ! Fermez l’applica-
tion et relancez-la. Le film n’y est plus ! Que s’est-il passé ?
En fait, la requête rattachée au curseur rsDvd n’ayant pas été mise à jour juste après la
suppression, le curseur contenait toujours les informations sur ce DVD, même s’il avait
été supprimé. Donc, il manque quelque chose dans le code. Après les 2 requêtes de sup-
pression, appelez votre procédure initDvd en lui envoyant le paramètre 0, pour qu’il se
repositionne en début de DVD et mette à jour le curseur.
Testez à nouveau. Supprimez un film qui contient des acteurs. Cette fois, vous êtes
repositionné sur le premier film du curseur et, si vous vous déplacez dans les films, le
film supprimé n’apparaît plus.
Cette requête vous est donnée car vous ne pouviez pas la deviner ! Elle permet de récu-
pérer la valeur de la dernière clé numdvd insérée dans la table dvd. Cette requête est
spécifique à PostgreSQL. Sa syntaxe officielle est la suivante :
Les noms en couleur et surlignés, sont à remplacer par les bons noms.
8 2949 TP PA 00
Chaque SGBDR a ses propres instructions pour récupérer ce genre d’information.
Avec le "as", on fabrique un champ temporaire "ledernier" dans lequel le numéro sera
récupéré.
Vous pouvez ainsi appeler votre procédure initDvd en lui envoyant en paramètre le
numéro récupéré dans ledernier (attention, ledernier est un champ du curseur rsDer-
nier). Pensez aussi à modifier à nouveau le message du bouton pour lui remettre
"&Ajout film".
Si un des 3 champs n’est pas vide (donc, dans le sinon), affichez un message d’erreur
signalant que l’ajout ne peut pas se faire, et utilisez le bouton vbOKOnly. Inutile, cette
fois, de récupérer dans une variable ou de tester la réponse de l’utilisateur car il n’a pas
le choix (un seul bouton). Alors, dans ce cas, VB6 accepte que vous appeliez la fonction
MsgBox comme si c’était une procédure.
Testez : normalement, quand vous cliquez sur l’ajout, tous les boutons se désactivent,
l’ajout devient "Enregistrer", les zones de texte se vident ainsi que la sélection du
combo. Saisissez un nouveau film, une durée et sélectionnez un genre. Cliquez sur
Enregistrer : vous êtes resté positionné sur le bon film. Essayez de vous déplacer et
revenez sur le film. Essayez aussi d’ajouter un autre film et de cliquer sur enregistrer
sans avoir rempli toutes les zones : vous devriez obtenir un message d’erreur.
8 2949 TP PA 00
Suppression d’un acteur du film
Pour le moment, on ne s’est pas occupé d’ajouter ou de supprimer les acteurs d’un film.
Commençons par le plus simple : la suppression.
Pour supprimer (donc derrière le bouton suppression d’un acteur symbolisé par (-)), il
faut qu’il y ait un acteur sélectionné dans la liste. Commencez par faire cette vérification.
Si un acteur est sélectionné, alors exécutez une requête de suppression sur acteur_dvd
pour supprimer la ligne qui correspond au numéro de l’acteur sélectionné (à récupérer
dans la liste cachée des acteurs) et au numéro du DVD actif (à récupérer dans le curseur
rsDvd).
Afin de remettre à jour la liste des acteurs, appelez votre procédure nouvFilm.
Testez : choisissez un film qui possède des acteurs et, avant de sélectionner un acteur,
cliquez sur le bouton "-". Normalement, rien ne se passe. Sélectionnez un acteur et cli-
quez à nouveau sur "-". L’acteur devrait être supprimé de la liste. Pour bien contrôler,
changez de film et revenez sur le film concerné.
Logiciel
Testez : sélectionnez un acteur et tentez de l’ajouter à la liste des acteurs du film.
de gestion
de DVD
Vous devriez le voir apparaître directement. Changez de film et revenez sur le film
sélectionné pour contrôler que l’ajout est bien enregistré.
Page 20
Nouveau genre
Il sera possible par la suite de passer par le menu général et d'aller dans le formulaire
spécifique au genre pour ajouter/modifier/supprimer des genres. Mais, lorsque vous êtes
dans le formulaire des DVD, cela peut être bien pratique de pouvoir en direct ajouter un
genre. Et c’est aussi l’occasion de découvrir une nouvelle fonction de VB6.
Donc, dans la procédure derrière le bouton "nouveau genre", déclarez une variable
genre de type chaine et affectez-lui le résultat de l’appel de la fonction InputBox pour
demander à l’utilisateur de saisir un nouveau genre (voir la syntaxe dans le mémento).
Contrôlez ensuite, avec une boucle, que ce nom saisi n’est pas déjà présent dans le
combo des genres. S’il y est, affichez un message d’erreur ; sinon, exécutez une requête
d’insertion sur la table Genre, et réinitialisez le combo des genres en appelant votre
procédure remplirGenre.
Testez : essayer d’ajouter un genre et vérifiez qu’il s’est inséré dans le combo. Essayez
d’ajouter un genre qui existe déjà pour vérifier que vous obtenez bien un message
d’erreur. Remarquez qu’après un ajout, le film sur lequel vous êtes positionné perd son
genre actuel et n’a plus de genre.
Ce problème vient du fait que la réinitialisation du combo perd la position. Pour éviter
ce problème, appelez la procédure nouvFilm après l’appel de la procédure remplirGenre.
8 2949 TP PA 00
Nouvel Acteur
Avec le même principe que pour le genre, écrivez le code qui permet d’ajouter un acteur
au combo des acteurs.
Testez.
Testez pour voir si la zone de la durée se vide dès que vous saisissez autre chose qu’un
chiffre, et avant même de valider.
Le formulaire principal est terminé. C’est le plus complexe. Vous avez ainsi acquis d’im-
portantes connaissances sur la manipulation d’une base de données à travers une appli-
cation.
TP 1
Formulaire des acteurs
Maintenant que la fenêtre principale est terminée, vous avez toutes les connaissances Logiciel
de gestion
pour construire les 2 autres. Pour celle des acteurs, le but est d’afficher tous les films
de DVD
concernés pour chaque acteur (dans quels films l’acteur a joué). Attention, dans cette
fenêtre, vous ne devez pas gérer l’affectation d’un film à un acteur : cela se fait unique- Page 21
ment dans la fenêtre de la gestion des DVD. Ici, vous devez juste gérer l’affichage des
films d’un acteur, et permettre d’ajouter/supprimer/modifier un acteur, et rien d’autre.
Codez complètement cette fenêtre.
Testez la fenêtre.
8 2949 TP PA 00
Formulaire des genres
En suivant exactement la même logique que pour le formulaire précédent, créez le for-
mulaire des genres.
Testez la fenêtre.
Optimisation du code
Vous avez sans doute remarqué qu’il y a beaucoup de codes identiques entre les diffé-
rentes fenêtres. De la même façon que vous avez créé des modules non événementiels
paramétrés dans vos fenêtres, il est possible de faire la même chose, pour toutes les
fenêtres. Pour cela, il faut placer les modules dans le module général qui se lance au
démarrage du projet, et qui contient déjà le main.
On va faire le test pour un des modules. Toutes les fenêtres font la même chose derrière
le bouton Quitter : la fenêtre active est fermée (avec unload) et la fenêtre du menu est
à nouveau montrée (avec Show).
Dans le module général, après le main, créez une procédure publique Quitter qui reçoit
en paramètre frm de type Form. Dans cette procédure, faites un unload sur le paramètre,
et appliquez la méthode Show sur le formulaire du menu.
Dans les 3 formulaires (les DVD, les genres et les acteurs), remplacez le code derrière le bou-
TP 1 ton quitter par l’appel de la procédure Quitter en envoyant à chaque fois le bon paramètre.
Logiciel
de gestion Testez.
de DVD
Cette procédure ne fait que remplacer 2 lignes par une, ce qui n’est pas une grande
Page 22
amélioration. Cependant, vous imaginez bien qu’il y a quantité d’autres procédures qu’il
est possible d’optimiser dans cette application.
Prenez le temps de bien analyser la correction officielle pour voir, entre autres, les opti-
misations apportées, mais aussi la présentation générale du code.
8 2949 TP PA 00
3. VB6 : complément de mémento
En fin de fascicule de TP du module 2944 "Base de la programmation", vous avez utilisé
un petit mémento qui donnait quelques indications sur le langage. Voici un complément,
sur l’accès aux bases de données, qui va vous servir pour ce TP.
8 2949 TP PA 00
TP 2
Optimisation par les contraintes
de la base « Tour de France »
Ce TP porte exclusivement sur la mise en place de contraintes afin de mettre en pratique
les concepts vus dans la séquence 4 du cours. Pour cela, nous allons reprendre la base de
données « Tour de France » telle qu’elle était à la fin du TP « Exploitation des données ».
X Contenu
1. Analyse des besoins ....................................................................................... 26
2. Mise en place d’une contrainte d’unicité...................................................... 26
3. Mise en place d’une contrainte de validation simple .................................. 28
4. Mise en place de contraintes de validation complexes ............................... 29
TP 2
5. Création d’un domaine .................................................................................. 32
Optimisation
6. Gestion de l’intégrité référentielle ................................................................ 33 par les contraintes
7. Et Win Design dans tout ça ? ......................................................................... 37 de la base
"Tour de France"
Page 25
8 2949 TP PA 00
1. Analyse des besoins
Comme lors du TP "Exploitation des données", nous allons imaginer que vous continuez
d’assister un journaliste sportif qui prépare une émission sur le Tour de France. Lors d’une
entrevue avec lui, vous avez noté les règles métiers suivantes :
• sur chaque étape d’une épreuve, il ne peut y avoir qu’un seul coureur par classe-
ment (il ne peut pas y avoir, par exemple, plusieurs coureurs classés "n° 5") ;
• l’identifiant de pays est composé de 3 lettres majuscules ;
• l’identifiant de coureur international attribué par l’UCI est fabriqué de la manière
suivante :
F R A 1 9 7 9 0 6 2 2
• lorsqu’un coureur abandonne une étape, il n’a pas de classement sur cette étape, et
il n’a pas non plus de temps mémorisé ;
• il apparaît clairement que, dans le monde du cyclisme, beaucoup d’items sont iden-
tifiés avec un code de 3 lettres majuscules (nationalité, équipes, épreuves…) ;
TP 2 • l’identifiant d’épreuve peut être amené à être changé (il a été question de l’identi-
fiant du "Paris-Nice" qui pourrait passer de "PNC" à "PNI"). Il faut donc prévoir que
Optimisation les identifiants d’épreuve puissent évoluer sans avoir à faire de grosses opérations
par les contraintes
de la base
de maintenance.
"Tour de France"
Page 26
2. Mise en place d’une contrainte d’unicité
L’objectif, ici, est de faire en sorte que, sur chaque étape d’une épreuve, un classe-
ment ne puisse concerner qu’un seul coureur. Pour cela, nous allons mettre en place la
contrainte d’unicité "uni_classement" qui va concerner la table "resultatEtape" et, plus
précisément, les champs "idEtape", "idEpreuve" et "classement".
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la table "resultatEtape", puis choisissez
"Ajouter un objet X Ajouter une contrainte d’unicité" :
8 2949 TP PA 00
• La fenêtre "Ajouter une contrainte d’unicité…" s’ouvre. Complétez le champ
"Nom". Passez ensuite dans l’onglet "Colonnes". À l’aide du menu déroulant
"Colonne", ajoutez les colonnes concernées par la contrainte d’unicité.
TP 2
Optimisation
par les contraintes
de la base
"Tour de France"
Page 27
• Dès lors, on ne peut plus saisir 2 coureurs d’une même étape dans une même
épreuve avec le même classement sans se heurter à une violation de contrainte
d’unicité :
8 2949 TP PA 00
Mise en place avec SQL
En SQL, la création de cette contrainte se fait avec l’instruction suivante :
TP 2
Optimisation
par les contraintes
de la base
"Tour de France"
Page 28 • Nommez ensuite cette contrainte "chk_idPays" puis, dans l’onglet "Définition",
saisissez la vérification "idPays ~'[A-Z][A-Z][A-Z]'" puis validez avec "OK" :
Le caractère "~" (tilde) s’obtient avec la combinaison des touches "Atl Gr + é". Ce carac-
tère permet d’utiliser des expressions rationnelles lors de comparaisons sous PostgreSQL.
Cette vérification revient à faire la vérification suivante :
8 2949 TP PA 00
Mise en place avec SQL
En SQL, la création de cette contrainte se fait avec l’instruction suivante :
Ou alors :
TP 2
4. Mise en place de contraintes de validation complexes
Optimisation
Lors de l’analyse des besoins, nous avons découvert que le code UCI était créé en s’ap- par les contraintes
de la base
puyant sur la nationalité et la date de naissance d’un coureur. Nous allons donc mettre "Tour de France"
en place une contrainte de validation qui veillera à ce qu’il ne puisse pas y avoir d’erreur
sur les codes UCI, ni sur les dates de naissance des coureurs. Page 29
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la partie "Contraintes" de la table "coureur" et
choisissez "Ajouter un objet X Ajouter une contrainte de vérification" :
8 2949 TP PA 00
• Nommez ensuite cette contrainte "chk_codeUCI" puis dans l’onglet
"Définition" saisissez la vérification ci-dessous et validez avec "OK" :
8 2949 TP PA 00
• Nommez ensuite cette contrainte "chk_abandon" puis dans l’onglet
"Définition" saisissez la vérification ci-dessous et validez avec "OK" :
8 2949 TP PA 00
5. Création d’un domaine
Lors de l’analyse des besoins, nous nous sommes aperçus que, dans le monde du cyclisme,
les codes à 3 lettres majuscules étaient très fréquents (nationalité, équipes, épreuves…).
Nous allons donc créer un domaine "id_cyclisme" que nous pourrons réutiliser par la
suite.
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la partie "Domaines" et choisissez "Ajouter un
domaine" :
Page 32
8 2949 TP PA 00
Maintenant que le domaine est créé, il faudrait l’appliquer dans les différentes tables
concernées. Le problème, ici, c’est que pgAdmin (comme beaucoup de clients gra-
phiques) ne permet pas de modifier les types de colonnes si ce n’est pour proposer un
type proche. Nous allons devoir utiliser directement du SQL, ce qui, encore une fois,
justifie sa connaissance et son apprentissage !
Une fois le domaine créé, il nous suffit de l’utiliser à la place de "character(3)" dans les
différentes tables :
• contratCoureur (idEquipe) ; • etape (idEpreuve)
• contratDirecteur (idEquipe) ; • participer (idEpreuve)
• coureur (nationalite) • pays (idPays)
• epreuve (idEpreuve) • resultatEtape (idEpreuve)
• equipe (idEquipe, nationalite)
Pour chaque table, il nous suffit de modifier le type. L’exemple suivant nous montre TP 2
l’instruction qui nous permet de modifier les types des colonnes "idEquipe" et "nationa-
lite" de la table "equipe". Inspirez-vous-en pour modifier toutes les tables : Optimisation
par les contraintes
de la base
ALTER TABLE equipe
"Tour de France"
ALTER COLUMN idEquipe TYPE id_cyclisme,
ALTER COLUMN nationalite TYPE id_cyclisme ; Page 33
8 2949 TP PA 00
Mise en place graphique avec l’outil pgAdmin
• Cliquez avec le bouton droit sur la contrainte "fk_epreuve" de la table "etape" et
choisissez "Supprimer" :
• Cliquez ensuite avec le bouton droit sur la partie "Contraintes" de la table "etape"
et choisissez " Ajouter un objet X Ajouter une clé étrangère" :
TP 2
Optimisation
par les contraintes
de la base
"Tour de France"
Page 34
8 2949 TP PA 00
TP 2
Optimisation
par les contraintes
de la base
"Tour de France"
Page 35
Deux remarques :
• Cette modification n’est pas la seule à apporter. Il y a les tables “participer” et
“resultatEtape” qui s’appuient également sur la clé étrangère “idEpreuve” (direc-
tement pour “participer” et indirectement pour “resultatEtape”). Vous allez donc
devoir modifier également les clés étrangères dans ces 2 tables.
• Dans un environnement de production, ces manipulations “telles quelles” seraient,
bien évidemment, à proscrire. Dès lors que vous avez supprimé une contrainte de
clé étrangère, vous avez mis la base de données en péril. En effet, le temps que vous
reconstruisiez la nouvelle clé, la base a pu recevoir des données incohérentes…
Comment opérer lorsque l’on doit faire ce genre de manipulation ?
– Soit vous coupez les accès à la base de données (on débranche le câble réseau,
on ajoute temporairement une règle de pare-feu…).
– Soit vous faites vos opérations de suppression/création au sein d’une transac-
tion. Cette dernière solution est sans aucun doute celle à privilégier, et c’est
celle que nous verrons plus loin !
8 2949 TP PA 00
Mise en place avec SQL
Comme cela vient d’être dit, la suppression d’une contrainte de clé étrangère est loin
d’être anodine. Dans un environnement de production, il peut en résulter de terribles
conséquences. C’est pourquoi nous allons travailler ici avec des transactions :
START TRANSACTION ;
ALTER TABLE etape
DROP CONSTRAINT fk_epreuve ;
ALTER TABLE etape
ADD CONSTRAINT fk_epreuve FOREIGN KEY (idEpreuve)
REFERENCES epreuve (idEpreuve)
ON UPDATE CASCADE
ON DELETE NO ACTION ;
COMMIT;
Il suffit ensuite de vous inspirer de cette transaction pour procéder au remplacement des
contraintes de clés étrangères dans les tables "participer" et "resultatEtape". D’ailleurs,
rien ne nous empêche de tout faire au sein d’une même transaction :
START TRANSACTION ;
ALTER TABLE participer
DROP CONSTRAINT fk_participer_epreuve ;
ALTER TABLE participer
TP 2 ADD CONSTRAINT fk_participer_epreuve
FOREIGN KEY (idEpreuve)
Optimisation
par les contraintes REFERENCES epreuve (idEpreuve)
de la base ON UPDATE CASCADE
"Tour de France"
ON DELETE NO ACTION ;
ALTER TABLE resultatetape
Page 36
DROP CONSTRAINT fk_etape ;
ALTER TABLE resultatetape
ADD CONSTRAINT fk_etape
FOREIGN KEY (idEpreuve, idEtape)
REFERENCES etape (idEpreuve, idEtape)
ON UPDATE CASCADE
ON DELETE NO ACTION ;
COMMIT;
Dès lors, plus rien ne nous empêche de modifier l’identifiant du "Paris-Nice" de "PNC"
en "PNI". Vous pouvez d’ailleurs faire le test, soit via pgAdmin en modifiant directe-
ment l’identifiant dans l’éditeur de données (7e icone en forme de tableau), soit à l’aide
de l’instruction suivante :
UPDATE epreuve
SET idEpreuve = 'PNI'
WHERE idEpreuve = 'PNC' ;
Cette modification aura bien pour résultat la modification "en cascade" de toutes les
tables "filles" !
8 2949 TP PA 00
7. Et Win Design dans tout ça ?
Maintenant que vous comprenez l’objectif des contraintes, vous devez prendre
conscience que ces contraintes doivent être prises en compte dès les premières étapes
d’analyse et, donc, dès la conception du schéma conceptuel des données. Voici quelques
pistes qui devraient vous permettre d’intégrer les contraintes "métiers" dès les premières
esquisses conceptuelles.
• Prenons le cas du schéma conceptuel du Tour de France :
Optimisation
par les contraintes
de la base
"Tour de France"
Page 37
8 2949 TP PA 00
• À la génération du modèle logique, il suffit ensuite de se rendre de nouveau au
même endroit pour définir "techniquement" la contrainte, c’est-à-dire dans le
langage du SGBDR ciblé (puisque la génération du script SQL est l’étape suivante) :
• À l’étape suivante (il ne faut pas oublier de cocher la case qui concerne les
TP 2 contraintes dans les options de génération), on peut voir que la contrainte a bien
été intégrée au script SQL :
Optimisation
par les contraintes
de la base
"Tour de France"
Page 38
8 2949 TP PA 00
Et ça, c’est juste une infime partie des possibilités qu’offre un outil comme Win Design !
Encore une fois, l’important pour vous est avant tout de prendre l’habitude de manipuler
les outils. Que ce soit Win’Design, pgAdmin ou directement le SQL, rien ne s’obtient sans
pratique. C’est pourquoi je vous invite à travailler régulièrement sur ces outils et à chercher
à acquérir le maximum de savoir-faire. Soyez curieux, et recherchez toujours la manière
d’optimiser vos productions si vous voulez acquérir le maximum de compétences.
TP 2
Optimisation
par les contraintes
de la base
"Tour de France"
Page 39
8 2949 TP PA 00