UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN GUÍA DE LABORATORIO #11 CICLO: 02-2011 Nombre de la Práctica: ADO.NET. Parte III MATERIA: Lenguaje de Programación I OBJETIVOS ESPECÍFICOS Qué el estudiante: • Desarrolle una aplicación aplicando conceptos de POO y ADO.NET. • Desarrolle una aplicación utilizando formularios MDI. • Realice operaciones básicas de acceso a datos. INTRODUCCIÓN TEÓRICA. Las aplicaciones MDI (interfaz de múltiples documentos) permiten mostrar varios documentos al mismo tiempo, cada uno de ellos en su propia ventana. Las aplicaciones MDI suelen tener un elemento de menú Ventana con submenús que permiten cambiar entre ventanas o documentos. La base de una Aplicación con Interfaz de múltiples documentos (MDI) es el formulario primario MDI. Este formulario es el que contiene las ventanas MDI secundarias, que son las "subventanas" dentro de las cuales los usuarios interactúan con la aplicación MDI. La creación de un formulario MDI primario resulta sencilla, tanto en el Diseñador de Windows Forms como mediante programación. En la presente práctica vamos a desarrollar una aplicación utilizando un formulario MDI, al mismo tiempo, retomaremos los conceptos de programación orientada a objetos y los combinaremos con los conceptos de ADO.NET estudiados hasta el momento. REQUERIMIENTOS O MATERIAL Y EQUIPO N° 1 2 3 Cantidad 1 1 1 Descripción PC con Windows 7 y acceso a Internet Guía de Laboratorio Memoria USB PROCEDIMIENTO La presente guía es un repaso de muchos conceptos que usted ya vio en clase teórica, cualquier duda recuerde consultar a su instructor. Vamos a trabajar con la base de datos registro cuyo diagrama se presenta a continuación: Facultad de Estudios Tecnológicos 1 Cree un nuevo proyecto en Visual Studio, luego agregue una clase llamada Persona, cuyo código se muestra a continuación: Public Class Persona Private _id As Integer Private _nombres As String Private _apellido1 As String Private _apellido2 As String Private _telefono As String Private _email As String Private _direccion As String Private _edad As Short Private _tipoP As Short '+++++++++++++++++++++++++++++Contructores ' Incluyendo parámetros Public Sub New(ByVal i As Integer, ByVal n As String, ByVal a1 As String, ByVal a2 As String, ByVal t As String, ByVal mail As String, ByVal d As String, ByVal e As Short, ByVal tp As Short) _id = i _nombres = n _apellido1 = a1 _apellido2 = a2 _telefono = t _email = mail _direccion = d _edad = e _tipoP = tp End Sub ' Si no se incluye el parámetro Public Sub New() End Sub '++++++++++++++++++++++++++++Métodos Properties Public Property Id() As Integer Get Return _id End Get Set(ByVal value As Integer) _id = value End Set End Property Public Property Nombres() As String Get Facultad de Estudios Tecnológicos 2 Return _nombres End Get Set(ByVal value As String) _nombres = value End Set End Property Public Property Apellido1() As String Get Return _apellido1 End Get Set(ByVal value As String) _apellido1 = value End Set End Property Public Property Apellido2() As String Get Return _apellido2 End Get Set(ByVal value As String) _apellido2 = value End Set End Property Public Property Telefono() As String Get Return _telefono End Get Set(ByVal value As String) _telefono = value End Set End Property Public Property Email() As String Get Return _email End Get Set(ByVal value As String) _email = value End Set End Property Public Property Direccion() As String Get Return _direccion End Get Set(ByVal value As String) _direccion = value End Set End Property Public Property Edad() As Short Get Return _edad End Get Set(ByVal value As Short) _edad = value End Set End Property Public Property TipoP() As Short Get Return _tipoP End Get Facultad de Estudios Tecnológicos 3 Set(ByVal value As Short) _tipoP = value End Set End Property End Class Luego una clase llamada Alumno, esta clase va a heredar de Persona, el código es el siguiente: Public Class Alumno : Inherits Persona Private _grado As String Private _fechaIngreso As String '+++++++++++++++++++++++++++++Contructores ' Incluyendo parámetros Public Sub New(ByVal i As Short, ByVal n As String, ByVal a1 As String, ByVal a2 As String, ByVal t As String, ByVal mail As String, ByVal d As String, ByVal e As Short, ByVal tp As Short, ByVal gr As String, ByVal fi As String) Id = i Nombres = n Apellido1 = a1 Apellido2 = a2 Telefono = t Email = mail Direccion = d Edad = e TipoP = tp Grado = gr _fechaIngreso = fi End Sub ' Si no se incluye el parámetro Public Sub New() End Sub ' Solamente con el Id de un objeto Alumno Public Sub New(ByVal idest As Integer) Id = idest End Sub '++++++++++++++++++++++++++++Métodos Properties Public Property Grado() As String Get Return _grado End Get Set(ByVal value As String) _grado = value End Set End Property Public Property FechaIngreso() As String Get Return _fechaIngreso End Get Set(ByVal value As String) _fechaIngreso = value End Set End Property End Class Facultad de Estudios Tecnológicos 4 Agregue una clase llamada Conexion, esta clase va a manejas las conexiones a la base de datos, los objetos de ADO.NET y las operaciones de agregar, actualizar, buscar y eliminar, el código es el siguiente: Imports System.Data.OleDb Public Class Conexion Private _sAppPath As String 'ruta Private _sBaseDatos As String 'base de datos Private _CadConex As String 'Cadena de Conexion Private cnDB As OleDbConnection 'Para manipular un objeto conexion '+++++++++++++++++++++++++++++Contructores ' Incluyendo parámetros Public Sub New(ByVal path As String, ByVal db As String, ByVal cc As String) _sAppPath = path _sBaseDatos = db _CadConex = cc End Sub ' Si no se incluye el parámetro Public Sub New() _sAppPath = Application.StartupPath.ToString _sBaseDatos = sAppPath & "\registro.accdb" _CadConex = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & sBaseDatos & ";Persist Security Info = False" End Sub '++++++++++++++++++++++++++++Métodos Properties Public Property sAppPath() As String Get Return _sAppPath End Get Set(ByVal value As String) _sAppPath = value End Set End Property Public Property sBaseDatos() As String Get Return _sBaseDatos End Get Set(ByVal value As String) _sBaseDatos = value End Set End Property Public Property CadConex() As String Get Return _CadConex End Get Set(ByVal value As String) _CadConex = value End Set End Property 'Función para conectarse a la DB Function Conectar() As OleDbConnection cnDB = New OleDbConnection(CadConex) Try cnDB.Open() Return cnDB Facultad de Estudios Tecnológicos 5 Catch ex As Exception 'MsgBox(ex.Message) Return Nothing End Try End Function 'Método para desconectarse Public Sub Desconectar() cnDB.Close() End Sub 'Función para devolver un DataSet Function conSelect(ByVal cadConsul As String) As DataSet Dim dsTabla As New DataSet Dim orden As OleDb.OleDbDataAdapter Try orden = New OleDb.OleDbDataAdapter(cadConsul, Conectar()) 'Cargando el Dataset dsTabla = New DataSet() dsTabla.Clear() orden.Fill(dsTabla, "miTabla") Catch 'MessageBox.Show(ex.Message); End Try Return dsTabla End Function 'Método para agregar un registro Sub Agregar(ByVal est As Alumno, ByVal tabla As String) Dim isql As String = "INSERT INTO " & tabla & " VALUES " Dim cmd As OleDbCommand If (tabla = "alumno") Then 'Termino la intrucción insert isql = isql + "(@IdAlumno, @nombres, @apellido1, @apellido2, @telefono, @email, @direccion, @edad) " 'Creadon un comando cmd = New OleDbCommand(isql, Conectar()) 'Agregando las variables parámetros cmd.Parameters.Add(New OleDbParameter("@IdAlumno", OleDbType.Numeric)) cmd.Parameters("@IdAlumno").Value = est.Id cmd.Parameters.Add(New OleDbParameter("@nombres", OleDbType.VarChar)) cmd.Parameters("@nombres").Value = est.Nombres cmd.Parameters.Add(New OleDbParameter("@apellido1", OleDbType.VarChar)) cmd.Parameters("@apellido1").Value = est.Apellido1 cmd.Parameters.Add(New OleDbParameter("@apellido2", OleDbType.VarChar)) cmd.Parameters("@apellido2").Value = est.Apellido2 cmd.Parameters.Add(New OleDbParameter("@telefono", OleDbType.VarChar)) cmd.Parameters("@telefono").Value = est.Telefono cmd.Parameters.Add(New OleDbParameter("@email", OleDbType.VarChar)) cmd.Parameters("@email").Value = est.Email cmd.Parameters.Add(New OleDbParameter("@direccion", OleDbType.VarChar)) cmd.Parameters("@direccion").Value = est.Direccion cmd.Parameters.Add(New OleDbParameter("@edad", OleDbType.Integer)) cmd.Parameters("@edad").Value = est.Edad cmd.ExecuteNonQuery() Facultad de Estudios Tecnológicos 6 End If End Sub 'Método para actualizar un registro Sub Actualizar(ByVal est As Alumno, ByVal tabla As String) Dim isql As String = "UPDATE " & tabla & " SET " Dim cmd As OleDbCommand If (tabla = "alumno") Then 'Termino la intrucción insert isql = isql + "nombres='" + est.Nombres + "',apellido1='" + est.Apellido1 + "',apellido2='" + est.Apellido2 + "',telefono='" + est.Telefono + "',email='" + est.Email + "',direccion='" + est.Direccion + "',edad=" + CStr(est.Edad) isql = isql + " WHERE IdAlumno=" + CStr(est.Id) 'Creadon un comando cmd = New OleDbCommand(isql, Conectar()) If (cmd.ExecuteNonQuery()) Then MessageBox.Show("Registro Actualizado con Éxito") End If End If End Sub 'Método para eliminar un registro Sub Eliminar(ByVal est As Alumno, ByVal tabla As String) Dim isql As String = "DELETE FROM " & tabla Dim cmd As OleDbCommand If (tabla = "alumno") Then 'Termino la intrucción delete isql = isql + " WHERE IdAlumno = @ID " 'Creadon un comando cmd = New OleDbCommand(isql, Conectar()) 'Agregando las variables parámetros cmd.Parameters.Add(New OleDbParameter("@ID", OleDbType.Numeric)) cmd.Parameters("@ID").Value = est.Id cmd.ExecuteNonQuery() End If End Sub End Class Como usted puede ver en la clase anterior, obtiene la ruta de la base datos para luego pasarla a la respectiva cadena de conexión, consulta a su instructor por la ubicación de la base de datos si tiene alguna duda. La última clase que vamos a agregar a nuestro proyecto se va a llamar Cdao, esta clase es muy importante, ya que es la que va a comunicar nuestra interfaz con las clases anteriores y hará uso al mismo tiempo de la clase Conexión para manipular la información de la base de datos, el código es el siguiente: Imports System.Data.OleDb Facultad de Estudios Tecnológicos 7 Public Class Cdao 'Constructores: Public Sub New() End Sub 'Método para agregar elementos Public Sub AgregarRegistro(ByVal p As Object, ByVal t As String) Dim NHConexion = New Conexion NHConexion.Agregar(p, t) End Sub 'Método para agregar elementos Public Sub Modificar(ByVal p As Object, ByVal t As String) Dim NHConexion = New Conexion NHConexion.Actualizar(p, t) End Sub 'Método para eliminar elementos Public Sub Borrar(ByVal p As Object, ByVal t As String) Dim NHConexion = New Conexion NHConexion.Eliminar(p, t) End Sub 'Método para obtener un elemento Public Function getElemento(ByVal tabla As String, ByVal campofiltro As String, ByVal filtro As Integer) As Persona Dim objAlumno As Alumno = New Alumno 'Creando un objeto para retornar Dim NHConexion = New Conexion Dim dsRegisto As DataSet = New DataSet Dim dtTabla As DataTable = New DataTable Dim ssql = "SELECT * FROM " + tabla + " WHERE " + campofiltro + "=" + CStr(filtro) DataRow dsRegisto = NHConexion.conSelect(ssql) dtTabla = dsRegisto.Tables(0) 'Obtener un DataTable Dim row As DataRow = dtTabla.Rows(dtTabla.Rows.Count - 1) 'Obtener un 'Llenando los campos del objeto a delvolver desde el DataTable If Not (IsDBNull(row.Item("IdAlumno"))) Then objAlumno.Id = CInt(row.Item("IdAlumno")) End If If Not (IsDBNull(row.Item("nombres"))) Then objAlumno.Nombres = row.Item("nombres") Else : objAlumno.Nombres = "" End If If Not (IsDBNull(row.Item("apellido1"))) Then objAlumno.Apellido1 = row.Item("apellido1") Else : objAlumno.Apellido1 = "" End If If Not (IsDBNull(row.Item("apellido2"))) Then objAlumno.Apellido2 = row.Item("apellido2") Else : objAlumno.Apellido2 = "" End If If Not (IsDBNull(row.Item("telefono"))) Then objAlumno.Telefono = row.Item("telefono") Else : objAlumno.Telefono = "" End If Facultad de Estudios Tecnológicos 8 If Not (IsDBNull(row.Item("email"))) Then objAlumno.Email = row.Item("email") Else : objAlumno.Email = "" End If If Not (IsDBNull(row.Item("direccion"))) Then objAlumno.Direccion = row.Item("direccion") Else : objAlumno.Direccion = "" End If If Not (IsDBNull(row.Item("edad"))) Then objAlumno.Edad = CShort(row.Item("edad")) Else : objAlumno.Edad = 0 End If Return objAlumno End Function 'Función para obtener los registros de una tabla Public Overloads Function getRegistros(ByVal tabla As String) As DataSet Dim NHConexion = New Conexion Dim ssql = "select * from " + tabla getRegistros = NHConexion.conSelect(ssql) End Function 'Función para obtener los registros de una tabla con filtro por id Public Overloads Function getRegistros(ByVal tabla As String, ByVal campofiltro As String, ByVal filtro As Integer) As DataSet Dim NHConexion = New Conexion Dim ssql = "select * from " + tabla + " where " + campofiltro + " = " + filtro getRegistros = NHConexion.conSelect(ssql) End Function 'Función para obtener los registros de una tabla con selects varios Public Overloads Function getRegistros(ByVal tipoSelect As Integer, Optional ByVal campofiltro As String = "", Optional ByVal filtro As Integer = 0) As DataSet Dim NHConexion = New Conexion Dim ssql As String = "" If tipoSelect = 1 Then ssql = "SELECT IdAlumno,nombres & ' ' & apellido1 & ' ' & apellido2 as est FROM alumno" End If getRegistros = NHConexion.conSelect(ssql) End Function End Class Ya tenemos nuestras clases, en este momento solamente cuenta con 4 clases definidas por el programador más el formulario. El primer formulario que vamos a diseñar será para agregar registros, debe quedar de la siguiente manera: Facultad de Estudios Tecnológicos 9 CONTROL Form1 TextBox1 TextBox2 TextBox3 TextBox4 TextBox5 TextBox6 TextBox7 TextBox8 TextBox9 Button1 Button2 PROPIEDAD Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text VALOR frmAgregar Registro txtIdA txtNombresA txtApellido1A txtApellido2A txtTelefonoA txtDireccionA txtEmailA txtEdadA txtGradoA btnRegistrar Registrar btnLimpiar Limpiar El código para el primer formulario es el siguiente: En el área general, vamos a crear un objeto de tipo Cdao para comunicar nuestra interfaz con la base de datos y nuestras clases: Facultad de Estudios Tecnológicos 10 Dim personas As Cdao = New Cdao Agregue un procedimiento el siguiente procedimiento: Private Sub limpiarCampos() txtIdA.Text = "" txtNombresA.Text = "" txtApellido1A.Text = "" txtApellido2A.Text = "" txtTelefonoA.Text = "" txtDireccionA.Text = "" txtEmailA.Text = "" txtEdadA.Text = "" txtGradoA.Text = "" End Sub En el evento clic de btnRegistrar, el siguiente código: Dim estudiante As Alumno = New Alumno estudiante.Id = CShort(txtIdA.Text) estudiante.Nombres = txtNombresA.Text estudiante.Apellido1 = txtApellido1A.Text estudiante.Apellido2 = txtApellido2A.Text estudiante.Telefono = txtTelefonoA.Text estudiante.Direccion = txtDireccionA.Text estudiante.Email = txtEmailA.Text estudiante.Edad = CShort(txtEdadA.Text) estudiante.Grado = txtGradoA.Text personas.AgregarRegistro(estudiante, "alumno") valores copturados desde los cuadros de texto 'le mando el objeto con los Dim respuesta As MsgBoxResult = MsgBox("Desea agregar otro registro?", MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo, "Aviso") If respuesta = MsgBoxResult.No Then Me.Close() Else limpiarCampos() End If En el evento clic de btnLimpiar agregue el siguiente código: limpiarCampos() Tenemos nuestro primer formulario, puede ejecutarlo para comprobar su funcionamiento. Agregue un nuevo formulario, el diseño se le presenta a continuación: Facultad de Estudios Tecnológicos 11 CONTROL Form2 DataGridView1 PROPIEDAD Name Text Name VALOR frmConsultar Consultar dgvAlumnos El código para este formulario es el siguiente: Agregue un método llamado CargarLista(): 'Método para cargar el lstAlumnos Public Sub CargarLista(ByVal t As String) Dim personas As Cdao = New Cdao dgvAlumnos.DataSource = Nothing dgvAlumnos.DataSource = personas.getRegistros(t) dgvAlumnos.DataMember = "miTabla" dgvAlumnos.Refresh() With (dgvAlumnos) .Columns(0).HeaderText = "Código" .Columns(1).HeaderText = "Nombres" .Columns(2).HeaderText = "Apellido 1" .Columns(3).HeaderText = "Apellido 2" .Columns(4).HeaderText = "Teléfono" .Columns(5).HeaderText = "Correo Eletrónico" .Columns(6).HeaderText = "Dirección" .Columns(7).HeaderText = "Edad" End With End Sub El código del evento Load() del presente formulario es: CargarLista("alumno") Facultad de Estudios Tecnológicos 12 Tenemos nuestro segundo formulario, puede ejecutarlo para comprobar su funcionamiento. proceda a agregar uno nuevo, el diseño se presenta a continuación: CONTROL Form3 TextBox1 TextBox2 TextBox3 TextBox4 TextBox5 TextBox6 TextBox7 TextBox8 TextBox9 Button1 Button2 Facultad de Estudios Tecnológicos PROPIEDAD Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name VALOR frmActualizar Actualizar txtIdA txtNombresA txtApellido1A txtApellido2A txtTelefonoA txtDireccionA txtEmailA txtEdadA txtGradoA btnConsultar Consultar btnActualizar 13 ComboBox1 Text Name Actualizar cboAlumnos El código para este formulario es el siguiente: Primero agregue un método llamado CargarNombres(): 'Método para llenar ComboBox Sub CargarNombres() Dim personas As Cdao = New Cdao Dim tabla As DataTable = New DataTable tabla = personas.getRegistros(1).Tables(0) 'Obtener un DataTable cboAlumnos.DataSource = tabla cboAlumnos.ValueMember = tabla.Columns(0).Caption.ToString() 'Obteniendo el campo desde un DataColumn cboAlumnos.DisplayMember = tabla.Columns("est").Caption.ToString() 'Obteniendo el campo desde un DataColumn End Sub El código para el evento Load del formulario es el siguiente: CargarNombres() En el evento clic de btnConsultar, el código es el siguiente: Dim estudiante As Alumno = New Alumno Dim personas As Cdao = New Cdao estudiante = personas.getElemento("alumno", "IdAlumno", CInt(cboAlumnos.SelectedValue)) txtIdA.Text = estudiante.Id txtNombresA.Text = estudiante.Nombres txtApellido1A.Text = estudiante.Apellido1 txtApellido2A.Text = estudiante.Apellido2 txtTelefonoA.Text = estudiante.Telefono txtDireccionA.Text = estudiante.Direccion txtEmailA.Text = estudiante.Email txtEdadA.Text = estudiante.Edad En el evento clic de btnActualizar, el código es el siguiente: Dim estudiante As Alumno = New Alumno Dim personas As Cdao = New Cdao estudiante.Id = CShort(txtIdA.Text) estudiante.Nombres = txtNombresA.Text estudiante.Apellido1 = txtApellido1A.Text estudiante.Apellido2 = txtApellido2A.Text estudiante.Telefono = txtTelefonoA.Text estudiante.Direccion = txtDireccionA.Text estudiante.Email = txtEmailA.Text estudiante.Edad = CShort(txtEdadA.Text) estudiante.Grado = txtGradoA.Text personas.Modificar(estudiante, "alumno") 'le mando el objeto con los valores copturados desde los cuadros de texto CargarNombres() 'Cargar ComboBox con datos actualizados Facultad de Estudios Tecnológicos 14 Tenemos nuestro tercer formulario, puede ejecutarlo para comprobar su funcionamiento. Proceda a agregar uno nuevo, el diseño se presenta a continuación: CONTROL Form4 TextBox1 TextBox2 TextBox3 TextBox4 TextBox5 TextBox6 TextBox7 TextBox8 TextBox9 Button1 Facultad de Estudios Tecnológicos PROPIEDAD Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text VALOR frmEliminar Eliminar txtIdA txtNombresA txtApellido1A txtApellido2A txtTelefonoA txtDireccionA txtEmailA txtEdadA txtGradoA btnConsultar Consultar 15 Button2 ComboBox1 Name Text Name btnEliminar Eliminar cboAlumnos Como pueda darse cuenta en el diseño del formulario, se le hace énfasis a que la opción de eliminar no siempre es recomendada, el código para este formulario es el siguiente: Primero agregue un método llamado CargarNombres(): 'Método para llenar ComboBox Sub CargarNombres() Dim personas As Cdao = New Cdao Dim tabla As DataTable = New DataTable tabla = personas.getRegistros(1).Tables(0) 'Obtener un DataTable cboAlumnos.DataSource = tabla cboAlumnos.ValueMember = tabla.Columns(0).Caption.ToString() 'Obteniendo el campo desde un DataColumn cboAlumnos.DisplayMember = tabla.Columns("est").Caption.ToString() 'Obteniendo el campo desde un DataColumn End Sub Agregue el método limpiarCampos(): Private Sub limpiarCampos() txtIdA.Text = "" txtNombresA.Text = "" txtApellido1A.Text = "" txtApellido2A.Text = "" txtTelefonoA.Text = "" txtDireccionA.Text = "" txtEmailA.Text = "" txtEdadA.Text = "" txtGradoA.Text = "" End Sub El código para el evento Load del formulario es el siguiente: CargarNombres() En el evento clic de btnConsultar, el código es el siguiente: Dim estudiante As Alumno = New Alumno Dim personas As Cdao = New Cdao estudiante = personas.getElemento("alumno", "IdAlumno", CInt(cboAlumnos.SelectedValue)) txtIdA.Text = estudiante.Id txtNombresA.Text = estudiante.Nombres txtApellido1A.Text = estudiante.Apellido1 txtApellido2A.Text = estudiante.Apellido2 txtTelefonoA.Text = estudiante.Telefono txtDireccionA.Text = estudiante.Direccion txtEmailA.Text = estudiante.Email txtEdadA.Text = estudiante.Edad Facultad de Estudios Tecnológicos 16 En el evento clic de btnEliminar, el código es el siguiente: Dim personas As Cdao = New Cdao 'Solamente necesito el id, invoco a otro constructor Dim estudiante As Alumno = New Alumno(CInt(txtIdA.Text)) Dim respuesta As MsgBoxResult = MsgBox("Seguro que desea eliminar el registro de: " + txtNombresA.Text + " " + txtApellido1A.Text + " " + txtApellido2A.Text, MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo, "Eliminar Registro") If respuesta = MsgBoxResult.Yes Then personas.Borrar(estudiante, "alumno") 'le mando el objeto con los valores copturados desde los cuadros de texto MessageBox.Show("Registro Eliminado") limpiarCampos() CargarNombres() 'Cargar ComboBox con datos actualizados End If Tenemos nuestro cuarto formulario, puede ejecutarlo para comprobar su funcionamiento. El siguiente pase consiste en crear un formulario MDI el cual va a invocar a los 4 formularios que ya hemos creado. Antes de proceder a la creación de un MDI asegúrese que todos los formularios anteriores se ejecutan de forma correcta, sin ningún tipo de error. Agregue un nuevo formulario, en lugar de seleccionar Window Form, va a seleccionar la opción MDI Parent Form y su nombre será frmPrincipal: Facultad de Estudios Tecnológicos 17 La aplicación va a generar un formulario MDI junto con un menú y una barra de herramientas, quedará de la siguiente forma: Vamos a utilizar simplemente la barra de menú, así que elimine la barra de herramientas, cualquier duda en este punto consulte a su instructor. La barra de menú debe quedarle de la siguiente manera: Facultad de Estudios Tecnológicos 18 Modifique las propiedades del proyecto para que el formulario de inicio sea el formulario MDI, luego presione F5, al intentar compilar va a generar el siguiente error: Y el listado de errores será parecido a lo siguiente: La razón de este error es porque se ha eliminado la barra de herramientas que venía por defecto y también se han eliminado algunas opciones de la barra de menú, haga doble clic en cada uno de los errores listados para tener acceso a los bloques de código como el siguiente: Facultad de Estudios Tecnológicos 19 Simplemente elimine los bloques de código, tenga mucho cuidado en este punto, recuerde, cualquier duda consulte a su instructor. Una vez superado este inconveniente, ejecute el proyecto y en tiempo de ejecución va a tener el siguiente formulario: Por último vamos a crear la programación para cada una de las opciones del menú: Doble clic sobre la opción Salir del menú Archivo, el código es el siguiente: End Doble clic sobre la opción Consultar del menú Transacciones, el código es el siguiente: frmConsultar.MdiParent = Me frmConsultar.Show() Doble clic sobre la opción Agregar del menú Transacciones, el código es el siguiente: frmAgregar.MdiParent = Me frmAgregar.Show() Doble clic sobre la opción Actualizar del menú Transacciones, el código es el siguiente: frmActualizar.MdiParent = Me frmActualizar.Show() Facultad de Estudios Tecnológicos 20 Doble clic sobre la opción Eliminar del menú Transacciones, el código es el siguiente: frmEliminar.MdiParent = Me frmEliminar.Show() Presione F5 y deberá tener una aplicación MDI que ejecuta las operaciones básicas en una base de datos: Facultad de Estudios Tecnológicos 21 INVESTIGACIÓN COMPLEMENTARIA Investigue sobre cómo unir tres tablas relacionadas en un objeto DataSet implementando el objeto DataRelation, así como el funcionamiento de los métodos GetChildRows y GetParentRow. ANÁLISIS DE RESULTADOS Como puede darse cuenta en el formulario “Modificar”, aparece el cuadro de texto “Grado” que no muestra información, realice las modificaciones necesarias para que en lugar de un cuadro de texto sea un ComboBox el que despliegue la información, y que además cuando se haga clic en el botón Actualizar se agregue un nuevo registro a la tabla alumnogrado. Realice las modificaciones necesarias para el siguiente formulario, el cual permite consultar los grados cursados por un estudiante seleccionado. Tome en cuenta que necesita de una relación de 3 tablas, consulte el diagrama ER presentado al principio. Deberá implementar objetos DataRelations, así como los métodos GetChildRows y GetParentRow. Facultad de Estudios Tecnológicos 22