Comandos Parte 5

12/05/2019


TODAY

Retornar a data atual

MESSAGE TODAY.

TIME

Retornar o horário atual. Utilizado junto com STRING.

MESSAGE STRING(TIME,'hh:mm:ss')

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'.

DO WHILE

Criar repetição para um bloco de comandos até uma determinada condição deixar de ser verdadeira.

/* exemplo 1 - menor código possível */
DO WHILE TRUE:
    /* comandos aqui */
END.

/* exemplo 2 - mostrar números até 10 */
DEF VAR wi AS INT NO-UNDO.

DO WHILE wi < 10:
    ASSIGN wi = wi + 1.
    MESSAGE wi.
END.

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 */

NEXT

Parar a execução do laço de execução atual e forçar o início do próximo laço. Usado em laços de repetição ou FOR EACH.

/* exemplo 1 - menor código possível */
FOR EACH customer:
    /* comandos que serão executados */

    NEXT.

    /* comandos que não serão executados */
END.

/* exemplo 2 - mostrar todos número até 10, menos o 2 e 3 */
DEF VAR i AS INT NO-UNDO.

DO WHILE i < 10:
    ASSIGN i = i + 1.

    IF i = 2 OR i = 3
    THEN NEXT.

    MESSAGE i.
END.

LEAVE

Parar a execução do laço de repetição atual e sair do laço.

/* exemplo 1 - menor código possível */
FOR EACH customer:
    /* comandos que serão executados apenas no primeiro laço */

    LEAVE.
END.

/* exemplo 2 - mostrar os 5 primeiros números e sair do laço */
DEF VAR i AS INT NO-UNDO.

DO WHILE i < 10:
    ASSIGN i = i + 1.

    IF i > 5
    THEN LEAVE.

    MESSAGE i.
END.

EXTENT

Definir uma variável como array.

/* exemplo 1 - menor código possível */
DEF VAR var1 AS CHAR EXTENT 5.

/* exemplo 2 - definir e utilizar uma variável array de inteiros */
DEF VAR j AS INT EXTENT 3.

ASSIGN j[1] = 10
       j[2] = 25
       j[3] = 30.

MESSAGE j[2].

/* exemplo 3 - definir, inicializar e utilizar uma variável array de caracteres */
DEF VAR nomes AS CHAR EXTENT 3 INIT ["A", "B", "C"].

DISP nomes[3].

/* exemplo 4 - fazer assign em todo array ao mesmo tempo */
DEF VAR teste AS CHAR EXTENT 10.

teste = 'abcdef'.

DISP teste.

LENGTH

Retornar o tamanho de uma string

MESSAGE LENGTH('tamanho desta string').

BELL

Aviso sonoro

BELL.

AND

Operadores lógicos. AND, OR, NOT.

IF (1 = 1 AND 2 = 2) THEN MESSAGE 'Teste ok1'.

IF (1 = 1 OR 2 = 3) THEN MESSAGE 'Teste ok2'.

IF NOT (1 = 2 OR 2 = 3) THEN MESSAGE 'Teste ok3'.

FORWARDS

Pré-definir cabeçalho de uma function. Quando a definição da função precisar ficar abaixo do ponto onde ela foi utilizada no programa, o compilador dará mensagem de erro. O comando FORWARDS serve pra avisar o compilador que a função ainda será definida mais abaixo no programa.

/* exemplo 1 - menor código possível */
FUNCTION teste RETURNS CHAR FORWARDS.

/* exemplo 2 - pré-definir e utilizar a função antes de ter declarado */
FUNCTION teste RETURNS CHAR FORWARDS.

MESSAGE teste().

FUNCTION teste RETURNS CHAR:
    RETURN 'mensagem da funcao'.
END FUNCTION.

VALIDATE

Definir validação de dados num FRAME.

DEF VAR idade AS INT NO-UNDO.

FORM idade VALIDATE(idade > 0 AND idade < 100, 'Idade invalida)
     WITH FRAME tela1.

UPDATE idade WITH FRAME tela1.