Visual Basic.NET - Actualizar registro en tabla

 
Vista:
sin imagen de perfil
Val: 28
Ha disminuido su posición en 3 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Actualizar registro en tabla

Publicado por Adolfo (55 intervenciones) el 14/10/2017 02:04:23
Hola amigos,

Tengo la siguiente situacion:
Tengo una tabla donde se almacena cada factura en un supermercado, cada factura puede tener varias veces repetidas el mismo producto vendido, por lo cual el codigo de producto se repite en la tabla.
Basicamente busco por numero de factura + codigo de producto para acualizar el registro cuando se cambia la cantidad de unidades.
Pero como el codigo se repite, el codigo de abajo me modifica todos los productos que tienen el mismo codigo en la misma factura. el indice de la table lo ago con un Autonumero.

Como puedo hacer para que se modifica solamente el registro del producto en la tabla que corresponde al producto que yo seleccone en el ListView para modificar?

el problema se da a partir de la siguiente linea

CMD.CommandText = "UPDATE [TBFacturasDetalleTemp]................................

me modifica todos los registros con el mismo codigo de producto y numero de factura.

Agradeceria cualquier sugerencia.

--------------------------



Dim sql As String

sql = "SELECT * FROM TBFacturasDetalleTemp"
Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & VarPath & "\BDFacturacion.accdb;")
Dim CMD As New OleDbCommand(sql, conn)

conn.Open()
CMD.Connection = conn
Dim TR As OleDbTransaction = conn.BeginTransaction
CMD.Transaction = TR

Try
CMD.Parameters.Clear()

If FRMFacturacion.VarFacturaDetalleTemp = 0 Then 'Agrega registro nuevo
CMD.CommandText = "INSERT INTO [TBFacturasDetalleTemp] (NumPreFactura, CodigoProd, NombreProd, PrecioProd, CantidadUnidVendProd, DescuentoProd, SubTotalProd, ImpuestoVProd, CodigoCategoriaProd, FechaVentaProd) VALUES(@NumPreFactura, @CodigoProd, @NombreProd, @PrecioProd, @CantidadUnidVendProd, @DescuentoProd, @SubTotalProd, @ImpuestoVProd, @CodigoCategoriaProd, @FechaVentaProd)"
Else 'Edita un registro existente
CMD.CommandText = "UPDATE [TBFacturasDetalleTemp] SET NumPreFactura = @NumPreFactura, CodigoProd = @CodigoProd, NombreProd = @NombreProd, PrecioProd = @PrecioProd, CantidadUnidVendProd = @CantidadUnidVendProd, DescuentoProd = @DescuentoProd, SubTotalProd = @SubTotalProd, ImpuestoVProd = @ImpuestoVProd, CodigoCategoriaProd = @CodigoCategoriaProd, FechaVentaProd = @FechaVentaProd WHERE NumPreFactura = @NumPreFactura and CodigoProd = @CodigoProd"
End If

CMD.Parameters.AddWithValue("@NumPreFactura", nuevoDetalle.NumPreFactura)
CMD.Parameters.AddWithValue("@CodigoProd", nuevoDetalle.CodigoProd)
CMD.Parameters.AddWithValue("@NombreProd", nuevoDetalle.NombreProd)
CMD.Parameters.AddWithValue("@PrecioProd", nuevoDetalle.PrecioProd)
CMD.Parameters.AddWithValue("@CantidadUnidVendProd", nuevoDetalle.CantidadUnidVendProd)
CMD.Parameters.AddWithValue("@DescuentoProd", nuevoDetalle.DescuentoProd)
CMD.Parameters.AddWithValue("@SubTotalProd", nuevoDetalle.SubTotalProd)
CMD.Parameters.AddWithValue("@ImpuestoVProd", nuevoDetalle.ImpuestoVProd)
CMD.Parameters.AddWithValue("@CodigoCategoriaProd", nuevoDetalle.CodigoCategoriaProd)
CMD.Parameters.AddWithValue("@FechaVentaProd", nuevoDetalle.FechaVentaProd)

CMD.ExecuteNonQuery()
TR.Commit()
Catch ex As Exception
TR.Rollback()
conn.Close()
Throw ex
Finally
If conn IsNot Nothing AndAlso conn.State <> ConnectionState.Closed Then
conn.Close()
conn.Dispose()
CMD.Dispose()
End If
End Try
End Using
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Actualizar registro en tabla

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 15/10/2017 00:32:03
Tienes mal planteado el UPDATE

Si solo vas a modificar cuando cambian las cantidades, entonces solo debes hacer lo siguiente:

CMD.CommandText = "UPDATE [TBFacturasDetalleTemp] SET CantidadUnidVendProd = @CantidadUnidVendProd WHERE NumPreFactura = @NumPreFactura and CodigoProd = @CodigoProd And TuIndice=@Indice"

Con lo cual solo afectas las cantidades de un determinado producto por factura y por linea específica.

Hasta allí resuelto tu problema.

Ahora, el asunto está en que porqué repetir tantas veces el mismo producto?.

