Jump to content
Joel Torres

[Resolvido] Repetição de registos quando clico no botão "Pré-Visualizar"

Recommended Posts

Joel Torres

Boa noite,

Quando clico no botão "Pré-Visualizar" aparece-me registos repetidos.

23usv1w.jpg

Já tentei resolver o problema mas continua na mesma.

Agradeço quem me ajudar.

Share this post


Link to post
Share on other sites
Virneto

Olha aqui uma ilustração do que te sugeriu o @acao [brincadeira] :cheesygrin:

ou por outras palavras...

optimiza a tua query...

SELECT DISTINCT nome,morada,telefone,telemovel FROM contactos WHERE nome="Gabriela Santos";

have fun!


"Que inquieto desejo vos tortura, Seres elementares, força obscura? Em volta de que ideia gravitais?" >> Anthero de Quental

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Linuxando.com | ...

Share this post


Link to post
Share on other sites
Joel Torres

Penso que o erro esteja no código do botão "Pré-Visualizar".

Estou a utilizar o VB 2010.

Edited by Joel94

Share this post


Link to post
Share on other sites
nelsonr

Boas,

convém dares mais informações.

Como é que estás a definir os dados que aparecem no relatório?

Share this post


Link to post
Share on other sites
Joel Torres

O código do botão "Pré-Visualizar" é o seguinte, mas agora só me dá erro nas linhas de código onde tem o "Telefone" e o "Telemóvel".

Private Sub PreVisualizaListagemContatos()

RegistoAtual = 0
PaginaAtual = 1

Dim Impressao As Printing.PrintDocument = New Printing.PrintDocument()
AddHandler Impressao.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdListagemContatos_PrintPage)
Impressao.DefaultPageSettings.Landscape = False
Dim printPreviewDialog1 As New PrintPreviewDialog
Try
CType(printPreviewDialog1.Controls(1), ToolStrip).Items(0).Visible = False
With printPreviewDialog1
.Document = Impressao
.Text = "Listagem de Contatos"
.WindowState = FormWindowState.Maximized
.PrintPreviewControl.Zoom = 1
.FormBorderStyle = FormBorderStyle.Fixed3D
.ShowDialog()
End With
Catch exp As Exception
MsgBox(exp.Message.ToString, MsgBoxStyle.Critical, "Erro na visualização da impressão")
End Try
End Sub

Private Sub pdListagemContatos_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles pdListagemContatos.PrintPage

Dim LinhasPagina As Single = 0
Dim PosicaoLinha As Single = 0
Dim LinhaAtual As Integer = 0
Dim MargemEsquerda As Single = e.MarginBounds.Left - 20
Dim MargemSuperior As Single = e.MarginBounds.Top + 100
Dim MargemDireita As Single = e.MarginBounds.Right + 40
Dim MargemInferior As Single = e.MarginBounds.Bottom
Dim CanetaImpressora As New Pen(Color.Black, 1)
Dim FonteNegrito As New Font("Arial", 9, FontStyle.Bold)
Dim FonteTitulo As New Font("Arial", 16, FontStyle.Bold)
Dim FonteSubtitulo As New Font("Arial", 12, FontStyle.Bold)
Dim FonteRodape As New Font("Arial", 7)
Dim FonteNormal As New Font("Arial", 8)

e.Graphics.DrawString("GestContato" & ListagemContatos, FonteTitulo, Brushes.Black, MargemEsquerda + 275, 70, New StringFormat())
e.Graphics.DrawString("Listagem de Contatos" & ListagemContatos, FonteSubtitulo, Brushes.Black, MargemEsquerda + 255, 110, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 165, MargemDireita, 165)

e.Graphics.DrawString("Nome", FonteNegrito, Brushes.Black, MargemEsquerda + 0, 170, New StringFormat())
e.Graphics.DrawString("Morada", FonteNegrito, Brushes.Black, MargemEsquerda + 220, 170,
e.Graphics.DrawString("Telefone", FonteNegrito, Brushes.Black, MargemEsquerda + 450, 170, New StringFormat())
e.Graphics.DrawString("Telemóvel", FonteNegrito, Brushes.Black, MargemEsquerda + 550, 170, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 190, MargemDireita, 190)
LinhasPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)
 

Dim AlinharDireita As New StringFormat
AlinharDireita.FormatFlags = StringFormatFlags.DirectionRightToLeft

While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count.ToString)
PosicaoLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(1).Value, FonteNormal, Brushes.Black, MargemEsquerda + 0, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(2).Value, FonteNormal, Brushes.Black, MargemEsquerda + 220, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(3).Value, FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha, AlinharDireita) 'Aqui dá erro
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(4).Value, FonteNormal, Brushes.Black, MargemEsquerda + 550, PosicaoLinha, AlinharDireita) 'Aqui dá erro

