Escolar Documentos
Profissional Documentos
Cultura Documentos
São Carlos - SP
1
Customização de resultados para clientes
utilizando Crystal Reports
2
VAI SER ALGUMAS DESSAS
AQUI... não sei qual ainda...
Soren Kierkegaard
Agis II
i
Dedicatória
Dedico esse trabalho a toda minha família, por sempre me proteger e me fortalecer nos
momentos de fraqueza e sempre me acompanhar nos momentos de felicidade e alegria.
ii
Agradecimentos
Agradeço a minha família por toda dedicação e apoio recebidos durante esta fase de
minha vida. Em especial ao meu pai Guilherme Calabria que sempre me apoia e me ensina a
viver com sua experiência e dedicação, minha mãe Mônica Calabria pelo seu amor
incondicional, paciência e franqueza e minha querida irmã Gabriela Calabria por me mostrar
o que é ser um grande profissional e ser humano.
Ao Rodrigo Merlo, meu supervisor, que com muita alta estima sempre encontra a
melhor solução para os problemas.
Minha enorme gratidão para meus amigos Jaime Cazzoti, que sempre me apoiou em
todos os requisitos burocráticos estudantis e ao meu grande amigo Ricardo Marcacini que
com seu humor peculiar sempre me faz rir.
iii
Resumo
No mundo competitivo atual, cada vez mais empresas precisam de sumarização das
informações, pois, são através dessas informações que elas irão tomar decisões para definir
seu destino visando manter-se no mercado. Este trabalho de conclusão de curso apresenta
diversas customizações de resultados, os quais por sua vez fornecem relatórios sobre suas
produções e métodos para melhorar os procedimentos do cliente.
iv
Sumário
LISTA DE ABREVIATURAS ........................................................................................ VI
CAPÍTULO 1: INTRODUÇÃO........................................................................................ 1
REFERÊNCIAS ............................................................................................................... 17
v
Lista de Abreviaturas
ERP Enterprise Resource Planning
vi
Lista de Figuras
vii
CAPÍTULO 1: INTRODUÇÃO
1.1 Relatório
Um relatório é uma apresentação organizada dos dados, ele é utilizado para
proporcionar, a empresa, subsídios para tomar decisões baseadas em dados efetivos. As
informações podem reportar resultados parciais ou totais de uma atividade, pesquisa,
projeto ou outro evento qualquer.
Como um evento pode produzir uma grande quantidade de dados sempre irá existir
uma dificuldade, de tamanho equivalente, de seu entendimento. Também não há um
algoritmo genérico de sumarização de dados suficientemente bom que atenda todas as
áreas. Esses motivos fortalecem o objetivo desse projeto, que visa a customização dos
relatórios e de suas técnicas de trabalho.
O Crystal Reports é uma ferramenta que oferece uma gama de opções para controle
sobre o tamanho, aparência e organização de todos os elementos de um relatório sendo
possível inclusive, alterar a ordenação dos dados de maneira dinâmica. Esses são os
principais motivos para realização desse projeto.
Localizada em Cotia – São Paulo, ela conta com cerca de dezesseis funcionários
distribuídos em diversos setores. Seu principal produto é o Audience®. Além da venda e
1
do treinamento para o Audience®, ela também fornece soluções de Datacenter para seus
clientes.
2
CAPÍTULO 2: Ferramentas Utilizadas
2.1. Considerações Iniciais
Nesse capítulo são apresentadas as ferramentas utilizadas nas tarefas realizadas.
Para melhor entendimento destas ferramentas em alguns casos poderão ser fornecidas
descrições das tarefas onde essas ferramentas foram aplicadas, a descrição completa das
tarefas será apresentada no Capítulo 3.
2.2. DBDesigner 4
DBDesigner 4 é uma ferramenta para projetar um banco de dados que integra as
funções de: modelagem, projeto, implementação e manutenção em um mesmo ambiente. É
desenvolvida pela fabFORCE (www.fabforce.net) e distribuída sob a licença GNU is Not
Unix(GNU) General Public License (GPL). Ele é desenvolvido e otimizado para o Sistema
Gerenciador de Banco de Dados (SGBD) Mysql, mas é compatível com Oracle, MSSQL e
qualquer banco de dados ODBC.
3
2.3. Netbeans IDE 6.8
O Netbeans, um dos mais antigos projetos criados para suportar a linguagem Java
[Mesenas, 2008], ele é um ambiente de desenvolvimento multiplataforma. Escrita
totalmente em Java e distribuída sob as condições da Sun Public License(SPL), uma
variação da Mozilla Public License(MPL), esta licença tem como objetivo garantir a
redistribuição de conhecimento à comunidade de desenvolvedores quando novas
funcionalidades forem incorporadas à ferramenta [Redação Oficina da Net, 2008]. Esse
ambiente de desenvolvimento integrado (IDE) suporta diversas linguagens entre elas: Java,
C/C++, PHP, Groovy e Ruby. Essa ferramenta auxilia programadores a escrever, compilar
e “debugar“ suas aplicações.
auto-completar avançado;
4
2.4. Crystal Reports XI
O Crystal Reports é uma ferramenta para geração de relatórios e é compatível a
diversos tipos de dados. É fornecida pela SAP sob a licença: Contrato de licença de usuário
final (EULA).
Com ele você pode acrescentar funcionalidades a um relatório para que fique
atraente aos olhos dos usuários.
5
2. Page Header - Utilizada para que seja colocado um titulo para o relatório,
um campo que sirva como cabeçalho, a faixa de valores selecionados, e outras
informações que se queira apresentar no topo de cada página de seu relatório.
6
CAPÍTULO 3: Tarefas e Customizações
3.1. Treinamento Crystal Reports
Para iniciar o estágio foram fornecidos ao estagiário os seguintes manuais:
Designer I, da LCA informática e Crystal Reports Designer, da ETZ informática. Foi
realizado o treinamento da ferramenta Crystal Reports com esses manuais e com diversos
materiais suplementares encontrados na internet.
Ao iniciar um novo relatório pelo Crystal Reports é realizada uma conexão com o
banco de dados, onde são exibidas todas as tabelas e os campos disponíveis para serem
utilizados no relatório. Ao selecionar um campo, basta manter ele selecionado e arrasta-lo
até a posição do relatório desejada. Essa posição segue uma grade para alinhamento dos
objetos.
7
Junto com a apresentação do Crystal Reports foi apresentado o sistema Audience®,
na qual o projeto é baseado. O sistema Audience® trabalha no modelo ASP, esse modelo
concentra os dados em um servidor. Todas as tarefas realizadas pelos usuários são
processadas no servidor. Com isso não importa onde o usuário esteja ele terá acesso a
todos os dados da sua empresa, fornecendo mobilidade e segurança.
Sendo ele um ERP para indústrias da moda, suas ferramentas são direcionadas para
esse seguimento, por exemplo, em cadastro de produto é possível definir uma grade de
tamanhos personalizada para cada produto adicionado.
8
3.2. Mapeamentos da base de dados
Mesmo com o entendimento parcial do sistema Audience® e do Crystal Reports
não foi possível visualizar de maneira abrangente como os dados se relacionavam e como
seria a extração de informações, por isso segue-se a próxima etapa.
Como a Verup utiliza arquivos de dados AcuCorp, não há nenhum SGBD que tenha
acesso a base de dados para lhe fornecer um modelo ER. Como não há um modelo ER para
sua base de dados e para que fosse criado esse modelo, foi realizado o mapeamento da base
de dados, do sistema Audience®, utilizando os seguintes procedimentos:
9
Figura 6 - Parte do modelo ER gerado.
Através dessas tarefas e com esse mapeamento foi possível realizar uma
documentação detalhada das exportações do sistema. Essa documentação é possível
visualizar como os dados se relacionam e de onde podemos extrair determinadas
informações. Com a conclusão da documentação, ela foi encaminhada para um funcionário
com maior experiência na empresa para sua verificação.
10
3.3. Ficha técnica
A primeira customização em que o estagiário trabalhou foi a de uma ficha técnica
de produtos. Nela são visualizadas informações detalhadas do consumo de materiais para
determinado produto.
A grande dificuldade nessa ficha técnica foi gerar o agrupamento dos dados para
serem exibidos de maneira coerente e simples. Pois existem tabelas de produtos, cores dos
produtos, materiais, cores de materiais, empenho dos materiais para os produtos. Então foi
utilizado à opção de sub-relatório do Crystal Reports. Usualmente essa não seria a melhor
opção, mas pela quantidade de tabelas que estariam sendo referenciadas foi a única
disponível. Na criação de um sub-relatório podem-se enviar informações, através de
parâmetros, para a criação de uma nova QUERY utilizada nesse novo relatório.
Abaixo segue um exemplo de uma ficha técnica, onde pode ser visualizado o
agrupamento dos dados. Sendo que o produto exibido pode ser encontrado nas cores
amarelo, azul e branco. E abaixo desse agrupamento mostra-se a quantidade de material
utilizada junto com sua respectiva cor.
11
Figura 7 - Exemplo de uma ficha técnica.
12
3.4. Programação embarcada
Outra customização realizada foi a criação de um software de força de venda.
Determinado cliente está montando um showroom, para realização de vendas. Como
existirão muitos produtos para serem exibidos, não há como disponibilizar todas as
informações disponíveis, por exemplo, todas as cores disponíveis dos produtos. Por esse
motivo o cliente deseja, de maneira prática, rápida e offline, exibir essas e outras
informações.
Esse software foi codificado em Java ME. A plataforma Java Micro Edition é o
conjunto de tecnologias que permitem o desenvolvimento de aplicações Java para
dispositivos com processamento, memória e vídeo limitados, como celulares e
smartphones [ZANFOLIM, 2009].
A principal ideia para esse software é fornecer detalhes sobre os produtos no show
room do cliente, assim economizando espaço por só exibir uma cor e um tamanho de cada
produto. Para isso o software contará com uma cópia, reduzida, da base de dados dos
produtos. Como o dispositivo, PHL8112, conta com um leitor de código de barras, a busca
pelos detalhes do produto será através dele.
Esses dispositivos contem uma tela, touch screen, de 3,5. Isso não fornece uma
grande área de trabalho. Para realizar uma boa interação usuário máquina, utilizamos o
framework Kuix (http://www.kalmeo.org/projects/kuix). Ele é distribuído pela empresa
Kalmeo, que é uma empresa francesa, de soluções móveis, sob a licença GPL. Kuix
significa: Kalmeo User Interface eXtensions for J2ME. Ele providencia uma diversificada
gama de elementos gráficos como: botões, campos de texto, listas, menus entre outros.
13
Figura 8 - Emulador para codificação da aplicação.
14
Figura 9 - Imagem do formulário para escolha do produto
15
CAPÍTULO 4: CONCLUSÃO
4.1. Contribuições
O anglicismo “customizações”, não significa somente introduzir modificações de
software que o tornem aderentes às necessidades particulares de uma empresa. Mas sim
uma oportunidade de negócio. Assim como mostrado nesse trabalho, há diversas
customizações que podem ser realizadas. Por isso, a criação de um departamento
especifico de customização fornece maior estabilidade para determinação de custos e
prazos.
16
REFERÊNCIAS
MESENAS, Ivan. Netbeans 6.1 Desenvolvendo em Java e Ruby. Rio de Janeiro: Alta
Books, 2008.
REDAÇÃO OFICINA DA NET. O que é o Netbeans?. São Paulo: 2008. Disponível em:
<http://www.oficinadanet.com.br/artigo/1061/o_que_e_o_netbeans>. Acesso em: 30 mar.
2010.
17
ANEXO A – Arquivo CSV de exemplo
[vpclie3.csv]
ColNameHeader=True
Format=Delimited(;)
DateTimeFormat=yyyy/mm/dd
MaxScanRows=0
CharacterSet=ANSI
DecimalSymbol=,
Col1=vup-numrclie integer
Col2=vup-coleprod integer
Col3=vup-etiqprod integer
Col4=vup-deptprod integer
Col5=vup-grupprod integer
Col6=vup-famiprod integer
Col7=cl3-qtdecole integer
Col8=cl3-vlorcole integer
Col9=cl3-qtdeetiq integer
Col10=cl3-vloretiq integer
Col11=cl3-qtdegrup integer
Col12=cl3-vlorgrup integer
Col13=cl3-qtdedept integer
Col14=cl3-vlordept integer
Col15=cl3-qtdefami integer
Col16=cl3-vlorfami integer
Col17=cl3-daticlie date
Col18=cl3-prgiclie char width 8
Col19=cl3-usriclie integer
Col20=cl3-datmclie date
Col21=cl3-prgmclie char width 8
Col22=cl3-usrmclie integer
18
ANEXO B – Código para conversão entre CSV
para SQL
/*Script para geração de tabelas em SQL para cada exportação do Audience*/
package verup;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**@author Guilherme Calabria Filho*/
public class Main {
public static void main(String[] args) throws FileNotFoundException, IOException {
/*Diretório padrão de exportação do Audience*/
String diretorio = "C:\\Audience\\arq";
File file = new File(diretorio); File afile[] = file.listFiles(); int i = 0;
/*Listas de tabelas a serem criadas*/
List<tabelaSQL> tabelas = new ArrayList<tabelaSQL>();
gerarSQL novoSQL = new gerarSQL();
for(int j=afile.length;i<j;i++){
File arquivos = afile[i];
if(arquivos.isDirectory()){
try{
tabelas = novoSQL.lerDirAud(arquivos.getCanonicalPath(),tabelas);
}catch(Exception e){
System.out.println("main Exception:\n"+e.toString());
}
}
}
String SQLQUERY = ""; String tabelaDoc = ""; String primaryKey; int j;
for(tabelaSQL nome:tabelas){
i=0; j=0; primaryKey ="";
SQLQUERY += "CREATE TABLE IF NOT EXISTS `"+nome.nomeTabela+"` (";
tabelaDoc += nome.nomeTabela+"\r\nDescrição:\r\nCampos:\r\n";
for(String campo:nome.nomeCampo) {
if((campo.startsWith("vup"))&&j>15)
System.out.println(nome.nomeTabela+"=>"+campo.toString());
if((campo.startsWith("vup")||j==0||i==0)&&j<15) {
j++;
primaryKey += "`"+campo+"`,";
}
if(nome.tamanho.get(i).toString().equalsIgnoreCase("-1")){
SQLQUERY += "`"+campo+"` "+nome.tipo.get(i)+", ";
tabelaDoc += "`"+campo+"` "+nome.tipo.get(i)+" = \r\n";
19
}
else{
SQLQUERY+="`"+campo+"`+nome.tipo.get(i)+"("+nome.tamanho.get(i)+"),\r\n";
tabelaDoc+="`"+campo+"`"+nome.tipo.get(i)+"("+nome.tamanho.get(i)+") = \r\n";
}
i++;
}
SQLQUERY+="PRIMARY KEY("+primaryKey.substring(0,primaryKey.length()-1)+")
);\r\n ";
}
File arquivo = new File("C:\\Audience\\arq","SQLS.txt");
FileOutputStream saida = new FileOutputStream(arquivo);
saida.write(SQLQUERY.getBytes());
File arquivo2 = new File("C:\\Audience\\arq","tabDoc.txt");
FileOutputStream saida2 = new FileOutputStream(arquivo2);
saida2.write(tabelaDoc.getBytes());
saida2.close(); saida.close();
}
}
/*Código da classe tabelaSQL*/
package verup;
import java.util.ArrayList;
import java.util.List;
public class tabelaSQL {
public String nomeTabela;
public Integer posicao;
public List<String> nomeCampo = new ArrayList<String>();
public List<String> tipo = new ArrayList<String>();
public List<String> tamanho = new ArrayList<String>();
public tabelaSQL(String nome,Integer local){
this.nomeTabela = nome;
posicao = local;
}
public void addCampo(String name,String type,String size){
Boolean added = false;
for(String nome:nomeCampo){
if(nome.equalsIgnoreCase(name)){
added = true;
}
}
if(!added){
nomeCampo.add(name);
tipo.add(type);
tamanho.add(size);
}
}
}
20
/*Código da classe gerarSQL*/
package verup;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class gerarSQL {
/*Recebe um diretório padrão de exportação AUDIENCE*/
public List<tabelaSQL> lerDirAud(String diretorio,List<tabelaSQL> tabelas) {
try{
List<String> camposTab =new ArrayList<String>();
File verifica = new File(diretorio+"\\schema.ini");
if(verifica.exists()){
/*Lendo arquivo que contêm dados sobre a exportação*/
FileInputStream stream = new FileInputStream(diretorio+"\\schema.ini");
InputStreamReader streamReader = new InputStreamReader(stream);
BufferedReader reader = new BufferedReader(streamReader);
String line;String aux = null; int numlinha=0; int indiceTabelas=0;int tamanho;
String campo[];String campoDet[]; tabelaSQL newTable = null; Boolean jaexiste = false;
while((line=reader.readLine())!=null){
/*Caráter que indica o inicio da descrição de uma exportação*/
if(line.indexOf("[")!=-1){
/*Controle se a tabela já foi adicionada na lista*/
jaexiste =false;
aux = line.replace("[", "");
try{
/*Buscando tabela atual, na lista de tabelas já adicionadas*/
for(tabelaSQL nome : tabelas){
/*Se já foi adicionado só adiciona os campos*/
if(nome.nomeTabela.equalsIgnoreCase(aux.replace(".csv]",""))){
jaexiste = true;
/*Recebendo tabela*/
newTable = tabelas.get(nome.posicao);
break;
}
indiceTabelas++;
}
}
catch(Exception ex){
System.out.println("Exception ao fazer tabelas.get:"+ex.toString()+"\n");
}
/*Se a tabela ainda não estiver adicionada*/
if(!jaexiste){
if(!aux.replace(".csv]", "").isEmpty()){
/*Adicionando tabela, retirando os caracteres não necessários */
21
newTable = new tabelaSQL(aux.replace(".csv]",""),tabelas.size());
tabelas.add(tabelas.size(),newTable);
}
}
else{
/*Já existe*/
}
/*Leitura da linha 0 da descrição da tabela*/
numlinha=0;
}
else{
/*Se já for inicio das colunas*/
if(numlinha==7){
try{
/*Adicionando campos a tabela*/
campo = line.split("=");
campoDet = campo[1].split(" ");
/*Substituindo valores dos tipos de dados para um valor válido ao MYSQL*/
aux = campoDet[1].replace("integer", "int");
aux = aux.replace("floating", "float");
if(campoDet[1].equalsIgnoreCase("char")){
tamanho = Integer.parseInt(campoDet[3]);
if(tamanho>255) tamanho =255;
}
else tamanho=-1;
/*Adicionando campo*/
newTable.addCampo(campoDet[0], aux, Integer.toString(tamanho));
}
catch(Exception ex) {
System.out.println("Exception gerarSQL linha 78:"+ex.toString()+"\n"+line);
}
}
/*As primeiras linhas não são utilizáveis*/
/*Chegou na ultima linha antes das colunas*/
if(line.equalsIgnoreCase("DecimalSymbol=,")){
numlinha = 7;
}
}
}
}
else System.out.println("Não existe arquivo"+diretorio);
}catch(Exception e)
{
System.out.println("gerarSQL Exception:\n"+e.toString());
}
return tabelas;
}}
22