...

desenvolvimento de uma ferramenta para construir

by user

on
Category: Documents
4

views

Report

Comments

Transcript

desenvolvimento de uma ferramenta para construir
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
26
DESENVOLVIMENTO DE UMA FERRAMENTA PARA CONSTRUIR DINAMICAMENTE
RELATÓRIOS NO CRYSTAL REPORTS
1
2
Luiz Felipe Stangarlin , Francisco Assis da Silva , Marcelo Vinícius Creres Rosa
2
1
Discente, 2Docente da Faculdade de Informática da UNOESTE, Presidente Prudente, SP.
RESUMO
A utilização de ferramentas sempre foi necessária desde os primórdios da computação, devido ao trabalho
repetitivo da tarefa ou da complexidade em se fazer manualmente. Por isso, ao longo do tempo, surgiram
vários tipos de ferramentas de desenvolvimento. Nos dias de hoje, ferramentas CASE podem gerar diversos
tipos de artefato como formulários, código-fonte, documentação e até diagramas. Porém, quando se trata de
relatórios, o processo ainda é feito pelo desenvolvedor, que precisa criar layout e adicionar os itens que
deseja, montando assim o relatório (artefato). Este trabalho descreve uma ferramenta que gera esse
artefato de software, através da manipulação de objetos da biblioteca de vínculo dinâmico do Crystal Report
(usado para confecção de relatórios). Para gerar o artefato são utilizados templates como base, de onde
são copiadas as informações visuais, que simplificam a definição e melhoram o reuso. A arquitetura
desenvolvida é modular e permite que a ferramenta seja anexada em aplicativos do desenvolvedor ou
funcione conjuntamente com geradores CASE.
Palavras-chave: Artefato de software, gerador de relatório, CASE.
DEVELOPMENT OF A TOOL TO DYNAMICALLY BUILD REPORT IN CRYSTAL REPORTS
ABSTRACT
The use of tools has always been necessary since the beginning of computing, due to repetitive tasks or due
to complexity when they were made manually. Because of this, there were several kinds of development
tools over the time. Nowadays, CASE tools can generate several kinds of artifacts such as forms, source
code, documentation and diagrams. However, the report building process is still done by the developer,
where he needs to create layout and to add the items what he wants, assembling the report (artifact). This
paper describes a tool that generates this software artifact, through the manipulation of objects in the Crystal
Report dynamic link library (used for reporting purposes). To generate the artifact templates are used as a
base from which visual information are copied, which simplify the definition and improve reuse. The
developed architecture is modular and allows the tool to be attached by application developer or to work in
conjunction with CASE generators.
Keywords: Software artifact, report generator, CASE.
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
1. INTRODUÇÃO
27
responsáveis pela geração de relatórios de um
Desde a “crise do software” (RANDELL,
sistema de aplicativos empresariais. Aplicativos
1996) em meados da década de 60, e o
empresariais
surgimento da engenharia do software, métodos e
processamento-saída. A entrada é obtida com o
técnicas vem sendo desenvolvidos para o reuso e
uso de formulários, enquanto que a saída é obtida
reaproveitamento de software com o intuito de
por
evitar os tradicionais problemas que afetam o
(formulários)
desenvolvimento de software como estouro de
geralmente
prazos, orçamentos, falta de qualidade, software
através do uso de ferramentas RAD (Rapid
que não realiza o esperado e alto custo de
Application
manutenção. É nesse panorama que surge a
componentes são unidos através de linguagens
1
geração de artefatos e o reuso de componentes.
A geração de artefatos é uma forma de
meio
são
de
constituídos
relatórios.
quanto
são
a
criados
de
entrada-
Tanto
a
saída
(relatórios),
pelo
Development).
entrada
desenvolvedor
Todos
os
da quarta geração e linguagens de script
(SOMMERVILLE, 2007).
reuso, pois consolida o conhecimento em um
RAD são ferramentas que automatizam a
gerador (BIGGERSTAFF, 1988), este que pode
conversão
ser
chamadas do sistema operacional. O artefato
reutilizado
para
gerar
automaticamente
representação
confecção
autores
desenvolvedor, porém sem o uso da ferramenta
FRAKES;
RAD, o desenvolvedor precisaria escrever código
(KRUEGER,
1992;
GRISS,
Vários
1995;
para
que o uso de reutilização em alto nível gera
operacional. O que elevaria ainda mais a
maiores benefícios do que o simples reuso em
quantidade de trabalho necessário por parte do
código-fonte. Segundo Levy (1986), quando o
desenvolvedor. Como o artefato está intimamente
custo de desenvolver e manter manualmente a
relacionado com a modelagem do problema, é
multiplicidade de artefatos é maior que o custo de
possível gerar o artefato de forma automática
desenvolver e manter um gerador, é possível
quando se tem conhecimento do domínio. Desta
obter uma redução do custo total com o uso de
forma
um gerador, apesar do investimento inicial.
representado pelo esquema do banco de dados,
Conforme Czarnecki e Eisenecker (1999), o
possibilita a um gerador criar todos os artefatos
gerador de aplicação funciona quando se tem
de relatórios. Diminuindo o esforço necessário do
uma linha de produtos em comum, ou quando é
desenvolvedor, que fica livre para focar em
possível modelar o conhecimento da configuração
aspectos mais importantes com a modelagem do
de forma que descreva os artefatos que serão
domínio.
conhecimento da configuração.
o
as
chamadas
conhecimento
da
do
pelo
ISODA, 1994; JACOBSON et al., 1997) ressaltam
criados, ou quando o gerador implementa o
efetuar
manualmente
em
ainda
software.
produzido
(artefato)
diversos componentes que são necessários para
do
é
da
sistema
configuração,
As demais seções deste trabalho estão
organizadas da seguinte maneira: na seção 2 são
Com esse intuito foi desenvolvido uma
apresentados os passos para a geração de
ferramenta que possibilite a geração dos artefatos
artefatos referentes aos termos encontrados na
literatura; na seção 3 é descrito sucintamente o
1
Um artefato é qualquer item criado como parte da definição,
manutenção ou utilização de um processo de software. Inclui
entre outros, descrições de processo, planos, procedimentos,
especificações, projeto de arquitetura, projeto detalhado,
código, documentação para o usuário. Artefatos podem ou
não ser entregues a um cliente ou usuário final (STAA, 2000).
gerador de relatórios proposto neste trabalho,
demonstrando todas as etapas para criar um
arquivo do Crystal Reports, contendo o acesso ao
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
28
esquema do banco de dados, a descrição do
base para copiar a descrição visual do artefato
componente central do gerador e o sistema de
que será gerado. Entende-se por descrição visual
templating, utilizado para prover reaproveitamento
fontes, tipo de texto, formatação de caracteres,
de partes comuns a vários relatórios; na seção 4
campos especiais como data/hora da emissão e
é
usuário
até mesmo a logomarca da empresa. Os
demonstrando a ferramenta desenvolvida; e por
templates são expandidos através de cópia de
fim, na seção 8 são apresentadas as conclusões
acordo com o visual que está sendo gerado. De
e considerações finais do trabalho.
acordo com o domínio da aplicação pode-se
apresentada
a
interface
com
o
combinar modelos da aplicação para gerar os
2. GERADOR DE ARTEFATOS
artefatos (WEISS; LAI, 1999).
Segundo Donegan (2008) e Cleaveland
3. Definição de modelo: determinar um
(1988), uma abordagem detalhada para construir
modelo matemático para que o gerador seja mais
geradores de artefatos possui os seguintes
compreensível, consistente e completo, pois cada
passos:
característica poderá ser explicada em termos do
1. Reconhecimento
domínio:
modelo. As boas práticas de engenharia do
reconhecer onde um gerador deve ser usado é o
software foram utilizadas possibilitando que a
passo
pelo
ferramenta fosse mais compreensível, pois neste
reconhecimento de padrões que ocorram no
caso foi aproveitada a definição formal já
código ou em artefatos de mais alto nível de
existente no esquema do banco de dados.
mais
difícil,
uma
de
forma
é
abstração. No caso deste trabalho, os relatórios
4. Definição de partes fixas e variáveis:
contém alta taxa de padrões que repetem com os
definir as partes que estarão sob o controle do
padrões definidos no esquema do banco de
projetista do sistema (variáveis) e as partes que
dados. Muitos relatórios são obtidos diretamente
não poderão ser alteradas (fixas). As partes
de entidades do banco de dados, como tabelas.
variáveis
Raros são os casos de relatórios que são
especificação do sistema, enquanto as partes
arbitrariamente
fixas são assertivas fixas do domínio ou da
definidos
sem
que
exista
correspondem
implementação.
dados, exceto quando o banco de dados foi mal
escolher quais partes do modelo (esquema do
projetado ou não atende aos requisitos do
banco de dados) serão utilizadas para compor o
sistema. E, para outros casos, podem ser
relatório. Os templates podem ser substituídos
utilizadas visualizações virtuais que auxiliam o
pelo desenvolvedor. A ferramenta assume que o
gerador a compreender a estrutura do banco de
modelo foi bem construído, e que o usuário
dados.
conheça
2. Definição de fronteiras de domínios:
questionado
desenvolvedor
à
concretamente seu tipo, ou tabela no banco de
o
O
geralmente
domínio
no
dos
momento
dados,
da
poderá
pois
será
seleção
dos
determinar o alcance do gerador, sabendo quais
relacionamentos entre as entidades do banco de
características devem ser incluídas ou excluídas.
dados.
O gerador trabalha com a saída do sistema
5. Definição da entrada da especificação:
utilizando o modelo de domínio, representado no
as entradas das especificações podem ser feitas
esquema do banco de dados. Possui como
de forma interativa, em que o usuário seleciona
característica gerar os artefatos de relatórios
as
através de um arquivo guia no formato XML
escolhas em uma sequência de formulários ou
(FRANCA, 2002), usando templates visuais como
menus, ou podem ser especificadas de forma
características
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
desejadas
por
meio
de
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
29
gráfica ou textual. A ferramenta suporta que a
software e princípios de reuso na construção de
especificação seja feita de forma interativa ou
componentes (SOMMERVILLE, 2007). O núcleo
textualmente através da criação de um arquivo
do gerador, que possui o comportamento da
XRPT. Esta ferramenta pode ser reutilizada como
ferramenta é uma biblioteca de vinculação
componente, pois possui uma interface de
dinâmica extensível e contém hot-spots para
programação,
desenvolvedor
anexar comportamento extra. Hot-spot é um
manipular a ferramenta através de código, para
ponto que define o que é variável em um domínio
gerar os artefatos de relatórios (SOMMERVILLE,
de aplicação (BUSCHMANN et al., 1996).
permitindo
ao
2007).
3. DESCRIÇÃO DO GERADOR
6. Definição dos produtos: definir o tipo
de produto do gerador, podendo ser de diversos
Para a confecção da parte visual do
tipos, como um programa, documentação ou
relatório utilizam-se ferramentas do tipo do
dados de teste. Como já foi elucidado, esse
Crystal Reports, que usando uma especificação
gerador vai gerar artefatos de programa, no caso,
(artefato) e os dados obtidos do gerenciador de
relatórios.
banco de dados compõe o relatório. A ferramenta
7. Implementação do gerador: consiste
desenvolvida
trabalha
na
construção
na escrita do programa que traduz a linguagem
automatizada dessa parte visual, ou seja, trabalha
da especificação no produto desejado, podendo
na criação deste tipo de artefato responsável pela
ser usada uma ferramenta de desenvolvimento. O
geração do relatório. O esquema mostrado na
gerador
Figura 1 mostra o funcionamento básico da
foi
desenvolvido
na
linguagem
de
programação C# do .Net Framework usando
ferramenta.
princípios e boas práticas da engenharia do
rpt
Gerador
xrpt
Crystal
Metadados
Relatório
Dados
Figura 1. Esquema básico de funcionamento da ferramenta.
O esquema apresentado na Figura 1
principais módulos, que serão descritos nas
seções
artefatos, segundo a literatura especializada
"CRAXDRT.Report" representa o componente
(BALZER,
RDC (Report Design Component) do Crystal
1999;
1989;
MASIERO;
BATORY;
MEIRA,
SMARAGDAKIS,
1993).
Um
dos
seguintes.
O
Namespace
2
segue uma arquitetura padrão para geradores de
Reports (PEEK, 2008).
objetivos é que a arquitetura seja aberta e
extensível, para que o desenvolvedor possa
adaptar o gerador a suas necessidades. Para
isso, foi utilizado uma arquitetura de componente
semelhante à descrita por Franca (2002).
A
Figura
2
apresenta
uma
2
visão
superficial da estrutura do gerador e de seus
Namespace é um espaço lógico onde se agrupam várias
classes que funcionam conjuntamente ou se relacionam ao
mesmo assunto e que estão dentro de um mesmo módulo ou
biblioteca de vinculação dinâmica.
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
30
Configuração
Motor
Esquema
Persistência
(.xrpt)
CRAXDRT.Report(.rpt)
System.Data
(ado+)
Figura 2. Diagrama Estrutural do gerador.
arquivo
opcionais, e os itens com o asterisco “*” podem
denominado XRPT e produz um artefato do
ser repetidos. A interface de usuário precisa
Crystal Reports, que é um arquivo de formato
persistir os dados que foram definidos pelo
binário e possui a extensão RPT (PEEK, 2008).
desenvolvedor, portanto, foi desenvolvido esse
O
gerador
consome
um
O arquivo RPT representa a saída do
layout
de
arquivo
para
representar
essa
gerador e para ser criado o gerador acessa a
informação. O fato de ser um arquivo XML
biblioteca de vinculação dinâmica RDC (PEEK,
permite que outros programas chamem o gerador
2008) fornecida junto com o Crystal Reports. O
pela linha de comando somente passando esse
diagrama do modelo de objeto da biblioteca está
arquivo, sem qualquer interação por interface de
definido na Figura 3. O modelo segue um padrão
usuário.
orientado a objetos onde objetos são criados e
gerador como biblioteca de vinculação dinâmica
métodos são acionados para gerar o artefato em
em seu programa, é possível salvar esse arquivo
formato binário.
utilizando somente objetos, sem que seja preciso
O arquivo XRPT representa a entrada do
Caso
o
desenvolvedor
escrever código para gerar o XML.
gerador. Esse arquivo segue o padrão XML, um
exemplo de sua estrutura está definido na Figura
4. Os itens que estão entre chaves “[ ]” são
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
adicione
o
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
Figura 3. Crystal Reports Designer Object Model - RDC. Algumas partes não utilizadas nesse trabalho
foram omitidas.
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
31
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
32
<?xml version="1.0" encoding="utf-8"?>
<Gerador>
<BancoDados>
<Conexao>
<DataSource>.\sqlexpress</DataSource>
<PersistSecurityInfo>Boolean</PersistSecurityInfo>
<UserID></UserID>
<Password></Password>
<InitialCatalog>NomeBancoDados</InitialCatalog>
<IntegratedSecurity>Boolean</IntegratedSecurity>
</Conexao>
<Colunas><Coluna*>NomeColuna</Coluna></Colunas>
<Tabelas><Tabela*>NomeTabela</Tabela></Tabelas>
<Relacoes><Relacao*>NomeRelacao</Relacao></Relacoes>
</BancoDados>
[<ColunaLargura>
<Retangulos>
<Retangulo*>
<Colunas><Coluna*>NomeColuna</Coluna></Colunas>
<Auto>Boolean</Auto><Visivel>Boolean</Visivel><Percent>Boolean</Percent>
</Retangulo>
</Retangulos>
</ColunaLargura>]
<Posicionamento>
<Esquerda>Double</Esquerda><EspacoHorizonatal>Double</EspacoHorizonatal>
<EspacoVertical>Double</EspacoVertical><Justificado>Booelan</Justificado>
<Tipo>Tabela or Formulario</Tipo>
[<Tabela><Quebrar>Boolean</Quebrar></Tabela>]
[<Formulario><Linhas>Integer</Linhas><Colunas>Integer</Colunas></Formulario>]
</Posicionamento>
<Cabecalho>
<Titulo>TituloRelatorio</Titulo>
<Secao><Nome>ReportHeader</Nome><Estilo>LayoutFormatacao</Estilo></Secao>
</Cabecalho>
<Detalhe>
<Secao><Nome>Details</Nome><Estilo>LayoutFormatacao</Estilo></Secao>
</Detalhe>
<Agrupamentos>
<Grupo*>
<Estilo>Simples</Estilo>
<Coluna>NomeColunaAgrupar</Coluna>
<Condicao>Qualquer</Condicao>
<Ordem>Ascendente</Ordem>
<Posicionamento>Igual o definido Anteriormente</Posicionamento>
<Colunas><Coluna*>NomeColunaExibir</Coluna></Colunas>
</Grupo>
</Agrupamentos>
<Rodape>
<Secao><Nome>ReportFooter</Nome><Estilo>LayoutFormatacao</Estilo></Secao>
</Rodape>
</Gerador>
Figura 4. Exemplo de um arquivo XRPT.
3.1.
Criação de um arquivo do Crystal
campo de texto para cada coluna de cada tabela
Reports
especificada na lista "Tables" (linha 22), e não
Para criar um arquivo RPT é necessário
leva em consideração o posicionamento e a
manipular a biblioteca RDC, a Figura 5 contém
formatação. Também é demonstrado como a
um exemplo de uso dessa biblioteca. Este
conexão com o banco de dados deve ser
exemplo cria um relatório com um titulo e um
inicializada para que funcione corretamente, de
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
acordo com o manual do RDC (PEEK, 2008).
33
classes e métodos que correspondem ao RDC.
Foram destacados em negrito na Figura 5 as
1 public void Gerar(string ArquivoDestino)
2 {
3
ApplicationClass app = new ApplicationClass();
4
Report report = app.NewReport();
5
6
System.Data.SqlClient.SqlConnectionStringBuilder conn = new
7
System.Data.SqlClient.SqlConnectionStringBuilder(Tables[0].ConnectionString);
8
String curdir =
9
System.Reflection.Assembly.GetAssembly(typeof(ApplicationClass)).Location;
10 System.IO.FileInfo path = new System.IO.FileInfo(curdir);
11
String dll = System.IO.Path.Combine(path.DirectoryName, "p2soledb.dll");
12 System.Data.OleDb.OleDbConnectionStringBuilder cns = new
13
System.Data.OleDb.OleDbConnectionStringBuilder();
14 cns.Provider = "SQLOLEDB.1";
15 cns.DataSource = conn.DataSource;
16 cns.PersistSecurityInfo = conn.PersistSecurityInfo;
17 cns.Add("User ID", conn.UserID);
18 cns.Add("Password", conn.Password);
19 cns.Add("Initial Catalog", conn.InitialCatalog);
20 cns.Add("Integrated Security", conn.IntegratedSecurity ? "SSPI" : null);
21
22 foreach (Table table in Tables)
23 {
24
report.Database.AddOLEDBSource(cns.ConnectionString, table.Name);
25 }
26 report.ReportTitle = Header.Texto;
27 report.ReportComments = "Generated by tool";
28 //area 1 report header, 2 page header, 3 details, 4 page footer, 5 report footer
29 report.Areas[1].Sections[1].AddTextObject(report.ReportTitle, 0, 0, null);
30
31 foreach (Table table in Tables)
32 {
33
DatabaseTable crTable = report.Database.Tables[Tables.IndexOf(table) + 1];
34
int left = 0;
35
foreach (Column column in table.Columns)
36
{
37
DatabaseFieldDefinition crField =
38
crTable.Fields[table.Columns.IndexOf(column) + 1];
39
TextObject label = report.Areas[2].Sections[1].AddTextObject(column.Name,
40
left, 0, null);
41
FieldObject field = report.Areas[3].Sections[1].AddFieldObject(crField,
42
left, 0);
43
label.Width = 1000;
44
field.Width = 1000;
45
left += 1200;
46
}
47 }
48 report.Save(ArquivoDestino);
49}
Figura 5. Gerando um RPT.
3.2.
Acesso ao esquema do banco de dados
Para
a
geração
automatizada
mecanismo funciona através de uma interface de
dos
programação e permite que qualquer banco de
artefatos à partir do modelo é necessário o
dados para o qual existe o provedor OLEDB seja
conhecimento do esquema do banco de dados,
utilizado. Porém, devido a utilização direta de um
para isso foi escolhido utilizar o mecanismo do
provedor OLEDB ser complexa, optou-se por
provedor de dados OLEDB (NILSEN, 2009). Este
utilizar uma abstração provida pela biblioteca
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
34
ADO+ disponível no .Net Framework da Microsoft
conforme o Figura 6. Foram destacados em
(STELLMAN,
negrito as classes e os métodos do ADO+ na
2008).
Dessa
forma,
foi
desenvolvido o seguinte código para recuperar
Figura 6.
informações do esquema de um banco de dados,
1 protected DataTable LoadSchema(Guid collectionguid, string collectionName,
2
string RestrictionName, string RestrictionValue)
3 {
4
using (OleDbConnection connection = new
5
OleDbConnection(this.FindConnectionString().OleDb.ToString()))
6
{
7
connection.Open();
8
DataTable items;
9
if (RestrictionValue == null || RestrictionValue == null)
10
{
11
items = connection.GetOleDbSchemaTable(collectionguid, null);
12
}
13
else
14
{
15
DataTable metacollections = connection.GetSchema();
16
DataTable restrictions = connection.GetSchema("Restrictions");
17
string filtercollection = "CollectionName = '" +
18
CollectionName.Replace("_", "") + "'";
19
string filterrestriction = filtercollection + " AND RestrictionName = '" +
20
RestrictionName + "'";
21
DataRow collection = metacollections.Select(filtercollection)[0];
22
DataRow restriction = restrictions.Select(filterrestriction)[0];
23
int numparam = (int)collection["NumberOfRestrictions"];
24
int ixparam = (int)restriction["RestrictionNumber"];
25
string[] param = new string[numparam];
26
param[ixparam - 1] = RestrictionValue.Split('.').Last();
27
items = connection.GetOleDbSchemaTable(collectionguid, param);
29
}
30
return items;
31 }
32}
Figura 6. Recuperando o esquema de um banco de dados.
A função que realmente efetua a leitura
de acordo com o "Guid". Para efetuar esse
do esquema é a "GetOleDbSchemaTable" (linhas
cálculo, existe uma tabela de metadados do
11 e 27) e para ler as informações do esquema é
esquema, que é o esquema do esquema. Esta
necessário
de
tabela é simples e contém o nome do "Guid", o
informações podem ser utilizadas. Cada tabela de
número de restrições, o índice da restrição e o
informação é identificada por um número único
nome da restrição. Com base nesses dados é
global "Guid" (linha 1), um exemplo de tabela de
possível efetuar uma consulta ao esquema do
informação seria quais colunas uma tabela
banco de dados. Um exemplo de restrição seria o
possui, ou que relacionamentos uma tabela tem
nome da tabela ao procurar as colunas de uma
com outras tabelas. Ao chamar a função sem
tabela. A obtenção dessas informações e a
parâmetros todas as informações sobre o banco
escolha da biblioteca mais adequada ao trabalho
de dados são retornadas. Para resolver esse
constituiu uma das etapas de maior uso de tempo
problema é feito o uso de restrições, que são um
devido a extensa experimentação e testes que
array contendo valores de restrições. A posição
foram necessários.
conhecer
quais
as
tabelas
da restrição desejada no array deve ser calculada
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
3.2.1.
Representação do esquema
Após
a
obtenção
do
35
Possibilita o uso de recursão no acesso aos
esquema,
os
dados
do
esquema,
simplificando
o
metadados devem ser representados de uma
desenvolvimento da ferramenta. Todas as classes
forma que possibilite o fácil entendimento e uso
derivadas de "SchemaItem" representam alguma
pelo gerador. Devido a esse motivo foi modelado
parte do esquema e o comportamento descrito
o conjunto de classes representado na Figura 7.
anteriormente é reutilizado em cada uma das
Foi feito o uso do padrão de projeto Composite
classes
(GAMMA et al., 1995) que é utilizado sempre que
"LoadSchema", que é sobrescrito nas classes
é necessário representar elementos que são
derivadas e completado com o "Guid" necessário.
compostos
por
outros
elementos
através
da
herança
do
método
similares.
pkg
SchemaItem
SchemaParent
- Loaded
- Name
SchemaItems
+ FindConnectionString()
# FindParentByType()
# FindSubItemByName()
+ Load()
# LoadSchema()
BancoDados
Server
- ConnectionString
+ FindConnectionString()
+ Load()
- ConnectionString
- RelationShips
+ FindConnectionString()
+ Load()
Table
ForeignTable
+ Load() : void
PrimaryTable
Relationship
Column
- ForeignKeyName
- ForeignTableName
- PrimaryKeyName
- PrimaryTableName
PrimaryKey
- Length
- Type
ForeignKey
+ Load()
View
+ Load()
RecordSet
Stored Procedure
Parameter
- Index
- In
- Out
- Return
+ Load()
+ Load()
Figura 7. Representação OO do esquema do banco de dados (Gerador.Esquema).
3.3.
Motor de Geração
A classe "Report" contém a referência ao
O componente central do gerador de
objeto do RDC e representa o relatório que está
artefato é o motor. Ele é o componente
sendo construído. O "SchemaManager" é o
responsável por consultar o esquema, ler as
responsável por manter listas de objetos do
informações do XRPT e manipular o componente
esquema (Gerador.Esquema) que representam a
RDC, gerando o arquivo de saída RPT. A Figura
entrada de informações no gerador. Esta lista de
8 detalha as principais classes envolvidas no
objetos é manipulada pela interface gráfica, pelo
controle
é
desenvolvedor ou pelo componente responsável
implementado como uma biblioteca de vinculação
pela leitura e escrita do arquivo XRPT (esse
dinâmica, e pode ser utilizado por qualquer
componente foi omitido na Figura 8).
desse comportamento. O motor
linguagem de programação do .Net Framework.
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
36
pkg
Report
- Flow
WidthGatherer
FlowRectangle
- Auto
- DetailLeft
- DetailTop
- DetailWidth
- DetailHeight
- DetailWidthFlowValue
- HeaderLeft
- HeaderTop
- HeaderWidth
- HeaderHeight
- HeaderWidthFlowValue
- Percent
- SampleCharCount
- Visible
+ AddGroup()
+ LoadDefinition()
+ Make()
+ Report()
+ SaveDefinition()
SchemaManager
~ AllColumns
- Columns
~ GroupColumns
- RecordSets
- Relationships
~ AreaIndex
- Title
+ Clear()
+ FindConnectionString()
+ Validate()
FlowFormatterForm
Group
Header
~ AreaIndex
- Columns
- CrGroupId
- Flow
- FlowBehavior
- GroupColumn
- GroupCondition
- GroupOrder
Detail
Footer
~ AreaIndex
~ AreaIndex
FlowFormatter
- Cols
- Rows
- HorizontalGap
- VerticalGap
- Justify
- LeftPosition
- TopPositon
- Rectangles
Section
Style
~ AreaIndex
~ Report
FlowFormatterTable
~ SectionName
- TemplateName
~ CopySections()
~ CopyTemplate()
~ GetTemplateObjects()
~ Process()
- Wrap
+ GetTemplates()
~ OpenTemplate()
Figura 8. Diagrama de classes do motor do gerador (Gerador.Motor).
O "FlowFormatter" e derivados é o
as colunas do "WidthGatherer", manter um
componente responsável pelo posicionamento de
contador de posição X e Y. Ao percorrer a
cada objeto na parte visual do relatório. O padrão
próxima coluna, acumula-se a largura no contador
3
de orientação a objetos utilizado foi o Strategy e
X, e ao ficar maior que a largura da seção,
permite que o comportamento seja
trocado
incrementa-se o contador Y caso o "Wrap" esteja
conforme a necessidade do desenvolvedor. Como
ativo, caso contrário, os retângulos são gerados
4
a classe não possui o tipificador Sealed , é
com a propriedade "Visible" em falso. Então se
possível ao desenvolvedor usar a herança para
aplica o valor de X e Y em "*Left" ou "*Top",
agregar novos comportamentos à ferramenta
respectivamente.
através da injeção de uma classe derivada na
posicionamento no "Header" ou "Detail", ambos
propriedade "FlowBehavior" da classe "Report"
devem
provendo um ponto de extensibilidade (Hot-spot).
comportamento serão iguais.
Todo o comportamento de posicionamento é
aplicado para cada seção do relatório.
ser
O
asterisco
calculados
e
no
representa
caso
o
desse
O Comportamento "FlowFormatterForm"
gera um formulário semelhante a um formulário
O Comportamento "FlowFormatterTable"
de cadastro de um sistema. Em que o valor segue
gera uma tabela semelhante a uma tabela do
o nome da coluna utilizando uma linha para cada
Microsoft
coluna. O funcionamento é semelhante ao
Excel,
o
funcionamento
desse
comportamento consiste basicamente em obter
comportamento
"FlowFormatterTable",
são
utilizados contadores com a diferença que é
3
Strategy é um padrão de projeto que permite que uma
família de algoritmos seja utilizada de modo independente e
seletivo. Padrões de projeto para arquitetura de software são
soluções de eficiência já comprovadas e amplamente
utilizadas para a resolução de problemas comuns em projeto
de software (GAMMA et al., 1995).
4
Sealed é uma classe cuja herança foi bloqueada pelo
desenvolvedor da classe, não permitindo mais que outras
classes herdem da classe selada (STELLMAN, 2008).
necessário manter uma estrutura de dados com
as larguras de cada coluna visual. E para a
criação de outros comportamentos, é utilizado
esse mesmo esquema, mudando somente o
cálculo do "*Left" e "*Top".
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
sobre
37
Responsável pela amostragem estatística
como data/hora da emissão e logotipos ou
os
figuras.
dados
do
banco
de
dados,
o
componente "WidthGatherer" é utilizado para
inferir a largura das colunas em um relatório, essa
3.4.
Sistema de templating
coluna
O sistema de templates do gerador é o
"SampleCharCount". O componente segue o
mecanismo que garante o funcionamento das
padrão Strategy, e pode ser estendido através da
principais
injeção
sistema de template e posicionamento automático
informação
é
de
armazenada
um
"WidthGatherer"
derivado
na
objeto
propriedade
da
ferramenta.
O
são responsáveis pelo ganho de tempo no
componente é opaco e não possui nenhuma
desenvolvimento de relatórios, pois permite o
propriedade
reaproveitamento de partes comuns a vários
importante
com
as
"Report".
características
Este
retângulos
do
na
exceto
larguras
a
lista
das
de
colunas
selecionadas no "SchemaManager". A lista de
relatórios e a parte visual da formatação.
O designer do Crystal Reports também
pelo
fornece a capacidade de escolher um template
"WidthGatherer", mas nem todas as propriedades
básico, porém, só é possível utilizar da primeira
do retângulo precisam ser preenchidas, deixando
vez, e ao tentar substituir o template depois do
essa
posicionador
relatório criado, o posicionamento é perdido e
"FlowFormatter". A única estratégia disponível
deve ser refeito manualmente. Além disso,
efetua o cálculo da largura de cada coluna
constitui
utilizando uma amostra de 10% dos dados,
necessário efetuar o mesmo procedimento para
calculando o máximo de caracteres na coluna e
cada relatório do sistema.
retângulos
deve
função
a
ser
cargo
inicializada
do
uma
tarefa
árdua
devido
a
ser
multiplicando o valor pela média de largura de
Por causa dessa dificuldade, o sistema de
cada caractere da fonte escolhida pelo estilo do
template extensível foi desenvolvido. Diferente do
template selecionado.
sistema do Crystal, este utiliza outro arquivo RPT
Um relatório pode conter várias seções,
que
são
quebras
com
que são iguais entre todos os relatórios. O
comportamento de geração diferentes. Todo
sistema de template separa o relatório em duas
relatório sempre possui um cabeçalho, um rodapé
camadas, que são a descrição visual básica e a
e uma seção detalhe, que é a parte que se repete
descrição comportamental XRPT, permitindo um
várias vezes de acordo com os dados. O relatório
reaproveitamento mais eficiente dos esforços do
também possui agrupamentos, que são quebras
desenvolvedor. Inclusive e possível que um
entre a seção detalhe, e servem para agrupar
mesmo sistema tenha um conjunto de RPTs de
várias seções detalhe sobre o mesmo argumento.
template para cada cliente, o que aumenta o
Um grupo também é uma seção detalhe, e vários
ganho da ferramenta ainda mais, pois cada
grupos
cliente sempre tem
podem
ser
lógicas
ou
combinados
áreas
como template. E esse arquivo contém as partes
em
uma
hierarquia. O grupo é representado pela classe
"Group" e a seção é pela classe "Section".
uma preferência
visual
diferente.
Para o funcionamento do gerador, o
Uma importante propriedade da classe
sistema de templating fornece métodos para que
"Section" é o "Style". O "Style" representa o
informações visuais sobre o template sejam
template visual utilizado na geração de toda a
obtidas. O sistema de templating é implementado
descrição visual como fontes, tipo de texto,
pela classe "Style", cuja referencia é gerenciada
formatação de caracteres, campos especiais
pela classe "Section". Portanto, para cada seção
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
38
do relatório é possível utilizar um template
elementos. O título da coluna é copiado várias
diferente.
vezes em "a", e o campo do banco de dados
A Figura 9 contém um exemplo de um
template visual e a Figura 10, um exemplo da
também é copiado em "b" de acordo com dados
lidos do esquema.
expansão do template através da cópia de
Figura 9. Template utilizado.
Figura 10. Expansão do template.
São fornecidos na classe "Style" métodos
que efetuam a cópia dos objetos do template para
dados são definidas de acordo com dados do
esquema.
O sistema de templating é o componente
o relatório novo que está sendo gerado. A cópia é
efetuada chamando métodos RDC para criar
do
gerador
que
novos objetos na árvore de objetos do relatório
relacionado com o RDC. Caso fosse utilizada
novo, depois são copiados todos os valores de
outra ferramenta de confecção de relatórios, esse
propriedade do objeto do template para o objeto
seria o principal componente afetado, os outros
novo. Após a cópia referente aos objetos que
componentes seriam as classes "Section".
referenciam colunas do banco de dados, as
propriedades referentes à ligação com o banco de
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
está
mais
intimamente
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
4. INTERFACE COM O USUÁRIO
39
permite ver em tempo real as alterações feitas no
A Figura 11 apresenta a interface do
template.
usuário (UI). A interface representa o arquivo
A Figura 12 mostra um código fonte de
XRPT, com ela o usuário pode criar visualmente o
exemplo de utilização da biblioteca do gerador de
relatório sem se preocupar com arquivos e
relatórios. Nesse exemplo, é criado um relatório
formatos. A UI importa a biblioteca do motor do
contendo as informações necessárias para formar
gerador e a manipula para construir tanto o XRPT
o relatório demonstrado na Figura 13.
quanto o RPT. O usuário pode criar um novo
XRPT ou carregar um arquivo deste previamente
armazenado, também é possível especificar onde
o gerador vai armazenar o RPT.
Apesar da UI ser um executável, ela
também é uma biblioteca de vinculação dinâmica,
pois todas suas classes estão exportadas com o
5
tipificador Public . Além
disso, cada objeto
referente a parte do XRPT dispara eventos que
podem
ser
usados
para
anexar
um
comportamento extra, pois também são pontos de
extensibilidade. Essa é a principal diferença em
relação ao wizard do Crystal Reports que é
fechado, apesar do RDC permitir esse tipo de
uso, o wizard não o permite. E esse conceito foi
utilizado para permitir ao desenvolvedor anexar a
interface de usuário do gerador em seu sistema
facilmente, possibilitando que um usuário com
conhecimento do domínio utilize a ferramenta
também.
Outra diferença em relação ao wizard do
Crystal Reports é o sistema de templates
evidenciado
pelas
caixas
de
combinações
"Formato", que dão acesso aos arquivos de
template
para
cada
seção.
A
interface
desenvolvida é bem mais simples e fácil de
operar que o wizard do Crystal Reports. A UI
também é menos obstrutiva, já que o Crystal
6
Reports tem um popup modal que fica sob a tela
do relatório, obstruindo a visão do relatório e não
5
Public permite que qualquer classe de dentro ou de fora do
programa utilize a classe (STELLMAN, 2008).
6
popup é uma janela que flutua sobre as outras, e modal é um
termo utilizado em interfaces com usuário e significa que a
janela bloqueia o acesso a todas as outras janelas do sistema
quando é aberta.
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
40
Figura 11. Interface do Usuário (UI).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Report rpt = new Report();
rpt.Header.Title = "Produtos";
Server server = new Server(".\\sql2008", null,
server.Load();
Database database = server.Databases.Find(d =>
database.Load();
Table table = database.Tables.Find(t => t.Name
table.Load();
rpt.Schema.RecordSets.Add(table);
rpt.Schema.Columns.Add(table.Columns.Find(c =>
rpt.Schema.Columns.Add(table.Columns.Find(c =>
null);
d.Name == "BancoDados");
== "dbo.Produto");
c.Name == "Codigo"));
c.Name == "Nome"));
rpt.Flow = FlowBehavior.Form;
rpt.Header.FormatStyle.TemplateName = "Arial";
rpt.Detail.FormatStyle.TemplateName = "Small";
rpt.Footer.FormatStyle.TemplateName = "Teste";
rpt.Make("report.rpt");
rpt.SaveDefinition("report.xrpt");
Vizualiza f2 = new Vizualiza();
f2.ShowDialog("report.rpt", server.ConnectionString.Sql);
Figura 12. Código fonte que demonstra o uso da biblioteca do Gerador.
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
41
Figura 13. Relatório gerado automaticamente.
5. CONCLUSÕES
Com
demonstrar
REFERÊNCIAS
esse
como
trabalho
uma
foi
possível
ferramenta
para
a
BALZER, R. A fifteen-year perspective on
automatic programming. Addison-Wesley/ACM
Press, p.289-311, 1989.
confecção de relatórios pode ser utilizada como
um gerador CASE através da manipulação de
BATORY, D.; SMARAGDAKIS, Y. Application
Generators. John Wiley and Sons, 1999.
árvores de objetos. Apesar do alto nível na
utilização dos objetos para leitura do esquema e
BIGGERSTAFF, T. J. A Perspective of Generative
Reuse. Annals of Software, p.169-226, 1988.
criação do relatório, o nível de complexidade na
manipulação
dessas
árvores
de
objetos
é
semelhante ao enfrentado pelos geradores CASE
BUSCHMANN, F. et al. Pattern-Oriented
Software Architecture Volume 1: A System of
Patterns. John Wiley & Sons, 1996.
7
de código fonte ao trabalhar com árvores AST .
Ao utilizar um arquivo de padrão aberto
XRPT, é possível que o Gerador seja integrado
para trabalhar junto com outras ferramentas
CASE que geram código fonte e formulários de
CLEAVELAND, J. C. Building application
generators. IEEE Software, v.7, n.1, p.25-33,
1988.
CZARNECKI, K.; EISENECKER, U. Components
and Generative Programming. Acmd Sigsoft,
1999.
entrada de dados, pois elas podem gerar o XRPT
a partir de seu modelo. Também é possível
integrar o gerador usando programação, pois o
gerador é uma biblioteca de vinculação dinâmica.
DONEGAN, P. M. Geração de famílias de
produtos de software com arquitetura baseada
em componentes. São Carlos, 2008.
FRAKES, S.; ISODA, S. Success factors of
systematic software reuse. IEEE Software, v.11,
n.1, p.14-19, 1994.
FRANCA, L. P. A. Uma Arquitetura Aberta para
Geradores de Artefatos. XVI Simpósio Brasileiro
de Engenharia de Software, p. 44-46, 2002.
7
AST significa Abstract Sintax Tree, são estruturas de dados
em formato de árvore utilizados por geradores e compiladores
(FRANCA, 2002).
GAMMA, E. et al. Design Patterns: Elements of
Reusable Object-Oriented Software. 1 ed.
Addison-Wesley, 1995.
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
FERRAMENTA PARA CONSTRUIR RELATÓRIOS NO CRYSTAL REPORTS
GRISS, M. Making software reuse work at
hewlett-packard. IEEE Software, v.12, n.1, p.
105-107, 1995.
JACOBSON, I.; GRISS, M.; JONSSON, P.
Reuse-driven Software Engineering Business.
Addison-Wesley, 1997.
KRUEGER, C. Software reuse. ACM Computing
Surveys, v.24, n.2, p.131-183, 1992.
LEVY, L. A Metaprogramming Method and Its
Economic Justification. IEEE Transactions on
Software Engineering, v.12, n.2, p.272-277,
1986.
MASIERO, P. C.; MEIRA, C. A. Development and
Instantiation of a Generic Application Generator.
Journal of Systems and Software, p.27-37,
1993.
NILSEN, P. Microsoft SQL Server 2008 Bible.
Wiley, 2009.
PEEK, G. Crystal Reports 2008: The Complete
Reference. McGraw-Hill Osborne Media, 2008. 50
p.
RANDELL, B. The 1968/69 nato software
engineering reports. In History of Software
Engineering. 1996.
SOMMERVILLE, I. Software Enginnering. 8.ed.,
Addison-Wesley, 2007.
STAA, A. V. Programação Modular. 2000.
STELLMAN, A. Use a cabeça C#. Rio de Janeiro:
Alta Books, 2008.
WEISS, D.; LAI, C. Software Product-line
Engineering:
a
Family-based
Software
Development.
Addison-Wesley
Longman
Publishing Co., 1999.
Recebido em: 05/06/2013
Revisado em: 25/06/2013
Aceito em: 01/07/2013
Colloquium Exactarum, v. 5, n.1, Jan-Jun. 2013, p. 26 – 42. DOI: 10.5747/ce.2013.v05.n1.e052
42
Fly UP