Jump to content

Recommended Posts

Posted

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 .

Posted

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

Posted

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

Posted

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

Posted

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)...

Posted

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)

Posted (edited)

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
Posted

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

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.