... Pague apenas R$47,00 uma única vez e tenha acesso por 1 ano aos vídeos e arquivos exemplos do site ...

Clique aqui e obtenha mais detalhes.


Utilizando Classe no Access - A Classe Cliente

Por: Plinio Mabesi

 

Chegou enfim a hora de criarmos a primeira parte funcional do nosso sistema. Depois de todo o sistema estar modelado e também estarem codificadas as classes auxiliares, vamos então dar vida ao programa.

A primeira classe a ser codificada será a classe Cliente. Após apresentar a estrutura da classe faremos a implementação da interface gráfica que manipulará os dados dos objetos.

Caso necessário relembre os conceitos anteriores sobre atributos, métodos, acesso às propriedades do objeto, instâncias e demais ensinamentos sobre a programação orientada a objetos, vistos nos primeiros artigos.

A Classe Cliente

O objetivo desta classe, conforme dito anteriormente, é oferecer funcionalidades de inclusão, consulta, atualização e exclusão dos objetos do tipo cliente.

Este é o código da classe, com todos os seus atributos e métodos, que se utilizam de funções próprias, bem como dos métodos dos objetos das classes Utilitario e ConexaoBD.

Código da classe:

Option Compare Database
Option Explicit

'Objeto da classe Utilitario
Private objUtil As New aclUtilitario

'Atributos da Classe

'Atributo de backup e atributo identificador da Classe
'PK - Código que identifica o cliente.
Private bkpCodCliente As Variant
Private lngCodCliente As Variant

'Classe social do cliente, calculada de acordo com a renda.
Private strClasse As Variant

'CPF do cliente.
Private strCpf As Variant

'E-mail do cliente.
Private strEmail As Variant

'Nome completo do cliente.
Private strNomeCliente As Variant

'Renda mensal do cliente, em reais.
Private curRenda As Variant


'Métodos Get, Set e Let da Classe

Property Get codCliente() As Variant

  codCliente = lngCodCliente

End Property

Property Let codCliente(argCodCliente As Variant)

  lngCodCliente = argCodCliente
  
  If IsEmpty(bkpCodCliente) Then
    bkpCodCliente = lngCodCliente
  End If

End Property

Property Get classe() As Variant

  classe = strClasse

End Property

Property Get cpf() As Variant

  cpf = strCpf

End Property

Property Let cpf(argCpf As Variant)

  If Not IsNull(argCpf) Then
    If Not objUtil.validaCPF(argCpf) Then
      MsgBox "O CPF <" & Format(argCpf, "000\.000\.000\-00") & _
      "> não é válido.", vbExclamation, "CPF Inválido"
      strCpf = Null
    Else
      strCpf = argCpf
    End If
  Else
    strCpf = argCpf
  End If

End Property

Property Get email() As Variant

  email = strEmail

End Property

Property Let email(argEmail As Variant)

  If Not IsNull(argEmail) Then
    If Not objUtil.validaEmail(argEmail) Then
      If MsgBox("O E-mail <" & argEmail & "> não possui um formato válido." _
      & vbCrLf & "Deseja incluir este e-mail?", vbQuestion + vbYesNo, _
      "E-mail Inválido") = vbYes Then
        strEmail = argEmail
      End If
    Else
      strEmail = argEmail
    End If
  Else
    strEmail = argEmail
  End If

End Property

Property Get nomeCliente() As Variant

  nomeCliente = strNomeCliente

End Property

Property Let nomeCliente(argNomeCliente As Variant)

  If Not IsNull(argNomeCliente) Then
    strNomeCliente = objUtil.nomeProprio(argNomeCliente)
  Else
    strNomeCliente = argNomeCliente
  End If

End Property

Property Get renda() As Variant

  renda = curRenda

End Property

Property Let renda(argRenda As Variant)
  
  curRenda = argRenda
  'Alterar classe quando o valor da
  'renda for alterado
  strClasse = calculaClasse()

End Property

'Método Existe [Com conhecimento de SQL]
'Verifica a existência do objeto Cliente na tabela correspondente 
'no Banco de Dados
Function existe(argCodCliente As Variant) As Boolean
On Error GoTo Err_existe

  Dim objCon As New aclConexaoBD
  Dim rstExiste As Recordset
  Dim strSql As String

  existe = False

  strSql = "Select * " & _
      "From Cliente " & _
      "Where codCliente = " & objCon.valorSql(argCodCliente)

  Set rstExiste = objCon.consulta(strSql)

  If rstExiste.RecordCount > 0 Then
    existe = True
  End If

  'Fecha o Recordset existe
  rstExiste.Close

