none
Me Guarda pero al editar no actualiza RRS feed

  • Pregunta

  • ESto es mi codigo de guardar:

    Private Sub btnGuardar_Click(sender As Object, e As EventArgs) Handles btnGuardar.Click
            If txtCodigo.Text = Nothing Then
                Exit Sub
            End If
            If Fecha.Text = Nothing Then
                Exit Sub
            End If
            If txtProveedor.Text = Nothing Then
                Exit Sub
            End If
            If cboDocumento.Text = Nothing Then
                Exit Sub
            End If
            If txtNumDoc.Text = Nothing Then
                Exit Sub
            End If
            If txtNombre.Text = Nothing Then
                Exit Sub
            End If
            If txtMarca.Text = Nothing Then
                Exit Sub
            End If
            If txtModelo.Text = Nothing Then
                Exit Sub
            End If
            If txtSerie.Text = Nothing Then
                Exit Sub
            End If
            If cboEstado.Text = Nothing Then
                Exit Sub
            End If
            If txtDetalle.Text = Nothing Then
                Exit Sub
            End If
            If txtPrecio.Text = Nothing Then
                Exit Sub
            End If
            If txtTipoM.Text = Nothing Then
                Exit Sub
            End If
            
            If contador_para_guardar = 1 Then
                Try
                    conex.Open()
                    Dim textosqIngresar As New String(CType("Insert into Productos (CodProducto,FechaRegistro,Proveedor,TipoDocumento,NumDocumento,NomProducto,Marca,Modelo,Serie,Estado,Detalle,Precio,Stock,TipoMoneda,Imagen,Usuario)values(@a,@b,@c,@d,@e,@f,@g,@h,@i,@j,@k,@l,@m,@n,@o,@p)", Char()))
                    Dim cmda As New SqlCommand(textosqIngresar, conex)
                    cmda.Parameters.AddWithValue("@a", Me.txtCodigo.Text)
                    cmda.Parameters.AddWithValue("@b", Me.Fecha.Text)
                    cmda.Parameters.AddWithValue("@c", Me.txtProveedor.Text)
                    cmda.Parameters.AddWithValue("@d", Me.cboDocumento.Text)
                    cmda.Parameters.AddWithValue("@e", Me.txtNumDoc.Text)
                    cmda.Parameters.AddWithValue("@f", Me.txtNombre.Text)
                    cmda.Parameters.AddWithValue("@g", Me.txtMarca.Text)
                    cmda.Parameters.AddWithValue("@h", Me.txtModelo.Text)
                    cmda.Parameters.AddWithValue("@i", Me.txtSerie.Text)
                    cmda.Parameters.AddWithValue("@j", Me.cboEstado.Text)
                    cmda.Parameters.AddWithValue("@k", Me.txtDetalle.Text)
                    cmda.Parameters.AddWithValue("@l", Me.txtPrecio.Text)
                    cmda.Parameters.AddWithValue("@m", Me.txtStock.Text)
                    cmda.Parameters.AddWithValue("@n", Me.txtTipoM.Text)
    
                    Dim Imag As Byte()
                    Imag = Imagen_Bytes(Me.ImagenProd.Image)
                    cmda.Parameters.AddWithValue("@o", Imag)
    
                    cmda.Parameters.AddWithValue("@p", Me.lblUser.Text)
    
                    If conex.State = ConnectionState.Open Then
                        cmda.ExecuteNonQuery()
                    End If
                    conex.Close()
                    lblMensaje.Text = ("Datos Guardados Correctamente")
    
                    pre = 0
                    Desactivo()
                    contador_para_guardar = 0
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
            If contador_para_guardar = 2 Then
                Try
                    conex.Open()
                    Dim textosqeliminar As New String(CType("Update Productos set NomProducto=@f where CodProducto =@a", Char()))
                    Dim cmda As New SqlCommand(textosqeliminar, conex)
                    cmda.Parameters.AddWithValue("@a", Me.txtCodigo.Text)
                    cmda.Parameters.AddWithValue("@b", Me.Fecha.Text)
                    cmda.Parameters.AddWithValue("@c", Me.txtProveedor.Text)
                    cmda.Parameters.AddWithValue("@d", Me.cboDocumento.Text)
                    cmda.Parameters.AddWithValue("@e", Me.txtNumDoc.Text)
                    cmda.Parameters.AddWithValue("@f", Me.txtNombre.Text)
                    cmda.Parameters.AddWithValue("@g", Me.txtMarca.Text)
                    cmda.Parameters.AddWithValue("@h", Me.txtModelo.Text)
                    cmda.Parameters.AddWithValue("@i", Me.txtSerie.Text)
                    cmda.Parameters.AddWithValue("@j", Me.cboEstado.Text)
                    cmda.Parameters.AddWithValue("@k", Me.txtDetalle.Text)
                    cmda.Parameters.AddWithValue("@l", Me.txtPrecio.Text)
                    cmda.Parameters.AddWithValue("@m", Me.txtStock.Text)
                    cmda.Parameters.AddWithValue("@n", Me.txtTipoM.Text)
    
                    Dim Imag As Byte()
                    Imag = Imagen_Bytes(Me.ImagenProd.Image)
                    cmda.Parameters.AddWithValue("@o", Imag)
    
                    cmda.Parameters.AddWithValue("@p", Me.lblUser.Text)
    
                    If conex.State = ConnectionState.Open Then
                        cmda.ExecuteNonQuery()
                    End If
                    conex.Close()
                    lblMensaje.Text = ("Datos modificados Correctamente")
                    Desactivo()
                    contador_para_guardar = 0
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
            btnGuardar.Enabled = False
            btnNuevo.Enabled = True
            btnEditar.Enabled = True
            btnEliminar.Enabled = False
            Call Limpiar()
            'Desactivo()
        End Sub

    Y esto es los campos de la tabla Productos

    Mi pregunta es en que esta mal el codigo y del motivo no este actualizando cualquier campo sea. Sale se modifico correctamente pero cuando consulto a la base de datos esta igual.

    Gracias

    • Cambiado Enrique M. Montejo martes, 3 de mayo de 2016 14:31 Pregunta relacionada con el acceso a datos.
    viernes, 29 de abril de 2016 17:54

