Principales respuestas
Transación ejecutada

Pregunta
-
Hola!! Espero que esten todos bien...
Realizo una transacción con varios insert y update, en los insert tengo que hacer un bucle for para insertar los productos vendidos en una tabla, y luego update para actulizar los contadores de numero de venta, numero factura...
Puedo controlar si los insert de las ventas estan correctos para realiar los updates?
Saludos!
Respuestas
-
Hola:
Cuando haces mas de 1 accion de Insert, Update o Delete, es necesario abrir una transaccion para que se ejecuten todas las acciones o no se ejecute ninguna en caso de que ocurra algun error.
En resumen que no se puede controlar 1 accion individualmente, se controlan todas las acciones que estan incluidas en la transaccion, si NO hay error, se cierra la transaccion, si hay error, se anula la transaccion
Un saludo desde Bilbo
Carlos- Marcado como respuesta J.Ramon viernes, 3 de abril de 2020 9:25
Todas las respuestas
-
Hola J.Ramon
Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que para que la comunidad de foros te pueda asesorar mejor, es necesario que nos compartas el form/code que estás desarrollando
Gracias por usar los foros de MSDN.
Pablo Rubio
____
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
-
Hola Pablo Rubio;
El lenguaje es VB.Net, el formulario tiene un botón de guardar.
No he puesto el código por que es bastante largo... Lo recorto un poco.
He quitado algunos insert para que sea mas corto, como ves hago un For Each, donde recorro un datagridview, para ver todos los productos que voy a vender, ver el precio, el iva... Tengo que hacer esos insert y si todo sale bien en ese insert, mas abajo actualizo varios contadores(numero de venta, numero de factura...) Necesito que solo se actualicen los contadores si todo lo anterior esta introducido correctamente.
Puedo hacerlo con el blucle For Each, pero si hay 30 productos, realizo 30 pasos por el blucle, y queria ver si podía hacerlo de otra forma mas rápida o efectiva...
Using cnn As New SqlConnection(Configuration.ConfigurationManager.ConnectionStrings("cnn").ToString()) 'Abrimos conexion cnn.Open() Dim transaccion As SqlTransaction = cnn.BeginTransaction Dim cmd As SqlCommand = cnn.CreateCommand() cmd.Transaction = transaccion Try 'Contador Dim n As Integer = 0 For Each fila As DataGridViewRow In DGVVtaVarios.Rows n = n + 1 If Val(TxtCuenta.Text) > 0 Then Dim iva As String = fila.Cells("IvaProducto").Value.ToString() 'Cobro en FTIQUET cmd.CommandText = "INSERT INTO FTIQUET (anumpac,anumvenpac,afecha,anutiq,atipotiq,apts,avendedo,aimpreso,monedero, opticod,ref,reparacion,base1,base2,base3,base4,iva1,iva2,iva3,iva4,codopti,Hora,iva,tipo,tipocob,iva22,numero,audio,base0,tipoven,tipocob2)VALUES (@numpac,@numven,@fechatiq,@numtiq,@tipotiq,@pts,@vendedor,@impreso,@monedero,@opticod,@ref,@repara,@base1,@base2,@base3,@base4,@iva1,@iva2,@iva3,@iva4,@codopti,@hora,@iva" & n & ",@tipo,@tipocob2,@iva22,@numpac2,@audio,@base0,@tipoven,@tipocob22)" cmd.Parameters.AddWithValue("@numpac", LabelNumCli.Text) cmd.Parameters.AddWithValue("@numpac2", LabelNumCli.Text) cmd.Parameters.AddWithValue("@numven", Numventa() + 1) cmd.Parameters.AddWithValue("@fechatiq", Date.Now.ToShortDateString) cmd.Parameters.AddWithValue("@numtiq", numtiq() + 1) cmd.Parameters.AddWithValue("@tipotiq", "VENTA VARIOS") cmd.Parameters.AddWithValue("@pts", Val(TxtCuenta.Text)) cmd.Parameters.AddWithValue("@vendedor", codvendedor) cmd.Parameters.AddWithValue("@impreso", CBool(Impretiq)) cmd.Parameters.AddWithValue("@monedero", 0) cmd.Parameters.AddWithValue("@opticod", "") cmd.Parameters.AddWithValue("@ref", 0) cmd.Parameters.AddWithValue("@repara", 0) cmd.Parameters.AddWithValue("@base1", Vbase(1)) cmd.Parameters.AddWithValue("@base2", Vbase(2)) cmd.Parameters.AddWithValue("@base3", Vbase(3)) cmd.Parameters.AddWithValue("@base4", 0) cmd.Parameters.AddWithValue("@iva1", VIva(1)) cmd.Parameters.AddWithValue("@iva2", VIva(2)) cmd.Parameters.AddWithValue("@iva3", VIva(3)) cmd.Parameters.AddWithValue("@iva4", 0) cmd.Parameters.AddWithValue("@codopti", CODOPTI) cmd.Parameters.AddWithValue("@hora", Now.ToString("HH:mm:ss")) cmd.Parameters.AddWithValue("@iva" & n, iva) cmd.Parameters.AddWithValue("@tipo", tipocob) cmd.Parameters.AddWithValue("@tipocob2", tipocob2) cmd.Parameters.AddWithValue("@iva22", 0) cmd.Parameters.AddWithValue("@audio", "") cmd.Parameters.AddWithValue("@base0", Vbase(0)) cmd.Parameters.AddWithValue("@tipoven", 1) cmd.Parameters.AddWithValue("@tipocob22", 10) cmd.ExecuteNonQuery() End If 'Descontamos Producto cmd.CommandText = "Update Producto set cantidad= cantidad-1 WHERE Barras=@CodBarras" cmd.Parameters.AddWithValue("@CodBarras", barrasL) cmd.ExecuteNonQuery() Next 'Sumamos Contador If Val(TxtDeuda.Text) = 0 Then cmd.CommandText = "Update Fpacpar set parnum= parnum+1 WHERE id=@idnumfact" cmd.Parameters.AddWithValue("@idnumfact", idnumfact) cmd.ExecuteNonQuery() End If 'Actualizamos Contador If Val(TxtCuenta.Text) > 0 Then cmd.CommandText = "Update Fpacpar set parnum= parnum+1 WHERE id=@idnumtiq" cmd.Parameters.AddWithValue("@idnumtiq", idnumtiq) cmd.ExecuteNonQuery() End If 'Actualizamos Contador cmd.CommandText = "Update Fpacpar set parnum= parnum+1 WHERE id=@idnumventa" cmd.Parameters.AddWithValue("@idnumventa", idnumventa) cmd.ExecuteNonQuery() 'Ejecutamos la transacción transaccion.Commit()
-
Hola:
Cuando haces mas de 1 accion de Insert, Update o Delete, es necesario abrir una transaccion para que se ejecuten todas las acciones o no se ejecute ninguna en caso de que ocurra algun error.
En resumen que no se puede controlar 1 accion individualmente, se controlan todas las acciones que estan incluidas en la transaccion, si NO hay error, se cierra la transaccion, si hay error, se anula la transaccion
Un saludo desde Bilbo
Carlos- Marcado como respuesta J.Ramon viernes, 3 de abril de 2020 9:25
-
Gracias J. Carlos Herrero,
Finalmente he hecho un bucle For Each y con el mismo insert realizo varios... Sabiendo que no puedo controlar uno individualmente, creo que lo he hecho bien...