none
Error de conversión de datos.

    Pregunta

  • Hola a todos:

    Tengo un problema en la conversión de datos siguiente:

     RetRatePI = Microsoft.VisualBasic.IRR(AccesoDatosFormulas.ValuesPI, AccesoDatosFormulas.Guess) * 100

    Los valores de IRR es una función que devuelve un tipo double.

    Las dos propiedades de AccesoDtosFormulas.ValuesPI y AccesoDatosFormulas.Guess son de tipo "decimal".

    El error que me da la marcada en negrita es: El valor de tipo 'decimal()' no se puede convertir en 'Double()' porque 'Decimal' no se deriva de 'Double'.

    He probado el 'Cdec' y no hace nada en esta ocasión.

    Un saludo a todos.

    Gemma

    viernes, 30 de septiembre de 2016 14:55

Respuestas

  • "gemma_campillo" escribió:

    > Los valores de IRR es una función que devuelve un tipo double.
    >
    > Las dos propiedades de AccesoDtosFormulas.ValuesPI y
    > AccesoDatosFormulas.Guess son de tipo "decimal".
    >
    > El error que me da la marcada en negrita es: El valor de tipo 'decimal()' no
    > se puede convertir en 'Double()' porque 'Decimal' no se deriva de 'Double'.
    >
    > He probado el 'Cdec' y no hace nada en esta ocasión.

    Normal que no haga nada, porque la función de conversión CDec es para utilizarla con valores individuales, no con matrices, aparte que el primer parámetro de la función Financial.IRR se encuentra definido como una MATRIZ de valores Double (ByRef ValueArray As Double()), y tú le estás queriendo pasar una matriz de valores Decimal, y esto pues va a ser que no.

    En este caso, necesitas pasarle sí o sí, una matriz de valores Double, por tanto, la propiedad compartida ValuesPi del módulo o clase llamado AccesoDatosFormulas tendrás que declararla como una matriz de valores Double:

     

    Module AccesoDatosFormulas Friend ValuesPi As Double()

    ' Friend ValuesPi As Decimal() --> NO ES VÁLIDO para la función Financial.IRR

    Friend Guess As Decimal End Module

    Podrías declararla como una matriz de valores Decimal, pero entonces tendrías que posteriormente crear una matriz de valores Double, convertir los elementos individuales de la matriz de Decimal a Double, y pasar ésta última matriz de Double a la función Financial.IRR:

            Dim length As Integer = AccesoDatosFormulas.ValuesPi.Length - 1
            Dim valores As Double() = New Double(length) {}
    
            For index As Integer = 0 To length
                valores(index) = AccesoDatosFormulas.ValuesPi(index)
            Next
    
            RetRatePI = Microsoft.VisualBasic.IRR(valores, AccesoDatosFormulas.Guess) * 100

    Cuando tengas éste tipo de problemas, no hay nada mejor como acudir a la propia ayuda del método en cuestión, para conocer los tipos de datos que esperan los parámetros del mismo:

    Financial.IRR (Método)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    viernes, 30 de septiembre de 2016 15:14
    Moderador
  • "gemma_campillo" escribió:

    > Ya he hecho con esta, todos los cambios de double a decimal en el programa, ...

    Quiero creer que tienes activada la instrucción Option Strict a nivel del proyecto, y que estás utilizando una función de conversión adecuada, como bien puede ser CDec, para pasar los valores de Double a Decimal, cosa que no es necesario utilizar ningún tipo de función de conversión para hacerlo al revés, de Decimal a Double, porque ésta última sería una conversión de ampliación que nunca fallará:

    Conversiones de ampliación y de restricción (Visual Basic)

    Lo bueno que tiene tener activada la instrucción Option Strict es que el compilador de Visual Basic no te va a permitir convertir de Double a Decimal (una conversión de restricción) hasta que no la efectúes de manera explícita mediante la correspondiente función de conversión, como puede ser CDec o CType. Obviamente, si el valor Double no se puede convertir a Decimal, indudablemente obtendrás la oportuna excepción en tiempo de ejecución, por mucho que hayas utilizado una función de conversión, aunque en éste caso estaríamos hablando de convertir unos valores Double que superan el máximo o mínimo de los valores permitidos para el tipo de dato System.Decimal, que espero no sea tu caso. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 30 de septiembre de 2016 15:58
    Moderador

