JSF2+PRIMEFACES, Fazer Datatable atualizar outro

7 respostas
C

Caros colegas, peço encarecidamente o apoio de vcs.
Alguem sabe como fazer um p:datatable atualizar outro p:datatable quando selecionado?
No caso quando um cliente é selecionado gostaria de exibir seus respectivos interlocutores.

Obs.: Não gostaria de trabalhar com FetchType.EAGER no meu EntityBean.

Segue o código:

clientes.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui">

<body>

	<p:dataTable id="tabela1" var="c" value="#{clienteMB.clientes}" paginator="true"
		rows="10">
		<p:column>
			<f:facet name="header">
				<h:outputText value="Código" />
			</f:facet>
			<h:outputText value="#{c.id}" />
		</p:column>

		<p:column>
			<f:facet name="header">
				<h:outputText value="Nome" />
			</f:facet>
			<h:outputText value="#{c.nome}" />
		</p:column>

		<p:column>
			<f:facet name="header">
				<h:outputText value="Tipo" />
			</f:facet>
			<h:outputText value="#{c.tipo.nome}" />
		</p:column>

		<p:column>
			<f:facet name="header">
				<h:outputText value="Descrição" />
			</f:facet>
			<h:outputText value="#{c.descricao}" />
		</p:column>

		<p:column style="width:32px">
			<p:commandButton update="tabela2" 
				image="ui-icon ui-icon-search" title="Visualizar cliente">
				<f:ajax render="tabela2" />
				<f:setPropertyActionListener value="#{c}" target="#{clienteMB.selecionado}" />
			</p:commandButton>
		</p:column>
	</p:dataTable>
	
	<p:spacer height="10"/>
	
	<p:dataTable id="tabela2" var="i" value="#{clienteMB.interlocutores}"
		paginator="false" rows="5" widgetVar="interlocInfo">
		<h:column>
			<f:facet name="header">
				<h:outputText value="Código" />
			</f:facet>
			#{i.id}
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Nome" />
			</f:facet>
			#{i.nome}
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Email" />
			</f:facet>
			#{i.email}
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Último acesso" />
			</f:facet>
			#{i.ultimoAcesso}
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Ativo?" />
			</f:facet>
			#{i.ativo?'Sim':'Nã'}
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Cargo" />
			</f:facet>
			#{i.cargo}
		</h:column>
	</p:dataTable>

</body>
</html>

clienteMB.java (Managed Bean):

@ViewScoped
@ManagedBean
public class ClienteMB {
	
	/**
	 * DAOS
	 */
	InterlocutorDAO interDao = new InterlocutorDAO();
	
	/**
	 * BEAN PROPERTIES
	 */
	//NOVO CLIENTE
	private Cliente novo = new Cliente();
	
	public Cliente getNovo() {
		return novo;
	}
	public void setNovo(Cliente novo) {
		this.novo = novo;
	}
	
	//CLIENTE SELECIONADO
	private Cliente selecionado = new Cliente();
	
	public Cliente getSelecionado() {
		return selecionado;
	}
	public void setSelecionado(Cliente selecionado) {
		this.selecionado = selecionado;
		this.interlocutores = interDao.list(selecionado);
	}	
	
	//CLIENTES
	private List<Cliente> clientes;
	
	public List<Cliente> getClientes() {
		if(clientes==null){
			clientes = cliDao.list();
		}
		return clientes;
	}

	//INTERLOCUTORES
	private List<Interlocutor> interlocutores;
	
	public List<Interlocutor> getInterlocutores() {
		interlocutores = interDao.list(selecionado);

		return interlocutores;
	}

	
	/**
	 * SELECT ITENS GENERATOR
	 */
	//TIPOSCLIENTE
	public SelectItem[] getTiposCliente() {
		SelectItem[] items = new SelectItem[ClienteTipos.values().length];
		int i = 0;
		for(ClienteTipos t: ClienteTipos.values()) {
			items[i++] = new SelectItem(t, t.getNome());
		}
		return items;
	}


	//ACTION HANDLERS...

}

Cliente.java (EntityBean Pai):

@Entity
@Table(name="clientes")
public class Cliente implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	public Cliente() {
		super();
		
	}
	
	public Cliente(ClienteTipos tipo, String nome, String descricao,
			List<Unidade> unidades, List<Interlocutor> interlocutores,
			Vendedor vendedor, List<Servico> servicos) {
		super();
		this.tipo = tipo;
		this.nome = nome;
		this.descricao = descricao;
		this.unidades = unidades;
		this.interlocutores = interlocutores;
		this.vendedor = vendedor;
		this.servicos = servicos;
	}

	@Id @GeneratedValue
	@Column
	private long id;
	
	@Column(name="pre_tipo")
	@Enumerated(EnumType.STRING)
	private ClienteTipos tipo;
	
	@Column(name="tx_nome")
	private String nome;
	
	@Column(name="tx_descricao")
	private String descricao;
	
	/* RELACIONAMENTOS */
	@OneToMany(mappedBy="empresa",fetch=FetchType.LAZY)
	private List<Interlocutor> interlocutores;
	

	//Gets & Sets

	
}

