Foros del Web » Programación para mayores de 30 ;) » .NET »

Crear filtros dinámicos en consultas de bases de datos en Visual Basic 2010

Estas en el tema de Crear filtros dinámicos en consultas de bases de datos en Visual Basic 2010 en el foro de .NET en Foros del Web. Hola a todo el que lea este post, resulta que me leido esto: http://www.techotopia.com/index.php/Accessing_Databases_Using_Visual_Basic y todo funciona perfectamente, sin embargo, solamente son filtros estaticos, es ...
  #1 (permalink)  
Antiguo 17/07/2011, 21:40
Avatar de thegodinez  
Fecha de Ingreso: octubre-2010
Ubicación: Culiacán, Sinaloa
Mensajes: 54
Antigüedad: 13 años, 6 meses
Puntos: 5
Crear filtros dinámicos en consultas de bases de datos en Visual Basic 2010

Hola a todo el que lea este post, resulta que me leido esto:
http://www.techotopia.com/index.php/Accessing_Databases_Using_Visual_Basic
y todo funciona perfectamente, sin embargo, solamente son filtros estaticos, es decir, los tengo que definir dentro, ahora mi pregunta es (yo se que si existe pero no se como se) ¿Como puede crear filtros dinámicos?, es decir, preguntarle al usuario mediante un MessageBox, TextBox y guardarlo en una variable o algo similar, noto que cuando creo el filtro me agrega la palabra en comillas, y ya intente insertarle directamente un TextBox, sin embargo pasan cosas extrañas cuando los agrego. Otra es que no se en que parte se guarda las instrucciones del FillBy que se crea.
Gracias, trate de ser lo mas claro posible.

Última edición por thegodinez; 17/07/2011 a las 21:58
  #2 (permalink)  
Antiguo 18/07/2011, 07:23
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 1 mes
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)
  #3 (permalink)  
Antiguo 18/07/2011, 08:05
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 12 años, 9 meses
Puntos: 33
Respuesta: Crear filtros dinámicos en consultas de bases de datos en Visual Basic 20

Siempre hay que tener cuidado con la inyeccion de sql...
  #4 (permalink)  
Antiguo 18/07/2011, 10:05
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 1 mes
Puntos: 76
Respuesta: Crear filtros dinámicos en consultas de bases de datos en Visual Basic 20

Cita:
Iniciado por HaverRamirez Ver Mensaje
Siempre hay que tener cuidado con la inyeccion de sql...
Nos podrias explicar como realizas esa validacion?

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)
  #5 (permalink)  
Antiguo 18/07/2011, 11:06
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 12 años, 9 meses
Puntos: 33
Respuesta: Crear filtros dinámicos en consultas de bases de datos en Visual Basic 20

Yo generalmente creo un procedimiento con todos los posibles campos de filtro, y despues recorro cada objeto del form y si tiene valor le asigno el valor de lo contrario un Null, entonces en tu procedimiento pones algo asi

select campo1, campo2, campo3 from Campos
where (@FiltroC1 is null or Campo1 = @FiltroC1)
and (@FiltroC2 is null or campo2 = @FiltroC2)

Con esto cada parametro que envio se recibo en el stored como una cadena o entero y se interpreta como tal, si envio un query dynamico se esta propenso a la inyección

Etiquetas: basic, filtros, visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:29.