Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/07/2011, 07:23
Avatar de jhonwilliams
jhonwilliams
 
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 8 meses
Puntos: 76
Respuesta: Crear filtros dinámicos en consultas de bases de datos en Visual Basic 20

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
  1. //Variable para Construir el where, se declara fuera el ciclo
  2. string miWhere = new String();
  3.  
  4.  private void ClearTextBox(Control c)
  5. {
  6.   if (c.GetType().Name == "TextBox")
  7.  {
  8.         if(where == "" )
  9.              where  =  c.Text;
  10.         else
  11.              where  +=  c.Text;
  12.   }
  13.   if (c.GetType().Name == "ComboBox")
  14.  {
  15.         if(where == "" )
  16.              where  =  c.SelectValue;
  17.         else
  18.              where  += where + c.SelectValue;
  19.  }
  20.   else
  21.   {
  22.         foreach (Control child in c.Controls)
  23.         ClearTextBox(child);
  24.    }
  25. }

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 original
  1. private void ClearTextBox(Control c)
  2. {
  3.   if (c.GetType().Name == "TextBox")
  4.  {
  5.         if(miWhere == "" )
  6.              miWhere =  c.Tag.ToString() + " LIKE '%" + c.Text.Trim() + "%'";
  7.         else
  8.              miWhere += " AND " + c.Tag.ToString() + " LIKE '%" + c.Text.Trim() + "%'";
  9.   }
  10.   if (c.GetType().Name == "ComboBox")
  11.  {
  12.      //Codigo para otro tipo de objeto, pero con la misma filosofia del TextBox
  13.  }
  14.   else
  15.   {
  16.         foreach (Control child in c.Controls)
  17.         ClearTextBox(child);
  18.    }
  19. }

Asi me quedaria algo como esto:

Código C#:
Ver original
  1. WHERE 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
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)