Todas las respuestas

  • ¿Existe algún registro con el valor del campo CodProducto igual a txtCodigo.Text? Ten en cuenta que tienes esa condición en el update y no hay ningún aviso si el registro no existe, simplemente no se actualiza nada.

    Saludos, Javier J

    viernes, 29 de abril de 2016 18:20
  • Hola,

    Primero vayamos por partes, tienes código redundante en la validación de los controles. Puedes hacerlo de esta manera.

             If txtCodigo.Text.Trim().Length = 0 Or
                Fecha.Text.Trim().Length = 0 Or
                txtProveedor.Text.Trim().Length = 0 Or
                cboDocumento.Text.Trim().Length = 0 Or
                txtNumDoc.Text.Trim().Length = 0 Or
                txtNombre.Text.Trim().Length = 0 Or
                txtModelo.Text.Trim().Length = 0 Or
                txtSerie.Text.Trim().Length = 0 Or
                cboEstado.Text.Trim().Length = 0 Or
                txtDetalle.Text.Trim().Length = 0 Or
                txtPrecio.Text.Trim().Length = 0 Or
                txtTipoM.Text.Trim().Length = 0 Then
    
                MessageBox.Show("Complete todos los campos")
                Exit Sub
            End If

    No deberías usar Nothing, ya que si el usario presiona la tecla espaciador (genera un espacio en el TextBox), el Nothing no lo detecta y acepta que es un dato. Es por eso que uso Trim(), para limpiar los espacios en blanco. Y finalmente uso el Or para saber si cualquiera de todas esas validaciones  es True, para que entre y muestre el mensaje.

    Ahora, no entiendo porque crear un nuevo String  y casteas al tipo Char ?

    New String( CType ..... Char ??

    Si tan solo es una cadena de texto, con esto bastaría.

    Dim textosqIngresar As String = "Insert into Productos (CodProducto,FechaRegistro,Proveedor,TipoDocumento,NumDocumento,NomProducto,Marca,Modelo,Serie,Estado,Detalle,Precio,Stock,TipoMoneda,Imagen,Usuario) values (@a,@b,@c,@d,@e,@f,@g,@h,@i,@j,@k,@l,@m,@n,@o,@p)"

    Te recomendaría usar StoredProcedure, para que tu código sea más limpio y evites haces toda esa línea, pero eso es decisión tuya.

    Además veo que haces dos procedimientos, Actualizar e Insertar, pero lo puedes realizar mediante un SP.

    Algo así :

    CREATE PROCEDURE SP_MISTORED_PROCEDURE
    @cod varchar(20)
    AS
    	if exists(select * from miTabla where codigo = @cod)
    		begin
    		    --ACTUALIZAMOS
    		end
    	else
    		begin
    		   --INSERTAMOS
    		end
    

    Si existe el registro con el código que mandas, actualizamos y si no existe insertamos.

    - La imagen que guardas, proviene de un PictureBox ? el campo en tu BD es de tipo image?

    Prueba haciendo estos cambios.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 29 de abril de 2016 18:34
  • Es correcto la imagen es de tipo image, pero eso si me lo guarda

    y en el datagridv sale las imagenes.

    Respecto a la rebundancia ya lo he modificado como indicas es cierto he hice una super mezcla. pero ya lo hice como indicas.

    no se mucho de SP

    en otro aplicacion que habia echo hice de esa forma de insertar y actualizar y en el otro casi si me edita normal el problema a mi parecer es porque en este caso hay una imagen.

    Cuando busco le doy doble click al datagridview (la fila) me llena los campos pero el de la imagen no.

    Saludos y Gracias

    viernes, 29 de abril de 2016 20:57
  • ya hicistes algun debug de tu codigo para poder ver si el objeto carga, ya que no cae en el catch, debes estar apuntando el objeto con la carga en algun lugar errado, o faltando la carga y otro consejo seria bueno colocar el finally para finalizar el algoritmo

    Lander P.S Herrera

    sábado, 30 de abril de 2016 2:26
  • Ya he solucionado el problema de edicion era la consulta y otros datos errados. 

    domingo, 1 de mayo de 2016 1:12