IMPRESSAO RELATORIO VIA IMPRESSORA

LAUROFELIPE 13/12/2012 11:22:05
#415908
Estou desenvolvendo um aplicativo WIN FORMS com VISUAL STUDIO 2010.
Gerei um relatório com as ferramentas nativas. Até o printPreview esta tudo correto, sem problemas,
Entretanto, quando tento enviar o mesmo para a impressora, imprime apenas o cabeçalho, que independe do DataReader
Não consigo resolver esta questão. Então, restão algumas dúvidas:
Como resolver este problema?
Alguma configuração especial com os objetos: PrintDocument, PrintDialog ou PrintPreviewDialog?
A impressão ocorre à partir da imagem gerada pelo PrintPreview? Pois parece que o relatório é gerado novamente, utilizando o DataReader já lido, e considerando que não tem como reposicionar-lo no primeiro registro...

Agradeço antecipadamente alguma ajuda.

Lauro
PERCIFILHO 13/12/2012 15:59:48
#415926
Seria possível você enviar o código que está usando para imprimir para darmos uma analisada. Só assim poderemos ter condições de te ajudar.

Aconteceu comigo uma vez, de gerar o relatório, e no PrintPreview mostrar uma coisa e na impressão, os dados estavam com as quantidades diferentes. Mas o problema era que quando eu fechava o PrintPreview, algumas variáveis que eu utilizava para imprimir, ficavam [Ô]abertas[Ô] e, assim, os dados do relatório estavam diferentes do que eu visualizava.
Talvez o seu problema também seja algo relacionado a isso, mas só com o código para analisar melhor.

Até mais.
LAUROFELIPE 13/12/2012 18:33:12
#415937
Segue abaixo o código.
Uma pergunta. Após a preview, quando solicitada a impressão o relatório é gerado novamente? Se sim, talvez esteja nas configurações o problema pois então ele partiria de um datareader já lido, por este motivo imprime somente o cabeçalho.
Esta em vermelho, ou pelo menos deveria, a parte que efetivamente a impressora imprime, sem qualquer dados oriundos do datareader.

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim intLinha, intLinhasPagina, intPosicao, lenSolicitacao, x As Integer
Dim strFone, strFoneP As String
Dim blnTemRegistro As Boolean
Dim objImpressao As Graphics = e.Graphics
Dim FonteRelatorio As New System.Drawing.Font([Ô]Times New Roman[Ô], 8, FontStyle.Regular)
Dim FonteCabecalho As New System.Drawing.Font([Ô]Times New Roman[Ô], 8, FontStyle.Bold)
Dim strLinha As String = [Ô]_______________________________________________________________________________________________________________________________[Ô]


contaRegistro = 0
intLinhasPagina = e.MarginBounds.Height / FonteRelatorio.GetHeight(e.Graphics) - 15

