Crystal Reports - Usando parâmetros em relatórios via código


Em meu artigo Crystal Reports - Usando parâmetros em relatórios mostrei como criar e usar parâmetros em relatórios Crystal Reports para realizar seleção dos dados do relatório de acordo com um critério definido pelo parâmetro. Dessa forma podemos filtrar os dados do relatório exibindo somente aqueles que interessam.

Como o artigo era um introdução ao assunto eu mostrei como criar e usar parâmetros através da janela do Crystal Reports e isso nem sempre será o mais conveniente. Haverá situações que deveremos prover uma interface ao usuário para coletar a informação usada como critério para filtrar os dados do relatório. Neste artigo eu vou mostrar exatamente isso : como podemos criar uma interface para obter o parâmetro e via código efetuarmos as definições e a execução do relatório usando o parâmetro definido.

Para ganhar tempo eu vou usar o mesmo relatório apresentado no artigo anterior,  então vamos ao trabalho...

Criando o relatório e parâmetro no Crystal Reports

Vamos aprender a como usar parâmetros em relatórios Crystal Reports usando o Visual Studio 2005. Os parâmetros geralmente são usados para filtros, ou seja, você tem uma quantidade de informação e deseja exibir apenas uma parte dela.

Por exemplo você tem uma relação de clientes e deseja exibir apenas único cliente ou um determinado número de clientes que atenda um critério definido. Para conseguir realizar esse objetivo podemos usar parâmetros.

Eu vou usar o Crystal Reports que vem junto com o Visual Studio 2005 (Infelizmente as versões Express não possuem o Crystal Reports) e gerar um relatório com base na tabela Customers do banco de dados Northwind.mdf, esse banco de dados pode ser obtido no site da Microsoft.

Abra então o Visual Studio 2005 e no menu File -> New Project selecione em Project Types Visual Basic -> Windows e em Templates Windows Application;

Informe o nome CrystalReports1 e clique em OK;

Com isso criamos a solução contendo o projeto CrystalReports1.

Agora vamos criar o relatório usando o Crystal Reports. No menu Project -> Add New Item;

Na janela a seguir selecione o Template Crystal Reports e aceite o nome padrão CrystalReports1.rpt ou se preferir indique um nome mais sugestivo;

Neste momento será iniciado o assistente do Crystal Reports apresentando a tela abaixo;

Selecione o item - Using the Report Wizard -  e clique em OK;

Na janela Chosse the data you wnat do report on expanda o item Create a New Connection e clique em OLE DB (ADO);

A seguir na janela - Select a provider from a list or select a data link file - selecione Microsoft OLE DB Provider for SQL Server  e clique em Avançar;

Na próxima janela vamos indicar as informações para conexão com o banco de dados. Em Server informe o nome do seu servidor SQL Server. O nome do meu servidor é MAC\SQLEXPRESS o seu será diferente , verifique qual o nome o seu servidor e informe aqui;

Marque a opção Integrated Security e em DataBase selecione o banco de dados Northwind;

Obs: Você deverá possuir o banco de dados Northwind.mdf instalado no seu SQL Server Local;

A seguir clique em Concluir;

Na janela a seguir expanda os objetos de forma a visualizar as tabelas e selecione a tabela Customers e clique no botão    para selecionar a tabela e clique em Avançar;

Será exibido todos os campos da tabela , selecione os campos que deseja exibir no relatório e clique no botão , Vamos selecione apenas os campos CustomerID, ContactName, Phone e City;

Clique em Avançar;

Como não vamos agrupar os dados nem selecionar um subconjunto de dados clique no botão Avançar até chegar na tela final onde iremos selecione o Report Style; No nosso relatório vamos usar a opção Standard;

Para encerrar clique em Concluir;

Será apresentada no Visual Studio a seguinte tela, onde vemos o relatório criado com os campos definidos e na ToolBox os objetos que podemos usar no relatório;

Neste momento se você clicar em - Main Report Preview - irá poder visualizar o relatório conforme a figura abaixo:

Perceba que o relatório exibe todos os registros da tabela. Vamos supor que você não quer isso, você quer poder exibir uma relação de clientes por cidade.

Neste caso vamos criar um parâmetro para filtrar os registros pelo nome da cidade desejado.

Clique em Main Report para retornar ao relatório no modo de desenho e abra o Field Explorer;

Clique com o botão direito no item Parameter FIelds e a seguir em New;

Será aberta a janela Create Parameter Field, onde devemos definir:

  1. O nome do parâmetro - no meu exemplo eu defini o nome cidade;
  2. O texto que irá aparecer na janela - Informe o nome da cidade;
  3. O tipo de dados do parâmetro - no caso String;

