Newsgroup: it.comp.appl.access
Titolo: Decimali negli Euro

Ciao A tutti.
Ho un problemino che mi assila da molto tempo.
Nel db che ho creato vengono preparate delle fatture,
i campi contenuti sono i soliti, Prezzo Unitario, Quantitŕ Totale Iva
Siccome il db utilizza dei valori di iva diversi per comoditŕ i totali di 
fondo fattura non sono altro che
la somma della colonna Totale e la somma della colonna Imposte.
Il problema č che se la fattura a diverse pagine se al totale del imponibile 
riportato in fattura sommo l'iva non risulta
come la somma della colonna imposte.
Non so se sono riuscito a spiegarmi,
Questo perchč tutti i valori vengono salvati nella tabella con una miriade 
di decimali.
un valore in una tabella segnato come 34,5357652 viene arrotondato a 34,54
Ho provato con la funzione trovata sul sito coume FctRound che funziona 
egregiamente perchč arrotonda in automatico.
ma poi comunque il valore viene salvato e capita spesso che mi ritrovo i 
numero con pěů di 2 Decimali.
Ho provato a creare la tabella anzi che con campi Euro con campi numerici 
Fissi a 2 Decimali ma nulla.
Come si půň risolvere ???
Grazie Grazie
Enrico Pietrobon 


Anche il calcolo deve essere calcolato con fctround
Se hai una somma deve essere
C: fctround(A+b)
-- 
_ _
Ciao
MAssimiliano Amendola
Cisa1 - I° Conferenza Italiana per Sviluppatori Access Arezzo 4+5
Giugno 2005 Sono aperte le iscrizioni  Info:  
www.donkarl.com/it

> Come si pùò risolvere ???


 Cavolo non so dove picchiare la testa.
Picchiala dopo il quoting
Pippo = fctround(Somma(Imponibile))


 ha scritto nel messaggio 
news:sg75e.4949$aH3....@news.edisontel.com...


 un valore in una tabella segnato come 34,5357652 viene arrotondato a 34,54
Ciao Enrico,
stai sbagliando metodo di calcolo :-)
Non devi memorizzare l'imposta nelle singole righe, il loro totale
difficilmente darà corretto.
Bisogna calcolare per ogni aliquota il totale dell'imponibile e la sua
imposta
(questo è solo un esempio figurativo non una soluzione per il tuo report)
-------------
Imponibile20 = fctround(Sum(Iif(Iva=20,Prezzo*Quantità,0)))
Imposta20=fctround(Imponibile20*.2)
Imponibile10 = fctround(Sum(Iif(Iva=10,Prezzo*Quantità,0)))
Imposta10=fctround(Imponibile20*.1)
--------------
poi sommi gli imponibili e le imposte per avere il totale della fattura.
Ciao Giorgio

 news:oY65e.1189225$35.43...@news4.tin.it...
ops
---------
Imponibile10 = fctround(Sum(Iif(Iva=10,Prezzo*Quantità,0)))
Imposta10=fctround(Imponibile10*.1)
----------

 ha scritto nel 
messaggio news:4255080a$0$8086$5fc...@news.tiscali.it...

Nella tabella io memorizzo questi dati
Prezzo Unitario
Quantità
Prezzo Totale
Iva
Imposte
Tutti i campi nella tabella sono messi come Tipo di campi Valuta  e euro con 
2 decimali per il formato
Tutti i valori da me calcolati usano la funziona fctRound
Dopo di che memorizzo i valori nella tabelle.
Non capisco il perchè tra tutti i dati memorizzati qualcuno ha tre decimali.
A questo punto il fondo della fattura ( con i totali ) non fa altro che 
prendere e sommare tutti i valori di Prima
prezzo Totale
Imposte
e qui succede il patatrack

 Dopo di che memorizzo i valori nella tabelle.
Non penso tu abbia tutti i campi (Imponibile, Aliquota, Iva)
posti a Currency (valuta) con DUE decimali.
Non hai per caso il campo Aliquota definito come
Single o, peggio ancora, definito come Percentuale?
Se poni tuttio e TRE i campi a Valuta con DUE decimali e
applichi la formula F([Imponibile]*[Aliquota]/100] il
risultato dovrebbe essere corretto (F sta per la tua
formula di arrotondamento).
Se non lo č puoi gettare il computer.
Bruno 

 Ma giuro non so come fare.
A fare che quotare i post.
c'è Istruzioni per l'uso di Roberto che te lo spiega.
MAssimilianoi

 Enrico
Ho creato una tabella con Imponibile, Aliq, IVA, Totale
tutti e quattro i campi Currency (valuta), 2 decimali.
Con una scheda ho inserito i dati e tutto funziona perfettamente.
Se vuoi ti mando il database.
Non ora però, stasera.
C'è mia moglie che mi ha
ingaggiato per andare a far la spesa.
Ciao
Bruno 

 ha scritto nel messaggio 
news:Kbb5e.1191308$35.43...@news4.tin.it...


 Sono contento e lusingato.
Dimostralo scrivendo DOPO il quoting.
Aiuterai così anche ti aiuta.


 ha scritto nel messaggio 
news:Kbb5e.1191308$35.43...@news4.tin.it...

Allora Enrico...anzitutto mi associo: scrivi dopo il quoting!
Venendo al tuo problema, supponendo dalla tabella che hai, ecco il tuo 
calcolo per la fattura:
quantità   prezzo         prezzo totale    iva
2              100.00            200.00         20
-------------------------------------------
iva           imposte
20            40.00
------------------------------------------
                                   totale fattura
                                         240.00                   ( [Prezzo 
Totale]+[Imposte])
[Prezzo Totale]=[Prezzo Unitario]*[Quantità]
[Imposte]=FormatCurrency([Prezzo Totale]*[Iva]) (solo se Iva è in formato 
percentuale!)
Naturalmente dovrai avere un campo Somma([Prezzo Totale]) e uno 
Somma([Imposte]) calcolati per tutti record della tabella....
Ciao
Roberto

 Somma([Imposte]) calcolati per tutti record della tabella....
scusa Roberto,
il formato Currency ha solo 4 cifre decimali se l'imposta la memorizzi in
quel tipo di dato vai a inquinarlo con un'arrotondamento o un troncamento.
Se hai
Prezzo = 1,31
Quantità=2,03
Iva = 20%
La tua imposta sarà 0,53186 che vai a memorizzare in un campo currency
troncando o arrotondando alla quarta cifra decimale.
Questa approssimazione moltiplicata per un centinaio di righe genera
l'errore.
io torno a ripetere che non è il modo di calcolare i totali della fattura,
certo molte vulte può andare bene ma .....
Ciao Giorgio

 l'errore.
F([Prezzo]*[Quantità]) = 2.66
F(2.66 * 20 / 100) = 0.53
Con campi Currency (2 decimali) immagazzino
migliaia di dati da anni senza ombra di errore.
A fine anno ho diverse decine di migliaia di operazioni
nel libro giornale con quadratura sempre perfetta.
Prima dell'Euro (quindi dei decimali) usavo dei
Double: coi decimali è stato un disastro.
F sta per la funzione di arrotondamento
dell'Euro a 2 decimali.
Ciao
Bruno 

 ha scritto nel messaggio
news:m_d5e.748702$b5.33...@news3.tin.it...

Ciao Bruno,
permettimi una considerazione :-)
 F([Prezzo]*[Quantità]) = 2.66
che moltiplicata per 21 righe fa 55.86
l'imposta con aliquota del 20% su 55.86 è 11.17
se tu sommi l'imposta di ogni riga 0.53 per 21 righe ottieni 11.13
ovvero un errore di 4 centesimi in meno (che equivale ad evasione IVA)
tutto questo in una fattura in cui non sono presenti sconti sul totale merce
che includerebbero un ulteriore errore.
Ciao Giorgio

 che includerebbero un ulteriore errore.
Non so da dove escano le 21 righe, prima non c'erano
ovvero non le ho viste.
Comunque il concetto è che, come nessuno si sogna
di mettere in dubbio, che l'IVA si calcola per ogni fattura
applicando l'aliquota sulle somme degli imponibili.
E non sui singoli imponibili che risultino da ognuna delle
21 o quante che siano righe.
Qui siamo perfettamente d'accordo.
Io ho inteso precisare la convenienza di
usare il tipo Currency con 2 decimali che, utilizzato
con una formula che dia il corretto arrotondamento
Euro a 2 decimali, è completamente affidabile.
Perché mi pareva, col tuo ragionamento delle
"solo 4 cifre decimali" del tipo Currency.
e dell'inquinamento con "un'arrotondamento
o un trancamento", ne dubitassi.
Ora per me è tutto chiaro.
Ciao
Bruno 

 Bruno
Ciao Giorgio

 ha scritto nel 
messaggio news:4255635d$0$8074$5fc...@news.tiscali.it...

Eccolo Finalmente.
Questo è il mio problema. Esattemente questo.
Su due o tre righe il problema non esiste, ma su cento righe salta fuori e 
di totali sballano.
Tu hai trovato un altro sistema ???
Grazie
Enrico 

 ha scritto nel 
messaggio news:4255a2b7$1$18168$5fc...@news.tiscali.it...

Esatto, Io memorizzo questi dati Riga per riga.
Cioè mi spiego.
Al mio ((Carrello)) aggiungo un prodotto.con un prezzo unitario di partenza 
Es.
0,43 Questo prezzo lo memorizzo in una colonna
Poi aggiungo la quantità Es.
36,80 anche questo lo memorizzo e dopo averlo inserito calcolo tutto il 
resto
CostoTot 36,80 * 0,43 =  15,6649
Imposte  15,6649 * 20% = 3,13298
Tutti questi dati li memorizzo e poi procedo con un nuovo articolo
Alla fine faccio la somma della colonna CostoTot e mi trovo l'imponibile
faccio la somma delle imposte
e sommo i due valori
il problema è che quando le righe sono molte, l'imponibile è diverso
Ammettiamo che l'iva sia sempre al 20% se prendo la colonna CostoTOT e 
aggiungo l'iva mi viene un valore
ma se sommo la colonna Imposte viene un altro valore.
Questo è il mio problema.
Sicuramente sbaglio procedura, ma quale devo usare.
Grazie e scusate per i mie quoting
Enrico

 Questo è il mio problema.
Proprio non avevo capito che così fosse.
Ma questa essendo la circostanza non
c'è altro da fare che tenere il calcolo IVA in
centesimi (coè senza fare arrotondamenti), procedura
a dir poco originale originale!
Imponibile                        IVA        IVA
(Euro)            Aliquota     (Euro)     (cent)
45.25                20          9.05        905.00
32.64                20          6.53        652.80
17.63                20          3.54        352.60
-----                              ------      ----------
95.52                            19.12       1 910.40
Che risulti F(95.52 * 0.20) = 19.12 è cosa eccezionale,
mentre sarà sempre  95.52 * 20 = 1 910.40
È una queastione di matematica non di programmazione.
(F è sempre la funzione di arrotondamento con 2 decimali).
Ritengo che una soluzione potrebbe essere quella di
elencare i prodotti con a fianco l'aliquota IVA senza però
effettuare il calcolo dell'imposta.
In calce alla fattura esponi poi le somme degli imponibili
raggruppati per aliquota e ne calcoli l'IVA.
Bruno

 raggruppati per aliquota e ne calcoli l'IVA.
---------
è la strada che ti eviterà i problemi che riscontri.
Ciao Giorgio

 ha scritto nel messaggio 
news:oY65e.1189225$35.43...@news4.tin.it...

Anche se non si usa.
Vi ringrazio a tutti
Siete stati molto gentili
Enrico 

 ha scritto nel messaggio 
news:pzu5e.1196963$35.44...@news4.tin.it...


 Grazie
Prego,
Ciao Giorgio

 si, cambia il tipo di dato e applica la funzione di Karl.
È quella formula che sbaglia gli arrotondamenti quando:
1 - le viene passato un valore implicitamente o esplicitamente
     definito Single
        A  N D
2 - la cifra finale è 5
        A N D
3 - l'arrotondamento deve essere effettuato sulla cifra precedente
      quella finale.
Quella che uso io:
--------------------------
Public Function EuroRound(ByVal ValueToRound, Optional DecimalDigit As Byte 
= 2)
    ValueToRound = CDec(ValueToRound)
    EuroRound = (Sgn(ValueToRound) * (Fix(Abs(ValueToRound) * 10 ^ 
DecimalDigit + 0.5) / 10 ^ DecimalDigit))
End Function
--------------------------
e quella tua che appare nel tuo sito invece funzionano bene,
anche col Single.
Le ho provate con decine di milioni di numeri generati
casualmente.
Ciao
Bruno


proprio per questo e non conoscendo la tua verione di Access ti ho
consigliato ....
--------
si, cambia il tipo di dato e applica la funzione di Karl.
--------
:-)
la funzione di Karl č indicata per tutte le versioni di Access e lavora bene
con il tipo di dato Doppia precisione e ovviamente con il piů preciso
Currency.
Il tipo singola precisione č piů critico
es..
----------
Dim Nr as Single
Nr=1.005
Debug.Print fctRound(Nr, 2)
Risultato:  1
-----------
Dim Nr as Double
Nr=1.005
Debug.Print fctRound(Nr, 2)
Risultato:  1.01
-------------
(prove fatte con Acc2002)
Ho visto la tua funzione, ed č (come la mia ) simile a quella di Karl solo
che noi impostiamo il calcolo sul tipo di dato Decimal (che non esiste in
Acc97) .
Anche la funzione di Karl con questo accorgimento funziona con il tipo
Single
----------
Function fctRound(ByVal varNr As Variant, Optional varPl As Integer = 2) As
Double
 'by Konrad Marfurt + ("" by) Luke Chung + Karl Donaubauer
    'esce se valore non numerico
    If Not IsNumeric(varNr) Then Exit Function
   'Converte in decimal
    varNr = CDec(varNr)
    fctRound = Fix(varNr * (10 ^ varPl) + Sgn(varNr) * 0.5) / (10 ^ varPl)
End Function
------------
(ho messo Byval prima della variabile varNr altrimenti mantiene il tipo di
dato passato da ByRef)
Comunque credo che la scelta di mantenerla cosě sia dovuta al fatto che
molti usano ancora Access97.
:-)
Ciao Giorgio

....  Decimal (che non esiste in Acc97) .
----
In Acc97 Decimal non esiste come tipo di dato per le tabelle ma eseste come
tipo di dato in VBA.
Quindi le mie considerazione sul non poter utilizzare il tipo decimal vanno
abbassate alla versione 2.0 di Access.
(Per Acc95 non saprei, non l'ho mai usato.)
Ciao Giorgio

 consigliato ....
--------
 va cambiata in
--------
 proprio per questo e non conoscendo la verione di Access ho
 consigliato a Massimo ....
--------
Ciao Giorgio

 ha scritto nel 
messaggio news:42593e1c$0$8082$5fc...@news.tiscali.it...


 ha scritto nel messaggio
news:kih6e.762773$b5.34...@news3.tin.it...

Ciao Massimo,
dovrebbe bastare l'arrotondamento nel calcolo dell'imposta
   fctRound(imponibile*aliquota/100)
se hai ancora problemi, potresti mostrare la query con cui calcoli i totali
degli imponibili ?
Ciao Giorgio

 ha scritto nel 
messaggio news:425a5cc4$0$8077$5fc...@news.tiscali.it...


 Enrico
Bo non so se sia la soluzione giusta ma sembra funzionare, vorrei sapere se 
matematicamente è giusto.
nella mia tabella io memorizzo questi volori come già detto in precedenza.
-quantità
-prezzo Unitario
-Prezzo Totale ( con funzione fctROund )
-Imposte ( Senza Funzione FctRound )
qt 36,80
pz   0,43
Totale calcolato = 15,824 Arrotondato tramite la funzione 15,82
le imposte sono 3,164 che io arrotondavo  e quindi diventavano 3,16
Ammettiamo che io segnassi 20 righe tutte così
Alla fine della fattura quando facevo la somma della colonna prezzo totale e 
imposte
prezzo Totale 316,40
Impotse 63,20
Ed ecco trovato l'errore...  3,16 * 20 righe fa 63,20 ma 316,40 non fa 63,20 
ma bensì 63,28
Penso di aver risolto non arrotondando le imposte. quindi l'imposta che 
viene memorizzata non è più 3,16 ma 3,164
la somma della colonna imposte a questo punto da 63,28
Secondo voi è giusto oppure ho fatto solo un gran casino per niente
Grazie Grazie
Enrico