Contexte L équipe développement est chargée de développer une application Windows afin de permettre au personnel d Humanist Network de gérer les missions humanitaires dans le monde entier. Après étude du modèle conceptuel des données validé par les ingénieurs, nous avons mise en place des maquettes avant de développer sous Visual Studio 2013. Nous avons élaborée le modèle logique des données afin de créer la base de données sous SQL Server 2012. Toute communication de l application avec le SGBD SQL Server 2012 se fait par le biais de Procédure. Maquettage des formulaires Avant tout développement pur, des maquettes ont été effectué par l équipe de développement. Nous avons profité du fait que le développement se faisait sous Visual Studio 2013 pour y inscrire notre travail de maquettage. De ce fait les maquettes sont les interfaces graphiques de notre application sous Visual Studio 2013. Connexion à SQL Server 2012
Menu (associé à chaque page) Parcourir les Missions, affectation de bénévoles, renouvèlement de Mission
Parcourir les donateurs (à partir de la collection)
Ajout d un personnel (Bénévole par procédure, Donateur à la fermeture de l application) Ajout d une mission (Risque + vaccin après sélection du Pays)
Création de la base de données Nous avons choisi JMerise pour recopier le MCD donnée dans le cahier des charges. JMerise est un outil de modélisation des MCD que nous avons préféré car nous y sommes expérimentés et qu il permet d une : - De vérifier si la syntaxe du MCD est correcte - De générer un script SQL du MCD La syntaxe n étant pas la même sur SQL Server 2012, nous avons corrigé les erreurs de syntaxes. Une table était manquante à notre script SQL : la méta-entité que nous avons nommée «enroler». Script de la méta-entité : CREATE TABLE [dbo].[enroler]( [nummission] [int] NOT NULL, [numperso] [int] NOT NULL, [coderole] [varchar](20) NULL, CONSTRAINT [PK_enroler] PRIMARY KEY CLUSTERED ( [nummission] C, [numperso] C )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] La base de données a été généré sur SQL Serveur 2012, pour travailler à distance une sauvegarde et réplication de la base de données ont été effectué quand nécessaire. Connexion à la base de données L utilisateur de l application doit premièrement s identifier (voir maquette «Connexion à SQL Server 2012») Puis l application développée sous Visual Studio 2013 communique avec la base de données hébergée sous SQL Server 2012 par le biais d une classe de Connexion. Cette classe utilise l adresse IP du serveur hébergé par l équipe de réseaux. Ces derniers ont crée deux utilisateur sur le serveur, l un administrateur de la base de données, l autre utilisateur (lecture et écriture) de la base de données propre à l application.
ChaineConnexion = "Server=" + m_nomserveur + ";Database=" + m_nombd + ";User Id=" + m_login + ";Password=" + m_mdp + ";" Ainsi l utilisateur de l application peut lire et insérer des nouvelles informations. Structure de la base de données Procédure stockée Toute communication avec la base de données s effectue par procédure stockée.
Ajouter un Don ALTER PROCEDURE [dbo].[adddon] -- Add the parameters for the stored procedure here @unnumperso varchar(50), @unedate varchar(50), @unmontant varchar(50), @resultat VARCHAR(50) OUT TRANSACTION; IF NOT EXISTS (SELECT * FROM personne WHERE numperso = @unnumperso) set @resultat= 'Personne n''existe pas'; ELSE IF EXISTS (SELECT * FROM date WHERE datedon = @unedate) set @resultat= 'Date déjà existante'; INSERT INTO donner values(@unnumperso,@unedate,@unmontant) set @resultat= 'nouvelle date inséré'; ELSE INSERT INTO date values(@unedate); set @resultat= 'nouvelle date inséré'; INSERT INTO donner values(@unnumperso,@unedate,@unmontant) set @resultat= 'Donnée inséré'; COMMIT; Ajouter une Mission ALTER PROCEDURE [dbo].[addmission] -- Add the parameters for the stored procedure here @unnummission int, @unnommission varchar(50), @unedescmission varchar(100),@unedatecreamission varchar(50),@unedatedebmission varchar(50),@unedatefinmission varchar(50),@unnumpays int, @resultat VARCHAR(50) OUT IF EXISTS (SELECT * FROM mission WHERE nummission = @unnummission) begin set @resultat= 'numéro de la mission existant'; end else begin INSERT INTO mission values(@unnummission,@unnommission,@unedescmission,@unedatecreamission,@unedatedebmiss ion,@unedatefinmission,@unnumpays); set @resultat= 'mission insérer'; end Ajouter une Personne ALTER PROCEDURE [dbo].[addpersonne] -- Add the parameters for the stored procedure here @unnumperso int, @unnomperso varchar(50), @unprenomperso varchar(50), @uneadresperso varchar(100),@untelperso varchar(50), @resultat VARCHAR(50) OUT IF EXISTS (SELECT * FROM personne WHERE numperso = @unnumperso) begin set @resultat= 'numéro du client existant'; end
else begin INSERT INTO personne values(@unnumperso,@unnomperso,@unprenomperso, @uneadresperso,@untelperso); set @resultat= 'client inséré'; end Lister les bénévoles compétents pour une mission ALTER PROCEDURE [dbo].[goodbenevole] (@uncodespec varchar(10)) Select personne.numperso, nomperso, prenomperso from personne inner join benevole on personne.numperso = benevole.numperso inner join avoir on benevole.numperso = avoir.numperso inner join role on avoir.codespec = role.codespec WHERE role.codespec = @uncodespec Lister les bénévoles sur chaque mission ALTER PROCEDURE [dbo].[benevoleaffecter] (@unnummission int) Select nomperso, prenomperso from affecter inner join benevole on affecter.numperso = benevole.numperso inner join personne on benevole.numperso = personne.numperso WHERE nummission = @unnummission Lister les donateurs ALTER PROCEDURE [dbo].[listedonateur] Select personne.numperso, nomperso, prenomperso, adresperso, telperso, montant, datedon FROM donner INNER JOIN personne ON donner.numperso = personne.numperso ORDER BY datedon desc Lister les missions ALTER PROCEDURE [dbo].[listemission] (@unnummission int) IF EXISTS (Select * from enroler where NumMission=@unNumMission) Select nommission, descmission, datecreamission, datedebmission, datefinmission, nompays, risque, nomvaccin, descvac, librole, codespec FROM enroler INNER JOIN role on enroler.coderole = role.coderole INNER JOIN mission on enroler.nummission = mission.nummission INNER JOIN pays ON mission.numpays = pays.numpays INNER JOIN necessiter on pays.numpays = necessiter.numpays INNER JOIN vaccin on necessiter.numvaccin = vaccin.numvac
WHERE mission.nummission = @unnummission ELSE Select nommission, descmission, datecreamission, datedebmission, datefinmission, nompays, risque, nomvaccin, descvac FROM mission INNER JOIN pays ON mission.numpays = pays.numpays INNER JOIN necessiter on pays.numpays = necessiter.numpays INNER JOIN vaccin on necessiter.numvaccin = vaccin.numvac WHERE nummission = @unnummission Liste le nom des missions ALTER PROCEDURE [dbo].[listenommission] Select nommission, nummission, descmission FROM mission Affecter un Bénévole à une mission (voir trigger plus bas) Insert INTO enroler values (@unnummission, @unnumperso, @uncoderole) Application Développé sous Visual Studio 2013, au démarrage l application stock dans une collection l ensemble des donateurs et leurs dons. Private Sub frmprincipal_load(sender As Object, e As EventArgs) Handles MyBase.Load maconnexion2.ouvrir() Dim cmd As New SqlCommand With cmd.connection = maconnexion2.getconnexion.commandtext = "listedonateur".commandtype = CommandType.StoredProcedure 'au lieu de Text End With Dim rdr As SqlDataReader = cmd.executereader(commandbehavior.closeconnection) While rdr.read Dim undonateur As New Donateur(rdr.Item("numPerso"), rdr.item("nomperso"), rdr.item("prenomperso"), rdr.item("adresperso"), rdr.item("telperso"), 0) CollDonateurs.Add(unDonateur) Dim undon As New Don(rdr.Item("numPerso"), rdr.item("datedon"), rdr.item("montant"), 0) CollDon.Add(unDon) End While End Sub L ajout de donateur et de dons se fait à l intérieur des collections. A la fermeture de l application, la base de données est mise à jour à partir des classes et des collections : Private Sub frmprincipal_closed(byval sender As Object, _
For Each Donateur In CollDonateurs If (Donateur.NewDonateur = 1) Then CALL adddonateur() For Each Don In CollDon If (Don.Num = Donateur.Num) And (Don.NewDon = 1) Then CALL adddon() MessageBox.Show("Insertion des nouveaux Dons...") End If Next MessageBox.Show("Mise à jour de la BDD") End If Next End Sub Déclencheur (Trigger) Une mission peut soit être dénué de bénévole, soi en avoir. Afin d envoyer les bons bénévoles sur les bonnes missions il est important de connaître les spécialités de chaque bénévole. Un bénévole ne peut être affecté sur une mission que si sa spécialité correspond au rôle de la mission. Ainsi, une mission peut : - soi n avoir aucun bénévole et donc aucun rôle - soi avoir au moins un bénévole pour que la méta-entité n ai pas de clé primaire vide. Cependant un même bénévole peut avoir plusieurs spécialités et un rôle correspond à une et une seule spécialité. Par conséquent si l on met un déclencheur sur affecter (la mission n a pas encore de bénévole) et que le bénévole à plusieurs spécialités alors on ne pourra pas choisir le rôle. C est pourquoi le déclencheur sera sur la méta-entité «enroler», lequel dispose du couple de clé primaire/étrangère du numéro de mission et du numéro de personne ainsi que la clé étrangère du code rôle. Pour conclure, l application permettra de choisir un rôle pour la mission et une procédure stocker renverra les bénévoles compétents pour ce rôle. Il faut donc, avant d insérer dans enroler : - Récupérer le numéro de la mission - Récupérer le numéro de la personne - Vérifier que les numéros existent - Vérifier que la personne est un bénévole - Vérifier que la spécialité de la personne correspond au rôle demandé par la mission