Dicas para JasperReports/iReport

July 12th, 2010

Estava procurando na internet materiais sobre iReport para me auxiliar num relatório que estou desenvolvendo, e encontrei estas dicas sobre o iReport e decidi compartilhar aqui no meu blog também:

Algumas considerações:

1) cuidado ao dar um nome para salvar o seu relatório no iReport. Apesar da ferramenta não exigir que esse nome seja o mesmo que você forneceu ao criar o relatório, o engine Jasper irá usar esse nome, e não o nome do arquivo, para gerar o .jasper e o .jrprint (o default). Por exemplo, se o seu relatório se chama MeuRelatorio, e o arquivo se chama mrelat.jrxml, os arquivos gerados serão MeuRelatorio.jasper e MeuRelatorio.jrprint e não mrelat.jasper nem mrelat.jrprint!

2) Cuidado com campos cujos valores podem ser grandes. Nas propriedades do campo (duplo clique), selecionar a aba TextField e marcar a opção stretch with overflow. Atenção: na aba common, existe o Stretch type, mas esse tem a ver com a posição relativa às outras colunas e não com o conteúdo do campo.

3) É possível criar fontes de relatório, que são fontes com características pré-definidas e que depois podem ser usadas por todo o relatório. No iReport, para criar uma fonte nova, ir no menu Visualizar – fontes do relatório, apertando depois o botão new e configurando a fonte. Para usar uma fonte dessas, ir nas propriedades do texto, clicar na aba fonts. O primeiro campo dessa aba é o report fonts, basta escolher.

4) Uso do printWhenExpression: elementos com essa expressão, só são impressos se a expressão (tipo Boolean) for verdadeira. Um exemplo:

new Boolean ($F{codCliente}).intValue() % 10 == 0)

Faz com que o campo codCliente só seja impresso se for múltiplo de 10.

5) outro recurso, digamos, avançado é o de scriptlets. Scriptlets são classes que extendem JRAbstractScriptlet ou JRDefaultScriptlet, que extende a anterior. Essas classes servem para implementar algum tipo de cálculo que não os já existentes (soma, média, contagem, etc…). As classes base oferecem métodos que são disparados automaticamente cada vez que um “evento de relatório” acontece. Exemplos: beforeColumnInit(), afterDetailEval(), beforePageInit(), e assim por diante.

Para usar um scriptlet num relatório (aparentemente só é possível usar um), é preciso fornecer o atributo scriptletClass do elemento. Esse elemento é referenciado pela variável REPORT_SCRIPTLET.

No iReport, isso é configurado em visualizar – propriedades do relatório, na aba scriptlet.

Fonte: http://rederia.net/2010/04/21/dicas-para-jasperreportsireport/

Diversos

Bug Javascript

July 5th, 2010

Todos que me conhecem sabe que eu simplesmente amo javascript. A maior falha da linguagem (na minha opinião) já foi corrigida com o ajax, que permite o acesso a bancos sem dar o “chato” submit.

Imagine uma linguagem de programação em que você só precisa do bloco de notas e um navegador (coisa que todo computador tem) para fazer as mais incríveis e inimagináveis proezas. Nutro paixão pela linguagem porque aprendi a programar com javascript, nos meus idos de 15 anos (época em que não tinha a menor idéia de como fazer um Borland C rodar, ou um Eclipse por exemplo).

Agora, que javascript não é perfeita ninguém discute. Não vou falar neste artigo no fato da linguagem não exigir declaração das variáveis, utilizar apenas o “var” para qualquer tipo primitivo, que não é segura, etc…

O que vou relatar é um bug assutador da linguagem:

Quanto é 1000.28 – 1000?

Pois é, para o javascript o resultado incrivelmente não é 28!

Ou 0.1 + 0.2?

Não espere um 3 exato!

Faça você mesmo o teste!

<script>
alert(1000.28 - 1000);
alert(0.1 + 0.2);
</script>

O que acontece é que os “números em Javascript são representados internamente com 64 bits e cada número pode ter no máximo 17 dígitos significativos”, palavras de Carlos Brando.

Para mais exempos e explicações, recomendo o blog do Carlos, acessando http://www.nomedojogo.com/2009/08/17/isto-e-um-bug-no-javascript/

Até a próxima!

Diversos

6 x 9 = 42

June 21st, 2010

Que a resposta para a vida, o universo e tudo mais é 42 todo mundo sabe (até o google sabe). Mas fiquei bolada com a equação 6 x 9 = 42, que aparece no volume
2 da trilogia de 5 do “Guia do Moxileiro das Galáxias” (livro que eu recomendo, incluse consta na lista dos 1001 livros para ler antes de morrer).

Para quem não leu ainda, para entender o significado da pergunta fundamental, os personagens Arthur e Ford estão tentando formular a pergunta correta cujo resultado é 42. Tirando letras feitas em pedras numa toalha ao acaso, o diálogo é o seguinte:


– Q– disse Ford–, U, A, L... Qual! Piscou os olhos.
– Acho que está funcionando! – disse. Arthur lhe entregou mais três,
– E, O, R... Eor. Bom, talvez não esteja funcionando – disse Ford.
– Toma mais estas três.
– E, S, U... Eoresu... acho que não está fazendo sentido.
Arthur tirou mais três e depois mais duas. Ford as colocou em seus lugares.
– L, T, A... D, O... Eoresultado... É o resultado! – gritou Ford. – Está funcionando! É fantástico, está funcionando mesmo!
– Tem mais aqui – disse Ford, arrancando-as febrilmente o mais rápido que podia.
– D, E – disse Ford –, S, E, I, S... Qual é o resultado de seis... V, E, Z, E, S... Qual é o resultado de seis vezes... N, O, V, E... seis vezes nove... – fez uma pausa. –Vamos, cadê a próxima?
– Ahn, isso é tudo – disse Arthur –, eram todas que tinha.
Recostou-se, perplexo.
Vasculhou com as pontas dos dedos mais uma vez dentro da toalha mas não havia mais letras.
– Quer dizer que é isso? – disse Ford.
– É isso.
Seis vezes nove. Quarenta e dois.
– É isso. Está tudo aí.

Após esse diálogo, o livro não cita mais nada a respeito, os personagens enfrentam outras aventuras no antigo planeta terra.

Muito curiosa, procurei em blogs e foruns de livros mas fiquei frustada por ver que muitos leitores que leram e recomendam a trilogia, sequer citaram esse fato inusitado (ou até mesmo nem notaram, como anda a sua tabuada?).

Cogitei erro de tradução, mas no livro na lingua original está da mesma forma.

Bom, até que um site sério (desciclopedia!) me clareou as ideias e me salvou da escuridão. O que acontece é que a conta é feita em base 13, e não em base decimal. Não, Douglas Adams não errou na conta!

Tanto que se passarmos o resultado de 6 x 9 (54) para base 13 o resultado é exatamente 42 (fiz o teste num coversor de bases, convertworld.com)

Ufa… muito bom descobrir que não estou ficando louca! Até mais pessoal!

Diversos

A culpa é do sistema

June 14th, 2010

Olha, já ouvi muita coisa nessa vida, mas na minha opinião a desculpa mais esfarrapada é “a culpa é do sistema…” (a pessoa ainda fala com a cara de um cachorrinho todo coitadinho que não pode fazer nada). Para mostrar minha indignação, resolvi escrever este post.

Imagine a situação, você é contratado para fazer um sistema, faz toda a análise, estuda os requisitos, entrevista clientes e usuários, faz a modelagem, faz o protótipo, discute com o cliente, enfim… desenvolve o sistema do jeito que o cliente querm, atendento com perfeição às necessidades do cliente.

Aí algum dono de loja ou de estacionamento que não quer dar descontos para um cliente insistente, o que faz? joga a culpa no sistema! ou seja, não é que ele é um mercenário que só pensa no lucro, é que o sistema não permite dar um desconto!

Muita cara de pau não? se o sistema foi feito moldado exatamente para as necessidades do cliente, é a maior desculpa esfarrapada… e quem fica mau na história somos nós, analistas de sistemas, que somos cruéis e não queremos dar desconto para ninguém.

Pois é, isso é falta de coragem para a pessoa assumir que não vai dar desconto porque é uma política dela ou da empresa, sei lá, mas que o sistema não tem nada a ver com a história…

Um dia ainda vou ter esse diálogo quando ouvir a famosa desculpa:

- Desculpe não fazer isso por voce, o sistema não permite.
- Ah, não tem problema, sou analista de sistemas, é só eu dar uma alterada no código-fonte que o sistema vai permitir tudo que você quiser.

ou então:

- Desculpe não fazer isso por voce, o sistema não permite.
- Nossa sério? Vamos fazer o seguinte, já que o sistema é o problema e está engessando tudo, vamos discutir um orçamento para eu desenvolver um sistema melhor. Faço um desconto de 10% para pagamento feito à vista.

Só para chatear o atendente um pouquinho… afinal, tá na hora de pararem com essa conversa fiada de por a culpa no sistema!

Diversos

PHP x Cookies

June 7th, 2010

Cookies nem sempre são recomendados, principalmente porque por serem armazenados no navegador do cliente, o usuário pode desabilitar o cookie ou até mesmo pior, alterar o valor do mesmo. Como o cookie pode ser confiável desse jeito?

Bom, mas tem aplicações em que é inevitável a utilização de cookies. Eu, por exemplo, estou desenvolvendo um sistema onde resumidamente, preciso pegar informações do banco de dados e passar para uma variável javascript, de forma que pelo código fonte não seja possível ver o valor desta informação.

Qual a solução? COOKIES!! Guardo o cookie com o valor confidencial por PHP, direto do banco de dados, e pelo javascript pego o valor do cookie e armazeno numa variável, de forma que ninguém que não acesse meu banco de dados saiba o valor da variável (muito diferente de utilizar os famosos campos “hidden”).

Em teste, tudo certo… e eis que ao passar para produção, claro, tinha que não funcionar direito… alias essa é uma premissa básica do desenvolvimento de sistemas: não importa o quanto você testa seu programa, ao passar para produção sempre terá um erro desconhecido no qual você perde horas, ou até mesmo dias, estragando de vez seu cronograma de entrega do sistema. (essa é aliás uma das maiores emoções de ser programadora =] )

Após muito mexer e debugar manualmente meu programa (”debugar” em php já viu, é um ctrl+c / ctrl+v / echo aqui / echo acolá que não acaba mais), descobri minha salvação! Por algum motivo não identificável (na verdade o que importa mesmo nestes casos é a solução do problema), muito provavelmente diferença de configuração do php, a função setcookie(…) do php só estava funcionando quando setada antes da TAG <HTML>… todos os cookies que eram criados após esta tag, em produção não eram criados.

Neste caso, a solução foi colocar logo no início da página, o comando “ob_start();” que ativa o output buffering, evitando o erro (que para mim era invisível) “Warning: Cannot modify header information”.

Então é isso, para quem for trabalhar com php + cookies, fica aí a dica!


<?php
session_start();
ob_start(); // linha milagrosa!
?>
<HTML>
<?
// agora posso criar meus cookies mesmo após a tag HTML
setcookie("cookieDaMelissa", "1000", 0, false);
$nome_do_cookie = "cookieDaMelissa";
if(isset($_COOKIE[$nome_do_cookie]))
{
echo "O cookie $nome_do_cookie existe! ";
}
?>
<HEAD>
....

Diversos

Configurando o “LL”

December 21st, 2009

Neste artigo vou explicar de maneira breve como adicionar o alias para utilizar o ll (ls -lah)

Muita gente já deve ter visto um ‘expert’ em linux trabalhando no console listando os arquivos pelo comando ‘ll’, ao invés do tão conhecido ‘ls’. Para poder usar o ‘ll’ (no Debian), basta adicionar o alias no ~/.bashrc:

alias ll=’ls -lah’

Qualquer outro alias pode ser inserido, o limite é a sua imaginação!

Lembre-se: “O linux se ajusta ao usuário, não usuário que se ajusta ao linux.”

Diversos

Um pouco de humor…

December 14th, 2009

Para os viciados em notebook (como eu), um pouco de humor vai bem:

Piada

=)

Cotidiano, Diversos

Hello world from Melissa!

December 8th, 2009

Meu primeiro post!!  Meu “Alô mundo”!

Bom, serei breve (até demais) neste post… gostaria de informar que de agora em diante vocês, profissionais da área de TI e simpatizantes, podem contar com este espaço para ler artigos, notícias, trocar idéias, tirar dúvidas, e até perder tempo!

Espero conquistar a amizade e o interesse de vocês e juntos, contribuir para uma interent com mais conteúdo!

Irei abordar alguns assuntos de meu interesse, tais como linux, distros, java, struts, ajax, webdesigner, css, entre outros… Se tiver algum assunto que você, cara(o) leitor(a), gostaria de ver aqui, please let me know!

Fico por aqui…

Abraços e até a próxima!

Diversos