Neste momento se você clicar em OK o parâmetro será criado de forma que uma caixa de texto irá aparecer na janela e o usuário deverá digitar o nome da cidade;

A seguir clique no botão OK e novamente em OK;

Você deverá ver em Field Explorer, o parâmetro criado com o nome cidade;

Agora temos que definir qual campo do relatório o parâmetro deverá usar como critério e qual o critério; Vamos usar o campo City e o critério is equal to;

No menu Crystal Reports selecione Report -> Select Expert;

Na janela Choose Field selecione city e clique em OK;

Na janela Select Expert defina - is equal to - e selecione o parâmetro {?cidade} e clique em OK;

Clique em OK para encerrar;

Definindo o parâmetro via código

Até agora não houve nada de novo em relação ao primeiro artigo mas a partir daqui vamos definir o parâmetro via código e não vamos usar a janela do Crystal Reports.

Primeiro vamos definir uma interface usando o formulário form1.vb com o seguinte leiaute:

Eu usei um componente SplitContainer para dividir o formulário em duas seções na seção superior inclui um controle CrystalReportViewer e na seção inferior inclui um Label , um TextBox(txtcidade) e um Button (Button1):

Nota: Defini a propriedade Dock do CrystalReportViewer como Bottom , dessa forma eu pude colocar uma label com o título do relatório.

O segredo é não definir a propriedade  ReportSource do componente CrystalReportViewer vamos fazer isso via código.

Agora no evento Click do botão Filtrar vamos incluir o seguinte código:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

If Not txtCidade.Text = String.Empty Then

' carrega o relatorio desejado

Dim strReportName As String = "CrystalReport1"

'

'define o caminho e nome do relatorio

Dim strReportPath As String = "D:\Documents and Settings\Macoratti\Meus documentos\Visual Studio 2005\Projects\CrystalReports1\ _
                                              CrystalReports1"
& "\" & strReportName &
".rpt"

'

'verifiqa se o arquivo existe

If Not IO.File.Exists(strReportPath) Then

      Throw (New Exception("Relatorio nao localizado :" & vbCrLf & strReportPath))

End If

'

'instancia o relaorio e carrega

Dim CR As New ReportDocument

CR.Load(strReportPath)

'

' atribui os parametros declarados aos objetos relacionados

Dim crParameterDiscreteValue As ParameterDiscreteValue

Dim crParameterFieldDefinitions As ParameterFieldDefinitions

Dim crParameterFieldLocation As ParameterFieldDefinition

Dim crParameterValues As ParameterValues

'

' Pega a coleção de parametros do relatorio

crParameterFieldDefinitions = CR.DataDefinition.ParameterFields

'

' define o primeiro parametro

' - pega o parametro e diz a ela para usar os valores atuais

' - define o valor do parametro

' - inclui e aplica o valor

' - repete para cada parametro se for o caso (não é o caso deste exemplo)

' Vamos usar o parametro 'cidade'

crParameterFieldLocation = crParameterFieldDefinitions.Item("Cidade")

crParameterValues = crParameterFieldLocation.CurrentValues

crParameterDiscreteValue = New CrystalDecisions.Shared.ParameterDiscreteValue
 

'obtem o valor da caixa de texto

crParameterDiscreteValue.Value = txtCidade.Text

crParameterValues.Add(crParameterDiscreteValue)

crParameterFieldLocation.ApplyCurrentValues(crParameterValues)

'

' Define a fonte do controle Crystal Report Viewer como sendo o relatorio definido acima

CrystalReportViewer1.ReportSource = CR

Else

   MsgBox("Informe o nome da cidade.", MsgBoxStyle.Information, "Nome da cidade. Ex: London, Paris, Roma, etc..")

End If

End Sub

 

O código já esta comentado mas é importante ressaltar que temos que informar o caminho completo do relatório e o seu nome e definir o nome do parâmetro criado bem como o seu valor obtido da caixa de texto txtCidade.

A carga do relatório é feita pelo método Load: CR.Load(strReportPath)

A definição do relatório fonte é feita pela seguinte linha de código:  CrystalReportViewer1.ReportSource = CR

Executando o projeto iremos obter o seguinte resultado:

1- Apresentação do formulário onde o usuário irá informar o nome da cidade para filtrar os dados:

2- O relatório exibindo os clientes por cidade informada;

Pegue o projeto completo aqui: CrystalReports1.zip

Em um próximo artigo irei mostrar como criar gráficos no Crystal Reports no VB .NET , aguarde...

Eu sei é apenas .NET , mas eu gosto...


José Carlos Macoratti