none
Consulta SQL filtrar por variables RRS feed

  • Pregunta

  • 
    
    
    
    
    

    Buenos días,

    trabajo en ASP.NET Visual Basic y necesito hacer una consulta SQL que siga unas variables que elige el usuario en un formulario previamente diseñado. La condición indispensable es que la consulta filtre por las fechas inicial y final que selecciona el usuario: WHERE Medidas.fecha BETWEEN @fechainicial AND @fechafinal)

    El problema lo tengo cuando en el formulario hay cuatro campos más que puede seleccionar el cliente que también pueden actuar como filtros (digo "pueden" porque el usuario no tiene la obligación de rellenarlos, es decir, si el usuario rellena el campo "Modelo", la consulta deberá devolver los registros que contienen el modelo especificado, siempre dentro del rango de fechas seleccionado).

    Resumiendo: Cómo puedo hacer la consulta SQL para que me filtre siempre por fechas y filtre (si es necesario) por otros campos elegidos por el propio usuario?

    Os dejo la consulta inacabada:

    SELECT        Medidas.ID, Medidas.fecha, Medidas.Modelo, TablaModelo.DescripcionM, Medidas.Pieza, 
                       TablaPieza.DescripcionP, Medidas.Fabricante, TablaFabricante.DescripcionF, Medidas.Responsable, TablaResponsable.Nombre

    FROM           Medidas INNER JOIN
                             TablaModelo ON Medidas.Modelo= TablaModelo.CodigoM INNER JOIN
                             TablaPieza ON Medidas.Pieza = TablaPieza.CodigoP INNER JOIN
                             TablaFabricante ON Medidas.Fabricante = TablaFabricante.CodigoF INNER JOIN
                             TablaResponsable ON Medidas.Responsable= TablaResponsable.CodigoR

    WHERE        (Medidas.fecha BETWEEN @fechainicial and @fechafinal)...

    ¡Muchas gracias por atenderme!

    
    
    miércoles, 19 de noviembre de 2014 9:48

Respuestas

  • 
    

    Hola, es sencillo.

    En el where debes añadir esas varibles por ejemplo modelo y quedaria así


    WHERE        (Medidas.fecha BETWEEN @fechainicial and @fechafinal) and  (modelo=@modelo or @modelo is NULL)

    • Propuesto como respuesta JM Claudio miércoles, 19 de noviembre de 2014 9:55
    • Marcado como respuesta Chalsheh miércoles, 19 de noviembre de 2014 10:51
    miércoles, 19 de noviembre de 2014 9:55
  • Hola,

    si el usuario no rellena los campos, envialos como nulos y en la sentencia WHERE controlalo.

    Por ejemplo

    WHERE        
    	(Medidas.fecha BETWEEN @fechainicial and @fechafinal)
    	AND(Medidas.campo1 IS NULL OR Medidas.campo1 = @campo1)
    	AND(Medidas.campo2 IS NULL OR Medidas.campo2 = @campo2)
    	...

    Saludos!!!


    Víctor del Valle - http://www.vrdelvalle.net

    • Marcado como respuesta Chalsheh miércoles, 19 de noviembre de 2014 10:51
    miércoles, 19 de noviembre de 2014 9:57

Todas las respuestas

  • 
    

    Hola, es sencillo.

    En el where debes añadir esas varibles por ejemplo modelo y quedaria así


    WHERE        (Medidas.fecha BETWEEN @fechainicial and @fechafinal) and  (modelo=@modelo or @modelo is NULL)

    • Propuesto como respuesta JM Claudio miércoles, 19 de noviembre de 2014 9:55
    • Marcado como respuesta Chalsheh miércoles, 19 de noviembre de 2014 10:51
    miércoles, 19 de noviembre de 2014 9:55
  • Hola,

    si el usuario no rellena los campos, envialos como nulos y en la sentencia WHERE controlalo.

    Por ejemplo

    WHERE        
    	(Medidas.fecha BETWEEN @fechainicial and @fechafinal)
    	AND(Medidas.campo1 IS NULL OR Medidas.campo1 = @campo1)
    	AND(Medidas.campo2 IS NULL OR Medidas.campo2 = @campo2)
    	...

    Saludos!!!


    Víctor del Valle - http://www.vrdelvalle.net

    • Marcado como respuesta Chalsheh miércoles, 19 de noviembre de 2014 10:51
    miércoles, 19 de noviembre de 2014 9:57
  • Primero de todo, muchas gracias por la resupesta, JM Claudio y Victor.

    Ahora tengo otro inconveniente. Si el usuario no selecciona ningun valor en alguno de los campos, éste automaticamente coje el valor de "Todos los datos de la tabla", registro que no aparece en la BD, sino que se lo he añadido yo al dropdownlist, lugar dónde se seleccionan las variables, como valor por defecto. El campo TODOS tiene el valor de -1 (trabajo con valores).

    Imagino que debo cambiar la opción IS NULL por otra que seleccione todos los registros de la tabla, pero desconozco como hacerlo...

    miércoles, 19 de noviembre de 2014 10:38
  • Para eso visto además que tienes multivalor quedaría así:

    Si no eligen nada y como por defecto se marca -1 el filtro segundo queda anulado porque se cumple que -1=-1, y si eligen 1,2,3 tambien cumple con el modelo in(1,2,3)

    WHERE        (Medidas.fecha BETWEEN @fechainicial and @fechafinal)

    and  ('-1' in (@modelo) or modelo in (@modelo))

    Saludos y Buen dia

    Claudio

    • Propuesto como respuesta JM Claudio miércoles, 19 de noviembre de 2014 11:04
    miércoles, 19 de noviembre de 2014 11:03