• Aucun résultat trouvé

TP4B - Bases de données et Excel

N/A
N/A
Protected

Academic year: 2022

Partager "TP4B - Bases de données et Excel"

Copied!
9
0
0

Texte intégral

(1)

TP4B - Bases de données et Excel

Description

Le TP4B peut se diviser en deux parties, B1 et B2, la première étant un survol plus général et la deuxième une utilisation plus concrète des techniques qui y sont développées. La partie A en effet vise à utiliser les bases de données avec un minimum de programmation alors que la deuxième vise à programmer les bases de données. On peut donc diviser la tâche en deux sections bien distinctes.

Partie B1

La partie B1 du TP4B couvre quelques matières sur lesquelles nous avons «glissé» dans les TPs précédents, introduit les notions de base des Gestionnaires de bases de données et introduit le concept de l'utilisation et du contrôle, à partir même d'une application VB.NET, d'une application Windows «indépendante» comme Excel. La partie B développera les notions de mise à jour d'une base de données à même VB.NET.

L'application FFTP4 (dossier ExempTP4) constitue le modèle à atteindre alors que l'application RemTP4 est un embryon à partir duquel vous POUVEZ commencer à y arriver.

On peut séparer le TP-B1 en trois parties de valeurs inégales correspondant aux trois feuilles que vous aurez à y développer. En effet, en ouvrant votre application de base, vous y trouverez les feuilles suivantes :

• La feuille «frmIntro» constituera la Partie 1 du TP. C'est la feuille de départ qui présente des contrôles utilitaires très importants, en particulier les boîtes de dialogue standard de Windows.

• La feuille «frmMenu» constituera la Partie 2 du TP. Il n'y a ici que les menus à créer et à gérer.

• La feuille «frmPublier» constituera la Partie 3 du TP. Elle consiste à relier l'accès, en mode de lecture seule, à une base de données et à transférer les données dans une feuille Excel que l'utilisateur déterminera lui-même au moyen du contrôle

«Boîte de dialogue OpenFile».

• La feuille «frmGrille» constituera la Partie 4 du TP. Elle est décrite dans la Partie B2. Elle consiste à gérer (modifier) les données de la base de données «sans programmation» en utilisant seulement les «Objets ADO» mis à notre disposition par BN.NET.

• La feuille «frmIntroNotes» constituera la Partie 5 du TP. Elle est aussi décrite dans la Partie B2. Elle consiste à programmer les liens avec la base de données pour la gérer.

(2)

Pas à pas

Partie 1 : frmIntro

Voici la liste des tâches que vous devez ajouter à la feuille «frmIntro» du projet embryon.

Définissez la procédure événementielle «Double-clic du PictureBox». La méthode «partagée» «FromFile» de la classe Image définie dans le NameSpace

«System.Drawings» permet de retourner une image contenue dans un fichier passé en paramètre. Un exemple de base de l'énoncé s'y trouve d'ailleurs.

Vous devrez cependant définir correctement la propriété «SizeMode» du contrôle et gérer le chargement des trois images à tour de rôle. Il y a plusieurs façons de gérer l'alternance : une variable statique qui passe de 1 à 3 en boucle, ou bien la propriété «Tag» du contrôle, ou bien la valeur de la propriété «Image» ... Ne reste plus qu'à positionner l'image correctement en choisissant le a bonne valeur de

«SizeMode».

• Il faut programmer le clic du bouton de commande qui gère les deux boîtes de dialogues qui offrent en alternance à l'utilisateur le choix de la couleur de fond du

«Label» (ColorDialog) et sa police de caractères (FontDialog). Utilisez la méthode «ShowDialog» de chaque contrôle pour l'afficher et utiliser ensuite les propriétés «Color» et «Font» des contrôles pour récupérer les choix de l'utilisateur.

Programmez le clic du bouton de suite ...

Partie 2 : frmMenu

Créez le menu au moyen du contrôle «MainMenu», placez-y les textes conformes et associez chacun des boutons de menu à la procédure équivalente des boutons de commande correspondants en ajoutant son événement «Click» dans la clause «Handles» de l'en-tête de la procédure.

Partie 3 : frmPublier

C'est la partie la plus dense. Elle comprend les éléments suivants.

