sexta-feira, 24 de agosto de 2012

on




Imports System.Drawing.Printing
Imports System.Data.OleDb

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private leitor As OleDbDataReader
    Private paginaAtual As Integer = 1

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

        Dim conn As New OleDbConnection()
        conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Dados\Northwind1.mdb"
        Dim cmd As OleDbCommand = conn.CreateCommand

        cmd.CommandText = "Select CódigoDoProduto,NomeDoProduto, PreçoUnitário from Produtos"
        conn.Open()

        leitor = cmd.ExecuteReader()

        Try
            While leitor.Read()
                'cria um novo documento para impressão
                Dim pd As PrintDocument = New PrintDocument()

                'relaciona o objeto pd ao procedimento rptProdutos
                AddHandler pd.PrintPage, AddressOf Me.rptProdutos

                'cria uma nova instância do objeto PrintPreviewDialog()
                Dim objPrintPreview As PrintPreviewDialog = New PrintPreviewDialog()

                'define algumas propriedades do obejto
                With objPrintPreview
                    'indica qual o documento vai ser visualizado
                    .Document = pd
                    .WindowState = FormWindowState.Maximized
                    .PrintPreviewControl.Zoom = 1   'maximiza a visualização
                    .Text = "Catálogo de Produtos"
                    'exibe a janela de visualização para o usuário
                    .ShowDialog()
                End With

            End While
            leitor.Close()
            conn.Close()
        Catch erro As Exception
            MsgBox("Erro " & vbCrLf & erro.ToString, MsgBoxStyle.Critical, "Erro")
        End Try
    End Sub

    Private Sub rptProdutos(ByVal sender As Object, ByVal Relatorio As System.Drawing.Printing.PrintPageEventArgs)

        Dim codigoProduto As String
        Dim nomeProduto As String
        Dim precoProduto As String

        Dim linhasPorPagina As Single = 0
        Dim posicaoDaLinha As Single = 0
        Dim linhaAtual As Single = 0

        Dim margemEsq As Single = Relatorio.MarginBounds.Left
        Dim margemSup As Single = Relatorio.MarginBounds.Top + 100
        Dim margemDir As Single = Relatorio.MarginBounds.Right
        Dim margemInf As Single = Relatorio.MarginBounds.Bottom

        Dim fonteTitulo As Font
        Dim fonteColuna As Font
        Dim fonteRodape As Font
        Dim fonteNormal As Font

        Dim caneta As Pen = New Pen(Color.Black, 1)

        fonteTitulo = New Font("Verdana", 15, FontStyle.Bold)
        fonteColuna = New Font("Verdana", 10, FontStyle.Bold)
        fonteRodape = New Font("Verdana", 8)
        fonteNormal = New Font("Verdana", 10)

        'impressão do cabeçalho
        Relatorio.Graphics.DrawLine(caneta, margemEsq, 60, margemDir, 60)
        Relatorio.Graphics.DrawImage(Image.FromFile("c:\Dados\" & "SQL Logo.jpg"), 100, 68)
        Relatorio.Graphics.DrawLine(caneta, margemEsq, 130, margemDir, 130)
        Relatorio.Graphics.DrawString("Catálogo de Produtos", fonteTitulo, Brushes.Blue, margemEsq + 275, 80, New StringFormat())

        'impressão do titulo das colunas
        Relatorio.Graphics.DrawString("Código", fonteColuna, Brushes.Red, margemEsq, 140, New StringFormat())
        Relatorio.Graphics.DrawString("Produto", fonteColuna, Brushes.Red, margemEsq + 100, 140, New StringFormat())
        Relatorio.Graphics.DrawString("Preço", fonteColuna, Brushes.Red, margemEsq + 500, 140, New StringFormat())
        Relatorio.Graphics.DrawLine(caneta, margemEsq, 170, margemDir, 170)

        'define o número de linhas por página
        'para isto faço a divisão da área de impressão pelo tamanho da fonte subtraido do valor 10
        linhasPorPagina = Relatorio.MarginBounds.Height / fonteNormal.GetHeight(Relatorio.Graphics) - 10

        'para imprimir os dados da base de dados no relatório teremos que atribuir as variáveis os valores
        'através do objeto OleDbDatareader
        codigoProduto = leitor(0) 'codigo do produto
        nomeProduto = leitor(1)   'nome do produto
        precoProduto = leitor(2)  'preco do produto

        'agora vamos dar um laço através dos registros do DataReader levando em conta o número de linhas
        'permitido para a página. Enquanto a linha atual for menor que o número de linhas por página e não
        'final de arquivo estaremo no loop
        While (linhaAtual < linhasPorPagina And leitor.Read())

            'acompanha a posição da linha atual
            posicaoDaLinha = margemSup + (linhaAtual * fonteNormal.GetHeight(Relatorio.Graphics))

            'imprime os dados relativo ao codigo , nome do produto e preço do produto
            Relatorio.Graphics.DrawString(codigoProduto, fonteNormal, Brushes.Black, margemEsq, posicaoDaLinha, New StringFormat())
            Relatorio.Graphics.DrawString(nomeProduto, fonteNormal, Brushes.Black, margemEsq + 100, posicaoDaLinha, New StringFormat())
            Relatorio.Graphics.DrawString(FormatCurrency(precoProduto), fonteNormal, Brushes.Black, margemEsq + 500, posicaoDaLinha, New StringFormat())

            'faz o incremento no número de linha
            linhaAtual += 1

            'verifica se ainda podemos imprimir , ou seja , se a linha atual é menor que o número
            'de linhas permitido pela página. Se for continuamos a atribuir os dados e a imprimir
            If (linhaAtual < linhasPorPagina) Then
                codigoProduto = leitor(0) 'codigo do produto
                nomeProduto = leitor(1)   'nome do produto
                precoProduto = leitor(2)  'preco do produto
            End If

        End While

        'imprime o rodape no relatorio
        Relatorio.Graphics.DrawLine(caneta, margemEsq, margemInf, margemDir, margemInf)
        Relatorio.Graphics.DrawString(System.DateTime.Now, fonteRodape, Brushes.Black, margemEsq, margemInf, New StringFormat())
        Relatorio.Graphics.DrawString("Pag. " & paginaAtual.ToString, fonteRodape, Brushes.Black, margemDir - 50, margemInf, New StringFormat())

        'incrementa a página atual
        paginaAtual += 1

    End Sub

End Class


Pegue o projeto neste link : http://www.mediafire.com/?3p5kwkvxav59zja

Abraços e até mais...

6 comentários:

  1. Perfeito. Muito obrigado brother.

    ResponderExcluir
    Respostas
    1. Obrigado pelo Comentário...
      E fico muito feliz que meu artigo te ajudou!

      Atenciosamente,
      Carlos Henrique Pereira - Analista de TI

      Excluir
  2. Eai Carlos tudo bem?

    Eu consegui faze o relatório com base no seu exemplo normal, porém na hora da impressão, está dando erro.
    Você sabe me dar uma ajuda?

    Agradeço desde já

    ResponderExcluir
    Respostas
    1. Olá, tudo bem sim!

      Você poderia me informar qual é o erro para que eu possa verificar?

      Att,
      Carlos Henrique Pereira - Analista de TI

      Excluir
  3. Então e um erro muito grande, se eu pudesse mandar um print por e-mail seria melhor, se não te atrapalhar é claro!

    Obrigado pela atenção!

    Agradeço desde já.

    ResponderExcluir
  4. Viva,
    Está muito bom :).
    Mas se reparares não mostra o ultimo produto (com o código 77)...Porque será?

    ResponderExcluir