quarta-feira, 29 de abril de 2009

NF-E: UM CAMINHO PARA O CÓDIGO DE BARRAS EM VB6

Se você está enfrentando dificuldades para gerar o código de barras em Visual Basic 6, pode pensar de um outro modo e usar o próprio VB.NET como caminho para a geração do código de barras 128C da NF-e.
Para isto, basta compilar uma aplicação Windows Form que simplesmente gere o código de barras e utilizar uma chamada call no Visual Basic 6 para esta simples aplicação.
1. Inicie um novo projeto Windows Form Applicattion no VB.Net
2. Chame este projeto de GerBarras
3. Quando os arquivos forem criados, vá ao menu Project -> GerBarras Properties. Clique na opção References na tela que se abre.

A tela será como a que segue abaixo:



Clique no botão Add e indique o caminho do diretório onde se encontra o Barcodelib.dll, conforme a figura.

Usaremos esta dll para fazer a geração do código de barras, recebendo como parâmetro de chamada a numeração que deve ser transformada em código de barras. O aplicativo deverá então gerar uma imagem da numeração do código de barras na pasta C:\NF-e\barras.


Após incluir o barcodelib.dll, clique na pasta Debug e na opção Command Line Arguments digite "parametro", conforme a tela mostrada abaixo:






Agora, nos resta informar o código para geração do código de barras.

4. No modo design do form1, inclua uma objeto Picture. Para isso, clique no menu View e depois em ToolBox. Do lado esquerdo, será aberto a barra de ferramentas. Procure no Common Controls pelo PictureBox. Pressione o mouse sobre ele e arraste-o para o formulário.

Defina as propriedades do PictureBox1 como segue:

Width: 361
Size: 104


5. Em seguida, informe o código abaixo para o form1:

Código na imagem:

Imports System.IO
Imports System.Text
Imports System.Drawing

Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing.Text

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Valor As String

If Command() <> "" Then
Valor = Command()
Dim Barcode As New BarcodeLib.Barcode(Valor, BarcodeLib.TYPE.CODE128C)
PictureBox1.Image = Barcode.Encode(BarcodeLib.TYPE.CODE128C, Valor, 300, 150)
PictureBox1.Visible = True
Barcode.SaveImage("C:\NF-E\Barras\BARRAS.JPG", BarcodeLib.SaveTypes.JPG)

'MsgBox("Gerado com Sucesso")

End
End If
End Sub
End Class


Clique no menu Build na opção Build GerBarras.

A aplicação será gerada. Se não houverem erros, teste o executável gerado:


6. Encontre o diretório Bin\Release dentro dos fontes do projeto GerBarras. O caminho dos fontes no VB.NET sempre fica identificado com o nome do seu projeto. Exemplo:

C:\Vb.NEt Fontes\GeraBarras\GerBarras\GerBarras\bin\Release

Dentro do diretório Release está o GerBarras.exe que você acaba de criar.

7. Copie o GerBarras.exe para o C:\ da sua máquina.

8. Após isso, clique no botão Iniciar do Windows XP Professional (estou supondo que o sistema operacional na sua máquina é o Windows XP. Fiz este exemplo em uma máquina com o Windows XP), e selecione a opção Executar no Menu:

Na caixa Abrir, digite C:\GerBarras.exe 123456895

Pronto!

Um arquivo jpg apresentando o código de barras do número 123456895 será criado na pasta C:\Nfe-e\Barras.

É só ir até lá e conferir.

Você pode mudar o diretório mudando a linha:


Barcode.SaveImage("C:\NF-E\Barras\BARRAS.JPG", BarcodeLib.SaveTypes.JPG)

Para o diretório que achar mais apropriado.

Para chamar este pequeno aplicativo no Visual Basic 6, use o comando Call:

'Código de Barras a ser gerado

CodigoNfe = Right(TxtID, 44)

'Gerar Código de barras

Call Shell("C:\GerBarras.exe " & CodigoNfe)

