Visual Basic 6 - Controle de Estoques com ADO - I


Vou criar um sistema para controle de estoques usando os conceitos da orientação a objeto (OOP) no VB 6.0.  Não pense que será um sistema completo , não , o objetivo é mostrar como você pode iniciar o caminho das pedras , mesmo porque um sistema completo demandaria muito tempo e mesmo assim não atenderia a necessidade de todos os usuários.

Portanto nada de camarão , só o arroz com feijão básico. Nem por isto você deve torcer o nariz pois creio que muitos conceitos serão úteis , mesmo para os de conhecimento avançado.

Eu acho que estou me tornando repetitivo , mas quero começar chamando a atenção para a importância e o peso que a modelagem de dados têm em qualquer projeto ;  se você fizer uma modelagem de dados errada , nada poderá salvar o seu código no futuro quando alguma alteração nas regras do negócio o levarem para um beco sem saída. Por isto a primeira coisa a fazer será fazer uma análise do seu projeto juntamente com o  cliente para verificar suas reais necessidades em seguida fazer um protótipo para que o cliente tenha uma visão geral do sistema , assim ele poderá opinar com mais propriedade.

Muitos problemas irão se manifestar ao longo da vida de sua aplicação se o banco de dados for mal projetado , você pode ser surpreendido por um dos seguintes sintomas:

Vamos ao nosso projeto . Quais suas características ? Quais suas funcionalidades ? o que desejamos implementar ? Quais os objetos que vamos ter que criar ? Quanto nos vamos cobrar ?

1 - Definindo o projeto

Nosso sistema para controle de Estoques , daqui em diante chamado apenas de Estoque , irá envolver três entidades básicas (por questão de simplicidade ) :

  1. Clientes
  2. Produtos
  3. Pedidos

Por conseqüência vamos criar três classes que representam estas entidades : A classe Cliente , a classe Produto e a classe Pedido.

Nosso sistema irá trabalhar com uma base de dados Access ( .mdb ) e o nome dado ao banco de dados será : Estoque.mdb  e o acesso será feito usando a tecnologia ADO - ActiveX Data Object. Eu escolhi o Access por ser mais simples , mas , eu realmente não recomendo que você utilize o Access (veja o artigo em VB e SQLServer - O Acesso aos dados e a migração.); embora seja um excelente ferramenta , ele tem suas limitações . Prefira usar um banco de dados mais robusto como o SQL Server , Oracle ou DB2 . ( Veja como criar o banco de dados e as tabelas no SQL Server em : SQL SERVER - Usando a linguagem de definição de dados (DDL) ).

Nota : Outra boa opção para usar como banco de dados seria o MSDE da Microsoft. Leia artigo sobre o assunto em : Usando o MSDE com o Visual Basic

A seguir vamos criar no banco de dados Estoque.mdb as seguintes tabelas :

  1. Clientes
  2. Produtos
  3. Pedidos
  4. ItensPedidos

Podemos criar o banco de dados e as tabelas via código (ADO - Básico e Prático I  ) , podemos também usar o Access e ganhar tempo. Veja artigo sobre como criar banco de dados e tabelas em : Criando Banco de Dados  e Tabelas . Vamos usar o Access ; abra o Access e crie o banco de dados Estoque.mdb e a seguir a tabela clientes com a seguinte estrutura :

Nota : Se você não tem o Access nem o SQL Server veja como criar os arquivos no Visdata : Usando o Visual Data Manager para criar um banco de dados e tabelas

- A coluna CodigoCliente é a chave primária da tabela e por isto não permite duplicação de código.

- A coluna NomeCliente esta indexada com a opção duplicação não autorizada,  assim não permitimos gravar clientes com o mesmo nome.

Abaixo a estrutura da tabela Produtos :

- A coluna CodigoProduto é a chave primária da tabela e por isto não permite duplicação de código.

- A coluna NomeProduto esta indexada com a opção duplicação não autorizada,  assim não permitimos gravar clientes com o mesmo nome.

Agora a tabela Pedidos :

- A coluna CodigoPedido é a chave primária da tabela e por isto não permite duplicação de código.

- A coluna CodigoCliente esta indexada com a opção duplicação  autorizada,  pois poderemos ter vários pedidos para um mesmo cliente.

