sábado, 9 de abril de 2011

Solución Examen Parcial (II) Miércoles 06 Abril 2011 - Matutino

Enunciado:
1) Crear una base de datos en SQL Server 2005 llamada Examen2
2) Crear una tabla llamada notas en la base Examen2 que tenga la siguiente estructura:

Campo Tipo
Carnet char(7)
Nombre varchar(50)
Asignatura varchar(50)
NotaPP int
NotaSP int
NotaTA int
NotaEF int
NotaFinal real

3) Crear un programa en visual basic 2008 que permita ingresar datos a
la tabla Notas.

4) La nota final se calculará en base a los parámetros de UCYT para los
cursos regulares.

5) El programa también deberá poder consultar las notas de un estudiante
y mostrar su estado (Aprobado o REPROBADo) en la barra de título

6) Se debe validar que las notas no sean menor que 0 ni mayor que 100
Si ingresara un dato en ese rango debe aparecer un mensaje de error
correspondiente.

SOLUCION:

Hay que diseñar un formulario para obtener o mostrar los datos al usuario. El diseño era parte del examen. Todo programador deber diseñar su propio formulario de acuerdo a su creatividad e ingenio. Una solución sencilla podría ser la siguiente:


El proyecto a realizar consta de un formulario.  Lo primero que hay que hacer es colocar al inicio del formulario dos líneas que nos permitirán tener acceso a la librería de datos ADO .NET para SQL Server.

Imports System.Data
Imports System.Data.SqlClient

Estas líneas se deben colocar al inicio del formulario, antes de la declaración de clase del formulario (Public Class Form1)

Para que nuestro sistema conecte al servidor SQL Server donde creamos la base de datos Examen2 necesitamos crear una cadena de conexión.  Es importante en este paso saber que usaremos la cadena de conexión por lo menos en dos puntos del programa y dos procedimientos diferentes, entonces para evitar estar digitando la cadena varias veces, se puede definir después de la declaración de la clase del formulario y antes de cualquier procedimiento.

Public Class Form1
    'Declararemos la conexión aquí para que esté visible a todos los procedimientos
    Dim cn As New SqlConnection("Data source=3PHPB01\SQLEXPRESS;Initial Catalog=Examen2;Integrated Security=true")


El botón Grabar (llamado btnGrabar) es el que hará el proceso de insertar el nuevo registro en la base de datos

Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click
        'Hay que validar las notas
        If Val(txtNotaPP.Text) < 0 Or Val(txtNotaPP.Text) > 100 Then
            MessageBox.Show("La nota del primer parcial no esta en el rango establecido...por favor revise")
            Exit Sub
        End If

        If Val(txtNotaSP.Text) < 0 Or Val(txtNotaSP.Text) > 100 Then
            MessageBox.Show("La nota del segundo parcial no esta en el rango establecido...por favor revise")
            Exit Sub
        End If

        If Val(txtNotaTA.Text) < 0 Or Val(txtNotaTA.Text) > 100 Then
            MessageBox.Show("La nota del trabajo acumulado no esta en el rango establecido...por favor revise")
            Exit Sub
        End If

        If Val(txtNotaEF.Text) < 0 Or Val(txtNotaEF.Text) > 100 Then
            MessageBox.Show("La nota del exámen final no esta en el rango establecido...por favor revise")
            Exit Sub
        End If

        'Calcular la nota final usando la función de usuario CalcularNotaFinal() y colocar el resultado
        'en la caja de texto.
        txtNotaFinal.Text = CalcularNotaFinal()

        'Si todo esta bien se sigue con la grabación de los datos
        Dim sql As String
        sql = "INSERT INTO Notas "
        sql &= "(Carnet, Nombre, Asignatura, NotaPP, NotaSP, NotaTA, NotaEF, NotaFinal)"
        sql &= "VALUES(@Carnet, @Nombre, @Asignatura, @NotaPP, @NotaSP, @NotaTA, @NotaEF, @NotaFinal)"

        Dim cmd As New SqlCommand(sql, cn)
        cmd.Parameters.AddWithValue("@Carnet", txtCarnet.Text)
        cmd.Parameters.AddWithValue("@Nombre", txtNombre.Text)
        cmd.Parameters.AddWithValue("@Asignatura", txtAsignatura.Text)
        cmd.Parameters.AddWithValue("@NotaPP", Val(txtNotaPP.Text))
        cmd.Parameters.AddWithValue("@NotaSP", Val(txtNotaSP.Text))
        cmd.Parameters.AddWithValue("@NotaTA", Val(txtNotaTA.Text))
        cmd.Parameters.AddWithValue("@NotaEF", Val(txtNotaEF.Text))
        cmd.Parameters.AddWithValue("@NotaFinal", CalcularNotaFinal())
        cn.Open()
        Dim i As Integer = cmd.ExecuteNonQuery()
        If i > 0 Then
            MessageBox.Show("Registro grabado...")
        Else
            MessageBox.Show("No se pudo guardar el registro...")
        End If
        cn.Close()
    End Sub

