Exemple d'utilisation des aggrégats avec DelphiDate de publication : 13/02/2004 Date de mise a jour : 13/02/2004
Par
Alphomega (http://alphomega.developpez.com/) Cet exemple est la suite logique de la description des aggrégats. Introduction 1. Les données utilisées 2. L'interface utilisateur 3. Réalisations des liens entre composants 4. Création des aggrégats 5. Expression 6. Pour finir ... 7. Test de notre application Conclusion
Je rapelle qu'il est nécessaire de posséder la version Pro de Delphi pour la réalisation de cet exemple.
Nous allons utiliser une base de données simple de type Paradox que j'ai créée et que vous pouvez télécharger directement ici: Base exemple.
J'ai préféré ne pas utiliser la base DBDemos, tout simplement parce qu'un exemple sur cette base existe dans le dossier demos de votre Delphi. Ainsi, vous disposerez de 2 projets distincts pour mieux appréhender cette technique.
J'ai créé une base de données PARADOX avec le module de base données. Cette base est composée de 2 tables Factures et Lignes. Pour cet exemple, les données sont placées dans c:\agregats\exemple. Si vous enregistrez cet exemple chez vous, veillez à utiliser le même dossier ou alors, n'oubliez pas de modifier en conséquence la propriété DatabaseName des deux composants TTable. En voici les champs.
Sur la table Lignes, j'ai créé une intégrité référentielle sur la table Factures ainsi qu'un index secondaire SurFacture basé sur le champ Facture. Chaque numéro de ligne est créé dans l'événement OnNewRecord de la table Lignes.db par incrémentation d'un champ de la table Numeros.db. Cette façon de procéder à été rendue nécessaire par la non prise en compte des champs AutoInc de Paradox par TClientDataset.
En mode conception, notre application comportera les éléments suivants:
Nous utiliserons les grilles de données pour saisir les valeurs
Concernant la partie Factures de l'exemple, les liens sont évidents et je ne m'y attarderai pas.
Pour la partie Lignes, les liens créés sont:
On voit bien ici l'enchainement des liens. Grâce à l'éditeur de champs de tblFactures, j'ajoute tous les champs de la table Factures. Enfin, je fais de même avec l'éditeur de champs de CdsLignes. Pour améliorer la présentation de nos factures, je crée un nouveau champ calculé HT_Ligne de type currency qui affichera le montant de chaque ligne après calcul de la remise. Le calcul se fera bien évidemment dans l'événement OnCalcFields de CdsLignes. Pour terminer, je définis les propriétés MasterField et MasterSource de CdsLignes pour le lier à la table Factures.
Passons maintenant à la définition des aggrégats. Nous allons en créer 5 différents.
Créons le premier ensemble, vous ferez les autres sur le même principe. Ouvrez l'éditeur de champs de CdsLignes. Commencez la création d'un nouveau champ.
Chacun des autres champs sera créé sur le même principe. A la fin de cet exercice, vous devez obtenir cette vue de l'éditeur de champs.
L'opération suivante consiste à définir la propriété IndexName de notre TClientDataSet. Commençons par cliquer sur la propriété IndexDefs de CdsLignes ! Une fenètre nous présente les index
Sélectionnez DEFAULT_ORDER et vous vous trouverez dans l'inspecteur d'objet la propriété Fields = Facture;Numero Vous remarquerez qu'il s'agit des champs utilisés pour créer les index lors de la création de la base. Nous allons donc sélectionner cette option comme IndexName de notre TClientDataSet CdsLignes
La même opération (IndexName = DEFAULT_ORDER) est à réaliser pour nos 5 champs aggrégats créés plus haut.
Comme je l'ai indiqué dans la présentation des aggrégats, une propriété très importante est GroupingLevel des TAggregateField. Si GroupingLevel à la valeur 0, l'aggrégat calculera le résumé de toutes les lignes de la table parcourue. A partir de 1, il utilisera dans l'ordre, les champs définis dans l'index de la propriété IndexName. Dans notre cas, en utilisant la valeur 1 pour GroupingLevel de chaque aggrégat, nous limiterons le calcul aux seules données concernant le numéro de facture en cours d'affichage.
Définissez donc GroupingLevel := 1 pour chaque aggrégat créé.
C'est dans la propriété Expression de chaque aggrégat que nous allons indiquer le calcul à effectuer. Voici un exemple des expressions utilisés ici ! Vous allez voir que des calculs plus poussés que la simple addition sont permis.
Pour chaque aggrégat, définissez la propriété Active := true afin d'activer (!) le calcul. Ajouter 5 TDbText à votre TForm pour afficher les résultats. Pour terminer, utilisez l'inspecteur d'objet pour activer les aggrégats:
Ajoutez des factures, et pour chaque ligne de chaque facture, modifiez à votre guise les valeurs des différentes colonnes et appréciez la mise à jour automatique des aggrégats.
Vous pouvez télécharger ici le code source de l'exemple.
Vous venez de réaliser votre première application utilisant les aggrégats. Je vous signale également le composant shareware TDBSumList qui réalise un travail similaire. Vous trouverez ce composant en téléchargement sur Torry ou DSP ou sur le Site de l'auteur.
A bientôt pour d'autres aventures ...
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|