Finalmente a tabela ItensPedidos :

- A coluna CodigoItemPedido é a chave primária da tabela e por isto não permite duplicação de código.

- A coluna CodigoPedido esta indexada com a opção duplicação  autorizada,  pois teremos o código de Pedido repetido diversas vezes para o mesmo cliente.

- A coluna CodigoProduto esta indexada com a opção duplicação  autorizada,  pois poderemos num pedido o mesmo produto repetido diversas vezes

Criando as classes do projeto

Se você ainda não tem experiência em tratar classes e objetos  pode ficar um tanto perdido no início mas assim que assimilar os conceitos e  a começar a pensar em objetos a programação OOP será uma coisa natural. No começo , para quem esta acostumado a programar nas linguagens que usam procedimentos , parece que a coisa não anda mas é só ter perseverança.

Nota: Leia os artigos sobre classes no Visual Basic nos seguintes links :

A primeira coisa que um programador com uma mentalidade procedural pensa quando tem que desenvolver um projeto é nas funções que deverá criar para realizar as tarefas do projeto já uma mentalidade OOP pensa em objetos e suas propriedades e métodos . No projeto Controle de estoques definimos 3 entidades . A entidade Clientes refere-se naturalmente aos nossos clientes então temos que definir a classe Cliente a partir da qual iremos instanciar o objeto Clientes assim poder acessar suas propriedades. Nossa classe deverá possuir propriedades e métodos. Quais as propriedades que um cliente possui ? Devemos pensar em nosso cliente como uma pessoa física ou jurídica . Abaixo as propriedades que iremos usar:

  1. Nome
  2. Endereco
  3. Cidade
  4. Estado
  5. Cep
  6. Telefone
  7. CGC/CIC
  8. Inscriçao Estadual
  9. Email
  10. Ativo

Nossa classe Cliente deverá permitir as operações de atualização , exclusão , inclusão e identificação dos clientes usando estas propriedades, por isso cada propriedade corresponde a uma coluna na tabela Clientes.

Vamos criar a classe Cliente no Visual Basic. Abra um novo projeto padrão do tipo ActiveX DLL dando a ele o nome de EstoqueDLL .

Obs: Vamos criar as classes em uma DLL que conterá as regras de negócio.

Para criar um procedimento Property , você deve estar na janela de código para a classe com a qual estiver operando. Selecione no menu Tools a opção Add Procedure. Isto irá abrir a janela Add Procedure.  A seguir informe o nome do procedimento em - Name ; o tipo Property e o escopo - Scope igual  Public. Ver abaixo:

Nota : Não esqueça de referencia a biblioteca ADO - Microsot Activex Data Object 2.x - no menu Project | References:

Na classe clientes vamos inserir o código conforme abaixo para cada campo da tabela e repetir para cada propriedade os procedimentos acima:

Option Explicit

Private rsClientes As ADODB.Recordset
Private oConexao As ADODB.Connection
Private sNome As String
Private sEndereco As String
Private sCidade As String
Private sEstado As String
Private sCep As String
Private sTelefone As String
Private sCgcCic As String
Private sInscricao As String
Private sEmail As String
Private bAtivo As Boolean

Public Property Let Nome(valor As String)
  sNome = valor
End Property

Public Property Get Nome() As String
  Nome = sNome
End Property


Public Property Let Endereco(valor As String)
   sEndereco = valor
End Property

Public Property Get Endereco() As String
   Endereco = sEndereco
End Property


Public Property Let Cidade(valor As String)
  sCidade = valor
End Property

Public Property Get Cidade() As String
   Cidade = sCidade
End Property


Public Property Let Estado(valor As String)
   sEstado = valor
End Property

Public Property Get Estado() As String
   Estado = sEstado
End Property


Public Property Let Cep(valor As String)
  sCep = valor
End Property

Public Property Get Cep() As String
   Cep = sCep
End Property


Public Property Let Telefone(valor As String)
  sTelefone = valor
End Property

Public Property Get Telefone() As String
   Telefone = sTelefone
End Property


Public Property Let Telefone(valor As String)
  sTelefone = valor
End Property

Public Property Get Telefone() As String
  Telefone = sTelefone
End Property


Public Property Let CgcCic(valor As String)
   sCgcCic = valor
End Property

Public Property Get CgcCic() As String
   CgcCic = sCgcCic
End Property


Public Property Let Inscricao(valor As String)
   sInscricao = valor
End Property

Public Property Get Inscricao() As String
   Inscricao = sInscricao
End Property


Public Property Let Email(valor As String)
   sEmail = valor
End Property

Public Property Get Email() As String
   Email = sEmail
End Property


Public Property Let Ativo(valor As Boolean)
   bAtivo = valor
End Property

Public Property Get Ativo() As String
  Ativo = bAtivo
End Property

Obs: O campo CodigoCliente não é gerenciado pela aplicação pois é um campo Autonumeração.

Após criar a classe incluímos as suas propriedades. Essas propriedades são as propriedades dos objetos criados a partir da classe. Cada objeto que você criar a partir da classe terá então o seu conjunto de propriedades, e essas propriedades permitirão ao usuário obter informação sobre o objeto. Existem duas maneiras atribuir uma propriedade a uma classe :

  1. Definindo um variável pública ou privada

  2. Usando o procedimento Property

Criando uma variável Pública - Você cria uma variável pública usando a declaração do enunciado da variável com a palavra Public, assim:

Public var1 as string   ou       Private var1 as string

A declaração do enunciado pode aparecer na secção Declarations do módulo da classe ou em qualquer procedure Sub na classe. Como uma variável pública é visível por toda aplicação assim que ela é criada , qualquer parte do programa pode alterar o valor da variável, e , isto pode lhe causar problemas , por isso este método de criação de variáveis deve ser evitado ao máximo e por isso nossas variáveis são do tipo private.

Usando o procedimento Property - Este é um método melhor de criar variáveis em classes, pois este procedimento fornece a interface para com as propriedades do objeto e ao mesmo tempo permite a escrita de código para verificar que os dados adequados estão sendo passados para classe. Isto protege as funções da classe de falharem quando receberem dados inadequados. Ele permite também criarmos propriedades somente-leitura. Existem três tipos de procedimentos Property disponíveis:

Procedure Tipo Função
Property Let Aceita o valor da uma propriedade (Property)de um programa que foi chamado Usada para definir o valor de uma propriedade
Property Get Envia o valor da propriedade ao programa. Usada para retornar o valor de um propriedade.
Property Set Caso especial. Usado se o tipo de variável a ser definida for um objeto.

O procedimento Property Let inclui um argumento ao procedimento. Este argumento é o valor que é passado de um programa pela propriedade . Você pode mudar o nome do argumento e pode definir o tipo da variável . O código do procedimento Property Let recebe o valor do argumento, realiza a validação(quando houver) e atribui o valor para uma variável privada no módulo de classe.

O procedimento Property Get permite ao seu programa receber o valor da propriedade . Isto é feito atribuindo-se o valor a ser retornado ao nome da propriedade.

Observe que cada propriedade possui um par Get/Let onde podemos atribuir e obter o valor de cada variável.

Vamos então definir agora o código da classe Produtos. Procedimento é o mesmo adotado para a classe Clientes : Segue abaixo o código da classe Produtos :

Option Explicit

Private rsProdutos As ADODB.Recordset
Private oConexao As ADODB.Connection
Private strNomeProduto As String
Private sgnQuantidadeProduto As Single
Private sgnAliquotaProduto As Single
Private sgnEstoqueMinimo As Single
Private sgnEstoqueMaximo As Single
Private curPrecoUnitario As Currency
Private bAtivo As Boolean

Public Property Get NomeProduto() As String
  NomeProduto = strNomeProduto
End Property
Public Property Let NomeProduto(valor As String)
  strNomeProduto = valor
End Property
Public Property Get QuantidadeProduto() As Single
 QuantidadeProduto = sgnQuantidadeProduto
End Property
Public Property Let QuantidadeProduto(valor As Single)
  sgnQuantidadeProduto = valor
End Property
Public Property Get AliquotaProduto() As Single
  AliquotaProduto = sgnAliquotaProduto
End Property
Public Property Let AliquotaProduto(valor As Single)
  sgnAliquotaProduto = valor
End Property
Public Property Get EstoqueMinimo() As Single
  EstoqueMinimo = sgnEstoqueMinimo
