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.
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
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
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.
| << Anterior | dBASE II | Próxima >> |