Exit_existe:
  Set rstExiste = Nothing
  Exit Function

Err_existe:
  existe = False
  GoTo Exit_existe

End Function

'Método Incluir [Com conhecimento de SQL]
'Inclui um novo objeto na tabela correspondente dentro do Banco de dados
Private Function incluir() As Boolean
On Error GoTo Err_incluir

  Dim objCon As New aclConexaoBD
  Dim strSql As String

  strSql = "Insert Into " & _
      "Cliente(codCliente,classe,cpf,email,nomeCliente,renda) " & _
      "Values(" & objCon.valorSql(codCliente) & "," _
      & objCon.valorSql(classe) & "," & objCon.valorSql(cpf) _
      & "," & objCon.valorSql(email) & "," & objCon.valorSql(nomeCliente) _
      & "," & objCon.valorSql(renda) & ")"

  incluir = (objCon.executa(strSql) > 0)

  If incluir Then
    'Atualiza os campos de backup
    bkpCodCliente = codCliente
  End If

Exit_incluir:
  Exit Function

Err_incluir:
  incluir = False
  GoTo Exit_incluir

End Function

'Método Excluir [Com conhecimento de SQL]
'Exclui o objeto atual na tabela correspondente dentro do Banco de dados
Function excluir() As Boolean
On Error GoTo Err_excluir

  Dim objCon As New aclConexaoBD
  Dim strSql As String

  strSql = "Delete From Cliente " & _
      "Where codCliente = " & objCon.valorSql(codCliente)

  excluir = (objCon.executa(strSql) > 0)

Exit_excluir:
  Exit Function

Err_excluir:
  excluir = False
  GoTo Exit_excluir

End Function

'Método Obter [Com conhecimento de SQL]
'Recupera o objeto Cliente através dos argumentos informados
Function obter(argCodCliente As Variant) As Boolean
On Error GoTo Err_obter

  Dim objCon As New aclConexaoBD
  Dim rstObter As Recordset
  Dim strSql As String

  strSql = "Select * " & _
      "From Cliente " & _
      "Where codCliente = " & objCon.valorSql(argCodCliente)

  Set rstObter = objCon.consulta(strSql)

  If rstObter.RecordCount = 0 Then
    obter = False
    Exit Function
  End If

  'Atualiza os campos de backup e os identificadores
  codCliente = argCodCliente
  bkpCodCliente = argCodCliente

  'Atualiza os campos restantes

  strClasse = rstObter.Fields("classe")
  cpf = rstObter.Fields("cpf")
  strEmail = rstObter.Fields("email")
  nomeCliente = rstObter.Fields("nomeCliente")
  renda = rstObter.Fields("renda")

  obter = True

  'Fecha o Recordset obter
  rstObter.Close

Exit_obter:
  Set rstObter = Nothing
  Exit Function

Err_obter:
  obter = False
  MsgBox Err.Description
  GoTo Exit_obter

End Function

'Método Salvar [Com conhecimento de SQL]
'Salva o objeto atual na tabela correspondente dentro do Banco de dados
Function salvar() As Boolean
On Error GoTo Err_salvar

  Dim objCon As New aclConexaoBD
  Dim strSql As String

  If existe(bkpCodCliente) Then
    strSql = "Update Cliente " & _
        "Set codCliente = " & objCon.valorSql(codCliente) _
        & ", classe = " & objCon.valorSql(classe) _
        & ", cpf = " & objCon.valorSql(cpf) & ", email = " _
        & objCon.valorSql(email) & ", nomeCliente = " _
        & objCon.valorSql(nomeCliente) & ", renda = " _
        & objCon.valorSql(renda) _
        & " Where codCliente = " & objCon.valorSql(bkpCodCliente)

    salvar = (objCon.executa(strSql) > 0)
  Else
    salvar = incluir
  End If

  If salvar Then
    'Atualiza as variáveis de backup com o novo valor da chave
    bkpCodCliente = codCliente
  End If