Todas las respuestas

  • "gemma_campillo" escribió:

    > Los valores de IRR es una función que devuelve un tipo double.
    >
    > Las dos propiedades de AccesoDtosFormulas.ValuesPI y
    > AccesoDatosFormulas.Guess son de tipo "decimal".
    >
    > El error que me da la marcada en negrita es: El valor de tipo 'decimal()' no
    > se puede convertir en 'Double()' porque 'Decimal' no se deriva de 'Double'.
    >
    > He probado el 'Cdec' y no hace nada en esta ocasión.

    Normal que no haga nada, porque la función de conversión CDec es para utilizarla con valores individuales, no con matrices, aparte que el primer parámetro de la función Financial.IRR se encuentra definido como una MATRIZ de valores Double (ByRef ValueArray As Double()), y tú le estás queriendo pasar una matriz de valores Decimal, y esto pues va a ser que no.

    En este caso, necesitas pasarle sí o sí, una matriz de valores Double, por tanto, la propiedad compartida ValuesPi del módulo o clase llamado AccesoDatosFormulas tendrás que declararla como una matriz de valores Double:

     

    Module AccesoDatosFormulas Friend ValuesPi As Double()

    ' Friend ValuesPi As Decimal() --> NO ES VÁLIDO para la función Financial.IRR

    Friend Guess As Decimal End Module

    Podrías declararla como una matriz de valores Decimal, pero entonces tendrías que posteriormente crear una matriz de valores Double, convertir los elementos individuales de la matriz de Decimal a Double, y pasar ésta última matriz de Double a la función Financial.IRR:

            Dim length As Integer = AccesoDatosFormulas.ValuesPi.Length - 1
            Dim valores As Double() = New Double(length) {}
    
            For index As Integer = 0 To length
                valores(index) = AccesoDatosFormulas.ValuesPi(index)
            Next
    
            RetRatePI = Microsoft.VisualBasic.IRR(valores, AccesoDatosFormulas.Guess) * 100

    Cuando tengas éste tipo de problemas, no hay nada mejor como acudir a la propia ayuda del método en cuestión, para conocer los tipos de datos que esperan los parámetros del mismo:

    Financial.IRR (Método)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    viernes, 30 de septiembre de 2016 15:14
    Moderador
  • Hola maestro:

    Vale, ya no se me olvidará. No sabía atinar con la solución.

    Ya he hecho con esta, todos los cambios de double a decimal en el programa, ahora ya estoy cambiando las tablas en sqlcompact y después lo haré en sql server express, le pongo el campo como numérico (los que tenía como float) y le pongo una precisión de (18,2).

    Bueno Enrique como siempre tienes que solucionar tu el último problema. Muchas gracias querido amigo.

    Ya te informaré cuando lo tenga todo.

    Un fuerte abrazo como siempre.

    Gemma

    viernes, 30 de septiembre de 2016 15:34
  • "gemma_campillo" escribió:

    > Ya he hecho con esta, todos los cambios de double a decimal en el programa, ...

    Quiero creer que tienes activada la instrucción Option Strict a nivel del proyecto, y que estás utilizando una función de conversión adecuada, como bien puede ser CDec, para pasar los valores de Double a Decimal, cosa que no es necesario utilizar ningún tipo de función de conversión para hacerlo al revés, de Decimal a Double, porque ésta última sería una conversión de ampliación que nunca fallará:

    Conversiones de ampliación y de restricción (Visual Basic)

    Lo bueno que tiene tener activada la instrucción Option Strict es que el compilador de Visual Basic no te va a permitir convertir de Double a Decimal (una conversión de restricción) hasta que no la efectúes de manera explícita mediante la correspondiente función de conversión, como puede ser CDec o CType. Obviamente, si el valor Double no se puede convertir a Decimal, indudablemente obtendrás la oportuna excepción en tiempo de ejecución, por mucho que hayas utilizado una función de conversión, aunque en éste caso estaríamos hablando de convertir unos valores Double que superan el máximo o mínimo de los valores permitidos para el tipo de dato System.Decimal, que espero no sea tu caso. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 30 de septiembre de 2016 15:58
    Moderador
  • Hola Enrique:

    Si, desde el primer día que empecé a trabajar y estudiar el vb.net 2013, y cuando empecé con tu inestimable ayuda, lo  primero que hice fue poner la Option Strict en ON.

    Por eso no me ha dado casi ningún problema, las conversiones de Cdbl a Cdec, por lo que he quedado sorprendida que fuera tan "sencillo" para entendernos. Y había miles de conversiones de double a decimal y de Cdbl a Cdec, exceptuando la de la pregunta que no había atinado a resolver.

    Por ello, lo hago como tu me indicas. así lo tengo todo. A fuerza de machacarme con tus lecciones, "algo" he aprendido querido maestro.

    Bueno, sigo con la base de datos que ya he cogido un truquillo para ir más rápida.

    Un fuerte abrazo.

    Gemma

    viernes, 30 de septiembre de 2016 16:25