Sistema de Gestión de Estudiantes C# - Consulta de Resultados Académicos (Resumen y Estadísticas)

A continuación se presenta la implementación del módulo de consulta de resultados académicos:

Funcionalidades:

  1. Estadísticas generales de exámenes de toda la institución
  2. Información de exámenes por clase

Implementación:

  1. Código de la capa de acceso a datos (DAL)

En el sevricio ScoreListService se agregaron los siguientes métodos:

namespace DAL
{
    public class ResultadosAcademicosService
    {
        #region Consulta de resultados por clase

        /// <summary>
        /// Obtiene la lista de resultados académicos según la clase especificada
        /// </summary>
        <param name="nombreClase">Nombre de la clase</param>
        /// <returns></returns>
        public List<EstudianteExtendido> ObtenerResultadosPorClase(string nombreClase)
        {
            string consulta = "select Estudiantes.IdEstudiante,NombreEstudiante,NombreClase,NotaCSharp,NotaBaseDatos from Estudiantes ";
            consulta += "inner join ClaseEstudiante on ClaseEstudiante.IdClase=Estudiantes.IdClase ";
            consulta += " inner join ResultadosAcademicos on ResultadosAcademicos.IdEstudiante=Estudiantes.IdEstudiante";
            if (nombreClase != null && nombreClase.Length != 0)
            {
                consulta += string.Format(" where NombreClase='{0}'", nombreClase);
            }
            SqlDataReader lectorDatos = SQLHelper.ObtenerLector(consulta);
            List<EstudianteExtendido> listaResultados = new List<EstudianteExtendido>();
            while (lectorDatos.Read())
            {
                listaResultados.Add(new EstudianteExtendido()
                {
                    IdEstudiante = Convert.ToInt32(lectorDatos["IdEstudiante"]),
                    NombreEstudiante = lectorDatos["NombreEstudiante"].ToString(),
                    NombreClase = lectorDatos["NombreClase"].ToString(),
                    NotaCSharp = Convert.ToInt32(lectorDatos["NotaCSharp"]),
                    NotaBaseDatos = Convert.ToInt32(lectorDatos["NotaBaseDatos"])
                });
            }
            lectorDatos.Close();
            return listaResultados;
        }

        #endregion

        #region Estadísticas generales de resultados académicos

        /// <summary>
        /// Obtiene información estadística de todos los exámenes
        /// </summary>
        /// <returns></returns>
        public Dictionary<string, string> ObtenerEstadisticasGenerales()
        {
            string consulta = "select totalEstudiantes=count(*),promedioCSharp=avg(NotaCSharp),promedioBD=avg(NotaBaseDatos) from ResultadosAcademicos;";
            consulta += "select ausentes=count(*) from Estudiantes where IdEstudiante not in(select IdEstudiante from ResultadosAcademicos)";
            Dictionary<string, string> estadisticas = null;
            SqlDataReader lectorDatos = SQLHelper.ObtenerLector(consulta);
            if (lectorDatos.Read())
            {
                estadisticas = new Dictionary<string, string>();
                estadisticas.Add("totalEstudiantes", lectorDatos["totalEstudiantes"].ToString());
                estadisticas.Add("promedioCSharp", lectorDatos["promedioCSharp"].ToString());
                estadisticas.Add("promedioBD", lectorDatos["promedioBD"].ToString());
            }
            if (lectorDatos.NextResult())
            {
                if (lectorDatos.Read())
                {
                    estadisticas.Add("totalAusentes", lectorDatos["ausentes"].ToString());
                }
            }
            lectorDatos.Close();
            return estadisticas;
        }

        /// <summary>
        /// Obtiene la lista de estudiantes que no presentaron los exámenes
        /// </summary>
        /// <returns></returns>
        public List<string> ObtenerListaAusentes()
        {
            string consulta = "select NombreEstudiante from Estudiantes where IdEstudiante not in(select IdEstudiante from ResultadosAcademicos)";
            SqlDataReader lectorDatos = SQLHelper.ObtenerLector(consulta);
            List<string> listaAusentes = new List<string>();
            while (lectorDatos.Read())
            {
                listaAusentes.Add(lectorDatos["NombreEstudiante"].ToString());
            }
            lectorDatos.Close();
            return listaAusentes;
        }

        #endregion

        #region Estadísticas por clase

        public Dictionary<string, string> ObtenerEstadisticasPorClase(string idClase)
        {
            string consulta = "select totalEstudiantes=count(*),promedioCSharp=avg(NotaCSharp),promedioBD=avg(NotaBaseDatos) from ResultadosAcademicos ";
            consulta += "inner join Estudiantes on Estudiantes.IdEstudiante=ResultadosAcademicos.IdEstudiante where IdClase={0};";
            consulta += "select ausentes=count(*) from Estudiantes where IdEstudiante not in";
            consulta += "(select IdEstudiante from ResultadosAcademicos) and IdClase={1}";
            consulta = string.Format(consulta, idClase, idClase);
            SqlDataReader lectorDatos = SQLHelper.ObtenerLector(consulta);
            Dictionary<string, string> estadisticas = null;
            if (lectorDatos.Read())
            {
                estadisticas = new Dictionary<string, string>();
                estadisticas.Add("totalEstudiantes", lectorDatos["totalEstudiantes"].ToString());
                estadisticas.Add("promedioCSharp", lectorDatos["promedioCSharp"].ToString());
                estadisticas.Add("promedioBD", lectorDatos["promedioBD"].ToString());
            }
            if (lectorDatos.NextResult())
            {
                if (lectorDatos.Read())
                {
                    estadisticas.Add("totalAusentes", lectorDatos["ausentes"].ToString());
                }
            }
            lectorDatos.Close();
            return estadisticas;
        }
        
        /// <summary>
        /// Obtiene la lista de estudiantes ausentes en una clase específica
        /// </summary>
        /// <returns></returns>
        public List<string> ObtenerAusentesPorClase(string idClase)
        {
            string consulta = "select NombreEstudiante from Estudiantes where IdEstudiante not in ";
            consulta += "(select IdEstudiante from ResultadosAcademicos) and IdClase={0}";
            consulta = string.Format(consulta, idClase);
            SqlDataReader lectorDatos = SQLHelper.ObtenerLector(consulta);
            List<string> listaAusentes = new List<string>();
            while (lectorDatos.Read())
            {
                listaAusentes.Add(lectorDatos["NombreEstudiante"].ToString());
            }
            lectorDatos.Close();
            return listaAusentes;
        }

        #endregion

        #region  Consulta utilizando DataSet

        /// <summary>
        /// Obtiene todos los resultados académicos almacenados en un DataSet
        /// </summary>
        /// <returns></returns>
        public DataSet ObtenerTodosLosResultados()
        {
            string consulta = "select Estudiantes.IdEstudiante,NombreEstudiante,NombreClase,NotaCSharp,NotaBaseDatos";
            consulta += " from Estudiantes ";
            consulta += " inner join ClaseEstudiante on ClaseEstudiante.IdClase=Estudiantes.IdClase";
            consulta += " inner join ResultadosAcademicos on ResultadosAcademicos.IdEstudiante=Estudiantes.IdEstudiante";
            return SQLHelper.ObtenerDataSet(consulta);
        }

        #endregion

    }

2, Interfaz de usuario:

Código para estadísticas generales:

        //Estadísticas generales de resultados académicos
        private void btnEstadisticas_Click(object sender, EventArgs e)
        {
            this.gbEstadisticas.Text = "Estadísticas Generales de Resultados";
            //Consultar lista de resultados
            this.dgvResultados.AutoGenerateColumns = false;
            this.dgvResultados.DataSource = servicioResultados.ObtenerResultadosPorClase("");
            //Consultar y mostrar estadísticas
            Dictionary<string, string> diccionario = servicioResultados.ObtenerEstadisticasGenerales();
            this.lblTotalPresentados.Text = diccionario["totalEstudiantes"];
            this.lblPromedioBD.Text = diccionario["promedioBD"];
            this.lblPromedioCSharp.Text = diccionario["promedioCSharp"];
            this.lblTotalAusentes.Text = diccionario["totalAusentes"];
            //Mostrar lista de ausentes
            List<string> listaAusentes = servicioResultados.ObtenerListaAusentes();
            this.lstAusentes.Items.Clear();
            this.lstAusentes.Items.AddRange(listaAusentes.ToArray());
        }

Código para estadísticas por clase:

        //Consulta por clase      
        private void cboClase_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.cboClase.SelectedIndex == -1)
            {
                MessageBox.Show("Por favor seleccione una clase para consultar", "Información de Consulta");
                return;
            }
            this.dgvResultados.AutoGenerateColumns = false;
            this.dgvResultados.DataSource = servicioResultados.ObtenerResultadosPorClase(this.cboClase.Text.Trim());
            //Sincronizar visualización de estadísticas por clase
            this.gbEstadisticas.Text = "[" + this.cboClase.Text.Trim() + "] - Estadísticas de Resultados";
            Dictionary<string, string> diccionario =
                servicioResultados.ObtenerEstadisticasPorClase(this.cboClase.SelectedValue.ToString());
            this.lblTotalPresentados.Text = diccionario["totalEstudiantes"];
            this.lblPromedioCSharp.Text = diccionario["promedioCSharp"];
            this.lblPromedioBD.Text = diccionario["promedioBD"];
            this.lblTotalAusentes.Text = diccionario["totalAusentes"];
            //Mostrar lista de ausentes
            List<string> listaAusentes =
                servicioResultados.ObtenerAusentesPorClase(this.cboClase.SelectedValue.ToString());
            this.lstAusentes.Items.Clear();
            if (listaAusentes.Count == 0) this.lstAusentes.Items.Add("No hay ausentes");
            else lstAusentes.Items.AddRange(listaAusentes.ToArray());
        }

Etiquetas: C# Sistema de Gestión Bases de Datos SQL Interfaz de Usuario Estadísticas Académicas

Publicado el 6-13 03:28