2
respostas

Filtrando pelo preço do livro

Não está funcionando este filtro pela coluna 'preço'. Quando digito um valor (ex. 20 ou 20,00 ou R$20,00) ele limpa tudo. E pior, antes, nas outras colunas que tem filtros, quando eu limpava o valor do filtro ele exibia todos os registros novamente. Com este filtro por preço habilitado isso não ocorre mais. Só voltou ao normal quando eu apaguei o trecho filterFunction="#{livroBean.precoEhMenor}" Outra dúvida: onde está sendo passado o valor do parâmetro "filtroDigitado"??

Meu código:

        <p:column headerText="Preço" sortBy="#{livro.preco}" filterBy="#{livro.preco}" filterFunction="#{livroBean.precoEhMenor}">
                        <h:outputText value="#{livro.preco}">
                            <f:convertNumber type="currency" pattern="R$ #0.00"
                                currencySymbol="R$" locale="pt_BR" />
                        </h:outputText>
                    </p:column>

Implementação do método:

boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locale) {

        //tirando espaços do filtro
        String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();

        System.out.println("Filtrando pelo " + textoDigitado + ", Valor do elemento: " + valorColuna);

        // o filtro é nulo ou vazio?
        if (textoDigitado == null || textoDigitado.equals("")) {
            return true;
        }

        // elemento da tabela é nulo?
        if (valorColuna == null) {
            return false;
        }

        try {
            // fazendo o parsing do filtro para converter para Double
            Double precoDigitado = Double.valueOf(textoDigitado);
            Double precoColuna = (Double) valorColuna;

            // comparando os valores, compareTo devolve um valor negativo se o value é menor do que o filtro
            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {

            // usuario nao digitou um numero
            return false;
        }
    }
2 respostas

Acabei de perceber que faltou o "public"na hora de copiar o método... Foi mal... Agora funciona o filtro, porém continua não exibindo todos os valores quando eu limpo o valor no campo do filtro, como ocorre com os outros filtros...

Está assim:

 return precoColuna.compareTo(precoDigitado) < 0;

Tenta assim:

 return precoColuna.compareTo(precoDigitado) > 0;

Ser resolver não deixe de marcar o tópico como resolvido.