FIND

Procurar um registro de uma tabela. Localiza registro do banco e move para buffer de registro.


/* exemplo 1 - menor comando possível */
FIND customer.

/* exemplo 2 - localizar um customer específico */
FIND customer WHERE
     customer.cust-id = 1.

/* exemplo 3 - procurar o primeiro registro da tabela customer
   (usa o índice primário para saber quem é o primeiro) */
FIND FIRST customer.

FIND LAST customer. /* procura ultimo */
FIND PREV customer. /* procura anterior, precisa ter um já lido para ser a base */
FIND NEXT customer. /* procura próximo, idem acima */

UPDATE

Alterar dados de uma tabela ou variável. Move dado do buffer de registro para buffer de tela. Usuário digita os dados que são movidos de volta para o buffer de registro.


FIND FIRST customer. /* precisa ter um registro lido para executar este comando */

/* exemplo 1 - alterar todos os campos de um registro da tabela customer */
UPDATE customer.

/* exemplo 2 - alterar apenas o campo name */
UPDATE customer.name.

/* exemplo 3 - alterar uma variável */
UPDATE codigo.

DISPLAY

Mostrar os dados de uma tabela ou variável. Move buffer de registro para buffer de tela. Abreviar: DISP.


FIND FIRST customer. /* precisa ter um registro lido para executar este comando */

/* exemplo1 - mostrar todos os campos de um registro da tabela customer */
DISPLAY customer.

/* exemplo 2 - mostrar os campos custnum e name */
DISPLAY customer.custnum
        customer.name.

/* exemplo 3 - mostrar uma variável */
DISPLAY codigo.

DELETE

Apagar um registro de uma tabela. Apaga o registro do banco que estava lido no buffer de registro .


FIND FIRST customer. /* precisa ter um registro lido para executar este comando */

DELETE customer.

ASSIGN

Atualizar dados de um registro de uma tabela ou de uma variável. Atualiza o buffer de registro com os dados do buffer de tela.


FIND FIRST customer. /* precisa ter um registro lido para executar este comando */

/* exemplo 1 - atualizar todos os dados de um registro da tabela customer */
ASSIGN customer.

/* exemplo 2 - atualizar apenas campos custnum e name */
ASSIGN customer.custnum
       customer.name.

/* exemplo 3 - atualizar variável */
ASSIGN codigo.

RELEASE

Forçar atualizar e liberar um registro de uma tabela. Atualiza o registro do banco com os dados do buffer de registro e libera o registro. Este comando não é obrigatório, pois o Progress atualiza este registro ao final da transação automaticamente.


FIND FIRST customer. /* precisa ter um registro lido para executar este comando */

RELEASE customer.

SET

Ler os dados de uma variável ou tabela e atualizar buffer de registro. Usuário digita dados no buffer de tela e atualiza o buffer de registro com estes dados.


FIND FIRST customer. /* precisa ter um registro lido para executar este comando */

/* exemplo 1 - ler todos os campos de um registro da tabela customer */
SET customer.

/* exemplo 2 - ler apenas os campos custnum e name */
SET customer.custnum
    customer.name.

/* exemplo 3 - ler variábel */
SET codigo.

NO-ERROR

Interceptar o erro em FIND, ASSIGN e RUN.


/* exemplo 1 - interceptar erro caso não ache o registro com código 10000 */
FIND FIRST customer WHERE
     customer.custnum = 10000 NO-ERROR.

/* exemplo 2 - interceptar erro ao tentar transformar um string com letra num integer */
DEF VAR c1 AS INT NO-UNDO.
ASSIGN c1 = INT('10a') NO-ERROR.

/* exemplo 3 - interceptar erro ao utilizar uma procedure ou programa com tipo de dados incorreto */
PROCEDURE proc1:
    DEF INPUT PARAM p AS INT NO-UNDO.
END PROCEDURE.

RUN proc1('x') NO-ERROR.

/* exemplo 4 - interceptar erro ao utilizar uma procedure ou programa com quantidade de dados incorreto */
PROCEDURE proc1:
    DEF INPUT PARAM p AS INT NO-UNDO.
