Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Microsoft Reporting Services

Os Microsoft Reports são baseados na definição do relatório, que é na realidade um ficheiro XML, que descreve a informação e o layout do relatório, com uma extensão diferente. Pode-se criar um relatório no cliente – Client-Side Report Definition Language (*.rldc) – usando o Visual Studio, e construir excelentes relatórios para a aplicação.

O objectivo deste artigo é mostrar os passos básicos para a criação de um relatório, definir a Data Source em modo runtime, trabalhar com Parameters, incluir imagens, usar o Expression Editor, e como alimentar um SubReport e um gráfico. Finalmente irá também mostrar algumas personalizações simples ao controlo ReportViewer.

Introdução

Para começar, foi criada uma tabela em SQL com alguma informação para este exemplo. É uma lista de equipamento electrónico como PDA, computadores, etc. Da tabela criada é necessário criar um DataSet, com duas DataTables. Chamar a este DataSet “dsReport.xsd”.

A primeira DataTable, “products”, contém a lista de todos os produtos na tabela SQL. A segunda DataTable, “groupTotal”, é uma vista agrupada (Group By) com os grupos e os somatórios das quantidades. que serão usados para o SubReport e para o gráfico.

Depois disto é necessário adicionar o relatório à aplicação. Seleccionar o relatório e indicar um nome apropriado. Para o exemplo podem utilizar “rptProducts”.

Com o novo relatório criado e aberto, existe uma nova opção na barra de ferramentas Report. Seleccionar o “Page Header” e “Page footer” para mostrar estas duas secções no relatório. Depois disto vamos arrastar da Toolbox para a secção “Body” (corpo) do relatório.

DataSource

Agora é altura para definir a Data Source. No menu Report, seleccionar Data Source. Irá aparecer uma nova janela onde se pode escolher as Data Sources (DataSets) disponíveis na nossa aplicação. Seleccionar a DataSet criada.

NOTA: O nome do “Report Data Sources” pode ser renomeado, e será usado no código mais tarde.

Depois de definir a Data Source para o relatório, as DataTables estarão disponíveis no Data Source Explorer (normalmente disponível na janela da Soluction Explorer). Da tabela Produtos arrastar as colunas para o objecto Table que foi inserido na secção “Body”


O objecto Table funciona como uma folha de Excel. Pode-se unir células, alterar a cor de fundo, fontes, etc. Este exemplo utiliza um campo do tipo Moeda. Para mostrar como é simples formatar as células, clicar com o botão direito do rato sobre o campo e seleccionar Propriedades. Na janela das propriedade ir à Tab Format e definir a célula com o formato Currency.

 

Alterar o formato dos restantes campos, como negrito, títulos, etc., para obter um aspecto profissional.

Imagens

Para incluir imagens na nossa aplicação, pode-se embeber e depois usar como um logótipo (por exemplo). Pode-se também ir buscar directamente as imagens à base de dados, se estiverem armazenados como binário (Binary).

Para embeber as imagens no relatório é apenas necessário ir ao menu Report e seleccionar Embedded Images. Na nova janela seleccionar o botão New Image e escolher a imagem pretendida.


Fechar a janela e depois, na Toolbox, adicionar um controlo Image ao relatório. Nas propriedades do controlo, seleccionar a imagem adicionada da Combobox disponível na propriedade Value.

Expression Editor

Uma das novidades do Visual Studio 2008 para o Microsoft Reporting Services Expression Editor é o intellissense disponível quando se precisa de criar alguma fórmula ou expressão.

Na secção Footer, pode-se adicionar duas TextBoxes. Numa delas, iremos colocar o número da pagina e o total de páginas. Para isso, já existem fórmulas criadas na categoria Global.


Como se pode ver na imagem seguinte, pode-se usar fórmulas de VB (a maioria delas) no Expression Editor. O intellissence ajuda bastante para prevenir erros e para lembrar o sintaxe das fórmulas . Na segunda Textbox vamos colocar simplesmente a data de impressão.

 

Parâmetros (Parameters)

Pode-se utilizar Parameters para diversas coisas. Neste exemplo será apenas usado para passar informação da aplicação para o relatório.

No menu Report, seleccionar Report Parameters. Definir dois parâmetros: “ApplicationUser” e “ApplicationLevel” do tipo String.

