Transacciones en .Net

Page 1

Transacciones de Datos Aplicaciones Windows (ADO Net)

Visual Studio Net

Transacciones de Datos Aplicaciones Windows (ADO Net) Prof: Allende Aguilar; Franklin

FrankDocNet

1/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

Transacciones de Datos Objetivos:  Conocer el Objeto SqlTransaction  Como Iniciar y Terminar una Transacción  Como hacer que verifique un Command  Casos prácticos

Introducción Cuando hablamos de Transacciones nos referimos a que una operación consta de sub-operaciones, por tal sentido, debemos controlar que todas las sub-operaciónes debe llegar a concretarse o caso contrario debe invalidarse toda la operación. Para que entiendan mejor les explicare el escenario de trabajo y que es lo haremos en la presente separata: Generaremos la Boleta del Sistema de Ventas que estamos desarrollando, el generar boleta implica por lo minimo tres operaciones: el primero guardar cabecera de boleta(tabla boleta), el segundo guardar detalle de boleta (tabla DetBoleta) y el tercero descontar el stock de producto que se esta vendiendo. El descontar stock lo controlaremos en el lado de SQL con el procedimiento almacenado que guarda detalle boleta (UspDetBol) que se encargara de descontar el stock por cada producto diferente que de vende. Entonces solo nos quedaria controlar dos operaciones la primera y la segunda (Guardar boleta y detalle de boleta), para eso crearemos una sola funcion de nombre GuardarBoleta en la cual se encargar de hacer las dos operaciones para poder controlar la transaccion. El SqlTransaction es una clase del SQLClient que nos permite controlar varias operaciones, si todas las sub-operaciones llegan a concluirse de manera satisfactoria entonces daremos luz verde a que se genere toda la operación, por el contrario, si una sub-operación falla entonces se invalida toda lo operación, en otras palabras todo o nada, eso es lo que nos permite controlar el SqlTransaction. Nota: Para porder desarrollar la presente separa debe haber resuelto las anteriores separatas, porque trabajaremos con el “Sistema Integrado” que estamos desarrollando.

2/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

Practica Programada 1.- En la base de datos Ventas ud. Debera agregar los siguientes procedimientos almacenados. Use Ventas go --Procedimetos Almacenados Insertar Boleta Create Procedure UspGuaBol @NroBol varchar(10) Output, @Fecha datetime, @CodCli varchar(6), @CodEmp varchar(6), @Total money as begin transaction Select @NroBol=Right('000000000' + ltrim(str(count(*)+1)),10) from Boleta Insert Into Boleta values (@NroBol, @Fecha, @CodCli, @CodEmp, @Total) if @@error<> 0 rollback transaction else commit transaction go --Procedimetos Almacenados Insertar Detalle de Boleta Create Procedure UspGuaDetBol @NroBol varchar(10), @CodPro varchar(6), @PreVen money, @CanVen Int as begin transaction Insert into DetBoleta Values (@NroBol, @CodPro, @PreVen, @CanVen) Update Producto Set StoPro = StoPro - @CanVen where CodPro=@CodPro if @@error<> 0 rollback transaction else commit transaction go --Procedimetos Almacenados para cargar datos Create Procedure UspLisPro as Select * from Producto go Create Procedure UspBusPrecio @CodPro varchar(6) as Select PrePro from Producto where CodPro=@CodPro Go --Si Ud. Ya desarrollo todo las anteriores practicas ya no es necesario que cree --este Procedimetos Almacenado UspFilCli, porque ya lo debe de tener. create Procedure UspFilCli @ApeCli varchar(30) as SELECT C.CodCli as Codigo, C.NomCli as Nombre, C.ApeCli as Apellido, C.RucCli as Ruc, C.TelCli as Telefono, C.DirCli as Direccion, D.NomDis as Distrito FROM Cliente C INNER JOIN Distrito D ON C.CodDis = D.CodDis WHERE C.ApeCli like @ApeCli + '%'

3/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

