Dois selectOneMenu, somente um é renderizado na pesquisa

Prezados, mais uma vez preciso da ajuda de vcs. Tenho uma tela de CRUD de cursos, onde são inseridos seus dados. Esses cursos pertencem à uma área que pertence à um departamento. Tanto área quanto departamento são itens selectOneMenu. Para cadastrar, tudo funciona perfeitamente, ou seja, quando escolho uma área pelo combo, atualiza o combo de departamentos. Sendo que quando eu preciso consultar um curso para fazer alteração, somente o combo de área é populado, o combo de departamento não.
Para escolher o curso para ser alterado eu utilizo um dialog com um datatable que lista todos os cursos. Ao clicar no botão para escolher, todos os itens são populados, somente o combo de departamentos que não. Creio que seja algo para ser renderizado.

Segue os trechos do programa para análise:

curso.xhtml

 <h:selectOneMenu id="lovArea" value="#{cursoBean.curso.cod_area}" valueChangeListener="#{departamentoBean.getListaDepartamentos}" required="true" requiredMessage="O nível de Ensino deve ser preenchido!">  
        <f:selectItem itemValue="" itemLabel="Selecione"/>
        <f:selectItems value="#{areaBean.listAreas}" var="areaL" itemValue="#{areaL.cod_area}" itemLabel="#{areaL.dsc_area}"/>  
        <f:ajax event="valueChange" render="lovDepto" />
 </h:selectOneMenu> 

<h:selectOneMenu id="lovDepto" value="#{cursoBean.curso.cod_depto}" >  
        <f:selectItem itemValue="" itemLabel="Selecione"/>
        <f:selectItems value="#{departamentoBean.departamentos}" var="deptoL" itemValue="#{deptoL.cod_depto}" itemLabel="#{deptoL.nom_depto}" />  
        <f:ajax event="change" render="sigDepto"  />
</h:selectOneMenu> 

Aqui está o dialog:

<p:dataTable id="lovCursos" value="#{cursoBean.cursos}" var="cursos" rowKey="#{cursos.cod_curso}" 
                                     selection="#{cursoBean.curso}" selectionMode="single" paginator="true" rows="10" scrollable="true"
                                     filteredValue="#{cursoBean.cursoList}" emptyMessage="Não foram encontrados cursos com este critério!">
           <p:column filterMatchMode="contains" headerText="Pesquisa por Nome de Curso" filterBy="#{cursos.nom_curso_hist}">#{cursos.nom_curso_hist}</p:column>
                                <br />
&lt;/p:dataTable&gt;
                        
&lt;p:commandButton id="btn_dialog" value="OK" update=":frm_curso_pg:tbview_curso"  onclick="frm_dlg_mod_cur.hide();" /&gt;
&lt;p:commandButton value="Cancelar" onclick="frm_dlg_mod_cur.hide();"/&gt; 

Não estou postando os beans pois está funcionando normalmente quando insiro os dados. Já tentei renderizar somente os selectOneMenu, mas continua da mesma forma.

Obrigado.

Amigo quem é tbview_curso, não vi ele dentro do seu código ?

A sua lógica esta correta, mas o update me parece errada, tente atuallizar o seu componente direto, :nome_do_seu_form:nome_do_seu_componente que voce quer atualizar e se não der certo, tente dar update em algum componente acima dele, EX: <p:panel (lembrando que dar update de um componente acima, atualiza todos os componentes abaixo dele ok).

Abraços e espero ter ajudado :slight_smile:

Jomello

jomello, vlw pela resposta, mas já tentei fazer isso. O tbview_curso é um panel e dentro dele que tem os itens do form. Por isso dou update nele. Tanto que antes estava dando erro na árvore de componentes e só assim que funcionou. Já coloquei para renderizar somente os itens do selectOneMenu mas também não funciona. Seria algo do tipo: :frm_curso_pg:tbview_curso:lovArea e outro para o lovDepto. Não funciona.
O primeiro selecOneMenu traz o valor, mas o segundo (lovDepto) não. Não sei se é por causa do valueChangeListener. Outra coisa que acontece é que o lovDepto não atualiza, mas se eu alterar o valor do lovArea, aí sim ele altera o valor dele. Não sei se consegui ser claro…

Abraços e obrigado.

Amigo, eu sinceramente eu compreendi, mas não entendi o seu problema, mas vou tentar te ajudar ok. he he he :slight_smile:

Dentro do seu dataTable coloca um ajax select (pega no showcase do Primafaces, não lembro a sintaxe ok) ou coloca um <p:commandButton em cada linha da Pesquisa e dispara um AtualizaCombo(), ai voce recria o seu combo e dentro do seu MB voce atualiza esse componente, segue abaixo como fazer de dentro do seu MB ok.

Public void AtualizaCombo() {

// AQUI VOCE RECRIA/POPULA SEU COMBO ...

RequestContext context = RequestContext.getCurrentInstance();

context.update("seu_form:seu_componente");

// Repare que não tem os[b] :[/b] antes do [b]seu_form[/b], é assim mesmo ok e outra coisa, mantem o update do seu Panel lá na pagina ok.
}

