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

consulta a bd con multiples parametros

Estas en el tema de consulta a bd con multiples parametros en el foro de Java en Foros del Web. Hola a todos y feli año, tengo una duda que aunque ya he estado indagando por la web no logro solucionarla, tengo un completo sitio ...
  #1 (permalink)  
Antiguo 05/01/2008, 19:33
 
Fecha de Ingreso: enero-2008
Mensajes: 203
Antigüedad: 16 años, 3 meses
Puntos: 1
Información consulta a bd con multiples parametros

Hola a todos y feli año, tengo una duda que aunque ya he estado indagando por la web no logro solucionarla, tengo un completo sitio web que necesito realize busuqedas con multiples parametros, para ellos tengo una de las paginas web que muestra todas las opciones que el usuario puede utilizar, mi duda surge, en si son 5 opciones por ejemplo y el usuario nada mas selecciona 3 como hago para la realizacion del query de sql, no siempre por no decir casi nunca el usuario va a seleccionar todas las opciones solamente las que el necesite, como se realizaria???, muchas gracias...
  #2 (permalink)  
Antiguo 05/01/2008, 22:03
Avatar de CrisaN.cl  
Fecha de Ingreso: abril-2007
Mensajes: 18
Antigüedad: 17 años
Puntos: 0
Re: consulta a bd con multiples parametros

Mira nose en el lenguaje que estas programando pero es simple. Supongamos que tenemos estas busquedas.

Nombre
Apellido
Edad
Direccion
Email

Lo primero que debes hacer es darle algun nombre al componente donde sera escrito el parametro de busqueda, si tenemos un ComboBox o un TextField le pondremos.

cmbNombre o txfNombre
cmbApellido o txfApellido
etc.

Obviamente estos le pondras un valor null o cero al comienzo.

das por defecto el valor general para todos.

nombre = "?";
apellido ="?";
edad = "?";
etc....

esto significa que te buscara todos, es como un select *.
Entonces haces un query general y si alguien cambia el valor de algun combobox, dejara de ser "?" sino que sera el item seleccionado.

pseudocodigo.

si selecciona nombre
nombre = cmbNombre.getValue();
si selecciona apellido
apellido = cmbApellido.getValue();
si selecciona edad
edad = cmbEdad.getValue();
si selecciona direccion
direccion = cmbdireccion.getValue();

etc...etc...


query = "selec * from persona where nombre = "+nombre+" and apellido "+apellido+" etc...etc...
  #3 (permalink)  
Antiguo 06/01/2008, 05:12
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: consulta a bd con multiples parametros

Puestos a concatenar strings, peligroso por suspeptible a SQL injection, en vez de usar PreparedStatement, puedes concatenar únicamente las partes que te hagan falta y listo.

Lo del "valor por defecto" no acabo de entenderlo, pero en algunos casos una comparacion simple es dificil que devuelva todos los valores como una ausencia de comparación. Si la columna permite nulls, por ejemplo.
  #4 (permalink)  
Antiguo 06/01/2008, 10:28
 
Fecha de Ingreso: enero-2008
Mensajes: 203
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: consulta a bd con multiples parametros

muchas gracias por la pronta respuesta, voy intentar implementar lo que me comentaste y cualquier cosita te aviso, el lenguaje de programacion en jsp, pero claro los query estan en un .java aparte, seria codigo java puro.

GRACIAS!!!
  #5 (permalink)  
Antiguo 06/01/2008, 12:14
 
Fecha de Ingreso: enero-2008
Mensajes: 203
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: consulta a bd con multiples parametros

hola crisa, pues te comento que he intentado hacer lo que me dijiste y en realidad deberia funcionar perfecto, pero al intentar realizar lo que me comentaste me percate que el diseño de mi base de datos no me permite esto, te voy a explicar porque. necesito realizar una consulta a una tabla que contiene ciertas propuestas, en ella hay por ejemplo un id_cliente que es el identificador unico del cliente no su nombre directamente, al igual que el id_socio, es un numero unico que lo identifica, esto implica que debo colocar busquedas dentro de busquedas, ya que si coloco como nombre gerente maria debo buscar todos los gerentes maria estraer todos los id y a partir de alli realizar otras busquedas,y por supuesto ya me di cuenta que eso no depende de java, sino de mysql, voy cambiar esta pregunta de foro, de todas formas si sabes como resolver esta duda te lo agradeceria, gracias!!!
  #6 (permalink)  
Antiguo 06/01/2008, 14:08
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: consulta a bd con multiples parametros

Si de una consulta a otra cambias las tablas que estan implicadas, no hay forma de pasarlo como parametro, ni en MySQL ni en ninguna BDD que conozca, y entonces hay que jugar a las concatenaciones o simplemente tener preparadas varias sentencias diferentes y escoger entre una u otra dependiendo de los parametros.
S!
  #7 (permalink)  
Antiguo 06/01/2008, 14:15
 
Fecha de Ingreso: enero-2008
Mensajes: 203
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: consulta a bd con multiples parametros

Cita:
Iniciado por GreenEyed Ver Mensaje
Si de una consulta a otra cambias las tablas que estan implicadas, no hay forma de pasarlo como parametro, ni en MySQL ni en ninguna BDD que conozca, y entonces hay que jugar a las concatenaciones o simplemente tener preparadas varias sentencias diferentes y escoger entre una u otra dependiendo de los parametros.
S!
pues realmente no me agrada mucho la idea de tener que hacer muchas sentencias ya que serian demasiadas, la cosa esta en que no se concatenar, como es???,
  #8 (permalink)  
Antiguo 06/01/2008, 14:39
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: consulta a bd con multiples parametros

