Redondeo Entero
Este CheckBox aparece en aquellas columnas de la base de datos que tienen un tipo de datos entero. Marcando esta opción, los datos de tipo numérico con decimales serán redondeados a un entero durante la fase de lectura de los datos.
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.
Cuando se intenta cargar un número no entero en un campo de tipo entero y esta opción no está marcada ni marcada la opción Sin Errores de Conversión se produce un error de conversión. Ello es debido a que el dato no puede convertirse al tipo de datos deseado, y por tanto se intenta cargar el contenido de la celda como una cadena de caracteres.
El mensaje que Excel To Database presenta será similar al siguiente:
Celda: A3, Valor: 2.1, Tabla: Tabla Redondeo Enteros, Columna: Byte
El contenido de la Celda no ha podido convertirse al tipo de datos Byte
Celda: A3, Valor: 2.1, Tabla: Tabla Redondeo Enteros, Columna: Byte
La cadena de entrada no tiene el formato correcto.No se puede almacenar "2.1" en la columna Byte. El tipo esperado es Byte.
En estos casos se produce una excepción que hace que no se inicie la fase de carga de datos. La solución para este problema es marcar la opción Sin Errores de Conversión.
El software, también actúa como un filtro inteligente: si el redondeo excede la capacidad física del tipo de dato (ej. campo de tipo Byte: redondear 255.5 produce una salida de 256, que excede la capacidad del campo), se genera una advertencia controlada. Recomendamos usar la opción Sin Errores de Conversión para gestionar estos casos mediante nulos o valores por defecto.
MS Access: Redondeo Entero
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 CreaTablaRedondeoEnteros()
On Error Resume Next
CurrentProject.Connection.Execute "DROP TABLE [Tabla Redondeo Enteros]"
On Error GoTo Sub_Err
CurrentProject.Connection.Execute "CREATE TABLE [Tabla Redondeo Enteros](" & _
"[Id] COUNTER NOT NULL, " & _
"[Proveedor Datos] TEXT (255) NOT NULL, " & _
"[Driver] TEXT (255) NOT NULL, " & _
"[Byte] BYTE, " & _
"[Entero] SHORT, " & _
"[Entero Largo] LONG " & _
")"
Dim db As Object, tbl As Object, fld As Object
Set db = CurrentDb
db.TableDefs.Refresh
Set tbl = db.TableDefs("Tabla Redondeo Enteros")
tbl.Fields.Refresh
Set fld = tbl.Fields("Proveedor Datos")
fld.AllowZeroLength = False
fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True)
Set fld = tbl.Fields("Driver")
fld.AllowZeroLength = False
fld.Properties.Append fld.CreateProperty("UnicodeCompression", 1, True)
Set fld = tbl.Fields("Byte")
fld.Properties.Append fld.CreateProperty("Description", 10, "1 Bytes")
Set fld = tbl.Fields("Entero")
fld.Properties.Append fld.CreateProperty("Description", 10, "Entre -32.768 y 32.767 - 2 Bytes")
Set fld = tbl.Fields("Entero Largo")
fld.Properties.Append fld.CreateProperty("Description", 10, "Entre -2.147.483.648 y 2.147.483.647 - 4 Bytes")
CurrentProject.Connection.Execute "CREATE UNIQUE INDEX PrimaryKey ON [Tabla Redondeo Enteros] (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 'CreaTablaRedondeoEnteros'." & vbNewLine & vbNewLine & vbTab & Err.Description, , "Error Nº: " & Err.Number
Resume Sub_Exit
Resume
End Sub
MS Access: Hoja Excel para Redondeo Entero
Los mensajes mostrados por Excel To Database al intentar cargar la Hoja son los siguientes (opciónes "Redondeo Entero" marcada y "Sin Errores de Conversión" no marcada):
Celda: A3, Valor: 2.1, Tabla: Tabla Redondeo Enteros, Columna: Byte
Opción "Redondeo Entero" marcada. Valor Redondeado: 2
Celda: B3, Valor: 2.49, Tabla: Tabla Redondeo Enteros, Columna: Entero
Opción "Redondeo Entero" marcada. Valor Redondeado: 2
Celda: C3, Valor: 2.5, Tabla: Tabla Redondeo Enteros, Columna: Entero Largo
Opción "Redondeo Entero" marcada. Valor Redondeado: 3
Celda: A4, Valor: 2.4599999999995100, Tabla: Tabla Redondeo Enteros, Columna: Byte
Opción "Redondeo Entero" marcada. Valor Redondeado: 2
Celda: B4, Valor: 2.5, Tabla: Tabla Redondeo Enteros, Columna: Entero
Opción "Redondeo Entero" marcada. Valor Redondeado: 3
Celda: C4, Valor: 2.5, Tabla: Tabla Redondeo Enteros, Columna: Entero Largo
Opción "Redondeo Entero" marcada. Valor Redondeado: 3
Celda: A6, Valor: 255.5, Tabla: Tabla Redondeo Enteros, Columna: Byte
El contenido de la Celda no ha podido convertirse al tipo de datos Byte
Celda: A6, Valor: 255.5, Tabla: Tabla Redondeo Enteros, Columna: Byte
La cadena de entrada no tiene el formato correcto.No se puede almacenar '255.5' en la columna Byte. El tipo esperado es Byte.
Celda: B6, Valor: 32767.5, Tabla: Tabla Redondeo Enteros, Columna: Entero
El contenido de la Celda no ha podido convertirse al tipo de datos Int16
Celda: B6, Valor: 32767.5, Tabla: Tabla Redondeo Enteros, Columna: Entero
La cadena de entrada no tiene el formato correcto.No se puede almacenar '32767.5' en la columna Entero. El tipo esperado es Int16.
Celda: C6, Valor: 2147483647.5, Tabla: Tabla Redondeo Enteros, Columna: Entero Largo
El contenido de la Celda no ha podido convertirse al tipo de datos Int32
Celda: C6, Valor: 2147483647.5, Tabla: Tabla Redondeo Enteros, Columna: Entero Largo
La cadena de entrada no tiene el formato correcto.No se puede almacenar '2147483647.5' en la columna Entero Largo. El tipo esperado es Int32.
Obsérvese que 2.49 es redondeado a 2, mientras que 2.5 es redondeado a 3. También se pueden observar los errores de conversión de tipo de datos cuando el redondeo hace que se desborde la capacidad del campo.
La fase de carga de datos no llega a lanzarse debido a los datos que superan la capacidad del campo. Marcando la opción "Sin errores de conversión" estos datos serán sustituidos por NULL o el valor por defecto y se procederá con la fase de carga de datos.
Excel To Database considera que son tipos de datos enteros los siguientes: Byte, Entero y Entero Largo.
SQL Server: Redondeo Entero
Excel To Database considera que son tipos de datos enteros los siguientes: Tinyint, Int y Bigint. Aunque a los tipos de datos Decimal/Numeric se les indique que la escala es de 0 dígitos, no son considerados como números enteros. Para ellos se le habrá de aplicar la opción "Redondeo Decimal" descrita en el siguiente apartado. Tampoco se considera como entero el tipo de datos Bit.
El comportamiento de Excel To Database con SQL Server para esta opción es el mismo que el descrito para MS Access.
Para mostrar el comportamiento de esta opción con SQL Server se utiliza la tabla descrita a continuación y el Libro Excel del apartado anterior. Del Libro Excel se utilizará la Hoja mostrada en la figura siguiente:
DROP TABLE IF EXISTS [dbo].[Tabla Redondeo Enteros];
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Tabla Redondeo Enteros](
[Bit] [bit] NULL,
[Tinyint] [tinyint] NULL,
[Int] [int] NULL,
[BigInt] [bigint] 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 Enteros
Oracle: Redondeo Entero
Para mostrar el comportamiento de esta opción con Oracle se utiliza la siguiente tabla.
CREATE TABLE "Tabla Redondeo Enteros" (
Id NUMBER(6) GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
Provider VARCHAR2(10 CHAR),
Driver VARCHAR2(50 CHAR),
"Int 2" NUMBER(2),
"Redondeo 100 (5, -2)" NUMBER(5, -2)
);
El Libro a utilizar es el Libro del apartado anterior, el cual contiene la Hoja de la figura siguiente:
Oracle: Hoja Excel para Redondeo Entero
En primer lugar, indicar que sólo con el Managed Driver se detectan campos con tipos de datos entero. Con los drivers Oracle® Provider for OLE DB y Oracle ODBC Driver el tipo de datos detectado es decimal. Así, esta opción sólo aparecerá con el Managed Driver.
-
Bugs en Managed Driver (Bulk Copy) (CheckBox "Usar Arrays" no marcada)
Volver a resaltar que con el Managed Driver y 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, si no se realizan las comprobaciones que hace Excel To Database se obtendría la siguiente carga:Oracle: Error Carga Redondeo Entero
Como se puede apreciar, existen registros para el campo "Int 2" que superan ampliamente la restricción de no superar los 2 dígitos. Esto puede hacer que la tabla se quede en un estado inconsistente y, por ejemplo, que la instrucción 'SELECT * FROM "Tabla Redondeo Enteros" 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:
Celda: A7, Valor: 99.6, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 100 Celda: A7, Valor: 100, Tabla: Tabla Redondeo Enteros, Columna: Int 2, Precisión: 2 El Nº de dígitos '3' supera los permitidos '2' 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. -
Comportamiento de la opción "Redondeo Entero"
Cuando esta opción no se encuentra marcada, la Fase de Carga de Datos se inicia. Así, cuando un dato no ha podido convertirse al tipo de datos deseado se intenta cargar la cadena de texto almacenada en la celda de la Hoja. Lo mas probable es que se produzca un error de conversión de tipo de datos y se detenga dicha Fase de Carga de Datos.
Los mensajes que se muestran para los proveedores de datos OLE DB y ODBC son totalmente distintos a los del Managed Driver, ya que estos proveedores no detectan que los campos almacenan datos de tipo entero, sino "decimal" con precisión y escala. Sin embargo, se muestran dichos mensajes para compararlos con el Managed Driver que si los detecta.Celda: B2, Valor: 12345, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, Escala: -2 Nº de ceros significativos a la izquierda del separador decimal 5 es inferior Abs(Escala) 2 Es posible que el Proveedor de Datos o la Base de Datos redondee el dato. Celda: A3, Valor: 2.49, Tabla: Tabla Redondeo Enteros, Columna: Int 2 El contenido de la Celda no ha podido convertirse al tipo de datos Int16 Celda: B3, Valor: 123456, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, Escala: -2 Nº de ceros significativos a la izquierda del separador decimal 6 es inferior Abs(Escala) 2 Es posible que el Proveedor de Datos o la Base de Datos redondee el dato. Celda: A4, Valor: 2.5, Tabla: Tabla Redondeo Enteros, Columna: Int 2 El contenido de la Celda no ha podido convertirse al tipo de datos Int16 Celda: B4, Valor: 1234567, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, Escala: -2 Nº de ceros significativos a la izquierda del separador decimal 7 es inferior Abs(Escala) 2 Es posible que el Proveedor de Datos o la Base de Datos redondee el dato. Celda: A5, Valor: 100, Tabla: Tabla Redondeo Enteros, Columna: Int 2, Precisión: 2 El Nº de dígitos '3' supera los permitidos '2' Celda: B5, Valor: 12345678, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, Escala: -2 Nº de ceros significativos a la izquierda del separador decimal 8 es inferior Abs(Escala) 2 Es posible que el Proveedor de Datos o la Base de Datos redondee el dato. Celda: A6, Valor: 99.1, Tabla: Tabla Redondeo Enteros, Columna: Int 2 El contenido de la Celda no ha podido convertirse al tipo de datos Int16 Celda: B6, Valor: 49.5, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100 El contenido de la Celda no ha podido convertirse al tipo de datos Int64 Celda: A7, Valor: 99.6, Tabla: Tabla Redondeo Enteros, Columna: Int 2 El contenido de la Celda no ha podido convertirse al tipo de datos Int16 Celda: B7, Valor: 49.4, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100 El contenido de la Celda no ha podido convertirse al tipo de datos Int64 .NET Connections (Managed Driver (Array Binding) (CheckBox "Usar Arrays" marcado)) Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Enteros'. Comando Insert: insert into "Tabla Redondeo Enteros" ("Redondeo 100", "Int 2", "DRIVER", "PROVIDER") values(:0, :1, :2, :3) { "$id": "1", "$type": "System.FormatException, mscorlib", "Message": "La cadena de entrada no tiene el formato correcto.", "Data": { "$type": "System.Collections.ListDictionaryInternal, mscorlib" }, "InnerException": null, "HelpLink": null, "Source": "mscorlib", "HResult": -2146233033 } Conexiones OLE DB (Oracle® Provider for OLE DB) Fila: 4 Comando: INSERT INTO "Tabla Redondeo Enteros" ("Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?) Comando Select: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" 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: Redondeo 100 Valor: 12345678 Columna: Int 2 Valor: 100 Columna: DRIVER Valor: OraOLEDB.Oracle Columna: PROVIDER Valor: OLE DB Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Enteros'. Error en la Fila: 4 Query que indica las columnas utilizadas de la Tabla: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" { "$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 } Nº Filas insertadas: 0 Conexiones ODBC (Oracle ODBC Driver) Fila: 4 Comando: INSERT INTO "Tabla Redondeo Enteros" ("Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?) Comando Select: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" 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: Redondeo 100 Valor: 12345678 Columna: Int 2 Valor: 100 Columna: DRIVER Valor: {Oracle en OraDB21Home1} Columna: PROVIDER Valor: ODBC Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Enteros'. Error en la Fila: 4 Query que indica las columnas utilizadas de la Tabla: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" { "$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 } Nº Filas insertadas: 0Cuando se marca la opción "Redondeo Entero", el redondeo puede hacer que se supere la capacidad del campo y por tanto se produzca el típico error de desbordamiento de la capacidad del campo. Los mensajes que aparecen en los ficheros de .log serán similares a los siguientes.
Los mensajes para los proveedores OLE DB u ODBC son similares a los anteriores con la salvedad de que ahora se han redondeado los datos.Celda: B2, Valor: 12345, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 12300 Celda: A3, Valor: 2.49, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 2 Celda: B3, Valor: 123456, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 123500 Celda: A4, Valor: 2.5, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 3 Celda: B4, Valor: 1234567, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 1234600 Celda: A5, Valor: 100, Tabla: Tabla Redondeo Enteros, Columna: Int 2, Precisión: 2 El Nº de dígitos '3' supera los permitidos '2' Celda: B5, Valor: 12345678, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 12345700 Celda: A6, Valor: 99.1, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 99 Celda: B6, Valor: 49.5, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: A7, Valor: 99.6, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 100 Celda: A7, Valor: 100, Tabla: Tabla Redondeo Enteros, Columna: Int 2, Precisión: 2 El Nº de dígitos '3' supera los permitidos '2' Celda: B7, Valor: 49.4, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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 .NET Connections (Managed Driver (Array Binding) (CheckBox "Usar Arrays" marcado)) Opción "Redondeo Entero" marcada Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Enteros'. Comando Insert: insert into "Tabla Redondeo Enteros" ("Redondeo 100", "Int 2", "DRIVER", "PROVIDER") values(:0, :1, :2, :3) { "$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": 97, "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 } ] }, "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/", "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: Redondeo 100: 12345700 Int 2: 100 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: Redondeo 100: 0 Int 2: 100 DRIVER: Managed Driver (Arrays) PROVIDER: .NET Conexiones OLE DB (Oracle® Provider for OLE DB) Opción "Redondeo Entero" marcada Fila: 4 Comando: INSERT INTO "Tabla Redondeo Enteros" ("Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?) Comando Select: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" 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: Redondeo 100 Valor: 12345700 Columna: Int 2 Valor: 100 Columna: DRIVER Valor: OraOLEDB.Oracle Columna: PROVIDER Valor: OLE DB Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Enteros'. Error en la Fila: 4 Query que indica las columnas utilizadas de la Tabla: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" { "$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 Entero" marcada Fila: 4 Comando: INSERT INTO "Tabla Redondeo Enteros" ("Redondeo 100", "Int 2", "DRIVER", "PROVIDER") VALUES (?, ?, ?, ?) Comando Select: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" 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: Redondeo 100 Valor: 12345700 Columna: Int 2 Valor: 100 Columna: DRIVER Valor: {Oracle en OraDB21Home1} Columna: PROVIDER Valor: ODBC Se ha producido una excepción al intentar cargar la Tabla 'Tabla Redondeo Enteros'. Error en la Fila: 4 Query que indica las columnas utilizadas de la Tabla: SELECT "Redondeo 100", "Int 2", "DRIVER", "PROVIDER" FROM "Tabla Redondeo Enteros" { "$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 "Sin Errores de Conversión", estos datos problemáticos serán sustituidos por NULL o el valor por defecto indicado en los Mapeos.
A continuación se muestra la salida en el Panel de Resultados cuando estas dos opciones se encuentran marcadas. Tenga en cuenta que Excel To Database redondea los datos con MidpointRounding.AwayFromZero. Ver MidpointRounding Enumeración.Celda: B2, Valor: 12345, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 12300 Celda: A3, Valor: 2.49, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 2 Celda: B3, Valor: 123456, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 123500 Celda: A4, Valor: 2.5, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 3 Celda: B4, Valor: 1234567, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 1234600 Celda: A5, Valor: 100, Tabla: Tabla Redondeo Enteros, Columna: Int 2, Precisión: 2 El Nº de dígitos '3' supera los permitidos '2' Se intentará cargar la celda como NULL (o el valor por defecto). Opción "Sin Errores de Conversión" marcada. Celda: B5, Valor: 12345678, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: 12345700 Celda: A6, Valor: 99.1, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 99 Celda: B6, Valor: 49.5, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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: A7, Valor: 99.6, Tabla: Tabla Redondeo Enteros, Columna: Int 2 Opción "Redondeo Entero" marcada. Valor Redondeado: 100 Celda: A7, Valor: 100, Tabla: Tabla Redondeo Enteros, Columna: Int 2, Precisión: 2 El Nº de dígitos '3' supera los permitidos '2' Se intentará cargar la celda como NULL (o el valor por defecto). Opción "Sin Errores de Conversión" marcada. Celda: B7, Valor: 49.4, Tabla: Tabla Redondeo Enteros, Columna: Redondeo 100, Precisión: 10, 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
Preguntas Frecuentes
¿Qué algoritmo de redondeo utiliza la aplicación?
Utiliza AwayFromZero, donde los valores intermedios (.5) siempre redondean hacia el número superior más alejado del cero.
¿Por qué recibo un error de formato al cargar decimales en enteros?
Porque la base de datos no puede convertir "2.1" directamente a un entero. Debes marcar la opción Redondeo Entero para que el software realice la conversión antes de la carga.