PROGRESS DCA
Desenvolvendo Aplicações Caracter
Completo ambiente de
desenvolvimento de aplicações,
composto por :
- Sistema Gerenciador de BD Relacional
- Linguagem de 4a. Geração
- Ferramentas de Programação
Benefícios
Flexível Aberto
Completo
Benefícios
■ Flexível ■ Aberto
– Assegura – Suporta o padrão
portabilidade das industrial
– Assegura opções
aplicações em
outras plataformas de
desenvolvimento
■ Completo heterogêneo
– Permite
construção de
grandes aplicações
– Produz soluções
Client/Server
Componentes Lógicos
■ Base de Dados
– Tabela
▼ Registro
▼ Campo
– Índice
Componentes Lógicos
Cliente Empresa Banco
= Base Dados
C
= Tabela O
M L
P Ó
= Registro O G
N I
E C
Nome = Campo N O
T S
E
= Índice S
Componentes Físicos
.DB
.BI .LG .LK
Componentes Físicos
.DB -> Database
contém os dados atuais e descrições da base
.BI -> Before-Image
contém a imagem dos dados de uma transação
Componentes Físicos
.LG -> Log
contém as referências dos usuários , hora de
entrada, saída e programas acessados (histórico).
.LK -> Lock
Informa se a base está sendo acessada.
- Blocos
- Declarações
Componentes da
- Funções
Linguagem
- Operadores
- Variáveis
- Expressões
- Símbolos especiais
- Elementos da interface com o usuário
(atributos e métodos)
- Eventos
Localização dos Dados
Base de Dados Buffer tela
Buffer Registro
Movimentando dados
Base de Dados → Tela
Base de Buffer Buffer
Dados Registro tela
Movimentando dados
Tela → Base de Dados
Base de Buffer Buffer Entrada
Dados Registro Tela Usuário
Regras para Movimentação
de Dados
■ Os programas não podem manipular os
dados da base de dados até que eles
sejam copiados para o buffer de registro;
■ O usuário não pode interagir com os
dados até que eles sejam copiados do
buffer de registro para o buffer de tela;
Regras para Movimentação
de Dados
■ As alterações que são feitas no buffer de
tela ou buffer de registro não são
atualizadas automaticamente em outro
buffer. Deve-se programar o controle de
movimentação entre os buffers.
Comando Banco de Buffer de Buffer de Tela Usuário
Dados Registro
ASSIGN
CREATE
DELETE
DISPLAY
ENABLE
FIND
FOR EACH
GET
INSERT
PROMPT-FOR
RELEASE
SET
UPDATE
Criando e Modificando Registros
CREATE - Cria um novo registro no banco,
inicializa com os valores defaults e deixa uma
cópia do registro no buffer de registro.
Ex.: CREATE customer.
UPDATE - Executa as ações de DISPLAY,
PROMPT-FOR e ASSIGN.
Ex.: UPDATE customer.
UPDATE customer EXCEPT cust-num.
Criando e Modificando Registros
INSERT - Executa as ações de CREATE,
DISPLAY, PROMPT-FOR e ASSIGN.
Ex.: INSERT customer.
ASSIGN - Copia os dados do buffer de tela para o
buffer de registro.
Ex.: ASSIGN [Link]-num.
Criando e Modificando Registros
SET - Executa as ações de PROMPT-FOR e
ASSIGN.
Ex.: SET customer.
DELETE - Elimina um registro do buffer de registro
e do banco de dados.
Ex.: DELETE customer.
Criando e Modificando Registros
ASSIGN - Copia os dados do buffer de tela para
seus respectivos campos e/ou variáveis no buffer
de registro.
Ex.: 1. ASSIGN [Link]-num.
2. DEF VAR i-cust-num AS integer NO-UNDO.
PROMPT-FOR i-cust-num.
FIND FIRST customer EXCLUSIVE-LOCK.
ASSIGN [Link]-num = i-cust-num.
Comandos que substituem
Comandos
INSERT
UPDATE
Create
Comandos que substituem
Comandos
INSERT
UPDATE
SET
Create Display
Comandos que substituem
Comandos
INSERT
UPDATE
SET
Create Display Prompt-for Assign
Quadro de Comandos
INSERT
UPDATE
SET
Prompt- For
Delete Create Display Assign Find Each Release
for
Tipos de Dados do Progress
Tipo Formato Exemplo
Character x(8) “x(40)” –> string alfanumérica
Aceita: A – Alfabetico “AAA-9999” –> MCZ-9283
! – Maiusculas “!x(10)” –> STRING ALFANUMÉRICA
Integer >>>,>>9 “>>>,>>9” –> 1.500
Aceita: z – espaço “999,999” –> 001.500
9 – mostra “0” “zzz,zz9” –> 1.500
Decimal >>>,>>9.99 “>>>,>>9.99” –> 1.500,45
“999,999.99” –> 001.500,45
“zzz,zz9.99” –> 1.500,45
Logical Yes/No Yes
Aceita: True/False No
Date MM/DD/AAA
Rowid ----
Recid >>>>>9
Observe a movimentação
insert customer.
create customer.
update customer.
create customer.
display customer.
prompt-for customer
assign customer.
Tipos de Blocos
• REPEAT
• FOR EACH
• DO
• PROCEDURES
• TRIGGERS
REPEAT
Laço (repetição) automático. Continua a
interagir até encontrar um END-ERROR ou
outra condição de término definida pelo
usuário.
Ex: REPEAT WITH 1 COLUMN:
CREATE customer.
UPDATE customer.
END.
FOR EACH
Lê um registro a cada interação do bloco
e copia os dados do banco para o buffer de
registro, e do buffer de registro para o buffer de
tela.
Ex: FOR EACH customer:
DISPLAY [Link]-num
[Link].
END.
DO
Individualiza um grupo de comandos dentro
de um bloco simples.
Ex: FOR EACH customer:
DISPLAY [Link]-num.
IF credit-limit > 15000 THEN DO:
UPDATE [Link]
[Link].
MESSAGE "Registro Alterado".
END.
END.
WHERE
Limita os registros a serem mostrados em uma
leitura de uma tabela.
Ex: FOR EACH customer
WHERE [Link]-limit > 15000:
DISPLAY [Link]-num
[Link]-limit.
END.
OPERADORES:
NOT > <
AND >= <=
OR <>
FIND
Busca apenas um registro em uma tabela.
FIRST (primeiro) LAST (último)
NEXT (próximo) PREV (anterior)
Ex.: FIND FIRST customer
WHERE [Link]-limit > 15000
NO-ERROR.
IF AVAILABLE customer THEN
DISPLAY customer WITH 1 COLUMN.
PROMPT-FOR
Solicita uma entrada e disponibiliza no buffer de
tela.
Ex.: PROMPT-FOR [Link]-num.
FIND customer
WHERE [Link]-num = INPUT
[Link]-num NO-ERROR.
IF AVAILABLE customer THEN
DISPLAY customer
EXCEPT [Link]
WITH 1 COLUMN.
Substituindo "WHERE"
PROMPT-FOR [Link]-num.
FIND customer USING [Link]-num.
DISPLAY customer WITH 1 COLUMN.
WHERE [Link]-num = INPUT [Link]-num.
USING
Ex: REPEAT WITH 1 COLUMN:
PROMPT-FOR [Link]-num.
FIND customer USING [Link]-num.
DISPLAY customer.
END.
BEGINS
Verifica se a 1. expressão inicia com a 2.
expressão.
Ex: FOR EACH customer
WHERE [Link] BEGINS “S”:
DISPLAY [Link]-num
[Link]
[Link].
END.
MATCHES
Compara uma expressão do tipo caracter com
um padrão e retorna o valor verdadeiro se a
expressão for atendida.
Ex: FOR EACH customer
WHERE [Link] MATCHES “*st”:
DISPLAY [Link]-num
[Link]
[Link].
END.
CONTAINS
Faz a busca por determinada palavra ou
combinação delas, em atributos do tipo word-
index.
Ex: FOR EACH item
WHERE [Link]-name CONTAINS “ball”:
DISPLAY [Link]-num
[Link]-name
[Link].
END.
QUERY
Busca registros no banco de dados. É utilizada
com widgets browses ou declaração GET.
- Definir a query
Ex.: DEFINE QUERY query-name
FOR table SCROLLING.
- Abrir a query
Ex.: OPEN QUERY query-name FOR EACH table
- Acessar os registros
GET ou BROWSE
GET
Retorna um registro de uma query previamente
aberta.
GET FIRST query-name.
NEXT
LAST
PREV
QUERY
Ex.: DEFINE QUERY qr-cust
FOR customer SCROLLING.
OPEN QUERY qr-cust FOR EACH customer.
GET FIRST qr-cust.
REPEAT:
DISP customer.
GET NEXT qr-cust.
END.
BROWSE
Interface para a query.
Ex:
DEFINE QUERY query-name FOR customer.
DEFINE BROWSE browse-name QUERY query-name
DISPLAY [Link]-num
[Link]
WITH 15 DOWN TITLE “Browse de Clientes”.
OPEN QUERY query-name FOR EACH customer.
UPDATE browse-name WITH FRAME f1.
BY
Usa-se a opção BY para classificação de registros
por um campo não indexado.
Ex:
FOR EACH customer BY balance DESCENDING:
DISPLAY [Link]
[Link]
[Link].
END.
Default : ordenação ascendente
USE-INDEX
A opção USE-INDEX permite você escolher
qualquer índice definido, para selecionar registros.
Ex:
FOR EACH customer USE-INDEX name:
DISPLAY [Link]
[Link]
[Link].
END.
LABORATÓRIO 2
Página 3-58 (69)
3-58
Processamento Condicional
Solicita num. cliente
Busca registro no BD
Sim Não
Encontrou?
Altera informações Adiciona novo
Processamento Condicional
IF expression THEN
bloco
ELSE DO:
bloco
END.
Processamento Condicional
CASE expression:
WHEN value THEN
bloco
WHEN value THEN DO:
bloco
END.
WHEN value THEN
bloco
OTHERWISE DO:
END.
END CASE.
Eliminando Registros
Elimina o registro da tabela onde o ponteiro estiver
posicionado.
Ex:
REPEAT:
PROMPT-FOR [Link]-num.
FIND customer USING [Link]-num.
DELETE customer.
END.
Variáveis
DEFINE VARIABLE variable-name
AS Tipo de dado
LIKE [Link]
INITIAL “xxxx”
NO-UNDO
Ex.: DEFINE VARIABLE c-customer AS char NO-UNDO.
DEF VAR i-cust-num LIKE [Link]-num
NO-UNDO.
LABORATÓRIO 3
Página 4-29 (30)
Página 5-32 (33)
4-29
FRAMES
É uma área retangular dentro da tela do Progress
usada para mostrar informações.
Layout default para seus dados.
Espaço disponível:
Frame (21 linhas)
Mensagens (2 linhas)
Linha de status (1 linha)
FRAMES
As frames default do progress ocorrem nos
seguintes blocos :
✓Procedure
✓Repeat
✓Foreach
✓Do with frame
FRAMES
DISPLAY “Relatório de Clientes”
WITH FRAME abc CENTERED.
FOR EACH customer:
DISPLAY [Link]-num [Link]
WITH FRAME xxx DOWN.
END.
one-down: dados de uma única interação do bloco
down: dados de múltiplas interações do bloco.
DEFINE FRAME
Define uma frame para uso por um procedimento ou
por diversos procedimentos.
Ex.: DEFINE FRAME xxx
[Link]-num NO-LABEL SKIP(2)
[Link] AT 5 SKIP
[Link] AT 5
WITH SIDE-LABELS OVERLAY.
OPÇÕES DE POSICIONAMENTO
AT - Alinhamento pela direita. F1: Short
Fld2: Medium
Field3: Long
COLON - Alinhamento pelos dois pontos.
F1: Short
Fld2: Medium
Field3: Long
TO - Alinhamento pela esquerda.
F1: Short
Fld2: Medium
Field3: Long
MANIPULANDO FRAMES
VIEW - apresenta uma frame.
Ex.: VIEW FRAME frame-name.
HIDE - apaga uma frame.
Ex.: HIDE FRAME frame-name NO-PAUSE.
CLEAR - apaga o conteúdo de uma frame.
Ex.: CLEAR FRAME f-arq ALL NO-PAUSE.
MANIPULANDO FRAMES
PAUSE - suspende a execução até que uma tecla
seja pressionada ou um certo tempo passar.
Ex.: PAUSE.
PAUSE 5.
LABORATÓRIO 4
Página 6-29 (32 - 6.11)
MESSAGE
Envia uma mensagem para a tela.
MESSAGE “texto” [ UPDATE váriavel ]
[ VIEW-AS ALERT-BOX
[QUESTION / INFORMATION
WARNING / ERROR ]
[ BUTTONS YES-NO
YES-NO-CANCEL
OK
OK-CANCEL
RETRY-CANCEL ]
[ TITLE “título” ].
MESSAGE
Ex.:
DEF VAR l-resp AS logical INITIAL no NO-UNDO.
MESSAGE “Confirma Atualização ?”
UPDATE l-resp
VIEW-AS ALERT-BOX
QUESTION BUTTONS YES-NO
TITLE “Atualização de Dados”.
INCLUDES
Em tempo de compilação PROGRESS lê estes
arquivos include como sendo parte do programa.
Vantagem: reutilização de código.
Ex.: {i-valida.i}
{i-valida.i “Código Inválido”}
/* i-valida.i */
MESSAGE “{1}” VIEW-AS ALERT-BOX.
Includes São Expansões em
Tempo de Compilação
myprog.p
mycode.i
DO:
...
Display record.
... DO:
END. ...
Display record.
...
END.
Código Modular com Arquivos de Includes
myprog.p
mycode.i
{mycode.i} DO:
...
Display record.
...
END.
{mycode.i}
Usando Arquivos de Include para
Definir Variáveis
mycode.i
DEFINE VARIABLE...
prog1.p prog2.p
{mycode.i}
{mycode.i}
Exemplo de Includes
{i-mostra.i &table=“customer”
&field=“cust-num”}
/* i-mostra.i */
FOR EACH {&table}:
DISPLAY {&table}.{&field}.
END.
Observação
•Não pode ser utilizado a barra “\” nos nomes
de arquivos ou includes para informar o
diretório, pois causa erro no UNIX.
•Quando for necessário utilizar barras para
informar diretório, deve-se utilizar a barra “/”.
LABORATÓRIO 5
• Criar um programa que possua uma include
genérica para mostrar dados de uma determinada
tabela, onde sejam passados como parâmetros
o nome da tabela e uma lista com 3 atributos.
• Este programa deverá chamar esta include para
as seguintes tabelas customer e state.
REDIRECIONANDO A SAÍDA
OUTPUT TO nome-arq
PRINTER
TERM
STREAM - Define canais adicionais de saída
Ex.: DEFINE STREAM s1.
OUTPUT [STREAM xxx] TO [Link]
VALUE(c-arquivo)
[APPEND].
PUT [STREAM xxx] + SKIP
PUT [STREAM xxx] UNFORMATTED
OUTPUT [STREAM xxx] CLOSE.
FUNÇÕES
TOTAL
COUNT
MAXIMUM
MINIMUM
AVERAGE
Os labels são mostrados na ordem especificada
acima.
TOTALIZANDO VALORES
ACCUMULATE - Calcula uma ou mais
expressões de totalização dentro de um bloco
de interação.
ACCUM - Acessa os valores acumulados pela
função accumulate.
BREAK
Define categorias de quebra.
Represent. Num Cliente Limite Crédito
aaa 1 60.000
aaa 3 3.000
63.000 TOTAL
bbb 4 5.000
bbb 8 50.000
55.000 TOTAL
118.000 TOTAL
FUNÇÕES
FIRST-OF - Retorna verdadeiro se a iteração atual
for a primeira do grupo de quebra.
LAST-OF - Retorna verdadeiro se a iteração atual
for a última do grupo de quebra.
Ex.: FOR EACH customer
BREAK BY [Link]-rep:
IF FIRST-OF([Link]-rep) THEN
DISPLAY [Link]-rep
[Link].
END.
CABEÇALHOS E RODAPÉS
Opção HEADER
PAGE-TOP (depende da HEADER)
PAGE-BOTTOM (depende da HEADER)
na definição da frame.
Ativar/Desativar frames - VIEW / HIDE
PAGE-SIZE - número de linhas por página.
PAGE-NUMBER - retorna o número da página.
LABORATÓRIO 6
Página 7-32
PROGRAMAÇÃO
ORIENTADA A EVENTOS
LABORATÓRIO 7
Página 8-34
LABORATÓRIO 8
Página 8-59 (8-63)
MENUS
ASSIGN DEFAULT-WINDOW:MENUBAR =
MENU mbar:HANDLE.
DEFINE SUB-MENU sm-Reports
MENU-ITEM mi-Labels LABEL "Customer Labels"
MENU-ITEM mi-Names LABEL "Customer Names"
RULE
MENU-ITEM mi-Balances LABEL "Order Totals"
MENU-ITEM mi-Today LABEL "Order Items".
DEFINE MENU mbar MENUBAR
SUB-MENU sm-Table LABEL "Tables"
SUB-MENU sm-Reports LABEL "Reports"
SUB-MENU sm-Help LABEL "Help".
TRIGGERS PARA MENU
ON CHOOSE OF MENU-ITEM mi-item IN MENU
menu-name DO:
bloco
END.
DEF SUB-MENU sm-sair
MENU-ITEM mi-sair LABEL "Sai&r"
TRIGGERS:
ON CHOOSE APPLY "window-close" TO
current-window.
END TRIGGERS.
LABORATÓRIO 9
Página 9-22
COMPARTILHANDO DADOS
DEFINE VARIABLE
NEW
NEW GLOBAL
SHARED
DEFINE SHARED FRAME
DEFINE BUFFER
DEFINE STREAM
BUFFER
É o espelho de uma tabela.
Ex. DEFINE BUFFER bf-cliente FOR customer.
define buffer b-aux for customer.
find first customer.
update [Link]-num
[Link].
find b-aux
where [Link]-num = [Link]-num.
display [Link]
[Link].
update [Link].
PARÂMETROS
INPUT: recebe um valor do procedimento que o
chamou.
Ex.: RUN prog2.p (INPUT c-name).
/* prog2.p */
DEF INPUT PARAM c-nome AS char NO-UNDO.
PARÂMETROS
OUTPUT: retorna um valor para o procedimento que o
chamou.
Ex.: RUN prog2.p (OUTPUT i-cont).
/* prog2.p */
DEF OUTPUT PARAM i-num AS integer NO-UNDO.
PARÂMETROS
INPUT-OUTPUT: recebe e retorna um valor para
o procedimento que o chamou.
Ex. RUN prog2.p (INPUT-OUTPUT c-name).
/* prog2.p */
DEF INPUT-OUTPUT PARAM c-nome
AS char NO-UNDO.
PARÂMETROS
PARAM BUFFER: passa o buffer do registro como
parametro para o programa chamado.
Ex. RUN prog2.p (BUFFER customer).
/* prog2.p */
DEF PARAM BUFFER b-customer FOR customer.
PARÂMETROS
PARAM TABLE: passa uma temp-table como
parametro para o programa chamado.
Ex. RUN prog2.p (INPUT TABLE tt-dados).
/* prog2.p */
DEF TEMP-TABLE tt-dados LIKE customer.
DEF INPUT PARAM TABLE FOR tt-dados.
OUTPUT
INPUT-OUTPUT
PROCEDURES INTERNAS
•Bloco de código que você define dentro de um
procedimento PROGRESS.
•Pode-se chamá-lo de qualquer ponto do
programa. Acessam os mesmos dados do
procedimento, sem a necessidade de
compartilhamento.
Programa com Procedures Internas
myprog.p proc1.p
RUN proc1.p
RUN proc2
PROCEDURE proc2:
END.
FOR EACH customer:
DISPLAY [Link]-num
[Link].
RUN pi-mostra-pedidos.
END.
PROCEDURE pi-mostra-pedidos:
FOR EACH order OF customer:
DISPLAY [Link]-num.
END.
END.
EXECUTANDO PROCEDURES
INTERNAS/PROGRAMAS
RUN {extern-procedure}
[PERSISTENT [SET handle]]
[ (parameter [ , parameter ] . . .) ]
[ argument ] . . . [ NO-ERROR ]
Ex.:
RUN pi-calculo (INPUT 45,
OUTPUT v_perc).
RUN w-proces.w PERSISTENT SET hproces.
RUN pi-digito IN hproces (INPUT 382,
OUTPUT v_digit).
COMPILANDO PROGRAMAS
COMPILE <nome-do-programa> [SAVE].
Ex.:
COMPILE w-proces.w SAVE.
Extensões:
.P
.W
.i
.PY
.R
TABELAS TEMPORÁRIAS
• São iguais as tabelas;
• Possuem índice;
• Podem denegrir a performance, caso tenham muitos
registros e não possuam índice adequado;
DEF TEMP-TABLE tt_name [NO-UNDO]
[LIKE table-name
[USE-INDEX index-name [AS PRIMARY]] ... ]
[FIELD field-name {AS data-type | LIKE field}] ...
[INDEX index-name
[IS [UNIQUE] [PRIMARY] [WORD-INDEX ]]
{index-field [ASCENDING|DESCENDING]}...]...
TABELAS TEMPORÁRIAS
Ex.:
DEF TEMP-TABLE tt_cliente NO-UNDO
LIKE customer
FIELD cod_fornec AS character FORMAT “x(5)”
LABEL “Fornecedor”
FIELD region LIKE [Link]
INDEX fornec IS PRIMARY cod_fornec.
INSERT tt_cliente EXCEPT comments
WITH 1 COLUMN.
FOR EACH tt_cliente NO-LOCK:
DISP tt_cliente EXCEPT comments
WITH SIDE-LABELS.
END.
LABORATÓRIO 11
• Criar a tabela temporária que seja igual a
tabela ORDER;
• Adicionar o atributo name, este deverá ser
igual ao atributo da tabela CUSTOMER;
• O programa deverá ler todos os
CUSTOMERS, todas os ORDERS dos
mesmos a atualizar a temp-table, alimentando
os atributos: cust-num, name, order-date,
order-num e sales-rep.
• Mostrar uma listagem que mostre os atributos
acima e todos os registros da temp-table.
INPUT FROM
INPUT [STREAM xxx] FROM [Link].
•Se o arquivo de entrada conter mais campos
que o procedimento usa, PROGRESS ignora os
campos excedentes.
•Se o arquivo de entrada conter menos campos
que o esperado, PROGRESS processa a linha
do arquivo, mas não seta os campos que ficaram
sem entrada.
INPUT FROM
INPUT FROM [Link].
REPEAT:
CREATE customer.
SET [Link]-num
[Link]
[Link]-rep.
END.
EXPORT
OUTPUT TO c:/tmp/state.d.
FOR EACH state:
EXPORT state.
END.
"AK" "Alaska" "West"
"AL" "Alabama" "South"
"AR" "Arkansas" "Central"
"AZ" "Arizona" "West"
"CA" "California" "West"
"CO" "Colorado" "West"
IMPORT
DEF VAR i-cust AS integer NO-UNDO.
DEF VAR c-name AS character NO-UNDO.
DEF VAR c-rep AS character NO-UNDO.
INPUT FROM [Link].
REPEAT:
IMPORT i-cust c-name c-rep.
MESSAGE i-cust SKIP
c-name SKIP
c-rep VIEW-AS ALERT-BOX.
END.
TRATAMENTO DE ERROS
- Erro de sistema
- Erro gerado pelo procedimento - a busca de
um registro falha ou o procedimento tenta
criar um registro com chave duplicada.
- Erro de interrupção de processamento -
quando o usuário pressiona as teclas de
ERROR, ENDKEY ou END-ERROR.
TRANSAÇÕES
- Unidade completa de trabalho.
- A transação é um trabalho que se for
terminada a sua execução de forma anormal,
será completamente desfeito, ou seja, todo
realizado ou nada feito.
Procedimento Blocos que tem
REPEAT processamento de
FOR EACH transação
TRANSAÇÕES
Uma transação é uma interação do bloco mais
externo que contiver declarações que alterem
diretamente o banco de dados, ou a leitura de
registros com a opção EXCLUSIVE-LOCK.
Escopo de uma transação determina a
quantidade de trabalho que PROGRESS
desfaz em eventos de falha do sistema.
TRANSACTION
REPEAT:
CREATE customer.
UPDATE cust-num name phone.
END.
DO TRANSACTION:
REPEAT:
CREATE customer.
UPDATE cust-num name phone.
END.
END.
BLOQUEIO DE REGISTROS
NO-LOCK
SHARE-LOCK (Não pode ser utilizado)
EXCLUSIVE-LOCK
LABORATÓRIO 10
Página 13-13
FUNÇÕES
- CAN-DO: verifica uma string dentro de uma
lista separada por vírgulas.
IF NOT CAN-DO(lista,string) THEN ...
- CAN-FIND: retorna verdadeiro se um registro
foi encontrado.
Ex.: IF CAN-FIND(customer
WHERE [Link]-num =
i-cust-num) THEN ...
FUNÇÕES
LOOKUP: retorna um valor inteiro
indicando a posição da string dentro de
uma lista. Separador default: “,”.
LOOKUP(string,lista,[separador]).
Ex.: LOOKUP(“sc”,”am,pr,sc”)
ENTRY: retorna uma string caracter
baseada em uma lista, a partir de uma
posição inteira. Separador default: “,”.
ENTRY(posição,lista,[separador]).
Ex.: ENTRY(2,c-lista,“/”).
FUNÇÕES
- NUM-ENTRIES: retorna o número de itens
de uma lista. Separador default: “,”.
NUM-ENTRIES(lista,[separador])
Ex.: NUM-ENTRIES(c-lista,“.”).
- SUBSTRING: extrai uma porção de
caracteres de uma string.
SUBSTR(string,posição-inicial,posição-final)
Ex.: SUBSTR(c-nome,2,10).
SUBSTR(c-address,10).
FUNÇÕES
- STRING: converte dados não caracter para o tipo
de dado caracter.
STRING(source,[format]).
Ex.: STRING ([Link]-num).
STRING ([Link]-code,”99999”).
- LENGTH: retorna o tamanho de uma string.
Ex.: ASSIGN i-tam = LENGTH(v_cod_estab).
FUNÇÕES
- SUBSTITUTE: troca parâmetros dentro de uma string.
SUBSTITUTE(string, param1, param2, ..., paramN).
Ex.:
v-desc = SUBSTITUTE(“o usuário &1 não foi
encontrado”, c-user).
- TRIM: retira os espaços em branco do início e do final
da string.
Ex.: ASSIGN c-user = TRIM(“ teste “).
FUNÇÕES
- REPLACE: troca N ocorrências da string1 pela string2
dentro de um texto.
REPLACE(texto, string1, string2).
Ex.: v-desc = “o usuário não foi encontrado”.
v-desc = REPLACE(v-desc, “o”, “ó”).
- INDEX: retorna um inteiro, indicando a posição de
uma expressão dentro de uma string.
INDEX(string,expressão,posição-inicial p/procura).
Ex.: INDEX(“curso de progress”, “de”).
INDEX(“curso de progress”, “pr”, 10).
FUNÇÕES
- RECID: endereço físico de um registro.
Ex.: FIND customer
WHERE RECID(customer) = 3848 NO-ERROR.
- ROWID: endereço físico de um registro.
Ex.:
ASSIGN r-reg = ROWID(customer).
FIND customer
WHERE ROWID(customer) = r-reg
NO-ERROR.
DÚVIDAS ?