| (desactualizado) | |
| (matéria retirada do programa) |
Informação numérica de uma tabela (ou "query") pode ser apresentada graficamente. No mesmo gráfico podem ser mostrados vários campos, o tipo de gráfico escolhido permite evidenciar certas características dos valores escolhidos. O "FormWizards" tipo "Graph" proporciona os seguintes tipos de gráficos:

A primeira linha refere gráficos bi-dimensionais e a segunda gráficos tri-dimensionais.
Nos gráficos tipo "Área" salientam a contribuição de cada campo para o total desse campo. É possível representar vários campos, sendo cada representado por uma cor.
Nos gráficos de "Barras" ou de "Colunas" são salientadas as diferenças entre valores dos diversos campos.
Um gráfico de "Linhas" salienta as variações dentro dos valores de um campo.
Os gráficos tipo "Circular" salientam também a contribuição das partes para o todo, mas só é possível mostrar um único campo.
Exemplo: Análise gráfica das notas de um teste
Num teste com quatro perguntas, as notas dos alunos (» 300) são guardadas na tabela:

Representação de Médias das Notas por Turma
É criada uma "Query" que agrupa os registos por turma (na linha "Total") e calcula a média de todas as perguntas, assim como da nota final:

Em seguida pode construir um gráfico de linhas na base desta "query":

Análise da distribuição das notas
Pretende-se obter um gráfico que ilustre a distribuição das notas, por turma, no intervalo 0 a 20. Para esse efeito é construida uma "Select Query" com três campos: "turma", "nota" e "Classe".
O campo "turma" é proveniente da tabela "Notas", enquanto os campos "nota" e "Classe", são campos calculados:
nota: [ perg1] +[ perg2] +[ perg3] +[ perg4]
Classe: Choose(1+Int([nota]/2); "[0-2]"; "[2-4]"; "[4-6]"; "[6-8]"; "[8-10]"; "[10-12]"; "[12-14]"; "[14-16]"; "[16-18]"; "[18-20]")
A função Choose(N, Lista_de_valores) retorna o n-ésimo valor da lista. Com base nesta "Query" é criada uma "CrossTab Query" que obtém o número de notas (por turma) situadas nos intervalos definidos pelo campo "Classe":

A "query" permite gerar o seguinte gráfico de barras:

Cada acção tem um conjunto de propriedades associadas que o utilizador pode adaptar aos seus objectivos. As macros estão associadas a eventos em formulários: quando o evento se dá, a macro é executada. Assim, a definição de uma macro envolve:
Situações típicas de utilização de macros permitem:
Vejamos agora como é possível utilizar macros para localizar registos que satisfazem certas condições.
O formulário Notas mostra informação referente às notas de alunos a um teste. Pretende-se localizar o registo correspondente ao aluno cujo nome o utilizador deverá especificar (na secção Footer).

Para atingir esse fim, são acrescentados dois controlos adicionais: a legenda ("Label"), e a caixa de texto ("Text Box").
A legenda permite simplesmente colocar o texto "Digite Nome" no formulário. Este controlo tem a propriedade:
Caption: "Digite Nome:"
A caixa de texto tem as seguintes propriedades (entre outras):
Name: "Nome_digitado"
AfterUpdate: localiza
A propriedade AfterUpdate determina que a macro localiza deve ser executada após o utilizador preencher o campo. Este controlo não pode estar ligado a nenhum campo da tabela alunos, nem a nenhuma expressão (isto é, este campo deverá ser Unbound).
As macros são definidas na folha de macros. Vejamos a definição da macro localiza:

A macro é constituída por duas acções. A primeira acção, GoToControl, tem como parâmetro o nome de um controlo. Neste caso, como se pretende localizar o nome do aluno, é indicado o controlo com o nome Nome.
A segunda acção, FindRecord, encontra o registo que satisfaz as condições definidas nos parâmetros. No parâmetro Find What é especificado =[ Nome_digitado] . Esta acção vai procurar o 1º registo que satisfaz a condição (valor do campo Nome igual ao valor do controlo Nome_digitado).
Desta forma, quando o utilizador digita um nome e carrega na tecla Enter, a macro é disparada. Se existir um aluno com o nome indicado, o registo correspondente passa a ser o registo corrente, caso contrário o registo actual mantém-se corrente.
Para aceder a esta informação, pode-se utilizar:
Menu View: Toolbar: Menu:

