none
Script .vbs - Filtro Anexo XML - Renomear XML RRS feed

  • Pergunta

  • Bom dia,

    Estou precisando de uma ajuda, para que eu possa terminar este script.

    Recebo mais de 1000 e-mail por dia com Nota Fiscal Eletrônica em anexo. Então utilizo o script abaixo para salvar os e-mail recebido pelo Outlook 2010.

    Mas agora eu preciso de uma ajuda existe uma chave no arquivo XML chamada <chNFe>,  preciso que antes que o script salve o anexo ele indentifique o valor desta chave (ex <chNFe>35120361267233000140550010000033361718521508</chNFe>) e renomeie o arquivo para 35120361267233000140550010000033361718521508-NFE.XML

    ou seja o nome do arquivo deverá ser a chave "'chNFe'-NFE.xml"

    Script para download

    Public Sub ProcessarXMLAnexoLoja01(Email As MailItem)
         Dim DiretorioAnexos As String
         DiretorioAnexos = "D:\arqxml\receb001\"
     
        Dim MailID As String
         Dim Mail As Outlook.MailItem
        
         MailID = Email.EntryID
         Set Mail = Application.Session.GetItemFromID(MailID)
            
         For Each Anexo In Mail.Attachments
             If Right(Anexo.FileName, 3) = "xml" Then
                 Anexo.SaveAsFile DiretorioAnexos & Anexo.FileName
             End If
         Next
        
         Set Mail = Nothing
     End Sub
     
    


    terça-feira, 10 de abril de 2012 13:14

Respostas

  • Eu não conheço o formato do arquivo, utilizando técnicas de leitura XML seria melhor, mas o exemplo abaixo deve ajudar vc a conseguir a string que vc precisa.

    Const ForReading = 1, ForWriting = 2 Set fso = CreateObject("Scripting.FileSystemObject") FileName="nfe.txt" Set MyFile = fso.OpenTextFile(FileName, ForReading) If MyFile.AtEndOfStream Then ReadAllTextFile = "" Else ReadAllTextFile = MyFile.ReadAll End If MyFile.close

    arrNFE=split(ReadAllTextFile,"chNFe") 'Limpa sujeira inicio ValorNFE=mid(arrNFE(1),2) 'Limpar sujeira fim ValorNFE=left(ValorNFE,len(ValorNFE)-2) msgbox ValorNFE 'Agora complete o script para renomear o arquivo utilizando a variavel ValorNFE

    FSO.MoveFile FileName , ValorNFE & "-NFE.xml"



    Fábio de Paula Junior


    terça-feira, 10 de abril de 2012 15:57
    Moderador

Todas as Respostas

  • Eu não conheço o formato do arquivo, utilizando técnicas de leitura XML seria melhor, mas o exemplo abaixo deve ajudar vc a conseguir a string que vc precisa.

    Const ForReading = 1, ForWriting = 2 Set fso = CreateObject("Scripting.FileSystemObject") FileName="nfe.txt" Set MyFile = fso.OpenTextFile(FileName, ForReading) If MyFile.AtEndOfStream Then ReadAllTextFile = "" Else ReadAllTextFile = MyFile.ReadAll End If MyFile.close

    arrNFE=split(ReadAllTextFile,"chNFe") 'Limpa sujeira inicio ValorNFE=mid(arrNFE(1),2) 'Limpar sujeira fim ValorNFE=left(ValorNFE,len(ValorNFE)-2) msgbox ValorNFE 'Agora complete o script para renomear o arquivo utilizando a variavel ValorNFE

    FSO.MoveFile FileName , ValorNFE & "-NFE.xml"



    Fábio de Paula Junior


    terça-feira, 10 de abril de 2012 15:57
    Moderador
  • O problema fábio é que eu queria unificar os dois scripts...

    o que eu utilizo para salvar os anexos e este acima para verificar a chave e alterar o nome....

    ou seja, preciso verificar se o e-mail tem anexo, e antes de salvar verificar a chave e salvar com o nome correto..

    terça-feira, 10 de abril de 2012 16:57
  • Vc pode adicionar este código dentro do foreach onde vc salva o arquivo, aí com o nome do arquivo que vc acabou de salvar na pasta vc substitui o valor da variavel filename.

    Tente alterar o seu código, se não der certo post aqui o seu código alterado e indique qual erro e comportamento do script.


    Fábio de Paula Junior

    terça-feira, 10 de abril de 2012 17:31
    Moderador
  • Fabio,

    consegui acertar... muito obrigado...

    Mas... só uma pergunta...

    Existe como colocar uma condição para verificar se existe a chave chNFe --- sim alterar o nome do arquivo  --- não alterar o nome para AQUIVOSEMCHAVE.XML

    terça-feira, 10 de abril de 2012 19:58
  • Quando existe a chave a linha abaixo vai criar um array com 3 elementos (indexes= 0,1 e 2).

    arrNFE=split(ReadAllTextFile,"chNFe")
    

    Você pode verificar qual o maior index do array, se for igual a 2 é porque existia a chave, senão é porque não existia.

    Para verificar o maior elemento de um array utilize a função ubound.

    maior_index=ubound(arrNFE)


    Fábio de Paula Junior

    terça-feira, 10 de abril de 2012 20:06
    Moderador
  • Perfeito....

    Esta funcionando direito...

    Só travou uma vez que tinha um e-mail em duplicidade..Vou ver como resolver isso.

    Muito obrigado...

    terça-feira, 10 de abril de 2012 20:31
  • Perfeito....

    Esta funcionando direito...

    Só travou uma vez que tinha um e-mail em duplicidade..Vou ver como resolver isso.

    Muito obrigado...

    Boa Noite amigo.

    Tenho o mesmo problema com os arquivos xml aqui na empresa, consigo fazer a primeira parte mais não consigo fazer com que renomeie, como ficou seu scrip final ? 

    Agradeço se puder ajudar ? Obrigado.
    • Editado Dept. Fiscal terça-feira, 12 de junho de 2012 03:19
    terça-feira, 12 de junho de 2012 03:18
  • Amigo Boa noite Preciso de um scrypt igual este como ficou o seu ele executa toda vez q chega um novo email

    tenho um so q nao esta legal  as veses ele nao salva o xml

    posta como ficou o seu para nos ajudar

    quinta-feira, 19 de julho de 2012 22:01
  • Boa noite amigo, vou colocar meu codigo, ainda com alguns erros quando tem xml em duplicidade, segunda feira coloco aqui.

    sábado, 21 de julho de 2012 02:34
  • Boa tarde estou precisando de uma ajuda com o script.

    Até onde ele baixa os anexos que contem xml e salva em uma pasta funcionou, agora não estou conseguindo fazer com que renomeie o arquivo.

    segunda-feira, 20 de agosto de 2012 19:17
  • Boa Tarde!!

    Pessoal!

    Quem tem o Script ai POR FAVOR poderia compartilhar conosco??  isso é de grande ajuda para muita gente acredito eu!!

    quarta-feira, 21 de novembro de 2012 16:21
  • Boa tarde,

    Ai esta como estou utilizando. só não consegui resolver o problema com duplicidade.

    Exemplo depois de renomeado:

    (NUMERO DANFE_EMITENTE_CHAVE DE ACESSO): 001234_NOTA DE FULANO DE TAL_0000000000000000000000000000000000000000.xml

    Public Sub ProcessarAnexo(Email As MailItem)
        Dim DiretorioAnexos As String
        DiretorioAnexos = "C:\Users\usuario\Documents\XML_Entradas\"
        Dim MailID As String
        Dim Mail As Outlook.MailItem
        Dim fso

        MailID = Email.EntryID
        Set Mail = Application.Session.GetItemFromID(MailID)

        For Each Anexo In Mail.Attachments
            If Right(Anexo.FileName, 4) = ".xml" Then
               Anexo.SaveAsFile DiretorioAnexos & Anexo.FileName
               Set objParser = CreateObject("Microsoft.XMLDOM")
                objParser.Load (DiretorioAnexos + Anexo.FileName)

                Set ElemList = objParser.getElementsByTagName("chNFe")
                FilePath = ElemList.Item(0).getAttribute("filePath")

                oldFileName = DiretorioAnexos + Anexo.FileName

                Set ElemList = objParser.getElementsByTagName("nNF")
                nNF = Format(ElemList.Item(0).Text, "000000")


                Set ElemList = objParser.getElementsByTagName("chNFe")
                chNFe = ElemList.Item(0).Text

                Set ElemList = objParser.getElementsByTagName("xNome")
                xNome = ElemList.Item(0).Text

                newFileName = DiretorioAnexos + nNF + "_" + xNome + "_" + chNFe + ".xml"

                Set fso = CreateObject("Scripting.FileSystemObject")
                fso.MoveFile oldFileName, newFileName
            End If
        Next

        Set Mail = Nothing
    End Sub

                                                                    
    quinta-feira, 29 de novembro de 2012 20:11
  • Mto bom o código....

    ja estou utilizando a algum tempo....  porem realmente o problema da duplicidade incomoda, pois tenho cliente que manda 2 e-mails por nota.

    Se algum souber como resolver.. por favor nos ajude..

    Grato.

    sexta-feira, 4 de janeiro de 2013 16:48
  • Estou tentando utilizar esse código no meu outlook 2010, porém o mesmo não executa, já salvei o script no editor vb mais o mesmo não acessa os meus emails para baixar os anexos.

    Galera se alguem poder me ajudar, tenho mais de 30 mil emails que preciso baixar xml, pois o antigo funcionario que ocupava a minha função não fazia o arquivamento dos mesmo.

    Utilizo um sistema de leitura de código de barras para dar entrada nas NFs então gostaria de renomear o arquivo somente com o numero do <chNFe>.xml.

    quarta-feira, 6 de fevereiro de 2013 11:29
  • Jefferson,

    Talvez seja melhor (ou mais rápido) procurar ajuda em um fórum de office já que seu problema não é o código e sim como usar.

    Eu ajudei a fazer o código mas nem executei ele no meu outlook, não uso Macros, mas me parece que por padrão a execução de Macros não é habilitada (posso estar falando besteira).


    Fábio de Paula Junior

    • Sugerido como Resposta jeffersonnlucas quarta-feira, 6 de fevereiro de 2013 13:23
    quarta-feira, 6 de fevereiro de 2013 12:53
    Moderador
  • Obrigado, creio que possa ser isso mesmo, entretanto o codigo rodou apenas uma vez na minha maquina. Agora ele não funciona mais. creio que a configuração padrão deva ter bloqueado.
    quarta-feira, 6 de fevereiro de 2013 13:24
  • Bom Dia !!

    Pessoal desculpe reviver este topico, mas preciso de uma ajuda !! 

    adicionei no codigo a instrução abaixo para salvar a placa do veículo junto com o nome do arquivo, funciona perfeito, só que tem um cliente que nao sei porque cargas d'agua nao coloca a tag <placa> no .xml dele... ai como a instrução nao acha acaba dando erro e travando tudo....

    Set ElemList = objParser.getElementsByTagName("placa")
                placa = Format(ElemList.Item(0).Text, "00000000")

    Alguem sabe uma forma de fazer uma comparação, pra que se nao tiver a tag informada o scritp ignore esse trecho??

    Grato

    sábado, 3 de agosto de 2013 12:14