public int cantidad_De_Preguntas_Por_Competencia(string codigo_de_competencia, DateTime fecha_ev, string codigo_ev)
        {
            bool conexionExitosa;
            GestorEvaluacion gestor_de_Evaluacion = new GestorEvaluacion();
            List<CompetenciaEvaluada> listaCompetenciasEvaluadas = new List<CompetenciaEvaluada>();
            string fecha_formateada = this.formatear_fecha(fecha_ev);
            int cantidad_preguntas = -1;

            string consultaSql = "SELECT COUNT(*) " +
                " FROM `factor evaluado` fa " +
                " JOIN `pregunta evaluada` pe on( `Factor Evaluado_idFactor Evaluado` = `idFactor Evaluado`) " +
                " WHERE `Competencia Evaluada_idCompetencia Evaluada` = (SELECT DISTINCT `idCompetencia Evaluada` " +
                " FROM `puesto evaluado_competencia evaluada` pe_ce " +
                " JOIN `competencia evaluada` comp_ev on (codigo = '" + codigo_de_competencia +
                "' AND `Competencia Evaluada_idCompetencia Evaluada` = `idCompetencia Evaluada`) " +
                " WHERE `Puesto Evaluado_idPuesto Evaluado` = (SELECT DISTINCT `idPuesto Evaluado` " +
                " FROM candidato cand " +
                " JOIN cuestionario cuest on (idCandidato = Candidato_idCandidato) " +
                " JOIN cuestionario_estado cuest_estado on (idCuestionario = Cuestionario_idCuestionario) " +
                " JOIN `puesto evaluado` puesto_ev on (`idPuesto Evaluado` =`Puesto Evaluado_idPuesto Evaluado`)" +
                " WHERE puesto_ev.codigo =  '" + codigo_ev + "' AND fecha = '" + fecha_formateada + "'));";

            //llamamos al metodo "iniciar conexion"
            conexionExitosa = iniciarConexion();

            //Evaluamos si la conexion se realizo con exito
            if (!conexionExitosa)
            {
                MessageBox.Show("Fallo la conexion con la base de datos");
                terminarConexion();
                return -1;
            }

            //Creamos un adaptador llamado "comando" para realizar la consultaSql que definimos mas arriba
            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            comando.CommandText = consultaSql;//En el adaptador comando hacemos un asignacion en su atributo CommandText de la consultaSql

            //Se hace la ejecucion del comando con el metodo ExecuterReader
            //y se lo asigna a una variable reader que contendra los resultados de la busqueda en la base de datos
            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            {
                //si el reader esta vacio, es que no se encontraron datos para la consulta realizada
                MessageBox.Show("No existen preguntas asociadas a esta competencia de esta evaluacion[Imposible!]");
                terminarConexion();
                return -1;
            }

            while (reader.Read())
            {
                cantidad_preguntas = Int32.Parse(reader["COUNT(*)"].ToString());

            }

            terminarConexion();
            return cantidad_preguntas;
        }
        /*
         * retornarProximoBloque tiene la misión de recuperar el proximo bloque de un cuestionario a travez de su numero de bloque
         */
        public Bloque retornarBloque(Cuestionario cuestAsociado, int nroBloque)
        {
            GestorCuestionario gestorCuestionario = new GestorCuestionario();
            GestorEvaluacion gestorEvaluacion = new GestorEvaluacion();

            if (cuestAsociado.PuestoEvaluado.Caracteristicas == null)
            {
                //Re-armamos las relaciones del cuestionario para tener todos los objetos en memoria
                bool re_construido = this.reconstruirRelaciones(cuestAsociado);
                if (!re_construido)
                {
                    MessageBox.Show("No se pudo recuperar Todos los datos requeridos");
                    return null;
                }
            }

            bool conexionExitosa;
            List<PreguntaEvaluada> ListapregAsociadas = new List<PreguntaEvaluada>();

            string consultaSql = "SELECT codigo " //Recupero el codigo de las preguntas evaluadas
                + "FROM item_bloque it_Bloq " //Desde la tabla de ITEM_BLOQUE de la base de datos
                //CONDICIONO CON UN JOIN que el id que se encuentra en la tabla de `pregunta evaluada` sea igual al id de la tabla `item_bloque`
                + "JOIN `pregunta evaluada` pEv on (pEv.`idPregunta Evaluada` = it_Bloq.PreguntaEvaluada_idPreguntaEv) "
                //CON UN SEGUNDO JOIN pido que me busque los datos del bloque que condice con el "nroBloque"
                + "JOIN bloque bq on (bq.nroBloque = " + nroBloque + ") "
                //TERCER JOIN pido que me busque entre los cuestionarios los datos del que coincida con el cuestionario que le paso como parametro
                + "JOIN cuestionario cuest on (cuest.clave = '" + cuestAsociado.Clave + "') "
                //Con el WHERE restrinjo que de los datos obtenidos:
                //El id del bloque que se encuentra en la tabla `item_bloque` sea el mismo al del bloque seleccionado en el JOIN
                + "WHERE it_Bloq.Bloque_idBloque = bq.idBloque "
                //Y que el id del cuestionario que esta en la tabla de `bloques` sea el mismo al obtenido del JOIN con la tabla cuestionario
                + "AND bq.Cuestionario_idCuestrionario = cuest.idCuestionario;";

            conexionExitosa = iniciarConexion();

            if (!conexionExitosa)
                return null; //Error de conexion

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();

            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)//si el reader esta vacio, no se encontro el parametro buscado
                return null;

            while (reader.Read())
            {
                string codigo = reader["codigo"].ToString();

                ListapregAsociadas.Add(gestorEvaluacion.retornarPreguntaDeLaRelacion(cuestAsociado.PuestoEvaluado, codigo));
            }

            terminarConexion();

            bool esUltimoBloque = esUltimimoBloque(cuestAsociado, nroBloque);
            Bloque bloque_R = gestorCuestionario.instanciarBloque(nroBloque, cuestAsociado);
            bloque_R.EsUltimoNloque = esUltimoBloque;
            bloque_R.ListaPreguntasEv = ListapregAsociadas;

            terminarConexion();

            return bloque_R;
        }
        /*
         * - RecuperarPuestoEvaluado tiene la misión de recuperar un puesto evaluado puntual
         *   según su id de la tabla de la base de datos
         */
        public PuestoEvaluado recuperarPuestoEvaluado(int idPuestoEv)
        {
            bool conexionExitosa;
            GestorEvaluacion gestorEvaluados = new GestorEvaluacion();
            PuestoEvaluado objPuesto = null;

            DateTime fecha_evaluacion = this.recuperarFechadeComienzoEvaluacion(idPuestoEv);

            string consultaSql = "SELECT * FROM `puesto evaluado` WHERE `idPuesto Evaluado` = " + idPuestoEv + " ;";

            //llamamos al metodo "iniciar conexion"
            conexionExitosa = iniciarConexion();

            //Evaluamos si la conexion se realizo con exito
            if (!conexionExitosa)
            {
                MessageBox.Show("Fallo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();

            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            {
                //Si el reader esta vacio, es qe no encontro a ese candidato
                MessageBox.Show("No se encontro un candidato solicitado ");
                terminarConexion();
                return null;
            }
            else
            {
                while (reader.Read())
                {
                    if (reader["eliminado"].ToString() == "")
                    {
                        string codigo = reader["codigo"].ToString();
                        string nombrePuestoEv = reader["nombre"].ToString();
                        string empresa = reader["empresa"].ToString();
                        //Usamos el gestor de evaluacion para instanciar el puesto evaludado con los datos encontrados en la base de datos
                        objPuesto = gestorEvaluados.instanciarPuestoEvaluado(codigo, nombrePuestoEv, empresa);
                        objPuesto.Fecha_Comienzo = fecha_evaluacion;
                    }
                    else
                    {
                        //Si el puesto evaludado fue eliminado se instanciara un puesto cuyo codigo sera "ELIMINADO"
                        objPuesto = gestorEvaluados.instanciarPuestoEvaluado("ELIMINADO", " ", " ");
                    }
                }
            }
            terminarConexion();
            return objPuesto;
        }
        public List<PuestoEvaluado> recuperarPuestos_ev(string codigo)
        {
            bool conexionExitosa;
            GestorEvaluacion gestorPuestos = new GestorEvaluacion();
            List<PuestoEvaluado> listaDePuestos_ev = new List<PuestoEvaluado>(); //para el retorno de datos
            List<Int32> lista_de_ID_Puesto_ev = new List<Int32>();

            string consultaSql = "SELECT DISTINCT `idPuesto Evaluado`, codigo, nombre, empresa, fecha " +
                "FROM `puesto evaluado` pu_ev " +
                "JOIN cuestionario cuest on (pu_ev.codigo = '" + codigo + "' AND pu_ev.`idPuesto evaluado` = cuest.`Puesto Evaluado_idPuesto Evaluado`) " +
                "JOIN `cuestionario_estado` c_est on (cuest.idCuestionario = c_est.Cuestionario_idCuestionario) " +
                "WHERE Estado_idEstado = 1 " +
                "GROUP BY `idPuesto Evaluado`";

            //llamamos al metodo "iniciar conexion"
            conexionExitosa = iniciarConexion();

            //Evaluamos si la conexion se realizo con exito
            if (!conexionExitosa)
            {
                MessageBox.Show("No se pudo realizar la conexión con la Base de Datos");
                terminarConexion();
                return null;
            }

            //Creamos un adaptador llamado "comando" para realizar la consultaSql que definimos mas arriba
            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            //En el adaptador comando hacemos un asignacion en su atributo CommandText de la consultaSql
            comando.CommandText = consultaSql;

            //Se hace la ejecucion del comando con el metodo ExecuterReader
            //y se lo asigna a una variable reader que contendra los resultados de la busqueda en la base de datos
            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            {
                //si el reader esta vacio, es que no se encontraron datos para la consulta realizada
                MessageBox.Show("No se encontro ningún puesto");
                terminarConexion();
                return null;
            }

            //Si el reader contiene datos, se realiza la lectura de todos los ellos.
            while (reader.Read())
            {
                PuestoEvaluado objPuestoEv;
                string id_puesto_ev = reader[0].ToString();
                string cod = reader["codigo"].ToString();
                string nomPuesto = reader["nombre"].ToString();
                string emp = reader["empresa"].ToString();
                DateTime fecha = (DateTime)reader["fecha"];

                //Llamamos al gestor de puestos para instanciar el puesto que se obtuvo de la base de datos
                objPuestoEv = gestorPuestos.instanciarPuestoEvaluado(cod, nomPuesto, emp);

                objPuestoEv.Fecha_Comienzo = fecha;

                //El retorno del metodo del gestor es introducido en la lista de puestos
                listaDePuestos_ev.Add(objPuestoEv);
            }

            terminarConexion();

            return listaDePuestos_ev;
        }
        /*
         * - RecuperarPreguntas evaluadas tiene la misión de recuperar Las preguntas evaluadas para Un factor puntual
         *   de a la BASE DE DATOS
         */
        public List<PreguntaEvaluada> recuperarPreguntasEvaluadas(FactorEvaluado factorAsociado)
        {
            bool conexionExitosa;
            GestorEvaluacion gestorEvaluacion = new GestorEvaluacion();
            List<PreguntaEvaluada> listaDePreguntas = new List<PreguntaEvaluada>();

            string consultaSql = "SELECT p.nombre , p.codigo, p.pregunta, p.`Opcion de Respuesta Evaluada_idOpcion de Respuesta Evaluada` "
                + "FROM `pregunta evaluada` AS p "
                + "JOIN `factor evaluado` AS fac on (p.`Factor Evaluado_idFactor Evaluado` = fac.`idFactor Evaluado`) "
                + "WHERE  fac.`codigo` = '" + factorAsociado.Codigo + "';";

            conexionExitosa = iniciarConexion();

            if (!conexionExitosa)
            {
                MessageBox.Show("No se realizo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            { //si el reader esta vacio, es qe no encontro a ese candidato
                MessageBox.Show("El factor no posee preguntas para ser evaluado");
                terminarConexion();
                return null;
            }

            List<int> listaIdOpRespuesta = new List<int>();
            while (reader.Read())
            {
                string cod = reader["codigo"].ToString();
                string nomPreg = reader["nombre"].ToString();
                string preg = reader["pregunta"].ToString();
                int idOpRespuesta = Int32.Parse(reader["Opcion de Respuesta Evaluada_idOpcion de Respuesta Evaluada"].ToString());

                PreguntaEvaluada preguntaEv = gestorEvaluacion.instanciarPreguntaEvaluda(cod, preg, nomPreg, factorAsociado);
                listaDePreguntas.Add(preguntaEv);
                listaIdOpRespuesta.Add(idOpRespuesta);
            }
            terminarConexion();

            //Agregamos la listas de Opciones de respuesta y las opciones para cada una de las preguntas encontradas
            for (int i = 0; i < listaDePreguntas.Count; i++)
            {
                //Se recuperan la opcion de respuesta de la pregunta
                List<OpciondeRespuestaEvaluada> opcionesRespuesta = recuperarOpcionRespuestaEvaluada(listaIdOpRespuesta[i]);
                if (opcionesRespuesta != null)
                {
                    //Recuperamos la opcion que contiene la poneracion para esa pregunta
                    List<OpcionesEvaluadas> opciones = recuperarOpcionesEvaluadas(listaDePreguntas[i]);
                    //Completamos el objeto Opciones_de_respuestas_evaludas con la lista de opciones
                    opcionesRespuesta[0].ListaOpcionesEv = opciones;

                    //Realizamos la asignacion de la opcion de respuesta y las opciones corespondientes para la pregunta
                    listaDePreguntas[i].Op_respuestaEv = opcionesRespuesta[0];
                    listaDePreguntas[i].ListaOpcionesEv = opciones;
                }
            }

            return listaDePreguntas;
        }
        /*
         * - RecuperarOpcionRespuestaEvaluda tiene la misión de recuperar las opciones evaluadas para una pregunta puntual
         *   de a la BASE DE DATOS
         */
        public List<OpciondeRespuestaEvaluada> recuperarOpcionRespuestaEvaluada(int idOpcionDeRespuesta)
        {
            bool conexionExitosa;
            GestorEvaluacion gestorEvaluacion = new GestorEvaluacion();
            List<OpciondeRespuestaEvaluada> listaDeOpRespuesta = new List<OpciondeRespuestaEvaluada>();//Para el retorno de datos

            string consultaSql = "SELECT * FROM `opcion de respuesta evaluada` opcRes WHERE opcRes.`idOpcion de Respuesta Evaluada` = '" + idOpcionDeRespuesta + "';";

            conexionExitosa = iniciarConexion();

            if (!conexionExitosa)
            {
                MessageBox.Show("No se pudo realizar la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            { //si el reader esta vacio, es qe no encontro a esa opcion de respuesta evaluada
                MessageBox.Show("No se encontro la opcion de respuesta solicitada");
                terminarConexion();
                return null;
            }

            while (reader.Read())
            {
                string nomOpcionResp = reader["nombre"].ToString();
                string codigo = reader["codigo"].ToString();

                OpciondeRespuestaEvaluada OpcionResp = gestorEvaluacion.instanciarOpRespuestaEv(nomOpcionResp, codigo);
                listaDeOpRespuesta.Add(OpcionResp);
            }
            terminarConexion();

            return listaDeOpRespuesta;
        }
        /*
         * - RecuperarOpcionesEvaludas tiene la misión de recuperar las opciones evaluadas para una pregunta puntual
         *   de a la BASE DE DATOS
         */
        public List<OpcionesEvaluadas> recuperarOpcionesEvaluadas(PreguntaEvaluada pregAsociada)
        {
            bool conexionExitosa;
            GestorEvaluacion gestionEvaluacion = new GestorEvaluacion();
            List<OpcionesEvaluadas> listaDeOpciones = new List<OpcionesEvaluadas>();//Para el retorno de datos

            string consultaSql = "SELECT op.nombre, pr_op.ponderacion, opr_op.ordenDeVisualizacion "
            + "FROM `pregunta evaluada_opcion evaluada` pr_op "
            + "JOIN `pregunta evaluada` pr on (pr_op.`Pregunta Evaluada_idPregunta Evaluada` = pr.`idPregunta Evaluada` AND pr.codigo = '" + pregAsociada.Codigo + "') "
            + "JOIN `opcion evaluada` op on (pr_op.`Opcion Evaluada_idOpcion` = op.idOpcion) "
            + "JOIN `opcion de respuesta evaluada_opcion evaluada` opr_op on (pr_op.`Opcion Evaluada_idOpcion` = opr_op.`Opcion Evaluada_idOpcion`) "
            + "GROUP BY nombre;";

            //llamamos al metodo "iniciar conexion"
            conexionExitosa = iniciarConexion();

            //Evaluamos si la conexion se realizo con exito
            if (!conexionExitosa)
            {
                MessageBox.Show("Fallo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            { //si el reader esta vacio, es qe no encontro a ese candidato
                MessageBox.Show("No se entraron opciones para la pregunta solicitada");
                terminarConexion();
                return null;
            }

            while (reader.Read())
            {
                //opc.nombre, opR_opc.ordenDeVisualizacion, pr.`idPregunta Evaluada`
                string nomOpcion = reader["nombre"].ToString();
                int ponderacion = Int32.Parse(reader["ponderacion"].ToString());
                int ordenVisualizacion = Int32.Parse(reader["ordenDeVisualizacion"].ToString());

                OpcionesEvaluadas preguntaEv = gestionEvaluacion.instanciarOpcionEv(nomOpcion, ponderacion, ordenVisualizacion);
                listaDeOpciones.Add(preguntaEv);
            }

            terminarConexion();

            return listaDeOpciones;
        }
        /*
         * - RecuperarFactoresEvaludos tiene la misión de recuperar los factores evaluados para una competencia puntual
         *   de a la BASE DE DATOS
         */
        public List<FactorEvaluado> recuperarFactoresEvaluados(CompetenciaEvaluada competenciaAsociada)
        {
            bool conexionExitosa;
            GestorEvaluacion gestorEvaluacion = new GestorEvaluacion();
            List<FactorEvaluado> listaDeFactores = new List<FactorEvaluado>();//Para el retorno de datos

            string consultaSql = "SELECT `factor evaluado`.nombre ,`factor evaluado`.codigo ,nroOrden " +
            "FROM `factor evaluado` " +
            "JOIN `competencia evaluada` comEv on (comEv.`codigo` = '" + competenciaAsociada.Codigo + "') " +
            "WHERE `factor evaluado`.`Competencia Evaluada_idCompetencia Evaluada` = comEv.`idCompetencia Evaluada`;";

            conexionExitosa = iniciarConexion();

            if (!conexionExitosa)
            {
                MessageBox.Show("No se realizo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            { //si el reader esta vacio, es qe no encontro a ese candidato
                MessageBox.Show("El puesto no posee competencias para ser evaluado");
                terminarConexion();
                return null;
            }

            while (reader.Read())
            {
                string cod = reader["codigo"].ToString();
                string nomFactor = reader["nombre"].ToString();
                int nrOrden = Int32.Parse(reader["nroOrden"].ToString());
                //Ahora vamos a crear una instancia del objeto factor, a través del gestor de factores
                FactorEvaluado factorEv = gestorEvaluacion.instanciarFactorEvaluado(cod, nomFactor, competenciaAsociada, nrOrden);
                listaDeFactores.Add(factorEv);
            }
            terminarConexion();

            //Agregamos la lista de Factores para cada una de las competencias encontradas
            for (int i = 0; i < listaDeFactores.Count; i++)
            {
                List<PreguntaEvaluada> preguntasList = recuperarPreguntasEvaluadas(listaDeFactores[i]);
                if (preguntasList != null)
                {
                    for (int j = 0; j < preguntasList.Count; j++)
                    {
                        listaDeFactores[i].addPregunta(preguntasList[j]);
                    }
                }
                /*else
                    listaDeFactores.Add(preguntasList[i]);*/
            }

            return listaDeFactores;
        }
        /*
         * - RecuperarCompetenciasEvaludas tiene la misión de recuperar una competencia evaluada según su ID
         *   que corresponde a la BASE DE DATOS
         */
        public List<CompetenciaEvaluada> recuperarCompetenciasEvaluadas(int idCompetenciaEv)
        {
            bool conexionExitosa;
            GestorEvaluacion gestorEvaluacion = new GestorEvaluacion();
            List<CompetenciaEvaluada> listaDeCompetencias = new List<CompetenciaEvaluada>();//Para el retorno de datos

            string consultaSql = "SELECT * FROM `competencia evaluada` WHERE `competencia evaluada`.`idCompetencia Evaluada` ='" + idCompetenciaEv + "';";

            conexionExitosa = iniciarConexion();

            if (!conexionExitosa)
            {
                MessageBox.Show("No se realizo la conexion con la base de datos");
                terminarConexion();
                return null;
            }

            MySql.Data.MySqlClient.MySqlCommand comando;
            comando = ObjConexion.CreateCommand();
            comando.CommandText = consultaSql;

            MySqlDataReader reader = comando.ExecuteReader();

            if (!reader.HasRows)
            { //si el reader esta vacio, es qe no encontro a ese candidato
                MessageBox.Show("El puesto no posee competencias para ser evaluado");
                terminarConexion();
                return null;
            }

            while (reader.Read())
            {
                //Verificamos que la competencia no este eliminada
                CompetenciaEvaluada competenciaEv;

                if (reader["eliminado"].ToString() == "")
                {
                    string cod = reader["codigo"].ToString();
                    string nomComp = reader["nombre"].ToString();
                    string descrip = reader["descripcion"].ToString();

                    //Si no fue eliminada, la instaciamos con el gestor de evaluacion con los datos obtenidos
                    competenciaEv = gestorEvaluacion.instanciarCompetenciaEvaluda(cod, nomComp, descrip);
                }
                else//Si fue eliminada, instanciamos una competencia con el atrubuto 'codigo' inicializado en ELIMINADA
                    competenciaEv = gestorEvaluacion.instanciarCompetenciaEvaluda("ELIMINADA", null, null);

                listaDeCompetencias.Add(competenciaEv);
            }

            terminarConexion();

            //Agregamos la lista de Factores para cada una de las competencias encontradas
            for (int i = 0; i < listaDeCompetencias.Count; i++)
            {
                //Recuperamos los factores asociados a la competencia
                List<FactorEvaluado> factoresList = recuperarFactoresEvaluados(listaDeCompetencias[i]);
                if (factoresList != null)
                {
                    for (int j = 0; j < factoresList.Count; j++)
                    {
                        //Para la competencia Evaluada que esta resguardada en la posición i
                        //le agregamos a su lista de factores, el factor evaluado que se encentre en la posición j
                        listaDeCompetencias[i].addFactor(factoresList[j]);
                    }
                }
            }

            return listaDeCompetencias;
        }