REGISTROS

            Registros são conjuntos de informações logicamente relacionadas. As informações de um registro são denominadas campos e podem ser de diferentes tipos. Podemos citar como exemplos de registros: informações pessoais sobre um cliente de um banco, dados sobre produtos comercializados em uma loja, informações sobre veículos produzidos em uma montadora, dados sobre inscritos em um concurso, informações sobre motoristas de uma empresa de ônibus e outros.
             Para declararmos um registro é necessário definir um tipo de registro e depois a variável de registro, conforme a sintaxe e exemplos a seguir.

             TYPE identificador de tipo de registro = RECORD
                                                                              {campos do registro}
                                                                           END;

             VAR identificador de variável de registro: identificador de tipo de registro;

Ex1: Informações pessoais sobre um cliente de um banco: número da conta, tipo da conta, nome do cliente, endereço, telefone, número do RG, número do CPF, empresa em que trabalha, rendimento mensal, qualificação do cliente conforme condições financeiras.
         Program ex1;
         Type dados_do_cliente =RECORD
                                                nconta: string[8];
                                                tipo: char;
                                                nome: string[30];
                                                endereco: record
                                                        rua:string[30];
                                                        cidade:string[15];
                                                        cep:string[5];
                                                end;
                                                fone: string[12];
                                                rg: string[10];
                                                cpf: string[12];
                                                empresa: string[25];
                                                rendmensal: real;
                                                qualifica: byte;
                                                END;
        VAR cliente: dados_do_cliente;
        .........

Faça um trecho de programa para declarar um registro tendo como base o exemplo 1.
a) Dados sobre produtos comercializados em uma loja: código do produto, descrição do produto, tipo do produto, preço do produto;
b) Informações sobre veículos produzidos em uma montadora: modelo, potência do motor, ano, cor, número de série, número do chassis.

            Para fazermos referência, no programa, a um campo de um registro, é necessário identificar o registro e o campo, com a sintaxe:
            identificador de variável de registro.identificador do campo;

             Para o exemplo 1 o trecho de entrada das informações pode ser:
             .........
            gotoxy(...,...); readln(cliente.nconta);
            gotoxy(...,...); readln(cliente.tipo);
            gotoxy(...,...); readln(cliente.nome);
            gotoxy(...,...); readln(cliente.endereco.rua);
            gotoxy(...,...); readln(cliente.endereco.cidade);
            gotoxy(...,...); readln(cliente.endereco.cep);
            gotoxy(...,...); readln(cliente.fone);
            gotoxy(...,...); readln(cliente.rg);
            gotoxy(...,...); readln(cliente.cpf);
            gotoxy(...,...); readln(cliente.empresa);
            gotoxy(...,...); readln(cliente.rendmensal);
            gotoxy(...,...); readln(cliente.qualifica);
            .........

            O trecho de entrada de informações, ou qualquer outro onde seja necessário relacionar as variáveis de campo com o registro, pode ser simplificado com a utilização do comando abaixo que associa o nome do registro aos campos do referido registro:
            WITH identificador de variável de registro DO comando;
             .........
             with cliente, cliente.endereco do
             begin
                    gotoxy(...,...); readln(nconta);
                    gotoxy(...,...); readln(tipo);
                    gotoxy(...,...); readln(nome);
                    gotoxy(...,...); readln(rua);
                    gotoxy(...,...); readln(cidade);
                    gotoxy(...,...); readln(cep);
                    gotoxy(...,...); readln(fone);
                    gotoxy(...,...); readln(rg);
                    gotoxy(...,...); readln(cpf);
                    gotoxy(...,...); readln(empresa);
                    gotoxy(...,...); readln(rendmensal);
                    gotoxy(...,...); readln(qualifica);
            end;
            .........

            Pode-se declarar e utilizar a estrutura de registros em vetores:
            lista de identificadores: ARRAY[1..k] of  identificador de registro;
            ou em arquivos.
 

ARQUIVOS

