Jump to content
Sign in to follow this  
lcross

Imprimir para PDF

Recommended Posts

lcross

Boas ,

estou a tentar imprimir uns relatórios para pdf mas algo está a acontecer que eu não consigo entender...

tenho o codigo todo feito para gerar um snapshot com os dados escolher as pastas onde colocar o pdf e filtrar o relatório para imprimir 1 pdf por registo.

Funciona tudo muito bem, só que tenho um pouco menos de 500 registos, ou seja PDF's...

o codigo faz tudo gera a estrutura das pastas como definidas e imprime os pdf nos sitios certos, mas chega quase ao fim e dá um erro "maximo de tabelas abertas ".

eu uso o close ao relatorio e ao rs e a db que abri, mas parece que não resulta...

será de estar a usar snapshot?

se forem poucos registos funciona ás mil maravilhas, mas para fazer todos de uma só vez dá este erro....

If strFolderName <> "" Then
   Set db = CurrentDb()
  Set rs = db.OpenRecordset("SELECT * from [c_oferta_form] ", dbOpenSnapshot)

Do While Not rs.EOF

    mypath = strFolderName & "\"
    temp = rs("Curso")
    MyFileName = rs("Nome_PDF") & ".pdf"
    DoCmd.OpenReport "print", acViewReport, , "[Curso]='" & temp & "'"
    DoCmd.OutputTo acOutputReport, "", acFormatPDF, mypath & MyFileName
    DoCmd.Close acReport, "print"
    DoEvents
    rs.MoveNext
   Loop
   rs.Close
   Set rs = Nothing
   db.Close
   Set db = Nothing

Qualquer ajuda será bem vinda, estou a ficar totalmente maluco .

Share this post


Link to post
Share on other sites
nelsonr

Boas,

não sei se ajudará, mas experimenta definir o objecto DoCmd dentro do ciclo e depois do close limpa (=nothing)

Esse erro dá em que linha?

Share this post


Link to post
Share on other sites
lcross

experimenta definir o objecto DoCmd dentro do ciclo e depois do close limpa (=nothing)

Esse erro dá em que linha?

acho que não entendi muito bem o que querias dizer...

podes dar-me so umas linhas gerais?

o eero dá no output do relatório mas como disse, só após ter criado muitos ficheiros... até 100 de uma vez criou sem problemas...

Share this post


Link to post
Share on other sites
nelsonr

Fazer o "Set DoCmd=..." que define o object, na linha antes do "DoCmd.OpenReport"

Fazer "Set DoCmd = nothing" depois do "DoCmd.Close"

Isso era para forçar limpar o object em cada ciclo, para ver se libertava as resources que utiliza.

Mas é apenas um teste, não faço ideia se resolve

Share this post


Link to post
Share on other sites
lcross

A ideia faz sentido, mas os meus conhecimentos não chegam para fazer o que sugeres, pois não faço ideia como definir o object....

ou seja :

Set DoCmd= ?????

Share this post


Link to post
Share on other sites
lcross

Pois o problema é que não tenho, pensei que fosse um comando directo de vba, pois é chamado directo nas macros...

Eu copiei o codigo para abrir um relatório e nele estava exactamente assim sem definição de objecto DoCmd...

Share this post


Link to post
Share on other sites
nelsonr

Pois, o DoCmd é um objecto interno.

No entanto, reparei que não estás a passar o terceiro parametro no close.

Será que não está a conseguir fechar? Experimenta usar o "acSaveYes"

Share this post


Link to post
Share on other sites
lcross

infelizmente o resultado é o mesmo , até experimentei com o "acSaveNo" mas foi igual....

Realmente ao fazer o loop pelos relatórios ele parece abrir uma ou mais "tabelas" (???) e depois não a fecha... é a única explicação que me ocorre com este erro mas não consigo entender o porquê....

O dbOpenSnapshot deveria fazer só um pedido certo? e depois fazer o loop pelos registos e ai, não deviriam abrir tabelas...

O DoCmd.OpenReport mesmo que tenha que abrir a rs.RecordSource e chamar a origem do relatório de cada vez que abre , e não conseguir fecha-las, seriam menos de 500 tabelas, eu pelo que li o access suporta em simultâneo 2048 tabelas.... o que significa que estará a abrir mais de 7 tabelas por relatório....

(nem consigo imaginar como)...

Share this post


Link to post
Share on other sites
nelsonr

Pelo que vi, pode ser o comando de fechar o report não esteja a funcionar porque o report ainda está a processar quando é executado.

Podes é experimentar colocar o doevents antes do close.

Uma hipotese que falam será abrir a janela em modal, mas não consigo experimentar aqui para ver se é viavel (adicionar , acDialog no final do openreport)

Share this post


Link to post
Share on other sites
lcross

O doevents antes do close não produziu nenhum efeito tb...

Ao acrescentar o acDialog no final do openreport, apenas abre o 1º relatório e fica assim..., não continua a execução.

Edited by lcross

Share this post


Link to post
Share on other sites
lcross

Estive a investigar noutro lado e uma das soluções propostas era a de "cortar o DoCmd.OpenReport do loop, mas assim ficava sem poder filtrar o relatório...

isto faz-te algum sentido??

será que me podes ajudar a adaptar este código proposto... isto usa os campos de um formulário para passar os valores para filtrar o relatório

mas será possível fazê-lo sem o formulário, só com código?

Dim qdf As QueryDef
Set qdf = CurrentDb.QueryDefs("qryRptS")
qdf.Parameters("[Forms!frmCompany!StartDate]") = Forms!frmCompany!StartDate
qdf.Parameters("[Forms!frmCompany!EndDate]") = Forms!frmCompany!EndDate
Dim rst As DAO.Recordset
Set rst = qdf.OpenRecordset()
rst.MoveFirst
Dim filename As String
Do While rst.EOF = False
  filename = rst.Fields("Trading Name") & " " & rst.Fields("Company ID")
  filename = Replace(filename, "/", "-")
  DoCmd.OutputTo acOutputReport, "rptQryS", "PDFFormat(*.pdf)", "\\HBSRV01\common\PROJECTS\Q1 Test\" & filename & ".pdf", False, "", , acExportQualityPrint
  rst.MoveNext
  DoCmd.SelectObject acForm, "frmCOMPANY", False
  DoCmd.GoToRecord acForm, "frmCOMPANY", acNext
Loop
End Function

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
Sign in to follow this  

×
×
  • 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.