Author Archives: sutradi

Bysutradi

JasperReports: gerando código de barra (barcode)

O uso de código de barras é comum para a identificação de produtos, pois este compõe informações sobre o mesmo que podem ser coletados através de leitores óticos (e até celulares).

No Brasil, a GS1 Brasil, Associação Brasileira de Automação, é a organização sem fins lucrativos que tem por objetivo disseminar seu padrão de identificação, codificação e soluções para aumentar a eficiência na cadeia de suprimentos.

Existem vários modelos de códigos de barras para utilização, tanto lineares quanto bidimensionais. Este artigo demonstrará como usar o iReport para gerar uma página com etiquetas com código de barra.

Para isso, criaremos no iReport uma visão em duas colunas:

[sourcecode language=”xml”]

<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="ImprimirEtiqueta" language="groovy" columnCount="2" pageWidth="590" pageHeight="842" columnWidth="270"
columnSpacing="5" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">

[/sourcecode]

O segredo aqui é fazer com que a equação abaixo seja verdadeira:

pageWidth = columnWidth *columnCount + columnSpacing + leftMargin + rightMargin

Caso contrário, o IReport apresentará mensagem de erro ao tentar fazer o preview.

O iReport possui componentes para barcode. Porém, como a idéia aqui é preencher a página inteira com códigos de barra, nas colunas, usaremos um componente de imagem.

[sourcecode language=”xml”]
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">

<datasetRun subDataset="dataset1">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{lista})]]></dataSourceExpression>
</datasetRun>

<jr:listContents height="109" width="270">

<image scaleImage="RealSize">
<reportElement x="108" y="2" width="162" height="107"/>
<imageExpression><![CDATA[new net.sf.jasperreports.components.barbecue.BarbecueRenderer(new net.sourceforge.barbecue.linear.code39.Code39Barcode($F{etiqueta}, false))]]></imageExpression>
</image>

// Suprimido itens textField

</jr:listContents>
</jr:list>

[/sourcecode]

Esse componente será renderizado de acordo com a quantidade de itens o field “etiqueta”.

Bysutradi

Avnet compra Ascendant

A Avnet anunciou hoje (26) a compra da Ascendant, consultoria com atuação nos EUA, Europa, Brasil e Índia.

A Ascendant é uma consultoria que atua com soluções IBM e possui cerca de 500 funcionários. Em 2011 teve uma receita de US$ 90 milhões, tendo como concorrentes consultorias como BRQ IT Services, Scala IT Solutions, e outras consultorias.

Os valores desta negociação não foram divulgados.

Bysutradi

JasperReports: apresentando uma lista do tipo ArrayList

Existem vários frameworks e ferramentas para gerar arquivos PDFs usando JAVA, sendo a dupla JasperReports/iReport uma das mais utilizadas.

Em relatórios, é comum a necessidade de apresentar uma listagem qualquer. Abaixo mostrarei como fazer uma lista no JasperReport 4.5 através de subDataset, jr:list e jr:listContents. Vamos aos passos:

Passo 1: criar uma classe Vo/TO com um método getMe que retorna this. O código abaixo não apresentará construtores e métodos get/set.

[sourcecode language=”java”]
public MinhaClasse implements Serializable {

private int id;
private String nome;

public MinhaClasse getMe() {
return this;
}

// Métodos get/set foram suprimidos

}
[/sourcecode]

Passo 2: no iReport, adicione um subDataset e um parâmetro do tipo ArrayList. Este dataSet será composto por um conjunto de Fields que serão usados na apresentação da lista. O parâmetro do tipo ArrayList será o responsável por receber a lista com objetos do tipo MinhaClasse.

[sourcecode language=”xml”]
<subDataset name="dataset1">
<field name="id" class="java.lang.Integer">
<fieldDescription><![CDATA[me.id]]></fieldDescription>
</field>
<field name="nome" class="java.lang.String">
<fieldDescription><![CDATA[me.nome]]></fieldDescription>
</field>
</subDataset>

<parameter name="listaMinhaClasse" class="java.lang.Integer"/>
[/sourcecode]

Passo 3: no iReport, adicione o componente jr:list. No código abaixo, informaremos que a lista terá como dataSource o objeto dataSet que definimos anteriormente.

[sourcecode language=”xml”]
<!– O componente abaixo foi colocado na estrutura detail/band/componentElement –>

<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">

<!– Informando que o DataSource da lista é nosso parâmetro ArrayList–>

<datasetRun subDataset="dataset1">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{listaMinhaClasse})]]></dataSourceExpression>
</datasetRun>

<!– Aqui faremos a iteração da lista –>

<jr:listContents height="157" width="555">
<staticText>
<reportElement x="4" y="10" width="121" height="20"/>
<textElement/>
<text><![CDATA[ID:]]></text>
</staticText>
<staticText>
<reportElement x="4" y="40" width="111" height="20"/>
<textElement/>
<text><![CDATA[NOME:]]></text>
</staticText>

<textField>
<reportElement x="137" y="10" width="398" height="20">
<printWhenExpression><![CDATA[$F{id} != null]]></printWhenExpression>
</reportElement>
<textElement/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="137" y="40" width="398" height="20">
<printWhenExpression><![CDATA[$F{nome} != null]]></printWhenExpression>
</reportElement>
<textElement/>
<textFieldExpression><![CDATA[$F{nome}]]></textFieldExpression>
</textField>

</jr:listContents>
</jr:list>
[/sourcecode]

Escrevi sobre este assunto:

  • porque achei a abordagem de usar o componente jr:list interessante;
  • porque NÃO achei exemplos do uso do jr:list no site do JasperReport (há somente documentação do componente e atributos).

Espero que este código consiga ajudá-lo em seus projetos.

Bysutradi

Dicas para entregar Software com Qualidade

Uma das 9 áreas do conhecimento do PMBOK muitas vezes é a Qualidade, que influencia diretamente as demais áreas, como Custo, por exemplo.

Hoje em dia, a Qualidade é ESSENCIAL para tudo que fazemos na vida, todos os nossos projetos pessoais e profissionais. E claro, nossos clientes esperam de nós a MELHOR qualidade em TODAS as entregas, principalmente na ENTREGA FINAL (o software pronto).

Já que qualidade é essencial, sabido entre as partes e nosso entregável é software, o que temos que fazer para ter entregas de qualidade?

Em primeiro lugar, precisamos entender com nosso cliente o que é entendido por ele como qualidade em software. Software funcionando e com qualidade. Apenas isso é suficiente ou além disso também temos que entregar software com menor número de código duplicado, arquivos fontes compactos, documentados, testados unitariamente, …?

Tendo todas estas premissas mapeadas e negociadas, passe para o próximo ponto: PLANEJAMENTO. Sim, faça um planejamento das ferramentas que utilizará para auxiliar com estas validações. Meça. E meça constantemente e em períodos curtos. Existem vários produtos no mercado (muitos gratuitos) que possuem recursos para coleta e avaliação de código.

Tenha como regra entre os desenvolvedores: se algum problema aparecer e o desenvolvedor não conseguir solucionar em até 2h, chame alguém e programem em par. FUNCIONA. Muitos dos problemas são discutidos e resolvidos em questão de minutos.

Não deixe para realizar estas ações no fim do projeto. Fazendo todas estas ações desde as primeiras linhas de código, você verá que a qualidade tenderá a não ser um problema para seu projeto, não impactando as demais áreas do conhecimento.