Capítulo 16

Formato e Conversão de Arquivos
 

  Durante a utilização de um sistema é comum que alterações na estrutura de seus arquivos se façam necessárias, tanto para atender a novos requisitos como para refinar os antigos. Caso um arquivo, que já contenha dados, sofra uma das modificações listadas abaixo, o projetista tem de comandar sua conversão para o novo formato. A execução da nova versão do sistema acusa a necessidade de conversão de algum arquivo que tenha modificação estrutural e não tenha sido convertido, exceto quando, por uma eventualidade, o tamanho total do arquivo em disco permaneça múltiplo exato do novo tamanho do registro.

 

Necessidade de Conversão

 

As situações onde uma conversão é necessária são as seguintes:

  • Inclusão, exclusão ou mudança de posição de Campo Digitado ou Ligado,
  • Alteração em Tamanho de Campo Digitado Cadeia,
  • Alteração em Campo Chave,
  • Alteração em Largura ou Altura de Campo Texto,
  • Passagem de Campo Digitado de Permanente para Não Permanente em memória e vice-versa,
  • Troca de Tipo de Campo Digitado e
  • Troca de Modo de Obtenção de Campo.

Dependendo do tipo de alteração, o projetista necessitará:

  • Utilizar o programa conversor de arquivos ConvArq,
  • Comandar uma atualização global na sua base de dados ou
  • Combinar os 2 métodos acima.
A estratégia recomendada para efetuar estas conversões é:

  1. Emitir uma documentação dos arquivos que sofrerão alterações estruturais.
  2. Alterar suas definições.
  3. Emitir nova documentação.
  4. Definir a sequência de conversões necessárias para adaptar a base de dados à nova definição.
  5. Criar um arquivo de lote (.BAT) com esta sequência.
  6. Levar este arquivo para o ambiente de produção, juntamente com os programas que ele requisitar
  7. Executar a conversão.

É fundamental que o projetista conheça a estrutura de armazenamento em disco dos arquivos LANCE para que possa definir corretamente as sequências de conversão necessárias para modificar suas bases de dados.

 

Formato dos Arquivos

 

Para cada arquivo LANCE definido pelo projetista será criado um arquivo em disco, que conterá os campos declarados como residentes em memória e, opcionalmente, um segundo arquivo que conterá os campos não residentes em memória. O nome e a extensão destes arquivos corresponderá aos declarados pelo projetista no dicionário de dados para os equivalentes LANCE, sendo o nome truncado em 8 caracteres. O arquivo com os campos não residentes em memória terá adicionado ao seu nome o prefixo "_" (sublinhado).

Além destes, o projetista pode ainda definir um arquivo para cada um de seus campos Texto. Mesmo podendo armazenar mais de um campo Texto em um mesmo arquivo em disco, o projetista deve, sempre que possível, definí-los em arquivos individuais, para facilitar as conversões estruturais.

Somente os registros de um Arquivo ou um Parâmetro declarados como Não Temporários são armazenados em disco, com tamanhos de acordo com o Modo de Obtenção, Tipo e permanência ou não Na Memória de seus campos. Estes registros, independente da informação que eles contenham, têm sempre um tamanho fixo. O arquivo em disco terá o tamanho total calculado como uma mera multiplicação do tamanho pela quantidade de registros nele contidos. A descrição da estrutura de um arquivo se encontra no programa executável gerado pelo LANCE e, obviamente, também no dicionário de dados da aplicação.

O LANCE admite também a criação de arquivos que armazenam o resultado de uma ordenação.

 

Formato dos Campos

 

Cada campo definido em um Arquivo ou Parâmetro ocupará tantos bytes quantos necessários para armazenar a informação correspondente ao tipo Pascal que a ele equivale.

  • Pequeno - valor entre 0 e 255 em binário

  • Lógico - 0 se Falso (Não) ou 1 se Verdadeiro (Sim)

  • Inteiro - valor entre 0 e 65.535, obtidos por: (2° byte * 256) + 1° byte

  • Datas - valor entre 0 e 65.535, referente ao número de dias decorridos desde 01/01/1900, obtidos por fórmula equivalente ao Inteiro.

  • Grande - valor entre -2.147.483.648 e +2.147.483.647, obtidos pela fórmula: ((4° byte * 256) + 3° byte) * 65536 + ((2° byte * 256) + 1° byte)

  • Horas - Número de segundos decorridos desde 00:00:00 h, obtidos por fórmula similar à Grande.

  • Real - Número entre -10e39 e 10e38, permitindo decimais e com precisão de 11 dígitos. O 1° byte é o expoente na base 2 e os demais são a mantissa, em ordem inversa de significância (o último byte é o mais significativo).

  • Cadeia - contém no 1° byte o tamanho declarado para a cadeia e nos demais a sequência de caracteres que a compõem, completadas com brancos à direita. Os caracteres de inserção em máscara não ocupam espaço.

  • Texto - no arquivo em disco que armazena os campos em memória, um campo texto tem tamanho de 2 bytes, equivalentes ao número de ordem do registro que contém o texto no arquivo de textos. No arquivo de textos, ele ocupará o equivalente em bytes ao resultado da multiplicação de sua Altura por sua Largura.

  • Ligado com Tabela - contém o n° de ordem do item da Tabela ao qual se liga, no mesmo formato de Pequeno. O valor zero representa ausência de relacionamento.

  • Ligado com Arquivo - contém o n° de ordem do registro pai do Arquivo ao qual se liga, segundo a fórmula de Inteiro. O valor zero representa ausência de relacionamento.

 

Formato dos Registros

 

Conforme já mencionado, os arquivos de armazenamento de dados usados nas aplicações geradas pelo LANCE têm registros de tamanho fixo e com as seguintes descrições:

 

Registro de Arquivo com Todos os Campos em Memória

Os valores 2 e 3 no primeiro byte são gravados temporariamente pela digitação de campo multivalorado. Os campos texto neste registro têm tamanho de 2 bytes, que apontam para o texto em disco.

 

Registro de Arquivo com Algum Campo Não na Memória

Os valores 2 e 3 no primeiro byte são gravados temporariamente pela digitação de campo multivalorado. Os campos texto neste registro têm tamanho de 2 bytes, que apontam para o texto em disco.

 

Registro de Arquivo com os Campos Não na Memória

Os registros de um arquivo em disco que armazenam os campos Não na Memória (_NOMEARQUIVO) não têm bytes de prefixo e contêm somente os campos declarados como Não na Memória, na ordem em foram definidos e com seus respectivos tamanhos.

 

Registro de Arquivo com os Campos Texto

Os registros de um arquivo em disco que armazenam os caracteres de campos Texto também não têm bytes de prefixo e têm tamanho igual ao maior resultado da expressão Largura * Altura dentre os campos Texto que compartilham este arquivo.

 

Parâmetro Não Temporário

O arquivo em disco que armazena os valores de um Parâmetro persistente também não tem bytes de prefixo, começando diretamente com seus campos, na ordem em que foram definidos e com seus respectivos tamanhos. Ele armazena um único registro.

Os caracteres equivalentes aos seus campos Texto ficam armazenados juntos no mesmo arquivo que contém o parâmetro, diferentemente de um Arquivo LANCE. Cada campo texto ocupará 2 bytes para controle do gerenciador seguidos do espaço equivalente a Largura * Altura do campo.

 

Ordenação em Disco

Este tipo de arquivo foi criado para otimizar a ordenação de um arquivo LANCE. Normalmente, quando o operador seleciona uma opção que requer a ordenação de um arquivo para que a ação seja corretamente efetuada, a aplicação gerada executa o algoritmo interno de ordenação e cria, temporariamente e de forma transparente ao usuário, um vetor que representa a ordem desejada. Quando o sistema é basicamente de consultas, o projetista pode optar por salvar em disco estes vetores previamente construídos em arquivos de Ordenação.

Uma ordenação gravada em disco armazena, em 2 bytes por registro, o número de ordem de cada registro que satisfez a visão no momento da criação da ordenação.

Este arquivo de ordenação não é atualizado automaticamente, sendo do projetista a responsabilidade de removê-lo quando seu conteúdo se tornar obsoleto, para que a aplicação gerada o recrie no momento em que for utilizá-lo e, assim, armazene neste arquivo a nova sequência de números de ordem.

 

ConvArq

 

