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

4 respostas Resolvido
primefacesjava
C

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="[CPF removido]">
						#{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="[CPF removido]" />
							</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!!

4 Respostas

Z

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

C

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.

Z
Solucao aceita

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

C

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!

Criado 13 de dezembro de 2016
Ultima resposta 22 de dez. de 2016
Respostas 4
Participantes 2