Problema com DataTable e Dialog do Primefaces

3 respostas
ronnytds

Bom dia galera, to com um problema que ja ta me deixando louco a alguns dias.
é o seguinte: no sistema que estou fazendo, na página de cadastro de uma empresa, existe
a parte do endereço, então eu improvisei uma popup com uma p:datatable dentro de uma p:dialog.
a pesquisa funciona assim: quando a dialog é aberta a datatable está vazia. então o usuário digita o Estado,
a Cidade e o nome da Rua e manda pesquisar e ai a datatable é atualizada com os registros encontrados na pesquisa.
quando o usuário selecionar uma linha da datatable, os campos de CEP, Rua e Bairro que estão na página de cadastro
são atualizados. Até aí tudo bem, sempre funcionou numa boa, mas eu fui fazer uma nova implementação,
possibilitando o usuário a pesquisar digitando o CEP na página de cadastro. essa busca é feita usando a tag f:ajax
no evento “blur” do inputText. a busca pelo CEP via ajax funciona beleza, mas dai a busca pela popup começou a
apresentar um comportamento estranho. quando busco pela popup pela primeira vez e seleciono uma linha, ele atualiza
o nome da rua e o bairro numa boa, mas o CEP não, e se eu pesquisar outro endereço pela popup e selecionar a linha, ai não
atualiza mais nada, ou seja, a busca pela popup só atualiza o nome da rua e do bairro a primeira vez, e o CEP não atualiza nunca.
pensei que poderia ser conflito com a busca ajax, então retirei a busca ajax, mas o problema continuou.
quero saber se alguém pode me ajudar.
abaixo seguem algumas informações a mais e também o código da página e dos beans envolvidos.

1 - a página é de cadastro de uma empresa, que usa basicamente o bean “empresaBean”, porém a busca da popup é feita em
“logradouroBean”.
2 - Já a busca pelo CEP via AJAX é feita em empresaBean mesmo.

Còdigo da página(só com os campos do endereço e com a popup):

<h:outputText value="CEP:"/>
                                <p:inputText id="logrCEP" value="#{empresaBean.logradouro.logrCep}">
                                    <f:ajax event="blur" execute="@this" listener="#{empresaBean.pesquisarPorCep}" render="logrCEP logrCodigo logrNome logrBairro"/>
                                </p:inputText>
                                <p:commandLink onclick="popupLogradouro.show()" title="Abrir Popup de Busca">
                                    <h:graphicImage url="/images/lens_32x32.png" width="24" height="26" style="border: none;"/>
                                </p:commandLink>
                                <h:inputHidden id="logrCodigo" value="#{empresaBean.logradouro.LOGRCodigo}" required="true" requiredMessage="O Logradouro &eacute; Obrigat&oacute;rio"/>

                                <h:outputText value="Endere&ccedil;o:"/>
                                <p:inputText id="logrNome" value="#{empresaBean.empresa.EMPREndereco}" required="true" requiredMessage="O Endere&ccedil;o &eacute; Obrigat&oacute;rio"/>
                                <h:outputText/>
                                <h:outputText value="Bairro:"/>
                                <p:inputText id="logrBairro" value="#{empresaBean.empresa.EMPRBairro}" required="true" requiredMessage="O Bairro &eacute; Obrigat&oacute;rio"/>

