Exemple #1
0
        private void btnCalcular_Click(object sender, EventArgs e)
        {
            a = float.Parse(txtA.Text);
            if (a == 0)
            {
                TablaGrafico.Refresh();
                Ejes();

                Pen      ObjPen = new Pen(Color.Blue);
                PointF[] P      = new PointF[1081];
                Funcion(P);
                mGraph.DrawCurve(ObjPen, P);
                lblMensaje.Text = "Grafica el eje X";
            }
            else
            {
                if (a > 0)
                {
                    TablaGrafico.Refresh();
                    Ejes();

                    Pen      ObjPen = new Pen(Color.Blue);
                    PointF[] P      = new PointF[1081];
                    Funcion(P);
                    mGraph.DrawCurve(ObjPen, P);
                    lblMensaje.Text = "Gráfica Real";
                }
                else
                {
                    TablaGrafico.Refresh();
                    Ejes();

                    Pen      ObjPen = new Pen(Color.Blue);
                    PointF[] P      = new PointF[1081];
                    Funcion(P);
                    mGraph.DrawCurve(ObjPen, P);
                    lblMensaje.Text = "Gráfica Ivertida";
                }
            }
        }
        /// <summary>
        /// Generars the datos grafico.
        /// </summary>
        private void GenerarDatosGrafico()
        {
            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();

            var fechaMin =
               from p in listaReporte
               group p by p.alumno into g
               select new { Alumno = g.Key, Fecha = g.Min(p => p.fecha) };

            var fechaMax =
               from p in listaReporte
               group p by p.alumno into g
               select new { Alumno = g.Key, Fecha = g.Max(p => p.fecha) };
            //TablaGrafico.Add("- Periodo de notas: " + fechaMin.First().Fecha.ToShortDateString() + " - " + fechaMax.First().Fecha.ToShortDateString());

            tabla3.titulo = "Periodo Analizado " + fechaMin.First().Fecha.ToShortDateString() + " - " + fechaMax.First().Fecha.ToShortDateString();

            var cantAlumnos =
                from p in listaReporte
                group p by p.alumno into g
                select new { Alumno = g.Key, Cantidad = g.Count() };

            //TablaGrafico.Add("- Cantidad de Alumnos analiza2: " + cantAlumnos.Count().ToString());
            encabezado3.Add("Cantidad de Alumnos");
            fila3.Add(cantAlumnos.Count().ToString());

            //TablaGrafico.Add("- Cantidad de Calificaciones: " + listaReporte.Count.ToString());
            encabezado3.Add("Cantidad de Calificaciones");
            fila3.Add(listaReporte.Count().ToString());

            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            TablaGrafico tabla2 = new TablaGrafico();
            tabla2.listaCuerpo = new List<List<string>>();
            List<string> encabezado2 = new List<string>();
            List<List<string>> filasTabla2 = new List<List<string>>();
            List<string> fila2 = new List<string>();

            //TablaGrafico.Add("- Desviacion Estandar por materia: ");
            tabla2.titulo = "Desviación Estandar por Asignatura";
            encabezado2.Add("Asignatura");
            encabezado2.Add("Promedio");
            encabezado2.Add("Desviación Estándar");

            double sumaNotas, promedio, desvStd, dif, cociente, sumaDifCuad = 0;

            var serie = new List<RptCalificacionesAlumnoPeriodo>();
            foreach (var item in listaAsignatura)
            {
                promedio = 0;
                cociente = 0;
                desvStd = 0;
                sumaNotas = 0;
                dif = 0;
                sumaDifCuad = 0;

                var listaParcial = listaReporte.FindAll(p => p.asignatura == item.nombre);
                if (listaParcial.Count > 0)
                {
                    foreach (var nota in listaParcial)
                    {
                        sumaNotas += Convert.ToInt16(nota.calificacion);
                    }
                    promedio = sumaNotas / listaParcial.Count;
                    foreach (var nota in listaParcial)
                    {
                        dif = (Convert.ToInt32(nota.calificacion) - promedio);
                        sumaDifCuad += Math.Pow(dif, 2);
                    }
                    // Revisar la formula de desviacion standard
                    //cociente = (sumaDifCuad / (listaParcial.Count-1));
                    cociente = (sumaDifCuad / (listaParcial.Count));
                    desvStd = Math.Sqrt(cociente);
                    //TablaGrafico.Add(item.nombre + " Promedio: " + promedio.ToString("#.##") + " , Desviacion Standard: " + desvStd.ToString("#.##"));
                    fila2 = new List<string>();
                    fila2.Add(item.nombre);
                    fila2.Add(promedio.ToString("#.##"));
                    fila2.Add(desvStd.ToString("#.##"));
                    filasTabla2.Add(fila2);
                }
            }
            tabla2.listaEncabezados = encabezado2;
            tabla2.listaCuerpo = filasTabla2;
            TablaGrafico.Add(tabla2);

            TablaGrafico tabla4 = new TablaGrafico();
            tabla4.listaCuerpo = new List<List<string>>();
            List<string> encabezado4 = new List<string>();
            List<List<string>> filasTabla4 = new List<List<string>>();
            List<string> fila4 = new List<string>();

            if (Convert.ToInt32(ddlAsignatura.SelectedIndex) < 0)
            {
                var topPromedio =
                   (from p in listaReporte
                    group p by p.asignatura into g
                    orderby g.Average(p => Convert.ToInt32(p.calificacion)) descending
                    select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToInt32(p.calificacion)), Cantidad = g.Count() }).Distinct().Take(3);

                if (topPromedio.Count() > 1)
                {
                    //TablaGrafico.Add("- Top 3 Materias con mejor desempeño:");
                    tabla4.titulo = "Top Asignaturas con mejor desempeño";
                    encabezado4.Add("Asignatura");
                    encabezado4.Add("Promedio");
                    encabezado4.Add("Cantidad de Evaluaciones");

                    tabla4.listaEncabezados = encabezado4;

                    foreach (var item in topPromedio)
                    {
                        //TablaGrafico.Add(item.Asignatura + " - Promedio: " + item.Promedio.ToString("#.##") + " - Cantidad de Evaluaciones: " + item.Cantidad.ToString());
                        fila4 = new List<string>();
                        fila4.Add(item.Asignatura);
                        fila4.Add(item.Promedio.ToString("#.##"));
                        fila4.Add(item.Cantidad.ToString());
                        filasTabla4.Add(fila4);
                    }
                    tabla4.listaEncabezados = encabezado4;
                    tabla4.listaCuerpo = filasTabla4;
                    TablaGrafico.Add(tabla4);
                }

                var worstPromedio =
                   (from p in listaReporte
                    group p by p.asignatura into g
                    orderby g.Average(p => Convert.ToInt32(p.calificacion)) ascending
                    select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToInt32(p.calificacion)), Cantidad = g.Count() }).Distinct().Take(3);

                if (worstPromedio.Count() > 1)
                {
                    TablaGrafico tabla5 = new TablaGrafico();
                    tabla5.listaCuerpo = new List<List<string>>();
                    List<string> encabezado5 = new List<string>();
                    List<List<string>> filasTabla5 = new List<List<string>>();
                    List<string> fila5 = new List<string>();

                    tabla5.titulo = "Top Asignaturas con bajo desempeño";
                    encabezado5.Add("Asignatura");
                    encabezado5.Add("Promedio");
                    encabezado5.Add("Cantidad de Evaluaciones");
                    //TablaGrafico.Add("- Top 3 Materias con bajo desempeño:");
                    foreach (var item in worstPromedio)
                    {
                        //TablaGrafico.Add(item.Asignatura + " - Promedio: " + item.Promedio.ToString("#.##") + " - Cantidad de Evaluaciones: " + item.Cantidad.ToString());
                        fila5 = new List<string>();
                        fila5.Add(item.Asignatura);
                        fila5.Add(item.Promedio.ToString("#.##"));
                        fila5.Add(item.Cantidad.ToString());
                        filasTabla5.Add(fila5);
                    }
                    tabla5.listaEncabezados = encabezado5;
                    tabla5.listaCuerpo = filasTabla5;
                    TablaGrafico.Add(tabla5);
                }
            }

            if (Convert.ToInt32(ddlAlumno.SelectedValue) < 0)
            {
                var worstAlumnos =
                   (from p in listaReporte
                    group p by p.alumno into g
                    orderby g.Average(p => Convert.ToInt32(p.calificacion)) ascending
                    select new { Alumno = g.Key, Promedio = g.Average(p => Convert.ToInt32(p.calificacion)) }).Distinct().Take(3);

                if (worstAlumnos.Count() > 1)
                {
                    TablaGrafico tabla6 = new TablaGrafico();
                    tabla6.listaCuerpo = new List<List<string>>();
                    List<string> encabezado6 = new List<string>();
                    List<List<string>> filasTabla6 = new List<List<string>>();
                    List<string> fila6 = new List<string>();

                    tabla6.titulo = "Top Alumnos a observar";
                    encabezado6.Add("Alumno");
                    encabezado6.Add("Promedio General");
                    //TablaGrafico.Add("- Top 3 de Alumnos a observar:");
                    foreach (var item in worstAlumnos)
                    {
                        //TablaGrafico.Add(item.Alumno + " - Promedio General: " + item.Promedio.ToString("#.##"));
                        fila6 = new List<string>();
                        fila6.Add(item.Alumno);
                        fila6.Add(item.Promedio.ToString("#.##"));
                        filasTabla6.Add(fila6);
                    }
                    tabla6.listaEncabezados = encabezado6;
                    tabla6.listaCuerpo = filasTabla6;
                    TablaGrafico.Add(tabla6);
                }
            }

            if (Convert.ToInt32(ddlAlumno.SelectedValue) < 0)
            {
                var worstAlumnos =
                   (from p in listaReporte
                    group p by p.alumno into g
                    orderby g.Average(p => Convert.ToInt32(p.calificacion)) descending
                    select new { Alumno = g.Key, Promedio = g.Average(p => Convert.ToInt32(p.calificacion)) }).Distinct().Take(3);

                if (worstAlumnos.Count() > 1)
                {
                    TablaGrafico tabla7 = new TablaGrafico();
                    tabla7.listaCuerpo = new List<List<string>>();
                    List<string> encabezado7 = new List<string>();
                    List<List<string>> filasTabla7 = new List<List<string>>();
                    List<string> fila7 = new List<string>();

                    tabla7.titulo = "Top Alumnos con mejores Promedios";
                    encabezado7.Add("Alumno");
                    encabezado7.Add("Promedio General");

                    //TablaGrafico.Add("- Top 3 de Alumnos con mejores notas:");
                    foreach (var item in worstAlumnos)
                    {
                        //TablaGrafico.Add(item.Alumno + " - Promedio General: " + item.Promedio.ToString("#.##"));
                        fila7 = new List<string>();
                        fila7.Add(item.Alumno);
                        fila7.Add(item.Promedio.ToString("#.##"));
                        filasTabla7.Add(fila7);
                    }
                    tabla7.listaEncabezados = encabezado7;
                    tabla7.listaCuerpo = filasTabla7;
                    TablaGrafico.Add(tabla7);
                }
            }
        }
        /// <summary>
        /// Exportars the informe.
        /// </summary>
        private void ExportarInforme()
        {
            List<TablaGrafico> listaTabla = new List<TablaGrafico>();
            TablaGrafico miItem = new TablaGrafico();
            List<miRespuesta> miListaRespuesta = new List<miRespuesta>();
            string TmpPath = string.Empty;
            string nombrePNG = string.Empty;
            StringBuilder filtros = new StringBuilder();

            filtros.AppendLine("Curso: " + encuestaSesion.curso.curso.nombre);
            if (!string.IsNullOrEmpty(encuestaSesion.asignatura.asignatura.nombre))
                filtros.AppendLine("Asignatura: " + encuestaSesion.asignatura.asignatura.nombre);

            filtros.AppendLine("Fecha de Lanzamiento: " + Convert.ToDateTime(encuestaSesion.fechaLanzamiento).ToShortDateString());

            if (encuestaSesion.fechaVencimiento.HasValue)
                filtros.AppendLine("Fecha de Expiración: " + Convert.ToDateTime(encuestaSesion.fechaVencimiento).ToShortDateString());

            BLEncuesta objBLEncuesta = new BLEncuesta();

            int cantidad = 0;
            List<DTRol> listaRoles = null;
            foreach (ListItem item in lstRoles.Items)
                if (item.Selected)
                    cantidad++;

            if (cantidad > 0 && cantidad != lstRoles.Items.Count)
            {
                listaRoles = new List<DTRol>();
                foreach (ListItem item in lstRoles.Items)
                    if (item.Selected) { listaRoles.Add(new DTRol() { Nombre = item.Text }); }
            }

            EncuestaAnalisis miAnalisis = objBLEncuesta.GetEncuestaAnalisis(encuestaSesion, listaRoles);
            if (miAnalisis != null)
            {
                filtros.AppendLine("Encuestas Enviadas: " + miAnalisis.nroLanzadas.ToString());
                filtros.AppendLine("Encuestas Respondidas: " + miAnalisis.nroRespondidas.ToString());

                if (Convert.ToDateTime(encuestaSesion.fechaVencimiento).Subtract(DateTime.Today).Days > 0)
                    filtros.AppendLine("Encuestas Pendientes: " + miAnalisis.nroPendientes.ToString());
                else
                    filtros.AppendLine("Encuestas Expiradas: " + miAnalisis.nroExpiradas.ToString());
            }

            filtros.AppendLine("Roles: ");
            if (cantidad == 0 || cantidad == lstRoles.Items.Count)
                foreach (ListItem item in lstRoles.Items)
                    filtros.AppendLine(" * " + item.Text);
            else
                foreach (ListItem item in lstRoles.Items)
                    if (item.Selected) filtros.AppendLine(" * " + item.Text);

            foreach (RespuestaPreguntaAnalisis item in listaRespuestaNumericas)
            {
                miItem = new TablaGrafico();
                miListaRespuesta = ObtenerRespuestas(item);
                miItem.titulo = item.textoPregunta;
                miItem.listaEncabezados = new List<string>();
                miItem.listaEncabezados.Add("Respuesta");
                miItem.listaEncabezados.Add("Porcentaje");

                miItem.listaCuerpo = new List<List<string>>();

                decimal totales = miListaRespuesta.Sum(od => od.cantidad);

                Chart miGrafico = new Chart
                {
                    Width = 800,
                    Height = 450,
                    RenderType = RenderType.ImageTag,
                    AntiAliasing = AntiAliasingStyles.All,
                    TextAntiAliasingQuality = TextAntiAliasingQuality.High,
                    BorderlineDashStyle = ChartDashStyle.Solid,
                    BackSecondaryColor = Color.White,
                    Palette = ChartColorPalette.BrightPastel,
                    BackGradientStyle = GradientStyle.TopBottom
                };

                //miGrafico.Titles.Add(item.textoPregunta);
                //miGrafico.Titles[0].Font = new Font("Arial", 16f);

                miGrafico.Legends.Add("");
                miGrafico.Legends[0].Alignment = StringAlignment.Center;
                miGrafico.Legends[0].IsTextAutoFit = false;
                miGrafico.Legends[0].BorderWidth = 1;
                miGrafico.Legends[0].BorderDashStyle = ChartDashStyle.Solid;
                miGrafico.Legends[0].ShadowOffset = 3;
                miGrafico.Legends[0].Name = "Default";
                miGrafico.Legends[0].BackColor = Color.Transparent;
                miGrafico.Legends[0].BorderColor = Color.FromArgb(26, 59, 105);
                miGrafico.Legends[0].Docking = Docking.Bottom;

                miGrafico.ChartAreas.Add("");
                miGrafico.ChartAreas[0].AxisX.Title = "Respuestas";
                miGrafico.ChartAreas[0].AxisY.Title = "Porcentaje";
                miGrafico.ChartAreas[0].AxisX.TitleFont = new Font("Arial", 12f);
                miGrafico.ChartAreas[0].AxisY.TitleFont = new Font("Arial", 12f);
                miGrafico.ChartAreas[0].AxisX.LabelStyle.Font = new Font("Arial", 10f);
                miGrafico.ChartAreas[0].AxisX.LabelStyle.Angle = 90;
                miGrafico.ChartAreas[0].BackColor = Color.Transparent;
                miGrafico.ChartAreas[0].BorderColor = Color.FromArgb(26, 59, 105);
                miGrafico.ChartAreas[0].Area3DStyle.Enable3D = true;
                miGrafico.ChartAreas[0].Area3DStyle.Inclination = 45;

                miGrafico.Series.Add("");
                miGrafico.Series[0].ChartType = SeriesChartType.Pie;
                miGrafico.Series[0].ShadowOffset = 2;
                miGrafico.Series[0]["PieLabelStyle"] = "Outside";
                miGrafico.Series[0].LegendText = "#VALX: #PERCENT";

                foreach (miRespuesta itemRespuesta in miListaRespuesta)
                {
                    miItem.listaCuerpo.Add(new List<string>() { itemRespuesta.respuesta, Math.Round((itemRespuesta.cantidad / totales * 100), 2).ToString() });
                    miGrafico.Series[0].Points.AddXY(itemRespuesta.respuesta, Math.Round((itemRespuesta.cantidad / totales * 100), 2));
                }

                TmpPath = System.Configuration.ConfigurationManager.AppSettings["oTmpPath"];
                nombrePNG = TmpPath + "\\Grafico_" + Session.SessionID + "_" + encuestaSesion.idEncuesta + "_" + item.idPregunta + ".png";
                miGrafico.SaveImage(nombrePNG, ChartImageFormat.Png);
                miItem.listaPie = new List<string>();
                miItem.listaPie.Add(nombrePNG);

                listaTabla.Add(miItem);
            }

            foreach (RespuestaPreguntaAnalisis item in listaRespuestaTextuales)
            {
                miItem = new TablaGrafico();
                miListaRespuesta = ObtenerRespuestas(item);
                miItem.titulo = item.textoPregunta;
                miItem.listaEncabezados = new List<string>();
                miItem.listaEncabezados.Add("Análisis");
                miItem.listaEncabezados.Add("Resultados");

                miItem.listaCuerpo = new List<List<string>>();

                miItem.listaCuerpo.Add(new List<string>() { "Respuestas Obtenidas", item.respuestasObtenidas.ToString() });
                miItem.listaCuerpo.Add(new List<string>() { "Respuestas Esperadas", item.respuestasEsperadas.ToString() });
                miItem.listaCuerpo.Add(new List<string>() { "Porcentaje", item.porcentaje.ToString() });

                listaTabla.Add(miItem);
            }
            ExportPDF.ExportarGraficoPDF(encuestaSesion.nombreEncuesta, ObjSessionDataUI.ObjDTUsuario.Nombre, filtros.ToString(), string.Empty, listaTabla);
        }
        ///// <summary>
        ///// Generars the datos grafico.
        ///// </summary>
        private void GenerarDatosGrafico()
        {
            var cantAsignaturas =
                from p in listaReporteRendimiento
                group p by p.asignatura into g
                select new { Asignatura = g.Key, Cantidad = g.Count() };

            //TablaGrafico.Add("- Cantidad de Alumnos analizados: " + cantAlumnos.Count().ToString());

            //TablaGrafico.Add("- Registros Totales: " + listaReporte.Count.ToString());

            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();
            tabla3.titulo = "Periodos Analizados: \n";

            foreach (ListItem item in ddlCicloLectivo.Items)
            {
                if (item.Selected)
                {
                    tabla3.titulo += item.Value + "\n";
                }
            }

            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            //if (!string.IsNullOrEmpty(ddlAsignatura.Value) && Convert.ToInt32(ddlAsignatura.Value) > 0)
            //{
            //    #region --[Recorrer Ciclos Lectivos Seleccionados]--
            //    var Ciclos = (from p in listaReporte
            //                  group p by p.ciclolectivo into g
            //                  //orderby g.Average(p => Convert.ToDouble(p.promedio)) descending
            //                  select new { CicloLectivo = g.Key }).Distinct();

            //    foreach (var item in Ciclos)
            //    {
            //        TablaGrafico tabla2 = new TablaGrafico();
            //        tabla2.listaCuerpo = new List<List<string>>();
            //        List<string> encabezado2 = new List<string>();
            //        List<List<string>> filasTabla2 = new List<List<string>>();
            //        List<string> fila2 = new List<string>();

            //        tabla2.titulo = "Top 3 Materias de Mejor Desempeño " + item.CicloLectivo;
            //        encabezado2.Add("Asignatura");
            //        encabezado2.Add("Promedio");
            //        //encabezado2.Add("Ciclo Lectivo");
            //        var topPromedio =
            //           (from p in listaReporte
            //            where p.ciclolectivo == item.CicloLectivo
            //            group p by p.asignatura into g
            //            orderby g.Average(p => Convert.ToDouble(p.promedio)) descending
            //            select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToDouble(p.promedio)) }).Distinct().Take(3);

            //        //TablaGrafico.Add("- Top 3 Materias con mejor desempeño por Ciclo Lectivo:");
            //        foreach (var materia in topPromedio)
            //        {
            //            //TablaGrafico.Add(item.Asignatura + " - Promedio: " + item.Promedio.ToString());
            //            fila2 = new List<string>();
            //            fila2.Add(materia.Asignatura);
            //            fila2.Add(materia.Promedio.ToString("#.00"));
            //            //fila2.Add(item.Text);
            //            filasTabla2.Add(fila2);
            //        }
            //        if (filasTabla2.Count > 0)
            //        {
            //            tabla2.listaEncabezados = encabezado2;
            //            tabla2.listaCuerpo = filasTabla2;
            //            TablaPropiaGrafico.Add(tabla2);
            //        }

            //        TablaGrafico tabla4 = new TablaGrafico();
            //        tabla4.listaCuerpo = new List<List<string>>();
            //        List<string> encabezado4 = new List<string>();
            //        List<List<string>> filasTabla4 = new List<List<string>>();
            //        List<string> fila4 = new List<string>();

            //        tabla4.titulo = "Top 3 Materias de Bajo Desempeño " + item.CicloLectivo;
            //        encabezado4.Add("Asignatura");
            //        encabezado4.Add("Promedio");
            //        //encabezado4.Add("Ciclo Lectivo");
            //        var lowPromedio =
            //           (from p in listaReporte
            //            where p.ciclolectivo == item.CicloLectivo
            //            group p by p.asignatura into g
            //            orderby g.Average(p => Convert.ToDouble(p.promedio)) ascending
            //            select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToDouble(p.promedio)) }).Distinct().Take(3);

            //        //TablaGrafico.Add("- Top 3 Materias con mejor desempeño por Ciclo Lectivo:");
            //        foreach (var materia in lowPromedio)
            //        {
            //            //TablaGrafico.Add(item.Asignatura + " - Promedio: " + item.Promedio.ToString());
            //            fila4 = new List<string>();
            //            fila4.Add(materia.Asignatura);
            //            fila4.Add(materia.Promedio.ToString("#.00"));
            //            //fila4.Add(item.Text);
            //            filasTabla4.Add(fila4);
            //        }
            //        if (filasTabla4.Count > 0)
            //        {
            //            tabla4.listaEncabezados = encabezado4;
            //            tabla4.listaCuerpo = filasTabla4;
            //            TablaPropiaGrafico.Add(tabla4);
            //        }
            //    }
            //    #endregion
            //}
            //else
            {
                TablaGrafico tabla2 = new TablaGrafico();
                tabla2.listaCuerpo = new List<List<string>>();
                List<string> encabezado2 = new List<string>();
                List<List<string>> filasTabla2 = new List<List<string>>();
                List<string> fila2 = new List<string>();

                var Ciclos =
                   (from p in listaReporteRendimiento
                    group p by p.ciclolectivo into g
                    //orderby g.Average(p => Convert.ToDouble(p.promedio)) descending
                    select new { CicloLectivo = g.Key }).Distinct();

                var Asignaturas =
                   (from p in listaReporteRendimiento
                    group p by p.asignatura into g
                    //orderby g.Average(p => Convert.ToDouble(p.promedio)) descending
                    select new { Asignatura = g.Key }).Distinct();

                tabla2.titulo = "Desempeño Por Ciclo Lectivo ";
                //encabezado2.Add("Promedio");
                encabezado2.Add("Asignatura");

                foreach (var item in Ciclos)
                {
                    encabezado2.Add(item.CicloLectivo);
                }

                foreach (var materia in Asignaturas)
                {
                    fila2 = new List<string>();
                    fila2.Add(materia.Asignatura);
                    foreach (var item in Ciclos)
                    {
                        //encabezado2.Add(item.CicloLectivo);

                        var Promedio =
                           (from p in listaReporteRendimiento
                            where p.ciclolectivo == item.CicloLectivo && p.asignatura == materia.Asignatura
                            group p by p.asignatura into g
                            //orderby g.Average(p => Convert.ToDouble(p.promedio)) descending
                            select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToDouble(p.promedio)) }).Distinct();

                        foreach (var itemPromedio in Promedio)
                        {
                            fila2.Add(itemPromedio.Promedio.ToString("#.00"));
                            //fila2.Add(item.Text);
                        }
                        if (Promedio.Count() == 0)
                            fila2.Add(string.Empty);
                    }
                    filasTabla2.Add(fila2);
                }
                if (filasTabla2.Count > 0)
                {
                    tabla2.listaEncabezados = encabezado2;
                    tabla2.listaCuerpo = filasTabla2;
                    TablaGrafico.Add(tabla2);
                }
            }
        }
        /// <summary>
        /// Generars the datos grafico.
        /// </summary>
        private void GenerarDatosGraficoSanciones()
        {
            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();

            tabla3.titulo = "Periodo Analizado: " + listaReporteSanciones[0].periodo;

            var cantAlumnos =
                from p in listaReporteSanciones
                group p by p.alumno into g
                select new { Alumno = g.Key, Cantidad = g.Count() };

            //TablaGrafico.Add("- Cantidad de Alumnos analizados: " + cantAlumnos.Count().ToString());

            //if (listaReporteSanciones.Count() > 0)
            //    TablaGrafico.Add("- Periodo de notas: " + listaReporteSanciones[0].periodo);

            encabezado3.Add("Cantidad de Alumnos");
            fila3.Add(cantAlumnos.Count().ToString());

            //TablaGrafico.Add("- Cantidad de Calificaciones: " + listaReporte.Count.ToString());
            //encabezado3.Add("Sanciones Totales");
            //fila3.Add(listaReporteSanciones.Count().ToString());

            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            var worstAlumnos =
                 (from p in listaReporteSanciones
                  group p by p.alumno into g
                  orderby g.Sum(p => Convert.ToInt16(p.sanciones)) descending
                  select new { Alumno = g.Key, Sanciones = g.Sum(p => Convert.ToInt16(p.sanciones)) }).Distinct().Take(3);

            if (worstAlumnos.Count() > 1)
            {
                TablaGrafico tabla2 = new TablaGrafico();
                tabla2.listaCuerpo = new List<List<string>>();
                List<string> encabezado2 = new List<string>();
                List<List<string>> filasTabla2 = new List<List<string>>();
                List<string> fila2 = new List<string>();

                //TablaGrafico.Add("- Desviacion Estandar por materia: ");
                tabla2.titulo = "Top Alumnos a observar por Cantidad de Sanciones";
                encabezado2.Add("Alumno");
                encabezado2.Add("Sanciones");

                //TablaGrafico.Add("- Top Alumnos a observar por Cantidad de Sanciones:");

                foreach (var item in worstAlumnos)
                {
                    //TablaGrafico.Add("Alumno: " + item.Alumno + " - Cantidad de Sanciones: " + item.Sanciones);
                    fila2 = new List<string>();
                    fila2.Add(item.Alumno);
                    fila2.Add(item.Sanciones.ToString());
                    filasTabla2.Add(fila2);
                }
                tabla2.listaEncabezados = encabezado2;
                tabla2.listaCuerpo = filasTabla2;
                TablaGrafico.Add(tabla2);
            }

            var SancionesPorTipo =
                  (from p in listaReporteSanciones
                   group p by p.tipo into g
                   orderby g.Sum(p => Convert.ToInt32(p.sanciones)) descending
                   select new { Tipo = g.Key, Sanciones = g.Sum(p => Convert.ToInt32(p.sanciones)) }).Distinct().Take(3);

            TablaGrafico tabla4 = new TablaGrafico();
            tabla4.listaCuerpo = new List<List<string>>();
            List<string> encabezado4 = new List<string>();
            List<List<string>> filasTabla4 = new List<List<string>>();
            List<string> fila4 = new List<string>();

            //TablaGrafico.Add("- Desviacion Estandar por materia: ");
            tabla4.titulo = "Cantidad de Sanciones según Tipo";
            encabezado4.Add("Alumno");
            encabezado4.Add("Sanciones");

            //TablaGrafico.Add("- Cantidad de Sanciones según Tipo:");
            foreach (var item in SancionesPorTipo)
            {
                //TablaGrafico.Add("Tipo de Sancion: " + item.Tipo + " - Cantidad de Sanciones: " + item.Sanciones);
                fila4 = new List<string>();
                fila4.Add(item.Tipo);
                fila4.Add(item.Sanciones.ToString());
                filasTabla4.Add(fila4);
            }
            tabla4.listaEncabezados = encabezado4;
            tabla4.listaCuerpo = filasTabla4;
            TablaGrafico.Add(tabla4);

            var SancionesPorMotivo = (from p in listaReporteSanciones
                                      group p by p.motivo into g
                                      orderby g.Sum(p => Convert.ToInt32(p.sanciones)) descending
                                      select new { Motivo = g.Key, Sanciones = g.Sum(p => Convert.ToInt32(p.sanciones)) }).Distinct().Take(3);

            TablaGrafico tabla5 = new TablaGrafico();
            tabla5.listaCuerpo = new List<List<string>>();
            List<string> encabezado5 = new List<string>();
            List<List<string>> filasTabla5 = new List<List<string>>();
            List<string> fila5 = new List<string>();

            tabla5.titulo = "Cantidad de Sanciones según Motivo";
            encabezado5.Add("Motivo");
            encabezado5.Add("Cantidad");
            //TablaGrafico.Add("- Cantidad de Sanciones según Motivo:");
            foreach (var item in SancionesPorMotivo)
            {
                //TablaGrafico.Add("Motivo de Sancion: " + item.Motivo + " - Cantidad de Sanciones: " + item.Sanciones);
                fila5 = new List<string>();
                fila5.Add(item.Motivo);
                fila5.Add(item.Sanciones.ToString());
                filasTabla5.Add(fila5);
            }
            tabla5.listaEncabezados = encabezado5;
            tabla5.listaCuerpo = filasTabla5;
            TablaGrafico.Add(tabla5);

            var worstAlumnosByMotivo = (from p in listaReporteSanciones
                                        group p by new { p.alumno, p.motivo } into g
                                        orderby g.Sum(p => Convert.ToInt32(p.sanciones)) descending
                                        select new { Alumno = g.Key.alumno, Motivo = g.Key.motivo, Sanciones = g.Sum(p => Convert.ToInt32(p.sanciones)) }).Distinct().Take(3);

            if (worstAlumnosByMotivo.Count() > 1)
            {
                //TablaGrafico.Add("- Top Alumnos a observar por Cantidad y Motivo de Sanciones:");
                TablaGrafico tabla6 = new TablaGrafico();
                tabla6.listaCuerpo = new List<List<string>>();
                List<string> encabezado6 = new List<string>();
                List<List<string>> filasTabla6 = new List<List<string>>();
                List<string> fila6 = new List<string>();

                tabla6.titulo = "Top Alumnos a observar por Cantidad y Motivo de Sanciones";
                encabezado6.Add("Alumno");
                encabezado6.Add("Motivo");
                encabezado6.Add("Cantidad");

                foreach (var item in worstAlumnosByMotivo)
                {
                    //TablaGrafico.Add("Alumno: " + item.Alumno + " Motivo: " + item.Motivo + " - Cantidad de Sanciones: " + item.Sanciones);
                    fila6 = new List<string>();
                    fila6.Add(item.Alumno);
                    fila6.Add(item.Motivo);
                    fila6.Add(item.Sanciones.ToString());
                    filasTabla6.Add(fila6);
                }
                tabla6.listaEncabezados = encabezado6;
                tabla6.listaCuerpo = filasTabla6;
                TablaGrafico.Add(tabla6);
            }
            var worstAlumnosByTipo =
            (from p in listaReporteSanciones
             group p by new { p.alumno, p.tipo } into g
             orderby g.Sum(p => Convert.ToInt32(p.sanciones)) descending
             select new { Alumno = g.Key.alumno, Tipo = g.Key.tipo, Sanciones = g.Sum(p => Convert.ToInt32(p.sanciones)) }).Distinct().Take(3);

            if (worstAlumnosByTipo.Count() > 1)
            {
                //TablaGrafico.Add("- Top Alumnos a observar por Cantidad y Tipo de Sanciones:");
                TablaGrafico tabla7 = new TablaGrafico();
                tabla7.listaCuerpo = new List<List<string>>();
                List<string> encabezado7 = new List<string>();
                List<List<string>> filasTabla7 = new List<List<string>>();
                List<string> fila7 = new List<string>();

                tabla7.titulo = "Top Alumnos a observar por Cantidad y Tipo de Sanciones";
                encabezado7.Add("Alumno");
                encabezado7.Add("Tipo");
                encabezado7.Add("Cantidad");

                foreach (var item in worstAlumnosByTipo)
                {
                    //TablaGrafico.Add("Alumno: " + item.Alumno + " Tipo: " + item.Tipo + " - Cantidad de Sanciones: " + item.Sanciones);
                    fila7 = new List<string>();
                    fila7.Add(item.Alumno);
                    fila7.Add(item.Tipo);
                    fila7.Add(item.Sanciones.ToString());
                    filasTabla7.Add(fila7);
                }
                tabla7.listaEncabezados = encabezado7;
                tabla7.listaCuerpo = filasTabla7;
                TablaGrafico.Add(tabla7);
            }
        }
        /// <summary>
        /// Generars the datos grafico.
        /// </summary>
        private void GenerarDatosGraficoInasistencias()
        {
            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();

            tabla3.titulo = "Periodo Analizado: " + listaReporteInasistencias[0].periodo;

            var cantAlumnos =
                from p in listaReporteInasistencias
                group p by p.alumno into g
                select new { Alumno = g.Key, Cantidad = g.Count() };

            encabezado3.Add("Cantidad de Alumnos");
            fila3.Add(cantAlumnos.Count().ToString());

            encabezado3.Add("Inasistencias Totales");
            fila3.Add(listaReporteInasistencias.Count().ToString());

            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            var worstAlumnos =
                 (from p in listaReporteInasistencias
                  group p by p.alumno into g
                  orderby g.Sum(p => Convert.ToDouble(p.inasistencias)) descending
                  select new { Alumno = g.Key, Faltas = g.Sum(p => Convert.ToDouble(p.inasistencias)) }).Distinct().Take(3);

            if (worstAlumnos.Count() > 1)
            {
                TablaGrafico tabla2 = new TablaGrafico();
                tabla2.listaCuerpo = new List<List<string>>();
                List<string> encabezado2 = new List<string>();
                List<List<string>> filasTabla2 = new List<List<string>>();
                List<string> fila2 = new List<string>();

                tabla2.titulo = "Top Alumnos a observar";
                encabezado2.Add("Alumno");
                encabezado2.Add("Inasistencias");

                foreach (var item in worstAlumnos)
                {
                    fila2 = new List<string>();
                    fila2.Add(item.Alumno);
                    fila2.Add(item.Faltas.ToString());
                    filasTabla2.Add(fila2);
                }
                tabla2.listaEncabezados = encabezado2;
                tabla2.listaCuerpo = filasTabla2;
                TablaGrafico.Add(tabla2);
            }

            var worstAlumnosByMotivo =
            (from p in listaReporteInasistencias
             group p by new { p.alumno, p.motivo } into g
             orderby g.Sum(p => Convert.ToDouble(p.inasistencias)) descending
             select new { Alumno = g.Key.alumno, Motivo = g.Key.motivo, Faltas = g.Sum(p => Convert.ToDouble(p.inasistencias)) }).Distinct().Take(3);

            if (worstAlumnosByMotivo.Count() > 1)
            {
                TablaGrafico tabla5 = new TablaGrafico();
                tabla5.listaCuerpo = new List<List<string>>();
                List<string> encabezado5 = new List<string>();
                List<List<string>> filasTabla5 = new List<List<string>>();
                List<string> fila5 = new List<string>();

                tabla5.titulo = "Top Alumnos a observar por Cantidad y Motivo de Inasistencias";
                encabezado5.Add("Alumno");
                encabezado5.Add("Motivo");
                encabezado5.Add("Cantidad");

                //TablaGrafico.Add("- Top Alumnos a observar por Cantidad y Motivo de Inasistencias:");
                foreach (var item in worstAlumnosByMotivo)
                {
                    //TablaGrafico.Add("Alumno: " + item.Alumno + " Motivo: " + item.Motivo + " - Cantidad de Inasistencias: " + item.Faltas);
                    fila5 = new List<string>();
                    fila5.Add(item.Alumno);
                    fila5.Add(item.Motivo);
                    fila5.Add(item.Faltas.ToString());
                    filasTabla5.Add(fila5);
                }
                tabla5.listaEncabezados = encabezado5;
                tabla5.listaCuerpo = filasTabla5;
                TablaGrafico.Add(tabla5);
            }
        }
        /// <summary>
        /// Generars the datos grafico.
        /// </summary>
        private void GenerarDatosGraficoCalificaciones()
        {
            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();

            tabla3.titulo = "Periodo Analizado: " + listaReporte[0].periodo;

            var cantAlumnos =
                from p in listaReporte
                group p by p.alumno into g
                select new { Alumno = g.Key, Cantidad = g.Count() };

            //TablaGrafico.Add("- Cantidad de Alumnos analizados: " + cantAlumnos.Count().ToString());
            encabezado3.Add("Cantidad de Alumnos");
            fila3.Add(cantAlumnos.Count().ToString());

            //TablaGrafico.Add("- Cantidad de Calificaciones: " + listaReporte.Count.ToString());
            encabezado3.Add("Cantidad de Calificaciones");
            fila3.Add(listaReporte.Count().ToString());

            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            if (ddlAsignatura.Items.Count == 0 || Convert.ToInt32(ddlAsignatura.SelectedIndex) < 0)
            {
                var topPromedio =
                   (from p in listaReporte
                    group p by p.asignatura into g
                    orderby g.Average(p => Convert.ToDouble(p.promedio)) descending
                    select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToDouble(p.promedio)), Cantidad = g.Count() }).Distinct().Take(3);

                if (topPromedio.Count() > 1)
                {
                    TablaGrafico tabla2 = new TablaGrafico();
                    tabla2.listaCuerpo = new List<List<string>>();
                    List<string> encabezado2 = new List<string>();
                    List<List<string>> filasTabla2 = new List<List<string>>();
                    List<string> fila2 = new List<string>();

                    //TablaGrafico.Add("- Desviacion Estandar por materia: ");
                    tabla2.titulo = "Top 3 Materias con mejor desempeño";
                    encabezado2.Add("Asignatura");
                    encabezado2.Add("Promedio");

                    //TablaGrafico.Add("- Top 3 Materias con mejor desempeño:");
                    foreach (var item in topPromedio)
                    {
                        //    TablaGrafico.Add(item.Asignatura + " - Promedio: " + item.Promedio.ToString("#.00") + " - Cantidad de Evaluaciones: " + item.Cantidad.ToString());
                        fila2 = new List<string>();
                        fila2.Add(item.Asignatura);
                        fila2.Add(item.Promedio.ToString("#.00"));
                        filasTabla2.Add(fila2);
                    }
                    tabla2.listaEncabezados = encabezado2;
                    tabla2.listaCuerpo = filasTabla2;
                    TablaGrafico.Add(tabla2);
                }

                var worstPromedio =
                   (from p in listaReporte
                    group p by p.asignatura into g
                    orderby g.Average(p => Convert.ToDouble(p.promedio)) ascending
                    select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToDouble(p.promedio)), Cantidad = g.Count() }).Distinct().Take(3);

                if (worstPromedio.Count() > 3)
                {
                    //TablaGrafico.Add("- Top 3 Materias con bajo desempeño:");
                    TablaGrafico tabla4 = new TablaGrafico();
                    tabla4.listaCuerpo = new List<List<string>>();
                    List<string> encabezado4 = new List<string>();
                    List<List<string>> filasTabla4 = new List<List<string>>();
                    List<string> fila4 = new List<string>();

                    //TablaGrafico.Add("- Top 3 Materias con mejor desempeño:");
                    tabla4.titulo = "Top 3 Asignaturas con mejor desempeño";
                    encabezado4.Add("Asignatura");
                    encabezado4.Add("Promedio");

                    tabla4.listaEncabezados = encabezado4;

                    foreach (var item in worstPromedio)
                    {
                        //TablaGrafico.Add(item.Asignatura + " - Promedio: " + item.Promedio.ToString("#.00") + " - Cantidad de Evaluaciones: " + item.Cantidad.ToString());
                        fila4 = new List<string>();
                        fila4.Add(item.Asignatura);
                        fila4.Add(item.Promedio.ToString("#.##"));
                        filasTabla4.Add(fila4);
                    }
                    tabla4.listaEncabezados = encabezado4;
                    tabla4.listaCuerpo = filasTabla4;
                    TablaGrafico.Add(tabla4);
                }
            }

            if (ddlAlumno.Items.Count > 0 && Convert.ToInt32(ddlAlumno.SelectedValue) < 0)
            {
                var worstAlumnos =
                   (from p in listaReporte
                    group p by p.alumno into g
                    orderby g.Average(p => Convert.ToDouble(p.promedio)) ascending
                    select new { Alumno = g.Key, Promedio = g.Average(p => Convert.ToDouble(p.promedio)) }).Distinct().Take(3);

                if (worstAlumnos.Count() > 1)
                {
                    TablaGrafico tabla5 = new TablaGrafico();
                    tabla5.listaCuerpo = new List<List<string>>();
                    List<string> encabezado5 = new List<string>();
                    List<List<string>> filasTabla5 = new List<List<string>>();
                    List<string> fila5 = new List<string>();

                    tabla5.titulo = "Top Alumnos a observar";
                    encabezado5.Add("Alumno");
                    encabezado5.Add("Promedio General");

                    //TablaGrafico.Add("- Top Alumnos a observar:");
                    foreach (var item in worstAlumnos)
                    {
                        //TablaGrafico.Add(item.Alumno + " - Promedio General: " + item.Promedio.ToString("#.00"));
                        fila5 = new List<string>();
                        fila5.Add(item.Alumno);
                        fila5.Add(item.Promedio.ToString("#.00"));
                        filasTabla5.Add(fila5);
                    }
                    tabla5.listaEncabezados = encabezado5;
                    tabla5.listaCuerpo = filasTabla5;
                    TablaGrafico.Add(tabla5);
                }
            }
        }
        /// <summary>
        /// Generars the datos grafico.
        /// </summary>
        private void GenerarDatosGraficoInasistencias()
        {
            var cantAlumnos =
                from p in listaReporte
                group p by p.alumno into g
                select new { Alumno = g.Key, Cantidad = g.Count() };

            var fechaMin =
               from p in listaReporte
               group p by p.alumno into g
               select new { Alumno = g.Key, Fecha = g.Min(p => p.fecha) };

            var fechaMax =
               from p in listaReporte
               group p by p.alumno into g
               select new { Alumno = g.Key, Fecha = g.Max(p => p.fecha) };

            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();

            tabla3.titulo = "Periodo Analizado: " + fechaMin.First().Fecha.ToShortDateString() + " - " + fechaMax.First().Fecha.ToShortDateString();

            encabezado3.Add("Cantidad de Alumnos");
            fila3.Add(cantAlumnos.Count().ToString());

            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            var worstAlumnos =
                 (from p in listaReporte
                  group p by p.alumno into g
                  orderby g.Count() descending
                  select new { Alumno = g.Key, Faltas = g.Count() }).Distinct().Take(3);

            if (worstAlumnos.Count() > 1)
            {
                TablaGrafico tabla2 = new TablaGrafico();
                tabla2.listaCuerpo = new List<List<string>>();
                List<string> encabezado2 = new List<string>();
                List<List<string>> filasTabla2 = new List<List<string>>();
                List<string> fila2 = new List<string>();

                tabla2.titulo = "Top Alumnos a observar";
                encabezado2.Add("Alumno");
                encabezado2.Add("Inasistencias");

                foreach (var item in worstAlumnos)
                {
                    fila2 = new List<string>();
                    fila2.Add(item.Alumno);
                    fila2.Add(item.Faltas.ToString());
                    filasTabla2.Add(fila2);
                }
                tabla2.listaEncabezados = encabezado2;
                tabla2.listaCuerpo = filasTabla2;
                TablaGrafico.Add(tabla2);
            }

            var FaltasPorMotivo =
                  (from p in listaReporte
                   group p by p.motivo into g
                   orderby g.Count() descending
                   select new { Motivo = g.Key, Faltas = g.Count() }).Distinct().Take(3);

            TablaGrafico tabla4 = new TablaGrafico();
            tabla4.listaCuerpo = new List<List<string>>();
            List<string> encabezado4 = new List<string>();
            List<List<string>> filasTabla4 = new List<List<string>>();
            List<string> fila4 = new List<string>();

            tabla4.titulo = "Cantidad de Inasistencias según Motivo";
            encabezado4.Add("Motivo");
            encabezado4.Add("Cantidad");

            foreach (var item in FaltasPorMotivo)
            {
                fila4 = new List<string>();
                fila4.Add(item.Motivo);
                fila4.Add(item.Faltas.ToString());
                filasTabla4.Add(fila4);
            }
            tabla4.listaEncabezados = encabezado4;
            tabla4.listaCuerpo = filasTabla4;
            TablaGrafico.Add(tabla4);

            var worstAlumnosByMotivo =
            (from p in listaReporte
             group p by new { p.alumno, p.motivo } into g
             orderby g.Count() descending
             select new { Alumno = g.Key.alumno, Motivo = g.Key.motivo, Faltas = g.Count() }).Distinct().Take(3);

            if (worstAlumnosByMotivo.Count() > 1)
            {
                TablaGrafico tabla5 = new TablaGrafico();
                tabla5.listaCuerpo = new List<List<string>>();
                List<string> encabezado5 = new List<string>();
                List<List<string>> filasTabla5 = new List<List<string>>();
                List<string> fila5 = new List<string>();

                tabla5.titulo = "Top Alumnos a observar por Cantidad y Motivo de Inasistencias";
                encabezado5.Add("Alumno");
                encabezado5.Add("Motivo");
                encabezado5.Add("Cantidad");

                foreach (var item in worstAlumnosByMotivo)
                {
                    fila5 = new List<string>();
                    fila5.Add(item.Alumno);
                    fila5.Add(item.Motivo);
                    fila5.Add(item.Faltas.ToString());
                    filasTabla5.Add(fila5);
                }
                tabla5.listaEncabezados = encabezado5;
                tabla5.listaCuerpo = filasTabla5;
                TablaGrafico.Add(tabla5);
            }
        }
        ///// <summary>
        ///// Generars the datos grafico.
        ///// </summary>
        private void GenerarDatosGrafico()
        {
            var cantAsignaturas =
                from p in listaReporteRendimiento
                group p by p.asignatura into g
                select new { Asignatura = g.Key, Cantidad = g.Count() };

            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();
            tabla3.titulo = "Periodos Analizados: \n";

            foreach (ListItem item in ddlCicloLectivo.Items)
            {
                if (item.Selected)
                {
                    tabla3.titulo += item.Value + "\n";
                }
            }

            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            TablaGrafico tabla2 = new TablaGrafico();
            tabla2.listaCuerpo = new List<List<string>>();
            List<string> encabezado2 = new List<string>();
            List<List<string>> filasTabla2 = new List<List<string>>();
            List<string> fila2 = new List<string>();

            var Ciclos =
                (from p in listaReporteRendimiento
                 group p by p.ciclolectivo into g
                 select new { CicloLectivo = g.Key }).Distinct();

            var Asignaturas =
                (from p in listaReporteRendimiento
                 group p by p.asignatura into g
                 select new { Asignatura = g.Key }).Distinct();

            tabla2.titulo = "Desempeño Por Ciclo Lectivo ";
            encabezado2.Add("Asignatura");

            foreach (var item in Ciclos)
            {
                encabezado2.Add(item.CicloLectivo);
            }

            foreach (var materia in Asignaturas)
            {
                fila2 = new List<string>();
                fila2.Add(materia.Asignatura);
                foreach (var item in Ciclos)
                {
                    var Promedio =
                        (from p in listaReporteRendimiento
                         where p.ciclolectivo == item.CicloLectivo && p.asignatura == materia.Asignatura
                         group p by p.asignatura into g
                         select new { Asignatura = g.Key, Promedio = g.Average(p => Convert.ToDouble(p.promedio)) }).Distinct();

                    foreach (var itemPromedio in Promedio)
                    {
                        fila2.Add(itemPromedio.Promedio.ToString("#.00"));
                    }
                    if (Promedio.Count() == 0)
                        fila2.Add(string.Empty);
                }
                filasTabla2.Add(fila2);
            }
            if (filasTabla2.Count > 0)
            {
                tabla2.listaEncabezados = encabezado2;
                tabla2.listaCuerpo = filasTabla2;
                TablaGrafico.Add(tabla2);
            }
        }
        /// <summary>
        /// Generars the datos grafico.
        /// </summary>
        private void GenerarDatosGraficoSanciones()
        {
            var cantAlumnos =
                from p in listaReporte
                group p by p.alumno into g
                select new { Alumno = g.Key, Cantidad = g.Count() };

            var fechaMin =
               from p in listaReporte
               group p by p.alumno into g
               select new { Alumno = g.Key, Fecha = g.Min(p => p.fecha) };

            var fechaMax =
               from p in listaReporte
               group p by p.alumno into g
               select new { Alumno = g.Key, Fecha = g.Max(p => p.fecha) };

            TablaGrafico = new List<TablaGrafico>();
            TablaGrafico tabla3 = new TablaGrafico();
            tabla3.listaCuerpo = new List<List<string>>();
            List<string> encabezado3 = new List<string>();
            List<string> fila3 = new List<string>();

            tabla3.titulo = "Periodo Analizado: " + fechaMin.First().Fecha.ToShortDateString() + " - " + fechaMax.First().Fecha.ToShortDateString();
            encabezado3.Add("Cantidad de Alumnos");
            fila3.Add(cantAlumnos.Count().ToString());
            tabla3.listaEncabezados = encabezado3;
            tabla3.listaCuerpo.Add(fila3);
            TablaGrafico.Add(tabla3);

            // Calcular Promedio y Desviacion Standard por tipo de Sanciones
            TablaGrafico tabla2 = new TablaGrafico();
            tabla2.listaCuerpo = new List<List<string>>();
            List<string> encabezado2 = new List<string>();
            List<List<string>> filasTabla2 = new List<List<string>>();
            List<string> fila2 = new List<string>();

            tabla2.titulo = "Desviacion Estandar por Tipo de Sanción";
            encabezado2.Add("Alumno");
            encabezado2.Add("Promedio de Sanciones por Ocurrencia");
            encabezado2.Add("Desviación");

            double sumaSanciones, promedio, desvStd, dif, cociente, sumaDifCuad = 0;

            var serie = new List<RptCalificacionesAlumnoPeriodo>();
            foreach (var item in listaTipoSancion)
            {
                promedio = 0;
                cociente = 0;
                desvStd = 0;
                sumaSanciones = 0;
                dif = 0;
                sumaDifCuad = 0;

                var listaParcial = listaReporte.FindAll(p => p.tipo == item.nombre);
                if (listaParcial.Count > 0)
                {
                    foreach (var sancion in listaParcial)
                    {
                        sumaSanciones += Convert.ToInt32(sancion.cantidad);
                    }
                    promedio = sumaSanciones / listaParcial.Count;
                    foreach (var sancion in listaParcial)
                    {
                        dif = (Convert.ToInt32(sancion.cantidad) - promedio);
                        sumaDifCuad += Math.Pow(dif, 2);
                    }
                    cociente = (sumaDifCuad / (listaParcial.Count));

                    desvStd = Math.Sqrt(cociente);

                    fila2 = new List<string>();
                    fila2.Add(item.nombre);
                    fila2.Add(promedio.ToString("#.##"));
                    fila2.Add(desvStd.ToString("#.##"));
                    filasTabla2.Add(fila2);
                }
            }
            tabla2.listaEncabezados = encabezado2;
            tabla2.listaCuerpo = filasTabla2;
            TablaGrafico.Add(tabla2);

            var worstAlumnos =
                 (from p in listaReporte
                  group p by p.alumno into g
                  orderby g.Count() descending
                  select new { Alumno = g.Key, Sanciones = g.Sum(p => p.cantidad) }).Distinct().Take(3);

            if (worstAlumnos.Count() > 1)
            {
                TablaGrafico tabla4 = new TablaGrafico();
                tabla4.listaCuerpo = new List<List<string>>();
                List<string> encabezado4 = new List<string>();
                List<List<string>> filasTabla4 = new List<List<string>>();
                List<string> fila4 = new List<string>();
                tabla4.titulo = "Top Alumnos a observar por Cantidad de Sanciones";
                encabezado4.Add("Alumno");
                encabezado4.Add("Sanciones");

                foreach (var item in worstAlumnos)
                {
                    fila4 = new List<string>();
                    fila4.Add(item.Alumno);
                    fila4.Add(item.Sanciones.ToString());
                    filasTabla4.Add(fila4);
                }
                tabla4.listaEncabezados = encabezado4;
                tabla4.listaCuerpo = filasTabla4;
                TablaGrafico.Add(tabla4);
            }
            var SancionesPorTipo =
                  (from p in listaReporte
                   group p by p.tipo into g
                   orderby g.Count() descending
                   select new { Tipo = g.Key, Sanciones = g.Sum(p => p.cantidad) }).Distinct().Take(3);

            TablaGrafico tabla5 = new TablaGrafico();
            tabla5.listaCuerpo = new List<List<string>>();
            List<string> encabezado5 = new List<string>();
            List<List<string>> filasTabla5 = new List<List<string>>();
            List<string> fila5 = new List<string>();

            tabla5.titulo = "Cantidad de Sanciones según Tipo";
            encabezado5.Add("Motivo");
            encabezado5.Add("Cantidad");

            foreach (var item in SancionesPorTipo)
            {
                fila5 = new List<string>();
                fila5.Add(item.Tipo);
                fila5.Add(item.Sanciones.ToString());
                filasTabla5.Add(fila5);
            }
            tabla5.listaEncabezados = encabezado5;
            tabla5.listaCuerpo = filasTabla5;
            TablaGrafico.Add(tabla5);

            var SancionesPorMotivo =
                  (from p in listaReporte
                   group p by p.motivo into g
                   orderby g.Count() descending
                   select new { Motivo = g.Key, Sanciones = g.Sum(p => p.cantidad) }).Distinct().Take(3);

            TablaGrafico tabla6 = new TablaGrafico();
            tabla6.listaCuerpo = new List<List<string>>();
            List<string> encabezado6 = new List<string>();
            List<List<string>> filasTabla6 = new List<List<string>>();
            List<string> fila6 = new List<string>();

            tabla6.titulo = "Cantidad de Sanciones según Motivo";
            encabezado6.Add("Motivo");
            encabezado6.Add("Cantidad");
            foreach (var item in SancionesPorMotivo)
            {
                fila6 = new List<string>();
                fila6.Add(item.Motivo);
                fila6.Add(item.Sanciones.ToString());
                filasTabla6.Add(fila6);
            }
            tabla6.listaEncabezados = encabezado6;
            tabla6.listaCuerpo = filasTabla6;
            TablaGrafico.Add(tabla6);

            var worstAlumnosByMotivo = (from p in listaReporte
                                        group p by new { p.alumno, p.motivo } into g
                                        orderby g.Sum(p => p.cantidad) descending
                                        select new { Alumno = g.Key.alumno, Motivo = g.Key.motivo, Sanciones = g.Sum(p => p.cantidad) }).Distinct().Take(3);

            if (worstAlumnosByMotivo.Count() > 1)
            {
                TablaGrafico tabla7 = new TablaGrafico();
                tabla7.listaCuerpo = new List<List<string>>();
                List<string> encabezado7 = new List<string>();
                List<List<string>> filasTabla7 = new List<List<string>>();
                List<string> fila7 = new List<string>();

                tabla7.titulo = "Top Alumnos a observar por Cantidad y Motivo de Sanciones";
                encabezado7.Add("Alumno");
                encabezado7.Add("Motivo");
                encabezado7.Add("Cantidad");
                foreach (var item in worstAlumnosByMotivo)
                {
                    fila7 = new List<string>();
                    fila7.Add(item.Alumno);
                    fila7.Add(item.Motivo);
                    fila7.Add(item.Sanciones.ToString());
                    filasTabla7.Add(fila7);
                }
                tabla7.listaEncabezados = encabezado7;
                tabla7.listaCuerpo = filasTabla7;
                TablaGrafico.Add(tabla7);
            }

            var worstAlumnosByTipo = (from p in listaReporte
                                      group p by new { p.alumno, p.tipo } into g
                                      orderby g.Sum(p => p.cantidad) descending
                                      select new { Alumno = g.Key.alumno, Tipo = g.Key.tipo, Sanciones = g.Sum(p => p.cantidad) }).Distinct().Take(3);

            if (worstAlumnosByTipo.Count() > 1)
            {
                TablaGrafico tabla8 = new TablaGrafico();
                tabla8.listaCuerpo = new List<List<string>>();
                List<string> encabezado8 = new List<string>();
                List<List<string>> filasTabla8 = new List<List<string>>();
                List<string> fila8 = new List<string>();

                tabla8.titulo = "Top Alumnos a observar por Cantidad y Tipo de Sanciones";
                encabezado8.Add("Alumno");
                encabezado8.Add("Motivo");
                encabezado8.Add("Cantidad");
                foreach (var item in worstAlumnosByTipo)
                {
                    fila8 = new List<string>();
                    fila8.Add(item.Alumno);
                    fila8.Add(item.Tipo);
                    fila8.Add(item.Sanciones.ToString());
                    filasTabla8.Add(fila8);
                }
                tabla8.listaEncabezados = encabezado8;
                tabla8.listaCuerpo = filasTabla8;
                TablaGrafico.Add(tabla8);
            }
        }