END PROCEDURE.

RUN proc1() NO-ERROR.

/* exemplo 5 - interceptar erro numa lista que não possui a entrada */
DEF VAR item AS CHAR.
item = ENTRY(10, "a,b,c") NO-ERROR.

LOCK

Definir lock a ser utilizado (NO-LOCK, SHARE-LOCK, EXCLUSIVE-LOCK)


/* exemplo 1 - procurar um registro apenas para consultar */
FIND FIRST customer NO-LOCK.
MESSAGE customer.custnum.

/* exemplo2 - procurar um registro para consultar e alterar */
FIND LAST customer EXCLUSIVE-LOCK.
UPDATE customer.custnum.

USE-INDEX

Forçar utilização de um índice ao fazer um FOR EACH ou FIND.


/* exemplo 1 - utilizar num FOR EACH */
FOR EACH customer NO-LOCK
    USE-INDEX CountryPost:
    /* comandos aqui */
END.

/* exemplo 2 - utilizar num FIND */
FIND FIRST customer NO-LOCK
     USE-INDEX CountryPost.

CAN-FIND

Testa se um registro de uma tabela ou temp-table pode ser encontrado. Não traz os dados para o buffer de registro. Retorna apenas TRUE ou FALSE.


/* exemplo 1 - menor código possível */
CAN-FIND(FIRST customer).

/* exemplo 2 - mostrar uma mensagem caso ache um customer */
IF CAN-FIND(customer WHERE customer.custnum = 1000 NO-LOCK)
THEN MESSAGE "Achou customer 1000".

LOCKED

Retornar se o registro está locado. Utilizado junto com NO-WAIT.


/* exemplo 1 - menor código possível */
FIND FIRST customer EXCLUSIVE-LOCK NO-WAIT.
MESSAGE LOCKED customer.

/* exemplo 2 - apresentar mensagem caso registro 1000 esteja locado */
FIND customer WHERE
     customer.custnum = 1000 EXCLUSIVE-LOCK NO-ERROR NO-WAIT.
IF LOCKED customer
THEN MESSAGE 'Registro customer 1000 está locado'.

AVAILABLE

Retornar se um registro está disponível. Sempre utilizar após fazer um FIND. Abreviar: AVAIL.


/* exemplo 1 - menor código possível */
FIND FIRST customer.
MESSAGE AVAIL customer.

/* exemplo 2 - mostrar mensagem caso ache o customer 3000 */
DEF VAR c AS INT.

c = 3000.

FIND customer WHERE
     customer.custnum = c NO-ERROR.
IF AVAILABLE customer
THEN MESSAGE 'Nome do customer' c customer.name.

BUFFER-COPY

Copiar dados entre tabelas ou buffers. As tabelas/buffers origem e destino devem estar no buffer de registro. Não há alteração na tabela/buffer origem.


/* exemplo 1 - menor código possível */
/* copiar dados de uma tabela para uma temp-table */
DEF TEMP-TABLE tt LIKE customer.

FIND FIRST customer.

CREATE tt. /* criar um registro na temp-table */
BUFFER-COPY customer TO tt. /* copiar os dados da tabela para a temp-table */

/* exemplo 2 - criar um registro de tabela e copiar todos os dados do primeiro */
/* exceto a chave primária que não pode ser duplicada */
DEF BUFFER buf_customer FOR customer.

FIND FIRST customer NO-LOCK NO-ERROR.

CREATE buf_customer.

BUFFER-COPY customer EXCEPT custnum TO buf_customer.

buf_customer.custnum = 10000. /* chave primária que não coincida com outras */


WHERE

Selecionar registros no FIND ou FOR EACH.


/* exemplo 1 - utilizar num FOR EACH */
FOR EACH customer WHERE
         customer.custNum = 1 NO-LOCK:
    /* comandos aqui */
END.

/* exemplo 2 - utilizar num FIND */
FIND customer WHERE
     customer.custnum = 230.
MESSAGE customer.name.