Um arquivo pode ser descrito como um conjunto de registros e pode ser armazenado (gravado) em disco rígido ou disquete. É possível manipular um arquivo inserindo, alterando, excluindo ou simplesmente consultando seus registros. Os registros são gravados sequencialmente. Para declararmos um arquivo é necessário declarar o registro com seus campos e depois o arquivo.
 TYPE identificador de tipo de arquivo = FILE OF identificador de tipo de registro;
 VAR identificador de variável de arquivo: identificador de tipo de arquivo;
 Para o exemplo 1 temos:
Program ex1;
 Type dados_do_cliente = RECORD
    nconta: string[8];
    .........
    qualifica: byte;
    END;
           cadastro_dos_clientes = FILE of dados_do_cliente;
    VAR cliente: dados_do_cliente;
         cadastro: cadastro_dos_clientes;
     .........
{cliente é o nome da variável do registro e cadastro é o nome da variável do arquivo}

PROCEDIMENTOS E FUNÇÕES PARA MANIPULAÇÃO DE ARQUIVOS

ASSIGN(nomedoarquivo, ‘nomeexterno’);
Associa o nomedoarquivo declarado no programa ao nomeexterno (arquivo físico) localizado no ambiente do sistema operacional. O nomeexterno do arquivo deve seguir as regras do MSDOS, ou seja até 12 caracteres, sendo 8 para o nome, seguido do ponto e mais 3 para extensão, que é opcional. Este procedimento deve anteceder qualquer outro procedimento de manipulação de arquivo.

RESET(nomedoarquivo);
Abre arquivo existente, com registros gravados. Os registros que foram gravados anteriormente serão preservados. Posiciona o ponteiro no 1º registro.

REWRITE(nomedoarquivo);
Cria e abre um novo arquivo, caso o arquivo já exista os registros gravados anteriormente serão eliminados. O arquivo será aberto sempre vazio.

CLOSE(nomedoarquivo);
Fecha um arquivo aberto, atualizando as informações do arquivo.

ERASE(nomedoarquivo);
Elimina o arquivo do diretório.

RENAME(nomedoarquivo,’nomeexterno’);
Altera o nome interno do arquivo para outro nome externo.

READ(nomedoarquivo,nomedoregistro);
Lê um registro e avança o ponteiro para o próximo registro.

WRITE(nomedoarquivo,nomedoregistro);
Grava um registro e avança o ponteiro para o próximo registro.

EOF(nomedoarquivo);
Retorna true se o fim do arquivo foi atingido.

FILEPOS(nomedoarquivo);
Retorna o número do registro ativo, onde se encontra o ponteiro. Posição física do registro.

SEEK(nomedoarquivo,posição);
Posiciona o ponteiro no registro de número posição.

FILESIZE(nomedoarquivo);
Retorna o tamanho do arquivo, ou a quantidade de registros gravados.
 

Exemplo:- O programa abaixo permite a inclusão, alteração, consulta e exclusão de registros em uma arquivo.

program exemplo_registro_arquivo;
uses crt, printer;
type dados_amigo = RECORD
                    codi : string[4];
                    nome : string[25];
                    fone : string[15];
                   END;
     cadastro_amigos = FILE OF dados_amigo;
var REG: dados_amigo;
    ARQ: cadastro_amigos;

procedure introducao;
begin
  textbackground(1);
  clrscr;
  gotoxy(30,5); write('REGISTRO E ARQUIVO');
  gotoxy(10,8);
  write('Este programa contem exemplos de procedimentos para manipulacao de');
  gotoxy(10,10);
  write('arquivos. O objetivo e mostrar de maneira simples diferentes modos');
  gotoxy(10,12);
  write('de manipulacao de arquivos, seja na inclusao, consulta, alteracao,');
  gotoxy(10,14);
  write('exclusao ou emissao de relatorios.');
  gotoxy(10,16);
  write('Procure desenvolver o seu programa, com criatividade ...');
  gotoxy(50,20); write('Tecle algo.');
  readkey;
end;

procedure tela_cabecalho;
var k: byte;
begin
   window(1,1,80,25);
   textcolor(12);
   textbackground(1);
   clrscr;
   for k:=1 to 80 do
      begin
         gotoxy(k,1); write(chr(223));
         gotoxy(k,4); write(chr(223));
      end;
   gotoxy(20,2); write('T E L E F O N E - A M I G O S');