• Vous devez définir la connexion avec la base de données grâce aux objets ADO appropriés. Cette définition peut se faire dans ce cas-ci dans la procédure événementielle Click du bouton de commande puisque c'est le seul endroit où les objets sont utilisés. Mais en général, ce n'est pas le cas et il vaut mieux les définir dans la section générale.

¾ Un objet de type OleDbConnection possède une propriété importante et deux méthodes essentielles. La propriété ConnectionString (qui peut être passée en paramètre au constructeur New) est une chaîne de caractères qui décrit la connexion en précisant le «fournisseur de données», le fichier

(3)

▫ La chaîne de connexion est une chaîne spécifique à chacune des bases de données que l'on désire utiliser. Celle qui est exigée par le fournisseur de Microsoft qui gère les bases de données Access (MicroSoft Jet 4) est donnée dans la procédure Form_Load de la feuille. Notez qu'elle est subdivisée en trois parties : le début dans la chaîne «Conn1», la fin dans

«Conn3» et le milieu dans «Conn2» qui contient le chemin absolu ou relatif de la base de données que l'on veut connecter. Ainsi, il suffit de remplacer «Conn2» par le nom complet d'un fichier pour refaire la chaîne de connexion. Le nom complet contiendra un chemin spécifique si la base est «immuable» (adresse absolue) ou bien seulement le nom du fichier qui se trouve dans le même dossier que l'exécutable (adresse relative).

¾ Un objet de type OleDbCommand possède deux propriétés principales qui font la jonction entre, d'une part, la base de données visée par l'objet précédent et, d'autre part, une commande SQL qui lui est adressée. Cette jonction sera ensuite effectuée grâce à une méthode qui exécutera cette requête. Les deux valeurs de ces propriétés peuvent être passées en paramètres au constructeur;

par exemple : New OleDbCommand(varChaineSQL, objConn).

▫ La propriété CommandText de type String contient une commande SQL valide. Par défaut, il s'agit d'une chaîne vide. La commande SQL doit être une commande de type «Select» qui fournit un ensemble de lignes (enregistrements) formées d'un certain nombre de champs.

▫ La propriété Connection est un objet de type OleDbConnection.

▫ La méthode ExecuteReader est de type fonction. Elle transmet la chaîne SQL à la connexion, crée un objet de type OleDbDataReader pour recevoir les informations de la base et renvoie cet objet comme résultat. La connexion doit être ouverte (Open) au moment de l'appel.

¾ Un objet OleDbDataReader est créé par la méthode ExecuteReader de la commande précédente et sert ensuite à lire les données de la base. Il fonctionne à la manière d'un StreamReader pour les fichiers. Il se caractérise par une méthode Read qui lit la base et des méthodes Getxxx qui renvoient la valeur d'un champ spécifique de l'enregistrement reçu de la base.

▫ La méthode Read va chercher le prochain enregistrement de la base de données et renvoie une valeur True si la lecture a réussi et la valeur False si la fin de la table est atteinte. S'utilise comme le «Peek» du StreamReader.

▫ Les méthodes GetString(n), GetByte(n), GetBoolean(n), GetInt16(n), GetInt32(n), GetInt64(n), GetFloat(n), GetDouble(n) et GetDateTime(n) permettent de recevoir la valeur (de type correspondant) du champ correspondant à l'indice passé en paramètre (débutant à zéro).

(4)

▫ La propriété Item (qui est la propriété par défaut) renvoie une valeur parmi une collection qui contient les valeurs des différents champs de l'enregistrement. On peut y spécifier un indice numérique (base 0) ou bien une chaîne de caractères nommant un des champs (une colonne). Par exemple : MonDatReader(4) ou MonDatReader("CodePerm").

• Vous devez établir la connexion avec la base de données, c'est-à-dire définir les propriétés essentielles des objets ADO et lancer les commandes nécessaires. Dans ce cas-ci, ça pourrait se faire dans la procédure Click du bouton, mais en général, on le fait dans la procédure Form_Load.

¾ La chaîne de connexion du fournisseur Jet 4 de Microsoft vous est donnée en trois sections qu'il suffit de concaténer. La section médiane, qui identifie le fichier utilisé, peut être redéfinie au besoin. Il suffit d'affecter ensuite cette chaîne à l'objet instancié de la classe OleDbConnection.

