commandButtom+update

Pessoal estou dando um update em um formulário porem esta me retornando essa mensagem:

javax.faces.FacesException: Cannot find component with identifier "form:dataTableCadFrabricantes" referenced from "formCadastrarFab:j_idt38".

Abaixo segue o código da minha página xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <link rel="stylesheet" type="text/css" href="#{facesContext.externalContext.request.contextPath}/resources/css/botoes.css"/>
        <title>SCER - Cadastro de fabricantes</title>
    </h:head>
    <h:body>
        <ui:composition template="/WEB-INF/template.xhtml">
            <ui:define name="conteudoPrincipal">
                <p:panel header="Cadastro de fabricante">
                    <h:form id="form">
                        <p:growl id="growl" showDetail="true"/>

                        <p:dataTable id="dataTableCadFrabricantes" var="fabricante" value="#{fabricanteModel.fabricanteDataModel}" paginator="true" rows="10"
                                     selection="#{fabricanteModel.selectedFabricante}" selectionMode="single">

                            <f:facet name="header">
                                Fabricantes
                            </f:facet>

                            <p:column headerText="Email">
                                #{fabricante.email}
                            </p:column>

                            <p:column headerText="Nome">
                                #{fabricante.nome}
                            </p:column>

                            <p:column headerText="Telefone" >
                                #{fabricante.telefone}
                            </p:column>

                        </p:dataTable>
                        <p:separator/>
                        <fieldset id="barraBotoesTelaGerenciamento">
                            <p:commandButton value="Cadastrar" disabled="false" oncomplete="cadFabricante.show();"/>
                            <p:commandButton value="Editar" disabled="false"/>
                            <p:commandButton value="Excluir" disabled="false"/>
                            <p:commandButton value="Visualizar" disabled="false" oncomplete="carDialog.show()"/>
                        </fieldset>
                    </h:form>

                    <h:form id="formCadastrarFab">
                        <p:dialog id="dlgCadastrarFab" header="Cadastrar Fabricante" widgetVar="cadFabricante" resizable="false" modal="true" minHeight="400" width="400">  

                            <h:panelGrid id="pngCadastrar" columns="2" cellpadding="4">  

                                <h:outputText value="Email:" />  
                                <p:inputText value="#{fabricanteModel.selectedFabricante.email}" /> 

                                <h:outputText value="Nome:" />  
                                <p:inputText value="#{fabricanteModel.selectedFabricante.nome}"/>

                                <h:outputText value="Telefone:" />
                                <p:inputText value="#{fabricanteModel.selectedFabricante.telefone}" />

                            </h:panelGrid> 
                            <p:separator/>
                            <fieldset id="barraBotoes">
                                <p:commandButton value="OK" actionListener="#{fabricanteModel.salvar}" update="form:dataTableCadFrabricantes"/>
                                <p:commandButton value="Cancelar" onclick="cadFabricante.hide();"/>
                            </fieldset>
                        </p:dialog> 
                    </h:form>
                </p:panel>
            </ui:define>
        </ui:composition>
    </h:body>
</html>

Também tenho um template abaixo segue o código do template:

<?xml version='1.0' encoding='UTF-8' ?>
<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <link rel="stylesheet" type="text/css" href="#{facesContext.externalContext.request.contextPath}/resources/css/template.css"/>
    </h:head>
    <h:body>
        
        <div id="corpo">
            <div id="menuTopo">
                <h:form>
                    <p:menubar>
                        <p:submenu label="Cadastro Básicos" icon="ui-icon-document">   
                            <p:menuitem value="Fornecedores" action="cadastroFornecedores" />  
                            <p:menuitem value="Equipamentos"/>  
                            <p:separator />   
                        </p:submenu> 
                    </p:menubar>
                </h:form>
                
            </div>

            <div id="conteudoPrincipal">
                <ui:insert name="conteudoPrincipal"></ui:insert>
            </div>

            <div id="rodape">
            </div>
        </div>

    </h:body>
</html>

Se alguém puder me ajudar agradeço.

Tenta colocar :form:idComponente

Boa tarde [quote]lele_vader [/quote]

Tentei dessa forma porem também não funfou.

Você pode colcoar prependId = false nos forms e referenciar o id do componente direto.

Remova o update do commandButton, e execute a página.

Pelo google chrome (outros navegadores tem suas maneiras de fazer o mesmo), clique com o direito em algum objeto dentro do dataTable, e selecione “Inspecionar Elemento”.
Vá pelo código html, pegue o id REAL do dataTable (Normalmente, o primefaces coloca

, então, o id estará na div acima da abertura do table), e coloque “update=’:idReal’”.
O PrimeFaces utiliza o caminho completo do componente.

ps: Verifica o id do data table, pois o mesmo esta como dataTableCadFrabicantes, e, mesmo o update estando igual, isso pode acarretar em problemas futuros

Funfou também não cara, o id esta assim: form:dataTableCadFrabricantes, coloquei mais não funcionou.

Hmm, talvez seja por estarem em forms diferentes. Vamos tentar algumas opções:

Coloque o botão, para que o mesmo faça update=“form”, se não funcionar, update=":form".
Caso ainda não funcione, o primefaces tem uma opção de referência ‘@this’, que seria a pagina. Tente update="@this".
Caso continue apresentando problema, tente colocar …

<h:body>
<f:view id="idTesteUpdate">
<!-- O Conteudo da pagina -->
</f:view>
</h:body>

… remova o update do botão, rode a pagina, e veja se o id do f:view foi encorporado ao id do table. Tente usar update com, e sem “:”.

Caso continu sem funcionar, vamos tentar algo mais drástico:
Eu vi que voce utiliza , o que pra mim, é estranho, uma vez que ao fechar o dialog, o form continuará na pagina.
Tente inverter e colocar o DENTRO do <p:dialog></p:dialog> (Eu utilizo dessa maneira.), ficando algo mais ou menos assim :

<html>
<h:head>
<!-- ... -->
</h:head>
<h:body>
<!-- ... -->
<h:form id="form">

</h:form>
<p:dialog widgetVar="cadFabricante">
<h:form id="formCadastrarFab">
<!-- ... -->
</h:form>
</p:dialog>
</h:body>
</html>

Dica de boa prática: Tente utilizar ids melhores, as vezes, o seu id=“form” seja o problema. Tente utilizar ids como por exemplo
<h:form id=“idFrmCadastro” />
<p:dialog id=“idDlgCadastro” />

e etc… , facilita a leitura do programa, facilita na manutenção, fica mais claro e mais fácil de identificar os componentes.

pega o id pelo firebug ou se usar o IE, dar um f12,claro com aplicação rodando e ver o nome do id completo e passa para o teu update.

qual versao do primefaces vc ta usando?
essa questao do update vem mudando junto com as versoes…
tem versao que é separado por virgula e tem versao que é separado por :

":form:dataTableCadFrabricantes" "form,dataTableCadFrabricantes"

Tenta:

update=":form:dataTableCadFrabricantes"