[RESOLVIDO] Selecao de row na datatable para preencher um dialog

Boa tarde pessoal,

estou tendo um problema ao selecionar uma row da minha datatable para carregar um dialog com os dados do item selecionado

segue o codigo

[code] <h:form id=“form”>
<p:dataTable var=“c” value="#{pedidoItem.arped}"
paginator=“true” rows=“20”
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate=“20,30,50,60,80,100” selectionMode=“single” selection=“pedido.show()”>

         <f:facet name="header">  
             CONSULTA DE PEDIDOS
         </f:facet>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="ID" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_ID}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="DATA" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_DTPDD}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="TERMINAL" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_TMN}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="TURNO" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_TRN}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="CLIENTE" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_CLI}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="VENDEDOR" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_VENDEDOR}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="V.Liq." />  
             </f:facet>  
             <h:outputText value="#{c.PDD_VLLIQ}" />  
         </p:column>  
         
          <f:facet name="footer">  
              <p:commandButton onclick="pedido.show();" value="Clique" update="item"  actionListener="#{pedidoItem.listarItemPedido}"/>
 
    </f:facet> 
         
     </p:dataTable>  
        
        
      
     
     <p:dialog header="Itens do pedido" widgetVar="pedido" resizable="false" 
               showEffect="explode" hideEffect="explode"> 
         
         <p:dataTable var="item" value="#{pedidoItem.aritem}" 
                  paginator="true" rows="20"    
                  paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"> 
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="ID ITEM" />  
                 </f:facet>  
                 <h:outputText value="#{item.ITE_PDT}" />  
             </p:column >  
         </p:dataTable>
     </p:dialog> 

</h:form>
[/code]

Cara, da uma olhada na forma que faço:


<p:dataTable value="#{funcaoBean.funcoes}"
		var="funcoes"	
		emptyMessage="Nenhum dado encontrado !">
	
		<p:column headerText="ID" style="width:50px;">
		       <h:outputText value="#{funcoes.id}"/>
		</p:column>
					
		<p:column headerText="NOME" style="width:100px;">
			<h:outputText value="#{funcoes.nome}"/>
		</p:column>
					
		<p:column headerText="DESCRIÃ?Ã?O" style="width:250px;">
			<h:outputText value="#{funcoes.descricao}"/>
		</p:column>
					
		<p:column headerText="Ações" style="width:50px;">
			<p:commandButton oncomplete="funcaoDialog.show()" update="altFuncao" image="ui-icon-pencil">
					<f:setPropertyActionListener target="#{funcaoBean.funcaoSelecionada}" value="#{funcoes}"/>
			</p:commandButton>
		</p:column>
					
</p:dataTable>

Dialog


<p:dialog widgetVar="funcaoDialog" position="center" modal="true" closeOnEscape="true">
					
	<h:form id="altFuncao" prependId="true">
					
		<h:panelGrid columns="2" columnClasses="colunaEsquerda,colunaDireita">
							
			<h:outputText value="ID : "/>
			<h:outputText value="#{funcaoBean.funcaoSelecionada.id}"/>
							
			<h:outputText value="Função : "/>
			<p:inputText value="#{funcaoBean.funcaoSelecionada.nome}"
						 size="20"
						 required="true"
						 onkeydown="this.value = this.value.toUpperCase();"/>
							
			<h:outputText value="Descrição : "/>
			<p:inputText value="#{funcaoBean.funcaoSelecionada.descricao}"
						 size="30"
						 required="true"
						 onkeydown="this.value = this.value.toUpperCase();"/>			 
			<br/>
			<p:separator/>
			<br/>
							
			<f:facet name="footer">
		 	   <p:commandButton value="Salvar"   update="tabela_F" actionListener="#{funcaoBean.alterar}" ajax="false" oncomplete="funcaoDialog.hide()"
						 image="ui-icon-check"/>
			    <p:commandButton value="Cancelar" actionListener="#{funcaoBean.limpaFormulario}" onclick="funcaoDialog.hide()" image="ui-icon-close" type="button"/>
			</f:facet>
							
							
	   </h:panelGrid>
					
	</h:form>	  
						  
</p:dialog>