¾ L'ouverture de la connexion (méthode Open) causera une erreur fatale à l'exécution si le fichier de la base de données n'a pas le même nom ou emplacement que celui spécifié dans la chaîne. Il faut donc prévoir gérer cette erreur potentielle en plaçant la commande d'ouverture dans un bloc «Try / Catch ex As Exception / End Try» et en affichant un message d'erreur en cas d'insuccès.

¾ En cas d'erreur dans l'ouverture du fichier préprogrammé, il serait souhaitable d'offrir à l'utilisateur la possibilité de déterminer lui-même bloc précédent, avant d'interrompre la procédure d'affichage. L'utilisation de la boîte de dialogue OpenFileDialog (méthode ShowDialog) permettra d'obtenir le choix de celui-ci.

¾ La chaîne SQL permettant d'obtenir les informations désirées de la base de données est «Select * From ListeGlobale». Ouvrez le fichier de données (BaseTP4.mdb) pour noter le rang (base 0) et le nom de chaque champ retournés par cette requête.

¾ Créez l'instance du «DataReader» avec votre objet de commande, et bouclez sur la valeur de la propriété Read pour obtenir successivement chaque enregistrement : Do While MonDataRead.Read()= True et utiliser ses valeurs pour les placer dans la feuille Excel..

¾ Pour extraire ensuite les valeurs et les utiliser dans la feuille Excel, vous pouvez appeler les méthodes spécifiques pour chaque type de données (GetXXXX) ou bien la propriété Item. Dans le premier cas, vous obtiendrez une erreur si une donnée est nulle. Il faudra donc l'intercepter (Try ... End Try) comme dans le modèle. Les lignes incomplètes seront alors «sautées». Dans le deuxième cas, la valeur nulle sera placée dans la feuille. Vous avez le choix entre les deux méthodes, la deuxième étant plus facile...

¾ Pour la colonne globale à placer à la fin de chaque ligne de la feuille, vous

(5)

• On doit définir les objets servant à ouvrir et à gérer une application Windows.

Dans ce cas-ci, ces objets seront définis par les classes appartenant à Excel et incluses sur le disque dur dans des fichiers de librairie «dll» qu'il faudra utiliser.

Pour y accéder, utilisez le menu «Projet / Ajouter une référence». Comme il s'agit d'un composant antérieur à VB.NET, vous devez utiliser l'onglet «COM»

et, dans la liste déroulante, [sélectionner] l'entrée «Microsoft Excel ?? Object Library» pour qu'elle apparaisse dans la zone inférieure. Du coup, l'espace de noms «Excel» sera ajouté à la liste des types possibles qui apparaissent à la suite du mot-clé «Dim/Private/Friend/Private» et donnera accès à toutes ses classes, à savoir les types d'objets définis dans Excel.. Parmi celles-ci, vous utiliserez les deux suivantes.

¾ Vous aurez besoin de définir une variable de type «Excel.Workbook», c'est-à- dire de type «classeur» pour désigner le fichier qui sera ouvert. Cette variable pourra alors manipuler le fichier.

¾ Vous aurez besoin de définir une variable de type «Excel.Worksheet», c'est-à- dire de type «feuille Excel» pour désigner la feuille du classeur qui sera utilisée pour la sortie des données. Par cet objet-feuille, vous aurez accès la sa propriété «Cells» qui est constituée d'un tableau(ligne, colonne) en base 1 désignant chacune des cellules de la feuille.

Ouvrir le fichier Excel en laissant l'utilisateur le sélectionner avec le contrôle OpenFileDialog. Cette opération devrait se faire dans la procédure Click du bouton de commande. Il suffit ensuite d'utiliser la fonction GetObject(string) où string est le choix de l'utilisateur.

¾ Le contrôle OpenFileDialog possède une propriété «Filter» de type String qui permet de laisser l'utilisateur déterminer le type de fichiers qu'il veut voir s'afficher. Par exemple si on désire afficher soit les classeurs Excel, soit tous les fichiers, on définit la propriété comme "Fichiers Excel|*.xls|Tous les fichiers|*.*", le séparateur «|» déterminant des groupes de deux chaînes, la premières étant le texte affiché dans la section «Type de fichiers» de la boîte de dialogue, la deuxième représentant le filtre effectif correspondant.