2.- Abra su proyecto “Sistema Integrado”, para poder continuar y ahí mismo agregar la boleta. 3.- Vaya a la clase “ClsOperaciones”, y agregue las siguientes funciones. 'Creo la funcion que guarde boleta y detalle de boleta aplicando transaction, tenga 'cuidado al momento de escribir los para metros, algunos de ellos son array en este 'caso Producto(), Precio_Venta() y Cantidada() Public Function GuardarBoleta(ByVal Fecha As Date, ByVal Cliente As String, ByVal Empleado As String, ByVal Total As String, ByVal Producto() As String, ByVal Precio_Venta() As String, ByVal Cantidad() As String) As String Dim Tran As SqlTransaction Try Cn.Open() 'Inicio el verificador de transacciones Tran = Cn.BeginTransaction Dim CmdC As New SqlCommand("UspGuaBol", Cn) 'Al verificador de transacciones de digo que haga un seguimiento 'a este comando. CmdC.Transaction = Tran CmdC.CommandType = CommandType.StoredProcedure CmdC.Parameters.Add("@NroBol", SqlDbType.VarChar, 10) CmdC.Parameters("@NroBol").Direction = ParameterDirection.Output CmdC.Parameters.Add("@Fecha", SqlDbType.DateTime).Value = Fecha CmdC.Parameters.Add("@CodCli", SqlDbType.VarChar, 6).Value = Cliente CmdC.Parameters.Add("@CodEmp", SqlDbType.VarChar, 6).Value = Empleado CmdC.Parameters.Add("@Total", SqlDbType.Money).Value = CDec(Total) CmdC.ExecuteNonQuery() Dim NroBol As String = CmdC.Parameters("@NroBol").Value Dim x As Short For x = 0 To UBound(Producto) Dim CmdD As New SqlCommand("UspGuaDetBol", Cn) 'Al verificador de transacciones de digo que haga un seguimiento 'a este comando pod cada detalle. CmdD.Transaction = Tran CmdD.CommandType = CommandType.StoredProcedure CmdD.Parameters.Add("@NroBol", SqlDbType.VarChar, 11).Value = NroBol CmdD.Parameters.Add("@CodPro", SqlDbType.VarChar, 6).Value = Producto(x) CmdD.Parameters.Add("@PreVen", SqlDbType.Money).Value = CDec(Precio_Venta(x)) CmdD.Parameters.Add("@CanVen", SqlDbType.Int).Value = CInt(Cantidad(x)) CmdD.ExecuteNonQuery() Next GuardarBoleta = NroBol 'Si no hay error en ninguna operación entonces que se haga la transaccion Tran.Commit() Cn.Close() Catch ex As Exception GuardarBoleta = "" 'Si hay error en alguna operación entonces que se deshaga toda las operaciones Tran.Rollback() End Try End Function

4/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

Public Function ListarProducto() As DataTable Dim Cmd As New SqlCommand("UspLisPro", Cn) Cmd.CommandType = CommandType.StoredProcedure Dim Da As New SqlDataAdapter(Cmd) ListarProducto = New DataTable Da.Fill(ListarProducto) End Function

'Esta funcion me devolvera el precio de producto 'que seleccionara al momento de vender Public Function BuscarPrecio(ByVal Codigo_Producto_a_Buscar As String) As String Dim Cmd As New SqlCommand("UspBusPrecio", Cn) Cmd.CommandType = CommandType.StoredProcedure Cmd.Parameters.Add("@CodPro", SqlDbType.VarChar, 6).Value = Codigo_Producto_a_Buscar Cn.Open() BuscarPrecio = Cmd.ExecuteScalar Cn.Close() End Function

'Si termino las tareas de mantenimiento que deje en la anterior separata 'me imagino que ya debe de tener esta funcion en el ClsOperaciones 'y ya no es necesario que lo haga. Public Function FiltrarCliente(ByVal Apellido_a_Buscar As String) As DataTable Dim Cmd As New SqlCommand("UspFilCli", Cn) Cmd.CommandType = CommandType.StoredProcedure Cmd.Parameters.Add("@ApeCli", SqlDbType.VarChar, 30).Value = Apellido_a_Buscar Dim Da As New SqlDataAdapter(Cmd) FiltrarCliente = New DataTable Da.Fill(FiltrarCliente) End Function

Ojito: Solo quiero aclararles, que si ud. Tiene un formulario de ingreso en donde ingresa sus datos, el que ingresa al final es un empleado, entonces el es el responsable de todas las operaciones que pueda hacer, en otras palabras, de las boletas y facturas que se efecturan. Entonces al momento de generar la boleta Ud. Ya no debe de seleccionar el empleado que atendera, ya debe de estar por defecto, en este caso el que ingreso al sistema, en tal sentido queda como tarea, que modifiquen el ingreso al sistema, porque lo que hicimos hasta el momento, solo verifica si es correcto o no, y no guarda el codigo ni el nombre del del empleado que ingreso al sistema. Entonces debe de cambiar la funcion “VerificarUsuario� e incluso el Procedimiento almacenado, declarar en el modulo variables para que almacenen tales datos con el fin de que puedan ser utilizados desde cualquier formulario.

5/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

4.- Al proyecto “Sistema de Ventas” agregar un nuevo formulario de nombre “FrmTraBoleta”, en donde, en el grafico tendra el diseño.

6/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

5.- Agregar los siguientes codigos al formulario “FrmTraBoleta”. Objeto: FrmTraBoleta

Evento: Declaraciones

Dim Descargo As Boolean Sub PersonalizarControles() Me.GbBuscar.Visible = False Me.GbProducto.Enabled = False Me.BtnAgregar.Enabled = False Me.BtnImprimir.Enabled = False Me.BtnNuevo.Enabled = False Me.TxtTotal.Text = "00.00" End Sub Sub CargarDatos() Me.CboProducto.DataSource = Obj.ListarProducto Me.CboProducto.DisplayMember = "NomPro" Me.CboProducto.ValueMember = "CodPro" End Sub Objeto: FrmTraBoleta

