• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JFK

[VB.net] Imprimir dados de BD

1 mensagem neste tópico

Boas,

Nem sempre é fácil decidir como imprimir o conteudo/dados de uma base de dados em VB2005, no entanto deixo aqui a minha sugestão de o fazer utilizado a classe System.Drawing.Printing. A vantagem é que a aplicação não necessita de utilizar elementos externos, não a sobrecarregado, a desvantagem é que o código é trabalhoso.

A base de dados é Access (mdb), uma tabela (Produtos), com 3 colunas ( Código, Produto e Origem ), até á próxima...

Imports System.Data
Imports System.Data.OleDb

Public Class Form1
    Private MyConnection As OleDbConnection
    Private Leitor As OleDbDataReader
    Private RelatorioTitulo As String
    Private PaginaAtual As String

    ''Connection String da minha máquina

    Private Sub frmPrintDocumentDataReader_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MyConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Produtos.mdb")
    End Sub

    'Declara os métodos da impressão, através de um botão ( btnRelatório )

    Private Sub btnRelatorio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRelatorio.Click
        RelatorioTitulo = "Relatório de Produtos "
        Dim pd As Printing.PrintDocument = New Printing.PrintDocument()

        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)

        Dim objPrintPreview As New PrintPreviewDialog

        Try
            With objPrintPreview
                .Document = pd
                .WindowState = FormWindowState.Maximized
                .PrintPreviewControl.Zoom = 1
                .Text = "Catálogo de Produtos"
                .ShowDialog()
            End With
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Sub

    'A conexão e o DataReader é aberto aqui

    Private Sub Begin_Print(ByVal sender As Object, ByVal e As Printing.PrintEventArgs)
        Dim Sql As String = "SELECT Codigo,Produto,Origem from Produtos"
        Dim MyComand As New OleDbCommand(Sql, MyConnection)
        MyConnection.Open()
        Leitor = MyComand.ExecuteReader()
        PaginaAtual = 1
    End Sub

    'Layout da(s) página(s) a imprimir

    Private Sub pdRelatorios_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        'Variáveis das linhas

        Dim LinhasPorPagina As Single = 0
        Dim PosicaoDaLinha As Single = 0
        Dim LinhaAtual As Integer = 0

        'Variáveis das margens

        Dim MargemEsquerda 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)
        Dim codigoProduto As Integer
        Dim nomeProduto As String
        Dim origemProduto As String

        'Variáveis das fontes

        Dim FonteNegrito As Font
        Dim FonteTitulo As Font
        Dim FonteSubTitulo As Font
        Dim FonteRodape As Font

        Dim FonteNormal As Font
        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) ''' Este não sou eu...o tamanho é 8
        FonteNormal = New Font("Arial", 9)

        LinhaAtual = 0

        'Cabeçalho

        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 60, MargemDireita, 60)
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 160, MargemDireita, 160)
        e.Graphics.DrawString("Lista de Produtos", FonteTitulo, Brushes.Blue, MargemEsquerda + 350, 80, New StringFormat())

        'Imagem

        e.Graphics.DrawImage(Image.FromFile("C:\" & "Produtos.jpg"), 100, 68)
        e.Graphics.DrawString(RelatorioTitulo & System.DateTime.Today, FonteSubTitulo, Brushes.Black, MargemEsquerda + 190, 120, New StringFormat())
       e.Graphics.DrawString("Código", FonteNegrito, Brushes.Black, MargemEsquerda, 170, New StringFormat())
        e.Graphics.DrawString("Produto", FonteNegrito, Brushes.Black, MargemEsquerda + 100, 170, New StringFormat())
        e.Graphics.DrawString("Origem", FonteNegrito, Brushes.Black, MargemEsquerda + 500, 170, New StringFormat())
        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, 190, MargemDireita, 190)
        LinhasPorPagina = e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9

        'Aqui são lidos os dados

        While (LinhaAtual < LinhasPorPagina AndAlso Leitor.Read())
            codigoProduto = Leitor.GetInt32(0)
            nomeProduto = Leitor.GetString(1)
            origemProduto = Leitor.GetString(2)
            PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))

            e.Graphics.DrawString(codigoProduto.ToString(), FonteNormal, Brushes.Black, MargemEsquerda, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(nomeProduto, FonteNormal, Brushes.Black, MargemEsquerda + 100, PosicaoDaLinha, New StringFormat())
            e.Graphics.DrawString(origemProduto.ToString(), FonteNormal, Brushes.Black, MargemEsquerda + 500, PosicaoDaLinha, New StringFormat())

            LinhaAtual += 1
        End While

        'Rodapé

        e.Graphics.DrawLine(CanetaDaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
        e.Graphics.DrawString(System.DateTime.Now.ToString(), FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
        e.Graphics.DrawString("Página : " & PaginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())

        'Incrementa o número da página

        PaginaAtual += 1

        If (LinhaAtual > LinhasPorPagina) Then
            e.HasMorePages = True
        Else
            e.HasMorePages = False
        End If
    End Sub

    'Encerra a conexão e o DataReader

    Private Sub End_Print(ByVal sender As Object, ByVal byvale As Printing.PrintEventArgs)
        Leitor.Close()
        MyConnection.Close()
    End Sub

  JFK

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora