Selecionar um item de outra tabela para exibição - Primefaces

Boa tarde!

Estou com uma dúvida e preciso da ajuda dos colegas mais experientes aqui no GUJ.

Sou relativamente “novato” com JEE, fiz o FJ25 e o FJ26 na Caelum ( o melhor curso que eu já fiz, sem demagogia ), e até agora ia tudo bem até que me deparei com a seguinte necessidade:

Estou desenvolvendo um sistema com diversos tipos de “Cadastros” e tudo ia bem até eu precisar “relacionar” um item de uma tabela para exibir em outra, explico melhor:

Tenho um cadastro específico para “UNIDADE LOTAÇÃO”, tem somente o ID, o número da unidade e a descrição da unidade.

Em outra tela que chamo de “COLABORADOR”, eu pretendo selecionar a “unidade lotação” a qual este ‘colaborador’ será cadastrado. O problema está exatamente aí, tenho um botão ao lado do Campo que abre um dialog, neste dialog eu tenho a dataTable com os registros das unidades e ao lado de cada unidade, tem um outro botão que deveria selecionar esta unidade e devolve-la para a tela COLABORADOR.

Quando eu clico no botão para selecionar a Unidade Lotação, ela fecha o dialog e não exibe nada nos campos aonde deveriam estar o número da unidade e a descrição da unidade.

Peço ajuda pois estou a dias tentando e tentando sem sucesso.

