Gerando uma representação XML para um recordset ADO.


Já que estamos falando sobre XML vou neste artigo mostrar como podemos gerar um arquivo XML para um Recordset ADO. (Assim não podem dizer que eu esqueci do VB5/VB6... )

Pois bem , nunca esquecerei do VB5/VB6 , e o site continuará a ter artigos sobre estas versões. A quantidade de artigos sobre o VB .NET se justifica pois há muita novidade e necessitamos também ficar atualizados , certo ??? (por isto fiquem tranquilos...)

Neste artigo eu vou mostrar como é fácil gerar uma representação XML (o xml será gerada em uma variável string) para um recordset ADO.

Para poder rodar este artigo você vai precisar estar usando o VB5 ou VB6 , de preferência com o último service pack (service pack 5 para o vb6) , ou pelo menos com a versão 2.5 da ADO.

Eu vou acessar a tabela Clientes do banco de dados Northwind.mdb e gerar um representação XML para esta tabela. A estrutura desta tabela é a seguinte :

Com poucas linhas de código podemos gerar o XML. Vamos então criar um novo projeto Standard EXE no VB e no formulário padrão inclui os seguintes controles : uma Label , uma caixa de texto (que deverá sobrepor o controle ListBox), uma combobox , dois botões de comando e um controle ListBox. Conforme Abaixo:

- O controle TextBox que sobrepõe o controle ListBox deve ter sua propriedade Multiline definida como True.

Nota : Eu vou aproveitar este projeto e mostrar como você pode usar o método Find do objeto Recordset da ADO para localizar registros em uma tabela. Temos que fazer uma referência no projeto a library Microsoft Activex Data Object 2.5 (ou 2.7) ( Menu Project|References...)

O recordset deverá esta aberto ; feito isto podemos consultar a fonte de dados para exibir registros de acordo com um critério e gerar uma representação XML para esta tabela.

- A primeira coisa a fazer é abrir o recordset . Primeiro declaramos variáveis objeto e a seguir no evento Load do formulário inserimos o código que abre o banco de dados Northwind.mdb e gera um recordset ADO para a tabela Clientes:

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim criterio As String

Private Sub Form_Load()
carrega_combo
'Abre a conexão
cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\teste\Northwind.mdb;"
'Abre o Recordset
rst.CursorLocation = adUseClient
rst.Open "Select * From Clientes", cnn, adOpenKeyset, adLockOptimistic, adCmdText
End Sub

 Eu estou usando o provedor OLE DB:

Provider=Microsoft.Jet.OLEDB.3.51

E selecionando todos os registros da tabela Clientes:

"Select * From Clientes"

 

- Após criar o objeto recordset estamos pronto para poder gerar a representação XML do mesmo. No evento Click do botão command2 - Gerar XML para o Recordset - vamos incluir o código abaixo que faz o serviço:

Private Sub Command2_Click()
If Command2.Caption = "Gerar XML para o Recordset >>" Then
  Me.Width = 7350
  Me.Height = 8895

  Command2.Caption = "<< Gerar XML para o Recordset"

  Dim oStream As ADODB.Stream
  Set oStream = New ADODB.Stream

  rst.Save oStream, adPersistXML

  Dim ArquivoXML As String
  ArquivoXML = oStream.ReadText

  oStream.Close
  Set oStream = Nothing

  Text1.Visible = True
  List1.Visible = False
  Text1.Text = ArquivoXML

Else
  List1.Visible = True
  Text1.Visible = False 
  Me.Width = 7350
  Me.Height = 2085
  Command2.Caption = "Gerar XML para o Recordset >>"
End If
- A representação XML é gerada em uma string chamada ArquivoXML

- Ela é exibida na caixa de texto - Text1.Text que esta sobre o Listbox

- Declaramos uma variável do tipo Stream - Dim oStream As ADODB.Stream

- Criamos o objeto - Set oStream = New ADODB.Stream

- e a seguir gerarmos stream a partir do recordset :

rst.Save oStream, adPersistXML

- Finalmente lemos o XML e o atribuímos a variável string :

ArquivoXML = oStream.ReadText

- A seguir fechamos e liberamos o objeto stream

oStream.Close
Set oStream = Nothing

O resto do código é usado apenas para expandir o formulário e mostrar o resultado.

Executando a aplicação e a seguir clicando no botão para gerar o XML teremos a sequência de telas :

A seguir vou falar da funcionalidade de busca usando o método Find com um critério usando a cláusula Like.

A busca funciona assim : Temos uma combo carregada com as letras de A a Z. O usuário escolhe uma letra na combo e clica no botão - Exibir Empresas Selecionadas >>

O código que realiza a busca para o critério é o seguinte :

- O critério é montando de acordo com a seleção do usuário: criterio = "CódigoDoCliente Like '" & Combo1.Text & "%'"

- Usamos o método Find para realizar a busca na base de dados: rst.Find criterio, 0, adSearchForward

- utilizamos também um marcador - bookmark - para guardar a última posição localizada

O código completo é o seguinte :

Private Sub Command1_Click()
If Command1.Caption = "Exibir Empresas Selecionadas >>" Then
     Text1.Visible = False
     List1.Visible = True

    'move-se para o primeiro registro
    rst.MoveFirst
    'limpa a combo
    List1.Clear
    ' define o criterio para busca
    criterio = "CódigoDoCliente Like '" & Combo1.Text & "%'"
    ' inicia busca no recordset
    rst.Find criterio, 0, adSearchForward

   ' percorre o recordset ate o seu final
    While Not rst.EOF
        List1.AddItem rst("NomeDaEmpresa")
        marcador = rst.Bookmark
        rst.Find criterio, 1, adSearchForward, marcador
    Wend

    Me.Width = 7350
    Me.Height = 6345
    Command1.Caption = "<< Exibir Empresas Selecionadas"
Else
    'contrai o formulário para o tamanho original
    Me.Width = 6375
    Me.Height = 2085
    Command1.Caption = "Exibir Empresas Selecionadas >>"
End If
End Sub

Executando o projeto e , realizando um seleção e clicando no botão para buscar os registros de acordo com o critério teremos:

Perceba que estamos realizando a busca dentro de um loop While/Wend :

   ' percorre o recordset ate o seu final
    While Not rst.EOF
        List1.AddItem rst("NomeDaEmpresa")
        marcador = rst.Bookmark
      
 rst.Find criterio, 1, adSearchForward, marcador
    Wend
 

Desta forma , usando um bookmark , conseguimos percorrer o recordset e selecionar todas as ocorrências do critério.

Pronto , matamos dois coelhos de uma vez ; até o próximo artigo ..


José Carlos Macoratti