Está en la página 1de 22

Practica Calificada

Crear este mantenimiento, para esto todo el script se encuentra desarrollado, se tiene que hacer los procedimientos almacenados segn lo que se pida en la aplicacin. La base de datos tambin se encuentra en la carpeta compartida, es la base de datos Northwind (revisen ante su Servidor para ver si no existe ya, Tambin podran trabajar con la base de datos Neptuno (tabla empleados)). Al terminar la aplicacin la empaquetan y lo envan al correo electrnico mct.cristian@gmail.com

Antes que todo aadimos un Toolbar a nuestro formulario Paso 1 Click en la Barra de Herramientas - Toolbox

Ahora ya podemos trabajar con la Herramienta Toolbar Luego aadimos un control ImageList al formulario

Luego aadimos imgenes al control ImageList / /Propiedades Image Collection Insertamos las Imgenes del Menu

Para despues enlazarlo al control Toolbar

En propiedades del Toolbar / ImageList Lo enlazamos al control ImageList

Una vez enlazado al control ImageList Ya podemos insertar imgenes en nuestro toolbar Propiedades Button - Colecction

////////////////////////////////////////////////////////////////////////////////////////////////

Imports System.Data.SqlClient Imports System.Data Public Class frmEmpleado Inherits System.Windows.Forms.Form Cdigo generado por el diseador del windows Forms 'Realizamos la conexin a la base de datos Dim cn As New SqlConnection("server=(local);database=northwind; Integrated security=sspi") 'Seleccionamos con el adaptador la porcin de datos que se van a recuperar de la tabla Employees Dim daEmployee As New SqlDataAdapter("Select EmployeeId,firstName,LastName,Address,Title,HireDate,city from Employees", cn) 'Creamos el Dataset que servira de repositorio de los datos recuperados Dim dsEmployee As New DataSet 'Creamos un comando que se encargar de ejecutar instrucciones Sql y 'procedimientos almacenados Dim cmd As SqlCommand 'Creamos un parametro que se encargar de enviar datos a los procedimientos 'almacenados Dim par As SqlParameter 'Creamos una variable lgica con el fin de determinar cuando se esta 'editando o ingresando un nuevo registro Dim edicion As Boolean

Para enlazar solo al data griw por cdigo Agregamos lo siguiente


daEmployee.Fill(dsEmployee) Dim dt As DataTable = dsEmployee.Tables(0) dgEmployee.DataSource = dt

y para llenar un texto box con los datos de la grilla


txtEmployeeId.Text = CInt(dgEmployee.Item(0, dgEmployee.CurrentRow.Index).Value)
///////////////////////////////////////////////////////////

A criterio personal inserte un datagriwview y lo enlace a la base de datos Con Binding


Me aparecio este codigo en mi formulario load

Me.EmployeesTableAdapter.Fill(Me.NorthwindDataSet.Employees)

Para enlazarlo los datos dela grilla a los cuadros de texto use lo siguiente
Me.txtEmployeeId.DataBindings.Add(New System.Windows.Forms.Binding("text", EmployeesBindingSource, "EmployeeId", True)) Me.txtFirstName.DataBindings.Add(New System.Windows.Forms.Binding("text", EmployeesBindingSource, "firstName", True)) Me.txtLastName.DataBindings.Add(New System.Windows.Forms.Binding("text", EmployeesBindingSource, "LastName", True)) Me.txtAddress.DataBindings.Add(New System.Windows.Forms.Binding("text", EmployeesBindingSource, "Address", True)) Me.txtTitle.DataBindings.Add(New System.Windows.Forms.Binding("text", EmployeesBindingSource, "Title", True)) Me.txtHireDate.DataBindings.Add(New System.Windows.Forms.Binding("text", EmployeesBindingSource, "HireDate", True)) Me.txtCity.DataBindings.Add(New System.Windows.Forms.Binding("text", EmployeesBindingSource, "city", True))

Otro metodo Profesor


'El mtodo llenarcajas se encargar de mostrar los datos recuperados 'en cada caja de texto Sub llenarcajas() Dim posicion As Integer posicion = Me.BindingContext(dsEmployee, "employees").Position With dsEmployee.Tables(0).Rows(posicion) txtEmployeeId.Text = .ItemArray(0) txtFirstName.Text = .ItemArray(1) txtLastName.Text = .ItemArray(2) txtAddress.Text = .ItemArray(3) txtTitle.Text = .ItemArray(4) txtHireDate.Text = .ItemArray(5)

