Visual Básico Prático - VB contra o Apagão


Você agora vai acompanhar um projeto com utilidade pública - VB contra o apagão (gostou do nome ? ). Eu explico ...

Estaremos aqui fazendo a nossa parte ( ja que alguém pisou na bola...) e ajudando a todos a cumprir a meta do apagão. Vamos fornecer um pequeno programa feito em VB para você calcular o seu consumo mensal e não estourar a meta ( tem multa e corte de luz...)

Na verdade vamos aproveitar a deixa para mostrar alguns conceitos básicos do VB aos iniciantes. Vamos começar o projeto hoje , 01-06-2001 , o inicio do racionamento, e ,  esperamos terminar dentro de 5 dias ( se não tiver apagão...) para não deixar você na mão... ou melhor no escuro...

Primeira Etapa - O objetivo

O objetivo do projeto é permitir ao usuário controlar/prever/planejar o seu consumo mensal e com isso não exceder a sua meta mensal. Basicamente o sistema deverá fazer:

  1. Calcular a meta

  2. Cadastrar os Aparelhos - Nome , potência

  3. Cadastrar a Localização - Descrição

  4. Cadastrar o Usuário - Nome, endereço , cep , uf , telefone , email

  5. Cadastrar o Consumo mensal

  6. Emitir relatórios

Segunda Etapa - Criando o Banco de dados e as tabelas

Vamos usar uma base de dados Access versão 2000 . Nosso banco de dados terá o sugestivo nome de apagao.mdb com as seguintes tabelas:

 Uma sugestão para os relacionamentos seria:

O banco de dados e as tabelas podem ser criados no Access ( é mais fácil ...). 

Terceira Etapa - Criando os formulários básicos

Bem , agora vamos criar os formulários básicos usados no sistema. São eles:

Qual interface vamos usar ?  SDI(Single Document Interface) ou MDI(Multiple Document Interface) ? 

A interface SDI é a padrão onde temos diversos formulários são janelas independentes que podem ser movidos livremente. Já a interface MDI exibe tudo dentro dos limites do formulário Container . Temos então um formulário MDI e todos os demais são formulários possuem a propriedade MDIChild= True.

Vamos optar pela Interface MDI . Teremos então um formulário principal e todos os demais serão exibidos neste formulário.

O primeiro formulário que iremos exibir será a tela de apresentação. Ele basicamente irá surgir por alguns segundos na tela exibindo o logotipo ou qualquer mensagem pertinente e desaparecerá dando lugar o formulário de menu principal MDI.

Como podemos fazer isto ?  Uma maneira será incluir um módulo ao projeto e tratá-lo como um Sub Main. Para executar o código neste módulo devemos ir no Menu Projects | Project1 Properties... e selecionar a opção Startup Object da aba General e escolher Sub Main.

Desta forma quando o projeto for executado a primeira coisa que será feita será a chamada a Sub Main.

No código  de Sub Main temos:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub main()
  frminicio.Show
  frminicio.Refresh
  DoEvents
  Call Sleep(5000) ' espera 5 segundos
  Unload frminicio
  MdiMenu.Show
End Sub

O que estamos fazendo ? Acompanhe :

  1. Na seção general declarations do módulo Sub Main usamos uma API para poder dar um pausa no processamento e assim poder exibir o formulário de ínicio.

  2. Carregamos então o formulário - frminicio.show

  3. Damos um refresh no formulário - frminicio.refresh

  4. Executamos um Doevents permitindo o processamento paralelo - Doevents

  5. Chamamos a função para parar o processamento por 5 segundos

  6. Descarregamos o formulário - frminicio

  7. e chamamos o formulário do Menu - MdiMenu

Vejamos a cara de frminicio e de MDiMenu

frminicio MDIMenu

Observe que frminicio não possui os botões de maximizar , minimizar e encerrar.

Neste projeto vamos economizar , além de energia , tempo . Para isto vamos utilizar os controles vinculados da ADO - ADODC , DataGrid e DataCombo. Para isto a primeira coisa que devemos fazer é incluir estes componentes no projeto na opção Project|Components...

Todos os formulários serão criados usando o Data Form Wizard no menu Add Ins, afinal temos pressa , e , como a aplicação será para uso estritamente doméstico não temos tanta preocupação com a utilização dos controles vinculados , que tornam a aplicação mais lenta.

Se você não sabe como usar o Data Form Wizard leia o artigo - Desenvolvendo aplicações em VB 6.0 usando o Mouse e um Dicionário .

Então todos os formulários , exceto o formulário frmconsumo , serão criados desta maneira. Vamos a seguir apenas exibir estes formulários já prontos para você ter uma idéia :

Os formulários  : frmlocalizacao, frmaparelhos, frmusuarios , frmmetas possuem o mesmo código e não vou perder tempo com eles. Vou me ater ao formulário frmconsumo onde registramos os dados para calcular o consumo mensal.

Quarta Etapa - Criando o formulário para o cálculo do consumo

Ao criar o formulário frmconsumo usando o Data Form Wizard você vai perceber que os campos vinculados aos dados que desejamos exibir serão caixas de texto onde teremos apenas números referentes aos campos : codigousuario , codigolocalizacao, codigoaparelho . Os dados relacionados a esses campos estão nas respectivas tabelas : usuarios, localizacao e aparelhos. Ficamos então com o dilema - Eu não posso deixar a coisa desse jeito , pois o usuário irá ver somente os códigos ficando difícil trabalhar deste jeito. Como contornar o problema ?  Usando o controle DataCombo vinculado a um ADO Data Control..

