ConsultarDistribuicaoDFe(aCodigoUF, aCNPJCPF : string; aNSU: string; aTipoNSU: TNSUKind)
Este método permite aos atores da NF-e (envolvidos na operação) o acesso aos documentos fiscais eletrônicos (DF-e) e informações resumidas que não tenham sido gerados por ele e que sejam de seu interesse.
O método ConsultarDistribuicaoDFe
Exemplo em VB
Private Sub btnConsultarDfe_Click()
If ((cbbUFConfig.Text <> "") And (txtCNPJConfig <> "") And (cbbCertificado.Text <> "")) Then
strngrdNotas.Text = ""
txtQtdNotas.Text = ""
' Inicia consulta com NSU = "000000000000000"
consultaDFe ("000000000000000")
Else
MsgBox "Campos Certificado ou UF ou CNPJ vazios!"
End If
End Sub
Private Sub consultaDFe(ultNSU As String)
Dim RetDFe, auxXML As String
Dim j, jx, i As Integer
Dim listaXML, nsu As Collection
Set nsu = New Collection
Set listaXML = New Collection
Dim lNodeList, iRSEmitente, iVNF, iSitManifestacao As IXMLDOMNodeList ' tipagem da MSXML6_TLB
' Função de "Consulta da Relação de Documentos a serem distribuidos para determinado CPF ou CNPJ de acordo com a NF-e"
' ConsultarDistribuicaoDFe(aCodigoUF, aCNPJCPF : string; aNSU: string; aTipoNSU: TNSUKind): string;
RetDFe = spdNFe.ConsultarDistribuicaoDFe(trataUF(cbbUFConfig.Text), spdNFe.CNPJ, ultNSU, nkUltimo)
' A função abaixo recebe o XML da consulta
configObjeto (RetDFe)
' Obtém o NSU mais alto e salva em maxNSU
Set lNodeList = lXMLDoc.selectNodes("//retDistDFeInt/maxNSU")
maxNSU = lNodeList.Item(0).Text
' Percorre os NSU e salva os números em nsu
Set lNodeList = lXMLDoc.selectNodes("//retDistDFeInt/loteDistDFeInt/docZip/@NSU")
If lNodeList.length > 0 Then
For i = 0 To lNodeList.length - 1
nsu.Add lNodeList.Item(i).Text
' Atualiza variável nroUltiNSU (último NSU) e nroIniNSU (valor inicial do NSU)
' Cada consulta retorna 50 ítens; ao final da Sub, esses valores serão usados para
' repetir a consulta até atingir o maxNSU
nroUltiNSU = lNodeList.Item(i).Text
nroIniNSU = lNodeList.Item(0).Text
If ultNSU = "000000000000000" Then
txtNSUInicial.Text = nroIniNSU
End If
Next i
End If
' Criando NodeList com XML compactado
Set lNodeList = lXMLDoc.selectNodes("//retDistDFeInt/loteDistDFeInt/docZip")
' Verifica se NodeList não está vazia
If (lNodeList.length > 0) Then
For i = 0 To lNodeList.length - 1
auxXML = lNodeList.Item(i).Text
' Descompacta cada XML e salva o na collection listaXML
listaXML.Add spdNFe.DescompactarXMLZip(auxXML)
Next
End If
' Conta o número de chaves para atualizar o contador
For jx = 1 To listaXML.Count
configObjeto (listaXML(jx))
' Criando NodeList com as chaves
Set lNodeList = lXMLDoc.selectNodes("//resNFe/chNFe")
' Verifica se NodeList está vazia
If lNodeList.length > 0 Then
For i = 0 To lNodeList.length - 1
QtdChaves = QtdChaves + 1
Next
End If
Next
' Atualiza o contador
txtQtdNotas.Text = Str(QtdChaves)
' Loop para carregar as chaves
For j = 1 To listaXML.Count
configObjeto (listaXML.Item(j))
' Selecionando chNFe, xNome e vNF para gerar o relatório
Set lNodeList = lXMLDoc.selectNodes("//resNFe/chNFe")
Set iRSEmitente = lXMLDoc.selectNodes("//resNFe/xNome")
Set iVNF = lXMLDoc.selectNodes("//resNFe/vNF")
' Verifica se NodeList não está vazia
If (lNodeList.length > 0) Then
' Preenche a lista com os resultados da pesquisa
For i = 0 To lNodeList.length - 1
strngrdNotas.Text = strngrdNotas.Text & vbCrLf _
& " * chNota = " & lNodeList.Item(i).Text & vbCrLf _
& " * NSU = " & nsu.Item(j) & vbCrLf _
& " * xNome = " & iRSEmitente.Item(i).Text & vbCrLf _
& " * vNF = " & iVNF.Item(i).Text & vbCrLf _
& "========================================================"
Next
End If
Next
' Implementação recursiva para fazer as consultas
' Caso esteja marcada a checkbox chkConsultaTotal
' Atualiza os campos de texto com valores inicial e final de NSU
txtNroUltiNSU.Text = nroUltiNSU
' Chama a Sub consultaDFe informando o último NSU consultado
' Na próxima consulta, SEFAZ envia a partir do próximo NSU
If (Val(nroUltiNSU) < Val(maxNSU)) And (chkConsultaTotal.Value) Then
consultaDFe nroUltiNSU
End If
End Sub
Sub configObjeto(XML As String)
' Configura objeto lXMLDoc
Set lXMLDoc = New DOMDocument60
lXMLDoc.setProperty "SelectionLanguage", "XPath"
lXMLDoc.async = False
If XML <> "" Then
lXMLDoc.loadXML RemoverNameSpaces(XML)
Else
MsgBox "XML não informado!"
End If
End Sub
Private Function RemoverNameSpaces(XMLString As String) As String
cRemoveNSTransform = "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" _
& "<xsl:output method=""xml"" indent=""no""/>" _
& "<xsl:template match=""/|comment()|processing-instruction()"">" _
& " <xsl:copy>" & " <xsl:apply-templates/>" & " </xsl:copy>" _
& "</xsl:template>" _
& "<xsl:template match=""*"">" & " <xsl:element name=""{local-name()}"">" _
& " <xsl:apply-templates select=""@*|node()""/>" & " </xsl:element>" _
& "</xsl:template>" _
& "<xsl:template match=""@*"">" & " <xsl:attribute name=""{local-name()}"">" _
& " <xsl:value-of select="".""/>" & " </xsl:attribute>" _
& "</xsl:template>" _
& "</xsl:stylesheet>"
Dim Doc, XSL As IXMLDOMDocument2
Dim Res As String
Dim p As Long
Set Doc = New DOMDocument60
Doc.async = False
Set XSL = New DOMDocument60
XSL.async = False
If Doc.loadXML(XMLString) Then
XSL.loadXML (cRemoveNSTransform)
Res = Doc.transformNode(XSL)
p = InStrRev(Res, "?>")
If p <> 0 Then
result = Mid(Res, p + 2)
End If
RemoverNameSpaces = result
Else
MsgBox "Ocorreu um erro!"
End If
End Function
Private Sub btnDescompactar_Click()
If strngrdNotas.Text <> "" Then
strngrdNotas.Text = spdNFe.DescompactarXMLZip(strngrdNotas.Text)
Else
MsgBox "Campo está vazio!"
End If
End Sub
Private Sub btnDownloadNFe_Click()
Dim chaveDownload, xmlCompactado As String
Dim localiza As Integer
chaveDownload = InputBox("Entre o valor da chave")
If chaveDownload <> "" Then
strngrdNotas.Text = ""
strngrdNotas.Text = spdNFe.ConsultarDistribuicaoDFeChave(trataUF(spdNFe.UF), spdNFe.CNPJ, chaveDownload)
' Limpa o retorno, deixando apenas o valor dentro da tag <docZip></docZip>
localiza = InStrRev(strngrdNotas.Text, ".xsd")
If localiza <> 0 Then
xmlCompactado = Mid(strngrdNotas.Text, localiza + 6)
strngrdNotas.Text = Replace(xmlCompactado, "</docZip></loteDistDFeInt></retDistDFeInt>", "")
' Aplica o método DescompactarXMLZip
strngrdNotas.Text = spdNFe.DescompactarXMLZip(strngrdNotas.Text)
End If
Else
MsgBox "Chave da nota não preenchida!"
End If
End Sub
Private Sub btnLoadConfig_Click()
'Arquivo INI a ser manipulado com parametrizações
spdNFe.ConfigINI = App.Path + "\nfeConfig.ini"
ArqIni = App.Path + "\nfeConfig.ini"
spdNFe.LoadConfig (ArqIni) 'Esse metodo faz com que o Componente carregue as configuracoes do INI para as devidas propriedades
' carregar valores
txtCNPJConfig.Text = spdNFe.CNPJ
cbbUFConfig.Text = spdNFe.UF
If spdNFe.NomeCertificado <> "" Then
cbbCertificado.List(0) = spdNFe.NomeCertificado
cbbCertificado.ListIndex = 0
End If
If rbHomologacao.Value = True Then
spdNFe.Ambiente = akHomologacao
Else
spdNFe.Ambiente = akProducao
End If
End Sub
Private Sub Command1_Click()
Form2.Show
End Sub
Private Sub Form_Initialize()
'Instancia o Objeto responsável pela interação com servidores da Receita'
Set spdNFe = New NFeX.spdNFeX
Set spdNFeDataSet = New NFeDataSetX.spdNFeDataSetX
' Método ConfigurarSoftwareHouse
' Método responsável por realizar a validação de licença com a Tecnospeed.
' Chamada : _spdNFeX.ConfigurarSoftwareHouse(aCnpjSH : String, aTokenSH : String)
' aCnpjSH : deve ser informado o CNPJ da Software House cliente Tecnospeed
' aTokenSH : deve ser informado o Token que a Software House possui junto a Tecnospeed
spdNFe.ConfigurarSoftwareHouse "08187168000160", "000000000000000000000"
'Utiliza Método do Componente para Listar Certificados instalado no SO
Dim i As Integer
Dim vetor As Variant
vetor = Split(spdNFe.ListarCertificados("|"), "|")
cbbCertificado.Clear
For i = LBound(vetor) To UBound(vetor)
cbbCertificado.AddItem vetor(i)
Next
End Sub
Exemplo em Delphi
Criando uma classe usando a OCX com todas as dependências necessárias
unit uConsultaDFe; interface uses System.SysUtils,Classes,Vcl.Grids, NFeX_TLB,MSXML6_TLB; type TConsultarDFE = class private spdNFeX: TspdNFeX; function GetCodeUF(const aUF: String): String; function RemoveNameSpaces(aXMLString: String): string; public constructor Create(const aCaminhoINI:string); destructor destroy(); procedure ConsultaDFe(const aUF:WideString;const aCNPJ:WideString;const aNSU:WideString;astrngrdNotas:TStringGrid); end; implementation { TConsultarDFE } constructor TConsultarDFE.Create(const aCaminhoINI:string); begin //Instancia o Objeto responsável pela interação com servidores da Receita' spdNFeX := TspdNFeX.Create(nil); //Esse metodo faz com que o Componente carregue as configuracoes do INI para as devidas propriedades spdNFeX.LoadConfig(ACaminhoINI); end; procedure TConsultarDFE.ConsultaDFe(const aUF:WideString;const aCNPJ:WideString;const aNSU:WideString;aStrnGrdNotas:TStringGrid); var lXMLDoc: IXMLDOMDocument2; procedure confgObject(XML: WideString); begin try lXMLDoc := CoDOMDocument60.Create; lXMLDoc.setProperty('SelectionLanguage', 'XPath'); if XML <> '' then lXMLDoc.loadXML(RemoveNameSpaces(XML)) else raise Exception.Create('XML não informado!'); except on E: Exception do Exception.Create(E.Message); end; end; var auxXML : Widestring; i,j,jx : Integer; listaXML, chaves : TStringList; lNodeList, iRSEmitente, iVNF : IXMLDOMNodeList; //tipagem da MSXML6_TLB qtdChaves, linhaGrid : Integer; RetDFe :string; begin {Função de "Consulta da Relação de Documentos a serem distribuidos para determinado CPF ou CNPJ de acordo com a NF-e} RetDFe := spdNFeX.ConsultarDistribuicaoDFe(GetCodeUF(aUF),aCNPJ,aNSU,nkUltimo); aStrnGrdNotas.ColCount := 0; aStrnGrdNotas.RowCount := 0; aStrnGrdNotas.Cells[0, 0] := ''; if (RetDFe = EmptyStr) then begin raise Exception.Create('O Retorno DFe deve ser preenchid'); end else begin try listaXML := TStringList.Create; chaves := TStringList.Create; qtdChaves := 0; confgObject(RetDFe); //Criando NodeList com XML compactado lNodeList := lXMLDoc.selectNodes('//retDistDFeInt/loteDistDFeInt/docZip'); //Verifica se o NodeList não está vazia, para evitar AV if (lNodeList.length > 0) then begin for i := 0 to lNodeList.length - 1 do begin auxXML := lNodeList.item[i].text; //Descompactando XML e adicionando a lista listaXML.Add(spdNFeX.DescompactarXMLZip(auxXML)); end; //contando Chaves for jx := 0 to listaXML.Count - 1 do begin confgObject(listaXML.Strings[jx]); //Criando NodeList com as chaves lNodeList := lXMLDoc.selectNodes('//resNFe/chNFe'); if (lNodeList.length > 0) then begin for i := 0 to lNodeList.length - 1 do begin qtdChaves := qtdChaves + 1; end; end; end; //Montar Grid with aStrnGrdNotas Do begin ColCount := 4; RowCount := qtdChaves + 1; Cells[0, 0] := 'Chave NF-e'; Cells[1, 0] := 'Emitente'; Cells[2, 0] := 'vNF (R$)'; Cells[3, 0] := 'XML'; aStrnGrdNotas.ColWidths[0] := 270; aStrnGrdNotas.ColWidths[1] := 200; aStrnGrdNotas.ColWidths[2] := 50; aStrnGrdNotas.ColWidths[3] := 300; end; //Loop para carregar XML's da lista. linhaGrid := 1; for j := 0 to listaXML.Count - 1 do begin confgObject(listaXML.Strings[j]); //Criando NodeList com as chaves lNodeList := lXMLDoc.selectNodes('//resNFe/chNFe'); iRSEmitente := lXMLDoc.selectNodes('//resNFe/xNome'); iVNF := lXMLDoc.selectNodes('//resNFe/vNF'); if (lNodeList.length > 0) then begin for i := 0 to lNodeList.length - 1 do begin with aStrnGrdNotas do begin Cells[0, linhaGrid] := lNodeList.item[i].text; Cells[1, linhaGrid] := iRSEmitente.item[i].text; Cells[2, linhaGrid] := 'R$ ' + iVNF.item[i].text; Cells[3, linhaGrid] := listaXML.Strings[j]; end; linhaGrid := linhaGrid + 1; end; end; end; end; finally FreeAndNil(listaXML); FreeAndNil(chaves); end; end; end; destructor TConsultarDFE.destroy; begin FreeAndNil(spdNFeX); end; function TConsultarDFE.GetCodeUF(Const aUF : String) : String; var _listUF : TStringList; procedure PopulaListaUF; begin _listUF.Add('AC=12'); _listUF.Add('AL=27'); _listUF.Add('AP=16'); _listUF.Add('AM=13'); _listUF.Add('BA=29'); _listUF.Add('CE=23'); _listUF.Add('DF=53'); _listUF.Add('ES=32'); _listUF.Add('GO=52'); _listUF.Add('MA=21'); _listUF.Add('MT=51'); _listUF.Add('MS=50'); _listUF.Add('MG=31'); _listUF.Add('PA=15'); _listUF.Add('PB=25'); _listUF.Add('PR=41'); _listUF.Add('PE=26'); _listUF.Add('PI=22'); _listUF.Add('RJ=33'); _listUF.Add('RN=24'); _listUF.Add('RS=43'); _listUF.Add('RO=11'); _listUF.Add('RR=14'); _listUF.Add('SC=42'); _listUF.Add('SP=35'); _listUF.Add('SE=28'); _listUF.Add('TO=17'); _listUF.Add('AN=91'); end; begin _listUF := TStringList.Create; Try PopulaListaUF; Result := _ListUF.Values[aUF]; Finally _listUF.Free; End; end; function TConsultarDFE.RemoveNameSpaces(aXMLString: String): string; const // An XSLT script for removing the namespaces from any document. It will remove the prefix as well. // From http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl cRemoveNSTransform = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' + '<xsl:output method="xml" indent="no"/>' + '<xsl:template match="/|comment()|processing-instruction()">' + ' <xsl:copy>' + ' <xsl:apply-templates/>' + ' </xsl:copy>' + '</xsl:template>' + '<xsl:template match="*">' + ' <xsl:element name="{local-name()}">' + ' <xsl:apply-templates select="@*|node()"/>' + ' </xsl:element>' + '</xsl:template>' + '<xsl:template match="@*">' + ' <xsl:attribute name="{local-name()}">' + ' <xsl:value-of select="."/>' + ' </xsl:attribute>' + '</xsl:template>' + '</xsl:stylesheet>'; var Doc, XSL: IXMLDOMDocument2; Res: string; p: integer; begin Doc := CoDOMDocument60.Create; Doc.ASync := false; XSL := CoDOMDocument60.Create; XSL.ASync := false; try Doc.loadXML(aXMLString); XSL.loadXML(cRemoveNSTransform); Res := Doc.TransFormNode(XSL); // This now contains the original text with a prepended; remove it: p := Pos('?>', Res); result := Copy(Res, p + 2, Length(Res)); except on E: Exception do result := E.Message; end end; end.
Usando a classe de exemplo feita em delphi
procedure TForm1.btnConsultaDestClick(Sender: TObject); var fConsulta: TConsultarDFE; begin fConsulta := TConsultarDFE.Create(ExtractFilePath(ParamStr(0)) + 'nfeConfig.ini'); try fConsulta.ConsultaDFe('PR', edtCpfCnpjDestinadas.Text, '000000000000000', strngrdNotas); finally FreeAndNil(fConsulta); end;
Comentários
0 comentário
Por favor, entre para comentar.