A linguagem OPUS

Propaganda
A linguagem OPUS
$OLQJXDJHP2386HR2SHQ%$6(
A linguagem OPUS permite acessar Bancos de Dados OpenBASE assim como seus registro e itens.
Bancos de Dados são abertos através do comando DATABASE. O acesso aos arquivos e itens de
dados é feito utilizando-se um amplo e completo conjunto de comandos e funções.
Um programa escrito na linguagem OPUS pode utilizar, simultaneamente, um ou mais Bancos de
Dados OpenBASE. Em tempo de execução, podem-se mudar os Bancos de Dados utilizados, bastando
para isso, alterar os valores das variáveis NAME, SECURITY, LEVEL e MODE, os comandos ou as
funções NEWLEVEL() e FOPEN(), entre outras.
As variáveis dos Bancos de Dados OpenBASE utilizadas em programas OPUS são tratadas como
variáveis de memória, correspondendo ao seu tipo definido no esquema do Banco de Dados.
A OPUS permite JOINS automáticos sem necessidade de uma leitura adicional de arquivos de Bancos
de Dados, bastando declarar o nome dos itens que se pretende ler. Se o arquivo selecionado tiver
ligação, a OPUS permite a leitura destes itens, retornando os seus valores, mesmo que a ligação não
seja direta. Isto só é possível para relacionamentos de N para 1.
1.1
Acesso aos Bancos de Dados
Existem vários tipos de leitura para um arquivo de um Banco de Dados OpenBASE, conforme veremos
a seguir.
1.1.1
Leitura por chave primária
Somente para arquivos ENTIDADE e TABELA (tipos E e T). São utilizados o comando FIND e a
função FFIND ().
1.1.2
Leitura em cadeia
Serve para qualquer arquivo, pois atua sobre chaves secundárias. Se divide em dois tipos:
Igualdade de valores. São utilizados o comando SEEK e as funções FSEEK (), FLSEEK ().
Prefixo de chaves tipo caractere. São utilizados o comando SEEK e as funções FPSEEK (),
FLPSEEK ().
Uma cadeia é composta pelos registros que atenderam a pesquisa, ou seja, possuem um mesmo valor
para um item de busca.
ƒ
ƒ
1.1.3
Leitura seqüencial
Para qualquer tipo de arquivo, independendo de chave. Utiliza-se o comando LOCATE.
1.1.4
Leitura direta pelo endereço
Para qualquer tipo de arquivo, ignorando a chave selecionada. Utiliza-se o comando GO.
1.1.5
Leitura recursiva
Para qualquer tipo de arquivo. Isto possibilita que sejam feitos vários tipos de leitura em um mesmo
arquivo, sem perder o ponteiro nem o contexto das leituras anteriores. Utilizam-se os comandos SAVE
e RESTORE.
1.1.6
Exemplo de esquema
Os exemplos dos elementos que acessam Banco de Dados OpenBASE, foram baseados no seguinte
exemplo de esquema:
<< -------------------Banco de Dados parcial da Empresa----------------------->>
banco bdemp1 33 arqrecup
<< ---------------Declaração das Tabelas do Banco de Dados------------>>
relacoes:
<< ----------------------------TABELA DE CLIENTES------------------------->>
nome: tab_clie E
registro:
id0_clie (2)
n03
<< Código >>
nom_clie
u30
<< Nome >>
<< ------------------ARQUIVO DE TEXTO (OBS / CLIENTE)-------------->>
nome: tab_obsc F
registro:
id1_clie (tab_clie) n03
<< Código do Cliente >>
obs_clie
u80
<< Observação >>
<< ------------------------TABELA DE FUNCIONÁRIOS--------------------->>
nome: tab_func E
registro:
id0_func (3)
n03
<< Código >>
nom_func
u35
<< Nome >>
dat_func
d02
<< Data de Nascimento >>
cur_func
m04
<< Curriculum >>
<< ------------------------TABELA DE VENDEDORES------------------------- >>
nome: tab_vend F
registro:
id1_func (tab_func)
n03 UNICA
<< Código do Vendedor >>
set_vend
u30
<< Setor de Venda >>
com_vend
n08,2
<< Comissão >>
<< -----------------------TABELA DE DEPENDENTES------------------------->>
nome: tab_depe F
registro:
id2_func (tab_func)
n03
<< Código do Responsável >>
par_depe (0)
u10
<< Grau de Parentesco >>
dat_depe
d02
<< Data de Nascimento >>
<< ---------------------TABELA DE NOTAS FISCAIS------------------------- >>
nome: tab_nfis L
registro:
id0_nfis (1)
n03
<< Número da nota >>
cli_nfis (tab_clie) n03
<< Código do cliente >>
ven_nfis (tab_func)
n03
<< Código do vendedor >>
tot_nfis
p10,2
<< Total da nota >>
dat_nfis
d02
<< Data de Emissão >>
<< ------------------------TABELA DE PRODUTOS---------------------------- >>
nome: tab_prod E
registro:
id0_prod (2)
n03
<< Código >>
des_prod
u20
<< Descrição >>
prc_unip
p08,2
<< Preço Unitário >>
qtd_estp
n05
<< Quantidade Estocada >>
uni_medp
u01
<< Unidade de medida >>
<< ----------------TABELA DE ITENS DA NOTA FISCAL----------------->>
nome: tab_item A
registro:
id0_item (0)
n06
<< Código Item >>
seq_item
n03
pos id0_item
id1_nfis (tab_nfis)
n03
pos id0_item +3 << Código NF >>
id1_prod (tab_prod)
n03
<< Código Produto >>
qtd_prod
i02
<< Quantidade >>
<< -------------------------TABELA DO PRODUTO---------------------------->>
nome: tab_comp R
registro:
id2_prod (tab_prod)
n03
<< Composto de >>
id3_prod (tab_prod)
n03
<< Componente de >>
1.2
Arquivos externos
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 programafonte. 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.
1.2.1
Micro-esquemas
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.
1.2.2
Definição de um micro-esquemas
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:
• Uma constante representando o nome completo do arquivo externo, isto é, percurso mais o
nome. Caso se omita o percurso o arquivo utilizado será pesquisado no diretório corrente.
• O caractere # (sustenido), determina a utilização de um arquivo temporário a ser criado pela
aplicação. Ao término da aplicação o arquivo é eliminado automaticamente. Este arquivo é
criado no diretório definido pelo comando $TMP.
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.
1.2.3
Tipos de 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:
•
•
•
•
•
Nas operações de exclusão (DELETE) de registros de arquivos externos, os registros
excluídos não são excluídos fisicamente do arquivo, são marcados como inexistentes. Isto só
não ocorre nos arquivos tipo M, onde para cada exclusão, todo o arquivo, menos o registro
removido é copiado para um arquivo temporário.
Em seguida, o arquivo é removido e o arquivo temporário é renomeado com o nome do
arquivo externo.
Arquivos tipo I (indexado) devem ter tamanho de até 16 MB.
Arquivos tipo X (indexado) podem ter tamanho maior que 16 MB, porém estes arquivos são
incompatíveis com arquivos tipo I.
Em arquivos tipo L (seqüencial em linha) só é possível declarar itens tipo U e N (alfanumérico
e numérico respectivamente).
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>
<tipo_tamanho>
POS <número>
KEY
1.2.4
Representa o nome do campo do arquivo. Deve se iniciar por letra, ter no
máximo 12 caracteres e não ter duplicata.
Representa o tipo e o tamanho do item.
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.
Determina que o campo será a chave única de arquivo indexado.
Exemplos de micro-esquema
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
nome
tele
ende
cep
S LEN(89)
U20
U14
U50
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
emp_cgc
N14
emp_nom
U50
emp_rua
U25
emp_num
N08
emp_cep
N05
emp_uf
U02
emp_end
U40
I LEN(104)
KEY
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 microesquemas). 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 microesquema.
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
emp_nom
emp_rua
emp_num
emp_cep
emp_uf
emp_end
%tmp_agtel
# S LEN(89)
nome U20
tele
U14
ende U50
cep
N05
1.3
N14
U50
U25
N08
N05
U40
KEY
U02
POS 64
Variáveis e expressões OPUS
A linguagem de programação OPUS permite que sejam declarados vários tipos de variáveis e
expressões.
1.3.1
Variáveis da OPUS
Variáveis são locais da memória que contém por um determinado tempo valores de um tipo de dado.
Toda variável em OPUS deve ser referenciada por um nome que a identifique entre as demais.
Em OPUS a criação das variáveis é realizada em tempo de compilação, possibilitando uma
modularidade no processo de programação, já que para entender uma rotina deve-se entender todas as
rotinas envolvidas com a sua chamada. Cada rotina é um procedimento que deve ser compreendido no
contexto de sua definição no arquivo-fonte. Isto proporciona um aumento de velocidade na execução
do programa, já que nada é resolvido em tempo de execução (processo interpretativo).
As variáveis da OPUS estão divididas em classes, dependendo de sua duração e abrangência.
São elas:
♦ Variáveis locais ou privadas.
♦ Variáveis globais ou públicas.
♦ Variáveis estáticas.
♦ Arranjos de variáveis ou vetores.
1.3.1.1
Variáveis locais ou privadas
Variáveis locais ou privadas são todas as variáveis de um programa. Tem tempo de vida curto, duram
somente enquanto durar o procedimento.
Podem ser declaradas com o comando STORE ou com o comando PRIVATE.
Quando um programa-fonte descrever somente um módulo, não há necessidade de se declarar variáveis
locais com o comando PRIVATE. Isto só é necessário em dois casos:
• Quando o programa-fonte descreve mais de um programa ou módulo, e se declarar o comando
$PUBLIC.
• Quando for necessário que a variável caractere tenha tamanho maior que o definido no
comando $LEN.
1.3.1.2
Variáveis globais ou públicas
Variáveis globais ou públicas são todas as variáveis de um programa declaradas pelo comando
PUBLIC ou em programas definidos em um único programa-fonte pelo comando $PUBLIC. Tem
tempo de vida longo, duram enquanto durar o programa.
Seu conteúdo é reconhecido por todos os módulos do programa em que tenha sido declarada, podendo
ser alterado em qualquer parte do programa, alterando assim seu valor para todo o programa.
1.3.1.3
Variáveis estáticas
Variáveis estáticas são variáveis que não perdem seu valor durante todo o programa. Tem escopo local,
isto é, são entendidas somente pelo módulo que as declarou.
Este tipo de variável é uma mescla de variável privada e pública, pois tem escopo local, mas
armazenam seus valores durante todo o programa. São muito utilizadas como acumuladores.
São declaradas pelo comando STATIC.
1.3.1.4
Arranjos ou vetores
Arranjos ou vetores são variáveis indexadas e seguem o mesmo esquema de definição de qualquer
variável de memória. É permitido a um vetor pertencer a qualquer uma das classes descritas
anteriormente. São declaradas pelo comando DECLARE.
1.3.2
Expressões OPUS
Expressões são combinações de valores de mesmo tipo, e ficam armazenadas durante a combinação em
variáveis temporárias, que são variáveis internas que a OPUS utiliza para trabalhar com expressões e
variáveis do usuário. Os tipos de variáveis utilizadas na linguagem OPUS, dentro de expressões, são:
• Caractere
• Numérica
• Data
• Lógico
• FLOAT
• NULL
1.3.3
Regras para criação de variáveis
As variáveis de memória são aquelas criadas pelo usuário e identificadas por um nome.
As variáveis de banco de dados OpenBASE ou de arquivos externos, são aquelas referenciadas pelo
programa, mas declaradas em um esquema. Elas são reconhecidas pelo seu nome no esquema.
Toda variável de memória tem um nome definido pelo usuário. O nome pode ser formado pela
combinação de até 15 caracteres, sendo que o primeiro deles é obrigatoriamente uma letra e os demais
podem ser algarismos ou caractere sublinhado.
Em alguns compiladores C, o tamanho do nome das variáveis é limitado a oito caracteres. Nestes casos,
a OPUS cria uma tabela durante a compilação contendo os nomes internos das variáveis cujo nome
ultrapasse sete caracteres. Isto só é possível para variáveis locais. Para nomes externos (variáveis
públicas, nomes de procedimentos e funções de usuário) isto não é possível (veja o manual do
seu compilador C).
1.3.4
Variáveis do Banco e externas
Podem ser utilizadas diretamente pelo programa através da referência ao seu nome, conforme
declarado no arquivo. Quando uma variável de memória recebe o conteúdo de um item de um BD
OpenBASE ou de um arquivo externo, ou a operação inversa, todas as conversões necessárias são
realizadas de forma transparente conforme a seguinte tabela:
Item do
Variável de memória
Arquivo
Tipo numérico (binário sem sinal)
tipo I
Tipo numérico (binário com sinal)
tipo B
Tipo numérico
tipo N
Tipo numérico (com sinal)
tipo S
Tipo numérico (compactado sem sinal)
tipo P
Tipo numérico (compactado com sinal)
tipo C
Tipo cadeia
tipo U
Tipo data ou caractere (ver $DATE)
tipo D
Tipo lógico
tipo L
Tipo FLOAT
tipo F
1.4
Operadores OPUS
Operadores são símbolos que, junto com funções constantes e variáveis, formam expressões que
possibilitam a transformação de valores para se obter um resultado do mesmo tipo dos valores
operados.
A seguir listamos os operadores e os tipos de dados manipulados por eles.
1.4.1
Operadores cadeia
Os operadores cadeia são operadores binários que requerem dois operandos constituídos por caracteres,
retornando um valor do mesmo tipo. O operador + concatena expressões cadeia.
1.4.2
Operadores lógicos
São operadores binários, com exceção do operador .NOT. que é um operador de prefixo unário.
.AND.
E
.OR.
Ou
.NOT. ou !
Negação
Esses operadores retornam um valor verdadeiro nos seguintes casos:
• O operador .AND. retorna verdadeiro (.T.) quando ambas as expressões avaliadas são verdadeiras.
O operador .OR. retorna verdadeiro (.T.) quando ao menos uma das expressões avaliadas for
verdadeira.
• O operador ..NOT. retorna verdadeiro (.T.) quando a expressão avaliada for falsa (.F.)
Veja a tabela abaixo:
.AND
.T.
.F.
.OR.
.T.
.F.
.NOT.
.T.
.F.
.T.
.T.
.F.
.T.
.T.
.T.
.F.
.T.
.F.
.F.
.F.
.F.
.F.
.F.
•
1.4.3
Operadores matemáticos
São operadores binários que requerem dois operandos numéricos, e retornam um valor numérico.
%
Módulo (resto de uma divisão)
*
Multiplicação
+
Adição ou positivo unário
Subtração ou negativo unário
/
Divisão
()
Agrupa ou altera a ordem das operações
1.4.4
Operadores relacionais
São operadores binários que requerem dois operandos de mesmo tipo, e retornam um valor lógico.
Não igualdade entre expressões
!=, # ou <>
Menor que
<
Menor ou igual que
<=
Igualdade entre expressões
=
Maior que
>
Maior ou igual que
>=
Verifica se uma cadeia esta contida em outra
$
Verifica se uma cadeia e igual ao prefixo de outra
$=
Agrupa ou altera a precedência das comparações
()
1.5
Programas Opus
Um programa em OPUS deve ser constituído de pelo menos um módulo principal (PROGRAM) ou ser
dividido em módulos. Os módulos podem ser sub-rotinas (PROCEDUREs) e/ou funções definidas
pelo usuário (FUNCTIONs). Os programas-fontes em OPUS podem ser escritos de três maneiras:
1.5.1
Um módulo por programa fonte.
Esta é a forma mais aconselhável, pois, além de possibilitar que para cada fonte seja gerado um
programa-objeto e que este seja identificado pelo programa-fonte que o gerou, permitindo uma
compilação mais rápida.
1.5.2
Vários módulos num programa fonte.
Esta é uma maneira de declarar em um único programa-fonte vários módulos que serão compilados,
gerando um único programa-objeto.
Programando-se desta maneira perde-se muito tempo em compilação, pois se um programa-fonte
possui 20 módulos e altera-se um módulo, todos os 20 serão compilados para gerar o programa-objeto.
1.5.3
Vários módulos num programa fonte
Esta é uma forma de armazenar todos os programas-fontes (biblioteca de fontes) de um sistema em um
único arquivo, bastando, para isso, que cada módulo dentro da biblioteca seja precedido do caractere %
(percentual), mais o nome do módulo na primeira coluna da linha.
Notas:
•
•
•
•
•
•
Todo arquivo que contenha programas-fontes em OPUS deve terminar com a extensão .f. (Os
programas-fontes em OpusWin podem terminar também com a extensão .fw).
Deve-se desenvolver uma sistemática para codificação de nomes de programas de forma a se
obter uma padronização.
Uma linha de programa só pode possuir um único elemento, ou seja, cada elemento em uma
linha.
Para continuar um elemento na linha seguinte coloca-se um ponto e vírgula (;) no final da
linha.
Linhas em branco são ignoradas.
Os comentários podem ser especificados assim:
•
•
1.6
ƒ Uma linha que tenha um asterisco (*) na primeira posição tem efeito de comentário
ƒ Um bloco de comentários (podendo ocupar várias linhas) inicia com um /* e termina
com */, sempre codificados na primeira posição de uma linha de código fonte
ƒ Comentários especificados na mesma linha do código fonte iniciam por &&
Os programas-fontes podem ser escritos com letras maiúsculas ou minúsculas.
Ver comando FUNCTION, PROCEDURE e PROGRAM.
Compilação de programas Opus
Para compilar um programa OPUS basta invocar o compilador OPUS seguido do nome do programafonte que se deseja compilar, da seguinte forma:
Opus <opções> arqfonte
Não é preciso especificar a extensão “.f". O compilador se encarrega de procurar um arquivo que, além
do nome dado, tenha a extensão.
Existe uma série de opções para o compilador OPUS que são passadas na linha de comando.
A sintaxe do compilador é a seguinte:
Opus [-O -t -f -i -l -e -a<arqlis> -p<prglis> -b<módulo>] arqfonte
As opções são:
-t
lista <arqfonte> na tela durante a compilação (DEFAULT).
-f
não lista <arqfonte> durante a compilação.
-i
lista <arqfonte> na impressora padrão (inibe -t).
-l
não invoca o ligador após a compilação.
-e
não executa o programa após a compilação.
-a
grava a listagem de <arqfonte> no arquivo <arqlis>.
-p
cria um PIPE para o programa <prglis> da listagem de <arqfonte>.
-b
compila <módulo> na biblioteca de fontes <arqfonte>.
-O
invoca o otimizador na compilação da fonte C gerada pela OPUS.
Os programas Opus podem ser compilados de maneira estática ou dinâmica.
Programas compilados estaticamente incluem dentro do módulo executável todas as rotinas utilizadas,
sejam rotinas da linguagem (libfacbib) ou rotinas de acesso aos Bancos de Dados (libbd)
Programas compilados dinamicamente possuem módulos executáveis de menor tamanho pois as rotinas
utilizadas, sejam elas da linguagem (libfacbib.so) ou de acesso a Bancos de Dados (libbd.so), são
carregadas em tempo de execução.
Para isto basta especificar as bibliotecas libbd.so (accesso a bancos de dados) e libfacbib.so (rotinas da
linguagem Opus). Ao utilizar estas bibliotecas, uma aplicação Opus só faz acesso a elas em tempo de
execução e, não mais em tempo de linkedição. Com isso, o tamanho do programa executável diminui
em até 95%. Além disso, caso haja alguma alteração nas bibliotecas libbd e libfacbib, não será
necessária a recompilação do programa.
Observação: Esta opção só está disponível para o Linux.
&RQWUROHGRDPELHQWH2386
Neste capítulo apresentamos as opções de controle do ambiente disponíveis na linguagem OPUS. Para
cada opção veremos:
• Seu propósito e utilidade
• Sua sintaxe de utilização
• Os argumentos necessários
• Os exemplos
• As referências úteis
2.1
2.1.1
$CLIENT
Propósito
Alterar o servidor de banco de dados.
2.1.2
Sintaxe
CLIENT [<exp.C>]
2.1.3
Argumentos
<exp.C>
Representa o nome do servidor da rede, onde se encontra o banco de dados
OpenBASE.
2.1.4
Utilização
Esta função informa o nome do servidor onde se encontra o banco de dados a ser utilizado pelo
programa.<servidor> pode ser o endereço do host, o nome oficial ou qualquer um de seus "aliases",
estas informações são encontradas no arquivo "/etc/hosts".
Esta função quando invocada, fecha o banco de dados que estiver aberto, abandona o servidor atual e
troca-o por um novo servidor no host informado por <exp.C>.
Retorna verdadeiro (.T.), quando a operação for efetuada com sucesso, caso contrário, retorna falso
(.F.).
Deve-se declarar o comando $CLIENT para que o programa seja linkeditado com a biblioteca
"libbdcli.a".
2.1.5
Exemplo
O exemplo a seguir mostra como cancelar o servidor "host.01" e abrir o banco de dados bdemp1 no
servidor "host.02".
$ CLIENT = "host.01"
PROG
IF CLIENT ("host.02")
DATABASE bdemp1 1 a 2
IF DBERR() # 0
? "Erro na abertura do banco de dados"
? DBMESS ()
ELSE
? "O banco foi aberto"
ENDIF
ELSE
? "Não encontrou host.02"
QUIT (1)
ENDIF
2.1.6
Consulte
CLIENT( ).
2.2
2.2.1
$COLOR
Propósito
Aumentar memória de vídeo para salvar telas coloridas.
2.2.2
Sintaxe
$ COLOR
2.2.3
Utilização
Reserva uma área de memória para o salvamento e restauração de telas coloridas. Utilizado em
conjunto com as opções $SCREEN e $SSCREEN, permite guardar as cores de frente e fundo de cada
caractere salvo em uma tela.
2.2.4
Consulte
$SCREEN, $SSCREEN e SET COLOR.
2.3
AMBIENTE
É possível selecionar as opções para o comando OPUS $ via as variáveis de ambiente do UNIX.
Estas variáveis são:
2.3.1
OpusOpt
Quando selecionada indica ao compilador quais opções este deve seguir durante a compilação de um
fonte OPUS, o que eqüivale a usar estas opções dentro do próprio fonte com o comando “$”.
2.3.2
DirLib
Quando selecionada indica o diretório onde as bibliotecas de sistema da OPUS estão localizadas
(libfacbib.a e libbd.a).
2.3.3
DirInc
Quando selecionada indica o diretório onde os arquivos de inclusão de sistema da OPUS estão
localizados (types.h, tsobjects.h, etc.)
2.3.4
Exemplo
Informar ao compilador OPUS que os programas compilados irão usar a versão 5.3 e as bibliotecas do
usuário. Para fazer isto, selecione as variáveis seguintes:
$ PATH = /V5.3:$PATH
$ DIRLIB = /V5.3/lib
$ DIRINC = /V5.3/include
$ OPUSOPT = “library = mesmalib.a, dirlib, dirinc”
$ export PATH DIRLIB DIRINC OPUSOPT
2.4
$CONVNEED
2.4.1
Propósito
Evitar conversões de dados desnecessárias.
2.4.2
Sintaxe
$ CONVNEED
2.4.3
Utilização
Nos comandos de leitura (FIND, SEEK e LOCATE), o conteúdo de todo o registro lido é convertido
para item de memória, além destes são convertidos os itens de outros arquivos lidos por JOIN
automático.
Esta opção inibe a conversão total e automática, sendo assim, os itens de banco de dados só serão
convertidos no momento de sua utilização, agilizando em alguns casos o processamento do
programa.
A utilização desta opção deve ser criteriosa, pois não permite JOINS automáticos já que isso
inviabilizaria a otimização.
2.5
$DATE
2.5.1
Propósito
Determinar a utilização de variáveis do tipo data.
2.5.2
Sintaxe
$ DATE
2.5.3
Utilização
Possibilita a realização de operações aritméticas com datas, sem a necessidade de convertê-las em
números.
Variáveis do tipo data são variáveis declaradas através das funções DATE(), CTOD() ou itens tipo D2.
2.5.4
Exemplo
O exemplo a seguir mostra a sua utilização em um programa.
$DATE
PROG
meu_nascimento = CTOD("25/12/56")
hoje = DATE()
?"Do meu nascimento até hoje se passaram "hoje - meu_nascimento ," dias
? "Hoje é dia ", DAY(hoje)
? "Amanhã será dia ", DAY(hoje + 1)
"
O exemplo a seguir mostra o mesmo programa sem a opção $DATE. Note-se que as variáveis são
numéricas.
PROG
* Convertendo cadeia para número
* meu_nascimento e hoje são variáveis numéricas
meu_nascimento = CTOD("25/12/56")
hoje = CTOD(DATE())
? "Do meu nascimento até hoje se passaram ",;
hoje - meu_nascimento ," dias"
? "Hoje é dia ", DAY(hoje)
? "Amanhã será dia ", DAY(hoje + 1)
2.5.5
Consulte
CTOD( ) e DTOC( ).
2.6
$FILES
2.6.1
Propósito
Determinar o número máximo de arquivos abertos para um banco de dados.
2.6.2
Sintaxe
$ FILES = <numero>
2.6.3
Argumentos
<numero>
2.6.4
representa o número máximo de arquivos abertos simultaneamente.
Utilização
As rotinas de acesso ao banco de dados OpenBASE, administram os arquivos do banco de dados,
utilizando apenas 60% do máximo de arquivos abertos permitido pelo sistema operacional. Os 40%
restantes são reservados para arquivos externos e arquivos temporários.
Este comando é utilizado para diminuir o número de arquivos de um banco de dados OpenBASE
abertos simultaneamente, permitindo assim, que sobre mais área para arquivos externos e temporários.
Recomenda-se verificar quantos arquivos seu sistema operacional permite abrir, simultaneamente.
2.7
$FIELDS
2.7.1
Comando:
$ FIELDS
2.7.2
Propósito
Alterar o número máximo de campos em arquivos externos.
2.7.3
Sintaxe
$ FIELDS = <numero>
2.7.4
Argumentos
<numero>
2.7.5
representa o valor máximo de campos.
Utilização
Em programas que necessitam de arquivos externos com número de itens maior que 512 (DEFAULT).
<numero>
deve estar entre 1 e 5000, inclusive
2.8
$FLOAT
2.8.1
Propósito
Determinar a utilização de variáveis tipo FLOAT.
2.8.2
Sintaxe
$ FLOAT
2.8.3
Utilização
Possibilita a declaração de variáveis de ponto flutuante.
Este comando faz com que toda e qualquer variável numérica seja tratada como de ponto flutuante,
salvo as declaradas pela função FTON().
Variáveis FLOAT são úteis pois agilizam os processos aritméticos , e devem ser utilizadas em
PROCEDURES ou FUNCTION que executem muitos cálculos.
O uso deste comando deve ser limitado às rotinas de cálculo, pois todo e qualquer numérico é
convertido para FLOAT e depois para numérico, gastando tempo nesta conversão.
Útil para diminuir o consumo de memória, pois variáveis numéricas ocupam 21 bytes ao passo que as
variáveis FLOAT ocupam 8 bytes cada.
Economiza-se muito em vetores numéricos, exageradamente grandes, nestes casos utilizar a função
NTOF( ).
As funções numéricas da biblioteca LIBFACBIB não são afetadas por este comando, retornando assim
valores numéricos. Para alterar o retorno destas funções utilizar o comando $FLOATFUN.
2.8.4
Exemplo
O exemplo a seguir mostra como utilizar esta opção. Experimente tirar a linha, com o comando
$FLOAT e verifique a diferença do tempo de execução.
$FLOAT
PROG
inicio = TIME()
FOR i = 1 TO 10000
a = i * i + i - 10000/i
NEXT
fim = TIME()
? ELAPTIME(inicio,fim)
O exemplo a seguir mostra a utilização da função NTOF( ) para declarar um vetor tipo FLOAT.
* O vetor vet_float ocupará 40.000 bytes.
DECLARE vet_float1[5000] = NTOF(0)
* O vetor vet_num ocupará 105.000 bytes.
DECLARE vet_num[5000] = 0
* Representa uma economia de 65.000 bytes.
2.8.5
Consulte
$ FLOATFUN, DECLARE, SET DECIMAL e STORE.
2.9
2.9.1
$FLOATFUN
Propósito
Determinar a utilização de variáveis do tipo FLOAT.
2.9.2
Sintaxe
$ FLOATFUN
2.9.3
Utilização
Possibilita a declaração de variáveis de ponto flutuante determinando que as funções numéricas da
biblioteca LIBFACBIB retornarão valores FLOAT. Este comando faz com que toda e qualquer
variável numérica seja tratada como de ponto flutuante, salvo as declaradas pela função FTON( ).
Variáveis FLOAT são úteis pois agilizam os processos aritméticos, e devem ser utilizadas em
PROCEDURES ou FUNCTION que executem muitos cálculos.
O uso deste comando deve ser limitado às rotinas de cálculo, pois todo e qualquer numérico é
convertido para FLOAT e depois para numérico, gastando tempo nesta conversão.
Útil para diminuir o consumo de memória, pois variáveis numéricas ocupam 21 bytes ao passo que as
variáveis FLOAT ocupam 8 bytes cada.
Economiza-se muito em vetores numéricos, exageradamente grandes, nestes casos utilizar a função
NTOF().
2.9.4
Exemplo
O exemplo a seguir mostra como utilizar esta opção. A função TIME( ) retorna um valor numérico,
utilizando-se este comando o valor retornado será FLOAT.
$FLOATFUN
PROG
inicio = TIME()
FOR i = 1 TO 10000
a = i * i + i - 10000/i
NEXT
fim = TIME()
? ELAPTIME(inicio,fim)
2.9.5
Consulte
$ FLOAT, DECLARE, SET DECIMAL e STORE.
2.10 $GETS
2.10.1
Propósito
Alterar a quantidade de GETs permitidos para um READ.
2.10.2
Sintaxe
$ GETS = <número>
2.10.3
Argumentos
<número>
2.10.4
representa um número inteiro, correspondendo à quantidade de GETs.
Utilização
Para alterar a quantidade DEFAULT de GETs para um único READ que é igual a 50.
Alguns compiladores C apresentam problemas na compilação de programas com mais de 50 GETs,
este comando é uma alternativa para se contornar esta limitação.
Declara-se este comando antes da declaração dos comandos PROC, FUNC ou PROG.
2.10.5
Consulte
@ ... GETS.
2.11 $LEN
2.11.1
Propósito
Determinar o tamanho máximo para as variáveis tipo caractere.
2.11.2
Sintaxe
$ LEN = <numero>
2.11.3
Argumentos
<numero>
representa o tamanho em caracteres das variáveis locais.
Deve estar entre 1 e 32767 inclusive.
2.11.4
Utilização
Altera o tamanho de todas as variáveis do tipo caractere. Quando utilizado, deve ser declarado em
todas as fontes do programa. Útil para diminuir o tamanho de todas as variáveis cadeia do sistema,
economizando a memória.
Existem outras formas de se alterar o tamanho das variáveis do tipo caractere; declará-las como
privadas, públicas ou utilizar o comando $LENTMP.
Obs.: Na OPUS todas as variáveis desse tipo têm, por DEFAULT, tamanho máximo de 127 caracteres.
2.11.5
Consulte
$LENTMP.
2.12 $LENTMP
2.12.1
Propósito
Determinar o tamanho máximo para as variáveis temporárias tipo caractere.
2.12.2
Sintaxe
$ LENTMP = <numero>
2.12.3
Argumentos
<numero>
2.12.4
representa o tamanho em caracteres das variáveis temporárias. Deve estar entre 1 e
32767 inclusive, e não deve ser inferior ao definido no comando $LEN.
Utilização
Variáveis temporárias são variáveis internas utilizadas para trabalho com as variáveis do usuário.
Substitui o comando $LEN, já que, não altera o tamanho das variáveis do usuário, e não precisa ser
declarado em todas as fontes do sistema, somente onde se faz necessário.
Útil no uso de funções da OPUS que retornam dados tipo cadeia, para que estas não fiquem limitadas
aos 127 caracteres.
2.12.5
Exemplo
O exemplo a seguir mostra a utilização deste comando. Repare que o tamanho de var_cad1 e 500 e de
var_cad2 é 127.
* Retire a linha a seguir e verifique o resultado
$LENTMP = 500
PROG
PRIVATE var_cad1(500)
var_cad1 , var_cad2= REP("X",500)
* Imprime o tamanho das variáveis
? LEN(var_cad1)
? LEN(var_cad2)
2.12.6
Consulte
$LEN.
2.13 $LIBLOCK
2.13.1
Propósito
Bloquear a biblioteca de objetos para manutenção.
2.13.2
Sintaxe
$ LIBLOCK
2.13.3
Utilização
Para que a biblioteca de objetos não seja destruída, quando dois ou mais usuários estiverem
compilando módulos desta. Para que o bloqueio da biblioteca seja executado com sucesso, este
comando deve ser declarado em todas as fontes que utilizam a biblioteca.
2.13.4
Consulte
$LIBRARY, FUNCTION, PROCEDURE e PROGRAM.
2.14 $LIBRARY
2.14.1
Propósito
Determinar as bibliotecas de objetos que o sistema utilizará.
2.14.2
Sintaxe
$ LIBRARY = <nome>
$ LIBRARY = (<nome1>,...,<nomeN>)
2.14.3
Argumentos
<nome>
2.14.4
representa o nome da biblioteca de objetos do usuário.
Utilização
Determina as bibliotecas de usuário que serão utilizadas pelo ligador ou a biblioteca onde os objetos de
PROCEDURES e FUNCTIONS serão arquivados.
Quando declarado na fonte de um programa (PROGRAM) determina as bibliotecas para o ligador.
Neste caso mais de uma biblioteca pode ser especificada desde que estejam entre parênteses e
separadas por "," (vírgula).
Quando declarado na fonte de uma PROCEDURE ou FUNCTION determina a biblioteca onde o
objeto gerado será arquivado. Neste caso somente uma biblioteca pode ser especificada.
2.14.5
Exemplo
O exemplo a seguir mostra-nos a utilização do comando $LIBRARY. Veja que a FUNCTION está
arquivada na biblioteca "bibfun.lib" e a PROCEDURE na biblioteca "bibpro.lib". Essas duas
bibliotecas estão em duas fontes diferentes.
* Fonte sn.f
$ LIBRARY = bibfun.lib
FUNCTION sim_não
PARAMETERS texto(c)
resp = SPACE(01)
DO WHILE .T.
MESSAGE texto BLINK
resp = UPPER(CHR(INKEY()))
IF resp = "S"
RETURN(.T.)
ELSEIF resp = "N"
RETURN(.F.)
ENDIF
ENDDO
* Fonte ih.f
$LIBRARY = bibpro.lib
PROC imp_hora
? "Agora são ", TIME()
RETURN
O exemplo a seguir mostra-nos a utilização do comando $LIBRARY em um programa (PROGRAM) para
que seja feita a LINK-EDICÃO.
* Fonte p0.f
$ LIBRARY = (bibfun.lib,bibpro.lib)
PROG
FUNCTION sim_nao(l)
DO WHILE sim_nao("CONTINUA S/N?")
DO imp_hora
ENDDO
2.14.6
Consulte
$LIBLOCK, FUNCTION, PROCEDURE e PROGRAM.
2.15 $NOBOX
2.15.1
Propósito
Não desenhar moldura na função ACHOICE( ).
2.15.2
Sintaxe
$ NOBOX
2.15.3
Utilização
Por DEFAULT, a função ACHOICE( ) desenha uma moldura delimitando o MENU.
2.15.4
Consulte
ACHOICE( ).
2.16 $NOCLEAR
2.16.1
Propósito
Não limpar a tela na execução do programa.
2.16.2
Sintaxe
$ NOCLEAR
2.16.3
Utilização
A OPUS, por DEFAULT, gera para todo programa (PROGRAM), uma limpeza automática da tela
sempre que o programa é executado.
Útil quando se tem um programa que invoca um outro em OPUS, para que, a tela do primeiro seja
mantida.
Este comando é incompatível com o comando $SSCREEN.
2.16.4
Consulte
CLEAR e PROGRAM.
2.17 $NOCOMP
2.17.1
Propósito
Determinar que o programa C não será compilado.
2.17.2
Sintaxe
$ NOCOMP
2.17.3
Utilização
Verifica erros de sintaxe, não compila o fonte C gerado.
2.17.4
Consulte
PROGRAM
2.18 $NODATABASE
2.18.1
Propósito
Determinar que o programa não utilizará banco de dados OpenBASE.
2.18.2
Sintaxe
$ NODATABASE
2.18.3
Utilização
Útil em programas que não usem banco de dados OpenBASE em nenhum de seus módulos
(PROCEDURE e FUNCTION), evitando que as rotinas de abertura e fechamento de banco de dados
sejam ligadas ao executável gerado, diminuindo assim o seu tamanho.
2.18.4
Consulte
DATABASE.
2.19 $NODUP
2.19.1
Propósito
Não duplicar as contra-barras ("\") de uma expressão cadeia.
2.19.2
Sintaxe
$NODUP
2.19.3
Utilização
Quando se deseja passar para o fonte C, os caracteres especiais precedidos por "\" .
Na OPUS para cada "\" encontrada são geradas na fonte C "\\", para que este perca seu sentido de
operador e passe a ser somente um caractere para exibição.
Este comando é útil por exemplo, para imprimir uma cadeia que contenha um CARRIAGE-RETURN
("\r").
Não exerce influência sobre valores digitados.
2.19.4
Exemplo
O exemplo a seguir mostra a utilidade deste comando.
$NODUP
PROG
a ="a\na\nb\tz\n\r"
@ 10,10 SAY a REV
? "a\na\nb\tz\n\r" BOLD
2.19.5
Consulte
RUN
2.20 $NOEXEC
2.20.1
Propósito
Não executar o programa após sua compilação.
2.20.2
Sintaxe
$NOEXEC
2.20.3
Utilização
Todo programa (PROGRAM) em OPUS é executado automaticamente após sua compilação. Este
comando evita que isto aconteça.
2.20.4
Consulte
PROGRAM.
2.21 $NOGET
2.21.1
Propósito
Para que o programa não entre em estado de espera.
2.21.2
Sintaxe
$ NOGET
2.21.3
Utilização
Para que, programas executados em BACK-GROUND não entrem em estado de espera, não
executando assim, rotinas de leitura de teclado (GET, ACCEPT, INKEY( ), WAIT,MENU...).
2.21.4
Consulte
$NOSCREEN.
2.22 $NOINIT
2.22.1
Propósito
Não inicializar o terminal na execução de programas OPUS.
2.22.2
Sintaxe
$ NOINIT
2.22.3
Utilização
Para evitar que, na execução de programas, as seqüências de inicialização, definidas nas variáveis do
TERMINFO, sejam enviadas ao terminal.
2.23 $NOLIB
2.23.1
Propósito
Para que o programa não utilize bibliotecas do usuário.
2.23.2
Sintaxe
$ NOLIB
2.23.3
Utilização
Útil em programas que tenham suas PROCEDURES e FUNCTIONS definidas em sua fonte e que não
façam referência a rotinas externas.
2.23.4
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando. Verifique o resultado da compilação desta
fonte sem o comando $NOLIB.
$ NOLIB
PROG
FUNCTION sim_nao(l)
DO WHILE sim_nao("CONTINUA S/N?")
DO imp_hora
ENDDO
QUIT(0)
PROC imp_hora
? "Agora sao ", TIME()
RETURN
FUNCTION sim_nao
PARAMETERS texto(c)
DO WHILE .T.
MESSAGE texto BLINK
resp = UPPER(CHR(INKEY()))
IF resp = "S"
RETURN(.T.)
ELSEIF resp = "N"
RETURN(.F.)
ENDIF
ENDDO
2.23.5
Consulte
$LIBLOCK, $LIBRARY, FUNCTION, PROCEDURE e PROGRAM.
2.24 $NOLINK
2.24.1
Propósito
Para que o programa não será ligado após sua compilação.
2.24.2
Sintaxe
$ NOLINK
2.24.3
Utilização
Útil quando se está fazendo alterações em um programa, evitando que o executável seja recriado.
2.24.4
Consulte
$NOCOMP, $NOEXEC e PROGRAM.
2.25 $NOREADVAR
2.25.1
Propósito
Inibir o nome da variável para a função READVAR( ).
2.25.2
Sintaxe
$ NOREADVAR
2.25.3
Utilização
Útil quando não se deseja guardar, para os comandos get, memo e achoice, o nome da variável para a
função READVAR( ).
2.25.4
Consulte
@ ... GET, SET KEY, READVAR( ) e LASTKEY( ).
2.26 $NOSCREEN
2.26.1
Propósito
Determina que o programa não posicionará o cursor.
2.26.2
Sintaxe
$ NOSCREEN
2.26.3
Utilização
Não permite a utilização do comando @ ... para posicionar o cursor, mas permite imprimir dados
através dos comandos ? e ??.
Todas as fontes que compõem o programa não devem utilizar o comando @... ou entrar em qualquer
modo de espera.
2.26.4
Consulte
$NOGET.
2.27 $NOTERM
2.27.1
Propósito
Não utilizar o terminfo.
2.27.2
Sintaxe
$ NOTERM
2.27.3
Utilização
Determina que o programa não lerá o arquivo terminfo, não podendo, assim, usar o terminal.
Utilizado em programas que são executados antes da declaração da variável TERM do ambiente UNIX.
Como exemplo, programas invocados no BOOT do equipamento pelo arquivo /etc/rc.
2.28 $ORACLE
2.28.1
Propósito
Permitir o acesso a uma base de dados ORACLE.
2.28.2
Sintaxe
$ORACLE
2.28.3
Utilização
Para que um programa OPUS acesse uma base ORACLE, podendo acessar uma base OpenBASE
concomitantemente.
Este comando instrui ao compilador que gere um fonte para o pré-compilador C do ORACLE, o
ProC, com extensão “.pc” ao invés de um fonte C com extensão “.c”. O fluxo de compilação invoca
o compilador ProC.
Os comandos de acesso a Bancos de Dados OpenBASE continuam ativos e a base ORACLE é
acessada através do comando com sintaxe SQL do ProC.
Opções para o pré-compilador ProC podem ser passadas pela opção $PCC_OPTIONS.
2.28.4
Exemplo
O exemplo a seguir mostra um programa com é esta característica:
* Teste Opus acessando base de dados ORACLE
* Sample Program: Uso concomitante do ORACLE com OpenBASE.
$ORACLE, savec
$pcc_options = “include=/usr/ORACLE/c/lib errors=yes host=c ireclen=132”
prog
database TORACLE 1 a 2
use emp
EXEC SQL INCLUDE sqlca;
empno, mgr, sal, comm, deptno = 0
hiredate, ename, job = space(10)
usernome = “SCOTT”
password = “TIGER”
EXEC SQL WHENEVER SQLERROR GOTO
sqlerror;
EXEC SQL CONNECT :usernome IDENTIFIED
BY : password;
0,0 say “Conectado ORACLE ao usuario: “+usernome
EXEC SQL DECLARE salespeople CURSOR FOR
SELECT EMPNO, ENAME, JOB, MGR,
HIREDATE, SAL, COMM, DEPTNO
FROM EMP;
EXEC SQL OPEN salespeople;
EXEC SQL WHENEVER NOT FOUND GOTO end_of_fetch;
?
nlin = 0
do while .t.
EXEC SQL FETCH salespeople INTO :empno, :ename, :job, :mgr, :hiredate, :sal, :comm, :deptno;
incr nlin
replace empno, ename, job, mgr, hiredate, sal,
comm,
deptno
insert
enddo
LABEL SQL end_of_fetch
EXEC SQL CLOSE salespeople;
? “Transferidas “, nlin, “ linha”, iif(nlin = 1, “.”, “s.”)
EXEC SQL COMMIT WORK RELEASE;
?
? “Tenha um “, “BOM DIA” bold
quit (0)
LABEL SQL sqlerror
clear
? get_string (sqlca.sqlerrm.sqlerrmc,
get_short(sqlca.sqlerrm.sqlerrml))
EXEC SQL WHENEVER SQLERROR
CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
quit (1)
2.29 $PARASP
2.29.1
Propósito
Passar parâmetros através do comando RUN entre aspas.
2.29.2
Sintaxe
$ PARASP
2.29.3
Utilização
O caractere branco (" ") é utilizado como separador de parâmetros nos sistemas operacionais. O
comando $ PARASP determina que os caracteres brancos nos parâmetros, não serão interpretados
como separador e sim como parte integrante do parâmetro.
2.29.4
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando para executar o comando "ls" do UNIX.
Verifique o resultado obtido retirando o comando $ PARASP.
$ PARASP
PROG
var_cad = "a b"
RUN "ls" with var_cad
RUN "ls" with "a b"
O exemplo a seguir mostra a utilização de um recurso que simula o comando $PARASP. Verifique o
resultado obtido retirando os colchetes. No caso de variáveis não existe um modo de simular.
PROG
var_cad = "a b"
RUN "ls" with var_cad
RUN "ls" with ["a b"]
2.29.5
Consulte
RUN e SET PARASP.
2.30 $PCC_OPTIONS
2.30.1
Propósito
Passar parâmetros para o compilador ProC.
2.30.2
Sintaxe
$ PCC_OPTIONS = <exp.C>
2.30.3
Argumentos
<exp.C>
2.30.4
Representam as opções para o pré-compilador ProC.
Utilização
Utiliza-se esta opção em conjunto da opção $ORACLE, para passar parâmetros ao pré-compilador
ProC da ORACLE.
2.30.5
Exemplo
O exemplo a seguir mostra a utilização deste comando.
* Teste Opus acessando base de dados ORACLE
*
* Sample Program: Uso concomitante do ORACLE com OpenBASE.
*
$oracle, savec
$PCC_OPTIONS = “include=/usr/ORACLE/c/lib errors=yes host=c ireclen=132”
prog
database TORACLE 1 a 2
use emp
EXEC SQL INCLUDE sqlca
...
...
2.31 $PUBLIC
2.31.1
Propósito
Declarar todas as variáveis de um PROGRAM como públicas.
2.31.2
Sintaxe
$ PUBLIC
2.31.3
Utilização
Útil em programas que tenham PROCEDURES e FUNCTIONS internas, para evitar passagem de
parâmetro ou a declaração das variáveis públicas em cada PROCEDURE ou FUNCTION.
Este comando deve ser usado somente em casos de extrema necessidade, pois pode levar a resultados
não esperados. Na LINK-EDIÇÃO, por exemplo, o ligador pode acusar a existência de nomes
redeclarados.
Só permitido em fontes de PROGRAMS.
2.31.4
Consulte
$MULTIPLE, PUBLIC e STORE.
2.32 $READALL
2.32.1
Propósito
Ler todos os itens dos registros acessados em um banco de dados.
2.32.2
Sintaxe
$ READALL
2.32.3
Utilização
Para que todos os itens (com seus valores), sejam lidos na execução de qualquer comando de leitura de
banco de dados, e não somente os itens declarados na fonte.
Este comando deve ser usado somente em casos de extrema necessidade pois aloca a memória para
todos os itens dos arquivos acessados.
Útil em fontes que tenham PROCEDURES e FUNCTIONS declaradas, para que o registro possa ser
lido por todos os módulos.
2.32.4
Exemplo
O exemplo a seguir mostra-nos a utilidade deste comando. Experimente retirar os comando READALL
e PUBLIC e verifique os resultados.
$READALL, PUBLIC, NOLIB
PROG
DATABASE bdemp1 33 a 2
USE tab_func
LOCATE
DO imp_nome
QUIT(0)
PROCEDURE imp_nome
? nom_func
RETURN
2.32.5
Consulte
DATABASE, FIND, LOCATE e SEEK.
2.33 $READAREA
2.33.1
Propósito
Criar área para leitura de dados durante a execução do programa.
Indicado para casos onde se deseja modificar o esquema mas não se deseja recompilar a fonte Opus.
2.33.2
Sintaxe
$ READAREA
2.33.3
Utilização
Cria dinamicamente uma área para leitura dos itens de banco de dados, permitindo as seguintes
alterações na estrutura de dados, sem necessidade de recompilação de programas:
• Mudança de tamanho de itens numéricos (Tipos N, S, P, C, I ou B);
• Mudança de tipo entre tipos numéricos;
• Redução do tamanho de itens, caracteres (Tipo U);
A utilização desta opção, por se tratar de uma alocação dinâmica, causará um maior gasto de CPU
durante a execução do programa.
2.34 $SAVEC
2.34.1
Propósito
Manter a fonte C gerada.
2.34.2
$ SAVEC
Sintaxe
2.34.3
Utilização
Quando o usuário pretende alterar a fonte C gerada, evitando que este seja removido após a
compilação.
2.34.4
Consulte
FUNCTION, PROCEDURE e PROGRAM.
2.35 $SCREEN
2.35.1
Propósito
Determinar a utilização do recurso de salvar e restaurar telas.
2.35.2
Sintaxe
$ SCREEN
2.35.3
Utilização
Quando num programa for utilizado o recurso de salvamento e restauração de telas, ou seja, as funções
SAVESCREEN () e RESTSCREEN(). Determina que, para o programa, seja alocada uma área de
memória para o armazenamento das telas.
2.35.4
Consulte
$SSCREEN, RESTSCREEN () e SAVESCREEN ().
2.36 $SMALLNAME
2.36.1
Propósito
Determinar a criação de nomes internos para as variáveis locais cujo nome ultrapasse seis caracteres.
2.36.2
Sintaxe
$ SMALLNAME = 0 | 1
2.36.3
Argumentos
0 opção desligada (DEFAULT).
1 opção ligada.
2.36.4
Utilização
Para os compiladores C que limitem o nome das variáveis em até seis caracteres.
Para estes compiladores a OPUS gera para cada variável local um nome interno.
Este comando não exerce influência sobre declarações externas.
Recomenda-se verificar o manual do seu compilador C.
2.37 $SQLBIND
2.37.1
Propósito
Efetuar a compilação SQL do módulo especificado pela opção MODULE.
2.37.2
Sintaxe
$ BIND = ([<bdTSQL>][,<numero>][,<nome>])
2.37.3
Argumentos
<bdTSQL>
<numero>
<nome>
2.37.4
Representa o nome da base TSQL.
Representa o nível de isolamento.
Representa o nome da biblioteca que deverá conter o objeto gerado pela
compilação SQL.
Utilização
No uso de SQL embutida em programa OPUS, para que na compilação das fontes OPUS seja também
compilado e ligado o módulo SQL. A base TSQL já deve existir. Caso contrário, ocorrerá erro durante
a compilação.
Caso se omita o nome da base TSQL, será considerada a base DEFAULT (subdiretório "bd" do
diretório corrente). O nível de isolamento deve ter um dos seguintes valores:
0 = sem reserva.
1 = estabilidade de cursor (DEFAULT).
2 = leitura repetida.
3 = uso exclusivo sem transação.
4 = uso exclusivo com transação.
Especificando-se o nome da biblioteca, o objeto gerado será armazenado nesta. Em se tratando do fonte
de um programa OPUS (PROGRAM), a biblioteca também será utilizada pelo ligador.
2.37.5
Consulte
Manual TSQL.
2.38 $SQLMODULE
2.38.1
Propósito
Determinar o módulo SQL utilizado pelo programa.
2.38.2
Sintaxe
$ SQLMODULE = <modulo> [<arquivo>]
2.38.3
Argumentos
<modulo>
<arquivo>
2.38.4
representa o nome do módulo SQL.
Representa o nome do arquivo-fonte do módulo.
Utilização
Obrigatório na utilização de comandos SQL em um programa OPUS, informando ao compilador qual o
módulo SQL que será utilizado.
Caso se omita o parâmetro <arquivo>, será acessado o arquivo cujo nome seja o do módulo, e cuja
extensão seja ".s".
Este comando deve ser declarado nas fontes de programas que possuam trechos em linguagem SQL.
2.38.5
Consulte
Manual de referência TSQL.
2.39 $SSCREEN
2.39.1
Propósito
Determinar a utilização do recurso de salvar e restaurar telas.
2.39.2
Sintaxe
$ SSCREEN
2.39.3
Utilização
Quando no programa o recurso de salvamento e restauração de telas (funções SAVESCREEN () e
RESTSCREEN ()) for utilizado.
Determina que, para o programa, será alocada uma área de memória, para o armazenamento das telas.
Este comando difere do comando $SCREEN, pois na restauração, só restaura o que foi alterado, sendo
assim, mais rápido e eficiente.
Este comando é incompatível com o comando $NOCLEAR.
2.39.4
Consulte
$NOCLEAR, $SCREEN, RESTSCREEN() e SAVESCREEN().
2.40 $SYMBOLS
2.40.1
Propósito
Determinar o tamanho da tabela de símbolos.
2.40.2
Sintaxe
$ SYMBOLS = <numero>
2.40.3
Argumentos
<numero>
2.40.4
Representa o número de símbolos para tabela. Deve estar entre 1 e 5000 inclusive.
Utilização
Altera o tamanho da tabela de símbolos utilizada pelo compilador OPUS, onde o DEFAULT é 512
símbolos, possibilitando que, os programas que excedam este limite, possam ser compilados com
sucesso.
Durante a compilação de programas, quando o limite da tabela de símbolos for excedido, o compilador
OPUS apresentará a seguinte mensagem: "Excedido o máximo da tabela de símbolos". Ocorrendo isto,
basta aumentar o limite até que o programa seja compilado com sucesso.
2.41 $TMP
2.41.1
Propósito
Determinar o diretório onde serão gravados os arquivos temporários.
2.41.2
Sintaxe
$ TMP = <nome>
2.41.3
Argumentos
<nome>
2.41.4
Representa o nome do diretório onde serão gravados os arquivos temporários.
Deve ter no máximo 40 caracteres.
Utilização
Para que os arquivos temporários criados pelo programa sejam criados no diretório especificado em
<nome>.
2.41.5
Consulte
SORT.
2.42 $TESTITEM
2.42.1
Propósito
Fazer com que um programa Opus, em tempo de execução, verifique se as características dos itens de
dados estão de acordo com o dicionário de dados.
2.42.2
Sintaxe
$testitem
2.42.3
Utilização
Um programa Opus que abra um banco de dados Openbase, ao ser compilado, gera um fonte na
linguagem C/C++ que contém as características dos itens de dados tais como tipo, tamanho, número de
casas decimais, se é nulo ou não …).
Sempre que houver mudanças no esquema do banco de dados e o dicionário de dados for re-gerado, o
programa Opus deverá ser recompilado. Com a opção de controle $item, se houver alguma diferença
entre o dicionário de dados e o programa Opus em relação as características dos itens de dado, será
emitida a mensagem de erro:
“OPUS(VarIte)=> Tipo/Tamanho do item (<nome_item> Invalido”
Esta opção é muito util nas fases de desenvolvimento migração e teste de sistemas envolvendo
esquemas de bancos de dados.
2.43 $VARPAR
2.43.1
Propósito
Permitir o não recebimento de todos os parâmetros declarados.
2.43.2
Sintaxe
$ VARPAR
2.43.3
Utilização
Faz com que a rotina onde foi declarado este comando, não critique o número de parâmetros recebidos,
parâmetros estes declarados no comando PARAMETERS. Sendo assim parâmetros omitidos são
recebidos com valor vazio de acordo com seu tipo (veja função EMPTY ()).
2.44 $WARN
2.44.1
Propósito
Mostrar durante a compilação os comando que não serão executados.
2.44.2
$ WARN
Sintaxe
2.44.3
Utilização
Durante o desenvolvimento e depuração de programas, para verificar a ocorrência de comandos não
executados por erro de programação.
2.44.4
Exemplo
O exemplo a seguir mostra a utilização deste comando.
$ WARN,NOLIB
FUNC
PARAMETERS texto(c)
IF CONF()
RETURN("SIM")
ELSE
RETURN("NAO")
ENDIF
? texto
&RPDQGRVGDOLQJXDJHP2386
3.1
3.1.1
#DEFINE
Propósito
Definir uma constante para o pré-compilador.
3.1.2
Sintaxe
#DEFINE <palavra>
3.1.3
Argumentos
<palavra>
3.1.4
Representa uma constante.
Utilização
Quando especificado, cada comando #DEFINE pode ter somente um identificador de constante.
Define identificadores que servirão para controle de pre-compilação pelos comandos #IFDEF e
#IFNDEF.
Para se cancelar uma definição utilizar o comando #UNDEF.
3.1.5
Exemplo
O exemplo a seguir mostra como utilizar este comando para compilar uma parte menor de código.
...
#DEFINE VERSAO1
...
#IFDEF VERSAO1
...
...
#ELSE
...
...
#ENDIF
3.1.6
Consulte
#INCLUDE e #UNDEF.
3.2
3.2.1
#IFDEF
Propósito
Permitir a compilação de código fonte se uma constante estiver definida.
3.2.2
Sintaxe
#IFDEF <palavra>
...
[#ELSE]
...
#ENDIF
3.2.3
Argumentos
<palavra>
Representa uma constante.
#ELSE
#ENDIF
3.2.4
Determina um desvio caso <palavra> não esteja definida.
Determina o fim do comando #IFDEF.
Utilização
Permite verificar se um determinado identificador foi definido, compilando ou não parte do código
fonte. Se o identificador foi definido, este comando permite a compilação do código fonte encontrado
logo a seguir. Caso contrário, será compilada a fonte após o comando #ELSE, se este existir.
3.2.5
Exemplo
O exemplo a seguir mostra como utilizar este comando para compilar uma parte menor de código.
...
#DEFINE VERSAO1
...
#IFDEF VERSAO1
...
...
#ELSE
...
...
#ENDIF
3.2.6
Consulte
#IFNDEF e #UNDEF.
3.3
3.3.1
#IFNDEF
Propósito
Permitir a compilação de código fonte se uma constante não estiver definida.
3.3.2
Sintaxe
#IFNDEF <palavra>
...
[#ELSE]
...
#ENDIF
3.3.3
Argumentos
<palavra>
#ELSE
#ENDIF
3.3.4
Representa uma constante.
Determina um desvio, caso <palavra> não esteja definida.
Determina o fim do comando #IFNDEF.
Utilização
Permite verificar se um determinado identificador não foi definido, compilando ou não parte do código
fonte. Se o identificador não foi definido, este comando permite a compilação do código fonte
encontrado logo a seguir. Caso contrário, será compilada a fonte após o comando #ELSE, se este
existir.
3.3.5
Exemplo
O exemplo a seguir mostra como utilizar este comando para compilar uma parte menor de código.
...
#DEFINE VERSAO1
...
#IFNDEF VERSAO1
...
...
#ELSE
...
...
#ENDIF
3.3.6
Consulte
#IFNDEF e #UNDEF.
3.4
3.4.1
#INCLUDE
Propósito
Incluir um arquivo-fonte durante a compilação.
3.4.2
Sintaxe
#INCLUDE <arquivo>
3.4.3
Argumentos
<arquivo>
3.4.4
É o nome do arquivo no diretório corrente que
contém o fonte a ser incluído.
Utilização
Ajusta declarações que se repitam por todo um sistema ou vários sistemas.
Arquivos de inclusão não podem incluir outros arquivos.
Quando um arquivo de inclusão for alterado, todas as fontes que o utilizem devem ser recompiladas.
3.4.5
Exemplo
O exemplo a seguir mostra a utilização do comando INCLUDE para a declaração de variáveis públicas
e de funções.
* conteúdo do arquivo globais.h
globais.h
empresa=SPACE(35),
produto=SPACE(15)
prog
include globais.h
3.4.6
Consulte
#DEFINE, $SIMBOLS, CC DECL, CC EXTERN, CC PROC, DO, PRIVATE e PUBLIC.
3.5
3.5.1
#UNDEF
Propósito
Remover a definição de uma constante.
3.5.2
Sintaxe
#UNDEF <palavra>
3.5.3
Argumentos
<palavra>
3.5.4
representa uma constante.
Utilização
Quando especificado, cada comando #UNDEF pode ter somente um identificador de constante.
Remove a definição de identificadores para controle de pre-compilação pelos comandos #IFDEF e
#IFNDEF.
3.5.5
Exemplo
O exemplo a seguir mostra como utilizar este comando para compilar uma parte menor de código.
...
#DEFINE VERSAO1
...
#IFNDEF VERSAO1
#UNDEF VERSAO1
...
#ELSE
...
#ENDIF
3.5.6
Consulte
#INCLUDE e #UNDEF.
3.6
3.6.1
++ | INCR
Propósito
Incrementar uma variável numérica.
3.6.2
Sintaxe
++ <var.N>
INCR <var.N>
3.6.3
Argumentos
<var.N>
3.6.4
Representa uma variável numérica declarada anteriormente.
Utilização
O comando ++ ou INCR incrementa de uma unidade a variável.
Corresponde a instrução <var.N> = <var.N> + 1.
3.6.5
Exemplo
O exemplo a seguir demonstra dois casos de incremento de uma variável numérica.
varnum1 = 1
&& Declaração da variável atribuindo valor 1
++ varnum1
&& varnum1 recebe uma unidade, seu valor é 2
INCR varnum1 && varnum1 recebe uma unidade, seu valor é 3
3.6.6
Consulte
CC DECL, CC EXTERN, CC PROC, DECR, FOR ... NEXT, INPUT, STORE, ABS( ), ASC( ),
FTON( ), NTOF( ), STR( ) e VAL( ).
3.7
--| DECR
3.7.1
Propósito
Decrementar uma variável numérica
3.7.2
Sintaxe
- - <var.N>
DECR <var.N>
3.7.3
Argumentos
<var.N>
3.7.4
representa uma variável numérica declarada anteriormente.
Utilização
O comando -- ou DECR decrementa de uma unidade a variável.
Corresponde a instrução <var.N> = <var.N> - 1.
3.7.5
Exemplo
O exemplo a seguir demonstra dois casos de decremento de uma variável numérica.
varnum1 = 1
- - varnum1
DECR varnum1
3.7.6
&& Declaração da variável atribuindo valor 1
&& varnum1 perde uma unidade, seu valor e 0
&& varnum1 perde uma unidade, seu valor e -1
Consulte
CC DECL, CC EXTERN, CC PROC, INCR, FOR ... NEXT, INPUT, STORE, ABS( ), ASC( ), FTON(
), NTOF( ), STR( ) e VAL( ).
3.8
3.8.1
?
Propósito
Exibir uma ou mais expressões.
3.8.2
Sintaxe
? [<exp> [<atrib>]]
3.8.3
Argumentos
<exp>
<atrib>
3.8.4
representa uma ou mais expressões a serem impressas.
é o tipo de atributo de vídeo. Permite (quando a saída for um terminal de vídeo) que toda a
impressão seja associada a um atributo de vídeo.
Utilização
Exibe uma ou mais expressões de qualquer tipo a partir da posição do cursor no dispositivo de saída
corrente. Ao final da impressão posiciona o cursor no início da próxima linha.
Quando o comando é utilizado sem argumentos, posiciona o cursor no início da próxima linha.
Quando se exibir mais de uma expressão , estas devem ser separadas por "," (vírgula).
3.8.5
Exemplo
O exemplo a seguir mostra seu uso para imprimir o resultado de uma adição.
? 1 + 2 && Causa exibição da soma
O exemplo a seguir exibe um literal mais o resultado de uma adição.
? "um mais dois e igual a ",1+2
O exemplo a seguir mostra a impressão da concatenação de cadeias mais o resultado de uma expressão
aritmética.
varcad = "dois"
varnum = 1
? "um mais "+varcad,"e igual a ",varnum + 2
3.8.6
Consulte
$LENTMP, $NOGET, $NOSCREEN, ??, @, @ ... SAY, SET ATRIBUTE, SET CURSOR, SET
DEVICE, SET DIVDEC, SET EXACT, SET PRINT e SET PRINTER.
3.9
??
3.9.1
Propósito
Exibir uma ou mais expressões.
3.9.2
Sintaxe
?? [<exp> [<atrib>]]
3.9.3
Argumentos
<exp>
<atrib>
3.9.4
representa uma ou mais expressões a serem impressas.
é o tipo de atributo de vídeo. Permite (quando a saída for um terminal de vídeo) que toda
a impressão seja associada a um atributo de vídeo.
Utilização
Exibe uma ou mais expressões de qualquer tipo a partir da posição do cursor no dispositivo de saída
corrente. Ao final da impressão, posiciona o cursor após o último valor exibido.
Quando se exibir mais de uma expressão , estas devem ser separadas por "," (vírgula).
3.9.5
Exemplo
O exemplo a seguir mostra a impressão do resultado de uma adição.
?? 1 + 2
O exemplo a seguir mostra a impressão de um literal mais o resultado de uma adição.
?? "um mais dois e igual a ",1+2
O exemplo a seguir mostra a impressão da concatenação de cadeias mais o resultado de uma adição.
varcad = "dois"
varnum = 1
?? "um mais "+varcad,"e igual a "
?? varnum + 2
3.9.6
Consulte
$LENTMP, $NOGET, $NOSCREEN, ?, @, @ ... SAY, SET ATRIBUTE, SET CURSOR, SET
DEVICE, SET DIVDEC, SET EXACT, SET PRINT e SET PRINTER.
3.10 @ ...
3.10.1
Propósito
Imprimir uma linha em branco na posição especificada.
3.10.2
Sintaxe
@ <exp.N1>,<exp.N2>
3.10.3
Argumentos
<exp.N1> e <exp.N2>
3.10.4
representam expressões numéricas que especificam as coordenadas
do início da impressão, linha e coluna respectivamente.
Utilização
Apaga o conteúdo de uma linha determinada, a partir da coluna especificada, quando o dispositivo de
saída é o vídeo.
Geralmente é utilizado em conjunto com o comando SAY , para imprimir uma expressão ou posicionar
o cursor.
3.10.5
Exemplo
O exemplo a seguir mostra como limpar a primeira linha do terminal de vídeo.
@ 0,0
O exemplo a seguir mostra como posicionar o cursor na linha 1 coluna 2 sem limpar o restante da
linha.
@ 1,2 SAY "OpenBASE THE BEST DATA BASE"
3.10.6
Consulte
$LENTMP, $NOGET, $NOSCREEN, ?, ??, @ ... BOX, @ ... CLEAR, @ ... GET, @ ... SAY, @ ...
TO, SET ATRIBUTE, SET CURSOR, SET DEVICE, SET DIVDEC, SET EXACT, SET PRINT e
SET PRINTER.
3.11 @ ... BOX ...
3.11.1
Propósito
Desenhar uma moldura no terminal de vídeo.
3.11.2
Sintaxe
@ <exp.N1>,<exp.N2>,<exp.N3>,<exp.N4> BOX <exp.C>
3.11.3
Argumentos
<exp.N1> e <exp.N2>
<exp.N3> e <exp.N4>
<exp.C>
3.11.4
representam linha e coluna do canto superior esquerdo.
representam linha e coluna do canto inferior direito.
representa os caracteres que formarão a moldura na seguinte ordem:
canto superior esquerdo, linha horizontal superior, canto superior
direito, linha vertical direita, canto inferior direito, linha horizontal
inferior, canto inferior esquerdo, linha vertical esquerda e caractere que
preencherá o interior da moldura.
Utilização
O comando @ ... BOX ... é utilizado para desenhar uma moldura retangular no terminal, utilizando
caracteres definidos pelo programador.
3.11.5
Exemplo
O exemplo a seguir mostra-nos como desenhar uma moldura utilizando caracteres não gráficos no
terminal.
@ 00,00,23,79 BOX "abcdefgh"
O exemplo a seguir mostra-nos como simular o comando
@ ... TO ... .
SET GRAPHIC ON
@ 00,00,23,79 BOX "f-tij-li "
SET GRAPHIC OFF
3.11.6
Consulte
$NOSCREEN, $SCREEN, @ ... CLEAR, @ ... TO, SET ATRIBUTE, SET CURSOR, SET DEVICE,
SET GRAPHIC, SET PRINT, ASC( ), CHR( ), STR( ) e VAL( ).
3.12 @ ... CLEAR ...
3.12.1
Propósito
Limpar uma área do terminal de vídeo.
3.12.2
Sintaxe
@ <exp.N1>,<exp.N2> CLEAR [TO{<exp.N3>,<exp.N4>|<exp.N>}]
3.12.3
Argumentos
<exp.N1>,<exp.N2>
TO <exp.N3>,<exp.N4>
<exp.N>
representam as coordenadas do canto superior esquerdo.
determina as coordenadas do canto inferior direito.
representa o número de colunas que serão limpas.
3.12.4
Utilização
Limpa somente algumas colunas, bastando, que se defina <exp.N> após o comando CLEAR. Limpa
toda a tela a partir da posição inicial, bastando para isso, não declarar nada.
A opção TO <exp.N3>,<exp.N4> determina o fim da limpeza e não deve ser maior que os limites do
terminal nem menor que as coordenadas iniciais definidas por @ <exp.N1>,<exp.N2> CLEAR. A
desobediência a esses limites resultarão num erro.
3.12.5
Exemplo
O exemplo a seguir mostra-nos como limpar a tela do terminal de vídeo da linha 10 coluna 10 até a
linha 23 coluna 79.
@ 10,10 CLEAR TO 23,79
O exemplo a seguir mostra-nos como limpar uma parte retangular da tela do terminal, da linha 10
coluna 10 até a linha 20 coluna 50.
@ 10,10 CLEAR TO 20,50
O exemplo a seguir mostra-nos como limpar 50 caracteres na linha 20 a partir da coluna 10.
@ 20,10 CLEAR 50
3.12.6
Consulte
$NOCLEAR, $NOSCREEN, $SSCREEN, @ ... SAY , CLEAR e SPACE( ).
3.13 @ ... GET ...
3.13.1
Propósito
Obter dados digitados e atribuí-los a variáveis.
3.13.2
Sintaxe
@ <exp.N1>,<exp.N2> [SAY <exp> ...] GET <var> [PIC[TURE] <exp.C1> ] [<atrib1>] [WHEN
<exp.L1>] [RANGE <exp.N3>,<exp.N4>] [VALID {[<exp.L2>] [DOUBLE]} MESSAGE <exp.C2>
[<atrib2>]] [CASE <exp.L3> {EXIT|SKIP <exp.N5>}]
3.13.3
Argumentos
<exp.N1> e <exp.N2>
representam as coordenadas na tela do terminal: linha e coluna
respectivamente.
SAY
determina que <exp> será exibida na posição especificada.
<var>
representa a variável que receberá o valor digitado.
PICTURE <exp.C1>
especifica uma máscara de edição para a variável.
<atrib1>
representa o modo de vídeo em que será exibida a variável.
WHEN <exp.L1>
especifica uma condição a ser satisfeita para que seja possível editar o
GET. Quando a condição não for satisfeita o GET corrente é ignorado
e o cursor move-se para o GET seguinte.
RANGE <exp.N3>,<exp.N4> especifica um intervalo para aceitação dos dados.
<exp.N3>
representa o limite inferior
<exp.N4>
representa o limite superior do intervalo, onde <exp.N3> não deve ser
maior que <exp.N4>.
VALID {[<exp.L2>]
especifica que só serão aceitos os dados que satisfaçam a condição e/ou
[DOUBLE]}[MESSAGE
os dados que forem digitados duas vezes consecutivas. <exp.L2>
<exp.C2> [<atrib2>]]
representa a condição a ser testada. Caso retorne falso o cursor retorna
ao GET para que o usuário digite um novo valor. A cláusula DOUBLE
faz com que valores digitados duas vezes consecutivas sejam aceitos
mesmo que não satisfaçam <exp.L2>.
MESSAGE
determina que uma mensagem seja exibida na linha de mensagem
quando <exp.L2> retornar falso (.F.) ou durante a primeira digitação
quando a cláusula DOUBLE estiver presente no comando.
<atrib2>
é o modo de vídeo em que será exibida a mensagem.
CASE <exp.L3> {EXIT |
especifica que um desvio de GETs ocorrerá, caso uma condição retorne
SKIP <exp.N5>}
verdade (.T.). a cláusula EXIT determina o encerramento do READ. A
cláusula SKIP <exp.N5> determina o sentido e o número de GETs que
serão saltados dependendo do valor de <exp.N5>, se negativo desvia
para GETs anteriores, se positivo para GETs posteriores.
3.13.4
Utilização
O comando @ ... GET ... é um dos mais utilizados para entrada de dados via teclado pois possibilita
criticar, verificar consistência, formatar e editar dados em tempo de digitação.
Se utilizada a opção SAY <exp>, a digitação da variável é aguardada a direita de <exp>.
Para formatar a variável basta utilizar a opção PICTURE <exp.C1> caso contrário a variável não é
formatada e será apresentada com o tamanho de acordo com o tipo da variável.
As opções WHEN e VALID determinam uma pré-condição e uma pós-condição, respectivamente.
A opção WHEN é efetuada antes da execução do GET.
A opção VALID é avaliada após o término do GET.
As opções WHEN, RANGE, VALID e CASE são muito úteis, pois a validação dos dados é feita
durante a fase da digitação, reduzindo a necessidade de conferências posteriores.
3.13.5
Exemplo
O exemplo a seguir mostra-nos a utilização da cláusula RANGE. Note que os valores digitados estarão
em modo de vídeo realçado (BOLD).
num = 0
@ 10,10 SAY "digite um numero entre 0 e 10 " rev;
GET num BOLD RANGE 1,9
READ
O exemplo a seguir demonstra a utilização das cláusulas WHEN, VALID, DOUBLE e MESSAGE.
No primeiro GET só será permitido digitar "SIM" ou "NAO". Qualquer outro valor será recusado e
será emitida a mensagem "resposta errada". No segundo GET só serão aceitos valores entre 0 e 5,
inclusive, ou qualquer outro valor numérico que seja digitado duas vezes consecutivas. O último GET
só será executado se o valor da variável <simnao> for "SIM".
simnao = ""
filhos = 0
sal = 0
@ 10,10 SAY "Trabalha SIM ou NAO ? " GET simnao; PIC "!!!" VALID simnao = "SIM" .or. simnao =
"NAO" ;
MESSAGE "Resposta Errada"
@ 11,10 SAY "Numero de Filhos ? " GET filhos PIC "99";
VALID filhos >=0 .and. filhos <=5 DOUBLE
@ 12,10 SAY "Salario " GET sal PIC "zzz.zzz,99" ;
WHEN simnao = "SIM"
READ
3.13.6
Consulte
$NOGET,$NOSCREEN,ACCEPT,FUNCTION, INPUT,PICTURE,PROCEDURE, READ TEXT,
WAIT, SET ALARM, SET ALIGN, SET ATRIBUTE, SET BREAK SET CLEAR, SET CONFIRM,
SET CURSOR, SET DECIMALS, SET DELIMITERS , SET EDIT, SET INTENSITY, SET KEY,
SET PF,SET POINT,SET ROLL,SET TAB,SET UPDATE CONF( ), INKEY( ), LASTKEY( ),
READKEY( ), READVAR( ) e TRANSFORM( ).
3.14 @... PROMPT ...
3.14.1
Propósito
Criar um menu de barras no terminal de vídeo.
3.14.2
Sintaxe
@ <exp.N1>, <exp.N2> PROMPT <exp.C1> [MESSAGE <exp.C2> [<atrib>]]
3.14.3
Argumentos
<exp.N1> e <exp.N2>
<exp.C1>
MESSAGE <exp.C2>
3.14.4
representam as coordenadas para o início da exibição.
representa o título da opção a ser impressa.
determina que, ao se posicionar a barra luminosa sobre essa
opção,<exp.C2>, será exibida na linha de mensagem. Caso <atrib>
esteja presente na opção, a mensagem será exibida com esse atributo.
Utilização
Para criação de menu de opções. O usuário escolherá a opção através das setas do teclado.
Deve ser utilizado em conjunto com o comando MENU TO.
3.14.5
Exemplo
O exemplo a seguir mostra a criação de opções para um MENU vertical.
opc = 0
@ 10,10 PROMPT " Cadastro de Clientes "
@ 11,10 PROMPT " Lista Telefônica " ;
MESSAGE " Telefones Úteis " BLINK
@ 12,10 PROMPT " Relatorio de Atendimento "
MENU TO opc
3.14.6
Consulte
$NOSCREEN, $NOGET, @ ... BOX , @ ... TO, MENU TO, MESSAGE, SET ERASE, SET
PROMPT e ACHOICE( ).
3.15 @ ... SAY ...
3.15.1
Propósito
Exibir uma ou várias expressões de mesmo tipo em uma coordenada especificada.
3.15.2
Sintaxe
@ <exp.N1>,<exp.N2> SAY <exp> [PICTURE <exp.C>] [<atrib>] [GET...]
3.15.3
Argumentos
<exp.N1> e <exp.N2>
<atrib>
3.15.4
representam as coordenadas do início da exibição
representa o tipo de vídeo em que será exibida a expressão.
Utilização
O comando SAY exibe o resultado de uma expressão de qualquer tipo na coordenada especificada.
Por DEFAULT a saída é para o vídeo. Isto não impede que a saída seja alterada (impressoras, arquivos
ou outros dispositivos), bastando para isso que se altere o dispositivo de saída através dos comandos
SET PRINTER TO e SET PRINT ON.
3.15.5
Exemplo
O exemplo a seguir mostra-nos como exibir uma cadeia de caracteres numa coordenada do terminal,
uma expressão na impressora padrão e inserir um texto em um arquivo no diretório corrente.
@ 10,10 SAY "Teste do comando SAY para VIDEO"
SET PRINT ON
@ 10,10 SAY "Impressão na IMPRESSORA PADRAO"
SET PRINT OFF
SET PRINTER TO "cat > arqsaida.txt"
SET PRINT ON
@ 10,10 SAY "Impressão em ARQUIVO TEXTO"
SET PRINT OFF
3.15.6
Consulte
$NOGET, $NOSCREEN, ?, ??, @ ... GET, PICTURE, TEXT, SET ATRIBUTE, SET CURSOR, SET
DEVICE, SET GRAPHIC, SET PRINT e TRANSFORM( ).
3.16 @ ... TO ...
3.16.1
Propósito
Desenhar uma moldura retangular no terminal de vídeo utilizando caracteres gráficos.
3.16.2
Sintaxe
@ <exp.N1>,<exp.N2> TO <exp.N3>,<exp.N4> [DOUBLE]
3.16.3
Argumentos
<exp.N1> e <exp.N2>
<exp.N3> e <exp.N4>
DOUBLE
3.16.4
linha e coluna do canto superior esquerdo.
linha e coluna do canto inferior direito.
determina que será utilizado o caractere duplo para formação da
moldura.
Utilização
O comando @...TO... desenha molduras utilizando os caracteres gráficos suportados pelo terminal.
Na sua execução apaga o interior do quadro (SET ERASE ON). Para que isso não ocorra basta utilizar
o comando SET ERASE OFF e o conteúdo da moldura será mantido.
3.16.5
Exemplo
O exemplo a seguir desenha uma moldura com linhas simples limpando o interior da moldura.
@ 10,10 TO 20,20
O exemplo a seguir desenha uma moldura com linhas duplas não limpando o interior da moldura.
SET ERASE OFF
@ 10,10 TO 20,20 DOUBLE
3.16.6
Consulte
$NOGET, $NOSCREEN, @ ... BOX, @ ... CLEAR e SET ERASE.
3.17 ACCEPT
3.17.1
Propósito
Atribuir valores digitados a uma variável cadeia.
3.17.2
Sintaxe
ACCEPT [<exp.C> [<atrib1>]] TO <var.C> [<atrib2>]
3.17.3
Argumentos
<exp.C>
<atrib1>
<var.C>
<atrib2>
3.17.4
representa uma expressão cadeia a ser exibida.
determina o tipo de vídeo em que será exibida <exp.C>.
representa uma variável cadeia que receberá o valor digitado.
determina o tipo de vídeo em que será exibida <var.C>.
Utilização
Para entrada de dados tipo cadeia de caracteres sem formatação a partir da posição do cursor .
Se <exp.C> for especificada serão exibidos ":" após a expressão delimitando a área de digitação.
Se <var.C> não for uma variável previamente declarada, o comando ACCEPT a criará,
automaticamente.
3.17.5
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando ACCEPT em dois casos: um sem uma
variável previamente declarada, outro com uma variável declarada pelo comando ACCEPT anterior.
Note os atributos para variável e para a cadeia.
ACCEPT TO varcad BOLD
ACCEPT "Entre com Valor para Varcad " rev TO varcad
O exemplo a seguir mostra a utilização de atributos e expressões .
varcad1 = " Entre com "
ACCEPT varcad1+"Seu NOME" BLINK TO varnom REV
3.17.6
Consulte
@ ... GET, @ ... SAY, INPUT, STORE, WAIT, SET ATRIBUTE, SET CURSOR, SET KEY,
INKEY( ), LASTKEY( ) e TRANSFORM( ).
3.18 APPEND
3.18.1
Propósito
Incluir um registro no final de um arquivo externo.
3.18.2
Sintaxe
APPEND
3.18.3
Utilização
Os itens do arquivo externo tem os seus valores atribuídos por meio do comando REPLACE ou por
outros comandos de atribuição. Isso feito, usa-se o comando APPEND.
Os valores que estiverem em memória, são inseridos no arquivo, portanto deve-se ter cuidado nas
atribuições dos itens já que a linguagem trata os itens de um arquivo externo como variáveis de
memória.
3.18.4
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando APPEND.
SELECT a
USE agenda.d
numero = 0522215654
varnome = "Nilo"
varende = "Egito"
STORE varnome TO nome
ende = varende
APPEND
3.18.5
Consulte
INSERT, REPLACE, STORE e USE.
3.19 BEEP
3.19.1
Propósito
Emitir um sinal sonoro.
3.19.2
Sintaxe
BEEP
3.19.3
Utilização
Quando se pretende chamar a atenção do usuário, pois sua execução fará com que o computador emita
um som estridente semelhante ao de uma campainha.
Este comando possibilita a utilização de sinais sonoros quando utilizado em conjunto com as funções
SAVESCREEN e RESTSCREEN.
3.19.4
Exemplo
O exemplo a seguir mostra-nos a utilização do comando BEEP.
PROG
IF CONF()
BEEP
ENDIF
3.19.5
Consulte
?, ??, @ ... SAY e CHR( )
3.20 CALL
3.20.1
Propósito
Invocar uma rotina em C.
3.20.2
Sintaxe
CALL <nome> ([<par1>,...,<parN>])
3.20.3
Argumentos
<nome>
<parN>
3.20.4
representa o nome da rotina a ser invocada.
parâmetros recebidos pela rotina.
Utilização
Invoca a rotina <nome>, passando parâmetros, se estes forem especificados.
O compilador OPUS verifica cada chamada de rotina feita pelo comando CALL no arquivo de
protótipos de função, especificado no comando CC INCLUDE. Caso exista algum erro, este será
informado e a compilação interrompida.
Quando no protótipo de uma rotina, um parâmetro for especificado como VOID, o tipo deste pode ser
informado pela OPUS através do comando SET VOID antes do comando CALL.
3.20.5
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando CALL para invocar rotinas C.
prog exemp CC INCLUDE "halo.h"
* halo.h
* /*function prototyping for C language interface - generic
* coordinates*/
*# define DEVICE_DRIVER 1
* int zoom ( void *, void *, int * );
* int setdev ( char * );
* int initgraphics ( int * );
* int worldoff ( void );
DEVICE_DRIVER = "AHDIBME.DSP"
Mode, Xmax, Ymax = 0
SET VOID to char
CALL setdev (DEVICE_DRIVER)
CALL initgraphics (Mode)
CALL inqdrange (Xmax,Ymax)
3.21 CANCEL
3.21.1
Propósito
Encerrar um programa retornando o controle ao processo chamador.
3.21.2
Sintaxe
CANCEL
QUIT [(<numero>)]
3.21.3
Argumentos
<numero>
3.21.4
status do término do programa.
Utilização
Na sua execução fecha todos os arquivos abertos e o banco de dados utilizado.
Através do comando QUIT é possível retornar um código (para o sistema operacional) que representará
o status de fim do programa.
Se o programa foi invocado por um outro programa escrito em OPUS, esse código pode ser capturado
pela função DBERR(). Sob o sistema operacional UNIX, se um processo escrito em outra linguagem
houver invocado um programa desenvolvido em OPUS, o status do comando QUIT estará armazenado
na variável ambiental $? .
O comando CANCEL sempre retorna 0 (zero).
3.21.5
Exemplo
O exemplo a seguir mostra a utilização dos comandos CANCEL e QUIT retornando um código de erro.
IF tudobem
CANCEL
ELSE
QUIT(1)
ENDIF
3.21.6
&& tudo bem é uma variável lógica
Consulte
EXIT, FUNCTION, PROCEDURE, PROGRAM, RETURN, RUN, SLEEP e DBERR( ).
3.22 CC DECL
3.22.1
Propósito
Utilizar declarações internas em C que serão adicionadas diretamente à fonte c gerada pela linguagem.
3.22.2
Sintaxe
CC DECL <declarações em C> ENDCC
3.22.3
Utilização
Quando se deseja utilizar declarações internas de variáveis, registradores, includes, etc... , que serão
adicionadas na parte interna da rotina em C gerada pela OPUS.
Permite conciliação com a linguagem C em uma mesma fonte.
Pode ser utilizado em qualquer trecho de um programa.
3.22.4
Exemplo
O exemplo a seguir mostra a declaração de variáveis (em C).
CC DECL
char texto[80];
int valor = 1001;
short conta;
ENDCC
3.22.5
Consulte
CC EXTERN, CC PROC, DO, FUNCTION, INCLUDE e PROCEDURE.
3.23 CC EXTERN
3.23.1
Propósito
Utilizar declarações externas em C que serão adicionadas diretamente à fonte gerada por esta
linguagem.
3.23.2
Sintaxe
CC EXTERN <declarações em C> ENDCC
3.23.3
Utilização
Quando se deseja utilizar declarações externas de variáveis, defines, includes etc... que serão
adicionadas na parte externa da rotina em C gerada pela OPUS.
Permite conciliação com a linguagem C em uma mesma fonte.
Pode ser utilizado em qualquer trecho de programa.
3.23.4
Exemplo
O exemplo a seguir mostra a definição de uma constante e de variáveis externas.
CC EXTERN
#define max_num 100
#include "meuinclude.h"
extern int x,y;
ENDCC
3.23.5
Consulte
CC DECL, CC PROC, DO, FUNCTION, INCLUDE e PROCEDURE.
3.24 CC INCLUDE
3.24.1
Propósito
Incluir arquivos com protótipos de funções C.
3.24.2
Sintaxe
CC INCLUDE "<nome>"
3.24.3
Argumentos
<nome>
3.24.4
representa o nome do arquivo include em disco.
Utilização
Utilizado para informar ao programa OPUS, os protótipos das funções chamadas pelos comandos
CALL.
O compilador ao passar pelo comando CALL, verifica no arquivo especificado por <nome>, a rotina, a
quantidade e o tipo dos parâmetros que esta recebe, possibilitando a conversão de parâmetros e
informando os erros das chamadas quando ocorrerem.
3.24.5
Exemplo
O exemplo a seguir mostra como utilizar o comando CC INCLUDE para declarar os protótipos das
funções que serão invocadas pelo comando CALL.
PROG exemp
CC INCLUDE "halo.h"
* halo.h
* /*function prototyping for C language interface - generic
* coordinates */
* #define DEVICE_DRIVE 1
* int zoom ( void *, void *, int * );
* int setdev ( char * );
* int initgraphics ( int * );
* int inqdrange ( int *, int * );
* int worldoff ( void );
DEVICE_DRIVE = "AHDIBME.DSP"
mode,Xmax,Ymax = 0
SET VOID to char
CALL setdev (DEVICE_DRIVER)
CALL initgraphics (Mode)
CALL inqdrange (Xmax, Ymax)
3.25 CC PROC
3.25.1
Propósito
Utilizar procedimentos em C que serão adicionados diretamente à fonte C gerada.
3.25.2
Sintaxe
CC PROC
<procedimentos>
ENDCC
3.25.3
Utilização
Quando se deseja utilizar procedimentos que serão incluídos na parte de procedimentos da fonte C
gerada pela OPUS.
Permite conciliação com a linguagem C em uma mesma fonte.
Pode ser utilizado em qualquer trecho de um programa.
3.25.4
Exemplo
O exemplo a seguir mostra como declarar procedimentos em C dentro de um programa.
CC PROC
strcpy (texto,"A linguagem e flexível");
printf ("%d \n\r",valor);
if (conta == 1)
getchar();
ENDCC
3.25.5
Consulte
CC DECL, CC EXTERN, DO, FUNCTION, INCLUDE e PROCEDURE.
3.26 CHANGE
3.26.1
Propósito
Alterar os valores dos itens não-chave do último registro lido no arquivo selecionado.
3.26.2
Sintaxe
CHANGE
3.26.3
Utilização
Na alteração de itens não-chave de arquivos de banco de dados ou arquivos externos.
Este comando garante que itens-chave não sejam alterados, retornando um erro de operação pela
função DBERR().
3.26.4
Exemplo
O exemplo a seguir mostra-nos a alteração de um item não-chave em um registro de um arquivo de
banco de dados.
SELECT x
USE tab_nfis
REPLACE tot_nfis WITH total_nf, dat_nfis;
WITH data_nf
CHANGE
O exemplo a seguir mostra-nos a tentativa de alteração de um item-chave
SELECT x
USE tab_nfis
REPLACE tot_nfis WITH total_nf, dat_nfis;
WITH data_nf, cli_nfis with cli_nf
CHANGE
? DBERR()
&& Exibira o código de erro do comando CHANGE
? DBMESS()
&& Exibira a mensagem de erro associada a DBERR( )
3.26.5
Consulte
LOCATE, LOCK, MODIFY, REPLACE, SEEK, USE, DBERR( ), FCHANGE( ) e FMODIFY( ).
3.27 CLEAR
3.27.1
Propósito
Limpar toda a tela do terminal de vídeo.
3.27.2
Sintaxe
CLEAR
3.27.3
Utilização
Limpa toda tela do terminal, quando se deseja desenhar uma nova tela.
A OPUS gera um CLEAR automático no início de execução de cada programa.
3.27.4
Exemplo
O exemplo a seguir mostra a utilização do comando CLEAR.
TEXT
A OPUS e uma linguagem de programação desenvolvida para acessar um banco de dados OpenBASE e
arquivos convencionais. Existem particularidades na linguagem OPUS. Mesmo que sua sintaxe seja
parecida com CLIPPER ou DBASE, alguns comandos tem sua peculiaridade: FIND ,LOCATE ,SEEK
etc...
ENDTEXT
WAIT "Pressione uma tecla para limpar a tela" TO k
CLEAR
3.27.5
Consulte
$CLEAR, $SCREEN, @ ... CLEAR, TEXT, REPLICATE( ) e SPACE( ).
3.28 CLEAR MESSAGE
3.28.1
Propósito
Limpar a última mensagem enviada ao terminal de vídeo.
3.28.2
Sintaxe
CLEAR MESSAGE
3.28.3
Utilização
Quando se deseja limpar as mensagens enviadas pelo comando MESSAGE.
Na execução de comandos MESSAGE sucessivos, cada comando MESSAGE se encarrega de limpar a
mensagem anterior.
CLEAR MESSAGE limpa exatamente o que o MESSAGE anterior exibiu, isto é, envia um MESSAGE
com uma cadeia de brancos do tamanho da cadeia enviada pelo último MESSAGE.
3.28.4
Exemplo
O exemplo a seguir mostra-nos a utilização do comando CLEAR MESSAGE, MESSAGE e SAY .
Note que os comandos MESSAGE seguidos limpam a mensagem anterior mas quando se necessita
imprimir outra expressão na linha de mensagem com outro comando que não o MESSAGE é preciso
limpar a linha de mensagem.
MESSAGE "Teste do Comando CLEAR MESSAGE"
WAIT "Tecle algo" TO k
MESSAGE "Esta Mensagem é MENOR que a ANTERIOR"
WAIT "Tecle algo" TO k
** Retire a próxima linha e verifique o resultado
CLEAR MESSAGE
@ 1,1 SAY "Ok LIMPOU"
O exemplo a seguir mostra-nos a simulação de um comando CLEAR MESSAGE.
mensagem = "Simula CLEAR MESSAGE"
MESSAGE mensagem
WAIT "Tecle algo" TO k
MESSAGE SPACE(LEN(mensagem)) && CLEAR MESSAGE
3.28.5
Consulte
$NOSCREEN, @ ... SAY, MESSAGE, SET ATRIBUTE, SET DEVICE e SET MESSAGE
3.29 CLOSE FILE
3.29.1
Propósito
Fechar um arquivo externo.
3.29.2
Sintaxe
CLOSE FILE
3.29.3
Utilização
Fecha somente o arquivo externo selecionado, possibilitando a abertura de outros arquivos, evitando
assim, ultrapassar o limite de arquivos abertos do seu sistema operacional.
3.29.4
Consulte
$FILES, USE.
3.30 CONTINUE
3.30.1
Propósito
Continuar uma leitura seqüencial.
3.30.2
Sintaxe
CONTINUE [KEY] [SHARED | EXCLUSIVE]
3.30.3
Argumentos
KEY
SHARED
EXCLUSIVE
3.30.4
determina a seqüência de leitura.
determina o bloqueio para leitura compartilhada do registro
determina o bloqueio para uso exclusivo do registro.
Utilização
O comando CONTINUE é utilizado para acessar o registro seguinte em uma leitura seqüencial.
Este comando retorna EOF() verdadeiro (.T.), se chegou ao fim da leitura.
O comando CONTINUE é utilizado somente com o comando LOCATE.
A opção KEY determina que o comando CONTINUE lerá somente um registro para cada valor da
chave de acesso. Isto é útil para chaves não-únicas, pois existem várias ocorrências para um mesmo
valor. Em algumas situações esta opção pode trazer resultados inesperados, como por exemplo utilizála junto com o comando LOCATE FOR ou sem uma chave de acesso (SET ORDER TO).
SHARED determina que o registro será bloqueado, podendo compartilhar somente a leitura do registro.
Utilizada em bloqueio de banco, funciona como EXCLUSIVE.
EXCLUSIVE impede leituras e gravações do registro por parte de outros usuários.
3.30.5
Exemplo
O exemplo a seguir mostra uma leitura seqüencial até o fim do arquivo.
USE tab_func
LOCATE
DO WHILE .not. EOF()
? "Matricula do Funcionário ", id0_func
? "Nome do Funcionário ", nom_func
?
CONTINUE
ENDDO
3.30.6
Consulte
$READALL, LOCATE, RESTORE, REVERSE, SAVE, SET ORDER, USE, DBERR( ), EOF( )
FCONTINUE( ), FLCONTINUE( ), FLOCATE( ) e FRECNO( ).
3.31 DATABASE
3.31.1
Propósito
Abrir um banco de dados OpenBASE.
3.31.2
Sintaxe
DATABASE <nome> <codigo> [<nivel> | *] <modo>
3.31.3
Argumentos
<nome>
<codigo>
<nivel>
<modo>
representa o nome do banco de dados.
representa o código de segurança definido para o banco de dados.
representa o nível de acesso às informações dos itens do banco de dados.
* representa a palavra de nível correspondente ao BDCNFG.
representa o modo de abertura do banco de dados .
3.31.4
Utilização
O nome do banco deve ter no máximo 12 caracteres e pode ser passado um percurso para este banco.
Neste caso, não deve ultrapassar 40 caracteres.
Caso não se passe o percurso, o comando DATABASE procura o banco de dados no diretório indicado
no arquivo ".tscnfg" no diretório HOME do usuário ou no diretório padrão para banco de dados
(/usr/tsgbd/tsdic/).
O código de segurança deve ser o mesmo definido no banco de dados para que seja possível a sua
abertura. Isto serve para que somente pessoas autorizadas utilizem as informações contidas no banco de
dados.
O nível de acesso (<nível>) é uma outra forma de proteção às informações de um banco de dados, pois
permite a definição de níveis de privacidade para os itens do banco de dados. Além disso, a palavra de
nível não precisa ser definida no programa-fonte, pode-se especificar um "*" (asterisco) no local
destinado à palavra de nível no comando DATABASE, com isso, o programa abrirá o banco de dados
com a palavra de nível definida pelo utilitário BDCNFG.
O modo de abertura também é uma forma de proteger as informações de um banco de dados. Existem
três modos de abertura :
Modo de abertura igual a 1 permite somente leitura.
Modo de abertura igual a 2 permite leitura e gravação.
Modo de abertura igual a 3 permite a abertura exclusiva do banco de dados para leitura e gravação, sem
permitir concorrência com outros usuários. Isto é útil para manutenção das informações contidas no
banco de dados.
Os utilitários do OpenBASE abrem o banco de dados com modo de abertura igual a 3 evitando
concorrência com outros usuários.
Outras maneiras de se abrir um banco de dados OpenBASE se faz através das variáveis do sistema
OPUS :
NAME determina o nome de um banco de dados a ser aberto. Útil quando se tem bancos de dados com
mesma estrutura, por exemplo, folhas de pagamento de diferentes empresas.
SECURITY determina o código de segurança para um banco de dados. Útil quando se deseja que
somente pessoas autorizadas utilizem o sistema. Funciona como uma password para o banco de dados.
LEVEL determina o nível de privacidade das informações. Útil quando se deseja que somente pessoas
autorizadas leiam ou atualizem as informações do banco de
dados. Por exemplo, o item salário somente alguns podem atualizar.
MODE determina o modo de abertura para um banco de dados.
Estas variáveis são verificadas em tempo de execução e caso ocorra uma incoerência entre os valores
passados e os definidos no banco de dados a função DBERR() retornará um valor diferente de 0 (zero).
3.31.5
Exemplo
O exemplo a seguir mostra-nos como abrir um banco de dados OpenBASE no diretório padrão para o
sistema.
DATABASE bdemp 33 a 2
* 33 a 2 são respectivamente codigo de segurança, nivel de
* acesso e modo de abertura default.
USE tab_clie
O exemplo a seguir mostra a utilização das variáveis NAME,SECURITY, LEVEL e MODE.
@ 10,10 SAY "Nome do Banco de Dados " GET NAME; PIC rep("x",40)
@ 11,10 SAY "Codigo de Segurança " GET SECURITY; PIC "9999999999"
@ 12,10 SAY "Nivel de Acesso " GET LEVEL;
PIC "xxxxxx"
@ 13,10 SAY "Modo de Abertura " GET MODE PIC "9"; RANGE 1,3
READ
DATABASE bdemp1 33 a 2
3.31.6
Consulte
$NODATABASE, SET MESSAGE, USE, DBERR( ) e DBMESS( ).
3.32 DATAJOIN
3.32.1
Propósito
Permite abrir mais de um banco para uma mesma aplicação.
3.32.2
Sintaxe
DATAJOIN <nome> <codigo> [<nivel> | *] <modo>
3.32.3
Argumentos
<nome>
<codigo>
<nivel>
<modo>
3.32.4
representa o nome do banco de dados.
representa o código de segurança definido para o banco de dados.
representa a palavra de nível de acesso as informações dos itens do banco de dados.
* representa a palavra de nível correspondente ao BDCNFG.
representa o modo de abertura do banco de dados .
Utilização
Indica que um outro banco será aberto e seu dicionário será incorporado ao dicionário do banco aberto
com o comando DATABASE. Todos os arquivos tipo "E" são mudados para "T" e os de tipo "R" são
mudados para "C", isto é, este outro banco não pode ser atualizado, somente consultado.
O nome do banco deve ter no máximo 12 caracteres e pode ser passado um percurso para este banco.
Neste caso, não deve ultrapassar 40 caracteres.
Caso não se passe o percurso o comando DATAJOIN procura o banco de dados no diretório indicado
no arquivo ".tscnfg" no diretório HOME do usuário ou no diretório padrão para banco de dados
(/usr/tsgbd/tsdic/).
O código de segurança deve ser o mesmo definido no banco de dados para que seja possível a sua
abertura. Isto serve para que somente pessoas autorizadas utilizem as informações contidas no banco de
dados.
O nível de acesso (<nível>) é uma outra forma de proteção às informações de um banco de dados, pois
permite a definição de níveis de privacidade para os itens do banco de dados. Além disso, a palavra de
nível não precisa ser definida no programa-fonte; pode-se especificar um "*" (asterisco) no local
destinado a palavra de nível no comando DATAJOIN. Com isso, o programa abrirá o banco de dados
com a palavra de nível definida pelo utilitário BDCNFG.
O modo de abertura também é uma forma de proteger as informações de um banco de dados. Existem
três modos de abertura:
• Modo de abertura igual a 1 permite somente leitura.
• Modo de abertura igual a 2 permite leitura e gravação.
• Modo de abertura igual a 3 permite a abertura exclusiva do banco de dados para leitura e
gravação, sem permitir concorrência com outros usuários. Isto é útil para manutenção das
informações contidas no banco de dados.
Os utilitários do OpenBASE abrem o banco de dados com modo de abertura igual a 3 evitando
concorrência com outros usuários.
Outras maneiras de se abrir um banco de dados OpenBASE se faz através das variáveis do sistema
OPUS :
NAME determina o nome de um banco de dados a ser aberto. Útil quando se tem bancos de dados com
mesma estrutura, por exemplo, folhas de pagamento de diferentes empresas.
SECURITY determina o código de segurança para um banco de dados. Útil quando se deseja que
somente pessoas autorizadas utilizem o sistema. Funciona como uma password para o banco de dados.
LEVEL determina o nível de privacidade das informações. Útil quando se deseja que somente pessoas
autorizadas leiam ou atualizem as informações do banco de dados ,por exemplo, o item salário somente
alguns podem atualizar.
MODE determina o modo de abertura para um banco de dados.
Estas variáveis são verificadas em tempo de execução e caso ocorra uma incoerência entre os valores
passados e os definidos no banco de dados a função DBERR( ) retornará um valor diferente de 0 (zero).
3.32.5
Exemplo
O exemplo a seguir mostra como abrir um banco de dados OpenBASE no diretório padrão para o
sistema utilizando o comando DATAJOIN.
.
.
.
DATABASE bdemp 33 a 2
DATAJOIN def 1 a 2
USE ... (Qualquer arquivo dos 2 bancos)
.
.
.
3.32.6
Consulte
$NODATABASE, DATABASE, SET MESSAGE, USE, DBERR( ) e DBMENS( ).
3.33 DECLARE
3.33.1
Propósito
Serve para declarar vetores de variáveis. Na linguagem Opus, esses arrays são vetores unidimensionais.
3.33.2
Sintaxe
DECL[ARE] [PRIVATE | PUBLIC | STATIC] <vetor>[<exp.N>] = <exp> [,...]
3.33.3
Argumentos
PUBLIC
STATIC
PRIVATE
<vetor>
<exp.N>
<exp>
3.33.4
determina que o vetor será público, isto é, terá escopo global.
determina que o vetor será estático.
determina que o vetor será privado.
determina o nome do vetor.
determina a quantidade de elementos do vetor.
representa uma expressão que definirá o tipo, o tamanho e o valor inicial de todos
os elementos.
Utilização
O comando DECL permite a utilização de vetores em um programa. Vetores são variáveis indexadas
cujos índices variam de 1 até <exp.N>, inclusive. Não se pode declarar mais de um vetor em um único
comando DECLARE.
Para vetores públicos, quando não se sabe a quantidade de elementos do vetor, no lugar de <exp.N>
pode ser declarado um "*" (asterisco), determinando que o vetor terá o último tamanho definido.
Utilizando a opção LONG, o comando DECL permite a declaração de vetores com tamanho maior que
65.535 Bytes. Veja comando DECLARE LONG.
3.33.5
Exemplos
O exemplo a seguir mostra a declaração de dois vetores locais do tipo cadeia.
INPUT TO varnum
DECL vetcad1[10]=SPACE(10)
DECL vetcad2[varnum]=SPACE(50)
O exemplo a seguir mostra a declaração de vetores públicos e vetores locais de mais de um tipo.
@ 1,2 SAY " forneça o nome " GET nome PIC; rep("x",40).
DECLARE PUBLIC vpcad[10] = SPACE(10)
DECLARE PUBLIC vpnum[10] = 10
DECLARE PUBLIC vplog[25]=.T.
DECLARE vl_num[6]=0
DECLARE vl_cad[90] = SPACE(LEN(nome))
O exemplo a seguir mostra como passar vetores LONG como parâmetros e como recebé-los dentro de
uma sub-rotina.
prog
declare long v1[50 ]= 0
do proc_1 with v1
…
…
…
proc proc_1
parameters long v1[](n)
…
…
…
3.33.6
Consulte
$DATE, $FLOAT, $LENTMP, $SIMBOLS, DO, PRIVATE, PUBLIC, PARAMETERS, SET
DECIMALS, STATIC, STORE, ACHOICE( ), AFILES( ), AFILL( ), AINS( ) AJOINS( ), CTOD( ),
DTOC( ) , FTON( ) e NTOF( ).
3.34 DECLARE LONG
Utilizando a opção LONG, o comando DECL permite a declaração de vetores com tamanho maior que
65.535 Bytes, podendo estes serem acessados e/ou modificados utilizando os comandos do tipo
STORE, GET, ACEITE, INCR, DESCR … etc … Porém, funções tais como AFILL(), ASORT(),
ACHOICE(), ACOPY(), ADEL(), AFIELDS(), AFILES(), AINS(). AJOINS(), AKEYS(), ALEN(), e
ASCAN() não podem indicar vetores declarados como LONG.
Vetores declarados como LONG podem ser passados como parâmetros para funções e rotinas. O
programa (procedure) que receber esse vetor como parâmetro, deve ter o mesmo declarado.
3.34.1
Sintaxe
Declare Long <Vetor>[<numero>]=<expressão>
A palavra LONG indica que a dimensão do vetor <numero> pode ser maior que 65535.
Vetor pode ser acessado ou modificado utilizando os comandos STORE, GET, ACEITE, INCR,
DECR, mas as rotinas AFILL, ASORT, etc... não podem indicar este vetor.
3.34.2
Argumentos
PUBLIC
STATIC
PRIVATE
LONG
<vetor>
<exp.N>
<exp>
3.34.3
determina que o vetor será público, isto é, terá escopo global.
determina que o vetor será estático.
determina que o vetor será privado.
determina que o vetor .poderá ser maior que 65535.
determina o nome do vetor.
determina a quantidade de elementos do vetor.
representa uma expressão que definirá o tipo, o tamanho e o valor inicial de todos
os elementos.
Exemplo
declare long vetopt[70000]=space (70).
3.34.4
Consulte
DECLARE, STORE, GET, INCR, DECR, AFILL( ), ASORT( ).
3.35 DELETE
3.35.1
Propósito
Suprimir um registro.
3.35.2
Sintaxe
DELETE [CASCADE | KEYINFO | SETNULL]
3.35.3
Argumentos
CASCADE
KEYINFO
SETNULL
3.35.4
determina que os registros subordinados ao registro excluído também sejam
excluídos.
atualiza as chaves estrangeiras dos registros subordinados segundo a informação
contida no dicionário de dados.
coloca nulo nas chaves estrangeiras dos registros subordinados.
Utilização
Suprime o último registro lido no arquivo selecionado. Tanto pode ser um arquivo de banco de dados
como um arquivo externo.
A supressão de um registro é feita de forma física, isto é, o registro tem seu conteúdo removido do
arquivo de dados e de seus índices.
Em arquivos OpenBASE os registros suprimidos ocupam espaço para futuras inclusões. Isto agiliza o
processo de exclusão e inclusão de registros, porque não é feita uma reorganização do arquivo na
exclusão e nem o tamanho do arquivo é alterado durante a inclusão.
Quando se realiza um número muito grande de exclusões, o arquivo passa a ocupar espaço
desnecessário. Quando isso ocorrer, sugere-se que se faça uma manutenção no banco ou nos arquivos
que apresentem tais características.
Quando utilizado com a opção CASCADE, são excluídos primeiramente os registros dos arquivos
subordinados ao registro corrente, se estes tiverem subordinações estas também serão excluídas. Esta
opção representa uma exclusão em cadeia hierárquica.
Quando utilizado com a opção KEYINFO, a exclusão do registro corrente é feita dependendo da
informação definida para as chaves estrangeiras do registro corrente. Para cada opção de deleção o
comando DELETE agirá de uma maneira particular.
Opção C (cascata) : Obriga a exclusão dos registros subordinados ao registro lido no arquivo
selecionado.
Opção S (nulo) : Obriga a colocação de nulo no valor da chave estrangeira. Neste caso, a chave
estrangeira deve obrigatoriamente ser do tipo nulo.
Opção R (restrito) : Obriga a não exclusão do registro subordinado.
Quando utilizado com a opção SETNULL, as chaves estrangeiras são modificadas para nulo e o
registro corrente é removido. Isto só é possível se as chaves estrangeiras forem do tipo nulo.
O comando DELETE, por DEFAULT, não permite a exclusão de registros com ligações, retornando
um valor diferente de zero pela função DBERR( ), garantindo a integridade referencial.
3.35.5
Exemplo
O exemplo a seguir mostra como suprimir todos os registros dos funcionários que já se aposentaram.
USE tab_func
LOCATE FOR ino_func = 001
DO WHILE FOUND( )
DELETE
CONTINUE
ENDDO
3.35.6
Consulte
LOCATE, SEEK, USE, ZAP, DBERR( ), EOF( ), FDELETE( ), FGO( ), FGPDELETE( ) e FEMPTY(
).
3.36 DELETE FILE
3.36.1
Propósito
Remover um arquivo externo.
3.36.2
Sintaxe
DELETE FILE
3.36.3
Utilização
Quando é necessário remover o arquivo externo em uso. No caso de arquivo externo indexado, são
removidos o arquivo de dados e o arquivo de índice.
3.36.4
Consulte
ZAP.
3.37 DO
3.37.1
Propósito
Executar um procedimento.
3.37.2
Sintaxe
DO {<nome> | &S(<exp.C>)} [ WITH <parâmetros>]
3.37.3
Argumentos
<nome>
&S(<exp.C>)
Representa o nome do procedimento a ser executado.
Determina que será executado um dos procedimentos declarados no comando
EXTERNAL, onde <exp.C> representa o nome do procedimento.
WITH
Determina que serão passados parâmetros para o procedimento. Se mais de um
parâmetro for passado estes devem ser separados por "," (vírgula).
Os parâmetros podem ser variáveis e/ou vetores.
3.37.4
Utilização
Em programação modular, quando um procedimento é utilizado várias vezes em um programa ou
utilizado por vários programas.
Facilita a manutenção e depuração de sistemas já que estes são compostos de pequenos trechos
independentes.
O comando DO e WITH não são obrigatórios, pode-se executar um procedimento passando-se somente
seu nome e seus parâmetros entre parênteses.
Todos os parâmetros são passados por referência.
A lista de parâmetros deve conter todos os parâmetros que o procedimento receberá.
3.37.5
Exemplo
O exemplo a seguir mostra-nos como executar uma PROCEDURE de diversas formas.
EXTERNAL inclui, altera, exclui
WAIT "alterar, incluir ou excluir ? " TO opcao
DO CASE
CASE opcao = "a"
DO altera
CASE opcao = "i"
DO inclui( )
CASE opcao = "e"
DO &S("exclui")
OTHERWISE
MESSAGE "Opcao não valida"
ENDCASE
3.37.6
Consulte
$LIBRARY, $NOLIB, $OVLY, CC PROC, EXTERNAL, FUNCTION, PARAMETERS, PRIVATE,
RUN, SET KEY, STATIC e &S ().
3.38 DO CASE
3.38.1
Propósito
Executar um entre vários blocos de comandos dependendo de uma condição.
3.38.2
Sintaxe
DO CASE
CASE <exp.L1>
<comandos>
[CASE <exp.L2>
<comandos>
...]
[OTHERWISE
<comandos>]
ENDCASE
3.38.3
Argumentos
Cada condição <exp.L> é testada seqüencialmente.
Os testes param na primeira condição verdadeira(.T.).
Neste caso, o conjunto subseqüente de comandos é executado e o comando CASE é encerrado.
A presença do comando OTHERWISE determina a execução de um conjunto de comandos caso
nenhuma das condições anteriores tenham sido satisfeitas.
3.38.4
Utilização
Para desviar o fluxo do programa, em decorrência de condições pré-definidas. É uma alternativa aos
IFs aninhados.
EXEMPLO
O exemplo a seguir mostra como executar um conjunto de comandos dependendo da escolha de um
MENU.
escolha = 0
* mostra um menu de opções
@ 05,10 PROMPT " incluir "
@ 07,10 PROMPT " alterar "
@ 09,10 PROMPT " excluir "
* obtém a opcao escolhida
MENU TO escolha
* executa a ação escolhida
DO CASE
CASE escolha = 0
MESSAGE " procedimento de inclusão "
DO inclui && Executa procedimento.
CASE escolha = 1
MESSAGE " procedimento de alteração "
DO altera && Executa procedimento.
CASE escolha = 2
MESSAGE " procedimento de exclusão "
DO exclui && Executa procedimento.
OTHERWISE
CLEAR && Limpa a tela do terminal.
MESSAGE "fim de programa" BLINK
QUIT(0)
ENDCASE
3.38.5
Consulte
CC PROC, DO WHILE, IF, MENU TO, SET EXACT, CHR( ) e IIF( ).
3.39 DO WHILE
3.39.1
Propósito
Executar um bloco de comandos enquanto uma condição for verdadeira.
3.39.2
Sintaxe
DO WHILE <exp.L>
<comandos>
[LOOP]
<comandos>
[EXIT]
<comandos>
ENDDO
3.39.3
Argumentos
<exp.L>
LOOP
EXIT
3.39.4
Representa uma condição a ser avaliada a cada iteração.
Determina que a seqüência de execução retornará ao início do laço
(comando DO WHILE).
Determina o encerramento forçado do laço.
Utilização
Quando há necessidade de repetir-se um conjunto de comandos um número indeterminado de vezes, de
acordo com uma condição de controle.
Quando a expressão avaliada (<exp.L) retornar um valor falso (.F.),o laço é terminado. Caso a
condição não retorne nunca um valor falso, o laço torna-se infinito.
3.39.5
Exemplo
O exemplo a seguir exibe todos os números de 0 a 100.
var_num = 0
DO WHILE var_num <= 100
? var_num
var_num = var_num + 1
ENDDO
&& Exibe um numero em cada linha.
O exemplo a seguir exibe todos os números pares entre 0 e 100.
var_num = 0
DO WHILE var_num <=100
? var_num
var_num = var_num + 2
ENDDO
&& Exibe um numero em cada linha.
O exemplo a seguir exibe todos os números pares entre
0 e 100 utilizando a cláusula LOOP.
var_num = 0
DO WHILE var_num <= 100
IF var_num % 2 # 0
&& Verifica se num não é múltiplo de 2
++ var_num
LOOP
&& Devolve o controle ao comando DO WHILE
ENDIF
? var_num
&& Exibe um numero em cada linha
++ var_num
ENDDO
3.39.6
Consulte
DECR, EXIT, FOR ... NEXT, INCR, LOOP, QUIT, STORE, CHR( ) e VAL( ).
3.40 DYNAMIC
3.40.1
Propósito
A opção DYNAMIC indica que a variável não tem tamanho definido, será dinamicamente alocada.
A variável só pode ser usada nos comandos MEMOGET, MEMOPUT, MEMOREAD, MEMOWRIT,
MLCOUNT, MEMOLINE, MEMOEDIT, MEMOSAVE, MEMOSEEK.
3.40.2
Exemplo
private dynamic stor (c)
public dynamic stor (c)
static dynamic stor (c)
3.40.3
Consulte
PRIVATE, PUBLIC, STATIC.
3.41 EDIT
3.41.1
Propósito
Invocar um editor de textos e arquivar o texto em um banco de dados.
3.41.2
Sintaxe
EDIT [(<exp.C>)] <item.lig> = <exp>
3.41.3
Argumentos
<exp.C>
<item.lig>
<exp>
3.41.4
Representa o nome do editor de texto que será utilizado. Caso seja omitido, o
editor invocado é o ed do UNIX.
representa o nome da chave de ligação na entidade fraca associada.
representa o valor da chave que identifica o texto.
Utilização
Na edição de cartas, propostas, contratos, etc... onde se faz necessária à ligação do documento com o
assunto.
O arquivo onde será armazenado o texto deve ser uma entidade fraca e ter apenas dois itens: a chave de
ligação com a entidade e a linha do documento digitado, que deve ter o tamanho da maior linha editada
para que não seja truncada.
3.41.5
Exemplo
O exemplo a seguir mostra a utilização deste recurso com as observações sobre o cliente com código
igual a 234
USE tab_obsc
EDIT ("vi") id1_clie = 234
* rotina para imprimir curriculum
SEEK id1_clie = 234
SET PRINT ON
DO WHILE FOUND()
? obs_clie
SKIP
ENDDO
SET PRINT OFF
3.41.6
&& Invoca o editor vi do unix
&& Pesquisa cliente
&& Ativa impressora
&& Imprime texto de observações.
&& Desativa impressora
Consulte
$FILES, $OPEN e USE.
3.42 EJECT
3.42.1
Propósito
Saltar para a próxima página na impressão de relatórios.
3.42.2
Sintaxe
EJECT
3.42.3
Utilização
Nas quebras de formulários.
Quando se deseja saltar páginas vazias para separar formulários diferentes.
Corresponde ao comando FORM-FEED (ff).
3.42.4
Exemplo
O exemplo a seguir mostra o salto de página durante uma quebra do ano de nascimento dos
dependentes ou quando linha >= a 50.
SET PRINT ON
EJECT
&& Salto de pagina, para iniciar impressão.
IF ano_depe > anocorrente .or. linha >= 50
linha = 1
anocorrente = ano_depe
EJECT
&& Salto de pagina previsto.
ENDIF
3.42.5
Consulte
SET DEVICE, SET PRINT, SET PRINTER e CHR( ).
3.43 EMPTY
3.43.1
Propósito
Esvaziar todo um arquivo.
3.43.2
Sintaxe
EMPTY
ZAP
3.43.3
Utilização
Esvaziar todo o conteúdo do arquivo selecionado.
3.43.4
Exemplo
prog
database EXEMPLO 1 a 2
use PESSOA
empty
&& Irá esvaziar o arquivo PESSOA.
3.43.5
Consulte
ZAP.
3.44 EXEC SQL
3.44.1
Propósito
Executar procedimentos SQL em um programa OPUS
3.44.2
Sintaxe
EXEC SQL
<SQL>
END EXEC
3.44.3
Argumentos
<SQL>
3.44.4
representa um trecho de código SQL a ser executado.
Utilização
Permite ao usuário acessar uma base de dados através de comandos SQL.
3.44.5
Consulte
Manual de referência TSQL.
3.45 EXIT
3.45.1
Propósito
Forçar a saída de um comando de repetição (laço).
3.45.2
Sintaxe
EXIT
3.45.3
Utilização
Quando for necessário encerrar um comando de repetição.
Provoca o desvio do fluxo do programa para o primeiro comando após o fim do laço.
Utilizado somente em conjunto com os comandos FOR ... NEXT e DO WHILE ... ENDDO. Quando
executado, impõe a continuidade de execução do programa para o primeiro comando após o NEXT ou
ENDDO.
3.45.4
Exemplo
O exemplo a seguir mostra como sair do laço FOR ... NEXT antes do comando, assim que i seja igual a
10.
FOR i = 1 TO 10000
@ 10, 2 SAY""
?i
IF i = 10
EXIT
ENDIF
? "Dentro do laço"
NEXT
CLEAR
&& Posiciona o cursor.
&& Exibe o valor da variável i
&& Exibe o texto.
O exemplo a seguir mostra uma forma de sair do LOOP infinito.
CLEAR
SET MESSAGE TO 23, 21
MESSAGE " Pressione S para sim ou N para não. "
DO WHILE .T.
@ 1,2 SAY""
&& Posiciona o cursor.
WAIT "Deseja parar ? " TO resp
IF resp $ "Ss"
EXIT
&& Força saída
ENDIF
ENDDO
CLEAR MESSAGE
? "Fim do laço"
3.45.5
Consulte
DO WHILE, FOR ... NEXT, IF, LOOP, QUIT e RETURN.
3.46 EXTERNAL
3.46.1
Propósito
Informar símbolos para o ligador.
3.46.2
Sintaxe
EXTERNAL <nome1> [[,<nome2>] [,<nome3>]......]
3.46.3
Argumentos
<nome>
3.46.4
representa o nome do procedimento codificado em outro arquivo fonte.
Utilização
Possibilita executar PROCEDURES através da função &S( ).
3.46.5
Exemplo
O exemplo a seguir mostra uma forma de uso do comando EXTERNAL e da função &S().
CLEAR
SET MESSAGE TO 23,21
MESSAGE " Pressione uma das letras maiúsculas "
EXTERNAL inclui, altera
&& Declara símbolos para ligador.
WAIT "Inclui ou Altera (I/A) ?" TO k
IF k $ "Aa"
var_cad = "altera"
ELSEIF k $ "Ii"
var_cad = "inclui"
ELSE
CLEAR MESSAGE
MESSAGE "Opcao Nao Valida"
QUIT
&& Termina programa
ENDIF
DO &S (var_cad)
3.46.6
Consulte
DO, PROCEDURE, SET KEY e &S( ).
3.47 FIND
3.47.1
Propósito
Ler um registro pelo valor da chave primária.
3.47.2
Sintaxe
FIND <exp> [NEXT] [SHARED | EXCLUSIVE] [ALL]
3.47.3
Argumentos
expressão a ser pesquisada, deve ser do mesmo tipo da chave.
lê o registro com valor igual ou maior que a expressão. Só aplicável em
arquivo externo indexado.
determina o bloqueio para leitura compartilhada do registro
determina o bloqueio para uso exclusivo do registro.
determina que todos os itens do registro sejam lidos, não importando se serão
utilizados ou não.
<exp>
NEXT
SHARED
EXCLUSIVE
ALL
3.47.4
Utilização
Acessa diretamente um registro cujo valor da chave primária corresponda ao da expressão. Caso o
registro não seja encontrado, a função EOF( ) retorna verdade (.T.) e a função FOUND( ) retorna falso
(.F.).
Com a opção NEXT só acusará final de arquivo (EOF( ) = .T.) se não for encontrado nenhum registro
que seja igual ou maior que a expressão. SHARED determina que o registro seja bloqueado podendo
compartilhar somente a leitura do registro. Utilizada em bloqueio de banco, funciona como
EXCLUSIVE.
EXCLUSIVE determina que o registro seja acessado exclusivamente pelo usuário, sem permitir leitura
ou gravação por outro usuário.
ALL faz com que todos os itens do registro sejam carregados para memória.
3.47.5
Exemplo
O exemplo a seguir mostra como acessar um determinado registro em um arquivo entidade.
DATABASE bdemp1 33 a 2
USE tab_func
FIND 123
&& id0_func = 123
IF FOUND( )
? nom_func
ELSE
? "Nao encontrado"
ENDIF
O exemplo a seguir mostra como acessar um determinado registro com valor igual ou maior que a
expressão.
USE usuarios.d
FIND 123 NEXT
IF FOUND( )
? nomeusr
ELSE
? "Fim de arquivo"
ENDIF
3.47.6
Consulte
$READALL, DATABASE, LOCK, REPLACE, RESTORE, SAVE, SEEK, SELECT,
DBERR( ), EOF( ), FFIND( ), FGO( ), FRECNO( ), FOUND( ) e RECCOUNT( ).
3.48 FOR ... NEXT
3.48.1
Propósito
Repetir um bloco de comandos um certo número de vezes.
3.48.2
Sintaxe
FOR <var.N> = <exp.N1> TO <exp.N2> [STEP <exp.N3>]
<comandos>
[LOOP]
<comandos>
[EXIT]
<comandos>
NEXT
3.48.3
Argumentos
<var.N>
representa uma variável de controle para o laço.
<exp.N1>
<exp.N2>
STEP
LOOP
EXIT
3.48.4
representa o valor inicial para variável de controle.
representa o valor final para variável de controle.
determina o incremento ou o decremento da variável de controle segundo o valor
de <exp.N3>.
determina que a seqüência de execução retornará ao início do laço (comando
FOR).
determina o encerramento forçado do laço.
Utilização
Quando há necessidade de se repetir um conjunto de comandos um número específico de vezes, de
acordo com uma variável de controle .
Por DEFAULT, o contador é incrementado de um, a cada passagem pelo comando FOR, mas pode-se
alterar este incremento utilizando-se a cláusula STEP. Quando a variável de controle atingir valor igual
ao limite (<exp.N2>) o LOOP é terminado. Caso a variável de controle não se iguale ao limite, o laço
termina um valor antes.
Caso <var.N> não exista, é criada automaticamente e incrementada, podendo servir de contador.
3.48.5
Exemplo
O exemplo a seguir exibe todos os números de 0 a 100.
FOR var_num = 0 TO 100
? var_num
&& Exibe um numero em cada linha.
NEXT
O exemplo a seguir exibe todos os números pares entre 100 e 0 utilizando a cláusula STEP.
** Decrementa de 2 o valor de num.
FOR var_num = 100 TO 0 STEP -2
** Exibe um numero em cada linha.
? var_num
NEXT
O exemplo a seguir exibe todos os números pares entre 100 e 0 utilizando a cláusula LOOP.
FOR var_num = 100 TO 0 STEP -1
IF var_num % 2 # 0
&& Verifica se num não é múltiplo de 2
LOOP
&& Devolve o controle ao comando FOR
ENDIF
? var_num
&& Exibe um numero em cada linha
NEXT
O exemplo a seguir mostra um laço infinito (LOOP fechado)
FOR var_num = 1 TO 10 STEP 2 && var_num nunca será igual a 10
? var_num
&& Exibe numero em cada linha
NEXT
3.48.6
Consulte
DECR, DO WHILE, EXIT, INCR, LOOP, QUIT, STORE, CHR( ) e VAL( ).
3.49 FUNCTION
3.49.1
Propósito
Definir ou declarar a utilização de uma função.
3.49.2
Sintaxe
[STATIC] FUNC[TION] [<nome>]
FUNC[TION] <nome>[(<tipo>)]
3.49.3
Argumentos
STATIC
<nome>
<nome>[(tipo)]
3.49.4
declara uma função que só será invocada por rotinas descritas na mesma
fonte.
representa o nome da função definida.
representa o nome e o tipo da função declarada.
Utilização
Define que a fonte é de uma função de usuário e que será gerado um arquivo objeto após sua
compilação. Este arquivo objeto terá o nome definido por <nome> mais a extensão ".o" (".obj" no MSDOS) ou o nome da fonte com a extensão ".o" no lugar de ".f", quando <nome> não for definido.
Utilizam-se funções estáticas para limitar a visibilidade do nome da função, restringindo o acesso a esta
e permitindo que um sistema seja composto de subsistemas específicos, sem a necessidade de batizar
cada função com o nome diferente da outra.
Para se declarar que um programa utilizará uma função, basta utilizar o comando FUNCTION seguido
do nome e o tipo da função.
O tipo pode ser omitido se a função for do tipo caractere.
3.49.5
Exemplo
O exemplo a seguir define uma função de usuário para ser guardada em uma biblioteca de objetos.
Note pelo valor retornado, que se trata de uma função lógica.
$LIBRARY=bibfun.a
&& Biblioteca que conterá o objeto da função
FUNC confirma
&& Definição que o fonte e de uma função
** Inicio dos comandos da função
DO WHILE .T.
WAIT "confirma s/n ? " TO resp
IF resp $ "Nn"
RETURN (.F.)
&& Retorna falso.
ELSEIF resp $ "Ss"
RETURN (.T.)
&& Retorna verdadeiro.
ENDIF
ENDDO
O exemplo a seguir mostra a declaração e o uso da função confirma.
$LIBRARY=bibfun.a
PROG
FUNC confirma(l)
&& Declara utilização da função confirma de tipo lógico
IF confirma() && Executa a função confirma.
? "confirmou "
ELSE
? "não confirmou"
ENDIF
3.49.6
Consulte
DO, PARAMETERS, PROCEDURE, PROGRAM, &SC, &SD, &SF, &SL e &SN.
3.50 GINI
3.50.1
Propósito
O comando GINI é usado no processo de tabulação para efetuar o cálculo do índice de GINI.
3.50.2
Sintaxe
GINI <ident> <varq> [WT = <varqw>] [BY=<varb1>...<varbn>]
3.50.3
Argumentos
<ident> - literal identificador da matriz (tamanho = 100)
<varq> - variável numérica quantitativa
<varb> - variável numérica categorizada
3.50.4
Semântica
O comando GINI indica uma matriz a ser calculada com número de linhas igual ao número de valores
da variável quantitativa e número de colunas igual a 3. Para cada registro selecionado, inclui-se na
primeira coluna, se não existir, o valor da variável quantitativa. Se a variável WT for especificada,
soma-se este valor na segunda coluna, caso contrário soma-se 1. Na terceira coluna sempre soma-se 1.
Se as variáveis BY forem especificadas, calcula-se uma matriz para cada combinação de valores destas
variáveis, gravando-se estes valores em campo de controle.
3.51 GO
3.51.1
Propósito
Ler um registro através de seu número lógico.
3.51.2
Sintaxe
GO <exp.N> [SHARED | EXCLUSIVE] [ALL]
3.51.3
Argumentos
<exp.N>
representa o número lógico do registro.
ALL
SHARED
EXCLUSIVE
3.51.4
determina que todos os itens do registro sejam lidos.
determina o bloqueio para leitura compartilhada do registro
determina o bloqueio para uso exclusivo do registro.
Utilização
Acessa um registro pelo seu endereço lógico no arquivo de dados.
Este comando ignora o índice utilizado, lendo diretamente sobre o arquivo de dados.
SHARED determina que o registro seja bloqueado podendo ser compartilhada somente a leitura do
registro. Utilizada em bloqueio de banco, funciona como EXCLUSIVE.
EXCLUSIVE determina que o registro seja acessado exclusivamente pelo usuário, sem permitir a
leitura ou a gravação por outro usuário.
Se <exp.N> for o endereço de um registro excluído, a função DBERR() retornará 216 (este código
indica que REGISTRO NÃO EXISTE NO ARQUIVO).
Este comando só se aplica aos arquivos de banco de dados e arquivos externos tipo S e R (seqüencial e
relativo), devido ao fato de que seus registros possuírem tamanho fixo.
A função EOF( ) retorna verdadeiro (.T.), caso o registro não seja encontrado.
3.51.5
Exemplo
O exemplo a seguir mostra-nos como acessar o quinto registro em um arquivo de banco de dados.
USE tab_vend
GO 5 && Acessa o registro de numero 5
IF FOUND()
? "Encontrou o Registro Numero 5"
ELSE
? "Este Arquivo tem menos de 5 registros"
?? " ou Registro 5 foi excluído"
ENDIF
O exemplo a seguir mostra-nos a leitura de um registro em arquivo externo.
USE agenda.d && Arquivo tipo S (seqüencial)
GO 90
IF EOF()
? "Este Arquivo tem menos de 90 registros"
?? " ou Registro 90 foi excluído"
ENDIF
3.51.6
Consulte
$READALL, LOCATE, RESTORE, SAVE, SELECT, EOF( ), FGO ( ), FRECNO( ) e
RECCOUNT( ).
3.52 GO [BYTE]
3.52.1
Propósito
A opção BYTE foi criada para posicionar em arquivos externos, mesmo tipo L ou M.
A <expN> indica o byte a posicionar.
No caso de arquivos externos tipo S ou R, a <expN> corresponde ao número do registro menos 1 vezes
o tamanho do registro.
3.52.2
Sintaxe
GO BYTE <exp.N> [SHARED | EXCLUSIVE] [ALL]
3.52.3
Exemplos
Use *
abc s len(20)
a u20
enduse
No exemplo acima, go 2 eqüivale a go byte 20.
No caso de arquivos externos tipo L ou M, <expN> corresponde a soma dos tamanhos dos registros
mais 1 (UNIX) ou mais 2 (DOS) anteriores ao registro.
Use *
abc l len(20)
a u20
enduse
decl posi[3]=0
locate
p=0
for i=1 to 3
posi[i]=p
p=p+len(a)+2
continue
next
No exemplo acima, go byte posi[2] posiciona no 20.registro.
3.53 IF ... ENDIF
3.53.1
Propósito
Desviar o fluxo do programa dependendo de uma ou mais condições.
3.53.2
Sintaxe
IF <exp.L1>
<comandos>
[ELSEIF <exp.L2>
<comandos>]
[ELSE
<comandos>]
ENDIF
3.53.3
Argumentos
<exp.L>
ELSEIF
ELSE
ENDIF
3.53.4
representa uma expressão de controle. Se seu valor é verdadeiro (.T.), todos os
comandos seguintes são executados até um ELSEIF, ELSE ou ENDIF.
determina que uma nova condição será testada, caso todas as expressões
anteriores sejam falsas (.F.).
determina os comandos que serão executados quando as condições do IF e de
todos os ELSEIF sejam falsas (.F.).
determina o fim de um comando IF.
Utilização
Quando se pretende testar a veracidade de uma expressão e executar um conjunto de comandos a partir
do resultado obtido nela.
O comando estruturado IF ... ENDIF funciona executando blocos de comandos a partir da primeira
expressão que retorne verdade (.T.) .
ELSEIF e ELSE servem para simplificar agrupamentos de IF fazendo com que o fluxo de execução do
programa seja alterado de acordo com o resultado das expressões testadas.
O uso deste comando eqüivale ao comando DO CASE ... ENDCASE.
3.53.5
Exemplo
O exemplo a seguir mostra-nos a utilização do comando IF com a cláusula ELSE que será executada
caso o resultado retorne falso (.F.).
INPUT "1 + 2 e igual a ? " TO varnum
IF 1+2 = varnum
? "Ok você acertou "
?? " 1 + 2 e igual a "
? 3 BLINK
ELSE
? "Você errou 1 + 2 não e ",varnum
ENDIF
O exemplo a seguir mostra-nos a utilização do comando IF com as cláusulas ELSEIF e ELSE.
INPUT "Qual sua idade ? " TO idade
IF idade < 0 .or. idade > 100
? " Impossível "
ELSEIF idade >= 0 .and. idade <= 16
? "Você e um Adolescente"
ELSEIF idade >=17 .and. idade <= 35
? "Você e um Jovem"
ELSE
? "Você e um Adulto"
ENDIF
O exemplo a seguir mostra o exemplo anterior utilizando o comando DO CASE ... ENDCASE.
INPUT "Qual sua Idade ? " TO idade
DO CASE
CASE idade < 0 .or. idade > 100
? " Impossível "
CASE idade >= 0 .and. idade <= 16
? "Você e um Adolescente"
CASE idade >=17 .and. idade <= 35
? "Você e um Jovem"
OTHERWISE
? "Você e um Adulto"
ENDCASE
3.53.6
Consulte
DO CASE, DO WHILE, EXIT, FOR ... NEXT, FUNCTION, SET EXACT, CONF(), IIF(), VAL() e
STR().
3.54 INPUT
3.54.1
Propósito
Receber valores digitados e atribuí-los a uma variável numérica.
3.54.2
Sintaxe
INPUT [<exp.C> [<atrib1>] TO <var.N> [<atrib2>]
3.54.3
Argumentos
representa uma expressão cadeia a ser impressa.
representa o atributo de vídeo em que será exibida <exp.C>.
representa uma variável numérica que receberá o valor digitado.
representa o atributo de vídeo em que será exibido o valor digitado.
<exp.C>
<atrib1>
<var.N>
<atrib2>
3.54.4
Utilização
Para entrada de dado numérico sem formatação, a partir da posição atual do cursor.
Se <exp.C> for especificada, serão impressos caracteres ":" delimitando a área de recepção do valor
digitado.
Se <var.N> não for anteriormente declarada o comando INPUT a cria, automaticamente.
3.54.5
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando INPUT em dois casos : um sem uma variável
previamente declarada outro com uma variável declarada pelo comando INPUT anterior. Note os
atributos para variável e para a cadeia.
INPUT TO varnum BOLD && varnum é então definida como numérica.
INPUT "Entre com um número " REV TO varnum REV
O exemplo a seguir mostra a utilização de atributos e expressões .
varcad1 = "Entre com "
INPUT varcad1+"sua idade " BLINK TO idade REV
3.54.6
Consulte
$NOGET, $NOSCREEN, ?, ??, @ ... GET, @ ... SAY, ACCEPT, SET ATRIBUTE, SET GRAPHIC,
CHR( ), INKEY( ), LASTKEY( ) e VAL( ).
3.55 INSERT
3.55.1
Propósito
Incluir um registro no arquivo selecionado
3.55.2
Sintaxe
INSERT [BEFORE]
3.55.3
Argumentos
BEFORE
3.55.4
determina que o registro seja inserido antes do registro corrente.
Utilização
Quando utilizado, inclui um registro no arquivo selecionado.
Os itens incluídos são inicializados pelo comando REPLACE ou pelos comandos de atribuição.
Caso o arquivo tenha uma chave única e esta já tenha o valor a ser incluído, a função DBERR()
retornará um código diferente de 0 (zero) e o registro não e incluído. Com isso evita-se que antes de
uma inclusão tenha que se verificar a existência dos valores que serão incluídos.
A cláusula BEFORE só se aplica a arquivo de banco de dados OpenBASE e é útil para ordenar o
arquivo de dados.
3.55.5
Exemplo
O exemplo a seguir inclui um registro em um arquivo externo.
USE * && Abre um arquivo externo
* Inicio da declaração do arquivo externo
tel S LEN(94)
numero n14
nome u30
ende u50
ENDUSE
ACCEPT "Nome " TO nome
ACCEPT "Endereço " TO ende
INPUT "Telefone " TO numero
IF CONF()
INSERT
ENDIF
O exemplo a seguir inclui um registro em um arquivo entidade.
USE tab_clie
&& Abre o arquivo
ACCEPT "Codigo do Cliente " TO id0_clie
ACCEPT "Nome do Cliente " TO nom_clie
IF CONF( )
REPLACE AUTOMEM
&& Atribui aos itens do arquivo os valores em memória
INSERT
&& Inclui registro
** Verifica se registro foi incluído evitando pesquisar.
IF DBERR( ) # 0
BEEP
? "Registro já existe "
ENDIF
ENDIF
3.55.6
Consulte
APPEND, REPLACE, RESTORE, SAVE, SELECT, DBERR( ), EOF( ), FBINSERT( ), FINSERT( ),
RECNO( ) e FRECCOUNT( ).
3.56 KEYBOARD
3.56.1
Propósito
Preencher o buffer do teclado com uma expressão tipo cadeia.
3.56.2
Sintaxe
KEYBOARD <exp.C>
3.56.3
Argumentos
<exp.C>
3.56.4
representa os caracteres enviados ao buffer do teclado.
Utilização
Simula a digitação de um conjunto de teclas representadas em <exp.c>,evitando que o usuário digite
desnecessariamente, quando sabe o que deve ser digitado. Usado em conjunto de comandos e funções
que esperam entrada de dados via teclado.
3.56.5
Exemplo
O exemplo a seguir mostra a utilidade deste comando em uma função executada pelo comando SET
KEY.
$NOLIB
PROG
FUNC func_cod(l)
SET CONFIRM ON
SET KEY 28 TO func_cod
cod = 0
@ 08,10 SAY "Em Caso de Duvida tecle F1" BLINK
@ 10,10 SAY "Codigo do Produto " GET cod PIC "99" VALID func_cod(cod)
READ
QUIT(0)
FUNCTION func_cod
PARAMETERS p.cod(n)
If p_cod >= 1 .AND. p_cod <= 5
RETURN(.T.)
&& Retorna Verdadeiro pois esta no limite
ENDIF
DECLARE vet_cod[05] = SPACE(30)
vet_cod[01] = "01 - Parafuso 01"
vet_cod[02] = "02 - Parafuso 02"
vet_cod[03] = "03 - Parafuso 03"
vet_cod[04] = "04 - Parafuso 04"
vet_cod[05] = "05 - Parafuso 05"
opt = ACHOICE(01, 01, 07, 31, vet_cod)
@ 01,01 CLEAR TO 07,31
opt = IIF(opt = -1, opt + 2, opt + 1)
KEYBOARD LEFT(vet_cod[opt], 2)
RETURN(.F.)
3.56.6
Consulte
@ ... GET, RETURN, SET KEY, SET PF, CHR( ), INKEY( ), LASTKEY( ), READKEY( ), STR( ) e
VAL( ).
3.57 LOCATE
3.57.1
Propósito
Iniciar uma leitura seqüencial no arquivo selecionado.
3.57.2
Sintaxe
LOCATE [LAST] | [START <exp>] [FOR<exp.L>] [SHARED|EXCLUSIVE]
[ALL]
[REVERSE]
[CONTINUE]
3.57.3
Argumentos
LAST
START <exp>
FOR <exp.L>
SHARED
EXCLUSIVE
ALL
REVERSE
CONTINUE
3.57.4
determina que a leitura se dará do último registro para o primeiro.
determina que a leitura se inicie a partir do registro com o valor da chave
igual ou maior que <exp>.
determina que só serão lidos os registros que satisfaçam a expressão lógica.
determina o bloqueio para leitura compartilhada do registro
determina o bloqueio para uso exclusivo do registro.
faz com que todos os itens do registro sejam carregados para memória.
inverte o sentido da leitura.
lê o próximo registro do arquivo, respeitando o sentido da leitura.
Utilização
Quando se pretende iniciar uma leitura seqüencial em um arquivo selecionado.
Quando utilizado sem opções, lê o primeiro registro do arquivo segundo a chave estabelecida ou pelo
arquivo de dados caso este não tenha chave ou não se estabeleça uma chave de acesso.
A opção START é útil quando se sabe o início da leitura. É muito utilizada na pesquisa de intervalos
pois limita o início da pesquisa lendo diretamente o registro.
A opção FOR é útil quando se pretende ler somente alguns registros .
A opção START só é aplicável em arquivos de banco de dados.
A opção LAST e o comando REVERSE são úteis quando se pretende paginar o arquivo e caminhar por
entre seus registros para frente e para trás.
As opções LAST e o comando REVERSE não são aplicáveis em arquivo externo indexado.
A função EOF( ) retorna verdade (.T.), sempre que se chegar ao fim da pesquisa:
* Com a opção FOR quando mais nenhum registro atender a expressão.
* Com a opção LAST ou o comando REVERSE quando a leitura atingir o início ou o fim do arquivo.
* Com a opção START quando nenhum registro tiver valor igual ou maior que a expressão.
SHARED determina que o registro seja bloqueado, podendo compartilhar somente a leitura do registro.
Utilizada em bloqueio de banco, funciona como EXCLUSIVE.
EXCLUSIVE determina que o registro lido seja acessado exclusivamente pelo usuário, sem permitir a
leitura ou a gravação por outro usuário.
O comando LOCATE apenas inicia a leitura. Para prosseguir, utilizar o comando CONTINUE.
3.57.5
Exemplo
O exemplo a seguir lê um arquivo do primeiro registro ao último.
DATABASE bdemp1 33 a 2
USE tab_depe
LOCATE
&& Le o primeiro registro do arquivo.
DO WHILE FOUND( )
? "Numero do registro ",recno( )
? "Funcionário ", nom_func
? "Data de Nascimento do Dependente "
?? TRANSFORM("99/99/99",dat_depe)
?
CONTINUE
&& Le os próximos registros do arquivo
ENDDO
O exemplo a seguir lê um arquivo do último registro ao primeiro.
DATABASE bdemp1 33 a 2
USE tab_depe
LOCATE LAST
&& Le o ultimo registro do arquivo.
DO WHILE FOUND( )
? "Numero do registro ",recno( )
? "Funcionário ", nom_func
? "Data de Nascimento do Dependente "
?? TRANSFORM("99/99/99",dat_dep)
?
CONTINUE
ENDDO
O exemplo a seguir lê somente os registros dos funcionários do sexo feminino.
USE tab_func
LOCATE FOR sex_func = "fem"
DO WHILE .not. EOF( )
? "Nome da Funcionaria ", nom_func
CONTINUE
ENDDO
O exemplo a seguir lê somente funcionários do sexo feminino nascidos entre 1930 e 1960.
USE tab_depe
SET ORDER TO ano_func
LOCATE START 1930 FOR sex_func = "fem"
DO WHILE FOUND( ) .and. ano_func <= 1960
&& delimita o intervalo
? nom_func
CONTINUE
ENDDO
O exemplo a seguir mostra-nos como paginar um arquivo lendo seus registros seqüencialmente de trás
para frente ou de frente para trás.
USE funcion
LOCATE
sentido = "inicio -> fim"
DO WHILE FOUND( ) && Para quando atingir o inicio ou o fim do arquivo
? nomefun
? sentido
WAIT " Inverte o sentido ? " TO resp
IF resp $ "Ss"
REVERSE
&& Inverte o sentido da leitura.
CONTINUE
sentido = "fim -> inicio"
ENDIF
CONTINUE
ENDDO
3.57.6
Consulte
$DATE, $READALL, CONTINUE, FIND, RESTORE, REVERSE, SAVE, SET EXACT, SELECT,
SORT, CTOD( ), DBERR( ), DTOC( ), DBMESS( ), EOF( ), FCONTINUE( ), FLOCATE( ),
FRECNO( ), FSTART( ) e RECNO( ).
3.58 LOCK
3.58.1
Propósito
Bloquear um banco de dados.
3.58.2
Sintaxe
LOCK [UNDO]
3.58.3
Argumentos
UNDO
3.58.4
determina que todas as atualizações sejam desfeitas automaticamente na ocorrência de
algum erro durante uma atualização.
Utilização
Quando for necessário fazer uma atualização muito grande que envolva vários arquivos (transação),
para que não se perca a confiabilidade das informações do banco de dados. Isto evita a concorrência
nas atualizações de um banco de dados num sistema multi-usuário. O comando LOCK determina o
início de uma transação, bloqueando o banco para uso exclusivo do usuário que fez o primeiro pedido
de bloqueio. O comando LOCK deve ser usado em conjunto com o comado UNLOCK para determinar
o início e o fim de uma transação.
Para se utilizar a opção UNDO a opção ARQRECUP no esquema do BD deve estar especificado.
É aconselhado que entre o início e o fim de uma transação não se tenha interrupção do programa
(nenhum estado de espera), para que o banco fique menos tempo possível bloqueado.
3.58.5
Exemplo
O exemplo a seguir mostra a utilização do comando LOCK para demarcar o início de uma transação
com bloqueio de dados.
LOCK && Bloqueia banco de dados.
IF DBERR( ) # 0
erro = .T.
ELSE
SELECT c
REPLACE AUTOMEM
INSERT
&& Inclui um registro.
IF DBERR( ) # 0
erro = .T.
ENDIF
ENDIF
IF erro
&& Se ocorreu algum problema erro = .T.
UNDO
&& Desfaz todas as atualizações anteriores.
ENDIF
UNLOCK
&& Desbloqueia banco de dados.
3.58.6
Consulte
$FILES, FIND, SEEK, SET LOCKLOOP, SET MESSAGE, UNDO, UNLOCK e DBERR( ).
3.59 LOOP
3.59.1
Propósito
Voltar ao início de um comando de repetição (laço).
3.59.2
Sintaxe
LOOP
3.59.3
Utilização
Comando LOOP é utilizado em conjunto com os comandos FOR ... NEXT e DO WHILE ... ENDDO e
retorna o fluxo de controle para o início destes comandos. Muito útil para se evitar a execução de
determinados comandos dentro do laço, simplificando o trabalho do programador que para isto deveria
criar um conjunto de IF ... ENDIF muito complicado dependendo da aplicação.
Quando utilizado com o comando FOR ... NEXT a variável de controle é incrementada.
3.59.4
Exemplo
O exemplo a seguir mostra a utilização do comando LOOP com o comando FOR só exibindo os
números ímpares.
FOR i = 1 TO 100
IF i % 2 = 0
LOOP
ENDIF
? i, " e impar"
NEXT
&& Verifica se i e múltiplo de 2
O exemplo a seguir mostra a utilização do comando LOOP com o comando DO WHILE ... ENDDO
simulando um VALID para um GET onde só serão aceitos determinados caracteres.
DO WHILE .not. EOF( )
@ 10,10 SAY "inclui , altera ou exclui ? " GET op PIC "x"
READ
IF op $ "iaeIAE"
LOOP
&& Retorna o controle ao inicio do laço.
ELSEIF LASTKEY( ) = 27
EXIT
&& Termina laço se foi teclado {<ESC-ESC>}
ENDIF
ENDDO
3.59.5
Consulte
DO WHILE, EXIT, FOR ... NEXT, RETURN e QUIT.
3.60 MENU TO
3.60.1
Propósito
Executar um menu de barra luminosa definido pelo comando PROMPT.
3.60.2
Sintaxe
MENU TO <var.N>
3.60.3
Argumentos
<var.N>
3.60.4
representa uma variável numérica declarada anteriormente, que receberá um valor
referente a opção escolhida.
Utilização
O comando MENU TO é utilizado em conjunto com o comando PROMPT. Tem a função de apresentar
uma barra luminosa na posição especificada pela variável numérica e aguardar que uma das opções seja
escolhida.
Para se escolher uma opção basta utilizar as setas do teclado para mover a barra luminosa até a opção
desejada e teclar {ENTER}.
Pode-se ainda, dependendo do comando SET PROMPT TO, escolher uma opção através da digitação
de uma letra que pode ser a primeira (SET PROMPT TO FIRST) ou a primeira letra maiúscula (SET
PROMPT TO UPPER). Nestes dois casos deve-se ter o cuidado de não repetir as letras que identificam
a opção, pois se isto ocorrer será escolhida a primeira opção que tenha a letra digitada.
MENU TO atribui a <var.N> 0 para primeira opção 1 para segunda e assim por diante. A tecla
{ESC+ESC} retorna -1 .
3.60.5
Exemplo
O exemplo a seguir mostra-nos a utilização do comando MENU TO. A barra luminosa será
posicionada na segunda opção, note o valor da variável opc.
opc = 1
@ 10,10 PROMPT "primeira opcao"
@ 11,10 PROMPT "segunda opcao"
@ 12,10 PROMPT "terceira opcao"
MENU TO opc
DO CASE
CASE opc = -1 && LASTKEY( ) = 27 ;
? "foi pressionada a tecla {ESC+ESC}"
CASE opc = 0
? "escolheu a primeira"
CASE opc = 1
? "escolheu a segunda"
CASE opc = 2
? "escolheu a terceira"
ENDCASE
3.60.6
Consulte
@ ... PROMPT, SET KEY, SET PROMPT, INKEY( ) e LASTKEY( ).
3.61 MESSAGE
3.61.1
Propósito
Enviar uma mensagem para o terminal.
3.61.2
Sintaxe
MESSAGE <exp.C> [<atrib>]
3.61.3
Argumentos
<exp.C>
representa a mensagem que será exibida.
<atrib> quando utilizado, determina o tipo em que a mensagem será exibida.
3.61.4
Utilização
Pode ser usado em conjunto com os comandos @...PROMPT.ou @...GET
Utilizado para enviar mensagens para o terminal nas coordenadas definidas pelo comando SET
MESSAGE.
3.61.5
Exemplo
O exemplo a seguir mostra-nos a utilização do comando MESSAGE, enviando uma mensagem quando
executado.
IF verdade
MESSAGE "verdade" BOLD
ELSE
MESSAGE "falso" BLINK
BEEP
&& sinal sonoro
ENDIF
O exemplo a seguir mostra-nos a utilização do comando MESSAGE como opção do comando @...
GET ... Desse modo, envia-se uma mensagem caso se digite qualquer coisa diferente de "s" ou "n".
var=" "
@ 10,10 SAY "Continua <s/n> ? " GET var VALID var $ "sn"
MESSAGE "<S>sim ou <N> ano ?"
READ
3.61.6
Consulte
$NOSCREEN, $LENTMP, @ ... GET, @ ... PROMPT, @ ... SAY, CLEAR MESSAGE, SET
ATRIBUTE, SET MESSAGE e SLEEP.
3.62 MODIFY
3.62.1
Propósito
Alterar os valores do último registro lido no arquivo selecionado.
3.62.2
Sintaxe
MODIFY [SAME] [CASCADE | KEYINFO | SETNULL]
3.62.3
Argumentos
determina que a alteração só se efetuará caso o conteúdo do registro não tenha sido
SAME
alterado entre a leitura e a gravação. Caso ocorra alteração do registro durante a transação função
DBERR() retorna 333.
permite a alteração do valor da chave primária, alterando também o valor das chaves
CASCADE
estrangeiras nos registros subordinados ao registro corrente.
atualiza as chaves estrangeiras dos registros subordinados segundo a informação
KEYINFO
contida no dicionário de dados.
coloca nulo nas chaves estrangeiras dos registros subordinados.
SETNULL
3.62.4
Utilização
O comando MODIFY só se aplica a arquivo de banco de dados. Este comando é utilizado para alterar o
valor de itens chave, a não ser quando se tratar de chaves primárias de arquivos entidades.
Desta forma, o comando MODIFY garante que a referência entre os registros não seja perdida e o
banco de dados permaneça íntegro.
Caso haja tentativa de alteração de chave primária, a função DBERR( ) retorna 321 (tentativa de
alteração de item chave), exceto quando utilizado com as opções CASCADE, KEYINFO ou
SETNULL. Do contrário para alterar uma chave primária, deve-se incluir um novo registro com o valor
da nova chave e excluir o registro com o valor antigo.
Quando utilizado com a opção CASCADE, a modificação é feita da seguinte forma: é alterado o valor
da chave primária no registro corrente e logo após são alterados os valores das chaves estrangeiras
subordinadas ao registro corrente. Esta opção representa uma alteração em cadeia hierárquica.
Quando utilizado com a opção KEYINFO, a modificação é feita dependendo da informação definida
no esquema do banco de dados. Para cada opção de atualização o comando MODIFY agirá de maneira
particular.
Quando utilizado com a opção KEYINFO, a modificação da chave primária do registro corrente é feita
dependendo da informação definida para as chaves estrangeiras do registro corrente. Para cada opção
de deleção o comando MODIFY agirá de uma maneira particular.
Opção C (cascata) : Obriga a modificação do valor das chaves estrangeira dos registros subordinados
ao registro lido no arquivo selecionado.
Opção S (nulo) : Obriga a colocação de nulo no valor da chave estrangeira. Neste caso a chave
estrangeira deve obrigatoriamente ser do tipo nulo.
Opção R (restrito) : Obriga a não modificação do valor da chave estrangeira.
Quando utilizado com a opção SETNULL, as chaves estrangeiras dos registros, subordinados ao
registro corrente, são modificadas para nulo e o registro corrente é alterado.
Isto só e possível se a chave estrangeira for do tipo nulo. Caso contrário, não será possível a
modificação do registro, retornando um código de erro diferente de zero pela função DBERR( ).
O comando MODIFY, por DEFAULT, não permite a alteração do valor da chave primária, retornando
um valor diferente de zero pela função DBERR( ), garantindo a integridade referencial.
3.62.5
Exemplo
O exemplo a seguir mostra-nos como alterar itens chave de um arquivo do banco de dados. Caso ocorra
alguma inconsistência no valor das chaves a função DBERR( ) retornará um código diferente de 0
(zero).
* O banco de dados bdemp1 deve existir
DATABASE bdemp1 33 a 2
&& Abertura do banco de dados bdemp1
USE tab_nfis
&& Arquivo do banco de dados ( ou tabela)
LOCATE
REPLACE cli_nfis WITH 123, ven_nfis WITH 321, tot_nfis with 10.45
MODIFY
? DBERR( )
O exemplo a seguir tenta alterar o valor de uma chave primária.
DATABASE bdemp1 33 a 2
USE tab_nfis
LOCATE
REPLACE id0_nfis WITH 456
MODIFY
? DBERR( )
O exemplo a seguir mostra-nos como garantir que o registro não foi alterado por outro usuário entre a
leitura e a gravação.
DATABASE bdemp1 33 a 2
USE tab_nfis
LOCATE
REPLACE cli_nfis WITH 123, ven_nfis WITH 321, tot_nfis WITH 10.45
* MODIFY SAME verifica antes de gravar se o valor atual
* do registro e o mesmo da leitura
MODIFY SAME
? DBERR()
3.62.6
Consulte
CHANGE, REPLACE, RESTORE, SAVE, SELECT, DBERR( ), EOF( ), FGMODIFY( ), FMODIFY(
) e RECNO( ).
3.63 PARAMETERS
3.63.1
Propósito
Declarar os parâmetros que serão recebidos por programas e subrotinas.
3.63.2
Sintaxe
PARAMETERS <nome>[[]][(tipo)][,...]
3.63.3
<nome>
<tipo>
[]
3.63.4
Argumentos
representa o nome do parâmetro formal (parâmetro a ser recebido).
representa o tipo da variável que constitui o parâmetro.
declara que o parâmetro é um vetor.
Utilização
Em programas, procedimentos ou funções que necessitem receber parâmetros.
Em OPUS, parâmetros são passados por referência. Isto quer dizer que é passado o endereço de
memória do parâmetro real e não seu valor.
Com esta característica a linguagem permite alterar os valores dos parâmetros passados, alterando os
valores recebidos pelo comando PARAMETERS.
Para cada parâmetro deve ser declarado o seu tipo. Se isto não ocorrer, a OPUS assume que o
parâmetro é do tipo caractere.
Funções e procedimentos podem receber vetores como parâmetros, bastando indicar com os símbolos
"[]" após o nome do vetor.
3.63.5
Exemplo
O exemplo a seguir mostra-nos uma rotina que efetua a alteração do valor da variável passada como
parâmetro.
numero = 3
cadeia = "teste"
DO proce WITH numero,cadeia
? numero, " " ,cadeia
QUIT
&& Atribuição da variável numero.
&& Atribuição da variável cadeia.
&& Invoca a PROCEDURE proce
PROCEDURE proce
PARAMETERS num(n),cad(c)
? num, " " ,cad, " dentro da PROCEDURE"
++num
cad = "alterei o valor dos parâmetros"
RETURN
&& Declaração da PROCEDURE
&& Declaração dos parâmetros recebidos
&& Fim do programa
O exemplo a seguir mostra-nos como não alterar os valores passados.
Para isso, basta criar variáveis locais que recebam os valores passados.
numero = 3
cadeia = "teste"
DO proce WITH numero,cadeia
numero, " " ,cadeia
QUIT
PROCEDURE proce
PARAMETERS num(n),cad(c)
* Declara variáveis locais para trabalhar com os
* parâmetros
num2 = num
cad2 = cad
? num, " " ,cad, " dentro da PROCEDURE"
++num2
cad2 = "ano alterei o valor dos parâmetros"
RETURN
3.63.6
Consulte
$LIBRARY, $PUBLIC, FUNCTION, PRIVATE, PROCEDURE, PROGRAM, PUBLIC, ASC( ),
CHR( ), STR( ) e VAL( ).
3.64 PRIVATE
3.64.1
Propósito
Declarar variáveis privadas
3.64.2
Sintaxe
PRIVATE <var>[[(<tipo>|<número>)]][,<var>...]
3.64.3
Argumentos
<var>
<tipo>
<número>
3.64.4
representa a variável a ser declarada.
representa o tipo da variável .
representa o tamanho da variável privada do tipo caractere.
Utilização
Na declaração de variáveis privadas que serão utilizadas somente no procedimento em que foram
declaradas.
Para se declarar mais de uma variável basta separá-las
por "," (vírgula).
Para se declarar o tipo da variável, deve-se usar um mnemônico que corresponde ao tipo desejado. Os
tipos válidos são Caractere, Data, Float, Numérico e Lógico, e os mnemônicos são respectivamente a
primeira letra de cada nome do tipo.
Se omitido <tipo>|<número> a linguagem criará a variável como sendo do tipo caractere de tamanho
definido pelo comando $LEN.
Caso o tamanho de uma variável privada seja superior ao DEFAULT, utilizar a opção $LENTMP para
definir o tamanho máximo para variáveis privadas.
3.64.5
Exemplo
O exemplo a seguir declara uma variável privada.
PRIVATE var_cad(13)
3.64.6
Consulte
$PUBLIC, CC DECLE, CC EXTERN, CC PROC, DECLARE, PARAMETERS, PUBLIC, STATIC e
STORE.
3.65 PROCEDURE
3.65.1
Propósito
Definir um procedimento (PROCEDURE).
3.65.2
Sintaxe
[STATIC] PROC[EDURE] [<nome>]
3.65.3
Argumentos
STATIC
mesma fonte.
<nome>
3.65.4
declara uma PROCEDURE que somente será invocada por rotinas descritas na
representa o nome do procedimento.
Utilização
Define que a fonte é de um PROCEDURE do usuário e que será gerado um arquivo-objeto após sua
compilação. Este arquivo-objeto terá o nome definido por <nome> mais a extensão ".o" (".obj" no MSDOS) ou o nome do fonte com a extensão ".o" no lugar de ".f", quando <nome> não for definido.
Utilizam-se procedimentos estáticos para limitar a visibilidade do nome da função, restringindo o
acesso a esta, e permitindo que o sistema seja composto de subsistemas específicos, sem a necessidade
de batizar cada procedimento com um nome diferente do outro.
3.65.5
Exemplo
O exemplo a seguir mostra-nos o conteúdo do arquivo-fonte, cujo nome é "proc1.f". O arquivo objeto
quando gerado terá o nome "proc1.o" .
PROC
? "PROCEDURE proc1"
RETURN
3.65.6
Consulte
$LIBRARY, DO, EXTERNAL, FUNCTION, PARAMETERS, PRIVATE, PROGRAM, RETURN,
SET KEY, STATIC e &S( ).
3.66 PROGRAM
3.66.1
Propósito
Definir um programa executável.
3.66.2
Sintaxe
PROG[RAM] [<nome>]
3.66.3
Argumentos
<nome> representa o nome do programa executável.
3.66.4
Utilização
Define que a fonte é de um programa executável com nome igual a <nome> ou o nome da fonte sem a
extensão ".f".
No MS-DOS terá a extensão ".exe" .
3.66.5
Exemplo
O exemplo a seguir mostra-nos o arquivo-fonte "prog1.f". Quando compilado o arquivo executável terá
o nome "prog1" ("prog1.exe" no MS-DOS).
PROGRAM
? "programa prog1"
O exemplo a seguir mostra o arquivo-fonte "prog1.f".Quando compilado o arquivo executável terá o
nome "usuário" ("usuário.exe" no MS-DOS).
PROG usuario
? "programa usuario"
3.66.6
Consulte
$LEN, $LIBRARY, $MULTIPLE, $NOCLEAR, $NODATABASE, $NOEXEC, $NOGET, $NOLIB,
$NOLINK, $NOSCREEN, $PUBLIC, $SCREEN, $SIMBOLS, $SSCREEN, $TMP, FUNCTION,
PARAMETERS, PROCEDURE e RUN.
3.67 PUBLIC
3.67.1
Propósito
Declarar variáveis públicas (globais).
3.67.2
Sintaxe
PUBLIC <var>[(<tipo>|<número>|)]
3.67.3
<var>
<tipo>
<número>
3.67.4
Argumentos
representa a variável a ser declarada.
representa o tipo da variável.
representa o tamanho para variável pública do tipo caractere.
Utilização
Para declaração de variáveis públicas que serão utilizadas em todas as fontes onde forem declaradas.
Para se declarar mais de uma variável basta separá-las
por "," (vírgula).
As variáveis públicas para a OPUS são nomes externos, portanto toda variável pública deve ser
declarada no programa principal, para que esta informação seja passada ao ligador.
Para se declarar o tipo da variável, deve-se usar um mnemônico correspondente ao tipo desejado. Os
tipos válidos são Caractere, Data, Float, Numérico e Lógico, e os mnemônicos são, respectivamente, a
primeira letra de cada nome do tipo.
Se omitido <tipo>|<número> a linguagem criará a variável como sendo do tipo caractere de tamanho
definido pelo comando $LEN.
Em fontes de procedimentos e funções pode-se substituir <número> por "*" (asterisco), declarando-se
que a variável será do tipo caractere de tamanho igual ao definido no programa principal.
3.67.5
Consulte
$LENTMP, $PUBLIC, CC DECL, CC EXTERN, CC PROC, DECLARE, PARAMETERS,
PRIVATE, SET DECIMALS, STATIC, STORE, FTON( ) e NTOF( ).
3.68 QUERY
3.68.1
Propósito
Selecionar registros em um banco de dados.
3.68.2
Sintaxe
QUERY <item> <oper> <exp> ... { geral <exp.C> <exp.L> ... }
3.68.3
Argumentos
<item>
representa o nome de um item de qualquer arquivo do banco de dados em uso.
<oper>
representa qualquer um dos operadores relacionais válidos.
<exp>
representa uma expressão de mesmo tipo de <item>. Pode ser inclusive, um outro
item do banco de dados.
3.68.4
Utilização
Este comando é utilizado para determinar um conjunto de registros para leitura seqüencial. Uma
característica deste comando é a de permitir que a seleção dos registros seja feita a partir de itens de
outros arquivos relacionados ao arquivo corrente.
Ao ser executado, cria um arquivo com o endereço dos registros selecionados, que serão lidos pelos
comandos LOCATE e CONTINUE ou REPORT.
O comando QUERY é incompatível com o comando SORT ON, pois atua sobre o arquivo de dados,
não reconhecendo o arquivo temporário criado pelo comando SORT ON.
3.68.5
Exemplo
O exemplo a seguir mostra-nos como utilizar este comando com os comandos, LOCATE /
CONTINUE.
PROG
DATABASE EXEMPLO 1 a 2
use PESSOA
QUERY GERAL "NOME.P=jose e IDADE=41"
locate
do while found()
? IDADE
continue
enddo
O exemplo a seguir mostra-nos como selecionar registros para exibir relatório com o comando
REPORT.
PROG
DATABASE bdemp1 33 a 2
USE tab_nfis
QUERY id0_clie <> 543 .OR. id0_clie <> 647
REPORT
c1,"Relatorio de Clientes"
d1,"Nome do Cliente"
d2,nom_clie
ENDREPORT
3.68.6
Consulte
CONTINUE, REPORT , FLCONTINUE( ) e FLOCATE( ).
3.69 QUIT
3.69.1
Propósito
Encerrar um programa retornando o controle ao processo chamador.
3.69.2
Sintaxe
QUIT [(<numero>)]
3.69.3
<numero>
3.69.4
Argumentos
status do término do programa.
Utilização
Na sua execução fecha todos os arquivos abertos e o banco de dados utilizado.
Através do comando QUIT é possível retornar um código (para o sistema operacional) que representará
o status de fim do programa.
Se o programa foi invocado por um outro programa escrito em OPUS, esse código pode ser capturado
pela função DBERR(). Sob o sistema operacional UNIX, se um processo escrito em outra linguagem
houver invocado um programa desenvolvido em OPUS, o status do comando QUIT estará armazenado
na variável ambiental $? .
3.69.5
Consulte
EXIT, FUNCTION, PROCEDURE, PROGRAM, RETURN, RUN, SLEEP e DBERR( ).
3.70 READ
3.70.1
Propósito
Iniciar a entrada de dados formatada pelo comando GET.
3.70.2
Sintaxe
READ
3.70.3
Utilização
Executa um modulo de edição criado pelos últimos comandos GETs.
Dentro de um READ o usuário pode editar o conteúdo de cada GET.
As teclas {TAB}, {ESC} e teclas de função, interrompem o READ corrente.
3.70.4
Consulte
$NOGET, $NOSCREEN, @ ... GET, SET KEY, SET PF, SET TAB, INKEY( ) LASTKEY( ).
3.71 REINDX
3.71.1
Propósito
Reindexar um arquivo externo.
3.71.2
Sintaxe
REINDEX
3.71.3
Argumentos
É utilizado para reorganizar o índice de um arquivo externo que está sendo usado. Deve ser utilizado
quando a função BADINDEX( ) retornar verdadeiro (.T.).
3.71.4
Exemplo
PROG
USE *
diary I LEN (60)
phone_num
N10
name
U20
addr
U30
ENDUSE
KEY
IF BADINDEX ( )
? "reorganiza o arquivo diário"
REINDEX
ENDIF
3.72 REPLACE
3.72.1
Propósito
Atribuir valores aos itens de um arquivo.
3.72.2
Sintaxe
REPLACE [<item> [WITH <exp1>[,...<expn>]] | [AUTOMEM]
3.72.3
Argumentos
<item> representa o nome do campo no arquivo que será atualizado.
WITH <exp>
determina que o item será atualizado pelo valor de <exp>.
AUTOMEM
determina que todos os itens em memória serão atualizados com seus valores
correntes.
3.72.4
Utilização
Determina os itens que devem ser atualizados no arquivo selecionado.
Utilizado em conjunto com os comandos INSERT,
MODIFY ,CHANGE ou APPEND.
Quando não se utiliza a cláusula WITH o valor do item no arquivo é atualizado com seu valor corrente
em memória.
A opção AUTOMEM só é aplicada para arquivos de bancos de dados que não possuem itens
redefinidos.
3.72.5
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando REPLACE em um arquivo de banco de dados
para se atualizar somente alguns itens.
USE tab_vend
REPLACE set_vend ,com_vend WITH comissao
CHANGE
O exemplo a seguir mostra-nos como inserir um registro de um arquivo do banco de dados inserindo
somente os itens que foram declarados com seus valores correntes . Se algum item chave não tiver sido
declarado o sistema acusará a ocorrência de um erro.
USE tab_prod
id0_prod = 123 && Retire esta linha e observe o resultado
des_prod = "TERMINAL DE VIDEO"
prc_inip = 1233.88
REPLACE AUTOMEM
INSERT
3.72.6
Consulte
$READALL, APPEND, CHANGE, INSERT, MODIFY, SELECT, STORE, FCHANGE( ), FINSERT(
) e FBINSERT( ).
3.73 REPORT
3.73.1
Propósito
Formatar e exibir relatórios no dispositivo corrente.
3.73.2
Sintaxe
REPORT [NOME=<nome>]
[ <relatorio>
ENDREPORT ]
3.73.3
Argumentos
NOME = <nome>
determina que a definição do relatório encontra-se em um arquivo em disco
de nome igual a <nome>.
<relatorio>
representa um bloco de instruções de definição de relatório.
ENDREPORT
determina o fim da definição de um relatório.
3.73.4
Utilização
Para formatar e imprimir relatórios utilizando uma meta-linguagem de definição de relatórios. Esta
linguagem é composta de diversos elementos que serão explicados a seguir:
Instrução de cabeçalho: Utilizada para imprimir o cabeçalho no topo de cada página. Podem ser
utilizadas até 9 níveis de cabeçalho. Tem a seguinte Sintaxe
C[<nivel>],<mens>,<col>[,ESPACO A|D [<num1>]]
Instrução de detalhe: Utilizada para imprimir mensagens no relatório. Podem ser utilizadas até 19
níveis de detalhe. Tem a seguinte Sintaxe
D[<nivel>],<mens>,<col>[,ESPACO A|D [<num1>]]
[,PULO A|D[,E Z|<num2>]
Instrução de grupo: Utilizada para imprimir mensagens sempre que ocorrer uma quebra de grupo.
Podem ser definidos até 19 níveis de quebra de grupo. Tem a seguinte Sintaxe
G[<nivel>],<mens>,<col>[,ESPACO A|D [<num1>]]
[,PULO A|D[,E Z|<num2>]
Instrução de totalização: Utilizada para imprimir mensagens após as quebras de grupo. Podem ser
utilizadas até 9 níveis de totalização.
Para cada nível, pode ser associada uma instrução de totalização, bastando para isso utilizar o mesmo
número de nível. Este tipo de instrução também é utilizada para exibir estatísticas das quebras ou de
todo o relatório. Tem a seguinte Sintaxe
T[F|<nivel>],<mens>,<col>[,ESPACO A|D [<col>]]]
[,PULO A|D[,E Z|<num2>]
[,SOMA|MEDIA|FREQUENCIA]
Instrução de edição: Utilizada para mascarar a saída das mensagens impressas nas instruções de
detalhe, grupo ou totalização. Podem ser usadas até de 0 a 9 instruções de edição. Tem a seguinte
Sintaxe
E[<nivel>],<mascara>
Instrução de ordenação: Utilizada para ordenar a exibição do relatório. Podem ser definidos de 0 a 9
níveis de ordenação. A ordenação da exibição é feita segundo o seguinte critério: o nível de maior valor
e o item majoritário para ordenação, por isso é a chave principal da ordenação, os itens de níveis
menores são itens de quebra da ordenação. Tem a seguinte Sintaxe
O[<nivel>,<item>[,A|D]
Instrução de função : Utilizada para invocar funções do usuário em um relatório. Podem ser definidos
10 níveis de funções que devem retornar valor numérico ou caractere. Argumentos passados para
funções em um procedimento REPORT, devem, obrigatoriamente, ser itens de arquivos. Caso contrário
ocorrerá erro de execução.
Para executar a função declarada basta se referir ao seu identificador em uma das instruções de
impressão descritas anteriormente. Funções numéricas retornam um número de 21 algarismos,
preenchido de zeros a direita, bastando que seja usada uma instrução de edição.
15!<nivel>,<nome>(<argumentos>),[C|N]
Onde :
<nivel>
Representa o nível da instrução, e utilizado para relacionar as instruções.
<mens>
Representa a informação que será exibida.
Pode ser:
Uma cadeia de caracteres.
Uma das palavras chaves PAGINA, DATA ou HORA, indicando respectivamente: contador
automático de páginas, a data e a hora do sistema.
Um item do banco de dados.
<col>
Representa o número da coluna para impressão da mensagem.
Superposições de colunas, podem causar resultados não esperados.
<nome>
Representa o nome da função do usuário.
<argumentos>
Representa a lista de argumentos passados para a função.
C|N
Representa o tipo da função do usuário. Caso se omita será assumido o tipo
C (caractere).
ESPACO A|D
Determina o número de linhas que serão saltadas antes ou depois da
impressão. As cláusulas A e D, indicam, respectivamente, antes e depois. <num1> determina o número
de linhas saltadas. Caso se omita, somente uma linha é saltada.
PULO A|D
Determina um salto para a próxima página antes ou depois da impressão da
mensagem. As cláusulas A e D indicam respectivamente antes e depois.
E Z<num2>
Determina a máscara de edição para a mensagem. A cláusula Z determina
que serão suprimidos os zeros a esquerda de valores numéricos. <num2> corresponde ao nível da
instrução de edição. Somente uma instrução de edição pode ser usada para cada instrução detalhe.
SOMA
Determina que será impresso o somatório dos valores do item de quebra.
MEDIA
Determina que será impressa a média aritmética do item de quebra.
FREQUENCIA
Determina que será impressa a quantidade de valores dos itens impressos a
cada quebra.
Para as opções SOMA,MEDIA e FREQUENCIA, o valor acumulado é zerado após a impressão. Se
uma instrução de totalização for especificada com a opção F, esta será impressa após a última linha
detalhe do relatório.
O comando REPORT só imprime registros previamente selecionados pelo comando QUERY.
As inconsistências deste comando só são verificadas em tempo de execução, por isso recomenda-se
utilizar um arquivo contendo o procedimento REPORT, para que não seja necessário recompilar o
programa a cada alteração do relatório.
3.73.4.1 Exemplos
O exemplo a seguir mostra-nos como utilizar este comando para imprimir um relatório na impressora
padrão.
PROG
DATABASE bdemp 33 a 2
USE tab_nfis
INPUT "Codigo do cliente " TO cod_cli
SET PRINT ON
QUERY cli_nfis = cod_cli
REPORT
C1,"Relatorio de notas fiscais",1
C2,"PAGINA =",1
C2,PAGINA,10
O1,tot_nfis
D1,"Cod. Nota =",1
D1,id0_nfis,13
D2,"Cliente =",1
D2,nom_clie,11
D3,"Total da nota =",1
D3,tot_nfis,17
TF,"QUANTIDADE DE NOTAS =",1,PULO A
TF,tot_nfis,23,SOMA
T1,HORA,50
ENDREPORT
SET PRINT OFF
O exemplo a seguir mostra-nos a impressão do mesmo relatório do exemplo anterior, a única diferença
é que neste exemplo a definição do relatório encontra-se no arquivo relator.r.
PROG
DATABASE bdemp1 33 a 2
USE tab_nfis
INPUT "Codigo do cliente " TO cod_cli
SET PRINT ON
QUERY cli_nfis = cod_cli
REPORT NOME = "relator.r"
SET PRINT OFF
O exemplo a seguir mostra-nos como utilizar funções do usuário em um procedimento
PROG
func destaca(c),tamnom(n)
DATABASE exemplo 1 A 2
USE DEPE
QUERY mat_fun > 100 .and. nom_depe $= "JOAO"
REPORT
C1,"RELATORIO 01"
!1,destaca(nom_depe),C
!2,tamnom(nom_depe),N
D1,!1
D2,"Tamanho do nome = ",02
D2,!2,20
ENDREPORT
QUIT
FUNC destaca
* Coloca nome em reverso no vídeo
parameters nom(c)
return(rev() + nom + normal())
FUNC tamnom
* Retorna o tamanho do nome
parameters nom(c)
return(len(nom))
3.73.4.2 Consulte
QUERY.
3.74 RESTORE
3.74.1
Propósito
Restaurar a tabela de execução de um arquivo.
3.74.2
Sintaxe
RESTORE [<nome>]
3.74.3
Argumentos
<nome> representa uma variável que receberá o endereço da tabela de execução.
3.74.4
Utilização
Restaura a tabela de execução salva no último comando SAVE.
Útil quando necessário executar mais de um tipo de leitura em um mesmo arquivo de banco de dados
ou quando necessário utilizar o mesmo arquivo em diversas PROCEDUREs sem perder o contexto
(leitura recursiva). Utilizado em conjunto com o comando SAVE.
3.74.5
Consulte
$READALL, FIND, LOCATE, SAVE, SEEK, SELECT, FFIND( ) e FSEEK( ).
3.75 RETURN
3.75.1
Propósito
Terminar uma função do usuário ou uma PROCEDURE.
3.75.2
Sintaxe
RETURN [(<exp>)|TO MASTER]
3.75.3
Argumentos
(<exp>) representa o valor de retorno de uma função do usuário.
TO MASTER
determina que o retorno será para o programa principal (mestre) ou programa
chamador . Essa opção só e utilizada em PROCEDURES.
3.75.4
Utilização
Encerra uma PROCEDURE ou função definida pelo usuário.
No caso de funções um valor deve ser retornado, em PROCEDURES seu uso é opcional exceto em
arquivos de procedimentos, para determinar o fim da declaração de uma PROCEDURE.
O usuário deverá declarar <exp> com tipo compatível ao da função definida.
O comando RETURN ao ser executado devolve o controle ao comando seguinte da chamada da
PROCEDURE ou da função.
3.75.5
Exemplo
O exemplo a seguir mostra-nos o comando RETURN num caso opcional.
PROCEDURE hora
? time()
RETURN
&& Declaração da PROCEDURE
&& Exibe data e hora no dispositivo corrente
&& Opcional
O exemplo a seguir mostra-nos o comando RETURN utilizado em um arquivo de PROCEDUREs e
funções.
PROCEDURE data
@ 01,01 SAY date() REV
RETURN
&& Determina o fim da PROCEDURE data
PROCEDURE hora
@ 01,70 SAY time() BOLD
RETURN
&& Determina o fim da PROCEDURE hora
FUNCTION simnao
@ 23,01 SAY "SIM ou NAO ?? " GET sn PIC "!!!" ;
VALID sn ="SIM" .or. sn = "NAO"
READ
IF sn = "SIM"
RETURN (.T.) && Retorna um valor logico (verdadeiro)
ELSE
RETURN (.F.) && Retorna um valor logico (falso)
ENDIF
3.75.6
Consulte
$LIBRARY, FUNCTION, PARAMETERS, PROCEDURE, PROGRAM e QUIT.
3.76 REVERSE
3.76.1
Propósito
Inverter o sentido da leitura de um arquivo.
3.76.2
Sintaxe
REVERSE
3.76.3
Utilização
Utilizado para inverter o sentido da leitura de um arquivo seja ela seqüencial ou em cadeia.
Após a execução deste comando:
• O próximo registro a ser lido será o último registro.
• O comando CONTINUE comandará leitura dos registros anteriores.
• O comando SKIP efetuará salto de registros, no mesmo sentido da leitura.
Este comando não é utilizado em arquivo externo tipo indexado.
3.76.4
Exemplo
O exemplo a seguir mostra-nos como paginar um arquivo lendo seus registros seqüencialmente de trás
para frente e de frente para trás.
USE tab_func
LOCATE
sentido = "inicio -> fim"
DO WHILE FOUND()
? nom_func
? sentido
WAIT " Muda o sentido ? " TO resp
IF resp $ "sS"
REVERSE && Inverte o sentido da leitura.
CONTINUE
sentido = "fim -> inicio"
ENDIF
CONTINUE
ENDDO
3.76.5
Consulte
CONTINUE, GO,LOCATE,RESTORE, SAVE, SEEK, SKIP, DBERR( ), EOF( ), FCONTINUE( ),
FLCONTINUE( ), FGO( ), FLLOCATE( ), FSEEK( ) e FLSKIP( ).
3.77 RUN
3.77.1
Propósito
Executar um programa ou comando do sistema operacional.
3.77.2
Sintaxe
RUN <exp.C> [WITH <parâmetros>] [FORK]
3.77.3
Argumentos
<exp.C>
WITH <parâmetros>
FORK
3.77.4
representa o nome do programa a ser executado.
representa os parâmetros que serão passados ao programa.
determina que não seja criado um novo SHELL.
Utilização
Executa comandos do sistema operacional, programas executáveis, arquivos de comandos (shells)
,etc....
Deve-se levar em conta a quantidade de processos invocados e a quantidade de memória exigida para
que seja possível executar com sucesso todas as tarefas.
FORK faz com que ao executar o comando RUN não seja criado um novo processo SHELL (sh), isto
economiza memória e agiliza a execução do comando. Esta opção não deve ser utilizada com PIPEs (|)
e somente um parâmetro pode ser passado para o programa.
Ao término de execução de um programa, a função DBERR() pode ser consultada pois faz retornar o
código de erro do programa executado.
3.77.5
Exemplo
O exemplo a seguir mostra-nos como utilizar este comando.
RUN "ls -l" FORK
RUN "cp a b ; cls ; who -a"
RUN "pesquisa" WITH 123 FORK
3.77.6
&& Lista o conteúdo do diretório.
&& Executa os comandos cp, cls e who.
&& Executa o programa pesquisa.
Consulte
$NODUP, $PARASP, PROGRAM, RETURN, QUIT, SET PARASP e DBERR( ).
3.78 SAVE
3.78.1
Propósito
Salvar a tabela de execução de um arquivo.
3.78.2
Sintaxe
SAVE [<var.c>]
3.78.3
Argumentos
<var.c> representa uma variável que receberá o endereço da tabela de execução.
3.78.4
Utilização
Salva a tabela de execução do arquivo selecionado. É utilizado para que seja possível executar-se um
outro tipo de leitura, sem perder o contexto atual do arquivo.
Na tabela de execução encontram-se todas as informações do arquivo, tais como o registro corrente
,endereço do último registro, quantidade de registros em uma cadeia, entre outras informações.
Utilizado em conjunto com o comando RESTORE.
3.78.5
Consulte
$READALL, FIND, LOCATE, RESTORE, SEEK, SELECT, FFIND( ) e FSEEK( ).
3.79 SEEK
3.79.1
Propósito
Executar uma leitura em cadeia de registros por chave secundária.
3.79.2
Sintaxe
SEEK [<chave> = | $=] <exp> [LAST] [SHARED | EXCLUSIVE] [ALL]
...
[REVERSE]
...
[SKIP]
3.79.3
Argumentos
<chave>
nome da chave secundária no arquivo.
<exp>
representa a expressão a ser pesquisada. Quando <chave> estiver presente, <exp>
deve ser do mesmo tipo.
=
determina que a cadeia será formada por todos os registros que tenham valor da
chave igual ao da expressão.
$=
determina que a cadeia será formada por todos os registros que tenham chave tipo
cadeia que se inicie com o valor da expressão.
LAST
determina que a leitura se dará do último registro para o primeiro registro da cadeia
encontrada.
SHARED
determina o bloqueio para leitura compartilhada do registro
EXCLUSIVE
determina o bloqueio para uso exclusivo do registro.
ALL
faz com que todos os itens do registro sejam carregados para memória.
REVERSE
determina a inversão do sentido de leitura da cadeia.
SKIP
lê o próximo registro da cadeia respeitando o sentido da leitura.
3.79.4
Utilização
Uma leitura em cadeia significa que a OPUS criará um arquivo com os endereços de todos os registros
que atendam a expressão.
Um exemplo é a pesquisa de todos os funcionários nascidos em 1964.
É uma pesquisa extremamente rápida e útil, pois é efetuada sobre itens chaves.
Uma pesquisa de prefixo significa que somente os itens chave que tiverem o prefixo igual a expressão
serão armazenados na cadeia.
SHARED determina que o registro seja bloqueado podendo compartilhar somente a leitura do registro.
Utilizada em bloqueio de banco, funciona como EXCLUSIVE.
EXCLUSIVE determina que o registro seja acessado exclusivamente pelo usuário, sem permitir leitura
ou gravação por outro usuário.
A função CHAIN() retorna o número de registros encontrados com valor da chave igual a <exp>
(operador "=").
A função EOF() retorna verdadeiro (.T.) quando a leitura chega ao final da cadeia.
Não são permitidos os operadores ">=" ou "<=" para o comando SEEK.
Para este tipo de pesquisa utilizar o comando LOCATE com a cláusula START.
3.79.5
Exemplo
O exemplo a seguir exibe todos os funcionários inativos.
DATABASE bdemp1 33 a 2
USE tab_depe
SEEK id2_func = 11
? CHAIN()
&& Exibe a quantidade de funcionários inativos.
DO WHILE FOUND()
? nom_func
&& Exibe o nome do funcionário encontrado.
SKIP && Le o próximo registro da cadeia.
ENDDO
3.79.6
Consulte
$READALL, FIND, LOCK, RESTORE, REVERSE, SAVE, SKIP, CHAIN( ), DBERR( ), EOF( ),
FCHAIN( ), FLSEEK( ), FLSKIP( ) e RECNO( ).
3.80 SELECT
3.80.1
Propósito
Determinar a área de trabalho de um arquivo.
3.80.2
Sintaxe
SELECT <area>
3.80.3
Argumentos
<área> é uma letra entre A e Z ou um número entre 1 e 26 inclusive .
3.80.4
Utilização
Quando se deseja selecionar ou atribuir a um arquivo a área declarada.
A linguagem suporta até 26 áreas de trabalho em um programa.
Isto não quer dizer que só seja possível utilizar 26 arquivos por programa, pois quando se utiliza
arquivos de um banco de dados OpenBASE todos os itens dos arquivos com ligações com os arquivos
abertos estão disponíveis para leitura, bastando para isso declarar seus itens.
Todos as áreas de trabalho são criadas em tempo de compilação, isto quer dizer que, após o último
SELECT tudo estará relacionado com a área definida, independendo da lógica do programa.
As áreas de A até Z são as mesmas de 1 até 26.
3.80.5
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando SELECT.
SELECT A
USE tab_func
SELECT B
USE *
arql L LEN (80)
registro u 80
ENDUSE
O exemplo a seguir mostra-nos a maneira errada de se utilizar o comando SELECT.
DATABASE exemplo 1 a 2
SELECT A
USE tab_func
LOCATE
? RECNO()
SELECT B
USE tab_cli
FIND 123
? RECNO()
IF .T.
SELECT a
ELSE
SELECT b
ENDIF
* Mesmo sendo verdadeira a expressao testada, a area selecionada
* será sempre a segunda (SELECT b). Note o numero do registro.
? RECNO()
3.80.6
Consulte
REATORE, SAVE, SELECT e USE.
3.81 SKIP
3.81.1
Propósito
Ler o próximo registro de uma cadeia.
3.81.2
Sintaxe
SKIP [SHARED | EXCLUSIVE]
3.81.3
Argumentos
SHARED
EXCLUSIVE
3.81.4
determina o bloqueio para leitura compartilhada do registro
determina o bloqueio para uso exclusivo do registro.
Utilização
Da continuidade a uma leitura em cadeia iniciado pelo comando SEEK.
Este comando é utilizado em conjunto com o comando SEEK.
SHARED determina que o registro seja bloqueado podendo compartilhar somente a leitura do registro.
Utilizada em bloqueio de banco, funciona como EXCLUSIVE.
EXCLUSIVE determina que o registro seja acessado exclusivamente pelo usuário, sem permitir leitura
ou gravação por outro usuário.
A função EOF() retorna verdadeiro (.T.) quando o comando SKIP atingir o fim da cadeia de registros.
Para inverter o sentido da leitura, utilizar o comando REVERSE.
3.81.5
Consulte
$READALL, RESTORE, REVERSE, SAVE, SEEK, CHAIN( ), DBERR( ) e FSKIP( ).
3.82 SLEEP
3.82.1
Propósito
Executar uma pausa no programa.
3.82.2
Sintaxe
SLEEP <exp.N>
3.82.3
Argumentos
<exp.N>
representa o tempo, em segundos, durante o qual programa ficará aguardando para
dar continuidade à sua execução.
3.82.4
Utilização
Útil no envio de mensagens para o terminal de vídeo.
3.82.5
Exemplo
O exemplo a seguir, mostra-nos a utilização do comando SLEEP para exibir uma mensagem de fim de
programa durante 15 segundos.
IF termina
CLEAR
&& Limpa a tela do terminal de vídeo.
RUN "banner" WITH "acabou o programa"
SLEEP 15
&& Aguarda 15 segundos.
CLEAR
&& Limpa a tela do terminal de vídeo.
ENDIF
QUIT
&& Fim de execução do programa
3.82.6
Consulte
BEEP, DECR, DO WHILE, FOR ... NEXT, INCR, QUIT, RETURN, STORE, WAIT INKEY( ).
3.83 SORT ON
3.83.1
Propósito
Ordenar um arquivo para leitura seqüencial.
3.83.2
Sintaxe
SORT ON <item>[/A|/D|/C] [[SEEK <chav> =|$= <exp>]|[WHILE|FOR <exp.L>]] [ASCENDING |
DESCENDING]
3.83.3
Argumentos
<item>
representa o nome do item do arquivo que servirá como chave de
ordenação para o arquivo.
/A
determina ordenação ascendente para o item (DEFAULT).
/D
determina ordenação descendente para o item.
/C
determina que letras maiúsculas e minúscula terão o mesmo valor
para a ordenação.
SEEK <chav> =|$= <exp>
ordena apenas os registros cuja <chav> corresponda ao valor da
<exp> (os operadores = e $= funcionam de maneira idêntica ao comando SEEK).
WHILE <exp.L>
ordena os registros enquanto estes atenderem a condição <exp.L>.
FOR <exp.L>
ordena todos os registros que atendam a condição <exp.L>.
ASCENDING
determinam que a ordenação será em ordem ascendente
(DEFAULT).
DESCENDING
determinam que a ordenação será em ordem descendente.
3.83.4
Utilização
Quando necessário ordena um arquivo selecionado para um determinado tipo de operação (relatórios,
pesquisas ,etc...).
Se mais de um item for utilizado para ordenação basta separá-los com uma "," (vírgula).
O comando SORT ON ordena o arquivo em um arquivo temporário.
Este comando é utilizado para leituras seqüenciais (LOCATE).
A opção SEEK faz com que um número menor de registros participem da ordenação , agilizando em
muito este processo.
As opções FOR e WHILE são muito úteis quando se deseja que somente um grupo de registros
participem da ordenação.
A cláusula /C pode ser conjugada com as cláusulas /A e /D.
DESCENDING inverte o sentido das ordenações por item (/A e /D).
3.83.5
Exemplo
O exemplo a seguir mostra-nos como ordenar de forma descendente um arquivo.
USE agenda.d
SORT ON numero,nome,ende
LOCATE
DO WHILE FOUND()
? "numero ", numero
? "nome ", nome
? "endereço ", ende
CONTINUE
ENDDO
O exemplo a seguir mostra-nos como ordenar o arquivo anterior, utilizando as cláusulas /A e /D.
Experimente utilizar a opção DESCENDING e note o resultado .
USE agenda.d
SORT ON numero/D,nome/AC,endereco/DC
LOCATE
DO WHILE FOUND()
? "numero ", numero
? "nome ", nome
? "endereço ", ende
CONTINUE
ENDDO
O exemplo a seguir mostra-nos como ordenar apenas os registros que tenham valor da chave cargo =
gerente. Experimente utilizar a opção DESCENDING.
DATABASE exemplo 1 a 2
USE lotacao
SORT ON ano.inicio/D,salario/A,nomefun/AC;
SEEK cargo = "gerente"
LOCATE
DO WHILE FOUND()
? "departamento ", nomedep
? "funcionário ", nomefun
? "salario ", salario
?
CONTINUE
ENDDO
3.83.6
Consulte
$FILES, $OPEN, $TMP, LOCATE, SET PRINT, EOF( ), FLCONTINUE( ).
3.84 START
3.84.1
Propósito
Acessar um registro pelo valor da chave para uma leitura seqüencial
3.84.2
Sintaxe
START <exp>
3.84.3
Argumentos
<exp>
3.84.4
representa uma expressão de tipo igual ao da chave pesquisada.
Utilização
O comando START posiciona o apontador de registros no registro cujo valor da chave seja igual ao
valor de <exp>. Caso não seja encontrado o valor igual, o apontador de registros pára no registro cujo
valor seja imediatamente maior que <exp>.
Este comando é muito utilizado na pesquisa de intervalos, pois inicia uma leitura seqüencial a partir de
um registro, sem a necessidade de pesquisar todo o arquivo para isso.
O comando START não lê o valor dos campos, somente posiciona o apontador, a leitura é efetuada
pelo comando CONTINUE.
O comando START só é utilizado junto com os comandos LOCATE e CONTINUE.
Para selecionar a chave para pesquisa utilizar o comando SET ORDER.
3.84.5
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando START para efetuar uma pesquisa de
intervalos, lendo somente os funcionários nascidos entre 1930 e 1960.
USE tab_func
SET ORDER TO ano_func
LOCATE
&& Inicia a leitura seqüencial
START 1930
&& Posiciona o ponteiro
CONTINUE
&& Efetiva a leitura
DO WHILE FOUND( ) .and. ano_func <= 1960 delimita o intervalo
? nom_func
CONTINUE
ENDDO
3.85 STATIC
3.85.1
Propósito
Declarar variáveis estáticas.
3.85.2
Sintaxe
STATIC <var> [(<tipo>) | (numero) := <exp>]
3.85.3
Argumentos
<var>
(<tipo>)
(<numero>)
= <exp>
3.85.4
representa o nome da variável a ser declarada.
representa o tipo da variável.
representa o tamanho para variável estática do tipo caractere.
representa o valor inicial para variável e o tipo da variável.
Utilização
Se omitido <tipo>|<numero> a linguagem criará a variável como sendo do tipo caractere, de tamanho
definido pelo comando $LEN.
Variáveis do tipo STATIC são variáveis privadas que mantém seu valor durante todo o programa e não
somente enquanto durar o procedimento onde foram declaradas (recursividade).
Para se declarar mais de uma variável basta separá-las por vírgula.
São muito úteis em funções ou procedimentos onde se necessite de um contador eficiente.
Para se declarar o tipo da variável, deve-se usar um mnemônico que corresponda ao tipo desejado. Os
tipos válidos são Caractere, Data, Float, Numérico e Lógico, e os mnemônicos são respectivamente a
primeira letra de cada nome do tipo.
Pode-se declarar o tipo da variável ou um valor inicial que corresponderá ao seu tipo . No caso de não
se declarar um valor inicial, as variáveis são inicializadas com um valor nulo dependendo do seu tipo:
• Variáveis numéricas e floats são inicializadas com 0.
• Variáveis lógicas são inicializadas com falso (.F.)
• Variáveis cadeia são inicializadas com "" (vazio).
Se omitido o tipo ,o tamanho ou o valor inicial, a linguagem criará a variável como sendo caractere de
tamanho definido pelo comando $LEN.
3.85.5
Consulte
$LENTMP, $PUBLIC, CC DECL, CC EXTERN, CC PROC, DECLARE, PARAMETERS,
PRIVATE, PUBLIC, SET DECIMALS, STORE, FTON( ) e NTOF( ).
3.86 STORE
3.86.1
Propósito
Declarar variáveis locais e/ou atribuir valores a qualquer variável.
3.86.2
Sintaxe
STORE <exp> TO <var1> [,[<varn>...] <var1>[,<varn>...] = <exp>
3.86.3
Argumentos
<exp>
<var>
3.86.4
representa a expressão a ser atribuída a uma ou mais variáveis.
é a variável que receberá o valor de <exp>.
Utilização
Declara variáveis locais e/ou atribuir valores a variáveis de qualquer tipo ou a elementos de vetores
pré-declarados.
Mais de uma variável pode ser especificada bastando separá-las por uma "," (vírgula) .
Se a variável não existir, esta será declarada com o valor e o tipo da expressão, caso contrário ela
receberá apenas o valor da expressão que deve ser de mesmo tipo.
3.86.5
Exemplo
O exemplo a seguir mostra-nos a declaração de duas variáveis lógicas e duas variáveis numéricas.
STORE .T. TO varlog1, varlog2
varnum1, varnum2 = 123
O exemplo a seguir mostra-nos, na mesma instrução, a atribuição de valores a um elemento de vetor e a
declaração de uma variável.
DECLARE vet[12]= NTOF(0)
STORE NTOF(36.8) TO varflo, vet[5]
3.86.6
Consulte
$DATE, $FLOAT, $LEN, $LENTMP, @ ... GET, ACCEPT, DECLARE, INPUT, PRIVATE
PUBLIC, SET DECIMALS e SPACE( ).
3.87 TEXT
3.87.1
Propósito
Apresentar um texto.
3.87.2
Sintaxe
TEXT
<texto>
ENDTEXT
3.87.3
Argumentos
<texto> é o texto que será exibido.
3.87.4
Utilização
Quando se deseja apresentar um texto formatado na tela ou na impressora . Todo texto que estiver
compreendido entre TEXT e ENDTEXT será exibido como uma grande cadeia de caracteres.
3.87.5
Exemplo
O exemplo a seguir mostra-nos a exibição de parte de um documento. Note que os comandos FIND ,
LOCATE e SEEK não serão executados.
TEXT.
Esta e uma linguagem de programação desenvolvida para acessar arquivos convencionais e
arquivos de um banco de dados (OpenBASE).
Existem particularidades na linguagem mesmo que sua sintaxe seja parecida com as sintaxes
do Clipper ou Dbase.
A linguagem possui comandos como FIND, LOCATE e SEEK (dentre outros) que quando
codificados, demonstram uso peculiar característico desta linguagem.
Etc ...
ENDTEXT
3.87.6
Consulte
$SCREEN, ?, ??, @ ... BOX, @ ... SAY, @ ... TO, SET ATRIBUTE, SET GRAPHIC e SET REAL.
3.88 UNDO
3.88.1
Propósito
Desfazer as últimas atualizações de um banco de dados.
3.88.2
Sintaxe
UNDO
3.88.3
Utilização
Quando em uma transação for necessário desfazer as atualizações já efetuadas.
Para utilizar este recurso, no banco de dados a opção ARQRECUP, deve estar presente.
Este comando é utilizado em conjunto com os comando LOCK e UNLOCK.
3.88.4
Exemplo
O exemplo a seguir mostra-nos como desfazer as transações caso ocorra algum erro numa das
operações.
LOCK && Bloqueia o banco de dados.
IF DBERR() # 0
erro = .T.
ELSE
SELECT c
REPLACE AUTOMEM
INSERT
IF DBERR() # 0
erro = .T.
ENDIF
ENDIF
IF erro
UNDO
&& Desfaz as atualizações anteriores.
ENDIF
UNLOCK
3.88.5
Consulte
$FILES, FIND, LOCK, SEEK, SET LOCKLOOP, SET MESSAGE, UNLOCK DBERR( ).
3.89 UNLOCK
3.89.1
Propósito
Desfazer todos os bloqueios de dados existentes.
3.89.2
Sintaxe
UNLOCK
3.89.3
Utilização
Determina o fim de uma transação, desbloqueando o banco de dados ou todos os bloqueios de dados
pendentes, liberando assim a tabela de bloqueio do processo.
Este comando é utilizado em conjunto com o comando LOCK.
3.89.4
Exemplo
O exemplo a seguir mostra-nos uma utilização do comando UNLOCK
LOCK && Bloqueia o banco de dados.
IF DBERR() # 0
erro = .T.
ELSE
SELECT c
REPLACE AUTOMEM
INSERT
IF DBERR() # 0
erro = .T.
ENDIF
ENDIF
IF erro
UNDO
ENDIF
UNLOCK
&& Desbloqueia o banco de dados.
3.89.5
Consulte
$FILES, FIND, LOCK, SEEK, SET LOCKLOOP, SET MESSAGE, LOCK e DBERR( ).
3.90 UNLOCK EMPTY
3.90.1
Propósito
Esvaziar o arquivo de recuperação após a execução do comando UNLOCK.
3.90.2
Sintaxe
UNLOCK [EMPTY]
3.90.3
Utilização
Opção EMPTY para o comando UNLOCK. Útil em programas que efetuam transações muito extensas,
criando assim arquivos de recuperação enormes. Após se desbloquear o banco de dados, o arquivo de
recuperação permanecia com o tamanho da última transação ocupando espaço desnecessariamente,
com esta opção o arquivo é esvaziado após o desbloqueio do banco.
3.90.4
Consulte
$FILES, FIND, LOCK, SEEK, SET LOCKLOOP, SET MESSAGE, LOCK e DBERR( ).
3.91 USE
3.91.1
Propósito
Abrir um arquivo.
3.91.2
Sintaxe
USE <arq.ban>
USE <microesquema>
USE *
<microesquema>
ENDUSE
USE <biblioteca> (<membro>)
3.91.3
Argumentos
representa o nome de um arquivo do banco de dados aberto pelo último
<arq.ban>
comando DATABASE.
representa o nome de um arquivo no diretório corrente onde foi feita a
<microesquema>
descrição de um arquivo externo.
determina que a descrição do micro-esquema será feita na própria fonte.
USE * ... ENDUSE
ENDUSE termina a descrição do arquivo.
<biblioteca>
representa o nome de um arquivo no diretório corrente, onde foram feitas
várias definições de arquivos externos.
representa o nome do micro-esquema definido dentro de uma biblioteca.
<membro>
3.91.4
Utilização
Abre um arquivo, seja ele de que tipo for e o deixa disponível para uso, até que um outro arquivo seja
aberto ou selecionado.
O comando USE é um comando muito utilizado na linguagem.
Embora tenha uma sintaxe parecida para todos os casos funciona de forma distinta para arquivos do
banco de dados e para arquivos externos. Para se abrir um arquivo externo existem várias formas de
utilização uma para cada caso, dependendo da forma como foi definida sua aplicação. Os itens de um
arquivo externo são declarados em memória como variáveis locais, portanto todas as variáveis de um
arquivo externo ficam disponíveis em memória.
Pode-se determinar uma área de trabalho para um arquivo através do comando SELECT.
Em uma mesma fonte podem ser utilizados arquivos de banco de dados e arquivos externos desde que
seus nomes sejam diferentes, pois o comando USE primeiro verifica no dicionário de dados a
existência do arquivo e depois pesquisa o diretório corrente a procura do micro-esquema.
3.91.5
Exemplo
O exemplo a seguir mostra-nos como definir um arquivo externo dentro do código fonte do programa.
SELECT x
USE *
agenda I LEN(112)
telefone
ramal
nome
endereco
aniversario
ENDUSE
&& Inicia a declaração de um arquivo externo.
n14 KEY
u05
u35
u50
u08
&& Termina a declaração
O exemplo a seguir mostra-nos como abrir um arquivo de um banco de dados, determinando uma área
de trabalho para este.
DATABASE bdemp1 33 a 2
SELECT a
USE tab_func
LOCATE
O exemplo a seguir mostra-nos como abrir um arquivo externo, através de micro-esquema definido no
diretório corrente. Observe durante a compilação a declaração dos itens.
SELECT a
USE usuarios.d
LOCATE
O exemplo a seguir mostra-nos como utilizar um arquivo externo que foi declarado dentro de uma
biblioteca de micro-esquemas.
USE bibext.d (agendatel)
LOCATE FOR numero = 05122217455
DO WHILE FOUND( )
? nome
ENDDO
3.91.6
Consulte
$FILES, CLOSE FILE, DATABASE, RESTORE, SAVE, SELECT, AFILES( ) e AJOINS( ).
3.92 WAIT
3.92.1
Sintaxe
WAIT [[<exp.C> [<atrib1>] ] TO <var.C> [<atrib2>]]
3.92.2
Propósito
Aguardar a digitação de um caractere.
3.92.3
<exp.C>
<atrib1>
<var.C>
<atrib2>
3.92.4
Argumentos
expressão cadeia a ser exibida .
representa o tipo de vídeo em que a expressão será exibida.
variável cadeia que receberá o caractere digitado.
representa o tipo de vídeo em que o caractere será exibido.
Utilização
Envia um texto para o terminal e aguarda a digitação de um caractere que será atribuído a variável
cadeia definida.
Caso a variável não tenha sido declarada anteriormente o comando WAIT a declara como uma variável
local tipo cadeia.
Não é obrigatório especificar o texto ou a variável. Isto é útil quando só se deseja uma pausa na
execução do programa.
Este comando imprime a mensagem e/ou pede a digitação do caractere a partir da posição do cursor.
Caso <exp.C> seja especificada o sinal ":" aparecerá logo após a exibição de <exp.C>.
3.92.5
Exemplo
O exemplo a seguir mostra-nos como enviar uma mensagem para o terminal e aguardar a digitação de
um caractere.
WAIT "continua s/n " TO k
IF k # "s"
QUIT
ENDIF
&& Exibe mensagem e aguarda a digitação de uma tecla.
O exemplo a seguir causa uma pausa no programa até que uma tecla seja digitada.
Note que neste caso não foi declarada uma variável.
? " Pressione qualquer tecla para continuar"
WAIT
? " Continuando o programa"
3.92.6
Consulte
MESSAGE, SET ATRIBUTE, SET GRAPHIC, SLEEP, INKEY( ), LASTKEY( ), READKEY( ) e
TRANSFORM( ).
3.93 ZAP
3.93.1
Propósito
Esvaziar todo um arquivo.
3.93.2
Sintaxe
ZAP
3.93.3
Utilização
Esvazia um arquivo selecionado, isto é, remove todos os seus registros liberando área em disco.
O comando ZAP pode ser utilizado tanto em arquivos de banco de dados como em arquivos externos.
Por representar somente uma transação, não é recomendado o uso deste comando para arquivos de
banco de dados OpenBASE, onde foram definidas as opções DIARIO ou ARQRECUP. Sendo assim,
não é possível refazer ou desfazer esta operação.
Estes comandos verificam a integridade referencial. Isto quer dizer que, não será permitido o
esvaziamento de arquivos que possuam ligações.
A função DBERR( ) retorna um valor diferente de zero caso o esvaziamento não tenha obtido sucesso.
3.93.4
Exemplo
O exemplo a seguir mostra-nos como esvaziar o arquivo externo agenda.d .
USE agenda.d && Abre arquivo externo
ZAP && Esvazia arquivo
3.93.5
Consulte
DELETE, LOCK, SELECT e FEMPTY( ).
4.1
4.1.1
&RPDQGRV6(7HVXDVRSo}HV
SET Alarm / SET Bell
Propósito
Ligar ou desligar a emissão de um sinal sonoro durante a digitação.
4.1.2
Sintaxe
SET ALARM on | OFF
SET BELL on | OFF
4.1.3
Utilização
Quando ligado (ON) emite um som estridente nas seguintes circunstâncias:
Na digitação de um caractere na última posição de um GET.
Caso o retorno da condição testada pelo VALID seja falso (.F.).
4.1.4
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando para provocar um estridor ao chegar o final
do campo de digitação ou quando var_cad estiver vazia.
PROG
SET BELL ON
var_cad = ""
@ 10,10 SAY "Digite seu nome " GET var_cad PIC REP("!",10); VALID .NOT. EMPTY(var_cad)
READ
4.1.5
Consulte
@ ... GET, BEEP, SET CONFIRM, SET CURSOR e CHR( ).
4.2
4.2.1
SET Align
Propósito
Alinhar números inteiros em máscaras com decimais.
4.2.2
Sintaxe
SET ALIGN ON | off
4.2.3
Utilização
Para que números inteiros, ao serem formatados, não sejam alinhados como decimais e sim como
inteiros.
4.2.4
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando. Compare os resultados dos três primeiros
comandos com o resultado dos três últimos.
PROG
var_num = 123456
@ 00,01 SAY TRANSFORM ("99999,99",var_num)
@ 01,01 SAY var_num USING "99999,99"
@ 02,01 GET var_num PIC "99999,99"
read
SET ALIGN OFF
var_num = 123456
@ 03,01 SAY TRANSFORM ("99999,99",var_num)
@ 05,01 SAY var_num USING "99999,99"
@ 06,01 GET var_num PIC "99999,99"
read
4.2.5
Consulte
@ ... GET, @ ... SAY, SET DECIMALS, SET DEVICE, SET POINT, STORE, CHEXME( ) e
TRANSFORM( ).
4.3
4.3.1
SET Attribute
Propósito
Determinar o atributo de vídeo para a saída dos dados no terminal.
4.3.2
Sintaxe
SET ATTRIBUTE TO <atrib>
4.3.3
Argumentos
<atrib>
4.3.4
representa o atributo de vídeo.
Utilização
Para mudar o tipo de vídeo em que serão exibidos os caracteres para o terminal.
Não deve ser usado com o comando SET PRINT ON.
4.3.5
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando para a impressão, em vídeo reverso, de tudo
que for enviado para a tela.
PROG
num = 0
SET ATRIBUTE TO REV
? " VIDEO REVERSO "
? " VIDEO REVERSO PISCANTE " BLINK
@ 10,10 SAY "Entre com um numero " UNDER GETnum PIC "9"; BOLD VALID num > 3 MESSAGE
"Numero Invalido";
REV
READ
? num NORMAL
4.3.6
Consulte
?, ??, @ ... BOX, @ ... GET, @ ... SAY, ACCEPT, INPUT e SET GRAPHIC.
4.4
4.4.1
SET Break
Propósito
Determinar o cancelamento ou não do programa pela tecla de interrupção ou alterar o DEFAULT
desta.
4.4.2
Sintaxe
SET BREAK ON | off
SET BREAK TO <exp.C>
4.4.3
Argumentos
<exp.C>
4.4.4
representa a tecla de interrupção para o programa.
Utilização
Quando desligada (OFF), é útil para que não se interrompa o programa indevidamente em
procedimentos importantes. Não desativa a tecla de interrupção, apenas inibe sua utilização, bastando
ligar a opção (ON) para ativá-la.
Quando SET BREAK TO <exp.C> é executado, ativa-se a opção SET BREAK ON.
Caso <exp.C> seja composta de mais de um caractere, somente o primeiro é considerado.
4.4.5
Exemplo
O exemplo a seguir determina que o programa seja cancelado quando {CTRL+C} for digitado.
PROG
SET BREAK OFF
SET BREAK TO CHR(3)
DO WHILE .T.
? "Para terminar pressione {CTRL+C}"
ENDDO
4.4.6
Consulte
FUNCTION, PROCEDURE, PROGRAM, SET CANCEL, SET KEY, QUIT e INKEY( ).
4.5
4.5.1
SET Cancel
Propósito
Cancelar ou não o programa após um erro de execução.
4.5.2
Sintaxe
SET CANCEL on | OFF
4.5.3
Utilização
Útil no desenvolvimento de sistemas, para que nenhum problema de programação passe despercebido.
4.5.4
Exemplo
O exemplo a seguir cancelará o programa após o comando @ ... TO .
PROG SET CANCEL ON
@ 01,01 TO 04,50
SET CANCEL ON
TEXT
CONSULTE
FUNCTION, PROCEDURE, PROGRAM e SET BREAK.
4.6
4.6.1
SET Century
Propósito
Para que as variáveis tipo data sejam impressas/solicitadas no formato DD/MM/AAAA
4.6.2
Sintaxe
SET CENTURY [on|OFF]
4.6.3
Argumento
ON
Liga esta opção.
OFF
Desliga, retornando ao modo original.
4.6.4
Utilização
Utilizar datas no formato "dd/mm/aaaa".
Quando este comando estiver ligado (SET CENTURY ON) a máscara "@D" terá o seguinte formato
"99/99/9999", itens D2 quando lidos para memória terão o ano acrescido de 1900.
O programa acusará erro 22 quando estiver fora do século XX durante um REPLACE em um item D2.
4.7
4.7.1
SET CenturyWindow
Propósito
Estabelecer mais uma forma de contornar os problemas do ano 2000.
4.7.2
Sintaxe
SET CenturyWindow to <num>
Onde <num> especifica o ano de dois dígitos.
4.7.3
Utilização
O comando Set Century Window permite especificar um número limite, abaixo do qual, todos os anos
informados no formato de dois dígitos são interpretados como integrantes do século 21, ou seja, será
somado sempre o valor 2000 ao número de anop expresso em dois dígitos. Sendo assim, os valores
menor/igual a <num>, o ano passa a ser considerado como "20<num>". Para valores acima de <num>,
o ano passa a ser admitido como "19<num>".
4.7.4
Exemplo
Set CenturyWindow to 20.
Para anos menores ou iguais a 20, por exemplo 19, o ano é considerado dentro da "janela" do século
21, ou seja: 2019.
Para anos maiores do que 20, por exemplo 21, o ano é considerado dentro da "janela" do século 20, ou
seja: 1921.
4.8
4.8.1
SET Clear
Propósito
Limpar ou não o conteúdo das variáveis associadas aos GETs pendentes.
4.8.2
Sintaxe
SET CLEAR on | OFF
4.8.3
Utilização
Quando ligada (ON), inicializa as variáveis dos GETs subseqüentes, evitando assim, a necessidade de
inicializar as variáveis a cada conjunto de GETs.
4.8.4
Exemplo
O exemplo a seguir mostra-nos como utilizar este comando.
PROG
SET CLEAR ON
vogais = "AEIOU"
@ 10,10 GET vogais PIC "xxxxx"
read
? vogais
4.8.5
Consulte
@ ... GET, READ, SET KEY, SET UPDATE e STORE.
4.9
4.9.1
SET Color
Propósito
Definir cores para exibição em monitores ANSI.
4.9.2
Sintaxe
SET COLOR TO [<exp.C>]
4.9.3
Argumentos
<exp.C>
4.9.4
representa a definição das cores.
Utilização
Permite a alteração das cores para a exibição de telas em monitores coloridos ou a alteração da
tonalidade para monitores monocromáticos. O argumento <exp.C> representa uma expressão do tipo
caractere com a definição dos pares de cores para fundo e frente dos caracteres exibidos no vídeo. O
formato desta expressão é o seguinte: "normal, intensificado, moldura, fundo, não selecionado".
normal: Representa um par de cores para frente e fundo dos caracteres exibidos pelos comandos "
@...SAY e ?.
intensificado: Representa um par de cores para frente e fundo para exibição em modo realçado nos
comandos GET e PROMPT.
moldura: Não utilizada.
fundo: Não utilizada.
não selecionado: Representa um par de cores para frente e fundo dos caracteres exibidos em GETs não
selecionados.
Frente e fundo dizem respeito, respectivamente, ao caractere propriamente dito e a tela sobre a qual
este é exibido.
Cada par é separado por uma barra (frente/fundo).
Cada cor é identificada por um código ou um número descritos a seguir:
COR
NÚMERO
CÓDIGO
PRETO
0
N
AZUL
1
B
VERDE
2
G
CIANO
3
BG
VERMELHO
4
R
MAGENTA
5
RB
MARROM
6
GR
BRANCO
7
W
CINZA
N+
AMARELO
GR+
AUSENTE
X
SUBLINHADO
U
INVERSO
I
Podem ser utilizadas as funções BLINK( ), BOLD( ), REV( ) e NORMAL( ) para alterar as
características das cores ou realçar vídeos monocromáticos.
4.10 SET Conf To
4.10.1
Propósito
Determinar o texto que será exibido pela função CONF( ).
4.10.2
Sintaxe
SET CONF TO <exp.C>
4.10.3
Argumentos
<exp.C>
4.10.4
representa a mensagem exibida pela função CONF( ).
Utilização
Altera a mensagem enviada pela função lógica CONF( ).
<exp.C> deve ter no máximo 40 caracteres, sendo truncada se ultrapassar este limite.
Por DEFAULT a função CONF( ) ao ser executada, exibe a seguinte mensagem "confirma?".
4.10.5
Exemplo
PROG
? CONF( )
SET CONF TO "Continua Sim ou Nao ??"
? CONF( )
4.10.6
Consulte
CLEAR MESSAGE, MESSAGE, SET MESSAGE e CONF( ).
4.11 SET Confirm
4.11.1
Propósito
Obrigar ou não a digitação da tecla {RETURN} para confirmar um GET.
4.11.2
Sintaxe
SET CONFIRM on | OFF
4.11.3
Utilização
Quando ligada (ON), obriga que ao final de um GET seja digitada a tecla {RETURN}.
Útil para evitar que dados não válidos sejam aceitos por um erro de digitação, obrigando o usuário do
programa a confirmar o dado.
4.11.4
Exemplo
O exemplo a seguir mostra-nos dois comandos GETs; no primeiro qualquer caractere é aceito após a
digitação. No segundo só é aceito depois de se digitar {RETURN}.
PROG
var = ""
@ 10,10 GET var pic "X"
READ
SET CONFIRM ON
@ 11,10 GET var pic "X"
READ
4.11.5
Consulte
@ ... GET, SET ALARM, SET DELIMITERS e SET DELIMITERS.
4.12 SET CONNECTION to <host>
4.12.1
Propósito
Conectar de forma remota dois ou mais banco de dados na mesma máquina ou em máquinas
distintas
4.12.2
Sintaxe
SET CONECTION TO <host>
4.12.3
Argumentos
<host> - nome do host relacionado a um endereço IP na tabela de hosts.
4.12.4
Utilização
Esta opção deve ser utilizada sempre que uma aplicação cliente-servidor desejar utilizar mais de um
banco de dados OpenBASE simultaneamente. Esses Bancos de Dados podem ser iguais ou não e
podem estar localizados em diferentes diretórios no mesmo servidor ou em servidores distintos.
Devem-se atribuir diferentes nomes de host ao mesmo endereço IP do servidor com o qual se deseja
conectar. Isto deve ser especificado, normalmente, na tabela de hosts (c:\windows\hosts ou /etc/hosts).
4.12.5
Exemplo
prog
if CONNECT("ts8") = .F. && Estabeleço conexão com máquina ts8
? "ERRO NA CONEXÃO COM ts8"
endif
database /usr1/clientes/exemplo 1 a 2 && Abro banco exemplo na máquina ts8
select a
use pessoa
locate
Do While .not. eof()
? nome
? str(idade)
wait
continue
Enddo
if CONNECT("aix") = .F.
&& Estabeleço coneção com máquina aix
? "ERRO NA COMECAO COM AIX"
endif
database /usr/tsgbd/tsdic/exemplo2 1 a 2 && Abro o banco exemplo2 na máquina aix
select a
use PESSOA
locate
Do While .not. eof()
? NOME1
? str(IDADE1)
wait
continue
Enddo
SET CONNECTION TO "ts8" && Altero coneção para máquina ts8
database /usr1/clientes/exemplo 1 a 2
select a
use pessoa
locate
Do While .not. eof()
? nome_p
? str(idade)
wait
continue
Enddo
4.12.6
Observações
No exemplo acima, as máquinas de nome "aix" e "ts8" possuem o mesmo endereço IP no arquivo hosts
(tabela de hosts).
4.13 SET Cursor
4.13.1
Propósito
Determinar a presença ou não do cursor na tela.
4.13.2
Sintaxe
SET CURSOR ON | off
4.13.3
Utilização
Em procedimentos que desenham telas para que o cursor não seja visto tracejando a tela.
Existem alguns terminais onde o cursor não pode ser desligado.
Recomenda-se consultar o manual do fabricante de seu terminal.
Deve-se tomar cuidado para que o cursor não esteja desligado nos comandos @ ... GET, @ ...
PROMPT, função ACHOICE( ) e outros.
4.13.4
Exemplo
O exemplo a seguir mostra-nos a utilidade deste comando. Note a ausência do cursor durante o desenho
da moldura e no primeiro comando GET.
PROG
SET CURSOR OFF
var = ""
@ 01,01 TO 10,10 DOUBLE
@ 05,05 SAY "Set Cursor OFF" GET var PIC "XXXX"
READ
SET CURSOR ON
@ 06,06 TO 20,20 DOUBLE
@ 08,08 SAY "Set Cursor ON " GET var PIC "XXXX"
READ
4.13.5
Consulte
?, ??, @ ... BOX, @ ... GET, @ ... SAY, @ ... TO, ACCEPT, CLEAR, INPUT, TEXT, WAIT, CONF(
), RESTSCREEN( ), INKEY( ) e SAVESCREEN( ).
4.14 SET CURSORPOS ON I OF
4.14.1
Propósito
Desabilita o posicionamento do cursor.
4.14.2
Sintaxe
SET CURSORPOS ON
4.14.3
I OF
Utilização:
Útil, quando se deseja exibir alguma expressão ou valor, através do comando ?, a partir da posição
corrente do cursor, onde o programa foi executado.
4.14.4
Argumentos
OFF –
Retira o posicionamento do cursor, fazendo com que a posição corrente do cursor
onde o programa foi executado, seja assumida como posição inicial.
ON –
Faz com que o posicionamento do cursor, seja controlado pelo programa (linha,
coluna).
4.14.5
Exemplo
$noclear
prog
xind = 0
set cursorpos off
Do while xind < 200
? xind
sleep (1)
++xind
Enddo
Return
4.15 SET Decimals
4.15.1
Propósito
Determinar o número de casas decimais para variáveis numéricas.
4.15.2
Sintaxe
SET DECIMALS TO <numero> ON <var.N1> [,<var.N2>,...,<var.Nn>]
SET DECIMAL on | OFF
4.15.3
Argumentos
<numero>
<var.N>
4.15.4
representa o número de casas decimais.
representa a variável numérica.
Utilização
Definir o número de casas decimais para variáveis numéricas. Quando mais de uma variável for
declarada estas devem ser separadas por uma "," (vírgula).
Este comando declara as variáveis com valor igual a 0 (ZERO), quando estas não tiverem sido
declaradas anteriormente.
<numero> deve estar entre 1 e 17 inclusive.
SET DECIMALS por DEFAULT está desligado (OFF). Quando estiver ligado(ON) determina a
declaração de casas decimais por atribuição.
4.15.5
Exemplo
O exemplo a seguir mostra-nos a definição de casas decimais para três variáveis numéricas e a
redefinição para uma delas. Verifique o resultado atribuindo os valores as variáveis após o comando
SET DECIMALS.
PROG
num1, num2, num3 = 123
SET DECIMALS TO 2 ON num1, num2
SET DECIMALS TO 5 ON num3
* num1, num2, num3 = 123
&& "descomente" esta linha e note o resultado obtido
? num1
? num2
? num3
SET DECIMALS TO 2 ON num3
? num3
O exemplo a seguir mostra a utilização do comando SET DECIMALS ON|OFF.
PROG
SET DECIMALS ON
num1 = 1.02
&& Mesmo que SET DECIMAL TO 2 ON num1
num2 = num1 && Mesmo que SET DECIMAL TO 2 ON num2
num3 = 123.00000
&& Mesmo que SET DECIMAL TO 5 ON num3
? num1
? num2
? num3
SET DECIMALS TO 2 ON num3
? num3
4.15.6
Consulte
$FOAT, @ ... GET, @ ... SAY, SET ALIGN, SET POINT, STORE e TRANSFORM( )
4.16 SET Delimiters
4.16.1
Propósito
Apresentar ou não delimitadores para os comando GET ou alterar o delimitador corrente.
4.16.2
Sintaxe
SET DELIMITERS ON | off
SET DELIMITERS TO <exp.C>
4.16.3
Argumentos
<exp.C>
4.16.4
representa os novos delimitadores do comado GET.
Utilização
Para que o usuário do programa tenha a noção do tamanho do campo de entrada de dados.
Este comando por DEFAULT apresenta sempre os delimitadores "::" para todo GET executado
(SET DELIMITERS TO "::").
<exp.C> deve ter no máximo dois caracteres, sendo o primeiro o 7 delimitador esquerdo e o segundo o
delimitador direito do campo.
O comando SET DELIMITERS TO <exp.C> ativa a presença de delimitadores mesmo que antes tenha
se definido SET DELIMITERS OFF.
4.16.5
Exemplo
O exemplo a seguir mostra-nos três formas de utilizar o comando SET DELIMITERS. Note que no
terceiro GET aparecerão os delimitadores "{}" pois, SET DELIMITERS TO ativa a presença dos
delimitadores.
PROG
var = ""
@ 10,10 SAY "Set Delimiters ON" GET var PIC "XXXXX"
READ
SET DELIMITERS OFF
@ 11,10 SAY "Set Delimiters OFF" GET var PIC "XXXXX"
READ
SET DELIMITERS TO "{}"
@ 12,10 SAY "Set Delimiters TO {}" GET var PIC "XXXXX"
READ
4.16.6
Consulte
@ ... GET, SET CONFIRM e SET INTENSITY.
4.17 SET Device
4.17.1
Propósito
Trocar o dispositivo de saída: tela ou impressora .
4.17.2
Sintaxe
SET DEVICE TO SCREEN | print
4.17.3
Utilização
Possibilita que durante a impressão de um relatório (SET PRINT ON) seja possível retornar o controle
ao terminal sem cancelar a impressão.
4.17.4
Exemplo
O exemplo a seguir mostra-nos como fazer durante uma impressão, o controle retornar ao terminal,
possibilitando, que o usuário execute qualquer tipo de tarefa até que SET DEVICE TO PRINT seja
executado.
O relatório só será impresso efetivamente após a execução do comando SET PRINT OFF.
PROG
SET PRINT ON
? "Isto será impresso na impressora padrão"
SET DEVICE TO SCREEN
? "Isto serra impresso no vídeo"
ACCEPT "Qual seu equipamento " TO equipa
SET DEVICE TO PRINT
? "Isto serra impresso na impressora padrão"
? "O equipamento informado foi ", equipa
SET PRINT OFF
4.17.5
Consulte
?, ??, @ ... GET, @ ... SAY, ACCEPT, EXECT, SET PRINT, SET PRINTER e INKEY().
4.18 SET Divdec
4.18.1
Propósito
Determinar o número de casas decimais para o resultado de uma divisão.
4.18.2
Sintaxe
SET DIVDEC TO <numero>
4.18.3
Argumentos
<numero>
4.18.4
representa o número de casas decimais.
Exemplo
O exemplo a seguir mostra-nos como utilizar este comando. Note que o resultado é truncado e não
arredondado.
PROG
SET DECIMALS TO 5 ON var_num
? "SET DIVDEC TO 14 (Default)" BOLD
var_num = 1 / 34
?
? "var_num = ", var_num
? "1 / 34 = ", 1 / 34
SET DIVDEC TO 2 ?
? "SET DIVDEC T
O 2" BOLD
var_num = 1 / 34
?
? "var_num = ", var_num
? "1 / 34 = ", 1 / 34
4.18.5
Consulte
SET ALIGN, SET DECIMALS, STORE e TRANSFORM( ).
4.19 SET Edit
4.19.1
Propósito
Possibilitar a edição de campos do tipo cadeia no comando GET.
4.19.2
Sintaxe
SET EDIT on | OFF
4.19.3
Utilização
Para que na edição de variáveis tipo cadeia pelo comando GET, quando {RETURN} for digitado, não
seja truncado o conteúdo anterior.
4.19.4
Exemplo
O exemplo a seguir mostra-nos a edição de uma mesma variável. Na primeira tentativa, o conteúdo da
variável será truncado logo que {RETURN} for digitado. Na segunda tentativa, não será truncado.
PROG
* OBS: digitar apenas AEI nos GET e repare na diferença
* 1o : vogais = AEI
* 2o : vogais = AEIOU
vogais = "AEIOU"
@ 10,10 SAY "Set Edit OFF" GET vogais PIC "XXXXX"
READ
? vogais
SET EDIT ON
@ 11,10 SAY "Set Edit ON" GET vogais PIC "XXXXX"
READ
? vogais
4.19.5
Consulte
@ ... GET, READ, SET ROLL, SET DELIMITERS e SET INTENSIT.
4.20 SET Editkey
4.20.1
Propósito
Permite um melhor posicionamento em um campo "@ ... get".
4.20.2
Sintaxe
SET EDITKEY on | OFF
4.20.3
Utilização
CTRL
CTRL
CTRL
CTRL
END (CNTRL F)
HOME (CNTRL A)
PGUP
PGDOWN
BACKSPACE
O
P
Y
T
U
posiciona palavra a esquerda
posiciona palavra a direita
apaga todo o campo
apaga o restante do campo
restaura valor inicial
posiciona última coluna com caracter do campo
posiciona início do campo
primeiro campo
último campo
apaga caracter a esquerda do cursor.
NOTA: Utilizado somente em campo cadeia com máscara "simples" - sem / ou brancos.
4.20.4
Consulte
@ ... GET, READ, SET ROLL, SET DELIMITERS e SET INTENSIT.
4.21 SET Erase
4.21.1
Propósito
Apagar o interior de uma moldura desenhada pelo comando @ ... TO.
4.21.2
Sintaxe
SET ERASE ON | off
4.21.3
Utilização
Por DEFAULT o comando @ ... TO apaga o interior da moldura que está sendo desenhada .
SET ERASE OFF é útil quando se deseja manter o conteúdo da moldura.
4.21.4
Exemplo
O exemplo a seguir mostra como utilizar este comando. No primeiro comando @ ... TO o interior da
moldura é mantido. No segundo ele é apagado.
PROG
SET ERASE OFF
TEXT
Esta é uma linguagem de programação desenvolvida para acessar um banco de dados OpenBASE e
arquivos convencionais.
Existem particularidades nesta linguagem, mesmo que sua sintaxe seja parecida com CLIPPER ou
DBASE, alguns comandos têm sua peculiaridade. FIND, LOCATE, SEEK etc...
ENDTEXT
@ 01,01 TO 20,78
SET ERASE ON
WAIT "BATA UMA TECLA" TO k
@ 01,10 TO 10,60
? "Limpou o Interior Da Moldura"
4.21.5
Consulte
@ ... TO e @ ... CLEAR.
4.22 SET Errno
4.22.1
Propósito
Omitir a mensagem de erro envolvendo conversões e funções com números.
4.22.2
Sintaxe
SET ERRNO [on | OFF]
4.22.3
Argumentos
ON
Liga esta opção.
OFF
Desliga, retornando ao modo original.
4.22.4
Utilização
Para o caso de SET ERRNO OFF (default).
No caso de erro em funções numéricas retorna-se
DBERR ( ) = 34 (ERANCE) e emite-se as mensagens:
- "Divisão por zero"
- "Resultado grande demais"
- "Soma grande demais"
Se houver erro na conversão de dados retorna-se
DBERR ( ) = 22 (EINVAL) e emite-se as mensagens:
- "Erro na conversão de data"
- "Estouro na conversão numérica"
- "Conversão inválida de negativo"
Se SET ERRNO ON as mensagens não serão emitidas.
4.22.5
Consulte
SET DECIMALS e STORE.
4.23 SET Exact
4.23.1
Propósito
Determinar que na comparação entre expressões cadeia estas devam ser exatamente iguais.
4.23.2
Sintaxe
SET EXACT on | OFF
4.23.3
Utilização
Quando desligado (OFF), a comparação se dá do primeiro até o último caractere da cadeia do lado
direito da comparação, retornando verdadeiro (.T.), se até este ponto as cadeias forem iguais. Se a
cadeia do lado direito, se corresponder com o prefixo da cadeia do lado esquerdo, elas serão tidas como
iguais. Se a expressão a direita da comparação for vazia, o resultado da comparação é verdadeiro (.T.).
4.23.4
Exemplo
O exemplo a seguir mostra-nos a comparação de duas expressões.
PROG
? "AEIOUBC" = "AEIOU"
&& Exibira .T.
SET EXACT ON
? "AEIOUBC" = "AEIOU"
&& Exibira .F.
SET EXACT OFF
? "AEIOUBC" = ""
&& Exibira .T.
4.23.5
Consulte
IF e ALLTRIM( ).
4.24 SET Execloop
4.24.1
Propósito
Indicar o número de re-execução de comandos.
4.24.2
Sintaxe
SET EXECLOOP TO <numero>
4.24.3
Argumentos
<numero>
4.24.4
representa o número de tentativas a executar.
Utilização
Este comando atua na ocorrência de DEADLOCK (erro 605) nos comandos INSERT, DELETE,
CHANGE e MODIFY, executando o comando com problema um número determinado de vezes.
A quantidade de tentativas é determinada pelo argumento <numero>, que deve ser um valor inteiro.
Este comando não tem efeito se utilizado em conjunto com os comandos LOCK e UNLOCK ou em
bloqueio de banco.
A mensagem, após se esgotarem as tentativas definidas, ou na não utilização desse comando, será
"OPUS => operação não realizada (DEADLOCK)".
4.25 SET Ext
PROPÓSITO
Determinar o retorno da função EXT( ) (singular e plural).
4.25.1
Sintaxe
SET EXT TO <cad1> <cad2> <cad3> <cad4> [<cad5>]
4.25.2
Argumentos
<cad1>
<cad2>
<cad3>
<cad4>
<cad5>
4.25.3
representa o valor inteiro no singular.
representa o valor inteiro no plural.
representa o valor decimal no singular.
representa o valor decimal no plural.
representa o complemento do extenso.
Utilização
Para alterar a saída da função de extenso (EXT( )), possibilitando imprimir por extenso diversas
medidas .
4.25.4
Exemplo
O exemplo a seguir mostra a impressão do extenso do valor de var_num em três medidas diferentes.
PROG
SET DECIMALS TO 2 ON var_num
var_num = 10.80
? EXT (var_num,1,80,1)
SET EXT TO "Metro" "Metros" "Centímetro" Centímetros"
? EXT (var_num,1,80,1)
SET EXT TO "Dollar" "Dollars" "Cent" "Cents"
? EXT (var_num,1,80,1)
4.25.5
Consulte
$LENTMP e EXT( ).
4.26 SET Graphic
4.26.1
Propósito
Determina a utilização dos caracteres gráficos segundo a tabela de conversão.
4.26.2
Sintaxe
SET GRAPHIC on | OFF
4.26.3
Utilização
Quando ligada (ON), todos os caracteres enviados ao terminal serão substituídos pelos caracteres
gráficos da tabela da OPUS.
4.26.4
Exemplo
O exemplo a seguir mostra-nos como simular o comando
@ ... TO ... .
PROG
SET GRAPHIC ON
@ 00,00,23,79 BOX "ver tabela "
SET GRAPHIC OFF
4.26.5
Consulte
?, ??, @ ... BOX, @ ... SAY, SET REAL, TEXT e CHR( ).
4.27 SET Hscroll
4.27.1
Propósito
Permitir a rolagem horizontal de um texto em MEMOEDIT.
4.27.2
Sintaxe
SET HSCROLL [on | OFF]
4.27.3
Argumentos
ON Liga esta opção.
OFF Desliga, retornando ao modo original.
4.27.4
Utilização
Permitir o rolamento horizontal do texto exibido pela função MEMOEDIT( ). Isto só ocorre quando o
valor do último parâmetro passado para MEMOEDIT( ) for falso, quer dizer, só exibição sem edição.
4.27.5
Exemplo
PROG
DATABASE t_memo 33 a 2
USE t_mem
PRIVATE var_text (1000)
@ 00,00 TO 11,20
SET HSCROLL ON
FOR i = 1 TO 5
FIND i
a= MEMOGET (teste, var_text)
var_text = MEMOEDIT (var_text, 01, 01,10, 10, .F.)
a=MEMOPUT (teste, var_text)
NEXT
4.28 SET Inialo
4.28.1
Propósito
Aumentar o limite de memória para o programa.
4.28.2
Sintaxe
SET INIALO TO <numero>
4.28.3
Argumentos
<numero>
4.28.4
representa um número inteiro correspondente a área de memória que se deseja
alocar.
Utilização
Para evitar erro de alocação de memória durante a execução do programa. Isto só se faz necessário em
sistemas operacionais que alterem o limite de memória para o processo durante a execução do mesmo.
Este comando quando utilizado deve ser declarado antes do comando DATABASE.
4.28.5
Exemplo
O exemplo a seguir mostra como utilizar este comando.
SET INIALO TO 50000
DATABASE exemplo 1 a 2
4.29 SET Inichoice
4.29.1
Propósito
Posicionar a barra luminosa para a função ACHOICE( ).
4.29.2
Sintaxe
SET INICHOICE TO <exp.N>
4.29.3
Argumentos
<exp.N>
4.29.4
representa a posição inicial da barra luminosa.
Utilização
Possibilita a escolha da opção inicial da barra luminosa em um menu montado pela função ACHOICE(
), a posição inicial da barra continua sendo na primeira linha do ACHOICE, o que move é a opção.
Deve-se levar em consideração que a função ACHOICE( ) retorna à posição da barra decrementada de
um, portanto, para se colocar a barra na nona posição, <numero> deve ser igual a 8 (oito).
4.29.5
Exemplo
O exemplo a seguir mostra-nos o posicionamento da barra na escolha anterior.
PROG
A=0
SET REVERSE ON
DECLARE VET_P1[3] = SPACE (10)
DECLARE VET_P2[3] = SPACE (10)
VET_P1 [1] = "PALAVRA 1"
VET_P1 [2] = "PALAVRA 2"
VET_P1 [3] = "PALAVRA 3"
VET_P2 [1] = "CONDICAO 1"
VET_P2 [2] = "CONDICAO 2"
VET_P2 [3] = "CONDICAO 3"
DO WHILE .T.
a = ACHOICE(10,20,14,31, VET_P1)
IF A = -1
EXIT
ENDIF
DO WHILE .T.
b = ACHOICE(15,20,19,31, VET_P2)
IF b= -1
EXIT
ENDIF
ENDDO
SET INICHOICE TO A
ENDDO
4.30 SET Intensity
4.30.1
Propósito
Determinar que os campos de entrada do comando GET serão exibidos em vídeo reverso.
4.30.2
Sintaxe
SET INTENSITY on | OFF
4.30.3
Utilização
Quando, SET INTENSITY OFF, os GETs são apresentados com o tipo de vídeo determinado no
comando SET ATRIBUTE. Quando ligado (ON) os GETs são apresentados em vídeo reverso.
4.30.4
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando.
PROG
var_num = 0
var_cad = ""
@ 10,10 SAY "Digite um valor Numerico" GET var_num PIC "999,99"
@ 11,10 SAY "Digite um valor caractere" GET var_cad PIC "XXXXXXX"
READ
SET INTENSITY ON
@ 13,10 SAY "Digite um valor Numerico" GET var_num PIC "999,99"
@ 14,10 SAY "Digite um valor caractere" GET var_cad PIC "XXXXXXX"
READ
4.30.5
Consulte
@ ... GET e SET DELIMITERS.
4.31 SET Jump
4.31.1
Propósito
Posicionar a barra luminosa de um menu na primeira ocorrência da letra digitada.
4.31.2
Sintaxe
SET JUMP [on|OFF]
4.31.3
ON
OFF
4.31.4
Argumentos
Liga esta opção
Desliga, retornando ao modo original.
Utilização
Quando ligado (SET JUMP ON), ao se digitar uma letra no teclado, a barra luminosa da função
ACHOICE( ) "salta" para a primeira ocorrência da letra em maiúsculo no menu, permitindo que o
usuário continue pesquisando o que deseja.
Como exemplo da utilização deste comando, podemos colocar um menu formado pelos nomes dos
alunos de um curso. Caso se queira encontrar um aluno chamado "JOÃO" e este comando esteja
desligado (OFF), ao digitar a tecla "J", a função ACHOICE( ) executa a primeira ocorrência desta letra
no menu.
Caso contrário, estando ligado (ON), a barra "salta" para a primeira ocorrência, evitando erro na
escolha do aluno e diminuindo o trabalho de pesquisar todo o menu até a letra "J".
4.32 SET Key
4.32.1
Propósito
Associar uma tecla de função à execução de uma PROCEDURE ou inibir a função da tecla.
4.32.2
Sintaxe
SET KEY <numero> ON | off
SET KEY <numero> TO [<nome>]
4.32.3
Argumentos
<numero>
<nome>
4.32.4
representa o código da tecla de controle.
representa o nome da PROCEDURE que será executada ao se pressionar a
tecla designada.
Utilização
Executa uma PROCEDURE a partir de qualquer estado de espera. A PROCEDURE executada não
pode receber parâmetros. Caso haja necessidade de se passar valores para esta PROCEDURE, os
parâmetros devem ser passados como variáveis públicas. Permite que na PROCEDURE executada
obtenha-se GETs sem atrapalhar os GETs do programa que a executou.
Muito útil na execução de HELPS .
Para se cancelar a definição anterior da tecla basta não se declarar o nome da PROCEDURE.
SET KEY OFF desabilita a tecla sem perder a configuração anterior.
4.32.5
Exemplo
O exemplo a seguir mostra-nos a utilização de uma PROCEDURE para ajudar na digitação de dados.
Note que a PROCEDURE proc_cod ao ser executada, desabilita a tecla que a executa, para evitar
reentrância.
$NOLIB
PROG
SET KEY 28 TO proc_cod
SET CONFIRM ON
&& Associa a tecla F1 a PROCEDURE proc_cod
cod = 0
MESSAGE "Em caso de dúvida pressione F1" BLINK
@ 10,10 SAY "Código do Produto " GET cod PIC "99" ;
VALID cod >=1 .AND. cod <=5
READ
QUIT(0)
PROCEDURE proc_cod
SET KEY 28 OFF
&& desabilita a tecla F1
DECLARE vet_cod[05] = SPACE(30)
vet_cod[01] = "01 - Parafuso 01"
vet_cod[02] = "02 - Parafuso 02"
vet_cod[03] = "03 - Parafuso 03"
vet_cod[04] = "04 - Parafuso 04"
vet_cod[05] = "05 - Parafuso 05"
opt = ACHOICE(01, 01, 07, 31, vet_cod)
@ 01,01 CLEAR TO 07,31
opt = IIF(opt = -1, opt + 2, opt + 1)
KEYBOARD LEFT(vet_cod[opt], 2)
SET KEY 28 ON
&& Habilita a tecla F1
RETURN
4.32.6
Consulte
@ ... GET, ACCEPT, INPUT, KEYBOARD, MENU TO, WAIT e INKEY( ).
4.33 SET Levelerr Off
4.33.1
Propósito
Permitir a alteração de itens com níveis diferentes.
4.33.2
Sintaxe
SET LEVELERR ON | off
4.33.3
Utilização
Se um item tem nível inferior ao permitido, seu valor é ignorado e os demais são alterados não dando o
erro 219 nos comandos INSERT, CHANGE ou MODIFY.
4.33.4
Exemplo
PROG
SET LEVELERR OFF BANCO PU 1
DATABASE PU 1 PROG 2
NIVEIS: 01 PROG
USE COISA
05 GERE
LOCATE
15 SUPER
NOM="ANA"
VALO=100.00 NOME: COISA R
REPLACE NOM, VALO
COD(0) N03
MODIFY
NOM U10
IF DBERR( ) # 0
VALO N8,2 (05,15)
@ 20,10 SAY DBMENS( )
ENIDF
4.33.5
Consulte
DATABASE, MODIFY e DBMENS( ).
4.34 SET Linchoice To
4.34.1
Propósito
Indica para a função achoice a linha inicial a ser destacada para seleção.
4.34.2
Sintaxe
SET LINCHOICE TO [<var>]
4.34.3
<var>
4.34.4
Argumentos
representa a variável que receberá o valor da linha inicial.
Utilização
Possibilita a escolha da opção inicial da barra luminosa em um menu montado pela função ACHOICE(
).
Esta opção funciona em conjunto com o SET INICHOICE TO.
NOTA: Se o comando é dado em uma sub-rotina, a variável deve ser pública.
4.34.5
Exemplo
PROG
A=1
B=1
SET LINCHOICE TO B
DECL VET[3] = SPACE(08)
VET[1] = "INCLUSAO"
VET[2] = "EXCLUSAO"
VET[3] = "CONSULTA"
DO WHILE .T.
SET INICHOICE TO A
A = ACHOICE(10,10,14,20,VET)
IF LASTKEY( ) = 27
EXIT
ENDIF
ENDDO
4.34.6
Consulte
DECLARE, ACHOICE( ) e INCHOICE( )
4.35 SET Lockloop
4.35.1
Propósito
Determinar o número máximo de tentativas de bloqueio de dados após estes já terem sido bloqueados
por outro usuário.
4.35.2
Sintaxe
SET LOCKLOOP TO <numero>
4.35.3
Argumentos
<numero>
4.35.4
representa o número de tentativas de bloqueio.
Utilização
Em programas que utilizem bloqueio de dados, para que estes, ao tentarem bloquear um dado já
bloqueado por outro usuário, executem apenas um determinado número de tentativas de bloqueio.
Depois de cada tentativa de bloqueio, é executada uma pausa de dois segundos até a próxima tentativa
(SLEEP 2).
Este comando evita que o programa fique em DEAD-LOCK.
Quando não for possível o bloqueio, verificar se o processo que o executou ainda está ativo. Caso não
esteja, usar o utilitário BDRECU.
A função DBERR( ) retorna 605 quando exceder o número de tentativas de bloqueio.
4.35.5
Exemplo
O exemplo a seguir mostra-nos um máximo de dez tentativas de bloqueio de dados.
SET LOCKLOOP TO 10
LOCK
MODIFY
IF DBERR( ) # 0
erro = .T.
ELSE
SELECT c
REPLACE AUTOMEM
INSERT
IF DBERR( ) # 0
erro = .T.
ENDIF
ENDIF
IF erro
UNDO
ENDIF
UNLOCK
4.35.6
Consulte
LOCK.
4.36 SET Memotab
4.36.1
Propósito
Definir o tamanho da tabulação para MEMOEDIT.
4.36.2
Sintaxe
SET MEMOTAB TO <numero>
4.36.3
Argumentos
<numero>
4.36.4
representa um número inteiro correspondente a quantidade de brancos de
uma tabulação.
Utilização
Define o tamanho da tabulação para os arquivos editados pela função MEMOEDIT ( ).
Este comando deve ser declarado antes da função MEMOEDIT, para que esta, ao editar o arquivo,
saiba o tamanho da tabulação.
4.36.5
Exemplo
O exemplo a seguir mostra-nos como definir uma tabulação de 8 espaços.
PROG
PRIVATE var_txt(1000)
SET MEMOTAB TO 8
var_txt = MEMOEDIT (var_txt,00,00,10,10,.T.)
4.37 SET Message
4.37.1
Propósito
Determinar a linha para mensagens ou exibir os erros de atualização de um banco de dados.
4.37.2
Sintaxe
SET MESSAGE on [SHORT] | OFF
SET MESSAGE TO <exp.C1> [<atrib>]
SET MESSAGE TO <exp.N1> [,{<exp.N2> | <exp.C2>}] [<atrib>]
4.37.3
Argumentos
SHORT
<exp.C1>
<exp.N1>
<exp.N2>
<exp.C2>
<atrib>
4.37.4
determina que a mensagem será a mesma da função DBMESS( ).
representa uma mensagem que será impressa na linha de mensagem.
representa a linha de mensagem.
representa a coluna para início da impressão da mensagem.
representa o alinhamento da mensagem na linha.
representa o atributo de vídeo.
Utilização
SET MESSAGE ON determina que na ocorrência de algum erro, em operações com banco de dados
OpenBASE, uma mensagem correspondente ao erro seja enviada ao terminal.
SET MESSAGE OFF desliga esta característica. Este comando deve ser declarado depois do comando
DATABASE.
SET MESSAGE TO <exp.C> quando executado envia uma mensagem para a linha de mensagem,
idêntico ao comando MESSAGE.
SET MESSAGE TO <exp.N1> determina a linha onde serão impressas as mensagens. Pode,
opcionalmente, definir uma coluna (<exp.N2>) ou o alinhamento, que pode ser: "C" para centralizar,
"R" alinhar direita ou "L" alinhar a esquerda. Qualquer outro caractere representa alinhamento a
esquerda.
O DEFAULT é SET MESSAGE TO 23,"L".
Se <exp.C2>, tiver mais de um caractere, somente o primeiro é considerado.
4.37.5
Exemplo
O exemplo a seguir mostra-nos como determinar que todas mensagens enviadas para o terminal sejam
impressas e centralizadas na linha 0.
PROG
SET MESSAGE TO 0,"CENTER"
MESSAGE "Mensagem do comando MESSAGE"
WAIT "Bata uma Tecla" TO k
SET MESSAGE TO "Mensagem do comando SET MESSAGE TO <exp.C>" bold
WAIT "Bata uma Tecla" TO k
CLEAR MESSAGE
4.37.6
Consulte
@ ... GET, @ ... PROMPT,CLEAR MESSAGE,DATABASE,MESSAGE, DBERR( ) e DBMESS( ).
4.38 SET Messlen <num>
4.38.1
Propósito
Indica o tamanho máximo da mensagem que um programa cliente, em Opus, utiliza para se comunicar
com o servidor (bdserv).
4.38.2
Sintaxe
SET MESSLEN TO <NUM>
4.38.3
Argumentos
<num>
4.38.4
Tamanho, em bytes, da mensagem a ser enviada pelo programa cliente, na conexão com o
servidor.
Utilização:
Permite que um cliente, envie uma mensagem de tamanho variável, na comunicação com o servidor.
Caso não seja utilizado, o valor default da mensagem é de 1000 bytes. Útil na comunicação de redes
WAN e LAN, onde se utiliza um MTU (Maximum Transfer Unit) de 296 bytes, já que neste caso, o
tamanho máximo da mensagem que um programa cliente em Opus enviaria ao servidor, na abertura do
banco, seria de 296 bytes (Set Messlen to 296), e não 1000 bytes.
4.39 SET Nowait
4.39.1
Propósito
Aguardar ou não a digitação de uma tecla na função
INKEY( ).
4.39.2
Sintaxe
SET NOWAIT on | OFF | TO [<nome>]
4.39.3
Argumentos
<nome>
4.39.4
representa o nome da PROCEDURE que será executada quando o programa
entrar em qualquer estado de espera.
Utilização
Quando ligada (ON), a função INKEY( ) não causará uma pausa na execução do programa.
Ao associar este comando a uma PROCEDURE, o programa executará esta PROCEDURE enquanto o
programa estiver aguardando a entrada de dados via teclado. Para desativar a execução da
PROCEDURE, basta declarar o comando sem declarar uma procedure, da seguinte forma: SET
NOWAIT TO.
4.39.5
Exemplo
O exemplo a seguir mostra-nos a influência deste comando sobre a função INKEY( ).
PROG
SET NOWAIT ON
&& Retire esta linha e verifique o resultado
DO WHILE .T.
a = INKEY( )
IF a = 27
EXIT
ENDIF
? "INKEY sem espera bata {ESC} para parar"
ENDDO
O exemplo a seguir mostra a utilização do comando SET NOWAIT TO <nome>.
PROG
SET NOWAIT TO animacao
nome = ""
@ 10,10 SAY "Entre com seu nome " GET nome PIC "!!!!!!!!!!!!!!"
READ
QUIT
PROC animacao
STATIC coluna(n)
@ 23, coluna say " "
++ coluna
@ 23, coluna SAY "DIGITE SEU NOME" BOLD
RETURN
4.39.6
Consulte
INKEY( ).
4.40 SET Open
4.40.1
Propósito
Verificar ou não os arquivos de um banco de dados na execução do comando DATABASE.
4.40.2
Sintaxe
SET OPEN ON | off
4.40.3
Utilização
Para agilizar o processo de abertura do banco de dados. O comando DATABASE, na sua primeira
execução, ao abrir o banco de dados, verifica todos os arquivos e suas ligações. Quando desligado
(OFF), retira esta característica , agilizando o processo de abertura.
4.40.4
Exemplo
O exemplo a seguir mostra-nos como utilizar este comando.
PROG
SET OPEN OFF
DATABASE bdemp1 33 a 2
4.40.5
Consulte
DATABASE e DBERR( ).
4.41 SET Openerr
4.41.1
Propósito
Não cancelar o programa, na ocorrência de erro, durante a abertura de arquivos externos.
4.41.2
Sintaxe
SET OPENERR on|OFF
4.41.3
Utilização
Quando ligado (ON), permite que arquivos externos sejam utilizados, mesmo que ocorra erro na sua
abertura. Neste caso, a função DBERR( ) retorna um valor diferente de 0 (zero), para que seja possível
a verificação da ocorrência de erro.
4.41.4
Consulte
SET STOPLEN.
4.42 SET Optread
4.42.1
Propósito
Otimiza leitura de arquivos tipo C ou T.
4.42.2
Sintaxe
SET OPTREAD [on|OFF]
4.42.3
Argumento
ON
Liga esta opção.
OFF
Desliga, retornando ao modo original.
4.42.4
Utilização
Este comando atua na otimização de leitura de arquivos tipo C ou T, não lendo os cabeçalhos dos
arquivos todas as vezes em que haja acesso.
Se os arquivos estiverem sendo atualizados ao mesmo tempo o programa não "enxerga" as
atualizações.
4.43 SET Order
4.43.1
Propósito
Determinar a chave de acesso para uma leitura seqüencial.
4.43.2
Sintaxe
SET ORDER TO [<numero> | <nome>]
4.43.3
Argumentos
<numero>
<nome>
4.43.4
representa o número de ordem da chave no arquivo.
representa o nome do item chave do arquivo.
Utilização
Para se determinar a chave de acesso para uma leitura seqüencial em um arquivo do banco de dados.
Caso se omita <numero> ou <nome> a leitura se dará sobre o arquivo de dados e a ordem de leitura
será a mesma da inclusão dos dados.
4.43.5
Exemplo
O exemplo a seguir mostra-nos a utilidade deste comando para o comando START.
PROG
DATABASE bdemp1 33 a 2
USE tab_depe
SET ORDER TO ano_func
LOCATE START 1930 FOR sex_func = "fem"
DO WHILE FOUND( ) .and. ano_func <= 1960
? nom_func
CONTINUE
ENDDO
4.43.6
&& delimita o intervalo
Consulte
CONTINUE, LOCATE, FKEYORDER( ) e FSTART( ).
4.44 SET Out
4.44.1
Propósito
Sair ou não de um conjunto de GETs quando for digitado {SPC} ou {SPB}.
4.44.2
Sintaxe
SET OUT on | OFF
4.44.3
Utilização
Quando ligado (ON), encerra um comando READ, se no primeiro GET for digitado {SPC} ou se no
último GET for digitado {SPB}.
4.44.4
Exemplo
O exemplo a seguir mostra a utilização do comando SET OUT. Experimente mudar o estado do
comando SET OUT para OFF.
PROG
var_nom, var_tel, var_end, var_ani = ""
SET OUT ON
@ 06,10 SAY "UTILIZE AS SETAS"
@ 08,10 SAY "Nome " GET var_nom PIC REP("X",20)
@ 09,10 SAY "Telefone " GET var_tel PIC "(999) 999-9999"
@ 10,10 SAY "Endereço " GET var_end PIC REP("X",30)
@ 11,10 SAY "Aniversario (Dia/Mes)" GET var_ani PIC "99/99"
READ
4.44.5
Consulte
@ ... GET, READ, SET KEY, SET PF, SET ROLL e SET TAB.
4.45 SET Parasp
4.45.1
Propósito
Passar parâmetros através do comando RUN entre aspas.
4.45.2
Sintaxe
SET PARASP on | OFF
4.45.3
Utilização
O caractere branco (" ") é utilizado como separador de parâmetros nos sistemas operacionais.
Quando ligado (ON),determina que os caracteres brancos nos parâmetros não serão interpretados como
separador e sim como parte integrante do parâmetro.
4.45.4
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando para executar o comando "ls" do UNIX.
Verifique o resultado obtido retirando-se o comando SET PARASP ON.
PROG
SET PARASP ON
RUN "ls" with "a b"
O exemplo a seguir mostra-nos a utilização de um recurso que simula o comando SET PARASP ON.
Verifique o resultado obtido retirando-se os colchetes.
PROG
RUN "ls" with ["a b"]
4.45.5
Consulte
$PARASP e RUN.
4.46 SET Pf
4.46.1
Propósito
Desabilitar o cancelamento de um conjunto de GETs ao se pressionar uma PF.
4.46.2
Sintaxe
SET PF on | OFF
4.46.3
Utilização
Para que um conjunto de GETs não seja cancelado quando digitada uma tecla de função.
Quando ligado (ON), habilita o conjunto de GETs somente após satisfazer a condição do VALID.
Quando desligado (OFF), cancela o GET corrente sem satisfazer a condição do VALID.
NOTA: Utilizado apenas em GETs com a cláusula "VALID".
4.46.4
Exemplo
O exemplo a seguir mostra-nos a utilização do comando SET PF.
Experimente mudar o estado do comando SET PF para OFF.
PROG
store " " to var_nom, var_tel, var_end, var_ani
SET CONFIRM ON
SET PF ON
@ 06,10 SAY "UTILIZE AS TECLAS DE FUNCAO" REV
@ 08,10 SAY "Nome " GET var_nom PIC REP("X",20)
@ 09,10 SAY "Telefone " GET var_tel PIC "(999) 999-9999"
@ 10,10 SAY "Sexo " GET var_sex PIC "X"
VALID var_sex = "M" .or. var_sex = "F"
@ 11,10 SAY "Aniversario (Dia/Mes)" GET var_ani PIC "99/99"
READ
4.46.5
Consulte
@ ... GET, READ, SET KEY, SET OUT, SET CONFIRM, SET ROLL e SET TAB.
4.47 SET Phonend On
4.47.1
Propósito
Indica que na rotina PHONETIC, não será eliminado o gênero ( o e a finais) e o número (S e outras
terminações de plural).
4.47.2
Exemplo
? PHONETIC ("MENESES") se exibirá MENE
? PHONETIC ("MENEZES") se exibirá MENEZ
SET PHONEND ON
? PHONETIC ("MENESES") se exibirá MENEZES
? PHONETIC ("MENEZES") se exibirá MENEZES
4.47.3
Consulte
PHONAME( ) PHONETS( ), PHONETIC ( ), PHONOPT E WORD ( ).
4.48 SET Phonets To
4.48.1
Propósito
Define o tamanho da cadeia de dígitos hexadecimais retornados pela rotina PHONETS. O Default é 8.
4.48.2
Sintaxe
SET PHONETS TO <num>
4.48.3
<num>
4.48.4
Argumentos
representa o tamanho da cadeia de dígitos que se deseja retornar, onde 2 <= num <=8.
Exemplo
O exemplo a seguir mostra-nos como definir a cadeia de dígitos para dois Bytes.
PROG
palavra = space (50)
SET PHONETS TO 2
DO WHILE .t.
@ 09,10 SAY "NOME:"GET palavra PIC REP ("!", 50)
READ
IF LASTKEY ( ) = 27
EXIT
ENDIF
@ 10,10 SAY " "
? PHONETS (palavra,1)
ENDDO
4.48.5
Consulte
PHONAME( ), PHONETS( ), PHONETIC, PHONOPT e WORD( ).
4.49 SET Phonopt On
4.49.1
Propósito
Retornar a representação fonética de uma cadeia de caracteres.
4.49.2
Sintaxe
SET PHONOPT on | OFF
4.49.3
Utilização
Difere do PHONETIC apenas em substitui conjunto de letras:
De
Para
Z
C
RES RE
4.49.4
Exemplos
O exemplo a seguir mostra-nos o retorno desta função e uma de suas utilidades.
PROG
? PHONETIC ("Pares") && Exibirá "PARE"
? PHONETIC ("Zebu") && Exibirá "CEBU"
? PHONETIC ("Pares") = PHONETIC ("PARES") && Exibirá .T.
4.49.5
Consulte
PHONAME( ), PHONETS( ), PHONETIC e WORD( ).
4.50 SET Point
4.50.1
Propósito
Permitir na digitação de valores numéricos a aceitação do ponto decimal.
4.50.2
Sintaxe
SET POINT ON | off
4.50.3
Utilização
Quando ligado (ON), permite a digitação da vírgula, alinhando a parte inteira e aguardando a digitação
da parte decimal.
Quando desligado (OFF), não permite a digitação da vírgula, alinhando todo o número a direita logo
que {RETURN} for digitado.
4.50.4
Exemplo
O exemplo a seguir mostra-nos como este comando funciona. Para testar digite para os dois campos
"10,2". Note que no primeiro campo não será possível digitar a vírgula ou ponto.
PROG
num1,num2=0
SET DECIMALS TO 2 ON num1,num2
SET POINT OFF
@ 10,10 SAY "SET POINT OFF " GET num1 PIC 999,99"
READ
SET POINT ON
@ 11,10 SAY "SET POINT ON " GET num2 PIC "999,99"
READ
?
? "SET POINT OFF " , num1, " repare não alinhou" + " decimais"
? "SET POINT ON " , num2, " repare que a parte" +" decimal foi alinhada"
4.50.5
Consulte
@ ... GET, SET ALIGN, SET DECIMALS, SET DIVDEC e TRANSFORM( ).
4.51 SET Print
4.51.1
Propósito
Direcionar a saída dos comandos de impressão para uma impressora.
4.51.2
Sintaxe
SET PRINT on [SLAVE] | OFF
4.51.3
Argumentos
SLAVE
4.51.4
determina que a saída será em impressora escrava do terminal.
Utilização
Para desviar a saída dos comandos ?, ?? e @ ...SAY" para um outro dispositivo que não o seu terminal,
este dispositivo é determinado pelo comando SET PRINTER.
Para utilizar a opção SLAVE é preciso ter uma impressora escrava conectada ao terminal e as variáveis
MC4 e MC5 do TERMINFO para seu terminal devem estar "setadas" com os valores corretos (veja
manual do fabricante do seu terminal e manual do TERMINFO).
4.51.5
Exemplo
O exemplo a seguir mostra-nos como imprimir dez linhas na impressora padrão e no terminal.
PROG
SET PRINT ON
FOR I = 1 to 10
? "I e igual a IMPRESSORA ",i
NEXT
SET PRINT OFF
FOR I = 1 to 10
? "I e igual a TERMINAL ",i
NEXT
4.51.6
Consulte
$NOSCREEN, ?, ??, @ ... SAY, SET DEVICE e SET PRINTER.
4.52 SET Printer
4.52.1
Propósito
Determinar o destino da saída para o comando SET PRINT.
4.52.2
Sintaxe
SET PRINTER TO <exp.C>
4.52.3
Argumentos
<exp.C>
4.52.4
representa o dispositivo de saída.
Utilização
Para determinar qual o dispositivo de saída na ativação do comando SET PRINT .
Dispositivo pode ser um arquivo, um programa, um DEVICE, etc.…
4.52.5
Exemplo
O exemplo a seguir mostra-nos como direcionar a saída para um arq.txt no diretório de trabalho.
PROG
SET PRINTER TO "cat > arq.txt"
SET PRINT ON
FOR I = 1 to 10
? "I e igual a ARQUIVO ",i
NEXT
SET PRINT OFF
4.52.6
Consulte
SET PRINT.
4.53 SET Prompt
4.53.1
Propósito
Determinar o modo de escolha de uma opção em um menu.
4.53.2
Sintaxe
SET PROMPT TO FIRST | UPPER
4.53.3
Argumentos
FIRST
UPPER
4.53.4
determina que a opção será escolhida digitando se a primeira letra.
determina que a opção será escolhida digitando se a primeira letra maiúscula.
Utilização
Determina a escolha de uma opção em um menu de opções criado pelos comandos @ ... PROMPT e
MENU TO, para o primeiro caractere diferente de branco ou para a primeira letra maiúscula no texto
da opção.
Quando SET PROMPT TO FIRST é declarado, a escolha é feita através da digitação do primeiro
caractere diferente de branco (DEFAULT).
Quando SET PROMPT TO UPPER é declarado, a escolha é feita através da primeira letra maiúscula.
Caso não existam letras maiúsculas no texto, funciona como SET PROMPT TO FIRST.
4.53.5
Exemplo
O exemplo a seguir mostra-nos a utilização do comando SET PROMPT TO UPPER indicando que, ao
se digitar uma letra maiúscula, determina-se a opção escolhida. Note o valor de opc.
PROG
opc = 0
SET PROMPT TO UPPER
@ 10,10 PROMPT " Relatório de Clientes "
@ 11,10 PROMPT " Relatório de Fabricantes "
@ 12,10 PROMPT " Relatório de fornecedores "
MENU TO opc
?
? opc REV
4.53.6
Consulte
@ ... PROMPT, MENU TO e MESSAGE.
4.54 SET Real
4.54.1
Propósito
Determina que o comando SET GRAPHIC utilizará os caracteres gráficos do terminal sem convertêlos.
4.54.2
Sintaxe
SET REAL on | OFF
4.54.3
Utilização
Só utilizado quando o comando SET GRAPHIC estiver ligado (ON), para que, na exibição dos
caracteres estes não sejam convertidos por esta linguagem.
Recomenda-se consultar o manual do fabricante do seu terminal.
4.54.4
Consulte
SET GRAPHIC.
4.55 SET Reverse
4.55.1
Propósito
Manter a barra luminosa sobre a opção escolhida em um menu.
4.55.2
Sintaxe
SET REVERSE on | OFF
4.55.3
Utilização
No comando PROMPT e na função ACHOICE ( ), quando ligado (ON), a opção escolhida permanece
em modo reverso. Quando desligado (OFF), a opção escolhida volta ao modo normal.
4.55.4
Exemplo
O exemplo a seguir mostra-nos a utilização deste comando.
PROG
opção = 0
@ 10,10 PROMPT "Opcao 1"
@ 12,10 PROMPT "Opcao 2"
MENU TO opcao
@ 15,10 SAY "Note que a opcao escolhida esta normal"
SET REVERSE ON
@ 10,30 PROMPT "Opcao 3"
@ 12,30 PROMPT "Opcao 4"
MENU TO opcao
@ 12,10 SAY "Note que a opcao escolhida esta" +;
"em reverso"
4.56 SET Roll
4.56.1
Propósito
Permitir ou não o rolamento do cursor em um conjunto de GETs.
4.56.2
Sintaxe
SET ROLL on | OFF
4.56.3
Utilização
Utilizar as teclas {SPC} e {SPB} para passar do primeiro campo para o último e vice-versa, em um
conjunto de GETs.
4.56.4
Exemplo
O exemplo a seguir mostra-nos a utilização do comando SET ROLL.
Experimente mudar o estado do comando SET ROLL para OFF.
PROG
store " " to var_nom, var_tel, var_end, var_ani = ""
SET ROLL ON
@ 06,10 SAY "UTILIZE AS SETAS"
@ 08,10 SAY "Nome " GET var_nom PIC REP("X",20)
@ 09,10 SAY "Telefone " GET var_tel PIC "(999) 999-9999"
@ 10,10 SAY "Endereço " GET var_end
PIC REP("X",30)
@ 11,10 SAY "Aniversario (Dia/Mes)" GET var_ani PIC "99/99"
READ
4.56.5
Consulte
@ ... GET, READ, SET OUT, SET PF e SET TAB.
4.57 SET Scroll
4.57.1
Propósito
Permitir ou não o rolamento das opções da função ACHOICE( )
4.57.2
Sintaxe
SET SCROLL ON | off
4.57.3
Utilização
Quando ligado (ON), permite que na primeira opção, ao se digitar {SPC}, a última opção seja exibida e
as outras deslocadas. Desse modo, impede-se que o usuário perca tempo na tentativa de localizar a
primeira e a última opção. Quando desligado (OFF), não permite este rolamento, fazendo com que as
opções e a barra permaneçam paradas.
4.57.4
Exemplo
O exemplo a seguir mostra-nos a utilidade deste comando. Retire a linha do comando SET SCROLL
OFF ou mude de OFF para ON e note a diferença.
PROG
SET SCROLL OFF
DECLARE vet_cod[05] = SPACE(30)
vet_cod[01] = "01 - Parafuso 01"
vet_cod[02] = "02 - Parafuso 02"
vet_cod[03] = "03 - Parafuso 03"
vet_cod[04] = "04 - Parafuso 04"
vet_cod[05] = "05 - Parafuso 05"
opt = ACHOICE(01, 01, 05, 31, vet_cod)
@ 01,01 CLEAR TO 07,31
opt = IIF(opt = -1, opt + 2, opt + 1)
? LEFT(vet_cod[opt], 2)
4.57.5
Consulte
ACHOICE( ).
4.58 SET Sigint
4.58.1
Propósito
Determinar o cancelamento ou não de programas em BACKGROUND.
4.58.2
Sintaxe
SET SIGINT ON | off
4.58.3
Utilização
Quando desligada (OFF), é útil para que programas que rodam em BACKGROUND não sejam
interrompidos quando o usuário pressionar as teclas de interrupção de programa (SET BREAK).
4.58.4
Consulte
FUNCTION, PROCEDURE, PROGRAM, SET BREAK, SET CANCEL, SET KEY, QUIT e
INKEY().
4.59 SET Signore
4.59.1
Propósito
Anular um valor no arquivo do banco ou externo para variável tipo S, caso esta não tenha sinal "+" ou
"-".
4.59.2
Sintaxe
SET SIGNORE on | OFF
4.59.3
Utilização
Na leitura de item de arquivo do banco ou externo para que não emita a mensagem OPUS(itevars) =>
sinal inválido.
4.60 SET Sigquit
4.60.1
Propósito
Cancelar a ação das teclas de interrupção de programa.
4.60.2
Sintaxe
SET SIGQUIT on|OFF
4.60.3
Utilização
Útil, para que, programas que rodem em BACKGROUND, não sejam interrompidos ao serem
pressionadas as teclas de cancelamento.
4.60.4
Consulte
$NOGET, SET CANCEL e SET KEY.
4.61 SET Sigusr1
4.61.1
Propósito
Detectar o recebimento do sinal SIGUSR1 (kill -16) e executar uma PROCEDURE.
4.61.2
Sintaxe
SET SIGUSR1 TO [<nome>]
4.61.3
Argumentos
<nome>
4.61.4
representa o nome da PROCEDURE que será executada quando o programa
receber sinal 16. Caso se omita o nome da PROCEDURE nada será executado.
Utilização
Permite que um operador (usuário), envie o sinal SIGUSR1 (sinal 16) para que o programa capture e
execute um procedimento apropriado.
O programa onde foi declarado o comando SET SIGUSR1, captura este sinal e executa a
PROCEDURE indicada. Para desabilitar a execução da PROCEDURE deve-se declarar este comando
sem declarar o nome da PROCEDURE.
Este sinal é enviado ao programa pelo comando KILL do UNIX.
4.61.5
Exemplo
O exemplo a seguir mostra-nos como utilizar este comando para interromper um programa de modo
que sejam desfeitas as transações pendentes.
PROG
SET SIGUSR1 TO fecha
* O programa ao receber sinal 16
* executará automaticamente a rotina fecha
...
...
LOCK
...
...
UNLOCK
...
QUIT
PROCEDURE fecha
SET SIGUSR1 TO
&& Desabilita comando SET SIGUSR1
UNDO && Desfaz as transações pendentes
UNLOCK
&& Desbloqueia o banco de dados
QUIT (1)
&& Encerra programa
4.62 SET Siso
4.62.1
Propósito
Ligar shift in / shift out, possibilitando a acentuação de caracteres.
4.62.2
Sintaxe
SET SISO [ON | OFF]
4.62.3
Argumentos
ON Liga esta opção.
OFF Desliga, retornando ao modo original.
4.62.4
Utilização
Quando um programa em OPUS utiliza acentuação o uso deste comando faz-se desnecessário, mas
quando no programa não se usa acentos e o banco de dados contém dados acentuados e pretende-se
exibir estes dados deve-se "ligar" este comando (SET SISO ON) para que os dados acentuados sejam
impressos corretamente.
4.62.5
Exemplo
SET SISO on
palavra = space (50)
DO WHILE .T.
@ 09,10 SAY "NOME1: "GET palavra
READ
if lastkey( ) = 27
EXIT
ENDIF
@ 10,10 SAY ""
4.63 SET Sort
4.63.1
Propósito
Gravar em um arquivo os endereços dos registros ordenados.
4.63.2
Sintaxe
SET SORT TO [<exp.C>]
4.63.3
Argumentos
<exp.C>
4.63.4
Representa um nome de arquivo.
Utilização
Quando se informar , através deste comando, a <exp.C> especificando o nome do arquivo, sempre
que for executado um comando SORT ON os endereços dos registros ordenados serão gravados neste
arquivo. Para se desligar esta característica basta invocar o comando SET SORT TO omitindo a
expressão caractere.
Da mesma forma ocorre no uso do LOCATE, pois sempre que se informar um arquivo em SET SORT
TO, os registros lidos pelo comando LOCATE e pelo comando CONTINUE serão lidos na ordem
especificada por este arquivo.
4.64 SET Sscreen
4.64.1
Propósito
Ligar e desligar a opção $SSCREEN.
4.64.2
Sintaxe
SET SSCREEN ON | OFF
4.64.3
Utilização
Permite programas que utilizam as funções SAVESCREEN( ) e RESTSCREEN( ) possam alterar o
modo de restaurar telas. A utilização deste comando é a mesma das opções $SCREEN e $SSCREEN;
portanto, segue as mesmas regras.
Quando está ligado (ON), a restauração é feita como se fosse declarado no programa principal
$SSCREEN. Quando desligado (OFF), a restauração é feita como se fosse declarado $SCREEN.
Para utilizar este comando é obrigatória a declaração de uma das opções no programa principal
($SCREEN ou $SSCREEN).
Por DEFAULT, quando se declara $SSCREEN, este comando está ligado (ON), caso contrário está
desligado (OFF).
4.64.4
Consulte
$SCREEN e $SSCREEN.
4.65 SET Stoplen
4.65.1
Propósito
Ler arquivos seqüenciais em linha de tamanho maior que o definido no micro-esquema.
4.65.2
Sintaxe
SET STOPLEN on | OFF
4.65.3
Utilização
Quando ligado (ON), permite que arquivos ASCII sejam lidos como arquivos tipo L da OPUS. Ao se
executar uma leitura, os registros são lidos pelo tamanho definido no micro-esquema ou até o primeiro
caracter LF (LINE-FEED).
Um arquivo tipo L (seqüencial em linha), para OPUS, tem registro de tamanho variável, terminando
obrigatoriamente por um caracter "\n".
Na leitura de um arquivo tipo L, quando o finalizador de registros não é encontrado, a OPUS, por
DEFAULT (SET STOPLEN OFF), envia a seguinte mensagem:
OPUS => Registro não termina com \n ou excede tamanho.
4.65.4
Exemplos
O exemplo a seguir mostra-nos a utilização deste comando para ler o arquivo /etc/passwd.
PROG
* Retire a linha seguinte e verifique o resultado.
SET STOPLEN ON
USE *
/etc/passwd l len(10)
reg U10
ENDUSE
LOCATE
DO WHILE FOUND( )
? REG
CONTINUE
ENDDO
4.65.5
Consulte
LOCATE, USE e SET OPENERR.
4.66 SET Strlerr On
4.66.1
Sintaxe
OFF (default)
Se esta opção estiver ligada, as variáveis cadeia, ao serem convertidas para itens tipo U, tem seu
tamanho verificado. Se maiores que o tamanho do item é emitida a mensagem:
OPUS (varite) = estouro em conversão de cadeia para item tipo U.
4.67 SET Tab
4.67.1
Propósito
Desabilitar ou não a tecla {TAB} .
4.67.2
Sintaxe
SET TAB ON | off
4.67.3
Utilização
A tecla {TAB} não é uma tecla de função, portanto não é desativada pelos comandos SET PF e SET
KEY, mas sim pelo comando SET TAB.
Útil para não cancelar um conjunto de GETs quando {TAB} for digitado.
4.67.4
Exemplo
O exemplo a seguir mostra-nos a utilização do comando
SET TAB.
Experimente mudar o estado do comando SET TAB para ON.
PROG
var_nom, var_tel, var_end, var_ani = ""
SET TAB OFF
@ 06,10 SAY "PRESSIONE {TAB}"
@ 08,10 SAY "Nome " GET var_nom PIC REP("X",20)
@ 09,10 SAY "Telefone " GET var_tel ;
PIC "(999) 999-9999"
@ 10,10 SAY "Endereço " GET var_end ;
PIC REP("X",30)
@ 11,10 SAY "Aniversario (Dia/Mes)" GET var_ani ;
PIC "99/99"
READ
4.67.5
Consulte
@ ... GET, READ, SET OUT, SET PF e SET ROLL.
4.68 SET Timeout
4.68.1
Propósito
Indica o tempo (Timeout) que um programa cliente espera pela conexão ao servidor.
4.68.2
Sintaxe
SET TIMEOUT TO <num>.
4.68.3
<num>
4.68.4
Argumento
Representa um número em segundos.
Utilização
Permite o aumento do número default (atualmente 10), para um número maior, quando sua rede estiver
lenta.
4.69 SET Trace
4.69.1
Propósito
Mostrar as linhas do programa que está sendo executado.
4.69.2
Sintaxe
SET TRACE ON| off
4.69.3
Utilização
Para depurar o programa, uma vez que, cada linha do programa que for executada, será impressa na
linha 23 coluna 0 do terminal.
Este comando é útil para corrigir erros de lógica no programa.
SET TRACE ON determina que todas as linhas da fonte serão exibidas até que seja executado SET
TRACE OFF ou até o fim da fonte.
4.69.4
Exemplo
O exemplo a seguir mostra-nos a utilização do comando SET TRACE para apresentar as linhas
compreendidas entre SET TRACE ON e SET TRACE OFF, durante a execução do programa.
$NOLIB
PROG
SET KEY 28 TO proc_cod
&& Associa a tecla F1 a PROCEDURE proc_cod
SET CONFIRM ON
cod = 0
MESSAGE "Em caso de duvida pressione F1" BLINK
@ 10,10 SAY "Codigo do Produto " GET cod PIC "99" VALID cod >=1 .AND. cod <=5
READ
QUIT(0)
PROCEDURE proc_cod
SET KEY 28 OFF
&& Desabilita a tecla F1
SET TRACE ON
DECLARE vet_cod[04] = SPACE(30)
vet_cod[01] = "01 - Parafuso 01"
vet_cod[02] = "02 - Parafuso 02"
vet_cod[03] = "03 - Parafuso 03"
vet_cod[04] = "04 - Parafuso 04"
SET TRACE OFF
opt = ACHOICE(01, 01, 07, 31, vet_cod)
@ 01,01 CLEAR TO 07,31
opt = IIF(opt = -1, opt + 2, opt + 1)
KEYBOARD LEFT(vet_cod[opt], 2)
SET KEY 28 ON
&& Habilita a tecla F1
RETURN
4.69.5
Consulte
SET MESSAGE.
4.70 SET Truncate
4.70.1
Propósito
Truncar valores numéricos maiores que suas máscaras.
4.70.2
Sintaxe
SET TRUNCATE ON / off
4.70.3
Utilização
Quando ligado (ON), os valores numéricos que tenham mais dígitos que os definidos em suas máscaras
de edição (PICTURE E TRANSFORM), são truncados perdendo os dígitos mais à esquerda. Para que
isto não ocorra, basta desligar (OFF) este comando. Neste caso, serão exibidos asteriscos no lugar dos
valores truncados.
EXEMPLO
O exemplo a seguir mostra como utilizar este comando.
PROG
SET DECIMALS TO 2 ON var_num
var_num = 327654.88
@ 10,10 SAY “Valor Truncado (TRUNCATE ON) = “
@ 10,45 SAY var_num PIC “99,99”
@ 11,45 SAY TRANSFORM (“99,99”, var_num)
SET TRUNCATE OFF
@ 13,10 SAY “Valor Asteriscos (TRUNCATE OFF) = “
@ 13,45 SAY var_num PIC “99,99”
@ 14,45 SAY TRANSFORM (“99,99”, var_num)
&& Exibira 54,88
&& Exibira 54,88
&& Exibira **,**
&& Exibira **,**
4.71 SET Update
4.71.1
Propósito
Não mostrar o conteúdo das variáveis associadas aos comandos GET.
4.71.2
Sintaxe
SET UPDATE ON | off
4.71.3
Utilização
Para que na execução de um conjunto de GETs, o conteúdo das variáveis não seja exibido.
4.71.4
Exemplo
O exemplo a seguir mostra-nos a utilização do comando SET UPDATE.
Experimente mudar o estado do comando SET UPDATE para OFF.
PROG
var_nom, var_tel, var_end, var_ani = "VALOR INICIAL"
SET UPDATE OFF
@ 08,10 SAY "Nome " GET var_nom PIC REP("X",20)
@ 09,10 SAY "Telefone " GET var_tel PIC "(999) 999-9999"
@ 10,10 SAY "Endereço " GET var_end PIC REP("X",30)
@ 11,10 SAY "Aniversario (Dia/Mes)" GET var_ani PIC "99/99"
READ
? var_nom
? var_tel
? var_end
? var_ani
4.71.5
Consulte
@ ... GET, SET CLEAR e STORE.
4.72 SET Void
4.72.1
Propósito
Informar ao compilador o tipo dos parâmetros VOID.
4.72.2
Sintaxe
SET VOID TO <tipo>
4.72.3
<tipo>
4.72.4
Argumentos
representa um dos tipos de dado em C.
Utilização
Informa ao compilador, como interpretar os parâmetros VOID no arquivo de inclusão especificado pelo
comando CC INCLUDE.
<tipo> deve ser um dos seguintes tipos válidos: char, int, short, long, float, double.
Por DEFAULT <tipo> é igual a int.
4.72.5
Exemplo
O exemplo a seguir mostra-nos como utilizar o comando SET VOID para informar o tipo dos
parâmetros VOID das funções prototipadas no arquivo halo.h.
prog exemp
CC INCLUDE "halo.h"
* halo.h
* /*function prototyping for C language interface * generic coordinates */
* #define DEVICE_DRIVER
* int zoom ( void *, void *, int * );
* int setdev ( char * );
* int initgraphics ( int * );
* int inqdrange ( int *, int * );
* int worldoff ( void );
DEVICE_DRIVER = "AHDIBME.DSP"
mode,Xmax,Y max = 0
SET VOID to char
CALL setdev (DEVICE_DRIVE)
CALL initigraphics (Mode)
CALL inqdrange (Xmax, Ymax)
Download