Vous êtes sur la page 1sur 66

OFPPT

Direction Régionale Centre Nord


ISTA Route Imouzzer Fès

Technicien en Techniques de Développement Informatique

Guide des travaux pratiques

Module 09 :

Développement d’application Client / Serveur

Linq To SQL,

Entity FramWork,

Connecté

et

Déconnecté

en Csharp

Hamid Mask
Formateur en TDI

1 / 66
TP1 : Gestion Commerciale.

5 Formulaires :

 Mise à jour de la table Client.


 Mise à jour de la table Article.
 Saisie d’une commande.
 Consultation des commandes d’un client avec calcul du Chiffre
d’affaires.
 Gestion des commandes. (à titre de travail de synthèse)

2 Rapports :

 Liste des clients par ville.


 Un rapport facture.

3 Graphiques :

 Courbe représentant le nombre de commandes par mois.


 Histogramme représentant les CA Mensuels par ville.
 Diagramme sectoriel comparant les pourcentages du CA des villes.

TP2 : Gestion Client à l’aide des PS.

TP3 : Gestion d’une Bibliothèque.

6 Formulaires :

 Mise à jour de la table Livre.


 Mise à jour de la table Adhérant.
 Saisies d’un emprunt de livre.
 Saisies d’un retour de livre.
 Consultation des emprunts entre deux dates.
 Consultation des emprunts non retournés au cours d’un mois.

2 Rapports :

 Liste des emprunts retournés avec une colonne retard, affichant le


retard au-delà de 15 jours.

2 Graphiques :

2 / 66
 Comparant les nombres d’emprunts des livres d’un thème donné.
(Thème = Economie, « Initiation à l’économie »  60%, « Economie
par la pratique »  30%, . . . etc.)
 Un autre comparant les nombres d’emprunts par thème. (Maths 
50%, Physique  30%, Economie 10% . . . etc.)

Travaux demandés :

Vous devez développer l’application correspondant à TP1 :

 En Linq To SQL.
 Puis en mode connecté.

Vous devez, d’autre part, développer l’application correspondant à TP3 :

 En mode déconnecté.
 Puis en Linq To SQL.

3 / 66
TP1 : Gestion Commerciale.
En Linq To SQL

I - La base de données et le DataContext :

I – 1 La base de données (Vente).

I – 2 Le DataContext (Vente).

4 / 66
I - Les formulaires :

I – 1 Mise à jour de la table Client.

1 – Interface à réaliser :

2 - Code à développer :

 La navigation dans la table client et la recherche d’un client.


 La mise à jour de la table client (Ajouter, Modifier et supprimer).

I – 2 Mise à jour de la table Article.

1 – Interface à réaliser :

2 - Code à développer :

 La navigation dans la table Article et la recherche d’un article.


5 / 66
 La mise à jour de la table Article (Ajouter, Modifier et supprimer).

I – 3 Saisies d’une commande.

1 – Interface à réaliser :

2 - Code à développer :

 Les Combos doivent être remplies par les codes clients et codes articles.
 Le N° de commande sera saisi et la Date de commande sera choisie dans un
DateTimePicker.
 Une fois le code Client choisi, le Nom et la Ville s’affichent automatiquement.
 Une fois le code Article choisi, la désignation et le PU s’affichent automatiquement et le
curseur est positionné dans le TextBox correspondant à la quantité.
 Un Clic sur le bouton « Ajouter Ligne » fait descendre la ligne dans le DataGridView.
 Le bouton « Ajouter Ligne » fait aussi ce qui suit :
 calcule le Montant de la ligne et le Total de la commande à chaque ajout de ligne.
 Verifie si le stock est suffisant (Quantité commandée <= Quantité en stock, c.à.d.
Qte < = Qdisp) et affiche le message « Stock insuffisant ! » si ce n’est pas le cas.
 Le bouton « Supprimer Ligne » permet de supprimer une ligne sélectionnée dans le
DataGridView et recalcule le Total de la commande.
 Prévoir le fait qu’après avoir ajouté un article dans le DataGridView son code est supprimé
du Combo CboCodeArt pour ne pas le choisir une 2eme fois (risque de doublon).

Lorsqu’il n’y a plus aucune modification à effectuer sur la commande, on peut l’enregistrer
dans la base de données.

 Le bouton « Enregistrer la commande » permet d’enregistrer la commande et ses lignes


(ses détails).
 Le bouton « Enregistrer la commande » fait aussi ce qui suit :

6 / 66
 Mise à jour du stock (retranche la quantité commandée de chaque article de la
commande de la quantité en stock de ce même article)
 Effacer le formulaire pour préparer la saisie d’une autre commande.

I – 4 Consultation des commandes d’un client.

1 – Interface à réaliser :

2 - Code à développer :

 Le Combo code client doit être rempli par les codes des clients.
 Lorsque le code d’un client est choisi :
 le Nom et la Ville s’affichent automatiquement.
 La liste de toutes ses commandes s’affiche dans le 1 er DataGridView.
 Son Chiffre d’affaires est calculé et affiché dans un TextBox.
(Chiffre d’affaires d’un client = Somme des totaux de ses commandes)

 Lorsqu’une commande est sélectionnée :


 Ses détails son affichés dans le 2eme DataGridView.
 Le Total HT de la commande, la TVA et le TTC sont calculés et affichés dans des
TextBoxs.

 Le bouton « Supprimer la commande » permet de supprimer une commande


sélectionnée dans le 1er DataGridView. Le Chiffre d’affaires du client est recalculé.

 On peut choisir d’afficher les détails de la première commande de la liste des commandes
pour chaque client choisi dans le combo.
7 / 66
I – 5 Gestion des commandes.

1 – Interface à réaliser :

2 - Code à développer :

Ce formulaire doit effectuer, en plus de la saisie d’une commande, les tâches


suivantes :

 La navigation entre les commandes et la recherche d’une commande quelconque.


 La modification et la suppression de commandes.

Suggestion :

 Utiliser un BindingSource CommandeBS pour naviguer entre les commandes.


 Une commande courante contient une collection de ses détails et un objet client.
 Créer une procédure Afficher(Commande c) qui, pour une commande courante,
affiche toutes les informations de la commande dans le formulaire.

8 / 66
I – 5 Astuces et compléments .

1 – Recherche multicritères :

Code du bouton rechercher :

dgv.Rows.Clear();
IQueryable<Client> Clients1 = dc.Client;
IQueryable<Client> Clients2 = dc.Client;

if (ChkNom.Checked)
{
Clients1 = from cl in dc.Client
where cl.Nom.StartsWith(TxtNomR.Text)
select cl;
}

if (ChkVille.Checked)
{
Clients2 = from cl in dc.Client
where cl.Ville == TxtVilleR.Text
select cl;
}

dgv.DataSource = Clients1.Intersect(Clients2);

Dans le cas où on an 5 cases à cocher (cas EFF 2017) :

dgv.DataSource = Clients1.Intersect(Clients2.Intersect(
Clients3.Intersect(Clients4.Intersect(Clients5))));

9 / 66
2 – Procédures et fonctions :
En générale, une procédure accepte plusieurs paramètres d’entrée (les
données) et retourne plusieurs paramètres de sortie (les résultats).
Alors qu’une fonction accepte plusieurs paramètres (les données) et retourne un
seul résultat.

Un exemple d’illustration :

public partial class Form1 : Form


{
// Procédure SomEtProd
private void SomEtProd(int A,int B,ref int S,ref int P)
{
S = A + B;
P = A * B;
}

// Fonction Somme
private int Somme(int A,int B)
{
return A + B;
}

// Bouton CmdAppelProc
private void CmdAppelProc_Click(object sender, EventArgs e)
{
int Som = 0;
int Prod = 0;
// Appel de la Procédure SomEtProd
SomEtProd(int.Parse(TxtA.Text), int.Parse(TxtB.Text),ref Som, ref Prod);
LblSom.Text = Som.ToString();
LblProd.Text = Prod.ToString();
}

// Bouton CmdAppelFonction
private void CmdAppelFonction_Click(object sender, EventArgs e)
{

10 / 66
// Appel de la fonction Somme
LblSomme.Text = Somme(int.Parse(TxtA.Text), int.Parse(TxtB.Text)).ToString();
} }

I – 6 Exercices :

Exercice 1 : Sélection multiple dans un DataGridView .


Copier une sélection multiple dans un DataGridView dgv1 Vers un DataGridView dgv2.

Dgv1 sera remplie par toutes les commandes :

foreach ( Commande c in dc.Commande)


{
dgv1.Rows.Add(c.NumCom, c.DateCom);
}

Bouton :

dgv2.Rows.Clear();
foreach (DataGridViewRow r in dgv1.SelectedRows)
{
dgv2.Rows.Add(r.Cells[0].Value, r.Cells[1].Value);
}

L’ordre des sélections est inversé !

Pour garder l’ordre des sélections, le code sera modifié comme suit :

dgv2.Rows.Clear();
for (int i = dgv1.SelectedRows.Count - 1; i >= 0; i--)
{
dgv2.Rows.Add(dgv1.SelectedRows[i].Cells[0].Value,
dgv1.SelectedRows[i].Cells[1].Value);
}

Exercice 2 : Sélection multiple dans un DataGridView.


11 / 66
Soient deux DataGridView : dgv1 et dgv2. dgv1 affiche une liste de commandes.
On veut effectuer une sélection multiple de commandes dans dgv1 et afficher dans
dgv2 la liste des commandes sélectionnées avec le total de chacune.

Dgv1 sera remplie par toutes les commandes :

foreach ( Commande c in dc.Commande)


{
dgv1.Rows.Add(c.NumCom, c.DateCom);
}

Bouton :

dgv2.Rows.Clear();
foreach ( DataGridViewRow r in dgv1.SelectedRows)
{
var com = (from c in dc.Commande
where c.NumCom == r.Cells[0].Value.ToString()
select c).First();

Tot = 0;
foreach ( Detail d in com.Detail)
{
Tot += double.Parse(d.Article.PU.ToString()) *
double.Parse(d.Qte.ToString());
}

dgv2.Rows.Add(com.NumCom,Tot);
}

L’ordre des sélections est inversé !

Pour garder l’ordre des sélections, le code sera modifié comme suit :

dgv2.Rows.Clear();
for (int i = dgv1.SelectedRows.Count - 1; i >= 0 ; i-- )
{
var com = (from c in dc.Commande
where c.NumCom ==
dgv1.SelectedRows[i].Cells[0].Value.ToString()
12 / 66
select c).First();
Tot = 0;
foreach (Detail d in com.Detail)
{
Tot += double.Parse(d.Article.PU.ToString()) *
double.Parse(d.Qte.ToString());
}

dgv2.Rows.Add(com.NumCom, Tot);
}

Exercice 3 : Calcul du nombre de jours, de mois et d’années d’une période.


Calculer et afficher le nombre de jours, de mois et d’années entre deux dates.

13 / 66
II - Les rapports (états) :

Un rapport crystal est un état de sortie.

II – 1 Liste des clients par ville.

II – 2 Un rapport facture.

14 / 66
III - Les Graphique (états) :

III – 1 Courbe nombre de commandes mensuel.

III – 2 Un Histogramme CA_Mensuel_ParVille.

15 / 66
III – 3 Diagramme sectoriel des pourcentages du CA de chaque ville.

16 / 66
TP3 : Gestion Commerciale.

Mise à jour de la table Client à l’aide


de Procédures Stockées

I - PS et Linq To SQL :
Dans la BD Vente, créer les PS suivantes :

Code T-SQL :

1. Insertion client
CREATE PROC PS_InsertCl

@codecl varchar(6),
@nom varchar(40),
@ville varchar(30)

AS
Insert Into client Values(@codecl,@nom,@ville)

 Test

Exec PS_InsertCl 'Cl20','xxx','Fes'

2. Modification client
CREATE PROCEDURE PS_UpdateCl

@codecl varchar(6),
@nom varchar(40),
@ville varchar(30)

AS
Update Client Set Nom=@nom,Ville=@ville Where Codecl=@codecl

 Test

Exec PS_UpdateCl 'Cl20','yyy','Casa'

3. Suppression client
CREATE PROCEDURE PS_DeleteCl

17 / 66
@codecl varchar(6)

AS
Delete client Where Codecl = @codecl

 Test

Exec PS_DeleteCl 'Cl20'

4. Recherche d'un client


CREATE PROCEDURE PS_SelectCl

@codecl varchar(6),
@nom varchar(40) output,
@ville varchar(30) output

AS
Select @nom=Nom,@ville=Ville From client Where Codecl=@codecl

 Test

Declare @Nomcl varchar(40)


Declare @Villecl varchar(30)
Exec PS_SelectCl 'Cl04',@Nomcl output,@Villecl output
Select ‘Nom : ‘, @Nomcl
Select ‘Ville : ‘,@Villecl

5. Procédure de navigation :

Go
Create Proc PS_Move
(@p int,
@CodeCl Varchar(6) Output,
@Nom Varchar(40) Output,
@Ville Varchar(40) Output)
As
Select @CodeCl = CodeCl, @Nom = Nom, @Ville = Ville
From (Select ROW_NUMBER()
OVER (ORDER BY CodeCl) AS Ligne,
CodeCl,Nom,Ville
From Client) As Cl
Where Ligne = @p
Go

 Test

Declare @C Varchar(6),@N Varchar(40),@V Varchar(40)


Exec PS_Move 2,@C Output,@N Output,@V Output
Select @C,' ',@N, ' ',@V

6. PS qui retourne le Nb de Clients : (pour avoir le dernier client)

Go
18 / 66
Create Proc PS_NbClients
(@NbCl int Output)
As
Select @NbCl = Count(*) From Client
Go

 Test

Declare @NbC int


Exec PS_NbClients @NbC Output
Select 'Nombre de clients : ',@NbC

7. PS qui recherche et retourne la position du Client: (pour


synchroniser la recherche avec la navigation)

Go
CREATE PROCEDURE PS_RecherchEtPos

@codecl varchar(6),
@nom varchar(40) output,
@ville varchar(30) output,
@Position int output
AS
Select @CodeCl = CodeCl, @Nom = Nom,
@Ville = Ville,@Position = Ligne
From (Select ROW_NUMBER()
OVER (ORDER BY CodeCl) AS Ligne,
CodeCl,Nom,Ville
From Client) As Cl
Where CodeCl = @codecl
Go

 Test

Declare @Nomcl varchar(40)


Declare @Villecl varchar(30)
Declare @Position int
Exec PS_RecherchEtPos 'Cl02',@Nomcl output,@Villecl
output,@Position output
Select @Position,' ',@Nomcl,' ',@Villecl

Faire glisser ces 4 PS dans la partie droite du DataContext :

19 / 66
8. Mise à jour de la table Client :

Code à développer :
Il s’agit de d’appeler les procédures stockées précédentes pour réaliser :
 La navigation dans la table client et la recherche d’un client.
 La mise à jour de la table client (Ajouter, Modifier et supprimer).

II - Exercice :

Refaire la saisie d’une commande et ses détails par des procédures stockées.

20 / 66
TP2 : Gestion d’une Bibliothèque.

Il s’agit de développer une application de gestion de bibliothèque en déconnecté.

I - La base de données (Biblio) :

I – 2 Le DataSet (dsBiblio).

21 / 66
I - Les formulaires :

I – 1 Mise à jour de la table Adhérent.

Créer un projet VS nommé « Gestion Bibliothèque» et le formulaire suivant permettant


de faire la mise à jour de la table Adhérent :

1er clic
2eme clic

I – 2 Mise à jour de la table Thème.

22 / 66
I – 3 Mise à jour de la table Livre.

I – 4 Saisie d’un emprunt de livre.

Il s’agit maintenant de réaliser l’emprunt de livres par des adhérents.

1 – Interface à réaliser :

2 - Code à développer :
Au choix d’un adhérent, son nom et ses emprunts passés sont affichées.
Au choix d’un thème, la liste de tous les livres de ce thème est affichée.
Après le choix d’un livre et d’une date d’emprunt, Le bouton « Enregistrer » permet
d’enregistrer l’emprunt dans la table Emprunt et de l’ajouter dans le DataGridView.

I – 5 Saisie d’un retour de livre.

Il s’agit maintenant de réaliser le retour d’emprunts de livres par des adhérents.

1 – Interface à réaliser :

23 / 66
2 - Code à développer :

Au choix d’un adhérent, son nom et ses emprunts passés sont affichées.
Après sélection de l’emprunt à retourner et le choix d’une date de retour, Le bouton
« Enregistrer » permet d’enregistrer le retour dans la table Emprunt et d’afficher la date
de retour de l’emprunt sélectionné dans le DataGridView.

Proposition de solutions

