Cleverton Bueno
← Voltar para todos os artigos

Recriando uma Aplicação dos Anos 90 – Um Tutorial Prático com Clipper

Este é um tutorial prático que ensina, passo a passo, como construir uma aplicação de cadastro funcional em Clipper, recriando a experiência de programação "na unha" da década de 90.

Olá, pessoal!
Que tal uma viagem no tempo? Hoje, vamos deixar de lado os frameworks modernos, o JavaScript e a nuvem, e vamos construir, do zero, uma aplicação de verdade, como a gente fazia nos anos 90. Nossa ferramenta será o lendário Clipper, a linguagem que dominou o desenvolvimento de aplicações comerciais para DOS por uma década.
Nossa missão é criar um cadastro de clientes simples, mas 100% funcional. Teremos uma tela para incluir, consultar, alterar e excluir registros. O objetivo é que, ao final, você, desenvolvedor moderno, sinta na pele como era "programar na unha" e tenha um gostinho da elegância e do poder que essas ferramentas nos davam.

Passo 0: O Ambiente – Preparando a Máquina do Tempo

Para começar, você precisará de algumas coisas:

  • Um Emulador de DOS:
    Caso o teu windows não tenha o command(cmd.exe), então uma ferramenta para isso é o DOSBox. É um programa gratuito que emula um ambiente DOS completo dentro do seu Windows, Mac ou Linux. Baixe e instale-o.
  • O Compilador Clipper:
    O Clipper 5.2 ou 5.3 era o padrão da indústria na época. Hoje, ele é considerado "abandonware" e pode ser encontrado em arquivos de software antigo na internet. Você precisará dos arquivos CLIPPER.EXE (compilador), RTLINK.EXE (linker) e das bibliotecas, como a CLIPPER.LIB.
  • Um Editor de Texto:
    Esqueça o VS Code com suas mil extensões. O Bloco de Notas ou qualquer editor de texto simples é tudo que você precisa.

Crie um diretório de trabalho (ex: C:\CLIPPER) e coloque os arquivos do Clipper nele. Dentro do DOSBox, você pode "montar" esse diretório como seu C: com o comando mount c c:\clipper.

Também vai precisar ajustar as variaveis de ambiente com FILES=150 e SET CLIPPER=F150, respectivamente em variáveis de ambiente ou autoexec.bat/.nt e config.sts/.nt


Passo 1: A Planta Baixa – Criando o Banco de Dados .DBF

No mundo xBase, o banco de dados era um simples arquivo no disco, geralmente com a extensão .DBF. Vamos criar um programa para definir a estrutura do nosso CLIENTES.DBF. Crie um arquivo chamado CRIADBF.PRG com o seguinte conteúdo:

Snippet de Código 1:

// CRIADBF.PRG
// Roda apenas uma vez para criar a estrutura do banco de dados

	// Define a estrutura em um array
	aStru := { ;
    { "CCODI", "N", 6, 0 }, ; // Codigo do Cliente, Numerico, 6 digitos, 0 decimais
    { "CNOME", "C", 40, 0 }, ; // Nome, Caractere, 40 posicoes
    { "CFONE", "C", 15, 0 }, ; // Telefone, Caractere, 15 posicoes
    { "CDATA", "D", 8, 0 }    // Data do Cadastro, Data
	}

	// Cria o arquivo .DBF a partir da estrutura
	CREATE CLIENTES.DBF FROM aStru

	// Cria o arquivo de índice .NTX
	USE CLIENTES
	INDEX ON CCODI TO CLIECAD

	? "Arquivos CLIENTES.DBF e CLIECAD.NTX criados com sucesso!"
	CLOSE DATABASES
	RETURN
	

Para executar, no prompt, digite:

  • CLIPPER CRIADBF /n /l (para compilar)
  • RTLINK CRIADBF (para gerar o executavel).
  • CRIADBF (para rodar).
  • Importante: caso você consiga o clipper5\bin completo, dentro dele já existe um arquivo .bat chamado cl.bat. Existindo, pode esquecer os comandos anteriores e basta executar CL CRIADBF

Se tudo deu certo, você terá dois novos arquivos no seu diretório: CLIENTES.DBF (os dados) e CLIECAD.NTX (o índice por código).

Passo 2: O Coração do Programa – A Tela de Cadastro (CADCLI.PRG)

Agora, a aplicação principal. Crie o arquivo CADCLI.PRG. Vamos começar com a estrutura básica e a tela:

Snippet de Código 2:

// CADCLI.PRG - Cadastro de Clientes
#include "inkey.ch"  // Define constantes de teclas como K_ESC
#include "box.ch"    // Define constantes para desenhar caixas

