Jump to content
Bessa

Imprimir 2 Registos em Relatório (Sistema Printing)

Recommended Posts

Bessa

Olá pessoal! :)

Estou aqui com um probleminha... (Mais um) :wallbash:

Para fazer o Relatório, utilizei o Método "PRINTING" que vi na Wiki P@P -> http://wiki.portugal-a-programar.org/dev_net:vb.net:relatorios?s[]=imprimir&s[]=relat%C3%B3rio

Segui os passos indicados, modfiiquei a meu gosto e troquei algumas coisas necessárias, no entanto tenho este problema:

Eu tenho dois registos no DataGridView, com o Código de Artigo pretendido (Há mais na BD, mas com aquele Cod Artigo, só aqueles):

prob2a5.JPG

No Entanto só Imprime o 1º registo do DataGridView... :D

prob2.JPG

Há algum Código especifico, ou é com um IF ou WHILE... ? Eu pensei nestes últimos, mas não sei bem como os vou fazer, dado que não estou a ver que tipo de dado poderei utilizar (Ex: Row..)

Mas provavelmente existe um comando interno, mas não estou a conseguir descobri-lo e nada encontrei na net acerca do mesmo. :thumbsup:

Código do Botão Confirmar:

Dim printIt As New PrintDocument
        Dim printPreview As New PrintPreviewDialog
        printPreview.Document = printIt

        ' Apanhamos os campos da datagrid e atribuimos às respectivas variáveis
        artigo_escolhido = DataGridView1.CurrentRow.Cells(0).Value
        operacao_artigo = DataGridView1.CurrentRow.Cells(1).Value
        fase_artigo = DataGridView1.CurrentRow.Cells(2).Value
        Ferramentas_corte_selec = DataGridView1.CurrentRow.Cells(3).Value
        Ferramentas_posic_selec = DataGridView1.CurrentRow.Cells(4).Value
        programa = DataGridView1.CurrentRow.Cells(5).Value
        comprimento_ferr_Corte = DataGridView1.CurrentRow.Cells(6).Value
        diametro_ferr_corte = DataGridView1.CurrentRow.Cells(7).Value
        X_ferr_pos = DataGridView1.CurrentRow.Cells(8).Value
        Y_ferr_pos = DataGridView1.CurrentRow.Cells(9).Value
        Z_ferr_pos = DataGridView1.CurrentRow.Cells(10).Value

        AddHandler printIt.PrintPage, AddressOf printIt_PrintPage

        ' Copia o logótipo
        Clipboard.SetImage(My.Resources.felino)
        printPreview.ShowDialog()

        Me.Close()

Coloquei no primeiro "0", dado que dava erro se começasse logo por "1".

Coloquei no SelectedIndexChanged da ComboBox que lá aparece, este código. (apesar de eu copiar o Cod Artigo de outra Form para esta, é necessário para filtrar os dados da DGView).

        Dim cn As New System.Data.OleDb.OleDbConnection
        Dim cm As New System.Data.OleDb.OleDbCommand

        cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb"

        cm.Connection = cn

        cm.CommandText = "Select * From associar_ferramentas Where artigo_escolhido Like '" & ComboBox1.Text & "%'"

        Dim Adp As New OleDbDataAdapter(cm)
        Dim Dt As New DataTable

        Adp.Fill(Dt)

        DataGridView1.DataSource = Dt
        DataGridView1.Refresh()

E no Form_Load coloquei:

    Private artigo_escolhido, operacao_artigo, fase_artigo, Ferramentas_corte_selec, Ferramentas_posic_selec, programa, comprimento_ferr_Corte, diametro_ferr_corte, X_ferr_pos, Y_ferr_pos, Z_ferr_pos As String

    Private Sub relatorio_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Associar_ferramentasTableAdapter.Fill(Me.BdfelinoDataSet.associar_ferramentas)

        ComboBox1.Text = consultarope.Artigo_escolhidoComboBox.Text
        ComboBox1.Enabled = False

Encontrei este Artigo no macoratti - http://www.macoratti.net/vbn_prn2.htm ...Mas não estou a conseguir implementar, dado a forma como está no macoratti, tem várias partes diferentes e mais confusas... :S

Obrigado desde já.  :) Entretanto, vou | i | i | i | ;)

Share this post


Link to post
Share on other sites
Bessa

Enviado por: Bessa

« em: Hoje às 08:59 »

« Última modificação: Hoje às 09:25 por Bessa » (Mas já tinha adicionado o Link quando postei) :)

Olá pessoal! :)

Estou aqui com um probleminha... (Mais um) :wallbash:

Para fazer o Relatório, utilizei o Método "PRINTING" que vi na Wiki P@P -> http://wiki.portugal-a-programar.org/dev_net:vb.net:relatorios?s[]=imprimir&s[]=relat%C3%B3rio

Segui os passos indicados, modfiiquei a meu gosto e troquei algumas coisas necessárias, no entanto tenho este problema:

..........

🤔

Antes de fazer o que seja, procuro. E no caso baseei-me nesse link que deste e que eu já tinha referido no tópico, e que por sinal segui-me por ele para elaborar o relatório. ;)

Por saber que me iriam redireccionar para o Link, é que referi no tópico que trabalhei NESSE link. E disse-o logo no inicio...  :thumbsup:

Não interpretes isto como critica pessoal. lol Apenas digo isto porque, como dava para ver, já me tinha seguido por aí, conheco muito bem o link e estou nesse link desde o inicio da manhã até. :)

No entanto, estou com este problema de que falo, e que após várias procuras ainda não encontrei a solução. No entanto, enquanto continuo em busca de uma solução, pedi aqui ajuda a ver se me dão algumas luzes, como ultimamente me têm ajudado, quando não consigo encontrar as soluções no google pelos termos que utilizo.

:D

Share this post


Link to post
Share on other sites
Caça

Era para leres com mais atenção ;)

Tens de criar um ciclo for(For Each) na grid e se quiseres, para mudar de página colocas isto

e.HasMorePages = True


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Bessa

Pois...Isso do Ciclo, já tinha tentado, mas tal como disse no fim do tópico, nao sabia bem onde me basear nos Ciclos... lol  ;)

Estive a procurar na Net por esse código e falam de que se tem de detetar as margens das páginas e mais uma coisas... :nono1: Vou continuar a pesquisar, que acho muito estranho isso das margens lol

Coloquei sem o For Each e imprimiu + de 300 Páginas e sempre a continuar! Cómico! LOL

Já tentei for Each Row in DGView, mas nada...

Share this post


Link to post
Share on other sites
Bessa

Depois de ter Almoçado, cá voltei ao projeto.

- Coloquei no inicio do "Private Sub printIt_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)", tal como está na Wiki, coloquei este código:

    Private Sub printIt_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)

For Each Row As DataGridViewRow In DataGridView1.Rows

' Cola o logótipo
e.Graphics.DrawImage(Clipboard.GetImage, 250, 70, 300, 80)

(...)

' Data do documento
e.Graphics.DrawString(Date.Now, New Font("Verdana", 14, FontStyle.Bold), Brushes.Black, 525, 1120)

'e.HasMorePages = True
'Exit Sub

Next

E depois, na janela pequena onde aparece os dados filtrados pelo Código do Artigo, se selecciono o 1º registo, ele faz o Relatório do 1º. Se selecciono o 2º registo, ele faz o Relatório do 2.

Se colocar:

'e.HasMorePages = True
'Exit Sub

Ele imprime IMENSAS Páginas e sempre a continuar...E Quando cancelo, naquelas todas, só aparece o 1º registo.  ;)

Coloquei também este código, para que quando se clica na 1ªcélula, ele seleccione todas as linhas da DGView, mas não funciona...Ele imprime na mesma apenas o 1º Registo, dado que é onde clico.

If DataGridView1.CurrentRow.Index < DataGridView1.Rows.Count Then
DataGridView1.Rows(DataGridView1.CurrentRow.Index + 0).Selected = True
DataGridView1.Rows(DataGridView1.CurrentRow.Index + 1).Selected = True
End If

Share this post


Link to post
Share on other sites
bioshock

Assim por alto terás que fazer algo do género:

For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
' Código para preencher o relatório
e.HasMorePages = True
Next 
e.HasMorePages = False

Agora não posso ajudar muito mais pois tenho que ir trabalhar. Se puder, logo ajudo ;)

Share this post


Link to post
Share on other sites
Bessa

Tentei da forma que deste e não funcionou . ;)

Imprime na mesma só 1.

For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1

' Cola o logótipo
e.Graphics.DrawImage(Clipboard.GetImage, 250, 70, 300, 80)

(...)

e.HasMorePages = True

Next

e.HasMorePages = False

-> Vi na NET a dizeres para colocar um Exit Sub depois de cada e.HasMoreP, mas quando o fazia, imprimia INÚMERAS páginas com o 1º artigo. :wallbash:

-> Se eu colocar ao invés de "-1", o "2" que é o número de registos/Linhas do DGView, imprime 1 página em Branco.

-> Se eu colocar ao invés de "-1", o "1", assumindo que o 1º registo poderia ser "0", imprime apenas o 1º Registo.

-> Coloquei "For i As Integer = 0 To DataGridView1.RowCount", Fiz um BreakPoint, e no "RownCount" ele deteta "2" (Que é o nrº de registos que tenho no DGView), mas não imprime os 2. Só 1. e se colocasse no fim isto, também não dava...Imprimia MUITAS páginas com o 1º registo:

If DataGridView1.RowCount > 1 Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If

Desde já, Obrigado bioshock.

Entretanto, vou continuar a pesquisar.

Share this post


Link to post
Share on other sites
bioshock

Experimenta algo deste género:

For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
            e.Graphics.DrawString("Nome: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 350)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(0).Value, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 175, 351)

            numberPages -= 1
            If numberPages > 0 Then
                e.HasMorePages = True
                Exit Sub
            End If
        Next

Onde numberPages é uma variável do tipo Integer que apanha todas as linhas da DataGridView antes de iniciar o PrintPage().

Share this post


Link to post
Share on other sites
Bessa

Já deu mais um passinho... :)

Agora o que acontece, é que os dados ficam sobrepostos...

prob.jpg

O Código que coloquei...Penso que era assim que estavas a exprimir para eu fazer:

        Dim numberPages As Integer

        For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1

            ' Cola o logótipo
            e.Graphics.DrawImage(Clipboard.GetImage, 250, 70, 300, 80)

            ' Desenha um rectângulo à volta do documento
            Dim rect As New Rectangle(0, 300, 900, 800)
            e.Graphics.DrawRectangle(Pens.Gray, rect)

            ' 300 = coordenadasX :: 250 = coordenadasY
            e.Graphics.DrawString("Relatório do Artigo", New Font("Verdana", 18, FontStyle.Bold), Brushes.Black, 250, 240)

            ' Informações do Fornecedor:
            e.Graphics.DrawString("Artigo: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 350)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(0).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 120, 351)
            e.Graphics.DrawString("Operação: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 400)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(1).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 150, 402)
            e.Graphics.DrawString("Fase do Artigo: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 450)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(2).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 200, 454)

            ' Desenha uma linha na horizontal

            ' (...) + informações:
            e.Graphics.DrawString("Ferramentas de Corte: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 500)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(3).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 275, 501)
            e.Graphics.DrawString("Ferramentas de Posicionamento: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 550)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(4).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 380, 551)
            e.Graphics.DrawString("Programa: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 600)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(5).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 155, 604)
            e.Graphics.DrawString("Comprimento da Ferramenta de Corte: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 650)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(6).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 430, 653)
            e.Graphics.DrawString("Diâmetro da Ferramenta de Corte: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 700)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(7).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 390, 703)

            ' Desenha uma linha na horizontal

            ' (...) + informações:
            e.Graphics.DrawString("Coordenada X da Ferramentas de Posicionamento: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 750)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(8).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 560, 754)
            e.Graphics.DrawString("Coordenada Y da Ferramentas de Posicionamento: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 800)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(9).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 555, 804)
            e.Graphics.DrawString("Coordenada Z da Ferramentas de Posicionamento: ", New Font("Verdana", 13, FontStyle.Bold), Brushes.Black, 40, 850)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(10).Value, New Font("Verdana", 11, FontStyle.Regular), Brushes.Black, 555, 854)

            ' Data do documento
            e.Graphics.DrawString(Date.Now, New Font("Verdana", 14, FontStyle.Bold), Brushes.Black, 525, 1120)


            numberPages -= 1
            If numberPages > 0 Then
                e.HasMorePages = True
                Exit Sub
            End If
        Next

Obrigado por estares a tentar ajudar! ;)

Share this post


Link to post
Share on other sites
bioshock

Pronto, então é por aí. Mas ele está a criar as páginas consoante o número de linhas que tens?

Eu se tiver tempo pego no código e tento ver isso ;)

Share this post


Link to post
Share on other sites
Caça

Se trocares isto

If numberPages > 0 Then
    e.HasMorePages = True
    Exit Sub
End If

por isto

If i <> Me.DataGridView1.Rows.Count - 1 Then
    e.HasMorePages = True
Else
    e.HasMorePages = False
    Exit Sub
End If

talvez dê


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
bioshock
Static numberPages As Integer
        For i = numberPages To Me.DataGridView1.Rows.Count - 1
            e.Graphics.DrawString("Nome: ", New Font("Verdana", 16, FontStyle.Bold), Brushes.Black, 40, 350)
            e.Graphics.DrawString(Me.DataGridView1.Rows(i).Cells(0).Value, New Font("Verdana", 15, FontStyle.Regular), Brushes.Black, 175, 351)

            If i < Me.DataGridView1.Rows.Count - 1 Then
                numberPages = i + 1
                e.HasMorePages = True
                Exit Sub
            End If
        Next
        numberPages = 0

Share this post


Link to post
Share on other sites
Bessa

Caça, Obrigado por teres tentado ajudar. :)

bioshock, tentei com esse e funcionou 5*! MUITO OBRIGADO! ;) Mais uma vez foste incansável em tentar ajudar-me. :)

Muito Obrigado. Merecias uma estátua! :)

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.