none
Como cambiar las "," de las variables double para poder guardarlas en una base de datos RRS feed

  • Pregunta

  • El punto es que, busque y busque! y he probado desd convertir a string la variable double, he probado con hacer un Replace, he probado un monton de cosas y cuando quiero guardar la variable no me deja y tampoco se como cambiar las comas de los decimales y q aparezca un punto... Gracias por leer mi pregunta
    miércoles, 6 de marzo de 2019 3:39

Respuestas

  • Hola:
    Prueba con esto

    Public Sub guardar_venta()
    Try
        Dim lsQuery As String="INSERT INTO Ventas(ID_cliente, metodo_pago, fecha, total, efectivo, cambio) Values (@ID_cliente, @metodo_pago, @fecha, @total, @efectivo, @cambio)"
        Using loConexion As New OleDbConnection(TU_CADENA_DE_CONEXION)
            Dim cliente As Integer
            Dim metodopago As String
            Dim fecha As String = frmventas.DateTimePicker3.Text
            Dim efectivo, cambio As Double
            If frmcobrar.RadioButton1.Checked = True Then
                cliente = 1
                metodopago = "Contado"
                efectivo = CDbl(frmcobrar.TextBox1.Text)
                cambio = CDbl(frmcobrar.Label5.Text)
            Else
                cliente = frmcobrar.ComboBox1.SelectedIndex + 2
                metodopago = "Cuenta Corriente"
                efectivo = 0
                cambio = 0
            End If
            ' crear comando
            Using loComando As New OleDbCommand(lsQuery, loConexion)
                loComando.Parameters.Add(New OleDbParameter("@ID_cliente", cliente))
                loComando.Parameters.Add(New OleDbParameter("@metodo_pago", metodopago))
                loComando.Parameters.Add(New OleDbParameter("@fecha", CDate(fecha)))
                loComando.Parameters.Add(New OleDbParameter("@total", CDbl(frmventas.Label7.Text)))
                loComando.Parameters.Add(New OleDbParameter("@efectivo", efectivo))
                loComando.Parameters.Add(New OleDbParameter("@cambio", cambio))
                loConexion.Open()
                comando.ExecuteNonQuery()
            End Using
       End Using
    Catch Exp As Exception
       MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Try
    End Sub

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta Ultimatux miércoles, 6 de marzo de 2019 20:33
    miércoles, 6 de marzo de 2019 15:59