End Property
Public Property Let EstoqueMinimo(valor As Single)
  sgnEstoqueMinimo = valor
End Property
Public Property Get EstoqueMaximo() As Single
  EstoqueMaximo = sgnEstoqueMaximo
End Property
Public Property Let EstoqueMaximo(valor As Single)
  sgnEstoqueMaximo = valor
End Property
Public Property Get PrecoUnitario() As Currency
  PrecoUnitario = curPrecoUnitario
End Property
Public Property Let PrecoUnitario(valor As Currency)
  sgnPrecoUnitario = valor
End Property
Public Property Let Ativo(valor As Boolean)
   Ativo = valor
End Property
Public Property Get Ativo() As String
  Ativo = bAtivo
End Property

Obs: O campo CodigoProduto não é gerenciado pela aplicação pois é um campo Autonumeração.

Vamos , no embalo definir o código para a entidade Pedidos , conforme as regras mencionadas e da entidade ItensPedidos. O código de cada uma esta abaixo:

Código da classe Pedidos                                                           Código da classe Itens dos Pedidos
Option Explicit

Private rsPedidos As ADODB.Recordset
Private oConexao As ADODB.Connection
Private datDataPedido As Date
Private sgnNumeroNotaFiscal As Single
Private lngCodigoCliente As Long
Private curPrecoTotal As Currency
Private curFrete As Currency
Private bAtivo As Boolean

Public Property Get DataPedido() As Date
  DataPedido = datDataPedido
End Property
Public Property Let DataPedido(valor As Date)
  datDataPedido = valor
End Property
Public Property Get NumeroNotaFiscal() As Single
  NumeroNotaFiscal = sgnNumeroNotaFiscal
End Property
Public Property Let NumeroNotaFiscal(valor As Single)
  sgnNumeroNotaFiscal = valor
End Property
Public Property Get CodigoCliente() As Long
  CodigoCliente = lngCodigoCliente
End Property
Public Property Let CodigoCliente(valor As Long)
  lngCodigoCliente = valor
End Property
Public Property Get PrecoTotal() As Currency
  PrecoTotal = curPrecoTotal
End Property
Public Property Let PrecoTotal(valor As Currency)
  curPrecoTotal = valor
End Property
Public Property Get Frete() As Currency
  Frete = curFrete
End Property
Public Property Let Frete(valor As Currency)
  curFrete = valor
End Property
Option Explicit

Private rsItensPedidos As ADODB.Recordset
Private oConexao As ADODB.Connection
Private lgnCodigoPedido As Long
Private lgnCodigoProduto As Long
Private curPrecoUnitario As Currency
Private sgnQuantidadePedido As Single
Private sgnDesconto As Single

Public Property Get CodigoPedido() As Long
  CodigoPedido = lgnCodigoPedido
End Property
Public Property Let CodigoPedido(valor As Long)
  lgnCodigoPedido = valor
End Property
Public Property Get CodigoProduto() As Long
  CodigoProduto = lgnCodigoProduto
End Property
Public Property Let CodigoProduto(valor As Long)
  lgnCodigoProduto = valor
End Property
Public Property Get PrecoUnitario() As Currency
  PrecoUnitario = curPrecoUnitario
End Property
Public Property Let PrecoUnitario(valor As Currency)
  curPrecoUnitario = valor
End Property
Public Property Get QuantidadePedido() As Single
  QuantidadePedido = sgnQuantidadePedido
End Property
Public Property Let QuantidadePedido(valor As Single)
   sgnQuantidadePedido = valor
End Property
Public Property Get Desconto() As Single
  Desconto = sgnDesconto
End Property
Public Property Let Desconto(valor As Single)
  sgnDesconto = valor
End Property
	

Até agora só tivemos muito trabalho braçal , onde apenas definirmos as propriedades para cada item de cada entidade. A seguir vamos ver quais métodos serão necessários para que possamos implementar todas as funcionalidades no projeto.

Pode parecer pouca coisa mas lembre-se que as propriedades são a vida da classe e que existem duas maneiras , no VB 6, para exibir as propriedades nas classes definidas:

Acompanhe a continuação do artigo em - VB6 - Controle de Estoques com ADO - II...

Veja também outros sistemas similares no : Super DVD Visual Basic

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

Referências:


José Carlos Macoratti