Vamos dar continuidade ao sistema apresentando a rotina de cadastro da nossa agenda.
Começamos abrindo o banco de dados em modo compartilhado com o parâmetro SHARED para usar em modo rede multi-usuário.
Depois criamos um loop de cadastro. Nele pegamos as informações do usuário com o comando @...SAY...GET; inserimos um registro em branco no arquivo com o DBAPPEND() e gravamos as variáveis do programa que o usuário digitou nos campos do banco de dados e liberamos o registro para uso normal na rede com o DBUNLOCK(). Fechamos o banco de dados para encerrar e voltar ao menu.
FUNCTION CADASTRO()
USE AGENDA ALIAS AG SHARED NEW // ABRE O BANCO DE DADOS EM MODO COMPARTILHADO
SET INDEX TO AGENDA // ABRE O ARQUIVO DE ÍNDICE
SET ORDER TO TAG CPF // COLOCA ORDENADO POR CPF
SETCOLOR("W+/N")
@ 04,01 SAY PADC("CADASTRO DA AGENDA", 77, " ") // CENTRALIZA DENTRO DE 77 CARACTERES
DO WHILE .T. // CRIA UM LOOP SUPOSTAMENTE INFINITO
@ 07,01 CLEAR TO 22,78 // LIMPA ESSA ÁREA
cNOME := SPACE(30) // DEFINE UMA VARIÁVEL CARACTER TAMANHO 30
nFONE := 0 // DEFINE TELEFONE NUMÉRICO
cCPF := SPACE(11) // DEFINE CPF CARACTER PORQUE O PONTO DA MÁSCARA É LIDO COMO DECIMAL
@ 09,10 SAY "CPF.:" GET cCPF PICTURE "@R 999.999.999-99" // EXIBE UMA MÁSCARA NO GET QUE RETORNA 99999999999
@ 24,00 SAY PADL("Insira um número de CPF",54, " ") COLOR "W+/BG" // MENSAGEM NA LINHA DE STATUS
READ // AGUARDA A LEITURA DOS GETs
IF LASTKEY() = K_ESC // LASTKEY() RETORNA A ÚLTIMA TECLA, SE FOI [ESC]...
EXIT // SAI DO LOOP
ELSEIF EMPTY(cCPF) // SE DEIXOU EM BRANCO
ALERT("PRECISA DIGITAR O CPF")
LOOP // VOLTA PRA LINHA SEGUINTE AO 'DO WHILE'
ENDIF
nCPF := VAL( cCPF ) // CONVERTE cCPF CARACTER PARA nCPF NUMÉRICO COM VAL()
IF AG->(DBSEEK(nCPF)) // SE A PESQUISA DBSEEK() NO DBF RETORNOU .T. (VERDADEIRA)
ALERT("ESSA PESSOA JÁ FOI CADASTRADA")
LOOP
ELSE
// ROTINA DE CADASTRO
// PEDE PRO USUÁRIO DIGITAR O NOME E TELEFONE
@ 24,00 SAY PADL("Digite um nome e telefone", 54, " ") COLOR "W+/BG" // NA COLUNA 55 TEM 'TECLE [ESC]'
// PEGA DADOS DIGITADOS PELO USUÁRIO COM GET/READ
@ 10,10 SAY "NOME:" GET cNOME
@ 11,10 SAY "FONE:" GET nFONE PICTURE "@R (99) 99999-9999"
READ
IF ( ALERT("Confirma cadastro?", {"Sim", "Não"}) ) = 1 // ALERT() RETORNA A POSIÇÃO DO ARRAY ESCOLHIDO, "Sim"=1, "Não"=2, Esc=0.
AG->(DBAPPEND()) // INSERE UM REGISTRO EM BRANCO NO ARQUIVO DBF
AG->CPF := nCPF // ATRIBUI O CAMPO DO DBF À VARIÁVEL DO PROGRAMA
AG->NOME := cNOME
AG->FONE := nFONE
AG->(DBCOMMIT()) // JOGA O CACHE PRO DISCO (GRAVA NO DBF)
AG->(DBUNLOCK()) // DESBLOQUEIA O REGISTRO
ENDIF
ENDIF
ENDDO // VOLTA PRA LINHA SEGUINTE DO 'DO WHILE'
AG->(DBCLOSEAREA()) // FECHA O BANCO DE DADOS
RETURN // RETORNA PRA FUNCÃO QUE CHAMOU CADASTRO()
Aprofunde-se mais sobre cadastrar dados.