Objectif:
Créer une application de gestion d’inventaire pour une entreprise. L’application doit permettre aux utilisateurs de gérer les produits en stock, les fournisseurs et les commandes.
Fonctionnalités requises:
- Ajouter, modifier et supprimer des produits en stock.
- Afficher une liste de tous les produits en stock avec leurs informations.
- Ajouter, modifier et supprimer des fournisseurs.
- Afficher une liste de tous les fournisseurs avec leurs informations.
- Enregistrer les commandes de produits avec les fournisseurs.
- Afficher une liste de toutes les commandes avec leurs informations.
Instructions:
- Créez une base de données SQL Server appelée « Inventaire ».
- Créez des tables pour les produits, les fournisseurs et les commandes.
- Utilisez VB.NET pour créer une interface utilisateur pour gérer les produits, les fournisseurs et les commandes.
- Connectez-vous à la base de données SQL Server depuis votre application VB.NET.
- Utilisez des requêtes SQL pour ajouter, modifier et supprimer des données de la base de données.
- Affichez les informations des produits, des fournisseurs et des commandes dans des grilles de données.
Conseils:
- Utilisez la bibliothèque .NET Framework SQLClient pour vous connecter à la base de données SQL Server.
- Utilisez des paramètres de requête pour éviter les injections SQL.
- Utilisez des objets de liaison de données pour afficher les données de la base de données dans des grilles de données.
- Utilisez des validations pour éviter les erreurs de saisie.
Voici un exemple de structure de table pour chaque table:
Table Produits:
- IDProduit (int, clé primaire)
- NomProduit (varchar(50))
- PrixUnitaire (decimal(18,2))
- QuantitéStock (int)
Table Fournisseurs:
- IDFournisseur (int, clé primaire)
- NomFournisseur (varchar(50))
- Adresse (varchar(50))
- Ville (varchar(50))
- CodePostal (varchar(10))
Table Commandes:
- IDCommande (int, clé primaire)
- IDProduit (int, clé étrangère référençant la table Produits)
- IDFournisseur (int, clé étrangère référençant la table Fournisseurs)
- DateCommande (datetime)
- QuantitéCommandée (int)
- MontantTotal (decimal(18,2))
La solution
Création de base de données
Pour créer une base de données SQL Server appelée « Inventaire » à l’aide d’une instruction SQL dans SQL Server Management Studio :
CREATE DATABASE Inventaire; use Inventaire;
Création des tables
Voici le code SQL pour créer des tables pour les produits, les fournisseurs et les commandes dans une base de données SQL Server :
-- Créer la table "Produits".
CREATE TABLE Produits (
IdProduit INT PRIMARY KEY,
NomProduit NVARCHAR(50),
PrixProduit DECIMAL(10,2),
QuantiteEnStock INT
);
-- Créer la table "Fournisseurs".
CREATE TABLE Fournisseurs (
IdFournisseur INT PRIMARY KEY,
NomFournisseur NVARCHAR(50),
AdresseFournisseur NVARCHAR(100),
TelephoneFournisseur NVARCHAR(20)
);
-- Créer la table "Commandes".
CREATE TABLE Commandes (
IdCommande INT PRIMARY KEY,
DateCommande DATETIME,
IdProduit INT FOREIGN KEY REFERENCES Produits(IdProduit),
IdFournisseur INT FOREIGN KEY REFERENCES Fournisseurs(IdFournisseur),
QuantiteCommandee INT
);
Assurez-vous d'exécuter ces commandes dans le contexte de votre base de données "Inventaire" pour créer les tables.
Déclaration de objets de connexion
Dim connection As SqlConnection
Dim produitsAdapter As SqlDataAdapter
Dim fournisseursAdapter As SqlDataAdapter
Dim commandesAdapter As SqlDataAdapter
Dim adJoint As SqlDataAdapter
Dim inventaireDataSet As DataSet
Connexion à la base de données
Imports System.Data.SqlClient
Public Sub SeConnecter()
' Créer la connexion à la base de données.
connection = New SqlConnection("Data Source=nom_serveur;Initial Catalog=Inventaire;Integrated Security=True;")
Try
' Ouvrir la connexion à la base de données.
connection.Open()
Catch ex As Exception
MessageBox.show("Erreur de connexion : " & ex.Message)
End Try
End Sub
Nous avons créé une procédure nommée « SeConnecter » qui se connecte à la base de données SQL Server en utilisant la chaîne de connexion fournie. Nous avons utilisé un bloc Try/Catch pour gérer les erreurs de connexion, et afficher un message de succès ou d’erreur. La connexion est ouverte et fermée dans la procédure pour garantir qu’elle ne reste pas ouverte inutilement. Cette procédure peut ensuite être appelée à partir d’autres parties de l’application pour établir une connexion à la base de données.
Remplir un ComboBox
Voici la procédure VB.NET qui remplit un ComboBox avec les noms des fournisseurs à partir des données d’une table « Fournisseurs » de la base de données « Inventaire » en utilisant la procédure de connexion et les objets de connexion :
Imports System.Data.SqlClient
Public Sub RemplirComboBoxFournisseurs()
' Requête SQL pour sélectionner la colonne "Nom" et "Id" de la table "Fournisseurs".
Dim query As String = "SELECT * FROM Fournisseurs"
' Créer un objet SqlDataAdapter à partir de la requête SQL et de la chaîne de connexion.
fournisseursAdapter = New SqlDataAdapter(query, connection)
' Créer un objet DataSet pour stocker les données renvoyées par l'adaptateur.
inventaireDataSet = New DataSet()
Try
' Remplir le DataSet avec les données renvoyées par l'adaptateur.
fournisseursAdapter.Fill(inventaireDataSet, "Fournisseurs")
' Lier les données du DataSet au ComboBox.
ComboBoxFournisseurs.DisplayMember = "Nom" ' La colonne "Nom" sera affichée dans la liste du ComboBox.
ComboBoxFournisseurs.ValueMember = "Id" ' L'identifiant du fournisseur sera stocké en tant que valeur de chaque élément du ComboBox.
ComboBoxFournisseurs.DataSource = inventaireDataSet.Tables("Fournisseurs")
' Lier le DataTable au ComboBox.
Catch ex As Exception
MessageBox.Show("Erreur : " & ex.Message)
End Try
End Sub
La requête SQL sélectionne à la fois l’identifiant et le nom de chaque fournisseur, puis un objet SqlDataAdapter est créé à partir de la requête SQL et de la chaîne de connexion.
Après cela, un objet DataSet est créé pour stocker les données renvoyées par l’adaptateur en utilisant la méthode Fill()
de l’adaptateur. L’objet DataSet stocke les données dans une table nommée « Fournisseurs ».
Enfin, les propriétés DisplayMember
et ValueMember
sont utilisées pour spécifier quelle colonne doit être affichée dans la liste du ComboBox et quelle colonne doit être utilisée comme valeur pour chaque élément de la liste. Le DataSet est lié au ComboBox en utilisant la propriété DataSource
du ComboBox.
Remplir un DataGridView
Voici un exemple de code qui utilise un DataSet pour remplir un DataGridView avec les données de la table Commandes :
Imports System.Data.SqlClient
Public Sub RemplirDataGridViewCommandes()
' Requête SQL pour sélectionner toutes les colonnes de la table "Commandes".
Dim query As String = "SELECT * FROM Commandes"
' Créer un objet SqlDataAdapter à partir de la requête SQL et de la chaîne de connexion.
fournisseursAdapter = New SqlDataAdapter(query, connection)
' Créer un objet DataSet pour stocker les données renvoyées par l'adaptateur.
inventaireDataSet = New DataSet()
Try
' Remplir le DataSet avec les données renvoyées par l'adaptateur.
fournisseursAdapter.Fill(dataSet, "Commandes")
' Lier les données du DataSet au DataGridView.
DataGridViewCommandes.DataSource = dataSet.Tables("Commandes")
Catch ex As Exception
MessageBox.Show("Erreur : " & ex.Message)
End Try
End Sub
La requête SQL sélectionne toutes les colonnes de la table « Commandes ». Ensuite, un objet SqlDataAdapter est créé à partir de la requête SQL et de la chaîne de connexion.
Après cela, un objet DataSet est créé pour stocker les données renvoyées par l’adaptateur en utilisant la méthode Fill()
de l’adaptateur. L’objet DataSet stocke les données dans une table nommée « Commandes ».
Enfin, le DataSet est lié au DataGridView en utilisant la propriété DataSource
du DataGridView. Cela affichera les données de la table « Commandes » dans le DataGridView.
Et Pour remplir le DataGridView avec le nom du produit et du fournisseur plutôt que leur ID, vous pouvez utiliser une requête SQL qui récupère les noms plutôt que les ID. Voici un exemple de code pour remplir le DataGridView avec les noms des produits et des fournisseurs :
Public Sub RemplirDataGridViewCommandes()
' Requête SQL pour sélectionner les colonnes nécessaires dans les tables "Produits" et "Fournisseurs".
Dim query As String = "SELECT Commandes.IdCommande, Produits.NomProduit, Fournisseurs.NomFournisseur, Commandes.Quantite, Commandes.DateCommande " & _
"FROM Commandes " & _
"INNER JOIN Produits ON Commandes.IdProduit = Produits.IdProduit " & _
"INNER JOIN Fournisseurs ON Commandes.IdFournisseur = Fournisseurs.IdFournisseur"
' Créer un objet SqlDataAdapter à partir de la requête SQL et de la chaîne de connexion.
Dim adJoint = New SqlDataAdapter(query, connectionString)
' Créer un objet DataSet pour stocker les données renvoyées par l'adaptateur.
inventaireDataSet = New DataSet()
Try
' Remplir le DataSet avec les données renvoyées par l'adaptateur.
adJoint.Fill(inventaireDataSet, "CommandesJoint")
' Lier les données du DataSet au DataGridView.
DataGridViewCommandes.DataSource = dataSet.Tables("CommandesJoint")
Catch ex As Exception
MessageBox.Show("Erreur : " & ex.Message)
End Try
End Sub
la requête SQL sélectionne les colonnes nécessaires dans les tables « Produits » et « Fournisseurs », et utilise une instruction INNER JOIN pour combiner les données des deux tables.
Notez que la colonne « IdCommande » est récupérée à partir de la table « Commandes », et les colonnes « NomProduit » et « NomFournisseur » sont récupérées à partir des tables correspondantes en utilisant leur nom.
En liant ensuite les données du DataSet au DataGridView, les noms des produits et des fournisseurs seront affichés dans les colonnes correspondantes du DataGridView.
Le bouton Ajouter
Pour ajouter un nouveau produit à partir des zones de texte en cliquant sur un bouton « Ajouter » en utilise le code suivant :
Private Sub btnAjouterProduit_Click(sender As Object, e As EventArgs) Handles btnAjouterProduit.Click
Try
' Créer un objet DataSet pour stocker les données de la table "Produits".
inventaireDataSet = New DataSet()
' Créer une nouvelle ligne dans le DataSet pour le nouveau produit.
Dim newRow As DataRow = inventaireDataSet.Tables("Produits").NewRow()
newRow("NomProduit") = txtNomProduit.Text
newRow("Description") = txtDescription.Text
newRow("PrixUnitaire") = Decimal.Parse(txtPrixUnitaire.Text)
ds.Tables("Produits").Rows.Add(newRow)
' Afficher un message de succès.
MessageBox.Show("Le nouveau produit a été ajouté avec succès.")
End Using
Catch ex As Exception
' Afficher un message d'erreur en cas d'exception.
MessageBox.Show("Une erreur s'est produite lors de l'ajout du nouveau produit : " & ex.Message)
End Try
End Sub
Ce code suppose que les zones de texte pour le nom du produit, la description et le prix unitaire ont les noms txtNomProduit
, txtDescription
et txtPrixUnitaire
, respectivement. Vous devrez peut-être ajuster ces noms en fonction de votre propre code.
Récupérer une ligne à partir du DataGridView
Le code qui permet de récupérer la ligne sélectionnée dans le DataGridView et de remplir les zones de texte :
Private Sub dgvProduits_SelectionChanged(sender As Object, e As EventArgs) Handles dgvProduits.SelectionChanged
If dgvProduits.SelectedRows.Count > 0 Then
Dim row As DataGridViewRow = dgvProduits.SelectedRows(0)
txtIdProduit.Text = row.Cells("idProduit").Value.ToString()
txtNomProduit.Text = row.Cells("nomProduit").Value.ToString()
txtPrixProduit.Text = row.Cells("prixProduit").Value.ToString()
End If
End Sub
La procédure est déclenchée chaque fois que la sélection dans le DataGridView est modifiée. Si une ligne est sélectionnée, les valeurs de chaque cellule de la ligne sont récupérées et affectées aux zones de texte correspondantes.
Modifier un produit
Pour modifier un produit en utilise le code suivant :
Private Sub ModifierProduit()
Dim id As Integer = Integer.Parse(txtId.Text)
Dim nom As String = txtNom.Text
Dim quantiteParUnite As String = txtQuantiteParUnite.Text
Dim prixUnitaire As Decimal = Decimal.Parse(txtPrixUnitaire.Text)
Dim index As Integer = -1
For i As Integer = 0 To ds.Tables("Produits").Rows.Count - 1
If CInt(inventaireDataSet.Tables("Produits").Rows(i)("Id")) = id Then
index = i
Exit For
End If
Next
If index <> -1 Then
inventaireDataSet.Tables("Produits").Rows(index)("Nom") = nom
inventaireDataSet.Tables("Produits").Rows(index)("QuantiteParUnite") = quantiteParUnite
inventaireDataSet.Tables("Produits").Rows(index)("PrixUnitaire") = prixUnitaire
MessageBox.Show("Le produit a été modifié.")
Else
MessageBox.Show("Le produit n'existe pas.")
End If
End Sub
Cette procédure recherche la ligne correspondant à l’ID du produit à modifier dans le DataSet
, met à jour ses colonnes avec les nouvelles valeurs des zones de texte. Si la ligne n’est pas trouvée, un message d’erreur est affiché. Notez que le nom de la table dans le DataSet
doit correspondre au nom de la table dans la base de données.
Supprimer un produit
Pour supprimer un produit :
Private Sub SupprimerProduit()
Dim id As Integer = Integer.Parse(txtId.Text)
Dim index As Integer = -1
For i As Integer = 0 To ds.Tables("Produits").Rows.Count - 1
If CInt(ds.Tables("Produits").Rows(i)("Id")) = id Then
index = i
Exit For
End If
Next
If index <> -1 Then
inventaireDataSet.Tables("Produits").Rows(index).Delete()
MessageBox.Show("Le produit a été supprimé.")
Else
MessageBox.Show("Le produit n'existe pas.")
End If
End Sub
Cette procédure recherche la ligne correspondant à l’ID du produit à supprimer dans le DataSet
, la supprime en appelant la méthode Delete
sur la ligne. Si la ligne n’est pas trouvée, un message d’erreur est affiché. Notez que le nom de la table dans le DataSet
doit correspondre au nom de la table dans la base de données.
Enregistrer les données dans la base de données
Pour enregistrer les modifications en utilise le DataAdapter
qui va mettre à jour la base de données:
Private Sub EnregistrerModifications()
Try
Dim builder As New SqlCommandBuilder(daProduits)
produitsAdapter.Update(inventaireDataSet, "Produits")
MessageBox.Show("Modifications enregistrées.")
Catch ex As Exception
MessageBox.Show("Erreur lors de l'enregistrement des modifications : " & ex.Message)
End Try
End Sub