<p:dialog  header="Escolha um Logradouro" widgetVar="popupLogradouro" modal="true" draggable="false"
                                  width="680" resizable="false" showEffect="fold" hideEffect="slide" closeOnEscape="true">
                            <h:panelGrid id="pesquisarCEP" columns="5">
                                <h:outputText value="Estado"/>
                                <h:outputText value="Cidade"/>
                                <h:outputText value="Logradouro"/>
                                <h:outputText/>
                                <h:outputText/>

                                <p:inputText onblur="this.value = this.value.toUpperCase();" maxlength="2" binding="#{logradouroBean.selectEstado}" id="ddlUF" style="width: 50px;"/>
                                <p:inputText binding="#{logradouroBean.inputCidade}" value="#{logradouroBean.cidade}" />
                                <p:inputText binding="#{logradouroBean.inputRua}" value="#{logradouroBean.logr}"/>
                                <p:commandLink action="#{logradouroBean.pesquisar}" ajax="true" update="tabelaLogradouro,msg" immediate="true" onstart="imgAjax.show()" oncomplete="imgAjax.hide()">
                                    <h:graphicImage url="/images/lens_32x32.png" width="24" height="26" style="border: none;"/>
                                </p:commandLink>
                            </h:panelGrid>
                <p:dataTable id="tabelaLogradouro" var="logrListar" value="#{logradouroBean.listaPopup}"
                                     emptyMessage="Nenhum Registro Encontrado" paginator="true" rows="10"
                                     paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
                                     paginatorPosition="bottom" selectionMode="single" selection="#{empresaBean.logradouro}"
                                     update="logrCEP,logrCodigo,logrNome,logrBairro" style="font-size: 13px; width:100%;">
                                    <f:facet name="header">
                                        Lista de Logradouros
                                    </f:facet>
                                    <p:column filterBy="#{logrListar.LOGRNome}" filterMatchMode="contains" filterStyle="width: 100%;">
                                        <f:facet name="header">
                                            <h:outputText value="Nome"/>
                                        </f:facet>
                                        <h:outputText value="#{logrListar.LOGRNome}"/>
                                    </p:column>
                                    <p:column filterBy="#{logrListar.logrCep}" filterMatchMode="startsWith" filterStyle="width: 100%;">
                                        <f:facet name="header">
                                            <h:outputText value="CEP"/>
                                        </f:facet>
                                        <h:outputText value="#{logrListar.logrCep}"/>
                                    </p:column>
                            </p:dataTable>
                        </p:dialog>

Código de logradouroBean

@ManagedBean(name="logradouroBean")
@SessionScoped
public class LogradouroBean implements Serializable {
    private SAG7Logradouro logradouro;
    private DataModel<SAG7Logradouro> listaLogradouros;
    private DataModel<SAG7Logradouro> listaPopup;
    private Integer estado;
    private String cidade;
    private String logr;
    private HtmlInputText selectEstado;
    private HtmlInputText inputCidade;
    private HtmlInputText inputRua;
    private HtmlInputText inputCep;
    private HtmlInputText inputLogradouro;
    private HtmlInputText inputBairro;
    private Map<String, Integer> listaEstados;
    
    public LogradouroBean() {
        logradouro = new SAG7Logradouro();
        listaLogradouros = new ListDataModel<SAG7Logradouro>();
        listaPopup = new ListDataModel<SAG7Logradouro>();
        setListaEstados();
    }

    public Map<String, Integer> getListaEstados() {
        return listaEstados;
    }

    public void setListaEstados() {
        this.listaEstados = new HashMap<String, Integer>();
        this.listaEstados.put("AC", 12);
        this.listaEstados.put("AL", 27);
        this.listaEstados.put("AP", 16);
        this.listaEstados.put("AM", 13);
        this.listaEstados.put("BA", 29);
        this.listaEstados.put("CE", 23);
        this.listaEstados.put("DF", 53);
        this.listaEstados.put("ES", 32);
        this.listaEstados.put("GO", 52);
        this.listaEstados.put("MA", 21);
        this.listaEstados.put("MT", 51);
        this.listaEstados.put("MS", 50);
        this.listaEstados.put("MG", 31);
        this.listaEstados.put("PA", 15);
        this.listaEstados.put("PB", 25);
        this.listaEstados.put("PR", 41);
        this.listaEstados.put("PE", 26);
        this.listaEstados.put("PI", 22);
        this.listaEstados.put("RJ", 33);
        this.listaEstados.put("RN", 24);
        this.listaEstados.put("RS", 43);
        this.listaEstados.put("RO", 11);
        this.listaEstados.put("RR", 14);
        this.listaEstados.put("SC", 42);
        this.listaEstados.put("SP", 35);
        this.listaEstados.put("SE", 28);
        this.listaEstados.put("TO", 17);
    }

    public HtmlInputText getInputBairro() {
        return inputBairro;
    }

    public void setInputBairro(HtmlInputText inputBairro) {
        this.inputBairro = inputBairro;
    }

    public HtmlInputText getInputLogradouro() {
        return inputLogradouro;
    }

    public void setInputLogradouro(HtmlInputText inputLogradouro) {
        this.inputLogradouro = inputLogradouro;
    }

    public HtmlInputText getInputCidade() {
        return inputCidade;
    }

    public void setInputCidade(HtmlInputText inputCidade) {
        this.inputCidade = inputCidade;
    }

    public HtmlInputText getInputCep() {
        return inputCep;
    }