Tela colaborador.xhtml

		<h2 style="color: #ffffff; padding-top: 20px;">Listagem de
			Colaboradores</h2>

		<h:form id="formColaborador"></h:form>

		<h:form id="tabelaColaborador">

			<p:dataTable id="tabColaborador" var="colaborador"
				value="#{colaboradorBean.colaboradores}" scrollRows="20"
				scrollable="true" scrollHeight="auto" resizableColumns="true"
				style="margin-bottom:0px; width: 98%; margin-left: 1%"
				emptyMessage="Nenhum colaborador encontrado." paginator="true">

				<f:facet name="header">
					<h:commandButton value="Nova"
						onclick="PF('formularioColaborador').show();" type="button" />
				</f:facet>


				<p:column scrollable="true" width="15">
					<h:commandLink onclick="PF('formularioColaborador').show()">
						<p:graphicImage name="imagens/edit.png" />
						<f:setPropertyActionListener value="#{colaborador}"
							target="#{colaboradorBean.colaborador}" />
						<f:ajax render=":formColaborador" />
					</h:commandLink>
				</p:column>

				<p:column id="idcolaborador" filterBy="#{tabColaborador.id}">
					<h:outputText value="#{tabColaborador.id}" />
				</p:column>

				<p:column headerText="Empresa" scrollable="true" resizable="true"
					scrollWidth="50%" width="300">
						#{colaborador.empresa}
					</p:column>
				<p:column headerText="Estabelecimento"
					sortBy="#{colaborador.estabelecimento}" scrollable="true"
					width="300">
						#{colaborador.estabelecimento} 
					</p:column>
				<p:column headerText="Matricula" sortBy="#{colaborador.matricula}"
					scrollable="true" width="100">
						#{colaborador.matricula}
					</p:column>
				<p:column headerText="Nome" sortBy="#{colaborador.nome}"
					scrollable="true" width="200">
						#{colaborador.nome}
					</p:column>
				<p:column headerText="Centro de Custo" scrollable="true"
					width="100">
						#{colaborador.centroCusto}
					</p:column>
				<p:column headerText="Descrição C. Custo" scrollable="true"
					width="200">
						#{colaborador.descricaoCentroCusto}
					</p:column>
				<p:column headerText="Unidade Lotacao" scrollable="true"
					width="150">
						#{colaborador.unidadeLotacao}
					</p:column>
				<p:column headerText="Descrição" scrollable="true" width="250">
					<!-- 							#{colaborador.descricao} -->
				</p:column>
				<p:column headerText="Data Admissão" scrollable="true" width="100"
					mask="99/99/9999">
						#{colaborador.dataAdmissao}
					</p:column>
				<p:column headerText="Descrição Cargo" scrollable="true"
					width="150">
						#{colaborador.descricaoCargo}
					</p:column>
				<p:column headerText="Referência" scrollable="true" width="120">
						#{colaborador.referencia}
					</p:column>
				<p:column headerText="Data Nascimento" scrollable="true"
					width="100" mask="99/99/9999">
						#{colaborador.dataNascimento}
					</p:column>
				<p:column headerText="RG" scrollable="true" width="100">
						#{colaborador.rg}
					</p:column>
				<p:column headerText="Órgão Emissor" scrollable="true" width="85">
						#{colaborador.orgaoEmissor}
					</p:column>
				<p:column headerText="UF" scrollable="true" width="25">
						#{colaborador.uf}
					</p:column>
				<p:column headerText="Data Emissão" scrollable="true" width="100"
					mask="99/99/9999">
						#{colaborador.dataEmissao}
					</p:column>
				<p:column headerText="CPF" scrollable="true" width="120"
					mask="999.999.999-99">
						#{colaborador.cpf}
					</p:column>
				<p:column headerText="Status" scrollable="true" width="80">
						#{colaborador.status}
					</p:column>
			</p:dataTable>
		</h:form>

		<p:dialog id="formDialog" widgetVar="formularioColaborador"
			resizable="false" modal="true" syte="width: 70%; height:60%;"
			appendTo="@(body)">

			<h:form id="formColab">

				<p:growl id="msgs" showDetail="true" />

				<h2 style="color: gray;">
					<h:outputText value="Novo Colaborador"
						rendered="#{empty colaboradorBean.colaborador.id}" />
					<h:outputText value="Editar Colaborador"
						rendered="#{!empty colaboradorBean.colaborador.id}" />
				</h2>

				<div style="width: 450px; height: 100%;">

					<p:panel id="basic" header="Dados do Colaborador"
						style="text-align: center" styleClass="centered">
						<!-- 							<h:inputHidden value="#{colaboradorBean.colaborador.id}" /> -->
						<div class="ui-g">
							<div class="ui-g-12">
								<p:inputText value="#{colaboradorBean.colaborador.empresa}"
									placeholder="Empresa" size="52" />
							</div>
							<div class="ui-g-12">
								<p:inputText
									value="#{colaboradorBean.colaborador.estabelecimento}"
									placeholder="Estabelecimento" size="52" />
							</div>
							<div class="ui-g-12">
								<p:inputText value="#{colaboradorBean.colaborador.matricula}"
									placeholder="Matricula" size="52" />
							</div>
							<div class="ui-g-12">
								<p:inputText value="#{colaboradorBean.colaborador.nome}"
									placeholder="Nome" size="52" />
							</div>
							<div class="ui-g-8" align="left">
								<p:inputText
									value="#{colaboradorBean.colaborador.descricaoCentroCusto}"
									placeholder="Descrição C. Custo" size="32" />
							</div>
							<div class="ui-g-4">
								<p:inputText value="#{colaboradorBean.colaborador.centroCusto}"
									placeholder="Centro de Custo" size="12" />
							</div>
							<div class="ui-g-8" align="left">
								<p:inputText id="descricao"
									placeholder="Descrição Unidade Lotação" size="32"
									value="#{unidadeLotacaoBean.unidadeLotacao.descricaoUnidadeLotacao}"
									readonly="#{facesContext.currentPhaseId.name eq 'RENDER_RESPONSE'}" />
							</div>
							<div class="ui-g-4">
								<p:inputText id="colaborador" placeholder="Unid. Lotação"
									size="8"
									value="#{unidadeLotacaoBean.unidadeLotacao.numeroUnidadeLotacao}"
									readonly="#{facesContext.currentPhaseId.name eq 'RENDER_RESPONSE'}" />
								<p:spacer width="3px" />
								<p:commandButton icon="ui-icon-search" title="Pesquisa"
									action="#{unidadeLotacaoBean.abrirDialogo}" process="@this"
									update="@none"
									style="width:22px; height: 21px; background: gray; border-color: gray; border: 0px">
									<p:ajax event="dialogReturn"
										listener="#{colaboradorBean.unidadeLotacaoSelecionada}"
										process="@this" update="descricao, colaborador" />
									<p:resetInput target="descricao, colaborador" />
								</p:commandButton>
							</div>
							<div class="ui-g-8" align="left">
								<p:inputText
									value="#{colaboradorBean.colaborador.descricaoCargo}"
									placeholder="Descroção Cargo" size="32" />
							</div>
							<div class="ui-g-4">
								<p:inputMask
									value="#{colaboradorBean.colaborador.dataAdmissao}"
									placeholder="Data Admissão" size="12" mask="99/99/9999" />
							</div>
							<div class="ui-g-8">
								<p:inputText value="#{colaboradorBean.colaborador.referencia}"
									placeholder="Referência" size="32" />
							</div>
							<div class="ui-g-4">
								<p:inputMask
									value="#{colaboradorBean.colaborador.dataNascimento}"
									placeholder="Data Nascimento" size="12" mask="99/99/9999" />
							</div>
							<div class="ui-g-4">
								<p:inputText value="#{colaboradorBean.colaborador.rg}"
									placeholder="RG" size="12" />
							</div>
							<div class="ui-g-5">
								<p:inputMask
									value="#{colaboradorBean.colaborador.orgaoEmissor}"
									placeholder="Órgão Emissor" size="15" />
							</div>
							<div class="ui-g-3" align="left">
								<p:selectOneMenu id="uf"
									value="#{colaboradorBean.colaborador.uf}" required="true"
									label="UF">
									<f:selectItem itemLabel="UF" itemValue=""
										noSelectionOption="true" />
									<f:selectItem itemLabel="AC" itemValue="AC" />
									<f:selectItem itemLabel="AL" itemValue="AL" />
									<f:selectItem itemLabel="AP" itemValue="AP" />
									<f:selectItem itemLabel="AM" itemValue="AM" />
									<f:selectItem itemLabel="BA" itemValue="BA" />
									<f:selectItem itemLabel="CE" itemValue="CE" />
									<f:selectItem itemLabel="DF" itemValue="DF" />
									<f:selectItem itemLabel="ES" itemValue="ES" />
									<f:selectItem itemLabel="GO" itemValue="GO" />
									<f:selectItem itemLabel="MA" itemValue="MA" />
									<f:selectItem itemLabel="MT" itemValue="MT" />
									<f:selectItem itemLabel="MS" itemValue="MS" />
									<f:selectItem itemLabel="MG" itemValue="MG" />
									<f:selectItem itemLabel="PA" itemValue="PA" />
									<f:selectItem itemLabel="PB" itemValue="PB" />
									<f:selectItem itemLabel="PR" itemValue="PR" />
									<f:selectItem itemLabel="PE" itemValue="PE" />
									<f:selectItem itemLabel="PI" itemValue="PI" />
									<f:selectItem itemLabel="RJ" itemValue="RJ" />
									<f:selectItem itemLabel="RN" itemValue="RN" />
									<f:selectItem itemLabel="RS" itemValue="RS" />
									<f:selectItem itemLabel="RO" itemValue="RO" />
									<f:selectItem itemLabel="RR" itemValue="RR" />
									<f:selectItem itemLabel="SC" itemValue="SC" />
									<f:selectItem itemLabel="SP" itemValue="SP" />
									<f:selectItem itemLabel="SE" itemValue="SE" />
									<f:selectItem itemLabel="TO" itemValue="TO" />
								</p:selectOneMenu>
							</div>
							<div class="ui-g-4">
								<p:inputMask value="#{colaboradorBean.colaborador.dataEmissao}"
									placeholder="Data Emissão" size="12" mask="99/99/9999" />
							</div>
							<div class="ui-g-5">
								<p:inputMask value="#{colaboradorBean.colaborador.cpf}"
									placeholder="CPF" size="15" mask="999.999.999-99" />
							</div>
							<div class="ui-g-3">
								<p:selectOneMenu id="status"
									value="#{colaboradorBean.colaborador.status}" required="true"
									label="Status" size="10">
									<f:selectItem itemLabel=" Status " itemValue=""
										noSelectionOption="true" />
									<f:selectItem itemLabel="Ativo" itemValue="Ativo" />
									<f:selectItem itemLabel="Inativo" itemValue="Inativo" />
								</p:selectOneMenu>
							</div>
							<div class="ui-g-6" align="center">
								<h:commandButton value="Gravar"
									action="#{colaboradorBean.grava}" />
							</div>
							<div class="ui-g-6" align="center">

								<h:commandButton value="Cancelar" action="colaborador"
									immediate="true" />
							</div>
						</div>
					</p:panel>
				</div>
			</h:form>
		</p:dialog>
	</ui:define>