Evento: Load

PersonalizarControles() CargarDatos() Descargo = True Objeto: TxtBuscar

Evento: TextChanged

Me.DgvBuscar.DataSource = Obj.FiltrarCliente(Me.TxtBuscar.Text) Objeto: BtnBuscarCliente

Evento: Click

Me.TxtBuscar_TextChanged(sender, e) Me.GbBuscar.Visible = True

Objeto: DgvBuscar

Evento: DoubleClick

If Not IsDBNull(Me.DgvBuscar.SelectedCells(0).Value) Then Me.TxtCodigo.Text = Me.DgvBuscar.SelectedCells(0).Value Me.TxtNombre.Text = Me.DgvBuscar.SelectedCells(2).Value & "; " & Me.DgvBuscar.SelectedCells(1).Value Me.TxtRuc.Text = Me.DgvBuscar.SelectedCells(3).Value Me.TxtDirreccion.Text = Me.DgvBuscar.SelectedCells(5).Value End If Me.GbBuscar.Visible = False

Objeto: TxtCodigo,TxtNombre,TxtDireccion

Evento: TextChanged

If Me.TxtCodigo.Text.Trim = "" Or Me.TxtNombre.Text.Trim = "" Or Me.TxtDireccion.Text.Trim = "" Then Me.GbProducto.Enabled = False Else Me.GbProducto.Enabled = True End If

7/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

Objeto: TxtCantidad,TxtPrecio

Evento: TextChanged

If Me.TxtPrecio.Text.Trim = "" Or Me.TxtCantidad.Text.Trim = "" Then Me.BtnAgregar.Enabled = False Else Me.BtnAgregar.Enabled = True End If Objeto: BtnAgregar

Evento: Click

Dim x As Short = Me.LsvDatos.Items.Count Me.LsvDatos.Items.Add(Me.CboProducto.SelectedValue) Me.LsvDatos.Items(x).SubItems.Add(Me.CboProducto.Text) Me.LsvDatos.Items(x).SubItems.Add(Me.TxtPrecio.Text) Me.LsvDatos.Items(x).SubItems.Add(Me.TxtCantidad.Text) Dim Imp As Decimal = CDec(Me.TxtPrecio.Text) * CDec(Me.TxtCantidad.Text) Me.LsvDatos.Items(x).SubItems.Add(Imp) Me.TxtTotal.Text += Imp Me.TxtCantidad.Clear() Objeto: BtnQuitar

Evento: Click

Dim Imp As Decimal = Me.LsvDatos.SelectedItems(0).SubItems(4).Text Me.LsvDatos.Items.RemoveAt(Me.LsvDatos.SelectedIndices(0)) Me.TxtTotal.Text -= Imp Objeto: BtnGuardar

Evento: Click

If Me.LsvDatos.Items.Count = 0 Then MsgBox("Falta datos paraGuardar") Exit Sub End If Dim y As Short, Cod(), Pre(), Can() As String For y = 0 To Me.LsvDatos.Items.Count - 1 ReDim Preserve Cod(y) ReDim Preserve Pre(y) ReDim Preserve Can(y) Cod(y) = Me.LsvDatos.Items(y).Text Pre(y) = Me.LsvDatos.Items(y).SubItems(2).Text Can(y) = Me.LsvDatos.Items(y).SubItems(3).Text Next Dim NroBol As String NroBol = Obj.GuardarBoleta(Me.DtpFecha.Value, Me.TxtCodigo.Text, Me.TxtEmpleado.Text, Me.TxtTotal.Text, Cod, Pre, Can) If NroBol.Length = 0 Then MsgBox("Error en Datos") Else Me.LblNroBoleta.Text = NroBol MsgBox("Boleta se Guardo correctamente") Me.BtnNuevo.Enabled = True Me.BtnGuardar.Enabled = False Me.BtnImprimir.Enabled = True End If

8/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

Nota: Los dos siguientes codigos de los botones nuevo, solo funcionara si al formulario Boleta lo esta llamando desde el MDIPrincipal Objeto: BtnNuevoCliente

Evento: Click

Dim Frm As New FrmManCliente Frm.MdiParent = Me.MdiParent Frm.Show() Objeto: BtnNuevo

Evento: Click

Dim Frm As New FrmTraBoleta Frm.MdiParent = Me.MdiParent Frm.Show() Me.Close() Objeto: BtnImprimir

Evento: Click

MsgBox("Completamos cuando hagamos reportes con parametros")

6.- Por Ăşltimo, el GroupBox de busqueda de Cliente (GbBuscar) ubiquelo en la parte superior, como se ve en el grafico.

9/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Transacciones de Datos Aplicaciones Windows (ADO Net)

10/10

Prof: Allende Aguilar; Franklin

|

Email: frank_allende@hotmail.com


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.