public static List <HistorialCalificacionSemestral> seleccionarHistorial(calificaciones_semestrales calificacion_semestral)
        {
            // Código necesario para los métodos que
            // utilicen la base de datos
            CBTis123_Entities dbContext = Vinculo_DB.generarContexto();

            List <HistorialCalificacionSemestral> listaHistorial = new List <HistorialCalificacionSemestral>();

            try
            {
                historial_calificaciones_semestrales historialBruto =
                    dbContext.
                    historial_calificaciones_semestrales.
                    SingleOrDefault(
                        h =>
                        h.idCalificacion_Semestral == calificacion_semestral.idCalificacion_Semestral
                        );

                if (historialBruto != null)
                {
                    string   s1 = historialBruto.cambios;
                    string[] s2 = s1.Split(new string[] { separadorRegistro }, StringSplitOptions.RemoveEmptyEntries);

                    string[][] valoresFinales = new string[s2.Length][];

                    for (int i = 0; i < s2.Length; i++)
                    {
                        string s = s2[i];

                        valoresFinales[i] = s.Split(new string[] { separadorCampo }, StringSplitOptions.None);
                    }

                    foreach (string[] sArr in valoresFinales)
                    {
                        HistorialCalificacionSemestral h = new HistorialCalificacionSemestral();

                        int posicion = 0;

                        h.nombreDeCampo  = sArr[posicion++];
                        h.valorAnterior  = sArr[posicion++];
                        h.valorNuevo     = sArr[posicion++];
                        h.fuenteDeCambio = sArr[posicion++];
                        h.fecha          = sArr[posicion++];

                        int      idUsuario = Convert.ToInt32(sArr[posicion++]);
                        usuarios u         = dbContext.usuarios.SingleOrDefault(u1 => u1.idUsuario == idUsuario);

                        h.usuarioAutor = u;

                        listaHistorial.Add(h);
                    }
                }
            }
            catch (Exception e)
            {
                ControladorVisual.mostrarMensaje(ControladorExcepciones.crearResultadoOperacionException(e));
            }

            return(listaHistorial);
        }
        // UPDATES
        public static ResultadoOperacion actualizarCalificaciones(IList <calificaciones_semestrales> listaCalificaciones, string razon)
        {
            // Código necesario para los métodos que
            // utilicen la base de datos
            CBTis123_Entities dbContext = Vinculo_DB.generarContexto();

            // Setteamos variables necesarias para el método
            int calificacionesModificadas = 0;
            ResultadoOperacion innerRO    = null;

            bool cambios = false;

            try
            {
                // Iteramos sobre la lista que nos pasaron
                foreach (calificaciones_semestrales c in listaCalificaciones)
                {
                    // Creamos un StringBuilder para guardar cualquier cambio
                    StringBuilder logCambios = new StringBuilder();

                    // Obtenemos las calificaciones que hay en la DB
                    calificaciones_semestrales cUpdated = dbContext.calificaciones_semestrales.SingleOrDefault(
                        c1 => c1.idCatedra == c.idCatedra && c1.idEstudiante == c.idEstudiante
                        );

                    // Si hay algún cambio en cualquiera de los campos,
                    // se agregará el registro al StringBuilder, y se
                    // encenderá la bandera de que hubo cambio

                    // PRIMERO, las asistencias
                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.asistenciasParcial1, c.asistenciasParcial1) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Asistencias parcial 1",
                                cUpdated.asistenciasParcial1.ToString(),
                                c.asistenciasParcial1.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.asistenciasParcial1 = c.asistenciasParcial1;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.asistenciasParcial2, c.asistenciasParcial2) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Asistencias parcial 2",
                                cUpdated.asistenciasParcial2.ToString(),
                                c.asistenciasParcial2.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.asistenciasParcial2 = c.asistenciasParcial2;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.asistenciasParcial3, c.asistenciasParcial3) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Asistencias parcial 3",
                                cUpdated.asistenciasParcial3.ToString(),
                                c.asistenciasParcial3.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.asistenciasParcial3 = c.asistenciasParcial3;
                        cambios = true;
                    }


                    // SEGUNDO, las calificaciones
                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.calificacionParcial1, c.calificacionParcial1) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Calificación parcial 1",
                                cUpdated.calificacionParcial1.ToString(),
                                c.calificacionParcial1.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.calificacionParcial1 = c.calificacionParcial1;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.calificacionParcial2, c.calificacionParcial2) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Calificación parcial 2",
                                cUpdated.calificacionParcial2.ToString(),
                                c.calificacionParcial2.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.calificacionParcial2 = c.calificacionParcial2;
                        cambios = true;
                    }

                    if (ControladorMiscelaneo.compararNullableDouble(cUpdated.calificacionParcial3, c.calificacionParcial3) != 0)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Calificación parcial 3",
                                cUpdated.calificacionParcial3.ToString(),
                                c.calificacionParcial3.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.calificacionParcial3 = c.calificacionParcial3;
                        cambios = true;
                    }


                    //TERCERO, otros datos que se pueden modificar en el DGV
                    if (cUpdated.firmado != c.firmado)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Firmado",
                                cUpdated.firmado.ToString(),
                                c.firmado.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.firmado = c.firmado;
                        cambios          = true;
                    }

                    if (cUpdated.tipoDeAcreditacion != c.tipoDeAcreditacion)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Tipo de acreditación",
                                cUpdated.tipoDeAcreditacion,
                                c.tipoDeAcreditacion,
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.tipoDeAcreditacion = c.tipoDeAcreditacion;
                        cambios = true;
                    }

                    if (cUpdated.recursamiento != c.recursamiento)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Firmado",
                                cUpdated.recursamiento.ToString(),
                                c.recursamiento.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.recursamiento = c.recursamiento;
                        cambios = true;
                    }

                    if (cUpdated.verificado != c.verificado)
                    {
                        logCambios.Append(
                            crearLogCambios(
                                "Tipo de acreditación",
                                cUpdated.verificado.ToString(),
                                c.verificado.ToString(),
                                razon,
                                ControladorSesion.usuarioActivo.idUsuario
                                )
                            );

                        cUpdated.verificado = c.verificado;
                        cambios             = true;
                    }

                    // Ahora, para guardar en el historial,
                    // comprobamos que exista. Si no existe,
                    // lo creamos y agregmos los cambios del StringBuilder.
                    // Si ya existe, simplemente agregamos los
                    // cambios al final de la cadena.
                    historial_calificaciones_semestrales historial = dbContext.historial_calificaciones_semestrales.SingleOrDefault(h => h.idCalificacion_Semestral == cUpdated.idCalificacion_Semestral);

                    if (historial == null)
                    {
                        historial = new historial_calificaciones_semestrales()
                        {
                            idCalificacion_Semestral = cUpdated.idCalificacion_Semestral,
                            cambios = logCambios.ToString()
                        };

                        dbContext.historial_calificaciones_semestrales.Add(historial);
                    }
                    else
                    {
                        historial.cambios += logCambios.ToString();
                    }
                }

                // Si hubo cambios, se guardan
                if (cambios)
                {
                    calificacionesModificadas = dbContext.SaveChanges();
                }
            }
            catch (Exception e)
            {
                innerRO = ControladorExcepciones.crearResultadoOperacionException(e);
            }

            int listaCalificacionesCount = listaCalificaciones.Count;

            return
                (!cambios
                ?
                 new ResultadoOperacion(
                     EstadoOperacion.NingunResultado,
                     "No se guardó ninguna calificación - " + razon,
                     null,
                     innerRO)
                :
                 calificacionesModificadas > 0
                ?
                 new ResultadoOperacion(
                     EstadoOperacion.Correcto,
                     "Calificaciones actualizadas - " + razon,
                     null,
                     innerRO)
                :
                 new ResultadoOperacion(
                     EstadoOperacion.ErrorAplicacion,
                     "No se han actualizado las calificaciones - " + razon,
                     "CalAct " + calificacionesModificadas.ToString(),
                     innerRO));
        }