Exit_salvar:
  Exit Function

Err_salvar:
  salvar = False
  GoTo Exit_salvar

End Function

'Método calculaClasse
'Calcula a classe social do objeto atual baseado na
'renda informada e devolve uma letra correspondente
'à sua classificação dentro das faixas salariais.
Private Function calculaClasse() As String

  If renda >= 15300 Then
    calculaClasse = "A"
  ElseIf renda >= 7650 Then
    calculaClasse = "B"
  ElseIf renda >= 3060 Then
    calculaClasse = "C"
  ElseIf renda >= 1020 Then
    calculaClasse = "D"
  ElseIf renda > 0 Then
    calculaClasse = "E"
  Else
    calculaClasse = ""
  End If

End Function

'Fim da classe...

Pontos Importantes

Nesta primeira classe referente a um objeto atualizável, com atributos modificáveis, passíveis de serem persistidos, podemos notar alguns pontos de interesse para o aprendizado da metodologia, conforme a seguir.

1. Atributos do tipo Variant: Como podemos encontrar objetos cujos campos não são de preenchimento obrigatório devemos manter a possibilidade de atribuir valores nulos aos atributos dos objetos, os quais serão reconhecidos pelo método valorSql(), da classe ConexaoBD, e convertidos da maneira correta para armazenagem na tabela. Caso utilizássemos atributos com os tipos pré-definidos não teríamos como reconhecer um atributo nulo de maneira tão fácil. Neste caso teríamos que procurar métodos alternativos de convenção e tratamento de valores que representariam a nulidade de atributos, como por exemplo uma seqüência de comprimento zero em uma string, ou um valor negativo que provavelmente nunca seria atribuído a um campo de código para chave primária, entre outros. Contudo, para o nosso projeto, contando com a facilidade da atribuição de valores e seus tipos às variáveis do tipo Variant, e a funcionalidade do método valorSql() esta será a forma que adotaremos.

'Nome completo do cliente.
Private strNomeCliente As Variant

2. Criação do atributo de backup do objeto: Apesar de não ser necessário quando se usa atributos identificadores do tipo auto-numeração, esta é uma técnica que possibilita a alteração do código identificador do objeto permitindo salvar as modificações posteriormente, já que o antigo valor, que continua armazenado no banco de dados, ainda estará disponível no atributo de backup. Quando se usa qualquer tipo de código personalizado como a chave primária este recurso torna-se indispensável.

'Atributo de backup e atributo identificador da Classe
'PK - Código que identifica o cliente.
Private bkpCodCliente As Variant
Private lngCodCliente As Variant

3. Validação de dados no momento da atribuição do valor: Neste caso podemos visualizar na prática como validar um dado antes de atribuí-lo ao objeto. Como exemplo verificamos a validade de um CPF fornecido pelo usuário, permitindo ou não a sua utilização. Esta é uma tarefa que evita falhas de digitação e incorreções nos dados armazenados.

Property Let cpf(argCpf As Variant)

  If Not IsNull(argCpf) Then
    If Not objUtil.validaCPF(argCpf) Then
      MsgBox "O CPF <" & Format(argCpf, "000\.000\.000\-00") _
      & "> não é válido.", vbExclamation, "CPF Inválido"
      strCpf = Null
    Else
      strCpf = argCpf
    End If
  Else
    strCpf = argCpf
  End If

End Property

4. Conversão de dados no momento da atribuição do valor: Neste caso podemos visualizar na prática como alterar um dado fornecido pelo usuário antes de atribuí-lo ao objeto. Esta tarefa é útil na padronização das informações armazenadas. Como exemplo armazenamos todos os nomes dos clientes no padrão de nomes próprios, com a primeira letra de cada parte do nome em maiúsculas e o restante em minúsculas. Esta funcionalidade é oferecida pelo método nomeProprio() da classe Utilitario, representada pelo objeto objUtil.

Property Let nomeCliente(argNomeCliente As Variant)

  If Not IsNull(argNomeCliente) Then
    strNomeCliente = objUtil.nomeProprio(argNomeCliente)
  Else
    strNomeCliente = argNomeCliente
  End If

End Property