Comentando un poco el código, hemos hecho inicialmente la validación de las cajas de texto que corresponden a las notas para garantizar que estas no sean ni menor que 0 ni mayor que 100. La validación se puede hacer de diferentes maneras, la que se presenta no es la mejor pero la más simple. Nótese que el código se puede copiar cuatro veces solo cambiando el control de texto correspondiente. La función VAL convierte una expresión en un número. Se recomienda usar la funciones Convert (Ej. Convert.ToInt32(txtNotaPP.Text))

Si revisan el código, hemos utilizado una función llamada CalcularNotaFinal que calcula la nota final del estudiante en base a lo que hemos digitado en las cajas de texto. El uso de funciones simplifican el código que se escribe y lo deja más legible. La función es la siguiente:

Private Function CalcularNotaFinal() As Integer
        Dim npp, nsp, nta, nef As Integer
        npp = Val(txtNotaPP.Text)
        nsp = Val(txtNotaSP.Text)
        nta = Val(txtNotaTA.Text)
        nef = Val(txtNotaEF.Text)
        Dim notafinal As Integer
        notafinal = npp * 0.2 + nsp * 0.2 + nta * 0.2 + nef * 0.4
        Return notafinal
    End Function

Finalmente en el botón con los tres puntos (btnBuscar) hacemos la búsqueda del carnet del estudiante y mostramos los datos. Se evalúa la nota final y se coloca en la barra de titulo el estado del estudiante (APROBADO o REPROBADO)

  Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click
        'Validemos que ya hemos colocado un código de carnet
        If txtCarnet.Text = "" Then
            MessageBox.Show("No se ha digitado el código de carnet")
            Exit Sub
        End If

        Dim cmd As New SqlCommand("SELECT * FROM Notas WHERE Carnet = @Carnet", cn)
        cmd.Parameters.AddWithValue("@Carnet", txtCarnet.Text)
        cn.Open()
        Dim dr As SqlDataReader = cmd.ExecuteReader()
        If dr.Read() Then
            txtNombre.Text = dr("Nombre")
            txtAsignatura.Text = dr("Asignatura")
            txtNotaPP.Text = dr("NotaPP")
            txtNotaSP.Text = dr("NotaSP")
            txtNotaTA.Text = dr("NotaTA")
            txtNotaEF.Text = dr("NotaEF")
            txtNotaFinal.Text = dr("NotaFinal")

            'Colocar el estado de la nota en la barra de titulo
            If Val(txtNotaFinal.Text) >= 70 Then
                Me.Text = "Alumno : " & txtNombre.Text & " esta APROBADO "
            Else
                Me.Text = "Alumno : " & txtNombre.Text & " esta REPROBADO "
            End If
        Else
            MessageBox.Show("El carnet " & txtCarnet.Text & " no tiene notas registradas")
        End If
        cn.Close()
    End Sub

Y eso es todo. El programa completo lo pueden bajar en el siguiente enlace para que lo tengan. Es probable que lo usemos en clase.
Proyecto Completo en VB 2008
Script para crear la base de datos

El script para crear la base de datos Ejercicio2 es un archivo con las instrucciones para crear la BD.  Solo se requiere abrir en el SQL Management Studio (consola de SQL Server) y ejecutarlo.  No se preocupe si la base no aparecer, solo vaya al objeto Databases y con el botón derecho seleccione Refresh.

Hasta pronto.

No hay comentarios:

Publicar un comentario