8 Replies Latest reply: Mar 20, 2017 10:32 AM by Marcelo Fabris RSS

    Exportação PDF em lote

    Marcelo Fabris

      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

        • Re: Exportação PDF em lote
          Yuri Nicolett

          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

            • Re: Exportação PDF em lote
              Marcelo Fabris

              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

                • Re: Exportação PDF em lote
                  Alessandro Furtado

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

                    • Re: Exportação PDF em lote
                      Marcelo Fabris

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

                • Re: Exportação PDF em lote
                  fernando santana

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