VB - Usando classes de tratamento de registros


O Visual Basic é realmente uma ferramenta excepcional , quando você pensa que já tirou tudo que ela podia oferecer acaba descobrindo coisas novas; é apenas uma questão de pesquisar e estudar.

Em tempos de VB.NET os ventos da orientação a objeto estão soprando forte , e, as empresas de consultoria chegam a desenhar um cenário onde no futuro teremos apenas Java e .NET.

Se você ainda não conhece o VB.NET nem qualquer outra linguagem orientada a objetos pode estar se perguntando : "Mas o que eu tenho a ver com isto ? Afinal estou contente com o VB e ele me atende plenamente"

Tudo bem ! se você não precisa acompanhar o mercado ou usa o VB apenas como um hobby ou passatempo tudo bem; já se você for um desenvolvedor preocupado com o seu futuro eu diria que você realmente não deve se acomodar.

Mas como começar a assimilar os conceitos da orientação a objetos , classes , etc. se ainda uso o Visual Basic 5 ou 6 ?

Pois este artigo foi escrito justamente para mostrar que você pode ir se preparando para a migração para o VB.NET mesmo criando suas aplicações na versão 5 ou 6 do VB.

Muitos me escrevem a respeito dos conceitos usados na programação orientada a objetos e não conseguem entender como usar formulários com classes , como obter registros de dados de um banco de dados e exibí-los no formulário usando o conceito de classes no VB.

Vamos começar então dizendo que no VB5/6 você pode usar classes , interfaces, propriedades , métodos , etc. e com isto ir se preparando para a migração para o VB.NET.

Para tornar mais claro vou mostrar neste artigo um exemplo onde iremos abordar os seguintes conceitos:

Vamos acessar a tabela clientes que por questão de simplicidade foi definida como tendo somente os campos:

Vamos criar a classe Clientes de forma a que o objeto instanciado desta classe tenha todas as propriedades de um cliente : codigo , nome, endereco e email que correspondem aos campos da tabela clientes.

A conexão com o banco de dados será feito usando um provedor OLEDB ADO cuja string de conexão foi definida como sendo :

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\testes.mdb"

Vamos então ao trabalho. Inicie um novo projeto no VB do tipo StandardEXE , e , no menu Project selecione Add Class Module. A seguir altere o nome do formulário , da classe e do projeto conforme exibido abaixo:

O que você vê ? Você vê um projeto onde temos um formulário que irá fazer a interface com o usuário e uma classe chamada Clientes que irá fazer a interface com o objeto cliente.

Quando você pensa em um cliente quais propriedades lhe vem mente ? Muitas , não é mesmo ? Pois no nosso caso para não tornar o código muito extenso meu cliente foi concebido para ter somente as seguintes propriedades: Codigo, Nome , Endereco e Email.(Na vida real , em sistemas mais complexos o seu objeto clientes provavelmente deverá possuir muito mais propriedades.)

Então já podemos criar o código que irá definir a classe clientes. Lembre-se que a classe clientes irá gerar objetos para que você tenha acesso as propriedades do seu cliente. Aqui esta a grande diferença da programação orientada a objetos , quando você for desenvolver uma solução onde tenha que tratar com uma entidade clientes você não deve pensar em tabela nem em procedimentos e funções mas deve pensar em um cliente como sendo um objeto do mundo real que você deve implementar.

No módulo de classe Clientes.cls , na seção General Declarations devemos definir as propriedades que nosso objeto cliente deverá possuir:

Option Explicit
Private mCodigo As Long
Private mNome As String
Private mEndereco As String
Private mEmail As String
Private acesso As acesso
Private oConn As ADODB.Connection
Const eNaoPodeRecuperarDados = vbObjectError + 512 + 2
Const eNaoPodeSalvarDados = vbObjectError + 512 + 3

Cada propriedade esta sendo definida como do tipo privada e portanto não poder ser acessada diretamente de fora da classe. Para tornar o acesso possível e encapsular o código vamos definir as propriedades para cada um dos itens declarados. Abaixo temos o código :

Public Property Let Nome(ByVal vNewValue As Variant)
    mNome = vNewValue
End Property

Public Property Get Endereco() As Variant
     Endereco = mEndereco
End Property

Public Property Let Endereco(ByVal vNewValue As Variant)
      mEndereco = vNewValue & ""
End Property

Public Property Get Email() As Variant
    Email = mEmail
End Property

Public Property Let Email(ByVal vNewValue As Variant)
      mEmail = vNewValue & ""
End Property

Public Property Get Codigo() As Variant
      Codigo = mCodigo
End Property

Public Property Let Codigo(ByVal vNewValue As Variant)
     mCodigo = vNewValue
End Property

Cada propriedade possui um LET que permite atribuir um valor a propriedade ; e possui um GET que permite acessar o valor da propriedade de fora da classe. Poderíamos ter feito a validação em uma das Propriedades GET mas somente incluímos um espaço vazio na atribuição dos valores para que valores nulos fossem suportados.

Até agora nossa classe tem somente propriedades mas vamos criar dois métodos.O primeiro é o método ObtemDados() descrito abaixo:

Public Sub ObtemDados(lngCodigo As Long)

    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    If lngCodigo <> 0 Then
        rs.Source = "Select * from Clientes Where Codigo = " & lngCodigo

        rs.MaxRecords = 1

        Set rs.ActiveConnection = oConn
        rs.Open

        If rs.EOF = True And rs.BOF = True Then
           Err.Raise eNaoPodeRecuperarDados, "Clientes", "Cliente nao localizado"
           rs.Close
           Set rs = Nothing
           Exit Sub
        Else
           Nome = rs!Nome & ""
           Codigo = lngCodigo
           Endereco = rs!Endereco
           Email = rs!Email
           rs.Close
           Set rs = Nothing
        End If
    Else
             Err.Raise eNaoPodeRecuperarDados, "Clientes", "Cliente nao encontrado."
             Exit Sub
    End If
End Sub

o código que representa o método da classe faz o seguinte :

O outro método é o método Salvar() que faz o seguinte :

Public Sub Salvar()

    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    rs.LockType = adLockOptimistic
    rs.CursorType = adOpenKeyset

    Set rs.ActiveConnection = oConn

    rs.Source = "Select * from Clientes Where Codigo = " & Codigo

    rs.Open

    'ADO não necessita do método edit para realizar atualizações
    If Codigo = 0 Then
       rs.AddNew
    End If

    rs.Fields("Nome") = Nome
    rs.Fields("Endereco") = Endereco
    rs.Fields("Email") = Email

    rs.Update

    rs.Close
    Set rs = Nothing
End Sub

A classe esta pronto para ser usada. Vamos então incluir no formulário frmclientes1 : 4 caixas de texto , 4 labels e três botões de comando conforme abaixo:

Na seção General Declarations do formulário vamos declarar a variável objeto clientes como sendo do tipo da classe Clientes:

Option Explicit
Private cliente As clientes

A seguir no evento Load do formulário vamos criar uma instância da classe clientes

Private Sub Form_Load()
  Set cliente = New clientes
End Sub

Temos ao nosso dispor um objeto cliente que tem acesso a todas as propriedades e métodos da classe Clientes que definimos no módulo de classe. Para constatar isto digite o nome do objeto cliente e em seguida digite o ponto e você verá o que pode acessar via objeto cliente conforme a figura abaixo:

Vamos então mostrar como podemos recuperar dados da tabela cliente e exibir no formulário. O código que faz isto vem a seguir:

Private Sub Command1_Click()

  cliente.ObtemDados (CLng(Text1.Text))

  Text2.Text = cliente.Nome
  Text3.Text = cliente.Endereco
  Text4.Text = cliente.Email

End Sub

Simples não é mesmo. Estou usando o objeto cliente para acessar o método ObtemDados passando o valor do código que eu informo no campo text1.text.  O resultado irá carregar as propriedades do objeto que eu apenas atribuo as caixas de texto.

Para salvar dados usamos o método Salvar da classe Clientes. Note que antes de invocar o método eu tenho que atribuir os valores das caixas de texto as propriedades do objeto cliente.

Private Sub Command2_Click()

  If Text2.Text <> "" And Text3.Text <> "" Then

      cliente.Nome = Text2.Text
      cliente.Endereco = Text3.Text
      cliente.Email = Text4.Text

      cliente.Salvar
      MsgBox "Dados salvos com sucesso.", vbInformation

  End If
End Sub

Abaixo temos uma visão do formulário recuperando dados da tabela e exibindo nas caixas de texto:

O código do formulário ficou bem leve e toda a lógica esta na classe. Você poderia incrementar o exemplo criando uma classe para realizar a conexão . Vamos lá , exercite o seu potencial...

Pegue o código completo aqui : clientes.zip

Hasta la vista ...