Gente, eu consigo passar valores para o meu datatable normalmente, não estou com problemas com isso, porém tem algo que estou tentando fazer que não funciona + neeeem a pau. Eu tenho uma data de prazo que eu estarei sempre comparando com o dia de hoje. Baseado nisso, eu terei na tabela, ao invés de ter a data, o nome do status comparado com a data de hoje.
Se prazo == 0 ; Status recebe nome de Vence Hoje
Se prazo > 0 ; Status recebe nome de Vincenda
Se prazo < 0 ; Status recebe nome de Vencido
até aí sem problema.
public String getNomeStatus(Date data){
Date d = new Date();
String nomeStatus = null;
if ((((((this.data.getTime() - d.getTime()) / 24) / 60) / 60) / 1000) == 0){
nomeStatus = "Vence Hoje";
}
if ((((((this.data.getTime() - d.getTime()) / 24) / 60) / 60) / 1000) < 0){
nomeStatus = "Vencida";
}
if ((((((this.data.getTime() - d.getTime()) / 24) / 60) / 60) / 1000) > 0){
nomeStatus = "Vincenda";
}
return nomeStatus;
}
o problema real é na hora de passar isso para o datatable. Eu estou tentando várias coisas, mas nenhuma funciona.
<p:column style="width:50px;">
<f:facet name="header">
<h:outputText value="Prazo"/>
</f:facet>
<h:outputText value="#{controle.nomeStatus(item.prazo)}"/>
</p:column>
quando tento passa o prazo para ser feita a comparação e retornar o nome não funciona, ele me da um erro e só aparece a primeira linha sem o nome do status que ele se enquadra.
o erro é este:
GRAVE: javax.el.ELException: /paginas/consultar.xhtml @99,83 value="#{controle.nomeStatus(item.prazo)}": Method nomeStatus not found
ele diz que não encontra o método, e é aí que eu me perco todo =/
Alguém me da uma ajuda com isso por favor.
Obrigado
[quote=andre.froes]Gente, eu consigo passar valores para o meu datatable normalmente, não estou com problemas com isso, porém tem algo que estou tentando fazer que não funciona + neeeem a pau. Eu tenho uma data de prazo que eu estarei sempre comparando com o dia de hoje. Baseado nisso, eu terei na tabela, ao invés de ter a data, o nome do status comparado com a data de hoje.
Se prazo == 0 ; Status recebe nome de Vence Hoje
Se prazo > 0 ; Status recebe nome de Vincenda
Se prazo < 0 ; Status recebe nome de Vencido
até aí sem problema.
public String getNomeStatus(Date data){
Date d = new Date();
String nomeStatus = null;
if ((((((this.data.getTime() - d.getTime()) / 24) / 60) / 60) / 1000) == 0){
nomeStatus = "Vence Hoje";
}
if ((((((this.data.getTime() - d.getTime()) / 24) / 60) / 60) / 1000) < 0){
nomeStatus = "Vencida";
}
if ((((((this.data.getTime() - d.getTime()) / 24) / 60) / 60) / 1000) > 0){
nomeStatus = "Vincenda";
}
return nomeStatus;
}
o problema real é na hora de passar isso para o datatable. Eu estou tentando várias coisas, mas nenhuma funciona.
<p:column style="width:50px;">
<f:facet name="header">
<h:outputText value="Prazo"/>
</f:facet>
<h:outputText value="#{controle.nomeStatus(item.prazo)}"/>
</p:column>
quando tento passa o prazo para ser feita a comparação e retornar o nome não funciona, ele me da um erro e só aparece a primeira linha sem o nome do status que ele se enquadra.
o erro é este:
GRAVE: javax.el.ELException: /paginas/consultar.xhtml @99,83 value="#{controle.nomeStatus(item.prazo)}": Method nomeStatus not found
ele diz que não encontra o método, e é aí que eu me perco todo =/
Alguém me da uma ajuda com isso por favor.
Obrigado
[/quote]
No seu DataTable vc tem um model certo? E no var vc colocou var=“item” certo?
Entao tenta fazer na coluna do seu dataTable h:outputText value="#{item.prazo}"/>
isso funciona normalmente, porém ele vai me trazer uma data (ex.: 27/10/2020)
o que estou tentando fazer é: Na hora de trazer o prazo, ao invés de ele me mostrar a data, que ele já me mostra, ele vai no backbean e vai comparar com a data de hoje, como eu mostrei no exemplo, e vai me retornar um String com um dos seguintes valores: Vincenda, Vencida ou Vence Hoje com base na comparação das datas prazo - dataHoje
funcionar no datatable ele funciona perfeitamente como eu disse, só estou tentando trazer um nome com base na comparação de data, que é onde estou apanhando.
[quote=andre.froes]isso funciona normalmente, porém ele vai me trazer uma data (ex.: 27/10/2020)
o que estou tentando fazer é: Na hora de trazer o prazo, ao invés de ele me mostrar a data, que ele já me mostra, ele vai no backbean e vai comparar com a data de hoje, como eu mostrei no exemplo, e vai me retornar um String com um dos seguintes valores: Vincenda, Vencida ou Vence Hoje com base na comparação das datas prazo - dataHoje
funcionar no datatable ele funciona perfeitamente como eu disse, só estou tentando trazer um nome com base na comparação de data, que é onde estou apanhando.[/quote]
Ueh, antes de passar para o seu ListDataModel sua Lista com esses objetos que contém esta data, so vc percorrer essa lista e setar para alguma variavel @Transient(Voce tem que criar na sua Entidade) e no seu dataTable vc fazer item.nomeStatus, sacou?
Um exemplo para facilitar
Na sua Entidade vc cria uma atributo, se vc usa JPA vc cria essa annotation @Transient para nao persistir no BD.
@Transient
private String nomeStatus
//getters e seters
Feito isso antes de passar para o seu ListDataModel vc faria:
[code]for(ObjetoData o : suaLista){
o.setNomeStatus(getNomeStatus(o.getData())
}[/code]
no seu dataTable item.nomeStatus.
Já ouviu falar em JSTL?
Acho que dá pra usar ai no seu caso viu irmão
tipo
<p:column>
<f:facet name="header">
<h:outputText value="Status"/>
</f:facet>
<c:if test="#{item.prazo} gt #{SEUBACKBEAN.SYSDATE}">
<h:outputText value="Vencida"/>
</c:if>
<c:if test="#{item.prazo} eq #{SEUBACKBEAN.SYSDATE}">
<h:outputText value="Vence Hoje"/>
</c:if>
<c:if test="#{item.prazo} lt #{SEUBACKBEAN.SYSDATE}">
<h:outputText value="Não Venciada"/>
</c:if>
</p:column>
pra melhor entender
Vlw…
consegui resolver de forma mais simples sem ter que alterar a estrutura do datatable:
assim ficou o xhtml:
<h:outputText style="color: blue; font-weight: bold;" rendered="#{item.prazo eq controle.dataHoje}" value="Vence Hoje"/>
<h:outputText style="color: red; font-weight: bold;" rendered="#{item.prazo.before(controle.dataHoje)}" value="Vencida"/>
<h:outputText style="color: green; font-weight: bold;" rendered="#{item.prazo.after(controle.dataHoje)}" value="Vincenda"/>
e esse é o método bean:
public Date getDataHoje() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date d = new Date();
String dtHj = sdf.format(d);
d = new SimpleDateFormat("dd/MM/yyyy").parse(dtHj);
return d;
}
a explicação do porque eu fiz o método “burro”:
se eu simplesmente trouxesse a data em seu formato “cru” e comparasse com a data da base de dados, nunca seria iguais, porque a date gerado agora busca segundo, minuto, hora, etc, daria discrepância no horário e nunca seriam iguais. Então transformei para aquele padrão dd/MM/yyyy e joguei numa string, que onde parseei e retornei o valor para o Date inicial, que agora ele vai ter somente a data mesmo, como é registrada no banco de dados.
valeu a atenção aí gente!!