none
Impressão usando o System.Drawing.Printing RRS feed

  • 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?

     

    Code Snippet

    '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

     

     

     

    Code Snippet
    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

     

     

     

    sábado, 3 de janeiro de 2009 23:50

Respostas

  •  

     

    Olá,

    eu também resolvi usar o modelo do marcoratt e me vi com os mesmos problemas. Para resolver o problema da contagem de páginas fiz o seguinte:

     
    If (leitor.Read()) Then
            Relatorio.HasMorePages = True
    Else
            Relatorio.HasMorePages = False
    End If

    Desta forma ele visuaiza todos os dados listando-os corretamente na PrintPreviewDialog e para que não abra novamente sozinha ao ser fechada eu discato e instancio novamente o objeto.


    Porém, ainda tem outros problemas:

    Esse modelo serve para enviar direto para a impressora, apenas.
    Se for visualizar primeiro, quando tentar imprimir ele não terar mais os dados e levarar apenas o cabeçalho e rodape, pelo menos no meu caso tem sido assim. Ainda não consegui resolver.
    -

    Desculpa as falhas no uso do Fórum é que sou novo aqui.

    Espero ter ajudado!

    T+

    Júnior JG





    quarta-feira, 9 de setembro de 2009 21:53

Todas as Respostas

  •  

    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
     

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

     

     

    Por que se eu fizer assim, 

    Code Snippet
     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:

    Code Snippet

        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

     

     



    Code Snippet

     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 preco 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
                preco = leitor.GetInt32("preco").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(preco, 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
                        preco = leitor.GetInt32("preco").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

     

     


    domingo, 4 de janeiro de 2009 20:10
  •  

     

    O pessoal.

    Ta muiito dificil.

    Meus olhos ja estão queimando de tanto forçar as vistas com isto.

     

    Será que nehum colega aind ainda não passou por isso?

    • Sugerido como Resposta JUNIOR JG quarta-feira, 9 de setembro de 2009 21:47
    segunda-feira, 5 de janeiro de 2009 12:15
  •  

     

    Olá,

    eu também resolvi usar o modelo do marcoratt e me vi com os mesmos problemas. Para resolver o problema da contagem de páginas fiz o seguinte:

     
    If (leitor.Read()) Then
            Relatorio.HasMorePages = True
    Else
            Relatorio.HasMorePages = False
    End If

    Desta forma ele visuaiza todos os dados listando-os corretamente na PrintPreviewDialog e para que não abra novamente sozinha ao ser fechada eu discato e instancio novamente o objeto.


    Porém, ainda tem outros problemas:

    Esse modelo serve para enviar direto para a impressora, apenas.
    Se for visualizar primeiro, quando tentar imprimir ele não terar mais os dados e levarar apenas o cabeçalho e rodape, pelo menos no meu caso tem sido assim. Ainda não consegui resolver.
    -

    Desculpa as falhas no uso do Fórum é que sou novo aqui.

    Espero ter ajudado!

    T+

    Júnior JG





    quarta-feira, 9 de setembro de 2009 21:53