Abraço a todos!!

sábado, 11 de abril de 2009

NF-E: GERANDO RECIBO DE LOTE EM VB.NET

A seguir é apresentado um pequeno aplicativo gerado em VB.Net 2008 para gerar o pedido de recibo de um lote NF-e enviado a Sefaz. Você deve construir o formulário de acordo com o modelo abaixo apresentado:

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!!

quarta-feira, 8 de abril de 2009

VB.NET: DANFE EM CRYSTAL E CÓDIGO DE BARRAS 128C

A Danfe pode ser gerada em Crystal 8.5 e depois migrada para dentro do Vb.NET ou,
se você preferir, totalmente criada dentro do VB.NET 2008 com a ferramenta Crystal
ali contida - muito mais poderosa e fácil de trabalhar.

Usar a DANFE em VB.NET 2008 possibilita utilizar um DATASET para gerar a leitura do arquivo XML da NF-e.

Usando o VB.NET 2008

É preciso acrescentar ao form o uso das bibliotecas necessárias:

Imports System.Xml
Imports System.IO
Imports System.Text

Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing.Text

Cada uma delas será necessária para o projeto em si

Isso se fará necessário quando o fornecedor da empresa enviar em vez da DANFE em pdf o arquivo XML propriamente dito. Muitas empresas além da DANFE impressa que acompanha a mercadoria podem disponibilizar o arquivo XML via e-mail da nf-e emitida.

LANÇANDO OS DADOS DO XML EM UM DATASET


Crie o DATASET normalmente e defina os campos do modo apropriada para receber os
dados do arquivo XML

No botão de impressão, você poderá definir os dados do seguinte modo:

Dim myDs1 As New DsXML1()
Dim myRow2 As DsXML1.DtDsXML1Row
Dim reader As XmlTextReader = New XmlTextReader(TxtArquivo.Text)

'DsXML1 é o nome do DATASET com o campos da XML

'abrindo o DATASET
myRow2 = myDs1.DtDsXML1.NewDtDsXML1Row

'Lendo o XML
Do While (reader.Read())

'Fazendo a seleção dos campos
Select Case reader.NodeType
Case XmlNodeType.Element 'Exibir o início do elemento.

If reader.HasAttributes Then 'Se existirem atributos
While reader.MoveToNextAttribute()

If reader.Name = "Id" Then
myRow2.IdChave = Mid(reader.Value, 4)
myRow2.Id = ValorTexto
endif

If reader.Name = "emit" Then
SelecionarEmitente = True
SelecionarDestinatario = False
End If

'----------------------------------------------------------
'Dados do EMITENTE
If SelecionarEmitente = True Then
If reader.Name = "CNPJ" Then
myRow2.EmitCNPJ = reader.ReadString
End If
If reader.Name = "IE" Then
myRow2.EmitIE = reader.ReadString
End If
If reader.Name = "xNome" Then
myRow2.EmitxNome = reader.ReadString
End If
If reader.Name = "xLgr" Then
myRow2.EmitxLgr = reader.ReadString
End If
If reader.Name = "xMun" Then
myRow2.EmitxMun = reader.ReadString
End If
If reader.Name = "UF" Then
myRow2.EmitUF = reader.ReadString
End If
If reader.Name = "CEP" Then
myRow2.EmitCEP = reader.ReadString
End If
End If

...
...

End Select
Loop

'Fecha o XML
reader.Close()
myDs1.DtDsXML1.AddDtDsXML1Row(myRow2)

'Imprimindo a DANFE
Dim caminho_imagem As String
caminho_imagem = "C:\NF-E\Barras\BARRAS.JPG"

Dim myRelatorio As New rptIAM()
myRelatorio.SetDataSource(myDs1)

myRelatorio.ParameterFields(0).AllowCustomValues = True
myRelatorio.ParameterFields(0).CurrentValues.AddValue(caminho_imagem)

