VB.NET - Cadastro de Clientes usando classes e conceitos OO
Este é um artigo para iniciantes e tem como objetivo mostrar como você pode usar classes e alguns conceitos OO como herança , composição e polimorfismo em uma aplicação usando banco de dados.
Embora eu esteja apresentando neste artigo uma aplicação completa e funcional eu não me preocupei com alguns aspectos que , em uma aplicação real para um ambiente de produção , deveriam ser implementados visando maior robustez e escalabilidade. Estou falando de um tratamento de erros mais consistente , de uma definição melhor dos métodos da classes usadas no artigo e de algumas considerações de desempenho que prefiro não comentar para não me alongar mais.
Seria bom , para quem esta começando agora no VB.NET , ler meus dois artigos publicados onde eu apresento a criação de um programa para cadastro de clientes :
Meu primeiro projeto orientado a objetos : Cadastro de Clientes - (VB 6 usando classes e conceitos oop)
VB.NET - Criando um cadastro de clientes - (VB.NET usando datsets typados)
Neste artigo eu vou estar
criando uma aplicação do tipo Windows Forms
usando a linguagem VB.NET que acessa um banco de dados Access e tem com a
finalidade de gerenciar um cadastro de clientes.
Uma das primeiras coisas a fazer é criar o banco de dados , via código ou usando o Microsoft Access. Para o exemplo deste artigo eu criei o banco de dados Cadastro.mdb que contém a tabela Clientes cuja estrutura é exibida ao lado: |
Se você nunca usou classes e não conhece os
conceitos básicos da programação orientada a objetos seria bom ler meus artigos
a respeito antes de prosseguir :
Geralmente os programadores que usam o Visual Basic para criar aplicações para banco de dados usam aquele modelo de programação conhecido como ONE-BUTTON-CLICK , explicando melhor : cria-se um formulário e coloca-se todo o código em um botão que é responsável por fazer quase tudo : conexões com banco de dados , validações de regras de negócio , apresentação da interface , etc...
Este estilo de programação se propaga por diversos fatores entre eles o fato do VB ser uma ferramenta RAD muito fácil de usar : basta arrastar controles para compor rapidamente um formulário com diversos itens sem precisar digitar um única linha de código.
Programar neste estilo pode ser até fácil mas é muito difícil dar manutenção , os programas têm que ser praticamente reescritos a cada alteração significativa , o desempenho é baixo , não existe escalabilidade , portabilidade , etc...
Neste artigo vou mostrar como você pode separar a camada de apresentação das regras de negócio usando classes e alguns conceitos OOP.
O projeto Cadastro de clientes irá conter duas classes que foram criadas
AcessoBD - trata da conexão e dos artefatos relacionados com o tratamento de dados
Clientes - trata do nosso objeto cliente e possui métodos e propriedades que caracterizam um cliente definido para o nosso escopo
A primeira coisa que fazemos quando vamos definir um objeto é pensar em suas propriedades e ações. Assim um cliente , para o nosso escopo, deverá possuir as seguintes propriedades e ações : (Você pode discordar da minha implementação e criando e definindo um objeto cliente com diferentes propriedades e ações.)
Propriedades : codigo , nome, endereco , cidade , estado , telefone e email
Acões - incluirNovoCliente, atualizaCliente, excluirCliente , lista_Clientes , lista_Todos_Clientes
As definições acima são feitas após uma análise de requisitos do sistema com a utilização de ferramentas que auxiliam na construção de um modelo para o negócio.
Nota:
Um dos primeiros artefatos a ser produzido são os diagramas de casos de uso para o sistema. Como exemplo para a nossa aplicação abaixo temos o diagrama de casos de uso feito usando a versão trial da ferramenta oferecida pela Pacestar que você pode obter em : http://www.pacestar.com/uml/trial.htm:
|
Meu cliente terá os atributos : codigo , nome, endereco , cidade , estado , telefone e email
Meu cliente poderá efetuar as seguintes ações (métodos) : incluirNovoCliente, atualizaCliente, excluirCliente , lista_Clientes , lista_Todos_Clientes
Um objeto de acesso a dados deverá possuir o conhecimento relacionado com a conexão e com o tratamento dos dados da aplicação. Assim para a nossa aplicação a classe AcessoBD deverá possuir os seguintes métodos :
Ações : cria_Conexao_OleDB , cria_Comando_OleDb , cria_DataAdapter_OleDB , cria_DataSet_OleDB (3 métodos), cria_DataReader_OleDb, preenche_Tabela
O Object Browser é uma ferramenta que no ajuda a visualizar os métodos e propriedades de uma classe criada em um projeto no VS.NET. Abaixo temos as figuras que exibem os métodos para as classes AcessoBD e Clientes:
Nota : Para usar o Object Browser , abra a sua aplicação e no menu View selecione Object Browser.
classe AcessoBD : métodos |
classe Clientes : métodos e propriedades |
Nossa aplicação possuirá somente um formulário -
frmClientes - onde iremos ter as funcionalidades de cadastrar clientes e
exibir uma relação dos clientes cadastrados. Abaixo temos a figura do formulário
usado na aplicação:
Neste formulário estou usando os seguintes controles :
TabControl
GroupBox
TextBox
Button
Label
ComboBox
DataGrid
Vamos iniciar exibindo código da classe AcessoBD que será responsável pela conexão e as ações de tratamento dos dados da aplicação. No menu Project escolha Add | Class Module e altere o nome do arquivo para AcessoBD.vb ; a seguir insira o código abaixo no arquivo:
Imports System Imports System.Data Imports System.Data.sqlclient Imports System.Data.OleDb Public Class AcessoBD Function Cria_Conexao_OleDb(ByVal strConexao As String) As OleDbConnection Dim conexaoOleDb As OleDbConnection If strConexao.ToLower.IndexOf("provider=") >= 0 Then conexaoOleDb = New OleDbConnection(strConexao) conexaoOleDb.Open() Return conexaoOleDb End If End Function Function cria_DataReader_OleDb(ByVal conexaoOleDb As OleDbConnection, ByVal strSQL As String) As OleDb.OleDbDataReader Dim comando As New OleDbCommand(strSQL, conexaoOleDb) Dim dr As OleDbDataReader = comando.ExecuteReader(CommandBehavior.CloseConnection) comando.Dispose() Return dr End Function Function cria_DataAdapter_OleDb(ByVal conexaoOleDb As OleDbConnection, ByVal strSQL As String) As OleDbDataAdapter Dim da As New OleDbDataAdapter(strSQL, conexaoOleDb) Return da End Function Function cria_DataSet_OleDb(ByVal conexaoOleDb As OleDbConnection, ByVal strSQL As String) As DataSet Dim da As New OleDbDataAdapter(strSQL, conexaoOleDb) Dim ds As New DataSet da.Fill(ds) Return ds End Function Function cria_DataSet_OleDb(ByVal da As OleDbDataAdapter, ByVal tabela As DataTable) As DataSet Dim ds As New DataSet da.Fill(tabela) Return ds End Function Function cria_DataSet_OleDb(ByVal da As OleDbDataAdapter) As DataSet Dim ds As New DataSet da.Fill(ds) Return ds End Function Function cria_Comando_OleDb(ByVal conexao As OleDbConnection, ByVal strSQL As String) As OleDbCommand Dim comando As OleDbCommand = conexao.CreateCommand() comando.CommandText = strSQL comando.CommandType = CommandType.Text Return comando End Function Function preencheTabela(ByVal tabela As DataTable, ByVal comando As OleDbCommand, ByVal da As OleDbDataAdapter) tabela.Clear() comando.ExecuteNonQuery() da.SelectCommand = comando da.Fill(tabela) End Function End Class
|
Na classe AcessoBD temos a definição de 3 métodos cria_DataSet_OleDb ; como isto é possível ?
Observe que embora tenham o mesmo nome os métodos
possuem assinatura (número de parâmetros) diferentes:
Function cria_DataSet_OleDb(ByVal conexaoOleDb As OleDbConnection, ByVal strSQL As String) As DataSet
Function cria_DataSet_OleDb(ByVal da As OleDbDataAdapter, ByVal tabela As DataTable) As DataSet
Function cria_DataSet_OleDb(ByVal da As OleDbDataAdapter) As DataSet
Isto não seria possível nas versões anteriores do VB. Esta propriedade é uma característica das linguagens OOP e é conhecida como sobrecarga de métodos.
Sobrecarga seria então o reuso de um mesmo nome (em uma classe ou subclasse) para diferentes métodos(pois possuem assinatura diferentes). Exatamente como temos acima.
Aproveitando o gancho quero falar um pouco de polimorfismo pois muita gente confunde sobrecarga de métodos como uma forma de polimorfismo.
Mas o que vem a ser polimorfísmo ?
Polimorfismo significa muitas formas , na orientação a objetos você pode enviar uma mesma mensagem para diferentes objetos e fazê-los responder da maneira correta. Você pode enviar a mensagem de dar marcha-ré para cada objeto semelhante a um carro e cada um vai se comportar de maneira diferente para atender a sua solicitação.
Uma definição mais formal diria:
"Polimorfismo é o princípio pelo qual duas ou mais classes derivadas de uma mesma superclasse podem invocar métodos que têm a mesma identificação (assinatura) mas comportamentos distintos, especializados para cada classe derivada, usando para tanto uma referência a um objeto do tipo da superclasse"
Vamos supor que temos dois objetos : Quadrado e triângulo. São objetos diferentes certo ? Mas podemos dizer que o eles possuem em comum um método que calcula a área e que vamos chamar de Area() ; sendo que cada objeto implementa o método de forma diferente.
Levando isto para o mundo da programação vamos mostrar via código , usando C# (ou seria Java), a implementação de uma interface chamada FigurasGeometricas que define um método Area() e que deverá ser implementando pelas classes Quadrado e Triangulo.
O código da interface : FiguraGeometrica
public
interface FiguraGeometrica { double Area(double base, double altura); } |
Agora vamos mostrar o código das classes Quadrado e Triangulo implementando o método Area()
public class
Quadrado implements FiguraGeometrica { private double base; private double altura; public Quadrado() { base = 10; altura = 10; } public double Area(double base) { return base * altura; } } |
public class
Triangulo implements FiguraGeometrica { private double base; private double altura; public Triangulo() { base = 10; altura = 10; } public double Area(double base, double altura) { return (base * altura)/2 ; } } |
Classe Quadrado | Classe Triangulo |
Ao definir o método na interface eu não me preocupei como ele seria implementado.
Ele foi implementado de forma diferente mas o resultado final será o mesmo : a área da figura geométrica. A representação destas classes na notação UML seria algo parecido com a figura ao lado
|
A seguir temos o código da classe Clientes ; no menu Project selecione add Module Class e altere o nome do arquivo para clientes.vb e a inclua o código abaixo no arquivo. A classe Clientes usa os métodos definidos na classe AcessoBD para criar uma conexão , criar um DataAdapter , criar um DataReader , criar um Command e criar um DataSet.
Imports System Imports System.Data Imports System.Data.OleDb Imports System.Configuration Public Class Clientes Inherits AcessoBD 'propriedades do objeto cliente Private mCodigo As Integer Private mNome As String Private mEndereco As String Private mCidade As String Private mEstado As String Private mTelefone As String Private mEmail As String Private mErro As String 'variaveis usadas no projeto Dim strConexaoOleDbOleDb As String Dim conexaoOleDb As OleDbConnection Dim comandoOleDb As OleDbCommand Dim drOleDb As OleDbDataReader Dim daOleDb As OleDbDataAdapter Dim dsOleDb As DataSet Public Property Codigo() As Integer Get Return mCodigo End Get Set(ByVal Value As Integer) mCodigo = Value End Set End Property Public Property Nome() As String Get Return mNome End Get Set(ByVal Value As String) mNome = Value End Set End Property Public Property Endereco() As String Get Return mEndereco End Get Set(ByVal Value As String) mEndereco = Value End Set End Property Public Property Cidade() As String Get Return mCidade End Get Set(ByVal Value As String) mCidade = Value End Set End Property Public Property Estado() As String Get Return mEstado End Get Set(ByVal Value As String) mEstado = Value End Set End Property Public Property Telefone() As String Get Return mTelefone End Get Set(ByVal Value As String) mTelefone = Value End Set End Property Public Property Email() As String Get Return mEmail End Get Set(ByVal Value As String) mEmail = Value End Set End Property Public Property mError() As String Get Return mErro End Get Set(ByVal Value As String) mErro = Value End Set End Property Public Property mClientes() As DataTable Get Return mClientes End Get Set(ByVal Valor As DataTable) mClientes = Valor End Set End Property Public Sub lista_Cliente(ByVal Nome As String) Dim strConexaoOleDb As String = ConfigurationSettings.AppSettings("strConexaoBD") Dim strSQL As String = "SELECT * FROM Cliente WHERE Nome='" & Nome & "'" Try conexaoOleDb = Cria_Conexao_OleDb(strConexaoOleDb) drOleDb = cria_DataReader_OleDb(conexaoOleDb, strSQL) While drOleDb.Read If Not IsDBNull(drOleDb.Item("Codigo")) Then mCodigo = drOleDb.Item("Codigo") End If If Not IsDBNull(drOleDb.Item("Nome")) Then mNome = drOleDb.Item("Nome") End If If Not IsDBNull(drOleDb.Item("Endereco")) Then mEndereco = drOleDb.Item("Endereco") End If If Not IsDBNull(drOleDb.Item("Cidade")) Then mCidade = drOleDb.Item("Cidade") End If If Not IsDBNull(drOleDb.Item("Estado")) Then mEstado = drOleDb.Item("Estado") End If If Not IsDBNull(drOleDb.Item("Telefone")) Then mTelefone = drOleDb.Item("Telefone") End If If Not IsDBNull(drOleDb.Item("Email")) Then mEmail = drOleDb.Item("Email") End If End While Catch mExcecao As System.Exception mErro = mExcecao.ToString If conexaoOleDb.State.Open Then conexaoOleDb.Close() End If End Try conexaoOleDb.Close() End Sub Function lista_Todos_Clientes() Dim strConexaoOleDb As String = ConfigurationSettings.AppSettings("strConexaoBD") Dim strSQL As String = "SELECT * FROM Cliente" Try conexaoOleDb = Cria_Conexao_OleDb(strConexaoOleDb) daOleDb = cria_DataAdapter_OleDb(conexaoOleDb, strSQL) comandoOleDb = cria_Comando_OleDb(conexaoOleDb, strSQL) dsOleDb = cria_DataSet_OleDb(daOleDb) Return dsOleDb Catch mExcecao As System.Exception mErro = mExcecao.ToString If conexaoOleDb.State.Open Then conexaoOleDb.Close() End If End Try End Function Public Sub incluirNovoCliente(ByVal Nome As String, ByVal ClienteEndereco As String, ByVal ClienteCidade As String,_ ByVal ClienteEstado As String, ByVal ClienteTelefone As String, ByVal ClienteEmail As String) Dim strConexaoOleDb As String = ConfigurationSettings.AppSettings("strConexaoBD") Dim strSQL As String = "INSERT INTO Cliente(Nome, Endereco, Cidade, Estado, Telefone, Email)VALUES_ (@Nome, @Endereco, @Cidade, @Estado, @Telefone, @Email)" Try conexaoOleDb = Cria_Conexao_OleDb(strConexaoOleDb) daOleDb = cria_DataAdapter_OleDb(conexaoOleDb, strSQL) comandoOleDb = cria_Comando_OleDb(conexaoOleDb, strSQL) comandoOleDb.Parameters.Add(New OleDbParameter("@Nome", OleDbType.VarChar, 50)) comandoOleDb.Parameters("@Nome").Value = Nome comandoOleDb.Parameters.Add(New OleDbParameter("@Endereco", OleDbType.VarChar, 50)) comandoOleDb.Parameters("@Endereco").Value = ClienteEndereco comandoOleDb.Parameters.Add(New OleDbParameter("@Cidade", OleDbType.VarChar, 50)) comandoOleDb.Parameters("@Cidade").Value = ClienteCidade comandoOleDb.Parameters.Add(New OleDbParameter("@Estado", OleDbType.VarChar, 50)) comandoOleDb.Parameters("@Estado").Value = ClienteEstado comandoOleDb.Parameters.Add(New OleDbParameter("@Telefone", OleDbType.VarChar, 50)) comandoOleDb.Parameters("@Telefone").Value = ClienteTelefone comandoOleDb.Parameters.Add(New OleDbParameter("@Email", OleDbType.VarChar, 100)) comandoOleDb.Parameters("@Email").Value = ClienteEmail comandoOleDb.ExecuteNonQuery() conexaoOleDb.Close() Catch mExcecao As System.Exception mErro = mExcecao.ToString conexaoOleDb.Close() End Try End Sub Public Sub atualizaCliente(ByVal Codigo As Integer, ByVal Nome As String, ByVal ClienteEndereco As String,_ ByVal ClienteCidade As String, ByVal ClienteEstado As String, ByVal ClienteTelefone As String, ByVal ClienteEmail As String) Dim strConexaoOleDb As String = ConfigurationSettings.AppSettings("strConexaoBD") Dim strSQL As String = "UPDATE Cliente SET Nome='" & Nome & "', Endereco='" & ClienteEndereco & "', Cidade='" _ & ClienteCidade & "', Estado='" & ClienteEstado & "', Telefone='" & ClienteTelefone & "' WHERE Codigo=" & Codigo & "" Try conexaoOleDb = Cria_Conexao_OleDb(strConexaoOleDb) daOleDb = cria_DataAdapter_OleDb(conexaoOleDb, strSQL) comandoOleDb = cria_Comando_OleDb(conexaoOleDb, strSQL) conexaoOleDb.Close() Catch mExcecao As System.Exception mErro = mExcecao.ToString conexaoOleDb.Close() End Try End Sub Public Sub excluirCliente(ByVal mCodigo As Integer) Dim strConexaoOleDb As String = ConfigurationSettings.AppSettings("strConexaoBD") Dim strSQL As String = "DELETE FROM Cliente WHERE Codigo=" & mCodigo & "" Try conexaoOleDb = Cria_Conexao_OleDb(strConexaoOleDb) daOleDb = cria_DataAdapter_OleDb(conexaoOleDb, strSQL) comandoOleDb = cria_Comando_OleDb(conexaoOleDb, strSQL) conexaoOleDb.Close() Catch mExcecao As System.Exception mErro = mExcecao.ToString conexaoOleDb.Close() End Try End Sub End Class
|
Na classe Clientes temos a definição das propriedades e métodos do objeto Cliente , como já foi mencionado. Note também que a classe Clientes herda(inherits) da classe AcessoBD , ou seja , a classe cliente é uma classe filha de AcessoBD e terá acesso a todas as propriedades e métodos da classe pai. A representação das classes na notação UML é exibida na figura ao lado: |
|
A palavra Inherits indica isto no código ; ela somente pode ser usada em classe e interfaces. Isto foi possível por que no VB.NET todas as classes são por padrão herdáveis. Para não permitir que uma classe seja herdada usamos a palavra chave NoInheritable. Assim se você não desejar que a classe AcessoBD seja herdada basta comandar:
Public NotInheritable Class AcessoBD
Você pode também usar a palavra chave MustInherit ; ela indica que uma classe não pode ser instanciada diretamente e que precisa ser herdada de uma classe derivada que por sua vez pode ser instanciada.
Public MustInherit Class Acesso
A classe de onde herdamos é chamada classe base e uma classe derivada pode somente herdar de uma única classe base, isto é : não existe herança múltipla.
Para encerrar : Quando usar herança ?
Não existe uma receita de bolo para isto. Em geral a experiência e o bom senso devem ser usados para obter um bom resultado. Como você viu usar herança não é difícil , no entanto , você deve definir de forma criteriosa as classes bases ao projetar seus componentes e seus modelos de objetos para que elas possam ser realmente úteis e genéricas o bastante para serem utilizáveis por muitas classes.
Herança pode ser uma armadilha e tornar o seu código fortemente acoplado de forma ser quase impossível de ser reutilizado.
Estamos armazenando a string de conexão no arquivo de configuração da aplicação. O arquivo de configuração é definido como abaixo:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="strConexaoBD" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\cadastro.mdb" /> </appSettings> </configuration>
|
Pare recuperar o valor do arquivos usamos o código : Dim strConexaoOleDb As String = ConfigurationSettings.AppSettings("strConexaoBD")
Para saber como implementar um arquivo de configuração leia o artigo: .NET - Tratando arquivos de configuração
Falta somente exibirmos o código do formulário frmClientes que usará as propriedades e métodos das classes definidas e criará a interface com o usuário. Abaixo temos o código completo usado no formulário:
Código do botão Pesquisar que usa o método lista_cliente da classe Clientes através do objeto oCliente instanciado no código:
Private Sub BtnPesquisa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPesquisa.Click Dim oCliente As New Clientes If TxtNome.Text <> "" Then With Me .TxtCodigo.Text = "" .TxtEndereco.Text = "" .TxtCidade.Text = "" .cboEstado.Text = "" .TxtFone.Text = "" .txtEmail.Text = "" End With oCliente.lista_Cliente(TxtNome.Text) Else MsgBox("Por favor informe um nome para um Cliente!", MsgBoxStyle.Information, "Cadastro de Clientes") Exit Sub End If If oCliente.mError = "" Then With Me mCliCod = oCliente.Codigo .TxtCodigo.Text = oCliente.Codigo .TxtNome.Text = oCliente.Nome .TxtEndereco.Text = oCliente.Endereco .TxtCidade.Text = oCliente.Cidade .cboEstado.Text = oCliente.Estado .TxtFone.Text = oCliente.Telefone .txtEmail.Text = oCliente.Email End With Else MsgBox(oCliente.mError, MsgBoxStyle.Information, "Cadastro de Clientes") Exit Sub End If If oCliente.Codigo = 0 Then MsgBox("Cliente não cadastrado com Esse Nome!", MsgBoxStyle.Information, "Cadastro de Clientes") End If End Sub
|
Código do botão - Relação de clientes - que usa o método lista_Todos_Clientes da classe Clientes. A implementação deste método poderia ter sido feita de diversas maneiras.
Private Sub BtnClientes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClientes.Click Dim oClientes As New Clientes Dim ds As DataSet Try ds = oClientes.lista_Todos_Clientes Me.GridClientes.DataSource = ds Catch excecao As Exception MsgBox(oClientes.mError, MsgBoxStyle.Information, "Cadastro de Clientes") End Try End Sub
|
O código do botão Incluir e da rotina LimpaCampos() usada no botão. O código apenas limpa o conteúdo dos campos do formulário
Private Sub BtnNovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnNovo.Click LimpaCampos() End Sub Private Sub LimpaCampos() With Me mCliCod = Nothing .TxtCodigo.Text = "" .TxtNome.Text = "" .TxtEndereco.Text = "" .TxtCidade.Text = "" .cboEstado.Text = "" .TxtFone.Text = "" .txtEmail.Text = "" .TxtNome.Focus() End With End Sub
|
Código do botão Salvar que usa o método atualizaCliente da classe Clientes.
Private Sub BtnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSalvar.Click If Me.TxtNome.Text = "" Then MsgBox("Por Favor informe um nome para este Cliente!", MsgBoxStyle.Information, "Cadastro de Clientes") TxtNome.Focus() Exit Sub ElseIf TxtEndereco.Text = "" Then MsgBox("Por Favor informe o endereco do Cliente!", MsgBoxStyle.Information, "Cadastro de Clientes") TxtEndereco.Focus() Exit Sub ElseIf TxtCidade.Text = "" Then MsgBox("Por favor informe a cidade do Cliente!", MsgBoxStyle.Information, "Cadastro de Clientes") TxtCidade.Focus() Exit Sub ElseIf cboEstado.Text = "" Then MsgBox("Por Favor informe o Estado do Cliente!", MsgBoxStyle.Information, "Cadastro de Clientes") cboEstado.Focus() Exit Sub ElseIf TxtFone.Text = "" Then MsgBox("Por Favor informe o telefone do cliente!", MsgBoxStyle.Information, "Cadastro de Clientes") TxtFone.Focus() Exit Sub Else If mCliCod <> 0 Then Dim oCliente As New Clientes oCliente.atualizaCliente(TxtCodigo.Text, TxtNome.Text, TxtEndereco.Text, TxtCidade.Text, cboEstado.Text, _ TxtFone.Text, txtEmail.Text) If oCliente.mError = "" Then MsgBox("Dados atualizados com sucesso !", MsgBoxStyle.Information, "Cadastro de Clientes!") Exit Sub Else MsgBox("Error ao Atualizar dados do Cliente !", MsgBoxStyle.Information, "Cadastro de Clientes!") Exit Sub End If Else 'Incluir Novo Cliente Dim oCliente As New Clientes oCliente.incluirNovoCliente(TxtNome.Text, TxtEndereco.Text, TxtCidade.Text, cboEstado.Text, TxtFone.Text, txtEmail.Text) If oCliente.mError = "" Then MsgBox("Cliente incluído com sucesso !", MsgBoxStyle.Information, "Cadastro de Clientes!") Exit Sub Else MsgBox("Error ao incluir Cliente no Banco de Dados!" & vbCrLf & oCliente.mError, MsgBoxStyle.Information,_ "Cadastro de Clientes!") Exit Sub End If End If End If End Sub
|
Código do botão Excluir onde estamos usando o método excluirCliente da classe Clientes através do objeto oCliente que foi instanciado no início do código.
Private Sub BtnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDelete.Click Dim oCliente As New Clientes Dim opcao As String If TxtCodigo.Text <> "" Then opcao = MsgBox("Confirma a EXCLUSÃO deste cliente?", MsgBoxStyle.YesNo, "Cadastro de Clientes!") If opcao = 6 Then oCliente.excluirCliente(CInt(TxtCodigo.Text)) If oCliente.mError <> "" Then MsgBox("Erro ao excluir o Cliente!" & vbCrLf & oCliente.mError, MsgBoxStyle.Information, "Cadastro de Clientes!") Exit Sub Else MsgBox("Cliente excluido com sucesso !", MsgBoxStyle.Information, "Cadastro de Clientes!") LimpaCampos() Exit Sub End If Else Exit Sub End If Else MsgBox("Selecione o cliente a ser excluido usando a opção <Pesquisar> ", MsgBoxStyle.Information, "Cadastro de Clientes") End If End Sub
|
O
código do Evento Load do formulário onde carregamos a combobox com
as siglas do estados:
Private Sub FrmClientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim estados() = {"AC", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MT", "MS", "PB", "PE", "SP", "RJ", "RN", "RS"} cboEstado.DataSource = estados cboEstado.SelectedIndex = -1 End Sub |
Código usado para mudar para outro campo do formulário ao pressionar a tecla ENTER.
Private Sub txtNome_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtNome.KeyPress ' ao pressionar a tecla ENTER ( Return) o foco vai para o proximo controle If e.KeyChar = Convert.ToChar(Keys.Return) Then e.Handled = True TxtEndereco.Focus() End If End Sub
|
Para
encerrar gostaria de colocar duas questões :
É correto a classe Clientes herdar de AcessoBD ?
A classe Clientes "é um AcessoBD" ou "tem um AcessoBD " ?
Você pode usar o exemplo que ele esta funcional , embora precise de algumas melhorias...
Pegue o projeto aqui : clientes_net_oop.zip (73 k)
J
oão 5:24 Em verdade, em verdade vos digo que quem ouve a minha palavra, e crê naquele que me enviou, tem a vida eterna e não entra em juízo, mas já passou da morte para a vida.João 5:25 Em verdade, em verdade vos digo que vem a hora, e agora é, em que os mortos ouvirão a voz do Filho de Deus, e os que a ouvirem viverão.
João 5:26 Pois assim como o Pai tem vida em si mesmo, assim também deu ao Filho ter vida em si mesmos;
João 5:27 e deu-lhe autoridade para julgar, porque é o Filho do homem.
Veja os
Destaques e novidades do
SUPER DVD VB (sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ? Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira... Quer aprender C# ?? Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#. |
Referências:
José Carlos Macoratti