    public void setInputCep(HtmlInputText inputCep) {
        this.inputCep = inputCep;
    }

    public HtmlInputText getInputRua() {
        return inputRua;
    }

    public void setInputRua(HtmlInputText inputRua) {
        this.inputRua = inputRua;
    }

    public HtmlInputText getSelectEstado() {
        return selectEstado;
    }

    public void setSelectEstado(HtmlInputText selectEstado) {
        this.selectEstado = selectEstado;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public Integer getEstado() {
        return estado;
    }

    public void setEstado(Integer estado) {
        this.estado = estado;
    }

    public String getLogr() {
        return logr;
    }

    public void setLogr(String logr) {
        this.logr = logr;
    }

    public DataModel<SAG7Logradouro> getListaLogradouros() {
        return listaLogradouros;
    }

    public void setListaLogradouros(DataModel<SAG7Logradouro> listaLogradouros) {
        this.listaLogradouros = listaLogradouros;
    }

    public DataModel<SAG7Logradouro> getListaPopup() {
        return listaPopup;
    }

    public void setListaPopup(DataModel<SAG7Logradouro> listaPopup) {
        this.listaPopup = listaPopup;
    }

    public SAG7Logradouro getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(SAG7Logradouro logradouro) {
        this.logradouro = logradouro;
    }

    public void pesquisar(){
        if(selectEstado.getSubmittedValue().toString() != null && selectEstado.getSubmittedValue().toString() != ""){
            LogradouroDAO ldao = new LogradouroDAO();
            estado = listaEstados.get(selectEstado.getSubmittedValue().toString());
            cidade = inputCidade.getSubmittedValue().toString();
            logr = inputRua.getSubmittedValue().toString();
            listaPopup = new ListDataModel<SAG7Logradouro>(ldao.pesquisar(estado, cidade, logr));
        }
    }
}

Código de empresaBean:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controle.beans;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import modelo.entidades.SAG7Logradouro;
import modelo.entidades.SAG7Usuarios;
import modelo.entidades.SGCGCalendarioContabil;
import modelo.entidades.SGCGEmpresa;
import modelo.entidades.SGCGGestorContabil;
import modelo.entidades.SGCGJuntaComercial;
import modelo.entidades.SGCGPlanoDeContas;
import modelo.persistencia.EmpresaDAO;
import modelo.persistencia.LogradouroDAO;
import org.primefaces.component.datatable.DataTable;


/**
 *
 * @author Administrador
 */
@ManagedBean(name="empresaBean")
@SessionScoped
public class EmpresaBean implements Serializable {
    private SGCGEmpresa empresa;
    private SGCGPlanoDeContas plano;
    private SGCGCalendarioContabil calendario;
    private SGCGJuntaComercial juntaComercial;
    private SGCGGestorContabil gestorContabil;
    private SAG7Logradouro logradouro;
    private DataModel<SGCGEmpresa> listaEmpresas;
    private DataModel<SGCGEmpresa> listaEmpresasPopup;
    private SelectItem[] situacoes;

    public EmpresaBean() {
        empresa = new SGCGEmpresa();
        plano = new SGCGPlanoDeContas();
        calendario = new SGCGCalendarioContabil();
        juntaComercial = new SGCGJuntaComercial();
        gestorContabil = new SGCGGestorContabil();
        logradouro = new SAG7Logradouro();
        //listaEmpresas = new ListDataModel<SGCGEmpresa>();
        //listaEmpresasPopup = new ListDataModel<SGCGEmpresa>();
        setSituacoes();
    }

    public SGCGCalendarioContabil getCalendario() {
        return calendario;
    }

    public void setCalendario(SGCGCalendarioContabil calendario) {
        String botao = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("btnSalvar");
        if(botao == null){
            novoCalendario();
            this.calendario = calendario;
        }
    }

    public void novoCalendario(){
        this.calendario = new SGCGCalendarioContabil();
    }

    public SGCGGestorContabil getGestorContabil() {
        return gestorContabil;
    }

    public void setGestorContabil(SGCGGestorContabil gestorContabil) {
        String botao = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("btnSalvar");
        if(botao == null){
            novoGestorContabil();
            this.gestorContabil = gestorContabil;
        }
    }

    public void novoGestorContabil(){
        this.gestorContabil = new SGCGGestorContabil();
    }

    public SGCGJuntaComercial getJuntaComercial() {
        return juntaComercial;
    }