'myRelatorio.SetParameterValue(0, caminho_imagem)
Me.CrvXml.ReportSource = myRelatorio

Me.CrvXml.Visible = True
TxtArquivo.Text = ""


Seguinte estes passos, você poderá imprimir a DANFE totalmente jogando os dados para um DATASET e associando este DATASET ao relatório em Crystal.


CÓDIGO DE BARRAS 128C para a NF-e

O BarcodeLib pode ser encontrado nas páginas do CodeProject (http://www.codeproject.com/KB/graphics/BarcodeLibrary.aspx), que se trata de uma área de projetos em várias linguagens da plataforma Vb.Net. O dll gerado pelo projeto
mostrado permite gerar o código de barras 128C no formato desejado pela NF-e.

Para integrar a dll no seu Projeto em Vb.Net você simplesmente precisa acessar em
seu projeto o menu Project - Properties e clicar em ADD, apontando para a pasta onde se encontra o barcodelib.dll.

Após acrescentar a DLL, acrescente a mesma à sua lista de bibliotecas no
início do form:

Imports BarcodeLib



Para gerar o código de barras do código da NF-e, basta usar o seguinte código:

Dim Barcode As New BarcodeLib.Barcode(ValorTexto, BarcodeLib.TYPE.CODE128C)
PictureBox2.Image = Barcode.Encode(BarcodeLib.TYPE.CODE128C, ValorTexto, 300, 150)
Barcode.SaveImage("C:\NF-E\Barras\BARRAS.JPG", BarcodeLib.SaveTypes.JPG)

Dim fs As New FileStream("C:\NF-E\Barras\BARRAS.JPG", FileMode.Open)
Dim br As New BinaryReader(fs)
myRow2.Imagem = br.ReadBytes(br.BaseStream.Length)

br.Close()
fs.Close()

br = Nothing
fs = Nothing

'myRow2 é um DATASET no qual está sendo jogado os dados da XML. Defina o
'campo que receberá o código de barras como sendo do tipo byte. No caso,
'o campo no dataset se chama Imagem

Após lançar a imagem dentro do campo imagem, basta arrasta este campo para a
área onde o código deverá ser impresso que a imagem será apresentada na visualização
do relatório


Arquivos disponíveis:

DANFE em Vb.NEt 2008
http://www.4shared.com/file/97470303/39ecd635/Danfe_VBNet.html


Danfe em Crystal 8.5
http://www.4shared.com/file/97468171/63f3f4ef/Danfe_Layout.html


BarcodeLib
http://www.4shared.com/file/97468816/a41cfd45/BarcodeLib.html

segunda-feira, 6 de abril de 2009

A BÍBLIA DO XML

Essa aqui é para aqueles que precisam realmente de ajuda!!

Eis o link da Bíblia do XML no 4shared:

http://www.4shared.com/file/10594264/1d5c518f/XML_Programming_Bible.html


A única ressalva: está em inglês!!!

NF-E - XML PARA O VISUAL BASIC

As funções abaixo ajudam na leitura de um arquivo XML da NF-e.

Você só precisa fazer a leitura das tags corretas e lançá-las na
base de dados - que pode ser em Access, SQL ou MySQL.

Para que funcione a contento, você precisa setar em References as
devidas bibliotecas associadas a MSXLM DOM.


As funções foram extraídas da internet.


'LENDO O XML
Private Sub LoadSettings()
Dim objNode As XMLNode
Dim objSubNode As XMLNode

'Does the Settings.xml file exist?
If PathExists("C:\NF-E\13090404672291000115550040000000280000000745-nfe.xml") Then
'Parse XML file and get top level node
Set objNode = XMLParse("C:\NF-E\13090404672291000115550040000000280000000745-nfe.xml", XML_FILE).Item("NFe")

Dim oRs As New ADODB.Recordset
Dim oRx As New ADODB.Recordset
Dim sSQL2 As String

'SE NÃO EXISTIR O MUNICÍPIO, INSERE OS DADOS DO MESMO
sSQL2 = "INSERT INTO XML(NFE, CUF, CNF) VALUES ( '" & _
Right(ID, 44) & "', '" & UF & "', '" & cNF & "')"


Cn.Execute sSQL2

MsgBox "LENDO OS DADOS COM SUCESSO!!", vbInformation, "XML"



End If
End Sub

Public Function Parse() As VBA.Collection
Dim strData As String
Dim i As Byte

'Get the XML data
If Flags And XML_FILE Then
'It is on disk so read it
strData = ReadFile(Data)
Else
'Otherwise just make a copy into our local
'variable (modifications are made)
strData = Data
End If

'Remove comments / id tags
StripTags strData, ""
StripTags strData, ""

'Remove the null characters
strData = Replace(strData, vbNullChar, vbNullString)

'Create a new collection
Set Parse = New Collection

'Are we supposed to overwrite data?
If Flags And XML_OVERWRITE Then
Set Nodes = Parse
End If

'Begin parsing!
ParseRec strData, Parse

End Function

Private Sub ParseRec(ByRef strData As String, ByVal colNodes As VBA.Collection)
'------------------------------------------------------------------
'Purpose: Recursive function which goes through all the data
' given to parse for XML until there is none left
'
'Params:
' strData: Data to parse
' colNodes: Current level collection of nodes
'------------------------------------------------------------------

Dim i As Long
Dim k As Long
Dim strValue As String
Dim strName As String
Dim objNode As XMLNode

'Find first <
i = InStrB(1, strData, "<")

'Keep looping while there are <
Do While i
'Alright there is a node; create a new one
Set objNode = New XMLNode

'Find end of first tag
k = InStrB(i, strData, ">")

'If there is no >, then we've got bad XML
If k = 0 Then
Exit Do
End If

'Extract data inbetween <>
strName = MidB$(strData, i + 2, k - i - 2)

'Check for a space in the name
i = InStrB(1, strName, " ")

'If there is a space, there may be attributes,
'otherwise no
If i Then
'Extract name of node
objNode.Name = LeftB$(strName, i - 1)

'Parse attributes if any
ParseAttr MidB$(strName, i + 2), objNode.Attributes

'If the name ends in a /, then there is no end tag
'otherwise there is
If AscW(RightB$(strName, 2)) = CHR_FSLASH Then
i = 0
Else
i = 1
End If
Else
'If the name ends in a /, then there is no end tag
'otherwise there is
If AscW(RightB$(strName, 2)) = CHR_FSLASH Then
'Trim off / from name
objNode.Name = LeftB$(strName, LenB(strName) - 2)
i = 0
Else
objNode.Name = strName
i = 1
End If
End If

'If i is non-zero, then we have to find the end tag
If i Then
'Find end tag position
i = InStrB(k, strData, "")

'Did we find it?
If i Then
'Extract value
strValue = MidB$(strData, k + 2, i - k - 2)

'Parse any nodes which might be inside
ParseRec strValue, objNode.Nodes

'Unescape escape sequences
objNode.Value = XMLUnescape(strValue)

If objNode.Name = "cUF" Then
UF = objNode.Value
End If
If objNode.Name = "cNF" Then
cNF = objNode.Value
End If
'Should equal position of last character for this node
k = i + LenB(objNode.Name) + 4
Else
'Malformed XML; quit
Exit Do
End If
End If

'Remove parsed data from string
strData = MidB$(strData, k + 2)

'Index node in collection
On Error Resume Next
colNodes.Add objNode, objNode.Name

'If an error occured, then we should add it to
'the collection without indexing it (it's already taken)
If Err.Number Then
colNodes.Add objNode

