segunda-feira, 28 de março de 2011

GERANDO O XML DA NFe EM VISUAL BASIC 6


Olá, Pessoal!! Vamos responder a algumas perguntas acercas de linguagens como Visual Basic 6 e Delphi 7. Sim, para estas duas linguagens se você não tiver nenhum componente pronto para criar o XML de sua NFe, deve fazer todo o código na unha, linha por linha!!!


Basicamente é nisso que se resume para muitos a criação do XML da NFe eletrônica, já que há grande variações de empresa para empresa - para não dizer de uma área de TI para outra área de TI - em diferentes empresas. Isso também se adequa aos padrões necessários a serem adotados para cada empresa em relação à sua atividade comercial: há certas peculiaridades para o grupo de automotivos que não existem para as empresas de refrigerantes, assim como o XML de uma indústria de componentes eletrônicos diverge de uma indústria de alimentos. Se sua empresa gera mais de dez notas fiscais com quinze itens cada uma por dia fica difícil você usar os aplicativos gratuitos fornecidos pelo site do SPED ou a Sefaz de seu estado.



Antes de mais nada: É CRUCIAL QUE VOCÊ ENTENDA DE XML E QUE TENHA O MANUAL DO CONTRIBUENTE PARA A GERAÇÃO DA NOTA FISCAL ELETRÔNICA! ANTES DE USAR O CÓDIGO ABAIXO, LEIA TODO O MANUAL E ENTENDA CADA TAG A SER GERADA PARA A SUA NOTA FISCAL ELETRÔNICA. TAMBÉM É CRUCIAL QUE VOCÊ ESTEJA PRÓXIMO A ÁREA FISCAL E ENTENDA CADA TAG QUE DEVA SER GERADA PARA A SUA EMPRESA E PARA A ATIVIDADE COMERCIAL ONDE A MESMA ESTÁ INSERIDA. SEM ISSO, SEU TRABALHO SERÁ EM VÃO E VOCÊ DEVERÁ FAZER NOVOS AJUSTES POSTERIORES PARA INSERIR ALGUMA TAG QUE ESQUECEU E É NECESSÁRIA!!



O exemplo abaixo é um dos muitos existentes na internet e foi extraído do site do VB Mania a título ilustrativo. O código completo não está sendo fornecido porque como todo bom desenvolvedor sabe bolo pronto nunca sai no ponto!

ATENÇÃO: O código abaixo ficará estranho por estar sendo postado aqui. Os links de XML são realmente mal-interpretados pelo blogger e precisam ser corrigidos linha a linha. Não farei isso aqui. Se desejar, consulte o link para a página onde os mesmos foram postados no VB Mania ou pode baixar do link abaixo (por enquanto!):


http://www.4shared.com/document/ilBKUDPt/XML_em_VB6.html



Vamos lá:


'Abre o Arquivo para Criação do XML


'----------------------------------


Open strArquivo For Output As #1


'Cabeçalho do Arquivo


'--------------------

With rstCabec .MoveFirst ' Print #1, "" 'Chr(239) & Chr(187) & Chr(191) Print #1, "" & " Print #1, "

