ACC: DSum produce errores de redondeo en campos de moneda grande (95/97)

Seleccione idioma Seleccione idioma
Id. de artículo: 177360 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Moderada: Requiere macro básico, codificación y las capacidades de interoperabilidad.

Expandir todo | Contraer todo

En esta página

Síntomas

El uso de la función de agregado (totales) del dominio DSuma() para sumar un campo de moneda puede producir errores de redondeo para los valores que excedan catorce dígitos significativos. El mismo comportamiento se produce cuando se usa la función SUMA() agregada.

Este artículo se supone que está familiarizado con Visual Basic para aplicaciones y con la creación de aplicaciones de Microsoft Access mediante las herramientas de programación suministradas con Microsoft Access. Para obtener más información acerca de Visual Basic para Aplicaciones, consulte su versión del manual "Creación de aplicaciones con Microsoft Access".

Causa

Si utiliza el tipo de datos moneda, errores de redondeo normalmente no se producen como valores de moneda son enteros a escala en lugar de números de punto flotante. Sin embargo, el almacén de funciones SUMA() y DSuma() un total acumulado un flotante como número de punto, que está limitado a aproximadamente 14 dígitos significativos. Si necesita todas 19 dígitos de precisión (15 a la izquierda del separador decimal) y 4 a la derecha del separador decimal, puede utilizar una función agregado de dominio personalizado. Debe utilizar las funciones integradas suma() y DSuma() si no requieren este grado de precisión.

Solución

Crear la función

Para crear una función de dominio personalizado que suma los datos en un campo, siga estos pasos:
  1. Cree un nuevo módulo y escriba el código siguiente:
          Function DCurSum(Expr As String, Domain As String, _
                Optional Criteria As Variant) As Variant
    
             On Error GoTo Err_DCurSum
    
             Dim rst As Recordset, curTotal As Currency, fld As Field
             Dim db As Database, strSQL As String
             Set db = CurrentDb
             If IsMissing(Criteria) Then  ' No criteria provided.
                strSQL = "Select " & Expr & " AS DCurSumExpr From " & _
                   Domain & ";"
             Else  ' Add criteria to SQL statement.
                strSQL = "Select " & Expr & " AS DCurSumExpr From " & _
                   Domain & " WHERE " & Criteria & ";"
             End If
             Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
             curTotal = 0
             Do Until rst.EOF   ' Loop through all the records.
                If IsNumeric(rst("DCurSumExpr")) Then _
                   curTotal = curTotal + rst("DCurSumExpr") ' Add the numbers.
                rst.MoveNext
             Loop
             DCurSum = CCur(curTotal)
    
          Exit_DCurSum:
             Exit Function
          Err_DCurSum:
             DCurSum = "#Error"
             Resume Exit_DCurSum
          End Function
    						
  2. Compile y guarde el módulo.
  3. Para utilizar la función de dominio personalizado, reemplace DSuma() con DCurSum(). Por ejemplo, en el origen de control de un cuadro de texto, escriba lo siguiente:

    = DCurSum("[YourCurrencyField]", "[YourTable]")

    donde YourCurrencyField es el nombre del campo que desee sumar y YourTable es el nombre de la tabla o consulta que contenga el campo de moneda.

Con DCurSum() criterios

Puede utilizar criterios con DCurSum() del mismo modo que utiliza criterios con DSuma(). En el ejemplo siguiente se utiliza DCurSum() para calcular el valor de todo el inventario de productos cuyo CategoryID es 1.
  1. Abra la base de datos de ejemplo Neptuno.mdb y importar el módulo que creó en el paso 1 de "Crear la función".
  2. Presione CTRL+G para abrir la ventana depuración.
  3. Escriba la línea siguiente en la ventana depuración y, a continuación, presione ENTRAR:

    ? DCurSum("UnitPrice * UnitsInStock","Products","CategoryID=1")

    Observe que esta expresión devuelve el valor total del inventario de productos cuyo CategoryID es 1 en la ventana depuración.

    Tenga en cuenta también que el primer argumento de la función DCurSum() puede ser un nombre de campo o un cálculo. Sin embargo, debe asegurarse de que la expresión en el primer argumento devuelve un valor monetario; en caso contrario, la función DCurSum() devuelve un valor de 0; la función comprueba un valor para ver si es numérico antes de agregarlo al total.

Más información

Pasos para reproducir este comportamiento


  1. Inicie Microsoft Access y abra cualquier base de datos.
  2. Crear la tabla siguiente y guárdelo como tblCurrencySum:
          Table: tblCurrencySum
          ------------------------
          Field Name: CurrencyTest
             Data Type: Currency
    						
  3. Abra la tabla tblCurrencySum y escriba dos registros que contienen los datos siguientes en el campo CurrencyTest:
          $123,456,789,012,345.67
         ($123,456,789,012,345.66)
    						
  4. Presione CTRL+G para abrir la ventana depuración.
  5. Escriba lo siguiente en la ventana depuración y, a continuación, presione ENTRAR:

    ? DSum("[CurrencyTest]","[tblCurrencySum]")

    Observe que esta expresión devuelve un valor de 0.0156 para depurar la ventana. Si utiliza esta expresión en un control o campo que se ha dado formato como moneda, el resultado aparece como 0,02 USD. El resultado esperado es 0,01 USD.

Referencias

Para obtener más información sobre funciones de dominio personalizado, vea los artículos siguientes en Microsoft Knowledge Base:

103401ACC:How para crear la función de dominio personalizada similar para DCont()

146415ACC: Crear funciones similares a DPrim y DÚltimo (95/97)

Para obtener más información acerca de errores de redondeo, vea los artículos siguientes en Microsoft Knowledge Base:

111781ACC: Redondeo errores utilizando los números de punto flotante

35826IEEE frente a formato binario de Microsoft; (completo) de problemas de redondeo

Propiedades

Id. de artículo: 177360 - Última revisión: domingo, 9 de febrero de 2014 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
Palabras clave: 
kbnosurvey kbarchive kbmt kbprb KB177360 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 177360

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com