If contaRegistro <= numRegistros Then
intLinha = 1
[txt-color=#e80000] If PrintDocument1.DocumentName = [Ô]Relatorio de contatos[Ô] Then
objImpressao.DrawString([Ô]XXXXXX - Corretora de Imóveis[Ô], New System.Drawing.Font([Ô]Times New Roman[Ô], 14, FontStyle.Bold), Brushes.Black, 50, 50)
objImpressao.DrawString([Ô]RELATÓRIO DE CONTATOS - Data do contato[Ô], New System.Drawing.Font([Ô]Times New Roman[Ô], 12, FontStyle.Bold), Brushes.Black, 50, 80)

With objImpressao
.DrawString(strLinha, FonteRelatorio, Brushes.Black, 50, 97)
.DrawString([Ô]Data contato[Ô], FonteCabecalho, Brushes.Black, 50, 110)
.DrawString([Ô]Hora[Ô], FonteCabecalho, Brushes.Black, 126, 110)
.DrawString([Ô]Nome contato[Ô], FonteCabecalho, Brushes.Black, 160, 110)
.DrawString([Ô]Telefone[Ô], FonteCabecalho, Brushes.Black, 320, 110)
.DrawString([Ô]Email principal[Ô], FonteCabecalho, Brushes.Black, 400, 110)
.DrawString([Ô]Ref.[Ô], FonteCabecalho, Brushes.Black, 750, 110)
.DrawString([Ô]Solicitação do contato[Ô], FonteCabecalho, Brushes.Black, 70, 125)
.DrawString(strLinha, FonteRelatorio, Brushes.Black, 50, 127)
End With[/txt-color]
intPosicao = 142
While (intLinha < intLinhasPagina)
blnTemRegistro = rdrRegContato.Read()
contaRegistro = contaRegistro + 1
If blnTemRegistro Then
Dim i As Integer = 0
i = Len(rdrRegContato([Ô]Fone_Principal_Contato[Ô]).ToString)
strFone = rdrRegContato([Ô]Fone_Principal_Contato[Ô]).ToString

Select Case i
Case 10
strFoneP = [Ô]([Ô] + strFone.Substring(0, 2) + [Ô]) [Ô] + strFone.Substring(2, 4) + [Ô]-[Ô] + strFone.Substring(6, 4)
Case 8
strFoneP = [Ô](00) [Ô] + strFone.Substring(0, 4) + [Ô]-[Ô] + strFone.Substring(4, 4)
Case Else
strFoneP = mskFonePrincipal.Text
End Select
i = 0
strFone = [Ô][Ô]
lenSolicitacao = Len(rdrRegContato([Ô]Solicitacao[Ô]).ToString)
If lenSolicitacao > 145 Then
x = MontaArray(rdrRegContato([Ô]Solicitacao[Ô]).ToString, lenSolicitacao)
If x = -1 Then x = 0
Else
strSolicitacao(0) = rdrRegContato([Ô]Solicitacao[Ô]).ToString
End If
With objImpressao
.DrawString(FormatDateTime(rdrRegContato([Ô]Data_Contato[Ô]).ToString, vbShortDate), FonteRelatorio, Brushes.Black, 60, intPosicao)
.DrawString(FormatDateTime(rdrRegContato([Ô]Hora_Contato[Ô]).ToString, vbShortTime), FonteRelatorio, Brushes.Black, 125, intPosicao)
.DrawString(rdrRegContato([Ô]Nome_Contato[Ô]).ToString, FonteRelatorio, Brushes.Black, 160, intPosicao)
.DrawString(strFoneP, FonteRelatorio, Brushes.Black, 320, intPosicao)
.DrawString(rdrRegContato([Ô]Email_Principal[Ô]).ToString, FonteRelatorio, Brushes.Black, 400, intPosicao)
.DrawString(rdrRegContato([Ô]Referencia_Imovel[Ô]).ToString, FonteRelatorio, Brushes.Black, 750, intPosicao)
For i = 0 To x
intPosicao += 15
.DrawString(strSolicitacao(i), FonteRelatorio, Brushes.Black, 70, intPosicao)
Next
intPosicao += 3
.DrawString(strLinha, FonteRelatorio, Brushes.Black, 50, intPosicao)
End With

Array.Clear(strSolicitacao, 0, strSolicitacao.Length)
intLinha = intLinha + x + 2
intPosicao = intPosicao + 15
x = 0
Else
intLinha = intLinha + 10
End If

End While
End If
e.HasMorePages = blnTemRegistro
End if
FonteRelatorio.Dispose()
FonteCabecalho.Dispose()
End Sub
OCELOT 13/12/2012 19:06:51
#415938
Sim, ele executa novamente a rotina, você tem que usar o evento BeginPrint para iniciar tudo o que precisa, no caso o DataReader por exemplo.

Outro detalhe importante que eu diria ai é chamar o Dispose dos objetos Font, já que ele usa recursos de sistema e é sempre bom liberar estes o mais rápido possível, então seria bom chamar o dispose antes de sair da função
LAUROFELIPE 13/12/2012 19:49:53
#415943
Ocelot boa noite.

Desculpe a ignorância, mas me ative ao que prescrevia certo livro de Visual Basic 2010 c/MYSQL, logo alguma coisa ficou faltando ou não consegui ver corretamente.
Baseado em sua resposta, e no código postado, seria possível me dizer aonde utilizar a instrução BeginPrint?
Após a visualização em tela (PrintPreview), dou um click na impressora disponível nesta tela.
Se for possível me clarear as idéias, agradeço desde já.

ps.: já incluí o dispose dos objetos fontes logo antes da instrução [Ô]End Sub[Ô].
Tópico encerrado , respostas não são mais permitidas