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)