Bom dia galera estou com problema que não estou conseguindo resolver.
É o seguinte Tenho minha jsf com uma datatable que preenche os dados tudo certinho.
minha jsf
<rich:dataTable
value="#{provaController.todasProvasAtivas}"
onRowMouseOver="this.style.backgroundColor='#BEBEBE'"
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
var="provas" rows="10" rowKeyVar="row"
ajaxKeys="#{dataTableScrollerBean.keys}" id="tbLista"
onRowContextMenu="if (row) row.style.backgroundColor='#{a4jSkin.tableBackgroundColor}';
this.style.backgroundColor='#F1F1F1'; row=this;
#{rich:component('menu')}.show(event,{provasId:'#{provaController.prova.idaval}', currentRow:'#{row}'});
return false;">
<f:facet name="header">
<h:outputText value="Listas de Provas " />
</f:facet>
<rich:column>
<f:facet name="header">
<h:outputText value="Nome do Produto" />
</f:facet>
<h:outputText value="#{provas.produto}" id="produto" styleClass="campo"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="N° da Prova" />
</f:facet>
<h:outputText value="#{provas.numprova}" id="numprova" styleClass="campo"/>
</rich:column>
<rich:column width="200px">
<f:facet name="header">
<h:outputText value="Fabricante" />
</f:facet>
<h:outputText value="#{provas.fabricante.fabricante}" id="fabricante" styleClass="campo"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Ano/Plano" />
</f:facet>
<h:outputText value="#{provas.ano}" id="anoo" styleClass="campo"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Tipo de Avaliação" />
</f:facet>
<h:outputText value="#{ provas.tipoaval == 'MEM' ? (provas.avaliacao == 'true' ? 'MEM - Aval':'MEM - Aprec')
: (provas.avaliacao == 'true' ? 'PCE - Aval':'PCE - Col Téc') }" id="tipoAval" styleClass="campo" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Classe" />
</f:facet>
<h:outputText value="#{provas.classe.classe}" id="classe" styleClass="campo"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Categoria" />
</f:facet>
<h:outputText value="#{provas.classe.categoria.categoria}" id="categoria" styleClass="campo"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Data Limite p/ Entrega Material" />
</f:facet>
<h:outputText value="#{provas.dtlimitematerial}" id="dtLimite" styleClass="campo">
<f:convertDateTime pattern="dd/MM/yyyy"/>
</h:outputText>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Dias" />
</f:facet>
<h:outputText value="#{provaController.strNumDias}" id="dias" styleClass="campo"/> // Aqui nessa coluna quero mostrar a quantidade de dia a vencer ou vencidos.
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Ações" />
</f:facet>
<a4j:commandLink ajaxSingle="true" id="looklink" >
<h:graphicImage value="imagens/olhoVerde.jpeg" style="border:0" width="20px"/>
<f:setPropertyActionListener value="#{provas}"
target="#{dataTableScrollerBean.currentItem}" />
<f:setPropertyActionListener value="#{row}"
target="#{dataTableScrollerBean.currentRow}" />
</a4j:commandLink>
<rich:toolTip for="looklink" value="Ver/Editar dados da Prova" />
<rich:spacer width="3"/>
<a4j:commandLink ajaxSingle="true" id="respProvalink"
oncomplete="#{rich:component('respProvaPanel')}.show();" reRender="tbLista, tabProvas, produtoSelect">
<h:graphicImage value="imagens/escolherUser.jpeg" style="border:0" width="20px"/>
<f:setPropertyActionListener value="#{provas}"
target="#{dataTableScrollerBean.currentItem}" />
<f:setPropertyActionListener value="#{row}"
target="#{dataTableScrollerBean.currentRow}" />
</a4j:commandLink>
<rich:toolTip for="respProvalink" value="Mostrar Responsáveis Pela Prova" />
</rich:column>
<f:facet name="footer">
<rich:datascroller id="datascroller" />
</f:facet>
</rich:dataTable>
Minha função que preenche essa datatable - Aqui me retorna o model para preencher a tabela.
public DataModel getTodasProvasAtivas() {
System.out.println("getTodasProvasAtivas()");
List<Prova> listaProvasAtivas = idao.todasProvasAtivas();
model = new ListDataModel(listaProvasAtivas);
Date dataAtual = new Date();
for (Prova p : listaProvasAtivas) {
verificaSituacaoDataLimiteEntrega(dataAtual, p.getDtlimitematerial());
}
return model;
}
Minha função que verifica se a data está vencida
public String verificaSituacaoDataLimiteEntrega(Date dataAtual, Date dataLimite) {
System.out.println("verificaSituacaoDataLimiteEntrega(Date dataAtual, Date dataLimite)");
if (dataLimite.after(dataAtual)) {
System.out.println("Data: " + dateFormat.format(dataLimite) + " é posterior à " + dateFormat.format(dataAtual));
setStrNumDias("Faltam " + DataUtil.contarDias(dataLimite, dataAtual) + " dias para vencer");
return strNumDias;
} else if (dataLimite.before(dataAtual)) {
System.out.println("Data: " + dateFormat.format(dataLimite) + " é inferior à " + dateFormat.format(dataAtual));
setStrNumDias("Vencida a " + DataUtil.contarDias(dataLimite, dataAtual) + " dias");
return strNumDias;
} else if (dataLimite.equals(dataAtual)) {
System.out.println("Data: " + dateFormat.format(dataLimite) + " é posterior à " + dateFormat.format(dataAtual));
setStrNumDias("Vence Hoje");
return strNumDias;
}
return strNumDias;
}
Bom agora o pulo do gato
lá na minha JSF na coluna dias ele só mostra o ultimo dado depois do loop for. Eu acho que o erro ou bug é que quando está preenchendo a tabela ele está fazendo um outro loop e setando o ultimo valor (sobrescrevendo o dado anterior).
O que eu quero mostrar é
na prova ‘YYY’ (na coluna dias) -> "Faltam 9 dias para vencer"
na prova ‘AAA’ (na coluna dias) -> "Vence hoje"
na prova ‘XXX’ (na coluna dias) -> “Vencida a 15 dias”
E sempre é mostrado pra todos os dados somente o último dado dessa forma
na prova ‘XXX’ (na coluna dias) -> "Vencida a 15 dias"
na prova ‘YYY’ (na coluna dias) -> "Vencida a 15 dias"
na prova ‘AAA’ (na coluna dias) -> “Vencida a 15 dias”
Alguém poderia me ajudar???