Curso de dBASE II
Interação com tabelas


Você está em: MarMSX >> Cursos >> dBASE II - Programável

5. Interação com tabelas

5.1. Programação em módulos

O dBASE II permite a programação em módulos, onde cada arquivo do tipo .CMD ou .PRG corresponde a um módulo. A vantagem de se programar desta maneira é que as rotinas são isoladas das demais, facilitando a manutenção do código. Além disso, os módulos podem ser reutilizados por outros módulos, evitando a reescrita de código (reúso).

Os módulos são chamados através do comando DO seguido do nome do módulo, sem a extensão. Para devolver o controle ao módulo chamador, utiliza-se o comando RETURN.

main.cmd                func1.cmd
┌───────────┐           ┌───────────┐
│ ...       │    ┌─────>│ ...       │
│ ...       │    │      │ ...       │
│ do func1  │ ───┘  ┌── │ return    │
│ ...       │ <─────┘   │           │
└───────────┘           └───────────┘

O comando CANCEL aborta a execução de todos os programas, devolvendo o controle ao dBASE II.

5.2. Inserção de novos registros

Utilizaremos a tabela alunos para exemplificar todas as funções propostas neste capítulo.

Para a construção do módulo de inserção de novos registros, necessitamos conhecer a estrutura da tabela no qual iremos trabalhar. A tabela alunos possui os seguintes campos:

Através do par de comandos GET e READ, iremos criar uma tela para o preenchimento das informações.

O programa a seguir (adaptado de [1]) cria um novo registro na tabela através do comando APPEND BLANK, que cria um registro vazio e aponta o ponteiro de arquivos para ele. Quando acessamos os campos da tabela, estamos acessando os campos do registro novo. Os comandos GET irão preencher os dados novos.

Módulo: insere.cmd

set talk off
erase
use alunos
store " " to opcao
set confirm on

do while !(opcao) <> "N"
  append blank

  @ 1,0 say "Insercao de novos alunos"
  @ 2,0 say "------------------------"
  @ 4,0 say "Matricula " get matricula
  @ 5,0 say "Nome      " get nome
  @ 6,0 say "Idade     " get idade
  @ 7,0 say "Sexo      " get sexo
  @ 8,0 say "Serie     " get serie
  read

  @ 10,0
  accept "Outra entrada? ('N'=nao, 'enter'=sim)" to opcao
  erase
enddo
release all
use

A saída na tela será:

Insercao de novos alunos
------------------------

Matricula :    :
Nome      :                              :
Idade     :  :
Sexo      : :
Serie     : :

O comando USE no final do código fecha a tabela alunos, salvando o dado inserido.

O comando SET CONFIRM ON exige o uso do return para confirmar cada campo digitado. Caso seja OFF, salta para o campo seguinte automaticamente ao completar o campo.

O número de inscrição deve ser único. Dessa forma, podemos alterar o programa anterior para que uma verificação seja feita no campo "matricula".

Módulo: insere.cmd

set talk off
erase
use alunos
store " " to opcao
append blank
set confirm on

do while !(opcao) <> "N"
  @ 1,0 say "Insercao de novos alunos"
  @ 2,0 say "------------------------"
  @ 4,0 say "Matricula " get matricula
  @ 5,0 say "Nome      " get nome
  @ 6,0 say "Idade     " get idade
  @ 7,0 say "Sexo      " get sexo
  @ 8,0 say "Serie     " get serie
  read

  store matricula to mat
  store # to regpos
  locate for matricula = mat
  if # <> regpos
    @ 10,0 say "Matrícula existente"
    go bottom
    loop
  endif
  
  @ 10,0
  accept "Outra entrada? ('N'=nao, 'enter'=sim)" to opcao
  if !(opcao) <> "N"
    append blank
  endif
  erase
enddo
release all
use

5.3. Alteração de registros existentes

O código de alteração de um registro será muito parecido com o de inserção, pois somente temos que apontar para o número de registro a ser alterado em vez de criar um novo registro através do comando APPEND BLANK.