txtCity.Text = .ItemArray(6) End With dgEmployee.DataSource = dsEmployee dgEmployee.DataMember = "Employees" End Sub 'El mtodo llenarDesdeGrid har lo mismo que el mtodo llenarcajas, pero los datos los recuperara de la grilla 'cuando el usuario seleccione una fila Sub llenarDesdeGrid() With dsEmployee.Tables(0).Rows(dgEmployee.CurrentCell.RowNumber) txtEmployeeId.Text = .ItemArray(0) txtFirstName.Text = .ItemArray(1) txtLastName.Text = .ItemArray(2) txtAddress.Text = .ItemArray(3) txtTitle.Text = .ItemArray(4) txtHireDate.Text = .ItemArray(5) txtCity.Text = .ItemArray(6) End With End Sub 'El mtodo listarempleados se encargar de llenar el dataset con datos actualizados Sub listarempleados() dsEmployee.Clear() daEmployee.Fill(dsEmployee, "employees") End Sub

'Mtodo que se encargar de limpiar las cajas de texto cuando se quiera aadir un nuevo 'registro Sub limpiarcajas() Dim cajas As Control For Each cajas In Controls If TypeOf cajas Is TextBox Then cajas.Text = "" End If Next For Each control As Windows.Forms.Control In Me.Controls If TypeOf control Is GroupBox Then txtEmployeeId.Focus() For Sub Each controlText As Windows.Forms.Control In Me.GroupBox1.Controls End
If TypeOf controlText Is TextBox Then CType(controlText, TextBox).Clear() End If Next End If Next

'Este mtodo se encargar de establecer la pocisin ordinal del registro actual y el total de regsitros 'de la tabla Employees Sub contarRegistros() Dim posicion, totalReg As Integer posicion = Me.BindingContext(dsEmployee, "employees").Position + 1 totalReg = Me.BindingContext(dsEmployee, "employees").Count lblReg.Text = posicion & " de " & totalReg End Sub

'Este mtodo se encargar de determinar si las cajas de texto podrn responder o no 'a algn evento Sub habilitaCajas(ByVal ws As Boolean) Dim x As Integer For x = 0 To Controls.Count - 1 If TypeOf Controls(x) Is TextBox Then Controls(x).Enabled = ws End If Next End Sub **** Dentro de un contenedor ***** For Each cajas As Windows.Forms.Control In Me.Controls If TypeOf cajas Is GroupBox Then For Each controlText As Windows.Forms.Control In Me.GroupBox1.Controls If TypeOf controlText Is TextBox Then CType(controlText, TextBox).Enabled = ws End If Next End If Next

'Este mtodo har que los botones de la barra de herramientas puedan o no responder a 'algn evento

'Este mtodo se encargar de habilitar o inhabilitar los botones de desplazamiento Sub desplazar(ByVal ws As Boolean) Dim boton As Control For Each boton In Controls If TypeOf boton Is Button Then boton.Enabled = ws End If Next End Sub 'Al cargarse el formulario se invicarn algunos mtodos Private Sub frmEmpleado_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load habilitaCajas(False) habilitaBotones(True) listarempleados() llenarcajas() Me.KeyPreview = True contarRegistros() End Sub 'Mtodo que permitira aadir un nuevo registro Sub nuevo() habilitaCajas(True) habilitaBotones(False) desplazar(False) edicion = False limpiarcajas() txtHireDate.Text = Now.Today a veces puedes variar a

txtHireDate.Text = Date.Today

End Sub

'Mtodo que se encargar de editar un registro existente Sub editar() habilitaCajas(True) habilitaBotones(False) desplazar(False) edicion = True End Sub 'Metodo que se encargar de cancelar la edicin de un registro existente 'o cancelar el ingreso de un nuevo registro Sub cancelar() habilitaCajas(False) habilitaBotones(True) desplazar(True) llenarcajas() End Sub

'Al selecionar una celda de la grilla se llenarn las cajas de texto 'con los datos de la fila seleccionada Private Sub dgEmployee_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgEmployee.CurrentCellChanged llenarDesdeGrid() contarRegistros() End Sub 'Al selecionar una fila de la grilla se llenarn las cajas de texto 'con los datos de la fila seleccionada Private Sub dgEmployee_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgEmployee.Click llenarDesdeGrid() contarRegistros() End Sub