¾ La fonction GetObject(string) permet de créer une instance d'une application donnée. Elle peut prendre un ou deux paramètres de types String. Le premier paramètre peut contenir un nom de fichier qui sera ouvert par Windows via l'application associée à l'extension du nom de fichier («.xls», «.doc», «.mdb»,

«.cad», etc.). Si le premier paramètre est absent ou si la chaîne est vide ou encore si l'extension n'est pas explicite, le deuxième paramètre identifiera aussi de type String, l'application recherchée (ex. "Excel.Application"). Si la chaîne est vide, le logiciel s'ouvrira avec un nouveau classeur vide. La variable recevant l'objet retourné par la fonction aura donc accès à tous les membres de l'application en question. Nommons XLFich cette variable.

¾ Le classeur possède à son tour une propriété «Sheets» qui représente une collection de ses feuilles. Vous pouvez donc affecter à votre variable-feuille l'objet Sheets("Listenotes") du nom de la feuille du classeur devant contenir les données. Nommons XLFeuille cette variable.

(6)

¾ L'objet XLFich est créé en mémoire. Si on désire qu'il apparaisse à l'utilisateur, il faudra rendre visible l'application Excel qui le sous-tend. Et comme Excel est un logiciel multi-fenêtre (on peut ouvrir plusieurs classeurs) faudra faire de même avec sa fenêtre.

xlFich.Application.Visible = True xlFich.Windows(1).Activate()

' Et pour afficher CETTE feuille du classeur xlFeuille.Activate()

Notez que l'affichage de la feuille PEUT se faire avant OU après la boucle qui entre les notes dans la feuille.

¾ Dans la boucle qui parcourt les données issues de la base, il suffit de placer les valeurs désirées dans une cellule de la feuille au moyen de l'affectation du genre : xlFeuille.Cells(4, 2) = "Tous les groupes".

¾ Finalement, il suffit de libérer les objets utilisés : xlFeuille = Nothing

xlFich = Nothing

Partie B2

La partie B2 du TP4 porte sur l'affichage et la gestion d'une base de données (ici, Access) à même une application VB.NET. On peut séparer la partie B du TP4 en deux sections de valeurs à peu près égales correspondant aux deux feuilles que vous aurez à y développer, c'est-à-dire

• La feuille «frmfrmGrille» constituera la Partie 4 du TP4. Elle consiste à afficher et gérer (modifier) les données de la base de données «sans programmation» en utilisant seulement les «Objets ADO» mis à notre disposition par BN.NET.

• La feuille «frmIntroNotes» constituera la Partie 5 du TP4. Elle consiste à programmer les liens avec la base de données pour la gérer «par programmation».

La feuille «frmGrille» utilise deux grilles pour afficher des données. La première est en mode lecture seule (consultation seulement) et l'autre permet de modifier les tables de la base. Le tout sans (presque) aucune programmation.

La feuille «frmNotes» affiche les étudiants et leurs données de façon séquentielle au moyen des boutons de déplacement «standard. On peut y ajouter de nouvelles données, supprimer les enregistrements, etc. Lors de la sortie, le programme affiche le nombre d'enregistrements modifiés lors de la session.

(7)

Pas à pas

Partie 4 : frmGrille

Il s'agit ici de créer UNE connexion (OleDBConnection) à la base, 4 adaptateurs de données (OleDBDataAdapter) et deux groupes de données (DataSet). Il suffira ensuite de connecter deux grilles (DataGrid) à chacun des deux DataSet tel que vu en classe.

La structure de la feuille sera la suivante. Les seuls contrôles visibles seront trois boutons de commandes et deux DataGrid dont l'un sera en lecture seule (ReadOnly) et l'autre permettra la mise à jour. Le premier DataGrid affichera des données provenant de la requête «ListeGlobale». Cette requête concentre des données provenant des trois tables de la base de données, soit les tables «IFT1175» (liste des étudiants), «FAC-DEPT» (liste des départements) et «GROUPES» (liste des horaires des groupes). La complexité de la requête demanderait, pour permettre la mise à jour, un effort de programmation beaucoup plus grand. Aussi la grille servira d'affichage seulement.