Todas las respuestas

  • Hola:

    ¿Puedes poner el codigo de como estas guardando en la base de datos?
    Referencia: Intenta usar parametros para las Altas, Bajas y Modificaciones

    Un saludo desde Bilbo
    Carlos


    miércoles, 6 de marzo de 2019 7:05
  • Hola, un campo de tipo numerico en bbdd no tiene comillas. Para qué hacer esa conversión ? No hace falta. Necesitas declarar un parámetro en tu consulta y asignarle directo tu double. Ejemplo

    Private Shared Sub Insertar(ByVal miValorNumerico As Double, connectionString As String)
        Dim commandText As String = "INSERT MiTabla(Campo1Numerico) VALUES(@MiParametroNumerico) ;"
    
        Using connection As SqlConnection = New SqlConnection(connectionString)
            Dim command As SqlCommand = New SqlCommand(commandText, connection)
            command.Parameters.AddWithValue("@MiParametroNumerico", miValorNumerico)
    
            Try
                connection.Open()
                Dim rowsAffected As Int32 = command.ExecuteNonQuery()
                Console.WriteLine("RowsAffected: {0}", rowsAffected)
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End Using
    End Sub


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 6 de marzo de 2019 7:26
  • Hola:

    ¿Puedes poner el codigo de como estas guardando en la base de datos?
    Referencia: Intenta usar parametros para las Altas, Bajas y Modificaciones

    Un saludo desde Bilbo
    Carlos


    Buenas, sis mil disculpas ahi paso parte del codigo y comento que este insert que hago lo probe con variables directas tipeadas "& total &" (que ya he leido que no es lo recomendable) y tambien he úsado por parametros como bien figura en el codigo y no hay caso de poder hacer un INSERT con un variable double con decimales por lo antes dicho del problema del regionalismo y la coma..

    Public Sub guardar_venta()
            conexion.Open()
    
            Dim cliente As Integer
            Dim metodopago As String
            Dim fecha As String = frmventas.DateTimePicker3.Text
            'Dim total As Double = frmventas.Label5.Text - frmventas.Label6.Text
            Dim efectivo, cambio As Double
            If frmcobrar.RadioButton1.Checked = True Then
                cliente = 1
                metodopago = "Contado"
                efectivo = frmcobrar.TextBox1.Text
                cambio = frmcobrar.Label5.Text
            Else
                cliente = frmcobrar.ComboBox1.SelectedIndex + 2
                metodopago = "Cuenta Corriente"
                efectivo = 0
                cambio = 0
            End If
    
    
            Dim comando As New OleDbCommand("INSERT INTO Ventas(ID_cliente,metodo_pago,fecha,total,efectivo,cambio)" & Chr(13) &
                                           "VALUES(" & cliente & ",'" & metodopago & "','" & fecha & "',@total," & efectivo & "," & cambio & ")", conexion)
    
            comando.Parameters.AddWithValue("@total", frmventas.Label7.Text)
            comando.ExecuteNonQuery()

    miércoles, 6 de marzo de 2019 15:36
  • Hola, un campo de tipo numerico en bbdd no tiene comillas. Para qué hacer esa conversión ? No hace falta. Necesitas declarar un parámetro en tu consulta y asignarle directo tu double. Ejemplo

    Private Shared Sub Insertar(ByVal miValorNumerico As Double, connectionString As String)
        Dim commandText As String = "INSERT MiTabla(Campo1Numerico) VALUES(@MiParametroNumerico) ;"
    
        Using connection As SqlConnection = New SqlConnection(connectionString)
            Dim command As SqlCommand = New SqlCommand(commandText, connection)
            command.Parameters.AddWithValue("@MiParametroNumerico", miValorNumerico)
    
            Try
                connection.Open()
                Dim rowsAffected As Int32 = command.ExecuteNonQuery()
                Console.WriteLine("RowsAffected: {0}", rowsAffected)
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End Using
    End Sub


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    Buenas Sergio , gracias por responder, t aclaro que mi pregunta se referia a la coma no a las comillas, en otras palabras seria hacer un INSERT  de una variable double con valores decimales y como bien se sabe el regionalismo lo que hace es que los decimales que generamos lo divide por coma y la base de datos solo acepta decimales con puntos  y he aqui mi problema , como bien respondi a carlos he probado guardar de la manera no recomendada "& total &" y por parametros @total , pero en ningun caso se logra hacer un INSERT con decimales por el problema de las comas

    miércoles, 6 de marzo de 2019 15:41
  • Hola, un campo numérico en SQL no depende de la configuración regional (si en la visualización de los datos) 

    Para insertar te corrijo tu código para que veas lo sencillo que es, esto te vale tmbién para fechas. Con AddWithValue(nombreparametro, valor) ese parámetro valor es un object.

    Public Sub guardar_venta()
            conexion.Open()
    
            Dim cliente As Integer
            Dim metodopago As String
            Dim fecha As DateTime = frmventas.DateTimePicker3.Value ' LO CAMBIO A VALUE PARA RECUPERAR EL DATETIME
            'Dim total As Double = frmventas.Label5.Text - frmventas.Label6.Text
            Dim efectivo, cambio As Double
            If frmcobrar.RadioButton1.Checked = True Then
                cliente = 1
                metodopago = "Contado"
                efectivo = frmcobrar.TextBox1.Text
                cambio = frmcobrar.Label5.Text
            Else
                cliente = frmcobrar.ComboBox1.SelectedIndex + 2
                metodopago = "Cuenta Corriente"
                efectivo = 0
                cambio = 0
            End If
    
    
            Dim comando As New OleDbCommand("INSERT INTO Ventas(ID_cliente,metodo_pago,fecha,total,efectivo,cambio)" & Chr(13) &
                                           "VALUES(@cliente, @metodopago, @fecha, @total, @efectivo, @cambio)", conexion)    ' APLICAMOS CONSULTA PARAMETRIZADA (ESTO DEBE SER OBLIGATORIO HACERLO ASI POR SER BUENA PRACTICA)
    
    	    comando.Parameters.AddWithValue("@client", cliente)
    	    comando.Parameters.AddWithValue("@metodopago", metodopago)
    		comando.Parameters.AddWithValue("@fecha", fecha) ' ENTIENDO QUE EL CAMPO FECHA ES DE TIPO DATETIME EN TU BBDD	
    	
            comando.Parameters.AddWithValue("@total", Convert.ToDouble(frmventas.Label7.Text)) 'CONVERTIR  DOUBLE. OJO que puede dar error de conversión si no se puede convertir la cadena a double
    		comando.Parameters.AddWithValue("@efectivo", efectivo) 		
    	    comando.Parameters.AddWithValue("@cambio", cambio) 			
            comando.ExecuteNonQuery()


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 6 de marzo de 2019 15:54
  • Hola:
    Prueba con esto

    Public Sub guardar_venta()
    Try
        Dim lsQuery As String="INSERT INTO Ventas(ID_cliente, metodo_pago, fecha, total, efectivo, cambio) Values (@ID_cliente, @metodo_pago, @fecha, @total, @efectivo, @cambio)"
        Using loConexion As New OleDbConnection(TU_CADENA_DE_CONEXION)
            Dim cliente As Integer
            Dim metodopago As String
            Dim fecha As String = frmventas.DateTimePicker3.Text
            Dim efectivo, cambio As Double
            If frmcobrar.RadioButton1.Checked = True Then
                cliente = 1
                metodopago = "Contado"
                efectivo = CDbl(frmcobrar.TextBox1.Text)
                cambio = CDbl(frmcobrar.Label5.Text)
            Else
                cliente = frmcobrar.ComboBox1.SelectedIndex + 2
                metodopago = "Cuenta Corriente"
                efectivo = 0
                cambio = 0
            End If
            ' crear comando
            Using loComando As New OleDbCommand(lsQuery, loConexion)
                loComando.Parameters.Add(New OleDbParameter("@ID_cliente", cliente))
                loComando.Parameters.Add(New OleDbParameter("@metodo_pago", metodopago))
                loComando.Parameters.Add(New OleDbParameter("@fecha", CDate(fecha)))
                loComando.Parameters.Add(New OleDbParameter("@total", CDbl(frmventas.Label7.Text)))
                loComando.Parameters.Add(New OleDbParameter("@efectivo", efectivo))
                loComando.Parameters.Add(New OleDbParameter("@cambio", cambio))
                loConexion.Open()
                comando.ExecuteNonQuery()
            End Using
       End Using
    Catch Exp As Exception
       MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Try
    End Sub

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta Ultimatux miércoles, 6 de marzo de 2019 20:33
    miércoles, 6 de marzo de 2019 15:59
  • Hola, un campo numérico en SQL no depende de la configuración regional (si en la visualización de los datos) 

    Para insertar te corrijo tu código para que veas lo sencillo que es, esto te vale tmbién para fechas. Con AddWithValue(nombreparametro, valor) ese parámetro valor es un object.

    Public Sub guardar_venta()
            conexion.Open()
    
            Dim cliente As Integer
            Dim metodopago As String
            Dim fecha As DateTime = frmventas.DateTimePicker3.Value ' LO CAMBIO A VALUE PARA RECUPERAR EL DATETIME
            'Dim total As Double = frmventas.Label5.Text - frmventas.Label6.Text
            Dim efectivo, cambio As Double
            If frmcobrar.RadioButton1.Checked = True Then
                cliente = 1
                metodopago = "Contado"
                efectivo = frmcobrar.TextBox1.Text
                cambio = frmcobrar.Label5.Text
            Else
                cliente = frmcobrar.ComboBox1.SelectedIndex + 2
                metodopago = "Cuenta Corriente"
                efectivo = 0
                cambio = 0
            End If
    
    
            Dim comando As New OleDbCommand("INSERT INTO Ventas(ID_cliente,metodo_pago,fecha,total,efectivo,cambio)" & Chr(13) &
                                           "VALUES(@cliente, @metodopago, @fecha, @total, @efectivo, @cambio)", conexion)    ' APLICAMOS CONSULTA PARAMETRIZADA (ESTO DEBE SER OBLIGATORIO HACERLO ASI POR SER BUENA PRACTICA)
    
    	    comando.Parameters.AddWithValue("@client", cliente)
    	    comando.Parameters.AddWithValue("@metodopago", metodopago)
    		comando.Parameters.AddWithValue("@fecha", fecha) ' ENTIENDO QUE EL CAMPO FECHA ES DE TIPO DATETIME EN TU BBDD	
    	
            comando.Parameters.AddWithValue("@total", Convert.ToDouble(frmventas.Label7.Text)) 'CONVERTIR  DOUBLE. OJO que puede dar error de conversión si no se puede convertir la cadena a double
    		comando.Parameters.AddWithValue("@efectivo", efectivo) 		
    	    comando.Parameters.AddWithValue("@cambio", cambio) 			
            comando.ExecuteNonQuery()


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    Sergio con tu ejemplo efectivamente me dice que la cadena de entrada no tiene el formato correcto, he probado sacar el convert.toDouble y usando el mismo valor pero  sin decimal(anteriormente si guardaba sin decimales) y tampoco funciona asi, salta un error con la leyenda "No coincide los tipos de datos en la expresion de criterios"

    Gracias por tu tiempo 

    miércoles, 6 de marzo de 2019 19:39
  • Hola:
    Prueba con esto

    Public Sub guardar_venta()
    Try
        Dim lsQuery As String="INSERT INTO Ventas(ID_cliente, metodo_pago, fecha, total, efectivo, cambio) Values (@ID_cliente, @metodo_pago, @fecha, @total, @efectivo, @cambio)"
        Using loConexion As New OleDbConnection(TU_CADENA_DE_CONEXION)
            Dim cliente As Integer
            Dim metodopago As String
            Dim fecha As String = frmventas.DateTimePicker3.Text
            Dim efectivo, cambio As Double
            If frmcobrar.RadioButton1.Checked = True Then
                cliente = 1
                metodopago = "Contado"
                efectivo = CDbl(frmcobrar.TextBox1.Text)
                cambio = CDbl(frmcobrar.Label5.Text)
            Else
                cliente = frmcobrar.ComboBox1.SelectedIndex + 2
                metodopago = "Cuenta Corriente"
                efectivo = 0
                cambio = 0
            End If
            ' crear comando
            Using loComando As New OleDbCommand(lsQuery, loConexion)
                loComando.Parameters.Add(New OleDbParameter("@ID_cliente", cliente))
                loComando.Parameters.Add(New OleDbParameter("@metodo_pago", metodopago))
                loComando.Parameters.Add(New OleDbParameter("@fecha", CDate(fecha)))
                loComando.Parameters.Add(New OleDbParameter("@total", CDbl(frmventas.Label7.Text)))
                loComando.Parameters.Add(New OleDbParameter("@efectivo", efectivo))
                loComando.Parameters.Add(New OleDbParameter("@cambio", cambio))
                loConexion.Open()
                comando.ExecuteNonQuery()
            End Using
       End Using
    Catch Exp As Exception
       MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Try
    End Sub

    Un saludo desde Bilbo
    Carlos

    Carlos muchas gracias! tu respuesta me soluciono mi problema! muy agradecido realmente! Gracias por tu tiempo

      
    miércoles, 6 de marzo de 2019 20:33