Ajudem com sintaxes e lógica de programação em leitura de banco de dados

Tenho que fazer um método para ler uma tabela ‘encomenda’ no banco de dados. Eis as especificações:

1.O sistema busca o total de encomendas com status = “aberto”, agrupados por data, excluindo-se o dia atual.
2.O sistema verifica a primeira data disponível da lista, onde o número de encomendas seja inferior a seis.
3.O sistema retorna a data disponível no item 2, como a data prevista de entrega

Fluxo Alternativo

  • Nenhuma data disponível
    Se não houver nenhuma data disponível dentro da lista recebida, o sistema deve calcular a data prevista de entrega como sendo a maior data da lista acrescida de um dia. Se a data prevista cair sábado ou domingo, deve ser incrementada até a segunda-feira.
  • Nenhuma encomenda cadastrada
    Se não houver nenhuma encomenda cadastrada, o sistema deve calcular a data prevista de entrega como sendo a data da encomenda acrescida de um dia. Se a data prevista cair sábado ou domingo, deve ser incrementada até a segunda-feira.

Meu método:

    public Date getEncomendasAbertas() throws SQLException{  
            Date date = new Date();  
            PreparedStatement stat = connection.prepareStatement(  
                    "SELECT dataEntrega, count(numero) as nEnc FROM encomenda"  
                    + " WHERE status = ? OR status = ?"  
                    + " GROUP BY dataEntrega DESC"  
                    + " HAVING dataEntrega>?;");  
            stat.setString(1, "aberto");  
            stat.setString(2, "Aberto");  
            stat.setDate(3, new java.sql.Date(date.getTime()));  
            ResultSet res = stat.executeQuery();  
            int cont2 = 0;  
            while(res.next()){  
                int cont = res.getInt("nEnc");  
                cont2++;  
                if(cont<6){  
                    date = new java.util.Date(res.getDate("dataEntrega").getTime());  
                    break;  
                }  
                else if(res.next()==false){  
                    date = new java.util.Date(res.getDate("dataEntrega").getTime()+1);  
                }  
            }  
            Date date2 = new Date();  
            if(cont2==0){  
                date.setDate(date.getDate()+1);  
            }  
            else if(date.getDate()<=date2.getDate()){  
                date2.setDate(date2.getDate()+1);  
                date = date2;  
            }  
            PreparedStatement stat2 = connection.prepareStatement(  
                    "SELECT count(numero) as nEnc FROM encomenda"  
                    + " WHERE dataEntrega = ?;");  
            stat2.setDate(1, new java.sql.Date(date.getTime()));  
            ResultSet r = stat2.executeQuery();  
            while(r.next()){  
                int conta = r.getInt("nEnc");  
                if(conta==6){  
                    date.setDate(date.getDate()+1);  
                }  
            }  
            GregorianCalendar gc = new GregorianCalendar();  
            gc.setTime(date);  
            int diaDaSemana = gc.get(GregorianCalendar.DAY_OF_WEEK);   
            if(diaDaSemana==1){  
                date.setDate(date.getDate()+1);  
            }  
            else if(diaDaSemana==7){  
                date.setDate(date.getDate()+2);  
            }  
            return date;  
        }  

Como devo dizer, não está funcionando como eu esperava. Sou iniciante em java pra dizer a verdade, alguém pode me dizer onde está o erro? As datas não são incrementadas como está especificado no código.

        while(res.next()){    
            int cont = res.getInt("nEnc");    
            cont2++;    
            if(cont<6){    
                date = new java.util.Date(res.getDate("dataEntrega").getTime());    
                break;    
            }    
            else if(res.next()==false){ 

Cuidado com “next”; ele não só testa se tem alguma coisa, mas também avança o ponteiro sobre o resultset. Portanto, quando você fez “if (res.next()== false)”, pode ter inadvertidamente avançado o ponteiro de forma indesejada (suponha que ele retorne true. Isso quer dizer que ele vai acabar lendo um e pulando um :slight_smile: )

Obrigado pela dica, nesse if eu quero apenas pegar a maior data (a última do res) caso não tenha nenhum dia com contagem de entrega de encomendas == 6. Posso fazer de outra maneira, mas ainda assim o problema persiste, pois o resultado está errado, ele traz o dia 12/06/2012 (o único cadastrado pra falar a verdade) que já tem 6 encomendas, e não incrementa 1 no dia como está especificado no código.

Troque

        GregorianCalendar gc = new GregorianCalendar();    
        gc.setTime(date);    
        int diaDaSemana = gc.get(GregorianCalendar.DAY_OF_WEEK);     
        if(diaDaSemana==1){    
            date.setDate(date.getDate()+1);    
        }    
        else if(diaDaSemana==7){    
            date.setDate(date.getDate()+2);    
        }    
        return date;   

Por:

       Calendar cal = Calendar.getInstance();
       cal.setTime (date);
       int diaDaSemana = cal.get (Calendar.DAY_OF_WEEK);
       if (diaDaSemana == Calendar.SATURDAY) 
           cal.add (Calendar.DATE, +2);
       else if (diaDaSemana == Calendar.SUNDAY)
           cal.add (Calendar.DATE, +1);
       return cal.getTime();

Cuidado - sábado é 7, e domingo é 1. Acredito que você queria ajustar tudo para segunda-feira, não?

Sim amigo, se fosse sábado ou domingo eu gostaria de ajustar pra segunda-feira.

Mas e a parte do ResultSet e o ResultSet.next() lá em cima, vocês acham que cobre as necessidades que foram pedidas no enunciado acima da função?