'Chave da NFe '-------------------- Print #1, " 'Cabeçalho da NFe '------------------- Print #1, "" Print #1, " " & .Fields("xIdUF").Value & "" Print #1, " " & "0" & .Fields("xRandomico").Value & "" Print #1, " " & UCase(.Fields("xNatureza").Value) & "" Print #1, " " & .Fields("xFormaPagto").Value & "" Print #1, " " & .Fields("xModelo").Value & "" Print #1, " " & .Fields("xSerie").Value & "" Print #1, " " & .Fields("xidNFe").Value & "" Print #1, " " & .Fields("xDataEntradaSaida").Value & "" Print #1, " " & .Fields("xDataEntradaSaida").Value & "" Print #1, " " & .Fields("xIdTipoNF").Value & "" Print #1, " " & .Fields("xIdMunicipio").Value & "" Print #1, " " & 1 & "" Print #1, " " & .Fields("xTipoEmissao").Value & "" Print #1, " " & Right(strChaveNFe, 1) & "" Print #1, " " & "2" & "" Print #1, " " & .Fields("xFinalidade").Value & "" Print #1, " " & "0" & "" Print #1, " " & "1.10" & "" Print #1, "" '---------------------------------------------------------------------------------------------------- 'Dados Emitente '---------------------------------------------------------------------------------------------------- Print #1, "" Print #1, " " & .Fields("xCNPJ") & "" Print #1, " " & .Fields("xEmitRazaoSocial").Value & "" Print #1, " " Print #1, " " & .Fields("xEmitLogradouro").Value & "" Print #1, " " & .Fields("xEmitNumero").Value & "" Print #1, " " & .Fields("xEmitBairro").Value & "" Print #1, " " & .Fields("xEmitIdMunicipio").Value & "" Print #1, " " & .Fields("xEmitMunicipio").Value & "" Print #1, " " & .Fields("xEmpresaUF").Value & "" Print #1, " " & .Fields("xEmitCEP").Value & "" Print #1, " " & "1058" & "" Print #1, " " & "Brasil" & "" Print #1, " " & .Fields("xEmitTelefone").Value & "" Print #1, " " Print #1, " " & .Fields("xEmitIE").Value & "" Print #1, "" '---------------------------------------------------------------------------------------------------- 'Dados Destinatario '---------------------------------------------------------------------------------------------------- Print #1, "" Print #1, " " & .Fields("xCNPJ") & "" Print #1, " " & .Fields("xDestRazaoSocial").Value & "" Print #1, " " Print #1, " " & .Fields("xDestLogradouro").Value & "" Print #1, " " & .Fields("xDestNumero").Value & "" If Len(.Fields("xDestComplemento").Value) > 0 Then Print #1, " " & .Fields("xDestComplemento").Value & "" End If Print #1, " " & .Fields("xDestBairro").Value & "" Print #1, " " & .Fields("xDestIdMunicipio").Value & "" Print #1, " " & .Fields("xDestMunicipio").Value & "" Print #1, " " & .Fields("xDestUF").Value & "" Print #1, " " & .Fields("xDestCEP").Value & "" Print #1, " " & .Fields("xDestIdPais") & "" Print #1, " " & .Fields("xDestPais") & "" Print #1, " " & .Fields("xDestTelefone").Value & "" Print #1, " " Print #1, " " & .Fields("xDestIE").Value & "" If Len(.Fields("xDestSuframa").Value) > 0 Then Print #1, " " & .Fields("xDestSuframa").Value & "" End If If Len(.Fields("xDestCNAE").Value) > 0 Then Print #1, " " & .Fields("xDestCNAE").Value & "" End If Print #1, "" '---------------------------------------------------------------------------------------------------- End With 'Dados dos Produtos '------------------ With rstItem .MoveFirst Do While .EOF = False DoEvents Print #1, "" Print #1, " " Print #1, " " & .Fields("xCodigo").Value & "" Print #1, " " & .Fields("xCodigoEAN").Value & "" Print #1, " " & .Fields("xDescrProduto").Value & "" If Len(Replace(.Fields("xCodigoNCM").Value, ".", "")) > 0 Then Print #1, " " & .Fields("xCodigoNCM").Value & "" End If Print #1, " " & "0" & "" Print #1, " " & .Fields("xCFOP").Value & "" Print #1, " " & .Fields("xUnidade").Value & "" Print #1, " " & .Fields("xQuantidade").Value & "" Print #1, " " & .Fields("xPrecoUnitario").Value & "" Print #1, " " & .Fields("xTotalProduto").Value & "" Print #1, " " & .Fields("xCodigoEAN").Value & "" Print #1, " " & .Fields("xUnidade").Value & "" Print #1, " " & .Fields("xQuantidade").Value & "" Print #1, " " & .Fields("xPrecoUnitario").Value & "" 'Dados da Importação '-------------------- If Len(rstCabec.Fields("xDINumero").Value) > 0 Then Print #1, " " Print #1, " " & rstCabec.Fields("xDINumero").Value & "" ' & .Fields("xNumeroDI") & "" Print #1, " " & rstCabec.Fields("xDIDataRegistro").Value & "" ' & Format(.Fields("xDataRegistroDI"), "YYYY-mm-dd") & "" Print #1, " " & rstCabec.Fields("xDILocalDesembaraco").Value & "" ' & .Fields("xLocalDesemb") & "" Print #1, " " & rstCabec.Fields("xDIUFDesembaraco").Value & "" ' & .Fields("xUFDesemb") & "" Print #1, " " & rstCabec.Fields("xDIDataDesembaraco").Value & "" ' & Format(.Fields("xDataDesemb"), "YYYY-mm-dd") & "" Print #1, " " & rstCabec.Fields("xDICodExportador").Value & "" ' & rstCabec.Fields("xCodExportador") & "" If Len(rstCabec.Fields("xNumeroAD").Value) > 0 Then Print #1, " " Print #1, " " & rstCabec.Fields("xNumeroAD").Value & "" ' & .Fields("xNumeroAdicao").Value & "" Print #1, " " & rstCabec.Fields("xItemAD").Value & "" '& .Fields("xSequenciaAdicao").Value & "" Print #1, " " & rstCabec.Fields("xFabricanteAD").Value & "" '& .Fields("xCodFabricante").Value & "" 'Verifica se tem desconto na DI '------------------------------ If rstCabec.Fields("xDescontoAD") > 0 Then Print #1, " " & Replace(Format(rstCabec.Fields("xDescontoAD"), "0.00"), ",", ".") & "" End If Print #1, " " '------------------------------ End If Print #1, " " End If Print #1, " " '-------------------------------------------------------------------------------------------------------- 'Destacamento dos Impostos '------------------------- Print #1, " " 'ICMS '--------- Print #1, " " Print #1, " Print #1, " " & rstCabec.Fields("xICMSOrigem") & "" Print #1, " " & .Fields("xSitTrib").Value & "" If .Fields("xSitTrib").Value = "00" Then 'Tributada Integralmente Print #1, " " & rstCabec.Fields("xICMS_Modalidade").Value & "" Print #1, " " & rstCabec.Fields("xI

O código acima pode também ser encontrado em:


http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=abrir&varID=342709


Sucesso mais uma vez a todos!!




By


Leonardo Metelys


leo_florindo@hotmail.com

terça-feira, 15 de março de 2011

DANFE: LINHA DE CHAMADA & UTILIDADES

Olá, pessoal!

Ao longo dos últimos dois anos este pequeno projeto sofreu muitas melhorias que evoluíram com a necessidade daqueles que necessitavam desta parte do longo projeto da NF-e.

Aqui farei um resumo das melhorias de implementação constantes neste projeto de DANFE, que deve ser comum a maioria dos projetos disponíveis no mercado. O diferencial deste projeto é que esta venda não é destinada ao consumidor final, mas a desenvolvedores que necessitam de conhecimentos sobre a Nf-e eletrônica e necessitam desenvolver uma solução mais própria do que um pacote fechado possa oferecer - por isso coloco à venda os fontes do aplicativo.

A versatilidade desse aplicativo também colabora para o desenvolvimento de outros possívels utilitários para a Nf-e. Por exemplo, o mesmo código-fonte utilizado para a leitura do XML na geração da DANFE pode ser reaproveitado para criar-se um módulo de leitura para qualquer arquivo XML de nota fiscal eletrônica o que facilitará no futuro a entrada de notas fiscais em sua base de dados. Com pequenas alterações, você conseguirá desenvolver um bom leitor de arquivos XML de notas fiscais eletrônicas.


