Calcolare la media, il totale o il prezzo (tasse incluse) sono operazioni comuni in qualsiasi applicazione aziendale. Le raccolte sono un modo semplice per aggregare i dati in modo coerente. Con esse, questo tipo di calcolo diventa molto semplice, perché ci sono metodi di raccolta che fanno tutto per voi!
Questo articolo fa parte di una serie di dimostrazioni su come manipolare le collezioni utilizzando i metodi aggiunti in 4D v16 R6. Per saperne di più, scaricate il nostro esempio di database, che comprende 12 esempi diversi per mostrare tutto ciò che si può fare con i metodi di raccolta!
Esempio di database: Gestire le collezioni
somma, media, min e max
È possibile calcolare la somma di tutti i valori di un insieme con il metodo sum con il metodo
// Calcolo della somma di tutti gli elementi di una collezione di valori numerici
$col:=Nuovacollezione(10000;50000;10500.5)
$vSum:=$col.sum() //$vSum=70500.5
// Calcolo della somma di tutti gli elementi di una collezione di oggetti
$col:=Nuovacollezione("nome"; "Smith"; "stipendio";10000)
$col.push(Nuovo oggetto("nome"; "Wesson"; "stipendio";50000))
$col.push(Nuovo oggetto("nome"; "Gross"; "stipendio";10500,5))
$vSum:=$col.sum("stipendio") //$vSum=70500,5
È possibile calcolare anche la media, il minimo e il massimo nello stesso modo, con metodi di raccolta con lo stesso nome.
Il metodo average restituisce la media aritmetica di tutti i valori dell’insieme:
$col:=Nuovacollezione(10000;50000;10500,5)
$vAvg:=$col.media() // $vAvg=23500,16666667
Il metodo min restituisce l’elemento con il valore più piccolo dell’insieme:
$col:=Nuovacollezione(10000;50000;10500.5)
$vMin:=$col.min() // $vMin=10000
Il metodo max restituisce l’elemento con il valore più alto dell’insieme:
$col:=Nuovacollezione(10000;50000;10500.5)
$vMax:=$col.max() // $vMax=50000
Contare gli elementi di una collezione
Se si vuole conoscere il numero di elementi contenuti in un insieme, è sufficiente utilizzare il metodo count per trovare il numero di elementi non nulli e length per il numero totale di elementi.
$col:=Newcollection(1;2;3;Null; "a"; "b";Null)
$length:=$col.length // $length=7 length è un attributo
$count:=$col.count() // $count=5 count è un metodo
È anche possibile contare il numero di volte in cui un valore specifico viene utilizzato nell’insieme, utilizzando il metodo countValues:
$col:=Nuovacollezione(1;2;5;5;3;6;4)
$vCount:=$col.countValues(5) // $vCount=3
Calcoli specifici
Altri due metodi di raccolta consentono di applicare un rich iamo a tutti gli elementi di una raccolta. In pratica, il metodo callback è uno dei metodi del progetto. Non è necessario scrivere un ciclo, 4D se ne occupa per voi:
Il metodo map applica il richiamo a ogni elemento dell’insieme e restituisce un insieme con tutti i nuovi elementi. Ad esempio, se si vuole calcolare la percentuale di ogni numero in una collezione in base alla somma totale, è facile usare map:
$c:=Nuovacollezione(1;4;9;10;20)
$c2:=$c.map("Percentuale";$c.sum()). // use Percentage as call back method
//$c2=[2.27,9.09,20.45,22.73,45.45]
dove Percentuale è un metodo di progetto come segue:
$1.risultato:=Round(($1.valore/$2)*100;2)
Il metodo reduce applica un callback a un accumulatore e a ogni elemento dell’insieme (da sinistra a destra) per ridurlo a un singolo elemento. Ad esempio, in un insieme con diversi prodotti misti, si potrebbe voler calcolare il totale di ogni prodotto. Il metodo reduce lo rende molto semplice:
$frutti:=Nuovacollezione("banana"; "ciliegia"; "arancia"; "mela"; "ciliegia"; "arancia"; "mela"; "banana"; "ciliegia"; "arancia"; "fico" )
$count:=$frutti.reduce("Tally";Nuovo oggetto) // use Tally as call back method
//$count={banana:2,ciliegia:3,arancia:3,mela:2,fico:1}
dove Tally è un metodo di progetto come segue:
// Cerca se un frutto con questo nome esiste già nella collezione di accumulatori
If ($1.accumulator[$1.value]#Null)
$1.accumulator[$1.value]:=$1.accumulator[$1.value]+1
Else
// Se non esiste già, crea un nuovo frutto
$1.accumulator[$1.value]:=1
End if