Depois, no relatório, pode-se usar o Expression Editor para definir os parâmetros (eles serão definidos no código) para as TextBoxes. Eles estarão disponíveis na categoria Parameters.

Gráficos (Chart)

Pode-se usar vários gráficos no relatório e eles são muito fáceis de usar e alimentar com informação.

Adicionar um controlo Chart da Toolbox para a secção Body do relatório. Efectuar um duplo-clique no gráfico e irá mostrar as áreas “Data Field” e “Category Field”.

Arrastar os campos “Group” e Totals” da janela DataSource Explorer.


Pode-se também fazer isto nas propriedades do gráfico. Nesta janela pode-se também personalizar as cores das séries, legendas, efeitos 3D, filtros, eixos, etc.

Usando o código

Nos passos anteriores, foram usadas diversas Data Sources no relatório. Agora, iram ser adicionadas novas Data Sources, filtradas ou não, e essa será a informação que será visível no relatório.

Imports System.Data.SqlClient
Imports Microsoft.Reporting.WinForms

Public Class Form1

    ' Connection string
  
Private connString As String = _ 
"DataSource=.\SQLEXPRESS;AttachDbFilename='|DataDirectory|\myDatabase.mdf'”_
";
Integrated Security=True;User Instance=True"

  
''' <summary>
  
''' Evento Form load
    '''
</summary>
  
Private Sub Form1_Load(ByVal sender As Object, _
                                   ByVal e As System.EventArgs) Handles Me.Load

        Try

          
' Chama a personalização
          
Call customizeReportViewer(Me.ReportViewer1)

            ' Adiciona um novo botão
          
Call AddReportViewerButton()

            With Me.ReportViewer1.LocalReport

                ' Caminho para o relatório
              
.ReportPath = Application.StartupPath & "\..\..\rptProducts.rdlc"
              
.DataSources.Clear()

                ' Define os parameters
              
Dim parameters(1) AsReportParameter
                parameters(0) = _
                         New ReportParameter("ApplicationUser", "jpaulino")
                parameters(1) = _
                         New ReportParameter("ApplicationLevel", "Administrator")

                .SetParameters(parameters) 
            End With

          
' ----------------------------------------------------
            ' Datasource para o relatório principal (where price > 200)
            ' ----------------------------------------------------
          
Dim SQL As String = "SELECT * FROM products WHERE price > @price"
          
Using da As New SqlDataAdapter(SQL, connString)
                da.SelectCommand.Parameters.Add("@price", SqlDbType.Int).Value = 200

                Using ds As New DataSet
                    da.Fill(ds, "products")

                    ' É preciso usar o mesmo nome como foi de definido 
                    ' no Data Source Definition
                  
Dim rptDataSource As New ReportDataSource _
                                          ("dsReport_products", ds.Tables("products"))
                    Me.ReportViewer1.LocalReport.DataSources.Add(rptDataSource)

                End Using

            End Using

          
' ----------------------------------------------------
            ' Datasource para o gráfico
            ' ----------------------------------------------------
          
Dim SQL_Chart As String = "SELECT [group], SUM(quantity) AS " _ 
                   “
Total FROM products GROUP BY [group]"
          
Using da As New SqlDataAdapter(SQL_Chart, connString)
                Using ds As New DataSet
                    da.Fill(ds, "groupTotal")

                    Dim rptDataSource As New ReportDataSource("dsReport_groupTotal", _
    ds.Tables("groupTotal"))
                    Me.ReportViewer1.LocalReport.DataSources.Add(rptDataSource)

                End Using
            End Using


          
' Refresh do relatório
          
ReportViewer1.RefreshReport()


        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, _
                                              MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    End Sub

End Class

SubReports

Pode-se usar um ou vários subreports no relatório. Para fazer isso, é necessário preencher a Data Source para cada um deles. Uma vez que não se pode aceder directamente à Data Source do relatório, é preciso definir um evento (handler) ao SubreportProcessing, e depois quando o relatório está a ser carregado, recolhe-se a informação da base de dados e preenche-se a Data Source.

Pode parecer difícil de fazer, mas na verdade é bastante simples!

Definir a Data Source para o subreport e usar um objecto Table, como no relatório principal. Adicionar os campos ao objecto Table. No relatório principal, adicionar um objecto SubReport da Toolbox e escolher o subreport criado.

Depois, no evento Form Load onde está o relatório principal, adicionar o evento para o SubreportProcessing.


AddHandler
ReportViewer1.LocalReport.SubreportProcessing, _
                  AddressOf SubreportProcessingEvent

Finalmente, no evento SubreportProcessing, define-se a nova Data Source, da mesma maneira dos anteriores.


 ''' <summary>
''' Quando o subreport está a ser carregado/processado, preenche a DataSource
''' 
</summary>
Sub SubreportProcessingEvent(ByVal sender As Object, _
                                         ByVal e As SubreportProcessingEventArgs)

     Try

         Dim
SQL As String = "SELECT [group], SUM(quantity) AS " _
             “
Total FROM products GROUP BY [group]"
        
Using da As New SqlDataAdapter(SQL, connString)
             Using ds As New DataSet
                 da.Fill(ds, "groupTotal")
                 Dim rptDataSource As New ReportDataSource _
                                           ("dsReport_groupTotal", ds.Tables("groupTotal"))
                 e.DataSources.Add(rptDataSource)
             End Using
         End Using

     Catch
ex As Exception
         MessageBox.Show(ex.Message, My.Application.Info.Title, _ 
                                      MessageBoxButtons.OK, MessageBoxIcon.Error)
     End Try

End Sub

Personalização do ReportViewer

O ReportViewer é o controlo que mostra os Microsoft Reports num Form ou numa Webpage. Pode-se personalizar a maioria dos controlos deste, para melhorar ou personalizar como pretendido.

Neste artigo, será mostrado duas personalizações simples.

Primeiro, pode-se alterar os títulos dos controlos. Pode-se também fazer outras coisas, como desabilitar itens, renomear tooltips, etc. Isto é especialmente interessante para alterar a linguagem do controlo, uma vez que está disponível apenas em Inglês.

Para isto, será criado um método recursivo que irá fazer um ciclo em todos os controlo do ReportViewer e fazer algumas alterações.

'''  <summary>
''' Ciclo em todos os controlos do ReportViewer
'''
</summary>
''' <remarks></remarks>
Sub customizeReportViewer(ByVal ctrl AsControl)

    For Each c As Control In ctrl.Controls

        ' ----------------------------------------------------
        ' Verifica o texto das labels disponíveis 
        ' ----------------------------------------------------
      
If TypeOf c Is Label Then
            Dim
lbl As Label = DirectCast(c, Label)
            Select Case lbl.Name
                Case "LblGeneratingReport"
                  
lbl.Text = "My report is loading now ... "
              
Case Else
                  
' Podem ser adicionadas mais personalizações
          
End Select
        End If

      
' ----------------------------------------------------
        ' Altera os textos da ToolStrip para Português
        ' ----------------------------------------------------
      
If TypeOf c Is ToolStrip Then
            Dim
ts AsToolStrip = DirectCast(c, ToolStrip)
            For Each item AsToolStripItem In ts.Items

                Select Case item.Text
                    Case "Find"
                      
item.Text = "Pesquisar"
                  
Case "Next"
                      
item.Text = "Próximo"
                  
Case "of"
                       
item.Text = "de"
                    
Case Else
                       
' Podem ser adicionadas mais personalizações
              
End Select
            Next
        End If

      
' Se o controlo tiver child controls
       
If c.HasChildren Then
          
customizeReportViewer(c)
        End If

    Next

End Sub

Finalmente é apenas necessário chamar o método criado no evento Form Load, onde se encontra o ReportViewer.

   ' Chama o método criado
Call customizeReportViewer(Me.ReportViewer1)

A segunda personalização mostra como incluir um novo botão na Toolstrip. Irá encontrar a ToolStrip principal do relatório e adicionar um botão alinhado à direita.

'''  <summary>
'''  Encontra a ToolStrip principal e adiciona um novo botão alinhado à direita
'''
</summary>
Sub AddReportViewerButton()

    Dim ts() As Control = Me.ReportViewer1.Controls.Find("toolStrip1", True)
    If ts IsNot Nothing Then
        Dim
tsItem As ToolStrip = DirectCast(ts(0), ToolStrip)
        Dim item As New ToolStripButton
        item.Name = "newButton"
       
item.Text = "New Button"
       
item.BackColor = Color.Green
        item.ForeColor = Color.White
        item.Alignment = ToolStripItemAlignment.Right

        tsItem.Items.Add(item)

        AddHandler item.Click, AddressOf newButtonClick
   End If

End Sub

Quando o botão for pressionado:

'''  <summary>
''' Mostra uma mensagem quando o botão no ReportViewer for pressionado
''' 
</summary>
Sub newButtonClick()
    MessageBox.Show("This is my new button!")
