Ajuda! Select com resultados repetindo[Resolvido]

Pessoal, tô com um problemão aqui e preciso da ajuda de vcs para resolver isso.

É o seguinte: Tenho um formulário de pesquisa com alguns campos, este formulário submete ao arquivo PesquisaAgenda.java, lá o script monta um ArrayList com as opções selecionadas no formulário e coloca num select.

Meu problema é que nem todos os campos das opções selecionadas no formulário não estão na mesma tabela e então não funciona em somente um select.

Estou tendo problemas quando seleciono as opções de data (Inicio e Fim) para pesquisar por período.

Ex: Inicio 01-08-2010 e Fim 31-08-2010. O código abaixo, mostra como faço a pesquisa, só que tá buscando várias vezes a mesma data.

Está imprimindo assim:

2010-08-27
2010-08-27
2010-08-27
2010-08-27
2010-08-27
2010-08-27
2010-08-26

package servletsAgenda;


import java.sql.Statement;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.*;
import classes.*;

public class PesquisaAgenda extends HttpServlet {

	protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {

		response.setContentType("text/html;charset=ISO-8859-1");

		PrintWriter out = response.getWriter();

		//RECEBEOS VALORES DAS VARIÁVEIS
		String dt_reu_ini = request.getParameter("data_reu_ini");
		String dt_reu_fim = request.getParameter("data_reu_fim");
		String tecnologia = request.getParameter("tecnologia");
		String projeto = request.getParameter("projetos");
		String tipo = request.getParameter("tipo");
		String apr = request.getParameter("apr");
		new AgeBasico().setExclui(request.getParameter("exclui"));
		String retorno = null;
		
		try{
		 if (dt_reu_ini==null && dt_reu_fim==null && tecnologia.equals("")&& projeto.equals("")&& tipo.equals("")&& apr.equals("")){
			 retorno = (String) request.getSession().getAttribute("retornoSession");
		    	
		    }	
		    else
		    {
		
		String dataFormPesqIni = null;
	    String dataFormPesqFim = null;
	    
	    if (!dt_reu_ini.equals("") && !dt_reu_fim.equals("")){
	    Date data_pesqIni = new SimpleDateFormat("dd-MM-yyyy").parse(dt_reu_ini);   
		dataFormPesqIni = new SimpleDateFormat("yyyy-MM-dd").format(data_pesqIni);  
		
	
		Date data_pesqFim = new SimpleDateFormat("dd-MM-yyyy").parse(dt_reu_fim);   
		dataFormPesqFim = new SimpleDateFormat("yyyy-MM-dd").format(data_pesqFim);
		
	    }
		  
	    // monta um array com as opções de pesquisa
	    List<String> lista = new ArrayList<String>();   
	    
	        if(dataFormPesqIni!=null)
		  	   lista.add("dt_reuniao>='"+dataFormPesqIni+"'");
		    if(dataFormPesqFim!=null)
		  	   lista.add("dt_reuniao<='"+dataFormPesqFim+"'");
		    if(tecnologia!=null && !tecnologia.equals(""))
		   	   lista.add("tecnologia = '"+tecnologia+"'");
		    if(projeto!=null && !projeto.equals(""))
			   	   lista.add("assunto = '"+projeto+"'");
		    if(tipo!=null && !tipo.equals(""))
			   	   lista.add("tipo = '"+tipo+"'");
		    if(apr!=null && !apr.equals(""))
			   	   lista.add("apresentador = '"+apr+"'");
	    StringBuilder sb = new StringBuilder();     
	    for(String s : lista){     
	       sb.append(" and ").append(s);     
	    }
	    retorno = sb.toString().replaceFirst("and", "");  
	    
	    request.getSession().setAttribute("retornoSession", retorno);
	    
	    }
		} catch (Exception e) {
			 e.printStackTrace();

		 }
		
		//ABRE CONEXÃO COM O BANCO
		ConexaoUtil c = new ConexaoUtil();
		
		//MONTA LISTA COM O VALORES DAS CONSULTAS
			
	    List<Agenda> listaAgenda = new ArrayList<Agenda>(); 
	    List<AgeBasico> listaAgendaBasico = new ArrayList<AgeBasico>();

	    

        //SQL QUE BUSCA AS INFORMAÇÕES SOBRE A AGENDA
	    try{
	    	
	    	ResultSet rs = c.executeConsulta("select * from agendatopicos where"+retorno+" order by idtopicos asc");
			while (rs.next()){

			Agenda age = new Agenda();
			age.setIdAgenda(rs.getString("idagenda"));
			age.setIdTopico(rs.getString("idtopicos"));
			age.setIdSos(rs.getString("idsos"));
			age.setAssunto(rs.getString("assunto")); 
			age.setTipo(rs.getString("tipo")); 
			age.setApresentador(rs.getString("apresentador")); 
			age.setHorario(rs.getString("horario")); 
			age.setDuracao(rs.getString("duracao")); 
			age.setIdCampo(rs.getString("idcampo"));
			age.setSos(rs.getString("sos"));
			age.setDtReuniao(rs.getDate("dt_reuniao"));
		
			listaAgenda.add(age);
			}
			for (Agenda dataReu : listaAgenda) {

		    	  	
	    	ResultSet rs_basico = c.executeConsulta("select * from agendabasico where idagenda='"+dataReu.getIdAgenda()+"'order by idagenda asc");
	    	
			while (rs_basico.next()){

			AgeBasico ageBasico = new AgeBasico();
			ageBasico.setIdAgenda(rs_basico.getString("idagenda"));
			ageBasico.setIdAta(rs_basico.getString("idata"));
			ageBasico.setDtReuniao(rs_basico.getDate("dt_reuniao"));
			ageBasico.setTec(rs_basico.getString("tecnologia"));
			ageBasico.setLinkApre(rs_basico.getString("link_apre"));
			ageBasico.setAta(rs_basico.getString("ata"));
			
			listaAgendaBasico.add(ageBasico);
			
			}
			}
	} catch (SQLException e) {

		 e.printStackTrace();
	 }
	
	
	for (Agenda teste : listaAgenda){
		
		out.println(teste.getDtReuniao()+"<br>");
	}
	

	//FECHA CONEXÃO COM O BANCO DE DADOS   
	c.fechaConexao(); 

	request.setAttribute("listaAge",listaAgenda);
	request.setAttribute("listaAgeBasico",listaAgendaBasico);
	
	String nextJSP = "/agenda/agendaPesquisaRet.jsp";
	RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(nextJSP);
	dispatcher.forward(request,response);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
	try {
		processRequest(request, response);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
	try {
		processRequest(request, response);
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
}

As tabelas estão assim:

Agradeço se alguém puder ajudar

usa distinct mas talvez nao funcione pois c tem varios objetos com essa data, entao talvez c vai ter q usar um operador como o max por exemplo e group by

e outra dica ou vc usa doGet ou doPost no caso ai seria doGet nao tem formulario, outra dica voce ta fazendo toda regra de negocio ai, faz uma classe que determina o que fazer, e outra esse negocio ai de simpleDateFormat faz um factory pra isso bem melhor, isso sao apenas dicas que eu to te dando se vc acha bom implementar ou nao é com vc =)

Obrigado pelas dicas guialeixo!

Já usei distinct,group by e não funcionou, estou quebrando a cabeça aqui de como resolver isso. Talvez mudar a estrutura das tabelas, sei lá…

As data que se repetem estão na tabela agendatopicos, mas na verdade precio delas somente para selecionar outras informações na tabela agendabasico, por isso preciso pegá-las somente uma vez

Alguma outra dica

Provavelmente os outros campos dos registros nao sao identicos, entao seria melhor especificar quais campos gostaria de carregar e usar o distinct!

Ok Miguel,

poderia me dar um exemplo, pois já fiz de tudo e não resolve. Já usei distinct

Se usar distinct da forma que está você não terá garantia de obter os valores corretos entre as linhas 132 e 140. O que pode ser feito é outro select, usando distinct, só para pegar as datas ou deixa com está e armazenar as datas em uma estrutura auxiliar para serem mostradas depois.

Att.

Blz Adelar! Obrigado por responder…

Você poderia me dar um exemplo deste distinct no código?

Pode ser após a linha 143. Segue parte do que seria o código:

[code]ResultSet rs_basico = c.executeConsulta(“select distinct(dt_reuniao) from agendabasico where idagenda=’”+dataReu.getIdAgenda()+"'order by idagenda asc");
while (rs_basico.next()){
// armazena o valor obtido em uma lista, por exemplo, que poderá ser usada para mostrar os valores depois
rs_basico.getDate(“dt_reuniao”);

}[/code]

Att.

Outra forma seria (não validei com o compilador, mas acho que seria isso):

Na linha 127:

ArrayList list = new ArrayList();

Substitui a linha 135 por:

Date date=rs_basico.getDate("dt_reuniao"); ageBasico.setDtReuniao(date); int index = Collections.binarySearch(list, date); if(index==-1) list.add(date);
Daí na linha 150 pode ser usada a list para mostrar as datas.

Att.

Adelar, obrigado pelas dicas…

Resolvi meu problema assim:

//SQL QUE BUSCA AS INFORMAÇÕES SOBRE A AGENDA
	    try{
            ResultSet rs_id = c.executeConsulta("select distinct(idagenda) from agendatopicos where "+retorno+" order by idagenda asc");
	    	
			while (rs_id.next()){
			
				String idAgenda = rs_id.getString("idagenda");
				
				listaId.add(idAgenda);
			}
            
			for (String idAge : listaId){

	    	ResultSet rs_basico = c.executeConsulta("select * from agendabasico where idagenda='"+idAge+"'order by idagenda asc");
	    	
			while (rs_basico.next()){

			AgeBasico ageBasico = new AgeBasico();
			ageBasico.setIdAgenda(rs_basico.getString("idagenda"));
			ageBasico.setIdAta(rs_basico.getString("idata"));
			ageBasico.setDtReuniao(rs_basico.getDate("dt_reuniao"));
			ageBasico.setTec(rs_basico.getString("tecnologia"));
			ageBasico.setLinkApre(rs_basico.getString("link_apre"));
			ageBasico.setAta(rs_basico.getString("ata"));
			
			listaAgendaBasico.add(ageBasico);
			}
				    	
	    	ResultSet rs = c.executeConsulta("select * from agendatopicos where idagenda='"+idAge+"' order by idtopicos asc");
			while (rs.next()){

			Agenda age = new Agenda();
			age.setIdAgenda(rs.getString("idagenda"));
			age.setIdTopico(rs.getString("idtopicos"));
			age.setIdSos(rs.getString("idsos"));
			age.setAssunto(rs.getString("assunto")); 
			age.setTipo(rs.getString("tipo")); 
			age.setApresentador(rs.getString("apresentador")); 
			age.setHorario(rs.getString("horario")); 
			age.setDuracao(rs.getString("duracao")); 
			age.setIdCampo(rs.getString("idcampo"));
			age.setSos(rs.getString("sos"));
			age.setDtReuniao(rs.getDate("dt_reuniao"));
		
			listaAgenda.add(age);
			}
			}
	} catch (SQLException e) {

		 e.printStackTrace();
	 }