VB .NET - Curso Prático ADO .NET - Módulo de Administração :  Gerando relatórios com PrintDocument - VIII


Nesta aula vou mostrar como gerar os relatórios para o módulo de administração da aplicação CiaFilmes usando o objeto PrintDocument do Visual Basic .NET.

A classe PrintDocument é o coração do processo de impressão no Visual Basic e ao usá-la em seu programa será criada uma instância desta classe com os eventos que serão usados para a impressão.

O objeto PrintDocument dispara quatro eventos chaves básicos:

  1. BeginPrint - Este evento é lançado quanto a impressão vai começar; neste momento o programa pode iniciar estrutura de dados, carregar dados, efetuar a conexão com a fonte de dados e realizar qualquer outra operação necessária antes de iniciar a impressão;
  2. QueryPageSettings - Este evento é acionado antes do programa imprimir uma página. Neste momento o programa pode modificar os dados do documento como alterar as margens da página, etc.;
  3. PrintPage - Este evento ocorre para gerar a página. O programa necessita capturar este evento e usar o objeto Graphics fornecido pelos parâmetros do manipulador de eventos para gerar a saída do relatório , ao final o manipulador de eventos deverá definir o valor de e.HashMorePages para True ou False e devolver para o objeto PrintDocument informando se existem mais páginas a serem geradas;
  4. EndPrint - Este evento será lançado ao término da impressão. Ele pode ser capturado para liberar os recursos usados, fechar conexões, etc.;

Depois que você criou um objeto PrintDocument e definiu os manipuladores de eventos você pode fazer 3 coisas com ele:

  1. Chamar o método Print do objeto para enviar o documento de imediato para a impressão padrão selecionada;
  2. Definir um controle PrintPreviewDialog e atribuir a sua propriedade Document um objeto PrintDocument e então chamar o método ShowDialog do controle. O controle PrintPreviewDialog exibe a janela para visualizar a impressão e usar o objeto PrintDocument para gerar a saída que será exibida. O controle possui um botão para enviar o documento para a impressora;

Nota:  O controle PrintPreviewControl exibe uma janela de visualização da impressão com a diferença que ele fica no seu formulário e não apresenta os mesmos botões  do PrintPreviewDialog mas possui métodos que permitem simular o mesmo comportamento.

  1. Definir um controle PrintDialog e atribuir a sua propriedade Document um objeto PrintDocument e então chamar o método ShowDialog do controle. O usuário pode selecionar a impressora e definir suas propriedades , quando o usuário clicar na opção para imprimir o objeto PrintDocument envia o documento para impressora;

A vantagem em usar o PrintDocument para gerar os seus relatórios é que você não acrescenta nenhuma componente de terceiro à sua aplicação facilitando a distribuição. Outra opção seria usar o Crystal Reports que seria indicado para relatórios mais complexos e com gráficos.

Em nosso exemplo vou gerar dois relatórios básicos :

  1. O relatório de filmes cadastrados no sistema
  2. O relatório dos clientes cadastrados no sistema

A partir do exemplo destes dois relatórios será mais fácil gerar os demais relatórios.

Antes de iniciar a geração dos relatórios vamos lembra que criamos um módulo no projeto de nome Geral.vb com o seguinte código:

Module Geral

    'variaveis e métodos publicos (visiveis em todo o projeto)
    Public strConexaoSQLServer As String = Nothing
    Public clienteLogin As String
    Public clienteCodigo As Integer
    Public usuarioPerfil As String

    'variaveis publicas usadas pelos relatorios
    Public RelatorioTitulo As String
    Public objPrintPreview As PrintPreviewDialog
    Public linhasPorPagina As Integer
    Public linhaAtual As Integer
    Public posicaoDaLinha As Integer
    Public paginaAtual As Integer = 1

    Public Function CifraDecifraSenha(Text As String) As String
        Dim strTempChar As String = ""

        For i = 1 To Len(Text)
            If Asc(Mid$(Text, i, 1)) < 128 Then
                strTempChar = Asc(Mid$(Text, i, 1)) + 128
            ElseIf Asc(Mid$(Text, i, 1)) > 128 Then
                strTempChar = Asc(Mid$(Text, i, 1)) - 128
            End If
            Mid$(Text, i, 1) = Chr(strTempChar)
        Next i
        CifraDecifraSenha = Text
    End Function

    'obtem o caminho da imagem no relatorio
    Public Function GetCaminhoImagem() As String
        Dim root As String = Environment.GetFolderPath(0)
        Dim caminhoImagem As String = Application.StartupPath

        If caminhoImagem.IndexOf("\bin\Debug") Then
            caminhoImagem = caminhoImagem.Replace("\bin\Debug", "")
        ElseIf caminhoImagem.IndexOf("\bin\Release") Then
            caminhoImagem = caminhoImagem.Replace("\bin\Release", "")
        End If

        caminhoImagem = caminhoImagem & "\Imagens\"
        Return caminhoImagem

    End Function

