none
Transación ejecutada RRS feed

  • 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!

    lunes, 23 de marzo de 2020 9:55

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
    jueves, 26 de marzo de 2020 10:13

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.

    lunes, 23 de marzo de 2020 14:55
  • 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()

    martes, 24 de marzo de 2020 9:43
  • 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
    jueves, 26 de marzo de 2020 10:13
  • 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...

    Gracias! Cuidense

    viernes, 3 de abril de 2020 9:27