</ui:composition>

SelecionaLotacao.xhtml

	<p:panel id="basic" header="Selecione a Unidade Lotação"
		style="text-align: center" styleClass="centered">

		<div
			style="text-align: left; padding-left: 20px; padding-bottom: 8px;">
			<p:inputText id="unidade" value="#{unidadeLotacaoBean.unidade}"
				placeholder="Descrição Unidade Lotação" size="50" />
			<p:spacer width="20px" />
			<h:commandButton value="Pesquisar"
				action="#{unidadeLotacaoBean.pesquisar}" update="@form" />
		</div>

		<p:dataTable value="#{unidadeLotacaoBean.unidadesLotacao}"
			var="lotacao" emptyMessage="Nenhuma Unidade Lotação encontrada"
			rows="15" paginator="true" paginatorPosition="bottom">

			<p:column headerText="Nº Unidade Lotação"
				style="text-align: center; width: 150px">
				<h:outputText value="#{lotacao.numeroUnidadeLotacao}" />
			</p:column>
			<p:column headerText="Descrição Unidade Lotação"
				style="text-align: left">
				<h:outputText value="#{lotacao.descricaoUnidadeLotacao}" />
			</p:column>
			<p:column style="width:30px">
				<p:commandButton icon="ui-icon-check" title="Selecionar"
					action="#{unidadeLotacaoBean.selecionar(unidadeLotacao)}"
					process="@this"
					style="width:22px; height: 17px; background: gray; border-color: gray; border: 0px" />
			</p:column>
		</p:dataTable>
	</p:panel>

unidadeLotacaoBean

@Named
@RequestScoped
public class UnidadeLotacaoBean {

@Inject
private UnidadeLotacaoDao dao;

private String unidade;

private UnidadeLotacao unidadeLotacao = new UnidadeLotacao();

private List<UnidadeLotacao> unidadesLotacao;

public UnidadeLotacao getUnidadeLotacao() {
	return this.unidadeLotacao;
}

public void setUnidadeLotacao(UnidadeLotacao unidadeLotacao) {
	this.unidadeLotacao = unidadeLotacao;
}

public void setUnidadesLotacao(List<UnidadeLotacao> unidadesLotacao) {
	this.unidadesLotacao = unidadesLotacao;
}

public String getUnidade() {
	return unidade;
}

public void setUnidade(String unidade) {
	this.unidade = unidade;
}

public void pesquisar() {
	unidadesLotacao = dao.buscaPorDescricao(unidade);
}

public void selecionar(UnidadeLotacao unidadeLotacao) {
	RequestContext.getCurrentInstance().closeDialog(unidadeLotacao);
	System.out.println("Selecionou a UL" + unidadeLotacao);
}

public List<UnidadeLotacao> getUnidadesLotacao() {
	if (unidadesLotacao == null) {
		System.out.println("Carregando a lista de Unidade Lotacao...");
		unidadesLotacao = dao.listaTodos();
	}
	return unidadesLotacao;
}

@Transacional
public String grava() throws InterruptedException {
	System.out.println("Gravando a Unidade Lotação...");
	if (unidadeLotacao.getId() == null) {
		dao.adiciona(unidadeLotacao);
	} else {
		dao.atualiza(unidadeLotacao);
	}
	this.unidadeLotacao = new UnidadeLotacao();
	this.unidadesLotacao = dao.listaTodos();
	return "unidadelotacao?faces-redirect=true";
}

@Transacional
public void remove(UnidadeLotacao unidadeLotacao) throws InterruptedException {
	dao.remove(unidadeLotacao);
	this.unidadesLotacao = dao.listaTodos();
}

public void cancelar() {
	this.unidadeLotacao = new UnidadeLotacao();
}

public void abrirDialogo() {
	Map<String, Object> opcoes = new HashMap<>();
	opcoes.put("modal", true);
	opcoes.put("resizable", false);
	opcoes.put("contentHeight", 355);

	RequestContext.getCurrentInstance().openDialog("selecionalotacao", opcoes, null);
}

}