End Module

Neste módulo estamos definindo as variáveis globais que serão usadas nos relatórios do sistema :

'variaveis publicas usadas pelos relatorios
    Public RelatorioTitulo As String
    Public objPrintPreview As PrintPreviewDialog
    Public linhasPorPagina As Integer
    Public linhaAtual As Integer
    Public posicaoDaLinha As Integer
    Public paginaAtual As Integer = 1

Estamos definindo também a função GerCaminhoImagem() que obtém uma imagem a partir da pasta Imagens que devermos criar em nosso projeto e nela colocar a imagem que será usada em nossos relatórios:

'obtem o caminho da imagem no relatorio
    Public Function GetCaminhoImagem() As String
        Dim root As String = Environment.GetFolderPath(0)
        Dim caminhoImagem As String = Application.StartupPath

        If caminhoImagem.IndexOf("\bin\Debug") Then
            caminhoImagem = caminhoImagem.Replace("\bin\Debug", "")
        ElseIf caminhoImagem.IndexOf("\bin\Release") Then
            caminhoImagem = caminhoImagem.Replace("\bin\Release", "")
        End If

        caminhoImagem = caminhoImagem & "\Imagens\"
        Return caminhoImagem

    End Function

1- Gerando o relatório dos filmes cadastrados no sistema

A partir do formulário frmMenuAdmin (que definimos na aula 15) onde temos o menu Relatórios, temos duas opções no menu : Filmes e Clientes.

Na opção Filmes o seguinte código do evento Click do controle ToolStipMenuItem:

 Private Sub RelatoriosFilmesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RelatoriosFilmesToolStripMenuItem.Click
        'define o titulo do relatorio
        RelatorioTitulo = "Relação de Filmes  - "
        'define os objetos printdocument e os eventos associados
        Dim pd As Printing.PrintDocument = New Printing.PrintDocument()

        'IMPORTANTE - definimos 3 eventos para tratar a impressão : PringPage, BeginPrint e EndPrint.
        AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdRelatorios_PrintPage)
        AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print)
        AddHandler pd.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print)

        'define o objeto para visualizar a impressao
        Dim objPrintPreview As New PrintPreviewDialog
        Try
            'define o formulário como maximizado e com Zoom
            With objPrintPreview
                .Document = pd
                .WindowState = FormWindowState.Normal
                .PrintPreviewControl.Zoom = 1
                .Text = "Relação de Filmes"
                .ShowDialog()
            End With
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub

No código acima estamos definindo os manipuladores de evento e a seguir vamos definir o código em cada um deles. Vemos abaixo as rotinas Begin_Print e End_Print que neste exemplo praticamente não possui tarefas a realizar:

'inicia aimpressão
Private Sub Begin_Print(ByVal sender As Object, ByVal e As Printing.PrintEventArgs)
    paginaAtual = 1
End Sub

'Encerra a conexÆo
Private Sub End_Print(ByVal sender As Object, ByVal byvale As Printing.PrintEventArgs)
End Sub

O evento PrintPage() é que realiza todo o trabalho de impressão como podemos notar.