A função principal poderá ser compartilhada tanto para a inserção de novo registro como de alteração de dados. Dessa forma, iremos alterar o programa "insere.cmd" para um código que atenda os dois casos.

Módulo: insere.cmd

store "T" to flagInsere
do while flagInsere <> "F"
  @ 4,0 say "Matricula " get matricula
  @ 5,0 say "Nome      " get nome
  @ 6,0 say "Idade     " get idade
  @ 7,0 say "Sexo      " get sexo
  @ 8,0 say "Serie     " get serie
  read

  store matricula to mat
  store # to regpos
  locate for matricula = mat
  if # <> regpos
    @ 10,0 say "Matrícula existente"
    go regpos
    loop
  endif
  flagInsere = "F"
enddo
return

O código do programa para alterar fica:

Módulo: altera.cmd

erase
set talk off
store "    " to mat
store "T" to flagEdit
use alunos

do while flagEdit <> "F"
  @ 1,0 say "Numero de matricula a alterar " get mat picture "9999"
  read

  locate for matricula = val(mat)
  if eof
    @ 3,0 say "Matricula Nao encontrada"
    loop
  endif
  store "F" to flagEdit
enddo

set confirm on
erase
@ 1,0 say "Alteracao de dados de aluno"
@ 2,0 say "---------------------------"
do insere
use

O código para inserir um novo registro, visto na seção anterior, pode ser simplificado.

Módulo: novoreg.cmd

set talk off
erase
use alunos
store " " to opcao
set confirm on
@ 1,0 say "Insercao de novos alunos"
@ 2,0 say "------------------------"

do while !(opcao) <> "N"
  append blank
  do insere

  @ 10,0
  accept "Outra entrada? ('N'=nao, 'enter'=sim)" to opcao
enddo
release all
use

5.4. Localização de registro por nome

O código a seguir irá localizar um registro por nome. Mas primeiro, necessitamos criar um módulo que imprima os dados do aluno na tela.

Módulo: mostra.cmd

@ 1,0 say "Dados do aluno"
@ 2,0 say "--------------"
@ 4,0 say "Matricula : " + str(matricula, 4)
@ 5,0 say "Nome      : " + nome
@ 6,0 say "Idade     : " + str(idade, 2)
@ 7,0 say "Sexo      : " + sexo
@ 8,0 say "Serie     : " + str(serie, 1)

Módulo: proc.cmd

erase
set talk off
set exact off
store "T" to flagEdit
use alunos

do while flagEdit <> "F"
  @ 0,0
  accept "Nome a buscar " to nombusca

  locate for !(nome) = !(nombusca)
  store 0 to total
  @ 4,0 say "Mat    Nome"
  ?
  do while .not. eof
    ? str(matricula, 4) + " - " + nome
    store total + 1 to total
  continue
  enddo

  ?
  ? "Total de arquivos: " + str(total, 4)

  if total = 0
    loop
  endif

  ?
  input "Matricula " to mat
  locate for matricula = mat
  erase
  do mostra

  store "F" to flagEdit
enddo

O programa primeiro pede para o usuário inserir um nome para a busca. Pode ser parte dele e sem problemas com letras maiúsculas ou minúsculas. Em seguida, retorna todos os nomes encontrados em uma lista, contendo a matrícula e o nome dos alunos que atendam a ocorrência. Caso não ache, volta ao prompt de busca.

O passo seguinte é o usuário conferir o nome completo do aluno na lista e inserir o número da matrícula. Como exercício, modifique o código para que o prompt volte para a pergunta de matrícula caso o operador digite o número de matrícula inválido.

Exemplo de uso:

. do proc
Nome a buscar :paula

Mat

7766 - Paula Tavares
1215 - Paula Aguiar
5555 - Paula Herculano

Total de arquivos:    3

Matricula: 1215
Dados do aluno
--------------

Matricula : 1215
Nome      : Paula Aguiar
Idade     : 13
Sexo      : F
Serie     : 7


Referências:

[1]- dBASE II PLUS para MSX programável - curso prático, Nelson Casari, Ed. Atlas, 1989.