end;

procedure tela_num_reg;
begin
   textcolor(10);
   gotoxy(26,10); write('Nº Registro :');
end;

procedure tela_campos;
begin
   textcolor(12);
   gotoxy(20,12); write('C o d i g o . . . :');
   gotoxy(20,14); write('N o m e . . . . . :');
   gotoxy(20,16); write('F o n e . . . . . :');
end;

procedure tela_campos_numerados;
begin
   textcolor(12);
   gotoxy(16,12); write('    C o d i g o . . . :');
   gotoxy(16,14); write('(1) N o m e . . . . . :');
   gotoxy(16,16); write('(2) F o n e . . . . . :');
   gotoxy(16,18); write('(0) F i m');
end;

procedure abre_janela;
begin
   window(40,10,78,22);
   textcolor(15);
end;

procedure tela_opcao(opcao:byte);
begin
   tela_cabecalho;
   case opcao of
   1: begin tela_campos; gotoxy(56,3); write('INCLUSAO'); abre_janela; end;
   2: begin tela_campos; gotoxy(56,3); write('INCLUSAO'); abre_janela; end;
   3: begin tela_num_reg; tela_campos; gotoxy(56,3);
            write('CONSULTA - REGISTRO'); abre_janela; end;
   4: begin tela_campos; gotoxy(56,3); write('CONSULTA - CODIGO');
            abre_janela; end;
   5: begin tela_num_reg; tela_campos_numerados; gotoxy(56,3);
            write('ALTERACAO'); abre_janela; end;
   6: begin tela_num_reg; tela_campos; gotoxy(56,3);
            write('ALTERACAO'); abre_janela; end;
   7: begin tela_campos; gotoxy(56,3); write('EXCLUSAO'); abre_janela; end;
   8: begin gotoxy(56,3); write('RELATORIO'); end;
   9: begin gotoxy(56,3); write('REORGANIZA'); end;
   end;
end;

procedure abre_arquivo;
begin
   assign(ARQ,'a:AMIGO.DAT');
   {$I-} reset(ARQ); {$I+};
   if ioresult<>0 then rewrite(ARQ);
end;

procedure inclue;
begin
   if filesize(ARQ)>0 then seek(ARQ,filesize(ARQ));
   with REG do
      repeat
         gotoxy(1,3); readln(codi);
         if codi<>'' then
            begin
               gotoxy(1,5); readln(nome);
               gotoxy(1,7); readln(fone);
               write(ARQ,REG);
               gotoxy(10,11); write('Tecle <enter>...');
               repeat until readkey=#13;
               clrscr;
            end;
      until codi='';
end;

procedure consulta_registro;
var numreg:integer;
    op: char;
begin
repeat
   clrscr;
   repeat
      gotoxy(1,1); clreol; readln(numreg);
      if (numreg<0) or (numreg>=filesize(ARQ)) then
            begin
             gotoxy(10,11); write('Registro nao existente.');
             repeat until readkey<>#0;
             clrscr;
            end;
   until (numreg>=0) and (numreg < filesize(ARQ));
   seek(ARQ,numreg);
   read(ARQ,REG);
   with REG do
   begin
       gotoxy(1,3); write(codi);
       gotoxy(1,5); write(nome);
       gotoxy(1,7); write(fone);
   end;
   gotoxy(1,9); write('Continua (S/N)?');
   repeat
      gotoxy(17,9); clreol; readln(op); op:=upcase(op);
   until (op='S') or (op='N');
until op='N';
end;

procedure consulta_codigo;
var codigo_consulta: string[25];
begin
repeat
   clrscr;
   gotoxy(1,3); readln(codigo_consulta);
   with REG do
    if codigo_consulta<>'' then
      begin
         seek(ARQ,0);
            repeat
               read(ARQ,REG);
               if codi = codigo_consulta then
                  begin
                     gotoxy(1,5); write(nome);
                     gotoxy(1,7); write(fone);
                  end;
            until (eof(ARQ)) or (codi=codigo_consulta);
         if codi<>codigo_consulta then
            begin gotoxy(10,9); write('Codigo nao encontrado.'); end;
         gotoxy(10,11); write('Tecle <enter>...');
         repeat until readkey=#13;
      end;
until codigo_consulta='';
end;

procedure altera;
var numreg:integer;
    op: char;
    numcampo:byte;
begin
repeat
   clrscr;
   repeat
      gotoxy(1,1); clreol; readln(numreg);
   until (numreg>=0) and (numreg < filesize(ARQ));
   seek(ARQ,numreg);
   read(ARQ,REG);
   with REG do
   begin
       gotoxy(1,3); write(codi);
       gotoxy(1,5); write(nome);
       gotoxy(1,7); write(fone);
   end;
   gotoxy(1,11); clreol; write('Nº do campo p/ alterar:');
   repeat
     repeat
        gotoxy(25,11); clreol; readln(numcampo);
     until numcampo in [0..2];
     if numcampo<>0 then
     case numcampo of
       1: begin gotoxy(1,5); clreol; readln(REG.nome); end;
       2: begin gotoxy(1,7); clreol; readln(REG.fone); end;
     end;
   until numcampo=0;
   seek(ARQ,numreg);
   write(ARQ,REG);
   gotoxy(1,11); write('Continua alteracao (S/N)?');
   repeat
      gotoxy(27,11); clreol; readln(op); op:=upcase(op);
   until (op='S') or (op='N');
until op='N';
end;

procedure exclue;
var codi_exclue: string[4];
    op: char;
    arqaux: cadastro_amigos;
begin
  repeat
    clrscr;
    gotoxy(1,3); readln(codi_exclue);
    if codi_exclue<>'' then
    with REG do
      begin
        seek(ARQ,0);
        repeat
          read(ARQ,REG);
          if codi = codi_exclue then
              begin
                gotoxy(1,5); write(nome);
                gotoxy(1,7); write(fone);
              end;
        until (eof(ARQ)) or (codi=codi_exclue);
        if codi<>codi_exclue
           then
             begin gotoxy(5,11); write('Codigo nao encontrado.');
                delay(1000); end
           else
             begin
                gotoxy(5,11); write('Confirma exclusao (S/N)? ');
                repeat
                  gotoxy(42,17); clreol; readln(op); op:=upcase(op);
                until (op='S') or (op='N');
                if op='S' then
                   begin
                     REG.codi:='***';
                     seek(ARQ,filepos(ARQ)-1);
                     write(ARQ,REG);
                   end;
             end;
      end;
  until codi_exclue='';
  gotoxy(1,11); write('Reorganiza arquivo (S/N)? ');
  repeat
     gotoxy(42,17); clreol; readln(op); op:=upcase(op);
  until (op='S') or (op='N');
  if op='S' then
    begin
      tela_opcao(9);
      gotoxy(20,15); write('Reorganizando arquivo.');
      assign(arqaux,'a:AUXILIAR');
      rewrite(arqaux);
      seek(ARQ,0);
      repeat
         read(ARQ,REG);
         if REG.codi<>'***' then write(arqaux,REG);
      until eof(ARQ);
      close(ARQ);
      close(arqaux);
      erase(ARQ);
      rename(arqaux,'a:AMIGO.DAT');
      abre_arquivo;
   end;
end;

procedure cabecalho;
const tit= 'A G E N D A - A M I G O S';
var traco: string[80];
    k: byte;
