Jan.01
TP19 : Gestion de parking en utilisant la technologie LINQ.
Objectif
LINQ (Requête intégrée au langage) est un composant du Framework .NET de Microsoft qui ajoute des capacités d’interrogation sur des données aux langages .NET en utilisant une syntaxe proche de celle de SQL.
Dans ce TP, vous allez développer une application de gestion de parkings en utilisant la technologie LINQ.
Problème
On veut développer une application de gestion des parkings qui se trouvent dans les différentes villes. Un parking est caractérisé par son nom, son adresse, sa capacité (le nombre de places) et le nombre de places qui sont libres à une instante donnée. Le paiement d’un parking se fait selon le type d’abonnement choisi par le client ; exemple de type : « Mensuel », « Trimestre », « Semestre », « Annuel ». L’application utilise la base de données suivante :
NB : Les champs marqués en gras et soulignés représentent les clés primaires des tables, les champs marqués par # représentent les clés étrangères.
Client (idClt, nomClt, prenClt, adresseClt)
Parking (idPark, nomPark, adPark, ville, nbPlace, nbPlaceLibre)
TypeAbonnement (idTypeAb, nomTypeAb, prix)
Abonnement (idAb, dateAb, #idPark, #idTypeAb,#idClt)
Entree (idEntre, dateEntree, #idAb)
Questions
Partie serveur :
- Créer la Base Park.
- Dans la base Park, crée les tables : Client, Parking, TypeAbonnement, Abonnement et Entree.
- Remplir les tables.
Partie client :
- Crée un menu qui facilite l’utilisation de l’application.
- Créer un formulaire de gestion de la table Abonnement avec :
- Des boutons pour l’ajout, la modification et la suppression
- L’identifiant du parking, du type d’abonnement et du client sont choisis dans listes déroulante
- Inclure des boutons de navigation : premier, suivant, précédent et dernier.
- Réaliser un formulaire qui affiche dans une grille, la liste des abonnements concernant un type d’abonnement sélectionné à partir d’un Combobox et une ville saisie dans une zone de texte. La liste affiche le nom du parking, le nom du client, et la date de l’abonnement.
- Réaliser un formulaire qui affiche dans une grille, la liste des parkings (nom et adresse) qui ont reçu plus que 10 entrées pendant une date donnée.
Correction
La classe Menu
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TP20_GestionPark_LINQ { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void abonnementToolStripMenuItem_Click(object sender, EventArgs e) { GestionAb a = new GestionAb(); a.Show(); } private void listeDabonnementsToolStripMenuItem_Click(object sender, EventArgs e) { listeAbonnements la = new listeAbonnements(); la.Show(); } private void listeDeParkingsToolStripMenuItem_Click(object sender, EventArgs e) { listeParkings lp = new listeParkings(); lp.Show(); } } }
La classe Gestion Abonnement
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TP20_GestionPark_LINQ { public partial class GestionAb : Form { DataParkDataContext dp = new DataParkDataContext(); BindingSource bs = new BindingSource(); public GestionAb() { InitializeComponent(); } private void GestionAb_Load(object sender, EventArgs e) { remplirDataGrid(); remplirComboClient(); remplirComboParking(); remplirComboTypeAb(); //remplirChamps(); } public void remplirChamps() { bs.DataSource = dp.Abonnements; GestionAbonnement a = (GestionAbonnement)bs.Current; txtId.Text = a.idAb.ToString(); datePickAb.Text = a.dateAb.Date.ToString(); comboPk.SelectedValue = a.idPark; comboTypeAb.SelectedValue = a.idTypeAb; comboClt.SelectedValue = a.idClt; } public void remplirDataGrid() { var listeAb = (from ab in dp.Abonnements join clt in dp.Clients on ab.idClt equals clt.idClt join typeAb in dp.TypeAbonnements on ab.idTypeAb equals typeAb.idTypeAb join pk in dp.Parkings on ab.idPark equals pk.idPark select new { ab.idAb, ab.dateAb, pk.nomPark, typeAb.nomTypeAb, nomClient = clt.nomClt + " " + clt.prenClt }); dv.DataSource = listeAb; } public void remplirComboClient() { var listeClt = (from clt in dp.Clients select new { clt.idClt, nomClient = clt.nomClt + " " + clt.prenClt }).ToList(); comboClt.DataSource = listeClt; comboClt.DisplayMember = "nomClient"; comboClt.ValueMember = "idClt"; comboClt.SelectedIndex = -1; } public void remplirComboParking() { var listePk = (from pk in dp.Parkings select new { pk.idPark, pk.nomPark }).ToList(); comboPk.DataSource = listePk; comboPk.DisplayMember = "nomPark"; comboPk.ValueMember = "idPark"; comboPk.SelectedIndex = -1; } public void remplirComboTypeAb() { var listeTypeAb = (from typeAb in dp.TypeAbonnements select new { typeAb.idTypeAb, typeAb.nomTypeAb, }).ToList(); comboTypeAb.DataSource = listeTypeAb; comboTypeAb.DisplayMember = "nomTypeAb"; comboTypeAb.ValueMember = "idTypeAb"; comboTypeAb.SelectedIndex = -1; } private void add_Click(object sender, EventArgs e) { GestionAbonnement ab = new GestionAbonnement(); ab.idAb = int.Parse(txtId.Text); ab.dateAb = datePickAb.Value; ab.idPark = (int) comboPk.SelectedValue; ab.idTypeAb = (int) comboTypeAb.SelectedValue; ab.idClt = (int)comboClt.SelectedValue; dp.Abonnements.InsertOnSubmit(ab); dp.SubmitChanges(); remplirDataGrid(); viderChamps(); } public void viderChamps() { txtId.Text = ""; datePickAb.Text = DateTime.Now.Date.ToString(); comboClt.SelectedIndex = -1; comboPk.SelectedIndex = -1; comboTypeAb.SelectedIndex = -1; } private void edit_Click(object sender, EventArgs e) { var abonne = (from ab in dp.Abonnements where ab.idAb == int.Parse(txtId.Text) select ab).SingleOrDefault(); abonne.dateAb = datePickAb.Value; abonne.idPark = (int)comboPk.SelectedValue; abonne.idTypeAb = (int)comboTypeAb.SelectedValue; abonne.idClt = (int)comboClt.SelectedValue; dp.SubmitChanges(); remplirDataGrid(); viderChamps(); } private void First_Click(object sender, EventArgs e) { bs.MoveFirst(); remplirChamps(); } private void Previous_Click(object sender, EventArgs e) { bs.MovePrevious(); remplirChamps(); } private void Next_Click(object sender, EventArgs e) { bs.MoveNext(); remplirChamps(); } private void Last_Click(object sender, EventArgs e) { bs.MoveLast(); remplirChamps(); } private void button1_Click(object sender, EventArgs e) { viderChamps(); } private void drop_Click(object sender, EventArgs e) { var abonne = (from ab in dp.Abonnements where ab.idAb == int.Parse(txtId.Text) select ab).SingleOrDefault(); dp.Abonnements.DeleteOnSubmit(abonne); dp.SubmitChanges(); remplirDataGrid(); viderChamps(); } } }
La classe Liste des abonnements
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TP20_GestionPark_LINQ { public partial class listeAbonnements : Form { DataParkDataContext dp = new DataParkDataContext(); public listeAbonnements() { InitializeComponent(); } private void listeAbonnements_Load(object sender, EventArgs e) { } private void listeAbonnements_Load_1(object sender, EventArgs e) { var listeAb = (from ab in dp.Abonnements join clt in dp.Clients on ab.idClt equals clt.idClt join pk in dp.Parkings on ab.idPark equals pk.idPark select new { pk.nomPark, ab.dateAb, nomClient = clt.nomClt + " " + clt.prenClt }); dv.DataSource = listeAb; remplirComboTypeAb(); } public void remplirComboTypeAb() { var listeTypeAb = (from typeAb in dp.TypeAbonnements select new { typeAb.idTypeAb, typeAb.nomTypeAb, }).ToList(); comboTypeAb.DataSource = listeTypeAb; comboTypeAb.DisplayMember = "nomTypeAb"; comboTypeAb.ValueMember = "idTypeAb"; comboTypeAb.SelectedIndex = -1; } private void drop_Click(object sender, EventArgs e) { var listeAb = (from ab in dp.Abonnements join clt in dp.Clients on ab.idClt equals clt.idClt join typeAb in dp.TypeAbonnements on ab.idTypeAb equals typeAb.idTypeAb join pk in dp.Parkings on ab.idPark equals pk.idPark where pk.adressePark==txtVille.Text && typeAb.nomTypeAb==comboTypeAb.Text select new { ab.idAb, ab.dateAb, pk.nomPark, typeAb.nomTypeAb, nomClient = clt.nomClt + " " + clt.prenClt }); dv.DataSource = listeAb; } } }
La classe Liste des parkings
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TP20_GestionPark_LINQ { public partial class listeParkings : Form { DataParkDataContext dp = new DataParkDataContext(); public listeParkings() { InitializeComponent(); } private void drop_Click(object sender, EventArgs e) { var listePk = (from ab in dp.Abonnements join etr in dp.Entrees on ab.idAb equals etr.idAb join pk in dp.Parkings on ab.idPark equals pk.idPark where etr.dateEntree == datePickAb.Value group pk by new { pk.nomPark, pk.adressePark } into p where p.Count() > 10 select new { nom = p.Key.nomPark, ville = p.Key.adressePark }); dv.DataSource = listePk; } } }