5. Determinação de uma propriedade baseada em outra: Apesar de não ser uma boa prática e estar diretamente contra as Formas Normais, esta funcionalidade foi colocada apenas para servir de exemplo. Aqui determinamos a classe social a que o cliente pertence a partir da sua renda informada. Para isto utilizamos o método calculaClasse() da própria classe Cliente. A informação é atribuída à propriedade classe e armazenada no banco de dados, lembrando mais uma vez que esta não é uma prática recomendada em sistemas profissionais.

Property Let renda(argRenda As Variant)
  
  curRenda = argRenda
  'Alterar classe quando o valor da
  'renda for alterado
  strClasse = calculaClasse()

End Property

6. Ajuste de código SQL: Para que possamos montar nossas classes sem nos preocupar com o formato SQL dos dados, utilizamos a classe ConexaoBD e seus métodos para fazer todos os ajustes e nos deixar resolver os problemas mais sérios, que requerem nossa atenção. Veja que para nós não será necessário descobrir se o atributo e do tipo texto, data ou numérico. O método valorSql() se encarrega disto. Aqui a classe está representada pelo objeto objCon.

  strSql = "Select * " & _
      "From Cliente " & _
      "Where codCliente = " & objCon.valorSql(argCodCliente)

7. Atributo classe: Para o cálculo da classe social a partir da renda foi utilizada uma tabela fictícia de exemplo, a qual não representa fielmente os valores publicados pelos órgãos competentes.

Outra funcionalidade importante que podemos encontrar nos códigos é o tratamento de erros com a instrução On Error. Apesar de não ser detalhado neste curso é altamente recomendado que o leitor pesquise e compreenda a sua utilização. Foram colocados exemplos simples nos métodos, porém o correto entendimento deste recurso possibilita alta capacidade de resolução de problemas na programação, evitando que possíveis e prováveis erros no projeto ou na implementação sejam visíveis para o usuário final de maneira inadequada.

Mais Funções Auxiliares

Neste projeto não utilizaremos códigos com auto-numeração diretamente nas tabelas. Sendo assim necessitaremos de uma função que realize esta tarefa.

Criaremos então um módulo padrão que conterá todas as funções auxiliares que necessitarmos durante o curso. Ele se chamará Funcoes e nossa primeira função será chamada proximoCodigo().

Este será o código da função:

Function proximoCodigo(argCampo As String, argTabela As String, _
Optional criterio As String = "") As Long
    proximoCodigo = Nz(DMax(argCampo, argTabela, criterio), 0) + 1
End Function

Ela receberá como parâmetros o nome do campo, o nome da tabela e um critério de busca opcional, devolvendo um número que será o próximo código livre daquele campo numérico da tabela informada.

Desta maneira a função será genérica e servirá para qualquer tabela que contenha um campo chave de código numérico ordenado.

A Interface Gráfica

Para que possamos visualizar e manipular os dados dos clientes devemos criar um formulário com campos para preenchimento e botões de comando que coordenem as ações sobre os dados.

A seguir serão definidas as características para o formulário no qual iremos trabalhar com os dados dos objetos relativos aos clientes. As especificações de design são apenas sugestões, porém as informações de origem de dados, bloqueio de campos e formatos de dados são obrigatórias, sob pena de não obter a funcionalidade desejada. Estas especificações estarão marcadas com um asterisco vermelho ao lado.

No formulário teremos uma lista contendo os clientes cadastrados, um campo de texto para realizar buscas, alguns campos de texto para digitação das informações e os botões de comando para criar, salvar e excluir registros.

Obs: Somente as propriedades que foram alteradas para um valor diferente do padrão serão apresentadas. Para as demais utilize o padrão do sistema ou o valor que desejar, desde que não comprometa a funcionalidade do sistema.

Formulário

Nome: FCliente
Largura: 20cm
Altura: Cabeçalho (1cm) / Detalhe (10cm)
Legenda: Sistema de Vendas
Estilo da borda: fino
Seletores de registro: Não
Botões de navegação: Não
Linhas divisórias: Não
Barras de rolagem: Nenhuma
Caixa de controle: Sim
Botão Fechar: Sim
Botões Min Max: Nenhum
Popup: Sim
Janela Restrita: Não
 

Controle Listbox

Nome: lstCliente *
Origem da linha: SELECT Cliente.codCliente, Cliente.nomeCliente, 
                 Format(Cliente.cpf,"000\.000\.000-00") AS cpf FROM Cliente 
                 ORDER BY Cliente.nomeCliente; *
