none
¿Como buscar registros que coincidan en ciertos campos de una tabla? RRS feed

  • Pregunta

  • Hola a todos nuevamente desarrollo en C#, framework 3.5, SQL server 2008 y visual estudio 2010.

    Les comento tengo esta pequeña aplicación donde el alumno ingresa su matricula le da click en el botón buscar y
    va a la base de datos y me trae todos los talleres a los cuales se puede inscribir, los talleres me los muestra en un
    grigview que se llama gvTalleres como lo muestro en la imagen.

    Lo que quiero hacer es cuando el alumno se registre a un taller vaya a la base de datos y busque en mi tabla de talleres
    la fecha, dias, horario y si coinciden todos estos campos mande un mensaje de que no se puede registrar porque ya existe un o varios talleres que coinciden
    con fecha fecha, dias y horario pero si no coinciden alguno de ellos registre en la base de datos

    Entonces tengo mi tabla talleres que se llama CSFCatTalleres donde tiene los siguientes campos:
    CTall_Numero varchar 9
    CTall_Descri varchar 255
    CCam_Numero int 0
    CTall_Horario varchar 15
    CTall_Gpo varchar 5
    CTall_Dias varchar 255
    CTall_Fecha date 0
    CTall_Cupo int 0

    Y cuando el alumno se registra lo guardo en una tabla que se llama ORegBoleta donde tiene los siguientes campos:
    OReg_Id int 0
    OReg_Matric varchar 9
    OReg_ClaveTaller varchar 9
    OReg_DescTaller varchar 255
    OReg_Gpo varchar 9
    OReg_Tallerista varchar 9
    OReg_Calif int 0
    OReg_Fecha date 0
    OReg_Dias varchar 255
    OReg_Horario varchar 15

    Cree una clase llamada clsDuplicados para buscar lo que coincidiera con su metodo llamado existeTalleres
    public class clsDuplicados
    {
        public bool existeTalleres(string cveTaller, DateTime fecha, string dias, string horario)
        {
            String query = @"SELECT COUNT(*) FROM Catalogo.CSFCatTalleres WHERE CTall_Numero = @cveTaller
                                                                       AND CTall_Fecha = @fecha
                                                                       AND CTall_Dias = @dias
                                                                       AND CTall_Horario = @horario";

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnTalleres"].ToString()))
            {
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.Parameters.AddWithValue("@cveTaller", cveTaller);
                cmd.Parameters.AddWithValue("@fecha", fecha);
                cmd.Parameters.AddWithValue("@dias", dias);
                cmd.Parameters.AddWithValue("@horario", horario);
                conn.Open();

                int count = Convert.ToInt32(cmd.ExecuteScalar());

                if (count == 0)
                {
                    return false;
                }
                else
                    return true;
            }
        }
    }

    Postriormente la validacion de que si coinciden los talleres lo hice de esta manera
    protected void btnRegistra_Click(object sender, EventArgs e)
    {

    clsDuplicados objDuplica = new clsDuplicados();

                    string cveTaller = gvr.Cells[1].Text;
                    string descTaller = gvr.Cells[2].Text;                               
                    string descTallerGpo = gvr.Cells[2].Text + ' ' + "grupo" + ' ' + gvr.Cells[4].Text;
                    string gpoTaller = gvr.Cells[4].Text;
                    string horario = gvr.Cells[3].Text;
                    string dias = gvr.Cells[6].Text;
                    DateTime fechaTaller = Convert.ToDateTime(gvr.Cells[7].Text.ToString());
                    int cupo = Convert.ToInt32(gvr.Cells[8].Text);

                   if (objDuplica.existeTalleres(cveTaller, fechaTaller, dias, horario))
                    {
                        cargaTalleres();
                        string mensaje = @"<script type='text/javascript'>
                                               alert('No puede inscribirse ya que se encuentra inscrito a un taller con el mismo horario, dia y fecha');
                                               </script>";
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                    }
                    else
                    {
                        objRegistro.insertaBoleta(matricula, cveTaller, descTallerGpo, gpoTaller, fechaTaller, dias, horario);
                        cargaTalleres();

                        string mensaje = @"<script type='text/javascript'>
                                               alert('Se guardo el registro correctamente');
                                               </script>";
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                        Cont = 1;
                    }

    }

    Pero algo estoy haciendo mal creo que es mi logica o no se ya que cuando se registra el primer alumno lo registra sin problemas pero cuando quiero registrar a los demas ya no me deja porque me manda el mensaje 'No puede inscribirse ya que se encuentra inscrito a un taller con el mismo horario, dia y fecha'

    martes, 24 de febrero de 2015 18:51

