DataTable no JSF

Boa Tarde Pessoal!

Eu estou com um problema, eu tenho um sistema gerador de boletos para pagamento, hoje quando solicitado um boleto por um cliente o sistema mostra todos os boletos de todos os projetos que o cliente está cadastrado e de todas as datas, sendo que a nova regra é que apareça somente os 12 ultimos meses e ao clicar na data ai sim apareçam todos os boletos com vencimento para aquela data.

Então eu tenho um jsp assim:

<%@ taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>
<%@ taglib uri=“http://java.sun.com/jsf/core” prefix=“f” %>
<%@ taglib uri=“http://www.icesoft.com/icefaces/component” prefix=“ice” %>
<%@ page language=“java” contentType=“text/html; charset=utf-8” pageEncoding=“utf-8”%>

/* Definio de estilos para toda a tabela*/

.linha{
font: 13px Arial, sans-serif;
}
.tabela {

 border: 1px solid green;

}

/* Definio de estilos para linha de cabealho da tabela*/

.cabecalho {

text-align: center;

font: 13px Arial, sans-serif;

font-weight: bold;

color: #EEEEEE;

background: #990033;

}

/* Definio de estilos para coluna */

.primeiro {

text-align: center;

font: 13px Arial, sans-serif;

background: #A2CD5A;

}
/* Definio de estilos para coluna */

.ultimo {

font: 13px Arial, sans-serif;

text-align: center;

background: #BCEE68;
}

JMM - Junta de Missoes Mundias
			</table>
			</div>
			<div align="center"><strong><ice:outputText 
				styleClass="estrotulo" value="JMM - Junta de Missões Mundias" /></strong> <br />
			<br />  
   <ice:form>
      <ice:dataTable border="1" id="tbCompetencia" var="item"
	       		     value="#{controleCompetencia.todos}" rows="10"
	       		     frame="box"
        			 headerClass ="cabecalho"
        			 rowClasses="linha">
        			 
        			<ice:column>
        			 	<ice:rowSelector selectionListener="#{controleCompetencia.selecionouLinha}" multiple="false" />
    	       		  	<f:facet name="header">
  						   <h:outputText  value="Mês de Competência "/> 
					  	</f:facet>
				  	    <ice:outputText value="#{item.competencia}"></ice:outputText>
				  	    <f:param name="item" value="item.competencia.competencia"></f:param>
					</ice:column>
   	</ice:dataTable>
    	       
    	       <ice:panelGrid columns="2" styleClass="scrollerTable2" columnClasses="standardTable_ColumnCentered" >
    	       	 <ice:dataPaginator id="scroll_1"
                     for="tbCompetencia"
                     fastStep="10"
                     pageCountVar="pageCount"
                     pageIndexVar="pageIndex"
                     paginator="true"
                     paginatorMaxPages="9"
                     >
			 
            <f:facet name="first" >
                     <ice:graphicImage url="css/xp/css-images/primeiro.png" style="border:none;"/> 
            </f:facet>

			 
            <f:facet name="last">
                   <ice:graphicImage url="css/xp/css-images/ultimo.png" style="border:none;" />
            </f:facet>

    </ice:dataPaginator>

    <ice:dataPaginator id="scroll_2"
                    for="tbCompetencia"
                    rowsCountVar="rowsCount"
                    displayedRowsCountVar="displayedRowsCountVar"
                    firstRowIndexVar="firstRowIndex"
                    lastRowIndexVar="lastRowIndex"
                    pageCountVar="pageCount"
                    pageIndexVar="pageIndex"
                    >

    </ice:dataPaginator>
    <!--<ice:commandButton value="Retornar" action="cancelar" immediate="true"></ice:commandButton>-->
    <table align="center">
    	<tr>
    		<td><ice:commandButton id="btn" value="Retornar" action="cancelar" immediate="true"/></td>
    	</tr>
    </table>
    </ice:panelGrid>

  </ice:form>
</div>
</f:view></td>
</tr>
Texto rodapé

E um Controller assim:

package br.com.boleto.controle.usuario;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.lang.model.util.ElementFilter;
import javax.servlet.http.HttpSession;

import com.icesoft.faces.component.ext.RowSelectorEvent;

import br.com.webdec.entidade.Competencia;
import br.com.webdec.util.ConnectionFactory;

public class ControleCompetencia {

//private ControleCompetencia controleCompetencia;

private FacesContext context = (FacesContext) FacesContext.getCurrentInstance();  
private HttpSession session = (HttpSession) context.getExternalContext().getSession(false); 

private Competencia competenciaSelecionada;

Connection conn;
PreparedStatement stmt = null;
ResultSet rs = null;
DataModel model;
Competencia competencia;

String chave = (String) session.getAttribute("chave_user");

List<Competencia> lista;

public ControleCompetencia() {
	competencia = new Competencia();
	competencia.setChave((String) session.getAttribute("seq_adotante"));
}

public DataModel getTodos() throws Exception { //throws Exception
  model = new ListDataModel(todosCompetencia());
  return model;
}

@SuppressWarnings("unchecked")
public List todosCompetencia() throws Exception {
	try{
		 this.conn = ConnectionFactory.getConnection();
		 String SQLCompetencia = "select distinct competencia from vw_web_boleto where seq_adotante = ? order by competencia"; 
	         stmt = conn.prepareStatement(SQLCompetencia);
	         stmt.setString(1,competencia.getChave()); 
     	         rs = stmt.executeQuery();
		 List<Competencia> list = new ArrayList<Competencia>();
		 if(!rs.next()){
			 System.out.println("Nao ha Registros ");
		 }else{
			 while(rs.next()){
				   String competencia = rs.getString(1);
				   list.add(new Competencia(competencia));
				   }
			 lista = list;
			 }
			 return list;
	}catch(SQLException ex){
			throw new Exception(ex);
	}finally{
			ConnectionFactory.closeConnection(conn, stmt, rs);
	}
}

public void selecionouLinha(RowSelectorEvent linha) {        /* Pega e imprime o numero da linha selecionada */
	
	int selectedRow = linha.getRow();
	System.out.println(selectedRow + "  " + "Selecionada");
	System.out.println(lista);
} 

public Competencia getCompetenciaSelecionada() {
	return competenciaSelecionada;
}

public void setCompetenciaSelecionada(Competencia competenciaSelecionada) {
	this.competenciaSelecionada = competenciaSelecionada;
}

public List<Competencia> getLista() {
	return lista;
}

public void setLista(List<Competencia> lista) {
	this.lista = lista;
}

}

Com isso eu consigo pegar o numero da linha selecionada mas não a data “mes/ano”, tipo assim:

Na primeira linha tenho o valor 03/2011
Na segunda linha tenho o valor 05/2011

E assim vai.

Como eu poderia pegar a data impressa em cada campo ao inves de somente a o numero da linha?

Boa tarde Anderson,

Em primeiro lugar, é interessante utilizar a tag code para ficar mais fácil a visualização do seu código.

Você pode incluir uma propriedade binding para o seu componente dataTable
e dentro do seu RowSelectorEvent recuperar a linha selecionada.

<ice:dataTable border="1" 
   id="tbCompetencia" 
   var="item" 
   value="#{controleCompetencia.todos}" 
   rows="10" 
   frame="box" 
   headerClass ="cabecalho" 
   rowClasses="linha"
   binding="#{controleCompetencia.competenciasDataTable}">

private javax.faces.component.html.HtmlDataTable competenciasDataTable;
// get e set

public void selecionouLinha(RowSelectorEvent linha) { 
Competencia competencia = (Competencia) competenciasDataTable.getRowData();
// Aqui você já tem o seu objeto selecionado e pode recuperar a propriedade desejada
} 

Essa é uma das soluções, você também pode utilizar o número da linha selecionada como índice da lista retornada.

Abraços

É Mauro, não funcionou desta forma.

Como seria a outra forma?

fala anderson

Cara eu não entendi muito bem, vc quer que a tabela mostra os 12 meses ai quando vc clica ele mostra os outros meses eh isso?

Cara para pegar a linha que o cara clicou eu faço assim:

<p:column style="width:80px; text-align:center;">
	    		<f:facet name="header">
	    			Marcar  
	    		</f:facet>
	    		<p:commandLink update="formDados">
	    		<p:graphicImage value="/resources/imagens/search.png" />
	    		
	    			<f:setPropertyActionListener target="#{SeuBean.variavel}" value="#{variavel}"/>
	    		</p:commandLink>
	    	</p:column>

Ai quando a pessoa clicar nessa linha, sera colocado os valores da linha clicada na sua variavel do Bean intendeu?
Ai depois disso vc faz uma busca no BD pra pegar os outros meses…

Eh bem facil com o f:setPropertyActionListener, se for isso eu acho q resolve seu problema…

Flww

Não é bem assim, eu tenho uma lista de datas, ao cliente clicar em uma das datas eu tenho que pegar o valor da data e enviala para outra bean como parametro para gerar uma outra lista em outra jsf.

tipo assim:

03/2011
04/2011

ao clicar em 03/2011 o outro controller recebe eta data para gerar um alista de valores devidos naquela data.

03/2011 - R$12,00

Anderson,

Não funcionou? O que houve? deu erro? o objeto retornou nulo?

O objeto está retornando nulo ai quando eu mando este comando abaixo:

	int selectedRowIndex = linha.getRow();
	
	System.out.println("*****************************************************");
	System.out.println(linha.getSelectedRows());
	System.out.println("*****************************************************");

Eu imprimo o número da linha, exemplo [9], mas o valor, a data que ela representa eu não consigo resgatar.

A linha 9 representa o valor 12/2010 da tabela selecionada.

Ola pessoal, eu consegui resolver o problema dos valores, mas agora estou com um outro problema.

Meu jsp usa uma classe para preencher o datatable e outra classe para pegar o valor selecionado, mas com isso não está me trazendo a tabela preenchida ele continua na tabela de seleção de data conforme abaixo:

Mês
03/2011
04/2011
06/2011

com isso eu selecionando o valor 04/2011 ele me traria a seguinte tela:

Faturas
sequencia tipo fatura valor vencimento Finalizar
02 financeira R$ 20,00 10/04/2011 Imprimir

Mas o que vem na realidade é novamente a tela anterior

Mês
03/2011
04/2011
06/2011

Debugando eu vi que ele não finaliza no return list deste metodo e sim em outro return de onde pega o valor de RowSelectorEvent

Como eu posso resolver este problema?

package br.com.financeiro.controle.usuario;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.http.HttpSession;

import com.icesoft.faces.component.ext.RowSelectorEvent;


import br.com.webdec.entidade.BoletoEmAberto;
import br.com.webdec.entidade.Competencia;
import br.com.webdec.util.ConnectionFactory;

public class ControleBoletoEmAberto {
	
	private BoletoEmAberto boletoAberto;
	
	private  FacesContext context = (FacesContext) FacesContext.getCurrentInstance();
	private HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
	
	List<Competencia> lista;
	List<Competencia> lista_comp;
	String listar;
	String valorLinha;
	String chave = (String) session.getAttribute("chave_user");
	
	ControleCompetencia controleCompetencia = new ControleCompetencia();
	
	public BoletoEmAberto getBoletoAberto() {
		return boletoAberto;
	}

	public void setBoletoAberto(BoletoEmAberto boletoAberto) {
		this.boletoAberto = boletoAberto;
	}

	Connection conn;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	DataModel model;
	BoletoEmAberto boleto;
	Competencia competencias;
	String competencia;
	
	public ControleBoletoEmAberto() throws Exception{
		boleto = new BoletoEmAberto();
		boleto.setChave((String) session.getAttribute("seq_adotante"));
		//boleto.setChave("PF29466");
	}

	public DataModel getTodos() throws Exception //throws Exception
	{
		model = new ListDataModel(todosBoletoEmAberto(competencia));
		return model;
	}
	
	@SuppressWarnings("unchecked")
    public List Competencia() throws Exception {
		try{
			 this.conn = ConnectionFactory.getConnection();
			 String SQLCompetencia = "select distinct competencia from vw_web_boleto where seq_adotante = ? order by competencia"; 
		     stmt = conn.prepareStatement(SQLCompetencia);
		     stmt.setString(1,boleto.getChave()); 
	     	 rs = stmt.executeQuery();
			 List<Competencia> list = new ArrayList<Competencia>();
			 lista_comp = new ArrayList<Competencia>();
			 
			 if(!rs.next()){
				 System.out.println("Nao ha Registros ");
			 }else{
				 while(rs.next()){
					   String competencia = rs.getString(1);
					   list.add(new Competencia(competencia));
					   lista_comp.add(new Competencia(competencia));
					   }
				 }
				 return list;

		}catch(SQLException ex){
				throw new Exception(ex);
		}finally{
				ConnectionFactory.closeConnection(conn, stmt, rs);
		}
	}
	
	public List<Competencia> selecionouLinha(RowSelectorEvent linha) throws Exception {   // pego o numero da linha selecionada
		
		Competencia();
		
		int selectedRowIndex = linha.getRow();
		
		linha.getSelectedRows().toArray();
		
		int selectedRow = linha.getRow();
		
		int linhaselec = linha.getRow(); 
		System.out.println(selectedRowIndex);
				
		valorLinha = lista_comp.get(selectedRow).getCompetencia();  // aqui eu comparo o numero da linha com a lista
		System.out.println(valorLinha);
		
		todosBoletoEmAberto(valorLinha);
		
//		ControleCompetencia cc = new ControleCompetencia();  // aqui eu chamo a outra classe e passo o numero da linha
//		cc.selecionarLinha(linha);
		
//		valorLinha = lista_comp.get(selectedRow).getCompetencia();
		return lista;
		
	} 
	
	@SuppressWarnings("unchecked")
    public List todosBoletoEmAberto(String valorLinha) throws Exception{
		try{
			 this.conn = ConnectionFactory.getConnection();
			 
			 competencia = valorLinha;
			 
			 System.out.println(competencia);
			 
			 String SQLboleto = "select chave, valor,to_char(data_processamento,'dd/mm/yyyy') as data_processamento, "+
				 				"to_char(data_vencimento,'dd/mm/yyyy') as data_vencimento1,"+
				 				"nvl(plano,'00') as plano, destino, id_boleto "+
	                            "from vw_web_boleto where seq_adotante=?"+
	                            "and competencia = ?"; 
			 
			 System.out.println(SQLboleto);
			 
		     stmt = conn.prepareStatement(SQLboleto);
		     stmt.setString(1,boleto.getChave()); 
		     stmt.setString(2,competencia);
			 rs = stmt.executeQuery();
			 System.out.println(SQLboleto);
			 List<BoletoEmAberto> list = new ArrayList<BoletoEmAberto>();
			 if(!rs.next()){
				 System.out.println("Nao ha Registros ");
			 }else{
			 while(rs.next()){
				   String valor = rs.getString(2);
		     	   String dtProcessamento = rs.getString(3);
				   String dtVencimento = rs.getString(4);
				   String plano = rs.getString(5);
				   String destino = rs.getString(6);
				   String idboleto = rs.getString(7);
				   
				   list.add(new BoletoEmAberto(valor,dtProcessamento,dtVencimento,plano,destino, idboleto));
				   }
			 }			
			 return list;
		}catch(SQLException ex){
				throw new Exception(ex);
		}finally{
				ConnectionFactory.closeConnection(conn, stmt, rs);
		}
	}	
	
	public BoletoEmAberto getBoletoImprimir() {
		BoletoEmAberto boleto = (BoletoEmAberto) model.getRowData();
		session.setAttribute("venc_boleto",boleto.getDt_vencimento());
		session.setAttribute("id_boleto", boleto.getId_boleto());
		return boleto;
	}
	
	public String imprimir() {
		setBoletoAberto(getBoletoImprimir());
		return "sucesso";
	}

	public List<Competencia> getLista() {
		return lista;
	}

	public void setLista(List<Competencia> lista) {
		this.lista = lista;
	}
	
} // fim