 Trocando
dados entre sua aplicação Visual Basic e a Internet
Trocando
dados entre sua aplicação Visual Basic e a Internet
Tenho recebido diversos emails com dúvidas relacionadas a como acessar dados em um servidor remoto. Coisas do tipo :
Na verdade não existe uma resposta definitiva que resolva essas questões. Cada caso é um caso e muitos fatores tem que ser levados em consideração : o ambiente, os recursos, a implementação , as regras de negócios , o quanto se quer e se pode gastar , o objetivo final , etc...
Neste artigo vou mostrar uma solução para o um problema hipotético que servirá como um estimulo para que outras soluções seja criadas a partir da que vou mostrar. Embora simples ela é perfeitamente plausível e funcional.
O problema
Vamos supor que sua empresa tenha um site de vendas na internet que você queira acessar os dados dos produtos exibidos em sua página em uma aplicação Visual Basic. E então ? como fazer isto ???
Vou usar como exemplo a página da loja virtual que esta hospedada em http://www.macoratti.net/macoratti/loja/index.htm .(Esta loja foi construída em uma série de artigos ; para ler o primeiro artigo acesse : Criando a sua Loja Virtual - Objetivos e Modelagem de dados. )
Vou mostrar as telas iniciais do site loja virtual :
|  | - Ao
        lado esta a página inicial do site da sua empresa :
        JcmSoft - A sua Loja Virtual - A seguir , abaixo , vamos exibir o catálogo de produtos | 
| 
         | |
Agora vamos mostrar a tela que exibe detalhes dos produtos , quando o usuário clicar no link relacionado ao produto: (veja a tela abaixo)
|  | 
| tela exibindo detalhes dos produtos | 
Muito bem ! Eu quero criar uma aplicação Visual Basic que acesse e exiba localmente os dados mostrados na tela do site acima , ou seja , minha aplicação vai ter que exibir os seguintes dados :
Como fazer este acesso e como 'pegar' os dados e exibí-los em uma aplicação feita em Visual Basic localmente ?
A solução
É claro que não existe uma única forma de resolver este problema , vou mostrar uma delas.
| Problema | Solução | 
| Como acessar as informações localizadas em um servidor remoto ? | Vou usar o controle INET (MSINET.OCX) | 
| Como tratar as informações e exibi-las localmente ? | Vou usar XML e DOM. | 
Para este caso estou considerando a utilização do protocolo HTTP , e , neste caso a utilização do controle INET é muito simples , vou acessar as informações usando o INET , gerar um arquivo XML e depois localmente tratar este arquivo para exibir os dados na minha aplicação Visual Basic.
Fazendo alguns ajustes
A tela que exibe os detalhes dos produtos é acessada pelo link : http://macorati/loja/detalhe.asp?id=1 ; para o código do arquivo detalhe.asp passamos como parâmetro o código do produto que desejamos exibir. O link http://macorati/loja refere-se ao meu servidor virtual (estou usando o Personal Web Server) . Veja abaixo o código do arquivo detalhe.asp :
| %@
        Language=VBScript %> <!-- #Include file="ADOVBS.INC" --> <html><head> <title>detalhe.asp</title> </head> <body bgcolor="#FFFFFF"> <% 'declara as variáveis Dim frm_codId Dim frm_nome Dim frm_descricao Dim frm_valor Dim frm_urlimagem Dim SQL Dim quantidade ItemId=clng(request.querystring("id")) set conntemp=server.createobject("adodb.connection") conntemp.open application("conecta_bd") SQL="select * from produtos where ProdutoID =" & ItemId set rstemp=conntemp.execute(SQL,, aCmdText) ' verifica se há dados no recordset If rstemp.eof then response.write "Não há dados a exibir<br>" response.write aspSQL & "<br>Não retorna informação alguma..." connection.close set connection=nothing end if urlimagem=rstemp("urlimagem") <table
        border="0" width="661"> | 
Obs: Para explicações sobre o arquivo detalhe.asp acesse o artigo: Detalhando as informações sobre cada produto
Ao observer o código você percebe que o código HTML é usado para formatar a exibição dos dados em tabelas.
Para acessar as informações do site eu vou usar a url : http://macorati/loja/detalhe.asp?id=x usando o controle INET , mas eu preciso gerar um arquivo XML que retorne os dados para depois acessar este arquivo usando o DOM . (Para saber mais sobre XML leia o artigo : XML - eXtensible Markup Language - Introdução e para saber mais sobre o DOM leia o artigo : VB6 - Integrando XML com Visual Basic. )
Então eu vou alterar o arquivo detalhe.asp para retornar apenas um arquivo XML com a seguinte estrutura :
| <Produtos> <Codigo>1</Codigo> <Autor>Macoratti, José Carlos</Autor> <Descricao>Completo com os fontes. Controla Valores/Saldos; Gera relatórios; Gera Gráficos, Exporta dados para o Excel.</Descricao> <Paginas>1</Paginas> <Preco>15,00</Preco> </Produtos> | 
Fazemos isto removendo toda o código HTML usado para formatar os dados em tabelas no arquivo detalhe.asp. O código do novo arquivo detalhe.asp é o seguinte:
| Dim SQL Dim strXML Dim ItemId ItemId=clng(request.querystring("id")) set conntemp=server.createobject("adodb.connection") 'a conexão usando um driver ODBC é apenas mostrada pois é mais lenta que usar um provedor OLE DB conntemp.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\macoratti\db\esoft.mdb") conntemp.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" & Server.MapPath("\macoratti\db\esoft.mdb") '& ";" & "USER ID=admin;PASSWORD=;" SQL="select * from produtos where ProdutoID =" & ItemId set rstemp=conntemp.execute(SQL,, aCmdText) ' verifica se há dados no recordset If rstemp.eof then response.write "Não há dados a exibir<br>" response.write aspSQL & "<br>Não retorna informação alguma..." connection.close set connection=nothing else strXML = "<Produtos>" & vbcrlf strXML = strXML & "<Codigo>" & ItemId & "</Codigo>" & vbcrlf strXML = strXML & "<Autor>" & rstemp("Autor") & "</Autor>" & vbcrlf strXML = strXML & "<Descricao>" & rstemp("descricao") & "</Descricao>" & vbcrlf strXML = strXML & "<Paginas>" & rstemp("paginas") & "</Paginas>" & vbcrlf strXML = strXML & "<Preco>" & formatnumber(rstemp("Valor"),2) & "</Preco>" & vbcrlf strXML = strXML & "</Produtos>" end if response.write (strXML) %> | 
Pronto ! esta tudo preparado para que possamos acessar a página no servidor usando o arquivo detalhe.asp e gerar um arquivo XML com os dados do produto desejado. Vamos agora criar a aplicação Visual Basic que fará este serviço.
Criando a aplicação Visual Basic para acessar dados remotos
Inicie um novo projeto no Visual Basic e no formulário padrão os controles conforme o layout abaixo
|  | - A seguir faça uma
        referência a library Microsoft XML 3.0 
 | 
Vamos usar a referência a library Microsoft XML 3.0 para usar o DOM e o componente INET é que irá fazer o acesso aos dados. Para saber mais sobre o controle INET leia os artigos :
Como vamos usar o protocolo HTTP vamos usar algumas propriedades do controle INET . Abaixo temos as principais propriedades que iremos usar no nosso projeto:
Como já disse anteriormente a utilização do controle INET para acessar a página com os dados é simples . Ao executar o projeto Visual Basic o usuário deverá informar um número que corresponde ao código do produto que deseja exibir no formulário e a seguir clicar no botão de comando - Exibir dados do produto no formulário - . O código associado ao vento Click do botão de comando - cmdexibir - é o seguinte:
| Private Sub cmdexibir_Click() Dim enderecoUrl As String Dim arquivoXml As String If txtCodigoProduto.Text = "" Or Not IsNumeric(txtCodigoProduto.Text) Then MsgBox "Código do Produto Inválido ! ", vbCritical, "Código do Produto" Exit Sub End If enderecoUrl = "http://macorati/loja/detalhe.asp?id=" & Val(txtCodigoProduto.Text) With inet1 .AccessType = icDirect .Proxy = "" .Protocol = icHTTP arquivoXml = .OpenURL(enderecoUrl) End With Call processaArquivoXml(arquivoXml) End Sub | 
Vamos explicar o código :
| Dim
        enderecoUrl As String Dim arquivoXml As String | - definição das variáveis Strings para armazenar o endereço da página de dados e o arquivo XML | 
| If
        txtCodigoProduto.Text = "" Or Not
        IsNumeric(txtCodigoProduto.Text) Then MsgBox "Código do Produto Inválido ! ", vbCritical, "Código do Produto" Exit Sub End If | - Verifica se o codigo informado pelo usuário é válido | 
| enderecoUrl
        = "http://macorati/loja/detalhe.asp?id=" &
        Val(txtCodigoProduto.Text) | Atribui á variável enderecoUrl a url da página de dados e o código do produto a exibir informado | 
| With
        inet1 .AccessType = icDirect .Proxy = "" .Protocol = icHTTP arquivoXml = .OpenURL(enderecoUrl) End With | - Configura as propriedades do controle INET | 
| Call processaArquivoXml(arquivoXml) | - Invoa a procedure - processaArquivoXML - para ler o arquivo XML gerado e exibir os dados usando DOM | 
A procedure processaArquivoXMl recebe como parâmetro o nome do arquivo XML gerado e é quem fai fazer todo o serviço . O código da procedure é o seguinte:
| Private Sub processaArquivoXml(arqxml As String)
'--------------------------------------
' define as variáveis usadas no programa
'---------------------------------------
Dim oDom As DOMDocument
Dim Numerocampos As Integer
Dim icontador As Integer
Dim NomeCampos As String
'--------------------------------
' instancia o objeto DOM
'--------------------------------
Set oDom = New DOMDocument
With oDom
 .loadXML arqxml
 '--------------------------------------------------------------
 ' verifica se os dados foram recebidos e o arquivo XML carregado
 '--------------------------------------------------------------
 If .parseError.errorCode <> 0 Then
   MsgBox "Não foi possível acessar os dados !" & vbrlf & _
           .parseError.errorCode & vbCrLf & _
           "linha : " & .parseError.Line & vbCrLf & _
           "descrição : " & .parseError.srcText, vbCritical, "Erro no acesso aos dados "
   Set oDom = Nothing
   Exit Sub
 Else
 Numerocampos = .childNodes(0).childNodes.length
 If Numerocampos = 1 Then
    Dim oTexto As Object
    For Each oTexto In Me.Controls
        If TypeOf oTexto Is TextBox Then
          oTexto.Text = ""
        End If
    Next oTexto
    MsgBox " Nenhum produto foi encontrado !", vbCritical, " Produtos "
    Set oDom = Nothing
    Exit Sub
 End If
 For icontador = 0 To Numerocampos - 1
   Me("txt" & .childNodes(0).childNodes(icontador).baseName).Text = .childNodes(0)._
   childNodes(icontador).Text
 Next
 End If
End With
End Sub | 
Ao executar o projeto , informar o código do produto e clicar no botão para exibir os dados teremos o seguinte resultado:

Voilá , os dados da página
são capturados e exibidos no seu programa VB . Até o próximo
artigo...
Mar 3:9
Recomendou, pois, a seus discípulos que se lhe preparasse um barquinho, por causa da multidão, para que não o apertasse;Mar 3:10
porque tinha curado a muitos, de modo que todos quantos tinham algum mal arrojavam-se a ele para lhe tocarem.Mar 3:11
E os espíritos imundos, quando o viam, prostravam-se diante dele e clamavam, dizendo: Tu és o Filho de Deus.| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? | 
  Gostou ?   Compartilhe no Facebook
Compartilhe no Facebook
  
 Compartilhe no Twitter
 
Compartilhe no Twitter 
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB.NET - Conhecendo as estruturas de controle - Macoratti ...
VB .NET - Copiando arquivos entre diretórios - Macoratti.net