Primefaces datatable com filtro e campo pesquisar

8 respostas
java
F

Pessoal, estou tentando implementar um dataTable com filtro nele.
A necessidade existe pois uma pessoa poderá procurar um endereco utilizando um cep genérico (ex: 24000-000) assim, todos os logradouros abaixo desta hierarquia será apresentado logo, vou utilizar o filtro do datable para refinar a pesquisa.

O problema é que depois de implementar o filtro, conforme código anexado, quando eu clico no botão de pesquisar, nenhum valor e inserido no dataTable.

Já tentei dar um set na List que o dataTable utiliza como filtro e na outra List que ele carrega porém, nada feito. Não funcionou.

Neste caso estou fazendo um exemplo por código mas em teoria vai será a mesma lógica utilizada no CEP.

O sistema é a figura abaixo:

Bean:

@Named
@RequestScoped
public class CadastroClienteBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private Cliente cliente;
	private List<Cliente> clientes;
	private List<Cliente> filtrados;
	private String valorPesquisa;

	@EJB
	CadastroClienteEJB cadastroClienteEJB;

	public CadastroClienteBean() {
		System.out.println("===> Chamou o CONSTRUTOR");
		cliente = new Cliente();
		clientes = new ArrayList<Cliente>();
		filtrados = new ArrayList<Cliente>();
	}

public void pesquisar() {
		System.out.println("===> Entrou no método PESQUISAR");
		System.out.println("===> Valor campo pesquisaAtual: "
				+ this.valorPesquisa);
		System.out.println("===> Valor campo pesquisaAnterior: "
				+ this.pesquisaAnterior);

		if (this.valorPesquisa == null || this.valorPesquisa.equals("")) {
			pesquisaAnterior = new String(valorPesquisa);
			this.clientes = cadastroClienteEJB.buscarTodos();
		} else {
			pesquisaAnterior = new String(valorPesquisa);
			this.clientes = this.cadastroClienteEJB
					.pesquisar(this.valorPesquisa);
		}
		
	}

xhtml:

<h:form id="frmPesquisa">
		<p:panelGrid columns="3">
			<h:outputLabel value="Pesquisar" for="pesquisa" />
			<h:inputText id="pesquisa"
				value="#{cadastroClienteBean.valorPesquisa}" />
			<p:commandButton value="Pesquisar"
				action="#{cadastroClienteBean.pesquisar}" update="@form" />
		</p:panelGrid>
		<br />
		<br />
		<br />
		<p:dataTable id="tableResult" value="#{cadastroClienteBean.clientes}"
			filteredValue="#{cadastroClienteBean.filtrados}" var="cliente"
			border="1" cellpadding="5">
			<p:column headerText="Código" filterBy="#{cliente.codigo}">
				<h:outputText value="#{cliente.codigo}" />
			</p:column>
			<p:column headerText="Nome">
				<h:outputText value="#{cliente.nome}" />
			</p:column>
			<p:column headerText="Idade">
				<h:outputText value="#{cliente.idade}" />
			</p:column>
			<p:column headerText="Sexo">
				<h:outputText value="#{cliente.sexo}" />
			</p:column>
			<p:column headerText="Profissão">
				<h:outputText value="#{cliente.profissao}" />
			</p:column>
		</p:dataTable>
	</h:form>

8 Respostas

T

Cara, tenta usar o @ViewScoped no teu bean, o @RequestScoped é por requisição talvez esteja interferindo

F

Thiago,
Um dos problemas realmente era esse referente ao escopo. Passei para @SessionScoped.
Resolveu o problema em partes.
Ele está fazendo a busca porem só apresenta o resultado se eu consultar duas vezes, ou seja, preciso clicar no botão de consultar duas vezes ou após clicar no botão de pesquisar, tenho que ir no filtro que coloquei da dataTable digitar alguma coisa e apagar.

Fiz esse pequeno vídeo de 0:44 mostrando o que está acontecendo (https://youtu.be/7m1vCwHoJYY)

Obs.: já inclui no commandButton , o onclick="PF(‘itemListases’).clearFilters();

Me parece que o problema ainda continua neste filtro. Acho que realmente ele só da um reset após a segunda chamada.

T

Já tive problemas desse tipo com o primefaces para atualizar uma datatable. Voce pode colocar um id para a datatable e referenciar ele lá no update do commandbutton, ou você pode usar o onclick="PF(‘table’).filter();"
Esse table tem q estar descrito como widgetVar do datatable se for usar o onclick

F

Fiz a alteraçao que você comentou. O codigo ficoua ssim:

<h:form id="frmPesquisa">
		<p:panelGrid columns="3">
			<h:outputLabel value="Pesquisar" for="pesquisa" />
			<h:inputText id="pesquisa"
				value="#{cadastroClienteBean.valorPesquisa}" />
			<p:commandButton value="Pesquisar"
				action="#{cadastroClienteBean.pesquisar}" update="tableResult"
				onclick="$('itemListases').clearFilters(); return false;"/>
		</p:panelGrid>
		<br />
		<br />
		<br />
		<p:dataTable paginator="true" rows="5" widgetVar="itemListases"
			emptyMessage="Não foram encontrados Itens"
			filteredValue="#{cadastroClienteBean.filtrados}" id="tableResult"
			value="#{cadastroClienteBean.clientes}" var="cliente" border="1"
			cellpadding="5">
			<p:column headerText="Código" filterBy="#{cliente.codigo}">
				<h:outputText value="#{cliente.codigo}" />
			</p:column>
			<p:column headerText="Nome">
				<h:outputText value="#{cliente.nome}" />
			</p:column>
			<p:column headerText="Idade">
				<h:outputText value="#{cliente.idade}" />
			</p:column>
			<p:column headerText="Sexo">
				<h:outputText value="#{cliente.sexo}" />
			</p:column>
			<p:column headerText="Profissão">
				<h:outputText value="#{cliente.profissao}" />
			</p:column>
		</p:dataTable>
	</h:form>

Mesmo assim ele não é atualizado. Apenas se eu entrar no campo do filtro digitar alguma coisa e apagar ou clicar no botão novamente.
Pelo o que eu percebo, a lista ela é atualizada porem o valor não e mostrado no dataTable.

T

Tira o update do commandbutton, vamos usar o onclick. Coloca “PF(‘itemListases’).filter();” , apaga esse cleanFilters();

F

Nada feito. Substitui a função e mesmo assim continua não querendo atualizar!

L

tenta o update=@form

F

Já tentei da vez anterior e não funcionou.

Criado 21 de fevereiro de 2016
Ultima resposta 22 de fev. de 2016
Respostas 8
Participantes 3