A continuación se presenta la implementación del módulo de consulta de resultados académicos:
Funcionalidades:
- Estadísticas generales de exámenes de toda la institución
- Información de exámenes por clase
Implementación:
- 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());
}