Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :


Exemple d'utilisation des aggrégats avec Delphi

Date 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


Introduction


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.


1. Les données utilisées


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.


2. L'interface utilisateur


En mode conception, notre application comportera les éléments suivants:

  • DBGFacture: TDBGrid pour afficher les numéros de factures
  • tblFacture : TTable sur la table Factures
  • dsFactures : TDataSource pour tblFactures
  • DBGLignes : TDBGrid pour afficher les lignes de la facture sélectionnée
  • tblLignes : TTable sur la table Lignes
  • dspLignes : TDataSetProvider
  • CdsLignes : TClientDataset (pour la création des aggrégats)
  • dsLignes : TDataSource pour CdsLignes
  • Plusieurs TDBText pour afficher nos aggrégats

Nous utiliserons les grilles de données pour saisir les valeurs


3. Réalisations des liens entre composants


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:

  • dsLignes.Dataset := CdsLignes
  • CdsLignes.ProviderName := dspLignes
  • dspLignes.Dataset := tblLignes

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.


4. Création des aggrégats


Passons maintenant à la définition des aggrégats. Nous allons en créer 5 différents.

  • TotalAvantRemise
  • MontantRemise
  • TotalApresRemise
  • MontantTVA
  • TotalTTC

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

  • 0 = DEFAULT_ORDER
  • 1 = PRIMARY_KEY
  • 2 = CHANGE_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éé.


5. Expression


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.

TotalAvantRemise.Expression := 'SUM(Quantite * PrixUnit)'; ... TotalTTC.Expression := 'SUM(Quantite * (PrixUnit * (1 - (Remise / 100)) * (1 + TVA / 100)))';

6. Pour finir ...


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:

CdsLignes.AggregatesActive := true;

7. Test de notre application


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.


Conclusion


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.
Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -