Newsgroup: it.comp.lang.delphi
Titolo: Paradox e Euro - Arrotondamenti

Salve,
per chi come me in questi giorni nonostante caldo e voglia di vacanze si
trova in ufficio a lavorare ho un bel quesito da porre.
Mio malgrado, mi sono stati dati dei sorgenti di un programma di gestione
condomini scritto con D2 e che utilizza files Paradox.
Il motivo è di trasformare il programma per poter utilizzare con l'Euro (e
non commento).
I campi che contengono i dati numerici sono definifi $ (valuta)
Purtroppo il programmatore  che scrisse queste procedure ha cambiato lavoro
non posso contattarlo in quanto ha deciso che di programmare non ne vuole
più sapere.
Dopo aver cambiato le 'impostazioni internazionali' nel pannello di
controllo di Windows ho fatto il modo che comparisse il simbolo dell'Euro e
i due decimali. Fin qui fin troppo facile.
Il guaio è che nonostante nel programma si possano già ora senza nessun
cambiamento imputare preventivi o spese con le cifre decimali, poi però le
somme di questi importio parziali vengono tutte troncate all'intero.
Faccio un esempio due spese di 150,15 Euro vengono sommate in un totale di
300 Euro e non 300,30
Tutto questo preambolo per chiedere se qualcuno mi sa suggerire quali
istruzioni dovrei cercare nel sorgente ed eventualmente sostituire per poter
fare in modo che i decimali vengano gestiti.
Nel codice sorgente vengono spesso usate variabili 'longint' o instrizioni
tipo 'asfloat' e se cerco di sostituirle con 'integer' mi da errori, inoltre
viene utilizzata la funzione round().
Io ho cercato, ma non ho trovato un'istruzione che mi dia la possibilità di
memorizzare in un campo il valore di una variabile arrotondato a due
decimali. Esempio se la mia variabile ha valore 132.4568 vorrei memorizzare
solo 132,46.
Scusate la lunghezza di questo testo, ma non è nemmemo facile spiegarsi.
Grazie a chi vorrà condividere con me questi miei problemi (io nemmemo
riesco a finire i miei di programmi figuriamoci a metter mano a quelli
scritti da altri :-((((((((  ).
Marco
supp...@reporterprofessional.it

 fare in modo che i decimali vengano gestiti.
Per farla breve, nel programma, dato come vengono gestite le valute nel
database dovrebbero essere usate variabili currency per la gestione degli
importi. Se cosi' fosse il problema degli arrotondamenti praticamente non
esiste fatto salvo che per la conversione lire->euro degli archivi, dovre
dovrai fare una procedura che arrotonda gli importi al 2' decimale. Se
invece da qualche parte gli importi fossero gestiti con integer allora devi
sostituirli con currency, togliere round, int e funzioni in generale di
arrotondamento, e assicurarti, la' dove si facciano calcoli come prodotti e
divisioni che possano portare a un numero di decimali > 2, che gli importi
siano arrotondati al 2' decimale, con una funzione tipo:
importocorretto:=round(importooriginale*100.0)/100.0;
Spero di esserti stato utile.
Ciao, Sandro

solo 132,46.
Beh, su due piedi direi che i problemi nascono dai round e, forse, dai longint
Sostituisci i longInt con dei Currency e i round con una funzione di
arrotondamento (ti passo la mia).
function ArrotondaEccesso(Value: Currency; Decimals: Byte = 0): Currency;
var
  TCurr: Currency;
  OrgValue: Extended;
  Fattore: Double;
begin
    Fattore := Exp(Decimals * Ln(10));
    OrgValue := Value * Fattore;
    TCurr := Int(OrgValue);
    if TCurr < OrgValue then  
      TCurr := TCurr + 1;
    Result := TCurr / Fattore;
end;
Se non vuoi arrotondare per eccesso remma le linee
 if TCurr < OrgValue then  
      TCurr := TCurr + 1;
Ciao,
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"

Grazie, grazie, grazie ed ancora grazie.
Ho risolto tutto con le vostre indicazioni.
Siete stati davvero gentilissimi.
Marco
 
supp...@reporterprofessional.it