ConvArq é o utilitário que converte os dados armazenados em um Arquivo ou Parâmetro LANCE para um novo formato, segundo uma lista de instruções, com a seguinte sintaxe:

ConvArq Arquivo.ext Instrução1 [... InstruçãoN]

A conversão é recusada caso o tamanho total do Arquivo não seja múltiplo do tamanho do registro calculado em função das instruções informadas. Caso sejam compatíveis, o Arquivo com o formato antigo é renomeado para a extensão .BAK e um arquivo que conterá dados no novo formato é criado.

Nota Ao final de sua execução o ConvArq coloca um código de erro na variável de sistema ErrorLevel (veja Help do DOS), que poderá ser testada em um arquivo de lote (.BAT), com o seguinte significado:

  • 0 se a conversão terminou OK,
  • 1 se o arquivo a ser convertido não foi encontrado ou
  • 2 se o tamanho indicado não corresponde ao esperado para cada registro.

Quando executado, o ConvArq exibe mensagens relativas ao andamento da conversão no vídeo. Executá-lo sem informar nenhuma instrução exibe uma tela com uma descrição sucinta das instruções possíveis.

Nota O projetista pode redirecionar a saída das mensagens para que elas não sejam exibidas no vídeo, utilizando >NUL como se fosse uma última instrução.

A sequência de instruções indica o que fazer em cada registro, através da manipulação de um ponteiro interno para o formato antigo (Antigo) e outro para o formato novo (Novo). Cada instrução tem um dos seguintes formatos:

onde:

  • N e X são valores numéricos
  • C é uma cadeia com no máximo 1 branco entre suas palavras

Na documentação dos campos de uma aplicação, as colunas Ini e Qtd informam, respectivamente, a posição de início e o número de bytes que cada campo ocupa, segundo os tamanhos indicados anteriormente, neste mesmo capítulo. Estas informações são úteis na definição das ações do ConvArq.

Os exemplos a seguir mostram o uso de cada Instrução para realizar cada uma das situações onde a conversão é necessária.

 

Exemplos

 

Cada exemplo abaixo considera os arquivos Fornecedor e Cliente, originalmente com os seguintes campos:

Fornecedor:

  • Nome (Chave, Digitado, Cadeia, 20)
  • Endereço (Digitado, Cadeia, 50)
  • Telefone (Digitado, Cadeia, 11).

onde:

D = byte de deletado,
H = byte de hash,
20, 50 e 11 = bytes de tamanho da cadeia

Cliente:

  • Nome (Chave, Digitado, Cadeia, 20)
  • Grau (Digitado, Pequeno)
  • Comentário (Digitado, Texto em Comentar.XXX , com 10 linhas de 30 caracteres).

onde:

D = byte de deletado,
H = byte de hash,
20 = byte de tamanho da cadeia,
G = byte do Grau,
T = 2 bytes apontando para o Texto do Comentário

Para efeitos didáticos, as alterações serão feitas sempre sobre o arquivo original e uma de cada vez. No caso real, o projetista poderá, em um único comando de conversão, efetuar diversas alterações.

Também para facilitar a compreensão, as instruções serão descritas uma a uma. O projetista poderia somar as instruções de mesmo significado e descrevê-las de uma única vez. Assim:

ConvArq Fornecedor.xxx 2 21 51 +2 12

é equivalente a:

ConvArq Fornecedor.xxx 74 +2 12

 

Inclusão de Campo Digitado ou Ligado

Exemplo Incluir um campo Inteiro após o Endereço

ConvArq Fornecedor.XXX 2 21 51 +2 12

 

Exclusão de Campo Digitado ou Ligado

Exemplo Excluir o campo Telefone

ConvArq Fornecedor.XXX 2 21 51 -12

 

Mudança de Posição de Campo Digitado ou Ligado

Exemplo Colocar o campo Telefone antes do Endereço

ConvArq Fornecedor.XXX 2 21 -51 12 #12 #51 51 -12

 

Alteração de Tamanho de Campo Digitado Cadeia

Exemplo Aumentar o tamanho de Endereço para 60 caracteres

ConvArq Fornecedor.XXX 2 21 -1 +1(60) 50 +10(' ') 12

Exemplo Diminuir o tamanho de Endereço para 40 caracteres

ConvArq Fornecedor.XXX 2 21 -1 +1(40) 40 -10 12

 

Alteração de Campo Chave

Exemplo Aumentar o tamanho do Nome do Fornecedor para 30 caracteres

ConvArq Fornecedor.XXX 1 -1 +1 -1 +1(30) 20 +10(' ') 51 12

 

Alteração de Largura ou Altura de Campo Texto

Exemplo Diminuir a Largura do campo Comentário para 20 caracteres

ConvArq Comentar.XXX 20 -10

Nota No arquivo Cliente.XXX não houve modificação. No arquivo Comentar.XXX não existem os 2 bytes de prefixo.

Exemplo Aumentar a Largura do campo Comentário para 40 caracteres

ConvArq Comentar.XXX 30 +10(' ')

Exemplo Diminuir a Altura do campo Comentário para 5 linhas

ConvArq Comentar.XXX 150 -150

Exemplo Aumentar a Altura do campo Comentário para 15 linhas

ConvArq Comentar.XXX 300 +150(' ')

 

1ª Passagem de Campo Digitado para Não em Memória

Exemplo Passar o Endereço para Não Permanente em Memória

Esta conversão deve ser feita em 3 etapas:

  1. Duplicar o arquivo Fornecedor, para criar o arquivo de campos em disco.

    Copy Fornecedor.XXX _Fornecedor.XXX

  2. Converter a parte em memória, criando os 2 bytes de ponteiro para parte em disco e retirando o campo Endereço.

    ConvArq Fornecedor.XXX 2 +2(#) 21 -51 12

  3. Converter a parte em disco, tirando os 2 bytes de prefixo e os campos que não são em disco.

    ConvArq _Fornecedor.XXX -2 -21 51 -12

 

Exemplo Conjunto

 

Para este exemplo, imagine um cadastro de pessoal (PESSOA.PAG) que, por exigências do usuário, precise sofrer algumas alterações, incluíndo novos campos e alterando alguns já existentes:

Para efetuar estas conversões, utilize o comando:

ConvArq Pessoa.PAG
2 4 -1 +1(20) 15 +5(' ') -6 16 #22 6 -16 +1(10) +10(' ') 1
onde:

Nota Imposto e Telefones são campos que não ocupam espaço, logo não tem instrução para eles.

A conversão só será realizada se o tamanho do arquivo PESSOA.PAG original (antigo) for múltiplo de 45 bytes, que é o somatório das instruções N e -N (=67) menos o somatório das instruções #N (=22).

 

Atualização Global

 

Uma atualização global será necessária quando o projetista não quer apenas criar, excluir ou modificar a posição de campos, mas também alterar o tipo do campo ou seu modo de obtenção e ainda inicializar os novos campos com valores referentes a sua nova situação.

Estes casos normalmente provocam uma conversão em três etapas: incluir um novo campo, atribuir a este novo o valor do campo antigo em uma Atualização Global e excluir o campo anterior.

Exemplo Trocar o Tipo do campo Grau de Pequeno para Real
  1. Incluir um campo Real na aplicação (GrauReal), sem tirar o campo pequeno (Grau), regerar a aplicação e processar a primeira conversão:

    ConvArq Cliente.XXX 2 21 1 +6 2

  2. Executar uma Atualização Global para atribuir o campo antigo no novo

    • No LANCE, selecionar Serviços no Menu de Projeto, seguido de Atualizar.
    • Dar um nome para a atualização, como por exemplo, MudaGrau.
    • Selecionar o Arquivo Cliente sem Visão, Condição e Ordenação
    • Nas linhas de comando, informar:

      altGrauReal (Grau);
    O programa MudaGrau.EXE será criado e a atualização será executada imediatamente no diretório corrente.

  3. Tirar o campo Pequeno, mantendo apenas o Real (trocando seu nome para Grau), regerar a aplicação e executar a última conversão:

    ConvArq Cliente.CAD 2 21 -1 6 2

  4. Criar um arquivo de lote (.BAT) com os comandos utilizados na conversão, de forma a levá-lo, juntamente com o programa MudaGrau.EXE, para o ambiente de produção:

    ConvArq Cliente.XXX 2 21 1 +6 2
    MudaGrau
    ConvArq Cliente.CAD 2 21 -1 6 2