'Este mtodo se encargar de ejecutar el procedimiento almacenado que permitira aadir un nuevo empleado Sub InsertarEmpleado(ByVal nombre As String, ByVal apellidos As String, ByVal direccion As String, ByVal cargo As String, ByVal fcon As Datetime, ByVal ciudad As String) cmd = New SqlCommand("sp_insertar_empleado", cn) cn.Open() cmd.CommandType = CommandType.StoredProcedure par = cmd.Parameters.Add("@nombre", SqlDbType.NVarChar, 10) par.Direction = ParameterDirection.Input par.Value = nombre par = cmd.Parameters.Add("@apellidos", SqlDbType.NVarChar, 30) par.Direction = ParameterDirection.Input par.Value = apellidos par = cmd.Parameters.Add("@direccion", SqlDbType.NVarChar, 50) par.Direction = ParameterDirection.Input par.Value = direccin par = cmd.Parameters.Add("@cargo", SqlDbType.NVarChar, 20) par.Direction = ParameterDirection.Input par.Value = cargo par = cmd.Parameters.Add("@fcon", SqlDbType.NVarChar.DateTime) par.Direction = ParameterDirection.Input par.Value = fcon par = cmd.Parameters.Add("@ciudad", SqlDbType.NVarChar, 20) par.Direction = ParameterDirection.Input par.Value = ciudad cmd.ExecuteNonQuery() cn.Close() End Sub

Para Insertar Creamos el siguiente Procedimiento almacenado Usp_InsertarEmpleado Create procedure sp_insertar_empleado @nombre NVarChar(10), @apellidos NVarChar(30), @direccion NVarChar(50), @cargo NVarChar(20), @fcon DateTime, @ciudad NVarChar(20) as insert into Employees(LastName,FirstName,Address,Title,HireDate,City) values (@nombre,@apellidos,@direccion,@cargo,@fcon,@ciudad)

'Este mtodo se encargar de ejecutar el procedimeinto almacenado que permitira actualizar 'los datos de un empleado existente o un nuevo empleado Sub ActualizarEmpleado(ByVal idempleado As Integer, ByVal nombre As String, ByVal apellidos As String, ByVal direccion As String, ByVal cargo As String, ByVal fcon As Date, ByVal ciudad As String) cmd = New SqlCommand("sp_actualizar_empleado", cn) cn.Open() cmd.CommandType = CommandType.StoredProcedure par = cmd.Parameters.Add("@idempleado", SqlDbType.Int, 4) par.Direction = ParameterDirection.Input par.Value = idempleado par = cmd.Parameters.Add("@nombre", SqlDbType.NVarChar, 10) par.Direction = ParameterDirection.Input par.Value = nombre par = cmd.Parameters.Add("@apellidos", SqlDbType.NVarChar, 30) par.Direction = ParameterDirection.Input par.Value = apellidos par = cmd.Parameters.Add("@direccion", SqlDbType.NVarChar, 50) par.Direction = ParameterDirection.Input par.Value = direccin

par = cmd.Parameters.Add("@cargo", SqlDbType.NVarChar, 20)

par.Direction = ParameterDirection.Input par.Value = cargo par = cmd.Parameters.Add("@fcon", SqlDbType.NVarChar.DateTime) par.Direction = ParameterDirection.Input par.Value = fcon par = cmd.Parameters.Add("@ciudad", SqlDbType.NVarChar, 20) par.Direction = ParameterDirection.Input par.Value = ciudad cmd.ExecuteNonQuery() cn.Close() End Sub

Para Insertar Creamos el siguiente Procedimiento almacenado Usp_Actualizar_Empleado Create Procedure Usp_Actualizar_Empleado @nombre NVarChar(10), @apellidos NVarChar(30), @direccion NVarChar(50), @cargo NVarChar(20), @fcon DateTime, @ciudad NVarChar(20) as Update Employees set LastName=@nombre , FirstName= @apellidos, Address=@direccion, Title=@cargo,HireDate=@fcon, City=@ciudad

