Eu sei como pegar os valores da request. Eu nao sei como construir a string do Select . Andei pesquisando a classe StringBuilder mas nao to conseguindo resolver.
acho que você pode usar o método append() de StringBuilder.
Seria mais ou menos assim
StringBuilderquery=newStringBuilder();query.append("Select * from produtos WHERE PARAMETRO_UM = ");query.append(VALOR_UM);query.append("AND PARAMETRO_DOIS = ");query.append(VALOR_DOIS);
e depois é só usar query.toString().
Não sei se era bem isso que você pensava mais o uso de StringBuilder é assim.
douglasmorais
entao, valeu pela dica.
Mas eu acho que o meu problema eh mais de logica tambem ( tambem, rs ).
Um cara aqui do Guj me deu a seguinte sugestao:
StringBuildersql=newStringBuilder("select * from lentes where ");Set<String>parameterNames=request.getParameterMap().keySet();for(StringnameParameter:parameterNames){sql.append(request.getParameter(nameParameter)).append(",");}PrintWriterout=response.getWriter();out.println("<html> "+sql.toString().substring(0,(sql.toString().length()-1))+" </html>");
So que nao resolveu meu problema pq eu preciso pegar nas checkboxes o nome do Parametro e o Valor. Sao de 0 a 5 Opcoes possiveis la no checkbox. Como eu faco pra colocar os ANDs da Select ?
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringBuildersql=newStringBuilder("select * from tabela where ( ");Set<String>set=request.getParameterMap().keySet();for(StringnameParameter:set){sql.append(nameParameter).append("=").append(request.getParameter(nameParameter).concat(" and "));}System.out.println(sql.toString().substring(0,(sql.toString().length()-5)).concat(" )"));processRequest(request,response);}
Na primeira vez voce tinha pedido (ou deixado intender) que queria os trazer determinados campos ...não filtrar por determinados campos ...mas de qualquer forma com uma pequena alteração é possivel fazer isso.
(me deve uma cerveja :) )
douglasmorais
valeu Markao !!! Uma caixa de Serra Malte pra vc me velho !!! valeu mesmo…
douglasmorais
Markao, eu testei mas ainda nao deu certo nao… A string do select ta sendo gerada apenas com um unico Parametro/Valor mesmo quando marcado mais de 1 checkbox
Markus_Alemao
Cara aqui esta funcionando:
todos os campos marcados:
select * from tabela where ( c_um=um and c_dois=dois and c_tres=tres )
somente dois:
select * from tabela where ( c_um=um and c_tres=tres )
Envia seu form para dar uma olhada.
douglasmorais
Markus, nem sei como te agradecer a atencao que vc tem dado cara…
Vixe …cara veja meu exemplo …eu uso o nome do checkbox como se foce o nome do campo no banco de dados e o valor do mesmo o valor que sera atribuido na clausula where do sql.
Pensa ai mostre seus resultados que amanha eu dou uma olhada.
douglasmorais
Markao, pra fazer isso que vc ta falando vai ficar inviavel pq nesse caso eu teria que ter no banco de dados 1 campo pra cada possivel caracteristica do produto e, na verdade, eu so tenho o campo MATERIAL
douglasmorais
Ow Markao, acho que achei um metodo que faz o que eu quero ( no que diz respeito a pegar o PARAMETRO/VALOR da request).
Agora soh to precisando criar a string do Select.
Da uma olhada ae cara:
protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//Setresponsecontenttyperesponse.setContentType("text/html");PrintWriterout=response.getWriter();Stringtitle="Reading All Form Parameters";StringdocType="<!doctype html public \"-//w3c//dtdhtml4.0" + "transitional//en\">\n";out.println(docType+"<html>\n"+"<head><title>"+title+"</title></head>\n"+"<body bgcolor=\"#f0f0f0\">\n"+"<h1 align=\"center\">"+title+"</h1>\n"+"<table width=\"100%\" border=\"1\" align=\"center\">\n"+"<tr bgcolor=\"#949494\">\n"+"<th>Param Name</th><th>Param Value(s)</th>\n"+"</tr>\n");EnumerationparamNames=request.getParameterNames();while(paramNames.hasMoreElements()){StringparamName=(String)paramNames.nextElement();out.print("<tr><td>"+paramName+"</td>\n<td>");String[]paramValues=request.getParameterValues(paramName);//Readsinglevalueddataif(paramValues.length==1){StringparamValue=paramValues[0];if(paramValue.length()==0)out.println("<i>No Value</i>");elseout.println(paramValue);}else{//Readmultiplevalueddataout.println("<ul>");for(inti=0;i<paramValues.length;i++){out.println("<li>"+paramValues[i]);}out.println("</ul>");}}out.println("</tr>\n</table>\n</body></html>");}
Markus_Alemao
Douglas faz o seguinte …me envia 3 exemplos com consultas as quais voce pretende gerar para eu analisar.
ViniGodoy
Para queries você geralmente não usa StringBuilder. É mais seguro e mais fácil usar o PreparedStatement:
PreparedStatement stmt = "SELECT * FROM produtos WHERE valor < ? AND categoria=?";
stmt.setDouble(1, valorMaximo);
stmt.setInteger(2, idCategoria);
douglasmorais
Vini, valeu por responder…
Mas essa sua dica ae soh da certo com PARAMETRO/VALOR previamente conhecidos, nao eh ? No meu caso eu nao tenho como saber quais serao os PARAMETROS/VALOR marcados na checkboxe. Dai o motivo de usar o StringBuilder para fazer a string do select. Tipo, pega no request os Name e os Value do checkbox, que podem ser mais de 1, e cria a string select. Ai que o bicho pega. Eu pego o NAME com o getParameterNames() e o VALUE com getParameterValues() mas nao sei como montar a string Select.
Markus_Alemao
Cara acho que eu lhe confundi um pouco com o StringBuilder ele praticamente indifere de uma String normal, mas tem mais eficiencia em casos em que seja necessario concatenar varias Strings(preciosismo que talvez não se justifique nesse caso …mas é sempre valido aprender algo novo ).
Aproveita e manda os campos da sua tabela do banco para ilustrar melhor o problema.
Select * from lentes WHERE material=acrilico AND material=policarbonato AND material=transistions AND tratamento=anti-reflexo
Existe um problema logico aqui o campo material jamais ira assumir dois valores sendo ele unico.
Caso uma lente possua dois ou mais materias voce tera que fazer outra tabela ex material onde existira uma chave estrangeira que referenciara o identificador da lente.
douglasmorais
Pode cre Markao… tem coisa errada ae… rs
douglasmorais
desculpa ae a amolacao… eh que eu to comecando…
douglasmorais
Markao, olha soh o que eu achei aqui:
Markus_Alemao
Sim isso é uma possibilidade…porem tem muitos condicionais nesse negocio ha de existir uma solução mais elegante e robusta :).
Aproveitando me responda o seguinte :
Uma lente possui mais de um material ?
Uma lente possui mais de um indice de refracao ?
douglasmorais
douglasmorais
Nao. Uma lente pode ter um unico Material. Um unico Indice de Refracao, enfim um unico valor para cada campo.
Eh que eu queria fazer uma consulta de precos. E essa consulta me retornaria os valores das lentes, por exemplo, Cristal e Acrilico.
Markus_Alemao
Ok …porem primeiramente temos que organizar o seu banco de dados. Já que é de pouco valia uma consulta em uma base de dados incoerente.
Markus_Alemao
douglasmorais:
Nao. Uma lente pode ter um unico Material. Um unico Indice de Refracao, enfim um unico valor para cada campo.
Eh que eu queria fazer uma consulta de precos. E essa consulta me retornaria os valores das lentes, por exemplo, Cristal e Acrilico.
Hum …bingo !!
seguinte voce tem que usar or no lugar de and ex :
Essa consulta vai retornar todas as lentes em que o campo material possua o valor ‘policarbonato’ ou ‘acrilico’.
concorda …? sem corda ? qual a diferença dos operadores ?
douglasmorais
Nao entendo. pq que vc acha que ta incoerente ? Vc acha que eu deveria ter uma outras tabelas ( Material, Tratamento, IndiceRefracao ) e linkar todas com a tabela produto por uma foreign key ?
douglasmorais
mas o OR nao vai limitar ? tipo, cristal ou acrilico e nao os dois… ?
Markus_Alemao
erro
douglasmorais
o OR da certo sim, acabei de testar no netbeans, naquela parte do banco de dados do netbeans
Markus_Alemao
Opa desculpa …fail aqui no forum
Quanto a incoerencia que eu me referia ficou fora do contexto. Esta tudo bem com sua base
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringBuildersql=newStringBuilder("select * from lentes where ( ");Set<String>set=request.getParameterMap().keySet();for(StringnameParameter:set){if(nameParameter.startsWith("material")){sql.append("material").append("=").append("'"+request.getParameter(nameParameter).concat("'").concat(" or "));}}System.out.println(sql.toString().substring(0,(sql.toString().length()-5)).concat(" )"));processRequest(request,response);}
Isso resolve o problema quanto aos materias, agora só falta verificar e montar a consulta com os demais campos. Se baseia nisso e tenta fazer para os demais.