La deuxième grille, en revanche, affichera les trois tables séparément et donc permettra la mise à jour de chacune sans trop de problème. Les «assistants» VB vous permettront de créer chacun des objets requis et de les lier de façon à ce que tout changement du contenu de la grille se répercute dans la base de données. Seules quelques lignes de programmation seront nécessaires pour commander le transfert des données vers la DataSet et, à l'inverse, la mise à jour des données à partir du DataSet..

VB vous offre un premier assistant qui crée un DataAdapter et qui établit un lien entre lui et une connexion existante ou nouvelle. Ensuite un deuxième assistant permettra de lier ce contrôle à un DataSet

• Agrandissez la feuille à un niveau raisonnable. Définissez sa barre de titre.

• Dans la section «Données» de la barre d'outils, double-cliquez sur l'objet

«OleDBDataAdapter». VB placera l'objet «OleDBDataAdapter1» dans la zone accessoire et lancera l'assistant.

La première phase consiste à établir le lien avec la base. (En fait il créera un objet OleDBConnection à partir des éléments que vous lui fournirez.) Cliquez sur le bouton [Nouvelle connexion], allez dans l'onglet «Fournisseur» sélectionner «Jet 4.0» puis naviguez vers le fichier de la base de données. dans votre dossier «Bin».

Enlevez le chemin du fichier pour ne laisser dans la zone de texte que le nom du fichier (pour simplifier le nom de la connexion et la rendre «amovible»). Enfin, testez la connexion et validez.

À l'étape suivante, confirmez l'utilisation d'une commande SQL pour définir la source des informations de la base.

Puis utilisez le générateur de requêtes ou bien tapez vous-même la chaîne SQL :

«Select * From ListeGlobale». La page suivante vous informera que l'assistant n'a pas pu générer deux des trois commandes nécessaires pour gérer une mise à jour (Update et Delete). Enfin, n'incluez pas le mot de passe, qui serait demandé au besoin lors de l'ouverture de la connexion.

Renommez correctement les deux objets créés.

(8)

• Sélectionnez le DataAdapter et, au bas de la fenêtre des propriétés, cliquez sur le lien «Générer le groupe de données» (= créer un DataSet associé).

Choisissez [Nouveau] dans la première étape et sélectionnez «ListeGlobale»

comme source du DataSet. Renommez votre DataSet.

• Insérez un contrôle DataGrid sur votre feuille, renommez-le, mettez-le en lecture seule, donnez-lui une taille acceptable et un titre puis associez sa propriété DataSource à la table «ListeGlobale» du DataSet.

Le DataGrid ne peut être modifié (formaté) au moment du Design mais seulement par commandes à l'exécution. Par ailleurs l'utilisateur peut ajuster les commandes et déterminer le tri sur chaque colonne.

• Ajoutez un bouton «Actualiser» et placez-y la commande re «remplissage», c'est- à-dire, celle qui commande au DataAdapter de remplir la table du DataSet (après avoir vidé celui-ci) : :

DataSet.Clear()

DataAdapter.Fill(DataSet)

• Ajoutez un bouton de fermeture et vérifiez le fonctionnement de votre DataGrig.

• Utilisez le même assistant pour créer un deuxième DataAdapter utilisant la même connexion déjà définie à l'étape précédente. Utilisez la commande SQL «Select * From IFT1175» pour obtenir cette table de la base de données. L'assistant confirmera qu'il a généré toutes les commandes SQL nécessaires à la misa à jour de la base.

• En utilisant le lien «Générer le groupe de données» au bas de sa fenêtre de propriétés, remplissez UN DEUXIÈME DataSet pour recevoir cette table.

• Créez deux autres DataAdapter que vous associerez aux tables «FAC-DEP» et

«GROUPES» et que vous placerez aussi dans le deuxième DataSet.

• Ajoutez un DataGrid que vous associerez au deuxième DataSet pour qu'il soit en mesure d'afficher chacune des trois tables que ce dernier «contient».

• Ajoutez un bouton «Actualiser» et «Enregistrer» permettant de passer l'information de la grille à la base et vice-versa. Pour mettre à jour la base de données à partir du DataSet, utilisez la méthode Update du DataAdapter qui retourne le nombre d'enregistrement mis à jour.

DataAdapter.Update(DataSet)

• Ajustez le bouton de fermeture pour laisser l'utilisateur décider s'il désire l'enregistrement des mises à jor avant de sortir et afficher le nombre d'enregistrements modifiés dans chaque table.

