Escolar Documentos
Profissional Documentos
Cultura Documentos
5
(18) 99747-8189
Programando em Progress
Jaison Antoniazzi
Versão 1.5
Índice
Sumário
Índice ............................................................................................................................................. 2
Sobre esta apostila ...................................................................................................................... 12
Sobre o Progress OpenEdge .......................................................................................................... 2
Alicerces dos sistemas Progress OpenEdge..................................................................................................... 2
Sobre a Linguagem ABL – Advanced Business Language .............................................................. 2
Banco de dados Progress OpenEdge ............................................................................................. 3
Control Area .................................................................................................................................................... 3
Schema Area .................................................................................................................................................... 3
Application Data Area...................................................................................................................................... 3
Primary Recovery Area .................................................................................................................................... 3
After-image Area ............................................................................................................................................. 4
Transaction log Area ........................................................................................................................................ 4
Encryption Policy Area..................................................................................................................................... 4
Audit data and index Area ............................................................................................................................... 4
Componentes lógicos ...................................................................................................................................... 4
Tabelas ......................................................................................................................................................... 4
Registro ........................................................................................................................................................ 4
Campos ........................................................................................................................................................ 4
Chaves.......................................................................................................................................................... 4
Índices.......................................................................................................................................................... 4
Sequências ................................................................................................................................................... 4
Relacionamentos entre tabelas ................................................................................................................... 4
Ferramentas especialistas ............................................................................................................. 6
Principais ferramentas..................................................................................................................................... 6
AppBuilder ................................................................................................................................................... 7
Application Compiler ................................................................................................................................... 7
Procedure Editor (Client) ............................................................................................................................. 8
Data Administration .................................................................................................................................... 8
Data Dictionary ............................................................................................................................................ 8
Desktop........................................................................................................................................................ 9
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Anotações .................................................................................................................................................. 27
SESSION system handle ................................................................................................................................. 27
Anotações .................................................................................................................................................. 28
SELF System Handle ....................................................................................................................................... 28
Operadores .................................................................................................................................. 30
Anotações ...................................................................................................................................................... 30
Exercício......................................................................................................................................................... 31
Banco de dados, Record Buffer e Screen Buffer ......................................................................... 32
Segmentos ..................................................................................................................................................... 32
Database .................................................................................................................................................... 32
Record Buffer............................................................................................................................................. 32
Screen Buffer ............................................................................................................................................. 32
Instruções de transferência ........................................................................................................................... 32
Buffers, Temp-tables e Datasets ................................................................................................. 34
Buffers ........................................................................................................................................................... 34
Tabelas temporárias ...................................................................................................................................... 36
Datasets ......................................................................................................................................................... 39
Sintaxe do Dataset ..................................................................................................................................... 40
Sintaxe do Datasource ............................................................................................................................... 40
Receita de bolo para o funcionamento ..................................................................................................... 40
Dataset com uma tabela e usando buffer ................................................................................................. 41
Dataset com uma tabela usando query .................................................................................................... 41
Anotações .................................................................................................................................................. 41
Exercício......................................................................................................................................................... 43
Criação, Atribuição e Eliminação de Registros ............................................................................ 44
Instrução Create ............................................................................................................................................ 44
Anotações .................................................................................................................................................. 44
Instrução Insert.............................................................................................................................................. 45
Anotações .................................................................................................................................................. 46
Instrução de Assign........................................................................................................................................ 46
Instrução Delete ............................................................................................................................................ 47
Anotações .................................................................................................................................................. 47
Importante................................................................................................................................................. 47
Exercício......................................................................................................................................................... 48
Neo Step
Todos os Direitos Reservados 4
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Neo Step
Todos os Direitos Reservados 5
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
No-lock....................................................................................................................................................... 63
Anotações .................................................................................................................................................. 63
Usando No-lock e Exclusive-lock ................................................................................................................... 63
Exercício......................................................................................................................................................... 64
Exercicios Complementares For Each............................................................................................................ 64
Exercícios complementares de Open Query ................................................................................................. 75
Gatilhos do banco de dados ........................................................................................................ 79
Create ............................................................................................................................................................ 79
Delete ............................................................................................................................................................ 79
Find ................................................................................................................................................................ 79
Write .............................................................................................................................................................. 79
Replication-create ......................................................................................................................................... 79
Replication-delete ......................................................................................................................................... 79
Replication-write ........................................................................................................................................... 79
Retorno de Erro e cancelamento da execução ............................................................................................. 79
Variáveis e tipos de dados ........................................................................................................... 80
Tipos de variáveis .......................................................................................................................................... 80
Tipos primitivos da linguagem ABL................................................................................................................ 80
Exemplos ....................................................................................................................................................... 81
Anotações .................................................................................................................................................. 82
Rótulos ........................................................................................................................................................... 82
Anotações .................................................................................................................................................. 83
Formato padrão ............................................................................................................................................. 83
Anotações .................................................................................................................................................. 84
Valores iniciais ............................................................................................................................................... 84
Tabela de valores iniciais ........................................................................................................................... 84
Anotações .................................................................................................................................................. 84
Variáveis multidimensionais ou vetores........................................................................................................ 84
Anotações .................................................................................................................................................. 85
Opção No-Undo ............................................................................................................................................. 85
Anotações .................................................................................................................................................. 86
Visualização De Variáveis Como Objetos ...................................................................................................... 86
Exemplo ..................................................................................................................................................... 88
Resultado no ambiente Windows ............................................................................................................. 90
Neo Step
Todos os Direitos Reservados 6
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Exercício....................................................................................................................................................... 198
Eventos Nomeados em programas ........................................................................................... 199
O Primeiro programa com eventos ............................................................................................................. 199
Anotações ................................................................................................................................................ 201
Cancelando a notificação de Eventos .......................................................................................................... 202
Compilador ................................................................................................................................ 203
Opção Xref ................................................................................................................................................... 203
Anotações ................................................................................................................................................ 203
Opção Preprocess ........................................................................................................................................ 204
Anotações ................................................................................................................................................ 204
Opção Listing ............................................................................................................................................... 204
Anotações ................................................................................................................................................ 205
Anexos ....................................................................................................................................... 206
Prova de certificação ................................................................................................................................... 206
Programa da prova de certificação ......................................................................................................... 206
Janela pesquisar ...................................................................................................................................... 207
Codigo do programa da prova de certificação ........................................................................................ 208
Componentes do banco de dados Sports2000 ........................................................................................... 216
Imagem do MER do banco SPORTS2000 ................................................................................................. 216
Tabelas do banco Sports2000.................................................................................................................. 216
Índices das tabelas do banco Sports2000 ............................................................................................... 217
Relacionamento das tabelas.................................................................................................................... 220
Listagem de campos das tabelas do banco Sports2000 .......................................................................... 223
Neo Step
Todos os Direitos Reservados 11
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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 12
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
Neo Step
Todos os Direitos Reservados 4
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
• 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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Data Administration
Data Dictionary
Neo Step
Todos os Direitos Reservados 8
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Desktop
Neo Step
Todos os Direitos Reservados 9
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
7 END.
Neo Step
Todos os Direitos Reservados 12
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Sintaxe
Neo Step
Todos os Direitos Reservados 22
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
MESSAGE
'Procedures internas=' THIS-PROCEDURE:INTERNAL-ENTRIES SKIP
Neo Step
Todos os Direitos Reservados 23
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Para mais detalhes sobre THIS-PROCEDURE procure por Procedure object handle.
Anotações
Sintaxe
Limpando o log
log-manager:clear-log().
Neo Step
Todos os Direitos Reservados 24
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
Neo Step
Todos os Direitos Reservados 25
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
• 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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Neo Step
Todos os Direitos Reservados 29
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Neo Step
Todos os Direitos Reservados 33
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
/* 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
Exemplo de Temp-Table
36
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
*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.
/* like de outra TT */
DEFINE TEMP-TABLE ttCustomerEx LIKE ttCustomer.
INDEX
ix_codigo AS UNIQUE AS PRIMARY
codigo
INDEX
ix_nome
nome.
37
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
38
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
As tabelas temporárias de um dataset também podem salvar suas alterações nas tabelas das quais foram
carregadas.
39
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
DATASET dts-customer:FILL().
/* carregar o dataset */
DATASET dts-item:FILL().
Anotações
41
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
42
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
customer.custnum
46
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
] ...
[ 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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Anotações
Anotações
53
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
END.
55
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
57
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Anotações
58
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
[ 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
order.order-num order.order-date SKIP
order-line.line-num
order-line.price order-line.qty SKIP
item.item-num item.item-name SKIP
60
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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'.
DISPLAY
61
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
65
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
66
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
67
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
68
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
69
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
71
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
GPE
HXM
JAI
JAL
KIK
RDR
SLS
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
72
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
73
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
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
74
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
75
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
76
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
77
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
78
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
81
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
82
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
MEMPTR Não pode ser exibido com Display diretamente, somente com
conversão.
83
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
84
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
INITIAL 20.
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
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.
85
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
| INNER-CHARS char INNER-LINES lines
}
[ BUFFER-CHARS chars ]
[ BUFFER-LINES lines ]
[ LARGE ]
86
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
[ MAX-CHARS characters ]
[ NO-BOX ]
[ NO-WORD-WRAP ]
[ SCROLLBAR-HORIZONTAL ]
[ SCROLLBAR-VERTICAL ]
[ TOOLTIP tooltip ]
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
{ NONE | TOP | BOTTOM | LEFT | RIGHT | BOTH }
[ FREQUENCY n ]
]
[ TOOLTIP tooltip ]
[ size-phrase ]
87
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
88
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
SIZE 30 BY 3.
UPDATE
meucombobox
meueditor
meuradio
minhaselection
meuslider
meufillinInt
meufillinDec
meufillinDate
meufillinChar
WITH 1 COL.
89
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
90
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
91
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
92
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
WITH SIDE-LABELS.
Resultado
93
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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).
94
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
• 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 “=”.
95
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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 ]
}
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
| 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
97
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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:
o Final da transação, pode ser no END ou no final do bloco de instruções de um programa,
98
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
o Instrução Release,
o Instrução Validade e
o Ao trocar de registro com um FIND, por exemplo.
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
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
99
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
100
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
101
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
102
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
103
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
104
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
105
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
106
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
107
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Sintaxe
DEFINED ( name )
Exemplo
&GLOBAL-DEFINE minhaNovaConstante 2
Exemplo minhainclude.i
&SCOPED-DEFINE minha1 1
&GLOBAL-DEFINE minha2 2
Exemplo
{minhainclude.i}
Anotações
108
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
&UNDEFINE preprocessor-name
Exemplo
&GLOBAL-DEFINE minhaNovaConstante 2
&UNDEFINE minhaNovaConstante
Anotações
109
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
110
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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 } ]
[ BGCOLOR expression ]
111
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
[ 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 ) ]
[ view-as-phrase ]
[ WIDGET-ID id-number ]
112
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
113
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
114
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Overlay Para indicar que a frame Em janelas que fazem sobreposição sobre
pode sobrepor outro outras janelas.
frame.
No-labels Em frames que não Em relatórios.
exibirão os rótulos dos
campos.
No-underline Para indicar que não Em relatórios.
haverá linha abaixo dos
campos.
No-box Para remover a caixa em Em relatórios.
torno do frame.
Keep-tab-order Para manter a ordem de Em janels com campos e objetos.
tabulação dos campos.
Frame nome-da-frame Para dar nome ao frame. Em relatórios e janelas com campos.
Default-button Para indicar o botão Em janelas com campos e objetos.
padrão, é aquele que
recebe o ENTER.
Column n Para indicar a coluna que Em janelas de campos e objetos.
o frame será exibido.
n Column Para indicar o número de Em janelas com campos de tabela.
colunas que a frame terá
Down Para indicar que a frame Em relatórios.
será DOWN, frames Down
é aquela que exibirá
múltiplas ocorrências dos
campos definidos nela.
n Down Para indicar quantas Em relatórios.
interações uma frame
down terá.
Cancel-button Para indicar o botão que Em janelas de campos e objetos.
receberá o ESC.
Headder Para indicar o cabeçalho Em janelas de campos e relatórios.
do frame.
Stream-io Para indicar que as fontes Em relatórios.
serão ignoradas e a fonte
FIXA será usada, retirando
ainda todo espaço de
borda entre os campos.
Compartilhamento
Frames podem ser compartilhados, entre programas, com o uso de New e ou Shared.
Exemplo
115
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
customer.custnum
customer.name FORMAT "X(20)"
customer.creditlimit LABEL "Limite"
customer.balance
bal-avail
WITH CENTERED ROW 3 TITLE "Credito disponivel" USE-TEXT.
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 ] }
Sintaxe
DISPLAY
{ [ STREAM stream | STREAM-HANDLE handle ] [ UNLESS-HIDDEN ] }
record [ EXCEPT field ... ]
{ [ IN WINDOW window ] [ frame-phrase ] [ NO-ERROR ] }
116
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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'.
WITH SIDE-LABELS
THREE-D
SIZE 30 BY 4
ROW 5.5 COL 1
TITLE 'Frame C'.
117
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.'.
WITH
NO-LABELS
STREAM-IO
NO-BOX
/* esta frame sera do tipo page-top */
PAGE-TOP
WIDTH 128.
118
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
DISPLAY
customer.custnum
customer.NAME
customer.address
customer.salesrep
salesrep.repname
WITH FRAME frameCustomer.
END.
OUTPUT CLOSE.
119
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Frames Sobrepostas
Frames podem ser sobrepostas, mas é necessário informar a frame pai que abrigará as demais filhas.
120
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Anotações
121
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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).
122
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Resultado do exercicio.
123
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
[ NATIVE ]
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
[ 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.
Exemplos de Combo-box
125
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
NO-UNDO.
126
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
LABEL 'SQN'
FORMAT 'x(50)'
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.
Anotações
127
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
128
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
129
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
130
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
ON 'value-changed':u OF toggle1
DO:
/* codigo trigger */
/* transferir o valor do screen buffer para o record buffer */
ASSIGN INPUT FRAME framemain toggle1.
MESSAGE "aplicando o evento de choose no botao"
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
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.
131
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Anotações
DISPLAY
WITH FRAME framemain.
132
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
PROCEDURE pressionarok:
MESSAGE "ola mundo" SKIP
"valor do fill-in = " hfillin1:SCREEN-VALUE
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
Anotações
133
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
134
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
135
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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).
137
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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 ]
[ ORDINAL n ] [ PERSISTENT ]
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
| 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
139
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
140
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
141
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Exemplo
Exemplo meuprograma.p
DISPLAY bcustomer.NAME.
Anotações
Exemplo
142
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Exemplo meuprogramat.p
DISPLAY ttcustomer0.NAME.
Anotações
143
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
144
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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
145
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
146
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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 ]
147
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
RUN somar
IN hprogramaB.
148
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
RUN dividir
IN hprogramaninja.
149
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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'
NO-UNDO.
DEFINE VARIABLE valor2 LIKE customer.custnum
LABEL 'Final'
NO-UNDO.
150
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
END.
END.
Anotações
151
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
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.
152
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
• 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.
154
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:
155
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
156
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.
157
Programando com Progress/ABL
19
20 DISPLAY "Terminou".
...mp\progdotrans1.p 10/28/2013 22:51:57 PROGRESS(R)
Page 2
Rodapé do arquivo Listing
Neste momento, as partes mais importantes são a coluna BLK que mostra os blocos existentes no programa
e o rodapé que mostra onde está a transação, o nome do bloco e a linha que se inicia.
dobloco:
DO TRANSACTION:
RUN minhaProcedure.
END.
DISPLAY "Terminou".
PROCEDURE minhaProcedure:
CREATE customer.
ASSIGN
customer.custnum = NEXT-VALUE(NextCustNum).
DISPLAY customer.custnum.
ASSIGN
customer.NAME = "<SEU NOME>"
customer.salesrep = "BBB".
END.
{} Line Blk
-- ---- ---
1 DEF VAR inteiro AS INTEGER.
2
3 dobloco:
4 1 DO TRANSACTION:
5 1
158
Programando com Progress/ABL
6 1 RUN minhaProcedure.
7 1
8 END.
9
10 DISPLAY "Terminou".
11
12
13 PROCEDURE minhaProcedure:
14 CREATE customer.
15 ASSIGN customer.custnum = NEXT-VALUE(NextCustNum).
16
17 DISPLAY customer.custnum.
18 ASSIGN
19 customer.NAME = "<SEU NOME>"
20 customer.salesrep = "BBB".
21 END.
...mp\progdotrans2.p 10/28/2013 23:27:12 PROGRESS(R)
Page 2
2 ...mp\progdotrans2.p 0 Procedure No
Buffers: sports4000.Customer
Frames: Unnamed
1. A procedure que cria um novo bloco, se inicia na linha 13, subtransação do bloco DO TRANSACTION,
e é identificada pelo Blk. Label “Procedure minhaProcedure”.
2. O código principal, que se inicia na linha 0 e identificado no Blk. Type por Procedure.
3. E o bloco do DO TRANSACTION, que inicia na linha 4, é identificado pelo Blk. Type por Do e tem Blk.
Label dobloco.
Outro ponto importante que deve ser analisado é se as subtransações farão parte da transação principal ou
se elas são tratadas independente, como foi exibido nos exemplos acima.
159
Programando com Progress/ABL
END.
DISPLAY "Terminou".
PROCEDURE minhaProcedure:
/* aqui começa o bloco da procedure minhaProcedure */
dobloco:
DO ON ERROR UNDO, RETURN "Erro":
CREATE customer.
ASSIGN
customer.custnum = NEXT-VALUE(NextCustNum).
DISPLAY customer.custnum.
UPDATE
customer.NAME
customer.salesrep.
/* gerando o erro */
INT('A').
END.
{} Line Blk
-- ---- ---
1 DEF VAR inteiro AS INTEGER.
2
3 repeatbloco:
4 1 REPEAT TRANSACTION:
5 1
6 1 RUN minhaProcedure.
7 1 IF RETURN-VALUE = "Erro" THEN
8 1 UNDO, LEAVE.
9 1
10 END.
11
12 DISPLAY "Terminou".
13
14 PROCEDURE minhaProcedure:
160
Programando com Progress/ABL
No código acima marcamos os blocos de Repeat, DO, seus respectivos END e o rodapé do Listing. Note que
a procedure está contida entre as linhas 14 e 31, mas não existe transação nesta, somente dentro do bloco
DO ON ERROR. Observe também que na linha 27 estamos forçando um erro para que o DO ON ERROR
retorne ao REPEAT a informação “ERRO”, no Repeat, na linha 7, é tratado o retorno da procedure
minhaProcedure, como sempre ocorrerá erro, a instrução UNDO desfará a transação ativa e a opção LEAVE
sairá deste bloco.
repeatbloco:
REPEAT TRANSACTION:
161
Programando com Progress/ABL
RUN minhaProcedure.
IF RETURN-VALUE = "Erro" THEN
UNDO, LEAVE.
END.
DISPLAY "Terminou".
PROCEDURE minhaProcedure:
/* aqui começa o bloco da procedure minhaProcedure */
dobloco:
DO ON ERROR UNDO, RETURN "Erro":
CREATE customer.
ASSIGN
customer.custnum = NEXT-VALUE(NextCustNum).
DISPLAY customer.custnum.
UPDATE
customer.NAME
customer.salesrep.
dobloco2:
DO ON ERROR UNDO dobloco2, LEAVE dobloco2:
CREATE order.
ASSIGN
order.custnum = customer.custnum.
UPDATE
order.ordernum
order.orderdate.
END.
/* gerando o erro */
INT('A').
END.
{} Line Blk
-- ---- ---
1 DEF VAR inteiro AS INTEGER.
2
3 repeatbloco:
4 1 REPEAT TRANSACTION:
5 1
6 1 RUN minhaProcedure.
162
Programando com Progress/ABL
163
Programando com Progress/ABL
Criamos um novo bloco interno ao bloco dobloco e o chamamos de dobloco2. Veja que o arquivo Listing
apontou este novo bloco.
164
Programando com Progress/ABL
Exercício
Para a nomenclatura dos exercícios, utilize a máscara BTRANS_<número do exercício>.P (BTRANS_1.p,
BTRANS_2.p).
1. Nomeando os blocos, crie um laço de 1 até 20 com Do, crie um sub bloco de 5 até 10 e utilize Do.
Exibindo os valores, adicione o código integer(“A”) após o Display do sub bloco Do (gerará um erro).
O que ocorreu? Por quê?
2. Nomeando os blocos, crie um laço de 1 até 20 com Do, crie um sub bloco de 5 até 10 e utilize
Repeat. Exibindo os valores, adicione o código integer(“A”) após o Display do sub bloco Repeat
(gerará um erro). O que ocorreu? Por quê?
3. Nomeando os blocos, crie um laço de 1 até 20 com Do, crie um sub bloco de 5 até 10 e utilize Do.
Exibindo os valores, adicione o código integer(“A”) após o Display do sub bloco Do (gerará um erro).
Adicione o tratamento On Error, On Endkey, On Quit e On Stop. O que ocorreu? Por quê?
4. Nomeando os blocos, crie um laço de 1 até 20 com Do, crie um sub bloco de 5 até 10 e utilize
Repeat. Exibindo os valores, adicione o código integer(“A”) após o Display do sub bloco Repeat
(gerará um erro). Adicione o tratamento On Error, On Endkey, On Quit e On Stop. O que ocorreu?
Por quê?
5. Crie um programa que adicione 3 registros na tabela customer, utilize Do Transaction.
6. Crie um programa que adicione 3 registros na tabela customer, utilize Do Transaction. E ao final
desfaça o cadastramento destes 3 registros.
7. Crie um programa de 1 até 10, exibindo cada valor, se o valor for 5 saia do bloco (Utilize If e Leave).
8. Crie um novo programa com um laço Repeat,
a. Neste laço de Repeat faça a criação de registros da tabela Customer e leia os valores dos
campos Customer.Name, Customer.Address e Customer.Salesrep com a instrução Update,
b. A cada interação pergunte se deseja salvar ou desfazer,
c. Utilize Undo e Leave.
9. Crie um novo programa a partir do quarto exercício e substitua por Undo e Next.
10. Crie um novo programa com base no quarto exercício, substitua por Undo e Retry.
11. Crie um novo programa com base no quarto exercício, utilize Procedure, Undo, Leave e teste o
return-value. Este ficará semelhante aos exemplos acima.
165
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Laços de repetição
São as repetições de códigos, podendo ter transação, tratamento de erro e escopo de frame.
Instrução Do
A instrução Do precisa ser acrescida de condições lógicas para ser laço de repetição, por este motivo foi
associada neste capítulo.
Sintaxe Do
[ label : ]
DO
{ [ FOR record [ , record ] ... ] }
[ preselect-phrase ]
[ query-tuning-phrase ]
[ variable = expression1 TO expression2 [ BY k ] ]
[ WHILE expression ]
[ TRANSACTION ]
[ on-endkey-phrase ]
[ on-error-phrase ]
[ on-quit-phrase ]
[ on-stop-phrase ]
{ [ frame-phrase ] } :
do-body
Exemplo
Anotações
166
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Instrução Repeat
Permite um laço de repetição.
Sintaxe Repeat
[ label : ]
REPEAT
[ FOR record [ , record ] ... ]
[ preselect-phrase ]
[ query-tuning-phrase ]
[ variable = expression1 TO expression2 [ BY k ] ]
[ WHILE expression ]
[ TRANSACTION ]
[ on-endkey-phrase ]
[ on-error-phrase ]
[ on-quit-phrase ]
[ on-stop-phrase ]
[ frame-phrase ]
[ catch-block [ catch-block ... ] ]
[ finally-block ] :
repeat-body
Exemplo
Anotações
Instrução For
Sintaxe For
[ label: ]
FOR [ EACH | FIRST | LAST ] record-phrase
[ , [ EACH | FIRST | LAST ] record-phrase ] ...
[ query-tuning-phrase ]
[ BREAK ]
[ BY expression [ DESCENDING ]
| COLLATE ( string , strength [ , collation ] ) [ DESCENDING ]
] ...
[ variable = expression1 TO expression2 [ BY k ] ]
[ WHILE expression ]
167
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
[ TRANSACTION ]
[ on-error-phrase ]
[ on-endkey-phrase ]
[ on-quit-phrase ]
[ on-stop-phrase ]
[ frame-phrase ] :
for-body
168
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
END.
Field Phone from Customer record (recid 101) was missing from FIELDS
phrase. (8826)
Customer.Phone.
END.
169
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Anotações
Nomeie o bloco antes do cabeçalho do Repeat, For ou Do e adicione dois pontos “:”.
Exemplo
repeat-block:
REPEAT:
UPDATE continuar.
IF NOT continuar THEN
UNDO repeat-block, LEAVE repeat-block.
170
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
END.
DISPLAY "terminou".
repeat-block:
REPEAT:
UPDATE continuar.
IF NOT continuar THEN
UNDO repeat-block, LEAVE repeat-block.
bloco2:
REPEAT:
UPDATE perguntar.
IF NOT perguntar THEN
UNDO repeat-block, LEAVE repeat-block.
ELSE
UNDO bloco2, LEAVE bloco2.
END.
END.
DISPLAY "terminou".
repeat-block:
REPEAT:
UPDATE continuar.
IF NOT continuar THEN
UNDO repeat-block, LEAVE repeat-block.
bloco2:
REPEAT:
IF RETRY THEN
DISPLAY "tentando novamente".
UPDATE perguntar.
IF NOT perguntar THEN
UNDO repeat-block, LEAVE repeat-block.
ELSE
UNDO bloco2, RETRY bloco2.
END.
END.
DISPLAY "terminou".
171
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
172
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Exercício
Para a nomenclatura dos exercícios, utilize a máscara DO_REP_<número do exercício>.P (DO_REP_1.p,
DO_REP_2.p).
173
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Opção On Error
On Error deverá ser utilizado no caso de erros no bloco.
Sintaxe On Error
ON ERROR UNDO
[ label1 ]
[ , LEAVE [ label2 ]
| , NEXT [ label2 ]
| , RETRY [ label1 ]
| , RETURN [ return-value |
ERROR [ return-value | error-object-expression ] |
NO-APPLY ]
| , THROW
]
Anotações
/* PROCEDURE OU PROGRAMA
ON ERROR UNDO, RETRY */
UPDATE codigo.
INT(codigo).
END.
MESSAGE 1
VIEW-AS ALERT-BOX INFO BUTTONS OK.
174
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
UPDATE nome.
MESSAGE 3
VIEW-AS ALERT-BOX INFO BUTTONS OK.
INT('gerar erro').
MESSAGE 4
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
/* bloco 1 */
MESSAGE 5
VIEW-AS ALERT-BOX INFO BUTTONS OK.
MESSAGE 1
VIEW-AS ALERT-BOX INFO BUTTONS OK.
UPDATE nome.
MESSAGE 3
VIEW-AS ALERT-BOX INFO BUTTONS OK.
INT('gerar erro').
MESSAGE 4
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
/* bloco 1 */
MESSAGE 5
VIEW-AS ALERT-BOX INFO BUTTONS OK.
MESSAGE 1
VIEW-AS ALERT-BOX INFO BUTTONS OK.
175
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
UPDATE nome.
INT('gerar erro').
MESSAGE 4
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
/* bloco 1 */
MESSAGE 5
VIEW-AS ALERT-BOX INFO BUTTONS OK.
Opção On EndKey
On Endkey deverá ser utilizado no caso do usuário utilizar tecla de End-Error ou Endkey (Esc ou F4).
Sintaxe On Endkey
ON ENDKEY UNDO
[ label1 ]
[ , LEAVE [ label2 ]
| , NEXT [ label2 ]
| , RETRY [ label1 ]
| , RETURN [ return-value |
ERROR [ return-value | error-object-expression ] |
NO-APPLY ]
Anotações
MESSAGE 1
VIEW-AS ALERT-BOX INFO BUTTONS OK.
UPDATE CODIGO.
INT('A').
MESSAGE 3
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
176
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
MESSAGE 4
VIEW-AS ALERT-BOX INFO BUTTONS OK.
/*
WELLINGTON
1 - OK
2 - OK
3 - NOK
4 - TALVEZ NAO
WILLIAN
1 - OK
2 - OK
3 - NOK
4 - TALVEZ NAO
MIRO
1 - OK
2 - OK
3 - OK
4 - NOK
*/
MESSAGE 1
VIEW-AS ALERT-BOX INFO BUTTONS OK.
UPDATE CODIGO.
INT('A').
MESSAGE 3
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
MESSAGE 4
VIEW-AS ALERT-BOX INFO BUTTONS OK.
/*
WELLINGTON
1 - OK
2 - OK
3 - NOK
4 - TALVEZ NAO
WILLIAN
1 - OK
2 - OK
3 - NOK
4 - TALVEZ NAO
177
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
MIRO
1 - OK
2 - OK
3 - OK
4 - NOK
*/
Opção On Stop
On Stop deverá ser utilizado para tratar condições de Stop (Falta de procedimentos ou programas).
Sintaxe On Stop
ON STOP UNDO
[ label1 ]
[ , LEAVE [ label2 ]
| , NEXT [ label2 ]
| , RETRY [ label1 ]
| , RETURN [ return-value |
ERROR [ return-value | error-object-expression ] |
NO-APPLY ]
]
Anotações
/* BLOCO 1 */
MESSAGE 1
VIEW-AS ALERT-BOX INFO BUTTONS OK.
MESSAGE 2
VIEW-AS ALERT-BOX INFO BUTTONS OK.
/* BLOCO 1 */
Opção On Quit
On Quit deverá ser utilizado com instruções de Quit.
Sintaxe On Quit
ON QUIT
[ UNDO [ label1 ] ]
[ , LEAVE [ label2 ]
| , NEXT [ label2 ]
178
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
| , RETRY [ label1 ]
| , RETURN [ return-value |
ERROR [ return-value | error-object-expression ] |
NO-APPLY ]
]
Anotações
Exemplo de On Quit
MESSAGE 1
VIEW-AS ALERT-BOX INFO BUTTONS OK.
/* APERTAR CTRL-BREAK */
UPDATE NOME.
QUIT.
MESSAGE 2
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
MESSAGE 3
VIEW-AS ALERT-BOX INFO BUTTONS OK.
179
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Captura de erros
Os blocos de instruções Do, Repeat e For permitem a inserção de captura de erros através da instrução
Catch.
Bloco catch
É o bloco de instruções que será executado se a condição de captura for condizente com o erro.
block-statements
CATCH error-variable AS [ CLASS ]error-class:
catch-logic
END [ CATCH ] .
[block-end-statement]
Bloco de Finally
É o bloco de instruções que sempre será executado, independente de sucesso ou falha das instruções
anteriores.
block-statements
FINALLY :
finally-logic
END [ FINALLY ] .
[ block-end-statement ]
REPEAT:
DISPLAY int("A").
DISPLAY int("A").
180
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
MESSAGE
"Ocorreu um erro inesperado, por favor, contate o
suporte." SKIP
oneError:GetMessage(1)
VIEW-AS ALERT-BOX BUTTONS OK.
END CATCH.
END.
O bloco Do não possui tratamento implícito de erro, é obrigatória a inserção de tratamento On Error Undo,
evitando a mensagem CATCH block may only be associated with an undoable block. (14140).
INT('gerar erro').
END.
IF errosistema:getmessagenum(1) = 76 THEN
MESSAGE 'ocorreu erro de conversao!'
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
ELSE
MESSAGE
END.
END.
Exemplo de Catch em For Each
DISPLAY
customer.NAME
customer.custnum
WITH 1 COL FRAME clientes TITLE 'Cliente'.
181
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
DISPLAY
order.ordernum
order.orderdate
order.custnum
WITH DOWN FRAME pedidos TITLE 'Pedidos'.
DOWN WITH FRAME pedidos.
DISPLAY
orderline.linenum
orderline.itemnum
orderline.price
WITH
DOWN FRAME linhas TITLE 'linhas'
COL 40 ROW 5
WIDTH 40.
DOWN WITH FRAME linhas.
REPEAT :
UPDATE codigo.
INT('A').
DISPLAY customer
182
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
END.
ELSE
MESSAGE 'registro do cliente ' codigo ' nao existe.'
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
Exemplo de Catch em Programa
INT('gerar erro').
183
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
INT('gerar erro').
FINALLY:
END.
RUN programa-que-nao-existe-no-propath.pjaisonmaluco.
/* gera uma condicao de STOP */
184
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
FINALLY:
END.
Anotações
185
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Importação e exportação
São as instruções de importação e exportação que permite a linguagem importar ou exportar dados para o
disco em arquivos texto.
Instrução Output
Sintaxe Output to
OUTPUT TO c:\temp\customer.d.
OUTPUT CLOSE.
/* ABRIR A IMPRESSORA */
OUTPUT TO PRINTER.
DISP customer.custnum
customer.NAME
customer.address.
186
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
END.
OUTPUT CLOSE.
/* FECHOU A IMPRESSORA */
OUTPUT TO TERMINAL.
OUTPUT CLOSE.
OUTPUT TO VALUE('C:\treinamento\fev.2015\basico\OUTPUT_05.TXT').
OUTPUT CLOSE.
OUTPUT CLOSE.
OUTPUT TO 'CLIPBOARD'.
/* CUIDADO, POIS A AREA DE TRANSFERENCIA É LIMITADA */
OUTPUT CLOSE.
/*
CTRL-V
187
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
*/
*O Clipboard, ou área de transferência, é limitada e não abriga muita informação, então somente deve ser
usado para pouca transferir informação ou então a exportação ocorrerá incompleta.
OUTPUT
STREAM CLIENTE
TO C:\treinamento\fev.2015\basico\OUTPUT_07_CUSTOMER.TXT.
OUTPUT
STREAM REPRES
TO C:\treinamento\fev.2015\basico\OUTPUT_07A_SALESREP.TXT.
DISP
STREAM CLIENTE
CUSTOMER.CUSTNUM CUSTOMER.NAME
WITH STREAM-IO.
DISP
STREAM REPRES
SALESREP.SALESREP SALESREP.REPNAME
WITH STREAM-IO.
END.
END.
OUTPUT
STREAM REPRES
CLOSE.
OUTPUT
STREAM CLIENTE
CLOSE.
*Stream é a direção do fluxo, ou destino da exportação, muito útil quando temos que exportar dados ao
mesmo tempo e para arquivos, impressoras diferentes, um exemplo comum seria ter que direcionar a
mesma informação para uma impressora e para o terminal no mesmo momento.
OUTPUT
STREAM A4
TO C:\treinamento\fev.2015\basico\OUTPUT_08_A4.TXT.
188
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
OUTPUT
STREAM ARQUIVO
TO C:\treinamento\fev.2015\basico\OUTPUT_08_ARQUIVO.TXT.
OUTPUT
STREAM IMPRESSORA
TO C:\treinamento\fev.2015\basico\OUTPUT_08_printer.TXT.
DISP
STREAM A4
CUSTOMER.CUSTNU CUSTOMER.NAME
WITH STREAM-IO
FRAME A4.
DISP
STREAM A4
ORDER.ORDERNUM
ORDER.ORDERDATE
WITH STREAM-IO
DOWN
FRAME A4-ORDERLINE.
DOWN WITH FRAME A4-ORDERLINE.
DISP
STREAM ARQUIVO
CUSTOMER.CUSTNUM
CUSTOMER.NAME
ORDER.ORDERNUM
ORDER.ORDERDATE
WITH STREAM-IO
DOWN
FRAME ARQUIVO.
DISP
STREAM IMPRESSORA
ORDER.ORDERNUM
ORDER.ORDERDATE
ORDER.CUSTNUM
CUSTOMER.NAME
ORDERLINE.LINENUM
ORDERLINE.ITEMNUM
ORDERLINE.QTY
ORDERLINE.PRICE
ORDERLINE.EXTENDEDPRICE
WITH STREAM-IO
WIDTH 333
DOWN
FRAME IMPRESSORA.
END.
END.
END.
189
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
OUTPUT
STREAM IMPRESSORA
CLOSE.
OUTPUT
STREAM ARQUIVO
CLOSE.
OUTPUT
STREAM A4
CLOSE.
OUTPUT TO PRINTER
NUM-COPIES 2
LANDSCAPE
.
OUTPUT CLOSE.
Instrução Put
Para escrever dados na saída de dados podemos utilizar as instruções Display, Export ou Put.
Sintaxe Put
PUT
[ STREAM stream | STREAM-HANDLE handle ]
[ UNFORMATTED ]
[ { expression
[ FORMAT string ]
[ { AT | TO } expression ]
}
| SKIP [ ( expression ) ]
| SPACE [ ( expression ) ]
] ...
Exemplo de Put
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_10A_put.txt.
PUT customer.custnum.
END.
OUTPUT CLOSE.
Exemplo de Put e opção Unformatted
190
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_10B_put.txt.
PUT
UNFORMATTED
customer.custnum SKIP
customer.NAME SKIP(2).
END.
OUTPUT CLOSE.
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_10c_put.txt.
PUT
UNFORMATTED
customer.custnum AT 50 SPACE(5)
customer.NAME SKIP(2).
END.
OUTPUT CLOSE.
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_10e_put.txt.
PUT
UNFORMATTED
customer.custnum AT 50 SPACE(5)
customer.NAME TO 60 SKIP(2).
END.
OUTPUT CLOSE.
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_10f_put.txt.
PUT
UNFORMATTED
'codigo=' customer.custnum AT 5
'nome=' AT 20 customer.NAME
SKIP.
END.
OUTPUT CLOSE.
Este programa exemplo produzirá arquivo semelhante a:
191
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_11B_export.TXT.
PUT UNFORMATTED
Item.Itemnum ';'
Item.ItemName ';'
Item.Allocated ';'
Item.CatDescription ';'
Item.Category1 ';'
Item.Category2 ';'
Item.CatPage ';'
Item.Minqty ';'
Item.Onhand ';'
Item.OnOrder ';'
Item.Price ';'
Item.ReOrder ';'
Item.Special ';'
Item.Weight
SKIP
.
END.
OUTPUT CLOSE.
192
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_12_CODEPAGE.TXT.
PUT
"Se Alex tem uma história rica no clube, Robinho ainda começa sua
trajetória com a camisa alviverde. Além de amigos que jogaram juntos no
Coritiba nos dois últimos anos que, os dois têm em comum na carreira no
clube um lindo gol marcado contra Rogério Ceni.".
OUTPUT CLOSE.
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_12A_CODEPAGE.TXT
NO-CONVERT
.
PUT
"Se Alex tem uma história rica no clube, Robinho ainda começa sua
trajetória com a camisa alviverde. Além de amigos que jogaram juntos no
Coritiba nos dois últimos anos que, os dois têm em comum na carreira no
clube um lindo gol marcado contra Rogério Ceni.".
OUTPUT CLOSE.
*Por termos CPSTREAM e CPINTERNAL distintos, todo Assign é convertido em memória, por este motivo o
uso de NO-CONVERT pode resolver alguns problemas incômodos de caracteres inválidos. Após executar
estes programas, abra os arquivos gerados no NOTEPAD e veja a diferença de usar o NO-CONVERT e
CONVERT.
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_12B_CODEPAGE.TXT
CONVERT TARGET 'ISO8859-1'
.
PUT
"Se Alex tem uma história rica no clube, Robinho ainda começa sua
trajetória com a camisa alviverde. Além de amigos que jogaram juntos no
Coritiba nos dois últimos anos que, os dois têm em comum na carreira no
clube um lindo gol marcado contra Rogério Ceni.".
OUTPUT CLOSE.
Instrução Export
Sintaxe Export
193
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Exemplo de Export
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_11_export.TXT.
EXPORT ITEM.
END.
OUTPUT CLOSE.
Este exemplo produzirá arquivo
OUTPUT TO C:\treinamento\fev.2015\basico\OUTPUT_11_export.TXT.
EXPORT
DELIMITER ';'
ITEM.
END.
OUTPUT CLOSE.
O exemplo produzirá arquivo semelhante à:
Instrução Display
Sintaxe Display
DISPLAY
{ [ STREAM stream | STREAM-HANDLE handle ] [ UNLESS-HIDDEN ] }
[ { expression
[ format-phrase ]
[ ( aggregate-phrase ) ]
[ WHEN expression ]
[ @base-field ]
}
| [ SPACE [ ( n ) ] ]
194
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
| [ SKIP [ ( n ) ] ]
] ...
{ [ IN WINDOW window ] [ frame-phrase ] [ NO-ERROR ] }
Anotações
Instrução Input
Para manipularmos a entrada de dados utilizamos a instrução Input from.
Sintaxe
Exemplo simples
Exemplo de Input
195
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
INPUT FROM
'C:\treinamento\fev.2015\basico\OUTPUT_11_export.TXT'.
REPEAT:
IMPORT
codigoitem
nomeitem
precoitem.
MESSAGE
'codigoItem' codigoItem SKIP
'nomeItem ' nomeItem SKIP
'precoItem ' precoItem
VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
END.
INPUT CLOSE.
Exemplo de Input com Criação de Registros em Tabela
INPUT FROM
'C:\treinamento\fev.2015\basico\OUTPUT_11_export.TXT'.
REPEAT TRANSACTION:
CREATE TTITEM.
IMPORT
TTITEM.
END.
INPUT CLOSE.
*O uso do Transaction e Temp-table sem No-Undo é obrigatório para o Create para Temp-Table pois evitará
de um registro em branco ser adicionado – Uma temp-table não cria uma transação, logo o REPEAT deve ter
a opção TRANSACTION obrigatoriamente.
INPUT FROM
'C:\treinamento\fev.2015\basico\OUTPUT_11a_export.TXT'.
196
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
REPEAT TRANSACTION:
CREATE TTITEM.
IMPORT
DELIMITER ';'
TTITEM.
END.
INPUT CLOSE.
REPEAT:
END.
INPUT CLOSE.
Anotações
197
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Exercício
Para a nomenclatura dos exercícios, utilize a máscara INP_OUT_<número do exercício>.P (INP_OUT_1.p,
INP_OUT_2.p).
"100" "Consulting"
"200" "Administration"
"300" "Marketing"
"400" "Sales"
"500" "Training"
"600" "Development"
"700" "Finance"
198
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Sintaxe Publish
Exemplo Publish
PUBLISH "novaMensagem".
Sintaxe Subscribe
Exemplo Subscribe
Eventos nomeados são um meio totalmente diferente dos eventos em mouse como mouse-select-click,
widgets como choose, value-changed, leave e nos outros objetos da linguagem ABL.
Através do handle SOURCE-PROCEDURE pode-se obter informações do programa que gerou a notificação.
Não há uma ordem de notificação quando há vários programas inscritos nos eventos nomeados.
Somente programas com a assinatura do método (nome e entrada de parâmetros) que coincidem com o
evento nomeado receberão notificação.
1. Executar os programas de modo persistente, tanto os que desejam ser notificados quando o que
será o gerador do evento.
2. Todos os programas que desejam receber notificação de evento deverão se inscrever em um outro
programa,
3. Um ou vários programas pulicam o evento.
4. Todos os programas inscritos serão notificados.
1. App0.p é o programa responsável por executar os programas que receberão eventos e, por fim
meramente didático, também receberá notificação.
2. App1.p é o programa que publicará a notificação de evento.
199
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
PROCEDURE receberNotificacao:
/* procedure recebernotificacao, ESTE NOME DO EVENTO QUE SERÁ
PUBLICADO*/
DEFINE INPUT PARAMETER pValor AS CHARACTER NO-UNDO.
200
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
PROCEDURE notificar:
/* notificar os programas inscritos */
DEFINE INPUT PARAMETER pMensagem AS CHARACTER NO-UNDO.
PROCEDURE inscrever:
/* recebendo o handle do programa que notifica
e se inscrevendo
*/
DEFINE INPUT PARAMETER pApp1 AS HANDLE NO-UNDO.
PROCEDURE receberNotificacao:
/* procedure recebernotificacao, ESTE NOME DO EVENTO QUE SERÁ
PUBLICADO*/
DEFINE INPUT PARAMETER pValor AS CHARACTER NO-UNDO.
PROCEDURE receberNotificacao:
/* procedure recebernotificacao, ESTE NOME DO EVENTO QUE SERÁ
PUBLICADO*/
DEFINE INPUT PARAMETER pValor AS CHARACTER NO-UNDO.
MESSAGE 'App3 tambem foi notificada com uma mensagem=' pValor SKIP
'Quem me notificou=' SOURCE-PROCEDURE:FILE-NAME
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
Anotações
201
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Sintaxe
UNSUBSCRIBE TO “minhaNotificacao”.
UNSUBSCRIBE TO ALL.
202
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Compilador
É a ferramenta ou instrução da linguagem que permite compilarmos programas.
Sintaxe Compile
Opção Xref
Permite verificarmos o uso de índices durante pesquisas de dados com comandos For Each e Find.
Exemplo
Anotações
203
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Ao compilarmos um programa com Xref, a análise do arquivo gerado deverá focar as linhas com Search, pois
identificará o índice utilizado.
Exemplo
...
adapters\xml\pgm\axrpg007.p include\i-prgvrs.i 46 SEARCH emsfnd.prog_dtsul
prgdtsl_id
...
...
...
adapters\xml\pgm\axrpg007.p include\i-prgvrs.i 59 SEARCH emsfnd.prog_dtsul
prgdtsl_02
...
...
Com a análise do índice utilizado e verificação do índice na tabela é possível sugerir a criação de novo índice
ou a mudança da pesquisa (find e for each).
Em alguns casos podemos ter a informação de Whole-index, que indica que a pesquisa está varrendo toda a
tabela sem uma faixa inicial ou final de dados ou pela falta de índice apropriado para a pesquisa.
Opção Preprocess
Permite criarmos um novo programa com todos os includes adicionados.
Exemplo
Anotações
Opção Listing
A opção Listing permite verificar o uso de blocos, seus tipos e seus rótulos, e onde se iniciam e terminam
transações.
Exemplo
Resultado
204
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
{} Line Blk
-- ---- ---
1 def temp-table ttCustomer no-undo like customer
2 index ix_custnum is primary is unique custnum
3 index name name.
4
5 1 for each customer no-lock:
6 1 create ttCustomer.
7 1 buffer-copy customer to ttCustomer.
9
8 end.
10 for each ttCustomer
11 1 use-index name:
12 1
13 1
14 1
15 end.
16
c:\temp\bf_tt_4.p 04/04/2012 19:27:03 PROGRESS(R)
Page 2
Anotações
205
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Anexos
Prova de certificação
Uma das questões da prova de certificação é esta abaixo, mas o aluno terá que desenvolver as funções
ausentes, como:
1. Tabela pai,
a. Adição,
b. Alteração,
c. Detalhar,
d. Remover,
e. Imprimir (Cliente e seus pedidos),
f. Janela pesquisar (Adicionar faixa inicial e final por código do cliente, filtrando os clientes que
estiverem dentro da faixa),
2. Tabela filho (browse de pedidos do cliente)
a. Adição,
b. Alteração,
c. Detalhar,
d. Remover,
e. Total de pedidos do cliente.
Janela pesquisar
Imagem da janela pesquisar da prova
207
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Syntax :
Description :
208
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
TOOLTIP 'Último'.
209
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
DISPLAY
{&TABELA-FILHO}.Ordernum
{&TABELA-FILHO}.OrderDate
{&TABELA-FILHO}.SalesRep
{&TABELA-FILHO}.OrderStatus
WITH
8 DOWN
WIDTH 75
TITLE 'Pedidos do Cliente'
NO-ROW-MARKERS.
BT-SEARCH
BT-ADD
BT-EDIT
BT-DETAIL
BT-DELETE
210
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
WITH
SIZE 80 BY 22
THREE-D
TITLE ''
SIDE-LABELS.
PROCEDURE DATASEARCH:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
DEFINE OUTPUT PARAMETER PR-{&TABELA} AS ROWID NO-UNDO.
211
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
WITH
DEFAULT-BUTTON BT-OK
CANCEL-BUTTON BT-CANCEL
SIZE 80 BY 16
VIEW-AS DIALOG-BOX
TITLE 'Pesquisar'
THREE-D.
ON 'VALUE-CHANGED' OF BW-{&TABELA}
DO:
IF AVAILABLE BF-{&TABELA} THEN
PR-{&TABELA} = ROWID(BF-{&TABELA}).
END.
ON 'CHOOSE' OF BT-OK
DO:
RETURN 'OK'.
END.
ON 'CHOOSE' OF BT-CANCEL
DO:
RETURN 'NOK'.
END.
ON 'MOUSE-SELECT-DBLCLICK' OF BW-{&TABELA}
DO:
APPLY 'CHOOSE' TO BT-OK.
END.
WAIT-FOR
CHOOSE OF BT-OK OR CHOOSE OF BT-CANCEL IN FRAME FRAMESEARCH.
END PROCEDURE.
PROCEDURE DISPLAYTABLE:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
IF NOT AVAILABLE {&TABELA} THEN
RETURN.
DISPLAY
Customer.CustNum
Customer.Name
Customer.Contact
Customer.Phone
Customer.CreditLimit
TOTAL-PEDIDOS
212
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
END PROCEDURE.
PROCEDURE GOTOFIRST:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
FIND FIRST {&TABELA} NO-LOCK.
RUN OPENQUERYSON1.
RUN DISPLAYTABLE.
END PROCEDURE.
PROCEDURE GOTOLAST:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
FIND LAST {&TABELA} NO-LOCK.
RUN OPENQUERYSON1.
RUN DISPLAYTABLE.
END PROCEDURE.
PROCEDURE GOTONEXT:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
FIND NEXT {&TABELA} NO-LOCK.
RUN OPENQUERYSON1.
RUN DISPLAYTABLE.
END PROCEDURE.
PROCEDURE GOTOPREV:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
FIND PREV {&TABELA} NO-LOCK.
RUN OPENQUERYSON1.
RUN DISPLAYTABLE.
END PROCEDURE.
PROCEDURE GOTOROWID:
/*------------------------------------------------------------------------------
Purpose:
Notes:
213
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
------------------------------------------------------------------------------*/
DEFINE INPUT PARAMETER P-REGISTRO AS ROWID NO-UNDO.
RUN OPENQUERYSON1.
RUN DISPLAYTABLE.
END PROCEDURE.
PROCEDURE INITIATE:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
ENABLE ALL
EXCEPT
Customer.CustNum
Customer.Name
Customer.Contact
Customer.Phone
Customer.CreditLimit
TOTAL-PEDIDOS
RUN GOTOFIRST.
RUN SETTITLE.
END PROCEDURE.
PROCEDURE OPENQUERYSON1:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
OPEN QUERY QR-{&TABELA-FILHO}
FOR EACH {&TABELA-FILHO} OF {&TABELA}
NO-LOCK.
END PROCEDURE.
PROCEDURE SETTITLE:
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
DO WITH FRAME FRAMEMAIN:
FRAME FRAMEMAIN:TITLE = SUBSTITUTE ('NEO STEP &1 - &2', '{&TITULO}',
'{&VERSAO}').
END.
214
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
END PROCEDURE.
ON 'CHOOSE' OF BT-FIRST
DO:
RUN GOTOFIRST.
END.
ON 'CHOOSE' OF BT-PREV
DO:
RUN GOTOPREV.
END.
ON 'CHOOSE' OF BT-NEXT
DO:
RUN GOTONEXT.
END.
ON 'CHOOSE' OF BT-LAST
DO:
RUN GOTOLAST.
END.
ON 'CHOOSE' OF BT-SEARCH
DO:
END.
RUN INITIATE.
215
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
216
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: Benefits
Table: BillTo
Table: Bin
ItemNum 8 1 + Itemnum
WarehouseNumItemNum 8 2 + WarehouseNum
+ Itemnum
Table: Customer
CountryPost 10 2 + Country
+ PostalCode
pu CustNum 10 1 + CustNum
Name 10 1 + Name
SalesRep 10 1 + SalesRep
Table: Department
Table: Employee
pu EmpNo 7 1 + EmpNum
u Name 7 2 + LastName
+ FirstName
Table: Family
217
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: Feedback
w Company 12 1 + Company
w Contact 12 1 + Contact
p Department 12 1 + Department
Rating 12 1 + Rating
Table: InventoryTrans
Table: Invoice
InvoiceDate 12 1 + InvoiceDate
pu InvoiceNum 12 1 + Invoicenum
OrderNum 12 1 + OrderNum
Table: Item
Category2ItemName 8 2 + Category2
+ ItemName
CategoryItemName 8 2 + Category1
+ ItemName
w ItemName 8 1 + ItemName
pu ItemNum 8 1 + Itemnum
Table: LocalDefault
Table: Order
218
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
OrderDate 11 1 + OrderDate
pu OrderNum 11 1 + Ordernum
OrderStatus 11 1 + OrderStatus
SalesRep 11 1 + SalesRep
Table: OrderLine
pu orderline 11 2 + Ordernum
+ Linenum
OrderLineStatus 11 1 + OrderLineStatus
Table: POLine
Table: PurchaseOrder
Table: RefCall
u CustNum 12 2 + CustNum
+ CallNum
ua Sibling 12 2 + Parent
+ CallNum
w Txt 12 1 + Txt
Table: Salesrep
Table: ShipTo
219
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
+ ShipToID
Table: State
Table: Supplier
Table: SupplierItemXref
pu SupplieridItemNum 8 2 + SupplierIDNum
+ Itemnum
Table: TimeSheet
Table: Vacation
Table: Warehouse
pu warehousenum 8 1 + WarehouseNum
BillTo:
Order OF BillTo (CustNum,BillToID)
BillTo OF Customer (CustNum)
BillTo OF State (State)
220
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Bin:
InventoryTrans OF Bin (BinNum)
Bin OF Item (Itemnum)
Bin OF Warehouse (WarehouseNum)
Customer:
Invoice OF Customer (CustNum)
RefCall OF Customer (CustNum)
ShipTo OF Customer (CustNum)
BillTo OF Customer (CustNum)
Order OF Customer (CustNum)
Customer OF Salesrep (SalesRep)
Customer OF State (State)
Department:
Employee OF Department (DeptCode)
Employee:
TimeSheet OF Employee (EmpNum)
Vacation OF Employee (EmpNum)
Family OF Employee (EmpNum)
Benefits OF Employee (EmpNum)
Employee OF State (State)
Employee OF Vacation (EmpNum,StartDate)
Employee OF Department (DeptCode)
Employee OF Benefits (EmpNum)
Family:
Family OF Employee (EmpNum)
Family OF Benefits (EmpNum)
Feedback:
No relations found for this file.
InventoryTrans:
InventoryTrans OF Item (Itemnum)
InventoryTrans OF Order (Ordernum)
InventoryTrans OF Warehouse (WarehouseNum)
InventoryTrans OF Bin (BinNum)
InventoryTrans OF PurchaseOrder (PONum)
Invoice:
Invoice OF Customer (CustNum)
Item:
OrderLine OF Item (Itemnum)
Bin OF Item (Itemnum)
InventoryTrans OF Item (Itemnum)
POLine OF Item (Itemnum)
SupplierItemXref OF Item (Itemnum)
LocalDefault:
No relations found for this file.
Order:
OrderLine OF Order (Ordernum)
InventoryTrans OF Order (Ordernum)
Order OF Customer (CustNum)
Order OF Salesrep (SalesRep)
Order OF ShipTo (CustNum,ShipToID)
221
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
OrderLine:
OrderLine OF Item (Itemnum)
OrderLine OF Order (Ordernum)
POLine:
POLine OF Item (Itemnum)
POLine OF PurchaseOrder (PONum)
PurchaseOrder:
InventoryTrans OF PurchaseOrder (PONum)
POLine OF PurchaseOrder (PONum)
PurchaseOrder OF Supplier (SupplierIDNum)
RefCall:
RefCall OF Customer (CustNum)
RefCall OF Salesrep (SalesRep)
Salesrep:
Customer OF Salesrep (SalesRep)
RefCall OF Salesrep (SalesRep)
Order OF Salesrep (SalesRep)
ShipTo:
Order OF ShipTo (CustNum,ShipToID)
ShipTo OF Customer (CustNum)
ShipTo OF State (State)
State:
Customer OF State (State)
Employee OF State (State)
ShipTo OF State (State)
BillTo OF State (State)
Supplier OF State (State)
Warehouse OF State (State)
Supplier:
PurchaseOrder OF Supplier (SupplierIDNum)
SupplierItemXref OF Supplier (SupplierIDNum)
Supplier OF State (State)
SupplierItemXref:
SupplierItemXref OF Item (Itemnum)
SupplierItemXref OF Supplier (SupplierIDNum)
TimeSheet:
TimeSheet OF Employee (EmpNum)
TimeSheet OF Benefits (EmpNum)
Vacation:
Employee OF Vacation (EmpNum,StartDate)
Vacation OF Employee (EmpNum)
Vacation OF Benefits (EmpNum)
Warehouse:
Order OF Warehouse (WarehouseNum)
Bin OF Warehouse (WarehouseNum)
InventoryTrans OF Warehouse (WarehouseNum)
222
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: BillTo
Table: Bin
Table: Customer
223
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: Department
Table: Employee
Table: Family
Table: Feedback
Table: InventoryTrans
224
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: Invoice
Table: Item
Table: LocalDefault
Table: Order
225
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: OrderLine
Table: POLine
Table: PurchaseOrder
Table: RefCall
226
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: Salesrep
Table: ShipTo
Table: State
Table: Supplier
Table: SupplierItemXref
227
Dalto Blanco Programando com Progress ABL v.1.5
(18) 99747-8189
Table: TimeSheet
Table: Vacation
Table: Warehouse
228