Arrotondamenti

di il
7 risposte

Arrotondamenti

Salve,
sono alle prese con l'arrotondamento commerciale.
A tale scopo utilizzo il seguente codice:
 Public Function Arrotonda(ByVal Numero As Variant, _
Optional ByVal Decimali As Variant = 2) As Variant

  Dim result As Variant  
  Dim Nr As Variant     
  Dim Dec As Integer    

  Dec = Decimali
  If Dec > 10 Then Dec = 10
  Nr = CDec(Nz(Numero, 0))
  Nr = Abs(Nr)
  result = Nr * 10 ^ Dec + 0.5
  result = Fix(result) / 10 ^ Dec
  Arrotonda = result * Sgn 
 (Nz(Numero, 0))
End Function    


Esso mi dà questi risultati (come esempi): 1,5=2 2,5=2 123,50=124 124,50=124 ecc.
Praticamente dipende dalla cifra prima della virgola, se pari o dispari.
Io ho bisogno di evitare queste differenze.
E'possibile intevernire sul modulo per risolvere il problema o è necessario ricorrere ad altro metodo.
Grazie

7 Risposte

  • Re: Arrotondamenti

    silene ha scritto:


    ...
    sono alle prese con l'arrotondamento commerciale.
    Ormai ho perso tutte le certezze (e a scuola le avevo, ma c'erano le lire!). Facci qualche esempio, specie di quelli strategici con il "virgolacinque", "virgolacinquezerouno" e che risultato vuoi.

    silene ha scritto:


    ...
    A tale scopo utilizzo il seguente codice:
    Dove l'hai trovato?
    Edit: prova a vedere se questo fa al caso tuo
    2.1 Arrotondamenti
  • Re: Arrotondamenti

    Assolutamente no, secondo me la stai usando MALE...!

    Tu arrotondi senza Decimali, ma come usi la Funzione...? Non nel modo Corretto.

    Ti mostro quello che restituisce, da finestra immediata, usandola correttamente:
    
    ?Arrotonda(1.5,0) 	---> 2 
    ?Arrotonda(2.5,0) 	---> 3
    ?Arrotonda(1.5,0) 	---> 2 
    ?Arrotonda(123.5,0) 	---> 124 
    ?Arrotonda(123.50,0) 	---> 124
    ?Arrotonda(124.5,0) 	---> 125 
    ?Arrotonda(124.50,0) 	---> 125
    
    Penso sia sufficiente per confutare quello che dici...!
    Dimostraci tu come ottieni quello che esponi, perchè NON HA SENSO.
  • Re: Arrotondamenti

    Philcattivocarattere ha scritto:


    silene ha scritto:


    ...
    sono alle prese con l'arrotondamento commerciale.
    Ormai ho perso tutte le certezze (e a scuola le avevo, ma c'erano le lire!). Facci qualche esempio, specie di quelli strategici con il "virgolacinque", "virgolacinquezerouno" e che risultato vuoi.

    silene ha scritto:


    ...
    A tale scopo utilizzo il seguente codice:
    Dove l'hai trovato?
    Edit: prova a vedere se questo fa al caso tuo
    2.1 Arrotondamenti
    Quella routine a memoria è di Giorgio Rancati... per chi sviluppa da un po di tempo Access è persona assai nota...
  • Re: Arrotondamenti

    Salve,
    mi scuso per il ritardo.
    La routine è di Rancati e come ha ben testato Alex ,nella finestra immediata funziona perfettamente.
    Il problema successivo consisteva nel fatto che non riuscivo a richiamarla in un campo della tabella.
    A tal scopo, con non poca fatica,ho impostato la seguente ruotine:
    Private Sub Ctl1E_AfterUpdate()
    Dim sSql As String
    Me.Ctl1E.Value = CDbl(Arrotonda(Me.Ctl1E.Value, 0))
    sSql = "update generale set 1E=" & Me.Ctl1E.Value & "where ID=" & Me.id.Value
    Currentdb.execute sSql
    End Sub
    
    dove 1E è il campo e generale il nome della tabella.
    Il valore arrotondato viene correttamente inserito nel campo ma immediatamente compare l'errore:Errore di sintassi(operatore mancante)nell'espressione della query.........,e nel debug si evidenzia l'ultima riga della routine.
    Sostituendo questa riga con
    Set dbcurrent=currentdb
    tutto funziona regolarmente.
    Sono andato per tentativi e vorrei capire il perchè di ciò.
    Grazie
  • Re: Arrotondamenti

    Il problema nasce spesso da carenze di base... tant'è che quello che hai fatto è tecnicamente e funzionalmente fortemente errato ed inutile.
    Risulta infatti evidente che il Controllo su cui agisci [Ctl1E] è un controllo associato, motivo per cui la gestione dell'arrotondamento la si effettua prima di AGGIORNARE... e direttamente sul Valore e non tramite QUERY UPDATE su un Record che è in EDIT.

    Questi sono "gravi" errori concettuali.

    Prova questa versione:
    Private Sub Ctl1E_BeforeUpdate(Cancel As Integer)
         Me.Ctl1E.Value= Arrotonda(Me.Ctl1E.Value, 0)
    End Sub
  • Re: Arrotondamenti

    Grazie per la risposta Alex,
    ho provato la routine che mi hai inviato ma non arrotonda e mi dà il seguente errore:
    Errore di run-time 2115 impossibile salvare i dati a causa della macro o funzione impostata sulla proprietà PRIMA DI AGGIORNARE o VALIDOSE di tale campo.
  • Re: Arrotondamenti

    Sai solo tu puoi sapere con cosa hai farcito il tuo applicativo...
    Quello che ti ho indicato E' IL MODO da usare... purtroppo se hai altre interazioni non coerenti... devi trovarci i piedi...
    D'altra parte se siamo partiti da dire che la funzione non funzionava per poi fare UPDATE in fase di Edit mi viene facile pensare quante altre cose ci possano essere "discutibili"...
Devi accedere o registrarti per scrivere nel forum
7 risposte