[RESOLVIDO] p:datatable, cores nas linhas =D

6 respostas
otOtavio

Galera seguinte, estou montando uma pequena listagem de Contas a Receber no meu sistema utilizando datatable do prime e preciso diferenciar as linhas que estão com o titulo em atraso. Mas nao estou conseguindo realizar o tratamento..

Alguem pode me ajudar:

Olhem como estou fazendo:

TELA:

<p:dataTable value="#{contasReceberController.dmLreceber}" rowKey="#{obj.id}" selection="#{contasReceberController.contasReceber}" 
                                 id="tb_receber" 
                                 var="obj"
                                 selectionMode="single" 
                                 emptyMessage="Nenhum registro encontrado!" 
                                 paginatorPosition="bottom" 
                                 rowStyleClass="#{obj.dt_vencimento le usuarioLogadoController.dataDoDia(evt)? 'vermelho' : null }">

                     //coluns ...

                    </p:dataTable>

MB

public Date dataDoDia(ActionEvent evt) {
        Calendar c = Calendar.getInstance();
        c.setTime(dt_hora_momento);

        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);

        return c.getTime();
    }

não sei como fazer tal comparação entre as datas.

Gratoo!!!

6 Respostas

drsmachado

le ou lt?

rock

Bom dia,

por questões de desempenho principalmente, o melhor acho que é consultar e colocar todas as informações que vc precisa nos itens da lista antes de imprimir o dataTable.
Então a lista que seu método dmLreceber retorna deve ser montada definindo em obj se ele está em atraso.
Você precisará alterar o obj para ter uma atributo 'boolean atraso'

Poderia ser algo assim:
public List<Conta> dmLreceber() {
  if(lista == null) {
    lista = dao.getContas();
    verificaAtrasoLista();
  }
}

public void verificaAtrasoLista() {
  for(Conta conta : lista) {
     if(conta.getDt_vencimento().after(Calendar.getInstance().getTime())) {
       conta.setAtraso(true); 
       // ou, antes que o jakefrog (http://uaihebert.com/?p=4) reclame, poderia ser algo como 
       // conta.alteraParaAtraso();
     }
  }
}
e entao no seu dataTable:
<p:dataTable value="#{contasReceberController.dmLreceber}" var="conta" [...]
                                 rowStyleClass="atraso#{conta.atraso}">
css
.atrasotrue { background: red; }
.atrasofalse { background: green; }

Acho que poderia ser assim.

otOtavio

cara obrigado resolveu meu problema, fiz um pouco diferente olha. tirei vantagem desta ideia para pegar os dias em atraso para futuros relatorios

fiz assim

na page coloquei

rowStyleClass="#{obj.dias_atraso > 0? 'vermelho' : null }">

no mb: coloquei :

public DataModel getDmLreceber() {
        if ((lreceber.isEmpty() && (!dao.findAll().isEmpty()))) {
            listaContasReceberRecebidas(null);
        }
        calculaDiasAtraso();
        return new ListDataModel(lreceber);
    }


    public void calculaDiasAtraso(){
        Date dt_momento = Calendar.getInstance().getTime();
        for(ContasReceber cr : lreceber){
          if(cr.getDt_vencimento().before(dt_momento))
            cr.setDias_atraso(((Double)FuncoesData.diferencaEmDias(cr.getDt_vencimento(), dt_momento)).intValue());
        }
    }

e peguei uma classe em um post aqui no forum para pegar a diferenca entre a datas, so nao lembro o link

assim:

* Calcula a diferença de duas datas em dias
	 * <br>
	 * <b>Importante:</b> Quando realiza a diferença em dias entre duas datas, este método considera as horas restantes e as converte em fração de dias.
	 * @param dataInicial
	 * @param dataFinal
	 * @return quantidade de dias existentes entre a dataInicial e dataFinal.
	 */
	public static double diferencaEmDias(Date dataInicial, Date dataFinal){
		double result = 0;
		long diferenca = dataFinal.getTime() - dataInicial.getTime();
		double diferencaEmDias = (diferenca /1000) / 60 / 60 /24; //resultado é diferença entre as datas em dias
		long horasRestantes = (diferenca /1000) / 60 / 60 %24; //calcula as horas restantes
		result = diferencaEmDias + (horasRestantes /24d); //transforma as horas restantes em fração de dias
	
		return result;
	}

matou a pau =D, so estou com um problema agora em mostrar a data meu esta com um dia de atrazo.

Ja tentei N maneiras aqui e nao resolveu meu problema kkk

aqui olha no meu Datatable

<p:column headerText="Dt. Documento" style="width: 60px;">
                            <h:outputText value="#{obj.dt_documento}">
                                <f:convertDateTime pattern="dd/MM/yyyy" timeZone="UTC-3"/>
                            </h:outputText>
                        </p:column>

ja tentei GMT, ja tetei colocar uma função que devolve o getTimeZone defaut e nada.. ja implementei algumas alterações no meu web.xml e nada... estou sem ideias
=\

rock

Legal que deu certo :!:

otOtavio:
no mb: coloquei :
public DataModel getDmLreceber() {
        if ((lreceber.isEmpty() && (!dao.findAll().isEmpty()))) {
            listaContasReceberRecebidas(null);
        }
        calculaDiasAtraso();
        return new ListDataModel(lreceber);
    }


    public void calculaDiasAtraso(){
        Date dt_momento = Calendar.getInstance().getTime();
        for(ContasReceber cr : lreceber){
          if(cr.getDt_vencimento().before(dt_momento))
            cr.setDias_atraso(((Double)FuncoesData.diferencaEmDias(cr.getDt_vencimento(), dt_momento)).intValue());
        }
    }

A linha 3 ( listaContasReceberRecebidas(null); ) seta null na lista lreceber ? se sim, quando entrar ali depois vai dar NullPointerException no calculaDiasAtraso() na hora de fazer o for.

otOtavio:
matou a pau =D, so estou com um problema agora em mostrar a data meu esta com um dia de atrazo.

Ja tentei N maneiras aqui e nao resolveu meu problema kkk

aqui olha no meu Datatable

<p:column headerText="Dt. Documento" style="width: 60px;">
                            <h:outputText value="#{obj.dt_documento}">
                                <f:convertDateTime pattern="dd/MM/yyyy" timeZone="UTC-3"/>
                            </h:outputText>
                        </p:column>

ja tentei GMT, ja tetei colocar uma função que devolve o getTimeZone defaut e nada.. ja implementei algumas alterações no meu web.xml e nada... estou sem ideias
=\

quer dizer que você já tentou com isto no seu web.xml ?
<context-param>
        <param-name>LOCALE</param-name>
        <param-value>pt_BR</param-value>
</context-param>
tira esse timeZone ali e tenta no faces-config.xml:
<application>
		<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
		<locale-config>
			<default-locale>pt_BR</default-locale>
			<supported-locale>pt_BR</supported-locale>
		</locale-config>
	</application>
se não der também, tenta algo como:
<f:convertDateTime pattern="dd/MM/yyyy" locale="pt_BR" timeZone="America/Sao_Paulo" />
otOtavio

nenhuma das opções funcionaram =\\

a primeira nao mudou nada, a segunda gerou erro… meu projeto nao tem o faces-config, retornou nao achar

a “com.sun.facelets.FaceletViewHandler”

a terceira já havia tentado.

engraçado é que tenho 2 datas iguais. a primeira mostra certo a segunda nao olhe na imagem

otOtavio

kkkkkk lancei um monte de registros aqui para testar uma coisa totalmente diferente e descobri que estava chamando o campo errado kkk
no dt vencimento estava puchando dt_documento… arrumei aqui já

mtooo obrigado =D

Criado 19 de setembro de 2012
Ultima resposta 22 de set. de 2012
Respostas 6
Participantes 3