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