24 / 66
TP1 : Gestion Commerciale. (Linq To SQL)

I - Les formulaires :
I – 1 Mise à jour de la table Client.

Code C# :
namespace GestionCommerciale
{
public partial class MajClient_Avec_BS : Form
{
public VenteDataContext dc = new VenteDataContext();
public BindingSource ClientBS = new BindingSource();
public Client ClientActuel;

public Boolean Ajouter = false;

public MajClient_Avec_BS()
{
InitializeComponent();
}

private void MajClient_Avec_BS_Load(object sender, EventArgs e)


{
ClientBS.DataSource = dc.Client;
Afficher();
}

private void CmdQuitter_Click(object sender, EventArgs e)


{
this.Close();
}

25 / 66
public void Afficher()
{
ClientActuel = (Client) ClientBS.Current;
TxtCodeCl.Text = ClientActuel.CodeCl;
TxtNom.Text = ClientActuel.Nom;
TxtVille.Text = ClientActuel.Ville;
}

private void CmdSuivant_Click(object sender, EventArgs e)


{
ClientBS.MoveNext();
Afficher();

private void CmdPremier_Click(object sender, EventArgs e)


{
ClientBS.MoveFirst();
Afficher();
}

private void CmdPrecedent_Click(object sender, EventArgs e)


{
ClientBS.MovePrevious();
Afficher();
}
private void CmdDernier_Click(object sender, EventArgs e)
{
ClientBS.MoveLast();
Afficher();
}

private void CmdRechercher_Click(object sender, EventArgs e)


{
var cl = (from c in dc.Client
where c.CodeCl == TxtRechercheCl.Text
select c).First();

ClientBS.Position = ClientBS.IndexOf(cl);
Afficher();
}

private void CmdAjouter_Click(object sender, EventArgs e)


{
if (Ajouter == false)
{
Ajouter = true;
CmdAjouter.Text = "Ajouter";
TxtCodeCl.Clear();
TxtNom.Clear();
TxtVille.Clear();
ClientBS.AddNew();
TxtCodeCl.Focus();
}

else
{
((Client) ClientBS.Current).CodeCl = TxtCodeCl.Text;
((Client) ClientBS.Current).Nom = TxtNom.Text;
((Client) ClientBS.Current).Ville = TxtVille.Text;
ClientBS.EndEdit();

26 / 66
dc.SubmitChanges();

CmdAjouter.Text = "Nouveau";
Ajouter = false;
}
}

private void CmdModifier_Click(object sender, EventArgs e)


{
((Client)ClientBS.Current).Nom = TxtNom.Text;
((Client)ClientBS.Current).Ville = TxtVille.Text;
ClientBS.EndEdit();

dc.SubmitChanges();
}

private void CmdSupprimer_Click(object sender, EventArgs e)


{
ClientBS.RemoveCurrent();
dc.SubmitChanges();
Afficher();
}
}
}

I – 2 Mise à jour de la table Article.

Identique au code de la mise à jour de la table Client.

I – 3 Saisies d’une commande.

Code C# :

namespace GestionCommerciale
{
public partial class SaisieCommande : Form
{
public VenteDataContext dc = new VenteDataContext();
public int Qdispo, Q;
public double Total = 0;

public SaisieCommande()
{
InitializeComponent();
}

private void SaisieCommande_Load(object sender, EventArgs e)


{

// Remplissage du Combo Client


CboCodeCl.Items.Clear();

foreach (Client cl in dc.Client)


{
CboCodeCl.Items.Add(cl.CodeCl);
}

// Remplissage du Combo Article


CboCodeArt.Items.Clear();

27 / 66
foreach (Article art in dc.Article)
{
CboCodeArt.Items.Add(art.CodeArt);
}

LblMessage.Text = "";

private void CboCodeCl_SelectedIndexChanged(object sender, EventArgs e)


{
var cl = (from c in dc.Client
where c.CodeCl == CboCodeCl.Text
select c).FirstOrDefault();

if ( cl != null)
{
TxtNom.Text = cl.Nom;
TxtVille.Text = cl.Ville;
}

private void CboCodeArt_SelectedIndexChanged(object sender, EventArgs e)


{
var art = (from a in dc.Article
where a.CodeArt == CboCodeArt.Text
select a).First();

if (art != null)
{
TxtDesi.Text = art.Desi;
TxtPU.Text = art.PU.ToString();
TxtQte.Clear();
Qdispo = Convert.ToInt32( art.Qdisp);
TxtQte.Focus();
}

private void CmdQuitter_Click(object sender, EventArgs e)


{
this.Close();
}

private void CmdAjouterLigne_Click(object sender, EventArgs e)


{

// Controle de la quantité commandée ( Qte < Qdispo )


if ( Convert.ToInt32(TxtQte.Text) > Qdispo)
{
TxtQte.Text = Qdispo.ToString();
LblMessage.Text = "Stock insuffisant !";
}
else
{
// Ajout de la ligne dans le DataGridView
double Montant = double.Parse(TxtPU.Text) * int.Parse(TxtQte.Text);
string[] Ligne = { CboCodeArt.Text, TxtDesi.Text, TxtPU.Text, TxtQte.Text, Montant.ToString() };

28 / 66
DG1.Rows.Add(Ligne);

Total = Total + Montant;


TxtTotal.Text = Total.ToString();

// Trier le DataGridView DG1


DG1.Sort(DG1.Columns[0], System.ComponentModel.ListSortDirection.Ascending);

// Suppression (dans le Combo) du code de l'article choisi


CboCodeArt.Items.Remove(CboCodeArt.Text);
CboCodeArt.Text = "";
TxtDesi.Clear();
TxtPU.Clear();
TxtQte.Clear();
LblMessage.Text = "";
}
}

private void CmdSupprimerLigne_Click(object sender, EventArgs e)


{
// Ajout du code de l'article dans le Combo
CboCodeArt.Items.Add(DG1.CurrentRow.Cells[0].Value);
CboCodeArt.Sorted = true;

// Recalcul du total
Total = Total - double.Parse(DG1.Rows[DG1.CurrentRow.Index].Cells[2].Value.ToString()) *
int.Parse(DG1.Rows[DG1.CurrentRow.Index].Cells[3].Value.ToString());
TxtTotal.Text = Total.ToString();

// Suppression de la ligne du DataGridView


DG1.Rows.RemoveAt(DG1.CurrentRow.Index);

private void CmdEnregistrer_Click(object sender, EventArgs e)


{
// Enregistrement de la commande dans la table Commande
Commande c = new Commande();
c.NumCom = TxtNumCom.Text;
c.DateCom = DtpDateCom.Value;
c.CodeCl = CboCodeCl.Text;
dc.Commande.InsertOnSubmit(c);

// Enregistrement des lignes de commande dans la table detail


for ( int i = 0; i <= DG1.Rows.Count - 2; ++i)
{
Detail d = new Detail();
d.NumCom = TxtNumCom.Text;
d.CodeArt = DG1.Rows[i].Cells[0].Value.ToString();
d.Qte = int.Parse(DG1.Rows[i].Cells[3].Value.ToString());
dc.Detail.InsertOnSubmit(d);

// Ajout du code de l'article dans le Combo


CboCodeArt.Items.Add(DG1.Rows[i].Cells[0].Value);
CboCodeArt.Sorted = true;

//Mise à jour de la Quantité disponible (Gestion du stock)


int k = i;
var art = (from a in dc.Article
where a.CodeArt == DG1.Rows[k].Cells[0].Value.ToString()

29 / 66
select a).First();

Q = int.Parse(DG1.Rows[i].Cells[3].Value.ToString());
Qdispo = Convert.ToInt32(art.Qdisp);
art.Qdisp = Qdispo - Q;

// Enregistrement dans la BD
dc.SubmitChanges();

TxtNumCom.Clear();
DtpDateCom.Update();
CboCodeCl.Text = "";
TxtNom.Clear();
TxtVille.Clear();
DG1.Rows.Clear();
TxtTotal.Clear();

private void DG1_CellContentClick(object sender, DataGridViewCellEventArgs e)


{
CboCodeArt.Text = DG1.Rows[DG1.CurrentRow.Index].Cells[0].Value.ToString();
TxtDesi.Text = DG1.Rows[DG1.CurrentRow.Index].Cells[1].Value.ToString();
TxtPU.Text = DG1.Rows[DG1.CurrentRow.Index].Cells[2].Value.ToString();
TxtQte.Text = DG1.Rows[DG1.CurrentRow.Index].Cells[3].Value.ToString();
DG1.Rows.RemoveAt(DG1.CurrentRow.Index);
Total = Total - double.Parse(TxtPU.Text) * int.Parse(TxtQte.Text);
TxtTotal.Text = Total.ToString();

TxtQte.Focus();
}
}
}

I – 4 Consultation des commandes d’un client.

Code C# :

namespace GestionCommerciale
{
public partial class ConsulterCommandesParClient : Form
{
public VenteDataContext dc = new VenteDataContext();
public double Total,CA;

public ConsulterCommandesParClient()
{
InitializeComponent();
}

private void ConsulterCommandesParClient_Load(object sender, EventArgs e)


30 / 66
{
// Remplissage du Combo Client
CboCodeCl.Items.Clear();
foreach (Client c in dc.Client)
{
CboCodeCl.Items.Add(c.CodeCl);
}

private void CmdQuitter_Click(object sender, EventArgs e)


{
this.Close();
}

private void CboCodeCl_SelectedIndexChanged(object sender, EventArgs e)


{
var cl = (from c in dc.Client
where c.CodeCl == CboCodeCl.Text
select c).First();

if (cl != null)
{
TxtNom.Text = cl.Nom;
TxtVille.Text = cl.Ville;
}

dgCommandes.Rows.Clear();
foreach (Commande c in cl.Commande)
{
dgCommandes.Rows.Add(c.NumCom, c.DateCom);
}

// Calcul et affichage du CA du client


CA = 0;
foreach (Commande c in cl.Commande)
{
foreach (Detail d in c.Detail)
{
CA += Convert.ToDouble(d.Article.PU) * Convert.ToInt32(d.Qte);
}
}

TxtCA.Text = CA.ToString();

private void dgCommandes_Click(object sender, EventArgs e)


{
string s = dgCommandes.SelectedRows[0].Cells[0].Value.ToString();
var com = (from c in dc.Commande
where c.NumCom == s
select c).First();

dgDetails.Rows.Clear();
Total = 0;
foreach (Detail d in com.Detail)
{
double Montant = Convert.ToDouble(d.Article.PU) * Convert.ToInt32(d.Qte);
dgDetails.Rows.Add(d.CodeArt, d.Article.Desi, d.Article.PU, d.Qte, Montant);
Total += Montant;
}

31 / 66
TxtTotal.Text = Total.ToString();
TxtTVA.Text = (Total * 0.2).ToString();
TxtTTC.Text = (Total * 1.2).ToString();
}
}
}

I – 5 Gestion des commandes.

Travail de synthèse : à faire faire par les stagiaires.

II - Les rapports (états) :

II – 1 Liste des clients par ville.

 Liste des clients par ville (pour toutes les villes)

Assistant de création de rapport

32 / 66
Code C# :

public partial class FrmListeClientsParVille : Form


{
VenteDataContext dc = new VenteDataContext();

private void FrmListeClientsParVille _Load(object sender, EventArgs e)


{
crListeClientsParVille1.SetDataSource(dc.Client);
}
}

 Liste des clients d’une ville (choisie dans un combo)

33 / 66
Code C# :

public partial class FrmListeClientsPourUneVille : Form


{
VenteDataContext dc = new VenteDataContext();

private void FrmListeClientsPourUneVille _Load(object sender, EventArgs e)


{
var Villes = (from cl in dc.Client
select cl.Ville).Distinct();

foreach (String v in Villes)


{
CboVille.Items.Add(v);
}
}

private void CboVille_SelectedIndexChanged(object sender, EventArgs e)


{
var Clients = from cl in dc.Client
where cl.Ville == CboVille.Text
select cl;

crListeClients_ParVille1.SetDataSource(Clients);
crystalReportViewer1.RefreshReport();
}

II – 2 Un rapport facture.

La vue utilisée : Vue_Facture

Create View Vue_Facture


As
SELECT a.CodeCl, Nom, Ville, b.NumCom, DateCom, Qte, d.CodeArt, Desi, PU,
PU * Qte AS MontantLigne
FROM Client a
JOIN Commande b ON a.CodeCl = b.Codecl
JOIN Detail c ON b.NumCom = c.NumCom
JOIN Article d ON c.CodeArt = d.CodeArt

 Factures (pour toutes les commandes)

34 / 66
Code C# :
public partial class Facture : Form
{
VenteDataContext dc = new VenteDataContext();

private void Facture_Load(object sender, EventArgs e)


{
crFacture.SetDataSource(dc.VueFacture);
}
}

 Facture d’une commande choisie dans un combo.

35 / 66
Code C# :
public partial class FrmFacture_Une : Form
{
VenteDataContext dc = new VenteDataContext();

private void FrmFacture_Une _Load(object sender, EventArgs e)


{
var NumCs = from c in dc.Commande
select c.NumCom;

foreach (String n in NumCs)


{
CboNumCom.Items.Add(n);
}
}

private void CboNumCom_SelectedIndexChanged(object sender, EventArgs e)


{
var Coms = from c in dc.Vue_Facture
where c.NumCom == CboNmCom.Text
select c;
crFacture1.SetDataSource(Coms);
crystalReportViewer1.RefreshReport();
}
}
III - Les Graphique (états) :

III – 1 Courbe représentant le nombre de commandes par mois.

La vue utilisée : Vue_NbCom_Mensuel

Create View Vue_ NbCom_Mensuel


As
SELECT MONTH(DateCom) AS Mois, COUNT(NumCom) AS NbCommandes
FROM Commande
GROUP BY MONTH(DateCom)

36 / 66
III – 2 Histogramme CA_ Mensuel_ParVille.

La vue utilisée : Vue_CA_Mensuel_ParVille

Create View Vue_CA_Mensuel_ParVille


As
SELECT MONTH(DateCom) AS Mois, Ville, SUM(PU * Qte) AS CA_Mensuel_ParVille
FROM Client a JOIN Commande b ON a.CodeCl = b.CodeCl
JOIN Detail c ON b.NumCom = c.NumCom JOIN Article d ON c.CodeArt = d.CodeArt
GROUP BY MONTH(DateCom), Ville

III – 3 Diagramme sectoriel des pourcentages du CA de chaque ville.

La vue utilisée : Vue_CA_ParVille

Create View Vue_CA_ParVille


As
SELECT Ville, SUM(PU * Qte) AS CA_ParVille
FROM Client a
JOIN Commande b ON a.CodeCl = b.Codecl
JOIN Detail c ON b.NumCom = c.NumCom
JOIN Article d ON c.CodeArt = d.CodeArt
GROUP BY Ville
37 / 66
TP3 : Gestion Commerciale.

Mise à jour de la table Client à l’aide


de Procédures Stockées

I - PS et Linq To SQL :

1. Mise à jour de la table Client :

38 / 66
Code C# :

public partial class MajClient_Avec_PS : Form


{
public VenteDataContext dc = new VenteDataContext();
public int p=1;

public MajClient_Avec_PS()
{
InitializeComponent();
}

private void MajClient_Avec_PS_Load( . . . )


{
string C = "", N = "", V = "";
dc.PS_Move(p, ref C, ref N, ref V);
Afficher(C, N, V);

public void Afficher(string Code,string Nom, string Ville)


{
TxtCodeCl.Text = Code;
TxtNom.Text = Nom;
TxtVille.Text = Ville;
}

private void CmdQuitter_Click( . . . )


{
this.Close();
}

private void CmdPremier_Click( . . . )


{
p = 1;
string C = "", N = "", V = "";
dc.PS_Move(p, ref C, ref N, ref V);
Afficher(C, N, V);
}

private void CmdSuivant_Click( . . . )


{
int? NBC = 0;
dc.PS_NbClients(ref NBC);
if ( p < NBC)
{
string C = "", N = "", V = "";
dc.PS_Move(++p, ref C, ref N, ref V);
Afficher(C, N, V);
}

}
39 / 66
private void CmdPrecedent_Click( . . . )
{
if ( p > 1)
{
string C = "", N = "", V = "";
dc.PS_Move(--p, ref C, ref N, ref V);
Afficher(C, N, V);
}
}

private void CmdDernier_Click( . . . )


{
int? NBC = 0;
dc.PS_NbClients(ref NBC);
p = (int) NBC;
string C = "", N = "", V = "";
dc.PS_Move(p, ref C, ref N, ref V);
Afficher(C, N, V);
}

private void CmdRechercher_Click( . . . )


{
int? pos = 0;
string N = "", V = "";
dc.PS_RecherchEtPos(TxtRechercheCl.Text, ref N, ref V, ref pos);
Afficher(TxtRechercheCl.Text, N, V);
p = (int) pos;
}

private void CmdAjouter_Click( . . . )


{
if (CmdAjouter.Text == "Nouveau")
{
CmdAjouter.Text = "Ajouter";
TxtCodeCl.Clear();
TxtNom.Clear();
TxtVille.Clear();
TxtCodeCl.Focus();
}
else
{
dc.PS_InsertCl(TxtCodeCl.Text,TxtNom.Text,TxtVille.Text);

int? NBC = 0;
dc.PS_NbClients(ref NBC);
p = (int)NBC;

CmdAjouter.Text = "Nouveau";

}
}

40 / 66
private void CmdModifier_Click( . . . )
{
dc.PS_UpdateCl(TxtCodeCl.Text, TxtNom.Text, TxtVille.Text);
}

private void CmdSupprimer_Click(object sender, EventArgs e)


{
dc.PS_DeleteCl(TxtCodeCl.Text);
int? NBC = 0;
dc.PS_NbClients(ref NBC);
if ( p > NBC)
{
p--;
}

string C = "", N = "", V = "";


dc.PS_Move(p, ref C, ref N, ref V);
Afficher(C, N, V);
}
}

TP1 : Gestion Commerciale. (Mode Connecté)

I - Les formulaires :
I – 1 Mise à jour de la table Client.

Code C# :
namespace GestionCommercial_Connecté_CSharp
{
41 / 66
public partial class MajClient : Form
{
public static string strcon = @"Data Source=.\sqlexpress;Initial Catalog=Vente;
Integrated Security=True";
public static string ReqSelect = "Select * From Client";
public static SqlConnection con = new SqlConnection(strcon);
public SqlCommand CmdSelect = new SqlCommand(ReqSelect,con);
public SqlDataReader dr;

public BindingSource ClientBS = new BindingSource();


public Boolean Ajouter = false;

public MajClient()
{
InitializeComponent();
}

private void MajClient_Load(object sender, EventArgs e)


{

DataTable dt = new DataTable();


con.Open();
dr = CmdSelect.ExecuteReader();
dt.Load(dr);
ClientBS.DataSource = dt;
con.Close();

Affichage();
}

private void Affichage()


{
TxtCodeCl.Text = ((DataRowView) ClientBS.Current)[0].ToString();
TxtNom.Text = ((DataRowView)ClientBS.Current)[1].ToString();
TxtVille.Text = ((DataRowView)ClientBS.Current)[2].ToString();
}

private void CmdQuitter_Click(object sender, EventArgs e)


{
this.Close();
}

private void CmdPremier_Click(object sender, EventArgs e)


{
ClientBS.MoveFirst();
Affichage();
}

private void CmdSuivant_Click(object sender, EventArgs e)


{
ClientBS.MoveNext();
Affichage();

42 / 66
}

private void CmdPrecedent_Click(object sender, EventArgs e)


{
ClientBS.MovePrevious();
Affichage();
}

private void CmdDernier_Click(object sender, EventArgs e)


{
ClientBS.MoveLast();
Affichage();
}

private void CmdAjouter_Click_1(object sender, EventArgs e)


{

if (Ajouter == false)
{
Ajouter = true;
CmdAjouter.Text = "Ajouter";
TxtCodeCl.Clear();
TxtNom.Clear();
TxtVille.Clear();
TxtCodeCl.Focus();
}

else
{
if (con.State == ConnectionState.Open)
{
con.Close();
}

con.Open();
string ReqInsert = "Insert Into Client Values(' " + TxtCodeCl.Text + " ',' " +
TxtNom.Text + " ',' " + TxtVille.Text + " ')";
SqlCommand CmdInsert = new SqlCommand(ReqInsert, con);
CmdInsert.ExecuteNonQuery();
con.Close();
MajClient_Load(sender, e);
ClientBS.MoveLast();

CmdAjouter.Text = "Nouveau";
Ajouter = false;
}
}

43 / 66
private void CmdModifier_Click(object sender, EventArgs e)
{
int p = ClientBS.Position;
if (con.State == ConnectionState.Open)
{
con.Close();
}

con.Open();
string ReqUpdate = "Update Client Set Nom = ' " + TxtNom.Text + " ', Ville = '" +
TxtVille.Text + " ' Where CodeCl = ' " + TxtCodeCl.Text + " ' ";
SqlCommand CmdUpdate = new SqlCommand(ReqUpdate, con);
CmdUpdate.ExecuteNonQuery();
con.Close();

MajClient_Load(sender, e);
ClientBS.Position = p;
}

private void CmdSupprimer_Click(object sender, EventArgs e)


{
int p = ClientBS.Position;

if (con.State == ConnectionState.Open)
{
con.Close();
}

con.Open();
string ReqDelete = "Delete Client Where CodeCl = ' " + TxtCodeCl.Text + " ' ";
SqlCommand CmdDelete = new SqlCommand(ReqDelete, con);
CmdDelete.ExecuteNonQuery();
con.Close();

MajClient_Load(sender, e);
If ( p == ClientBS.Count() )
{
ClientBS.Position = p - 1;
}

private void CmdRechercher_Click(object sender, EventArgs e)


{
ClientBS.Position = ClientBS.Find("CodeCl", TxtRechercheCl.Text);
Affichage();
}
}
}

I – 2 Mise à jour de la table Article.

Identique au code de la mise à jour de la table Client.

44 / 66
I – 3 Saisies d’une commande.

Code C# :

namespace GestionCommercial_Connecté_CSharp
{
public partial class SaisieCommande : Form
{
public string strcon = @"Data Source=.\sqlexpress;Initial Catalog=Vente;
Integrated Security=True";
public SqlConnection con = new SqlConnection();
public string ReqSelectCl = "select * from client";
public string ReqSelectArt = "select * from article";
public SqlCommand CmdSelect = new SqlCommand();
SqlDataReader dr;

public int Qdispo, Q;


public double Total = 0;

public SaisieCommande()
{
InitializeComponent();
}

private void SaisieCommande_Load(object sender, EventArgs e)


{
con.ConnectionString= strcon;
CmdSelect.Connection = con;
con.Open();

// Remplissage du Combo Client


CmdSelect.CommandText = ReqSelectCl;
dr = CmdSelect.ExecuteReader();
while (dr.Read())
{
CboCodeCl.Items.Add(dr[0]);
}
dr.Close();

// Remplissage du Combo Article


dr.Close();
CmdSelect.CommandText = ReqSelectArt;
dr = CmdSelect.ExecuteReader();
while (dr.Read())
{
CboCodeArt.Items.Add(dr[0]);
}
dr.Close();

private void CboCodeCl_SelectedIndexChanged(object sender, EventArgs e)

45 / 66
{
string ReqSelectClient = "select nom,ville from client where codeCl='" +
CboCodeCl.Text + "'";
CmdSelect.CommandText = ReqSelectClient;

dr = CmdSelect.ExecuteReader();
dr.Read();
TxtNom.Text = dr[0].ToString();
TxtVille.Text = dr[1].ToString();
dr.Close();
}

private void CboCodeArt_SelectedIndexChanged(object sender, EventArgs e)


{
string ReqSelectArticle = "Select Desi,PU,Qdisp From article Where codeArt='" +
CboCodeArt.Text + "'";
CmdSelect.CommandText = ReqSelectArticle;

dr = CmdSelect.ExecuteReader();
dr.Read();
TxtDesi.Text = dr[0].ToString();
TxtPU.Text = dr[1].ToString();
Qdispo = int.Parse(dr[2].ToString());
TxtQte.Focus();
dr.Close();

private void CmdAjouterLigne_Click(object sender, EventArgs e)


{
// Controle de la quantité commandée ( Qte < Qdispo )
if ( int.Parse(TxtQte.Text) > Qdispo)
{
TxtQte.Text = Qdispo.ToString();
LblMessage.Text = "Stock insuffisant !";
}
else
{
// Ajout de la ligne dans le DataGridView
double Montant = double.Parse(TxtPU.Text) * int.Parse(TxtQte.Text);
string[] Ligne = { CboCodeArt.Text, TxtDesi.Text, TxtPU.Text, TxtQte.Text, Montant.ToString() };
DG1.Rows.Add(Ligne);

Total = Total + Montant;


TxtTotal.Text = Total.ToString();

// Trier le DataGridView DG1


DG1.Sort(DG1.Columns[0], System.ComponentModel.ListSortDirection.Ascending);

// Suppression (dans le Combo) du code de l'article choisi


CboCodeArt.Items.Remove(CboCodeArt.Text);
CboCodeArt.Text = "";
TxtDesi.Clear();

46 / 66
TxtPU.Clear();
TxtQte.Clear();
LblMessage.Text = "";
}
}

private void CmdEnregistrer_Click(object sender, EventArgs e)


{
SqlCommand CmdInsert = new SqlCommand();
CmdInsert.Connection = con;
// Enregistrer la commande dans la table Commande
string ReqInsertCom = "Insert into Commande values ('" + TxtNumCom.Text +
"','" + DtpDateCom.Value + "','" + CboCodeCl.Text + "')";
CmdInsert.CommandText = ReqInsertCom;
CmdInsert.ExecuteNonQuery();

// Enregistrement des lignes de commande


MessageBox.Show("" + DG1.Rows.Count);

for (int i = 0; i <= DG1.Rows.Count - 2; i++)


{
// Enregistrement de la i eme ligne de commande
string ReqInsertDet = "Insert into Detail values('" + TxtNumCom.Text +
"','" + DG1.Rows[i].Cells[0].Value.ToString() + "'," +
int.Parse(DG1.Rows[i].Cells[3].Value.ToString()) + ")";
CmdInsert.CommandText = ReqInsertDet;
CmdInsert.ExecuteNonQuery();

// Mise a jour de la quantité en Stock (Qdisp)


SqlCommand CmdUpdate = new SqlCommand();
CmdUpdate.Connection = con;
string ReqUpdateArt = "Update Article set Qdisp = Qdisp - " +
Convert.ToInt32(DG1.Rows[i].Cells[3].Value.ToString()) +
" Where CodeArt = '" + DG1.Rows[i].Cells[0].Value.ToString() + "'";
CmdUpdate.CommandText = ReqUpdateArt;
CmdUpdate.ExecuteNonQuery();
}
// Effacement du formulaire
TxtNumCom.Clear();
DtpDateCom.ResetText();
CboCodeCl.Text = "";
CboCodeArt.Text = "";
TxtNom.Clear();
TxtVille.Clear();
DG1.Rows.Clear();
TxtTotal.Clear();

con.Close();
}

private void CmdQuitter_Click(object sender, EventArgs e)


{
this.Close();

47 / 66
}

private void CmdSupprimerLigne_Click(object sender, EventArgs e)


{

// Ajout du code de l'article dans le Combo


CboCodeArt.Items.Add(DG1.CurrentRow.Cells[0].Value);
CboCodeArt.Sorted = true;

// Recalcul du total
Total = Total -
double.Parse(DG1.Rows[DG1.CurrentRow.Index].Cells[2].Value.ToString()) *
int.Parse(DG1.Rows[DG1.CurrentRow.Index].Cells[3].Value.ToString());
TxtTotal.Text = Total.ToString();

// Suppression de la ligne du DataGridView


DG1.Rows.RemoveAt(DG1.CurrentRow.Index);
}
}
}

I – 4 Consultation des commandes d’un client.

Code C# :

namespace GestionCommercial_Connecté_CSharp
{
public partial class ConsulterCommandesParClient : Form
{

public string strcon = @"Data Source=.\sqlexpress;Initial Catalog=Vente;


Integrated Security=True";
public SqlConnection con = new SqlConnection();
public string ReqSelectCl = "Select * From Client";
public SqlCommand CmdSelect = new SqlCommand();
SqlDataReader dr;

public int Qdispo;


public double Total,CA;

public ConsulterCommandesParClient()
{
InitializeComponent();
}

private void ConsulterCommandesParClient_Load(object sender, EventArgs e)


{
con.ConnectionString = strcon;

48 / 66
CmdSelect.Connection = con;
con.Open();

// Remplissage du Combo Client


CmdSelect.CommandText = ReqSelectCl;
dr = CmdSelect.ExecuteReader();
while (dr.Read())
{
CboCodeCl.Items.Add(dr[0]);
}
dr.Close();

private void CboCodeCl_SelectedIndexChanged(object sender, EventArgs e)


{
// Affichage du Nom et Ville
CmdSelect.CommandText ="Select nom,ville From Client Where codeCl='" +
CboCodeCl.Text + "'";

dr = CmdSelect.ExecuteReader();
dr.Read();
TxtNom.Text = dr[0].ToString();
TxtVille.Text = dr[1].ToString();
dr.Close();

// Affichage de la liste des commandes du client


CmdSelect.CommandText = "Select NumCom,DateCom From Commande Where
codeCl='" +
CboCodeCl.Text + "'";
dr = CmdSelect.ExecuteReader();
dgCommandes.Rows.Clear();
while (dr.Read())
{
string[] Ligne = { dr[0].ToString(), dr[1].ToString() };
dgCommandes.Rows.Add(Ligne);
}
dr.Close();

// Calcul du Chiffre d'affaires du client


CmdSelect.CommandText = "Select Sum(PU*Qte) From Detail a " +
"Join Article b On a.CodeArt = b.CodeArt " +
"Join Commande c On a.NumCom = c.NumCom " +
"where CodeCl = '" + CboCodeCl.Text + "'";
TxtCA.Text = (CmdSelect.ExecuteScalar()).ToString();

private void CmdQuitter_Click(object sender, EventArgs e)


{
this.Close();
}

49 / 66
private void dgCommandes_Click(object sender, EventArgs e)
{
// Affichage des lignes de la commande
CmdSelect.CommandText = "Select a.CodeArt,Desi,PU,Qte,PU*Qte From Detail a " +
"Join Article b On a.CodeArt = b.CodeArt " + "Where NumCom = '" +
dgCommandes.SelectedRows[0].Cells[0].Value.ToString() + "'";
dr = CmdSelect.ExecuteReader();
dgDetails.Rows.Clear();
while (dr.Read())
{
string[] Ligne = { dr[0].ToString(), dr[1].ToString(), dr[2].ToString(),
dr[3].ToString(), dr[4].ToString() };
dgDetails.Rows.Add(Ligne);
}
dr.Close();

//Calcu du Total (HT,TVA et TTC) de la commande


CmdSelect.CommandText = "Select Sum(PU*Qte) From Detail a " +
"Join Article b On a.CodeArt = b.CodeArt Where NumCom = '" +
dgCommandes.SelectedRows[0].Cells[0].Value.ToString() + "'";
double Total = (double) CmdSelect.ExecuteScalar();
TxtTotal.Text = Total.ToString();
TxtTVA.Text = (Total * 0.2).ToString();
TxtTTC.Text = (Total * 1.2).ToString();
}
}
}

TP3 : Gestion Commerciale.


Mise à jour de la table Client à l’aide de Procédures Stockées

I - PS et Linq To SQL :
Dans la BD Vente, créer les PS suivantes :

Code T-SQL :
CREATE Proc PS_Insert

@CodeCl varchar(6),
@Nom varchar(30),
@Ville varchar(20)
As
Insert Into Client Values(@CodeCl,@Nom,@Ville)

CREATE Proc PS_Update

@CodeCl varchar(6),
@Nom varchar(30),

50 / 66
@Ville varchar(20)
As
Update Client Set Nom=@Nom,Ville=@Ville Where CodeCl=@CodeCl

CREATE Proc PS_Delete

@CodeCl varchar(6)
As
Delete Client Where CodeCl = @CodeCl

CREATE Proc PS_Select

@CodeCl varchar(6),
@Nom varchar(30) output,
@Ville varchar(20) output
As
Select @Nom=Nom,@Ville=Ville
From Client
Where CodeCl=@CodeCl

Faire glisser ces 4 PS dans la partie droite du DataContext :

Code C# :
namespace GestionCommerciale
{
public partial class MajClient_Avec_PS : Form
{
public VenteDataContext dc = new VenteDataContext();
public BindingSource ClientBS = new BindingSource();
public Client ClientActuel;

public Boolean Ajouter = false;

public MajClient_Avec_PS()
{
InitializeComponent();
}

private void CmdAjouter_Click(object sender, EventArgs e)


{
if (Ajouter == false)
{

51 / 66
Ajouter = true;
CmdAjouter.Text = "Ajouter";
TxtCodeCl.Clear();
TxtNom.Clear();
TxtVille.Clear();
TxtCodeCl.Focus();
}
else
{
dc.PS_InsertCl(TxtCodeCl.Text, TxtNom.Text, TxtVille.Text);

CmdAjouter.Text = "Nouveau";
Ajouter = false;
}
}

public void Afficher()


{
ClientActuel = (Client)ClientBS.Current;
TxtCodeCl.Text = ClientActuel.CodeCl;
TxtNom.Text = ClientActuel.Nom;
TxtVille.Text = ClientActuel.Ville;
}

private void CmdSuivant_Click(object sender, EventArgs e)


{
ClientBS.MoveNext();
Afficher();
}

private void CmdPremier_Click(object sender, EventArgs e)


{
ClientBS.MoveFirst();
Afficher();
}

private void CmdPrecedent_Click(object sender, EventArgs e)


{
ClientBS.MovePrevious();
Afficher();
}

private void CmdDernier_Click(object sender, EventArgs e)


{
ClientBS.MoveLast();
Afficher();
}

private void CmdSupprimer_Click(object sender, EventArgs e)


{
dc.PS_DeleteCl(TxtCodeCl.Text);
}

52 / 66
private void CmdModifier_Click(object sender, EventArgs e)
{
dc.PS_UpdateCl(TxtCodeCl.Text, TxtNom.Text, TxtVille.Text);
}

private void CmdRechercher_Click(object sender, EventArgs e)


{
string xNom = "";
string xVille = "";

dc.PS_SelectCl(TxtRechercheCl.Text,ref xNom, ref xVille);

TxtCodeCl.Text = TxtRechercheCl.Text;
TxtNom.Text = xNom;
TxtVille.Text = xVille;
}

private void MajClient_Avec_PS_Load(object sender, EventArgs e)


{
ClientBS.DataSource = dc.Client;
Afficher();
}
}
}

II - PS et mode connecté :

Code C# :

namespace GestionCommercial_Connecté_CSharp
{
public partial class MajClient_AvecPS : Form
{
public string strcon = @"Data Source=.\sqlexpress;Initial Catalog=Vente;
Integrated Security=True";
public SqlConnection con = new SqlConnection();
public SqlCommand CmdSelect = new SqlCommand();
public SqlCommand CmdMaj = new SqlCommand();
public Boolean Ajouter = false;

public MajClient_AvecPS()
{
InitializeComponent();
}

private void MajClient_AvecPS_Load(object sender, EventArgs e)


{
con.ConnectionString = strcon;
CmdMaj.Connection = con;
CmdMaj.CommandType = CommandType.StoredProcedure;
CmdSelect.Connection = con;
CmdSelect.CommandType = CommandType.StoredProcedure;
53 / 66
CmdSelect.CommandText = "PS_SelectCl";
}

private void CmdAjouter_Click(object sender, EventArgs e)


{
if (Ajouter == false)
{
Ajouter = true;
CmdAjouter.Text = "Ajouter";
TxtCodeCl.Clear();
TxtNom.Clear();
TxtVille.Clear();
TxtCodeCl.Focus();
}
else
{
con.Open();
CmdMaj.CommandText = "PS_InsertCl";
SqlParameter paramCodeCl = new SqlParameter("@CodeCl",
SqlDbType.VarChar,6);
paramCodeCl.Direction = ParameterDirection.Input;
paramCodeCl.Value = TxtCodeCl.Text;
SqlParameter paramNom = new SqlParameter("@Nom", SqlDbType.VarChar,40);
paramNom.Direction = ParameterDirection.Input;
paramNom.Value = TxtNom.Text;

SqlParameter paramVille = new SqlParameter("@Ville", SqlDbType.VarChar,30);


paramVille.Direction = ParameterDirection.Input;
paramVille.Value = TxtVille.Text;

CmdMaj.Parameters.Add(paramCodeCl);
CmdMaj.Parameters.Add(paramNom);
CmdMaj.Parameters.Add(paramVille);
CmdMaj.ExecuteNonQuery();

CmdMaj.Parameters.Clear();
con.Close();

CmdAjouter.Text = "Nouveau";
Ajouter = false;
}
}

private void CmdRechercher_Click(object sender, EventArgs e)


{
con.Open();

SqlParameter paramCodeCl = new SqlParameter("@CodeCl",


SqlDbType.VarChar,6);
paramCodeCl.Direction = ParameterDirection.Input;
paramCodeCl.Value = TxtRechercheCl.Text;

54 / 66
SqlParameter paramNom = new SqlParameter("@Nom",
SqlDbType.VarChar,40);
paramNom.Direction = ParameterDirection.Output;

SqlParameter paramVille = new SqlParameter("@Ville", SqlDbType.VarChar,30);


paramVille.Direction = ParameterDirection.Output;

CmdSelect.Parameters.Add(paramCodeCl);
CmdSelect.Parameters.Add(paramNom);
CmdSelect.Parameters.Add(paramVille);
SqlDataReader dr = CmdSelect.ExecuteReader();

//if ( (string) CmdSelect.Parameters["@Nom"].Value != null)


//{
TxtCodeCl.Text = TxtRechercheCl.Text;
TxtNom.Text = CmdSelect.Parameters["@Nom"].Value.ToString();
TxtVille.Text = CmdSelect.Parameters["@Ville"].Value.ToString();
//}
//else
// MessageBox.Show("Client inexistant !!");

CmdSelect.Parameters.Clear();
con.Close();
}

private void CmdQuitter_Click(object sender, EventArgs e)


{
this.Close();
}

private void CmdModifier_Click(object sender, EventArgs e)


{
con.Open();
CmdMaj.CommandText = "PS_UpdateCl";
SqlParameter paramCodeCl = new SqlParameter("@CodeCl", SqlDbType.VarChar,
6);
paramCodeCl.Direction = ParameterDirection.Input;
paramCodeCl.Value = TxtCodeCl.Text;
SqlParameter paramNom = new SqlParameter("@Nom", SqlDbType.VarChar,
40);
paramNom.Direction = ParameterDirection.Input;
paramNom.Value = TxtNom.Text;

SqlParameter paramVille = new SqlParameter("@Ville", SqlDbType.VarChar, 30);


paramVille.Direction = ParameterDirection.Input;
paramVille.Value = TxtVille.Text;

CmdMaj.Parameters.Add(paramCodeCl);
CmdMaj.Parameters.Add(paramNom);
CmdMaj.Parameters.Add(paramVille);
CmdMaj.ExecuteNonQuery();

55 / 66
CmdMaj.Parameters.Clear();
con.Close();
}

private void CmdSupprimer_Click(object sender, EventArgs e)


{
con.Open();
CmdMaj.CommandText = "PS_DeleteCl";
SqlParameter paramCodeCl = new SqlParameter("@CodeCl", SqlDbType.VarChar, 6);
paramCodeCl.Direction = ParameterDirection.Input;
paramCodeCl.Value = TxtCodeCl.Text;

CmdMaj.Parameters.Add(paramCodeCl);
CmdMaj.ExecuteNonQuery();

CmdMaj.Parameters.Clear();
con.Close();
}
}
}

56 / 66
Manipulation d’un document XML avec C#

DOM (Document Object Model)

TP1 : Manipulations de base d’un fichier XML

Pour les exemples qui suivent, nous utiliserons le document XML suivant (resto.xml) :

<?xml version="1.0" encoding="utf-8" ?>


<restaurant>
<menu type="gastronomique">
<entrees>
57 / 66
<nom calories="50">radis</nom>
<nom calories="300">pate</nom>
<nom calories="350">saucisson</nom>
</entrees>
<plats>
<nom calories="1000">choucroute</nom>
<nom calories="2000">cassoulet</nom>
<nom calories="1700">couscous</nom>
</plats>
<fromages>
<nom calorie="240">camembert</nom>
<nom calories="300">brie</nom>
<nom calories="120">roquefort</nom>
</fromages>
<desserts>
<nom calories="340" parfum="chocolat">glace</nom>
<nom calories="250" fruits="pommes">tarte</nom>
<nom calories="400">creme brule</nom>
</desserts>
</menu>

<menu type="economique">
<entrees>
<nom calories="50">pain</nom>
</entrees>
<plats>
<nom calories="1700">jambon</nom>
</plats>
<fromages>
<nom calorie="240">camembert</nom>
</fromages>
<desserts>
<nom calories="340" parfum="a l’eau">glace</nom>
</desserts>
</menu>
</restaurant>

 Exemple 1 : L’exemple suivant recherche les nœuds «menu» dans


l’arborescence et affiche l’attribut type.

58 / 66
 Code C# :

using System.Xml;

namespace XML_Et_CSharp_Initiation  La solution


{
public partial class Exemple_1 : Form
{
public XmlDocument document = new XmlDocument();
public XmlNodeList menus;

private void Exemple_1_Load( . . . )


{
document.Load(@"Chemin\resto.xml");
menus = document.GetElementsByTagName("menu");

foreach (XmlNode unMenu in menus)


LstMenus.Items.Add(unMenu.Attributes["type"].Value);

}
}
}

 Exemple 2 : Ajout d’un attribut au nœud « menu ». Et sa suppression.

 Code C# :

using System.Xml;

namespace XML_Et_CSharp_Initiation
{
59 / 66
public partial class Exemple_2 : Form
{

public XmlDocument document = new XmlDocument();


public XmlNodeList menus;

private void Exemple_2_Load( . . . )


{

document.Load(@"Chemin\resto.xml");
menus = document.GetElementsByTagName("menu");

private void CmdAjouterAttribut_Click( . . . )


{

XmlAttribute att;

foreach (XmlNode unMenu in menus)


{
if (unMenu.Attributes["type"].Value == "gastronomique")
{
att = document.CreateAttribute("prix");
att.Value = "50";
unMenu.Attributes.Append(att);
}

if (unMenu.Attributes["type"].Value == "economique")
{
att = document.CreateAttribute("prix");
att.Value = "15";
unMenu.Attributes.Append(att);
}

// Enregistrer les modification dans le fichier XML


//document.Save(@"Chemin\resto.xml");

foreach (XmlNode unMenu in menus)


LstMenus.Items.Add(unMenu.OuterXml);

private void CmdSupprimerAttribut_Click( . . . )


{

foreach (XmlElement unMenu in menus)


{
unMenu.RemoveAttribute("prix");
}

LstMenus.Items.Clear();

60 / 66
foreach (XmlNode unMenu in menus)
LstMenus.Items.Add(unMenu.OuterXml);

// Enregistrer les modification dans le fichier XML


//document.Save(@"Chemin\resto.xml");

}
}
}

 Exemple 3 : Ajout de nœuds enfants à des nœuds de l’arborescence.

L’exemple suivant ajoute un digestif au menu gastronomique.

 Code C# :

using System.Xml;

namespace XML_Et_CSharp_Initiation
{
public partial class Exemple_3 : Form

61 / 66
{

public XmlDocument document = new XmlDocument();


public XmlNodeList menus;

private void Exemple_3_Load( . . . )


{

document.Load(@"Chemin\resto.xml");
menus = document.GetElementsByTagName("menu");

private void CmdAjouterNoeud_Click( . . . )


{
LstMenus.Items.Clear();
foreach ( XmlNode unMenu in menus)
{
if ( unMenu.Attributes["type"].Value == "gastronomique" )
{
XmlNode n1, n2, n3;
n1 = document.CreateNode(XmlNodeType.Element, "digestif", "");
n2 = document.CreateNode(XmlNodeType.Element, "nom", "");
n3 = document.CreateNode(XmlNodeType.Text, "", "" );
n3.Value = "Thé";
n2.AppendChild(n3);
n1.AppendChild(n2);
unMenu.AppendChild(n1);

LstMenus.Items.Add(unMenu.LastChild.PreviousSibling.OuterXml);
LstMenus.Items.Add(unMenu.LastChild.OuterXml);
}
}
}

private void CmdSupprimerNoeud_Click( . . . )


{

LstMenus.Items.Clear();
foreach (XmlNode unMenu in menus)
{
if (unMenu.Attributes["type"].Value == "gastronomique")
{
unMenu.RemoveChild(unMenu.LastChild);
LstMenus.Items.Add(unMenu.LastChild.OuterXml);
}
}
}
}
}

62 / 66
TP2 : Mise à jour d’un fichier XML

using System.Xml;

namespace XML_Et_CSharp_Initiation
{

public partial class Form1 : Form


{
public XmlDocument document = new XmlDocument();
public XmlNodeList elts;
63 / 66
public XmlNode elt;
public int Position;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)


{
document.Load(@"C:\Clients.xml");
elts = document.GetElementsByTagName("Client");

Position = 0;
Afficher(Position);
}

private void Afficher(int p)


{
elt = elts[p];

Txt_Id.Text = elt.Attributes[0].Value;
Txt_Nom.Text = elt.ChildNodes[0].InnerText;
Txt_Prenom.Text = elt.ChildNodes[1].InnerText;
Txt_Ville.Text = elt.ChildNodes[2].InnerText;
Txt_Tel.Text = elt.ChildNodes[3].InnerText;
}
private void CmdPremier_Click(object sender, EventArgs e)
{
Position = 0;
Afficher(Position);
}

private void CmdPrecedent_Click(object sender, EventArgs e)


{
if (Position > 0)
{
Position -= 1;
Afficher(Position);
}
}

private void CmdSuivant_Click(object sender, EventArgs e)


{
if (Position < elts.Count - 1)
{
Position += 1;
Afficher(Position);
}
}

private void CmdDernier_Click(object sender, EventArgs e)


{
Position = elts.Count -1;
Afficher(Position);
}

private void CmdAjouter_Click(object sender, EventArgs e)


{
XmlElement elemClient;
XmlAttribute attrId;
XmlElement elemNom;
XmlElement elemPrenom;

64 / 66
XmlElement elemVille;
XmlElement elemTel;

// creation de la balise [Client][/Client]


elemClient = document.CreateElement("Client");
// creation de l'attribut id [Client][/Client]
attrId = document.CreateAttribute("id");
// creation des balises [Nom][/Nom], [Prenom][/Prenom],[Ville][/Ville] et
// [Telephone][/Telephone]
elemNom = document.CreateElement("Nom");
elemPrenom = document.CreateElement("Prenom");
elemVille = document.CreateElement("Ville");
elemTel = document.CreateElement("Telephone");

// définissons les valeurs de nos balises et attributs


attrId.Value = Txt_Id.Text;
elemNom.InnerText = Txt_Nom.Text;
elemPrenom.InnerText = Txt_Prenom.Text;
elemVille.InnerText = Txt_Ville.Text;
elemTel.InnerText = Txt_Tel.Text;

// ajouter les balises enfants à la balise parent


elemClient.Attributes.Append(attrId);
elemClient.AppendChild(elemNom);
elemClient.AppendChild(elemPrenom);
elemClient.AppendChild(elemVille);
elemClient.AppendChild(elemTel);

// ajouter la balise parent au document Xml


document.DocumentElement.AppendChild(elemClient);

// Ecriture du Xml
document.Save(@"C:\Clients.xml");
MessageBox.Show("Enregistrement réussi");

private void CmdSupprimer_Click(object sender, EventArgs e)


{
xElt = elt.PreviousSibling;
document.DocumentElement.RemoveChild(elt);
elt = xElt;
Afficher(elt);

// Ecriture du Xml
document.Save("C:\Clients.xml");
MessageBox.Show("Suppression réussi");
}

private void CmdModifier_Click(object sender, EventArgs e)


{
xElt = elt;
elt.Attributes[0].Value = Txt_Id.Text;
elt.ChildNodes[0].InnerText = Txt_Nom.Text;
elt.ChildNodes[1].InnerText = Txt_Prenom.Text;
elt.ChildNodes[2].InnerText = Txt_Ville.Text;
elt.ChildNodes[3].InnerText = Txt_Tel.Text;
document.DocumentElement.ReplaceChild(elt,xElt);
// Ecriture du Xml
document.Save("C:\Clients.xml");

65 / 66
private void CmdRechercher_Click(object sender, EventArgs e)
{
//elt = document.DocumentElement;
XPathNodeIterator noeuds = navigateur.Select("/Clients/Client[@id='" +
TxtRechercher.Text + "']");
noeuds.MoveNext();
//MessageBox.Show(noeuds.Current.InnerXml.ToString());
Txt_Id.Text = noeuds.Current.GetAttribute("id", "");
noeuds.Current.MoveToFirstChild();
Txt_Nom.Text = noeuds.Current.Value;
noeuds.Current.MoveToNext();
Txt_Prenom.Text = noeuds.Current.Value;
noeuds.Current.MoveToNext();
Txt_Ville.Text = noeuds.Current.Value;
noeuds.Current.MoveToNext();
Txt_Tel.Text = noeuds.Current.Value;
Position = noeuds.CurrentPosition;
MessageBox.Show("" + noeuds.CurrentPosition);
}
}
}

Et très bonne réussite.

66 / 66