Curso de dBASE II
Junção de Tabelas


Você está em: MarMSX >> Cursos >> dBASE II

9. Junção de Tabelas

O objetivo desse capítulo é mostrar como o dBASE II pode trabalhar com duas tabelas em memória e realizar a junção entre elas.

9.1. Trabalhando com duas tabelas ao mesmo tempo

O comando SELECT PRIMARY/SECONDARY permite a escolha entre trabalhar com a tabela primária (PRIMARY) ou com a tabela secundária (SECONDARY). Assim, vamos poder utilizar as duas tabelas criadas até aqui juntas: a tabela alunos e a tabela notasmat.

Digite então:

. select primary
. use alunos
. select secondary
. use notasmat

A tabela alunos ficou como a tabela primária, enquanto que a tabela notasmat ficou como a tabela secundária.

O último comando SELECT PRIMARY/SECONDARY dado é que define a tabela em uso. No exemplo acima, a tabela em uso é a secundária, ou seja, a tabela notasmat.

Ao darmos o comando DISPLAY ALL, essa tabela é listada.

. display all
00001   8361   8.0   7.5   8.0   7.5
00002   4321   6.0   5.5   8.0   7.0
00003   5543   7.0   7.7   6.0   7.0
00004   8437   8.5   9.0   9.5   9.0
00005   7193  10.0  10.0   9.7   9.9
00006   3398   8.0   7.0   7.5   9.0
00007   9001   5.5   4.0   7.0   7.0
00008   6567   7.5   9.0   8.0   7.0
00009   6201   7.0   8.0   7.0   7.0
00010   7766   8.0   8.5   7.0   7.0

Para modificar a tabela em uso, devemos digitar select primary ou secondary.

. select primary

Através do comando acima, trocamos a tabela em uso de notasmat para alunos.

9.2. Fazendo referência a cada tabela

Cada tabela é referenciada, colocando-se antes do nome do campo:

Exemplo:

. display p.nome,s.bim1

O comando acima irá retornar o registro atual da tabela primária e o registro atual da tabela secundária.

Observe que o ponteiro de registros em cada tabela pode estar apontado para posições distintas. Por exemplo, na tabela primária poderia estar apontando para o registro 2, enquanto que na tabela secundária para o registro 10. O resultado não faria o menor sentido, pois retornaria:

00010  Ana Maria Silva  8.0

A nota do primeiro bimestre (bim1) apresentada é da Paula Tavares e não da Ana Maria, que tirou 6.0.

Quando cada entidade (pessoa ou coisa) está sempre localizada na mesma linha nas duas tabelas, como no nosso caso (por exemplo, os dados e as notas do Pablo estão na linha 1 nas duas tabelas), podemos ligar os ponteiros das tabelas, através do comando SET LINKAGE ON, antes do carregamento das tabelas. Veja o exemplo a seguir.

. set linkage on
. select primary
. use alunos
. select secondary
. use notasmat
. display all p.nome,s.bim1
00001   Pablo Goncalves                  8.0
00002   Ana Maria Silva                  6.0
00003   Waldir Moraes                    7.0
00004   Alvaro Schwarz                   8.5
00005   Beatriz Saraiva                 10.0
00006   Mauro Pontes                     8.0
00007   Pedro Tavares                    5.5
00008   Suely Albuquerque                7.5
00009   Pedro Borges                     7.0
00010   Paula Tavares                    8.0

O comando SET LINKAGE ON deve ser dado antes de selecionarmos as tabelas primária e secundária.

Para fechar uma tabela em uso, utilize o comando CLEAR.

Quando tivermos duas tabelas onde as entidades estejam localizadas em linhas diferentes (ou até em mais de uma linha), devemos utilizar o comando JOIN para relacionar as entidades. O comando JOIN será visto na próxima seção.

9.3. Junção de tabelas

O comando JOIN junta duas tabelas em outra tabela, baseado em um ou mais campos relacionados. Esse procedimento é mais seguro para juntar duas tabelas.

A sintaxe é:

JOIN to <nome_tabela> for <condição> [field <lista_de_campos>]

Onde:

No nosso exemplo, qual o campo que pode ser utilizado para relacionar as entidades nas duas tabelas? O campo matrícula.

Vamos juntar as tabelas alunos e notasmat em uma só. Caso as tabelas não estejam ativas, vamos fazê-las.

. select primary
. use alunos
. select secondary
. use notasmat 

Juntamos as tabelas através do campo matricula das duas tabelas. A expressão de igualdade procura e junta as linhas onde os valores de matrícula forem iguais.

. join to fulltab for p.matricula=s.matricula

Agora, o programa colocará na mesma linha os registros das duas tabelas que possuirem o mesmo valor para matrícula. Dessa forma, não importa em que linha os registros de dados e nota de um aluno e suas notas estejam em cada tabela, que o programa resolve o problema.

A seguir, listamos o resultado.

. use fulltab
. display all
00001   8361 Pablo Goncalves                 11 M  5   8361
   8.0   7.5   8.0   7.5
00002   4321 Ana Maria Silva                 11 F  5   4321
   6.0   5.5   8.0   7.0
00003   5543 Waldir Moraes                   12 M  6   5543
   7.0   7.7   6.0   7.0
00004   8437 Alvaro Schwarz                  12 M  5   8437
   8.5   9.0   9.5   9.0
00005   7193 Beatriz Saraiva                 13 F  6   7193
  10.0  10.0   9.7   9.9
00006   3398 Mauro Pontes                    11 M  5   3398
   8.0   7.0   7.5   9.0
00007   9001 Pedro Tavares                   13 M  6   9001
   5.5   4.0   7.0   7.0
00008   6567 Suely Albuquerque               12 F  6   6567
   7.5   9.0   8.0   7.0
00009   6201 Pedro Borges                    11 M  5   6201
   7.0   8.0   7.0   7.0
00010   7766 Paula Tavares                   13 F  6   7766
   8.0   8.5   7.0   7.0

A partir da junção das tabelas, podemos finalmente exibir os nomes com as respectivas notas ou a média. No exemplo a seguir, listamos os alunos e suas respectivas médias em matemática nos quatro bimestres.

. display all nome,(bim1+bim2+bim3+bim3)/4
00001   Pablo Goncalves                  7.7
00002   Ana Maria Silva                  6.6
00003   Waldir Moraes                    6.9
00004   Alvaro Schwarz                   9.0
00005   Beatriz Saraiva                  9.9
00006   Mauro Pontes                     7.8
00007   Pedro Tavares                    5.8
00008   Suely Albuquerque                7.8
00009   Pedro Borges                     7.2
00010   Paula Tavares                    7.6

Obs: para sair do dBASE II, digite "quit".



<< Anterior dBASE II Próxima >>