
TOTAL
Crée une table qui stocke les totaux des champs Numérique et Flottant
d'enregistrements groupés par mêmes valeurs de clé.
Syntaxe
TOTAL ON <clé expC> TO <fichier> | ? | <masque de fichier>[[TYPE]
PARADOX | DBASE][<portée>] [FOR <condition 1>] [WHILE <condition
2>][FIELDS <liste de champs>]
<clé expC>
L'expression clé de l'index maître ou le nom du champ sur lequel la table en cours a
été triée.
TO <fichier> | ? | <masque de fichier>
La sortie est dirigée sur la table dBASE nommée <fichier>. Par défaut, Visual
dBASE affecte l'extension .DBF à <fichier> et sauvegarde le fichier dans le
répertoire en cours. L'option ? affiche une boîte de dialogue dans laquelle doivent
être spécifiés le nom du fichier de destination et son répertoire pour la sauvegarde.
Vous pouvez aussi créer une table dans une base de données (définie en utilisant
l'utilitaire de configuration BDE) en spécifiant la base de données comme préfixe
(entre deux-points) du nom de la table, comme dans :base de données:table. Si la
base de données n'est pas déjà ouverte, Visual dBASE affiche une boîte de dialogue
dans laquelle les paramètres doivent être spécifiés, tels que le nom de connexion et
le mot de passe nécessaires à l'établissement d'une connexion à la base de données.
[[TYPE] PARADOX | DBASE]
Spécifie le type de table à créer. Le mot réservé TYPE est inclus uniquement pour une
meilleure lisibilité, il n'a aucun effet sur la commande en elle-même.
PARADOX crée une table Paradox avec l'extension .DB.
dBASE crée une table dBASE (par défaut). Si vous n'incluez pas d'extension à
<fichier>, dBASE affecte automatiquement l'extension .DBF.
<portée>
Le nombre d'enregistrements au total. RECORD <n> identifie un simple enregistrement
par son numéro. NEXT <n> identifie n enregistrements commençant par
l'enregistrement en cours. ALL spécifie tous les enregistrements. REST spécifie tous les
enregistrements depuis l'enregistrement en cours jusqu'à la fin du fichier.
La portée par défaut est ALL
FOR <condition 1>WHILE <condition 2>
Détermine quels enregistrements sont affectés par TOTAL. FOR restreint TOTAL aux
enregistrements remplissant <condition 1>. WHILE entame le processus avec
l'enregistrement en cours et continue avec chaque enregistrement suivant tant que
<condition 2> est vraie.
FIELDS <liste de champs>
Spécifie à partir de quels champs Numérique et Flottant effectuer le total. Si vous
n'incluez pas FIELDS, dBASE effectue les totaux de tous les champs Numérique et Flottant.
Utilisez TOTAL pour effectuer le total de la valeur des champs Numérique
dans une table et pour créer une seconde table qui conservera les résultats. Les champs
Numérique de cette seconde table contiennent les totaux de tous les enregistrements ayant
la même valeur de clé dans la table d'origine.
La table en cours doit être soit indexée, soit triée, sur le champ clé. Tous les
enregistrements de même champ clé deviennent un seul enregistrement dans la table
stockant les résultats totaux. Tous les champs Numérique, apparaissant dans la liste de
champs, contiennent des totaux. Tous les autres champs contiennent les données du premier
enregistrement du jeu d'enregistrements avec des clés identiques.
TOTAL est identique à SUM, cependant SUM opère sur une table indexée ou non, en
retournant une somme pour tous les enregistrements de chaque champ Numérique. SUM ne
crée pas d'autre table, mais conserve les résultats dans des variables mémoire ou dans
un tableau.
Pour limiter les champs qui sont créés dans le
nouveau fichier, ou pour grouper sur plus d'un champ clé, utilisez SET FIELDS, comme
indiqué dans l'exemple.
Il n'y a pas de strict équivalent OODML, mais vous pouvez d'examiner la
fonction SQL SUM() (et autres fonctions d'agrégation SQL local), qui peut être utilisé
avec l'instruction SQL SELECT.
Un exemple donné par Ivar B. Jessen :
//----- |
f = new form() |
f.autoCenter = true |
|
f.d = new database() |
f.d.databasename = "dBASESamples" |
f.d.active = true |
|
f.q = new query() |
f.q.database = f.d |
f.q.sql = 'select sum(ID) as total from Fish' |
f.q.active = true |
|
f.totalVal = f.q.rowset.fields["total"].value |
|
f.t = new text(f) |
f.t.width = 30 |
f.t.text = "The sum of all ID's is " + f.totalVal |
|
f.open() |
//----- |
Groupes de discussion : dbase.getting-started
De : Ivar B. Jessen <bergisha...@it.notthis.dk>
Date : Mon, 28 Apr 2003 10:35:04 +0200
Date/heure locale : Lun 28 avr 2003 10:35
Objet : Re: Sum |
Dans l'exemple suivant, la commande TOTAL sur la table SOCIETE calcule le
nombre total de ventes par année dans chaque état :
CLOSE DATABASE |
USE SOCIETE EXCLUSIVE |
INDEX ON ETAT TAG ETAT |
* Première table SOCIETE indexée sur ETAT |
* L'index nécessite EXCLUSIVE ON |
USE COMPANY SHARED |
* TOTAL ne nécessite pas EXCLUSIVE ON |
TOTAL ON ETAT TO StateTot |
SELECT 2 |
USE StateTot |
BROWSE FIELDS ETAT, VENTES_AN; |
TITLE "Ventes totales par état" |
StateTot contient un enregistrement par état.
Supposons que vous deviez totaliser le montant des
recettes provenant des taxes que perçoit un département (habitation, succession, carte
grise, etc), et que vous voulez les totaux pour chaque ville, pour chaque catégorie de
taxes différentes. D'abord, vous créez un index sur la ville et la catégorie de taxes
puisque c'est le résultat que vous désirez obtenir:
index on VILLE + TAXES_CAT tag VILLE_TAXES |
Ensuite, vous utilisez SET FIELDS pour créer un champ calculé clé basé
sur les deux champs sur lesquels vous appliquerez TOTAL (ce sera dans cet exemple un champ
caractère comportant le nom de la ville et le nom de la taxe):
set fields to VILLE_TAXES = VILLE + TAXES_CAT // le champ calculé |
set fields to VILLE, TAXES_CAT, TAXE_PAYEE // les champs à retenir |
total on VILLE_TAXES to VILLE_PAYE //
éviter le nom total pour la table résultat |
Bien que le champ composé, qui figure dans la table de résultats,
comporte la ville et la catégorie de taxes, la ville et les champs de catégorie de taxes
sont aussi inclus dans la liste des champs de sorte qu'ils apparaissent bien dans la table
de résultat dans des champs distincts. Le champ contenant la taxe versée est également
inclus dans la liste des champs, .... sinon il n'y aurait rien à totaliser. (table demtotal)
Bien
comprendre
|
TOTAL ON ne marche pas, j'ai des résultats
bizzares
Cette réponse ne répond pas à 100% des cas, mais probalement à plus de 90%
Regardez si vous avez une ou plusieurs valeurs NULL quelque part dans les champs que
vous addittionnez. Souvenez-vous que quoi que ce soit + null = null. Essayez de supprimer
les Null si vous n'avez pas besoin d'eux ou créez un champ calculé qui substitutera 0
pour tout
champ contenant une valeur NULL.
On pense souvent que null = 0, mais en fait il faut penser qu'un champ ayant pour valeur
null a une valeur inconnue et non égale à 0.
Pourquoi des Null dans mes champs : Mettre autoNullFields à OFF
Par défaut autoNullFields est à ON. Donc dans les tables de niveau 7, tous les champs
dont aucune valeur n'a été spécifiée sont alors à Null. Or Null ce n'est ni blanc, ni
zéro, ni faux, etc, c'est une absence de valeur .Lorsque AUTONULLFIELDS est sur OFF, les
champs numériques (long, float, etc) se voient affecter la valeur zéro, les champs
logiques la valeur «false», et les champs caractères sont remplis avec des espaces.
Attention avant de changer de système par défaut, car les valeurs Null ont leur
intérêt. Par exemple une note de 0 et pas de note ne signifie pas la même chose. Si
vous faites un relevé de température journalier, le jour où vous êtes absent il n'a
pas forcément gelé...,
Remarque : Null est apparu avec les tables de niveau 7
Pour savoir comment votre dBase est configuré par défaut :

Case AutoNullFields cochée, les champs vides ont une valeur
inconnue
Problème d'affichage du résultat
Vérifier que le nombre de caractères prévu pour le champ de destination est assez
large pour accueillir le nombre. Un champ décimal de longueur 5 ne peut afficher que
99.99, et non 999.99, il faut tenir compte du séparateur.
Blocage de la table, 'file in use by another, retrying
lock', empêchant l'utilisation par d'autres
La commande TOTAL fait partie des commandes qui fait que dBASE tente de verrouiller une
table partagée lors de son utilisation. Si Set Lock est à ON vous ne pouvez pas accéder
à la table pendant l'exécution de TOTAL ON. Voir SET LOCK dans l'aide.
retour
Sources :
Aide Visual dbase V5.7
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm par Ken Mayer
Aide dBase Plus 2.6.0
Groupes de discussion
dBase version 2.6.0
Retour à l'accueil
Si vous voyez des erreurs, ou souhaitez apporter des compléments, n'hésitez pas à le signaler.
Dernière modification : lundi 09 août 2010
© M.Abraham.
|