viernes, 2 de abril de 2010

Eliminar fila seleccionada datagridview con SUPR, actualizar valor o stock en el evento UserDeletingRow y si es maestro/detalle eliminar datatable

 Estimados lectores, ha sido una experiencia agradable el hacer este blog y tener algunos lectores que comparten el gusto por la programación; actualmente estoy empezando otro proyecto, muy personal,  con tecnología web  que espero compartir con toda la comunidad de programadores y necesito recursos porque es algo muy personal y mi situación financiera no es muy buena.
 Si alguien desearía apoyarme  tengo una tarjeta Oxxo Saldazo con el número:  4766-8408-7508-1593, cualquier apoyo lo pueden hacer en cualquier tienda Oxxo o en Banamex, les agradezco y que sus proyectos lleguen a buen fin.

 www.artprogramnet.wordpress.com
Un problema común es el siguiente:
Eliminar maestro/detalle con código con SUPR, en donde el maestro y detalle están en diferente datagridview, y actualizar un valor cualquiera, que puede ser: Restar un valor a un stock o factura.
Para Eliminar fila seleccionada de un datagridview con SUPR¨— la propiedad ALLOWUSERTODELETEDROWS debe estar como True—
El evento que se produce es UserDeletingRow
Suponiendo que tenemos dos datagridview, en uno tenemos los articulos(maestro) y en otro las fechas en que se vendieron(detalle). Lo que deseamos es que al borrar el articulo se actualice el total de ventas,
Podemos usar la siguiente rutina

