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:
Calcular a meta
Cadastrar os Aparelhos - Nome , potência
Cadastrar a Localização - Descrição
Cadastrar o Usuário - Nome, endereço , cep , uf , telefone , email
Cadastrar o Consumo mensal
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:
Formulário de apresentação - frminicio
Cadastro de Usuários - frmusuarios
Cadastro de Localização - frmlocalizacao
Cadastro de Aparelhos - frmaparelhos
Cadastro do Consumo - frmconsumo
Cadastro da Meta - frmMeta
formulário do Menu Principal -MDIMenu
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() |
O que estamos fazendo ? Acompanhe :
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.
Carregamos então o formulário - frminicio.show
Damos um refresh no formulário - frminicio.refresh
Executamos um Doevents permitindo o processamento paralelo - Doevents
Chamamos a função para parar o processamento por 5 segundos
Descarregamos o formulário - frminicio
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á...
Exclua a caixa de texto criada com o Data Form Wizard e no seu lugar insira um controle DataCombo
A seguir insira um controle Adodc - adodc4 - que será vinculado ao DataCombo e a tabelas aparelhos.
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.
Clique com o botão direito do mouse sobre o adodc; em ADODC Properties selecione a opção Build em Property pages
Selecione o Provedor Microsoft Jet 4.0 OLE DB Provider e clique em Avancar >>>
Insira o nome do nosso banco de dados - apagao.mdb em c:\teste e clique em OK
Na aba RecordSource escolha 2- adCmdTable e a seguir escolha a tabela Aparelhos
Lembre-se que a esta altura você já deve ter um adodc no seu projeto vinculado a tabela Consumo
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:
RowSource - Adodc4 (o ado data control que esta vinculado a tabela aparelhos)
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:
DataSource - ADODC1 - ( o controle vinculado a tabela consumo que iremos atualizar )
DataField - CodigoAparelho - ( o campo que vamos atualizar )
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:
A medida que você for informando os dados referente ao seu consumo o sistema irá exibir os mesmos em um grid
Os dados básicos a exibir serão : Local , Aparelho e o Consumo mensal para este aparelho
Desejamos exibir um campo que nos indica qual o valor total do consumo mensal
O valor da meta também deve ser exibida para que possamos saber se excedemos ou não a mesma
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 :
Antes de tudo insira o controle DataGrid no formulário
Agora iremos definir as propriedades: Connectionstring e Recordsource
Na propriedade RecordSource nós iremos usar uma instrução SQL que reuna os dados das tabelas localização, consumo e aparelhos . Podemos usar o Access ou o VisData para montar a instrução. Eí-la a seguir
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