Interlocutor.java (EntityBean filha):

@Entity
@Table(name="interlocutores")
public class Interlocutor extends Usuario implements Serializable, TelefoneSuport {
	
	public Interlocutor() {
		super();
		tipo = UsuarioTipo.INTERLOCUTOR;
	}
	
	private static final long serialVersionUID = 1L;
	
	//Ids

	//Atributos
	@Column(name="tx_cargo")
	private String cargo;
	
	
	//Relacionamentos
	@ManyToOne
	@JoinColumn(name="id_cliente",referencedColumnName="id")
	private Cliente empresa;

	//Gets & Sets

}

Desde já agradeço de coração por qualquer ajuda,

Um grande abraço,

7 Respostas

P

ja tenteou liberar para seleção single e usar o metodo onRowSelectUpdate?

C

Obrigado Polverini, acho que o caminho é por aí, mas ainda não consegui.

Alterei o código desta forma, mas a tabela continua não sendo exibida:

<p:dataTable var="c" value="#{clienteMB.clientes}" paginator="true"
			rows="10" selection="#{clienteMB.selecionado}" selectionMode="single"
			onRowSelectUpdate="tabela2">

Coloquei tb. um rendered="#{clienteMB.interlocutores != null}" na tabela2, que consegue perceber se o cliente tem interlocutores ou não, entretanto os interlocutores continuam não sendo exibidos.

Existe um atributo onRowSelectComplete, que recebe um metodo javascript, o qual acho que resolveria, mas não encontrei uma documentação como opções (tem um user guide aqui, mas não achei nada nele).

Mais uma vez agradeço, se souber alguma alternativa ou tiver algum exemplo de código parecido será muito bem-vindo.

Um grande abraço e sucesso,

C

Parece que o Primefaces não aceita 2 datatables na mesma página.

Se troco o datatable do primefaces pelo componente default do JSF HTML, funciona numa boa. O problema é que perco todas a funcionalidades do framework.

Um grande abraço,

P

vc pode testar tambem colocando a dataTable em uma outputPanel e ao invés de rendenizar o dataTable rendeniza o outputPanel, ou seja :

<p:dataTable var="c" value="#{clienteMB.clientes}" paginator="true"  
                     rows="10" selection="#{clienteMB.selecionado}" selectionMode="single"  
                     onRowSelectUpdate="painel">  
        </p:dataTable>


        <p:outputPanel id="painel">
            <p:dataTable id="tabela2" rendered="#{clienteMB.interlocutores != null}">
            </p:dataTable>
        </p:outputPanel>

p/s Coloca tudo em um <h:form>

C

Acrescentei a mesma dúvida aqui, se alguém quizer acompanhar:
http://stackoverflow.com/questions/6414405/primefaces-2-2-1-seems-do-not-accept-two-tables-on-the-same-page

[]s

C

Obrigado mais uma vez, mas não funcionou. Estranho, não? o <h:datatable> funciona.

A

Eu acredito que você não esteja mais precisando, mas vou postar para consultas futuras.

OBS.: Estou usando a versão 3.0.M4 do primefaces

Primeiro você precisa separar as duas dataTable em forms diferentes e depois usar a tag <p:ajax event=“rowSelect” update=":table2"/> para a atualização.

Ex:

&lt;h:form id="form1"&gt;
		&lt;p:dataTable id="table1" var="itens" value="#{mbitens.list}" style="width: 100%"  
	                 paginator="true" rows="10" rowKey="#{itens.id}" selection="#{mbitens.selecteditem}" 
	                 selectionMode="single" scrollable="true" emptyMessage="Nenhum Registro Encontrado"
	                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
	                 rowsPerPageTemplate="5,10,15"&gt;

	                 &lt;p:ajax event="rowSelect" update=":form2:table2"/&gt;

               **** Continuação da Tabela 1 ****

         &lt;/h:form&gt; 
         &lt;h:form id="form2"&gt;
		&lt;p:dataTable id="table2" var="itens" value="#{mbitens.selecteditem.list}" style="width: 100%"  
	                 paginator="true" rows="10" rowKey="#{itens.id}" selection="#{mbitens.selecteditemtable2}" 
	                 selectionMode="single" scrollable="true" emptyMessage="Nenhum Registro Encontrado"
	                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
	                 rowsPerPageTemplate="5,10,15"&gt;

               **** Continuação da Tabela 2 ****

         &lt;/h:form&gt;

Qualquer dúvida é só falar…

[]'s

Criado 19 de junho de 2011
Ultima resposta 1 de fev. de 2012
Respostas 7
Participantes 3