PRIMEIROS PASSOS CRYSTAL REPORT
Terminei a fase 1 do meu sistema que estou migrado do VB6 para C# 2008 (Windows Form) com SQL Server 2008 R2 Express.
Antes de entrar na 2 fase quero iniciar a parte dos relatórios para todos os cadastros básicos já feitos. [txt-color=#e80000]Porém nunca trabalhei com Crystal Report[/txt-color].
Estou pesquisando mas estou encontrando mais dúvidas que soluções para começar. A princÃpio todos os links no google me remetem a versões usando ASP, outros bancos que não o SQL Server e/ou quase todos usam relatórios vinculados ao banco, ou seja, para criar tem de vincular o relatório via assistente com o banco de dados, ou objetos vinculados do próprio Visual Studio.
Nota: Minha conexão ao banco pelo sistema é feita usando uma estrutura de montar a string de conexão com dados externos, que serão configurados pelo cliente assim:
public static string StringDeConexaoSegura(string server, string instancia, string banco, bool autenticacao, string usuario, string senha)
{
if (autenticacao == true) //autenticação é SQL
{
return [Ô]server=[Ô] + server + [Ô]\\[Ô] + instancia + [Ô];database=[Ô] + banco + [Ô];user=[Ô] + usuario + [Ô];pwd=[Ô] + senha + [Ô];Trusted_Connection=False;[Ô];
}
else // autenticação é Windows
{
return [Ô]server=[Ô] + server + [Ô]\\[Ô] + instancia + [Ô];database=[Ô] + banco + [Ô]; Integrated Security=SSPI;[Ô];
}
}
Usando a string acima eu faço a conexão com o banco no sistema.
Perguntas:
1- é possÃvel criar relatórios no Crystal 2008 DESVINCULADOS ao banco, e passar a conexão como citada acima para cada relatório ou ainda montar um ou mais DataReader com os dados e passar para o relatório ser montado/exibido sem ele mesmo ter de acessar o banco?
2- Li algo sobre se criar duas formas de relatório com ele, uma onde os relatórios são enviados separadamente em pasta especÃfica, o que facilita a alteração sem recompilar o projeto todo e outra onde se pode incluir o relatório no próprio EXE do sistema. Isso é realmente possÃvel? Se for como se faz, é na hora de começar a criar o relatório ou depois dele feito se pode definir como será distribuÃdo? Achei isso interessante, onde se poderia usar as duas formas juntas cada uma com suas caracterÃsticas próprias.
3- Como ainda não fiz nada no Crystal, alguém poderia indicar um link de passo a passo com as caracterÃsticas que citei acima, ou algum manual em português que auxilie nos primeiros passos com ele?
Muito obrigado antecipadamente.
Depois de alguns anos aprendendo com e sobre o crystal. Hoje só conecto via Listas de Arreys.
Vc cria a lista obtida de uma classe , depois referencia essa classe como objeto no crystal, assim vc nunca depende da base de dados, e quando alterar a base, basta alterar na classe.
Obrigado pela resposta, mas como disse não conheço nada do Crystal. Usava um outro componente de relatórios, o Visual Report X, que não tem suporte ao dot.net, onde se criava o relatório igual ao Acesse, mas se passava os dados via recordset. Todos os relatórios ficavam dentro do EXE.
Agora quero saber como trabalhar com o Crystal, pois é a ferramenta que vem com o VS, e parece melhor que o Repórter View (outra opção do VS), pois ele tem incompatibilidades com certos servidores, além de ser mais complicado implantar no cliente.
Você teria algum exemplo prático que pudesse me ajudar a entender o funcionamento, desde a criação até a execução do relatório? E como funcionaria a parte de mandar o relatório externo e a opção de incluir no EXE, pois em alguns casos é interessante que um ou outro relatório não fique externo?
Até onde vc vai com o crystal ? Sabe adicionar um novo relatorio ao Projeto ?
- No solution Explorer criei uma pasta para incluir os relatórios, subdivido o projeto em pastas para organizar.
- ADD um novo item Crystal Report nessa pasta, ele criou o arquivo cadCausas.rpt
- Ao incluir usei o processo manual para desenhar o relatório.
- coloquei neste o cabeçalho do relatório como Hide, pois não é necessário
- No cabeçalho página inclui 4 objetos text, um para o tÃtulo do relatório e 3 para tÃtulos de colunas
- na seção Details, estou EMPACADO.
Minha ideia era criar um DataReader com os campos para incluir no relatório. Então criei uma classe static que retorna um List para acessar o banco e montar o DataReater e devolver nesse list. Porém ao tentar incluir esse objeto no DataBaseFields do relatório (dentro do Field Explorer) ele não aparece.
Vi um exemplo que usava um DataSet com DataTable para isso, mas não uso esses objetos e não entendi como isso foi feito no exemplo, pois já estava pronto sem explicação.
Até agora foi isso que fiz.
Ali vc vai achar a sua classe que vc utiliza para gerar o List, carregue ela e pronto, os campos aparecerão para vc arrastar no relatorio.
Se vc for utilizar Dataset é o mesmo processo, carregue o datatset, mas eu aconselho objeto, ou seja classe de um list.
Criei a classe public static assim dentro do projeto principal:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using myAPP.Modelos;
using myAPP.DAL;
using System.Data;
using System.Data.SqlClient;
namespace myAPP
{
public partial class LigaBancoRelatorios_Cad
{
public static List<CausaDaFalhaModelo> ListagemCausaDaFalha(byte myInativo)
{
List<CausaDaFalhaModelo> listCausas = new List<CausaDaFalhaModelo>();
string mySQL = [Ô]SELECT ID, DESCRICAO, INATIVO FROM CAUSADAFALHA WHERE (INATIVO = @INATIVO) ORDER BY DESCRICAO asc[Ô];
SqlCommand cmd = new SqlCommand(mySQL, cn);
cmd.Parameters.Add([Ô]@INATIVO[Ô], SqlDbType.Bit);
cmd.Parameters[[Ô]@INATIVO[Ô]].Value = myInativo;
SqlDataReader dr = null;
try
{
AbrirConexao();
dr = cmd.ExecuteReader();
while (dr.Read())
{
CausaDaFalhaModelo myCausa = new CausaDaFalhaModelo();
myCausa.ID = (Int32)dr[[Ô]ID[Ô]];
myCausa.DESCRICAO = (string)dr[[Ô]DESCRICAO[Ô]];
myCausa.INATIVO = Convert.ToByte(dr[[Ô]INATIVO[Ô]]);
listCausas.Add(myCausa);
}
}
catch (SqlException)
{ throw; }
catch (Exception)
{ throw; }
finally
{ FecharConexao(); }
return listCausas;
}
}
}
O modelo da classe que irá montar o DataReader está numa DLL que acompanha o projeto, como todos os outros modelos de acesso a dados:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace myAPP.Modelos
{
public class CausaDaFalhaModelo
{
private int _ID;
public int ID
{
get { return _ID; }
set { _ID = value; }
}
private string _DESCRICAO;
public string DESCRICAO
{
get { return _DESCRICAO; }
set { _DESCRICAO = value; }
}
private byte _INATIVO;
public byte INATIVO
{
get { return _INATIVO; }
set { _INATIVO = value; }
}
}
}
Acho que não estou fazendo certo para incluir um objeto no relatório, pode me ajudar a resolver?
Dessa forma que exemplifiquei acho que o rel abre bem mais rapido, pois estava com problemas de lentidão em meus clientes quando utiliza DataSets. E A manutenção também é bem mais fácil.
Como utilizo a pouco tempo , uns 8 meses , se alguém encontrar algum contra, pode se manifestar por favor.
no VB.NET uso DataSet para alimentar o crystal Reports
Porém tenho ainda uma série de dúvidas e coisas pra implementar, se puder ajudar ou alguém que saiba como agradeço.
1) Vi a interface pro usuário (View do Crystal) tem todos os textos em inglês Ex: statusbar tem: Current Page, Total Page no e Zoom Factor, tem como mudar isso para o idioma do micro ou formatar no código que chama o relatório?
Meu sistema estará em PT, EN e ES, assim se houver como mudar os textos da barra de status e talvez de botões seria ótimo, procurei e não encontrei essas propriedades.
2) No alto do relatório, aparece um retângulo (Aba) escrito (Main Report) tem como ocultar isso? ou trocar esse texto. Para que serve isso?
3) Eu tenho um campo que é byte ou Int no banco e guarda 0 ou 1. Porém na hora de exibir nos grids ou relatórios, se for 1 tem de exibir um X ou um sÃmbolo de ticado verde (visto) no lugar para representar que o registro está inativo, se for 0 (zero) não exibe nada. Como eu programo o campo para fazer isso, pois esta exibindo 0 e 1.
4) Por meu sistema estar em 3 idiomas, como eu faço o relatório para se comportar desta forma, ou seja, tanto a legenda dos campos de dados, como a formatação dos campos Data, Numero para saÃrem como no idioma definido no sistema? No meu sistema uso um método para identificar o idioma do Windows e fazer meu sistema seguir, e também guardo numa variável pública: PT, EN ou ES assim a qualquer momento sei que idioma estou trabalhando, para inclusive exibir todas as mensagens no idioma correto vindo de um Resource. Tem como programar cada relatório para isso ou serei obrigado a fazer um relatório igual para cada idioma? Tenho mais de 450 relatórios no sistema, e irão aumentar, pois novos módulos serão criados. Isso deixaria meu sistema gigantesco (EXE) além de um trabalho brutal para editar sempre 3 relatórios diferentes.
5) Última (kkk) Tenho relatórios que irão exibir dados de múltiplas tabelas, relativamente complexos. Vi que o Crystal tem subrelatórios, ótimo. A pergunta é, se eu tenho um registro que tem dados correlacionados em outras 2 ou 3 tabelas, como eu faço para trazer os dados em duas situações:
a) listagem:
registro 1
subregistro1
subregistro 2, etc..
registro 2
subregistro1
subregistro 2, etc..
b) Um único registro selecionado com todos os dados correlacionado de n tabelas (acho que seria um subrelatório para cada tabela auxiliar certo).
cabeçalho
Dados do registro único
Grade com Tabela Auxiliar 1 Grade Com tabela Auxiliar 2 Colunas em branco para assinar
Dados de uma outra tabela auxiliar ao final
Citação:2) No alto do relatório, aparece um retângulo (Aba) escrito (Main Report) tem como ocultar isso? ou trocar esse texto. Para que serve isso?
Se vc gerar relatorios em grupos, ali ele separa por grupo.
Vasculhe as propriedade do crystalview que esta no formview que enviei, la vc alterar algumas coisas.
Citação:3) Eu tenho um campo que é byte ou Int no banco e guarda 0 ou 1. Porém na hora de exibir nos grids ou relatórios, se for 1 tem de exibir um X ou um sÃmbolo de ticado verde (visto) no lugar para representar que o registro está inativo, se for 0 (zero) não exibe nada. Como eu programo o campo para fazer isso, pois esta exibindo 0 e 1
Procure exemplos de formulas do Crystal, nesse caso ai eu mesmo te mostro, mas vc pode precisar de algumas mais complexas.
Crie um campo de formula. e nessa formula coloque:
if {List.Campo}=1 THEN
[Ô]ok[Ô]
Depois arraste a formula para o relatorio.
Citação:5) Última (kkk) Tenho relatórios que irão exibir dados de múltiplas tabelas, relativamente complexos. Vi que o Crystal tem subrelatórios, ótimo. A pergunta é, se eu tenho um registro que tem dados correlacionados em outras 2 ou 3 tabelas, como eu faço para trazer os dados em duas situações:
Crie grupos dentro da sessão desejada. Clique com botão diretio e inserir grupos.
Citação:b) Um único registro selecionado com todos os dados correlacionado de n tabelas (acho que seria um subrelatório para cada tabela auxiliar certo).
Sim.
Quanto a idiomas, não faço idéia.
Então, o crystal, de da uma imensidade de recursos, por isso não é nada fácil conhecer e tratar todos, isso
requer tempo e paciência. Eu ainda tenho muito a aprender.