Estoy de acuerdo los campos calculados son un dolor de cabeza, por ejemplo, al migrar a un servidor como PostgreSQL. Le complemento este ejemplo que utiliza una función que utilizo hace años y el autor es Dev Ashish y elaborado en el año 2000, para mi es la mejor para redondear.
TABLA
Con esta tabla diseño la consulta utilizando la función
DISEÑO CONSULTA
Le aclaro el contenido de los 2 últimos campos en donde llamo la función:
ResultadoBancario: Redondear([valor_01]/[valor_02];0;Verdadero)
ResultadoNoBancario: Redondear([valor_01]/[valor_02];0;Falso)
RESULTADO DE LA CONSULTA
Observe que en la primera fila la función deja 6.5 como 6 en redondeo bancario y 7 en no bancario.
FUNCIÓN
Guarde esta función en un módulo. No hay que inventar la rueda, ya existe.
' ********** Code Start **************
'This code was originally written by Dev Ashish
'It is not to be altered or distributed,
'except as part of an application.
'You are free to use it in any application,
'provided the copyright notice is left unchanged.
'
'Code Courtesy of
'Dev Ashish
'
Public Function Round( _
ByVal Number As Variant, NumDigits As Long, _
Optional UseBankersRounding As Boolean = False) As Double
'
' ---------------------------------------------------
' From "Visual Basic Language Developer's Handbook"
' by Ken Getz and Mike Gilbert
' Copyright 2000; Sybex, Inc. All rights reserved.
' ---------------------------------------------------
'
Dim dblPower As Double
Dim varTemp As Variant
Dim intSgn As Integer
If Not IsNumeric(Number) Then
' Raise an error indicating that
' you've supplied an invalid parameter.
Err.Raise 5
End If
dblPower = 10 ^ NumDigits
' Is this a negative number, or not?
' intSgn will contain -1, 0, or 1.
intSgn = Sgn(Number)
Number = Abs(Number)
' Do the major calculation.
varTemp = CDec(Number) * dblPower + 0.5
' Now round to nearest even, if necessary.
If UseBankersRounding Then
If Int(varTemp) = varTemp Then
' You could also use:
' varTemp = varTemp + (varTemp Mod 2 = 1)
' instead of the next If ...Then statement,
' but I hate counting on TRue == -1 in code.
If varTemp Mod 2 = 1 Then
varTemp = varTemp - 1
End If
End If
End If
' Finish the calculation.
Round = intSgn * Int(varTemp) / dblPower
End Function
Si quiere el ejemplo lo puede solicitar a [email protected]