Application multitable
Introduction
Ce chapitre est consacré aux deux autres modules importants du projet, les modules article et commande.
Lors de la gestion des clients, une seule table de la base de données a été manipulée. Cette fois-ci, le travail porte sur un environnement multitable.
Le design pattern MVC est également mis en œuvre. Les concepts sous-jacents ont été exposés et expliqués au chapitre Modèle MVC.
Classes associées
Contrairement au module client, les modules article et commande font intervenir des relations entre différents objets.
Par exemple, une commande fait référence à des lignes de commande, qui sont physiquement stockées dans une table séparée. Cette référence se fait grâce au système de clé primaire - clé étrangère : pour chaque ligne de commande dans la table correspondante, une colonne indiquant la clé primaire de la table associée est présente. Cette colonne stocke la clé étrangère de la commande pour chaque ligne.
JPA permet directement de gérer ce principe de clés, l’intégrité référentielle de la base est alors préservée : la base de données reste dans un état cohérent.
Il est néanmoins important de comprendre ce principe car les requêtes utilisées pour interroger la base doivent prendre en compte ce mécanisme.
Les classes associées sont de deux types : entité et contrôle.
Le type entité fait référence à une classe modélisant le métier, dans le package entite, et à une classe CRUD, listant les opérations possibles, située dans le package entite.crud.
Le type contrôle fait référence...
Gestion des articles
Faisons le point sur les articles. L’application dispose déjà de :
-
la classe Article,
-
la classe ArticleCrud,
-
la classe FArticles actuellement au stade de maquette.
1. Affichage
Pour afficher les données des articles dans le JTable de la classe FArticles, la démarche est identique à celle de la classe PClients vue au chapitre Modèle MVC :
-
Création de la classe qui représente le modèle de données graphiques.
-
Ajout du modèle au JTable pour affichage.
a. Création du modèle graphique
Créez une nouvelle classe ModeleArticles et rangez-la dans le package controle.modele.
Le code est très similaire à celui de la classe ModeleClients.
package controle.modele;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import entite.Article;
public class ModeleArticles extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private final List<Article> lesDonnees;
private final String[] lesTitres =
{"Code", "Code Catégorie", "Désignation",
"Quantité", "Prix unitaire"};
public ModeleArticles(List<Article> lesArticles) {
lesDonnees = new ArrayList<>(lesArticles);
}
public int getRowCount() {
return lesDonnees.size();
}
public int getColumnCount() {
return lesTitres.length;
}
public String getColumnName(int columnIndex) {
return lesTitres[columnIndex];
}
public Object getValueAt(int rowIndex, int columnIndex) {
Article unArticle = getArticle(rowIndex);
switch(columnIndex){
case 0:
...
Gestion des commandes
La même démarche que pour la gestion des clients est reprise en s’appuyant sur le design pattern MVC, à ceci près que l’ajout d’une commande se fait depuis la fenêtre principale du module.
Pour les commandes, deux fenêtres sont disponibles :
-
FCommandes : accessible à partir de la fenêtre d’accueil pour l’ajout des données et qui est donc la première présentée.
-
FCommandesExistantes : accessible à partir de la fenêtre FCommandes et qui regroupe les autres fonctionnalités : suppression, recherche, aperçu, impression et exportation.
1. Affichage
Les opérations suivantes sont réalisées comme précédemment :
-
Création de la classe qui contient le modèle de données graphiques.
-
Ajout du modèle au JTable pour affichage.
a. Création du modèle graphique
Créez une nouvelle classe ModeleCommandes et rangez-la dans le package controle.modele.
package controle.modele;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import entite.Commande;
public class ModeleCommandes extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private static final Comparator<? super Commande> COMPARATEUR
= new Comparator<Commande>() {
@Override
public int compare(Commande cmd1, Commande cmd2) {
// les commandes les plus récentes
// sont les premières à être affichées
return
cmd2.getInstant()
.compareTo(cmd1.getInstant());
}
};
private final List<Commande> lesDonnees; ...