quinta-feira, 9 de fevereiro de 2012

Mudando cores no iReport

Um certo dia, estava construindo um relatório no iReport (uso o 3.0.0) e tive que resolver o seguinte problema:
Tinha uma listagens de participantes de uma gincana e nessa listagem que constituía uma tabela, havia uma coluna com o título de "Vencedor". Nessa coluna era marcado quem era o vencedor da gincana. Quando o participante era vencedor a linha em que ele estava na tabela tinha de ficar verde, caso contrário continua na cor normal.

Para resolver esse problema, logo pensei que teria de criar uma regra para isso mas, o problema que enfrentava era que não sabia mudar a cor dinamicamente de text field em tempo de execução. Então, começei a pesquisar sobre o assunto e achei duas soluções que irei compartilhar.

A primeira solução é uma solução que funciona mas, não é a melhor de todas. Essa solução consiste em alterar a expressão de campo de texto. Para fazer isso é necessário seguir o seguinte caminho:

clicar com o botão direito no text field independente em que banda ele estiver > propriedades > Campo texto > Expressão de Campo de Texto.

Na área de "Expressão de Campo de Texto", você põe sua regra mudando a cor do campo, no meu caso fiz:
($f{flagVencedor.byteValue() == 0}) "" ? : ""

Logo após por sua regra, é necessário ir na aba "Todos", encontrar a propriedade "Texto estilizado" e marcar o checkbox. Pronto, vai funcionar. Essa regra avalia o field "flagVencedor", se esse field for igual a 0, não escreve nada pois 0 significa que o participante não é vencedor, caso contrário, escreve "Vencedor".

Essa primeira solução não é a melhor de todas pois, primeiramente, você quando faz isso não está utilizando uma solução da ferramenta, ou seja, em versões futuras do ireport é capaz de que o que você fez falhar se os report construidos migrarem. O que foi escrito na expressão de campo de texto é uma tag que faz parte do xml construído pelo ireport, fazendo desse jeito a mudança de cor você delega a responsabilidade de mudanças do XML para uma outra funcionalidade que tem somente responsabilidade de exibir valores.

A segunda solução é uma solução mais refinada, simples e com menos probabilidade de dar erros. A segunda solução consistem em criar um estilo pelo próprio iReport e associá-lo à seu text field. Para criar esse estilo é necessário seguir o seguinte caminho.

Vá no menu Formatar > Estilos > Janela será aberta, clique em "Novo".

Logo após clicar em "Novo", uma janela será aberta, com várias propriedades que podem ser mudadas. Um espaço no lado direito chamado "Condições do estilo" será mostrado. Por default, a condição "Padrão" já é mostrada. Essa condição constitui uma condição que qualquer elemento do ireport adota implicitamente. Então, qualquer propriedade mudada ali vai afetar qualquer elemento que esteja no seu report. Como não é isso que queremos, vamos adicionar uma nova condição de estilo, clique em "Adicionar". Quando clicado, o editor de expressões será aberto e sua regra pode ser posta. Após por sua regra, aplique-a.

Agora que temos a nova condição criada, clique nela e mude as propriedades desejadas e, depois clique em OK. Pronto, seu estilo foi criado com sucesso. Agora vá no seu textfield e, realize a seguinte ação.

Clique com botão direito > Propriedades > Aba Todos > Na propriedade estilo ponha o estilo que você criou.

Pronto, o estilo que você criou está sendo aplicado. Compile o report e, faça seu teste.

E ai o que achou desse lixo ? Sugestões ? Comentários ? Deixe sua opinião.

2 comentários:

Anônimo disse...

Que isso meu amigo , ficou excelente . Parabéns , continue assim . Só não funcionou com Cross-Tab , pois sempre dá o erro de Não encontrou o Campo . Se coloca como Variável , também não encontra , dá pau na compilação de não encontrou a variável . Coloquei o Campo e a Variavel em todas as bandas do Cross-Tab e o erro continuou . Larguei para lá . Valeu .

Preciso estudar sempre disse...

Quando vc diz que não encontra varíavel, vc tá falando do estilo ou do cross-tab ??