Tipo de Origem da Linha: Tabela/Consulta *
Coluna acoplada: 1 *
Número de colunas: 3 *
Largura das colunas: 0cm;5cm;3cm *
Largura: 8cm
Cor do fundo: Cinza claro

Controles Textbox

Nome: txtPesquisa *
Cor do fundo: Amarelo
Alinhamento: Esquerda

Nome: txtCodigo *
Ativado: Não *
Bloqueado: Sim *
Cor do fundo: Cinza
Alinhamento: Centro

Nome: txtCpf *
Cor do fundo: Azul claro
Máscara de entrada: 000.000.000\-00;;_ *
Alinhamento: Centro

Nome: txtNome *
Cor do fundo: Azul claro
Alinhamento: Esquerda

Nome: txtEmail *
Cor do fundo: Azul claro
Alinhamento: Esquerda

Nome: txtRenda *
Cor do fundo: Azul claro
Alinhamento: Direita
Formato: Unidade Monetária

Nome: txtClasse *
Ativado: Não *
Bloqueado: Sim *
Cor do fundo: Cinza
Alinhamento: Centro

Botões de Comando

Nome: btnNovo *
Legenda: Novo
Cor da Fonte: Azul escuro

Nome: btnSalvar *
Legenda: Salvar
Cor da Fonte: Azul escuro

Nome: btnExcluir *
Legenda: Excluir
Cor da Fonte: Vermelho escuro

Como sugestão de design os campos deverão estar posicionados conforme demonstrado na figura a seguir, assim como devem ser adicionadas as legendas dos campos, as quais não foram descritas anteriormente:

Classe no Access 2007/2010

Códigos do Formulário

Para que nosso formulário seja capaz de manipular os dados dos objetos cliente deveremos implementar as funcionalidades necessárias que permitam criar um novo cliente, buscar um cliente já cadastrado, editar seus dados, salvá-lo ou excluí-lo.

Sendo assim criaremos algumas funções genéricas que sejam úteis para quantos procedimentos delas necessitem, reaplicando o conceito da reutilização de código. Além disso incluiremos os códigos dos campos que possuem eventos, além dos botões de comando.

Todos os códigos a seguir deverão ser colocados no módulo do formulário FCliente.

1. Pesquisa de clientes: Para facilitar a busca de clientes por qualquer parte do nome utilizaremos um campo de texto cujo valor será o elemento condicional para o código SQL que será atribuído ao controle lstCliente, atualizando sua propriedade Origem da Linha após cada alteração realizada no campo de pesquisa. Para isto devemos colocar o código no evento Ao Alterar do campo txtPesquisa.

Private Sub txtPesquisa_Change()
  
  lstCliente.RowSource = "SELECT Cliente.codCliente, Cliente.nomeCliente, " & _
             "Format(Cliente.cpf,'000\.000\.000-00') AS cpf " & _
             "FROM Cliente " & _
             "WHERE nomeCliente Like '*" & txtPesquisa.Text & "*' " & _
             "ORDER BY Cliente.nomeCliente;"
  lstCliente.Requery
  
End Sub

2. Limpeza dos campos: Para efetuar a limpeza dos campos de preenchimento utilizaremos um procedimento genérico cuja função será a de atribuir o valor nulo a todos os campos de texto e enviar o foco ao campo txtCpf.

Private Sub limpaCampos()

  txtCodigo = Null
  txtCpf = Null
  txtNome = Null
  txtEmail = Null
  txtRenda = Null
  txtClasse = Null
  txtCpf.SetFocus
  
End Sub

3. Novo registro: Para a criação de um novo registro em branco simplesmente iremos chamar o procedimento limpaCampos() no evento Ao Clicar do botão btnNovo.

Private Sub btnNovo_Click()
  Call limpaCampos
End Sub

4. Atualização de campos: Assim como fizemos um procedimento genérico que limpa os campos para a criação de um novo registro teremos também um que preencha os campos com as informações de um objeto cliente passadas como parâmetro, ou seja, o procedimento recebe um objeto completo e lança os valores de seus atributos nos campos do formulário.