Acredito que seu problema está na referência ao componente que deseja atualizar no elemento update do seu commandoButton como está no trecho seguinte

<f:facet name="footer">    
                <p:commandButton onclick="pedido.show();" value="Clique" update="item"  actionListener="#{pedidoItem.listarItemPedido}"/>       
</f:facet>   

seu update pede para atualizar o componente cujo id é igual a “item”, entretanto não encontrei nenhum elemento portando este id no seu código.

Se você alterar seu p:dataTable cri um id e referencie ele no update do commandButton como abaixo

<p:commandButton onclick="pedido.show();" value="Clique" update="id_do_componente"  actionListener="#{pedidoItem.listarItemPedido}"/>    
<p:dataTable id="id_do_componente" var="item" value="#{pedidoItem.aritem}"   
                    paginator="true" rows="20"      
                    paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">

mas quando vou carregar os dados da linha selecionada no meu DAO, como referencio o ID requerido?

Pq vc quer exibir os dados do cliente selecionado em um DataTable?
Pra fzr isso vc teria que ter um método que preencha um o ArrayList do seu dataTable com os dados da linha selecionado.

não são dados do cliente, são dados de uma venda.

ao clicar nem determinada venda, será aberta uma dialog com os itens que foram vendidos nesta venda

Então é simples, vc n precisa preencher a tabela, apenas passe o Objeto que vc quer ver para o Dialog, se vc for exibir em um dataTable vc tera que preencher um ArrayList se for exibir em um PanelGrid é só passar o Objeto em si.

eu preencho a tabela, ele vem com os dados, ao clicar na row requerida, eu preciso passar o ID dessa venda para uma nova consulta,pois os itens do pedido estao em outra tabela.
como pegar o ID?

deve ser simples, mas estou começando agora, e nao estou conseguindo =/

Isso é simples, vc não vai passar somente o ID, vai passar o Objeto inteiro, veja:

<p:column headerText="Funções" style="width:50px;">  
       <p:commandButton oncomplete="funcaoDialog.show()" update="altFuncao" image="ui-icon-pencil">  
                <f:setPropertyActionListener target="#{funcaoBean.funcaoSelecionada}" value="#{funcoes}"/>  
       </p:commandButton>  
</p:column> 

Repare nisso aqui funcaoBean.funcaoSelecionada, esse é o objeto que eu selecionei, então irei passar ele para o set do meu Bean

public Funcao getFuncaoSelecionada() {
	return funcaoSelecionada;
}	
/****************/
public void setFuncaoSelecionada(Funcao funcaoSelecionada) {
	this.funcaoSelecionada = funcaoSelecionada;
        //AQUI VC COLOCA O MÉTODO PARA FAZER A BUSCA
}

Como vc tera que fazer outra busca, no set vc chamara o método passando o Objeto que vc selecionou …

Olá, o metodo para vc conseguir pegar o objeto selecionado na row é este

protected final Object getObjetoRequest(String key) {
		ExternalContext ct = FacesContext.getCurrentInstance()
				.getExternalContext();
		return ct.getRequestMap().get(key);
}



Olá, o metodo para pesquisar deve ser mais ou menos assim, no teu datatable vc tem q chamar esse metodo pesquisar, é ele que vai
pegar o objeto selecionado na row.

public void pesquisar() {
		Vendas item = (Vendas) getObjetoRequest("item");
		// com o item preenchido vc pode preencher seu ArrayList de itens da Venda fazendo um metodo pesquisar e passando o id do item
}

Pessoal, segue meu managedbean bagunçado por causa da experiencias q to fazendo =X