Cita:
Iniciado por ericaadbr Ver Mensaje
pues realmente no me agrada mucho la idea de tener que hacer muchas sentencias ya que serian demasiadas, la cosa esta en que no se concatenar, como es???,
¿Demasiadas? ¿De cuantas posibilidades estamos hablando? Lo normal es que no sean muchas por que si no suena a que la funcion esta siendo demasiado genérica... aunque a veces sea necesario.

Concantenar... pues no tiene ningun "secreto" aparte de una programación cuidadosa y tener en cuenta todos los casos posibles. Lo malo que tiene la concatenación es que la depuración suele ser más engorrosa.

Yo lo que suelo hacer en estos casos es hacer varios StringBuilders (StringBuffers si hablamos de Java < 5), uno para el select(opcional si no es un *), otro para el from y otro para el where (a veces uno extra para el order by) y usar condicionales para concatenar usando por ejemplo Sets.
Un ejemplo, aunque hay multiples formas de hacerlo
Cita:
// Primero determinas los elementos para construir
StringBuilder selectClause = new StringBuilder("SELECT ");
Set camposSelect = new LinkedHashSet();
StringBuilder fromClause = new StringBuilder(" FROM ");
Set tablasFrom= new LinkedHashSet();
StringBuilder whereClause = new StringBuilder(" WHERE ");
Set condicionesWhere= new LinkedHashSet();

if(paramIdX !=null)
{
camposSelect.add("NOMBRE_X");
tablasFrom.add("TABLA_X");
condicionesWhere.add("ID_X='" + paramIdX + "'");
}
...
// Y al final recorres los Set y concatenas
Object[] campos = camposSelect.toArray();
for(int i = 0;i<campos.length;i++)
{
if(i>0)
{
selectClause.append(", ");
}
selectClause.append(campos[i]);
}
... igual con el from y el where
// Y al final to clausula es concatenar el select
// con el from y el where
...
Yo incluso cuando lo hago, en vez de usar concantenacion para las comparaciones("ID_X='" + paramIdX + "'") uso PreparedStament asi que pongo interrogantes y luego pongo los valores etc. Pero es aun más complicado así que no lo voy a poner .

Con eso ya es una idea, es pura algorítmica de concatenar Strings, conjuntos etc.
S!
  #9 (permalink)  
Antiguo 06/01/2008, 16:31
 
Fecha de Ingreso: enero-2008
Mensajes: 203
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: consulta a bd con multiples parametros

pues fijate lo que he hecho nada mas he validado dos campos (aun me faltan cuatro mas), pero por los momentos funciona, mira este codigo

if(proyecto==null) proyecto="?";
if(nombrecliente==null) nombrecliente="?";
stt=con.createStatement();
rset=stt.executeQuery(
"select lista_cliente_proyectos.id_propuesta, lista_cliente_proyectos.propuesta, lista_clientes.id_cliente, lista_clientes.nombre_cliente from lista_cliente_proyectos, lista_clientes where lista_cliente_proyectos.propuesta like '%"+proyecto+"%' and lista_clientes.nombre_cliente like '%"+nombrecliente+"%' and lista_cliente_proyectos.id_cliente=lista_clientes. id_cliente");


es muy largo pero tengo que reconocer que funciona...
  #10 (permalink)  
Antiguo 06/01/2008, 16:38
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: consulta a bd con multiples parametros

Ya te he dicho que hay multiples formas, las hay mas largas, las hay mas cortas, las hay mas faciles de mantener, las hay mas seguras... he ahi la gracia de programar y por que es más un arte que una ciencia .
  #11 (permalink)  
Antiguo 08/01/2008, 16:58
rdm
 
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires, Argentina
Mensajes: 57
Antigüedad: 20 años, 5 meses
Puntos: 0
Re: consulta a bd con multiples parametros

Hola, te tiro una idea que a mí me funciona perfecto, vamos a suponer que tienes una tabla que mantiene las referencias con id a otras tablas, por ejemplo: nro_id, cod_documento, nombre, cod_provincia, cod_estado, tu problema es que tienes los campos cod_documento, cod_provincia y cod_estado en tablas externas y referenciadas por un id, entonces cuando quieres realizar la búsqueda por la descripción del documento(ej, dni, ci, cpf, etc que es lo que verá el operador en tu página de búsquedas), o por provincia, se te complica, yo he resueldo esto realizando una vista en la cual enlazo las tablas auxiliares y los campos de id y realizo las consultas sobre la vista y no sobre las tablas principales ni auxiliares. Luego para generar el filtro de búsqueda en forma dinámica, utiliza la siguiente estructura:

dimensionas un string cad_sql = "",
si el operador seleccionó provincia, concatenas a cad_sql el nombre del campo y el valor enviado desde tu formulario,
luego pones otro if para el próximo campo y te fijas si cad_sql tiene contenido distinto de "", entonces sabrás que tienes que concatenar el filtro usando un AND y así con todos los campos que te propone el filtro, por último, si el usuario no realizó ninguna selección, lo podrás determinar fijandote si cad_sql es igual a "", con lo cual, si es necesario, podrás aplicar un select sin filtro.

Saludos y suerte en tu proyecto.

pd. este código es independiente del lenguaje de programación y base de datos que uses, pues estás construyendo dinamicamente el select y luego lo aplicas a tu base de datos.
  #12 (permalink)  
Antiguo 09/01/2008, 06:32
 
Fecha de Ingreso: enero-2008
Mensajes: 203
Antigüedad: 16 años, 3 meses
Puntos: 1
Re: consulta a bd con multiples parametros

que buena tu respuesta, ademas que aplica en forma perfecta a lo que necesito realizar, muchisimas gracias!!!
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 21:23.