    public void setJuntaComercial(SGCGJuntaComercial juntaComercial) {
        String botao = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("btnSalvar");
        if(botao == null){
            novaJuntaComercial();
            this.juntaComercial = juntaComercial;
        }
    }

    public void novaJuntaComercial(){
        this.juntaComercial = new SGCGJuntaComercial();
    }

    public SAG7Logradouro getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(SAG7Logradouro logradouro) {
        String botao = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("btnSalvar");
        if(botao == null){
            novoLogradouro();
            this.logradouro = logradouro;
            if(this.logradouro != null){
                this.empresa.setEMPREndereco(this.logradouro.getLOGRNome());
                this.empresa.setEMPRBairro(this.logradouro.getSAG7Bairro().getBAIRNome());
            }
        }
    }

    public void novoLogradouro(){
        this.logradouro = new SAG7Logradouro();
    }

    public SGCGPlanoDeContas getPlano() {
        return plano;
    }

    public void setPlano(SGCGPlanoDeContas plano) {
        String botao = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("btnSalvar");
        if(botao == null){
            novoPlano();
            this.plano = plano;
        }
    }

    public void novoPlano(){
        this.plano = new SGCGPlanoDeContas();
    }

    public SGCGEmpresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(SGCGEmpresa empresa) {
        this.empresa = empresa;
    }

    public DataModel<SGCGEmpresa> getListaEmpresas() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("empresa");
        setEmpresa(null);
        if(listaEmpresas == null){
            EmpresaDAO empresaDAO = new EmpresaDAO();
            listaEmpresas = new  ListDataModel<SGCGEmpresa>(empresaDAO.listarPagina());
        }
        return listaEmpresas;
    }

    public void setListaEmpresas(DataModel<SGCGEmpresa> listaEmpresas) {
        this.listaEmpresas = listaEmpresas;
    }

    public DataModel<SGCGEmpresa> getListaEmpresasPopup() {
        if(listaEmpresasPopup == null){
            EmpresaDAO empresaDAO = new EmpresaDAO();
            listaEmpresasPopup = new  ListDataModel<SGCGEmpresa>(empresaDAO.listarPopup());
        }
        return listaEmpresasPopup;
    }

    public void setListaEmpresasPopup(DataModel<SGCGEmpresa> listaEmpresasPopup) {
        this.listaEmpresasPopup = listaEmpresasPopup;
    }

    public SelectItem[] getSituacoes() {
        return situacoes;
    }

    public void setSituacoes() {
        situacoes = new SelectItem[3];
        situacoes[0] = new SelectItem("", "Todas");
        situacoes[1] = new SelectItem("Ativa", "Ativa");
        situacoes[2] = new SelectItem("Inativa", "Inativa");
    }

    public String listar(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("empresa");
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("matriz");
        setEmpresa(null);
        listaEmpresas = null;
        listaEmpresasPopup = null;
        return "empresaLista";
    }

    public String listarFiliais(){
        try {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("matriz");
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("matriz", getEmpresa());
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("listar", "sim");
            return "empresaFilialLista";
        } catch (Exception e) {
            e.printStackTrace();
            return "empresaLista";
        }
    }

    public String listarUsuarios(){
        try {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("empresa");
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("empresa", getEmpresa());
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("listar", "sim");
            return "usuarioEmpresaLista";
        } catch (Exception e) {
            e.printStackTrace();
            return "empresaLista";
        }
    }

    public String criar(){
        empresa = new SGCGEmpresa();
        plano = new SGCGPlanoDeContas();
        calendario = new SGCGCalendarioContabil();
        juntaComercial = new SGCGJuntaComercial();
        gestorContabil = new SGCGGestorContabil();
        logradouro = new SAG7Logradouro();
        return "empresaCadastro";
    }

    public String cadastrar(){
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            SAG7Usuarios logado = (SAG7Usuarios) context.getExternalContext().getSessionMap().get("usuario");
            empresa.setSAG7Usuarios1(logado);//Usuário de Cadastro
            empresa.setSAG7Usuarios(logado);//Usuário de Alteração
            empresa.setEMPRDataHoraCadastro(new Date(Calendar.getInstance().getTime().getTime()));
            empresa.setEMPRDataUltimaAlteracao(new Date(Calendar.getInstance().getTime().getTime()));
            empresa.setEMPRSituacao("Ativa");
            empresa.setSGCGPlanoDeContas(plano);
            empresa.setSGCGCalendarioContabil(calendario);
            empresa.setSGCGJuntaComercial(juntaComercial);
            empresa.setSGCGGestorContabil(gestorContabil);
            empresa.setSAG7Logradouro(logradouro);
            EmpresaDAO edao = new EmpresaDAO();
            if(edao.cadastrar(empresa)==1){
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Empresa Cadastrada com Sucesso", null));
                listaEmpresas = null;
                listaEmpresasPopup = null;
                return "empresaLista";
            }else{
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi Possível Cadastrar a Empresa", null));
                return "empresaCadastro";
            }
        } catch (Exception e) {
            e.printStackTrace();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi Possível Cadastrar a Empresa", null));
            return "empresaCadastro";
        }
    }

    public String editar(){
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            EmpresaDAO edao = new EmpresaDAO();
            empresa = edao.localizar(empresa.getEMPRCodigo());
            plano = empresa.getSGCGPlanoDeContas();
            calendario = empresa.getSGCGCalendarioContabil();
            juntaComercial = empresa.getSGCGJuntaComercial();
            gestorContabil = empresa.getSGCGGestorContabil();
            logradouro = empresa.getSAG7Logradouro();
            return "empresaEdicao";
        } catch (Exception e) {
            e.printStackTrace();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi Possível Carregar as Informações da Empresa", null));
            return "empresaLista";
        }
    }

    public String excluir(){
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            EmpresaDAO edao = new EmpresaDAO();
            empresa = edao.localizar(empresa.getEMPRCodigo());
            if(edao.excluir(empresa)==1){
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Empresa Excluida com Sucesso", null));
                listaEmpresas = null;
                listaEmpresasPopup = null;
                return "empresaLista";
            }else{
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi Possível Excluir a Empresa", null));
                return "empresaLista";
            }
        } catch (Exception e) {
            e.printStackTrace();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi Possível Excluir a Empresa", null));
            return "empresaLista";
        }
    }

    public String atualizar(){
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            SAG7Usuarios logado = (SAG7Usuarios) context.getExternalContext().getSessionMap().get("usuario");
            empresa.setSAG7Usuarios(logado);//Usuário de Alteração
            empresa.setEMPRDataUltimaAlteracao(new Date(Calendar.getInstance().getTime().getTime()));
            empresa.setSGCGPlanoDeContas(plano);
            empresa.setSGCGCalendarioContabil(calendario);
            empresa.setSGCGJuntaComercial(juntaComercial);
            empresa.setSGCGGestorContabil(gestorContabil);
            empresa.setSAG7Logradouro(logradouro);
            EmpresaDAO edao = new EmpresaDAO();
            if(edao.atualizar(empresa)==1){
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Empresa Atualizada com Sucesso", null));
                listaEmpresas = null;
                listaEmpresasPopup = null;
                return "empresaLista";
            }else{
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi Possível Atualizar a Empresa", null));
                return "empresaEdicao";
            }
        } catch (Exception e) {
            e.printStackTrace();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi Possível Atualizar a Empresa", null));
            return "empresaEdicao";
        }
    }

    public void pesquisarPorCep(AjaxBehaviorEvent e){
        if(logradouro.getLogrCep() != null || !logradouro.getLogrCep().equals("")){
            LogradouroDAO ldao = new LogradouroDAO();
            SAG7Logradouro logradouro2 = ldao.buscarPorCep(logradouro.getLogrCep());
            if(logradouro2 == null){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Endereço não encontrado", null));
            }else{
                setLogradouro(logradouro2);
            }
        }
    }

    public void atualizarCEP(){
        System.out.println("Passei Aqui");
    }
}

Agradeço a ajuda de todos.

3 Respostas

Takeshi91

Tente adicionar uma tag f:ajax dentro da inputText de CPF

pegue o evento, e quando o evento (blur) executar você mandar atualizar (render) os outros componentes.

boa sorte

ronnytds

então, mas ja to fazendo isso, na busca pelo CEP. o problema é quando o usuário resolve ir pela busca da popup.
mas obrigado pela dica Takeshi91! :wink:

ronnytds

e ai gente, será que mais alguém pode me ajudar??
esgotei todas minhas idéias de como resolver esse problema. =/

Criado 5 de abril de 2011
Ultima resposta 5 de abr. de 2011
Respostas 3
Participantes 2