Ir para conteúdo
Fórum Script Brasil
  • 0

Impressão usando o System.Drawing.Printing


Carlos Rocha

Pergunta

Impressão usando o System.Drawing.Printing

Ola pessoal!

Resolvi fazer o modelo do macorati de Impressão usando o System.Drawing.Printing, porem com dataset --> http://www.macoratti.net/vbn_prn2.htm

A paginação conta as paginas certinho mas exibe todos os registros na primeira folha e quando rolo para a segundfa folha, o print rola mas não tem dados.

Onde podee ser que estou errando?

'função ExecuteDS() que est NA CLASSE DBConnection
Public Function ExecuteDS(ByVal sql As String, ByRef tabela As String) As DataSet
        Dim ds As New DataSet
        Dim da As MySqlDataAdapter = New MySqlDataAdapter()

        Try
            OpenConnection()
            cmd.CommandType = CommandType.Text
            cmd.CommandText = sql
            cmd.Connection = Conexao
            da.SelectCommand = cmd
            da.Fill(ds, tabela)
            dt = ds.Tables(tabela)
            da.Dispose()
            Return ds
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return ds
    End Function
Imports MySql.Data.MySqlClient
Imports System.Text.RegularExpressions
Imports System.Math
Imports System.Drawing.Printing

Public Class Pedidos
    'INICIO DAS DECLARAÇÕES DAS VARIAVEIS GLOBAIS
    Dim accDb As New DBConnection
    Dim leitor As DataSet = Nothing
    Dim TabelaClientes As String = "clientes"
    Dim TabelaProdutos As String = "produtos"
    Dim TabelaPedidos As String = "pedidos"
    Dim TabelaDetalhesPedidos As String = "detalhespedidos"
    Private PaginaAtual As Integer = 1
    Private TotalPaginas As Integer
    Dim LinhaAtual As Integer = 0

    Private Sub rptItensPedidos(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
        Dim ccodigo As Integer = codigoped.Text

        Dim produtoID As Integer
        Dim unidade As String
        Dim descricao As String
        Dim preço As Integer
        Dim quantidade As Integer
        Dim subtotal As Integer

        'variáveis para definição das configurações da impressora (margens, número de linhas, espessura da caneta) 
        Dim LinhasPorPagina As Single = 0
        Dim PosicaoDaLinha As Single = 0

        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)

        'variáveis para armazenar as fontes que serão utilizadas durante a impressão
        Dim FonteNegrito As Font
        Dim FonteTitulo As Font
        Dim FonteSubTitulo As Font
        Dim FonteRodape As Font
        Dim FonteNormal As Font

        'definição das fontes (tamanho e estilo)
        FonteNegrito = New Font("Arial", 9, FontStyle.Bold)
        FonteTitulo = New Font("Arial", 20, FontStyle.Bold)
        FonteSubTitulo = New Font("Arial", 12, FontStyle.Bold)
        FonteRodape = New Font("Arial", 8)
        FonteNormal = New Font("Arial", 9)

        '********************************
        'inicio imprime o cabeçalho do relatório
        '********************************
        e.Graphics.DrawLine(Pens.Black, MargemEsquerda, 60, MargemDireita, 60)

        e.Graphics.DrawImage(Image.FromFile("imagens\" & "maco10.gif"), 100, 68)
        e.Graphics.DrawString("PEDIDO", New Font("arial", 15, FontStyle.Regular), Brushes.Black, MargemEsquerda + 260, 80)
        e.Graphics.DrawString("Dados da empresa", New Font("arial", 15, FontStyle.Regular), Brushes.Black, MargemEsquerda + 400, 80)

        e.Graphics.DrawString("Pedido     : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 160)
        e.Graphics.DrawString(ccodigo, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 160)
        Dim pgto As String
        Dim PrintStringpedidos As String = "select p.pedidoID, p.clienteID, p.ativo, p.data, p.cobranca, p.entrega, p.frete, p.pgto, p.CondPgto, c.nome as nome, c.tipo as pessoa, c.cpf_cnpj as dcto from  pedidos p inner join clientes c ON  p.clienteID = c.clienteID  where pedidoID= " & ccodigo
        Dim DRP As DataSet = accDb.ExecuteDS(PrintStringpedidos, TabelaPedidos)
        For Each linha As DataRow In DRP.Tables(0).Rows
            e.Graphics.DrawString("Data     : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 200, 160)
            e.Graphics.DrawString(linha.Item("data"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 250, 160)

            e.Graphics.DrawString("Frete     : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 400, 160)
            e.Graphics.DrawString(linha.Item("frete"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 450, 160)

            If linha.Item("PGTO") = "V" Then
                pgto = "À Vista"
                e.Graphics.DrawString("PAGAMENTO:", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 300, 180)
                e.Graphics.DrawString(pgto, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 450, 180)
            End If

            If linha.Item("PGTO") = "P" Then
                pgto = "À PRAZO"
                e.Graphics.DrawString("PAGAMENTO:", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 300, 180)
                e.Graphics.DrawString(pgto, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 400, 180)
                e.Graphics.DrawString("Forma: ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 500, 180)
                e.Graphics.DrawString(linha.Item("CondPgto").ToString.Replace(" ", ",") + " Dias", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 570, 180)
            End If
            Dim documento As String = ""
            Dim TIPO As String = ""
            If linha.Item("dcto").ToString.Length = 11 Then
                ' mascara de cpf
                documento = String.Format("999,999,999-99", linha.Item("dcto").ToString)
                TIPO = "CPF"
            End If

            If linha.Item("dcto").ToString.Length = 14 Then
                ' mascara de cnpj
                documento = String.Format("99,999,999-9999-99", linha.Item("dcto").ToString)
                TIPO = "CNPJ"
            End If

            e.Graphics.DrawString(TIPO & "           : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 180)
            e.Graphics.DrawString(documento, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 180)
            e.Graphics.DrawString("Nome         : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 200)
            e.Graphics.DrawString(linha.Item("nome"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 200)
            e.Graphics.DrawString("Cobrança    : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 220)
            e.Graphics.DrawString(linha.Item("cobranca"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 220)
            e.Graphics.DrawString("Endereço    : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 240)
            e.Graphics.DrawString(linha.Item("entrega"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 240)
        Next linha


        '********************************
        'fim imprime o cabeçalho do relatório
        '********************************
        'define o número de linhas por página de acordo com a área de impressão e o tamanho da fonte
        'subtraimos o valor 10 do resultado para acomodar o rodapé do relatório
        'LinhasPorPagina = e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 10
        LinhasPorPagina = 3
        Dim TotalNota As String = ""
        'ativamos o tratamento de erro
        Try
            '*******************************************
            'imprime os títulos das colunas do relatório
            '*******************************************
            e.Graphics.DrawLine(Pens.Black, MargemEsquerda, 260, MargemDireita, 260)
            e.Graphics.DrawString("Cód.", FonteNormal, Brushes.Red, MargemEsquerda, 260, New StringFormat())
            e.Graphics.DrawString("Unid.", FonteNormal, Brushes.Red, MargemEsquerda + 50, 260, New StringFormat())
            e.Graphics.DrawString("Descrição", FonteNormal, Brushes.Red, MargemEsquerda + 100, 260, New StringFormat())
            e.Graphics.DrawString("Preço", FonteNormal, Brushes.Red, MargemEsquerda + 350, 260, New StringFormat())
            e.Graphics.DrawString("Qtde", FonteNormal, Brushes.Red, MargemEsquerda + 450, 260, New StringFormat())
            e.Graphics.DrawString("Total", FonteNormal, Brushes.Red, MargemEsquerda + 550, 260, New StringFormat())
            e.Graphics.DrawLine(Pens.Black, MargemEsquerda, 280, MargemDireita, 280)
            'alimentamos as variáveis com as informações do primeiro registro 
            'extraído do banco de dados através do objeto OleDbDataReader
            'iniciamos o loop através dos registros do DataReader 
            'respeitando o número de linhas por página
            While (LinhaAtual < LinhasPorPagina And LinhaAtual <= leitor.Tables(0).Rows.Count)
                For Each linha As DataRow In leitor.Tables(0).Rows
                    produtoID = linha("produtoID")
                    unidade = linha("unidade")
                    descricao = linha("descricao")
                    preço = linha("preço")
                    quantidade = linha("quantidade")
                    subtotal = linha("subtotal")
                    'TotalNota += subtotal
                    PosicaoDaLinha = MargemSuperior + 90 + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
                    e.Graphics.DrawString(produtoID, FonteNormal, Brushes.Black, MargemEsquerda + 50, PosicaoDaLinha, New StringFormat())
                    e.Graphics.DrawString(unidade, FonteNormal, Brushes.Black, MargemEsquerda + 100, PosicaoDaLinha, New StringFormat())
                    e.Graphics.DrawString(descricao, FonteNormal, Brushes.Black, MargemEsquerda + 150, PosicaoDaLinha, New StringFormat())
                    e.Graphics.DrawString(preço, FonteNormal, Brushes.Black, MargemEsquerda + 300, PosicaoDaLinha, New StringFormat())
                    e.Graphics.DrawString(subtotal, FonteNormal, Brushes.Black, MargemEsquerda + 350, PosicaoDaLinha, New StringFormat())
                    'TotalNota += subtotal
                    'e.Graphics.DrawString(TotalNota, FonteNormal, Brushes.Black, MargemEsquerda + 400, PosicaoDaLinha, New StringFormat())
                    LinhaAtual += 1
                    If (LinhaAtual < LinhasPorPagina) Then
                        produtoID = linha("produtoID")
                        unidade = linha("unidade")
                        descricao = linha("descricao")
                        preço = linha("preço")
                        quantidade = linha("quantidade")
                        subtotal = linha("subtotal")
                        'TotalNota += subtotal
                    End If
                Next
            End While
            '*****************************
            'imprime o rodapé do relatório
            '*****************************
            ''linha transversal
            e.Graphics.DrawLine(Pens.Black, MargemEsquerda, MargemInferior - 20, MargemDireita, PosicaoDaLinha)

            e.Graphics.DrawLine(Pens.Black, MargemEsquerda, MargemInferior - 20, MargemDireita, MargemInferior - 20)
            e.Graphics.DrawString("Total da Nota", FonteNormal, Brushes.Red, MargemEsquerda + 350, MargemInferior - 20, New StringFormat())
            e.Graphics.DrawString(Format(TotalNota, "currency"), FonteNormal, Brushes.Red, MargemEsquerda + 500, MargemInferior - 20, New StringFormat())
            e.Graphics.DrawLine(Pens.Black, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
            e.Graphics.DrawString(System.DateTime.Now, FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
            e.Graphics.DrawString(TotalPaginas & " Paginas", FonteRodape, Brushes.Black, MargemDireita - 300, MargemInferior, New StringFormat())

            'incrementa o número da página
            PaginaAtual += 1
            TotalPaginas = Ceiling(leitor.Tables(0).Rows.Count / LinhasPorPagina)
            If (PaginaAtual <> TotalPaginas) Then
                e.HasMorePages = True
            Else
                e.HasMorePages = False
            End If

            'captura qualquer Exception gerada durante o processamento
        Catch exe As System.Exception
            'se desejar, inclua código para tratamento das exceptions neste ponto
        End Try


    End Sub
    Private Sub Impimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Impimir.Click
        'Dim visualForm As New VisualizarImprimir
        'visualForm.ccodigo = codigoped.Text
        'visualForm.ShowDialog()
        Dim ccodigo As String = codigoped.Text
        Dim objPrintPreview As PrintPreviewDialog
        accDb.OpenConnection()
        Dim PrintStringdetalhespedidos As String = "Select * from detalhespedidos where pedidoID= " & ccodigo & " order by produtoID"
        leitor = accDb.ExecuteDS(PrintStringdetalhespedidos, TabelaDetalhesPedidos)
        'ativa a ampulheta para indicar que há processamento em andamento.
        Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
        'Inicia o Loop através do DataReader para passar as informações para a rotina de impressão
        'For i As Integer = 1 To leitor.Tables(0).Rows.Count
        While (LinhaAtual < leitor.Tables(0).Rows.Count)
            'criamos um novo Documento de Impressão
            Dim pd As PrintDocument = New PrintDocument()
            'estabelecemos a relação entre o novo objeto PrintDocument e o procedimento rptItensPedidos
            AddHandler pd.PrintPage, AddressOf Me.rptItensPedidos
            '************************************************************************************************'
            'SE VOCÊ DESEJA ENVIAR O RELATÓRIO DIRETAMENTE PARA A IMPRESSORA BASTA REMOVER AS LINHAS ABAIXO  '
            'E INVOCAR O MÉTODO PRINT DO OBJETO PRINTDOCUMENT DESTA FORMA: pd.Print()                        '                                   '
            '************************************************************************************************'
            'criamos uma nova instância do objeto PrintPreviewDialog                                         
            objPrintPreview = New PrintPreviewDialog()
            'atribuimos valores para algumas das propriedades do objeto                                      
            With objPrintPreview
                .Document = pd 'informamos qual é o documento a ser visualizado                              
                .WindowState = FormWindowState.Maximized 'inicia com a janela maximizada                     
                .PrintPreviewControl.Zoom = 1 'inicia com o Zoom em 100%                                      
                .Text = "Impressão de Pedido" 'muda o título da janela de visualização  
                .ShowDialog() 'exibe a janela para o usuário
            End With
        End While
        'next
        '************************************************************************************************'
        'PARA ENVIAR DIRETAMENTE PARA A IMPRESSORA: REMOVER ATÉ AQUI E INCLUIR pd.Print()                '
        '************************************************************************************************'
        'restaura o cursor
        Cursor.Current = System.Windows.Forms.Cursors.Default
    End Sub
    'FIM DO CARREGAMENTO DAS PROPRIEDADES E EVENTOS
End Class

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Bom, resolovi fazer como no macoratti em:

Mas deu alguns problemas:

1) o Código faz a leitura, exibe o numero de registros por pagino certinho mas, as paginas continuam sendo exibidas em branco.

Coloquei 8 registros por pagina. da certinho.

Primeiro pagina os 8 primeiros e na segunda os outros 5 ultimos registros. Mas, se clikar no botão vai para a terceira, quarta, n paginas em branco.

isso com

If (leitor("produtoID") <> Nothing) Then
                e.HasMorePages = True
            Else
                e.HasMorePages = False
            End If
Por que se eu fizer assim,
If (leitor("produtoID") =Nothing) Then
                e.HasMorePages = True
            Else
                e.HasMorePages = False
            End If
ele exibe a primeira pagina certo com os seus 8 registros e diz não ter mais paginas. só que se eu fechar o PrintDocument, ele abre ele de novo e mostra a segunda pagina com os outros 5 registros e, se eu insistir e fechar de novo ai ele fechja e não exibe pagina alguma. Como resolve isso? 2) Aqui neste cdódigo, estou fazendo o botão IMPRIMIR e o código do PrintDocumento todo na mesmo form, o form de pedidos. Mas eu queria era fazer o codigo do Print Docdument num form separado. Como fazer? Segue o código:
Private Sub Impimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Impimir.Click
        Dim ccodigo As String = codigoped.Text
        Dim objPrintPreview As PrintPreviewDialog

        Dim strConnString As String = "server=localhost;userid=root;password=;database=Vendas"
        Dim conexao As New MySqlConnection(strConnString)
        conexao.Open()

        'pegando o numero total de linhas
        Dim PrintStringdetalhespedidoscount As String = "Select Count(*) from detalhespedidos where pedidoID= " & ccodigo & " order by produtoID"
        Dim cmdcount As New MySqlCommand(PrintStringdetalhespedidoscount, conexao)
        totalLinhas = CInt(cmdcount.ExecuteScalar())


        Dim PrintStringdetalhespedidos As String = "Select * from detalhespedidos where pedidoID= " & ccodigo & " order by produtoID"
        Dim cmd As New MySqlCommand(PrintStringdetalhespedidos, conexao)
        leitor = cmd.ExecuteReader()



        'Inicia o Loop através do DataReader para passar as informações para a rotina de impressão
        While leitor.Read()
            'criamos um novo Documento de Impressão
            Dim pd As PrintDocument = New PrintDocument()
            'estabelecemos a relação entre o novo objeto PrintDocument e o procedimento rptClientesAtivos
            AddHandler pd.PrintPage, AddressOf Me.rptItensPedidos
            '************************************************************************************************'
            'SE VOCÊ DESEJA ENVIAR O RELATÓRIO DIRETAMENTE PARA A IMPRESSORA BASTA REMOVER AS LINHAS ABAIXO  '
            'E INVOCAR O MÉTODO PRINT DO OBJETO PRINTDOCUMENT DESTA FORMA: pd.Print()                        '                                   '
            '************************************************************************************************'
            'criamos uma nova instância do objeto PrintPreviewDialog                                         
            objPrintPreview = New PrintPreviewDialog()
            'atribuimos valores para algumas das propriedades do objeto                                      
            With objPrintPreview
                .Document = pd 'informamos qual é o documento a ser visualizado                              
                .WindowState = FormWindowState.Maximized 'inicia com a janela maximizada                     
                .PrintPreviewControl.Zoom = 1 'inicia com o Zoom em 100%                                      
                .Text = "Impressão do pedido" 'muda o título da janela de visualização  
                .ShowDialog() 'exibe a janela para o usuário
            End With
            '************************************************************************************************'
            'PARA ENVIAR DIRETAMENTE PARA A IMPRESSORA: REMOVER ATÉ AQUI E INCLUIR pd.Print()                '
            '************************************************************************************************'
        End While

        'fecha o DataReader
        leitor.Close()
        'fecha a conexão
        conexao.Close()
        'restaura o cursor
        Cursor.Current = System.Windows.Forms.Cursors.Default

    End Sub
Private Sub rptItensPedidos(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
        Dim ccodigo As Integer = codigoped.Text

        Dim produtoID As Integer
        Dim unidade As String
        Dim descricao As String
        Dim preço As Integer
        Dim quantidade As Integer
        Dim subtotal As Integer

        'variáveis para definição das configurações da impressora (margens, número de linhas, espessura da caneta) 
        Dim LinhasPorPagina As Single = 0
        Dim PosicaoDaLinha As Single = 0
        Dim LinhaAtual As Integer = 0

        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)

        'variáveis para armazenar as fontes que serão utilizadas durante a impressão
        Dim FonteNegrito As Font
        Dim FonteTitulo As Font
        Dim FonteSubTitulo As Font
        Dim FonteRodape As Font
        Dim FonteNormal As Font

        'definição das fontes (tamanho e estilo)
        FonteNegrito = New Font("Arial", 9, FontStyle.Bold)
        FonteTitulo = New Font("Arial", 20, FontStyle.Bold)
        FonteSubTitulo = New Font("Arial", 12, FontStyle.Bold)
        FonteRodape = New Font("Arial", 8)
        FonteNormal = New Font("Arial", 9)

        '********************************
        'inicio imprime o cabeçalho do relatório
        '********************************
        e.Graphics.DrawLine(Pens.Black, MargemEsquerda, 60, MargemDireita, 60)

        e.Graphics.DrawImage(Image.FromFile("imagens\" & "maco10.gif"), 100, 68)
        e.Graphics.DrawString("PEDIDO", New Font("arial", 15, FontStyle.Regular), Brushes.Black, MargemEsquerda + 260, 80)
        e.Graphics.DrawString("Dados da empresa", New Font("arial", 15, FontStyle.Regular), Brushes.Black, MargemEsquerda + 400, 80)

        e.Graphics.DrawString("Pedido     : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 160)
        e.Graphics.DrawString(ccodigo, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 160)
        Dim pgto As String
        Dim PrintStringpedidos As String = "select p.pedidoID, p.clienteID, p.ativo, p.data, p.cobranca, p.entrega, p.frete, p.pgto, p.CondPgto, c.nome as nome, c.tipo as pessoa, c.cpf_cnpj as dcto from  pedidos p inner join clientes c ON  p.clienteID = c.clienteID  where pedidoID= " & ccodigo
        Dim DRP As DataSet = accDb.ExecuteDS(PrintStringpedidos, TabelaPedidos)
        For Each linha As DataRow In DRP.Tables(0).Rows
            e.Graphics.DrawString("Data     : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 200, 160)
            e.Graphics.DrawString(linha.Item("data"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 250, 160)

            e.Graphics.DrawString("Frete     : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 400, 160)
            e.Graphics.DrawString(linha.Item("frete"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 450, 160)

            If linha.Item("PGTO") = "V" Then
                pgto = "À Vista"
                e.Graphics.DrawString("PAGAMENTO:", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 300, 180)
                e.Graphics.DrawString(pgto, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 450, 180)
            End If

            If linha.Item("PGTO") = "P" Then
                pgto = "À PRAZO"
                e.Graphics.DrawString("PAGAMENTO:", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 300, 180)
                e.Graphics.DrawString(pgto, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 400, 180)
                e.Graphics.DrawString("Forma: ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 500, 180)
                e.Graphics.DrawString(linha.Item("CondPgto").ToString.Replace(" ", ",") + " Dias", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 570, 180)
            End If
            Dim documento As String = ""
            Dim TIPO As String = ""
            If linha.Item("dcto").ToString.Length = 11 Then
                ' mascara de cpf
                documento = String.Format("999,999,999-99", linha.Item("dcto").ToString)
                TIPO = "CPF"
            End If

            If linha.Item("dcto").ToString.Length = 14 Then
                ' mascara de cnpj
                documento = String.Format("99,999,999-9999-99", linha.Item("dcto").ToString)
                TIPO = "CNPJ"
            End If

            e.Graphics.DrawString(TIPO & "           : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 180)
            e.Graphics.DrawString(documento, New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 180)
            e.Graphics.DrawString("Nome         : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 200)
            e.Graphics.DrawString(linha.Item("nome"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 200)
            e.Graphics.DrawString("Cobrança    : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 220)
            e.Graphics.DrawString(linha.Item("cobranca"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 220)
            e.Graphics.DrawString("Endereço    : ", New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda, 240)
            e.Graphics.DrawString(linha.Item("entrega"), New Font("arial", 10, FontStyle.Regular), Brushes.Black, MargemEsquerda + 140, 240)
        Next linha
        '********************************
        'fim imprime o cabeçalho do relatório
        '********************************
        '*******************************************
        'imprime os títulos das colunas do relatório
        '*******************************************
        e.Graphics.DrawLine(Pens.Black, MargemEsquerda, 260, MargemDireita, 260)
        e.Graphics.DrawString("Cód.", FonteNormal, Brushes.Red, MargemEsquerda, 260, New StringFormat())
        e.Graphics.DrawString("Unid.", FonteNormal, Brushes.Red, MargemEsquerda + 50, 260, New StringFormat())
        e.Graphics.DrawString("Descrição", FonteNormal, Brushes.Red, MargemEsquerda + 100, 260, New StringFormat())
        e.Graphics.DrawString("Preço", FonteNormal, Brushes.Red, MargemEsquerda + 350, 260, New StringFormat())
        e.Graphics.DrawString("Qtde", FonteNormal, Brushes.Red, MargemEsquerda + 450, 260, New StringFormat())
        e.Graphics.DrawString("Total", FonteNormal, Brushes.Red, MargemEsquerda + 550, 260, New StringFormat())
        e.Graphics.DrawLine(Pens.Black, MargemEsquerda, 280, MargemDireita, 280)
        
        'define o número de linhas por página de acordo com a área de impressão e o tamanho da fonte
        'subtraimos o valor 10 do resultado para acomodar o rodapé do relatório
        'LinhasPorPagina = e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 10
        LinhasPorPagina = 8
        'ativamos o tratamento de erro
        Try
            'alimentamos as variáveis com as informações do primeiro registro 
            'extraído do banco de dados através do objeto MySqlDataReader
            produtoID = leitor.GetInt32("produtoID").ToString
            unidade = leitor.GetString("unidade").ToString
            descricao = leitor.GetString("descricao").ToString
            preço = leitor.GetInt32("preço").ToString
            quantidade = leitor.GetInt32("quantidade").ToString
            subtotal = leitor.GetInt32("subtotal").ToString

            'iniciamos o loop através dos registros do DataReader 
            'respeitando o número de linhas por página
            While (LinhaAtual < LinhasPorPagina AndAlso leitor.Read())
                PosicaoDaLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics)) + 100
                e.Graphics.DrawString(produtoID, FonteNormal, Brushes.Black, MargemEsquerda, PosicaoDaLinha, New StringFormat())
                e.Graphics.DrawString(unidade, FonteNormal, Brushes.Black, MargemEsquerda + 50, PosicaoDaLinha, New StringFormat())
                e.Graphics.DrawString(descricao, FonteNormal, Brushes.Black, MargemEsquerda + 100, PosicaoDaLinha, New StringFormat())
                e.Graphics.DrawString(preço, FonteNormal, Brushes.Black, MargemEsquerda + 350, PosicaoDaLinha, New StringFormat())
                e.Graphics.DrawString(quantidade, FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoDaLinha, New StringFormat())
                e.Graphics.DrawString(subtotal, FonteNormal, Brushes.Black, MargemEsquerda + 550, PosicaoDaLinha, New StringFormat())

                LinhaAtual += 1
                'verifica o número da linha atual para não ultrapassar o número de linhas por página
                If (LinhaAtual < LinhasPorPagina) Then
                    produtoID = leitor.GetInt32("produtoID").ToString
                    unidade = leitor.GetString("unidade").ToString
                    descricao = leitor.GetString("descricao").ToString
                    preço = leitor.GetInt32("preço").ToString
                    quantidade = leitor.GetInt32("quantidade").ToString
                    subtotal = leitor.GetInt32("subtotal").ToString
                End If
                TotalNota += leitor("subtotal")
            End While
            'incrementa o número da página
            PaginaAtual += 1

            If (leitor("produtoID") <> Nothing) Then
                e.HasMorePages = True
            Else
                e.HasMorePages = False
            End If

            'captura qualquer Exception gerada durante o processamento
        Catch exe As System.Exception
            'se desejar, inclua código para tratamento das exceptions neste ponto
        End Try
        '*****************************
        'imprime o rodapé do relatório
        '*****************************
        ''linha transversal

        e.Graphics.DrawLine(Pens.Black, MargemEsquerda, MargemInferior - 20, MargemDireita, PosicaoDaLinha)

        e.Graphics.DrawLine(Pens.Black, MargemEsquerda, MargemInferior - 20, MargemDireita, MargemInferior - 20)
        e.Graphics.DrawString("Total da Nota", FonteNormal, Brushes.Red, MargemEsquerda + 350, MargemInferior - 20, New StringFormat())
        e.Graphics.DrawString(Format(TotalNota, "currency"), FonteNormal, Brushes.Red, MargemEsquerda + 500, MargemInferior - 20, New StringFormat())
        e.Graphics.DrawLine(Pens.Black, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
        e.Graphics.DrawString(System.DateTime.Now, FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
        TotalPaginas = Ceiling(totalLinhas / LinhasPorPagina)
        e.Graphics.DrawString(TotalPaginas & " Paginas", FonteRodape, Brushes.Black, MargemDireita - 300, MargemInferior, New StringFormat())


    End Sub

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...