Newsgroup: it.comp.appl.access
Titolo: Salvataggio valori decimali tramite VBA/DAO

Buongiorno a tutti,
 
ho sviluppato un database diviso in frontend e backend, con il frontend salvato su 7 PC sui quali gira tramite runtime.
 
Riscontro sporadici crash del programma quando vengono salvati tramite recordset DAO dei valori con decimali. Questo accade su macchine diverse (oppure sulla stessa macchina lo stesso dato può generare un crash una volta sì e la volta dopo no).
 
Sono coinvolte diverse tabelle e diverse maschere, ma il succo del discorso ruota attorno ai seguenti dati (fra parentesi il formato dati nella tabella):
 
Numero colli (numero intero)
Peso singolo collo in kg. (numero decimale a 3 cifre)
Peso totale in TON (numero decimale a 3 cifre)
Prezzo in TON in € (valuta a 4 cifre)
Valore complessivo in € (valuta a 2 cifre)
 
Nell'uso tipico, l'utente inserisce i dati in caselle di testo per poi salvarli con un classico pulsante Salva che prevede dei semplici comandi tipo:
 
...
rst.Edit
rst.Fields("PesoTON").Value = CDec(txtpeso)
rst.Update
rst.Close: Set rst = Nothing
...
 
Ho provato a salvare il dato dichiarando prima una variabile Variant con il salvataggio in formato Decimal tramite la funzione CDec, ad utilizzare variabili Single o Double, ad utilizzare una funzione per arrotondare del tipo:
 
 
 
Public Function Arrotonda(ByVal Numero As Variant, Optional ByVal Decimali As Variant = 2) As Variant
On Error GoTo Errore_Arrotonda
 
'----------------------------------------------------------------------------------------------------------
'VBA utilizza il cosiddetto round-to-even, noto anche come "arrotondamento del banchiere",
'che arrotonda al valore più basso da x,01 a x,50 e a quello più alto da x,51 a x,99
'Questa funzione rende un numero arrotondato al numero di decimali desiderato secondo il metodo commerciale
'----------------------------------------------------------------------------------------------------------
 
Dim Risultato As Variant
Dim Nr        As Variant      'Numero da trattare
Dim Dec       As Integer      'Numero di decimali
 
    'Viene controllato che il valore iniziale sia un numero
    If Not IsNumeric(Numero) Then Exit Function
 
    'Viene dichiarato il numero dei decimali
    Dec = Decimali
 
    'Controllo del numero massimo di decimali
    If Dec > 10 Then Dec = 10
 
    'Conversione del numero in ingresso nel tipo "Decimal"
    Nr = CDec(Nz(Numero, 0))
 
    'Viene tolto l'eventuale segno negativo
    Nr = Abs(Nr)
 
    'Viene applicato l'arrotondamento
    Risultato = Nr * 10 ^ Dec + 0.5
    Risultato = Fix(Risultato) / 10 ^ Dec
 
    'Viene riassegnato l'eventuale segno negativo e restituito il risultato finale
    Arrotonda = Risultato * Sgn(Nz(Numero, 0))
 
Exit_Arrotonda:
    Exit Function
 
Errore_Arrotonda:
    MsgBox Err.Description
    Resume Exit_Arrotonda
 
End Function
 
 
Ho provato a rifare le maschere pensando fossero corrotte, ma niente, non ne vengo fuori: ogni tanto qualcuno viene buttato fuori e questo sembra sia dovuto al formato dati nella tabella alla fonte. Ho cercato in più parti e ho letto, tra le altre cose, che il formato Decimal non è 'digerito' fino in fondo dal VBA e i dubbi sono rimasti.
 
Premettendo che ho la necessità che il dato salvato sia preciso (escludo quindi un formato Single o Double nelle tabelle in quanto a virgola mobile), è possibile secondo voi usare il formato Valuta per tutti i valori con decimali, anche se non sono 'monetari' (non solo, quindi, un valore merce in euro, ma anche un campo peso in Ton, kg... ). Nel caso dovessi dichiarare una variabile VBA collegata a questo valore, potrei dichiararla di tipo Currency?
 
Grazie per l'attenzione e scusate se sono stato un po' prolisso.
Denis

... 
 
Quale versione e build esatto di Access/Office usi?
 
Qualche mese fa c'era un bug con il tipo decimal con Access 365 che però 
è stato risolto da lungo:
 
https://support.microsoft.com/en-us/office/access-vba-dao-code-may-crash-or-report-incorrect-data-for-decimal-columns-9311f0ab-ac34-40b4-abd7-2aaa01e07fc7
 
 
 
-- 
Ciao
Karl
*********
http://AccessDevCon.com
 
Access FAQ: 
http://donkarl.com/it
 


Ciao, 
il database è sviluppato con Microsoft Access 2019 a 64 bit, versione 2008 build 13127.20408
Tre dei client sui quali viene lanciato usano Microsoft Access per Microsoft 365 MSO a 64 bit, versione 2007 build 13029.20344
Altri quattro hanno invece la Microsoft Access 2016 Runtime a 64 bit, build 16.0.13127.20408
 
Potrebbe essere una soluzione cambiare il tipo dati in "Valuta" ed usare variabili "Currency" anche per dati come pesi?
Grazie... Denis

 Potrebbe essere una soluzione cambiare il tipo dati in "Valuta" ed usare variabili "Currency" anche per dati come pesi?
 
Con questi versioni non dovrebb'essere questo bug.
Siccome la causa non è chiara è difficile a dire cosa aiuta.
 
Certo che si puo usare il tipo dati Valuta anche per dati non monetari. 
Dalla documentazione:
 
*********
I dati in un campo Valuta non vengono arrotondati durante i calcoli. Un 
campo Valuta viene arrotondato a 15 cifre a sinistra della virgola 
decimale e a 4 cifre a destra.
*********
 
Se questa charateristica serve per il tuo caso puoi provare se è più 
stabile.



D'accordo, grazie mille Karl.
Proverò a cambiare il tipo di dati, sperando di risolvere il problema.
Ciao e buon pomeriggio.
Denis