none
Error en lista al convertir tipo varchar a float

    Pregunta

  • Hola a todos.

    Tengo una error al procesar una listas genéricas en sqlserver express. Me indica en el catch: "Error al convertir el tipo de datos varchar a float." y no acabo de entender por qué me sale ese error si cuando declaro las propiedades de los campos en la clase las declaro como "double" tal como se ve en el código y los campos de la tabla también son el mismo tipo.

    He de aclarar que dichas listas en access funcionan correctamente, por lo que no veo que problema puede haber.

    El código de la clase:

    Public Class ActualizarTablaVarios_AnalEstadosFinancieros
    
        Private m_ejer1 As Double
        Private m_ejer2 As Double
        Private m_ejer3 As Double
        Private m_ejer4 As Double
        Private m_ejer5 As Double
        Private m_ejer6 As Double
        Private m_ejer7 As Double
        Private m_ejer8 As Double
        Private m_ejer9 As Double
        Private m_ejer10 As Double
        Private m_ejer11 As Double
        Private m_ejer12 As Double
        Private m_empresa As String
        Private m_orden As String
    
    
    
        Public Sub New(ejer1 As Double, ejer2 As Double, ejer3 As Double, ejer4 As Double, ejer5 As Double, ejer6 As Double, ejer7 As Double, ejer8 As Double, ejer9 As Double, ejer10 As Double, ejer11 As Double, ejer12 As Double, empresa As String, orden As String)
    
            m_ejer1 = ejer1
            m_ejer2 = ejer2
            m_ejer3 = ejer3
            m_ejer4 = ejer4
            m_ejer5 = ejer5
            m_ejer6 = ejer6
            m_ejer7 = ejer7
            m_ejer8 = ejer8
            m_ejer9 = ejer9
            m_ejer10 = ejer10
            m_ejer11 = ejer11
            m_ejer12 = ejer12
            m_empresa = empresa
            m_orden = orden
    
        End Sub
    
        Public ReadOnly Property ejer1 As Double
            Get
                Return m_ejer1
            End Get
        End Property
    
        Public ReadOnly Property ejer2 As Double
            Get
                Return m_ejer2
            End Get
        End Property
    
        Public ReadOnly Property ejer3 As Double
            Get
                Return m_ejer3
            End Get
        End Property
    
        Public ReadOnly Property ejer4 As Double
            Get
                Return m_ejer4
            End Get
        End Property
    
        Public ReadOnly Property ejer5 As Double
            Get
                Return m_ejer5
            End Get
        End Property
    
        Public ReadOnly Property ejer6 As Double
            Get
                Return m_ejer6
            End Get
        End Property
    
        Public ReadOnly Property ejer7 As Double
            Get
                Return m_ejer7
            End Get
        End Property
    
        Public ReadOnly Property ejer8 As Double
            Get
                Return m_ejer8
            End Get
        End Property
    
        Public ReadOnly Property ejer9 As Double
            Get
                Return m_ejer9
            End Get
        End Property
    
        Public ReadOnly Property ejer10 As Double
            Get
                Return m_ejer10
            End Get
        End Property
    
        Public ReadOnly Property ejer11 As Double
            Get
                Return m_ejer11
            End Get
        End Property
    
        Public ReadOnly Property ejer12 As Double
            Get
                Return m_ejer12
            End Get
        End Property
    
        Public ReadOnly Property empresa As String
            Get
                Return m_empresa
            End Get
        End Property
    
        Public ReadOnly Property orden As String
            Get
                Return m_orden
            End Get
        End Property
    
    
        Public Function Update() As String
    
            ' Devolver una cadena con los valores de los campos encerrados entre comillas simples.
    
            Return String.Format("UPDATE Varios Set Ejer_01='{0}', Ejer_02='{1}', Ejer_03='{2}', Ejer_04='{3}', Ejer_05='{4}', Ejer_06='{5}', Ejer_07='{6}', Ejer_08='{7}', Ejer_09='{8}', Ejer_10='{9}', Ejer_11='{10}',Ejer_12='{11}' WHERE Cod_Empresa='{12}' AND Orden='{13}'",
                                m_ejer1, m_ejer2, m_ejer3, m_ejer4, m_ejer5, m_ejer6, m_ejer7, m_ejer8, m_ejer9, m_ejer10, m_ejer11, m_ejer12, m_empresa, m_orden)
    
        End Function
    End Class

    Y aquí el relleno de la lista con valores.

    Public Shared Sub AnalEstadosFinancieros_ActualizacionValoresTabla()
            Try
                Dim lst As New List(Of ActualizarTablaVarios_AnalEstadosFinancieros)
                Dim empresa As String = VarGlobal.StrCodEmpresa
    
    
                If VarGlobal.StrCodPais = "34" Then
                    If VarGlobal.StrPlanConta = "PLAN 2007" OrElse VarGlobal.StrPlanConta = "FISCAL" Then
    
                        lst.Add(New ActualizarTablaVarios_AnalEstadosFinancieros(CDbl(InmovilizadoTotal(0)), CDbl(InmovilizadoTotal(1)), CDbl(InmovilizadoTotal(2)), CDbl(InmovilizadoTotal(3)), CDbl(InmovilizadoTotal(4)), CDbl(InmovilizadoTotal(5)), CDbl(InmovilizadoTotal(6)), CDbl(InmovilizadoTotal(7)), CDbl(InmovilizadoTotal(8)), CDbl(InmovilizadoTotal(9)), CDbl(InmovilizadoTotal(10)), CDbl(InmovilizadoTotal(11)), empresa, "342"))
                        lst.Add(New ActualizarTablaVarios_AnalEstadosFinancieros(Realizable(0), Realizable(1), Realizable(2), Realizable(3), Realizable(4), Realizable(5), Realizable(6), Realizable(7), Realizable(8), Realizable(9), Realizable(10), Realizable(11), empresa, "344"))
    
    
     Using cnn As DbConnection = da.CreateConnection()
                    cnn.Open()
    
                    ' Creamos el Commando
                    Dim cmd As DbCommand = cnn.CreateCommand()
    
                    For Each item As ActualizarTablaVarios_AnalEstadosFinancieros In lst
    
                        cmd.CommandText = item.Update()
    
                        cmd.ExecuteNonQuery()
    
                    Next
                End Using
    
            Catch ex As Exception
                MessageBox.Show("Bloqueo en carga de Fórmula:     'ListasOF AnalEstadosFinanc.'" & vbCrLf & ex.Message & vbCrLf &
                       "Acepte para continuar.", "FINANCIAL SYSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error)
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Incluso en el relleno de la lista he forzado el tipo de dato en la primera línea con "Cdbl", pero nada, continúa tirando el error, eso lo he probado con una sola línea, si bien he añadido una segunda que es como tengo la lista desarrollada.

    A ver si alguien me puede indicar por qué no funciona o que puedo tener mal.

    Un saludo.

    Gemma


    • Editado gemma_campillo miércoles, 28 de septiembre de 2016 11:22 Sintaxis
    miércoles, 28 de septiembre de 2016 11:20

Respuestas

  • gemma_campillo,

    No, la solución no pasa por cambiar el tipo de dato de float a decimal, sólo fue una observación que te hice sobre lo que ya tienes implementando.

    Independiente del tipo elegido (float o decimal) el separador decimal es el punto, comportamiento muy distinto con el tipo money que si toma el separador decimal según la configuración regional del equipo lo mismo que MS-Access, de ahí que es muy importante que los valores de consulta los agregues mediante la colección de parámetros (Parameters) y no "en duro" concatenando a la consulta sql. Además, nota que al usar la función Format() la resultante es una cadena de tipo string, con ello interesa poco que las propiedades las hayas definido con un tipo Double. 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo miércoles, 28 de septiembre de 2016 17:06
    miércoles, 28 de septiembre de 2016 16:38

Todas las respuestas

  • gemma_campillo,

    ¿Los resultados de los ejercicios contables requieren un tipo de dato aproximado como float? Creo que debiste optar por un tipo exacto como decimal.

    Los tipo de datos numéricos que permiten una parte decimal tienen como separador (de la parte entera y decimal) el caracter de punto '.', ¿será que tu aplicación envía la coma ',' como separador decimal?, de ser así el error que obtienes es de esperar.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 28 de septiembre de 2016 15:03
  • Hola Williams:

    De acuerdo con lo que indicas, pero por qué en Access no pasa nada de eso. Tiene que ser alguna cosa más rara y ahora a ver como soluciono esta historia si tengo que cambiar todos los campos double a decimal. Voy a probar con una tabla pequeña a ver que pasa.

    Te digo alguna cosa.

    Un saludo.

    Gemma

    miércoles, 28 de septiembre de 2016 15:19
  • gemma_campillo,

    No, la solución no pasa por cambiar el tipo de dato de float a decimal, sólo fue una observación que te hice sobre lo que ya tienes implementando.

    Independiente del tipo elegido (float o decimal) el separador decimal es el punto, comportamiento muy distinto con el tipo money que si toma el separador decimal según la configuración regional del equipo lo mismo que MS-Access, de ahí que es muy importante que los valores de consulta los agregues mediante la colección de parámetros (Parameters) y no "en duro" concatenando a la consulta sql. Además, nota que al usar la función Format() la resultante es una cadena de tipo string, con ello interesa poco que las propiedades las hayas definido con un tipo Double. 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo miércoles, 28 de septiembre de 2016 17:06
    miércoles, 28 de septiembre de 2016 16:38
  • Hola Williams:

    Pues en lo que me indicas tengo el error, yo formateo de la siguiente manera:

    FormatNumber(variable,2) y no he tenido problemas, pero ahora, en sqlcompact y sql server me está dando muchos problemas.

    Creo que es correcto el formato que he puesto, pero está claro que en algún sitio se escapa el tema.

    Bueno, muchas gracias y si ves algo incorrecto por favor te ruego me lo comentes.

    Un abrazo.

    Gemma

    miércoles, 28 de septiembre de 2016 17:06