Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Exportação PDF em lote

Caros, boa tarde!

Estou com uma dificuldade no processo para exportar pra PDF. Vale lembrar que para exportar um único projeto ou mesmo vários selecionados em um único PDF já funciona. Minha dificuldade está em gerar um PDF para cada projeto selecionado. Eu montei toda a macro porém não está funcionando. Como o editor não mostra o erro, ou mesmo aponta onde está enroscando, gostaria da ajuda dos amigos.

Sub GR_Chamados

'Chama a sub PrintPDF de acordo com os projetos selecionados

Dim FieldName

FieldName = "PJ_ID"

set mySelections = ActiveDocument.Fields(FieldName).GetPossibleValues

msgbox "Projetos selecionados: " & mySelections.Count

Dim i

For i = 0 to mySelections.Count -1

    Dim FieldValue

    FieldValue = mySelections.Item(i).text

    ActiveDocument.Fields(FieldName).Select FieldValue

    MSGBOX "campo: " & FieldValue & " FieldName: " & FieldName

    Print_PDF FieldValue, "Status Report", "RP01"

    MSGBOX "volta: " & i

Next

  

ActiveDocument.GetApplication.WaitForIdle

End Sub

'---------------------------------------------------------------------------------------------------------------


Sub PrintPDF(FieldValue, ReportName, ReportID)

  msgbox "PrintPDF"

  'Caminho a ser gerado o relatório encontra-se na variável

  Path = ActiveDocument.Evaluate("C:\Exporta")

  'Nome do arquivo a ser criado

  set sPDFName = ReportName & " - " & FieldValue

  'Criando instância do PDFCreator

    Set pdfjob = CreateObject("PDFCreator.clsPDFCreator")

  'Variáveis de configuração da biblioteca PDFCreator

    With pdfjob

   'Verificações da fila da impressora

      If .cStart("/NoProcessingAtStartup") = False Then

         If .cStart("/NoProcessingAtStartup", True) = False Then

           'Caso não tenha nenhum objeto na fila de impressão, termina a macro.

           Exit Sub

         End if

        

         'Caso tenha objeto na fila de impressão, torne a impressão visível

         .cVisible = True

      End If

      .cOption("UseAutosave") = 1 'Permitir o Autosave

      .cOption("UseAutosaveDirectory") = 1 'Permitir que grave no diretório

      .cOption("AutosaveDirectory") = Path 'Caminho que será gravado o relatório

      .cOption("AutosaveFilename") = sPDFName 'Nome que será gravado o relatório

      .cOption("AutosaveFormat") = 0 'Formato PDF

      .cClearCache

  'Finalizando as configurações da biblioteca PDFCreator

    End With

    'Imprime o relatório

    ActiveDocument.PrintReport "RP01", "PDFCreator"

    'Aguarde até que o processo entre na fila de impressão

    Do Until pdfjob.cCountOfPrintjobs = 1

    ActiveDocument.GetApplication.Sleep 20

    Loop

    pdfjob.cPrinterStop = False

    'Aguarda até que a fila de impressão esteja vazia

    Do Until pdfjob.cCountOfPrintjobs = 0

    ActiveDocument.GetApplication.Sleep 20

    Loop

   

    'Termina o processo

    pdfjob.cClose

   

    'Zerando a variável

    Set pdfjob = Nothing

End Sub

Até fazer a chamada para a SUB PrintPDF td vai normal. Nesse momento simplesmente pára e retorna para o editor de macros. Aquela msgbox não é mostrada. Se coloco dois argumentos na chamada da sub ela passa a ser chamada. Depois dá erro mas é decorrente de não ter passado o terceiro parâmetro.

Ex:

PrintPDF "Status Report", "RP01"

Sub PrintPDF(ReportName, ReportID)

  msgbox "PrintPDF"

Não entendo o fato de parar de funcionar só por eu colocar mais um argumento.

É possível indicar uma pasta do desktop do usuário para gravar os arquivos? Tipo %windir%\%user% ...

Alguma dica?

Vlw

1 Solution

Accepted Solutions
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Marcelo,

para rodar tem que usar o scheduler do windows e o QlikView Desktop.....

O cuidado sempre esta nas permissões da macro, especialmente quando abre com outro usuário diferente do que esta rodando......

Sobre loop dos campos eu uso...

Set TabelaEmails = ActiveDocument.Fields("Gerente").GetPossibleValues(1000)

For contEmail = 0 to TabelaEmails.Count - 1

      ActiveDocument.Fields("Gerente").Select TabelaEmails.Item(contEmail).Text

Tem um select que não vi no seu código, mas vale ressaltar que me viro em vbs, e portanto posso estar falando bobagem.....

furtado@farolbi.com.br

View solution in original post

8 Replies
nicolett_yuri

Marcelo, você vai ter que debuggar o seu código utilizando vários msgbox, em pontos diferentes do código, para identificar em qual momento esta ocorrendo o erro.

Eu tenho um exemplo pronto desse loop, mas consigo te enviar só a noite

Not applicable
Author

Blz ... eu consegui acertar alguns pontos e agora a macro está funcionando parcialmente. Ela imprime o primeiro registro porém não imprime o segundo selecionado. Também estou tentando descobrir como fazer para que o(s) arquivo(s) pdf(s) gerado(s) no browser seja(m) gravado(s) na pasta downloads do desktop do usuário.