'Clear error
Err.Clear
End If

'Find next <
i = InStrB(1, strData, "<")
Loop

End Sub

Private Sub ParseAttr(ByRef strAttr As String, ByVal colAttr As VBA.Collection)
'------------------------------------------------------------------
'Purpose: To parse an attribute list for an XML tag and to place
' them inside the collection
'
'Params:
' strAttr: List of attributes/values seperated by
' spaces
' colAttr: Collection to add XMLAttr objects to
'------------------------------------------------------------------

Dim c As Integer
Dim i As Long
Dim objAttr As XMLAttr

'Find first equal's sign
i = InStrB(1, strAttr, "=")

'Loop as long as there are attributes
Do While i
'Create new attribute
Set objAttr = New XMLAttr

'Extract name (may have leading space(s))
objAttr.Name = LTrim$(LeftB$(strAttr, i - 1))

'Skip ahead to value
strAttr = MidB$(strAttr, i + 2)

'Get first character
c = AscW(strAttr)

'How is the attributed formated; surrounding quotes or no?
Select Case c
Case CHR_SQUOTE, CHR_DQUOTE
'Find ending quote
i = InStrB(3, strAttr, ChrW$(c))

'Did we find it?
If i Then
'Extract value and skip past this attribute
objAttr.Value = XMLUnescape(MidB$(strAttr, 3, i - 3))
strAttr = MidB$(strAttr, i + 2)
Else
'Bad XML!
Exit Do
End If
Case Else
'A space then will herald then end
i = InStrB(1, strAttr, " ")

'Did we find one?
If i Then
'Extract value and then skip past current attribute data
objAttr.Value = XMLUnescape(LeftB$(strAttr, i - 1))
strAttr = MidB$(strAttr, i + 2)
Else
'It is the last attribute; copy remaining data and
'exit loop
objAttr.Value = XMLUnescape(strAttr)
Exit Do
End If
End Select

If objAttr.Name = "Id" Then
ID = objAttr.Value
End If

If objAttr.Name = "UF" Then
UF = objAttr.Value
End If


'Add to collection
colAttr.Add objAttr, objAttr.Name

'Find next attribute
i = InStrB(1, strAttr, "=")
Loop

End Sub

Public Function XMLUnescape(ByRef strData As String) As String
'------------------------------------------------------------------
'Purpose: Converts escape sequences for XML into the actual
' characters
'
'Params:
' strData: String to search for escaped characters in
'
'Returns: String with escaped characters converted back to actual
' representation
'------------------------------------------------------------------

Dim i As Long

XMLUnescape = strData

If LenB(XMLUnescape) Then
i = InStrB(1, XMLUnescape, "&")

'If there is a & in the string, that is where we should start searching
If i Then
'Make sure there is a semi colon, telling us there may be escape sequences
If InStrB(i, XMLUnescape, ";") Then
'Escape various illegal characters
If InStrB(i, XMLUnescape, "<") Then XMLUnescape = Replace(XMLUnescape, "<", "<")
If InStrB(i, XMLUnescape, ">") Then XMLUnescape = Replace(XMLUnescape, ">", ">")
If InStrB(i, XMLUnescape, """) Then XMLUnescape = Replace(XMLUnescape, """, """")
If InStrB(i, XMLUnescape, "'") Then XMLUnescape = Replace(XMLUnescape, "'", "'")
If InStrB(i, XMLUnescape, "&") Then XMLUnescape = Replace(XMLUnescape, "&", "&")
End If
End If
End If

End Function

Public Function XMLParse(ByRef strData As String, ByVal lngFlags As Long) As VBA.Collection
'------------------------------------------------------------------
'Purpose: Wrapper method to quickly parse an XML document
'
'Params:
' strData: Data property of XMLDoc
' lngFlags: Flags property of XMLDoc
'
'Returns: Reference to top-level nodes collection
'------------------------------------------------------------------

Dim objXML As XMLDoc

'Create new XML object
Set objXML = New XMLDoc

'Copy data/flags params
objXML.Data = strData
objXML.Flags = lngFlags

'Parse / return collection
Set XMLParse = objXML.Parse()

'Destroy XMLDoc reference
Set objXML = Nothing

End Function

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...