Respuestas

  • Hola

    Dos preguntas:

    Primero, si quieres saber si el alumno ya está matriculado para un taller que coincida con ciertos parámetros, ¿no deberías contar los registros coincidentes en la tabla ORegBoleta?, finalmente es ahí donde se encuentra los talleres donde el alumno se ha matriculado

    Segundo, No veo ningún filtro que busque las coincidencias por alumno, porque la consulta busca las coincidencias para todos, creo que el campo que define al alumno es OReg_Matric

    Esperamos tu feed-back

    martes, 24 de febrero de 2015 19:08

Todas las respuestas

  • Hola

    Dos preguntas:

    Primero, si quieres saber si el alumno ya está matriculado para un taller que coincida con ciertos parámetros, ¿no deberías contar los registros coincidentes en la tabla ORegBoleta?, finalmente es ahí donde se encuentra los talleres donde el alumno se ha matriculado

    Segundo, No veo ningún filtro que busque las coincidencias por alumno, porque la consulta busca las coincidencias para todos, creo que el campo que define al alumno es OReg_Matric

    Esperamos tu feed-back

    martes, 24 de febrero de 2015 19:08
  • Hola,

    Puedes retornar un resultado producto de una expresión lógica

    int count = Convert.ToInt32(cmd.ExecuteScalar());
    
    return count > 0;

    martes, 24 de febrero de 2015 19:14
  • hola

    en el evento btnRegistra_Click de donde sale gvr ?

    porque me parece qe esta tomando simpre la misma row, y por eso la da siempre por existente

    valida si en cada accion tomas una row diferente para validar si el taller existe asignado al alumno

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 24 de febrero de 2015 19:17
  • Pues el código completo esta aquí en entonces como lo comentas si no debo de contar los registros seria por medio de otra sentencia de SQL

    protected void btnRegistra_Click(object sender, EventArgs e)
        {
            visible();
           
            string matricula = txtMatricula.Text;
            CheckBox chkitemrow = (CheckBox)(gvTalleres.FindControl("chkTaller"));
            Int32 Cont = 0;
            CheckBox chkItemRow = (CheckBox)(gvTalleres.FindControl("chkTaller"));

            foreach (GridViewRow gvr in gvTalleres.Rows)
            {
                CheckBox chkitem = (CheckBox)(gvr.FindControl("chkTaller"));
                if (chkitem.Checked)
                {               
                    string cveTaller = gvr.Cells[1].Text;
                    string descTaller = gvr.Cells[2].Text;                               
                    string descTallerGpo = gvr.Cells[2].Text + ' ' + "grupo" + ' ' + gvr.Cells[4].Text;
                    string gpoTaller = gvr.Cells[4].Text;
                    string horario = gvr.Cells[3].Text;
                    string dias = gvr.Cells[6].Text;
                    DateTime fechaTaller = Convert.ToDateTime(gvr.Cells[7].Text.ToString());
                    int cupo = Convert.ToInt32(gvr.Cells[8].Text);


                    if (objDuplica.existeTalleres(cveTaller, fechaTaller, dias, horario))
                    {
                        cargaTalleres();
                        string mensaje = @"<script type='text/javascript'>
                                               alert('No puede inscribirse ya que se encuentra inscrito a un taller con el mismo horario, dia y fecha');
                                               </script>";
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                    }
                    else
                    {
                        objRegistro.insertaBoleta(matricula, cveTaller, descTallerGpo, gpoTaller, fechaTaller, dias, horario);
                        cargaTalleres();

                        string mensaje = @"<script type='text/javascript'>
                                               alert('Se guardo el registro correctamente');
                                               </script>";
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                        Cont = 1;
                    }
                }
            }
            if (Cont == 0)
                {
                    string mensaje = @"<script type='text/javascript'>
                                               alert('No ha seleccionado ningún taller');
                                               </script>";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                }
           
        }   

    martes, 24 de febrero de 2015 20:39