Comandos Parte 2

21/04/2019


REPEAT

Criar bloco de repetição de comandos.

REPEAT:
    /* comandos aqui */
END.

DO

Criar bloco de comandos. Geralmente é usado para executar mais de um comando após um IF ou ELSE.

/* exemplo 1 - mínimo comando possível */
DO:
    /* comandos aqui */
END.

/* exemplo 2 - utilizar junto com o IF e ELSE */
IF 1 = 1
THEN DO:
    /* comandos aqui */
END.
ELSE DO:
    /* outros comandos aqui */
END.

USING

Utilizar campo da tabela que está no buffer de tela para fazer a busca do registro do banco. Precisa definir um FORM e precisa ter mostrado algum dado no FORM.

FORM customer.custnum WITH FRAME a.

DISP 1 @ customer.custnum WITH FRAME a. 

FOR EACH customer USING FRAME a customer.custnum:
    MESSAGE customer.name.
END.

WORKFILE

Criar tabela temporária para utilizar em tempo de execução do programa. Ao finalizar o programa, a workfile é apagada automaticamente e tem todos seus dados perdidos. A diferença entre TEMP-TABLE e WORKFILE é que na WORKFILE não podem ser criados índices e nunca é salva em disco.

/* exemplo 1 - definir uma workfile copiando as definicoes de uma tabela real */
DEF WORKFILE wor_customer NO-UNDO LIKE customer.

/* exemplo 2 - definir uma workfile e todos seus campos um a um */
DEF WORKFILE wor_customer2 NO-UNDO
    FIELD codcust AS INT
    FIELD namecust AS CHAR.

FRAME

Definir como será mostrada uma tela para o usuário. Também pode definir formato de relatório ou saída para arquivos.

FORM customer.custnum
     WITH CENTERED SIDE-LABELS OVERLAY FRAME a
     TITLE ' Titulo aqui '.

DISP 1 @ customer.custnum WITH FRAME a.

LIKE

Herdar definições de uma tabela ao definir uma variável, temp-table ou workfile.

/* exemplo 1 - definir uma variável e herdar definições do campo custnum da tabela customer */
DEF VAR custo LIKE customer.custnum.

/* exemplo 2 - definir temp-table e herdar definições da tabela customer */
DEF TEMP-TABLE tt_cust LIKE customer.

/* exemplo 3 - definir uma workfile */
DEF WORKFILE wor_cust LIKE customer.

NO-UNDO

Atributo para variáveis e temp-tables que não precisam ter seus valores desfeitos ao desfazer uma transação

/* exemplo 1 - definir variável com NO-UNDO */
DEF VAR wc AS CHAR NO-UNDO.

/* exemplo 2 - definir temp-table com NO-UNDO */
DEF TEMP-TABLE tt_tab NO-UNDO
    FIELD c1 AS INT
    FIELD c2 AS CHAR.

RUN

Executar um programa ou procedure.

/* exemplo 1 - executar o programa p1.p */
RUN p1.p.

/* exemplo 2 - definir uma procedure e executá-la */
PROCEDURE teste:
    MESSAGE 'ola'.
END PROCEDURE.

RUN teste.

PARAMETER

Definir parâmetros de entrada, saída ou entrada-saída em programas e procedures. Abreviar: PARAM.

PROCEDURE testarParam:
    DEF INPUT PARAMETER p1 AS INT NO-UNDO.
    DEF OUTPUT PARAMETER p2 AS CHAR NO-UNDO.
    DEF INPUT-OUTPUT PARAMETER p3 AS INT NO-UNDO.

    MESSAGE 'durante' p1.
    PAUSE.

    ASSIGN p2 = 'novo p2'
           p3 = 999.
END PROCEDURE.

DEF VAR param2 AS CHAR NO-UNDO.
DEF VAR param3 AS INT NO-UNDO.

ASSIGN param2 = 'oi'
       param3 = 111.

MESSAGE 'antes' param2 param3.
PAUSE.

RUN testarParam(100, OUTPUT param2, INPUT-OUTPUT param3).

MESSAGE 'depois' param2 param3.
PAUSE.

SHARED

Definir variável, buffer, temp-table ou workfile a ser compartilhada entre vários programas. As variáveis e tabelas precisam ter os mesmos nomes e definições em todos os programas. Por exemplo, caso num programa a variável seja NO-UNDO, e no outro programa não, dará erro.

/* definindo o programa inicial: prog1.p */
DEF NEW SHARED VAR c1 AS INT NO-UNDO.
ASSIGN c1 = 1000.
RUN prog2.p. /* chamando o prog2.p a partir do prog1.p */


/* definindo o programa a ser chamado: prog2.p /
DEF SHARED VAR c1 AS INT NO-UNDO.
MESSAGE 'estou no programa prog2: ' c1.
PAUSE.

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.

IF

Criar condição (IF THEN ELSE)

IF 1 = 1
THEN MESSAGE '1 igual 1'.

IF 1 <> 2
ELSE MESSAGE '1 nao eh igual 2'.

IF 1 = 2
THEN MESSAGE '1 igual 2'.
ELSE MESSAGE '1 nao eh igual 2'.