Private Sub dgarticulos_UserDeletingRow(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles dgarticulos.UserDeletingRow
‘ponemos una variable en donde vendra el total de ventas de ese ‘articulo
Dim valprecio As Single = CType(e.Row.Cells("totprecio").Value, Single)
‘variable para colocar la clave del articulo a borrar
Dim scveart As String = e.Row.Cells("cveart").Value.tostring
‘preguntamos si realmente se desea borrar, ya que el usuario puede haber oprimido la tecla SUPR por equivocación
Dim respuesta As Integer
respuesta = MessageBox.Show("Deseas borrar este articulo?" & sgpoborrar, "Borrar Articulo", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2)
If respuesta = DialogResult.Yes Then
‘si queremos eliminar el registro e.cancel debe ser false
e.Cancel = False
‘aquí restamos el valor de las ventas del articulo eliminado
txtsuma.Text = CType((Val(txtsuma.Text) - valprecio), String)
'borra todos los elementos del datatable de fechas de venta que coincidan con este articulo
‘primero hacemos un filtro de la tabla donde estan las fechas de venta
Dim dv As DataView = New DataView(dtabfechasart)
Dim str As String = String.Empty
str = "cveart ='" & scveart & "'"
dv.RowFilter = str
‘recorremos la el dataview para marcar todas las fechas de venta para ese articulo como borradas
For i = dv.Count - 1 To 0 Step -1
dv.Delete(i)
Next
Else
‘si el usuario no desea borrar
e.Cancel = True
End If
End Sub.

‘al final, ya sea cuando vayan a grabar los datos a la base de datos en forma definitiva recuerden ocupar update y acceptchanges
Como en el siguiente ejemplo
‘maestro
daarticulos.Update(datarticulos)
datarticulos.AcceptChanges()
‘detalles
dafechasart.Update(dtabfechasart)
dtabfechasart.AcceptChanges()
Cualquier comentario es bienvenido

7 comentarios:

  1. Ok, lo que quiero hacer es:
    Tengo mi DataGridView (tablaVentas), y tengo datos como 'precio','descuento','subtotal' y se van acomulando en una variable 'total' que esta dirigira a un textbox, lo que quiero es cuando se borra la fila con "SUPR" que se reste esa cantidad de subtotal a "TOTAL".... ???..

    Gracias.

    ResponderEliminar
    Respuestas
    1. HSA todo lo puedes programar en el evento UserDeletingRow, depende del problema, puedes hacer un dataview, barrerlo, sumarlo, restarlo etcetera te envio un ejemplo de lo que podrias hacer en ese evento:
      Private Sub dgTablaventas_UserDeletingRow(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles dgtablaventas.UserDeletingRow

      Try
      Dim sgpoborrar As String
      sgpoborrar = e.Row.Cells(0).Value.ToString
      Dim valprecio As Single
      If IsDBNull(e.Row.Cells("precio").Value) Then
      valprecio = 0
      Else
      valprecio = CType(e.Row.Cells("precio").Value, Single)
      End If
      'MessageBox.Show(sgpoborrar)
      Dim respuesta As Integer
      respuesta = MessageBox.Show("Deseas borrar este Grupo?" & sgpoborrar, "Borrar Grupo", _
      MessageBoxButtons.YesNo, _
      MessageBoxIcon.Question, _
      MessageBoxDefaultButton.Button2)
      If respuesta = DialogResult.Yes Then
      e.Cancel = False
      ' txtsuma.Text = CType((Val(txtsuma.Text) - valprecio), String)
      'borra todos los elementos del datatable de parametros que coincidan con este grupo
      Dim dv As DataView = New DataView(dtabparam)
      Dim str As String = String.Empty

      str = "no_lab ='" & iact & "'"
      str = str & " and clagru ='" & sgpoborrar & "'"
      dv.RowFilter = str
      If dv.Count = 0 Then
      MessageBox.Show("Este grupo: " & sgpoborrar & " No tenia parámetros")
      End If
      For i = dv.Count - 1 To 0 Step -1
      dv.Delete(i)
      Next
      Else
      e.Cancel = True
      End If

      Catch ex As Exception
      MessageBox.Show(ex.Message, "Error userdeletingrow, algun precio es nulo", MessageBoxButtons.OK, MessageBoxIcon.Error)
      Finally
      ' 'Conexion.Close()
      ' 'Conexion = Nothing
      End Try

      Eliminar
    2. HSB para tu caso particular fijate en estas lineas
      If IsDBNull(e.Row.Cells("precio").Value) Then
      valprecio = 0
      Else
      valprecio = CType(e.Row.Cells("precio").Value, Single)
      endif
      tu podrias hacer lo siguiente:
      If IsDBNull(e.Row.Cells("subtotal").Value) Then
      'no hace nada puesto que ese subtotal nunca se sumo o sumo 0 que es lo mismo
      Else
      txtTotal.value=txtotal.value- CType(e.Row.Cells("subtotal").Value, Single)

      Eliminar
  2. hola! tengo un problema que no se como solucionar. tengo 6 dg que se cargan desde un combobox (un combo x cada datagrid).
    lo que quiero es que se pueda agregar , modificar y eliminar filas en cada dg. todo lo hace a la perfeccion, salvo que cuando elimino una fila y luego agrego otra en su lugar, sale un error que dice "No se puede obtener acceso a la información eliminada de una fila."
    mi idea es que se pueda manipular los data grid pero no modificar tablas hasta que no se presione un boton de "guardar"
    podrias ayudarme o darme una pista??
    mil gracias!

    ResponderEliminar
    Respuestas
    1. Hola anonimo, no m quedo muy claro tu problema, verifica este articulo en este mismo blog
      No se puede obtener acceso a la información eliminada de una fila
      la esencia es que detectes si el registro fue marcado como eliminado o no
      For Each dr As DataRow In dtabalumno.Rows
      If dr.RowState = DataRowState.Deleted Then
      ‘no procesa el registro eliminado
      else
      dr("status") =”PROCESADO”
      que estes bien y si me aclaras mas elproblema podriamos echarte una mano
      saludos

      Eliminar
    2. antes que nada muchas gracias.
      me explico mejor.
      el dg lo cargo con un combox, al seleccionar una opcion, se llenar el resto de celdas.
      si deseo eliminar una fila, con la propiedad AllowUserToDeleteRows, la elimina, pero yo no quiero actualizar tablas, es solo a la vista del usuario en el formulario. si en ese mismo dg agrega una fila me sale el error que te comente.
      creo que deberia hacer algo con los indices, pero no encuentro la vuelta...llevo 3 meses con el vb y estoy trabada.
      mil gracias

      Eliminar
  3. Hola, mira en ese artiuclo al que t dije que consultaras, hay un enlace a un problema similar al tuyo que se resolvio con los indices, verifica ese articulo y vas a ver que hay en enlace a una solucion. si sigues teniendo problemas espero verlo la otra semana, ahorita tengo que salir y llego hasta el martes
    saludos

    ResponderEliminar