Nele estamos definindo:

 Private Sub pdRelatorios_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
        'Variaveis das linhas
        Dim LinhasPorPagina As Single = 0
        Dim PosicaoDaLinha As Single = 0
        Dim LinhaAtual As Integer
        Dim deslocamentoVertical As Integer = 250
        'define as variáveis para armazenar os valores de um filme
        Dim filmeid As String = ""
        Dim titulo As String = ""
        Dim nomeDiretor As String = ""
        Dim nomeProdutor As String = ""
        Dim duracao As String = ""
        Dim descricao As String = ""
        Dim nomeCategoria As String = ""
        Dim anoLancamento As String = ""
        'Variaveis das margens
        Dim MargemEsq As Single = e.MarginBounds.Left
        Dim MargemSuperior As Single = e.MarginBounds.Top + 100
        Dim MargemDireita As Single = e.MarginBounds.Right
        Dim MargemInferior As Single = e.MarginBounds.Bottom
        Dim CanetaDaImpressora As Pen = New Pen(Color.Black, 1)
        'Variaveis das fontes
        Dim FonteNegrito As Font
        Dim FonteTitulo As Font
        Dim FonteSubTitulo As Font
        Dim FonteRodape As Font
        Dim FonteNormal As Font
        'define efeitos em fontes
        FonteNegrito = New Font("Arial", 9, FontStyle.Bold)
        FonteTitulo = New Font("Arial", 15, FontStyle.Bold)
        FonteSubTitulo = New Font("Arial", 12, FontStyle.Bold)
        FonteRodape = New Font("Arial", 8)
        FonteNormal = New Font("Arial", 10)
        'define valores para linha atual e para linha da impressao
        LinhaAtual = 0
        Dim li = 0
        'Cabecalho
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsq, 60, MargemDireita, 60)
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsq, 160, MargemDireita, 160)
        'nome da empresa
        e.Graphics.DrawString(My.Settings.Empresa, FonteTitulo, Brushes.Blue, MargemEsq + 250, 80, New StringFormat())
        'Imagem
        e.Graphics.DrawImage(Image.FromFile(GetCaminhoImagem() & "maco10.gif"), 100, 68)
        e.Graphics.DrawString(RelatorioTitulo & System.DateTime.Today, FonteSubTitulo, Brushes.Black, MargemEsq + 250, 110, New StringFormat())
        'define o no de linhas por paginas
        LinhasPorPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)
        'cria um contexto 
        Dim ctxCiaFilmes = New CiaFilmesEntities()
        Dim registros As Integer = ctxCiaFilmes.Filmes.Count
        'realiza uma consulta usando LINQ para obter os dados dos filmes
        Dim filmes = (From _film In ctxCiaFilmes.Filmes
                            Order By _film.FilmeId
                            Select New With {_film.FilmeId, _film.Titulo, .nomeDiretor = _film.Diretor.Nome, .nomeProdutor = _film.Produtor.Nome,
                           _film.Duracao, _film.Descricao, .nomeCategoria = _film.Categorias.Nome, _film.AnoLancamento}).ToList
        'inicia a impressao
        PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
        'Aqui sao lidos os dados
        While (LinhaAtual < LinhasPorPagina AndAlso registros > li)
            'obtem os valores da consulta LINQ
            filmeid = filmes(li).FilmeId
            titulo = filmes(li).Titulo
            nomeDiretor = filmes(li).nomeDiretor
            nomeProdutor = filmes(li).nomeProdutor
            duracao = filmes(li).Duracao
            descricao = filmes(li).Descricao
            nomeCategoria = filmes(li).nomeCategoria
            anoLancamento = filmes(li).AnoLancamento
            PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
            'impressão dos dados
            e.Graphics.DrawString("Código : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha)
            e.Graphics.DrawString(filmeid, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha)
            e.Graphics.DrawString("Titulo : ", FonteNormal, Brushes.Black, MargemEsq + 200, PosicaoDaLinha)
            e.Graphics.DrawString(titulo, FonteNormal, Brushes.Black, MargemEsq + 250, PosicaoDaLinha)
            e.Graphics.DrawString("Diretor : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 20)
            e.Graphics.DrawString(nomeDiretor, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 20)
            e.Graphics.DrawString("Produtor : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 40)
            e.Graphics.DrawString(nomeProdutor, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 40)
            e.Graphics.DrawString("Duracao : ", FonteNormal, Brushes.Black, MargemEsq + 300, PosicaoDaLinha + 40)
            e.Graphics.DrawString(duracao, FonteNormal, Brushes.Black, MargemEsq + 390, PosicaoDaLinha + 40)
            e.Graphics.DrawString("Descricao : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 60)
            e.Graphics.DrawString(descricao, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 60)
            e.Graphics.DrawString("Categoria : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 80)
            e.Graphics.DrawString(nomeCategoria, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 80)
            e.Graphics.DrawString("Ano Lançamento : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 100)
            e.Graphics.DrawString(anoLancamento, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 100)
            ''verifica se imprime um ou todos 
            'If chkImprimirCliente.Checked = True Then
            '    LinhaAtual += 1
            'Else
            LinhaAtual += 8
            'End If
            li += 1
        End While
        'Rodape
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsq, MargemInferior, MargemDireita, MargemInferior)
        e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsq, MargemInferior, New StringFormat())
        LinhaAtual += CInt(FonteNormal.GetHeight(e.Graphics))
        LinhaAtual += 1
        e.Graphics.DrawString("Pagina : " & paginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())
        'Incrementa o numero da pagina
        paginaAtual += 1
        'verifica se continua imprimindo
        If (LinhaAtual > LinhasPorPagina) Then
            e.HasMorePages = True
        Else
            e.HasMorePages = False
        End If
    End Sub

Os dados são obtidos através da criação de um contexto ctxCiaFilmes a partir do Entity Data Model e da realização de uma consulta LINQ onde obtemos os dados dos filmes:

        'cria um contexto 
        Dim ctxCiaFilmes = New CiaFilmesEntities()
        Dim registros As Integer = ctxCiaFilmes.Filmes.Count
        'realiza uma consulta usando LINQ para obter os dados dos filmes
        Dim filmes = (From _film In ctxCiaFilmes.Filmes
                            Order By _film.FilmeId
                            Select New With {_film.FilmeId, _film.Titulo, .nomeDiretor = _film.Diretor.Nome, .nomeProdutor = _film.Produtor.Nome,
                           _film.Duracao, _film.Descricao, .nomeCategoria = _film.Categorias.Nome, _film.AnoLancamento}).ToList

A seguir iniciamos um laço While onde atribuímos os valores obtidos na consulta acima às variáveis que representam cada campo da tabela Filmes:

 'Aqui sao lidos os dados
        While (LinhaAtual < LinhasPorPagina AndAlso registros > li)
            'obtem os valores da consulta LINQ
            filmeid = filmes(li).FilmeId
            titulo = filmes(li).Titulo
            nomeDiretor = filmes(li).nomeDiretor
            nomeProdutor = filmes(li).nomeProdutor
            duracao = filmes(li).Duracao
            descricao = filmes(li).Descricao
            nomeCategoria = filmes(li).nomeCategoria
            anoLancamento = filmes(li).AnoLancamento

Depois realizamos a impressão usando os métodos DrawString() onde montamos o relatório manualmente usando as variáveis para controlar a Margem e posição da linha:

impressão dos dados
            e.Graphics.DrawString("Código : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha)
            e.Graphics.DrawString(filmeid, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha)
            e.Graphics.DrawString("Titulo : ", FonteNormal, Brushes.Black, MargemEsq + 200, PosicaoDaLinha)
            e.Graphics.DrawString(titulo, FonteNormal, Brushes.Black, MargemEsq + 250, PosicaoDaLinha)
            e.Graphics.DrawString("Diretor : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 20)
            e.Graphics.DrawString(nomeDiretor, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 20)
            e.Graphics.DrawString("Produtor : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 40)
            e.Graphics.DrawString(nomeProdutor, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 40)
            e.Graphics.DrawString("Duracao : ", FonteNormal, Brushes.Black, MargemEsq + 300, PosicaoDaLinha + 40)
            e.Graphics.DrawString(duracao, FonteNormal, Brushes.Black, MargemEsq + 390, PosicaoDaLinha + 40)
            e.Graphics.DrawString("Descricao : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 60)
            e.Graphics.DrawString(descricao, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 60)
            e.Graphics.DrawString("Categoria : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 80)
            e.Graphics.DrawString(nomeCategoria, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 80)
            e.Graphics.DrawString("Ano Lançamento : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 100)
            e.Graphics.DrawString(anoLancamento, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 100)

O resultado final é visto abaixo:

2- Gerando o relatório dos clientes cadastrados no sistema

A geração do relatório dos clientes cadastrados segue o mesmo raciocínio e fluxo do relatório anterior e dessa forma eu só vou colocar o código sem comentar novamente.

 

Na opção Clientes o seguinte código do evento Click do controle ToolStipMenuItem:

 

 Private Sub RelatoriosClientesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RelatoriosClientesToolStripMenuItem.Click
        'define o titulo do relatorio
        RelatorioTitulo = "Relação de Clientes  - "
        'define os objetos printdocument e os eventos associados
        Dim pd As Printing.PrintDocument = New Printing.PrintDocument()
        'IMPORTANTE - definimos 3 eventos para tratar a impressão : PringPage, BeginPrint e EndPrint.
        AddHandler pd.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdRelatorios_PrintPage2)
        AddHandler pd.BeginPrint, New Printing.PrintEventHandler(AddressOf Me.Begin_Print2)
        AddHandler pd.EndPrint, New Printing.PrintEventHandler(AddressOf Me.End_Print2)
        'define o objeto para visualizar a impressao
        Dim objPrintPreview As New PrintPreviewDialog
        Try
            'define o formulário como maximizado e com Zoom
            With objPrintPreview
                .Document = pd
                .WindowState = FormWindowState.Normal
                .PrintPreviewControl.Zoom = 1
                .Text = "Relação de Clientes"
                .ShowDialog()
            End With
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub

 

O código da para os eventos Begin_Print2 e End_Print2 é vista a seguir:

 

'A conexão pode ser aberta aqui
Private Sub Begin_Print2(ByVal sender As Object, ByVal e As Printing.PrintEventArgs)
     paginaAtual = 1
End Sub
'Encerra a conexão
Private Sub End_Print2(ByVal sender As Object, ByVal byvale As Printing.PrintEventArgs)
End Sub

O evento PrintPages() é que realiza todo o trabalho de impressão como podemos notar novamente:

Nele estamos definindo:

Private Sub pdRelatorios_PrintPage2(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
        'Variaveis das linhas
        Dim LinhasPorPagina As Single = 0
        Dim PosicaoDaLinha As Single = 0
        Dim LinhaAtual As Integer
        Dim deslocamentoVertical As Integer = 250
        'define as variáveis para armazenar os valores de um filme
        Dim clienteid As String = ""
        Dim nome As String = ""
        Dim sobrenome As String = ""
        Dim endereco As String = ""
        Dim cidade As String = ""
        Dim estado As String = ""
        Dim cep As String = ""
        Dim telefone As String = ""
        Dim email As String = ""
        Dim nascimento As String = ""
        Dim numeroCartaoCredito As String = ""
        Dim validadCartaoCredito As String = ""
        Dim codigoSegurancaCartao As String = ""
        Dim login As String = ""
        Dim senha As String = ""
        'Variaveis das margens
        Dim MargemEsq As Single = e.MarginBounds.Left
        Dim MargemSuperior As Single = e.MarginBounds.Top + 100
        Dim MargemDireita As Single = e.MarginBounds.Right
        Dim MargemInferior As Single = e.MarginBounds.Bottom
        Dim CanetaDaImpressora As Pen = New Pen(Color.Black, 1)
        'Variaveis das fontes
        Dim FonteNegrito As Font
        Dim FonteTitulo As Font
        Dim FonteSubTitulo As Font
        Dim FonteRodape As Font
        Dim FonteNormal As Font
        'define efeitos em fontes
        FonteNegrito = New Font("Arial", 9, FontStyle.Bold)
        FonteTitulo = New Font("Arial", 15, FontStyle.Bold)
        FonteSubTitulo = New Font("Arial", 12, FontStyle.Bold)
        FonteRodape = New Font("Arial", 8)
        FonteNormal = New Font("Arial", 10)
        'define valores para linha atual e para linha da impressao
        LinhaAtual = 0
        Dim li = 0
        'Cabecalho
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsq, 60, MargemDireita, 60)
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsq, 160, MargemDireita, 160)
        'nome da empresa
        e.Graphics.DrawString(My.Settings.Empresa, FonteTitulo, Brushes.Blue, MargemEsq + 250, 80, New StringFormat())
        'Imagem
        e.Graphics.DrawImage(Image.FromFile(GetCaminhoImagem() & "maco10.gif"), 100, 68)
        e.Graphics.DrawString(RelatorioTitulo & System.DateTime.Today, FonteSubTitulo, Brushes.Black, MargemEsq + 250, 110, New StringFormat())
        'define o no de linhas por paginas
        LinhasPorPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)
        'cria um contexto 
        Dim ctxCiaFilmes = New CiaFilmesEntities()
        Dim registros As Integer = ctxCiaFilmes.Clientes.Count
        'realiza uma consulta usando LINQ para obter os dados dos filmes
        Dim clientes = (From _cli In ctxCiaFilmes.Clientes
                              Order By _cli.ClienteId
                              Select New With {_cli.ClienteId, _cli.Nome, _cli.Sobrenome, _cli.Endereco, _cli.Cidade, _cli.Estado, _cli.Cep, _cli.Telefone, _cli.Email,
                              _cli.Nascimento, _cli.NumeroCartaoCredito, _cli.ValidadeCartao, _cli.CodigoSegurancaCartao, _cli.Login, _cli.Senha}).ToList

        'inicia a impressao
        PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
        'Aqui sao lidos os dados
        While (LinhaAtual < LinhasPorPagina AndAlso registros > li)
            'obtem os valores da consulta LINQ
            clienteid = clientes(li).ClienteId
            nome = clientes(li).Nome
            sobrenome = clientes(li).Sobrenome
            endereco = clientes(li).Endereco
            cidade = clientes(li).Cidade
            estado = clientes(li).Estado
            cep = clientes(li).Cep
            telefone = clientes(li).Telefone
            email = clientes(li).Email
            nascimento = clientes(li).Nascimento
            numeroCartaoCredito = clientes(li).NumeroCartaoCredito
            validadCartaoCredito = clientes(li).ValidadeCartao
            codigoSegurancaCartao = clientes(li).CodigoSegurancaCartao
            login = clientes(li).Login
            senha = clientes(li).Senha
            PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
            'impressão dos dados
            e.Graphics.DrawString("Código : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha)
            e.Graphics.DrawString(clienteid, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha)
            e.Graphics.DrawString("Nome : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 20)
            e.Graphics.DrawString(nome, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 20)
            e.Graphics.DrawString("Sobrenome : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 40)
            e.Graphics.DrawString(sobrenome, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 40)
            e.Graphics.DrawString("Endereco : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 60)
            e.Graphics.DrawString(endereco, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 60)
            e.Graphics.DrawString("Cidade : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 80)
            e.Graphics.DrawString(cidade, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 80)
            e.Graphics.DrawString("Estado : ", FonteNormal, Brushes.Black, MargemEsq + 350, PosicaoDaLinha + 80)
            e.Graphics.DrawString(estado, FonteNormal, Brushes.Black, MargemEsq + 450, PosicaoDaLinha + 80)
            e.Graphics.DrawString("Cep : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 100)
            e.Graphics.DrawString(cep, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 100)
            e.Graphics.DrawString("Telefone : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 120)
            e.Graphics.DrawString(telefone, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 120)
            e.Graphics.DrawString("Email : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 140)
            e.Graphics.DrawString(email, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 140)
            e.Graphics.DrawString("Data de Nascimento : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 160)
            e.Graphics.DrawString(nascimento, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 160)
            e.Graphics.DrawString("No. Cartão Crédito : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 180)
            e.Graphics.DrawString(numeroCartaoCredito, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 180)
            e.Graphics.DrawString("Valid. do Cartão : ", FonteNormal, Brushes.Black, MargemEsq + 280, PosicaoDaLinha + 180)
            e.Graphics.DrawString(validadCartaoCredito, FonteNormal, Brushes.Black, MargemEsq + 400, PosicaoDaLinha + 180)
            e.Graphics.DrawString("Cód. de Segurança  : ", FonteNormal, Brushes.Black, MargemEsq + 470, PosicaoDaLinha + 180)
            e.Graphics.DrawString(codigoSegurancaCartao, FonteNormal, Brushes.Black, MargemEsq + 610, PosicaoDaLinha + 180)
            e.Graphics.DrawString("Login  : ", FonteNormal, Brushes.Black, MargemEsq, PosicaoDaLinha + 200)
            e.Graphics.DrawString(login, FonteNormal, Brushes.Black, MargemEsq + 150, PosicaoDaLinha + 200)
            e.Graphics.DrawString("Senha  : ", FonteNormal, Brushes.Black, MargemEsq + 350, PosicaoDaLinha + 200)
            e.Graphics.DrawString(senha, FonteNormal, Brushes.Black, MargemEsq + 450, PosicaoDaLinha + 200)
            LinhaAtual += 15
            li += 1
        End While
        'Rodape
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsq, MargemInferior, MargemDireita, MargemInferior)
        e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsq, MargemInferior, New StringFormat())
        LinhaAtual += CInt(FonteNormal.GetHeight(e.Graphics))
        LinhaAtual += 1
        e.Graphics.DrawString("Pagina : " & paginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())
        'Incrementa o numero da pagina
        paginaAtual += 1
        'verifica se continua imprimindo
        If (LinhaAtual > LinhasPorPagina) Then
            e.HasMorePages = True
        Else
            e.HasMorePages = False
        End If
    End Sub

 

Abaixo vemos o relatório sendo exibido:

 

 

Na próxima, e última aula, iremos concluir o módulo de administração criando o pacote de distribuição.

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti