- résumé : Présentation et analyse de l'application de facturation Mastapp, fournie avec Delphi
- mots clé : Mastapp - base de données - facturation
- logiciel utilisé : Windows XP personnel, Delphi 6.0
- matériel utilisé : Pentium 2.800 Mhz, 512 Meg de mémoire, 250 Giga disque dur
- champ d'application : Delphi 1 à 2006 et Turbo Delphi sur Windows
- niveau : développeur Delphi
- plan :
1 - Introduction Cet article présente la structure de l'application MastApp.
Il y a plusieurs raisons pour nous intéresser à cette application: - c'est l'application phare de base de données de Delphi depuis Delphi 1. Borland a essayé de construire une application type, en y incorporant le
plus possibles de techniques utilisables en d'autres circonstances pour les bases de données
- Mastapp a été critiquée comme étant un "mauvais exemple" d'application
Client Serveur. Nous allons présenter ici une analyse critique sur ce point
- nous nous servirons de Mastapp comme point de départ pour construire une
couche métier au dessus des Tables MastApp
2 - Les Tables Mastapp
2.1 - Les Versions de Mastapp Tout d'abord mentionnons que Mastapp a existé en plusieurs versions à travers les ages. Mentionnons: - la toute première version utilisait le BDE, avec des tables Paradox. L'alias
DBDEMOS contient d'ailleurs les tables CUSTOMER.DB, ORDER.DB etc
- Delphi 6 contient une version utilisant les composant Interbase Express. Mentionnons aussi que cette version était utilisée comme base pour Quick
Report. De plus cette version contient aussi une aide .HLP ainsi que le fichier .RTF permettant de générer cette aide
- Delphi 2006 contient une version VCL .Net de Mastapp, ainsi qu'une
application ASP .Net utilisant la base MastApp. Et les démonstrations du BDP utilisent aussi MastApp
Nous nous intéresserons uniquement à la version Interbase, avec Ibx
La base elle-même est fournie avec Delphi. Nous avons cependant eu quelques surprises: - nous utilisons couremment Interbase 6.0
- les nouvelles versions de Delphi contiennent Interbase 7.nnn. Or la
structure binaire des fichiers (ODS= On Disc Structure a changé entre la version 6 et la version 7). Il a donc fallu synchroniser la version des données et la version du moteur SQL installée. Pour mémoire, la base
Interbase 6 fait 800 K, et la version Interbase 7.nnn dépasse 1 Mega
Les fichiers se trouvent normalement dans: - les données
C:\Program Files\Fichiers communs\Borland Shared\Data - le code dans
C:\Program Files\Borland\Delphi6\Demos\Db\IBMastApp
2.2 - Le Schéma
MastApp (MASTer APPlication correspont à un petit système de facturation. Des clients passent des commandes, et MastApp permet la création de factures. Au niveau des Tables: - CUSTOMER contient des clients
- ces clients passent des commandes : ORDERS
- chaque commande
- est effectué par un employé du magasin EMPLOYEE
- contient des ITEMS (lignes de commandes)
- chaque ITEM concerne un article PARTS
- chaque article est fournie par des VENDORS
Deux tables annexes NEXTCUST et NEXTORD fournissent des clés uniques pour les deux tables CUSTOMER et ORDERS
Le Schéma UML, qui montre bien les dépendances et les relation d'inclusion, est donc le suivant:
Nous pouvons aussi fournir un schéma plus détaillé avec tous les champs, et où
les liens ne montrent pas la multiplicité (1..n) mais les références d'une table à l'autre:
2.3 - Le script de création
Nous pouvons utiliser différents outils pour récupérer un script Interbase de création de Tables Mastapp - l'Explorateur de bases de données Delphi
- IbConsole (qui fournit en plus les contraintes de clé étrangères°
- des outils externes, tels que IbExpert
- les composants Interbase Express, en en particulier IbExtract
Nous avons utilisé IbExtract, et le projet Delphi d'extraction est fourni en source avec l'article d'explication Extraction de
Script . Cet outil vous permet, entre autre de regénérer la base, ou de changer de version de moteur SQL (version Interbase, autre moteur qu'Interbase)
3 - L'Application Delphi Ayant présenté les données de la base, voyons à présent le projet Delphi qui gère cette base. 3.1 - La navigation
Le plus simple est de présenter tout d'abord les écrans: - un écran menu/barre d'outil donne accès aux autres fenêtres
- le bouton "New Order" affiche la fenêtre de saisie des commandes, qui est la fenêtre de traitement réelle
Il est possible de se déplacer d'une commande à une autre, ou d'ajouter une nouvelle commande. Le mode (affichage / saisie) est affiché en bleu, et les boutons de confirmation / annulation sont validés en fonction du mode de plus
- à côté de "date", l'icône permet d'accéder à un calendrier
- dans la dbGrid de saisie des article, la colonne article contient une
ellipse qui permet d'afficher une fenêtre de sélection d'articles:
- le bouton "Browse" affiche les clients et de leurs factures dans deux dbGrids:
et - en double cliquant sur un client (ou en cliquant "Edit'), une forme de saisie client est affichée
- en double cliquant sur une commande, la forme de saisie de commande est affichée
- "define query" permet de définir de dates de recherche
- "active query" est un bouton qui reste enfoncé et qui lance la requête spécifiée par "define query" (démontre comment utiliser une requête paramétrée)
- le bouton "Parts" permet d'afficher la liste des articles:
et en double cliquant sur un article, une fenêtre de saisie d'article est affichée:
Cette Forme contient un dbLookup pour sélectionner le vendeur - le bouton "Reports" permet de sélectionner des états
et en cliquant "View" un apperçu d'un état est présenté:
3.2 - Le DataModule
Tous les composants d'accès sont regroupés dans un tDataModule, dont voici une image (légèrement réorganisée pour présenter les composants dans l'ordre CUSTOMER, ORDERS, ITEMS, PARTS, EMPLOYEE, VENDORS):
4 - L'analyse Nous avons vu ici ou là des messages critiquant Mastapp, mais préciser quels
quels reproches sont adressés à MastApp. C'est très facile: s'il n'y a aucune démon, on critique, et s'il y en a une, on lui tombe dessus à bras raccourcis. Nous avons d'ailleurs rencontré le même phénomène pour la démonstration "Pet
Shop", qui est la démonstration de Sun / Java. Nous allons présenter ici quelques remarques, en soulignant bien qu'il ne s'agit pas d'évaluer MastApp en tant qu'application de facturation idéale,
mais en examinant les techniques de bases de données utilisées.
4.1 - Mentalité "Desktop" et non "CLient Serveur" Mastapp a été créé avec des tables du BDE Paradox. L'explorateur de bases de
données présente bien dans l'alias DEMOS les tables CUSTOMERS.DB etc La version BDE utilisait des tTables, et quelques tQueries pour des calculs plus compliqués. Le portage en Interbase garde malheureusement des trace de
cet héritage: - réutilisation de tIbTables, plutôt que de travailler avec des requêtes SQL (des IbQueries, des IbDataSets, ou IbClientDataSets)
- réutilisation de tables spéciales pour gérer les clés (au lieu d'utiliser des générateurs Interbase
- absence de DOMAIN, pas de contraintes (clé étrangère, min, max)
- absence de TRIGGERS ou de STORED PROCEDUREs (encore que ceci peut être un choix pour améliorer le portage entre moteur SQL, ce qui a bien été le cas ici)
4.2 - Le Schéma Pour une facturation, il serait intéressant:
- de réorganiser les tables actuelles. En particulier de créer des tables pour gérer les adresses (client, employés, vendeurs), et éventuellement créer une table pour les personnes ("party" au sens de Martin FOWLER)
- les données sont assez redondante. Le champ COUNTRY contient les chaînes littérales dans les tables VENDORS et CUSTOMERS. Idem pour STATE. Pour la petite histoire, nous nous sommes apperçus de ce codage en utilisant
Data Extractor, un outil d'extraction de données)
- bien sûr prolonger la facturation par un système de gestion de commande, de
réception, de bonus pour les employés etc. Mais, une fois encore, le but de MastApp n'est pas de présenter une facturation complète
Nous pourrions aussi suggérer quelques modifications dans les noms:
- pourquoi CUSTOMER ORDERSSS ITEMSSS et non CUSTOMER, ORDER, ITEM ou CUSTOMERSSS, ORDERSSS, ITEMSSS (note: pour ORDER je sais maintenant: ORDER fait partie des mots clés, car il est employé dans la clause
ORDER BY !)
- les clés sont bien normalisée "custno", "orderno" etc, mais les clés étrangères utilisent le même identificateur (dans ORDERS il y a une colonne
"custo". Nous préférons utiliser "custno_ref" pour indiquer la référence, ce qui en plus évite les ambiguités dans les jointures.
4.3 - Le DataModule A notre sens
- il contient trop de composants, et en maintenance, il est un peu difficile de visualiser à quoi servent tous ces composants
- certains composants ne sont utilisés par aucune Forme de l'application actuelle
4.4 - L'ergonomie Quelques points: - pour "Browse"
- plutôt que d'afficher deux dbGrid, et dans la seconde les commandes du seul client sélectionné dans la dbGrid du haut, il serait peut être
préférable d'utiliser une liste de clients, dans des dBEdit les informations de ce client, et dans une dbGrid la liste des commandes
- le code utilise massivement le partage d'un DataSource qui est rattaché
à la dbGrid active. Nous économisons certes un DataSource, mais quel intérêt ?
- la Forme de saisie de commandes n'est pas homogène:
- si nous entrons par le menu "New Orders", c'est toujours la première
commande de chaque client qui s'affiche (nous pourrions mettre le numéro de facture dans un dbLookup, mais nous risquons de modifier le numéro de commande du client actuel)
- si nous entrons par "Browse | clic sur une commande" nous arrivons
effectivement sur cette commande
- la même forme est utilisée pour insérer et modifier une facture, mais le numéro de facture courant n'est pas affiché
- la forme de recherche pour les articles est aussi celle utilisée pour
rechercher les clients (mais ne semble pas être utilisé)
5 - Réutilisation de MastApp Nous avions utilisé Mastapp dans les articles suivants:
Comme d'habitude:
- nous vous remercions de nous signaler toute erreur, inexactitude ou problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections
qui en résulteront pourront aider les prochains lecteurs
- tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même
les bienvenus à jcolibri@jcolibri.com.
- plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en
cliquant "envoyer" :
- et si vous avez apprécié cet article, faites connaître notre site,
ajoutez un lien dans vos listes de liens ou citez-nous dans vos blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.
6 - L'auteur John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le
conseil (composants, architecture, test) et la
formation. Son site contient des articles
avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et
UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client. |