Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
2A
Enviado por:
CLAUDIUS EDELSBRUNNER
Progress V8.2A
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
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
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
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
11 New-State Method
5
1 Conhecendo o Progress
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
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.1 Mono-usuário
1.5.2 Multi-usuário
7
1.6 Principais Extensões dos Arquivos Gerados pelo Progress
1.8 Dump
8
ADD TABLE "CLIENTE"
DESCRIPTION "Cadastro de Clientes"
DUMP-NAME "cliente"
LABEL "Cliente Geral"
9
2 Procedure Editor
2.2 Edit
10
2.2.1 Desfazendo Ações
Este comando desfaz a última ação executada pelo usuário.
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.4 Buffers
12
2.5 Compile
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.3.1 Variáveis
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
Exemplos:
DEFINE BUFFER bf-cargo FOR cargo.
DEFINE NEW SHARED BUFFER bf-funcao FOR funcao.
DEFINE SHARED BUFFER bf-funcao FOR funcao.
Exemplos:
DEFINE TEMP-TABLE tt-funcao LIKE FUNCAO.
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).
3.3.5 Parâmetros
<corpo da função>
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.
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
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
18
Delete <buffer>.
Exclui um registro da tabela associada ao buffer.
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”
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).
20
3.7 Exercícios
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
22
4 UIB – User Interface Builder
Definitions
Main Block
Triggers
Procedures
Functions
23
4.2 Palette de Componentes
Pointer
Frame Legenda
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>) >
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
{&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.3 SmartObjects
6.4 Exercícios:
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.
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
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.
30
• Com este mecanismo, pode-se encadear consultas. O registro lido de uma
consulta pode ser utilizado para join em outra.
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).
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.
7.5 Exercícios
1) Coloque os links necessários.
1.1
Clientes
Clientes
Detalhe de Clientes
32
Detalhe de Clientes
Clientes
33
7.7 Progress Advisor
Alternativa 1 Alternativa 2
Q Q
R R
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:
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
37
8.2 Links
8.3 Exercícios:
38
8.4 Persistent Procedures
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
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
41
9.3 ADM messaging para cada tipo de link
Exemplos:
Adm-change-page Adm-view
Adm-create-objects
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.
42
9.4.2 Method procedures
43
9.4.4 Como trabalhar com Event Procedure
RUN DISPATCH
RUN NOTIFY
9.4.4.1 Dispatch
Sintaxe do comando:
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
Não
Não
Fim
44
9.4.4.2 Notify
Sintaxe do comando:
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
Sim
45
9.4.5 Como Alterar Event Procedures ?
46
selecione o Event que você precisa alterar;
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”.
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”.
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.
50
A seguir é listado o que ocorre quando da operação desta tela:
51
9.5 Mapa de eventos
Adm-destroy in object 3.
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-select-page
adm-hide
adm-change-page
adm-create-objects adm-view
adm-get-next adm-row-changed
adm-get-first
adm-get-prev
adm-row-available
adm-get-last
adm-reposition-query adm-display-fields
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-copy-record
adm-add-record
adm-delete-record adm-apply-entry
adm-reset-record
adm-end-update
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
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
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.
T
add del cancel
Procedure add-record
Run new-state (‘param’)
State
Procedure state-changed
case p-state:
when …
56