Asi es como yo trabajo los filtros dinamicos:
1. La consulta o ejecucion del procedimiento recibe como paremetro el WHERE, algo como esto:
SELECT campo1, campo2, campo3.... FROM mi_table WHERE @mi_where_dinamico
2. En el formulario tengo X cantidad de Objetos (TextBox, DateTimePicker, Combos, etc) donde el usuario elige los datos a filtrar.
3. Luego recorro los objetos del formulario con un ciclo como lo puedes ver en este
post
Y dentro del Ciclo armo el where que segun los datos ingresados por el usario, algo como esto:
Nota: Sintaxis no verificada XD, solo como ejemplo
Código C#:
Ver original//Variable para Construir el where, se declara fuera el ciclo
string miWhere = new String();
private void ClearTextBox(Control c)
{
if (c.GetType().Name == "TextBox")
{
if(where == "" )
where = c.Text;
else
where += c.Text;
}
if (c.GetType().Name == "ComboBox")
{
if(where == "" )
where = c.SelectValue;
else
where += where + c.SelectValue;
}
else
{
foreach (Control child in c.Controls)
ClearTextBox(child);
}
}
Ahora debes tener encuenta que ese codigo es solo para ilustrarte el como lo debes hacer pero no esta completamente funcional por varias razones.
1. En las clausulas WHERE se debe indicar el campo a filtrar.
2. Los datos que son string deben ir en comillas 'dato'
3. Si son numericos sin las comillas.
Teniendo esto en cuenta te comento el siguiente TIP.
TIP: En WindowsForms (no estoy seguro en las ultimas versiones de web, pero creo que tambien) los objetos tienen una propiedad llamada
Tag, esa propiedad almacena un
object es la que yo utilizo para almarcenar el nombre del campo, asi que estando en el ciclo hago lo siguiente
Código C#:
Ver originalprivate void ClearTextBox(Control c)
{
if (c.GetType().Name == "TextBox")
{
if(miWhere == "" )
miWhere = c.Tag.ToString() + " LIKE '%" + c.Text.Trim() + "%'";
else
miWhere += " AND " + c.Tag.ToString() + " LIKE '%" + c.Text.Trim() + "%'";
}
if (c.GetType().Name == "ComboBox")
{
//Codigo para otro tipo de objeto, pero con la misma filosofia del TextBox
}
else
{
foreach (Control child in c.Controls)
ClearTextBox(child);
}
}
Asi me quedaria algo como esto:
Código C#:
Ver originalWHERE campo1 = 'dato ingresado por el usuario'
Y eso se lo envio al procedimiento almacenado que recupera los datos sugen le filtro.
Recuerda visitar el post del ciclo, alla esta el codigo completo, aca solo te mostre una parte.
Saludos