Filtro JTable por data

8 respostas Resolvido
P

Boa Tarde Pessoal,

Estou tentando fazer um filtro em uma jTable por data desta forma:

RowFilter<TableModel, Integer> low = RowFilter.dateFilter(RowFilter.ComparisonType.AFTER, d1, 4);
RowFilter<TableModel, Integer> high = RowFilter.dateFilter(RowFilter.ComparisonType.BEFORE, d2, 4);

Porém não esta dando certo, acredito que seja porque o formato da data do campo da tabela não é igual ao da data que pego do jFormattedTextField, o retorno do comando System.out.println(d1) é:
Sat Jan 07 00:00:00 BRST 2017

e com o system.out do campo da tabela System.out.println(tabAtendimentos.getValueAt(tabAtendimentos.getSelectedRow(), 4)) é:
2017-01-17

Alguém teria alguma ideia de como resolver isso e o filtro funcionar?

8 Respostas

Jonathan_Medeiros

Qual é o formato de data que você precisa para sua consulta ?

Jonathan_Medeiros

Coloquei a formatação padrão que eu utilizo!
exemplo: 01/01/2017

Caso a formatação que você precise seja diferente, basta alterar abaixo.
exemplo:("dd-mm-yyyy") | ("yyyy-mm-dd")

SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yyyy");  

RowFilter low = RowFilter.dateFilter(RowFilter.ComparisonType.AFTER, formatter.format(d1), 4);
RowFilter high = RowFilter.dateFilter(RowFilter.ComparisonType.BEFORE, formatter.format(d2), 4);

Acho que já deve resolver o seu problema!

P

Boa Tarde Jonathan,

Cara estou quebrando a cabeça e não tem jeito, inclusive havia tentado de uma forma semelhante que você me passou, dá erro porque no lugar do formatter.format(d1) ele diz que é necessário o tipo Date e não String, será que estou fazendo alguma outra coisa de errado, a data que esta no JTable esta vindo do meu banco executanto o comanto System.out.println(tabAtendimentos.getValueAt(tabAtendimentos.getSelectedRow(), 4)); a saída é 2017-01-20, então o formato estou colocando é “yyyy-MM-dd”.

Agradeço sua ajuda.

Jonathan_Medeiros

Então faz o processo inverso, transformando a String em Date.

String data1 = //aqui você atribui sua primeira data salva no banco de dados;
String data2 = //aqui você atribui sua segunta data salva no banco de dados;

Date data;
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
d1 = (Date) formatter.parse(data1);
d2 = (Date) formatter.parse(data2);

RowFilter low = RowFilter.dateFilter(RowFilter.ComparisonType.AFTER, d1, 4);
RowFilter high = RowFilter.dateFilter(RowFilter.ComparisonType.BEFORE, d2, 4);
P

Jonathan,

As datas que vem do banco são as que estão na tabela as do filtro o usuário informa em um JFormattedTextField, que eu recupero assim:

private Date pegaDataFiltro(String iniFim)

{

Date dateFiltro = null;

String strData = new String();
if (iniFim == "I")
        strData = inputFormatDtIni.getText();
    if (iniFim == "F")
        strData = inputFormatDtFim.getText();
    
    DateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.US);        
    
    try {            
        dateFiltro = format.parse(strData);                        
    } catch (ParseException ex) {
        JOptionPane.showMessageDialog(null, "Erro na conversão da data do Filtro. Erro: " + ex);
    }
    
    return dateFiltro;        
}

se eu tento mudar o formato aí para:
DateFormat format = new SimpleDateFormat(“yyyy-MM-dd”, Locale.US);

recebo o erro:

Já fiz uma gambi para consseguir pegar com o formato desejado mas não surtiu efeito.

Se tiver uma ideia agradeço.

Abraço.

P

Outra dúvida alguém saberia uma forma de debugar o que esta sendo comparado na linha:

RowFilter<TableModel, Integer> low = RowFilter.dateFilter(RowFilter.ComparisonType.AFTER, d1, 4);

Eu estou visualizando atualmente com a saída dos comandos:
System.out.println(d1);

e selecionando uma linha da tabela:
System.out.println(tabAtendimentos.getValueAt(tabAtendimentos.getSelectedRow(), 4));

As duas saídas mostram saídas diferentes de formato como expliquei acima mas não sei se seria confiável levar somente em consideração a saída do System.out.

Jonathan_Medeiros

Porque você utiliza o Locale.US na formatação do valor, é realmente necessário esse parâmetro ?

Outra observação, nesta linha aqui: dateFiltro = format.parse(strData); você precisa fazer o casting de Date ficando da seguinte maneira: dateFiltro = (Date) format.parse(strData);

P
Solucao aceita

Jonathan,

Muito obrigado por sua ajuda.
Infelizmente não consegui fazer o filtro pela tabela, resolvi limpando a tabela e fazendo a busca no banco novamente com a condição das datas na instrução do SQL.

Abraço.

Criado 7 de fevereiro de 2017
Ultima resposta 9 de fev. de 2017
Respostas 8
Participantes 2