Lo que puedes hacer es que si ingreso el producto X, cantidad 1, si nuevamente tengo otro producto, en vez de agregar otra linea, sumas la cantidad a la línea ya existente, con eso si en una factura te piden 100 veces el producto X, tendrás una sola línea con 100 productos X, no te parece mejor?, o es que te obligan a que pongas las 100 lineas del mismo producto?.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 28
Ha disminuido su posición en 3 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Actualizar registro en tabla

Publicado por Adolfo (55 intervenciones) el 15/10/2017 03:05:33
Muchas gracias por la sugerencia, el problema es que el supermercado me obliga a hacer lo siguinte.

Si la linea 1 es un producto "X" y luego se pasa otra producto identico "X", la misma linea se actualiza.
Pero si la segunda linea de la factura es un product "Y" y la tercera linea es un producto "X" debe agregarse como 3era linea, y no a la primera linea, asi debe salir en la factura tambien, es un requisito del supermercado.

Por eso los codigos de producto deben poder repetirse dentro de la misma factura.

Muchas Gracias voy a provar el codigo que me diste!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Actualizar registro en tabla

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 15/10/2017 03:20:09
Si esas son las reglas del negocio entonces, al cliente lo que pida.

Pero igual aplica lo que te puse en el ejemplo cada linea tiene un id único entonces inclusive tu puedes actualizar la linea por su idlinea inclusive.

Ahora no se porque vas a una tabla de manera temporal, buscas, traes modificas y todo eso, cuando tranquilamente lo puedes hacer directo en el cliente, en un datagridview por ejemplo agregas y actualizas sin tantas vueltas a la base de datos.

Al grabar envías todo directo a la base de datos.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 28
Ha disminuido su posición en 3 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Actualizar registro en tabla

Publicado por Adolfo (55 intervenciones) el 15/10/2017 04:48:47
Muchas Gracias Wilfredo,

La razon por la que recurro tanto a la base de datos es porque por seguridad la informacion de la factura debe almacenarse en una tabla cada ves que se agrega una linea nueva a la factura, de forma tal que si falla la luz, el usuario pueda recuperar la factura exactamente donde habia quedado.

Por eso debo ir a la base de datos a salvar cada modificacion que se le haga a la factura.

En la siguiente direccion puedes ver una foto de mi pantalla de facturacion:
https://ibb.co/dkUCmG

Ahore tengo un problema con el codigo que tu me diste:
CMD.CommandText = "UPDATE [TBFacturasDetalleTemp] SET CantidadUnidVendProd = @CantidadUnidVendProd WHERE NumPreFactura = @NumPreFactura and CodigoProd = @CodigoProd And TuIndice=@Indice"

Mi tabla TBFacturasDetalleTemp tiene un indice de tipo AutoNumero, el cual no se como cargarlo antes de modificar el registro, pues
@NumPreFactura y @CodigoProd son datos que cargo directamente de mi pantalla de facturacion, no directamente de la tabla.

Por lo que no se como saber cual es el valor del indice (AutoNumero)

Tu dices que el datagridview lo hace directo a la base de datos, me puedes proveer algun ejemplo on guia de como se hace para ver si esto me facilitaria mi programa.

No soy exactamente un experto en esto.

Muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Actualizar registro en tabla

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 15/10/2017 18:59:49
A ver, tu tabla temporal no tiene un índice?

Si no tiene, puedes ponerle un índice autonumerico, que te permita discriminar esas modificaciones.
Ese índice es muy independiente no tendría porque agregarse a la tabla facturas final, si tu requerimiento es poder hacer lo que estás diciendo. te faltó poner eso para de esa manera tener un indice único con el cual trabajar las modificaciones.

Asumí que tenias uno en esa tabla por eso es que puse lo del índice.

Ahora lo que me dices de si se va la luz, en un supermercado no creo que no tengan las medidas adecuadas para prevenir eso.

Ahora, qué pasa si se va la luz así bajo tu esquema de trabajo?.
Las personas se quedarán esperando hasta cuando regrese la luz?.

Si son 2 puntos de venta o mas, cómo sabes cual es tu tabla o tus datos?.

Esas tablas temporales las creas en tiempo de ejecución cada vez que vas a realizar una venta o ya están creadas en la base de datos?.

Lo que me dices que vas a la BD por seguridad en caso se vaya la luz, tranquilamente lo puedes implementar que esos datos temporales se persistan localmente en cada punto de venta, y en caso se vaya la luz, lo recuperas sin el problema de estas buscando si esos datos fueron tuyo o de otro punto de venta.

Para esos casos creo que mejor se adapta el datagridview, ya que cada linea que agregas, va a la tabla, agrega el registro, genera su respectivo índice ya que sería autonumérico, entonces al hacer los cambios y vas y lees la tabla temporal y te regresa todas las filas con su respectivo indice, ese índice estaria en una columna oculta y lo podrias utilizar para el WHERE, cosa que no puedes hacer con el Listview creo.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar