Olá Pessoal
Tenho um relatório onde é calculado um campo chamado diferença: Dif = A - B. Ocorre que o campo A e B são resultados de SUM executado por uma query, que pode retornar NULL. Então pra evitar que seja impresso NULL utilizei a seguinte expressão:
($F{A}.doubleValue() == null) ? "0" :$F{A}
($F{B}.doubleValue() == null) ? "0" :$F{B}
Coloquei a expressão acima no Edit Expression, mas não deu certo, ou seja, ele continua imprimindo NULL.
Peguei essa dica aqui no fórum.
Se alguém puder dar uma dica.
Grato.
Se A == null então $F{A} retorna nulo e $F{A}.doubleValue() levanta uma NullPointerException…
O teste deve ser
($F{A) == null) ? "0" :$F{A}.doubleValue()
caso não se importe em perder a portabilidade do banco de dados (acredito que isso não será um problema já que tem querys executando em seu relatório, ao invés de usar algum framework de orm) pode tentar usar as funções:
nvl(sum(tabela.campo), 0) para oracle
coalesce(sum(tabela.campo), 0) para postgresql, firebird…
e por ai vai, basta saber o correspondente para o bd que tá usando.
nas Propriedades desse campo tem espaço chamado “Imprimir quando a expressão”. Nesse espaço voce pode fazer com que não seja impresso null.
qquer coisa faz outro post.
[]'s
Olá Rodrigo!
Implementei da forma que você passou, mas simplesmente ele não lista o relatório. Retiro e funciona, porém com null:
($V{diferenca} == null) ? "0" :$V{diferenca}.doubleValue()
Executo a opção pra validar expressão e o retorno é que a mesma está Ok.
Campos utilizados no relatório:
$F{sem_atual} :Quantidade de Horas semestre atual
$F{sem_antl} : Quantidade de Horas semestre anterior
$V{diferenca} = $F{sem_atual} - $F{sem_antl}
Implementei o código na opção EXPRESSÃO do campo $V{diferenca}. Também testei na opção “Imprimir quando a Expressão” e não funcionou.
Retiro essas expressões e ele roda sem problemas. Ah, isso tudo dentro do Ireports 2.0.1.
Quanto a utilizar o coalesce(), estou utilizando o Hibernate, porém dá erro “exception” com esta função.
List<Alocacao> todosAlocacaoes = new ArrayList<Alocacao>();
String cmdSql = "select distinct professor.pfr_nome as professor_pfr_nome, professor.pfr_qtdHoras as professsor_pfr_qtdHoras,"+
"coalesce((select sum(alocacao.alc_qtdHoras) from bean.Alocacao alocacao where alocacao.alc_professor.pfr_id = professor.pfr_id and alocacao.alc_semestre.smt_id =:semestreIdAtual),0) as sem_atual,"+
"coalesce((select sum(alocacao.alc_qtdHoras) from bean.Alocacao alocacao where alocacao.alc_professor.pfr_id = professor.pfr_id and alocacao.alc_semestre.smt_id =:semestreIdAnt),0) as sem_ant "+
"from bean.Alocacao alocacao "+
"left outer join alocacao.alc_professor professor "+
"group by alocacao.alc_semestre.smt_descricao,professor.pfr_nome "+
"order by alocacao.alc_semestre.smt_descricao,professor.pfr_nome ";
try {
Session session = ConexaoHibernate.getSession();
Query select = session.createQuery(cmdSql);
select.setInteger("semestreIdAtual",semestreIdAtual);
select.setInteger("semestreIdAnt",semestreIdAnt);
todosAlocacaoes = select.list();
session.close();
}
catch (Exception ex){
throw new SistemaException("AlocacaoDao","getListaAlocacao","Não foi possível buscar lista Alocacao Cadastrados no banco de dados.\n" + ex.getMessage(), "query");
}
return todosAlocacaoes;
Grato.
Ah, um detalhe importante é que na opção “Imprimir quando a expressão” o resultado é Boolean. No meu caso eu fiz :
new Boolean($V{KMTOTAL}.doubleValue() > new Double(0.0).doubleValue())
e funcionou…
[]'s
Olá Luis!
Implementei da forma que você passou, no “Imprimir quando a expressão”:
new Boolean(($F{sem_ant}== null) ? "0" :$F{sem_ant}.doubleValue())
Como já comentei, estou usando IReports, e ao executar o relatório ele não abre. Se tiro essa expressão ele roda, porém com NULL.
Grato.
Flavio, olha só… o campo “Imprimir quando a expressão” é Boolean. Então não pode ter uma experssão como essa que voce colocou, pois está dizendo que se for nulo escreve 0.
no seu caso acho que ficaria assim :
new Boolean($F{sem_ant} != null)
isso significa que, se o $F{sem_ant} for null, ele não vai escrever nada, ou seja “Imprimir quando a expressão” não for null.
Entendeu ?
Ah, outra coisa… se o $F{sem_ant} for String faça assim :
new Boolean(!$F{sem_ant}.equals(null))
qquer coisa, posta ai novamente.
[]'s
Saquei o lance… O que preciso é que quando for NULL ele troque por zeros pra poder fazer o cálculo.
Veja os campos utilizados no relatório:
$F{sem_atual} :Quantidade de Horas semestre atual obtido através SUM na query
$F{sem_antl} : Quantidade de Horas semestre anterior obtido através SUM na query
$V{diferenca} = $F{sem_atual} - $F{sem_antl}
Ocorre que em alguns registros ele retorna um dos campos (sem_atual ou sem_ant) com NUll, então quero trocar por zeros pra poder fazer o cálculo da diferença.
Flavio,
talvez até tenha maneira de fazer essa substituição no iReport, mas eu sinceramente ainda não sei como fazer… nesse caso, no seu lugar eu tentaria fazer essa substituição no SQL. Tem um comando chamado replace. Esse comando pode substituir um valor da consulta por outro que vc quiser.
Eu ainda não usei, mas um colega de trabalho usou e eu vi que deu o resultado esperado. O problema era identico ao seu.
qquer coisa posta ai novamente,
[]'s
Pessoal,
Resolvi o problema do NULL utilizando o Coalesce na query. Estou usando o Hibernate e o coalesce estava no local errado.
public List getListaAlocacaoesSemestre(int semestreIdAtual, int semestreIdAnt) throws SistemaException {
List<Alocacao> todosAlocacaoes = new ArrayList<Alocacao>();
String cmdSql = "select distinct professor.pfr_nome as professor_pfr_nome, professor.pfr_qtdHoras as professsor_pfr_qtdHoras,"+
"(select coalesce(sum(alocacao.alc_qtdHoras),0) from bean.Alocacao alocacao where alocacao.alc_professor.pfr_id = professor.pfr_id and alocacao.alc_semestre.smt_id =:semestreIdAtual) as sem_atual,"+
"(select coalesce(sum(alocacao.alc_qtdHoras),0) from bean.Alocacao alocacao where alocacao.alc_professor.pfr_id = professor.pfr_id and alocacao.alc_semestre.smt_id =:semestreIdAnt) as sem_ant "+
"from bean.Alocacao alocacao "+
"left outer join alocacao.alc_professor professor "+
"group by alocacao.alc_semestre.smt_descricao,professor.pfr_nome "+
"order by alocacao.alc_semestre.smt_descricao,professor.pfr_nome ";
try {
Session session = ConexaoHibernate.getSession();
Query select = session.createQuery(cmdSql);
select.setInteger("semestreIdAtual",semestreIdAtual);
select.setInteger("semestreIdAnt",semestreIdAnt);
todosAlocacaoes = select.list();
session.close();
}
catch (Exception ex){
throw new SistemaException("AlocacaoDao","getListaAlocacao","Não foi possível buscar lista Alocacao Cadastrados no banco de dados.\n" + ex.getMessage(), "query");
}
return todosAlocacaoes;
}
Obrigado pelas dicas.