Você está na página 1de 56

Progress V8.

2A

Enviado por:
CLAUDIUS EDELSBRUNNER
Progress V8.2A

Por Sandro Matos


Fábio Victor Pfeiff
Claudius Edelsbrunner

2
Porto Alegre, agosto de 1998.
Sumário
1 Conhecendo o Progress
1.1 O que é Progress
1.2 Gerenciamento da Base de Dados Relacional Progress
1.3 DataServer para outros Sistemas de Gerenciamento
1.4 Client / Server Parameters: Arquivo .pf
1.5 Formas de Conexão a bancos Progress via sessões Progress
1.5.1 Mono-usuário
1.5.2 Multi-usuário
1.5.3 Exercício: conectando a um banco Progress mono-usuário
1.6 Principais Extensões dos Arquivos Gerados pelo Progress
1.7 Variáveis de Ambiente - Propath
1.8 Dump

2 Procedure Editor
2.1 File – operações sobre arquivos
2.2 Edit
2.2.1 Desfazendo ações
2.2.2 Recortando, copiando e colando
2.2.3 Inserindo campos de tabelas
2.3 Search – buscando/substituindo no programa corrente ocorrências de texto
2.4 Buffers
2.4.1 Abrindo um novo buffer
2.4.2 Alternando entre buffers
2.5 Compile
2.5.1 Run
2.5.2 Check Sintax
2.6 O Menu de Contexto

3 Conhecendo os Comandos do Progress


3.1 Comentários em Progress
3.2 Tipo de Dados
3.3 Declaração de Estruturas Auxiliares
3.3.1 Variáveis
3.3.2 Buffers Auxiliares
3.3.3 Tabelas Temporárias
3.3.4 Procedures e Funções
3.3.5 Parâmetros
3.4 Exercícios
3.5 Comandos Básicos
3.5.1 Atribuição
3.5.2 Entrada e Saída
3.5.3 Bloco e Repetição
3.5.4 Condicionais
3.5.5 Para manipulação de registros
3.5.6 Querys
3.5.7 Quebra de bloco
3.5.8 Execução de programas externos

3
3.6 Funções mais Utilizadas
3.7 Exercícios (reservar um simples para a aula do dia seguinte)
3.8 Pré-processamento
3.8.1 Diretivas
3.8.2 Funções
3.9 Exercício
3.10 Includes

4 User Interface Builder


4.1 User Interface Builder
4.2 A Palette de Componentes

5 Suporte a Interface Gráfica embutida em Progress 4GL


5.1 Atributos Básicos
5.2 Exercícios (utilizando screen-value, num-items, sensitive, …)
5.3 Métodos Básicos
5.4 Diretivas de Pré-processamento mais utilizadas
5.5 Exercícios

6 Progress ACE
6.1 Apresentando o ACE
6.2 Apresentando o ADM
6.3 SmartObjects
6.4 Exercícios

7 Links
7.1 Criando um Master Object a partir de um template
7.2 Tabelas Externas
7.2.1 O que são / para quê servem
7.2.2 Exercício
7.3 Organizando Masters em Diretórios
7.4 O que é um Link?
7.5 Exercícios
7.6 Tabela de Links possíveis
7.7 Progress Advisor
7.8 Estratégias de Links para Múltiplos Record Targets
7.9 Definição de Links no UIB

8 Paginando uma Aplicação


8.1 Paginando uma Aplicação
8.2 Links
8.3 Exercícios
8.4 Persistent Procedures

9 Enviando Mensagens (Messaging)


9.1 Messaging
9.2 Messaging e Tipo de Links
9.3 ADM messaging para cada Tipo de Link
9.4 Event Procedure e Method Procedure
9.4.1 Event Procedure

4
9.4.2 Method Procedure
9.4.3 Comparação entere Event Procedure e Method Procedure
9.4.4 Como Trabalhar com Event Procedure
9.4.4.1 Dispatch
9.4.4.2 Notify
9.4.5 Como Alterar Event Procedures?
9.5 Mapa de Eventos

10 SmartBrowse com Enable Column

11 New-State Method

5
1 Conhecendo o Progress

1.1 O que é PROGRESS ?

Progress é um ambiente de desenvolvimento baseado na tecnologia


cliente/servidor que visa oferecer soluções informatizadas a problemas das inúmeras
áreas de negócio existentes. Para atingir tal meta, o Ambiente de Desenvolvimento de
Aplicações Progress (ADE) oferece um completo e integrado conjunto de ferramentas
de desenvolvimento gráfico para produtivamente construir, testar, e manter
aplicações. No centro do ADE está a linguagem de 4ª geração Progress (4GL).
A ferramenta apresenta recursos das modernas técnicas de orientação a
objetos, que busca reduzir custos de desenvolvimento e manutenção, aumento de
produtividade, de qualidade, eliminação de redundância de código, entre outros.
Como base temos o Data Dictionary (Dicionário de Dados) que auxilia as definições
de dados com armazenamento centralizado e suporte para análise e projeto de
ferramentas.

1.2 Gerenciamento da Base de Dados Relacional Progress

Para as demandas especiais de aplicações ‘Críticas’, muitas empresas


escolheram o Sistema de Gerenciamento de Base de Dados Relacional (RDBMS –
Relational Database Management System) Progress. O Progress RDBMS é totalmente
integrado à arquitetura Progress DataServer. É uma solução de base de dados de alta
performance para aplicações do mundo real. Aplicações ‘Críticas’ exigem não
somente a habilidade de suportar alto volume de processamento de transações
simples, mas também alto rendimento e baixo tempo de resposta para transações mais
complexas que integram várias aplicações de negócio.
O Progress RDBMS possui um conjunto de recursos com o objetivo específico
de suportar tais ambientes onde a execução de um alto volume de transações,
integridade de dados garantida e alta disponibilidade são necessárias. O máximo
rendimento é proporcionado por capacidades tais como:
• lock a nível de registro, que minimiza a contenção de dados;
• estratégias de otimização de consultas que melhoram o tempo para
recuperação de dados;
• uma inteligente buferização de registros que reduz o tráfego da rede.
A integridade dos dados é assegurada através de características de recovery. O
Progress RDBMS é projetado com flexibilidade para tirar o máximo proveito das
características únicas de desempenho de diferentes plataformas e sistemas
operacionais. E, quando utilizado no ambiente cliente/servidor, com configuração
baseada em rede, as aplicações Progress podem comunicar-se com o RDBMS,
utilizando qualquer protocolo padrão de rede.

1.3 DataServer Para Outros Sistemas de Gerenciamento

Para quem deseje acessar dados ou executar aplicações utilizando sistemas de


gerenciamento de bases de dados não-Progress, existe o Progress DataServer, que

6
suporta a maioria das bases de dados e sistemas de arquivos de terceiros. Esta
ferramenta possibilita gerenciamento e acesso de alta performance, portabilidade das
aplicações através de gerenciadores de dados e suporte a características específicas da
base de dados.
Alguns dos gerenciadores de dados suportados: Oracle, RMS, Sybase,
RDB/VMS, OS/400, Object Store, DB2, Albase, ODBC, C-Isam, Informix.
1.4 Client Server Parameters: Arquivo .pf

-E # European Numeric Format


-d dmy # Date Format
-yy 1920 # Century
-cpinternal iso8859-1 # Internal Code Page
-db u:\sports\sports.db # Database Name
-1 # Single-user Mode
-H meta1 # Host Name
-S ssports # Service Name
-N tcp # Protocol Name
-T C:\TMP # Temporary Directory File
-trig e:\trg\ # Trigger Directory
-Mm 8192 # Message Buffer Size
-s 40 # Stack Size
-mmax 2048 # Maximum Memory
-Mr 2048 # Record Buffer Size
-TB 08 # Speed Sort
-TM 10 # Merge Number
-p _desk.p # Program Manager

Obs.: Parâmetros client-server são case-sensitive. O mesmo caracter (ou conjunto de caracteres ) pode
especificar diferentes parâmetros à sessão Progress. Exemplo: -S (especifica o serviço utilizado para
conexão a um servidor de banco Progress) e -s (tamanho da pilha alocada no client).

1.5 Formas de Conexão a bancos Progress via sessões Progress

1.5.1 Mono-usuário

Uma conexão mono-usuário permite a somente um único usuário acessar a(s)


base(s) conectada(s) desta forma. O usuário monopoliza o(s) banco(s) de dado(s).

1.5.2 Multi-usuário

Progress, no entanto, é destinado ao desenvolvimento de aplicações baseado


na arquitetura client-server (um programa cliente faz uma solicitação a um programa
servidor, que usualmente está executando em uma máquina remota).
O acesso concorrente (ou seja, vários usuários disputando um registro) é
gerenciado por um programa conhecido por servidor de banco de dados. Os usuários
fazem solicitações a esse programa, que as responde conforme a sua disponibilidade e
a do registro.

7
1.6 Principais Extensões dos Arquivos Gerados pelo Progress

.p Procedures e Triggers de Banco de Dados


.i Includes
.r Programas compilados
.db Base de Dados
.bi Before Image da Base de Dados
.ai After image da Base de Dados
.lk Lock da base da dados
.lg Registro das todas as ocorrências relativas a uma base de dados
.w Smart Windows, Smart Dialog, Smart Frames, Smart Browsers, Smart
Viewers, Smart Panels e Smart Querys
.wx Templates
.wbx Quando compilada um objeto contendo um componente VBX/OCX, é gerado
um arquivo de mesmo nome com esta estensão
.uib Arquivo temporário do User Interface Builder (UIB)
.ped Arquivo temporário do Procedure Editor
.dbg Arquivo temporário do Application Debugger
.df Dump de definição da Base de Dados
.d Dump dos dados
.ds Dados ou definições que foram carregados para a Base de Dados através do
comando ‘Load’
.e Log de erro gerado na carga de dados ou definições

1.7 Variáveis de Ambiente - Propath

Progress possui algumas variáveis de ambiente. A mais importante para quem


desenvolve software utilizando Progress é o propath. Esta variável contém os
diretórios, separados por vírgulas, que a sessão Progress enxerga quando tem que
procurar um programa para execução. A importância de conhecê-la é simples: se você
coloca um programa em um diretório que não está presente no propath, e tenta
executá-lo, o Progress lhe devolverá uma mensagem de erro com o seguinte texto:
“<programa> not found.”.
Seu valor pode ser alterado por um administrador de sistemas conforme a
necessidade.

1.8 Dump

8
ADD TABLE "CLIENTE"
DESCRIPTION "Cadastro de Clientes"
DUMP-NAME "cliente"
LABEL "Cliente Geral"

ADD FIELD "numcliente" OF "CLIENTE" AS INTEGER


DESCRIPTION "Número do Cliente"
FORMAT "999999999"
LABEL "Número do Cliente"
VALEXP "numcliente > 0"
VALMSG "Número do Cliente inválida"
HELP "Número do Cliente."
ORDER 10
MANDATORY

ADD FIELD "nomcliente" OF "CLIENTE" AS CHAR


DESCRIPTION "Nome do Cliente"
FORMAT "X(80)"
LABEL "Nome do Cliente"
VALEXP "nomcliente <> """""
VALMSG "Nome do Cliente inválida"
HELP "Nome Completo do cliente"
ORDER 30
MANDATORY

ADD INDEX "XPKCLIENTE" ON "CLIENTE"


UNIQUE
INDEX-FIELD "numcliente" ASCENDING

UPDATE PRIMARY INDEX "XPKCLIENTE" ON "CLIENTE"


ADD INDEX "XAK1CLIENTE" ON "CLIENTE"
UNIQUE
INDEX-FIELD "nomabrev" ASCENDING

9
2 Procedure Editor

O Procedure Editor é uma Window Editor provida de funções auxiliares à


edição de código Progress. O desenvolvedor pode fazer uso do Procedure Editor para
criar, escrever, compilar e executar programas.
O presente capítulo dedica-se a conduzí-lo pelas funcionalidades desta
ferramenta mais utilizadas no dia-a-dia.

2.1 File – Operações Sobre Arquivos (exemplo – p-c02e01.p)

2.2 Edit

10
2.2.1 Desfazendo Ações
Este comando desfaz a última ação executada pelo usuário.

2.2.2 Recortando, copiando e colando


Semelhante a qualquer aplicação Windows que possua estas opções.

2.2.3 Inserindo campos de tabelas


Uma opção bastante interessante oferecida pelo Procedure Editor: se deseja-se
incluir um ou mais campos de uma tabela no código-fonte que se está construindo,
seleciona-se esta opção.

Há três listas de seleção:


Databases – apresenta todas as base de dados ao qual a sessão cliente Progress
está conectada;

11
Tables – mostra todas as tabelas contidas na base selecionada na lista
“Databases”;
Fields – apresenta todos os campos definidos para a tabela selecionada na lista
“Tables”.
Note que só é possível seleção múltipla na lista “Fields”.
O prefixo acrescido ao campo quando de sua inserção no código-fonte é opção
do construtor do código.

2.3 Search – buscando/substituindo no programa corrente ocorrências de texto

2.4 Buffers

Atalhos de teclado para os principais comandos:


F7 Torna o próximo buffer o corrente (se é o último, retorna ao
primeiro)

12
2.5 Compile

O editor do Progress possui recursos para a execução direta de comandos e


programas, e para a checagem da sintaxe do código que foi escrito ou alterado.
Atalhos de teclado para os principais comandos:
F2 Executa o programa/comando do buffer corrente do editor
Shift-F2 Verifica a sintaxe

2.6 O Menu de Contexto

Contém atalhos para algumas das funções mais utilizadas dos itens de menu já
abordados. Acessível via botão direito do mouse.

13
3 Conhecendo os Comandos do Progress
Dica – Acesso ao Help
Para conhecer a sintaxe de algum comando ou tirar alguma dúvida, basta marcar o comando escrito no
Procedure Editor e pressionar a tecla F1.

3.1 Comentários em Progress

A linguagem 4GL Progress permite a inserção de comentários em um


programa:
• /* Abre um comentário
• */ Encerra um comentário
Tudo o que é escrito entre estes dois tokens é ignorado pelo compilador. Muito
útil para:
• identificar um programa;
• descrever determinada solução dentro do programa (porquê foi fito de um
jeito e não de outro).
Podem existir comentários aninhados.

3.2 Tipo de Dados

Os tipos de dados comumente utilizados na implementação de aplicações


Progress
são:
- integer
- character
- date
- decimal
- logical
- handle
- rowid

3.3 Declaração de Estruturas Auxiliares

3.3.1 Variáveis

DEFINE VARIABLE <nome-variavel> AS <DataType> NO-UNDO.


DEFINE VARIABLE <nome-variavel> LIKE <Field> NO-UNDO.

Exemplos:
DEFINE VARIABLE variavel AS integer NO-UNDO INITIAL 100.
DEFINE VARIABLE variavel AS integer NO-UNDO.
DEFINE VARIABLE variavel Like Table.Campo NO-UNDO.
DEFINE NEW SHARED VARIABLE variavel AS logical INIT YES.
DEFINE SHARED VARIABLE variavel AS logical INIT YES.
DEFINE NEW GLOBAL SHARED VARIABLE variavel AS char NO-UNDO.
DEFINE SHARED VARIABLE variavel AS char NO-UNDO.
DEFINE VARIABLE variavel AS integer NO-UNDO EXTENT 03.

14
3.3.2 Declaração de Buffers Auxiliares

Um buffer é uma referência a uma tabela pertencente a um banco de dados.


Qualquer programa escrito em Progress sempre tem, por default, tantos buffers pré-
definidos quantas são as tabelas pertencentes aos bancos aos quais está conectado o
client Progress – um para cada tabela. Se temos uma tabela de nome CLIENTE em
um banco ao qual estamos conectados, então temos o buffer CLIENTE pré-definido
para uso. É por meio de buffers de tabelas que acessamos estas e seus atributos
(também conhecidos por campos).
Há situações, contudo, que nos obrigam a definir buffers auxiliares. Pode-se,
por exemplo, precisar de dois indicadores econômicos simultaneamente para
compará-los. Problemas de hierarquias (auto-relacionamentos) exigem buffers
auxiliares.

Sintaxe resumida (maiores detalhes – Help Progress):


DEFINE BUFFER <nome-buffer> FOR <nome-tabela>.

Exemplos:
DEFINE BUFFER bf-cargo FOR cargo.
DEFINE NEW SHARED BUFFER bf-funcao FOR funcao.
DEFINE SHARED BUFFER bf-funcao FOR funcao.

3.3.3 Tabelas Temporárias

Pode-se definir uma tabela pelo tempo de vida de um programa, ou mesmo


para trocar informações entre programas. Para tal, deve-se definir a mesma.
A sintaxe para definição de temp-tables é bastante abrangente, permitindo que
se defina tabelas auxiliares com todas as características encontradas em tabelas
criadas via Dicionário de Dados.

Exemplos:
DEFINE TEMP-TABLE tt-funcao LIKE FUNCAO.

DEFINE NEW GLOBAL SHARED TEMP-TABLE tt-tarefa NO-UNDO


FIELD tarefa-cod LIKE TAREFA.TAREFA-COD
FIELD t-deno LIKE TAREFA.DENOMINA
FIELD funcao-cod LIKE FUNCAO.FUNCAO-COD
FIELD f-deno LIKE FUNCAO.DENOMINA
FIELD status AS CHAR
INDEX xpkindprim IS PRIMARY UNIQUE tarefa-cod.

3.3.4 Procedures e Funções

Muitas vezes, deseja-se executar a mesma porção de código em mais de um


lugar de nosso programa, ou mesmo em mais de um programa. Um exemplo típico
são as regras de negócio que regem uma aplicação. Solução: abrir o programa, copiar
a porção de interesse e colar no lugar onde a queremos, certo?
Correto, se você gosta de passar trabalho. Suponha que a regra de negócio
mude. Você só terá que abrir todos os programas que contém aquela porção de código
e alterá-los…

15
O melhor é isolar esta lógica num único lugar, executando-a de onde quiser.
Se a Equipe Econômica resolve de um dia para o outro “alterar algumas regras”, e
isso afeta um programa seu, basta alterar um lugar.
Progress oferece dois mecanismos para auxiliar nesse processo: procedures e
funções (há um terceiro mecanismo, que será discutido posteriormente).

Digite, no Procedure Editor, “Procedure Statement”. Selecione esta


expressão e acompanhe a sintaxe.

Agora apague a expressão anterior e digite, no Procedure Editor, “Function


Statement”. Selecione esta expressão e acompanhe a sintaxe.

3.3.5 Parâmetros

Procedures e funções podem receber parâmetros (Input Parameters) e devolver


resultados através dos mesmos parâmetros pelos quais recebem (Output Parameters)
ou por outros parâmetros (Input-Output Parameters).
Da mesma forma que variáveis comuns, parâmetros tem um tipo (que pode ser
herdado de um campo de tabela ou definido a partir dos tipos básicos).
Procedures e funções diferem na sintaxe como são definidos os parâmetros.

Exemplo de definição de parâmetros para procedures


PROCEDURE EXEMPLO :
DEFINE INPUT PARAMETER parametro AS integer NO-
UNDO.
DEFINE OUTPUT PARAMETER parametro LIKE Tabela.Campo NO-
UNDO.
DEFINE INPUT-OUTPUT PARAMETER parametro LIKE Tabela.Campo NO-
UNDO.
<corpo da procedure>
END PROCEDURE.

Exemplo de definição de parâmetros para funções


FUNCTION EXEMPLO RETURNS decimal
(INPUT vp-a as integer,
OUTPUT vp-b as character,
INPUT-OUTPUT vp-c as logical).

<corpo da função>

RETURN <expressão que resulte decimal>.


END FUNCTION.

3.4 Exercícios
1) Abra o procedure editor. Crie um cabecalho com as seguintes informações, utilizando comentários
(cada informação deve iniciar nova linha):
 Autor;
 Data;
 Hora;
 Descrição (pode ocupar mais de uma linha);
 Verifique a sintaxe do programa;
 Salve no diretório “c:\prow82a\curso\exercicio” com o nome “p-c03x01.p”.
 Feche o programa.

16
2) Serão necessárias, para o próximo programa:
 Três variáveis do tipo integer;
 Uma variável do tipo decimal;
 Uma variável do tipo logical;
 Uma procedure, de nome p-baskara;
 Uma função, de nome f-baskara, que retorna um valor decimal. Defina-as. Ao concluir, verifique a
sintaxe.

3) Selecione e copie o que foi feito no exercício anterior.

4) Abra o programa feito no exercício “1”, e logo abaixo dos comentários, cole o que foi copiado no
exercício anterior. Verifique a sintaxe. Salve as alterações.

5) Defina três parâmetros de entrada para a procedure p-baskara, todos do tipo inteiro, e um
parâmetro de saída, do tipo decimal, respectivamente com os seguintes nomes: “vp-a”, “vp-b”,
“vp-c” e “vp-raiz”.

6) Abra, em outro buffer, o arquivo “baskara-p.p” e copie seu conteúdo. Feche este buffer e retorne a
seu programa. Cole o que foi copiado no corpo da procedure “p-baskara” (logo após os parâmetros
da mesma). Verifique a sintaxe. Salve as alterações.

7) Defina três parâmetros de entrada para a função f-baskara, todos do tipo inteiro, respectivamente
com os seguintes nomes: “vp-a”, “vp-b”, “vp-c”.

8) Abra, em outro buffer, o arquivo “baskara-f.p” e copie seu conteúdo. Feche este buffer e retorne a
seu programa. Cole o que foi copiado no corpo da procedure “f-baskara. Verifique a sintaxe. Salve
as alterações.

9) Abra, em outro buffer, o arquivo “baskara-exec.p” e copie seu conteúdo. Feche este buffer e
retorne a seu programa. Cole o que foi copiado duas linhas abaixo da função. Verifique a sintaxe.
Salve as alterações. Execute o programa.

17
3.5 Comandos Básicos

3.5.1 Comandos de Atribuição

 Assign <variavel> = <expressao>.


Atribui a <variavel> o resultado de <expressao>.

3.5.2 Comandos de Entrada/Saída


Há varios comandos em Progress que podem ser utilizados para efetuar
operações de entrada/saída. Os principais:
 Display
 Update
 Put
 Message

3.5.3 Comandos de bloco e de repetição

 End
Indica o fim de um bloco iniciado com um PROCEDURE, FUNCTION, DO,
REPEAT, CASE ou FOR EACH. No caso de procedures e funções, pode-se encerrar
também com “End Procedure.” ou “End Function.”.
 Do
Basicamente, agrupa comandos em um único bloco. O bloco aberto por este
comando deve ser encerrado por um comando End.
Exemplo: c:\Prow82a\Curso\Exemplos\p-c03e01.p

 Repeat
Inicia um bloco de comandos que são processados repetidamente, até que uma
condição de saída definida ocorra.
Exemplo: c:\ Prow82a\Curso\Exemplos\p-c03e02.p

3.5.4 Comandos Condicionais (ou de Controle de Fluxo)


 if <condicao> then <bloco/comando> else <bloco/comando>
A execução de um bloco fica condicionada a uma expressão.
Exemplo: c:\Prow82a\Curso\Exemplos\p-c03e01.p
 case
Quando, a partir da avaliação de uma expressão, tem-se múltiplas
possibilidades de execução (e não somente duas, como no comando “if”), utiliza-se o
comando case.
Obs.: O comando suporta dois encerramentos de bloco: “End.” e “End
Case.”.
Exemplo: c:\Prow82a\Curso\Exemplos\p-c03e03.p

3.5.5 Comandos para manipulação de registros


 Create <buffer>.
Cria um novo registro na tabela associada ao buffer.

18
 Delete <buffer>.
Exclui um registro da tabela associada ao buffer.

 Find <first/last/next/prev> <buffer> where <selecao> <lock>.


Busca um registro na tabela especificada com o filtro de seleção informado.
Exemplo: c:\Prow82a\Curso\Exemplos\p-c03e04.p
 For
Junto com o comando “find”, é um dos comandos mais importantes e
poderosos do Progress 4GL. É uma instrução de bloco que permite percorrer uma
tabela inteira. Se o registro atende à seleção imposta, o bloco interno ao comando é
executado, estando o registro selecionado disponível para consulta, exclusão,
alteração, etc.
Exemplos c:\Prow82a\Curso\Exemplos\p-c03e05.p
c:\Prow82a\Curso\Exemplos\p-c03e06.p

3.5.6 Querys

Querys são outra forma oferecida pelo Progress para se trabalhar com tabelas.
As diferenças básicas entre estas e o comando For são:
• querys não delimitam um bloco; a abertura e o fechamento de uma query
são comandos independentes, que não delimitam uma transação;
• uma query aberta não significa um registro disponível para manipulação.
Deve ser especificado à query que se deseja um registro (por exemplo, via
comando Get).
 Define query
Define uma query a ser utilizada.
 Open query
Abre uma query. Esta pode ter sido previamente definida, ou sua definição
pode fazer parte deste comando.
 Close query
Fecha uma query previamente aberta.
Exemplo: “c:\Prow82a\Curso\Exemplos\p-c03e07.p”

3.5.7 Comandos de quebra de bloco

São comandos utilizados quando se deseja evitar que um bloco execute até o
fim.
 Next
Todos os comandos até o fim do bloco são desprezados. Se faz parte de uma
iteração, segue imediatamente para a próxima iteração.
 Leave
Abandona o bloco, mesmo que se trate de um bloco iterativo. As iterações
seguintes não são efetuadas.
 Return
Utilizado em procedures e funções. Quando encontrado, força o fim da
execução da rotina. No caso de ser uma função, uma expressão a acompanha.

19
Exemplos:
Função “c:\Prow82a\Curso\Exercicio\p-c03x01.p”
“c:\Prow82a\Curso\Exercicio\p-c03r01.p”
Procedure “c:\Prow82a\Curso\Exemplos\p-c03e08.p”
 Quit
Encerra a execução da aplicação, retornando ao programa chamador, ou ao
sistema operacional (se o programa está executando diretamente sobre o client run-
time).

3.5.8 Comando para Execução de Procedures e Programas Externos


 RUN
Utilizado para executar internal procedures (que fazem parte do mesmo
programa de onde a chamada é feita), external procedures (procedures de programas
externos) ou até outros programas.
Exemplos:
Internal Procedures “c:\Prow82a\Curso\Exemplos\p-
c03e08.p”
External Procedures “c:\Prow82a\Curso\Exemplos\p-
c03e09.p”
Programas Externos “c:\Prow82a\Curso\Exemplos\p-
c03e10.p”

3.6 Funções mais utilizadas

3.6.1 Para conversão de tipos “c:\Prow82a\Curso\Exemplos\p-


c03e14.p”
Date(string)
Date(mês,dia,ano)
Integer
Decimal
String
Rowid

3.6.2 Sobre registros “c:\Prow82a\Curso\Exemplos\p-


c03e15.p”
Available
Can-find

3.6.3 Sobre listas “c:\Prow82a\Curso\Exemplos\p-


c03e16.p”
Entry
Num-entries
Lookup
Substring
Index
Replace

3.6.4 Sobre strings


Begins
Matches
Contains

3.6.5 Função Condicional


If Then Else

20
3.7 Exercícios

1) Exibir o conteúdo de todos os registros da tabela “Customer”.

2) Exibir o conteúdo de todos os registros da tabela “State”.

3) Executar as seguintes operações sobre a tabela “Customer”:


 criar um novo registro, atribuindo valores a seus campos de forma consistente;
 exibir o conteúdo do registro criado;
 alterar o registro criado;
 exibir o conteúdo do registro alterado;
 achar o último registro da tabela e apresentar uma mensagem ao usuário perguntando se ele deseja
excluí-la ou não. Caso o usuário queira, proceder à exclusão do registro.

4) Executar as seguintes operações sobre a tabela “Order”:


 procurar um registro na tabela de tal forma que não seja encontrado;
 ao invés de retornar uma mensagem de erro do Progress, programar uma mensagem de erro para
mandar ao usuário, indicando a inexistência do registro.

21
3.8 Pré-processamento

Exemplos: “c:\Prow82a\Curso\Exemplos\p-c03e11.p”
“c:\Prow82a\Curso\Exemplos\p-c03e12.p”
“c:\Prow82a\Curso\Exemplos\p-c03e13.p”

3.8.1 Diretivas

 &GLOBAL-DEFINE
 &SCOPED-DEFINE
 &UNDEFINE
 &IF &THEN &ELSEIF &ELSE &ENDIF

3.8.2 Funções
DEFINED (preprocessor)

3.9 Exercício
1) A tabela “Customer” possui um campo que determina o limite de crédito que um cliente possui
junto a nossa empresa – “Credit-Limit”. Suas tarefas são:
 mostrar em tela os campos “Cust-num”, “Name”, “Contact” e “Phone” de todas as ocorrências da
tabela “Customer” que possuem limite de crédito maior que um valor qualquer, sendo que esse
valor será definido em um preprocessor (ou seja, no filtro a ser utilizado sobre a tabela, deve-se
usar uma referência ao preprocessor, e não o valor fixo). Inicialmente, fixe o valor em $40.000,00.

3.10 Includes

Pode-se agregar a um programa trechos de código escritos porções espalhadas


por vários arquivos. Para tal, basta escrever o trecho de código que se deseja incluir
no programa, salvá-lo e, no programa que em se deseja utilizá-lo, fazer referência a
ele usando a seguinte sintaxe: {<nome-do-include> [<parametro-1> …
<parametro-n>]}
Os parâmetros são opcionais (sua existência é determinada pelo programador e
pelo progblema que se está resolvendo). Dentro do include, para fazer refeência a um
parâmetro, basta usar, entre chaves, o número de ordem do parâmetro desejado ( {1},
{2} ).
Se utilizado para bibliotecas de procedures, deve-se ter em mente as seguintes
diferenças entre executar uma procedure externa e utilizar um include:
 o código-objeto gerado pelo Progress incorpora todo o código do include,
em tempo de compilação (se o programa não foi previamente compilado -
execução);
 executar procedures e programas externos exige passagem de parâmetros –
o programa ou a procedure externa não conhece as estruturas internas do
programa chamador (o mesmo não vale para internal procedures).
Exemplo: “c:\Prow82a\Curso\Exemplos\p-c03e12.p”
“c:\Prow82a\Curso\Exemplos\p-c03e13.p”

22
4 UIB – User Interface Builder

O User Interface Builder é a ferramenta de programação visual do ambiente de


desenvolvimento Progress.

O código gerado pelo UIB apresenta as seguintes seções:

 Definitions
 Main Block
 Triggers
 Procedures
 Functions

4.1 User Interface Builder

Novo Objeto Executar um programa

Edição de Código para o Widget Ativo na Tela

Propriedades do Objeto Selecionado

23
4.2 Palette de Componentes

Pointer

Frame Legenda

Componentes de Acesso a Banco


Widgets
Componentes OCX
Smarts

24
5 Suporte a Interface Gráfica embutida em Progress
4GL
Progress 4GL implementa um enfoque orientado a objetos em vários pontos
distintos de sua ferramenta. A começar por seus widgets. Cada widget possui um
conjunto de atributos e métodos de instância comuns à sua classe (um combo-box ou
um toggle-box em nossa aplicação, nada mais são que instâncias de suas respectivas
classes, Combo-Box e Toggle-Box). O valor contido em um atributo pode diferir
entre duas instâncias de uma mesma classe, mas o acesso a este atributo é feito da
mesma maneira em ambos.
A sintaxe utilizada para referência a atributos e métodos é praticamente
idêntica.
Atributos < widget >:< atributo >
Métodos < widget >:< método(<arg1>, …,<argn>) >

5.1 Atributos Básicos “c:\Prow82a\Curso\Exemplos\w-c05e17.w”

 Visible
Controla se o widget está ou não visível.

 Sensitive
Controla se o widget está ou não habilitado.

 Screen-value
Contém o valor em tela de um componente (contido no screen buffer). Não
necessariamente é o valor real armazenado no widget.

 Checked
O widget está ou não selecionado. Aplicável a toggles e e itens de menu toggle.

 Read-only
Só aplicável aos widgets Browse, coluna de Browse, Editor e Menu-item.

 List-items

 Num-items

5.2 Exercícios

5.3 Métodos Básicos

add-first / add-last (Combo-box)


delete

5.4 Diretivas de Pré-processamento mais utilizadas

{&SELF-NAME}
{&FRAME-NAME}
{&BROWSE-NAME}

25
{&OPEN-QUERY-{&BROWSE-NAME}}
{&DISPLAYED-FIELDS}
{&ENABLED-FIELDS}

5.5 Exercícios

26
6 Usando Progress ACE

6.1 Apresentando o ACE

O ACE (Application Component Environment) é a ferramenta que permite a


construção de aplicações na versão 8. Ela acrescenta ao UIB diversas características
como o SMARTOBJECT palette, Wizards, Cue Cards, Progress Advisor e novos
‘Include files’.

6.2 Apresentando o ADM

O ADM (Application Development Model) é um novo método para desenhar


e construir aplicações. Ela possibilita a rápida construção de aplicações a partir do
reuso de objetos e da fácil manutenção de componentes e, consequentemente, de
sistemas.

6.3 SmartObjects

 SmartWindow (*) w-nomearq.w


 SmartFrame (*) f-nomearq.w
 SmartDialog (*) d-nomearq.w
 SmartFolder
 SmartPanel (navigation) p-nomearq.w
 SmartPanel (update) p-nomearq.w
 SmartQuery q-nomearq.w
 SmartBrowser b-nomearq.w
 SmartViewer v-nomearq.w

(*) Object Containers

Reuso de código através de referência

Todos os SmartObjects são instâncias run-time persistentes de programas


Progress.
É desnecessário copiar fisicamente o código fonte 4GL do objeto para um
SmartContainer. Um desenvolvedor pode dar manutenção a todas as instâncias de um
determinado SmartObject alterando um único arquivo. Este ganho em manutenção é
possível porque o SmartContainer apenas referencia os objetos que contém.

6.4 Exercícios:

1) Desenvolver um submódulo de pesquisa seguindo os passos abaixo:


 criar um SmartFrame;
 sem usar o recurso de SmartFolders, criar três browser, colocando-os em três páginas distintas;
 criar um radio-set com os valores “Customer”, “Order” e “Salesrep”;
 criar um fill-in;

27
 criar um botão para pesquisa;
 programar a tela de pesquisa de tal forma que, ao selecionar um dos valores do radio-set, é ativada
a página disponibilizando o browse correspondente. Ao pressionar o botão de disparo da pesquisa,
deve ser aberta a query de acordo com o valor informado no fill-in.

2) Desenvolver um submódulo que compreenda os seguindes cadastros, seguindo os procedimentos


correspondentes:
 Cadastro de Customer
- crie um SmartViewer;
- neste SmartViewer, crie um fill-in;
- salve o SmartViewer;
- crie uma SmartWindow, instanciando o SmartViewer anteriormente criado nesta;
- nesta SmartWindow, crie botões para as operações que você imagina possíveis sobre um
cadastro;
- programe a tela de cadastro de Customer de tal forma que seja efetuada validação para evitar
duplicação de nomes na base de dados e seja ajustada a interface* de acordo com a operação
que está sendo executada.

 Cadastro de Order
- crie uma SmartViewer;
- neste SmartViewer, crie um combo-box e um fill-in;
- salve o SmartViewer;
- crie uma SmartWindow, instanciando o SmartViewer anteriormente criado nesta;
- nesta SmartWindow, crie botões para as operações que você imagina possíveis sobre um
cadastro;
- programe a tela de cadastro de Order de tal forma que o combo-box traga para o usuário a lista
de todos os Customers. Tal como o cadastro de Customer, deve ser feita validação quanto à
duplicação de nomes na base de dados, bem como o ajuste de interface* de acordo com a
operação que está sendo executada.

 Cadastro de Invoice
- crie um SmartViewer;
- neste SmartViewer, crie um fill-in e um editor;
- salve o SmartViewer;
- crie uma SmartWindow, instanciando o SmartViewer anteriormente criado nesta;
- programe a tela de tal forma que o usuário informe a Data (Invoice-Date) e o total pago
(Total-Paid). Assim como nos dois cadastros anteriores, faz-se necessária a validação de
nomes e o ajuste de interface* de acordo com a operação.

* validação dinâmica

3) De acordo com os procedimentos, desenvolver um submódulo para atribuir as tarefas,


anteriormente cadastradas, às suas funções.
 3.1
- crie uma SmartWindow;
- crie um SmartBrowser;
- crie um botão;
- o primeiro browse deve trazer todos os cargos, enquanto o segundo deve trazer as funções do
cargo selecionado anteriormente;
- SmartBrowser deve ser carregado com todas as funções cadastradas no sistema.
 3.2
- Criar uma SmartDialog;
- crie dois browsers;
- crie dois botões;
- crie um fill-in;
- ao ser pressionado o botão da tela anterior é chamada a SmartDialog;
- o fill-in deve ser preenchido com a denominação da função escolhida na SmartWindow;
- o primeiro browse deve ser carregado com todas as tarefas cadastradas no sistema, enquanto
que o segundo deve trazer todas as tarefas executadas por aquela função;
- os botões devem permitir alterar o domínio de tarefas por função;

28
- devem ser programadas validações para impedir atribuir tarefas já existentes.

29
7 Links
Ao colocar SmartObjects em um Container você deve interligá-los através de
Links.

7.1 Criando um Master Object a partir de um Template

A criação de um Master Object pode ter diversas razões:


• tirar proveito da tecnologia SmartObjects;
• diminuir a complexidade de um programa, criando-se programas menores e
integrando-os – “dividir para conquistar”;
• a mesma lógica é utilizada em tantos programas/aplicações quanto se queira.

Obs. A alteração de um Master Object afeta todos os Containers que o


possuam encapsulado.

7.2 Definindo Tabelas Externas

7.2.1 O que são / para quê servem

É possível, para SmartBrowsers e SmartQueries, definir uma ou mais tabelas


externas. A utilidade vem do que segue:
• Consultas a várias tabelas em uma mesma consulta são mais pesadas que
consultas a uma tabela em uma consulta;

30
• Com este mecanismo, pode-se encadear consultas. O registro lido de uma
consulta pode ser utilizado para join em outra.

Para definir tabelas externas, clique sobre a opção Procedure Properties e


adicione o nome das tabelas externas à sua query.

Exemplo: “p:\curso82a\Exemplos\f-c05e19.w”

7.2.2 Exercício
1) Adicione ao exemplo um detalhe de pedidos de cliente (Order of Customer).

7.3 Organizando Masters em Diretórios

Existe um arquivo chamado Smart.cst (geralmente contido na pasta


\dlc\src\template\) que contém as configurações dos objetos contidos na palette. Para
alterar o caminho de busca destes objetos altere a linha DIRECTORY-LIST .
#SmartBrowser &Default
UP-IMAGE-FILE adeicon/wp_up 28,196
DOWN-IMAGE-FILE adeicon/wp_down 28,196
LABEL SmartBro&wser
DB-CONNECT
NEW-TEMPLATE src/adm/template/browser.w
DIRECTORY-LIST .,adm/samples
FILTER b-*.*,b-*.w,b-*.r,*.*
TITLE Choose SmartBrowser

Atualize na palette, através da opção Menu – Use Custom... , com o nome do


novo arquivo padrão a ser utilizado.

31
7.4 O que é um link ?

Um link é uma conexão entre dois SmartObjects que define como eles
interagem e quais os tipos de mensagens eles podem trocar.

Tipo de Link O que ele envia


Record RowId de um registro
TableIO Mensagem para Inclusão, Alteração e
Exclusão de registro
Navigation Mensagem para ir para o próximo registro,
anterior, primeiro ou último registro

7.5 Exercícios
1) Coloque os links necessários.

|< < > >|

1.1

Clientes

1.2 |< < > >|

Clientes

Detalhe de Clientes

1.3 |< < > >|


Browse Clientes

32
Detalhe de Clientes

1.4 |< < > >|

Clientes

Add Update Delete Reset

7.6 Tabela de Links Possíveis

SOURCE Link Type Targets Possíveis


SmartPanel Navigation Navigation SmartQuery
SmartPanel Update TableIO SmartViewer
SmartBrowser
SmartPanel Transaction TableIO SmartViewer
SmartBrowser
SmartQuery
SmartBrowser Record SmartViewer
SmartBrowser
SmartQuery
SmartViewer Record SmartViewer
SmartBrowser
SmartQuery
SmartQuery Record SmartViewer
SmartBrowser
SmartQuery
Qualquer SmartObject State Qualquer SmartObject

33
7.7 Progress Advisor

7.8 Estratégias de links para múltiplos Record Targets

 Alternativa 1  Alternativa 2

Q Q

R R

Observação: o que ocorre no exemplo abaixo?

34
7.9 Definição de links no UIB

 Advisor

 Link Editor

35
8 Paginando uma Aplicação
8.1 Paginando uma Aplicação

Para paginar uma window deve-se utilizar o seletor de páginas (ou o item Edit
- Goto Page do menu).

Duplo Click

Características da paginação:

 Objetos colocados na página 0 são sempre visíveis


 Procedure oferecida pelo ADM para mudança de página:
RUN Select-Page(n).

 SmartFolders
São widgets que controlam automaticamente as mudanças de página (quando
linkadas ao seu container). É possível, com um pouco de programação, controlar a
mudança de página utilizando outros widgets (por exemplo, radio-sets). O
SmartFolder apenas oferece uma maneira simples, rápida e elegante de fazê-lo.

36
Exemplo de utilização de SmartFolder:
1. Crie uma Window 2. Insira os objetos desejados na página 0

3. Crie um SmartFolder 4. Especifique os labels das páginas

5. Instancie os objetos em suas páginas, conforme desejado.

37
8.2 Links

8.3 Exercícios:

1) Altere o programa-exemplo “c:\Prow82a\Curso\Exemplos\w-c08e20.w”, de modo que a mudança


de página seja acionada por botões, e não mais por um SmartFolder (o qual deve ser excluído).

2) Monte um módulo de uma aplicação seguindo os seguintes procedimentos:


 crie uma SmartWindow;
 crie um SmartBrowser;
 instancie o SmartBrowser na página 0 da SmartWindow;
 crie, nesta SmartWindow, dois botões;
 crie um SmartViewer;
 instancie o SmartViewer na página 1 da SmartWindow;
 crie um segundo SmartBrowser;
 instancie o SmartBrowser na página 2 da Smart Window;
 ao ser executada a SmartWindow, o browse principal deverá ser carregado com todas as funções
do sistema, de tal forma que o SmartViewer traga os dados correspondentes dos atributos da
função selecionada e o SmartBrowser da página 2 seja carregado com todas as tarefas executadas
por alguém que exerce a função.

3) Desenvolver um módulo semelhente ao solicitado no exercício 1, usando, porém, folders ao invés


de botões.

38
8.4 Persistent Procedures

Embora executada de maneira diferente, uma persistent procedure é semelhante


a outra procedure qualquer. Quando uma persistent procedure é executada, esta fica
residente em memória até que seja explicitamente excluída.

Exemplo:
Suponha que seja preciso executar duas SmartWindows ao mesmo tempo. Ao
selecionar um registro na primeira SmartWindow é possível visualizar, de maneira
sincronizada, dados correspondentes na segunda SmartWindow.

39
9 Enviando Mensagens (Messaging)

9.1 Messaging

É o mecanismo pelo qual SmartObjects executam internal procedures de outro


SmartObject.

Exemplo:
Toda SmartQuery sabe como enviar um registro para um SmartViewer. Todo
SmartViewer sabe como receber e exibir o registro informado pela SmartQuery.

SmartViewer SmartQuery

1
Internal Internal
Procedures Procedures

adm-display-fields 2 adm-open-query

adm-row-available send-records

40
9.2 Messaging e tipo de Links

Uma maneira de identificar uma internal procedure do ADM é considerar como


cada SmartObject na comunicação através de links. O tipo de link determina quais
mensagens o source e o target objects esperam para proceder à troca de informações
e, posteriormente, executarem suas funções.

A tabela a seguir apresenta os tipos de links que cada SmartObject suporta, e se


este Smart pode ser source, target ou ambos para cada link.

SmartObject Tipos de Links


SmartContainer Container Source
Container Target
Page(n) Source
Page Target
SmartQuery Container Target
Record Source
Record Target
Navigation Target
SmartBrowser Container Target
Record Source
Record Target
TableIO Target
SmartViewer Container Target
Record Target
Record Source
TableIO Target
Navigation SmartPanel Container Target
Navigation Source
Update SmartPanel Container Target
TableIO Source
SmartFolder Container Target
Page Source

41
9.3 ADM messaging para cada tipo de link

Para um determinado tipo de link, um source object espera poder executar um


conjunto específico de internal procedures de um target object. Da mesma forma o
target object também espera poder executar um conjunto de internal procedures do
object source. Todo SmartObject possui um conjunto default de procedures que
permite esta troca de mensagens.

Exemplos:

1) Um container pode criar e destruir os SmartObjects no Container, e instanciar os


SmartObjects na sua devida posição. Container Source e Target Objects possuem
as seguintes internal procedures:

Container Source Container Target


Adm-create-objects Set-position
Set-size
Init-objects
Adm-destroy Adm-destroy
Adm-exit

2) Um Container é capaz de gerenciar seu conjunto de páginas. SmartObjects em cada


página são linkados ao Container com o link página(n).

Container Source Container Target


Select-Page Adm-hide

Adm-change-page Adm-view

Adm-create-objects

9.4 Event Procedure e Method Procedure

Cada SmartObject possui uma série de include files. Alguns são responsáveis
pela comunicação (messaging), e estão localizados na divisão Internal Procedure do
UIB.

Existem dois tipos de Internal Procedures nos SmartObject include files: Event
Procedures e Method Procedures.

9.4.1 Event procedures

Exemplo: o SmartQuery, através da procedure adm-row-available, pergunta ao


SmartViewer sobre a existência de um novo registro. Adm-row-available é uma event
procedure.

42
9.4.2 Method procedures

Exemplo: o SmartViewer, através da method procedure do SmartQuery,


pergunta quando é preciso receber um novo registro. Send-records é um method
procedure.

9.4.3 Comparação entre Event procedure e Method procedure

Event Procedure Method Procedure


Inicia sempre com “adm” Não possui padrão para nomes
Pode ser alterada Não pode ser alterada
É executada utilizando Dispatch ou Notify É chamada utilizando o comando “Run”
Não pode ser definido nenhum parâmetro Pode ser especificada uma lista de
parâmetros

43
9.4.4 Como trabalhar com Event Procedure

Exitem duas formas de forcar a execução de Event Procedures:

 RUN DISPATCH
 RUN NOTIFY

9.4.4.1 Dispatch

Sintaxe do comando:

RUN dispatch [IN handle] (“base-procedure-name”).

Onde:
- Handle: nome do SmartObject.
- Base-procedure-name: nome do evento sem o prefixo “adm”.

Exemplo:
RUN DISPATCH IN v-cli01 (“display-fields”).

Início

RUN dispatch ("display-fields").

Existe Sim Executa


"local-display-fields" ? versão local

Não

Existe Sim Executa


"adm-display-fields" ? versão adm

Não

Fim

44
9.4.4.2 Notify

Sintaxe do comando:

RUN dispatch [IN handle] (“base-procedure-name [,link-types]”).

Onde:
- Handle: o nome do SmartObject.
- Base-procedure-name: o nome do evento sem o prefixo “adm”.
- Link types: uma lista de tipos de links para os quais a mensagem é
enviada.

Exemplo:
RUN NOTIFY IN this-procedure (“row-available”).

Início

RUN notify ("base-procedure,link-type").

Existe outro target Não


Fim
object para este tipo de link ?

Sim

Run dispatch IN target-object ("base-procedure").

45
9.4.5 Como Alterar Event Procedures ?

 no Section Editor, após selecionar “Procedures”, clique no botão “New”;

 escolha “Local ADM Event”;

46
 selecione o Event que você precisa alterar;

 escreva seu código.

47
Os exemplos a seguir baseiam-se em uma tela de cadastro para as tabelas
“Customer”, “Order” e “Invoice”. À medida que avançarmos nos exemplos,
acresceremos o que aprendermos ao programa abaixo descrito. Salve todos os objetos
criados em “c:\Prow82a\Curso\exercicio”.

(a) crie uma SmartWindow. Salve-a com o nome “w-c09e23.w”;


(b) crie um SmartFolder nesta janela, com os seguintes tab folders: “Customer”,
“Order” e “Invoice”. Confirme a criação do link Container ao Advisor;
(c) crie três SmartQuerys, uma para cada tabela. Salve-as, respectivamente, com
os seguintes nomes: “q-c09e23cust.w”, “q-c09e23orde.w” e “q-
c09e23invo.w”;
(d) crie dois SmartViewers, com os seguintes campos para cada tabela:
 Customer: Name, Address, City, State, Country, Postal-Code, Contact,
Phone;
 Order: Cust-num, Ordered, Promised, Shipped, Instructions.
Salve-os, respectivamente, com os seguintes nomes: “v-c09e23cust.w” e “v-
c09e23orde.w”;
(e) crie um SmartPanel Navigation e um SmartPanel Update na primeira e
segunda páginas do SmartFolder. Dê a estes SmartPanels os seguintes nomes:
“Customer-Navico”, “Order-Navico”, “Customer-Updsav” e “Order-Updsav”.

1. Criação de uma alert-box para confirmar a exclusão de um registro da tabela


Customer.
Defina a procedure local-delete-record, de modo que esta mostre uma mensagem
perguntando ao usuário se ele realmente deseja excluir o registro antes de
efetivamente excluí-lo (observe que há uma divisão em toda procedure do ADM à
qual deseje-se acrescer código – antes da execução do procedimento default do ADM,

e após a execução do mesmo).

A seguir é listado o que ocorre quando o usuário pressiona o botão ‘Delete’.


(a) o trigger do botão ‘Delete’ do SmartPanel Update executa “NOTIFY (‘delete-
record’)”;
(b) o viewer, estando linkado ao SmartPanel Update, executa “DISPATCH
‘delete-record’”;
(c) ‘DISPATCH’ encontra e executa a procedure ‘local-delete-record’. Nosso
código é executado;
(d) ao ser questionado quanto à exclusão do registro, se o usuário escolher ‘Sim’,
a procedure ‘adm-delete-record’ é executada e exclui o registro. Se o usuário
escolher ‘Não’, a procedure é abortada.

48
2. Cadastrar um novo Order (Pedido) para um Customer (Cliente).
 crie um SmartBrowser sobre a tabela “Invoice”, com as seguintes colunas: ‘Cust-
num’, ‘Name’, ‘Contact’ e ‘Phone’;
 salve este SmartBrowser com o nome “b-c09e23orde.w”.

A seguir é listado o que ocorre quando da operação desta tela:


(a) o usuário pressiona o botão ‘Add’;
(b) o ADM ‘limpa’ os campos do SmartViewer;
(c) o usuário entra com os dados do novo registro e pressiona ‘Save’;
(d) o viewer, como está linkado ao SmartPanel Update, executa “DISPATCH
assign-record”, o qual executa a procedure ‘local-assign-record’;

49
(e) a procedure ‘local-assign-record’ primeiro chama ‘adm-assign-record’. O
código do programador é executado a seguir;
(f) o controle retorna à tela.

3. Ordenar registros de uma query de n maneiras.


 crie um SmartBrowser sobre a tabela “Invoice”, com as seguintes colunas: ‘Cust-
num’, ‘Invoice-num’, ‘Ship-Charge’, ‘Amount’, ‘Invoice-Date’ e ‘Total-Paid’;
 adicione um radio-set horizontal a este, com o label ‘Ordenar por’, e as seguintes
opções: ‘Customer’ e ‘Invoice’;
 salve este SmartBrowser com o nome “b-c09e23invo.w”;
 crie, no SmartBrowser, uma procedure ‘local-open-query’ para reabrir a query de
acordo com a seleção do usuário;
 crie, no SmartBrowser, uma procedure ‘local-initialize’ para inicializar o valor do
radio-set e, se preciso, inicializar outros valores e/ou procedimentos.

50
A seguir é listado o que ocorre quando da operação desta tela:

(a) a SmartWindow executa o SmartBrowser;


(b) o SmartBrowser executa sua própria ‘local-initialize’ e, simultaneamente, o
código escrito nesta procedure é executado;
(c) o SmartBrowser executa sua própria ‘local-open-query’ e, simultaneamente, a
query é aberta de acordo com as condições especificadas nesta procedure;
(d) o SmartBrowser executa a procedure ‘display-fields’para mostrar os dados no
browse.

51
9.5 Mapa de eventos

Os diagramas abaixo representam os principais eventos utilizados pelo ADM.


Com o auxílio destes diagramas você pode definir onde fazer as alterações necessárias
em sua aplicação. As linhas pontilhadas representam uma ‘execução condicional’.

1. O diagrama que segue representa diversas seqüências de eventos que ocorrem


durante a inicialização de um SmartObject.
adm-initialize

adm-create-objects adm-enable adm -open-query adm-view adm-row-available

Adm-initialize é executado quando a aplicação é executada. Ele chama:

• adm-create-objects para colocar e rodar os SmartObjects no Frame


• adm-enable para ‘habilitar’ os objetos (se não estiverem DISABLE-ON-INIT)
• adm-view para mostrar os objetos (se não forem HIDE-ON-INIT)
• adm-open-query para abrir uma SmartQuery ou SmartBrowser
• adm-row-available para enviar o registro corrente para uma SmartQuery ou
SmartBrowser, apenas se um registro estiver ativo.

2. Este diagrama representa eventos que ocorrem quando a aplicação é terminada.

adm-exit in object local-exit in container 2.

Adm-destroy in object 3.

Adm-exit é o evento utilizado por um container para requisitar o fim da aplicação.


O container passa para cada objeto uma ‘destroy message’. Para cada objeto os
seguintes passos são realizados:

• Apaga o objeto (apaga a procedure persistente da memória);


• Remove todos os links definidos para o objeto;
• Executa a procedure disable_ui para o objeto.

52
3. Os próximos dois diagramas representam a seqüência de eventos que ocorrem
durante uma troca de página em uma Window. Note que a única diferença entre adm-
view-page e adm-select-page é que adm-view-page não oculta os objetos.
adm-view-page

adm-change-page

adm-create-objects adm-view

Adm-view-page chama adm-change-page para mostrar a nova página (sem


ocultar a anterior antes). Caso for a primeira vez que a página for mostrada, ele
chamará o evento adm-create-objects. Em seguida chama adm-view e mostra os
objetos.
Neste caso utilizando adm-select-page os objetos da página anterior serão ocultados antes de ser
mostrada a próxima página.

adm-select-page

adm-hide
adm-change-page

adm-create-objects adm-view

4. Este diagrama representa a seqüência de eventos que ocorrem durante a navegação


entre registros.

adm-get-next adm-row-changed

adm-get-first

adm-get-prev
adm-row-available
adm-get-last

adm-reposition-query adm-display-fields

Os eventos get-next/first/prev/last e reposition-query chamam adm-row-


changed que notifica (notify) todos os objetos de destino (record target) que o registro
foi trocado.

53
5. Os próximos diagramas representam os eventos utilizados quando ocorre a
atualização de um registro

adm-update-record

adm-assign-record adm-end-update

adm-current-changed adm-assign-statement adm-display-fields

Adm-update-record chama os eventos na seguinte ordem:

1. adm-assign-record que chama:


2. adm-current-changed para encontrar o registro (find) e ver se ele não está
sendo alterado/bloqueado por outro usuário (lock);
3. adm-assign-statement faz a gravação (assign);
4. adm-display-record mostra o registro (se for um novo registro);
5. adm-end-update reposiciona a query e notifica os outros objetos que o registro foi
alterado.

(continuação) Este diagrama representa mais seqüências de eventos que ocorrem


durante a atualização de um registro

adm-copy-record

adm-add-record

adm-delete-record adm-apply-entry

adm-reset-record

adm-end-update

Os eventos copy, delete,add e reset chamam adm-apply-entry para mover o


ponteiro para o registro corrente, seguido do comando add, copy, delete ou reset.

A troca do registro corrente, faz com que sejam notificados todos os object
targets que um novo registro está disponível para ser mostrado

adm-row-changed

adm-row-available

adm-display-fields

54
10 SmartBrowser com Enable Column

Para habilitarmos a edição de colunas em um browser, devemos alterar a


opção enable da Column Editor (Propriedades da Query do Browser).

Com o SmartBrowser possuindo Enable Columns podemos criar um link tipo TableIO entre
um SmartBrowser e um SmartPanel de Update (p-updsav.r).

55
11 NEW-STATE METHOD

O método new-state é chamado por meio de um comando “RUN”.

Exemplo:
Run new-state (‘param’).

Este comando envia uma mensagem para os ‘Target Objects’ que possuem um
link tipo ‘State’, com o número do handle e uma variável.

Os ‘Target Objects’ recebem a mensagem e executam a procedure ‘State-


Changed’ recebendo o parâmetro na variável ‘p-state’.

T
add del cancel
Procedure add-record
Run new-state (‘param’)
State

Procedure state-changed
case p-state:
when …

56