Private Sub atualizaCampos(argCliente As clsCliente)

  txtCodigo = argCliente.codCliente
  txtCpf = argCliente.cpf
  txtNome = argCliente.nomeCliente
  txtEmail = argCliente.email
  txtRenda = argCliente.renda
  txtClasse = argCliente.classe
  
End Sub

5. Escolha de cliente: Já que teremos também que trabalhar com clientes já cadastrados, devemos implementar alguma maneira de recuperar suas informações. Faremos isto utilizando a Listbox lstCliente, que utilizará o procedimento atualizaCampos() para preencher os campos com as informações do objeto do cliente que foi clicado.

Private Sub lstCliente_Click()

  Dim objCliente As New clsCliente
  Dim codigoCliente As Long
  
  codigoCliente = lstCliente.Value
  
  If objCliente.obter(codigoCliente) Then
    Call atualizaCampos(objCliente)
  End If

End Sub

6. Montagem de um objeto: Esta também é uma função genérica que será utilizada por outros procedimentos ou funções. Seu objetivo é criar um novo objeto cliente, coletar os dados digitados nos campos, atribuir ao objeto criado, e devolvê-lo para quem chamou a função.

Private Function buscaCampos() As clsCliente

  Set buscaCampos = New clsCliente

  If IsNull(txtCodigo) Then
    txtCodigo = proximoCodigo("codCliente", "Cliente")
  End If
  
  buscaCampos.codCliente = txtCodigo
  buscaCampos.cpf = txtCpf
  buscaCampos.nomeCliente = txtNome
  buscaCampos.email = txtEmail
  buscaCampos.renda = txtRenda

End Function

7. Salvando um cliente: Depois de informados os dados de um novo cliente, ou alterados os dados de um cliente já cadastrado, necessitaremos de um procedimento que efetue a gravação destes dados. Para isto o botão btnSalvar conterá o código necessário no evento Ao Clicar. Ele fará uso da função buscaCampos(), a qual montará o objeto a ser salvo, e também o método salvar() do objeto, apresentando uma mensagem ao usuário com o resultado da operação. Após salvar os dados de um cliente também deveremos atualizar a Listbox para que apresente estes dados, sejam eles novos ou apenas alterados.

Private Sub btnSalvar_Click()

  Dim objCliente As clsCliente
  
  If Not IsNull(txtCpf) And Not IsNull(txtNome) Then
    Set objCliente = buscaCampos
    
    If objCliente.salvar Then
      MsgBox "O cliente foi salvo com sucesso.", vbInformation, _
      "Salvar Cliente"
      lstCliente.Requery
      Call atualizaCampos(objCliente)
    Else
      MsgBox "Ocorreu um erro durante o salvamento.", vbExclamation, _
      "Salvar Cliente"
    End If
  Else
    MsgBox "Informe os dados do cliente.", vbExclamation, "Salvar Cliente"
  End If

End Sub

8. Excluindo um cliente: Além de criar e alterar os dados de um cliente, é importante que também possamos excluí-lo definitivamente de nosso cadastro. Logo devemos também implementar a funcionalidade para o botão btnExcluir, que conterá o código necessário também no evento Ao Clicar. Ele também deverá fazer uso da função buscaCampos() para a montagem do objeto a ser excluído, pois caso contrário a classe não saberá que objeto deve ser excluído. Em seguida utilizaremos o método excluir() do objeto, apresentando uma mensagem ao usuário com o resultado da operação. É claro que após excluir um cliente também deveremos atualizar a Listbox para que a mesma reflita as alterações realizadas.

Private Sub btnExcluir_Click()
  
  Dim objCliente As clsCliente
  
  If Not IsNull(txtCodigo) Then
    
    If MsgBox("Confirma a exclusão do registro?", vbQuestion + vbYesNo, _
    "Excluir Cliente") = vbYes Then
      
      Set objCliente = buscaCampos
      
      If objCliente.excluir Then
        MsgBox "O registro foi excluído com sucesso.", vbInformation, _
        "Excluir Cliente"
        lstCliente.Requery
        Call limpaCampos
      Else
        MsgBox "Ocorreu um erro durante a exclusão.", vbExclamation, _
        "Excluir Cliente"
      End If
      
    End If
    
  End If
  
End Sub

Estes são os procedimentos e funções básicas para que a interface possa manipular os objetos. Não se esqueça de que para efetuar os testes deveremos utilizar um CPF válido devido à verificação realizada.

