Redondeo Decimal
En base de datos, el tipo de datos "Decimal" o "Numeric" ("Number" en Oracle) almacena datos de tipo numérico, pero con una precisión definida mediante la declaración de la escala (posiciones decimales) y la precisión (que determina las posiciones enteras = precisión - escala).
El comportamiento normal exige que la escala sea 0 o un número positivo pero menor que la precisión. Sin embargo, Oracle permite mucha más flexibilidad en la definición de este tipo de datos. En Numeric Data Types se describen los diferentes tipos de datos numéricos para Oracle.
A diferencia del redondeo de enteros, el redondeo de decimales se basa en la Escala (número de posiciones decimales) definida en la tabla de destino. Si intentas insertar un valor con 4 decimales en una columna de DECIMAL(10,2), la mayoría de los drivers lanzarán un error de desbordamiento. Excel To Database detecta automáticamente la escala permitida y ajusta el valor.
Los campos de tipo "Moneda" (Currency) en MS Access tienen una precisión de 19 dígitos y una escala de hasta 4 decimales. En SQL Server el campo de tipo "SmallMoney" tiene una precisión de 10 dígitos y una escala de 4 decimales, mientras que "Money" tiene una precisión de 19 dígitos y una escala de 4 decimales. En ambas bases de datos, el comportamiento de estos tipos de datos puede diferir del tipo de datos "Decimal" en función de los drivers seleccionados.
Oracle no tiene este tipo de datos.
Algunos Proveedores de Datos, Drivers y/o Bases de Datos son capaces de realizar el redondeo adecuado para este tipo de datos. Otros, por el contrario, truncan el dato y otros, directamente provocan un error. Excel To Database mostrará un mensaje de advertencia indicando este hecho.
Para garantizar resultados predecibles, Excel To Database implementa el estándar MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.
Esto asegura que un valor como 2.5 siempre se convierta en 3, independientemente de si el driver de la base de datos utiliza redondeo bancario o truncado.
Este estándar garantiza que los cálculos financieros se mantengan consistentes, evitando el 'redondeo bancario' que a veces sesga los totales a la baja.
Como de costumbre, volver a destacar que si se produce un error de conversión de tipo de datos, Excel To Database intentará cargar la cadena de caracteres que representa el dato contenido en la Hoja Excel, siendo muy probable que se produzca un error durante la carga de datos. Marcando la opción "Sin errores de conversión" dicha cadena de caracteres será sustituida por el NULL o el valor por defecto indicado en el Panel de Mapeos.
MS Access: Redondeo Decimal
Para mostrar el comportamiento de esta opción con MS Access se utiliza la Base de Datos del apartado anterior que contiene la siguiente tabla y el Libro Excel del apartado anterior. Del Libro Excel se utilizará la Hoja mostrada en la figura siguiente:
Option Compare Database
Option Explicit
Public Sub CreaTablaRedondeoDecimal()
On Error Resume Next
CurrentProject.Connection.Execute "DROP TABLE [Tabla Redondeo Decimal]"
On Error GoTo Sub_Err
CurrentProject.Connection.Execute "CREATE TABLE [Tabla Redondeo Decimal](" & _
"[Id] COUNTER NOT NULL, " & _
"[Proveedor Datos] TEXT (255) NOT NULL, " & _
"[Driver] TEXT (255) NOT NULL, " & _
"[Decimal_4_2] DECIMAL (4, 2), " & _
"[Moneda] CURRENCY, " & _
"[Decimal_19_4] DECIMAL (19, 4)," & _
"[Decimal_28_0] DECIMAL (28, 0)," & _
"[Decimal_0_28] DECIMAL (28, 28)" & _
")"
Dim db As Object, tbl As Object, fld As Object
Set db = CurrentDb
db.TableDefs.Refresh
Set tbl = db.TableDefs("Tabla Redondeo Decimal")
tbl.Fields.Refresh
Set fld = tbl.Fields("Proveedor Datos")
fld.AllowZeroLength = False
On Error Resume Next
fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True)
On Error GoTo Sub_Err
Set fld = tbl.Fields("Driver")
fld.AllowZeroLength = False
fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True)
Set fld = tbl.Fields("Decimal_4_2")
fld.Properties.Append fld.CreateProperty("Description", 10, "NULL. 4 posiciones, 2 dígitos decimales. Pruebas con separador decimal. Pruebas de redondeo. 12 Bytes")
Set fld = tbl.Fields("Moneda")
fld.Properties.Append fld.CreateProperty("Description", 10, "NULL. 19 posiciones, 4 dígitos decimales. Pruebas con separador decimal. Pruebas de redondeo. 8 Bytes")
fld.Properties.Append fld.CreateProperty("DecimalPlaces", 2, 5)
Set fld = tbl.Fields("Decimal_19_4")
fld.Properties.Append fld.CreateProperty("Description", 10, "NULL. 19 posiciones, 4 dígitos decimales. Pruebas con separador decimal. Pruebas de redondeo. 12 Bytes")
Set fld = tbl.Fields("Decimal_28_0")
fld.Properties.Append fld.CreateProperty("Description", 10, "NULL. 28 posiciones, 0 dígitos decimales. Pruebas con separador decimal. Pruebas de redondeo. 12 Bytes")
Set fld = tbl.Fields("Decimal_0_28")
fld.Properties.Append fld.CreateProperty("Description", 10, "NULL. 28 posiciones, 28 dígitos decimales. Pruebas con separador decimal. Pruebas de redondeo. 12 Bytes")
CurrentProject.Connection.Execute "CREATE UNIQUE INDEX PrimaryKey ON [Tabla Redondeo Decimal] (Id ASC) WITH PRIMARY"
Sub_Exit:
Set fld = Nothing
Set tbl = Nothing
If Not db Is Nothing Then db.Close
Set db = Nothing
Exit Sub
Sub_Err:
MsgBox "Se ha producido un error en 'CreaTablaRedondeoDecimal'." & vbNewLine & vbNewLine & vbTab & Err.Description, , "Error Nº: " & Err.Number
Resume Sub_Exit
Resume
End Sub
MS Access: Hoja Excel para Redondeo Decimal
En primer lugar, destacar los graves problemas del Driver OLE DB de MS Access y los tipos de datos Moneda y Decimal detallados en el capítulo dedicado a MS Access: "El extraño caso de OLE DB con Decimal y Moneda"
Así, para poder cargar la hoja con este proveedor de datos ES NECESARIO que en la configuración regional de Windows figure como separador decimal el punto (.). En caso contrario la carga no funcionará.
Destacar que el proveedor de datos OLE DB para MS Access tiene un comportamiento totalmente caótico, por lo que se recomienda marcar las opciones de Excel To Database "Sin Errores de Conversión" y "Redondeo Decimal", ya que de esta forma se cede el control a Excel To Database haciendo que sea la única opción para obtener el comportamiento esperado.
Sin embargo, el comportamiento del proveedor ODBC es el esperado para cada una de las combinaciones de opciones.
A continuación se muestra el comportamiento de ambos proveedores con las diferentes combinaciones de opciones. Se ha de tener en cuenta que el proveedor ODBC recorta el dato cuando éste supera la escala del campo.
- OLE DB. Bugs en Microsoft.ACE.OLEDB. Sólo con una combinación de opciones se obtiene el comportamiento esperado:
- Opción "Sin Errores de Conversión" NO marcada y "Redondeo Decimal" NO marcada: La carga de datos se comporta de una forma "muy extraña".
Campos Decimal: El Proveedor de Datos recorta la parte decimal a la escala indicada por el campo. (Bug Microsoft.ACE.OLEDB) Sin embargo, tiene problemas cuando el dato está al límite o supera la capacidad del campo.
Campos Moneda: El Proveedor de Datos (Bug Microsoft.ACE.OLEDB) redondea con la opción MidpointRounding.ToEven o MidpointRounding.AwayFromZero sin ningún criterio lógico.Rango "A2:A4" el driver Microsoft.ACE.OLEDB recorta la parte decimal a la escala indicada por el campo.
Celda "A5:A7": Bug Microsoft.ACE.OLEDB recorta toda la parte entera.
Celda "A12" contiene 123.12 es almacenado como 0.12. Bug Microsoft.ACE.OLEDB recorta toda la parte entera. El driver debería producir un error al insertar este valor.Celdas "B3" y "B4" contienen 0.12345 y 0.12346 respectivamente. Son almacenados como 0.1234 y 0.1235 respectivamente. El driver Bug Microsoft.ACE.OLEDB redondea con la opción MidpointRounding.ToEven.
Celdas "B6" y "B7" contienen 9999.99995 y 9999.99996 respectivamente. Son almacenados como 10000 respectivamente. El driver Bug Microsoft.ACE.OLEDB redondea con la opción MidpointRounding.AwayFromZero.
Celda "B12" supera la capacidad del campo, con lo que se produce un error al insertar dicho valor.Rango "C2:C7" el driver Microsoft.ACE.OLEDB recorta la parte decimal a la escala indicada por el campo.
Celda "C12" contiene 999999999999999.99995 y es almacenado como 99999999999999.9999. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera.Celda "D3" contiene 99999999999999999999999999 y es almacenado correctamente, pero MS Access muestra un dato incorrecto.
Celda "D4" contiene 999999999999999999999999999.6 y es alamacenado como 999999999999999999999999999. El driver recorta la parte decimal y MS Access muestra un dato incorrecto, aunque almacena el dato correcto.
Celdas "D5" y "D6" contienen 7919999999999999999999999999.5 y 7919999999999999999999999999.6 respectivamente y son almacenados como 919999999999999999999999999 aunque muestra 920000000000000000000000000. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera.
Celda "D12" contiene 9999999999999999999999999999.6 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 10000000000000000000000000000, que supera la capacidad del campo. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera y almacena 0. El driver debería producir un error al insertar este valor.Celda "E4" contiene 1E-29 que supera la precisión del tipo Decimal de .NET (7,92...E-28). Al leer el dato, .NET lo redondea a 0, que es lo que se almacena en el campo.
Celda "E12" contiene 0.99999999999999999999999999996 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 1.0000000000000000000000000000 que supera la capacidad del campo. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera. El driver debería producir un error al insertar este valor. - Opción "Sin Errores de Conversión" NO marcada y "Redondeo Decimal" marcada: La carga de datos se comporta de una forma "muy extraña".
Los redondeos los realiza Excel To Database con la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.
Campos Decimal: El Proveedor de Datos (Bug Microsoft.ACE.OLEDB) tiene problemas cuando el dato está al límite o supera la capacidad del campo.
Campos Moneda: El Proveedor de Datos se comporta como se espera.Celdas "A6" y "A7" contienen 99.995 y 99.996 respectivamente. Excel To Database redondea (MidpointRounding.AwayFromZero) los datos a 100. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera. El driver debería producir un error al insertar este valor redondeado.
Celda "A12" contiene 123.12 es almacenado como 0.12. Bug Microsoft.ACE.OLEDB recorta toda parte entera. El driver debería producir un error al insertar este valor.Celda "B12" supera la capacidad del campo, con lo que se produce un error al insertar dicho valor.
Celda "C12" contiene 999999999999999.99995. Excel To Database redondea (MidpointRounding.AwayFromZero) el dato a 1000000000000000.0000. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera. El driver debería producir un error al insertar este valor redondeado.
Celda "D3" contiene 99999999999999999999999999 y es almacenado correctamente, pero MS Access muestra un dato incorrecto.
Celda "D12" contiene 9999999999999999999999999999.6 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 10000000000000000000000000000, que supera la capacidad del campo. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera. El driver debería producir un error al insertar este valor.Celda "E4" contiene 1E-29 que supera la capacidad del tipo Decimal de .NET (7,92...E-28). Al leer el dato, .NET lo redondea a 0, que es lo que se almacena en el campo.
Celda "E12" contiene 0.99999999999999999999999999996 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 1.0000000000000000000000000000 que supera la capacidad del campo. Bug Microsoft.ACE.OLEDB recorta el primer dígito de la parte entera. El driver debería producir un error al insertar este valor. - Opción "Sin Errores de Conversión" marcada y "Redondeo Decimal" NO marcada: La carga de datos se comporta de una forma "muy extraña".
Campos Decimal: El Proveedor de Datos (Bug Microsoft.ACE.OLEDB) recorta o redondea (MidpointRounding.AwayFromZero) el dato. Además, tiene problemas cuando el dato está al límite o supera la capacidad del campo.
Campos Moneda: El Proveedor de Datos redondea con la opción MidpointRounding.ToEven.El comportamiento es el mismo que Opción "Sin Errores de Conversión" NO marcada y "Redondeo Decimal" NO marcada excepto para las celdas descritas a continuación:
Celda "A12" contiene 123.12. El Nº de dígitos de la parte entera '3' supera los permitidos '2'. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.
Celda "B12" supera la capacidad del campo. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.
Celda "D12" contiene 9999999999999999999999999999.6 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 10000000000000000000000000000, que supera la capacidad del campo. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.
Celda "E12" contiene 0.99999999999999999999999999996 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 1.0000000000000000000000000000 que supera la capacidad del campo. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.
- Opción "Sin Errores de Conversión" marcada y "Redondeo Decimal" marcada: La carga de datos se comporta de la forma esperada.
Los redondeos los realiza Excel To Database con la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.
Campos Decimal: El Proveedor de Datos se comporta como se espera.
Campos Moneda: El Proveedor de Datos se comporta como se espera.Celdas "A6" y "A7" contienen 99.995 y 99.996 respectivamente. Excel To Database redondea (MidpointRounding.AwayFromZero) los datos a 100. El Nº de dígitos de la parte entera '3' supera los permitidos '2'. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL
Celda "A12" contiene 123.12. El Nº de dígitos de la parte entera '3' supera los permitidos '2'. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.Celda "B12" supera la capacidad del campo. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.
Celda "D12" contiene 9999999999999999999999999999.6 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 10000000000000000000000000000, que supera la capacidad del campo. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.
Celda "D3" contiene 99999999999999999999999999 y es almacenado correctamente, pero MS Access muestra un dato incorrecto.
Celda "D12" contiene 9999999999999999999999999999.6 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 10000000000000000000000000000, que supera la capacidad del campo. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.Celda "E4" contiene 1E-29 que supera la precisión del tipo Decimal de .NET (7,92...E-28). Al leer el dato, .NET lo redondea a 0, que es lo que se almacena en el campo.
Celda "E12" contiene 0.99999999999999999999999999996 que supera la precisión del tipo Decimal de .NET (28 dígitos significativos). Al leer el dato, .NET lo redondea a 1.0000000000000000000000000000 que supera la capacidad del campo. Excel To Database inserta el valor por defecto definido en el Panel de Mapeos, en este caso, un NULL.
- Opción "Sin Errores de Conversión" NO marcada y "Redondeo Decimal" NO marcada: La carga de datos se comporta de una forma "muy extraña".
- ODBC. El comportamiento es el esperado en todas las combinaciones:
- Opción "Sin Errores de Conversión" NO marcada y "Redondeo Decimal" NO marcada: La carga de datos se comporta de la forma esperada.
Campos Decimal y Moneda: El Driver ODBC "Microsoft Access Driver (*.mdb, *.accdb)" recorta el dato a la escala indicada por el campo. Los datos se almacenan correctamente. Y cuando se supera la capacidad del campo, el driver lanza el error adecuado.
Rango "D2:D6" el driver recorta el dato adecuadamente, se almacena correctamente, pero MS Access muestra un valor redondeado.
- Opción "Sin Errores de Conversión" NO marcada y "Redondeo Decimal" marcada: La carga de datos se comporta de la forma esperada.
Campos Decimal y Moneda: Excel To Database realiza el redondeo de los datos con la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración. Los datos se almacenan correctamente. Y cuando se supera la capacidad del campo, el driver lanza el error adecuado.
- Opción "Sin Errores de Conversión" marcada y "Redondeo Decimal" NO marcada: La carga de datos se comporta de la forma esperada.
Campos Decimal y Moneda: El Driver ODBC "Microsoft Access Driver (*.mdb, *.accdb)" recorta el dato a la escala indicada por el campo. Los datos se almacenan correctamente. Y cuando se supera la capacidad del campo, Excel To Database almacena el valor por defecto, en este caso NULL.
- Opción "Sin Errores de Conversión" marcada y "Redondeo Decimal" marcada: La carga de datos se comporta de la forma esperada.
Campos Decimal y Moneda: Excel To Database realiza el redondeo de los datos con la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración. Los datos se almacenan correctamente. Y cuando se supera la capacidad del campo, Excel To Database almacena el valor por defecto, en este caso NULL.
- Opción "Sin Errores de Conversión" NO marcada y "Redondeo Decimal" NO marcada: La carga de datos se comporta de la forma esperada.
SQL Server: Redondeo Decimal
A diferencia de MS Access, el comportamiento de los diferentes Proveedores de Datos es predecible y fiable. Se han realizado las pruebas utilizando la siguiente tabla para SQL Server y la Hoja de datos mostrada en la figura siguiente:
DROP TABLE IF EXISTS [dbo].[Tabla Redondeo Decimal];
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Tabla Redondeo Decimal](
[SmallMoney] [smallmoney] NULL,
[Decimal_10_4] [decimal](10,4) NULL,
[Money] [money] NULL,
[Decimal_4_2] [decimal](4,2) NULL,
[Decimal_38_0] [numeric](38,0) NULL,
[Provider] [varchar](10) COLLATE Modern_Spanish_100_CS_AS NOT NULL,
[Driver] [varchar](50) COLLATE Modern_Spanish_100_CS_AS NOT NULL,
[Identidad] [int] IDENTITY(1,1) NOT NULL,
PRIMARY KEY CLUSTERED
(
[Identidad] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SQL Server: Hoja Excel para Redondeo Decimal
- .NET (System.Data.SqlClient):
Con los campos de tipo "decimal" o "numeric" este proveedor de datos recorta la parte decimal del dato al número de dígitos indicados en la escala.
Con los campos de tipo "smallmoney" y "money", redondea el dato usando la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.La opción "Redondeo Decimal" aparecerá para los campos de tipo "decimal", "numeric", "smallmoney" y "money". Esta opción permitirá comprobar si al redondear un dato se excede la capacidad del campo. Si se combina con la opción "Sin Errores de Conversión" permitirá que la carga continúe insertando un NULL o el Valor por defecto indicado en la Panel de Mapeos.
El driver lanza una excepción cuando el dato excede la capacidad del campo o no se puede convertir el dato al tipo de datos Decimal de .NET y no se inserta ninguna fila.Usando la opción "Redondeo Decimal" de Excel To Database todos los campos son redondeados usando la opción MidpointRounding.AwayFromZero.
- OLE DB (MSOLEDBSQL19, MSOLEDBSQL, SQLNCLI11, SQLOLEDB):
Con los campos de tipo "decimal" o "numeric" este proveedor de datos recorta la parte decimal del dato al número de dígitos indicados en la escala.
Con los campos de tipo "smallmoney" y "money", redondea el dato, aunque unas veces usa la opción MidpointRounding.ToEven y otras MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.Se ha observado un comportamiento "extraño" para todos los drivers OLE DB con las celdas "C6" y "C7". Mientras que con el resto de los datos de tipo "smallmoney" o "money" el redondeo ha sido con MidpointRounding.ToEven, estas dos celdas han sido redondeadas con la opción MidpointRounding.AwayFromZero. En otras palabras, hay un Bug OLE DB (MSOLEDBSQL19, MSOLEDBSQL, SQLNCLI11, SQLOLEDB)
La opción "Redondeo Decimal" aparecerá para los campos de tipo "decimal", "numeric", "smallmoney" y "money". Esta opción permitirá comprobar si al redondear un dato se excede la capacidad del campo. Si se combina con la opción "Sin Errores de Conversión" permitirá que la carga continúe insertando un NULL o el Valor por defecto indicado en la Panel de Mapeos.
El driver lanza una excepción cuando el dato excede la capacidad del campo o no se puede convertir el dato al tipo de datos Decimal de .NET. El número de filas insertadas depende de la opción "Con Transacción".Usando la opción "Redondeo Decimal" de Excel To Database todos los campos son redondeados usando la opción MidpointRounding.AwayFromZero.
- ODBC ({ODBC Driver 18 for SQL Server}, {ODBC Driver 17 for SQL Server}, {SQL Server}, {SQL Server Native Client 11.0}) :
Con los campos de tipo "decimal", "numeric", "smallmoney" y "money", redondea el dato usando la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.
La opción "Redondeo Decimal" aparecerá para los campos de tipo "decimal", "numeric", "smallmoney" y "money". Esta opción permitirá comprobar si al redondear un dato se excede la capacidad del campo y si se combina con la opción "Sin Errores de Conversión" permitirá que la carga continúe insertando un NULL o el Valor por defecto indicado en el Panel de Mapeos.
El driver lanza una excepción cuando el dato excede la capacidad del campo o no se puede convertir el dato al tipo de datos Decimal de .NET. El número de filas insertadas depende de la opción "Con Transacción".Usando la opción "Redondeo Decimal" de Excel To Database todos los campos son redondeados usando la opción MidpointRounding.AwayFromZero.
Oracle: Redondeo Decimal
Se han realizado las pruebas utilizando la siguiente tabla para Oracle y la Hoja de datos mostrada en la figura siguiente:
CREATE TABLE "Tabla Redondeo Decimal" (
Id NUMBER(6) GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Provider VARCHAR2(10 CHAR),
Driver VARCHAR2(50 CHAR),
"Int 2" NUMBER(2),
"Redondeo 100" NUMBER(5, -2),
"Redondeo -5 (3, 5)" NUMBER(3, 5),
"Number (4 2)" NUMBER(4, 2),
"Number" NUMBER
);
Oracle: Hoja Excel para Redondeo Decimal
Volver a resaltar que sólo el Managed Driver detecta los tipos de datos entero, por lo que para este proveedor de datos, esta opción no aparece en los campos "Int 2" y "Redondeo 100", los cuales fueron objeto de estudio en el apartado "Redondeo Entero".
Además, como ya se ha indicado anteriormente, el Managed Driver con la característica Bulk Copy (opción "Usar Arrays" no marcada) existe un problema similar al descrito en el apartado "Truncar Cadenas". El driver permite la inserción de CUALQUIER COSA sin que ésta tenga que cumplir ninguna de las restricciones definidas en los campos de la tabla.
Así, por ejemplo, con el Managed Driver y con la característica Bulk Copy y la opción "Redondeo Decimal" no marcada y sin realizar las comprobaciones que realiza Excel To Database se puede obtener la siguiente carga:
Oracle: Error Carga Redondeo Decimal
Como se puede apreciar, existen registros para el campo "Redondeo -5 (3, 5)" que no cumplen la restricción de tener dos ceros inmediatamente detrás del separador decimal, y para el campo "Number 4 2" hay datos cuya parte entera se compone de tres dígitos a pesar de estar prohibido. Esto puede hacer que la tabla se quede en un estado inconsistente y, por ejemplo, que la instrucción 'SELECT * FROM "Tabla Redondeo Decimal" ORDER BY ID;' no funcione en "Oracle SQL Developer" como ocurría en el apartado anterior.
Excel To Database contiene una serie de chequeos para que este tipo de cosas no ocurran. Así, en el "Panel de Resultados" se muestran mensajes del estilo:
...
Cell: C7, Value: 9.9950000000000004E-3
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 0.009995
Celda: C7, Valor: 0.009995, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '6' supera la Escala.
El Managed Driver de Oracle con NO Arrays contiene un bug que permite insertar datos que no cumplen las restricciones de la columna.
Marque la opción "Redondeo Decimal".
No se ejecutará la Fase de carga de datos.
Celda: D7, Valor: 99.995, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
El Managed Driver de Oracle con NO Arrays contiene un bug que permite insertar datos que no cumplen las restricciones de la columna.
Marque la opción "Redondeo Decimal".
No se ejecutará la Fase de carga de datos.
...
Marcando la opción "Redondeo Decimal", Excel To Database se encarga de redondear los datos, pero al mismo tiempo protege de las inserciones indeseadas debido a los Bugs Managed Driver con la opción Bulk Copy. Será necesario marcar la opción "Sin Errores de Conversión" para sustituir los datos problemáticos con NULL o el valor indicado en el "Panel de Mapeos".
...
Cell: C7, Value: 9.9950000000000004E-3
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 0.009995
Celda: C7, Valor: 0.009995, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '6' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.01
Celda: C7, Valor: 0.01, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5. Escala mayor que Precisión.
Escala - Precisión indica Nº mínimo de ceros significativos despues del separador decimal.
Escala - Precisión 2 > 1 Nº de ceros significativos.
El Managed Driver de Oracle con NO Arrays contiene un bug que permite insertar datos que no cumplen las restricciones de la columna.
Marque la opción "Sin Errores de Conversión" para cargar el valor por defecto.
No se ejecutará la Fase de carga de datos.
Celda: D7, Valor: 99.995, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 100
Celda: D7, Valor: 100, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos de la parte entera '3' supera los permitidos '2' (Precisión - Escala)
El Managed Driver de Oracle con NO Arrays contiene un bug que permite insertar datos que no cumplen las restricciones de la columna.
Marque la opción "Sin Errores de Conversión" para cargar el valor por defecto.
No se ejecutará la Fase de carga de datos.
...
Con el Managed Driver y la característica Array Binding (opción "Usar Arrays" marcada) y la opción "Redondeo Decimal" no marcada, el comportamiento es diferente. Aunque Excel To Database muestra los mensajes de aviso pertinentes, se inicia la fase de carga de datos y es ahí donde se producen los errores. Los mensajes que aparecen en los ficheros de .log serán similares a los siguientes:
...
Celda: C7, Valor: 9.9950000000000004E-3
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 0.00999500044
Celda: C7, Valor: 0.009995, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '6' supera la Escala.
Es posible que el Proveedor de Datos o la Base de Datos redondee o trunque el dato.
Celda: D7, Valor: 99.9950
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 99.9950027
Celda: D7, Valor: 99.995, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Es posible que el Proveedor de Datos o la Base de Datos redondee o trunque el dato
....
Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Decimal'.
Comando Insert: insert into "Tabla Redondeo Decimal" ("Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER") values(:0, :1, :2, :3, :4, :5, :6)
{
"$id": "1",
"$type": "Oracle.ManagedDataAccess.Client.OracleException, Oracle.ManagedDataAccess",
"OracleLogicalTransaction": {
"$type": "Oracle.ManagedDataAccess.Client.OracleLogicalTransaction, Oracle.ManagedDataAccess",
"Committed": null,
"UserCallCompleted": null,
"ConnectionString": null,
"LogicalTransactionId": null
},
"Errors": {
"$type": "Oracle.ManagedDataAccess.Client.OracleErrorCollection, Oracle.ManagedDataAccess",
"$values": [
{
"$id": "2",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-24381: error(s) in array DML
https://docs.oracle.com/error-help/db/ora-24381/",
"Number": 24381,
"ParseErrorOffset": 157,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": -1
},
{
"$id": "3",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Number": 1438,
"ParseErrorOffset": -1,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": 3
},
{
"$id": "4",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Number": 1438,
"ParseErrorOffset": -1,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": 5
},
{
"$id": "5",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Number": 1438,
"ParseErrorOffset": -1,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": 6
}
]
},
"DataSource": "",
"Message": "ORA-24381: error(s) in array DML
https://docs.oracle.com/error-help/db/ora-24381/\nORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/\nORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/\nORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"Number": 24381,
"IsRecoverable": false,
"ErrorCode": -2147467259,
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"HResult": -2147467259
}
Error en la Fila Excel: '5' Error de Oracle: '1438'
Mensaje: ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/
Valores:
Number: 0,0000000000000000000000000001
Number (4 2): 0,126
Redondeo -5 (3, 5): 0,003456
Redondeo 100: 12345678
Int 2: 3
DRIVER: Managed Driver (Arrays)
PROVIDER: .NET
Error en la Fila Excel: '7' Error de Oracle: '1438'
Mensaje: ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/
Valores:
Number:
Number (4 2): 99,995
Redondeo -5 (3, 5): 0,009995
Redondeo 100: 0
Int 2: 100
DRIVER: Managed Driver (Arrays)
PROVIDER: .NET
Error en la Fila Excel: '8' Error de Oracle: '1438'
Mensaje: ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/
Valores:
Number:
Number (4 2): 99,996
Redondeo -5 (3, 5): 0,009996
Redondeo 100: 0
Int 2: 100
DRIVER: Managed Driver (Arrays)
PROVIDER: .NET
Marcando la opción "Redondeo Decimal", Excel To Database se encarga de redondear los datos con la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.
Sin embargo pueden ocurrir errores similares a los anteriores con los datos redondeados que superen la capacidad del campo. Será necesario marcar la opción "Sin Errores de Conversión" para sustituir los datos problemáticos con NULL o el valor indicado en el "Panel de Mapeos".
...
Celda: A5, Valor: 2.6, Tabla: Tabla Redondeo Decimal, Columna: Int 2
Opción "Redondeo Entero" marcada. Valor Redondeado: 3
Celda: B5, Valor: 12345678, Tabla: Tabla Redondeo Decimal, Columna: Redondeo 100, Precisión: 5, Escala: -2
El Nº de dígitos de la parte entera '8' supera los permitidos '7'
Celda: C5, Valor: 3.4559999999999999E-3
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 0.00345600001
Celda: C5, Valor: 0.003456, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '6' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.00346
Celda: D5, Valor: 0.1260
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 0.126000002
Celda: D5, Valor: 0.126, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.13
...
Celda: A7, Valor: 99.5, Tabla: Tabla Redondeo Decimal, Columna: Int 2
Opción "Redondeo Entero" marcada. Valor Redondeado: 100
Celda: A7, Valor: 100, Tabla: Tabla Redondeo Decimal, Columna: Int 2, Precisión: 2
El Nº de dígitos '3' supera los permitidos '2'
Celda: B7, Valor: 49.5, Tabla: Tabla Redondeo Decimal, Columna: Redondeo 100, Precisión: 5, Escala: -2
Nº de ceros significativos a la izquierda del separador decimal 0 es inferior Abs(Escala) 2
Opción "Redondeo Entero" marcada. Valor redondeado: 0
Celda: C7, Valor: 9.9950000000000004E-3
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 0.00999500044
Celda: C7, Valor: 0.009995, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '6' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.01
Celda: C7, Valor: 0.01, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5. Escala mayor que Precisión.
Escala - Precisión indica Nº mínimo de ceros significativos despues del separador decimal.
Escala - Precisión 2 > 1 Nº de ceros significativos.
Celda: D7, Valor: 99.9950
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 99.9950027
Celda: D7, Valor: 99.995, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 100
Celda: D7, Valor: 100, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos de la parte entera '3' supera los permitidos '2' (Precisión - Escala)
Celda: A8, Valor: 99.6, Tabla: Tabla Redondeo Decimal, Columna: Int 2
Opción "Redondeo Entero" marcada. Valor Redondeado: 100
Celda: A8, Valor: 100, Tabla: Tabla Redondeo Decimal, Columna: Int 2, Precisión: 2
El Nº de dígitos '3' supera los permitidos '2'
Celda: B8, Valor: 49.6, Tabla: Tabla Redondeo Decimal, Columna: Redondeo 100, Precisión: 5, Escala: -2
Nº de ceros significativos a la izquierda del separador decimal 0 es inferior Abs(Escala) 2
Opción "Redondeo Entero" marcada. Valor redondeado: 0
Celda: C8, Valor: 9.9959999999999997E-3
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 0.00999599975
Celda: C8, Valor: 0.009996, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '6' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.01
Celda: C8, Valor: 0.01, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5. Escala mayor que Precisión.
Escala - Precisión indica Nº mínimo de ceros significativos despues del separador decimal.
Escala - Precisión 2 > 1 Nº de ceros significativos.
Celda: D8, Valor: 99.9960
El valor contenido en la celda ha sido convertido al tipo Single de .NET: 99.9960022
Celda: D8, Valor: 99.996, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 100
Celda: D8, Valor: 100, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos de la parte entera '3' supera los permitidos '2' (Precisión - Escala)...
Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Decimal'.
Comando Insert: insert into "Tabla Redondeo Decimal" ("Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER") values(:0, :1, :2, :3, :4, :5, :6)
{
"$id": "1",
"$type": "Oracle.ManagedDataAccess.Client.OracleException, Oracle.ManagedDataAccess",
"OracleLogicalTransaction": {
"$type": "Oracle.ManagedDataAccess.Client.OracleLogicalTransaction, Oracle.ManagedDataAccess",
"Committed": null,
"UserCallCompleted": null,
"ConnectionString": null,
"LogicalTransactionId": null
},
"Errors": {
"$type": "Oracle.ManagedDataAccess.Client.OracleErrorCollection, Oracle.ManagedDataAccess",
"$values": [
{
"$id": "2",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-24381: error(s) in array DML
https://docs.oracle.com/error-help/db/ora-24381/",
"Number": 24381,
"ParseErrorOffset": 157,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": -1
},
{
"$id": "3",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Number": 1438,
"ParseErrorOffset": -1,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": 3
},
{
"$id": "4",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Number": 1438,
"ParseErrorOffset": -1,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": 5
},
{
"$id": "5",
"$type": "Oracle.ManagedDataAccess.Client.OracleError, Oracle.ManagedDataAccess",
"DataSource": "",
"Message": "ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Number": 1438,
"ParseErrorOffset": -1,
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"ArrayBindIndex": 6
}
]
},
"DataSource": "",
"Message": "ORA-24381: error(s) in array DML
https://docs.oracle.com/error-help/db/ora-24381/\nORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/\nORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/\nORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/",
"Procedure": "",
"Source": "Oracle Data Provider for .NET, Managed Driver",
"Number": 24381,
"IsRecoverable": false,
"ErrorCode": -2147467259,
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"HResult": -2147467259
}
Error en la Fila Excel: '5' Error de Oracle: '1438'
Mensaje: ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/
Valores:
Number: 0,0000000000000000000000000001
Number (4 2): 0,13
Redondeo -5 (3, 5): 0,00346
Redondeo 100: 12345678
Int 2: 3
DRIVER: Managed Driver (Arrays)
PROVIDER: .NET
Error en la Fila Excel: '7' Error de Oracle: '1438'
Mensaje: ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/
Valores:
Number:
Number (4 2): 100
Redondeo -5 (3, 5): 0,01
Redondeo 100: 0
Int 2: 100
DRIVER: Managed Driver (Arrays)
PROVIDER: .NET
Error en la Fila Excel: '8' Error de Oracle: '1438'
Mensaje: ORA-01438: value larger than specified precision allowed for this column
https://docs.oracle.com/error-help/db/ora-01438/
Valores:
Number:
Number (4 2): 100
Redondeo -5 (3, 5): 0,01
Redondeo 100: 0
Int 2: 100
DRIVER: Managed Driver (Arrays)
PROVIDER: .NET
Con los proveedores de datos OLE DB y ODBC se obtienen los siguientes resultados cuando no se han marcado las opciones "Redondeo Decimal" ni "Sin Errores de Conversión".
...
Celda: A5, Valor: 2.6, Tabla: Tabla Redondeo Decimal, Columna: Int 2, Precisión: 2, Escala: 0
El Nº de dígitos decimales '1' supera la Escala.
Es posible que el Proveedor de Datos o la Base de Datos redondee o trunque el dato.
Celda: B5, Valor: 12345678, Tabla: Tabla Redondeo Decimal, Columna: Redondeo 100, Precisión: 5, Escala: -2
El Nº de dígitos de la parte entera '8' supera los permitidos '7'
Celda: C5, Valor: 0.0034559999999999999, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '19' supera la Escala.
Es posible que el Proveedor de Datos o la Base de Datos redondee o trunque el dato.
Celda: D5, Valor: 0.126, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Es posible que el Proveedor de Datos o la Base de Datos redondee o trunque el dato.
...
Conexiones OLE DB (Oracle® Provider for OLE DB) Opción "Redondeo Decimal no marcada.
Fila: 4
Comando: INSERT INTO "Tabla Redondeo Decimal" ("Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?, ?, ?, ?)
Comando Select: SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
Excepción:
{
"$id": "1",
"$type": "System.Data.OleDb.OleDbException, System.Data",
"ErrorCode": -2147217833,
"Errors": {
"$type": "System.Data.OleDb.OleDbErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.OleDb.OleDbError, System.Data",
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"NativeError": 0,
"Source": "OraOLEDB",
"SQLState": ""
}
]
},
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"Source": "OraOLEDB",
"HResult": -2147217833
}
Columna: Number Valor: 0.0000000000000000000000000001
Columna: Number (4 2) Valor: 0.1260
Columna: Redondeo -5 (3, 5) Valor: 0.0034559999999999999
Columna: Redondeo 100 Valor: 12345678
Columna: Int 2 Valor: 2.6
Columna: DRIVER Valor: OraOLEDB.Oracle
Columna: PROVIDER Valor: OLE DB
Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Decimal'. Error en la Fila: 4
Query que indica las columnas utilizadas de la Tabla:
SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
{
"$id": "1",
"$type": "System.Data.OleDb.OleDbException, System.Data",
"ErrorCode": -2147217833,
"Errors": {
"$type": "System.Data.OleDb.OleDbErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.OleDb.OleDbError, System.Data",
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"NativeError": 0,
"Source": "OraOLEDB",
"SQLState": ""
}
]
},
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"Source": "OraOLEDB",
"HResult": -2147217833
}
Conexiones ODBC (Oracle ODBC Driver) Opción "Redondeo Decimal no marcada.
Fila: 4
Comando: INSERT INTO "Tabla Redondeo Decimal" ("Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?, ?, ?, ?)
Comando Select: SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
Excepción:
{
"$id": "1",
"$type": "System.Data.Odbc.OdbcException, System.Data",
"Errors": {
"$type": "System.Data.Odbc.OdbcErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.Odbc.OdbcError, System.Data",
"Message": "[Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"SQLState": "HY000",
"NativeError": 1438,
"Source": "SQORA32.DLL"
}
]
},
"Source": "SQORA32.DLL",
"ErrorCode": -2146232009,
"Message": "ERROR [HY000] [Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"HResult": -2146232009
}
Columna: Number Valor: 0.0000000000000000000000000001
Columna: Number (4 2) Valor: 0.1260
Columna: Redondeo -5 (3, 5) Valor: 0.0034559999999999999
Columna: Redondeo 100 Valor: 12345678
Columna: Int 2 Valor: 2.6
Columna: DRIVER Valor: {Oracle en OraDB21Home1}
Columna: PROVIDER Valor: ODBC
Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Decimal'. Error en la Fila: 4
Query que indica las columnas utilizadas de la Tabla:
SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
{
"$id": "1",
"$type": "System.Data.Odbc.OdbcException, System.Data",
"Errors": {
"$type": "System.Data.Odbc.OdbcErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.Odbc.OdbcError, System.Data",
"Message": "[Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"SQLState": "HY000",
"NativeError": 1438,
"Source": "SQORA32.DLL"
}
]
},
"Source": "SQORA32.DLL",
"ErrorCode": -2146232009,
"Message": "ERROR [HY000] [Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"HResult": -2146232009
}
Marcando la opción "Redondeo Decimal" para los proveedores de datos OLE DB y ODBC, Excel To Database se encarga de redondear los datos con la opción MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.
Sin embargo pueden ocurrir errores similares a los anteriores con los datos redondeados que superen la capacidad del campo. Será necesario marcar la opción "Sin Errores de Conversión" para sustituir los datos problemáticos con NULL o el valor indicado en el "Panel de Mapeos".
...
Celda: A5, Valor: 2.6, Tabla: Tabla Redondeo Decimal, Columna: Int 2, Precisión: 2, Escala: 0
El Nº de dígitos decimales '1' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 3
Celda: B5, Valor: 12345678, Tabla: Tabla Redondeo Decimal, Columna: Redondeo 100, Precisión: 5, Escala: -2
El Nº de dígitos de la parte entera '8' supera los permitidos '7'
Celda: C5, Valor: 0.0034559999999999999, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '19' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.00346
Celda: D5, Valor: 0.126, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.13
...
Celda: A7, Valor: 99.5, Tabla: Tabla Redondeo Decimal, Columna: Int 2, Precisión: 2, Escala: 0
El Nº de dígitos decimales '1' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 100
Celda: A7, Valor: 100, Tabla: Tabla Redondeo Decimal, Columna: Int 2, Precisión: 2, Escala: 0
El Nº de dígitos de la parte entera '3' supera los permitidos '2' (Precisión - Escala)
Celda: B7, Valor: 49.5, Tabla: Tabla Redondeo Decimal, Columna: Redondeo 100, Precisión: 5, Escala: -2
Nº de ceros significativos a la izquierda del separador decimal 0 es inferior Abs(Escala) 2
Opción "Redondeo Decimal" marcada. Valor redondeado: 0
Celda: C7, Valor: 0.0099950000000000004, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5
El Nº de dígitos decimales '19' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 0.01000
Celda: C7, Valor: 0.01000, Tabla: Tabla Redondeo Decimal, Columna: Redondeo -5 (3, 5), Precisión: 3, Escala: 5. Escala mayor que Precisión.
Escala - Precisión indica Nº mínimo de ceros significativos despues del separador decimal.
Escala - Precisión 2 > 1 Nº de ceros significativos.
Celda: D7, Valor: 99.995, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos decimales '3' supera la Escala.
Opción "Redondeo Decimal" marcada. Valor redondeado: 100.00
Celda: D7, Valor: 100, Tabla: Tabla Redondeo Decimal, Columna: Number (4 2), Precisión: 4, Escala: 2
El Nº de dígitos de la parte entera '3' supera los permitidos '2' (Precisión - Escala)
...
Conexiones OLE DB (Oracle® Provider for OLE DB) Opción "Redondeo Decimal marcada.
Fila: 4
Comando: INSERT INTO "Tabla Redondeo Decimal" ("Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?, ?, ?, ?)
Comando Select: SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
Excepción:
{
"$id": "1",
"$type": "System.Data.OleDb.OleDbException, System.Data",
"ErrorCode": -2147217833,
"Errors": {
"$type": "System.Data.OleDb.OleDbErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.OleDb.OleDbError, System.Data",
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"NativeError": 0,
"Source": "OraOLEDB",
"SQLState": ""
}
]
},
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"Source": "OraOLEDB",
"HResult": -2147217833
}
Columna: Number Valor: 0.0000000000000000000000000001
Columna: Number (4 2) Valor: 0.13
Columna: Redondeo -5 (3, 5) Valor: 0.00346
Columna: Redondeo 100 Valor: 12345678
Columna: Int 2 Valor: 3
Columna: DRIVER Valor: OraOLEDB.Oracle
Columna: PROVIDER Valor: OLE DB
Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Decimal'. Error en la Fila: 4
Query que indica las columnas utilizadas de la Tabla:
SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
{
"$id": "1",
"$type": "System.Data.OleDb.OleDbException, System.Data",
"ErrorCode": -2147217833,
"Errors": {
"$type": "System.Data.OleDb.OleDbErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.OleDb.OleDbError, System.Data",
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"NativeError": 0,
"Source": "OraOLEDB",
"SQLState": ""
}
]
},
"Message": "ORA-01438: value larger than specified precision allowed for this column",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"Source": "OraOLEDB",
"HResult": -2147217833
}
Conexiones ODBC (Oracle ODBC Driver) Opción "Redondeo Decimal marcada.
Fila: 4
Comando: INSERT INTO "Tabla Redondeo Decimal" ("Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?, ?, ?, ?)
Comando Select: SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
Excepción:
{
"$id": "1",
"$type": "System.Data.Odbc.OdbcException, System.Data",
"Errors": {
"$type": "System.Data.Odbc.OdbcErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.Odbc.OdbcError, System.Data",
"Message": "[Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"SQLState": "HY000",
"NativeError": 1438,
"Source": "SQORA32.DLL"
}
]
},
"Source": "SQORA32.DLL",
"ErrorCode": -2146232009,
"Message": "ERROR [HY000] [Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"HResult": -2146232009
}
Columna: Number Valor: 0.0000000000000000000000000001
Columna: Number (4 2) Valor: 0.13
Columna: Redondeo -5 (3, 5) Valor: 0.00346
Columna: Redondeo 100 Valor: 12345678
Columna: Int 2 Valor: 3
Columna: DRIVER Valor: {Oracle en OraDB21Home1}
Columna: PROVIDER Valor: ODBC
Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Decimal'. Error en la Fila: 4
Query que indica las columnas utilizadas de la Tabla:
SELECT "Number", "Number (4 2)", "Redondeo -5 (3, 5)", "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Decimal"
{
"$id": "1",
"$type": "System.Data.Odbc.OdbcException, System.Data",
"Errors": {
"$type": "System.Data.Odbc.OdbcErrorCollection, System.Data",
"$values": [
{
"$id": "2",
"$type": "System.Data.Odbc.OdbcError, System.Data",
"Message": "[Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"SQLState": "HY000",
"NativeError": 1438,
"Source": "SQORA32.DLL"
}
]
},
"Source": "SQORA32.DLL",
"ErrorCode": -2146232009,
"Message": "ERROR [HY000] [Oracle][ODBC][Ora]ORA-01438: value larger than specified precision allowed for this column\n",
"Data": {
"$type": "System.Collections.ListDictionaryInternal, mscorlib"
},
"InnerException": null,
"HelpLink": null,
"HResult": -2146232009
}
Por último, tenga en cuenta que los mensajes en el "Panel Resultados" pueden ser diferentes de un proveedor de datos a otro, ya que cada proveedor de datos mapea los tipos de datos de la base de datos en tipos de datos diferentes de .NET. ¿Qué ocurre si el valor de Excel excede la precisión (no la escala)? Si el número total de dígitos excede la precisión de la columna (ej. DECIMAL(5,2) e intentas meter 1000.50), se generará un error de desbordamiento, ya que el redondeo solo afecta a los decimales, no a la magnitud del número.
Por ejemplo: NUMBER(4, 2) es mapeado como Single con el Managed Driver y como Decimal con OLE DB y ODBC. Y, como ya se ha mencionado, sólo el Managed Driver mapea determinados tipos a tipos de datos de tipo entero. Preguntas Frecuentes