FUNCTION main()
    // Declara as variáveis que serão usadas na tela
    PRIVATE nCodigo := 0, cNome := SPACE(40), cFone := SPACE(15), dData := DATE()

    // Abre o banco de dados e seu índice
    USE CLIENTES INDEX CLIECAD

    CLEAR SCREEN

    // Loop principal do programa
    DO WHILE .T.
        // Desenha a tela
        @ 5, 10 TO 15, 70 BOX B_SINGLE
        @ 6, 12 SAY "Cadastro de Clientes - CompCet Demonstração"

        // Exibe uma mensagem de ajuda
        @ 17, 10 SAY "Digite o Código (0 para Novo) e pressione Enter, ou ESC para Sair."

        // Define os campos de entrada de dados (os GETs)
        @ 8, 12 SAY "Código..:" GET nCodigo PICTURE "999999" VALID ValCod(@nCodigo)
        @ 10, 12 SAY "Nome....:" GET cNome PICTURE "@!" VALID !EMPTY(cNome) // @! para deixar em maiúsculas
        @ 11, 12 SAY "Telefone:" GET cFone
        @ 12, 12 SAY "Data....:" GET dData

        // Comando mágico que ativa os campos para edição
        READ

        // Verifica a tecla que o usuário pressionou para sair do READ
        IF LASTKEY() == K_ESC
            EXIT // Sai do loop DO WHILE
        ENDIF

        // Se não saiu, chama a função para gravar os dados
        GravaReg(nCodigo, cNome, cFone, dData)

        // Limpa as variáveis para o próximo cadastro
        nCodigo := 0
        cNome   := SPACE(40)
        cFone   := SPACE(15)
        dData   := DATE()

    ENDDO

    CLOSE DATABASES
    CLEAR SCREEN
RETURN

Este é o esqueleto da nossa aplicação. O comando @...SAY...GET é a base de tudo. SAY exibe um texto, GET vincula um campo na tela a uma variável. O comando READ entrega o controle ao usuário, e só devolve o controle para o programa quando ele navegar por todos os campos ou pressionar ESC.

Passo 3: A Lógica – Validando e Gravando

O programa acima chama duas funções que ainda não existem: ValCod() e GravaReg(). Vamos criá-las no mesmo arquivo CADCLI.PRG.

Snippet de Código 3:

// Funções de Validação e Gravação
// Função de validação, executada sempre que o usuário sai do campo do código
FUNCTION ValCod(nCod)
    IF nCod == 0  // Se digitou 0, é um novo registro
        // Pega o código do último registro e soma 1, garantindo um código único
        GO BOTTOM
        nCodigo := CLIENTES->CCODI + 1
        APPEND BLANK
        cNome   := SPACE(40)
        cFone   := SPACE(15)
        dData   := DATE()
        @ 8, 22 SAY nCodigo PICTURE "999999" // Atualiza o código na tela
    ELSE
        SEEK nCod // Procura o código no índice
        IF FOUND() // Se encontrou...
            // Carrega as variáveis da tela com os dados do arquivo
            nCodigo := CLIENTES->CCODI
            cNome   := CLIENTES->CNOME
            cFone   := CLIENTES->CFONE
            dData   := CLIENTES->CDATA
        ELSE // Se não encontrou...
            ALERT("Código não encontrado!")
            nCodigo := 0 // Limpa a variável para o usuário digitar de novo
        ENDIF
        // Atualiza todos os campos da tela com os valores carregados
        SHOW GETS
    ENDIF
RETURN .T. // Retorna .T. para o GET ser considerado válido

// Função para gravar as alterações no arquivo .DBF
FUNCTION GravaReg(nCod, cNom, cFon, dDat)
    SEEK nCod
    IF FOUND()
        // Se o registro já existe, atualiza os campos
        REPLACE CLIENTES->CNOME WITH cNom, ;
                CLIENTES->CFONE WITH cFon, ;
                CLIENTES->CDATA WITH dDat
        ALERT("Registro alterado/incluído com sucesso!")
    ELSE
        // A inclusão (APPEND BLANK) já foi feita no ValCod,
        // então aqui apenas preenchemos os dados
        REPLACE CLIENTES->CCODI WITH nCod, ;
                CLIENTES->CNOME WITH cNom, ;
                CLIENTES->CFONE WITH cFon, ;
                CLIENTES->CDATA WITH dDat
        ALERT("Registro incluído com sucesso!")
    ENDIF
    // Grava as alterações fisicamente no disco
    COMMIT
RETURN

Passo 4: Compilando e Rodando

Agora, salve o arquivo CADCLI.PRG. No prompt, compile e rode:

  • CLIPPER CADCLI /n/l
  • RTLINK CADCLI
  • CADCLI
  • Ou CL CADCLI

Se tudo deu certo, sua aplicação de cadastro estará rodando! Tente digitar 0 no código para incluir um novo cliente. Depois, digite o código de um cliente existente para alterá-lo. Pressione ESC para sair.

Conclusão: A Máquina do Tempo Desliga

Parabéns! Você acaba de criar uma aplicação DOS funcional, usando as mesmas técnicas que usamos para construir sistemas gigantescos nos anos 90.
O que aprendemos? Aprendemos que, naquela época, o programador tinha controle total e uma responsabilidade imensa. Era preciso gerenciar o banco de dados, a interface, o fluxo do programa, tudo de forma explícita. Não havia frameworks para nos ajudar.
Pode parecer "primitivo" para os padrões de hoje, mas havia uma elegância e uma satisfação enormes em construir algo tão "na unha", vendo a tela preta ganhar vida com nossos comandos. Espero que tenham gostado da viagem. Agora, vocês não apenas leram sobre a história, vocês a programaram.