OBJECTIVOS Reconhecer alguns dos objectos VBA Automatizar bases de dados recorrendo à programação VBA e scripts SQL O objecto DOCMD Este objecto permite o acesso a todas as operações sobre todos os objectos de BD (filtragem, pesquisa e tratamento de dados, dos, execução de consultas de todos os tipos, navegação entre registos, automatização de formulários, impressão, etc.). Docmd contém apenas métodos na sua definição, cujo lote de comandos se refere às acções disponibilizadas pelas macros não programadas do Access. Método Quit - Este método termina a aplicação. Exemplo: Docmd.quit Método RunSql - Executa uma consulta de acção ou de definição de dados por especificação de uma instrução SQL. Exemplo: DoCmd.RunSQL "delete from clientes where nome='" & txtnome & "' and bi=" & txtbi executa a query delete. Método OpenForm - Abre o formulário com determinado nome. Exemplo: docm.openform verclientes abre o formulário verclientes. Método Close - Fecha um determinado objecto de BD com um nome específico. Exemplos: docmd.close fecha a janela actual O objecto ADODB Com o VBA, o programador pode gerir quando e como uma aplicação interage com uma BD, mais especificamente com os seus objectos. O modelo de programação ADO é constituído por uma biblioteca de objectos que proporciona toda a gestão e acesso a um SGBD. A tabela seguinte apresenta a listagem dos objectos e colecções mais importantes, definidos na biblioteca de objectos ADO: OBJECTO DESCRIÇÃO Recordset Conjunto de registos retornados por uma origem de dados ou query. Field Corresponde a uma coluna (campo) num objecto recordset Fields Colecção contendo todas as colunas de um objecto recordset. Connection Representa uma ligação a uma BD 1
A aplicação a ser construída consiste numa base de dados onde vão ser registadas as encomendas efectuadas, os clientes e os fornecedores. Para este exemplo vamos precisar de criar a tabela clientes com os seguintes campos: Esta tabela deve ser preenchida com os seguintes registos: Da tabela fornecedores com os seguintes campos e registos: E a tabela encomendas com os seguintes campos e registos: 2
Na vista de estrutura crie ainda um formulário semelhante ao seguinte. Deve guardá-lo com o nome formclientes. 1 2 3 4 Fig. Formulário FormClientes 1. Caixa de texto com o nome txt_pesquisa. 2. Botão com o nome cmd_pesquisa. Nota: As caixas de listagem são constituídas por rótulo e a caixa onde vai surgir a lista de dados. Altere o texto dos rótulos como mostrado na imagem e em cada lista deve apenas alterar, nas propriedades, o nome. Deve ainda alterar nas propriedades das caixas de listagem no separador dados a propriedade tipo de origem da linha para lista de valores, uma vez que a caixa vai ser preenchida por linhas resultantes de uma consulta à tabela. 3. Caixa de listagem com o nome lst_clientes 4. Caixa de listagem com o nome lst_pesquisa_clientes O objectivo agora é que a primeira lista (lst_clientes) seja preenchida automaticamente com os nomes dos clientes que se encontram na tabela clientes. Como esta acção vai ocorrer orrer quando o formulário é carregado, vai acontecer no evento Form_Load. Para aceder ao editor de código vba clique com o botão direito no formclientes (em vista de estrutura) e aceda à opção construir evento > construtor de código. Possivelmente vai-lhe surgir o método Detalhe_Click e não o Form_Load. 3
1 2 Em 1 altera-se o nome do objecto e em 2 o evento a ele associado. Altere em 1 Detalhe para Form que automaticamente surge o evento Form_Load. Como vamos necessitar do objecto ADO deve adicionar a biblioteca Microsoft ActiveX Data Objects 2.7 Library à sua base de dados. Para adicionar a biblioteca clique no menu Tools >References Localize a biblioteca, seleccione e por fim clique em OK. No evento form_load vai ser estabelecida a ligação à tabela, vai ser criado um registo que vai guardar o resultado do select efectuado à tabela clientes e por fim cada registo vai ser adicionado à lista. 4
O código para este evento vai ser o seguinte: Neste caso vamos precisar de usar um ciclo While para percorrer as linhas da tabela e em seguida preencher a caixa de listagem. A sintaxe da estrutura de repetição While é a seguinte: While condição Wend Bloco de instruções Fig Programação do evento Form_Load Programação do evento Form_Load() - Explicação do código linha a linha Nota: Os comentários em VBA são feitos utilizando o apóstrofe. Dim ligacao As ADODB.Connection a variável ligação vai conter a ligação à tabela da BD Dim registo As ADODB.Recordset a variável registo vai guardar cada linha e coluna resultante do select efectuado à tabela clientes. Dim sql As String a variável sql vai conter o código sql de consulta à tabela clientes. Set ligacao = CurrentProject.Connection inicializar a variável ligacao com a ligação ao projecto corrente Set registo= New ADODB.Recordset inicializar a variável registo como um novo conjunto de registos sql = "select nome from clientes order by nome" seleccionar apenas o campo nome, da tabela clientes e ordenar registo.open sql, ligacao preenchimento do registo com o total de linhas da tabela clientes. While Not registo.eof a tabela vai ser percorrida linha a linha e enquanto não chegarmos ao fim da linha(registo.eof) as duas linhas de código seguintes vão ser executadas lst_clientes.additem registo!nome adicionar o campo nome da variável registo (registo!nome) à lista lst_clientes. 5
registo.movenext mudança para a próxima linha da tabela Wend fim do ciclo while End Sub O próximo passo vai ser programar o botão OK (cmd_pesquisa). O que se pretende é que ao clicar ele seleccione da tabela clientes todos os nomes começados pela letra que coloca na caixa de texto. A lista de nomes encontrada vai preencher a caixa de listagem lst_pesquisa_clientes. O código do evento cmd_pesquisa_click vai ser o seguinte: Fig Programação do evento cmd_pesquisa_click Vamos utilizar a estrutura de decisão if para que, no caso da consulta à base de dados não devolver valores, a caixa de listagem seja preenchida com o texto Não existem resultados A estrutura if avalia a condição especificada e, se a mesma for verdadeira, executa determinada instrução ou conjunto de instruções; se for falsa, executa uma instrução ou bloco de instruções diferente do anterior. Sintaxe: If condição then utilizamos no caso de ser preciso executar apenas um bloco de instruções. If condição then end if quando é necessário executar ecutar um bloco de instruções. If condição then.else. end if a condição é testada, se for verdadeira executa o bloco de instruções após o then, senão executa o bloco de instruções depois de else. Programação do evento cmd_pesquisa_click- Explicação do código linha a linha Private Sub cmd_pesquisa_click() criação e inicialização das variáveis registo,ligação e sql cuja função já foi explicada anteriormente. Dim registo As ADODB.Recordset Dim ligacao As ADODB.Connection 6
Dim sql As String Set ligacao = CurrentProject.Connection Set registo = New ADODB.Recordset seleccionar todos os campos e registos da tabela clientes onde o nome começa pela letra colocada na caixa txt_pesquisa. sql = "select * from clientes where nome like '" & txt_pesquisa & "%'" preenchimento do registo com o total de linhas da tabela clientes. registo.open sql, ligacao limpamos a caixa de listagem para não ficar com os valores da pesquisa anterior lst_pesquisa_clientes.rowsource = "" enquanto não chegar ao fim da tabela While Not registo.eof mostra = registo!nome guardar campo nome na variável mostra lst_pesquisa_clientes.additem registo!nome adicionar linha com o campo nome à caixa de listagem registo.movenext passar para o registo seguinte Wend fim do ciclo while txt_pesquisa = "" limpar a caixa de texto txt_pesquisa If mostra = "" Then se a variável mostra estiver vazia a caixa de listagem é preenchida com o texto Não existem resultados... lst_pesquisa_clientes.additem "Não existem resultados..." End If fim do if End Sub Coloque ainda no formulário o seguinte grupo de opções, caixas de texto e botão: 1 2 3 4 1. Caixa de texto txtnome Fig. Formulário listaclientes 7
2. Caixa de texto txtbi 3. Caixa de texto txtnif 4. Botão cmd_editarcliente Altere as propriedades de caixas de texto para que fiquem desactivas, para isso coloque a propriedade activado igual a não (separador dados). Vamos agora programar a caixa de listagem lst_pesquisa_clientes quando ocorre o evento click. Ao clicar numa das opções da lista os dados das caixas de texto(txtnome, txtbi e txtnif) vão ser automaticamente preenchidos. Esta acção só é efectuada caso a opção seleccionada seja diferente de Não existem resultados O código para o evento lst_pesquisa_clientes_click é o seguinte: Elabore o seguinte formulário que deve guardar com o nome verclientes. 3 1 2 4 5 6 Formulário verclientes Altere os nomes de cada caixa de texto e botão para os seguintes: 1. Caixa de texto txtnome 2. Caixa de texto txtbi 3. Caixa de texto txtnif 4. Botão cmd_editarc 5. Botão cmd_eliminar 6. Botão o cmd_fechar 8
O botão fechar apenas fecha o formulário e o código é o seguinte: O botão editar permite registar as alterações, na tabela clientes, efectuadas nos campos do formulário onde o bi corresponda ao bi apresentado. O código vai ser o seguinte: O botão eliminar vai eliminar o registo corrente da tabela. Caso seleccione sim na caixa de mensagens, o registo é eliminado e surge a mensagem o cliente nome_d_cliente foi eliminado!, caso contrário o registo mantém-se. Programação do evento cmd_eliminar_click- Explicação do código linha a linha Private Sub cmd_eliminar_click() msg = MsgBox("Tem a certeza que pretende eliminar?", vbquestion + vbyesnocancel) o resultado da opção escolhida (botão sim/não/cancelar) na caixa de mensagem vai ser guardado na variável msg. DoCmd.SetWarnings False retirar os avisos mostrados pelo access If msg = vbyes Then se clicar no botão sim (vbyes) elimina da tabela clients o registo que está a ser mostrado DoCmd.RunSQL "delete from clientes where nome='" & txtnome & "' and bi=" & txtbi mostra a caixa de mensagem com o texto O cliente nome_do_cliente foi eliminado! MsgBox "O cliente " & txtnome & " foi eliminado!" End If End Sub 9
EXERCÍCIO PROGRAMAÇÃO DO FORMULÁRIO ENCOMENDAS Para este exemplo vai ser necessário importar os seguintes objectos da base de dados Sql e VBA exemplo: formulários encomendas, verclientes e verfornecedores e tabela encomendas. Verifique se os seguintes registos se encontram na tabela clientes. Verifique ainda se os seguintes registos se encontram na tabela fornecedores. A tabela encomendas encontra-se organizada do seguinte modo: 10
No formulário encomendas coloque os nomes nos controlos como se apresenta em seguida (atenção que o texto apresentado só irá surgir depois de programar cada objecto): 1 2 3 4 5 6 7 8 1. Caixa de listagem lst_encomenda; 2. Caixa de texto txt_encomenda; 3. Caixa de texto txt_fornecedor; 4. Caixa de texto txt_cliente; ; 5. Caixa de texto txt_valor; 6. Caixa de texto txt_data. 7. Botão cmd_verf; 8. Botão cmd_verc; Vamos então passar à programação dos objectos do formulário. a. A caixa de listagem lst_encomendas deve ser preenchida, logo quando o formulário for carregado, com o código de cada encomenda. b. Quando uma encomenda é seleccionada (ao clicar na lista lst_encomendas) as caixas de texto dos dados da encomenda são automaticamente preenchidas. c. O botão verfornecedores vai abrir o formulário verfornecedor com os dados do fornecedor que corresponde aquela encomenda. 11
d. O botão ver Cliente vai abrir o formulário verclientes com os dados do cliente que corresponde aquela encomenda. e. No formulário dos fornecedores deve programar o botão fechar para fechar o formulário e o botão remover para remover o registo. Quando clica em remover apenas deve surgir uma msgbox com o texto Tem a certeza que pretende eliminar o cliente?. Se clicar em sim remove e mostra a mensagem o cliente Maria foi eliminado com sucesso!, caso contrário mantém o registo. 12