Quando ti dicevo di sostituire NUMERIC a DOUBLE PRECISION, mi riferivo a tutti gli ambiti in cui devi memorizzare o eseguire calcoli con valute, quindi campi del database, variabili nelle stored procedure e così via.
Comunque, non comprendo bene come hai organizzato il lavoro: il totale lo calcoli in Delphi o nella stored procedure?
Inoltre, il listato della stored procedure mi sembra molto contorto: tutto viene eseguito con una istruzione SELECT; ricorda che è possibile utilizzare l'istruzione FOR SELECT per poter eseguire un blocco di istruzioni tante volte quanti sono i record restituiti dalla SELECT stessa: questo è utile per calcolare totali scandendo ogni record, eseguendo il calcolo per il singolo record e aggiungendo il valore ottenuto al totale sommario.
Il valore da visualizzare in Delphi deve poi essere formattato alle cifre decimali desiderate usando la proprietà DisplayFormat, se queste cifre sono diverse da quelle utilizzate nel campo stesso del database.
Non userei la proprietà AsFloat, bensì la proprietà AsCurrency (se possibile), visto che il tipo Double di Delphi ha lo stesso problema del tipo DOUBLE PRECISION di InterBase: sono valori a virgola mobile con perdita di precisione.
Se la proprietà AsFloat viene usata per ottenere il valore di un campo valuta da arrotondare e visualizzare, grossi problemi non sussistono comunque, ma se inizi a sommarli tra loro per fare calcoli, allora alla fine è facile che tu ottenga un risultato diverso da quello corretto per via della perdita di precisione che si propaga ad ogni operazione di somma ripetuta.
Spero di averti dato sufficienti indicazioni.
Ciao!![]()