begin
   traco:='';
   for k:=1 to 80 do traco:=traco+'-';
   writeln(lst,traco,#10);
   k:= (80 - length(tit)) div 2;
   writeln(lst,'':k,tit,#10);
   writeln(lst,traco,#10);
   writeln(lst,'':4,'Codigo  Nome','':36,'Fone',#10);
end;

procedure imprime;
var lin, espaco: byte;
begin
   gotoxy(20,15); write('Prepare a impressora e tecle enter.');
   repeat until readkey=chr(13);
   cabecalho;
   lin:=9;
   seek(ARQ,0);
   while not(eof(ARQ)) do
   with REG do
     begin
      read(ARQ,REG);
      espaco:=40-length(nome);
      writeln(lst,'':5,codi:4,'  ',nome,'':espaco,fone);
      lin:=lin+2;
      if lin>=60 then
                 begin
                   writeln(lst,#12);
                   cabecalho;
                   lin:=9;
                 end;
     end;
 writeln(lst,#12);
end;

procedure inclue_sem_repeticao;
var codi_inclue: string[25];
begin
repeat
   clrscr;
   gotoxy(1,3); readln(codi_inclue);
   with REG do
    if codi_inclue<>'' then
      begin
         if filesize(ARQ)>0 then
           begin
             seek(ARQ,0);
             repeat
               read(ARQ,REG);
               if codi = codi_inclue then
                  begin
                     gotoxy(1,5); write(nome);
                     gotoxy(1,7); write(fone);
                     gotoxy(8,9); write('Codigo cadastrado anteriormente.');
                     gotoxy(10,11); write('Tecle <enter>...');
                     repeat until readkey=#13;
                  end;
             until (eof(ARQ)) or (codi=codi_inclue);
           end;
         if codi<>codi_inclue then
           begin
              codi:=codi_inclue;
              gotoxy(1,5); readln(nome);
              gotoxy(1,7); readln(fone);
              write(ARQ,REG);
              gotoxy(10,11); write('Tecle <enter>...');
              repeat until readkey=#13;
              clrscr;
            end;
      end;
until codi_inclue='';
end;

procedure altera_sem_numerar_campo;
var numreg:integer;
    op: char;
    campo: string[25];
begin
repeat
   clrscr;
   repeat
      gotoxy(1,1); clreol; readln(numreg);
   until (numreg>=0) and (numreg < filesize(ARQ));
   seek(ARQ,numreg);
   read(ARQ,REG);
   with REG do
   begin
       gotoxy(1,3); write(codi);
       gotoxy(1,5); write(nome);
       gotoxy(1,7); write(fone);
       gotoxy(1,5); readln(campo);
       if campo<>'' then
         begin gotoxy(length(campo)+1,5); clreol; nome:=campo; end;
       gotoxy(1,7); readln(campo);
       if campo<>'' then
         begin gotoxy(length(campo)+1,7); clreol; fone:=copy(campo,1,6); end;
       seek(ARQ,filepos(ARQ)-1);
       write(ARQ,REG);
       gotoxy(1,11); write('Continua alteracao (S/N)?');
       repeat
          gotoxy(27,11); clreol; readln(op); op:=upcase(op);
       until (op='S') or (op='N');
   end;
until op='N';
end;

procedure menu;
var opcao: byte;
begin
   repeat
      tela_cabecalho;
      gotoxy(30,5); write('1. INCLUIR');
      gotoxy(30,7); write('2. INCLUIR SEM REPETICAO');
      gotoxy(30,9); write('3. CONSULTAR PELO N§ DO REGISTRO');
      gotoxy(30,11); write('4. CONSULTAR PELO CAMPO CODIGO');
      gotoxy(30,13); write('5. ALTERAR');
      gotoxy(30,15); write('6. ALTERAR SEM NUMERAR CAMPO');
      gotoxy(30,17); write('7. EXCLUIR');
      gotoxy(30,19); write('8. IMPRIMIR RELATORIO');
      gotoxy(30,21); write('9. FIM');
      gotoxy(30,23); write('Digite sua opcao:');
      repeat
         gotoxy(48,23); clreol; readln(opcao);
      until opcao in [0..9];
      tela_opcao(opcao);
      case opcao of
         1: INCLUE;
         2: INCLUE_SEM_REPETICAO;
         3: CONSULTA_REGISTRO;
         4: CONSULTA_CODIGO;
         5: ALTERA;
         6: ALTERA_SEM_NUMERAR_CAMPO;
         7: EXCLUE;
         8: IMPRIME;
      end;
   until opcao=9;
end;

begin
   introducao;
   abre_arquivo;
   menu;
   close(ARQ);
end.
 



 

Dúvidas, críticas, sugestões??? Clique aqui.