Os fontes de minha DANFE ficaram mais fáceis de manipular com a criação de um aplicativo em LINHA DE CHAMADA, que permite que esta DANFE possa ser utilizada com outras linguagens de programação, como DELPHI, C# ou Visual Basic 6.


A chamada do aplicativo é como mostrado abaixo:

Danfechamada CaminhoXML CaminhoPDF NomePDF CaminhoLogotipo

Onde:
CaminhoXML -> Indica a pasta onde se encontra o arquivo XML a ser fornecido para a geração da DANFE
CaminhoPDF -> Indica o caminho onde deve ser gravado o arquivo PDF a ser gerado
NomePDF -> Indica o nome do arquivo PDF a ser gerado
CaminhoLogotipo -> Indica o caminho e o nome do logotipo que devem ser inseridos na impressão da DANFE

Exemplo:

No Iniciar -> Executar do Windows XP ou Windows 7:

C:\Nfe\DanfeChamada.exe C:\Nfe\Nfe.xml C:\Nfe Danfe123 C:\Nfe\Imagem1.jpg

No CMD.EXE:
Mude para a pasta c:\nfe. Em seguida, digite a linha conforme abaixo:
Danfechamada c:\nfe\nfe.xml c:\nfe\ notadanfe2.pdf c:\nfe\imagem2.jpg
Troque, por exemplo, os parâmetros para a gravação do pdf e a imagem para a imagem1.jpg.


Recentemente fiz a venda somente do aplicativo compilado e o mesmo também pode estar à disposição, desde que você siga todos os passos para sua utilização no momento da compra. Contudo, isso me isenta de erros que possam vir a ocorrer devido a não-aquisição do código-fonte do projeto. A limitação imposta a este tipo de aquisição é descrita no momento da compra por parte do cliente.

No código-fonte há dois modos de impressão da DANFE. Um que diz respeito a DANFE somente com uma página e o outro que diz respeito a impressão da DANFE COMPLEMENTAR com mais de doze itens. O código da DANFE COMPLEMENTAR geralmente estará comentando no interior do código-fonte. Caso deseje imprimir a DANFE COMPLEMENTAR deve descomentar as linhas que geram o relatório e comentar as que geram a primeira página da DANFE. Geralmente tenho orientado que se criem dois botões, um que imprime a capa da DANFE (a primeira página) e outro que, caso a DANFE possua mais de doze itens habilite o botão e imprima a DANFE EM MODO COMPLEMENTAR.


Dependências do aplicativo:

1. Net Framework 3.5
2. Crystal Reports Basic for Visual Studio 2008 (x86,x64)
3. Microsoft Visual Studio 2008 Reportr Viewer
4. SQL Server Compact3.5
5. Visual Studio Tools for the Office system 3.0 Runtime




Os conhecimentos necessários para a utilização do código-fonte:

1) Conhecimentos em Vb.NET 2008
2) Conhecimentos em Crystal Reports
3) Conhecimentos de instalação de requisitos de aplicativos. Como um bom técnico de suporte e um bom desenvolvedor sabem isso é
estritamente necessário para desenvolvedores que entendam a diferente entre instalar uma aplicação em um ambiente cliente-servidor
e um ambiente de servidor. Você deve compreender como criar um pacote de instalação do código-fonte do aplicativo e instalar o mesmo
com sucesso em uma máquina-cliente bem como entender que este mesmo pacote não é o mesmo para uma implementação em um servidor.

Abril pode ser o último prazo para adoção da nova NFe.

Sucesso a todos!!

By

Leonardo Metelys

leo_florindo@hotmail.com

UM APLICATIVO PARA LEITURA DEVOCIONAL ANUAL DA BIBLIA EM ANDROID

Olá, pessoal!  Este novo projeto foi criado em Visual Studio 2019 em C#.Net com o Xamarin. Já está disponível no Google Play para vocês baix...