Calculer la moyenne, le total ou le prix (y compris la taxe) sont des tâches courantes dans toute application commerciale. Les collections sont un moyen facile d’agréger vos données de manière cohérente. Avec elles, ce type de calcul devient très simple, car il existe des méthodes de collection qui font tout pour vous !
Cet article fait partie d’une série démontrant comment manipuler les collections à l’aide des méthodes ajoutées dans 4D v16 R6. Pour en savoir encore plus, téléchargez notre exemple de base de données, qui comprend 12 exemples différents pour montrer tout ce que vous pouvez faire avec les méthodes de collecte !
Exemple de base de données : Gérer des collections
somme, moyenne, min et max
Vous pouvez calculer la somme de toutes les valeurs d’une collection avec la méthode sum méthode :
// Calcul de la somme de tous les éléments d'une collection de valeurs numériques
$col:=Newcollection(10000;50000;10500.5)
$vSum:=$col.sum() //$vSum=70500.5
// Calcul de la somme de tous les éléments d'une collection d'objets
$col:=Newcollection("name" ; "Smith" ; "salary";10000)
$col.push(Nouvel objet("nom" ; "Wesson" ; "salaire";50000))
$col.push(Nouvel objet("nom" ; "Gross" ; "salaire";10500.5))
$vSum:=$col.sum("salaire") //$vSum=70500.5
Vous pouvez également calculer la moyenne, le minimum et le maximum de la même manière, avec des méthodes de collection du même nom.
La méthode average renvoie la moyenne arithmétique (moyenne) de toutes les valeurs d’une collection :
$col:=Newcollection(10000;50000;10500.5)
$vAvg:=$col.average() // $vAvg=23500.16666667
La méthode min renvoie l’élément ayant la plus petite valeur dans la collection :
$col:=Newcollection(10000;50000;10500.5)
$vMin:=$col.min() // $vMin=10000
La méthode max renvoie l’élément dont la valeur est la plus élevée de la collection :
$col:=Newcollection(10000;50000;10500.5)
$vMax:=$col.max() // $vMax=50000
Compter les éléments d’une collection
Si vous souhaitez connaître le nombre d’éléments que contient une collection, il suffit d’utiliser la méthode count pour trouver le nombre d’éléments non nuls et length pour le nombre total d’éléments.
$col:=Newcollection(1;2;3;Null; "a" ; "b" ;Null)
$length:=$col.length // $length=7 length est un attribut
$count:=$col.count() // $count=5 count est une méthode
Vous pouvez également compter le nombre de fois qu’une valeur spécifique est utilisée dans votre collection en utilisant la méthode countValues:
$col:=Newcollection(1;2;5;5;5;3;6;4)
$vCount:=$col.countValues(5) // $vCount=3
Calculs spécifiques
Deux autres méthodes de collection vous permettent d’appliquer un rappel sur tous les éléments d’une collection. En gros, la méthode de rappel est une des méthodes de votre projet. Pas besoin d’écrire une boucle, 4D s’en occupe pour vous :
La méthode map applique le rappel sur chaque élément de la collection et renvoie une collection avec tous les nouveaux éléments. Par exemple, si vous avez besoin de calculer le pourcentage pour chaque nombre dans une collection en fonction de la somme totale, c’est facile en utilisant map:
$c:=Newcollection(1;4;9;10;20)
$c2:=$c.map("Percentage" ;$c.sum()). // use Percentage as call back method
//$c2=[2.27,9.09,20.45,22.73,45.45]
où Percentage est une méthode de projet comme suit :
$1.result:=Round(($1.value/$2)*100;2)
La méthode reduce applique un callback contre un accumulateur et chaque élément de la collection (de gauche à droite) pour la réduire à un seul élément. Par exemple, dans une collection contenant plusieurs produits mélangés, vous pouvez vouloir calculer le total de chaque produit. La méthode reduce rend les choses très simples :
$fruits:=Nouvellecollection("banane" ; "cerise" ; "orange" ; "pomme" ; "cerise" ; "orange" ; "pomme" ; "banane" ; "cerise" ; "orange" ; "fig" )
$count:=$fruits.reduce("Tally" ;Nouvel objet) // use Tally as call back method
//$count={banane:2,cerise:3,orange:3,pomme:2,fig:1}
où Tally est une méthode de projet comme suit :
// Recherche si un fruit portant ce nom existe déjà dans la collection d'accumulateurs
If ($1.accumulator[$1.value]#Null)
$1.accumulator[$1.value]:=$1.accumulator[$1.value]+1
Else
// S'il n'existe pas déjà, crée un nouveau fruit
$1.accumulator[$1.value]:=1
End if