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
Abraços e até mais...
Perfeito. Muito obrigado brother.
ResponderExcluirObrigado pelo Comentário...
ExcluirE fico muito feliz que meu artigo te ajudou!
Atenciosamente,
Carlos Henrique Pereira - Analista de TI
Eai Carlos tudo bem?
ResponderExcluirEu 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á
Olá, tudo bem sim!
ExcluirVocê poderia me informar qual é o erro para que eu possa verificar?
Att,
Carlos Henrique Pereira - Analista de TI
Então e um erro muito grande, se eu pudesse mandar um print por e-mail seria melhor, se não te atrapalhar é claro!
ResponderExcluirObrigado pela atenção!
Agradeço desde já.
Viva,
ResponderExcluirEstá muito bom :).
Mas se reparares não mostra o ultimo produto (com o código 77)...Porque será?