LinhaAtual += 1
RegistoAtual += 1
End While

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
e.Graphics.DrawString(DateAndTime.Now.ToShortDateString, FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
LinhaAtual += 1
e.Graphics.DrawString("Página: " & PaginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())

PaginaAtual += 1

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

A mensagem de erro que me aparece é a seguinte:

2vjt083.jpg

Edited by apocsantos

Share this post


Link to post
Share on other sites
He B TeMy

O código do botão "Pré-Visualizar" é o seguinte, mas agora só me dá erro nas linhas de código onde tem o "Telefone" e o "Telemóvel".

Private Sub PreVisualizaListagemContatos()

RegistoAtual = 0
PaginaAtual = 1

Dim Impressao As Printing.PrintDocument = New Printing.PrintDocument()
AddHandler Impressao.PrintPage, New Printing.PrintPageEventHandler(AddressOf Me.pdListagemContatos_PrintPage)
Impressao.DefaultPageSettings.Landscape = False
Dim printPreviewDialog1 As New PrintPreviewDialog
Try
CType(printPreviewDialog1.Controls(1), ToolStrip).Items(0).Visible = False
With printPreviewDialog1
.Document = Impressao
.Text = "Listagem de Contatos"
.WindowState = FormWindowState.Maximized
.PrintPreviewControl.Zoom = 1
.FormBorderStyle = FormBorderStyle.Fixed3D
.ShowDialog()
End With
Catch exp As Exception
MsgBox(exp.Message.ToString, MsgBoxStyle.Critical, "Erro na visualização da impressão")
End Try
End Sub

Private Sub pdListagemContatos_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles pdListagemContatos.PrintPage

Dim LinhasPagina As Single = 0
Dim PosicaoLinha As Single = 0
Dim LinhaAtual As Integer = 0
Dim MargemEsquerda As Single = e.MarginBounds.Left - 20
Dim MargemSuperior As Single = e.MarginBounds.Top + 100
Dim MargemDireita As Single = e.MarginBounds.Right + 40
Dim MargemInferior As Single = e.MarginBounds.Bottom
Dim CanetaImpressora As New Pen(Color.Black, 1)
Dim FonteNegrito As New Font("Arial", 9, FontStyle.Bold)
Dim FonteTitulo As New Font("Arial", 16, FontStyle.Bold)
Dim FonteSubtitulo As New Font("Arial", 12, FontStyle.Bold)
Dim FonteRodape As New Font("Arial", 7)
Dim FonteNormal As New Font("Arial", 8)

e.Graphics.DrawString("GestContato" & ListagemContatos, FonteTitulo, Brushes.Black, MargemEsquerda + 275, 70, New StringFormat())
e.Graphics.DrawString("Listagem de Contatos" & ListagemContatos, FonteSubtitulo, Brushes.Black, MargemEsquerda + 255, 110, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 165, MargemDireita, 165)

e.Graphics.DrawString("Nome", FonteNegrito, Brushes.Black, MargemEsquerda + 0, 170, New StringFormat())
e.Graphics.DrawString("Morada", FonteNegrito, Brushes.Black, MargemEsquerda + 220, 170,
e.Graphics.DrawString("Telefone", FonteNegrito, Brushes.Black, MargemEsquerda + 450, 170, New StringFormat())
e.Graphics.DrawString("Telemóvel", FonteNegrito, Brushes.Black, MargemEsquerda + 550, 170, New StringFormat())

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, 190, MargemDireita, 190)
LinhasPagina = CInt(e.MarginBounds.Height / FonteNormal.GetHeight(e.Graphics) - 9)
 

Dim AlinharDireita As New StringFormat
AlinharDireita.FormatFlags = StringFormatFlags.DirectionRightToLeft

While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count.ToString)
PosicaoLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(1).Value, FonteNormal, Brushes.Black, MargemEsquerda + 0, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(2).Value, FonteNormal, Brushes.Black, MargemEsquerda + 220, PosicaoLinha, New StringFormat())
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(3).Value, FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha, AlinharDireita) 'Aqui dá erro
e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(4).Value, FonteNormal, Brushes.Black, MargemEsquerda + 550, PosicaoLinha, AlinharDireita) 'Aqui dá erro

LinhaAtual += 1
RegistoAtual += 1
End While

e.Graphics.DrawLine(CanetaImpressora, MargemEsquerda, MargemInferior, MargemDireita, MargemInferior)
e.Graphics.DrawString(DateAndTime.Now.ToShortDateString, FonteRodape, Brushes.Black, MargemEsquerda, MargemInferior, New StringFormat())
LinhaAtual += 1
e.Graphics.DrawString("Página: " & PaginaAtual, FonteRodape, Brushes.Black, MargemDireita - 50, MargemInferior, New StringFormat())

PaginaAtual += 1

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

A mensagem de erro que me aparece é a seguinte:

2vjt083.jpg

O erro é bastante explanatório não é? Tás a tentar converter para string um campo que vem "null" da base de dados... isso não é permitido...7

Faz um if statement a verficar se o campo é dbnull, e continua apartir daí.

Share this post


Link to post
Share on other sites
He B TeMy

If Not IsDBNull(dr("Campo_db")) Then  Dim Campo_db As String = dr("Campo_db")
End If

Não sei que tipo de base de dados é... o "dr" neste exemplo era o Sql data reader.

Share this post


Link to post
Share on other sites
He B TeMy

Ora bem... supostamente antes de tentares converter?

Verificas se é nulo, se não for, continuas, se for, não continuas...

Share this post


Link to post
Share on other sites
Joel Torres

Não percebo como fazer isso.

Edited by Joel Torres

Share this post


Link to post
Share on other sites
He B TeMy

Tu tens este código certo... ?

Dim MargemEsquerda As Single = e.MarginBounds.Left - 20

Que dá o erro, eu nunca utilizei esse método para obter da base de dados... nem tão pouco estou familiarizado.

Mas suponho que isto:

(RegistoAtual).Cells(3).Value

Seja o valor do que estás a tentar converter para string, logo, verificas se o valor é nulo, se não for é que executas ESSE código.

Edit: Se não perceberes ainda, aconselho-te a procurares no google exemplos.

https://www.google.pt/search?num=20&q=a+convers%C3%A3o+do+tipo+dbnull+n%C3%A3o+pode+ser+convertido+para+string&oq=a+convers%C3%A3o+do+tipo+dbnull+n%C3%A3o+pode+ser+convertido+para+string&gs_l=serp.3...22357.25523.0.25717.23.22.0.0.0.6.163.2087.16j6.22.0....0...1c.1.31.serp..15.8.718.4-M4QVcNiG0

Edited by He B Te My

Share this post


Link to post
Share on other sites
Joel Torres

Verificou o meu código completo?

Agradecia mesmo a ajuda porque só por causa destas duas linhas de código é que o botão de "Pré-Visualizar não funciona" :)

Share this post


Link to post
Share on other sites
He B TeMy

Verificou o meu código completo?

Agradecia mesmo a ajuda porque só por causa destas duas linhas de código é que o botão de "Pré-Visualizar não funciona" :)

Eu não vou fazer o teu trabalho... ainda para mais ler umas 500 linhas de código só para tentar ver onde é que vais buscar mesmo os dados para depois converteres para string. Se só dá em dois, vê o que fazes diferente, o que estás a converter, e faz o que te disse em cima...

Só tens de verificar se o campo é nulo antes de tentares converter. mais nada, e depois decidires o que queres fazer, se não mostrar nada, ou mostrar outra informação.

Share this post


Link to post
Share on other sites
apocsantos

Boa tarde,

Creio que o erro esteja neste pedaço:

Dim AlinharDireita As New StringFormat
	 AlinharDireita.FormatFlags = StringFormatFlags.DirectionRightToLeft
	 While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count.ToString) ' Count.ToString ???? pera, mas convertes um inteiro em string e lá em baixo somas ?
			'While (LinhaAtual < LinhasPagina And RegistoAtual < dgvContatos.Rows.Count())
			 PosicaoLinha = MargemSuperior + (LinhaAtual * FonteNormal.GetHeight(e.Graphics))
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(1).Value, FonteNormal, Brushes.Black, MargemEsquerda + 0, PosicaoLinha, New StringFormat())
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(2).Value, FonteNormal, Brushes.Black, MargemEsquerda + 220, PosicaoLinha, New StringFormat())
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(3).Value, FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha )
			 e.Graphics.DrawString(dgvContatos.Rows(RegistoAtual).Cells(4).Value, FonteNormal, Brushes.Black, MargemEsquerda + 550, PosicaoLinha)
			 LinhaAtual += 1 ' estás a somar o valor 1 a uma string ???
			 RegistoAtual += 1
	 End While

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
Joel Torres

Tentei modificar as duas linhas e deu o mesmo erro inicial.

Preciso mesmo de ajuda. Agradecia para resolver este erro visto que não percebo muito de VB.

Edited by Joel Torres

Share this post


Link to post
Share on other sites
vikcch

experimenta converter para string numa função

 Private Function ConverterParaString(ByVal campo As Object) As String

 If campo Is DBNull.Value Then
	 ConverterParaString = "Vazio"
 Else
	 ConverterParaString = campo.ToString
 End If

End Function

e.Graphics.DrawString(ConverterParaString(dgvContatos.Rows(RegistoAtual).Cells(3).Value), FonteNormal, Brushes.Black, MargemEsquerda + 450, PosicaoLinha, AlinharDireita) 'Aqui dá erro

Share this post


Link to post
Share on other sites
Joel Torres

Funciona a 100%.

Muito obrigado pela ajuda. :)

Visto que o problema está resolvido, é com enorme agrado que encerro este tópico. :)

Edited by Joel Torres

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.