End Sub


Este artigo mostra os primeiros passo, e os mais importantes, para usar os Microsoft Reports, e como utilizar o código. Espero que isto ajude a utiliza-los e mostrar como é simples trabalhar com eles.


Download do Exemplo

NOTICIA: Novo artigo de Microsoft Reporting Services

Hoje publiquei um novo artigo - Microsoft Reporting Services (Sub Reports, Charts, Parameters, Expression Editor, etc) - em codeproject.com. Desta vez com uma contribuição sobre a criação de relatórios, usando Microsoft Reporting Services, usando Visual Basic.NET 2008. Foca principalmente, e de uma forma resumida, a definição da DataSource do relatório, SubReports, Parameters, Expression Editor, Charts, e algumas personalizações ao Report Viewer.

Durante os próximos dias, este artigo estará disponível neste blog, em Português, e na Wiki da comunidade Portugal-a-Programar.

Espero que este artigo vos seja útil!


NOTICIA: Melhor Artigo VB.NET Abril 2009 - CodeProject


Numa noticia anterior referi que o meu primeiro artigo, que escrevi para o site codeproject.com, estava entre os 10 melhores do mês de Abril de 2009, na categoria de VB.NET, e se encontrava em votação.

Ora a votação terminou e o meu artigo foi considerado o Melhor Artigo VB.NET Abril 2009.

Esta foi a mensagem que recebi e a lista dos prémios:

Congratulations! You have won The Code Project Best VB.NET article of April 2009 .

Type: Article
Location: MergedDataGridView Control

iGrid.NET from 10Tec. Value: $199
Dundas Chart for .NET Pro from Dundas Software Ltd.. Value: $699
.Net Dashboard Suite from Perpetuumsoft. Value: $950
Nevron User Interface for .NET (Professional edition) from Nevron Software. Value: $369
Klik! EntryLib.Net (WinForms) from Klik! Software. Value: $299
Shell MegaPack.Net 2009 from LogicNP Software. Value: $299
The latest VB books from Apress from Apress. Value: $224.96
SmartOutline 2010 from SmartOutline. Value: $139

In total you have won $3,178.96 in prizes. Well done!

Obrigado a todos que participaram na votação e espero que o artigo vos tenha ajudado!


NOTICIA: Microsoft Ramp Up – Novos Recursos de Aprendizagem

A Microsoft disponibilizou mais um conjunto de recursos de aprendizagem gratuitos e com o objectivo em ajudar na evolução/transição de tecnologia. Este programa, designado por Ramp Up, tem diversos percursos, sendo estes alguns exemplos do que está disponível:

Move from ASP to ASP.NET
Level 1: Developing Web Applications – Tooling
Level 2: ASP.NET Syntax for ASP Developers
Level 3: Programming WebForms
Level 4: Web Configuration
Level 5: Programming Web Events
Level 6: State Management

For the Visual Studio 2002/2003 Developer: Learn Visual Studio 2005
Level 1: Introduction to .NET Framework 2.0
Level 2: Introduction to Data and Security
Level 3: Windows Application Development Concepts
Level 4: Web Application Development Basics

For the Visual Basic 6.0 Developer: Learn Visual Basic 2005
Level 1: Introduction to Visual Basic 2005
Level 2: .NET Framework 2.0, an Introduction
Level 3: Introduction to Data and Security
Level 4: Windows Application Development Concepts
Level 5: Web Application Development Basics

Develop Windows Mobile 6 Applications
Level 1: Mobile Development Introduction
Level 2: Device Emulators
Level 3: Mobile Windows Forms Development
Level 4: Advanced Mobile Windows Forms Development
Level 5: SQL Server CE Introduction
Level 6: Security and Deployment
Level 7: Mobile Web Development

Visual Studio 2008
Designed to help you concentrate on what is new in Microsoft Visual Studio 2008, this learning track helps you to upgrade your skills.




Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico