lcross Posted September 19, 2013 at 04:24 PM Report #525202 Posted September 19, 2013 at 04:24 PM 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 .
nelsonr Posted September 19, 2013 at 04:39 PM Report #525204 Posted September 19, 2013 at 04:39 PM 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?
lcross Posted September 19, 2013 at 08:27 PM Author Report #525236 Posted September 19, 2013 at 08:27 PM 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...
nelsonr Posted September 19, 2013 at 08:42 PM Report #525237 Posted September 19, 2013 at 08:42 PM 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
lcross Posted September 19, 2013 at 09:24 PM Author Report #525244 Posted September 19, 2013 at 09:24 PM 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= ?????
nelsonr Posted September 19, 2013 at 09:37 PM Report #525246 Posted September 19, 2013 at 09:37 PM Onde é que tens esse objecto definido? Deves ter algures Dim DoCmd as ...
lcross Posted September 20, 2013 at 09:34 AM Author Report #525282 Posted September 20, 2013 at 09:34 AM 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...
nelsonr Posted September 20, 2013 at 09:46 AM Report #525284 Posted September 20, 2013 at 09:46 AM 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"
lcross Posted September 20, 2013 at 10:22 AM Author Report #525298 Posted September 20, 2013 at 10:22 AM 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)...
nelsonr Posted September 20, 2013 at 10:43 AM Report #525299 Posted September 20, 2013 at 10:43 AM 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)
lcross Posted September 20, 2013 at 11:33 AM Author Report #525306 Posted September 20, 2013 at 11:33 AM (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 September 20, 2013 at 11:34 AM by lcross
lcross Posted September 20, 2013 at 11:45 AM Author Report #525307 Posted September 20, 2013 at 11:45 AM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now