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 >> |