A
ACCCCEESSSS22001133MMAACCRROOSS&&VVBBAA––CCUURRSSOOCCOOMMPPLLEETTOO
14
Por exemplo, numa escola, se um aluno só pudesse estar inscrito numa única turma, estaríamos perante uma relação do tipo 1-1; em contrapartida, se um aluno se pudesse inscrever em várias turmas, estaríamos perante uma relação do tipo N-N.
No exemplo da loja de computadores, temos três relações de dois tipos (uma do tipo N-N e duas do tipo 1-N):
A relação ‘Produtos’ – ‘Encomendas’ é do tipo N-N (vários produtos para diversas encomendas);
A relação ‘Fornecedores’ – ‘Encomendas’ é do tipo 1-N (um fornecedor pode ser solicitado por diversas vezes e uma encomenda só faz referência a um fornecedor);
A relação ‘Distritos’ – ‘Fornecedores’ é do tipo 1-N (um distrito pode acolher vários fornecedores e um fornecedor tem sede num único distrito).
Em diagramas ER, o tipo de relação é assinalado no interior de losângulos, como na Figura 1.3.
F
FIIGGUURRAA 11..33 ––Indicação dos tipos de relações num diagrama ER
1.4.4 FFAASSEEIIVV:: DDEEFFIINNIIRR AATTRRIIBBUUTTOOSS
Os atributos representam propriedades elementares e definem os valores associa-dos a cada ocorrência das entidades. Por exemplo, as pessoas têm idade, altura, peso; os veículos automóveis têm cor, cilindrada, número de portas. Um identificador é um atri-buto ou grupo de atriatri-butos que determinam univocamente uma entidade (chave).
A Tabela 1.9 apresenta os atributos das entidades envolvidas no processo de encomendas.
ENCOMENDAS FORNECEDORES
PRODUTOS DISTRITOS
1-N
U
UTTIILLIIZZAAÇÇÃÃOODDAASSQQLL 75
F
FIIGGUURRAA 22..5577 ––Esquema relacional completo R
REESSOOLLUUÇÇÃÃOO((PPOONNTTOO22))
Para obter uma listagem dos professores que lecionam mais de uma turma: 1) Crie uma consulta em vista de SQL e componha a instrução seguinte:
SELECT Professores.P, Professores.Prof, COUNT(Turmas.T) AS Contagem
FROM Professores INNER JOIN Turmas
ON Professores.P=Turmas.P GROUP BY Professores.P, Professores.Prof HAVING COUNT(Turmas.T)>1
2) Guarde a consulta com o nome ProfessoresComVariasTurmas;
3) Ao executar a consulta, obtém duas linhas de retorno – de facto, os professo-res Rui Lopes e Ana Sá monitorizam duas turmas cada (Figura 2.58);
F
FIIGGUURRAA 22..5588 ––Lista de monitores com mais de uma turma
4) Feche a consulta.
R
REESSOOLLUUÇÇÃÃOO((PPOONNTTOO33))
Para determinar o número total de turmas:
1) Crie uma consulta em vista de SQL e digite a seguinte instrução:
A
ACCCCEESSSS22001133MMAACCRROOSS&&VVBBAA––CCUURRSSOOCCOOMMPPLLEETTOO
108
3.5.3 BBOOMMDDIIAA EE BBOOAANNOOIITTEE
Crie uma macro capaz de mostrar o texto ”Bom dia!”, se a hora atual estiver compreendida entre as 7:00 e as 19:00, e o texto “Boa noite!”, no caso inverso. Recorra à ação MessageBox(CaixaDeMensagem).
R
REESSOOLLUUÇÇÃÃOO
1) Crie uma macro na base de dados utilizada nos dois exercícios anteriores; 2) Na janela de estruturação da macro, estabeleça as duas expressões
condi-cionais If (Se) e as respetivas ações MessageBox(CaixaDeMensagem), exata-mente como na Figura 3.12;
F
FIIGGUURRAA 33..1122 ––Utilização de condições em macros
3) Guarde a macro com o nome DiaNoite; 4) Feche a estrutura da macro;
5) Execute a macro;
6) Mediante a hora atualmente definida no sistema operativo, deverá surgir a caixa de diálogo com a mensagem correspondente.
A
ACCCCEESSSS22001133MMAACCRROOSS&&VVBBAA––CCUURRSSOOCCOOMMPPLLEETTOO
126
4.2.5 RREEPPEETTIIÇÇÕÕEESSEEMMNNÚÚMMEERROO IINNDDEETTEERRMMIINNAADDOO
Nos casos em que se torna percetível a necessidade de reexecução de instruções, mas não se sabe o número de vezes que determinado ciclo deve ser consumado, recorre- -se às operações de repetição em número indeterminado. Um problema clássico cuja resolução contenha este método é aquele que, dado um número inteiro superior à unidade, determina o seu fatorial27. A representação (em linguagem natural) de um
algo-ritmo para determinar o fatorial de um número consiste nos passos que se seguem: 1) Introdução de um número inteiro superior a 1 por parte do utilizador; 2) O primeiro fator da multiplicação é o próprio número;
3) Enquanto não se chegar à unidade…
→ O próximo fator é decrementado em uma unidade; → É efetuado o produto correspondente.
4) Apresentação do fatorial.
O respetivo fluxograma encontra-se disposto na Figura 4.9.
F
FIIGGUURRAA 44..99 ––Fatorial de um número (fluxograma)
Em pseudocódigo, obtém-se a listagem que se segue:
Start 'Início do programa
Input n 'Introdução de um número inteiro superior a 1 fat = n 'O primeiro fator é igual ao próprio número While n > 1 'Enquanto não se chegar à unidade…
n = n – 1 'Decremento do fator
27 O fatorial de um número inteiro n corresponde ao produto dos números inteiros desde 1 até n; é
representado por um ponto de exclamação (!) precedido do número para o qual se pretende determinar o seu fatorial; por exemplo, 5! = 5x4x3x2x1 5! = 120.
SIM NÃO INÍCIO FIM N N>1 FAT = FAT * N FAT = N N = N - 1 FAT
A
ARRQQUUIITTEETTUURRAAVVBBAA 159
O posicionamento e as dimensões escolhidas nesta fase não são definitivos. Para redimen-sionar o objeto, pode utilizar um dos quadrados que o delimitam e, para alterar a sua localização no formulário, deve arrastá-lo até à posição pretendida.
Tal como já foi enunciado, todos os objetos contêm propriedades predefinidas que podem ser alteradas mediante as preferências do programador. Quando terminámos o desenho do nosso objeto, o Access encarregou-se de escrever o texto “Command0” na sua face. Como modificá-lo?
O processo para modificar qualquer característica de determinado controlo em modo de desenho é o seguinte:
1) Selecione o objeto em causa, fazendo clique com o botão esquerdo do rato sobre o mesmo. Verificamos facilmente que o controlo está selecionado através dos quadrados a cheio que o circundam;
2) Faça clique com o botão direito do rato sobre o objeto a ser modificado. Do menu de contexto, escolha a opção Properties(Propriedades);
Pode também fazer clique sobre o botão Property Sheet(Folha de Propriedades), disponí-vel na secção Tools(Ferramentas), ou recorrer à combinação de teclas <Alt + Enter>.
3) Surge a Property Sheet (Folha de Propriedades). Esta janela apresenta uma listagem das propriedades e respetivos valores para os objetos presentemen-te selecionados (Figura 5.6).
F
FIIGGUURRAA 55..66 ––Componentes da Property Sheet (Folha de Propriedades)
Na Property Sheet (Folha de Propriedades), pode encontrar as secções que apresentamos no Quadro 5.2.
Separadores
Tipo de objeto Caixa do objeto
F
FUUNNÇÇÕÕEESSDDOOVVBBAA 227
F
FIIGGUURRAA 66..66 ––Valores retornados pela função MsgBox (exemplo)
6.2.2 FFUUNNÇÇÃÃOO IINNPPUUTTBBOOXX
A função InputBox apresenta no ecrã uma caixa de mensagem padrão de sistema operativo que serve para recolher informações do utilizador na forma de texto. São utili-zados os argumentos apresentados na Tabela 6.6.
NOME DESCRIÇÃO OBRIGATÓRIO? TIPO
Prompt Mensagem a ser apresentada na caixa. Sim String Title Texto da barra de título da janela. O texto
prede-finido é “Microsoft Access”. Não String Default Texto predefinido na caixa de introdução. Não String
XPos
Expressão numérica que especifica, em medidas de ecrã (twips), a distância horizontal entre a extremi-dade esquerda da caixa de diálogo e o limite esquerdo do ecrã. Se este argumento for omitido, a caixa é centrada na horizontal.
Não Number
YPos
Especifica a distância vertical entre o topo da caixa de diálogo e o topo do ecrã. Se este argumento for omitido, a caixa é centrada na vertical.
Não Number Helpfile Aponta para determinado ficheiro de ajuda. Não String Context Número correspondente ao tópico de ajuda para o
qual o utilizador será direcionado. Não Number
T
O
OBBJJEETTOOSSDDOOAACCCCEESSSS 285
17) Feche o Access; 18) Feche o Word.
Apenas pode executar este procedimento uma única vez, pois, caso o ficheiro já exista, o Access não consegue, por si só, eliminá-lo do sistema de ficheiros para dar origem a um novo. Se for o caso, o leitor obtém um erro em tempo de execução, com indicação de que já existe uma base de dados com o mesmo nome. Neste caso, a aplicação Access, apesar de invisível, continua a ser executada e deverá recorrer-se à combinação de teclas <Ctrl + Alt + Del> para forçar o encerramento da aplicação e terminar todos os processos a ela referentes.
A
ANNÁÁLLIISSEE((IINNSSTTRRUUÇÇÃÃOOAAIINNSSTTRRUUÇÇÃÃOO))
Para além das respetivas declarações e inicializações da variável e da constante globais, foi criado o procedimento TesteAccess para executar a tarefa:
Dim appAccess As Object – visa a declaração da variável-objeto, que irá funcionar como um apontador para a aplicação Access;
Const fich As String = "C:\Curso\MacroWord.accdb" – permite
declarar uma constante correspondente ao caminho completo do ficheiro de base de dados a ser criado e posteriormente aberto;
Set appAccess = CreateObject("Access.Application") – instrução que corresponde à inicialização do objeto Application da biblioteca de Access. A partir deste instante, o Access é inicializado (sem abrir qualquer base de dados) e permanece na memória do computador enquanto a variável-objeto
appAccess não for destruída ou redefinida com futuras atribuições Set;
appAccess.NewCurrentDatabase fich– o método NewCurrentDatabase do objeto Application permite criar um novo ficheiro de base de dados (esse ficheiro é criado com o nome MacroWord e com extensão accdb);
appAccess.CreateForm fich– o método CreateForm do objeto Application cria um formulário vazio no ficheiro especificado;
Não é necessário especificar o nome da base de dados quando se pretende criar um formulário no ficheiro atual.
appAccess.DoCmd.Save acForm, "Form1" – recorreu-se ao método Save do objeto DoCmd (descendente direto do objeto Application) que, neste caso, guarda o formulário com o nome Form1;
appAccess.CreateControl "Form1", acTextBox, acDetail – o método
CreateControl do objeto Application adiciona um controlo ao formulário ou
A
AUUTTOOMMAATTIIZZAAÇÇÃÃOODDEEFFOORRMMUULLÁÁRRIIOOSS 295
8.2.2 TTEEXXTTBBOOXX((CCAAIIXXAADDEE TTEEXXTTOO))
Controlo que obtém informações do utilizador sob a forma de texto. Estas caixas podem ser configuradas de forma a validarem a informação introduzida, antes de o programa levar a cabo determinada tarefa. Podemos, ainda, estabelecer o número de carateres (mínimo e máximo) e definir uma máscara de introdução (expressão que limita o tipo de caráter, posição a posição). Normalmente, as caixas de texto apresentam rótulos à sua esquerda, na intenção de elucidar o utilizador acerca da categoria de informação a ser digitada. Em Access, sempre que se desenha uma caixa de texto surge um controlo associado (rótulo) à sua esquerda. O formulário da Figura 8.4 contém três caixas de texto, que obtêm o nome, a idade e a profissão de um cliente de uma agência de seguros.
F
FIIGGUURRAA 88..44 ––Apresentação de caixas de texto
8.2.3 OOPPTTIIOONNGGRROOUUPP((GGRRUUPPOODDEE OOPPÇÇÕÕEESS))
Em formulários mais complexos, é comum utilizar-se este tipo de controlos no sentido de agrupar um conjunto vasto de informações em diferentes categorias. Para além de tornar o formulário mais explícito, é um contributo de mais-valia para melhorar a apresentação e estética do mesmo. O formulário apresentado na Figura 8.5 encontra-se dividido em três secções com informações diferentes: os dados pessoais de um cliente de um banco, o sexo e a sua nacionalidade. Repare-se que foi possível selecionar dois botões de opção no mesmo ecrã, isto porque ambos se encontram em secções diferentes (outra funcionalidade importante dos grupos de opção).
F
M
MOODDEELLOODDAAOO 367 9.8.4 PPEESSQQUUIISSAADDEERREEGGIISSTTOOSS((MMÉÉTTOODDOOSS FFIINNDD))
A Tabela 9.4 apresenta os quatro métodos utilizados na pesquisa de registos.
MÉTODO INICIA A PESQUISA A PARTIR DO… NA DIREÇÃO DO…
FindFirst Primeiro registo. Último registo. FindLast Último registo. Primeiro registo. FindPrevious Registo atual. Primeiro registo. FindNext Registo atual. Último registo.
T
TAABBEELLAA 99..44 ––Métodos utilizados na pesquisa de registos (objeto Recordset) E EXXEEMMPPLLOO Sub PesquisarRegistos() Dim db As Database Dim rst As Recordset Dim fld As Field Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM CLIENTES") rst.FindFirst "Idade Between 30 And 40"
For Each fld In rst.Fields
texto = texto & fld.Value & " " Next
Debug.Print texto texto = Empty
rst.FindLast "Idade Between 30 And 40" For Each fld In rst.Fields
texto = texto & fld.Value & " " Next
Debug.Print texto End Sub
A ANNÁÁLLIISSEE
Como podemos constatar pelo resultado obtido, o primeiro cliente com idade compreendida entre 30 e 40 anos é a Ana (cliente 1) e o último cliente nessa faixa etária é o José (cliente 2):
A
ACCCCEESSSS22001133MMAACCRROOSS&&VVBBAA––CCUURRSSOOCCOOMMPPLLEETTOO
412
10.5
M
M
A
A
N
N
I
I
P
P
U
U
L
L
A
A
Ç
Ç
Ã
Ã
O
O
E
E
P
P
E
E
S
S
Q
Q
U
U
I
I
S
S
A
A
D
D
E
E
D
D
A
A
D
D
O
O
S
S
Tal como no modelo DAO, é o objeto Recordset que irá permitir consultar e manipular a informação contida na base de dados.
Os exemplos que se seguem utilizam a tabela Clientes como referência, que foi criada na secção 9.8 do Capítulo 9. Importe esta tabela para o ficheiro de base de dados atual através do assistente de importação de dados do Acccess [botão Access disponível no separador External Data(Dados Externos)].
10.5.1 OOBBTTEENNÇÇÃÃOODDEE RREECCOORRDDSSEETTSS
O objeto Command representa um comando a ser executado diretamente na origem de dados. A maior parte destes comandos surge na forma de instruções de SQL que permitem obter, alterar, adicionar e eliminar registos, ou até alterar o próprio esquema da base de dados. O método Execute do objeto Command é similar ao método OpenRecordset utilizado no DAO para obtenção de objetos do tipo Recordset.
E EXXEEMMPPLLOO
Sub ObterRecordset()
Dim con As ADODB.Connection Dim cmd As ADODB.Command Dim rst As ADODB.Recordset
Set con = CurrentProject.Connection Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandText = "SELECT * From Clientes" Set rst = cmd.Execute
End Sub A ANNÁÁLLIISSEE
Após a criação do objeto Command (inicialização com o operador New), foi defini-da a propriedefini-dade CommandText do objeto Command, que armazena a instrução de SQL a ser executada na origem de dados atual (propriedade ActiveConnection). O método Execute retorna um objeto Recordset que, neste caso, possui toda a informação da tabela Clientes.
10.5.2 CCOONNTTAAGGEEMMDDEERREEGGIISSTTOOSS
O método RecordCount do objeto Recordset permite obter o número de registos retornados pelo método Execute. No capítulo anterior já vimos que era necessário utilizar
I
INNTTEEGGRRAAÇÇÃÃOOCCOOMMOOUUTTRRAASSTTEECCNNOOLLOOGGIIAASS 457
Por predefinição, é criada apenas uma instância do SQL Server Express, que é designada pelo nome da máquina onde reside e pela indicação do tipo de servidor (SQLEXPRESS), separados por um backslash (\). Reveja o nome completo da sua instância com o procedimento que levou a cabo para mostrar a caixa de diálogo apresentada na Figura 11.18.
5) Avance para o passo seguinte;
6) Na caixa de diálogo da Figura 11.25, utilize o modo de autenticação predefi-nido (pelo sistema operativo) e avance para o passo seguinte;
F
FIIGGUURRAA 1111..2255 ––Criação da origem de dados SQL Server: 2º passo
7) Altere a base de dados predefinida para RH (Figura 11.26);
F
FIIGGUURRAA 1111..2266 ––Criação da origem de dados SQL Server: 3º passo
8) No último passo (Figura 11.27), mantenha as configurações predefinidas e conclua o processo de criação da origem de dados.