Partie 5 : frmNotes

(9)

Complétez la procédure qui remplit le Combo avec les noms du département.

Comme le premier département est le no 1 et que le rang des Items du Combo commencent à 0, il est plus facile d'ajouter au départ un département «Inconnu»

de sortes que le rang de la sélection correspond ensuite au numéro du département. .

Comme il suffit simplement de lire une fois les données et remplir le combo à mesure, vous pouvez utiliser le «DataReader» sur le même modèle que celui défini dans la feuille «frmPublier». Vous pouvez utiliser la même chaîne de connexion (MaConn») puisqu'il s'agit de la même base. La chaîne SQL devra par contre se lire «Select * From [FAC-DEPT]». Les crochets sont important à cause de la présence du tiret dans le nom de la table.

Complétez la définition des liens avec la Dataview. Il manque le lien avec la TextBox «Final et avec le ConboBox. ATTENTION : ce n'est pas le nom du département qui apparaît dans la Table IFT1175 mais son NUMÉRO. Donc le lien avec la table ne se fait PAS par la propriété «Text» du Combo.

Écrivez la fonction «Valid» qui vérifie qu'une valeur est numérique et comprise entre 0 et 100. Elle sera utilisée pour valider les notes entrées au clavier.

Écrivez les fonctions événementielles «Validating» appropriées pour valider les trois notes, le code permanent et le nom. Le code permanent doit comporter 12 caractères dont 4 lettres suivies de 8 chiffres. On peut en profiter pour convertir le code en majuscules au besoin. Pour le nom, il suffit d'éviter les chaînes vides.

Gérez les déplacements des données (enregistrements). Utilisez la propriété

«Position» du «Lieur de données» (MonBind). La première vous est donnée.

Évitez de dépasser les «bornes».

Programmez le bouton «Nouveau». La méthode «AddNew» u DataView crée un enregistrement vide derrière le dernier enregistrement. Activez cet enregistrement (positionnez vous savez quoi) pour qu'il apparaisse dans les contrôles, placez le combo sur le premier département («Inconnu») et placez le focus sur le code permanent. Mais attention : le TextBox du code permanent est en lecture seule (faut pas le détruire ni le modifier) ... sauf pour permettre l'entrée du code nouveau. Aussi, lors de la validation du code, il faudra le remettre en lecture seule.

Programmez le bouton «Supprimer». La méthode «Delete(NoLigne)» du DataView supprime justement la ligne requise dans autre forme de procès.

Programmez la recherche. La zone de texte «txtRecherche» fonctionne comme suit : quand elle reçoit le focus («Enter») et quand elle le perd («Validating ou

«Leave»), elle se vide. Si son contenu «Change» de valeur (sans être vide cependant), une procédure place la position du «Lieur» (MonBind) au premier enregistrement dont le code permanent est plus grand ou égal à celui que l'on désire, PEU IMPORTE la casse.

Fin de l'exercice.

Références

Documents relatifs

Cohérence : Comme pour le SELECT , dans la condition du HAVING doivent apparaître soit des attributs du GROUP BY ou qui sont identiques pour chaque élément du groupe, soit des

La première partie de votre TP consiste à suivre (et à remettre) la construction d'une application semblable à celle présentée en exemple dans le dossier «TP4A» sous le nom

Pour identifier le type de relation entre ces deux tables, on se posera les deux questions suivantes :  Pour un enregistrement de la 1ère table, combien peut-on avoir

La base de données (données primaires) est la matière première à partir de laquelle la bioinformatique va produire d'autres données (données secondaires) et

h) Nom et prime des joueurs sponsorisés par Peugeot entre 1985 et 1990. i) Nom et année de naissance des joueurs ayant participé au tournoi de Rolland Garros de 1989. j) Nom

Cette requête retourne exactement les mêmes colonnes qu’il y a dans la base de données. Pour en savoir plus sur le sujet il est recommandé de lire l’article avantage et

•Extraction des caractéristiques de l’image : couleur, texture, forme, contraintes spatiales, régions.. Recherche d’images basée sur

• dans le cas particulier d’une entité faible, la clé primaire de la relation correspondant à l’entité faible sera le couple constitué de la clé de l’entité forte et de