Definição de Várias Macros numa Folha
É possível definir várias macros na mesma folha de macros. Cada macro é identificada por um nome (coluna Macro Name). Para referir uma macro de uma folha particular, pode-se utilizar o formato
<nome_da_folha> . <nome_da_macro>.
Por exemplo, Macro2.seguinte identifica a macro a macro seguinte da folha Macro2.
Ao executar uma macro, é avaliada a condição associada à primeira linha da macro. Se a condição resultar em TRUE é executada a acção associada e passa-se para a linha seguinte. Uma condição não definida, ou seja em branco, é avaliada como TRUE. A macro termina quando encontra uma linha em branco ou uma linha que pertence a outra macro.
O seguinte exemplo, mostra a macro seek_bi, que inclui as acções CancelEvent e DoMenuItem. Cada acção é executada, só se a condição correspondente for verdadeira.
A referência, numa macro, ao valor de um controlo de um formulário pode ser feita indicando apenas o nome do controlo, se a macro é disparada por um evento nesse formulário. Em todos outros casos é necessário utilizar a seguinte forma geral:
Forms![ nome_de_formulário] ![ nome_de_controlo] .
Vejamos um exemplo. A macro seek_bi inclue a acção CancelEvent que é condicionada por:
IsNull (Forms![ requisicao] ![ bi] )
Neste caso, pretende-se testar, utilizando a função IsNull(..), se o valor do controlo bi no formulário requisição é vazio.
Notamos ainda que é possível associar várias acções a uma condição, utilizando o operador "..." (ellipsis).
Um outro grupo de operações frequentes em formulários envolve
posicionamento no registo desejado. Alguns exemplos destas macros são
apresentadas na seguinte tabela:
| Macro | Acção | Parametros |
| primeiro | GoToRecord | Object Type:
Record: First Offset: |
| ultimo | GoToRecord | Record: Last |
| anterior | GoToRecord | Record: Previous |
| seguinte | GoToRecord | Record: Next |
| novo | GoToRecord | Record: New |
As macros podem ser executadas a partir de botões de comando, disponíveis no formulário, que têm associado á propriedade OnClick (ou OnPush em Access 1) o nome da macro que efectua a operação desejada.
As macros anterior, seguinte só podem ser executadas se houver se existir o
registo pretendido. Isto é, se está no 1º registo, não existe registo
anterior, o executar a macro anterior, nesta
situação, dá origem a erro:
|
|
![]() |
Esta situação pode ser ultrapassada, utilizando funções definidas pelo utilizador (no objecto Module) que permitem detectar situações de erro.
| Macro | Acção | Parametros |
| Eliminar | DoMenuItem
DoMenuItem |
MenuBar:
Form
Command: Select Record MenuBar: Form MenuName: Edit Command: Delete |
No formulário seguinte está disponível uma ComboBox que mostra todas as turmas existentes na tabela e permite seleccionar uma turma.
Ao seleccionar uma turma, é disparada uma macro (Localiza) e o primeiro aluno dessa turma passa a ser o registo corrente. O botão Next dispara uma outra macro (seguinte) e assim, o utilizador pode ver os dados relativos ao aluno seguinte (mas da mesma turma).

A ComboBox pode ser construída de várias maneiras. Uma possibilidade é simplesmente enumerar os items. Assim, as propriedades da ComboBox deveriam ser:
Uma outra possibilidade é construir uma Query, agrupando os dados através o campo turma.

Neste caso, as propriedades da ComboBox deveriam ser:
A terceira possibilidade é utilizar um comando de SQL:
Este comando irá seleccionar as turmas da tabela eliminando as repetições. Mais detalhes sobre a linguagem de SQL estão apresentados na Secção 9.
A macro Localiza é disparada através da propriedade AfterUpdate da ComboBox. A seguinte tabela mostra a definição da macro.
A primeira acção determina que o sistema deveria analisar os dados do controlo turma.
A segunda acção determina que o valor neste campo deveria ser comparado com o da ComboBox cujo nome é turma_selecionada.
A terceira acção da macro garante que o botão Next esteja disponível. Inicialmente, este botão não está disponível (a propriedade Enabled deste botão está em No). A acção da macro SetValue .. permite inverter esta situação.
| Macro | Acção | Parametros |
| Localiza | GoToControl
FindRecord SetValue |
Object Type: "turma"
=[turma_selecionada] Forms![alunos]![Next]!Enabled= Yes |
| seguinte | GoToControl
FindNext |
Object Type: "turma"
|
| Macro | Acção | Parametros |
| abrir | OpenForm | FormName: <Formulário> |
Consideramos um exemplo que mostra como se pode abrir um formulário junto com outro. No nosso caso temos um formulário principal que apresenta dados relativos a um aluno (alunos) e é tipo Single Form. O outro formulário (notas1) mostra as notas desse aluno e é tipo Tabular Form.

| Para abrir o segundo formulário (notas1) a partir do formulário principal
(alunos), deve utilizar uma macro
(abrir_notas) e garantir que esta
macro fosse disparada com o evento On Open do
formulário principal:
| |
![]() |
![]() |