Expressão de filtragem no iReport

14 respostas
M

Bom dia todos.

Estou com problemas para usar a Expressão de filtragem para um relatório que lê os dados de um arquivo CSV.
Criei um parâmetro chamado EXPRESSAO do tipo boolean com valor default new Boolean(true) e na expressão de filtragem coloquei $P{EXPRESSAO}. O relatório compila e roda sem problemas.
Na minha classe java monto dinâmicamente uma string para passar como expressão de filtragem, por exemplo, $F{nome}.substring(0,1).compareTo(“A”)>=0 && $F{nome}.substring(0,1).compareTo(“D”)<=0, e passo como parâmetro para o relatório. Ele acusa um erro em tempo de execução por problemas na expressão de filtragem.
Depois de muito teste resolvi colocar uma expressão diretamente no iReport para ver se tinha algo a ver com algum erro na classe onde gero a string ou na passagem do parâmetro para o relatório

Quando uso uma expressão do tipo:

$F{nome}.compareTo(“AAA”)>0

Aparece o erro já na compilação

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. Cannot cast from boolean to Boolean value = (java.lang.Boolean)(((java.lang.String)field_nome.getValue()).compareTo(“AAA”)>0);

Alguém pode me dar alguma dica???

14 Respostas

G

amigo,

experimente usar a seguinte expressao:

new Boolean($F{nome}.equals( “AAA” ))

Abraço

M

Bom dia.
Resolví parcialmente meu problema. Obrigado pela dica. Mudei o tipo do parâmetro para String e a expressão funcionou, mesmo usando o compareTo. O que ainda não conseguí fazer foi passar a expressão inteira como um parâmetro e fazer funcionar. Nos meus tempos de clipper este recurso era chamado de MacroSubstituição e ainda não sei como fazer em Java. A macro funcionava assim, você criava uma variável com uma expressão (Ex: V1 = “10 + 20”) e quando você pedia para imprimir &V1 o resultado era 30 e não “10 + 20”. A Macro retirava as aspas e avaliava a expressão. O que estou tentando fazer é o seguinte:
Monto uma janela perguntando a ordem da impressão (Codigo, Nome ou Endereço). Dependendo da resposta monto a expressão. Por exemplo, se o usuário escolhe Nome a expressão fica “$F{nome}.substring(0,1).compareTo(“A”)>=0 && $F{nome}.substring(0,1).compareTo(“D”)<=0”. Se ele escolhe Codigo e expressão fica “$F{codigo}.substring(0,1).compareTo(“00001234”)>=0 && $F{codigo}.substring(0,1).compareTo(“00002345”)<=0”. Depois disto eu chamo o relatório passando esta expressão para o parâmetro EXPRESSAO. Como eu tinha na cabeça a ideía da macro do clipper, imaginei que haveria algo similar no Java. Na expressão de filtragem coloquei new Boolean($P{EXPRESSAO}). Você sabe alguma forma de “retirar” as aspas para que a expressão possa ser avaliada como true or false?
Obrigado,

R

Seu erro é:

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file: 1. Cannot cast from boolean to Boolean value = (java.lang.Boolean)(((java.lang.String)field_nome.getValue()).compareTo("AAA")&gt0);

Não se esqueça de que Boolean é diferente de boolean!

Provavelmente o retorno de

$F{nome}.compareTo("AAA")&gt0 é um boolean

e no iReport vc cria seu parâmetro expressão como new Boolean(true)

Tente criar o parâmetro como boolean e nao Boolean.

M

Boa tarde a todos.
Obrigado pelas dicas. Tem ajudado bastante.
Usei o new Boolean($P{EXPRESSAO}) e funcionou. Tive que mudar a forma como montei a EXPRESSAO. Fixei o nome do campo e passei só o valor para comparação.
Ainda nesta linha de passagem de parâmetros… alguém pode me ajudar com o operador $P!{} ? Quando digito “!” o parâmetro muda de cor e aparece a mensagem Parse error at line 1. Quando tento compilar aparece o erro 1. Syntax error on token “!”, invalid AssignmentOperator.
Resumindo $P{EXPRESSAO} funciona, $P!{EXPRESSAO} dá erro na compilação. O parâmetro EXPRESSAO foi criado como tipo String.

Obrigado.

M

Estou tentando usar o $P!{} na expressão de filtragem. Será que é esse o problema?

J

Olá.

O que você quer fazer com $P{EXPRESSAO} ?

Não se usa o ! depois do início da expressão, mas antes.

exemplo:

!“Teste”.equals($P{EXPRESSAO}) // Se nao for igual a Teste, entao procede.

Att.

M

Bom dia Jonatas.
Não estou falando do operador lógico ! (NOT).
O que estu tentando fazer é o seguinte:
Em uma classe java pergunto ao usuário qual é a ordem que ele deseja na impressão do relatório. Vamos supor que ele escolha “Nome”. Peço que ele digite o nome inicial e final.
Depois eu crio uma string contendo a seguinte expressão