[code]@ManagedBean(name=“pedidoItem”)
@SessionScoped
public class ConsultaPedidoItem {
private List arped = new ArrayList();
private List aritem = new ArrayList();
private Connection c ;
private int id;
private Pedido selectedPedido;
private static final String SELECT = "SELECT PDD_ID "
+ "AS PDD_ID,PDD.PDD_DTPDD AS PDD_DTPDD,PDD.PDD_TMN "
+ "AS PDD_TMN,PDD.PDD_TRN AS PDD_TRN,PDD.PDD_PES AS "
+ “PDD_PES,PES.PES_NOME AS PDD_CLI,IIF(VDD.PES_NOME = ‘CONSUMIDOR’,”
+ “‘VENDEDOR LOJA’, VDD.PES_NOME) AS PDD_VENDEDOR,PDD.PDD_VLLIQ AS "
+ “PDD_VLLIQ,PDD.PDD_STA AS PDD_STA,PDD.PDD_EMP AS PDD_EMP,PDD.PDD_ORC”
+ " AS PDD_ORC,PDD_DTETG AS PDD_DTETG,PDD_DTMT AS PDD_DTMT,PDD.PDD_OBS”
+ " AS PDD_OBS,PDD_VDD AS PDD_VDD,PDD_USR AS PDD_USR,PDD_EDRETG AS "
+ “PDD_EDRETG FROM PDD INNER JOIN PES ON (PDD.PDD_PES = PES.PES_ID)”
+ “INNER JOIN PES VDD ON (PDD.PDD_VDD = VDD.PES_ID)”;

private static final String SELECT1 ="SELECT ITE_PDT AS ITE_PDT,PDT_CODBAR "
        + "AS PDT_CODBAR,PDT_NOME AS PDT_NOME,ITE_QTD AS ITE_QTD,ITE_VLUNI AS"
        + " ITE_VLUNI,ITE_VLADC AS ITE_VLADC,ITE_VLDSC AS ITE_VLDSC,ITE_VLTT AS "
        + "ITE_VLTT,ITE_ETG AS ITE_ETG,ITE_EMT AS ITE_EMT,ITE_PDD AS ITE_PDD,PCM_GRT "
        + "AS PCM_GRT,ITE_DPO AS ITE_DPO FROM PDDITE ITE INNER JOIN PDD ON "
        + "(PDD.PDD_ID = ITE.ITE_PDD)INNER JOIN PDT ON (ITE.ITE_PDT = PDT.PDT_ID)"
        + "LEFT OUTER JOIN PDTCOM ON (PDT.PDT_ID = PDTCOM.PCM_PDT) "
        + "WHERE ITE.ITE_PDD = ?"
        + "AND PDTCOM.PCM_EMP = PDD.PDD_EMP AND ITE.ITE_STA <> 5";

 public ConsultaPedidoItem() throws SQLException {
    
    c = FBConnection.connect();
    listarPedidoItem();
    
    
}
 
 private void listarPedidoItem() throws SQLException {

       PreparedStatement ps = c.prepareStatement(SELECT);
        ResultSet rs = ps.executeQuery();
        
        while(rs.next()){
         Pedido ped = new Pedido();
         ped.setPDD_ID(rs.getInt("PDD_ID"));
         ped.setPDD_DTPDD(rs.getDate("PDD_DTPDD"));
         ped.setPDD_TMN(rs.getString("PDD_TMN"));
         ped.setPDD_TRN(rs.getInt("PDD_TRN"));
         ped.setPDD_CLI(rs.getString("PDD_CLI"));
         ped.setPDD_VENDEDOR(rs.getString("PDD_VENDEDOR"));
         ped.setPDD_VLLIQ(rs.getDouble("PDD_VLLIQ"));
         
         arped.add(ped);
       }
}
 

public void listarItemPedido(Pedido item) throws SQLException {
    PreparedStatement prs = c.prepareStatement(SELECT1);
    prs.setInt(1, item.getPDD_ID());
    ResultSet res = prs.executeQuery();
    aritem.clear();
    while (res.next()) {
        Pedido it = new Pedido();
        it.setITE_PDT(res.getInt("ITE_PDT"));
        it.setPDT_CODBAR(res.getString("PDT_CODBAR"));
        it.setPDT_NOME(res.getString("PDT_NOME"));
        it.setITE_QTD(res.getInt("ITE_QTD"));
        it.setITE_VLUNI(res.getDouble("ITE_VLUNI"));
        it.setITE_VLDSC(res.getDouble("ITE_VLDSC"));
        it.setITE_VLTT(res.getDouble("ITE_VLTT"));

        aritem.add(it);
    }
} 

protected final Object getObjetoRequest(String key) {
    ExternalContext ct = FacesContext.getCurrentInstance().getExternalContext();
    return ct.getRequestMap().get(key);
}

public void pesquisar() throws SQLException {
    Pedido item = (Pedido) getObjetoRequest("c");
    listarItemPedido(item);
    
}
 
public Pedido getSelectedPedido() {
    return selectedPedido;
}

public void setSelectedPedido(Pedido selectedPedido) throws SQLException {
    this.selectedPedido = selectedPedido;
    listarItemPedido(selectedPedido);
}
 
public List<Pedido> getArped() {
    return arped;
}

public void setArped(List<Pedido> arped) {
    this.arped = arped;
}

public List<Pedido> getAritem() {
    return aritem;
}

public void setAritem(List<Pedido> aritem) {
    this.aritem = aritem;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

}[/code]

e esse é meu xhtml

[code] <h:form id=“form”>
<p:dataTable var=“c” value="#{pedidoItem.arped}"
paginator=“true” rows=“20”
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate=“20,30,50,60,80,100” update=“id_do_componente” selectionMode=“single”>

