
A linguagem OPUS permite atualizações de registros em arquivos externos ao OpenBASE.
Os arquivos externos nem sempre são criados pela OPUS, como por exemplo, os arquivos da COBOL. A única restrição na utilização destes arquivos se refere aos arquivos indexados, pois possuem estrutura própria. A OPUS desconhece estas estruturas, denominadas de proprietárias, portanto, só permite acesso seqüencial para leitura desses arquivos.
Arquivos externos são definidos pela OPUS através de visões, denominadas micro-esquemas, que correspondem à estrutura da área de dados do arquivo. A área reservada para cada item do arquivo é identificada pela OPUS por um nome em relação ao deslocamento do tamanho deste item no registro.
De modo geral, para realizar operações sobre um arquivo externo, deve-se especificar o nome do micro-esquema após o comando USE ou definir a estrutura do arquivo dentro do próprio programa-fonte. Desta forma, o micro-esquema é incorporado a esta fonte durante a compilação do programa e seus itens são declarados como variáveis locais.
Um micro-esquema é um arquivo texto que contém a estrutura do arquivo externo.
Numa aplicação, caso o arquivo externo referenciado em um micro-esquema não exista, ele será criado automaticamente, no momento da execução do programa.
Existem várias maneiras de se definir um micro-esquema que serão descritas a seguir, mas todas seguem a mesma forma. Define-se a estrutura de um arquivo externo em dois passos:
A primeira linha não vazia descreve o arquivo e deve conter as seguintes informações, como mostra a Sintaxe
<nome> <tipo> LEN (<tamanho>) [<modo>] [EXCLUSIVE]
Onde:
|
<nome> |
representa o nome do arquivo externo |
Pode ser:
O caractere $ (cifrão), determina que o nome do arquivo será definido pela variável FILE.
O nome de um arquivo externo não deve ultrapassar 79 caracteres.
<tipo> representa o tipo do arquivo externo.
Os arquivos externos podem ser dos seguintes tipos:
L e M - Seqüencial em linha
Estes tipos de arquivos possuem um tamanho de registro variável e todo registro deve terminar com um caractere de nova linha (NL = \n). São excluídos os brancos à direita.
O tipo L não permite a alteração no tamanho do registro em comandos CHANGE. Nos comandos DELETE, os registros são preenchidos com -. A inclusão de registros é feita no final do arquivo com o comando APPEND.
O tipo M permite a alteração de registros em comandos CHANGE, pois cria-se um novo arquivo. Pela mesma razão, os comandos DELETE excluem efetivamente os registros do arquivo e o comando INSERT permite inserir registros no meio do arquivo.
S - Seqüencial
Este tipo de arquivo tem tamanho de registro fixo e não contém o caractere de nova linha.
I - Indexado
Este tipo de arquivo tem estrutura proprietária da linguagem OPUS e seu primeiro item deve ser o item chave. Não permite duplicidade de valores para chave (chave única).
R - Relativo
Este tipo de arquivo tem tamanho de registro fixo e todo registro deve terminar com um caractere de nova linha (NL = \n).
X - Indexado
Este tipo de arquivo tem estrutura proprietária da linguagem OPUS e seu primeiro item deve ser o item chave. Não permite duplicidade de valores para chave (chave única).
<tamanho> representa o tamanho total do registro (tamanho do maior registro).
<modo> representa o modo para utilização do arquivo.
Pode ser:
INPUT somente para leitura.
OUTPUT somente para gravação.
Por omissão é assumido INPUT / OUTPUT.
EXCLUSIVE determina exclusividade de utilização do arquivo. Só para arquivos indexados.
Notas:
As linhas subseqüentes não vazias descrevem os campos do registro e devem conter as seguintes informações, como mostra a Sintaxe
<item> <tipo_tamanho> [POS <número>] [KEY]
Onde:
<item> |
Representa o nome do campo do arquivo. Deve se iniciar por letra, ter no máximo 12 caracteres e não ter duplicata. |
|
<tipo_tamanho> |
Representa o tipo e o tamanho do item. |
|
POS <número> |
Informa a posição inicial do item no registro, permitindo redefinição de itens. Todo registro começa na posição 1. Um campo pode redefinir outro, isto é, possuir posições comuns no registro. No programa que utilizar os campos, estes serão vistos como variáveis distintas. Por este motivo, na inclusão de registros, os campos que redefinem outros devem ser ignorados. |
|
KEY |
Determina que o campo será a chave única de arquivo indexado. |
Utiliza-se um editor de textos, e segue-se a sintaxe descrita anteriormente.
Exemplo 1
Neste exemplo criaremos um arquivo seqüencial de nome ag_tel de tamanho 89. Note que o tamanho é o somatório do tamanho de todos os campos. Nome do micro-esquema agenda_tel.d.
ag_tel S LEN(89)
nome U20
tele U14
ende U50
cep N05
Exemplo 2
Neste exemplo criaremos um arquivo indexado de nome /usr/arq/empresas onde a chave será o campo com o CGC da empresa. Nome do micro-esquema: empresas.d.
/usr/arq/empresas I LEN(104)
emp_cgc N14 KEY
emp_nom U50
emp_rua U25
emp_num N08
emp_cep N05
emp_uf U02
emp_end U40 POS 64
Exemplo 3
Neste exemplo criaremos um arquivo temporário com a estrutura do arquivo descrito no primeiro exemplo. Nome do micro-esquema: tmp_agtel.d.
# S LEN(89)
nome U20
tele U14
ende U50
cep N05
Exemplo 4
Podemos definir vários arquivos externos em um único micro-esquema (biblioteca de micro-esquemas). Utilizaremos os exemplos anteriores para demonstrar este recurso. Neste caso utiliza-se o editor de textos para criar a biblioteca e para identificar cada módulo (micro-esquema). Utiliza-se o caractere % (percentual), que deve ser o primeiro caractere da linha, seguido do nome do micro-esquema.
Exemplo
Nome da biblioteca bib_est.d.
%ag_tel
ag_tel S LEN(89)
nome U20
tele U14
ende U50
cep N05
%empresas
/usr/arq/empresas I LEN(104)
emp_cgc N14 KEY
emp_nom U50
emp_rua U25
emp_num N08
emp_cep N05
emp_uf U02
emp_end U40 POS 64
%tmp_agtel
# S LEN(89)
nome U20
tele U14
ende U50
cep N05