colaboradorBean

@Named
@RequestScoped
public class ColaboradorBean {

@Inject
private ColaboradorDao dao;

@Inject
private UnidadeLotacaoDao ulDao;

private String unidade;

private List<UnidadeLotacao> unidadesLotacao;

private Colaborador colaborador = new Colaborador();

private List<Colaborador> colaboradores;

public void unidadeLotacaoSelecionada(SelectEvent event) {
	UnidadeLotacao unidadeLotacao = (UnidadeLotacao) event.getObject();
	colaborador.setUnidadeLotacao(unidadeLotacao);
}

public Colaborador getColaborador() {
	return this.colaborador;
}

public void setColaborador(Colaborador colaborador) {
	this.colaborador = colaborador;
}

public void setColaboradores(List<Colaborador> colaboradores) {
	this.colaboradores = colaboradores;
}

public List<Colaborador> getColaboradores() {
	if (colaboradores == null) {
		System.out.println("Carregando Colaboradores...");
		colaboradores = dao.listaTodos();
	}
	return colaboradores;
}

@Transacional
public String grava() throws InterruptedException {
	System.out.println("Gravando os Colaboradores...");
	if (colaborador.getId() == null) {
		dao.adiciona(colaborador);
	} else {
		dao.atualiza(colaborador);
	}
	this.colaborador = new Colaborador();
	this.colaboradores = dao.listaTodos();
	return "colaborador?faces-redirect=true";
}

@Transacional
public void remove(Colaborador colaborador) throws InterruptedException {
	dao.remove(colaborador);
	this.colaboradores = dao.listaTodos();
}

public void cancelar() {
	this.colaborador = new Colaborador();
}

public void comecaComMaiuscula(FacesContext fc, UIComponent component, Object value) throws ValidationException {
	String valor = value.toString();
	if (!valor.matches("[A-a].*")) {
		throw new ValidatorException(new FacesMessage("Deveria começar com maiúscula"));
	}
}

public String getUnidade() {
	return unidade;
}

public void setUnidade(String unidade) {
	this.unidade = unidade;
}

public void pesquisar() {
	unidadesLotacao = ulDao.buscaPorDescricao(unidade);
}

}

Alguém consegue me ajudar pessoal??

Estou precisando muito de ajuda!

Não sei se postei na categoria correta, mas ninguém responde o que é “aparentemente” simples ( para quem sabe ).

Obrigado!!

Olá Calera,

Então pelo que eu entendi, existe um relacionamento 1:N entre Unidade e Colaborador, certo? Therefore, uma Unidade pode ter muitos Colaboradores, certo?

1 - Quando você escolhe uma unidade, precisa persistir no BD e gravar a unidade selecionada para o Colaborador corrente, está ocorrendo certinho esse persist?
2 - Quando você consulta os colaboradores, você já retorna a unidade tbm, certo? Caso a mesma já esteja cadastrada para o colaborador, vejo isso da seguinte forma:

public class Colaborador{

@ManyToOne
private Unidade unidade;
}

O Objeto unidade está preenchido?

3 - Caso o persist esteja tudo correto e no seu BD está atualizando certinho, então acredito que seja apenas um problema na página ao exibir as informações.

Tente fazer passo a passo.

1 - Cadastrou uma unidade? check
2 - Listou todas as unidades e as novas? check
3 - Cadastrou um colaborador? check
4 - Listou todos os colaboradores e os novos? check
5 - Listou as unidade disponíveis aos colaboradores? check
6 - Gravou a unidade ao colaborador? check
7 - Listou os colaboradores com as unidades? error

Algo assim, confirmando tanto em tela quando no BD e validando sua regra de negócio.

Espero que isso te dê uma luz.

Abs

Obrigado pela resposta!

Então, olhe a figura abaixo:

quando eu clico no ícone de lupa para procurar uma Unidade Lotação ( já estão todas cadastradas, tem uma tela para cadastro à parte ).

ao clicar, abre este outro panel aonde eu somente listo as Unidades.

seleciono a Unidade clicando no botão à direita de cada registro.

aí está o problema inicial, preciso que este item selecionado, seja enviado para a tela anterior preenchendo os 2 campos correspondentes.

aí sim, depois de selecionado, como terei o ID dele, vou persistir este ID na tabela de COLABORADORES, entendeu?

o relacionamento “aparentemente” está correto, consultei a tabela COLABORADOR no BD e ela contém um campo ( que o Hibernate nomeou como UNIDADELOTACAO_ID ).

Espero que possa me ajudar, sei que deve ser simples, mas estou com esta dificuldade.

Agradeço pela ajuda.

Entendi,

Não conheço muito JSF 2, já trabalhei, mas foi a muito tempo atrás com JSF 1, mas pelo que eu entendi você precisa passar parametros entre Beans, certo?

Vê se algo te ajuda.

Abs

Zabimaru, origado!

Estes links me ajudaram bastante, acabei descobrindo o que estava “faltando”:

Eu fui debugando e notei que quando eu clicava no botão para selecionar o objeto, ele estava fazendo tudo certinho e então verifiquei se ele estava repassando para a outra tela e estava, só não estava prenchendo o campo com os valores e obviamente saquei o que faltava: Get e Set…

No ColaboradorBean, faltava pegar os valores, fiz isto e resolveu o problema:

	public void unidadeSelecionada(SelectEvent event) {
		UnidadeLotacao unidadeLotacao = (UnidadeLotacao) event.getObject();
		colaborador.setUnidadeLotacao(unidadeLotacao);
//		System.out.println("UL " + unidadeLotacao);
	}

	public String getNumeroUnidadeLotacao() {
		return colaborador.getUnidadeLotacao() == null ? null
				: colaborador.getUnidadeLotacao().getNumeroUnidadeLotacao();
	}

	public void setNumeroUnidadeLotacao(String numeroUnidadeLotacao) {
	}

	public String getDescricaoUnidadeLotacao() {
		return colaborador.getUnidadeLotacao() == null ? null
				: colaborador.getUnidadeLotacao().getDescricaoUnidadeLotacao();
	}

E para setar os valores nos campos foi só fazer isto:

								<div class="ui-g-8" align="left">
									<p:inputText
										value="#{colaboradorBean.colaborador.descricaoCentroCusto}"
										placeholder="Descrição C. Custo" size="32" />
								</div>
								<div class="ui-g-4">
									<p:inputText value="#{colaboradorBean.colaborador.centroCusto}"
										placeholder="Centro de Custo" size="12" />
								</div>
								<div class="ui-g-8" align="left">
									<p:inputText id="descricao"
										placeholder="Descrição Unidade Lotação" size="32"
										value="#{colaboradorBean.descricaoUnidadeLotacao}"
										readonly="#{facesContext.currentPhaseId.name eq 'RENDER_RESPONSE'}" />
								</div>
								<div class="ui-g-4">
									<p:inputText id="numero" placeholder="Unid. Lotação"
										size="8"
										value="#{colaboradorBean.numeroUnidadeLotacao}"
										readonly="#{facesContext.currentPhaseId.name eq 'RENDER_RESPONSE'}" />
									<p:spacer width="3px" />
									<p:commandButton icon="ui-icon-search" title="Pesquisa"
										process="@this" update="@none"
										action="#{unidadeLotacaoBean.abrirDialogo}"
										style="width:22px; height: 21px; background: gray; border-color: gray; border: 0px">
										<p:ajax event="dialogReturn"
											listener="#{colaboradorBean.unidadeSelecionada}"
											process="@this" update="descricao, numero" />
										<p:resetInput target="descricao, numero" />
									</p:commandButton>
								</div>

Novamente agradeço, me ajudou muito, muito mesmo.

Abraço!