'Este mtodo ejecutar el procedimeinto almacenado que eliminar un empleado Sub eliminarempleado(ByVal idempleado As Integer) cmd = New SqlCommand("sp_eliminar_empleado", cn) cn.Open() cmd.CommandType = CommandType.StoredProcedure par = cmd.Parameters.Add("@idempleado", SqlDbType.Int, 4) par.Direction = ParameterDirection.Input par.Value = idempleado cmd.ExecuteNonQuery() cn.Close() End Sub 'Este mtodo invocar los mtodos actualizarempleado e insertarempleado Sub guardar() habilitaCajas(False) habilitaBotones(True) desplazar(True) If edicion = False Then If MessageBox.Show("Desea guardar el" + vbCrLf + "nuevo registro?", "NUEVO", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then InsertarEmpleado(txtLastName.Text, txtFirstName.Text, txtAddress.Text, txtTitle.Text, CDate(txtHireDate.Text), txtCity.Text) Else cancelar() End If Else If MessageBox.Show("Desea guardar los" + vbCrLf + "cambios realizados?", "MODIFICAR", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then ActualizarEmpleado(CInt(txtEmployeeId.Text), txtFirstName.Text, txtLastName.Text, txtAddress.Text, txtTitle.Text, CDate(txtHireDate.Text), txtCity.Text) Else cancelar() End If End If listarempleados() llenarcajas() contarRegistros() End Sub

'este mtodo invocar al mtodo eliminarempleado Sub eliminar() If MessageBox.Show("Est seguro de eliminar" + vbCrLf + "el registro actual?", "ELIMINAR", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then eliminarempleado(CInt(txtEmployeeId.Text)) listarempleados() llenarcajas() contarRegistros() End If End Sub 'Mueve el puntero al siguiente registro Private Sub btnSiguiente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSiguiente.Click Me.BindingContext(dsEmployee, "employees").Position += 1 llenarcajas() contarRegistros() End Sub 'Mueve el puntero al anterior registro Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click Me.BindingContext(dsEmployee, "employees").Position -= 1 llenarcajas() contarRegistros() End Sub 'mueve el puntero al primer regsitro Private Sub btnPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimero.Click Me.BindingContext(dsEmployee, "employees").Position = 0 llenarcajas() contarRegistros() End Sub 'mueve el puntero al ultimo registro Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click Me.BindingContext(dsEmployee, "employees").Position = Me.BindingContext(dsEmployee, "Employees").Count - 1 llenarcajas() contarRegistros() End Sub 'invocamos a los mtodos de mantenimiento

Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case e.Button.ImageIndex Case 0 nuevo() Case 1 editar() Case 2 guardar() Case 3 eliminar() Case 4 cancelar() End Select End Sub End Class

ADICIONAL - INSERTA EMPLEADO -

ES NCESARIO UTILIZAR ESTAS LINEAS DENTRO DE MI PROCEDIMIENTO O NO ES NECESARIO.

este es mi procedimiento:
CREATE PROCEDURE sp_AgregarEmpleado @idRut AS VARCHAR(10), @perfil_idPerfil AS INT, @nombres AS VARCHAR(50), @apellidos AS VARCHAR(50), @direccion AS VARCHAR(50), --PRIMARY KEY(idRut), --FOREIGN KEY(perfil_idPerfil) REFERENCES perfil(idPerfil), @msg AS VARCHAR(100) OUTPUT

AS BEGIN SET NOCOUNT ON; Begin Tran Tadd Begin Try INSERT INTO empleados(idRut, perfil_idPerfil, nombres, apellidos, direccion) VALUES (@idRut, @perfil_idPerfil, @nombres, @apellidos, @direccion) SET @msg = 'El Usuario se ingreso correctamente.' COMMIT TRAN Tadd End try Begin Catch SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la lnea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.' Rollback TRAN Tadd End Catch END

[SQL] Procedimiento almacenado para Insertar datos con transaccin y control de errores.

Hola amigos, en muchas ocasiones no sabemos si estamos realizando correctamente un proceso de insercin, actualizacin o eliminacin de datos a una tabla(s), esto para muchos es sumamente sencillo, pero me di a la tarea de preparar un pequeo ejemplo de esto. El script de T-Sql consiste en realizar un procedimiento almacenado que reciba los datos necesarios para insertarlos en la tabla, para garantizar la ejecucin correcta de las inserciones utilizo las transacciones Transact SQL y para validar la reversin de la transaccin en caso de que ocurra un ERROR utilizo el control de Errores Try Catch conRollBack. Qu es una Transaccin? Una transaccin es un conjunto de operaciones T-SQL que funcionan como un solo bloque de instrucciones, esto significa que si ocurre un fallo durante la ejecucin de alguna instruccin del bloque todas las dems fallaran, lo que implica que nada ms se ejecutara y la transaccin tendr que deshacer todo lo que haba ejecutado hasta donde ocurri el fallo, a eso se la llama reversin de la transaccin y se ejecuta con un ROLLBACK, en caso de una ejecucin correcta se tendr que grabar la transaccin con COMMIT, el objetivo de las transacciones es garantizar que los datos que se inserten, actualicen o eliminen quedenCONSISTENTES en la base de datos. Despus de una ligera explicacin de las Transacciones veremos el siguiente ejemplo de una insercin dentro de un procedimiento almacenado con transaccin. Definiendo las estructuras.

1. La estructura del SP es:

CREATE PROCEDURE nombreProdedimiento -- Parmetros del SP @Param1 AS Varchar(25), @Param2 AS Bigint . . . AS BEGIN -- Insertar bloque de instrucciones a ejecutar. /* SELECT UPDATE INSERT DELETE Lo que quieras.... */ END GO

2. La estructura del control de errores TRY-CATCH es:

Begin Try /*Bloque de instrucciones a validar.

-------------------------------------------------------------------------------------------------------------------------*/ End Try Begin Catch /*Bloque de instrucciones que se ejecutan si ocurre un ERROR. -------------------------------------------------------------------------------------------------------------------------*/ End Catch

3. La estructura de una Transaccin es:

Begin Tran NombreTransaccion--Inicio de la transaccin con su nombre Tadd o el que elijas. /*Bloque de instrucciones a ejecutar en la Transaccin -----------------------------------------------------------------------------*/ Commit Tran NombreTransaccion--Confirmacin de la transaccin. Rollback Tran NombreTransaccion--Reversin de la transaccin.

4. Para finalizar veremos todo lo anterior armado ya en conjunto de SP, Transaccin y control de Errores.

-- ============================================= -- Author: Ivan Rangel Cuadros. -- Create date: 22/Ene/2009

-- Description: Procedimiento para Insertar registros en una Tabla con transaccin y control de errores. -- ============================================= CREATE PROCEDURE spAgregaUsuario @nom AS VARCHAR(50), @ape AS VARCHAR(50), @ema AS VARCHAR(30), @pas AS VARCHAR(20), @idJer AS BIGINT, @msg AS VARCHAR(100) OUTPUT AS BEGIN SET NOCOUNT ON; Begin Tran Tadd Begin Try INSERT INTO dbo.USUARIO_SYS (nombre, apellidos, email, pass, fecha_add) VALUES (@nom, @ape, @ema, @pas, GETDATE()) INSERT INTO dbo.USUARIO_JERARQUIAS_SYS (id_usuario, id_jerarquia) VALUES (@@IDENTITY, @idJer) SET @msg = 'El Usuario se registro correctamente.' COMMIT TRAN Tadd End try Begin Catch SET @msg = 'Ocurrio un Error: ' + ERROR_MESSAGE() + ' en la lnea ' + CONVERT(NVARCHAR(255), ERROR_LINE() ) + '.' Rollback TRAN Tadd End Catch END GO

Explicando el procedimiento:
1. Recibe los datos a travs de parmetros de los cuales uno es de salida OutPut , que servir para indicar si la Insercin se realizo correctamente o no. 2. Crea una transaccin llamada Tadd, valida con TRY-CATCH las inserciones a las tablasUSUARIO y USUARIO_JERARQUIAS.

3. Si las operaciones de insercin se ejecutan correctamente las confirma con COMMIT TRAN Tadd y regresa la variable @msg con un valor de confirmacin correcto, si ocurre un error se revierte la transaccin con ROLLBACK TRAN Tadd y devuelve en @msg un valor de error. Ejecutando el Procedimiento:

DECLARE @msg AS VARCHAR(100); EXEC spAgregaUsuario 'Claudia','Perez Torres','clau@mail.com','a220109',1,@msg OUTPUT SELECT @msg AS msg