Sistema de Exemplo

A partir deste artigo será disponibilizado o link para download do sistema de vendas no estado de desenvolvimento em que se encontrar o projeto.

Recomendo aos estudiosos desenvolvedores que o consultem apenas para tirar dúvidas e realizar comparações. Aqueles que realmente quiserem aprender façam toda a codificação e a montagem das telas manualmente. Somente assim a sua mente irá se defrontar com as dificuldades do processo e assimilará os passos necessários para a resolução dos problemas e a conclusão dos objetivos.

Segue o link para download:

Como ainda não há uma tela principal abra o formulário FCliente diretamente na janela Banco de Dados (Access 2003-) ou no Painel de Navegação (Access 2007+).

Conclusão

Enfim demos início à parte mais empolgante do curso, na qual podemos ver o sistema realmente operando, manipulando os objetos. Pudemos ver como se dá a interação entre objetos, a verificação de atributos, a montagem de códigos SQL para busca, alteração, inserção e exclusão de dados, além de visualizar procedimentos simples de tratamento de erros.

Nunca é demais relembrar que o objetivo maior de todas as etapas do curso é apresentar de forma didática, da maneira mais simples possível, a utilização de objetos em projetos do Access/VBA. Sendo assim não considere as implementações apresentadas como o padrão de fato da programação. Muita coisa foi simplesmente omitida ou modificada, mesmo partindo dos próprios padrões que utilizo em meus projetos reais para que fosse alcançada a objetividade necessária ao entendimento por parte de usuários iniciantes ou com pouca experiência na POO.

A lição mais importante deste artigo foi realmente a visualização da dinâmica da utilização dos objetos na manipulação de informações, tanto na sua apresentação quanto na sua persistência.

A partir deste momento, creio, ficará cada vez mais fácil a percepção da operação com objetos, desde que o leitor compreenda bem o que foi visto até agora, pois estes conceitos iniciais são a base da orientação a objetos.   Apesar de não contarmos com as outras faces da OO, como a herança por exemplo, com certeza a mente do leitor já começará a visualizar melhor as infinitas possibilidades que a metodologia fornece.  Porém relembro que para conseguir dominar a técnica é imprescindível continuar treinando, criando seus próprios códigos, fazendo experiências, resolvendo problemas com a aplicação do paradigma, lendo outros materiais e compartilhando conhecimento, seja com colegas de trabalho, amigos ou em fóruns sobre o assunto.

No próximo artigo, que será muito parecido com este, faremos a implementação da classe Produto, com sua respectiva interface gráfica. Isto ajudará a massificar os conhecimentos adquiridos nesta etapa, pois tudo será relembrado.

Até o próximo...


 

 


6 comentários

Márcio Melo - Rio de Janeiro/RJ   27/07/2010 01:15:09

Imagina um banco de dados todo construído em O.O., teria uma forte consistência em todos os procedimentos, o acesso a tabela controlado otimizando a rede, evitária o problema de conrrupção de tabela, traria outra vida ao access, parabéns pelos artigos, postei em meu site (http://iniciantejoomla.com/web-links/access) indicando essa verdadeira fonte de conhecimento, forte abraço a todos...

Sou mais Brasil!!!

Torres Forte - PA   29/07/2010 12:14:53

Cara esse curso e realmente impolgante.... estou pronto pra o proximo...

ABRAÇO

cleverson ribeiro - Manaus/AM   02/08/2010 19:20:05

grande curso. já tá na minha biblioteca na seção BESTSELER.
Abraços.

Plinio Mabesi   02/08/2010 21:10:38

Olá mais uma vez Márcio e Torres, e agora o Cleverson!
Obrigado a todos e continuem conosco...

Mauricio Mendes   10/08/2010 08:24:59

Chou de bola, ou melhor, chou de aula, adorei, estou esperando o proximo.

Renato Novelli   25/08/2010 14:44:43

Mais uma vez, tenho o prazer de parabenizá-lo pelo excelente artigo!
O material aqui publicado tem melhorado muito meu entendimento acerda de programação O.O., além do que tem tornado meus aplicativos melhores e seu código muito mais legível!

Muito obrigado por compartilhar essas informações valiosíssimas!


Envie seu comentário: