Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Programando em Progress
Jaison Antoniazzi
Versão 1.5
Índice
Neo Step
Todos os Direitos Reservados 3
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Instrução Assign....................................................................................................................... 96
Instrução de Prompt-for .......................................................................................................... 97
Instrução de Update ................................................................................................................ 98
A maldição do Screen buffer ................................................................................................. 100
Exercícios ............................................................................................................................... 102
Instruções Condicionais ............................................................................................................. 103
Instrução IF, THEN e ELSE ...................................................................................................... 103
Instrução CASE....................................................................................................................... 104
Exercícios ............................................................................................................................... 105
Includes...................................................................................................................................... 106
Anotações .............................................................................................................................. 106
Exercício................................................................................................................................. 107
Pré-processadores ..................................................................................................................... 108
Constantes locais ................................................................................................................... 108
Constantes Globais ................................................................................................................ 108
Verificando a declaração de uma constante ......................................................................... 109
Diferença entre Scoped e Global ........................................................................................... 109
Eliminando a declaração de uma constante ......................................................................... 110
Exercício................................................................................................................................. 111
Frames e Display........................................................................................................................ 112
Frames de relatórios.............................................................................................................. 112
Frames para widgets ............................................................................................................. 112
Opções Para Campos E Constantes ....................................................................................... 112
Opções para o Frame ............................................................................................................ 115
Compartilhamento ................................................................................................................ 116
Instrução Display ................................................................................................................... 117
Frame de relatório ................................................................................................................. 119
Frames Sobrepostas .............................................................................................................. 121
As sete regras da programação com eventos ....................................................................... 122
Exercício................................................................................................................................. 124
Objetos, Eventos e Gatilhos de Widgets ................................................................................... 126
Tipos de Objetos .................................................................................................................... 126
Objetos Estáticos ................................................................................................................... 126
Neo Step
Todos os Direitos Reservados 5
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Neo Step
Todos os Direitos Reservados 6
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Neo Step
Todos os Direitos Reservados 7
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Todas as sintaxes de comandos e instruções foram extraídas do arquivo de ajuda da Progress, assim como
alguns exemplos, outros exemplos foram confeccionados pelo autor e somente podem ser reutilizados para
aprendizagem em treinamentos ministrados pela Neo Step em parceria com a IDBA.
Neo Step
Todos os Direitos Reservados 8
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Control Area
Arquivo .DB que contém os caminhos de todos os arquivos que compõem o banco.
Schema Area
É o meta-schema ou esquema do banco de dados, são as tabelas e campos que um banco utiliza para se
autogerenciar.
Neo Step
Todos os Direitos Reservados 3
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
After-image Area
São as informações que foram salvas no banco de dados, mas que ainda não estão no backup.
Componentes lógicos
Tabelas
Coleção lógica de informações semelhantes, tabela de clientes, tabela de itens, tabelas de unidades de
medida.
Registro
Uma linha com um ou vários campos das tabelas.
Campos
Cada um dos constituintes de uma tabela que armazenam suas informações, por exemplo, código do cliente,
nome do cliente.
Chaves
Temos dois tipos, chaves únicas e primárias.
Única
São as chaves que garantem a unicidade, não repetição dos registros, por exemplo, código do cliente, cada
cliente tem um código único e que não se repete.
Primária
São as chaves que serão usadas quando o mecanismo de seleção dos índices da linguagem ABL não localizar
um índice apropriado.
Índices
São estruturas semelhantes às tabelas, que mantém informações dos campos que os compõem e do
endereço do registro da tabela, permitindo ao mecanismo de localização de registros localizar os registros
solicitados de forma mais rápida do que varrendo toda a tabela e seus registros.
Sequências
São objetos que permites o sequenciamento de números através de incrementos parametrizáveis e que não
são afetados por transações após o incremento ser acionado.
O banco de dados Sports2000, que usaremos nesse treinamento, tem suas tabelas relacionadas na seção
Anexo, no final desta apostila.
Relacionamento 1x1
Quando duas tabelas A e B estão relacionadas e esta relação é de um registro da tabela A para um registro
da tabela B, por exemplo, um cliente que possui informações complementares e estas pertencem somente a
este cliente.
Relacionamento 1xN
Quando duas tabelas A e B estão relacionadas e esta relação é de um registro da tabela A para muitos da
tabela B, por exemplo, um cliente possui muitos pedidos.
Relacionamento NxN
Quando duas tabelas A e B estão relacionadas e esta relação é de muitos para muitos, exemplo, muitos
pedidos têm relação com muitos itens.
Neo Step
Todos os Direitos Reservados 5
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Ferramentas especialistas
O OpenEdge contém várias ferramentas que auxiliam desde a construção de programas, manutenção de
dicionário de dados, exportação e importação de programas.
Principais ferramentas
• AppBuilder, construtor de programas de programas estruturados para ambiente TTY, Gráfico e Web,
• Application Compiler, compilador de programas,
• Audit Policy Maintenance, gestor da política de auditoria,
• Character Client, editor caracter para desenvolvimento de programas TTY,
Neo Step
Todos os Direitos Reservados 6
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
• GUI Procedure Editor, editor de programas com interface gráfica para desenvolvimento de
programas,
• Developer Studio, Eclipse com plugin Progress para desenvolver programas modernos,
• Config, visualizador das licenças instaladas,
• Data Administration, exportação e importação de dados e definições, gestor de conexão com outros
bancos, listagem de programas,
• Data Dictionary, gestor de tabelas, campos, índices e sequências,
• Debugger, debugador de programas,
• Desktop, aplicação com atalho para as principais ferramentas,
• Help, arquivo de ajuda,
• Proenv, ambiente caracter com as variáveis do ambiente OpenEdge já atribuídas,
• OpenEdge Explorer, gestor de agentes de soluções para execução de programas remotos, agentes
webspeed e webservices, iniciador de bancos,
• Results, construtor de relatórios gráficos.
AppBuilder
Application Compiler
Neo Step
Todos os Direitos Reservados 7
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Data Administration
Data Dictionary
Neo Step
Todos os Direitos Reservados 8
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Desktop
Neo Step
Todos os Direitos Reservados 9
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Composição da sessão
A grande maioria das ferramentas utilizam a máquina virtual do OpenEdge, esta aceita
parâmetros muitos parâmetros, pois foi nasceu em ambiente Unix. Para aqueles que estão
acostumados com aplicações Windows pode parecer estranho uma linha de comando, com os
três alicerces (AVM, Propath e Banco de dados) assim:
Abaixo segue um pequeno exemplo de variáveis que deverão estar atribuídas no INI, no
Registry ou no Prompt de comandos (DOS).
END.
Neo Step
Todos os Direitos Reservados 11
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Neo Step
Todos os Direitos Reservados 12
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
7 END.
1. Definição de variável do tipo inteiro, será usada para a leitura de um valor para auxiliar na
pesquisa da tabela Customer,
2. Inicio do laço de repetição Repeat,
3. Ler o valor da variável,
4. Pesquisar o cliente (customer) que o código do cliente (customer.custnum) é igual ao valor
digitado no passo 3,
5. Decisão com uso de IF THEN, no caso usamos a função AVAILABLE CUSTOMER para verificar se o
registro de cliente está disponível,
6. Utilizamos a instrução DISPLAY para mostrar o valor do BUFFER da tabela CUSTOMER,
7. Final do bloco IF THEN,
8. Final do bloco de REPEAT.
END.
END.
O resultado é:
Neo Step
Todos os Direitos Reservados 14
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
3.4 DISPLAY
customer.custnum
customer.NAME
customer.address
customer.city
customer.state
customer.creditlimit
WITH 1 COL.
3.5 END.
3.6 END.
Neo Step
Todos os Direitos Reservados 15
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Um acrônimo para os principais comandos da linguagem Progress ABL focando a interação com registros em
banco de dados, a estrutura de um programa e a execução destes.
1. FIND, F
2. FOR EACH, F
3. OPEN QUERY, O
4. CREATE, C
5. ASSIGN, A
6. DELETE, D
7. DISPLAY, D
8. TRANSACTION, T
9. DO, D
10. PROCEDURE, P
11. FUNCTION, F
12. PERSISTENT, P
13. RUN, R
Acredito que todo programador, que queira ser um professional diferenciado, tem que dominar estas treze
instruções.
Find, For Each e Open Query para o acesso aos registros no banco de dados.
Create, Assign, Delete e Display para trabalhar com o registro, seja criando, seja atribuindo valores,
removendo ou exibindo o valor dos campos de uma tabela.
Saber trabalhar com Transaction e o bloco Do pode resolver vários problemas que considero problemas
básicos, como a criação de uma transação gigante que se inicia no começo do programa e somente será
completada ao término deste, algo muito ruim para qualquer programa, pois, na maioria das vezes, pode
criar uma Transação gigante e que estoura o parâmetro -L.
Dominar Procedures, Functions, sejam elas locais, ou através da técnica de programas em memória, com a
opção Persistent, assim como dominar a execução delas, sua passagem de parâmetros, usando a instrução
Run, facilitará a execução, a segmentação e o tratamento de código.
Neo Step
Todos os Direitos Reservados 16
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Debugger
Permite acompanharmos a execução passo a passo de programas, visualizarmos valores de variáveis, tabelas
temporárias e valores em registros de tabelas do banco.
Para utilizarmos o debugger precisamos habilitá-lo no nosso ambiente, para isso utilize o comando
ProDebugEnable -enable-all. Este comando deverá ser executado no prompt de comando com o utilitário
Proenv.
Sintaxe
proDebugEnable {-disable-all|-enable-all}
Exemplo
ProDebugEnable –enable-all
Anotações
O objeto Debugger
Para debugarmos um programa manipularemos o objeto Debugger.
DEBUGGER:INITIATE().
Estando o Debugger iniciado basta adicionarmos os pontos de parada no programa com o comando
Debugger:Set-break().
DEBUGGER:SET-BREAK().
Exemplo
debug = DEBUGGER:CLEAR().
Anotações
Neo Step
Todos os Direitos Reservados 17
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
1. Debug o programa abaixo.
DEBUGGER:INITIATE().
DEBUGGER:SET-BREAK().
1 DISP icont.
4 DISP icont.
PROCEDURE retornarValor:
DEFINE INPUT PARAMETER valor AS INTEGER NO-UNDO.
3 DISP valor.
END.
Utilizando a opção Add Watch (botão direito) sobre as variáveis icont e valor anote os valores nos
pontos:
1.
2.
3.
4.
DEBUGGER:INITIATE().
DEBUGGER:SET-BREAK().
Neo Step
Todos os Direitos Reservados 18
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
END.
Utilizando a página Buffers, selecione o buffer Customer e visualize os valores dos campos com a opção
Dataview.
DEBUGGER:INITIATE().
DEBUGGER:SET-BREAK().
END.
Utilizando as páginas Buffers e Variables anote os números e datas e dos pedidos (Order) dos clientes 5
(Match Point Tennis), 7 (Aerobics Valine Ky) e 8 (Game Set Match).
Aerobics Valine Ky
Neo Step
Todos os Direitos Reservados 19
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Principais objetos:
Sintaxe
FOCUS [ :attribute ]
Exemplo de Focus
Construa uma janela com alguns objetos
ON 'ctrl-j':U ANYWHERE
Neo Step
Todos os Direitos Reservados 20
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
DO:
MESSAGE
"nome widget:" FOCUS:NAME SKIP
"tipo do widget:" FOCUS:TYPE SKIP
"nome da frame:" hframe:NAME SKIP
"titulo da janela:" hwindow:TITLE
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
Este código mostrará o nome do objeto focado, o tipo, o nome da frame, o título da janela.
Execute o programa e pressione CTRL-J e deverá aparecer a mensagem abaixo se o botão 1 estiver
selecionado.
ON 'ctrl-j':U ANYWHERE
DO:
Neo Step
Todos os Direitos Reservados 21
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
hobjeto = hobjeto:NEXT-SIBLING.
END.
END.
Anotações
Sintaxe
CLIPBOARD [ :attribute ]
Com este objeto você pode copiar ou gravar informações na área de transferência do Windows.
Exemplo
MESSAGE clipboard:value
VIEW-AS ALERT-BOX INFO BUTTONS OK.
Anotações
Neo Step
Todos os Direitos Reservados 22
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Sintaxe
Exemplo de This-Procedure
Construa uma janela e adicione o código abaixo
MESSAGE
'Procedures internas='
THIS-PROCEDURE:INTERNAL-ENTRIES SKIP
'Persistent?' THIS-PROCEDURE:PERSISTENT SKIP
'Tipo=' THIS-PROCEDURE:TYPE SKIP
'Bancos do programa=' THIS-PROCEDURE:DB-REFERENCES
VIEW-AS ALERT-BOX INFO BUTTONS OK.
MESSAGE
'Procedures internas=' hprograma:INTERNAL-ENTRIES SKIP
'Persistent?' hprograma:PERSISTENT SKIP
'Tipo=' hprograma:TYPE SKIP
'Bancos do programa=' hprograma:DB-REFERENCES
VIEW-AS ALERT-BOX INFO BUTTONS OK.
PROCEDURE procedure-interna :
/*---------------------------------------------------------------------
---------
Purpose:
Parameters: <none>
Notes:
-----------------------------------------------------------------------
-------*/
DEFINE INPUT PARAMETER p1 AS CHARACTER NO-UNDO.
DEFINE INPUT-OUTPUT PARAMETER p2 AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER p3 AS DECIMAL NO-UNDO.
DEFINE OUTPUT PARAMETER p4 AS DATE NO-UNDO.
END PROCEDURE.
Neo Step
Todos os Direitos Reservados 23
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
MESSAGE
'Procedures internas=' THIS-PROCEDURE:INTERNAL-ENTRIES SKIP
'Persistent?' THIS-PROCEDURE:PERSISTENT SKIP
'Tipo=' THIS-PROCEDURE:TYPE SKIP
'Bancos do programa=' THIS-PROCEDURE:DB-REFERENCES SKIP
'Assinatura procedure-interna=' THIS-PROCEDURE:GET-SIGNATURE('procedure-
interna')
VIEW-AS ALERT-BOX INFO BUTTONS OK.
Exibirá esta mensagem
Para mais detalhes sobre THIS-PROCEDURE procure por Procedure object handle.
Anotações
Sintaxe
Neo Step
Todos os Direitos Reservados 24
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Limpando o log
log-manager:clear-log().
A limpeza do Log, através do método CLEAR-LOG não funciona para AppServer e WebSpeed.
Anotações
Anotações
Sintaxe
Exemplo
PAUSE 0 BEFORE-HIDE.
DEBUGGER:INITIATE().
DEBUGGER:SET-BREAK().
END.
Utilize os botões Step Into, Step Over e Step Out para continuar a execução do programa.
Use as abas Variables, Buffers, Parameters, Temp-tables e Dataset para verificar o conteúdo de cada tipo de
objeto.
Anotações
Sintaxe
Exemplo
IF ERROR-STATUS:ERROR THEN
DO:
MESSAGE
"Mensagem: " ERROR-STATUS:GET-MESSAGE(1) SKIP
"Numero de erros: " ERROR-STATUS:NUM-MESSAGES SKIP
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
Neo Step
Todos os Direitos Reservados 26
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
Sintaxe
FILE-INFO [ :attribute ]
Exemplo
FILE-INFO:FILE-NAME = "c:\temp".
MESSAGE
"Tipo: " FILE-INFO:FILE-TYPE SKIP
FILE-INFO:FILE-NAME = 'gui/_dict.r'.
MESSAGE
"Tipo: " FILE-INFO:FILE-TYPE SKIP
"Caminho completo: " FILE-INFO:FULL-PATHNAME
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
O atributo File-type retornará D para pastas e F para arquivos, R para arquivo acessível e W para arquivo ou
pasta com permissão para gravar.
Anotações
Sintaxe
Neo Step
Todos os Direitos Reservados 27
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
• DEBUG-ALERT, deve apresentar o botão HELP na mensagem de erro, para exibir a janela com a pilha
de programas executados.
• DISPLAY-TYPE , indica se o tipo de exibição é gráfico (GUI) ou caractere (TTY),
• NUMERIC-DECIMAL-POINT, indica o caractere utilizado para a formatação de número decimal,
• WORK-AREA-WIDTH-PIXELS, indica a largura da área disponível do desktop Windows que não está
escondida pelas barras do sistema.
• WORK-AREA-HEIGHT-PIXELS, indica a altura da área disponível do desktop Windows que não está
escondida pelas barras do sistema.
Anotações
Com este handle podemos referenciar os atributos de cada tipo de objeto, vale lembrar que diferentes
objetos possuem diferentes métodos e atributos.
Neo Step
Todos os Direitos Reservados 28
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Neo Step
Todos os Direitos Reservados 29
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Operadores
Lista de operadores da linguagem.
Operador Descrição
+ Adição
- Subtração
* Multiplicação
/ Divisão
= Igualdade
<> Desigualdade
> Maior que
< Menor que
>= Maior ou igual que
<= Menor ou igual que
AND E
OR OU
NOT NOT
BEGINS Compara o início das letras de duas expressões
MATCHES Compara duas STRINGS
GT Maior que
GE Maior ou igual que
LT Menor que
LE Menor ou igual que
Modulo Retornar o resto da divisão
No Progress ABL não há frescura de outras linguagens e você pode somar, dividir, multiplicar, subtrair e
outras operações com números inteiros, inteiros de 64 bits e decimais sem perda de valores ou erros de
ponto flutuante.
Então somar decimais com inteiros, ou dividir tipos numéricos diferentes não tem problema!
Anotações
Neo Step
Todos os Direitos Reservados 30
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara OPER_<número do exercício>.P (oper_1.p, oper_2.p).
1. Declare duas variáveis do tipo inteiro, faça a somatória e exiba os valores delas (Instrutor).
2. Declare três variáveis caracter para armazenar nome, sobrenome e nome completo, concatene-as e
exiba o valor resultante. Uma variável receberá a soma das outras duas.
3. Faça a somatória de duas variáveis decimais.
4. Utilizando o segundo exercício, faça a concatenação do seu nome completo com a sua idade, utilize
a função String para converter valores para caracter antes de unir nome completo e idade.
5. Some a raiz quadrada de 2 com a raiz quadrada de 3 em uma variável decimal, exibindo este valor.
Utilize a função SQRT.
6. Utilizando o quinto exercício, melhore-o para exibir o valor da soma com 5 casas decimais.
7. Usando três variáveis, obtenha a razão do seu peso pelo quadrado da sua altura.
8. Usando a função MODULO obtenha o resultado da divisão de 3 por 2.
Neo Step
Todos os Direitos Reservados 31
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Segmentos
Database
É onde estão os valores dos campos das tabelas, no banco de dados, quando fazemos um FIND o Progress ao
encontrar o registro, o transfere para o Record Buffer.
Record Buffer
É uma área da memória onde o programador pode fazer a manipulação do valor real de um campo de tabela
ou de uma variável.
Screen Buffer
É o valor da variável que é exibido ao usuário.
Instruções de transferência
Temos muitas instruções que transferem os valores entre os vários buffers.
Instrução Descrição
FIND Localizar um registro no banco de dados (Database) e disponibilizá-lo no Record
buffer.
Update É uma instrução complexa, formada pelos comandos Display, Prompt-For e Assign.
A principal função é exibir o valor da variável ou campo, habilitar para o usuário
digitar valor e atribuir do Screen-buffer para o Record Buffer.
Display Transferir o valor, do campo ou variável, que está no Record Buffer para o Screen-
buffer, em outras palavras, exibir o valor da variável.
Neo Step
Todos os Direitos Reservados 32
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Neo Step
Todos os Direitos Reservados 33
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
A linguagem ABL disponibiliza um ponteiro por tabela e em algumas situações poderemos necessitar
localizar mais de um registro na tabela pesquisada, para esta situação a utilização de Buffers é obrigatória.
Sintaxe Buffer
Exemplo
/* buffer */
END.
Exemplo de Buffer com passagem de parâmetro
PROCEDURE receberBuffer:
DEFINE PARAM BUFFER buf-customer FOR customer.
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
REPEAT :
UPDATE codigo.
END.
Exemplo de buffer com atualização de dados
PROCEDURE receberBuffer:
DEFINE PARAMETER BUFFER buf-customer FOR customer.
DISPLAY buf-customer.custnum.
UPDATE
buf-customer.NAME
buf-customer.address
WITH 1 COL.
END.
REPEAT :
UPDATE codigo.
END.
35
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
/* explicito = declarado */
DEFINE BUFFER buf-customer FOR customer.
DISP buf-customer
EXCEPT buf-customer.comments
WITH 2 COL.
END.
Tabelas temporárias
São Tabelas que podem armazenar temporariamente grande volumes de dados, esses registros de tabelas
temporárias existem somente durante a execução de programas, podem conter índices e demais
características de uma tabela (buffer implícito ou explicito), não disparam qualquer gatilho ou e também não
geram transação.
Quanto a sua estrutura, podem ser imagens de tabelas do banco, com campos e índices, podem-se adicionar
novos campos ou ainda podem ser totalmente novas (campos e índices).
Sintaxe temp-table
36
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exemplo de Temp-Table
*AO ADICIONAR NOVO ÍNDICE EM UMA TEMP-TABLE NENHUM ÍNDICE SERÁ HERDADO DA TABELA ORIGEM.
Exemplo de Temp-table
CREATE ttCustomer.
UPDATE ttcustomer
WITH
1 COL
WIDTH 222.
Exemplo de Temp-table com índices
/* like de outra TT */
DEFINE TEMP-TABLE ttCustomerEx LIKE ttCustomer.
INDEX
ix_codigo AS UNIQUE AS PRIMARY
codigo
INDEX
37
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
ix_nome
nome.
CREATE ttCustomer3.
UPDATE ttcustomer3
WITH
1 COL
SIZE 122 BY 8.
*Neste exemplo nenhum índice da tabela Customer será copiada para a temp-table ttCustomer2 pois houve
criação de índice nesta temp-table, já na ttCustomer todos os índices da tabela Customer serão usados.
CREATE ttCustomer.
/*
BUFFER-COPY source [ { EXCEPT | USING } field ... ] TO target [ ASSIGN
assign-expression ... ] [ NO-LOBS ] [ NO-ERROR ]
*/
BUFFER-COPY customer
TO ttCustomer
ASSIGN ttCustomer.codigo = customer.custnum.
END.
PAUSE.
Exemplo de Temp-table com erro 229 - ** Could not find Index <index-name> in table <table>. (229), pois
declaramos um índice na Temp-table, nenhum índice da tabela Customer será incluído, mas forçamos o uso
do índice ContryPost da tabela Customer.
38
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
CREATE ttCustomer.
/*
BUFFER-COPY source [ { EXCEPT | USING } field ... ] TO target [ ASSIGN
assign-expression ... ] [ NO-LOBS ] [ NO-ERROR ]
*/
BUFFER-COPY customer
TO ttCustomer
ASSIGN ttCustomer.codigo = customer.custnum.
END.
PAUSE.
/*
** Could not find Index CountryPost in table ttCustomer. (229)
** Nao entendi a linha 24. (196)
A linguagem progress ABL nao copia nenhum indice da tabela do banco para a
TT
*/
Datasets
São objetos com uma ou um conjunto de tabelas temporárias, que utilizam um data-source para acessar os
registros no banco de dados através de objetos queries ou através de buffers.
Estes objetos Datasets precisam de tabelas temporárias, e cada uma destas tabelas temporárias precisa de
um data-source para poder carregar seus registros.
39
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
As tabelas temporárias de um dataset também podem salvar suas alterações nas tabelas das quais foram
carregadas.
Sintaxe do Dataset
DEFINE {[[ NEW ] SHARED ]|[ PRIVATE | PROTECTED ] [ STATIC ][
SERIALIZABLE ]}
DATASET dataset-name
[ NAMESPACE-URI namespace][ NAMESPACE-PREFIX prefix]
[ XML-NODE-NAME node-name][ SERIALIZE-NAME serialize-name ]
[ XML-NODE-TYPE node-type ][ SERIALIZE-HIDDEN ][ REFERENCE-ONLY ]
FOR buffer-name [ , buffer-name]...
[ DATA-RELATION [data-rel-name ] FOR data-rel-spec ]...
[ PARENT-ID-RELATION [data-rel-name] FOR parent-id-rel-spec]...
À primeira vista o objeto Dataset é complexo, mas vamos detalhar suas opções e incrementar a sua
complexidade em cada exemplo.
Sintaxe do Datasource
DEFINE [ PRIVATE | PROTECTED ] [ STATIC ] DATA-SOURCE data-source-name
FOR [ QUERY query-name]
[source-buffer-phrase[ , source-buffer-phrase]...]
40
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
DATASET dts-customer:FILL().
/* carregar o dataset */
DATASET dts-item:FILL().
Anotações
41
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
42
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara BF_TT_<número do exercício>.P (BF_TT_1.p,
BF_TT_2.p).
1. Crie uma tabela temporária cópia da tabela customer, copie os dados para esta tabela, exibindo-os
com o For each.
2. Com o For each e Buffer, mostre os campos da tabela pedidos (Order).
3. Crie uma tabela temporária cópia da tabela customer, copie os dados para esta tabela, exibindo-os
com o For each. Localize todos pedidos dos clientes na tabela temporária.
4. Crie uma tabela temporária cópia da tabela customer,
a. Crie um novo índice para o campo custnum.
b. Copie os dados para esta tabela, exibindo-os com o For each e com o uso da cláusula “use-
index Name”.
c. Ocorre erro? Qual? Por quê? Quais as possíveis soluções?
5. No capítulo Importação e Exportação, no quinto exercício, exportamos um arquivo da tabela
salesrep,
a. Crie uma tabela temporária cópia da tabela salesrep, use Like e No-undo,
b. Importe os dados do arquivo para a tabela temporária,
c. Utilize For each para listar os registros importados na tabela temporária.
6. A partir do quinto exercício, substitua a instrução For Each por Open Query, Get e Repeat, exibindo
os registros de forma indistinta ao quinto exercício.
43
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Instrução Create
A instrução Create cria um registro em uma tabela, seja esta uma tabela de banco de dados ou uma tabela
temporária (temp-table, atribui aos campos seus valores iniciais e move o registro para a área de Record
Buffer.
Sintaxe
CREATE record
[ USING { ROWID ( nrow ) | RECID ( nrec ) } ] [ NO-ERROR ]
Exemplo
REPEAT:
CREATE Order.
UPDATE Order.OrderNum Order.CustNum
VALIDATE(CAN-FIND(Customer OF Order), "Customer does not
exist")
Order.CustNum Order.OrderDate.
REPEAT:
CREATE OrderLine.
OrderLine.OrderNum = Order.OrderNnum.
UPDATE OrderLine.LineNum OrderLine.ItemNum
VALIDATE(CAN-FIND(Item OF OrderLine), "Item does not
exist")
OrderLine.Qty OrderLine.Price.
END.
END.
Importante: ao executar a instrução de CREATE o gatilho de CREATE é executado em seguida.
Anotações
REPEAT :
UPDATE codigoItem.
44
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
VALIDATE ITEM.
RELEASE ITEM.
END.
ELSE
IF NOT AVAIL ITEM THEN DO:
CREATE ITEM.
UPDATE ITEM
WITH
1 COL
FRAME inserir
THREE-D
TITLE 'Adiçaõ de item'.
VALIDATE ITEM.
RELEASE ITEM.
END.
ELSE
IF LOCKED ITEM THEN DO:
MESSAGE 'Registro ' codigoItem ' em uso por outro usuario'
VIEW-AS ALERT-BOX
ERROR
BUTTONS OK.
END.
END.
Instrução Insert
A instrução Insert é um conjunto de instruções, como Create, Display, Prompt-for e Assign.
Sintaxe
Exemplo
45
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
REPEAT:
INSERT Order WITH 1 COLUMN.
REPEAT:
CREATE OrderLine.
OrderLine.OrderNum = Order.OrderNum.
UPDATE OrderLine.LineNum OrderLine.ItemNum OrderLine.Qty
OrderLine.Price.
/* Verify the ItemNum by finding an Item with that number */
FIND Item OF OrderLine.
END.
END.
Importante: Ao executar a instrução de INSERT o gatilho de CREATE é executado.
Anotações
Instrução de Assign
Utilize esta instrução Assign para atribuir a um campo, ou a vários campos de tabelas o valor desejado. Antes
do término da transação o gatilho de WRITE será executado, e estes valores atribuídos serão gravados no
banco quando a transação chegar ao fim, o término da transação pode ser o END de um DO TRANSACTION,
ou de um REPEAT ou de um FOR EACH, dependendo do escopo desta transação.
Instrucao de Update também pode ser utilizada, assim como somente o uso do operador igual “=”
Sintaxe
Exemplo
ASSIGN
NOME = Salesrep.RepName.
UPDATE nome.
ASSIGN
Salesrep.RepName = nome.
DISPLAY
46
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
customer.custnum
customer.name.
UPDATE
Customer.CreditLimit.
END.
END.
Instrução Delete
Elimina o registro do Record Buffer e do banco de dados.
Sintaxe
DELETE record
[ VALIDATE ( condition , msg-expression ) ]
[ NO-ERROR ]
Exemplo
Anotações
Importante
• Eliminando registros não diminui o tamanho do banco de dados, somente com Dump e Load,
• Se há gatilhos de Delete estas são executadas antes do registro ser eliminado,
o Se ocorrer erro durante a execução da Trigger de Delete ou esta retornar a instrução
“Return ERROR”, o registro não é eliminado.
• Se há validação “Validate” na instrução de Delete e Trigger de Delete, a validação é executada antes
da Trigger.
47
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara INSDEL_<número do exercício>.P (INSDEL _1.p, INSDEL
_2.p).
1. Utilizando a instrução Create e Update dentro de um Repeat, crie novos registros para a tabela
Customer, o usuário deverá preencher os campos Customer.Name e Customer.SalesRep (BBB, DKP,
DOS, GPE, HXM, JAL, KIK, RDR, SLS são valores válidos para o campo SalesRep),
2. Crie um programa que contenha uma Frame para a entrada de dados, conforme a imagem abaixo.
Adicione variável LIKE customer.custnum, em um Repeat leia o código do cliente e localize-o com o
código informado (find com no-lock) e exiba o nome do cliente na Frame (customer.name).
Verifique se o registro existe (If avail) e com um bloco de Do Transaction use o find current, faça um
exclusive-lock.
Questione o usuário sobre eliminar o registro localizado, conforme a imagem abaixo, se confirmar a
eliminação, remova-o.
3. A partir do segundo exercício, adicione tratamento, se ocorrer erro de Delete Customer, retorne ao
bloco do Repeat. Use opção On Error.
4. A partir do segundo exercício, adicione tratamento para retornar ao Repeat se ocorrer erro de
Delete Customer, use Catch.
5. Crie um programa para,
a. Solicitar um número de cliente (customer.custnum), utilize like,
b. Tente localizar o número do cliente que foi infomado,
i. Se não localizou, informe ao usuário que o registro não existe,
1. Crie um novo, utilize Create e Update.
ii. Se for encontrado, pergunte ao usuário se deseja eliminar,
1. Se confirmado, elimine o registro, utilize Delete.
48
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Tanto o comando Find, Get e o For, e suas variantes find first, find next e for first, são utilizados para
posicionar o ponteiro em um registro disponibilizando-o para leitura, alteração e eliminação. Para as queries
utilize Get First, Get Next, Get Prev, Get Last, Get Current.
Instrução For
Inicia uma iteração com um novo bloco que lê registros de uma ou mais tabelas, permite adicionar cláusulas
where para filtrar registros, implicitamente cria um novo bloco no programa, este possui tratamento de erro
e escopo de frame, se encerra com o uso da instrução END.
Transferência de Dados
Abaixo está a movimentação de dados que a instrução FOR realiza, trazendo dados do banco de dados para
o RECORD BUFFER.
Estando os dados no RECORD BUFFER, instruções de DELETE, ASSIGN ou DISPLAY poderão trabalhar com os
valores dos campos.
49
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
For each
Para grande volume de dados com pesquisa ascendente ou descendente de forma sequencial.
Find First
Para localizar um único registro para alterar ou eliminar.
Open Query
Para grande volume de dados com pesquisa ascendente ou descendente de forma aleatória, exemplo,
localizar o primeiro registro, o último, o próximo, o penúltimo, o anterior.
[ label: ]
FOR [ EACH | FIRST | LAST ] record-phrase
[ , [ EACH | FIRST | LAST ] record-phrase ] ...
[ query-tuning-phrase ]
[ BREAK ]
[ BY expression [ DESCENDING ]
| COLLATE ( string , strength [ , collation ] ) [ DESCENDING ]
50
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
] ...
[ variable = expression1 TO expression2 [ BY k ] ]
[ WHILE expression ]
[ TRANSACTION ]
[ on-error-phrase ]
[ on-endkey-phrase ]
[ on-quit-phrase ]
[ on-stop-phrase ]
[ frame-phrase ] :
for-body
51
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
de pressionamento de
tecla ESC no bloco.
On Stop Para realizar a
sobrecarga do
tratamento padrão de
STOP ao bloco.
Frame-phrase O cabeçalho da
instrução de FOR pode
ter opções do FRAME a
ser usado no bloco.
{ record [ field-list ] }
[ constant ]
[ [ LEFT ] OUTER-JOIN ]
[ OF table ]
[ WHERE expression ]
[ USE-INDEX index ]
[ USING [ FRAME frame ] field
[ AND [ FRAME frame ] field ] ... ]
[ SHARE-LOCK | EXCLUSIVE-LOCK | NO-LOCK ]
[ NO-PREFETCH ]
52
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
Anotações
53
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
/* clientes de 5 até 10 */
FOR EACH customer NO-LOCK
WHERE customer.custnum >= 5
AND customer.custnum <= 10
BY customer.NAME:
DISPLAY
customer.custnum
customer.NAME.
/* pedidos do cliente */
FOR EACH order NO-LOCK
WHERE order.custnum = customer.custnum:
DISPLAY
order.ordernum
order.orderdate.
DISPLAY
orderline.itemnum
orderline.qty.
END.
END.
END.
Anotações
54
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
BY customer.NAME:
DISPLAY
customer.custnum
customer.NAME
order.ordernum
order.orderdate
orderline.itemnum
orderline.qty
WITH STREAM-IO.
END.
BY customer.NAME:
DISPLAY
customer.custnum
customer.NAME
order.ordernum
order.orderdate
orderline.itemnum
orderline.qty
WITH STREAM-IO.
END.
55
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
END.
Anotações
Instrução Find
Localiza um único registro de uma tabela e o move para a área de record buffer. Deve ser usado para
alteração ou eliminação de registro.
Sintaxe find
e…
A instrução Find não permite pesquisas com mais de uma tabela como o For Each e a Query.
Movimentação de registro
56
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
57
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
58
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Instrução Get
Disponibiliza um registro no record buffer de uma query, mas deve ser usada com a Open Query.
Sintaxe Get
A instrução GET pode realizar o lock de um registro, mas se não for especificado nenhum, este utilizará o
mesmo lock utilizado na instrução OPEN QUERY.
Exemplo
Open Query
Abre uma query que pode ter sido definida, disponibilizando os registros desta consulta através da instrução
GET.
59
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
[ BY expression [ DESCENDING ]
| COLLATE ( string , strength [ , collation ] ) [ DESCENDING ]
] ...
[ INDEXED-REPOSITION ]
[ MAX-ROWS num-results ]
record
[[ LEFT ]] [ OF table ]
[ WHERE expression ]
[ USING [ FRAME frame ] field
[ AND [ FRAME frame ] field ] ... ]
[ USE-INDEX index ]
[ SHARE-LOCK | EXCLUSIVE-LOCK | NO-LOCK ]
[ NO-PREFETCH ]
QUERY-TUNING
(
[ LOOKAHEAD [ CACHE-SIZE integer ] | NO-LOOKAHEAD ]
[ DEBUG { SQL | EXTENDED } | NO-DEBUG ]
[ SEPARATE-CONNECTION | NO-SEPARATE-CONNECTION ]
[ JOIN-BY-SQLDB | NO-JOIN-BY-SQLDB ]
[ BIND-WHERE | NO-BIND-WHERE ]
[ INDEX-HINT | NO-INDEX-HINT ]
)
Exemplo
DO WHILE AVAILABLE(customer):
DISPLAY customer.cust-num
customer.name SKIP
customer.phone SKIP
60
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
DISPLAY
Salesrep.SalesRep
Salesrep.RepName
Salesrep.Region
WITH
TITLE 'Lista de representantes'
FRAME frameSalesRep.
DISPLAY
Customer.CustNum
Customer.Name
Customer.Phone
WITH
1 COL
TITLE 'Clientes do representante'.
61
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
DISPLAY
Item.Itemnum
Item.ItemName
Item.Price.
Sintaxe can-find
CAN-FIND
(
[ FIRST | LAST ] record [ constant ]
[ OF table ] [ WHERE expression ] [ USE-INDEX index ]
[ USING [ FRAME frame ] field
[ AND [ FRAME frame ] field ] ...
]
[ SHARE-LOCK | NO-LOCK ] [ NO-WAIT ] [ NO-PREFETCH ]
)
Exemplo
DISPLAY NAME.
END.
Anotações
Locks de registros
A linguagem possui três formas de “acessar” o registro durante o Find, For e Get:
• Exclusive-lock,
• Share-lock,
• No-lock,
Exclusive-lock
Acessa o registro em modo exclusivo, não permitindo que outros usuários acessem em modo exclusivo
(concorrente exclusive-lock ou share-lock). Permitindo eliminar, alterar e visualizar.
62
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Share-lock
Acessa o registro em modo não exclusivo, permitindo que o “lock” evolua para Exclusive-lock caso ocorra
alteração no bloco corrente. Não utilize com Oracle, pois além do Oracle não ter o Share-lock real, forçara a
linguagem a encontrar o mesmo registro duas vezes.
No-lock
Acessa o registro sem travar o registro, mesmo que outro usuário esteja com Exclusive-lock, e não permite a
alteração. Use sempre que não for realizar alterações.
Anotações
REPEAT:
UPDATE codigo.
63
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara FND_FRE_<número do exercício>.P (FND_FRE_1.p,
FND_FRE_2.p).
64
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
65
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
66
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
67
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
68
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
69
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
10. Solicitar o numero do item e mostrar os pedidos, data do pedido, nome do cliente
e nome do vendedor que este item se encontra.
Usar Like, repeat, update, for each, display e first
Tabelas orderline, order, customer e salesrep
Exibir Order.Ordernum Order.CustNum customer.NAME Order.OrderDate
Order.SalesRep salesrep.repNAME
70
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
71
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
72
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
13. Solicitar duas datas de pedidos aos usuarios e exibir os campos pedidos entre
estas datas Order.OrderDate Order.Ordernum Order.OrderStatus Order.CustNum.
Usar like, repeat, update, for each e display
tabela order
As datas dos pedidos estao entre os meses de setembro de 1997 e março de 1998
73
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
15. Localizar todos os pedidos, para cada pedido mostrar o total deste, exibir tambem
o nome do cliente e as linhas dos pedidos
Usar for each, first customer, for each orderline
74
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
16. Localizar todos os pedidos, para cada pedido mostrar o total deste, exibir tambem
o nome do cliente e as linhas dos pedidos
Usar for each, first customer, for each orderline
usar a opcao TOTAL para a quantidade e para o campo OrderLine.ExtendedPrice,
proibido o uso de variaveis para acumular
75
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
2. A partir do primeiro exercício, crie mais uma query para listar os pedidos do cliente, use clausulas
where para realizar a junção entre as duas tabelas.
76
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
3. A partir do segundo exercício, crie uma alteração para listar as linhas do pedido em uma outra
frame, listando linenum, itemnum, qty, price e extentedprice. Use clausula where para realizar a
junção entre as tabelas.
77
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
5. A partir do quarto exercício, exiba o total do campo extendedprice, das linhas do pedido, na frame
da order, como segue abaixo.
6. A partir do quinto exercício, conte a quantidade de pedidos e exiba esta contagem na frame do
cliente, conforme abaixo.
78
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
79
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Como são programas Progress ABL, eles devem estar visíveis pelo PROPATH, ou então exceções ocorrerão e
isso não queremos.
Na camada Progress ABL há gatilhos para Create, Delete, Find, Write, Replication-create, Replication-delete
e Replication-write:
Create
Quando ocorre a criação de registro em uma tabela através da instrução Create, Insert ou do método de
Buffer-Create.
Delete
Quando ocorre a eliminação do registro, seja pela instrução Delete ou pelo método Buffer-Delete.
Find
Quando um registro da tabela é lido pelo gerenciador do banco de dados disparado pelo FIND ou FOR EACH
Write
Ocorre quando um registro é validado no banco de dados, seja pela instrução VALIDATE, RELEASE ou
BUFFER-VALIDADE e ou BUFFER-RELEASE.
Replication-create
Quando ocorre a criação do registro através do Create, Insert ou do método Buffer-Create e após a gravação
no log de alteração. Para facilitar, após a execução do gatilho de Create.
Replication-delete
Quando ocorre a eliminação do registro, seja pelo uso do Delete ou pelo Buffer-Delete, e ao gravar a
informação no log de alteração. Após a execução do gatilho de Delete.
Replication-write
Após a efetivação da gravação do registro e da gravação do log de alteração. Após a execução do gatilho de
Write.
Sintaxe
Tipos de variáveis
CHARACTER | COM-HANDLE | DATE | DATETIME | DATETIME-TZ | DECIMAL
| HANDLE | INT64 | INTEGER | LOGICAL | LONGCHAR | MEMPTR | RAW | RECID* |
ROWID
Exemplos
DEFINE VARIABLE CONTADOR AS INTEGER NO-UNDO.
DEFINE VARIABLE NOME AS CHARACTER NO-UNDO.
DEFINE VARIABLE TEXTO_LONGO AS LONGCHAR NO-UNDO.
DEFINE VARIABLE DIA-HOJE AS DATE NO-UNDO.
DEFINE VARIABLE AGORA AS DATETIME NO-UNDO.
DEFINE VARIABLE VALOR_REAL AS DECIMAL NO-UNDO.
DEFINE VARIABLE INTEIRO_LONGO AS INT64 NO-UNDO.
DEFINE VARIABLE ESCOLHA AS LOGICAL NO-UNDO.
82
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
LABEL 'Sequencia'
FORMAT '9,999,999'.
DEFINE VARIABLE VALOR_MOEDA AS DECIMAL NO-UNDO
LABEL 'Moeda'
FORMAT 'R$ >>>,>>>,>>9.99'.
DEFINE VARIABLE VERDADEIRO AS LOGICAL NO-UNDO
LABEL 'Verdadeiro'
FORMAT 'Verdadeiro/Falso'.
DEFINE VARIABLE ESTADO_PORTA AS LOGICAL NO-UNDO
LABEL 'Estado da Porta'
FORMAT 'Aberta/Fechada'.
DEFINE VARIABLE ASTERISCO AS LOGICAL NO-UNDO
LABEL 'Marcado?'
FORMAT '*/'.
Anotações
Rótulos
Variáveis em linguagem ABL têm rótulos que são exibidos aos usuários:
Exemplo do LABEL
Resultando em:
Exemplo do COLUMN-LABEL
83
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
DISP credit-percent.
Resultando em:
Anotações
Formato padrão
A linguagem ABL utiliza formatos para exibir os valores de campos de banco de dados, tabelas temporárias e
variáveis. Esta formatação pode-se manipulada tanto na declaração de uma Frame quanto durante o Display
desta.
Importante: O formato não altera a quantidade de dados que podem ser armazenados em uma variável.
Mesmo uma variável inteira com o formato ‘99’ ainda pode armazenar o valor inteiro de 32 Bits.
BLOB Não pode ser exibido com Display diretamente, somente com
conversão.
CHARACTER X(8)
CLOB Não pode ser exibido com Display diretamente, somente com
conversão.
COM-HANDLE >>>>>>9
DATE 99/99/99
DATETIME 99/99/9999 HH:MM:SS.SSS
DATETIME-TZ 99/99/9999 HH:MM:SS.SSS+HH:MM
DECIMAL ->>,>>9.99
HANDLE >>>>>>9
INT64 ->,>>>,>>9
INTEGER ->,>>>,>>9
LOGICAL yes/no
LONGCHAR Não pode ser exibido com Display diretamente, somente com
conversão.
84
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
MEMPTR Não pode ser exibido com Display diretamente, somente com
conversão.
RAW Não pode ser exibido com Display diretamente, somente com
conversão.
RECID >>>>>>9
ROWID Não pode ser exibido com Display diretamente, somente com
conversão.
Anotações
Valores iniciais
Variáveis podem ter valores iniciais, basta atribuir um valor para a opção INITIAL.
DISP credit-percent.
Anotações
85
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
DISP credit-percent.
Para exibir somente um valor da variável com vetor, informe o índice do vetor entre [].
DISP credit-percent[3].
Anotações
86
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Opção No-Undo
A opção no-undo informa à ABL que a variável ou temp-table não precisa ter seu valor armazenado se ela
fizer parte de um bloco em transação ou tenha seu valor desfeito quando esta transação também for
desfeita.
Anotações
Algumas visualizações permitem todos os tipos de variáveis, outros somente tipos inteiros.
VIEW-AS COMBO-BOX
[ LIST-ITEMS item-list | LIST-ITEM-PAIRS item-pair-list ]
[ INNER-LINES lines ] [ size-phrase ] [ SORT ]
[ TOOLTIP tooltip ]
[ SIMPLE | DROP-DOWN | DROP-DOWN-LIST ]
[ MAX-CHARS characters ]
[ AUTO-COMPLETION [ UNIQUE-MATCH ] ]
EDITOR
{ size-phrase
87
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
RADIO-SET
[ HORIZONTAL [ EXPAND ] | VERTICAL ]
[ size-phrase ]
RADIO-BUTTONS label , value [ , label, value ... ]
[ TOOLTIP tooltip ]
SELECTION-LIST
[ SINGLE | MULTIPLE ]
[ NO-DRAG ]
[ LIST-ITEMS item-list ]
[ SCROLLBAR-HORIZONTAL ]
[ SCROLLBAR-VERTICAL ]
{ size-phrase | INNER-CHARS cols INNER-LINES rows }
[ SORT ]
[ TOOLTIP tooltip ]
VIEW-AS SLIDER
MAX-VALUE max-value MIN-VALUE min-value
[ HORIZONTAL | VERTICAL ]
[ NO-CURRENT-VALUE ]
[ LARGE-TO-SMALL ]
[ TIC-MARKS
88
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exemplo
DEFINE VARIABLE meucombobox
AS CHARACTER
LABEL "Combo"
INITIAL "Joinville"
VIEW-AS COMBO-BOX
LIST-ITEM-PAIRS
"Joinville", "Joinville",
"Itapoa", "Itapoa",
"São Bendo do Sul", "São Bendo do Sul",
"Campo Alegre", "Campo Alegre",
"Curitiba", "Curitiba",
"Barra do Sul", "Barra do Sul"
DROP-DOWN-LIST
AUTO-COMPLETION
INNER-LINES 5
SIZE 30 BY 1.
89
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
UPDATE
meucombobox
meueditor
meuradio
minhaselection
meuslider
meufillinInt
meufillinDec
meufillinDate
meufillinChar
WITH 1 COL.
90
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
91
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
Variáveis e herança
Variáveis podem receber características de outras variáveis, de outros campos de tabelas do banco de
dados, de tabelas temporárias e de objetos, para isso use a opção LIKE.
92
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Alguns atributos podem ser sobrescritos mesmo usando a opção LIKE, como:
• Formato ou FORMAT,
• Rótulo ou LABEL,
• Valor inicial ou INITIAL,
• Casas decimais ou DECIMAL,
• Visualização de variáveis como objetos ou VIEW-AS,
Exemplo
Resultado
Anotações
Exemplo
93
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Resultado
94
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara VAR_<número do exercício>.P (var_1.p, var_2.p).
95
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
• Assign, atribuição de valores em uma única instrução, trazendo os dados do Screen buffer para o
Record buffer.
• Prompt-for, entrada de valores utilizando o Screen-buffer, é uma conjunção de comandos como
Enable, Wait-for e Disable.
• Update, entrada e atribuição de valores com a realização de várias operações como o comando
Display, Prompt-for e Assign.
Instrução Assign
Atribuição de valores em uma única instrução, trazendo os dados do Screen buffer para o Record buffer.
Sintaxe Assign
ASSIGN {
[ [ INPUT ] FRAME frame | BROWSE browse ]
{ field [ = expression ] } [ WHEN expression ]
} ... [ NO-ERROR ]
Exemplo Assign
REPEAT:
PROMPT-FOR Customer.CustNum.
FIND Customer USING Customer.CustNum NO-ERROR.
IF NOT AVAILABLE Customer THEN DO:
CREATE Customer.
ASSIGN Customer.CustNum = 10.
END.
UPDATE Customer WITH 2 COLUMNS.
END.
Anotações
A instrução de Assign também é utilizada para a atribuição de vários valores em uma única instrução com o
uso do igual “=”.
96
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Certo Errado
Assign customer.custnum = 5.
customer.custnum = 5 customer.name = “Jose da
customer.name = “Jose Silva”. Silva”.
Anotações
Instrução de Prompt-for
Entrada de valores utilizando o Screen buffer.
Sintaxe
PROMPT-FOR
[ STREAM stream | STREAM-HANDLE handle ]
[ UNLESS-HIDDEN ]
{ { field
[ format-phrase ]
[ WHEN expression ]
}
| { TEXT ( { field
[ format-phrase ]
[ WHEN expression ]
} ...
)
}
| { constant
[ { AT | TO } n ]
[ VIEW-AS TEXT ]
[ FGCOLOR expression ]
[ BGCOLOR expression ]
[ FONT expression ]
}
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
| SPACE [ ( n ) ] | SKIP [ ( n ) ] | ^
} ...
[ GO-ON ( key-label ... ) ]
[ IN WINDOW window ]
[ frame-phrase ]
[ editing-phrase ]
Exemplo
REPEAT:
PROMPT-FOR Customer.CustNum.
FIND Customer USING Customer.CustNum NO-ERROR.
IF NOT AVAILABLE Customer THEN DO:
MESSAGE "No such customer number.".
UNDO, RETRY.
END.
DISPLAY Customer.Name Customer.Phone Customer.SalesRep.
END.
Anotações
Neste exemplo é utilizada a leitura do “código do cliente” diretamente no campo Customer.Custnum, mas o
valor digitado está armazenado no Screen buffer, não sendo gravada no banco de dados.
Importante: Utilize a função INPUT para atribuir o valor que está no Screen buffer para o Record Buffer.
Exemplo
Assign Input
customer.custnum
customer.name.
Instrução de Update
Entrada e atribuição de valores com a realização de várias operações como o comando Display, Prompt-for e
Assign.
A instrução de Update faz a transferência entre Screen Buffer para Record Buffer automaticamente.
Sintaxe
98
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
UPDATE
[ UNLESS-HIDDEN ]
[ field [ format-phrase ] [ WHEN expression ]
| TEXT ( field [ format-phrase ] ... )
| field = expression
| constant [ AT n | TO n ]
| ^
| SPACE [ ( n ) ]
| SKIP [ ( n )]
] ...
[ GO-ON ( key-label ... ) ]
[ frame-phrase ]
[ editing-phrase ]
[ NO-ERROR ]
Exemplo
Anotações
Importante
• Se algum campo de tabela faz parte da instrução Update, o Lock é primeiramente evoluído para
Exclusive para então atualizar o valor no banco de dados.
• Se somente um qualificador, como o nome de um campo “name”, for utilizado na instrução de
Update, o compilador tenta referenciar o qualificador como dbname.tablename, em caso de falha, o
compilador tenta referenciar tablename.fieldname. Para bancos com muitas tabelas é sugerido
referenciar tablename.fieldname, pois a localização do qualificador tablename.fieldname pode
demorar.
• A instrução de Update faz com que a Trigger de dicionário Assign do campo seja acionada. Se ocorrer
erro durante a execução da Trigger de Assign, a atualização no banco de dados é desfeita.
• Gatilhos de Write são executados em quatro situações:
99
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
REPEAT:
PROMPT-FOR nome.
MESSAGE nome
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
REPEAT:
PROMPT-FOR nome.
ASSIGN INPUT nome.
MESSAGE nome
100
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
A função Input referencia o valor da variável no Screen Buffer, com o comando Assign este valor no Screen
Buffer é transferido para o Record Buffer.
Anotações
101
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercícios
Para a nomenclatura dos exercícios, utilize a máscara ENT_A_<número do exercício>.P (ENT_A_1.p,
ENT_A_2.p).
1. Crie um programa que leia o nome e sobrenome e mostre em uma mensagem os valores digitados,
utilize prompt-for e não esquecer do assign e input.
2. A partir do primeiro exercício substitua os comandos desnecessários pela instrução Update.
102
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Instruções Condicionais
A linguagem possui instruções condicionais IF, THEM e ELSE ou CASE, como a maioria das outras linguagens.
Exemplo
IF A = 1 THEN
DISPLAY "Igual".
ELSE
DISPLAY "Diferente".
Exemplo
IF A = 1 THEN
DO:
DISPLAY "Igual".
MESSAGE "igual"
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
ELSE
DO:
DISPLAY "Diferente".
MESSAGE "diferente"
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
Anotações
Exemplo
UPDATE iniciou.
103
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
ASSIGN
iniciado = IF iniciou THEN
"Verdadeiro"
ELSE
"Falso".
DISPLAY iniciado.
Instrução CASE
A instrução CASE permite condições com ramificações baseadas em valores.
Sintaxe
CASE expression :
{ WHEN value [ OR WHEN value ] ... THEN
{ block | statement }
} ...
[ OTHERWISE
{ block | statement }
]
END [ CASE ]
Exemplo
CASE A:
WHEN 1 THEN
DO:
DISPLAY "Igual a 1".
MESSAGE "igual a 1"
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
WHEN 2 THEN
DO:
DISPLAY "Igual a 2".
MESSAGE "igual a 2"
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
OTHERWISE
DO:
DISPLAY "Nao é 1 ou 2".
MESSAGE "Nao é 1 ou 2"
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
END CASE.
Anotações
104
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercícios
Para a nomenclatura dos exercícios, utilize a máscara INST_<número do exercício>.P (INST_1.p, INST_2.p).
1. A partir de duas variáveis do tipo inteiro e com valores diferentes mostre se a primeira variável é
maior que a segunda (Instrutor).
2. Repita o primeiro exercício, mas usando desta vez o operador GT.
3. Usando variáveis do tipo decimal mostre se a primeira variável é menor que a segunda.
4. Repita o terceiro exercício, mas usando o operador LT.
5. Verifique se a primeira variável do tipo inteira é maior ou igual que a segunda variável decimal.
6. Repita o quinto exercício, mas agora utilize o operador GE.
7. Verifique se a variável nome completo inicia por 'A', utilize o operador BEGINS.
8. Verifique se a variável nome completo não se inicia por 'A'.
9. Com uma variável inteira e utilizando IF mostre se o valor é maior que 1, ou 2, ou 3, utilize IF THEN e
ELSE.
10. Repita o exercício 9, mas utilize a instrução CASE.
105
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Includes
Includes são segmentos de código que são incorporados aos programas durante a compilação.
Podem receber argumentos, que são os equivalentes aos parâmetros nas procedures.
Sintaxe
{nome-arquivo-include.i}
Exemplo
{minhainclude.i}
{minhainclude.i 1 ”JAISON”}
{minhainclude.i
¶metro1=1
¶metro2=”JAISON”}
Anotações
106
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara INC_<número do exercício>.P (INC_1.p, INC_2.p).
1. Criar programa que utilize include com três argumentos, data de hoje, nome completo, data de
nascimento e dentro do arquivo include exiba mensagem com estes dados.
2. Criar programa que utilize include com três argumentos, data de hoje, nome completo, data de
nascimento e dentro do arquivo include exiba mensagem com estes dados, utilize argumentos com
nomes.
107
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Pré-processadores
Pré-processadores são constantes utilizadas na compilação e disponíveis para o programa.
Constantes locais
São as constantes declaradas dentro das includes que não estão disponíveis para o programa que as
incorpora.
Exemplo
&SCOPED-DEFINE minhaconstante 1
Anotações
Constantes Globais
São as constantes declaradas dentro das includes que estão disponíveis para o programa que as incorpora.
Exemplo
&GLOBAL-DEFINE minhaNovaConstante 2
Anotações
108
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Sintaxe
DEFINED ( name )
Exemplo
&GLOBAL-DEFINE minhaNovaConstante 2
Exemplo minhainclude.i
&SCOPED-DEFINE minha1 1
&GLOBAL-DEFINE minha2 2
Exemplo
{minhainclude.i}
Anotações
109
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
&UNDEFINE preprocessor-name
Exemplo
&GLOBAL-DEFINE minhaNovaConstante 2
&UNDEFINE minhaNovaConstante
Anotações
110
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara CT_<número do exercício>.P (CT_1.p, CT_2.p).
1. Criar programa que defina uma constante local com o seu nome e mostre-a em uma mensagem.
2. Criar programa que defina uma constante global com o seu nome, mostre-a em uma mensagem e
elimine a definição.
111
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Frames e Display
São áreas retangulares para a exibição de variáveis e seus valores, campos de tabelas ou para interação com
o usuário.
Sintaxe
Tantos os campos quanto a frame possuem opções, e isto deve-se ser compreendido, são opções segregadas
pois são objetos distintos, algumas opções podem existir em ambos, mas não devem ser confundidas.
Durante os primeiros momentos de aprendizado da linguagem Progress ABL estas opções podem ser
confundidas entre campos e definição de frame.
Os campos possuem Opções dos Campos, conhecido como Form Item options, e ainda contam com a opção
de Formatação, ou Format phrase. Já os frames possuem somente as opções de Frame ou Frame phrase.
Há dois grupos de frames, as de relatórios (em colunas) e as frames para widgets. Esses grupos são distintos
pois suas opções são excludentes.
Frames de relatórios
São os frames padrão e que contém as opções:
down
stream-io
width 128
no-box
1 down
three-d
side-labels
size 80 by 20
{ field [ format-phrase ]
| constant [ at-phrase | { TO n } ]
112
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
[ BGCOLOR expression ]
[ DCOLOR expression ]
[ FGCOLOR expression ]
[ FONT expression ]
[ PFCOLOR expression ]
[ VIEW-AS TEXT ]
[ WIDGET-ID id-number ]
| SPACE [ ( n ) ]
| SKIP [ ( n ) ]
}
[ at-phrase ]
[ AS datatype | LIKE field ]
[ ATTR-SPACE | NO-ATTR-SPACE ]
[ AUTO-RETURN ]
[ BGCOLOR expression ]
[ BLANK ]
[ COLON n | TO n ]
[ COLUMN-LABEL label ]
[ DEBLANK ]
[ DCOLOR expression ]
[ DISABLE-AUTO-ZAP ]
[ FGCOLOR expression ]
[ FONT expression ]
[ FORMAT string ]
[ HELP string ]
[ LABEL label [ , label ] ... | NO-LABELS ]
[ NO-TAB-STOP ]
[ PFCOLOR expression ]
[ VALIDATE ( condition , msg-expression ) ]
113
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
[ view-as-phrase ]
[ WIDGET-ID id-number ]
114
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
115
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Compartilhamento
Frames podem ser compartilhados, entre programas, com o uso de New e ou Shared.
116
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exemplo
Instrução Display
A instrução Display transporta o valor do Record Buffer de uma variável ou registro para o Screen Buffer ou
para outro destino de saída.
Um frame definido com vários campos e variáveis pode ser usada para a instrução display exibir um único
campo ou variável ou para exibir diversos campos e variáveis, neste mesmo frame.
A linguagem Progress ABL permite que você sobrepõe opções de campos, de formatação de campos ou
opções do frame durante a instrução Display. O mais indicado é manter a definição do frame a fim de evitar
janelas com identidades diferentes das definidas.
Sintaxe
DISPLAY
{ [ STREAM stream | STREAM-HANDLE handle ] [ UNLESS-HIDDEN ] }
[ { expression
[ format-phrase ]
[ ( aggregate-phrase ) ]
[ WHEN expression ]
[ @base-field ]
}
| [ SPACE [ ( n ) ] ]
| [ SKIP [ ( n ) ] ]
] ...
{ [ IN WINDOW window ] [ frame-phrase ] [ NO-ERROR ] }
117
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Sintaxe
DISPLAY
{ [ STREAM stream | STREAM-HANDLE handle ] [ UNLESS-HIDDEN ] }
record [ EXCEPT field ... ]
{ [ IN WINDOW window ] [ frame-phrase ] [ NO-ERROR ] }
Sintaxe
DISPLAY
{ expression ...
| record [ EXCEPT field ... ]
}
WITH BROWSE browse [ NO-ERROR ]
Exemplo
WITH SIDE-LABELS
THREE-D
SIZE 30 BY 4
ROW 1 COL 1
TITLE 'Frame A'.
WITH SIDE-LABELS
THREE-D
SIZE 30 BY 4
ROW 1 COL 45
TITLE 'Frame B'.
118
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
WITH SIDE-LABELS
THREE-D
SIZE 30 BY 4
ROW 5.5 COL 1
TITLE 'Frame C'.
DISPLAY
iidade
WITH FRAME frameB.
Frame de relatório
Abaixo está um exemplo completo de programa com frames e opções page-top e page-bottom, com o
funcionamento e exibição de dados com saída para impressora.
ASSIGN
titulo = 'Listagem de clientes'
programa = 'SPP/SPR0004.P'
empresa = 'Neo Step TI Ltda.'.
119
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
WITH
NO-LABELS
STREAM-IO
NO-BOX
/* esta frame sera do tipo page-top */
PAGE-TOP
WIDTH 128.
DISPLAY
customer.custnum
customer.NAME
customer.address
customer.salesrep
salesrep.repname
120
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
END.
OUTPUT CLOSE.
Frames Sobrepostas
Frames podem ser sobrepostas, mas é necessário informar a frame pai que abrigará as demais filhas.
121
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
122
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
123
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara FRM_<número do exercício>.P (FRM_1.p, FRM_2.p).
3. Criar uma frame conforme a figura abaixo, utilize o banco Sports2000 e tabela CUSTOMER.
4. Criar relatório exportando o representante de vendas e seus pedidos, na frame framesalesrep exibir
os campos Salesrep.SalesRep Salesrep.RepName Salesrep.Region, na frame frameOrder exibir os
campos Order.Ordernum, Order.OrderDate, Order.CustNum, Customer.NAME, Order.Creditcard,
Order.ShipDate e Order.Terms. Os frames frameSalesrep e frameOrder deverão ter a opção DOWN.
Todas os frames deverão ter as opções STREAM-IO, NO-BOX e WIDTH 128. A frame frameTOP
conterá cabeçalho e a opção PAGE-TOP, a frame frameBottom terá a opção PAGE-BOTTOM. Utilizar
a instrução OUTPUT conforme “OUTPUT TO c:\temp\spr0018.txt PAGED PAGE-SIZE 60 NO-
CONVERT.” Não esquecendo de fechar o OUTPUT com “OUTPUT CLOSE.”. Para exibir os frames
FrameTop e FrameBottom utilize a instrução “VIEW FRAME frameTop.” e “VIEW FRAME
frameBottom.”. Para realizar a quebra de página a cada representante use a instrução “PAGE” após
o END do FOR ORDER. (Em conjunto com o Instrutor).
124
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Resultado do exercicio.
125
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Eventos são as ações disponíveis para cada tipo de Widget, botões possuem evento de clique, campos de
entrada de texto possuem evento de “ao alterar”, alguns eventos são comuns a vários widgets, outros não.
Tipos de Objetos
Os tipos mais utilizados são:
Anotações
Objetos Estáticos
Os objetos são variáveis com a opção “view-as” ou através da instrução “define” .
Sintaxe
VIEW-AS
{ combo-box-phrase
| editor-phrase
| FILL-IN
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
[ NATIVE ]
[ size-phrase ]
[ TOOLTIP tooltip ]
| radio-set-phrase
| selection-list-phrase
| slider-phrase
| TEXT
[ size-phrase ]
[ TOOLTIP tooltip ]
| TOGGLE-BOX
[ size-phrase ]
[ TOOLTIP tooltip ]
}
Exemplos de Fill-in
VIEW-AS FILL-IN
SIZE 6 BY 1
INITIAL 1986.
127
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
AUTO-COMPLETION
UNIQUE-MATCH
NO-UNDO.
LABEL 'Cidade'
FORMAT 'x(50)'
VIEW-AS COMBO-BOX
LIST-ITEMS 'Joinville','Sao Francisco do Sul','Sao Paulo','Rio de
Janeiro'
INNER-LINES 5
TOOLTIP 'Cidades do Brasil'
DROP-DOWN-LIST
MAX-CHARS 50
NO-UNDO.
UPDATE
Cidades datas idades carros nomes
WITH
1 COL
THREE-D
SIDE-LABELS
SIZE 80 BY 20.
Exemplos de Editor
VIEW-AS EDITOR
INNER-CHARS 40 INNER-LINES 5
NO-WORD-WRAP
SCROLLBAR-HOR
SCROLLBAR-VER
128
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
NO-UNDO.
VIEW-AS EDITOR
SIZE 50 BY 5
MAX-CHARS 70
NO-BOX
NO-WORD-WRAP
SCROLLBAR-HOR
SCROLLBAR-VER
NO-UNDO.
Update
Texto text2.
Exemplo de Radio-set
VIEW-AS RADIO-SET
HORIZONTAL EXPAND
SIZE-PIX
450 BY 70
RADIO-BUTTONS
'B', 30, 'c', 78.90,'M', 39000
NO-UNDO.
Exemplo de Selection-list
VIEW-AS SELECTION-LIST
MULTIPLE
NO-DRAG
LIST-ITEMS 'Janeiro','Fevereiro','Março','Abril'
SCROLLBAR-VERTICAL
INNER-CHARS 20 INNER-LINES 10
INITIAL 'Fevereiro'
NO-UNDO.
Exemplo de Slider
VIEW-AS SLIDER
MAX-VALUE 200 MIN-VALUE 2
VERTICAL
TIC-MARKS LEFT FREQUENCY 15
SIZE 20 BY 10
NO-UNDO.
129
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
Objetos Dinâmicos
Há outra forma de criarmos objetos dinâmicos utilizando a instrução “create widget”, sendo “widget” o tipo
de objeto desejado.
Sintaxe
Exemplo
Anotações
130
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Eventos
Anotações
Códigos de Gatilhos
São as instruções executadas em um determinado evento. Códigos de gatilhos geram novos blocos e
transações.
Podemos aplicar um evento em um outro objeto com a instrução “apply” e parar a execução deste código
com a instrução “return no-apply”.
Anotações
131
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
LABEL "números"
FORMAT '99999'
VIEW-AS FILL-IN
SIZE-PIXELS 70 BY 21.
132
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
MESSAGE fillin1
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
END.
MESSAGE SELF:name
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
/* visualizar a frame */
VIEW FRAME framemain.
/* habilitar alguns ou todos all widgets */
ENABLE ALL WITH FRAME framemain.
/* exibir o valor inicial das variaveis */
DISPLAY
combo1
fillin1
toggle1
radio1
editor1
WITH FRAME framemain.
133
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Anotações
134
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
DISPLAY
WITH FRAME framemain.
PROCEDURE pressionarok:
MESSAGE "ola mundo" SKIP
"valor do fill-in = " hfillin1:SCREEN-VALUE
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
Anotações
135
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
1. Através do uso das opções New Shared e Shared permitido somente entre programa pai e programa
filho (A que executa B),
2. Através da opção New Global Shared, que permite o valor de variáveis e objetos ficar à disposição
enquanto a sessão estiver ativa.
Estes dois formatos permitem compartilhar quase que todos os objetos da linguagem ABL, sejam estas
variáveis, objetos como as frames, queries, browsers, buffers, datasets, menus, streams e tabelas
temporárias.
Exemplo
Exemplo
1 DEFINE
NEW SHARED
VARIABLE nome
AS CHARACTER NO-UNDO
FORMAT 'x(30)'
VIEW-AS FILL-IN
SIZE-PIX 90 BY 21
.
3 UPDATE nome.
4 RUN progSharedB.p.
5 UPDATE nome.
6 END.
Programa ProgSharedA.p
136
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Durante a execução do programa progSharedB.p a variável nome deve ser declarada como Shared,
indicando que o programa pai a criou com a opção New Shared.
7 DEFINE
SHARED
VARIABLE nome
AS CHARACTER NO-UNDO
FORMAT 'x(30)'
VIEW-AS FILL-IN
SIZE-PIX 90 BY 21
.
9 UPDATE nome.
10 END.
Programa ProgSharedB.p
Anotações
O compartilhamento de variáveis e objetos através da opção New Global Shared é bastante diferente da
opção com New Shared, pois não depende que o programa pai crie o compartilhamento da variável através
da opção New Shared e que o programa filho reutilize estes variáveis com a opção Shared.
Anotações
137
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
A tabela abaixo mostra algumas características entre as opções New Shared e New Global
Shared.
Exercícios
Para a nomenclatura dos exercícios, utilize a máscara SHARE_<número do exercício>.P (SHARE
_1.p, SHARE _2.p).
139
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Procedimentos e funções
Procedimento são segmentos de códigos que podem ser internos ou externos, onde estes, externos, podem
ser chamadas à DLLs do Windows ou Bibliotecas Compartilhadas do UNIX, ou chamadas a outros programas
ABL.
Procedimentos internos
São os segmentos internos de códigos ABL que podem ser executados
[ procedure-body ]
PROCEDURE mostrarValor:
DISPLAY "Ola mundo".
END.
PROCEDURE mostrarValor:
DEFINE INPUT PARAMETER Valor AS INTEGER NO-UNDO.
DISPLAY valor.
END.
Anotações
PROCEDURE proc-name
{ EXTERNAL "dllname" [ CDECL | PASCAL | STDCALL ]
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
[ ORDINAL n ] [ PERSISTENT ]
| IN SUPER } :
[ procedure-body ]
Anotações
Passagem de parâmetros
É a passagem de um ou mais valores para um procedimento interno, programa ou função.
Sintaxe
141
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Por valor
[ INPUT ]
{ parm
| { { TABLE temp-table-name
| TABLE-HANDLE temp-table-handle
| DATASET dataset-name
| DATASET-HANDLE dataset-handle
} [ APPEND ] [ BY-VALUE | BY-REFERENCE | BIND ]
}
}
Exemplo
DISPLAY icont.
PAUSE.
DISPLAY icont.
PROCEDURE retornarValor:
DEFINE INPUT PARAMETER valor AS INTEGER NO-UNDO.
valor = valor + 10.
DISPLAY valor.
END.
Anotações
Por referência
[ INPUT-OUTPUT ]
{ parm
| { { TABLE temp-table-name
| TABLE-HANDLE temp-table-handle
| DATASET dataset-name
| DATASET-HANDLE dataset-handle
} [ APPEND ] [ BY-VALUE | BY-REFERENCE | BIND ]
}
}
Exemplo
142
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
DISPLAY icont.
PAUSE.
DISPLAY icont.
PROCEDURE retornarValor:
DEFINE INPUT-OUTPUT PARAMETER valor AS INTEGER NO-UNDO.
Anotações
De retorno
[ OUTPUT ]
{ parm
| { { TABLE temp-table-name
| TABLE-HANDLE temp-table-handle
| DATASET dataset-name
| DATASET-HANDLE dataset-handle
} [ APPEND ] [ BY-VALUE | BY-REFERENCE | BIND ]
}
}
Exemplo
DISPLAY icont.
PAUSE.
DISPLAY icont.
PROCEDURE retornarValor:
DEFINE OUTPUT PARAMETER valor AS INTEGER NO-UNDO.
Anotações
143
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exemplo
Exemplo meuprograma.p
DISPLAY bcustomer.NAME.
Anotações
Exemplo
144
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exemplo meuprogramat.p
DISPLAY ttcustomer0.NAME.
Anotações
145
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara PASS_<número do exercício>.P (PASS_1.p, PASS_2.p).
1. Criar programa que execute procedimento externo, este deverá retornar a data de hoje.
2. Criar programa que execute procedimento interno, este deverá retornar a hora corrente.
3. Criar programa que execute procedimento interno, passe um número decimal, este procedimento
deverá retornar o número multiplicado por 2. Utilize um parâmetro com o número e outro
parâmetro de retorno para o valor calculado.
4. Criar programa que execute procedimento interno, passe um número decimal, este procedimento
deverá retornar o número multiplicado por 2. Utilize passagem por referência.
146
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Funções
A linguagem ABL possui várias funções como Index, Can-find, Lookup, Num-entries, mas em algumas
situações podemos ter a necessidade de criar nossas próprias funções.
Sintaxe
Exemplo
MESSAGE retornarNome()
VIEW-AS ALERT-BOX.
RUN prog-persist-B-02-z.p
PERSISTENT
SET hprogramaZ.
DISPLAY soma.
*A Função SOMAR está no programa prog-persist-b-02-z.p
147
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
PROCEDURE dividir:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor2 AS DECIMAL NO-UNDO.
END.
PROCEDURE subtrair:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor2 AS DECIMAL NO-UNDO.
END.
PROCEDURE calcularMedia:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor2 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor3 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor4 AS DECIMAL NO-UNDO.
END.
PROCEDURE divisivelpor2:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
UPDATE valor1.
END.
PROCEDURE listarClientes:
DEFINE VARIABLE valor1 LIKE customer.custnum
LABEL 'Semifinal PQP'
NO-UNDO.
DEFINE VARIABLE valor2 LIKE customer.custnum
LABEL 'Final'
NO-UNDO.
148
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
END.
END.
END.
Anotações
Sintaxe Run
RUN
{ extern-proc-name
| VALUE ( extern-expression )
| path-name<<member-name>>
}
[ PERSISTENT [ SET proc-handle ] ]
[ ON [ SERVER ] { server-handle | session-handle }
[ TRANSACTION DISTINCT ]
[ ASYNCHRONOUS
[ SET async-request-handle ]
[ EVENT-PROCEDURE event-internal-procedure
[ IN procedure-context ] ]
]
]
[ ( parameter [ , parameter ] ... ) ]
[ argument ] ...
[ NO-ERROR ]
149
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exemplo
Regra Programa
3 IF VALID-HANDLE(hPrograma) THEN
4 RUN metododentrodoPrograma1 IN hPrograma.
3 IF VALID-HANDLE(hPrograma) THEN
4 RUN metododentrodoPrograma2 IN hPrograma (INPUT 123).
3 IF VALID-HANDLE(hPrograma) THEN
4 RUN metododentrodoPrograma3 IN hPrograma (INPUT "Ola
mundo").
3
IF VALID-HANDLE(hPrograma) THEN
4
RUN metododentrodoPrograma4 IN hPrograma.
3
IF VALID-HANDLE(hPrograma) THEN
5
DELETE OBJECT hPrograma.
Para visualizar os procedimentos internos disponíveis em um programa persistente utilize a função Internal-
Entries.
Sintaxe
MESSAGE hPrograma:INTERNAL-ENTRIES
VIEW-AS ALERT-BOX INFO BUTTONS OK.
Procedimentos internos privados (Private) não poderão ser executados quando o programa estiver
persistente, pois não serão visíveis externamente.
RUN prog-persist-b-01.p
PERSISTENT
SET hprogramaB.
150
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
RUN somar
IN hprogramaB.
RUN multiplicar
IN hprogramaB.
PROCEDURE somar:
REPEAT:
END.
END.
PROCEDURE multiplicar:
REPEAT:
END.
END.
RUN prog-persist-B-02.p
PERSISTENT
SET hprogramaNinja.
RUN subtrair
IN hprogramaninja.
151
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
RUN dividir
IN hprogramaninja.
RUN listarClientes
IN hprogramaninja.
PROCEDURE dividir:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor2 AS DECIMAL NO-UNDO.
END.
PROCEDURE subtrair:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor2 AS DECIMAL NO-UNDO.
END.
PROCEDURE calcularMedia:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor2 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor3 AS DECIMAL NO-UNDO.
DEFINE VARIABLE valor4 AS DECIMAL NO-UNDO.
END.
PROCEDURE divisivelpor2:
DEFINE VARIABLE valor1 AS DECIMAL NO-UNDO.
UPDATE valor1.
END.
PROCEDURE listarClientes:
DEFINE VARIABLE valor1 LIKE customer.custnum
LABEL 'Semifinal PQP'
152
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
NO-UNDO.
DEFINE VARIABLE valor2 LIKE customer.custnum
LABEL 'Final'
NO-UNDO.
END.
END.
Anotações
153
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
Exercício
Para a nomenclatura dos exercícios, utilize a máscara PROC_<número do exercício>.P (PROC_1.p,
PROC_2.p).
1. Criar programa que execute procedimento externo, este deverá mostrar a data de hoje (Instrutor).
2. Criar programa que execute procedimento interno, este deverá mostrar a hora corrente (Instrutor).
3. Criar programa que utilize uma função para retornar a data de hoje mais 30 dias.
4. Crie um programa com os métodos mostrarData e mostrarHora (PROC_41.P). Execute o programa
(PROC_41.P) persistente para mostrar os procedimentos internos (internal-entries).
5. Execute o programa PROC_41.P persistente e execute os métodos mostrarData e mostrarHora.
Utilize as funções Date e Time.
6. Criar programa com procedimento interno e que neste procedimento exiba o seu nome completo.
7. Utilize o sexto exercício, agora utilize um procedimento externo para exibir o nome completo.
8. Construa um programa com dois procedimentos internos, leia a opção para executar o
procedimento 1 ou 2, utilizando IF THEN e ELSE execute o primeiro procedimento ou segundo.
9. Construa uma função que receberá o seu nome e sobrenome como parâmetros e retornará o seu
nome completo.
10. Construa uma função que receberá um valor decimal como parâmetro e retornará 13,85% do valor
passado.
11. Usando o nono exercício, mas agora construa na forma de programa persistente sendo chamado
pelo programa principal.
12. Usando o décimo exercício, mas agora construa na forma de programa persistente sendo chamado
pelo programa principal.
13. Usando o décimo primeiro exercício, mas agora construa na forma de programa persistente sendo
chamado pelo programa principal.
154
Bruno Henrique Joaquim Programando com Progress ABL v.1.5
bruno.joaquim@sulbras.com.br
(54) 99234.5460
• Repeat,
• For,
• Programas ( na linha 0 ),
• Procedures Internas,
• Funções,
• Códigos de gatilhos,
• Do.
Transações são operações que serão executadas como uma unidade ou ACID (Atomicidade, Consistência,
Isolamento e Durabilidade), o escopo de transações está diretamente associado ao escopo de bloco que
pode ser desfeito, como Repeat, For, Programas e Procedures, Códigos de gatilhos, o bloco DO também cria
um bloco, mas por não ter características de um bloco que pode ser desfeito acaba propagando a transação,
se existir, para o bloco que contém o DO.
Para saber o número de blocos que um programa Progress ABL tem basta contar o número de “:” e adicionar
mais um pelo bloco automático criado no programa.
Comumente, na linguagem ABL, uma transação se inicia no começo do bloco (Repeat, For e Procedure,
Função) e termina no END deste.
Pode-se utilizar a função Transaction para verificar se há transação ativa ou através da compilação do
programa com a opção de LISTING.
TRANSACTION
Não confundir Opção Transaction com a Função Transaction, enquanto a opção Transaction é usada no
cabeçalho de blocos como o DO, FOR e REPEAT, a função Transaction é usada para exibir se o bloco está em
transação ou não.
Desfazendo a transação
A instrução undo informa à ABL para desfazer um bloco de transação. Também não se pode confundir a
instrução de UNDO com a opção UNDO dos cabeçalhos dos blocos DO, REPEAT e FOR.
Programando com Progress/ABL
UNDO
[ label ]
[ , LEAVE [ label2 ]
| , NEXT [ label2 ]
| , RETRY [ label1 ]
| , RETURN [ return-value |
ERROR [ return-value | error-object-expression ] |
NO-APPLY ]
| , THROW error-object-expression
]
CREATE customer.
ASSIGN
customer.custnum = NEXT-VALUE(NextCustNum).
DISPLAY customer.custnum.
ASSIGN
customer.NAME = "<SEU NOME>"
customer.salesrep = "BBB".
/* desfazendo o bloco Do Transaction com a instrucao UNDO */
UNDO dobloco, LEAVE dobloco.
END.
DISPLAY "Terminou".
Anotações
Opção Undo
A opção UNDO utiliza-se no cabeçalho de uma das instruções DO, FOR e REPEAT para desfazer uma
transação em um bloco e para informar o que fazer a seguir quando ocorrer algum erro não esperado com
as opções ON ERROR, ON ENDKEY, ON STOP e ON QUIT.
DO TRANSACTION
ON ERROR UNDO, LEAVE:
CREATE customer.
ASSIGN
customer.custnum = NEXT-VALUE(NextCustNum).
DISPLAY customer.custnum.
156
Programando com Progress/ABL
UPDATE
customer.NAME
customer.salesrep.
DO TRANSACTION
ON ERROR UNDO, RETRY:
CREATE customer.
ASSIGN
customer.custnum = NEXT-VALUE(NextCustNum).
DISPLAY customer.custnum.
UPDATE
customer.NAME
customer.salesrep.
RELEASE customer.
END.
DISPLAY "terminou".
Importante: Não confunda a instrução Undo no corpo de um programa com a opção Undo usada no
cabeçalho Do, For e Repeat.
Anotações
A linguagem ABL por padrão inicia um bloco na linha 0 (zero) de todos os programas.
Uma regra simples para determinar onde se inicia um bloco é observar onde há “:”, com exceção dos rótulos
dos blocos.
Então, um bloco se inicia com a instrução Do, For, Repeat, Procedure, Function, procedure em ABL pode ser
tanto um programa ou uma procedure interna.
O término de um bloco está no END de um Do, For, Repeat, Procedure ou no final de um programa.
Vejamos o código:
157
Programando com Progress/ABL
DO TRANSACTION
ON ERROR UNDO, RETRY:
CREATE customer.
ASSIGN
customer.custnum = NEXT-VALUE(NextCustNum).
DISPLAY customer.custnum.
UPDATE
customer.NAME
customer.salesrep.
RELEASE customer.
END.
DISPLAY "terminou".
Seguindo a regra do dois pontos “:” o bloco se inicia na instrução “DO TRANSACTION ON ERROR UNDO,
RETRY:” e se encerra com o END deste DO TRANSACTION. Todo o código que está entre o “:” do DO
TRANSACTION e o END deste, faz parte da transação.
Compile o programa com a opção Listing. Você pode realizar esta compilação com a Ferramenta de
Compilação da Progress ou, ou através da instrução Compile.
Application Compiler
158
Programando com Progress/ABL
Ao realizarmos a compilação do nosso código, será gerado um arquivo com este formato:
{} Line Blk
-- ---- ---
1 dobloco:
2 1 DO TRANSACTION:
3 1
4 1 MESSAGE TRANSACTION
5 1 VIEW-AS ALERT-BOX INFO BUTTONS OK.
6 1
7 1 CREATE customer.
8 1 ASSIGN customer.custnum = NEXT-VALUE(NextCustNum).
9 1
10 1 DISPLAY customer.custnum.
11 1 ASSIGN
12 1 customer.NAME = "<SEU NOME>"
13 1 customer.salesrep = "BBB".
14 1
15 1 /* desfazendo o bloco do transaction */
16 1 UNDO dobloco, LEAVE dobloco.
17 1
18 END.
159
Programando com Progress/ABL
19
20 DISPLAY "Terminou&q