         <f:facet name="header">  
             CONSULTA DE PEDIDOS
         </f:facet>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="ID" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_ID}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="DATA" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_DTPDD}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="TERMINAL" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_TMN}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="TURNO" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_TRN}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="CLIENTE" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_CLI}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="VENDEDOR" />  
             </f:facet>  
             <h:outputText value="#{c.PDD_VENDEDOR}" />  
         </p:column>  

         <p:column>  
             <f:facet name="header">  
                 <h:outputText value="V.Liq." />  
             </f:facet>  
             <h:outputText value="#{c.PDD_VLLIQ}"  />  
         </p:column>  
         
          <f:facet name="footer">  
              <p:commandButton oncomplete="pedido.show();" value="Clique"   update="id_do_componente" action="#{pedidoItem.pesquisar}">
               
             </p:commandButton>
          </f:facet> 
         
     </p:dataTable>  
        
        
      
     
     <p:dialog header="Itens do pedido" widgetVar="pedido" resizable="false" 
               showEffect="explode" hideEffect="explode" id="tabela" width="700" height="200"> 
         <h:form id="dialog" prependId="true">
             
             <p:dataTable id="id_do_componente" var="item" value="#{pedidoItem.selectedPedido}" 
                  paginator="true"    
                  paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"> 
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="ID ITEM" />  
                 </f:facet>  
                 <h:outputText value="#{pedidoItem.selectedPedido.ITE_PDT}" />  
             </p:column >
             
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="COD. BAR" />  
                 </f:facet>  
                 <h:outputText value="#{pedidoItem.selectedPedido.PDT_CODBAR}" />  
             </p:column >
             
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="NOME" />  
                 </f:facet>  
                 <h:outputText value="#{pedidoItem.selectedPedido.PDT_NOME}" />  
             </p:column >
             
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="QTD" />  
                 </f:facet>  
                 <h:outputText value="#{pedidoItem.selectedPedido.ITE_QTD}" />  
             </p:column >
             
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="VL. UNI" />  
                 </f:facet>  
                 <h:outputText value="#{pedidoItem.selectedPedido.ITE_VLUNI}" />  
             </p:column >
             
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="VL. DESC" />  
                 </f:facet>  
                 <h:outputText value="#{pedidoItem.selectedPedido.ITE_VLDSC}" />  
             </p:column >
             
             <p:column>  
                 <f:facet name="header">  
                     <h:outputText value="VL. TOTAL" />  
                 </f:facet>  
                 <h:outputText value="#{pedidoItem.selectedPedido.ITE_VLTT}" />  
             </p:column >
             
         </p:dataTable>
         </h:form>
     </p:dialog> 

     
 </h:form> 

[/code]

Uma sugestão…

Você poderia utilizar DAO´s para acessar seus modelos no banco de dados…

ah, isso eu vejo depois, eu postei assim pra entenderem como estou fazendo o select tbm…
enfim…

tinha um <f:setPropertyActionListener ali em cima, mas tirei pq nao funcionou!

Valew pela ajuda pessoal,

o nosso amigo ai de cima me deu uma solução que nao havia visto ainda, pois achava que apenas com o select “single” ele iria selecionar,
mas por fim decidi usar um icone em cada linha como commandbuttton para acionar o método de busca!

att
Aline :wink: