Usuário com melhor resposta
Script .vbs - Filtro Anexo XML - Renomear XML

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
- Editado Fábio JrModerator terça-feira, 10 de abril de 2012 20:11 Script
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
- Editado Fábio JrModerator terça-feira, 10 de abril de 2012 16:14 Add script
- Sugerido como Resposta Fábio JrModerator terça-feira, 10 de abril de 2012 20:06
- Marcado como Resposta Fábio JrModerator quarta-feira, 11 de abril de 2012 19:53
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
- Editado Fábio JrModerator terça-feira, 10 de abril de 2012 16:14 Add script
- Sugerido como Resposta Fábio JrModerator terça-feira, 10 de abril de 2012 20:06
- Marcado como Resposta Fábio JrModerator quarta-feira, 11 de abril de 2012 19:53
-
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..
-
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
-
-
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
-
-
Perfeito....
Esta funcionando direito...
Só travou uma vez que tinha um e-mail em duplicidade..Vou ver como resolver isso.
Muito obrigado...
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
-
-
-
-
-
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 -
-
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.
-
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
-
-
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