Outro ponto que estou com dificuldades é o fato da macro não rodar no server. Já vi outro post onde vc passa uma série de instruções. Executei todas elas e ainda nada acontece. A opção de executar macro não segura estava desabilitada no server. Habilitei e apliquei. Até o momento nada acontece quando eu pressiono os botões. Sabe se leva algum tempo até que a alteração se propague?

Segue meu código como está no momento:

Sub GR_Chamados

Dim FieldName, FieldDt

Dim FieldValue, FieldValueDt

Dim dia, mes, ano

Dim i

FieldName = "PJ_ID"

FieldDt = "HT_DATA"

set mySelections = ActiveDocument.Fields(FieldName).GetPossibleValues

set mySelectionsDt = ActiveDocument.Fields(FieldDt).GetPossibleValues

'Loop para pegar todos os registros selecionados

For i = 0 to mySelections.Count -1

  FieldValue = mySelections.Item(i).text

  FieldValueDt = mySelectionsDt.Item(i).text

  'Separa a data

  dia = day(FieldValueDt)

  mes = month(FieldValueDt)

  ano = year(FieldValueDt)

  'Monta o nome do arquivo

  FieldValueDt = ano & mes & dia

  FieldValue = FieldValue & " - " & FieldValueDt

  'sub PrintPDF

  PrintPDF FieldValue, "RP01"

Next

ActiveDocument.GetApplication.WaitForIdle

End Sub

'---------------------------------------------------------------------------------------------------------------

Sub PrintPDF(ReportName, ReportID)

  'Caminho a ser gerado o relatório encontra-se na variável

  Path = ActiveDocument.Evaluate("vPathArquivos")

  'Criando instância do PDFCreator

    Set pdfjob = CreateObject("PDFCreator.clsPDFCreator")

  'Variáveis de configuração da biblioteca PDFCreator

    With pdfjob

  'Verificações da fila da impressora

  If .cStart("/NoProcessingAtStartup") = False Then

  If .cStart("/NoProcessingAtStartup", True) = False Then

  'Caso não tenha nenhum objeto na fila de impressão, termina a macro.

  Exit Sub

  End if

  'Caso tenha objeto na fila de impressão, torne a impressão visível

  .cVisible = True

  End If

 

  .cOption("UseAutosave") = 1 'Permitir o Autosave

  .cOption("UseAutosaveDirectory") = 1 'Permitir que grave no diretório

' .cOption("AutosaveDirectory") = "C:\Exporta" 'Caminho que será gravado o relatório

  .cOption("AutosaveFilename") = ReportName 'Nome que será gravado o relatório

  .cOption("AutosaveFormat") = 0 'Formato PDF

  .cClearCache

  'Finalizando as configurações da biblioteca PDFCreator

    End With

    'Imprime o relatório

    ActiveDocument.PrintReport "RP01", "PDFCreator"

    'Aguarde até que o processo entre na fila de impressão

    Do Until pdfjob.cCountOfPrintjobs = 1

    ActiveDocument.GetApplication.Sleep 20

    Loop

    pdfjob.cPrinterStop = False

    'Aguarda até que a fila de impressão esteja vazia

    Do Until pdfjob.cCountOfPrintjobs = 0

    ActiveDocument.GetApplication.Sleep 20

    Loop

   

    'Termina o processo

    pdfjob.cClose

   

    'Zerando a variável

    Set pdfjob = Nothing

End Sub

'Teste de macro

Sub Macro

  msgbox "Macro Ok!!"

End sub

Grato,

Marcelo

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Marcelo,

para rodar tem que usar o scheduler do windows e o QlikView Desktop.....

O cuidado sempre esta nas permissões da macro, especialmente quando abre com outro usuário diferente do que esta rodando......

Sobre loop dos campos eu uso...

Set TabelaEmails = ActiveDocument.Fields("Gerente").GetPossibleValues(1000)

For contEmail = 0 to TabelaEmails.Count - 1

      ActiveDocument.Fields("Gerente").Select TabelaEmails.Item(contEmail).Text

Tem um select que não vi no seu código, mas vale ressaltar que me viro em vbs, e portanto posso estar falando bobagem.....

furtado@farolbi.com.br
Not applicable
Author

Olá Alessandro!!

Realmente é necessário utilizar o select para posicionar o ponteiro no registro a ser impresso. Havia outro problema na minha macro uma vez que eu alternava entre os registros do campo HT_Data. Esse campo só possui uma seleção e deixei o parâmetro fixo. A exportação está funcionando corretamente e criando um PDF para cada registro selecionado.

Com relação ao uso da macro ela não funciona nem no meu desktop com o webview ativado. Só estou utilizando o meu usuário mesmo no servidor. Alguma nova ideia? Não acredito que as macros não sejam habilitadas no ambiente server. Do contrário porque haveriam as opções de segurança no servidor para habilitar/desabilitar macros? Me perdoe se eu estiver falando bobagens.

Abraços!!

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

Marcelo,

Ao abrir o modelo, tem que ter um disparador para rodar a macro. Assim, se você schedular no Windows, toda vez vai rodar....

furtado@farolbi.com.br
Not applicable
Author

Eu instalei o plugin da versão 12 e as macros estão funcionando corretamente agora no IE.

Not applicable
Author

criei uma macro e realizei as configuras recomendadas, não funcionou, consegue me ajudar?

Not applicable
Author

Qual problema vc está enfrentando Fernando? Instalou o plugin da versão 12?

Habilitou as questões de segurança do browser?