PROJECTO COM ADO
4.º PASSO – PROGRAMAÇÃO DO CAMPO ‘DISTRITO’:
Deverá ser apresentada uma caixa de combinação para auxiliar o utilizador a escolher o distrito de residência do entrevistado. 1)
Abra o formulário em vista de estrutura; 2)
No separador ‘RECOLHA’, desenhe uma caixa de combinação: FIGURA 8.15 – ComboBox para o preenchimento do campo ‘Distrito’ 3)
Altere a propriedade Name (Nome) da caixa de combinação para ‘cboDistrito’; 4)
Altere a propriedade Row Source (Origem de Linha) para ‘Distritos’. Esta opção permite adicionar os itens de lista conforme a informação contida na tabela de distritos; 5)
Sempre que o formulário é reiniciado, deve ocorrer uma limpeza da caixa de combinação. Inclua uma chamada ao procedimento ‘Limpar’ no evento Load do formulário: Private Sub Form_Load()
Limpar
Inicializar_Variáveis
Contar_Registos
Actualizar_Amostra
End Sub
6)
O procedimento ‘Limpar’ contém, por enquanto, apenas uma instrução. Crie este procedimento no módulo de formulário: Sub Limpar()
cboDistrito = ""
End Sub
© FCA – Editora de Informática
393
ACCESS MACROS & VBA – CURSO COMPLETO
7)
Guarde o formulário e execute‐o; ao estender a caixa de combinação, deverão surgir todos os distritos de Portugal Continental, ordenados alfabeticamente como na figura: FIGURA 8.16 – Carregamento automático da caixa de combinação ‘cboDistrito’ 8)
Volte à estrutura do formulário. 5.º PASSO – PROGRAMAÇÃO DO CAMPO ‘CONCELHO’:
394
Sempre que ocorrem alterações na caixa de combinação ‘cboDistrito’, uma caixa de listagem referente ao campo ‘Concelho’ é actualizada, mostrando os nomes dos concelhos pertencentes ao distrito que o utilizador escolheu. 1)
Adicione uma caixa de listagem à direita da caixa de combinação como na figura: FIGURA 8.17 – Desenho de uma ListBox para a selecção do concelho 2)
Altere o valor da propriedade Name (Nome) da caixa de listagem para ‘lstConcelho’; © FCA – Editora de Informática
PROJECTO COM ADO
3)
Programe o evento BeforeUpdate do controlo ‘cboDistrito’, invocando o procedimento ‘Actualizar_Concelhos’ de acordo com a seguinte listagem: Private Sub cboDistrito_BeforeUpdate(Cancel As Integer)
Actualizar_Concelhos
End Sub
4)
Crie o procedimento ‘Actualizar_Concelhos’ com as instruções seguintes: Sub Actualizar_Concelhos()
distrito = cboDistrito
varSQL = "SELECT Concelho FROM Concelhos WHERE distrito='" & _
distrito & "'"
lstConcelho.RowSource = varSQL
lstConcelho.Requery
End Sub
Na primeira instrução passou‐se o valor actual da caixa de combinação de distrito para a variável local ‘distrito’. Para utilizar valores de variáveis em cadeias de caracteres, devemos truncar a String em diversas partes, recorrendo à operação de concatenação, para que a variável não seja interpretada literalmente. Em VBA, é impossível utilizar‐se aspas dentro de aspas (daí a utilização das duas películas), no sentido de informar o SGBD que o valor da variável deve ser tido em conta como uma cadeia de caracteres (de facto, o campo ‘concelho’ está definido na tabela como sendo do tipo texto e é este o tipo de informação que a tabela precisa). Obtida a instrução SQL necessária para uma conveniente filtragem da tabela ‘Concelhos’, recorreu‐se, mais uma vez, à propriedade RowSource (desta feita através de código‐fonte), no sentido de informar o controlo que deve mostrar os itens de lista retornados pela query. O método Requery vai, por sua vez, enviar uma ”ordem” à ListBox para se auto‐actualizar com as novas definições pedidas pela ComboBox ‘Distrito’. 5)
Altere o procedimento ‘Limpar’ para que também a caixa de listagem seja limpa aquando da execução do formulário: Sub Limpar()
cboDistrito = ""
lstConcelho = ""
lstConcelho.RowSource = ""
© FCA – Editora de Informática
395
ACCESS MACROS & VBA – CURSO COMPLETO
lstConcelho.Requery
End Sub
6)
Guarde o formulário e execute‐o; 7)
Escolha o distrito de Coimbra. Deverão surgir apenas os concelhos pertencentes ao distrito seleccionado – ‘Arganil’, ‘Cantanhede’, ‘Coimbra’, ‘Condeixa‐a‐Nova’, etc.; 8)
Seleccione outro distrito (por exemplo ‘Faro’). Deverão surgir os concelhos de ‘Albufeira’, ‘Alcoutim’, ‘Aljezur’ e por aí diante (ver figura 8.18): 396
FIGURA 8.18 – Correspondência entre distritos e concelhos 9)
Regresse à estrutura do formulário. 6.º PASSO – PROGRAMAÇÃO DO CAMPO ‘PARTIDO’:
O campo ‘Partido’ representa a intenção do voto do entrevistado e deverá ser preenchido pelo utilizador por intermédio de controlos do tipo OptionButton. 1)
No separador ‘RECOLHA’, adicione uma Frame com quatro botões de opção e três imagens (controlos do tipo Image) correspondentes aos logótipos dos partidos políticos (ver figura 8.19): © FCA – Editora de Informática
PROJECTO COM ADO
FIGURA 8.19 – Desenho de um controlo Frame com botões de opção e imagens 2)
Altere a propriedade Name (Nome) da Frame para ‘fraPartido’; 3)
Certifique‐se que os valores das propriedades OptionValue (Valor da Opção) dos botões ‘PDI’, ‘UCIBER’, ‘PNF’ e ‘Não sabe/Não responde’ são ‘1’, ‘2’, ‘3’ e ‘4’, respectivamente; 4)
Sempre que o formulário é iniciado, deve ocorrer uma limpeza do campo ‘Partido’, isto é, nenhum dos botões de opção deve estar assinalado. Acrescente a seguinte instrução ao procedimento ‘Limpar’: Sub Limpar()
cboDistrito = ""
fraPartido = 0
End Sub
5)
Guarde o formulário e teste os botões de opção em run‐time (apenas um deles poderá permanecer seleccionado); 6)
Regresse à estrutura do formulário. © FCA – Editora de Informática
397
ACCESS MACROS & VBA – CURSO COMPLETO
7.º PASSO – ADICIONAR REGISTOS À TABELA:
A adição de registos é conseguida fazendo‐se clique num botão de comando standard e só pode ser levada a cabo no caso de todos os campos estarem preenchidos. Assim: 1)
Adicione um botão por baixo da caixa de listagem ‘lstConcelho’ e altere a propriedade Caption (Legenda) para ‘ADICIONAR’: FIGURA 8.20 – Inclusão de um CommandButton para a adição de registos 398
2)
Altere a propriedade Name (Nome) do botão de comando para ‘cmdAdicionar’; 3)
Programe o evento Click do botão da seguinte maneira: Private Sub cmdAdicionar_Click()
Adicionar_Registo
End Sub
4)
O procedimento ‘Adicionar_Registo’ é composto pelas instruções que se seguem: Sub Adicionar_Registo()
If cboDistrito = "" Then GoTo ErroDistrito
If lstConcelho = "" Then GoTo ErroConcelho
If fraPartido = 0 Then GoTo ErroPartido
amostra = CLng(lblAmostra.Caption)
concelho = lstConcelho
Select Case fraPartido
© FCA – Editora de Informática
PROJECTO COM ADO
Case 1
partido = "PDI"
Case 2
partido = "UCIBER"
Case 3
partido = "PNF"
Case 4
partido = "NENHUM"
End Select
varSQL = "INSERT INTO Dados VALUES(" & amostra & _
",'" & concelho & "','" & partido & "');"
rst.Open varSQL, con
Limpar
Inicializar_Variáveis
Contar_Registos
Actualizar_Amostra
DoCmd.GoToControl "cboDistrito"
399
Exit Sub
ErroDistrito:
MsgBox "Deve preencher o campo 'Distrito", vbExclamation
DoCmd.GoToControl "cboDistrito"
Exit Sub
ErroConcelho:
MsgBox "Deve preencher o campo 'Concelho'", vbExclamation
Exit Sub
ErroPartido:
MsgBox "Não foi indicada a intenção de voto!", vbCritical
End Sub
5)
Guarde o formulário e execute‐o; 6)
Sem seleccionar qualquer opção disponível, faça clique sobre o botão ‘ADICIONAR’. Deverá ocorrer o erro de validação referente ao campo ‘Distrito’; © FCA – Editora de Informática
ACCESS MACROS & VBA – CURSO COMPLETO
7)
Logo após o fecho da caixa de diálogo anterior, o cursor deve ficar posicionado no controlo ‘cboDistrito’; 8)
Preencha o campo ‘Distrito’ com o item ‘Braga’; 9)
Sem escolher um dos concelhos disponíveis na ListBox, faça clique sobre o botão ‘ADICIONAR’. Ocorrerá um erro devido ao não preenchimento do campo ‘Concelho’; 10) Escolha o concelho de Guimarães. Sem assinalar a intenção de voto, faça novamente clique sobre o botão ‘ADICIONAR’. Desta feita, ocorrerá um erro no campo ‘Partido’; 11) Escolha uma qualquer intenção de voto e tente adicionar o registo. Agora sim... É possível adicionar o registo, pois todos os campos foram devidamente preenchidos. O formulário é limpo e os rótulos ‘lblContador’ e ‘lblAmostra’ são actualizados sempre que um registo é adicionado com sucesso. O cursor do teclado regressa sempre à caixa de combinação ‘cboDistrito’; 12) Repita o mesmo procedimento até adicionar pelo menos 10 registos para cada um dos distritos. À medida que for recolhendo novos dados a partir do formulário, vá “espreitando” a tabela ‘Dados’ e verificando que os dois objectos continuam em perfeita sintonia: 400
FIGURA 8.21 – A tabela de recolha após a inserção de dados a partir do formulário 8.4
SEPARADOR ‘GRÁFICOS’
Neste segundo separador, o utilizador tem a possibilidade de visualizar graficamente a intenção de voto global ou por distrito. © FCA – Editora de Informática
PROJECTO COM ADO
1.º PASSO – PREPARAR O SISTEMA PARA A ESCOLHA DO MODO DE VISUALIZAÇÃO:
1)
No separador ‘GRÁFICOS’ desenhe uma caixa de combinação e uma caixa de verificação como na figura: FIGURA 8.22 – Controlos do separador ‘Gráficos’ 2)
Altere a propriedade Name (Nome) da caixa de combinação para ‘cboEscolhaDistrito’; 3)
Altere a propriedade Name (Nome) da caixa de verificação para ‘chkGlobal’; 4)
A caixa de combinação deve apresentar uma listagem de todos os distritos. Altere a propriedade Row Source (Origem de Linha) para ‘Distritos’; 5)
Acrescente as seguintes instruções ao procedimento ‘Limpar’ para limpar a caixa de combinação e desactivá‐la: Sub Limpar()
cboDistrito = ""
lstConcelho = ""
lstConcelho.RowSource = ""
lstConcelho.Requery
fraPartido = 0
cboEscolhaDistrito = ""
cboEscolhaDistrito.Enabled = False
chkGlobal = True
End Sub
6)
Se a caixa de verificação estiver assinalada, a caixa de combinação deverá aparecer desactivada, caso contrário deverá aparecer activada. Programe o evento BeforeUpdate da CheckBox da seguinte forma: © FCA – Editora de Informática
401
ACCESS MACROS & VBA – CURSO COMPLETO
Private Sub chkGlobal_BeforeUpdate(Cancel As Integer)
Modificar_ComboBox
End Sub
7)
O procedimento ‘Modificar_ComboBox’ consiste em limpar a caixa de combinação e activá‐la ou desactivá‐la consoante for o valor actual da caixa de verificação: Sub Modificar_ComboBox()
cboEscolhaDistrito = ""
If chkGlobal = True Then cboEscolhaDistrito.Enabled = False
If chkGlobal = False Then cboEscolhaDistrito.Enabled = True
End Sub
8)
Guarde a estrutura do formulário. 2.º PASSO – CRIAR RÓTULOS PARA APRESENTAR OS RESULTADOS PERCENTUAIS:
1)
Crie seis rótulos e um botão de comando como na figura 8.23: 402
FIGURA 8.23 – Desenho de rótulos contendo valores relativos de intenção de voto 2)
Altere os nomes dos três rótulos da direita para ‘lblPdi’, ‘lblUciber’ e ‘lblPnf’, na ordem especificada. 3)
Defina a propriedade Name (Nome) do botão como ‘cmdConsultar’; 4)
Programe o evento Click do botão ‘OK’: Private Sub cmdConsultar_Click()
If chkGlobal = True Then Consulta_Global
End Sub
© FCA – Editora de Informática
PROJECTO COM ADO
5)
O procedimento ‘Consulta_Global’ consiste nas seguintes instruções: Sub Consulta_Global()
varSQL = "SELECT Count(Amostra) FROM Dados WHERE Partido='PDI'"
rst.Open varSQL, con
pdi = rst.Fields(0)
rst.Close
varSQL = "SELECT Count(Amostra) FROM Dados WHERE Partido='UCIBER'"
rst.Open varSQL, con
uciber = rst.Fields(0)
rst.Close
varSQL = "SELECT Count(Amostra) FROM Dados WHERE Partido='PNF'"
rst.Open varSQL, con
pnf = rst.Fields(0)
rst.Close
total = pdi + uciber + pnf
lblPDI.Caption = Round((pdi / total) * 100, 2) & "%"
lblUciber.Caption = Round((uciber / total) * 100, 2) & "%"
lblPNF.Caption = Round((pnf / total) * 100, 2) & "%"
End Sub
6)
Se a caixa de verificação ‘chkGlobal’ não estiver assinalada, deve ser efectuado cálculo das percentagens para o distrito seleccionado. Altere o evento Click do botão ‘cmdConsultar’: Private Sub cmdConsultar_Click()
If chkGlobal = True Then Consulta_Global Else Consulta_Parcial
End Sub
7)
O procedimento ‘Consulta_Parcial’ é idêntico ao procedimento ‘Consulta_Global’, mudando apenas a instrução SQL necessária para a realização dos cálculos. O handler On Error foi utilizado para evitar a abertura de um Recordset quando o utilizador não selecciona devidamente o distrito da respectiva caixa: Sub Consulta_Parcial()
On Error GoTo Erro
distrito = cboEscolhaDistrito
© FCA – Editora de Informática
403
ACCESS MACROS & VBA – CURSO COMPLETO
varSQL = "SELECT Count(Amostra) FROM " & _
"Dados,Concelhos,Distritos WHERE Dados.Partido='PDI'" & _
" And Distritos.Distrito='" & distrito & "' And " & _
"Dados.Concelho = Concelhos.Concelho And " & _
"Distritos.Distrito=Concelhos.Distrito"
rst.Open varSQL, con
pdi = rst.Fields(0)
rst.Close
varSQL = "SELECT Count(Amostra) FROM " & _
"Dados,Concelhos,Distritos WHERE Dados.Partido='UCIBER'" & _
" And Distritos.Distrito='" & distrito & "' And " & _
"Dados.Concelho = Concelhos.Concelho And " & _
"Distritos.Distrito=Concelhos.Distrito"
rst.Open varSQL, con
uciber = rst.Fields(0)
rst.Close
404
varSQL = "SELECT Count(Amostra) " & _
" FROM Dados,Concelhos,Distritos WHERE " & _
"Dados.Partido='PNF' And Distritos.Distrito='" & _
distrito & "' And Dados.Concelho = Concelhos.Concelho" & _
" And Distritos.Distrito=Concelhos.Distrito"
rst.Open varSQL, con
pnf = rst.Fields(0)
rst.Close
total = pdi + uciber + pnf
lblPDI.Caption = Round((pdi / total) * 100, 2) & "%"
lblUciber.Caption = Round((uciber / total) * 100, 2) & "%"
lblPNF.Caption = Round((pnf / total) * 100, 2) & "%"
Exit Sub
Erro:
MsgBox "Preencha o campo 'Distrito'!"
Inicializar_Variáveis
End Sub
© FCA – Editora de Informática
Download

Páginas 393 a 404