Dois Textboxs, três pequenos botões, duas labels e um OpenDialog. A tela gerada deverá ficar como a apresentada abaixo:
Para gerar o código do XML para o pedido de lote, vamos nos aproveitar de um código válido de pedido de lote. Acrescente a seguinte função a seu aplicativo. Ela será chamada quando o botão Pedir Recibo for pressionado, sendo alterada para os dados do arquivo de retorno de lote que você selecionar da pasta retorno:
Function criarDocumentoXML(ByVal Protocolo As String) As XDocument
'Usa o código de um recibo existente como base para a geração
'de um novo arquivo xml de pedido de lote
Return
<
?xml version="1.0" encoding="UTF-8"?>
<
consReciNFe
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema" versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<
tpamb
>2</tpamb>
<nrec
>130000000177443</nrec>
</consReciNFe>
Return
End Function
Na cláusula general do formulário acrescente essas duas classes:
Imports System.Xml
Imports System.Xml.Linq
No OpenDialog altere as seguintes propriedades:
Filename: *.xml
InitialDirectory: C:\NF-E\Retorno
Dentro do botão com as reticências (...) acrescente o código de chamada do OpenDialog:
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
OpenFileDialog1.ShowDialog()
TxtArquivo.Text = OpenFileDialog1.FileName
End Sub
Esse simples código fará a abertura do diretório C:\NF-e\Retorno. Dentro dele, você deverá clicar em um arquivo num-lot de retorno válido. No exemplo da figura foi selecionado o arquivo 13090404672291000115550040000000270000000730-num-lot.xml.
Já deu para perceber o que estamos fazendo?
Vamos selecionar um arquivo num-lot de retorno da NF-e e usar o layout de um arquivo de pedido de lote pré-existente para gerar um novo arquivo de pedido de lote para o arquivo num-lot que selecionarmos.
Para fazer isso, fornecemos o arquivo num-lot. Mas também precisaremos do arquivo de recibo para pegar o número do Protocolo. Usaremos o arquivo num-lot selecionado para pegar o número do recibo constante dentro do mesmo e abrir o arquivo de recibo em sequência dentro do botão Gerar Lote.
O código para o botão Gerar Recibo é apresentado abaixo:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim NomeArquivoRecibo As String
Dim Protocolo As String
Dim Status As String
Dim ArquivoLote As String
'Dim CodigoErro As String
Dim Texto As String
' Dim NomeNfe As String
' Dim Tamanho As Integer
Dim Zeros As String
If TxtArquivo.Text = "" Then
MsgBox("Arquivo XML nÆo selecinado!!")
Exit Sub
TxtArquivo.Focus()
End If
Zeros = ""
ArquivoLote = TxtArquivo.Text
Status = ""
Protocolo = ""
'Abrir o arquivo de Status de Retorno
Dim xml As XElement = XElement.Load(ArquivoLote)
Dim elements As IEnumerable(Of XElement) = Xml.Elements()
Texto = xml.Element("NumeroLoteGerado").Value
If Len(Texto) = 1 Then Zeros = "00000000000000"
If Len(Texto) = 2 Then Zeros = "0000000000000"
If Len(Texto) = 3 Then Zeros = "000000000000"
If Len(Texto) = 4 Then Zeros = "00000000000"
NomeArquivoRecibo = "C:\NF-E\Retorno\" + Zeros + Texto + "-rec.xml"
'Abrir arquivo de recibo com os dados do arquivo de lote selecionado
'Dim testeXML As XElement = XElement.Load(NomeArquivoRecibo)
Dim reader As XmlTextReader = New XmlTextReader(NomeArquivoRecibo)
Do While (reader.Read())
Select reader.NodeType
Case XmlNodeType.Element
If reader.Name = "cStat" Then
Status = reader.ReadString
End If
'Obter o n£mero do protocolo
If reader.Name = "nRec" Then
Protocolo = reader.ReadString
End If
End Select
Loop
'Console.ReadLine()
reader.Close()
NomeProtocolo = Protocolo
If (Status <> "103") And (Protocolo = "") Then
MsgBox("Problemas com a Nf-e. Erro de Status: " + Status)
End If
'Gerando o novo arquivo de pedido de recibo
Dim arquivo As String = "C:\NF-E\Envio\" + Protocolo + "-ped-rec.xml"
Dim doc = criarDocumentoXML(Protocolo)
'Salvar o XML gerado
doc.Save(arquivo)
'Abrir agora o arquivo XML criado e inserir o Protocolo encontrado!!
Dim arquivo2 As String = "C:\NF-E\envio\" + Protocolo + "-ped-rec.xml"
Dim xDoc As New XmlDocument : xDoc.Load(arquivo)
'Declara um objeto Lista de Nodes
Dim nodeList As Xml.XmlNodeList
'Obtem todos os nodes para a lista com o nome desejado
nodeList = xDoc.GetElementsByTagName("nRec")
'Faz um la‡o para ler os nodes e alterar o seu conte£do.
For i As Integer = (nodeList.Count - 1) To 0 Step -1
nodeList.Item(i).InnerText = Protocolo
Next
'Salva o Arquivo
xDoc.Save(arquivo2)
LstValida.Text = arquivo2
MsgBox("Arquivo XML gerado com sucesso.")
'Timer1.Enabled = True
'carregaXML()
End Sub
O botão Close irá fechar o formulário chamado. Estou chamando este formulário de um outro:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Fecha o formulário aberto. Altere para o comando END se for necessário sair do aplicativo
Me.Close()
End Sub
Com isso, apresentamos um modo rápido de gerar um pedido de recibo de um arquivo de lote.
Abraços a todos!!
Nenhum comentário:
Postar um comentário