Eu vou mostrar como fazer isto para o campo codigoaparelho.(depois o resto você faz por analogia) . Vamos lá...

  1. Exclua a caixa de texto criada com o Data Form Wizard e no seu lugar insira um controle DataCombo

  2. A seguir insira um controle Adodc - adodc4 -  que será vinculado ao DataCombo e a tabelas aparelhos.

  3. Desejamos obter o seguinte resultado: O usuário deverá ver o nome dos aparelhos na combo e não o seu código . Quando o usuário selecionar um aparelho e gravar , o código será gravado na tabela correspondente.

  4. Clique com o botão direito do mouse sobre o adodc; em ADODC Properties selecione a opção Build em Property pages

  5. Selecione o Provedor Microsoft Jet 4.0 OLE DB Provider e clique em Avancar >>>

  6. Insira o nome do nosso banco de dados - apagao.mdb em c:\teste e clique em OK

  7. Na aba RecordSource escolha  2- adCmdTable e a seguir escolha a tabela Aparelhos

  8. Lembre-se que a esta altura você já deve ter um adodc no seu projeto vinculado a tabela  Consumo

  9. Agora Selecione o controle DataCombo , vamos configurá-lo:

Como você quer preencher o combo com o nome dos aparelhos devemos ter como a fonte de preenchimento da combo a tabela aparelhos que esta vinculada ao adodc4, deverá definir as propriedades RowSource e ListField assim:

  1. RowSource - Adodc4 (o ado data control que esta vinculado a tabela aparelhos)

  2. ListField - aparelho (o nome do aparelho na tabela aparelhos)

Agora temos que definir em qual tabela e controle vamos gravar os dados . Para isto devemos definir as propriedades : DataSource e DataField e BoundColumn assim:

  1. DataSource - ADODC1 - ( o controle vinculado a tabela consumo que iremos atualizar )

  2. DataField - CodigoAparelho - ( o campo que vamos atualizar )

  3. BoundColumn - o campo que iremos usar para atualizar a tabela consumo.

Com isto passamos para o controle vinculado ADO data controle e DataCombo todo o processo de atualização quando o usuário escolher um aparelho. Ele irá gravar o código do aparelho na tabela consumo.

Você deve fazer o mesmo para os campos : codigousuario, codigolocalizacao. Só vai mudar o nome das tabelas e dos campos o raciocínio é sempre o mesmo.

Quinta Etapa - Construindo o Grid para exibir os dados inseridos

A idéia é a seguinte: 

Veja abaixo um exemplo do sistema já em funcionamento:

Para obter este efeito usamos um controle ADO Datagrid vinculado a um controle ADO data control (adodc5). Assim :

SELECT Consumo.CodigoConsumo AS Cod, Localizacao.Descricao AS [Local], Aparelhos.aparelho AS Aparelho, [consumo].[tempouso]*[consumo].[quantidade]*[consumo].[diasuso]*([aparelhos].[potencia]/1000) AS Consumo
FROM Localizacao INNER JOIN (Aparelhos INNER JOIN Consumo ON Aparelhos.codigoAparelho = Consumo.CodigoAparelho) ON Localizacao.CodigoLocalizacao = Consumo.CodigoLocalizacao;

Obs: Para pode usar esta instrução definimos CommandType = adCmdText

Ela basicamente faz tudo , inclusive calcula o consumo mensal por aparelho e exibe no grid. Gostou...?

Bem e a totalização ? Como vamos totalizar a coluna consumo mensal por aparelho para ter o consumo geral do mês ?

Novamente vamos usar um controle vinculado ado data control(adodc6)  com uma instrução SQL . A instrução é a seguinte:

SELECT Sum([totalconsumo]) AS Total
FROM Localizacao INNER JOIN (Aparelhos INNER JOIN Consumo ON Aparelhos.codigoAparelho = Consumo.CodigoAparelho) ON Localizacao.CodigoLocalizacao = Consumo.CodigoLocalizacao;

Aqui estamos usando a função agregada SUM para somar as colunas TotalConsumo da tabela Consumo.

A rotina que exibe o valor na label (lbltotalconsumomensal) é a seguinte:

Private Sub calcula_consumo_total()
adodctotal.RecordSource = "SELECT Sum([totalconsumo]) AS Total FROM Localizacao INNER JOIN (Aparelhos INNER JOIN  Consumo ON Aparelhos.codigoAparelho = Consumo.CodigoAparelho) ON Localizacao.CodigoLocalizacao =  Consumo.CodigoLocalizacao;"
  adodctotal.Refresh
End Sub

O valor é exibido definindo as propriedades DataSource=adodc5 e DataField=totalconsumo da label.

A mesma coisa fazemos para exibir o valor da meta . Vinculamos um adodc(adodcmeta) 'a tabela meta e definimos a propriedade RecordSource com a seguinte instrução SQL:

Select ValorMeta From Meta

Para exibir o valor na label(lblmeta) , novamente definimos as propriedades  DataSource=adodcmeta e DataField=ValorMeta da label e pronto !

Bem , creio que o resto das rotinas (inclusão , exclusão , etc..) são detalhes menores com o qual não vou perder tempo. 

Boa noite e bom proveito   


Copyright (c) 2001 - José Carlos Macoratti