Sinceramente espero que resolva, qualquer coisa é só gritar e a gente tenta achar outra solução ok. :slight_smile:

Abraços

Jomello

Jomello, estou com 3 arquivos para tentar explicar melhor a situação. Colocar botões em cada lista não seria interessante para os usuários e o layout ficaria fora do padrão.

Arquivo 1 - crud_curso.jpg: Esta é a tela dos cursos. Os botões Inserir, alterar e remover estão funcionando. O botão Modal (não é este nome que ficará hehehe) é para consulta. É ele que abre o dialog para a escolha do curso.

Arquivo 2 - dialog_curso.jpg: Este é o dialog que abre para a escolha do curso. O curso é selecionado e ao clicar em OK, os dados são populados para o form de cursos. Esse dialog é um outro form.

Arquivo 3 - populado_curso.jpg: Esta é a tela do curso já populado. Note na marcação que fiz que o item referente ao departamento não está preenchido. Este que é o problema. O nível de Ensino é populado, mas o departamento não. Lembrando que o Departamento só é preenchido quando o nível de ensino for preenchido também. Um depende do outro.

Então este é o passo-a-passo da situação.

Para inserir um novo curso funciona perfeitamente, pois alterando o nível de ensino, o departamento muda de acordo com ele. Então sem problemas.
A pergunta é: realmente é necessário fazer este outro método que me indicou? Se eu tiver mais combos, terei que fazer um para cada?

Agradeço muito a atenção. Já tentei fazer de tudo, pesquisas no fórum e nada.
Obrigado.





Coloca as suas entidades e o MB, para eu dar uma olhada ok.

Abraços

Jomello

Ok, segue os managed bean:

DepartamentoBean

@ManagedBean
@SessionScoped
public class DepartamentoBean implements Serializable {
    
    private DepartamentoDao departamentoDao ;   
    private Departamento departamento = new Departamento();
    private DataModel<Departamento> departamentos; 
    
   

    
    public Departamento getDepartamento() {
        return departamento;
    }

    public void setDepartamento(Departamento departamento) {
        this.departamento = departamento;
    }
    
    public DataModel<Departamento> getDepartamentos() {
        return departamentos;
    }

    public void setDepartamentos(DataModel<Departamento> departamentos) {
        this.departamentos = departamentos;
        
    }
    

    
    public DataModel<Departamento> getListaDepartamentos(ValueChangeEvent evento) throws SQLException, ClassNotFoundException {
        String param = evento.getNewValue().toString();
        int codArea = Integer.parseInt(param);
        departamentoDao = new DepartamentoDao();
        List<Departamento> departamentoList = departamentoDao.lovListarDepto(codArea);
        departamentos = new ListDataModel<Departamento>(departamentoList);
        return departamentos;
    }
  
}

CursoBean

@ManagedBean
@SessionScoped
public class CursoBean implements Serializable {
    
    private CursoDao cursoDao;   
    private Curso curso = new Curso();

    private List<Curso> cursoList;


    //getters e setters

    
     public void inserir() throws SQLException, ClassNotFoundException{
        cursoDao = new CursoDao();       
        this.curso.setCod_curso(this.cursoDao.seqCurso());
        cursoDao.inserir(curso);
        this.curso = new Curso();
    }
     
    public void alterar() throws SQLException, ClassNotFoundException{
        cursoDao = new CursoDao();
        cursoDao.alterar(curso); 
    }
    
    public void remover() throws SQLException, ClassNotFoundException{
        cursoDao.remover(curso);
     }
 
 
    public DataModel<Curso> getCursos(ValueChangeEvent evento) throws SQLException, ClassNotFoundException {
        String param = evento.getNewValue().toString();
        int codArea = Integer.parseInt(param);
        cursoDao = new CursoDao();
        cursoList = cursoDao.lovListar(codArea);
        cursos = new ListDataModel<Curso>(cursoList);
        return cursos;
    }
    
    public List<Curso> selecionaCurso(){
        
        return cursoList;
    }
}

Curso (modelo)

public class Curso implements Serializable {

    private int    cod_curso;
    private String nom_curso_hist;
    private int    qtd_period_curso;
    private int    cod_area;
    private String sig_curso;
    private int    qtd_max_period;
    private int    cod_depto;
    private String ind_tipo_curso;
    private int    cod_emp;
    
    //getters e setters

os outros modelos seguem o mesmo padrão, atributos e getters e setters. Estamos usando jdbc.

Opaaa… Desculpe a demora, estive fora esses dias. :slight_smile:

Olha pelo que pude ver, já que vc utiliza JDBC, não vejo outra solução que não seja, popular seu combo via algum evento, pode ser inclusive no set do seu curso ok.

Se voce estivesse utilizando hibernate quando voce carrega o pai ele já tras todos os filhos juntos ok.

Abraços

Jomello