Selecionar item no data table

27 respostas
B

Pessoal,to com um problema bem chato,tenho uma pagina q lista orcamentos,qnd seleciono um deles é aberto um dialog com os produtos do orcamento,quero q qnd eu selecione algum produto, um system.out me mostre o codigo do produto que foi selecionado, ja tentei várias formas mas n tive sucesso, se alguem puder ajudar agradeço muito,abaixo o código:

Bean

public void selecionar_produto(Integer codigo){
System.out.println("a");
OrcamentosDAO orcamentosdao=new OrcamentosDAO();
orcamentosdao.selecionar_produto(codigo);
System.out.println(""+produto_selecionado.getCodigo_produto());
}

public Orcamentos getSelecionar_produto(){
System.out.println("b");
return produto_selecionado;
}

public void setSelecionar_produto(Orcamentos produto_selecionado){
System.out.println("a");
this.produto_selecionado=produto_selecionado;
}

DAO

public Orcamentos selecionar_produto(Integer cod_produto){
Conexao conexao=new Conexao();
Orcamentos orcamentos=new Orcamentos();
try{
Statement St=(Statement)conexao.getConn().createStatement();
ResultSet Rs=St.executeQuery("select * from itens_orcamento where produto="+cod_produto);
Rs.next();
orcamentos.setCodigo_item(Rs.getInt("codigo"));
orcamentos.setCodigo_orcamento(Rs.getInt("orcamento"));
orcamentos.setCodigo_produto(Rs.getInt("produto"));
orcamentos.setValor_unit(Rs.getDouble("valor_unit"));
orcamentos.setUnit(Rs.getInt("unit"));
orcamentos.setValor_total_item(Rs.getDouble("valor_total"));
}
catch(Exception Erro){
Erro.printStackTrace();
}
return orcamentos;
}

XHTML

<h:form id="formprodutos_adicionados">
<p:dataTable scrollable="true" value="#{orcamentosBean.itens}" var="c"
height="200" selection="#{orcamentosBean.orcamento}" emptyMessage="Nenhum produto adicionado!" selectionMode="single" >

...

<p:commandButton value="x" actionListener="#{orcamentosBean.selecionar_produto}"/>

Ps:To usando primefaces

27 Respostas

M

tenta colocar o metodo na opcao selection.

A

Considerando que esse commandButton é em uma coluna da tabela, tenta:

<p:commandButton process="@this" value="x" action="#{orcamentosBean.selecionar_produto(c.codigo_item)}"/>
B

Coloquei assim mas mesmo assim não deu certo ;(

<p:commandButton value="x" process="@this" actionListener="#{orcamentosBean.selecionar_produto(c.codigo_produto)}"/>

Percebi que seu eu digito C que é a variavel da minha data table e aperto ctrl+espaco eke não exibi os campos,é normal?

A

No lugar de actionListener, coloca o action.
A questão de autocompetar, depende do sua IDE, o netbeans quando é caso de listas assim percebi que nem sempre ele autocompleta.

B

Mesma coisa :’(

T

mas em qual situação não funciona? tipo, não importa quantas vezes clique, ele não funciona? detalhe melhor qual a situação em que isso ocorre e fica mais facil indentificar o problema.

tente também identar o código (Ctrl+Shift+I no NetBeans) :slight_smile:

A

Veja se o código está indo corretamente. E acho que está faltando carregar esse objeto do seu System.out.println.
Talvez esteja faltando o

produto_selecionado = orcamentosdao.selecionar_produto(codigo);

public void selecionar_produto(Integer codigo){  
    System.out.println("código: "+codigo);  
    OrcamentosDAO orcamentosdao=new OrcamentosDAO();  
    produto_selecionado = orcamentosdao.selecionar_produto(codigo);  
    System.out.println(""+produto_selecionado.getCodigo_produto());  
}
B

Por enquanto só ta chamando o metodo que seleciona quando eu clico no botão,mas o valor vem null ou então fica gerando várias exceções.

T

Defina qual escopo você está trabalhando esta bean (Session, View, Request ou Application).

PS: no método “selecionar_produto” tente, não precisa receber parametro de inteiro, pois ao selecionar na datatable, a sua instancia de orcamento já receberá o objeto da linha selecionada em tela, então como parâmetro de busca você só precisa passar “orcamento.codigo”, ou algo do tipo. Tente instanciar este objeto de OrcamentoDao somente uma vez (no construtor da classe seria uma boa), pois assim uma hora, dependendo do uso da sua aplicação você poderá carregar a memória demais e derrubar o seu servidor de aplicação.

este botão fica dentro da table ou fora dela? Se este botão ficar na coluna da tabela, tenho uma solução bem mais simples do que a selection da Datatable :smiley:

T

Não se esqueça que todas as variáveis que são usadas na View (listas, etc) devem ser instanciadas na classe (seja um “” para Strings, novas instancias para objetos e listas de objetos, etc).

B

O botão fica dentro da coluna da tabela, qual a forma mais simples?

T

Bianca_Java:
Coloquei assim mas mesmo assim não deu certo ;(

<p:commandButton value="x" process="@this" actionListener="#{orcamentosBean.selecionar_produto(c.codigo_produto)}"/>

Percebi que seu eu digito C que é a variavel da minha data table e aperto ctrl+espaco eke não exibi os campos,é normal?

tente não passar parametros em chamadas de métodos feitos na View.

se o botão está fora da tabela, e ao selecionar uma linha o objeto na bean recebe a seleção, voce já tem o parametro que quer lá, é só trabalhar com ele (no método de busca, pegar o atributo deste objeto, no caso o código).

detalhe: se o escopo da bean for request, a cada ação você perderá informação pois no request o construtor da bean é rodado à cada requisição (ajax ou não)

T

não sei atende ao escopo que voce deseja:

faça o botão mais ou menos assim

<p:commandButton value="Default Button" action="#{orcamentosBean.selecionar_produto}">
                                                <f:setPropertyActionListener value="#{c}"
                                                                             target="#{orcamentosBean.orcamento}" /> <!-- esta tag pega a var (que é uma objeto da sua lista) e instancia sua variavel na bean  e o método selecionar_produto poderá trabalhar com esta instancia de objeto (linha selecionada) -->
                                            </p:commandButton>
B

Também não deu certo :frowning: Onde eu to errando?

T

quando voce adicionei o f:setPropertyActionListener no seu botão, voce tirou o selection e selectionmode da datatable? esqueci de mencionar isto.

B

Não funcionou, mais alguma dica?

T

seguinte, qual o escopo que você definiu para a sua Bean? (como eu já havia perguntado antes).

Preciso que poste a sua Bean, e o XHTML novamente para que possa analizar e entender exatamente como está estruturado, ai fica mais facil.

se prefirir, pode mandar um email, acho que fica mais facil para mim responder, pois estou meio ocupado.

C
<h:form id="formprodutos_adicionados">
<p:dataTable scrollable="true" value="#{orcamentosBean.itens}" var="c"
height="200" selection="#{orcamentosBean.orcamento}" emptyMessage="Nenhum produto adicionado!" selectionMode="single" >

<p:commandButton value="x" actionListener="#{orcamentosBean.selecionar_produto}"/>
[/quote] No seu Bean, não vi o objeto a que o selection se refere, lá tem um objeto chamado orcamento? Pq quando você faz selection="#{orcamentosBean.orcamento}" ao selecionar alguma linha, ele vai carregar esse objeto, e para pegar o valor dele orcamento.getID();

Outra coisa, o pode ficar fora do p:dataTable.

Começamos a usar PrimeFaces em algumas aplicações novas onde trabalho, e já me inturmei bastante com ele, é bem fácil e prático, sem contar que é muito bonito.

Espero que ajude...

B

Pelo que estou percebendo o metodo não ta pegando o id do produto quando clico, ele ta achamando o metodo mas não ta pegando o id do produto.Alguem tem um exemplo de um metodo para pegar o id do item da tabela ao clicar?

C

O que eu falei não resolveu?? Quando você selecionar alguma linha, o selection do p:datatable vai carregar um objeto, e ai você pega a propriedade que quiser do objeto.
Não é isso que você quer?

B

Exato, mas ainda não funcionou, ja fiz debug e tudo,mesmo assim ele não pega o valor.

C

Estranho, uso isso em um sistema onde trabalho e funciona numa boa, segue código:

<p:dataTable id="datatable" var="lista" widgetVar="datatable" value="#{meuController.listaGrid}" paginator="true" rows="10" selection="#{meuController.linhaGridSelecionada}" selectionMode="single" paginatorPosition="bottom" emptyMessage="Nenhum registro para a exibição.">
Onde o linhaGridSelecionada é um objeto do meu Controller:

private ERP_PESSOA webObjeto = new ERP_PESSOA();

E depois eu pego ele normal:

webObjeto.getID_PESSOA();
E

Usa qual versão do PrimeFaces ?
Só para confirmar, veja se na sua tabela o campo realmente é “codigo” já que é lido orcamentos.setCodigo_item(Rs.getInt(“codigo”));

B

J verifiquei, ta tudo certinho, eu ja usei esses metodos antes e funcionava 100% mas agora não to conseguindo.Alguem poderia postar algum exemplo de um sistema com master detail para eu ver como funciona, se tem que fazer algo diferente para poder fazer seleção e exclusão de registros.

T

Bianca, precisamos saber qual escopo está trabalhando esta bean, fica mais facil diagnosticar seu problema

B

SessionScoped

T

então, o problema é? você aperta o botão que estão na linha e ele não faz nada, ou dá erro?

Não se esqueça as seguintes coisas:

  • Ao colocar um botão na linha da tabela, vc não deve mais usar a opção selection do datatable, senão não conseguirá clicar no botão;
  • Em momento algum variaveis usadas como Values na sua view não podem estar apontando para NULL;
  • Use a tag que eu postei anteriormente dentro do botão, para quando você clicar nele, ele settar a var da linha (objeto que está na linha) como o objeto selecionado na sua view.

Se possivel poste a View e a Bean como estão exatamente neste momento aqui para analizarmos.

Criado 9 de setembro de 2011
Ultima resposta 13 de set. de 2011
Respostas 27
Participantes 6