$F{nome}.substring(0,1).compareTo(“A”)>=0 && $F{nome}.substring(0,1).compareTo(“D”)<=0

Criei um parâmetro do tipo String chamado EXPRESSAO e na expressão de filtragem coloquei new Boolean($P{EXPRESSAO}).

Para testar, ao invés de new Boolean($P{EXPRESSAO}), digitei new Boolean($F{nome}.equals( “AAA” )), conforme a dica do guiwilleman e funcionou perfeitamente.

O problema parace estar no tipo de parâmetro. Quando passo uma string para o parâmetro EXPRESSAO o iReport entende que a expressão de filtragem fica new Boolean(“expressao recebida com o string”) o que causa um erro.
Na documentação do iReport foi dito que existe uma forma especial de passar parâmetros, que consiste em usar $P!{parametro} ao invés de $P{parametro}. Pelo que entendí este operador “retira” as aspas do parâmetro. Neste caso a expressão de filtragem que antes estava sendo entendida pelo iReport como new Boolean("$F{nome}.substring(0,1).compareTo(“A”)>=0 && $F{nome}.substring(0,1).compareTo(“D”)<=0") (com aspas), seria tratada como new Boolean($F{nome}.substring(0,1).compareTo(“A”)>=0 && $F{nome}.substring(0,1).compareTo(“D”)<=0), o que deveria funcionar sem problemas.
O que está acontecendo, conforme minha mensagem anterior, é que quando digito o “!” na expressão de filtragem dá erro.
Daí minha dúvida. Por quê dá erro? Este operador não pode ser usado na expressão de filtragem?
Um abraço e obrigado a todos pela atenção

J

Olá Mozart.

Só pude responder agora.

Então, você está interagindo com o usuário através de software, correto?
E estes parametros são preenchidos em tempo de compilação, correto?

Não conhecia essa função ! depois do $P…vou ver se dou uma olhada.

Acredito que a propriedade não está sendo interpretada em tempo de execução.
Você poderia fazer um teste:

Crie um scriptlet e altere a propriedade em tempo de execução. (Precisamos saber o comportamento).

Você deve criar um Scriptlet e inserir no seu relatório, ele deve ser ± assim:

public class TestScriptlet extends JRDefaultScriptlet { public void callBeforeDetailEval throws JRScriptletException { String nome = (String) ((JRFillField) this.fieldsMap.get("nome")).getValue(); if (nome != null && !"".equals(nome)) { Boolean bool = (nome.substring(0,1).compareTo("A")>=0 && nome.substring(0,1).compareTo("D")<=0 ) ? Boolean.TRUE : Boolean.FALSE; ((JRFillVariable) this.variablesMap.get("ParametroAvaliado")).setValue(bool); } } }

Não testei isso e nem compilei, mas deve funcionar.
Ele vai substituir o avaliador “ParametroAvaliado” pela condição já executada antes.
O único problema é que isto é processado a cada impressão do Detail, talvez seja melhor você colocar no metodo beforeReportInit() (cabe a você testar).

Você deve ainda criar uma variável no iReport chamada “ParametroAvaliado” com tipo Boolean. Substitua a expressão new Boolean{$P{EXPRESSAO}) por isto, ou então, acesse a variavel (que não sei o nome) diretamente do Scriptlet, trocando o nome “ParametroAvaliado”.

Acho deve resolver o seu problema.

Att.

M

E aí Jonatas.
Acho que estou perto. Fiz um Scriptlet como você sugeriu. ficou um pouco diferente:

public void beforeDetailEval() throws JRScriptletException
{
                String ValCampo = "";
                String NomeCampo = (String) ((JRFillParameter) this.parametersMap.get("Nome_Campo")).getValue();
        System.out.println(">"+NomeCampo+"<");
                String VInicio = (String) ((JRFillParameter) this.parametersMap.get("EXP_INICIO")).getValue();
        System.out.println(">"+VInicio+"<");
                String VFim = (String) ((JRFillParameter) this.parametersMap.get("EXP_FIM")).getValue();
        System.out.println(">"+VFim+"<");
        System.out.println(NomeCampo.equals("nome"));
                if (NomeCampo.equals("nome"))
                {
                        ValCampo = (String) ((JRFillField) this.fieldsMap.get("nome")).getValue();
        System.out.println(">"+ValCampo+"<");
                }
        System.out.println(">"+ValCampo.substring(0,VInicio.trim().length())+"<");
        System.out.println(ValCampo.substring(0,VInicio.trim().length()).compareTo(VInicio.trim())>=0);
        System.out.println(ValCampo.substring(0,VFim.trim().length()).compareTo(VFim.trim())<=0);
        System.out.println("-----------------");
                         Boolean bool = (ValCampo.substring(0,VInicio.trim().length()).compareTo(VInicio.trim())>=0 && ValCampo.substring(0,VFim.trim().length()).compareTo(VFim.trim())<=0 ) ? Boolean.TRUE : Boolean.FALSE;
        System.out.println(bool);
        System.out.println("================");
                        this.setVariableValue("FiltroAvaliado",bool);
        System.out.println(this.getVariableValue("FiltroAvaliado"));
        System.out.println("========================================");

}

Coloquei todos estes System.out.println para ver se os parametros estavam sendo atualizados corretamente.

O código limpo ficou assim:

public void beforeDetailEval() throws JRScriptletException
{
                String ValCampo = "";
                String NomeCampo = (String) ((JRFillParameter) this.parametersMap.get("Nome_Campo")).getValue();
                String VInicio = (String) ((JRFillParameter) this.parametersMap.get("EXP_INICIO")).getValue();
                String VFim = (String) ((JRFillParameter) this.parametersMap.get("EXP_FIM")).getValue();
                if (NomeCampo.equals("nome"))
                {
                        ValCampo = (String) ((JRFillField) this.fieldsMap.get("nome")).getValue();
                }
                Boolean bool = (ValCampo.substring(0,VInicio.trim().length()).compareTo(VInicio.trim())>=0 && ValCampo.substring(0,VFim.trim().length()).compareTo(VFim.trim())<=0 ) ? Boolean.TRUE : Boolean.FALSE;
                this.setVariableValue("FiltroAvaliado",bool);
}

Aqui corre tudo bem.
O problema é que, no relatório, a expressão de filtragem que que agora esta $V{FiltroAvaliado} não está funcionando.
O relatóro não está levando em conta o valor que o scriptlet atribui à variável FiltroAvaliado. É como se ele zerasse o valor da variável e assumisse sempre null.
Tenho que fazer alguma associação na criação da variável? Ela foi criada apenas como boleana e não coloquei nada na expressão da variável.
Só para exclarecer, as solicitações que faço ao usuário são em tempo de execução.
Um abraço,

M

FUNCIONOOUUUU !!!

Jonatas valeu pela ajuda.
A idéia do Scriptlet foi ótima. Ele ficou assim :

public void beforeDetailEval() throws JRScriptletException
 {
                 String ValCampo = "";
                 String NomeCampo = (String) ((JRFillParameter) this.parametersMap.get("Nome_Campo")).getValue();
                 String VInicio = (String) ((JRFillParameter) this.parametersMap.get("EXP_INICIO")).getValue();
                 String VFim = (String) ((JRFillParameter) this.parametersMap.get("EXP_FIM")).getValue();
                 if (NomeCampo.equals("nome"))
                 {
                         ValCampo = (String) ((JRFillField) this.fieldsMap.get("nome")).getValue();
                 }
                 Boolean bool = (ValCampo.substring(0,VInicio.trim().length()).compareTo(VInicio.trim())>=0 && ValCampo.substring(0,VFim.trim().length()).compareTo(VFim.trim())<=0 ) ? Boolean.TRUE : Boolean.FALSE;
                 this.setVariableValue("FiltroAvaliado",bool);
 }

Depois (de muita luta) foi só setar o Calculation Type da variável FiltroAvaliado para System e não usar a expressão de filtragem.
Coloquei a expressão $V{FiltroAvaliado} em Print When Expression (Propriedades da Detail Band) e funcionou perfeitamente.
Obrigado pela ajuda.
Um grande abraço,

J

Ótimo Mozart!!!

Sabia que daria certo.

Essa questão do Calculation Type é um problema mesmo…gera uma confusão, às vezes.

Coloque o tópico como [CORRIGIDO], isto ajuda a comunidade.

Att.

P

Fala ae!
eu vi os comentarios de vcs e estou com uma duvida de como fazer um relatorio agrupado, vcs podem me ajudar?

Vide topico:
http://www.guj.com.br/posts/list/111424.java

Vlw!

G

Moçada eo seguinte eu gerei um relatorio no IReport com os campos:

matricula,aluno,not1,not2,not3,not4,frequencia(“qtas aulas o aluno foi na disciplina”),media(“as 4 notas/4”), e um campo String “situacao”

ate agora tudo bem pois…consegui calcular a media ea frequencia por exemplo: media 7.7 e frequencia 50.0
ate ai tudo bem, quando a
media >=7.0 e a frequencia > 75.0 o aluno sera “Aprovado” senao isso “Reprovado"
eo campo “situacao” deve receber Aprovado” ou “Reprovado”,
minha dificuldade eo seguinte nao consigo fazer uma “condicao” pra ele jogar “Aprovado” ou “Reprovado” no campo “situacao”, quando jogo a matrícula do aluno

PODEM ME AJUDAR POR FAVOR…abraços

L

Boa Tarde!

cara estou fazendo um sistema com relatorio semelhante o seu.

tem como vc me passar a solução do teu???

aguardo contato.

msn: [email removido]

Criado 15 de fevereiro de 2007
Ultima resposta 19 de abr. de 2010
Respostas 14
Participantes 7