You are on page 1of 74

Curso de Progress

1|Pgina

Copyright 2011 ALX Consultoria e Treinamentos

Todos os direitos reservados para o autor desta obra.

Toda ou qualquer parte desta publicao no poder ser reproduzida ou


transmitida por qualquer meio, seja este eletrnico, mecnico, de
fotocpia, de gravao ou outros sem prvia autorizao.

Progress, Appbuilder, Openedge so Marcas Registradas da Progress Software Corporation EUA


Datasul EMS Marca Registrada da Totvs Corporation
Algumas partes deste Tutorial foram retiradas do tutorial Dominando o Progress escrito por Marcio Brener Costa

Curso de Progress

2|Pgina

INDICE
INTRODUO AO PROGRESS .......................................................................5
Instalando o Progress ..................................................................................... 5
Tipos de Arquivos do Progress ....................................................................... 10
Conhecendo o Editor ..................................................................................... 10
Conhecendo o Dicionrio de dados ................................................................. 11
Conhecendo o Administrador de Banco de Dados.............................................. 11
Conhecendo o APPBuilder .............................................................................. 12
Conhecendo o Compilador Progress ................................................................ 13
BANCO DE DADOS .....................................................................................13
Como criar um Banco de Dados...................................................................... 13
Como conectar um Banco de Dados ................................................................ 14
Criando Tabelas Campos e Indices ...................................................14
Como criar uma Tabela ......................................................................... 15
Tipo de Campos ................................................................................... 16
Como criar Campos .............................................................................. 16
Como criar Indices ............................................................................... 18
O DATASUL EMS ........................................................................................ 20
Conhecendo o Datasul EMS ........................................................................... 20
Conhecendo a estrutura de Bancos de dados e tabelas datasul........................... 22
Como localizar um campo no Datasul EMS ....................................................... 22
COMANDOS PARA MANIPULAO DE DADOS ............................................ 23
Display ....................................................................................................... 23
Message ...................................................................................................... 23
Def Var ....................................................................................................... 24
For each ...................................................................................................... 24
By .............................................................................................................. 25
Use Index .................................................................................................... 26
No-lock, Exclusive-Lock ................................................................................. 27
Operadores Lgicos ...................................................................................... 27
Where ......................................................................................................... 28
And e OR..................................................................................................... 28
Begins ........................................................................................................ 30
Matches ...................................................................................................... 31
Contains...................................................................................................... 31
If................................................................................................................ 32
Else ............................................................................................................ 33
Find First ..................................................................................................... 34
Find Last ..................................................................................................... 35
If Avail / If not Avail ..................................................................................... 35

Curso de Progress

3|Pgina

Assign ......................................................................................................... 36
Then do ...................................................................................................... 37
Update ........................................................................................................ 37
Create ........................................................................................................ 38
Repeat ........................................................................................................ 39
Delete ......................................................................................................... 39
Output ........................................................................................................ 40
Put ............................................................................................................. 41
Abrindo Arquivo TXT automaticamente ............................................................ 42
Gerando um arquivo do tipo CSV e abrindo no Excel ......................................... 42
Break / First-Of / Last-Of .............................................................................. 43
For each com each (relacionando tabelas) ...................................................... 45
For each com find (relacionando tabelas) ....................................................... 46
For each com For each (relacionando tabelas) ................................................. 47
PROGRESS GRAFICO .................................................................................. 49
Como criar um Programa Grafico .................................................................... 49
Como criar um boto .................................................................................... 49
Como criar um fillin ...................................................................................... 50
Como criar um text....................................................................................... 50
Como criar uma Imagem ............................................................................... 51
Criando uma Tela para chamada de um Relatrio ............................................. 53
Adicionando Acompanhamento no Relatrio ..................................................... 57
Adicionando Zoom no Relatrio ...................................................................... 58
Criando Relatrios em Excel (template) .......................................................... 59
Varios comandos para formatao Progress x excel ......................................... 62

Curso de Progress

4|Pgina

INTRODUO AO PROGRESS
Instalando o Progress
Clique no cone SETUP.EXE que se encontra na pasta de instalao do Openedge
Progress.

Uma tela de Inicio de instalao do Openedge para Windows ser apresentada,


para fazer a instalao sero necessrias as licena(s).
Clique no boto Next para continuar a instalao

Digite os nmeros de Serie e os cdigos de Controle nos respectivos campos e


clique em Accept para adicionar na lista de produtos a serem instalados, aps
concluir clique em Next para prosseguir.

Curso de Progress

5|Pgina

Leia os termos de Licenciamento e clique em Yes para concordar e prosseguir com


a instalao.

Selecione os diretrios de instalao e de trabalho onde sero instalados os


programas (recomendamos manter a sugesto do programa de instalao)

Na tela de seleo de componentes a serem instalados clique em Next e mantenha


a opo Complete assinalada.

Curso de Progress

6|Pgina

Desmarque todas as opes em tela e clique em Next para prosseguir

Selecione a Pasta que sera adicionada no seu menu de programas (recomendamos


manter a sugesto do programa de Instalao) e clique em Next para prosseguir.

Selecione os idiomas adicionais a serem instalados (recomendamos no selecionar


nenhum outro idioma e manter somente o idioma Portugues Brasilian
selecionado) e clique em Next para prosseguir.

Curso de Progress

7|Pgina

Clique na caixa de seleo Number Format e selecione a opo (period, comma)


para que o formato numrico padro brasileiro seja configurado e clique em Next
para prosseguir.

Mantenha a sugesto e clique em Next para prosseguir.

Mantenha a sugesto e clique em Next para prosseguir.

Curso de Progress

8|Pgina

A instalao esta pronta para iniciar a copia dos arquivos para o seu computador,
clique em Next para prosseguir.

Pronto a instalao foi concluda e o Progress esta pronto para ser utilizado.

Aps o trmino da instalao os seguintes programas sero apresentados em seu


menu iniciar.

Curso de Progress

9|Pgina

Tipos de Extenso dos Arquivos do Progress

.p (programa do tipo caractere escrito geralmente no Editor Progress)


.w (programa do tipo grfico escrito geralmente no AppBuilder do Progress)
.r (programa compilado pelo Progress)

Conhecendo o Editor (Programa Client no menu)


Aplicativo em Progress 4GL para escrita do cdigo fonte, execuo de procedures,
debuger, compilao e procedimentos por meio de cdigo.

Curso de Progress

10 | P g i n a

Conhecendo o Dicionrio de dados


Aplicativo desenvolvido em Progress 4GL para administrao e manuteno dos
bancos de dados.
Com ele voc pode: Criar, conectar e alterar definies de bancos de dados;
Visualizar relatrios de estruturas de tabelas, campos, ndices;
Definir segurana dos dados, salvar definies e contedo dos dados, editar
parmetros, etc.

Conhecendo o Administrador de Banco de Dados


Aplicativo desenvolvido em Progress 4GL para administrao e manuteno dos
bancos de dados.
Com ele voc pode: Criar, conectar e alterar definies de bancos de dados;
Visualizar relatrios de estruturas de tabelas, campos, ndices;

Curso de Progress

11 | P g i n a

Definir segurana dos dados, salvar definies e contedo dos dados, editar
parmetros, etc.

Conhecendo o APPBuilder
O User Inteface Builder um utilitrio desenvolvido em Progress 4GL para edio
rpida e grfica de programas orientados a objeto.

Curso de Progress

12 | P g i n a

Conhecendo o Compilador Progress


Como o prprio nome diz um aplicativo para compilao de procedures
(programas).
Ele possibilita compilar um diretrio ou uma rvore de diretrios, especificar
arquivos iniciados por uma subpalavra ou apenas extenso, etc.

BANCO DE DADOS
Como criar um Banco de Dados
Uma das maneiras de se criar um banco de dados utilizando o programa Data
Administration clique no menu Database na opo Create, ento informe a
localizao e o nome do novo banco de dados a ser criado.

Curso de Progress

13 | P g i n a

Aps a criao do banco de dados, sugerida a conexo com o banco recm criado.

Como conectar um Banco de Dados


Ao abrir o Data Dictionary o mesmo ir sugerir que um banco de dados seja
conectado, selecione a opo Connect to na Existing Database.

Selecione o banco de dados desejado utilizando o boto Browse e clique em Ok


para iniciar o Dicionario com o banco conectado.

CRIANDO TABELAS CAMPOS E INDICES


Para modelagem de dados utilizado o aplicativo Data Dictionary, que pode ser
selecionado no menu de programas.

Curso de Progress

14 | P g i n a

Como criar uma Tabela


Selecione o banco de dados escolhido na caixa Databases, em seguida clique no
boto Create Table...

A imagem abaixo mostra a janela de propriedades da tabela no Data Dictionary.

Table Name: Define o nome da tabela a ser criada.


Dump File: Informa o nome do arquivo de DUMP para exportao das definies e
dos dados da tabela.
Label: Define um nome de at 30 caracteres quaisquer para exibio de
informaes de avisos ou erros para a tabela em tempo de execuo do aplicativo.
Description: Texto descritivo para informaes ou anotaes a respeito da tabela.

Curso de Progress

15 | P g i n a

Tipo de Campos
A seguir demonstramos os tipos de campos disponveis ao criar um campo de uma
tabela, os campos mais utilizados so Character, Date, Decimal, Integer e Logical.

Como criar Campos


Selecione no quadro Tables a tabela onde deseja criar o campo e clique no boto
Create Field...

Curso de Progress

16 | P g i n a

A imagem abaixo mostra as propriedades para a criao de um campo.

Field Name: Nome do campo com at 32 caracteres alfanumricos, sem acentos ou


sinais invlidos.
Data Type: Define o tipo de dado do campo em:
INTEGER, DECIMAL, CHARACTER, LOGICAL, DATE, RAW ou RECID.
Importante: Aps o campo ser criado o Tipo de Dado no poder ser alterado, como tambm
no poder ser removido caso exista algum ndice da tabela a que pertena.

Format: Define um formato ou mscara de acordo com o tipo de dado para entrada
e visualizao do campo.
Exemplos:
->>>,>>9.99 (DECIMAL)
999 (INTEGER)
99/99/9999 (DATE)
Masculino/Feminino (LOGICAL yes/no)
Label: Define um texto informativo a ser exibido com o campo, tanto para
apresentao em coluna, lateral e tambm em informaes como regras de ndices
e outros.
Column Label: Define um texto informativo para apresentao quando em coluna.
Initial Value: Atribui um valor inicial para o campo aps o registro ser criado.
Order: Define ama ordem do campo dentro da tabela. Por padro esta ordem
incrementada de 10 em 10 e no pode repetir, mas pode ser alterada e conter
qualquer intervalo de nmero inteiro.
Decimals: Define o nmero de casas decimais num limite de 10 e mnimo de 0 para
dados do tipo DECIMAL

Curso de Progress

17 | P g i n a

Description: Texto descritivo ou informativo para o campo.


Help Text: Informa um texto de Ajuda ou Informao sobre o campo para ser
exibido na rea de status da aplicao quando este estiver sendo editado.
Mandatory: Define o preenchimento de um campo como obrigatrio.
Case-Sensitive: Informa que um campo tipo CHARACTER far distino entre letras
maisculas e minsculas se utilizado em um ndice ou para uma comparao.
Extent: Define o campo como um array de n elementos, nomendo-os como:
CAMPO[n elemento]
Importante: Esta propriedade do campo no poder ser alterada aps o campo criado!

Como criar Indices


Um ndice de banco de dados funciona como um ndice de um livro. Para procurar
por um assunto qualquer em um livro, esse assunto pode ser localizado no ndice e
depois, com base nas pginas fornecidas pelo ndice, localizado diretamente no
livro. O ndice no contem o assunto todo, apenas referencias (nmeros de pagina)
desse assunto. Sem um ndice, para que um assunto fosse localizado, a procura
deve ser feita na tabela inteira.
Um ndice tem como objetivos a rpida recuperao de registros, classificao
automtica de registros, processamento rpido de relacionamentos de tabelas,
evitar registros com chaves duplicadas, procura de palavras em um campo texto.
Selecione o Icone Indexes para ativar o quadro Indexes e clique no boto Create
Index...

Curso de Progress

18 | P g i n a

A imagem abaixo mostra as propriedades para a criao de um ndice.

A criao, bem como a manuteno de ndices em Progress totalmente


implificada. Ao contrrio de outros bancos de dados como MS-SQL Server, por
xemplo, voc no precisa especificar diversos parmetros e atributos como taxa de
crescimento, organizao fsica, e outros apenas atributos bsicos.
Description: Texto descritivo ou informativo para o ndice
Primary: Define que o ndice ser o padro utilizado para procuras ou ordenao da
tabela. Pode haver apenas um ndice primrio para a tabela, e esse ndice tambm
no pode ser excludo. Para excluir um ndice primrio voc deve definir qual outro
ndice ser primrio antes de efetuar a excluso.
Active: Define o ndice como Ativo ou Inativo.
Caso o ndice esteja inativo ele no ser atualizado automaticamente, como
tambm no poder ser utilizado para pesquisa ou ordenao.
Unique: Informa que no ser aceita duplicao de valores no ndice.
Caso voc defina um campo tipo CHARACTER como case-sensitive e crie um ndice nico para
este campo, ele aceitar valores duplicados, ainda que no idnticos, exemplo: Maria/maria,
Joao/joao,etc
Lembre-se que o ndice nico sempre a Chave Primria (Primary Key) para o
relacionamento entre tabelas.

Word Index: Define um ndice para campo do tipo CHARACTER organizado por
palavras contidas em cada registro.
Este ndice consome bastante espaos em disco, como tambm onera bastante a
performance do banco, sendo aconselhado apenas se realmente no houver uma outra
soluo.

Curso de Progress

19 | P g i n a

Abbreviated: Cria um ndice abreviado para campo tipo CHARACTER utilizando


apenas algumas palavras ou caracteres iniciais do contedo do campo.
Ascending ou Desceding: Define a ordem para um campo dentro do ndice.
Como padro inicial todos os campos so definidos como ascendentes.

O DATASUL EMS
Conhecendo o Datasul EMS
A Imagem abaixo demonstra a tela inicial do ERP Datasul EMS.

A imagem abaixo demonstra o sistema de menus do ERP separando os diversos


assuntos em Mdulos

Curso de Progress

20 | P g i n a

A imagem a seguir demonstra que cada Mdulo possui diversas tarefas/submenus


que se referem ao assunto escolhido.

A imagem abaixo demonstra o menu de um dos mdulos, onde podemos encontrar


um padro que utilizado para todos os mdulos do sistema.

Por exemplo em Opes, podemos encontrar a funao Executar Programa, que


podemos utilizar para abrir o Editor do Progress digitando _edit.p e clicando em
executar.

Curso de Progress

21 | P g i n a

Conhecendo a estrutura de Bancos de dados e tabelas


Datasul
A imagem a seguir demonstra o Data Dictionary com os bancos de dados do ERP
conectados, existem algumas formas de instalao dos bancos por este motivo eles
podem ser distribudos (vrios bancos), unificados (apenas um nico banco com
todas as tabelas) e ainda separados entre bando de cadastros e movimentos,
porm de todas as maneiras as tabelas e campos so os mesmos.

Como localizar um campo no Datasul EMS


A imagem a seguir demonstra como podemos identificar um campo dentro de um
cadastro do ERP par poder utiliza-lo em uma consulta, relatrio, etc...
Clique no boto incluir no navegador padro da janela, clique com o mouse ou
direcione o cursor at o campo que deseja obter a informao e pressione as teclas
CTRL+ALT+H. Ser apresentada uma janela onde poderemos observar os nomes
de banco de dados, tabela, campo, tipo de campo e seu respectivo formato.

Curso de Progress

22 | P g i n a

COMANDOS PARA MANIPULAO DE DADOS


Display
O comando DISPLAY utilizado para mostrar em tela ou em arquivo quando
selecionado uma informao determinada por um lao ou pelo prprio comando.
Exemplo:
DISPLAY "Usando comando Display".

Resultado:

Message

O Comando MESSAGE envia uma mensagem para a tela.


Exemplo:
MESSAGE "Teste de Mensagem" VIEW-AS ALERT-BOX.

Curso de Progress

23 | P g i n a

Resultado:

Def Var
Define uma varivel cujo valor estar disponvel dentro de uma procedure, pode ser
utilizado para guardar uma informao, acumular valores, contar registros, etc....
Exemplo:
DEF VAR teste AS CHAR FORMAT x(40) NO-UNDO.
AS Tipo
Indica o Tipo de Varivel a ser definida. Os tipos so CHARACTER, DATE, DECIMAL,
HANDLE, INTEGER, LOGICAL, MEMPTR, RAW, RECID, ROWID e WIDGETHANDLE.

For each
L um registro a cada interao do bloco e copia os dados do banco para o buffer
de registro, e do buffer de registro para o buffer de tela.
Exemplo:
FOR EACH emitente.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Curso de Progress

24 | P g i n a

Resultado:

By
Usa-se a opo BY para classificao de registros por um campo no indexado.
Default : ordenao ascendente
Exemplo:
FOR EACH emitente BY emitente.cod-emitente DESCENDING.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Curso de Progress

25 | P g i n a

Resultado:

Use Index
A opo USE-INDEX permite voc escolher qualquer ndice definido, para selecionar
registros.
Exemplo:
FOR EACH emitente USE-INDEX nome.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Curso de Progress

26 | P g i n a

Resultado:

No-lock, Share-lock, Exclusive-Lock


Quando vrios usurios podem acessar um banco de dados simultaneamente, pode
existir um certo momento em que dois usurios tentem acessar o mesmo registro.
O Progress utiliza locks de registros para administrar a concorrncia.
No-Lock: Lock somente de leitura de registros
Share-lock: Lock para leitura, atualizao e exclusao de registros
Exclusive-lock: Lock para atualizao ou excluso de registros
Por padro se o tipo de lock no for especificado o Progress utiliza o Share-lock

Operadores Lgicos
=
>=
<=
<>

:
:
:
:

Igual
Maior ou Igual
Menor ou Igual
Diferente

Funes para conversao de tipo de Campo


String(nome do campo ou varivel): Converte o valor em Character
Int(nome do campo ou varivel): Converte o valor em Inteiro
Dec(nome do campo ou varivel): Converte o valor em Decimal
Date(nome do campo ou varivel): Converte o valor em Data

Curso de Progress

27 | P g i n a

Where
Condio que limita os registros a serem mostrados em uma busca de registros de
uma tabela.
Exemplo:
FOR EACH emitente WHERE emitente.nome-abrev = "ALMEIDAMOTA" USE-INDEX nome.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Resultado:

And e OR
Condioes utilizadas junto com Where para intervalos ou restries dentro de uma
clausula.
And
Condio E, para que esta condio seja atendida a mesma deve ser atendida em
todas as situaes caso contrario o resultado sera nulo.
Exemplo:
FOR EACH emitente WHERE emitente.cod-emitente >= 10 AND
emitente.cod-emitente <= 52 USE-INDEX codigo.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Curso de Progress

28 | P g i n a

Resultado:

Or
Condio Ou, para que esta condio seja atendida basta que uma das condies
seja atendida para que o resultado exista.
Exemplo:
FOR EACH emitente WHERE emitente.cod-emitente = 19 OR
emitente.cod-emitente = 26 USE-INDEX codigo.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Curso de Progress

29 | P g i n a

Resultado:

Begins
Condio que verifica se a expresso inicia com o valor determinado
Exemplo:
FOR EACH emitente WHERE emitente.nome-abrev BEGINS "E" USE-INDEX nome.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Resultado:

Curso de Progress

30 | P g i n a

Matches

Condio que compara uma expresso do tipo caracter com um padro.


Exemplo:
FOR EACH emitente WHERE emitente.nome-abrev MATCHES "*SOUZA" USE-INDEX nome.
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Resultado:

Contains
Faz a busca por determinada palavra, em campos com atributos do tipo wordindex.

Exemplo:
FOR EACH item WHERE item.desc-item CONTAINS "KIT" NO-LOCK.
DISP item.desc-item WITH WIDTH 100.
END.

Curso de Progress

31 | P g i n a

O commando WITH WIDTH 100 utilizado para especificar o tamanho da linha que
sera usada para demonstrar os dados no comando DISP, onde 100 o tamanho
definido de caracteres.

Resultado:

If
Comando para ao condicional.
Exemplo:
FOR EACH emitente USE-INDEX nome.
IF emitente.nome-abrev = "JRSOUZA" THEN
DISP emitente.cod-emitente emitente.nome-abrev.
END.

Curso de Progress

32 | P g i n a

Resultado:

Else
Comando para ao em resposta a uma condio IF no existente.
Exemplo:
FOR EACH emitente USE-INDEX nome.
IF emitente.nome-abrev = "JRSOUZA" THEN
MESSAGE "Encontrei o Registro: "
STRING(emitente.cod-emitente)
+"-"
+ emitente.nome-abrev VIEW-AS ALERT-BOX.
ELSE DISP emitente.cod-emitente emitente.nome-abrev.
END.

Resultado:

Curso de Progress

33 | P g i n a

Find First

Busca apenas o primeiro registro em uma tabela.


Exemplo:
FIND FIRST familia NO-LOCK NO-ERROR.
DISP familia.fm-codigo familia.descricao.

Resultado:

Curso de Progress

34 | P g i n a

Find Last
Busca apenas o ultimo registro em uma tabela.
Exemplo:
FIND LAST familia NO-LOCK NO-ERROR.
DISP familia.fm-codigo familia.descricao.

Resultado:

If avail / If not avail


Comando utilizado para validar se foi encontrado registro na condiao de um FIND
Exemplo:
FIND FIRST cond-pagto WHERE cond-pagto.cod-cond-pag > 7 NO-LOCK NO-ERROR.
IF AVAIL cond-pagto THEN MESSAGE "Encontrei o Registro" VIEW-AS ALERT-BOX.
IF NOT AVAIL cond-pagto THEN MESSAGE "Eu nao encontrei o Registro" VIEW-AS ALERT-BOX.
Atendendo a condio

No atendendo a condio
FIND FIRST cond-pagto WHERE cond-pagto.cod-cond-pag > 1600 NO-LOCK NO-ERROR.
IF AVAIL cond-pagto THEN MESSAGE "Encontrei o Registro" VIEW-AS ALERT-BOX.
IF NOT AVAIL cond-pagto THEN MESSAGE "Eu nao encontrei o Registro" VIEW-AS ALERT-BOX.

Curso de Progress

35 | P g i n a

Resultado:
Atendendo a condio especificada no FIND

No atendendo a condio especificada no FIND

Assign
Atualiza e atribui valores aos dados para variveis ou registros.
Exemplo:
DEF VAR auxiliar AS INT.
ASSIGN auxiliar = 120.
MESSAGE "Valor da Variavel: " auxiliar VIEW-AS ALERT-BOX.

Resultado:

Curso de Progress

36 | P g i n a

Then do
Individualiza um grupo de comandos dentro de um bloco simples.
Exemplo:
DEF VAR auxiliar AS CHAR FORMAT "x(20)".
ASSIGN auxiliar = "Branco".
IF auxiliar = "Branco" THEN DO:
MESSAGE "O valor da Variavel Branco" SKIP
"Vou atualizar para Vermelho" VIEW-AS ALERT-BOX.
ASSIGN auxiliar = "Vermelho".
MESSAGE "O valor da Variavel agora " SKIP
auxiliar VIEW-AS ALERT-BOX.
END.

Resultado:

Update
Executa as aes para que um registro seja atualizado em tela.
Exemplo:
DEF VAR nome AS CHAR FORMAT "x(20)".
DEF VAR idade AS INT.
UPDATE nome idade.
MESSAGE "Nome: " nome + " - " + "Idade: " idade VIEW-AS ALERT-BOX.

Curso de Progress

37 | P g i n a

Resultado:
O Cursor estar disponvel no campo Nome para que possa inserir a informao,
tecle TAB para ir para o prximo campo e ENTER para finalizar.

Aps a insero das informaes sera exibida a mensagem com os valores


digitados.

Create

Cria um novo registro no banco.


Exemplo:
CREATE regiao.
UPDATE regiao.nome-ab-reg regiao.nome-regiao.

Resultado:

Curso de Progress

38 | P g i n a

Repeat
Lao (repetio) automtico. Continua a interagir at encontrar um END-ERROR ou
outra condio de trmino definida pelo usurio.
Exemplo:
REPEAT:
CREATE regiao.
UPDATE regiao.nome-ab-reg regiao.nome-regiao.
END.

Resultado:

Delete
Elimina um registro ou uma seleo de registros.
Exemplo:
FOR EACH emitente WHERE emitente.nome-abrev = "LG".
DELETE emitente.
END.

Curso de Progress

39 | P g i n a

Resultado:
Todos os registros que atenderem a condio especificada sero apagados do banco
de dados, importante ressaltar que os registros apagados no podero ser
recuperados, portanto o uso do delete deve ser restrito e com extrema cautela.

Output

Habilita a sada dos dados para um determinado arquivo, seja txt, csv, ou qualquer
outro especificado, utilizando um arquivo temporrio.
Exemplo:
OUTPUT TO c:\temp\teste.txt NO-CONVERT.
FOR EACH emitente USE-INDEX nome.
DISP emitente.cod-emitente emitente.nome-abrev.
END.
OUTPUT CLOSE.

Resultado:

Curso de Progress

40 | P g i n a

Put
Habilita a sada dos dados para um determinado arquivo, seja txt, csv, ou qualquer
outro especificado, utilizando um arquivo temporrio, porm possvel especificar a
posio exata onde a informao do registro deve ser posicionada no arquivo,
geralmente utilizado para relatrios e exportaes de dados.
Exemplo:
OUTPUT TO c:\temp\curso\teste.txt NO-CONVERT.
PUT "
RELATORIO
CURSO
DE PROGRESS
"----------------------------------------------------------------------------------------" AT 1 SKIP.

" AT 1 SKIP

FOR EACH emitente USE-INDEX nome.


PUT emitente.cod-emitente AT 1
emitente.nome-abrev AT 20 SKIP.
END.
PUT SKIP(2).
PUT " FIM DO RELATORIO".
OUTPUT CLOSE.

Resultado:

Curso de Progress

41 | P g i n a

Abrindo Arquivo TXT automaticamente


Permite abrir o arquivo gerado temporariamente com as informaes para que o
usurio possa visualizar ou imprimir.
Exemplo:
DEF VAR c-arquivo AS char.
ASSIGN c-arquivo = "c:\temp\curso\teste.txt".
OS-COMMAND NO-WAIT VALUE("notepad " + c-arquivo).

Resultado:
O arquivo especificado sera aberto utilizando o programa notepad do Windows.

Gerando um arquivo do tipo CSV e abrindo no Excel


Criar um arquivo utilizando PUT do tipo CSV e abri-lo utilizando o Excel.
Exemplo:
DEF VAR c-arquivo AS char.
ASSIGN c-arquivo = "c:\temp\curso\teste.csv".
OUTPUT TO VALUE(c-arquivo) NO-CONVERT.
FOR EACH emitente WHERE emitente.cod-emitente >= 26 AND
emitente.cod-emitente <= 50 NO-LOCK USE-INDEX codigo.
PUT emitente.cod-emitente
";"
emitente.nome-abrev

Curso de Progress

42 | P g i n a

";"
emitente.cidade SKIP.
END.
OUTPUT CLOSE.
DOS SILENT START VALUE(c-arquivo).

Resultado:

Break by / first-of / last-of


Define quebras em um For Each.

FIRST-OF - Retorna verdadeiro se a iterao atual for a primeira do grupo de


quebra.
LAST-OF - Retorna verdadeiro se a iterao atual for a ltima do grupo de quebra.
Exemplo:
OUTPUT TO c:\temp\curso\notas.txt NO-CONVERT.
DEF VAR qtd-notas-dia AS INT NO-UNDO.
FOR EACH nota-fiscal WHERE nota-fiscal.dt-emis-nota >= 03/01/2010 AND
nota-fiscal.dt-emis-nota <= 03/30/2010
NO-LOCK

Curso de Progress

43 | P g i n a

USE-INDEX nfftrm-20
BREAK BY nota-fiscal.dt-emis-nota.
IF FIRST-OF(nota-fiscal.dt-emis-nota) THEN DO:
ASSIGN qtd-notas-dia = 0.
PUT "Notas Fiscais do dia: " AT 1
nota-fiscal.dt-emis-nota AT 24
SKIP(2).
PUT "Numero da Nf" AT 1
"Codigo do Emitente" AT 20
SKIP.
PUT "------------" AT 1
"------------------" AT 20
SKIP.
END.
ASSIGN qtd-notas-dia = qtd-notas-dia + 1.
PUT nota-fiscal.nr-nota-fis AT 1
nota-fiscal.cod-emitente AT 20
SKIP.
IF LAST-OF(nota-fiscal.dt-emis-nota) THEN DO:
PUT SKIP(1)
"Quantidade de notas no dia:" AT 1
qtd-notas-dia AT 29
SKIP(2).
END.
END.

Curso de Progress

44 | P g i n a

Resultado:

For each com each (relacionando tabelas)


Relacionar tabelas utilizando uma tabela pai com uma filho, as informaes
relacionadas entre as tabelas so unidas e ficaro disponveis para uso.
Exemplo:
FOR EACH nota-fiscal WHERE nota-fiscal.dt-emis-nota >= 03/01/2010 AND
nota-fiscal.dt-emis-nota <= 03/30/2010
NO-LOCK
USE-INDEX nfftrm-20,
EACH it-nota-fisc WHERE it-nota-fisc.cod-estabel = nota-fiscal.cod-estabel AND
it-nota-fisc.serie = nota-fiscal.serie AND
it-nota-fisc.nr-nota-fis = nota-fiscal.nr-nota-fis
USE-INDEX ch-nota-item.
DISP nota-fiscal.nr-nota-fis
it-nota-fisc.it-codigo.
END.

Curso de Progress

45 | P g i n a

Resultado:

For each com find (relacionando tabelas)


Busca uma informao de uma chave unica de uma tabela relacionada.
Exemplo:
FOR EACH nota-fiscal WHERE nota-fiscal.dt-emis-nota >= 03/01/2010 AND
nota-fiscal.dt-emis-nota <= 03/30/2010
NO-LOCK
USE-INDEX nfftrm-20,
EACH it-nota-fisc WHERE it-nota-fisc.cod-estabel = nota-fiscal.cod-estabel AND
it-nota-fisc.serie = nota-fiscal.serie AND
it-nota-fisc.nr-nota-fis = nota-fiscal.nr-nota-fis
USE-INDEX ch-nota-item.

Curso de Progress

46 | P g i n a

FIND FIRST item WHERE item.it-codigo = it-nota-fisc.it-codigo NO-LOCK NO-ERROR.


DISP nota-fiscal.nr-nota-fis
it-nota-fisc.it-codigo
item.desc-item WITH WIDTH 200.
END.

Resultado:

For each com For each (relacionando tabelas)


Busca a informao do relacionamento no momento em que o registro esta em
buffer.

Curso de Progress

47 | P g i n a

Exemplo:
FOR EACH nota-fiscal WHERE nota-fiscal.dt-emis-nota >= 03/01/2010 AND
nota-fiscal.dt-emis-nota <= 03/30/2010
NO-LOCK
USE-INDEX nfftrm-20.
DISP nota-fiscal.nr-nota-fis.
FOR EACH it-nota-fisc WHERE it-nota-fisc.cod-estabel = nota-fiscal.cod-estabel AND
it-nota-fisc.serie = nota-fiscal.serie AND
it-nota-fisc.nr-nota-fis = nota-fiscal.nr-nota-fis
USE-INDEX ch-nota-item.
FIND FIRST item WHERE item.it-codigo = it-nota-fisc.it-codigo NO-LOCK NO-ERROR.
DISP it-nota-fisc.it-codigo item.desc-item WITH WIDTH 200.
END.
END.

Resultado:

Curso de Progress

48 | P g i n a

PROGRESS GRAFICO
Como criar um Programa Grafico

Como criar um boto

Curso de Progress

49 | P g i n a

Como criar um fillin

Como criar um text

Curso de Progress

50 | P g i n a

Como criar uma Imagem

Curso de Progress

51 | P g i n a

Criando uma Tela para chamada de um Relatrio


1 Crie um programa do tipo Window

2 Altere a propriedade Title inserindo o nome do titulo do programa desejado

3 Insira 2 botes e altere as propriedades Object e Label para nos nomes dos
botes desejados.

Curso de Progress

52 | P g i n a

4 Adicione 2 campos do tipo fill-in e altere as propriedades Object e Label para os


nomes desejados.

5 Ajuste o tamanho da janela e as posies dos campos, insira um quadro e uma


imagem conforme desejado.

6 Selecione o boto Cancelar e clique no menu Window e selecione a opo Code


Section Editor ou digite o atalho CTRL + S

Curso de Progress

53 | P g i n a

7 Na Section Triggers do Boto Selecionado, na propriedade ON: CHOOSE digite o


comando desejado.
Exemplo: APPLY "close":U TO THIS-PROCEDURE.

8 Selecione o campo Data Inicio criado e clique no menu Window e selecione a


opo Properties Window.

9 Na janela Properties Window clique na propriedade Define as, selecione a opo


DATE e clique no boto de confirmar (flag verde), refaa os itens 8 e 9 para o
campo data final.

Curso de Progress

54 | P g i n a

10 Selecione o boto Executar e clique no menu Window e selecione a opo


Code Section Editor ou digite o atalho CTRL + S, e adicione na trigger ON-CHOSE
do boto o programa que deseja executar.
Exemplo:
DO:
DEF VAR c-arquivo AS char.
ASSIGN c-arquivo = "c:\temp\curso\teste.txt".
OUTPUT TO VALUE(c-arquivo) NO-CONVERT.
DEF VAR qtd-notas-dia AS INT NO-UNDO.
FOR EACH nota-fiscal WHERE nota-fiscal.dt-emis-nota >= date(f-dt-inicial:SCREEN-VALUE) AND
nota-fiscal.dt-emis-nota <= date(f-dt-inicial:SCREEN-VALUE)
NO-LOCK
USE-INDEX nfftrm-20
BREAK BY nota-fiscal.dt-emis-nota.
IF FIRST-OF(nota-fiscal.dt-emis-nota) THEN DO:
ASSIGN qtd-notas-dia = 0.
PUT "Notas Fiscais do dia: " AT 1
nota-fiscal.dt-emis-nota AT 24
SKIP(2).
PUT "Numero da Nf" AT 1
"Codigo do Emitente" AT 20
SKIP.
PUT "------------" AT 1
"------------------" AT 20
SKIP.
END.
ASSIGN qtd-notas-dia = qtd-notas-dia + 1.
PUT nota-fiscal.nr-nota-fis AT 1
nota-fiscal.cod-emitente AT 20
SKIP.
IF LAST-OF(nota-fiscal.dt-emis-nota) THEN DO:
PUT SKIP(1)
"Quantidade de notas no dia:" AT 1
qtd-notas-dia AT 29
SKIP(2).
END.
END.
OUTPUT CLOSE.
DOS SILENT START VALUE(c-arquivo).
END.

Curso de Progress

55 | P g i n a

Adicionando Acompanhamento no Relatrio


DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.
RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
RUN pi-inicializar IN h-acomp(INPUT "Aguarde...").
FOR EACH nota-fiscal NO-LOCK USE-INDEX ch-nota.
RUN pi-acompanhar IN h-acomp("Dados: " + nota-fiscal.nr-nota-fis).
END.
RUN pi-finalizar IN h-acomp.

Curso de Progress

56 | P g i n a

Adicionando Zoom no Relatrio


/* Adicionais em Definitions estas Variaveis */
DEFINE VARIABLE hprogramzoom AS HANDLE NO-UNDO.
DEFINE VARIABLE wh-pesquisa AS HANDLE NO-UNDO.
DEFINE VARIABLE l-implanta AS LOGICAL NO-UNDO.
DEFINE NEW GLOBAL SHARED VARIABLE wh-window AS HANDLE NO-UNDO.
DEFINE NEW GLOBAL SHARED VARIABLE adm-broker-hdl AS HANDLE NO-UNDO.
/* Incluir no Evento MOUSE-SELECT-DBLCLICK do Fill-in */
DEF VAR l-implanta AS LOGICAL.
ASSIGN l-implanta = NO.
{include/zoomvar.i &prog-zoom=inzoom/z02in172.w /* Nome do Programa de Zoom */
&campo=nomedocamponatela /* Nome do Fill-In recebedor*/
&campozoom=it-codigo /* Nome do campo a retornar */
&FRAME={&FRAME-NAME}}
/* Adicionar no Main Block do Programa para o fill-in*/
f-item-ini:LOAD-MOUSE-POINTER("image/lupa.cur":U) IN FRAME {&FRAME-NAME}.

Curso de Progress

57 | P g i n a

Criando Relatrios em Excel (template)


1 Abra o programa recm criado e selecione o boto Executar e clique no menu
Window e selecione a opo Code Section Editor ou digite o atalho CTRL + S.

2 No Code Section Editor na trigger on choose do boto executar adicione as


linhas de comando para que seu relatrio passa ser executado, copie o template
abaixo e modifique conforme sua necessidade.

Template:
/* Cria as variaveis necessrias para o relatrio */
DEF VAR chExcelApplication AS COM-HANDLE NO-UNDO.
DEF VAR chWorkbook AS COM-HANDLE NO-UNDO.
DEF VAR chworksheet AS COM-HANDLE.
DEF VAR m-linha AS INTEGER NO-UNDO. /* Varivel p/ contagem das linhas */
ASSIGN m-linha = 1.
CREATE "Excel.Application" chExcelApplication. /* Cria a Planilha */
ASSIGN chWorkbook = chExcelApplication:Workbooks:ADD("")
chworksheet=chexcelapplicAtion:sheets:item(1)
chworksheet:name="Pasta do Relatrio". /* Nome que ser criada a Pasta da Planilha */
m-linha = 2.
ASSIGN chWorkSheet:PageSetup:Orientation = 1. /* Define papel como formato Retrato */
ASSIGN chworksheet:range("A1:C1"):FONT:colorindex = 02 /* Aplica fonte cor Branca no Titulo */
chworksheet:range("A1:C1"):MergeCells = TRUE. /* Cria a Planilha */
chworksheet:range("A1:C1"):VALUE = "Relatrio de Notas Fiscais por Periodo".
chWorkSheet:Range("A1:C1"):HorizontalAlignment = 3. /* Centraliza o Titulo */
chWorkSheet:Range("A1:C1"):Interior:colorindex = 01. /* Aplica fundo preto no titulo */
/* Cria os titulos para as colunas do relatrio */
ASSIGN chworksheet:range("A2:C2"):font:bold = TRUE /* Aplica negrito na linha de titulo das colunas */
chworksheet:range("A" + STRING(m-linha)):VALUE = "Numero da Nota"
chworksheet:range("B" + STRING(m-linha)):VALUE = "Data Emisso"
chworksheet:range("C" + STRING(m-linha)):VALUE = "Valor Total NF"
m-linha = m-linha + 1.
/* Faa o for each desejado */
FOR EACH nota-fiscal WHERE nota-fiscal.dt-emis-nota >= date(f-dt-inicial:SCREEN-VALUE) AND
nota-fiscal.dt-emis-nota <= date(f-dt-final:SCREEN-VALUE)
NO-LOCK
USE-INDEX nfftrm-20.
/* Lista os dados da tabela nas colunas */
ASSIGN chworksheet:range("A" + STRING(m-linha)):VALUE = nota-fiscal.nr-nota-fis

Curso de Progress

58 | P g i n a

chworksheet:range("B" + STRING(m-linha)):VALUE = nota-fiscal.dt-emis-nota


chworksheet:range("C" + STRING(m-linha)):VALUE = nota-fiscal.vl-tot-nota.
ASSIGN m-linha = m-linha + 1.
END.
ASSIGN
chExcelApplication:Range("B1:B65000"):NumberFormat = "dd/mm/aaaa" /* Formato de data na col B */
chExcelApplication:Range("C1:C65000"):NumberFormat = "#.##0,00". /* formato numerico c/2 dec na col C */
chWorkSheet:PageSetup:RightFooter = "&d/&t" + "-PAGINA:" + "&P/&N". /* Data/Hora e Nr Pg no Rodap */
chworksheet:range("A2:C2"):EntireColumn:AutoFit. /* Define automaticamente a largura das colunas */
chExcelApplication:COLUMNS("A:A"):ColumnWidth = 25.00. /* Define manualmente a largura da coluna A */
chExcelApplication:Rows("1:65000"):RowHeight = 17.00. /* Tamanho da linha */
chWorkSheet:PageSetup:PrintTitleRows = "$1:$1". /* Adiciona o Titulo em todas as paginas de Impressao */
chWorkSheet:PageSetup:Zoom = 80. /* Aplica 80% para ajuste na impressao da pagina */
chExcelApplication:Range("A1"):select.
chExcelApplication:Visible = yes.
RELEASE OBJECT chExcelApplication.
RELEASE OBJECT chWorkbook.

Resultado:

Curso de Progress

59 | P g i n a

Curso de Progress

60 | P g i n a

Vrios comandos para formatao Progress x Excel


Criando variveis COM-HANDLE para interao do Progress com o Excel
DEF VAR excelappl
DEF VAR ChWorkSheet

AS COM-HANDLE NO-UNDO.
AS COM-HANDLE NO-UNDO.

Criando a aplicao Excel


CREATE "excel.application" excelappl.
Abrir um arquivo (2 formas).
1 em branco
excelappl:workbooks:ADD().
2 Utilizando um modelo j existente do excel
excelappl:workbooks:ADD(c-modelo).
Onde c-modelo o nome do arquivo excel modelo. Essa varivel deve ter o
contedo completo do arquivo, ou seja, diretrio + nome do arquivo (usar sempre
arquivo .xlt -> modelo)
Fechando o Excel
excelappl:quit().
Usar apenas quando quiser fechar o excel, como por exemplo aps uma
impresso. Se quiser que o arquivo fique aberto para consulta ou para salv-lo
manualmente, no utilizar esse comando.
Esse comando fecha a planilha excel mas no libera o handle da aplicao, vide
nota abaixo.
Liberando o Handle ao final da execuo
(muito importante, inserir esse comando sempre ao final do programa,
pois mesmo se o Excel fechado pelo usurio, a handle fica na memria.)
RELEASE OBJECT excelappl NO-ERROR.
RELEASE OBJECT chWorksheet NO-ERROR.
Repetir o Release para todas as variveis com-handle.
Selecionar pastas
excelappl:worksheets:ITEM(1):SELECT.
O nmero relacionado ao ITEM a pasta que deseja selecionar
Adicionar pastas

Curso de Progress

61 | P g i n a

excelappl:sheets:ADD.
Quando o comando acima executado, a nova planilha criada passa a ser a
corrente. Caso queira inserir informaes em outras planilhas, necessrio
selecionar a planilha desejada conforme tpico acima.
Copiar pastas
excelappl:sheets:item("Plan 1"):activate.
excelappl:Sheets("Plan 1"):Copy(excelappl:Sheets(1)).
"Plan 1" o nome da pasta a ser copiada. (geralmente o excel sugere "Plan 1"). Se
for diferente, basta substituir.
Sheets(1) o lugar onde a pasta ser copiada. 1 a primeira pasta, caso queira
inserir no final, criar uma varivel de controle.
Renomear pastas
excelappl:worksheets:ITEM(i-item):SELECT.
excelappl:worksheets:ITEM(i-item):NAME = "XYZ".
excelappl:worksheets:ITEM(i-item):NAME = TRIM(item.it-codigo).
No esquecer de selecionar a pasta primeiro. A varivel i-item a pasta a ser
renomeada, que pode receber uma constante ou o valor de uma varivel lembrando
que no podem ser utilizados caracteres especiais como /, *, [, ].
Sugiro criar uma varivel e substituir esses caracteres:
ASSIGN c-sheet = REPLACE(c-sheet,"/","_").
ASSIGN c-sheet = REPLACE(c-sheet,"\","_").
ASSIGN c-sheet = REPLACE(c-sheet,"[","(").
ASSIGN c-sheet = REPLACE(c-sheet,"]",")").
ASSIGN c-sheet = REPLACE(c-sheet,"*","x").
ASSIGN c-sheet = REPLACE(c-sheet,":",".").
ASSIGN c-sheet = REPLACE(c-sheet,"?","|").
excelappl:worksheets:ITEM(i-item):SELECT.
excelappl:worksheets:ITEM(i-item):NAME = c-sheet.
Visualizar arquivo Excel
excelappl:VISIBLE = FALSE.
excelappl:VISIBLE = TRUE.
Se True, o Excel aberto e montado para visualizao do usurio. Recomendvel
deixar false durante a execuo do programa e no final repetir o comando, porm
com TRUE. Isso deixa o programa mais rpido e evita um problema que pode
acontecer caso o usurio selecione uma clula enquanto o progress monta o
arquivo.
Ocultar/mostrar linhas de grade

Curso de Progress

62 | P g i n a

excelappl:ActiveWindow:DisplayGridlines = False. (ou true)


obs.: no confundir linhas do arquivo com impresso de linhas de grade. Para
Impresso, vide configurao de pginas.
Zoom do arquivo (visualizao)
excelappl:ActiveWindow:Zoom = 65. /* 65 o percentual desejado */
Configuraes da pgina (para impresso)
Obs.: alterar as configuraes somente quando necessrio, se no
informado, o arquivo utiliza as configuraes padro do Excel.
Orientao da pgina
chWorkSheet:PageSetup:Orientation = 1. /* Portrait (retrato) */
chWorkSheet:PageSetup:Orientation = 2. /* Landscape (paisagem) */
Zoom da pgina (Impresso)
chWorkSheet:PageSetup:Zoom = 75. /* 75 o percentual desejado */
No confundir com o zoom do arquivo, esse zoom o ajuste para X % do tamanho
normal na configurao da pgina
Ajustar pgina por X de Altura e Y de Largura (Impresso)
chWorkSheet:PageSetup:Zoom = FALSE. /* a zoom tem que ser desativado para
funcionar */
chWorkSheet:PageSetup:FitToPagesWide = 1.
chWorkSheet:PageSetup:FitToPagesTall = 1000.
Tipo/tamanho do Papel
chWorkSheet: PageSetup:PaperSize = tipo do papel desejado.
Qualidade de impresso
chWorkSheet: PageSetup:PrintQuality = 600.
Nmero da primeira pgina
chWorkSheet: PageSetup:FirstPageNumber = 3.
Margens
Obs.: a medida em inches, necessrio converter para centmetros. Exemplo :
15 = 0.5 cm
chWorkSheet:PageSetup:LeftMargin

= 15. /* Margem esquerda */

Curso de Progress

63 | P g i n a

chWorkSheet:PageSetup:RightMargin = 15. /* Margem direita */


chWorkSheet:PageSetup:TopMargin = 15. /* Margem superior */
chWorkSheet:PageSetup:BottomMargin = 15. /* Margem inferior */
chWorkSheet:PageSetup:HeaderMargin = 0. /* Margem cabealho */
chWorkSheet:PageSetup:FooterMargin = 0. /* Margem rodap */
Centralizar pgina
chWorkSheet:PageSetup:CenterHorizontally = True. (ou False)
chWorkSheet:PageSetup:CenterVertically
= True. (ou False)
Cabealho e rodap
chWorkSheet:PageSetup:CenterHeader = Titulo do Relatorio. /* cabealho */
/* rodap */
chWorkSheet:PageSetup:LeftFooter = "OBS.: " + FILL("_",60) + CHR(10)
+ FILL("_",66) + CHR(10) +
CHR(10) + "____________________"
+ CHR(10)
+"
ASS. GESTOR".
chWorkSheet:PageSetup:CenterFooter = CHR(10) + CHR(10) + "_____ / _____ /
________" + CHR(10)
+ Data do
Visto".
chWorkSheet:PageSetup:RightFooter = CHR(10) + CHR(10) + "PAGINA: " +
"&P/&N".
rea de Impresso
chWorkSheet:PageSetup:PrintArea = "$A$1:$J$45". /* marca a rea de impresso
da clula A1 at a J45
Imprimir ttulos
chWorkSheet:PageSetup:printTitleRows = "$1:$7". /* repete o range de linhas de
1 a 7 na impresso de todas as pginas */
chWorkSheet:PageSetup:printTitleColumns = " $A:$B". /* repete o range de
colunas de A a B na impresso de todas as pginas */
Imprimir Linhas de Grade
chWorkSheet:PageSetup:PrintGridlines = False. Ou True
Obs.: esse comando funciona apenas para impresso. Para visualizar linhas de
grade no arquivo, vide Ocultar/mostrar linhas de grade
Imprimir Preto e Branco
chWorkSheet:PageSetup:BlackAndWhite = False. Ou True
Imprimir Qualidade Rascunho

Curso de Progress

64 | P g i n a

chWorkSheet:PageSetup:Draft = False. Ou True


Inserindo informaes e configurando clulas
Inserir informao em uma clula (comando + usado)
excelappl:range("A1"):VALUE = Item.
excelappl:range("B1"):VALUE = item.it-codigo.
Controlar clulas por variveis
excelappl:range("A" + STRING(i-linha, "999999") ):VALUE = item.it-codigo.
excelappl:range("P" + STRING(i-linha, "99999999")):VALUE = d-valor-total - d-valadto.
excelappl:range("A" + STRING(i-linha, "99999999")):VALUE = codigo +
string(emitente.cod-emitente).
Obs.: cada clula recebe apenas um tipo de dado. Ou caracter, ou inteiro, ou
decimal, e assim por diante.
Caso queira colocar uma string + um valor, necessrio tranformar o valor em
string como no ltimo exemplo.
As colunas tambm podem ser controladas por variveis, uma forma fcil de fazer
isso criar uma varivel extent e controlar as colunas por nmeros.
DEF VAR i-coluna
AS INTEGER
NO-UNDO.
DEF VAR c-coluna
AS CHAR EXTENT 256
NO-UNDO
INITIAL
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","
V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","A
M","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","
BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","
BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH",
"CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX"
,"CY","CZ","DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","D
N","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC"
,"ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER","ES","
ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ
","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ","
GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM","GN","GO","GP
","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ","HA","HB","HC","HD","HE",
"HF","HG","HH","HI","HJ","HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU
","HV","HW","HX","HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL"
,"IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV"].
O nmero mximo de colunas 256.
Assign i-coluna = 5. /* corresponde a coluna E */

Curso de Progress

65 | P g i n a

excelappl:range(STRING(c-coluna[i-coluna]) + STRING(i-linha,
"99999999")):VALUE = item.desc-item.
Com isso tambm possvel controlar as colunas por nmeros.
Inserir Clculo / Frmula
excelappl:range("B20"):VALUE = "=SUM(B2:B19)".
excelappl:range("B" + STRING(i-linha, "999999")):VALUE = "=SUM(B" +
STRING(i-linha-aux, "999999") + ":B" + STRING(i-linha - 2, "999999") + ")".
excelappl:range("B" + STRING(i-linha, "999999"):FormulaR1C1 = "=SUM(R[-" +
string(i-conta) + "]C:R[-1]C)".
Obs.: comando SUM o somatrio, se precisar de outras frmulas, vide nome no
excel
O clculo tambm pode ser manual:
excelappl:range("B" + STRING(i-linha, "999999")):VALUE = "=B12+C12+E12".
Manipulao de nmeros (Configurar Separador Decimal e Separador de
milhar)
excelappl:DecimalSeparator = ",".
excelappl:ThousandsSeparator = ".".
excelappl:UseSystemSeparators = FALSE.
Muito til quando o relatrio pode ser gerado em Excel instalado em Portugus e
Ingls (dependendo do usurio). Essa opo funciona apenas no Office 2003
ou posterior, os outros no possuem essa opo que fica em Ferramentas /
Opes / Internacional.
Dependendo da linguagem, os nmeros saem distorcidos. Segue abaixo dica para
correo:
DEF VAR c-DecimalSeparator
AS CHAR
DEF VAR c-ThousandsSeparator
AS CHAR
DEF VAR l-UseSystemSeparators AS LOGICAL

NO-UNDO.
NO-UNDO.
NO-UNDO.

No comeo do programa.
ASSIGN c-DecimalSeparator
= excelappl:DecimalSeparator
c-ThousandsSeparator = excelappl:ThousandsSeparator
l-UseSystemSeparators = excelappl:UseSystemSeparators.
excelappl:DecimalSeparator = ",".
excelappl:ThousandsSeparator = ".".
excelappl:UseSystemSeparators = FALSE.
/* imprimir valores desejados aqui */

Curso de Progress

66 | P g i n a

No final do programa.
excelappl:DecimalSeparator = c-DecimalSeparator.
excelappl:ThousandsSeparator = c-ThousandsSeparator.
excelappl:UseSystemSeparators = l-UseSystemSeparators.
Trocando formato da clula
excelappl:range("B1"):numberformat = "#.##0".
excelappl:range("B1"):numberformat = "#.##0,00".
excelappl:range("B1"):numberformat = "@". /* texto */
IMPORTANTE: Colocar os formatos antes dos valores nas clulas, principalmente
campos texto "@"
Verificar outros formatos do excel como data, hora, etc (exatamente como aparece
na macro).
Alterando tamanho da coluna
excelappl:COLUMNS("A:A"):ColumnWidth = 15.00. /* 1 coluna */
excelappl:COLUMNS("B:J"):ColumnWidth = 12.00. /* N colunas */
ou
excelappl:COLUMNS("B:J"):SELECT.
excelappl:SELECTION:ColumnWidth = 12.00.
Alterando tamanho da linha
excelappl:Rows("1:1"):RowHeight = 20.5. /* 1 linha */
excelappl:Rows("1:15"):RowHeight = 20.5. /* N linhas
Inserindo Linhas
excelappl:range("15:15"):INSERT()
ou
excelappl:range(string(i-linha, "9999") + ":" + string(i-linha, "9999")):INSERT().
Mesclar clulas
excelappl:range("A1:J10):SELECT.
excelappl:SELECTION:merge.
OBS.: Selecionar o range primeiro e fazer o merge depois
Ou fazer direto.
excelappl:range("A" + STRING(i-linha) + ":D" + STRING(i-linha)):Merge.
excelappl:range("A" + STRING(i-linha) + ":D" + STRING(i-linha + 10)):Merge.
Desmesclar clulas

Curso de Progress

67 | P g i n a

excelappl:range("B" + STRING(i-linha, "999999")):SELECT.


excelappl:SELECTION:UNMERGE.
Reduzir tamanho da letra automaticamente para caber na clula
excelappl:range("A" + STRING(i-linha, "99999999")):ShrinkToFit = TRUE.
Quebrar texto automaticamente para caber na clula
excelappl:range("A" + STRING(i-linha, "99999999")): WrapText = TRUE.
Orientao do Texto dentro da clula
excelappl:range("A" + STRING(i-linha, "99999999")): Orientation = 0. /* horizontal
*/
excelappl:range("A" + STRING(i-linha, "99999999")): Orientation = 90. /* vertical
*/
O valor varia de -90 a 90 (graus)
Alinhamento do valor dentro da clula
excelappl:range("A1"):HorizontalAlignment = 3.
3 o cdigo do alinhamento (centralizado, por exemplo). Caso queira outro, trocar
o nmero para alinhar a direita, esquerda, etc.
Para horizontal, os cdigos so:
HorizontalAlignment
HorizontalAlignment
HorizontalAlignment
HorizontalAlignment
HorizontalAlignment
HorizontalAlignment
HorizontalAlignment

=
=
=
=
=
=
=

1.
2.
3.
4.
5.
6.
7.

/*
/*
/*
/*
/*
/*
/*

Geral */
Esquerda (recuo) */
Centralizado */
Direita (recuo) */
Preencher */
Justificar */
Centralizar Seleo */

Para vertical, os cdigos so:


VerticalAlignment
VerticalAlignment
VerticalAlignment
VerticalAlignment
VerticalAlignment

=
=
=
=
=

1
2
3
4
5

/*
/*
/*
/*
/*

Superior */
Centralizado */
Inferior */
Justificado */
Distribudo */

Alinhamento de um range de clulas


excelappl:COLUMNS("F:O"):SELECT.
excelappl:SELECTION:HorizontalAlignment = 3.
Ou

Curso de Progress

68 | P g i n a

excelappl:range("A" + STRING(i-linha) + ":D" + STRING(ilinha)):HorizontalAlignment = 3.


Selecionar clulas
1 clula
excelappl:range("A1"):SELECT.
N clulas
excelappl:COLUMNS("F:O"):SELECT.
ou
excelappl:ROWS("2:15"):SELECT.
ou
excelappl:range("A" + STRING(i-linha) + ":D" + STRING(i-linha)): SELECT.
Trocar Fonte
excelappl:range("A1"):FONT:NAME = "nome-dafonte".
excelappl:range("A1"):FONT:BOLD = TRUE. /* negrito */
excelappl:range("A1"):FONT:ITALIC = TRUE.
excelappl:range("A1"):FONT:UNDERLINE = TRUE. /* Sublinhado */
excelappl:range("A1"):FONT:SIZE = 12.
excelappl:range("A1"):Style = "comma" /* style = aplica um tipo de fonte na
clula.
excelappl:range("A1"):font:colorindex = 2. /* vide tabela de cores abaixo */
obs.: O range pode ser substitudo por controle de variveis como exemplo abaixo:
excelappl:range(STRING(c-coluna[1]) + STRING(i-linha, "99999999") + ":" +
STRING(c-coluna[4]) + STRING((i-linha + 5), "99999999")):FONT:size = 12.
Trocar cor da clula
excelappl:range("A1"):interior:colorindex = 10. /* 10 o cdigo da cor. */
Tabela de cores
Vide
01
02
03
04
05
06
07
08
09
10
11

tabela de cores mais usadas (precisando de outra cor, tem que testar):
preto
branco
vermelho
verde limo
azul
amarelo
rosa
azul claro
marron
verde abacate
azul marinho

Curso de Progress

69 | P g i n a

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
34
44
45
46

terra
margenta
verde
cinza claro
cinza
azul marinho claro
roxo
amarelo claro
azul claro
cor de uva
vermelho claro
azul celeste
roxo claro
azul marinho
rosa
amarelo
azul
azul clarinho
laranja claro
laranja meio claro
laranja escuro

O valor mximo 55.


Padres (Sombreamento de clula)
excelappl:range("P" + STRING(i-linha)):interior:Pattern = 9.
9 um dos padres, verificar os outros no Excel.
Congelar painis
excelappl:range("A" + STRING(i-linha, "99999999")):SELECT. /* precisa selecionar
as clulas primeiro */
excelappl:ActiveWindow:FreezePanes = True.
Autofiltro
excelappl:range("A" + STRING(i-linha, "99999999")):SELECT. /* precisa selecionar
as clulas primeiro */
excelappl:range("A" + STRING(i-linha, "99999999")):autofilter(,,,).
Autoajuste de clulas
excelappl:Cells:SELECT. /* precisa selecionar todas primeiro */
excelappl:Cells:EntireColumn:AutoFit.
Esse comando simula a ao de clicar no quadrado superior esquerdo entre as
linhas e colunas (SELECT) e dar um duplo clique em uma das divises de clulas
para autoajuste (AUTOFIT)

Curso de Progress

70 | P g i n a

Inserir Bordas
- Borda ao redor de uma seleo
excelappl:range("A6:A8"):borderaround(1,,48).
excelappl:range("A14:B18"):borderaround(1,3,1).
Onde (1,3,1) segue a seguinte regra:
1 Estilo da Linha (LineStyle)
3 Grossura da linha (Weight)
1 Cor da linha (ColorIndex)
- Bordas individuais
excelappl:Range("b10:d10"):Borders(8):LineStyle
excelappl:Range("d10:d20"):Borders(2):LineStyle
excelappl:Range("b20:d20"):Borders(4):LineStyle
excelappl:Range("b10:b20"):Borders(1):LineStyle
excelappl:Range("A"
excelappl:Range("A"
excelappl:Range("A"
excelappl:Range("A"
Obs.: varia de 1 a 4

+
+
+
+

=
=
=
=

12.
10.
12.
12.

string(i-linha)):Borders(8):Weight
string(i-linha)):Borders(2):Weight
string(i-linha)):Borders(4):Weight
string(i-linha)):Borders(1):Weight

excelappl:Range("b10:d10"):Borders(8):ColorIndex
excelappl:Range("d10:d20"):Borders(2):ColorIndex
excelappl:Range("b20:d20"):Borders(4):ColorIndex
excelappl:Range("b10:b20"):Borders(1):ColorIndex

=
=
=
=

=
=
=
=

3.
2.
2.
3.

1.
1.
2.
2.

Cdigo para Borders


01 coluna esquerda
02 coluna direita
03 linha inferior
04 linha inferior
05 descendo direita
06 subindo direita
07 nada
08 linha superior
Inserir Figura, Desenho
chworkSheet:Pictures:Insert("C:\temp\windows.jpg"):Select
Quebra de Pgina
Para inserir uma quebrar pagina no Excel.

Curso de Progress

71 | P g i n a

1a forma:
chWorksheet:HPageBreaks:Add(chWorksheet:Range("A45")). /* Horizontal */
chWorksheet:VPageBreaks:Add(chWorksheet:Range("L1")). /* Vertical */
obs.: no necessrio utilizar os dois, pode-se usar apenas um de acordo com a
necessidade.
Lembrando que a quebra pode ser em uma clula varivel, nesse caso fica assim:
chWorkSheet:HPageBreaks:Add(chWorksheet:Range("A" + STRING(i-linha))). /*
onde i-linha a varivel de controle */
2a forma:
chBreakLine = chWorkSheet:Rows(STRING(i-linha)). /* Horizontal */
chBreakLine = chWorkSheet:COLUMNS("20").
/* Vertical */
chWorkSheet:HPageBreaks:Add(chBreakLine).
IMPORTANTE: A quebra de pgina no funciona se os tamanhos de altura e largura
da pgina forem especificados como modelo abaixo:
chWorkSheet:PageSetup:Zoom = FALSE.
chWorkSheet:PageSetup:FitToPagesWide = 1.
chWorkSheet:PageSetup:FitToPagesTall = 10.
PARA FUNCIONAR, O ZOOM NO PODE ESTAR DESABILITADO.
chWorkSheet:PageSetup:Zoom = 100. /* PODE SER OUTRO VALOR, 70 POR
EXEMPLO */
Manipulao do arquivo
Mostrar mensagens de Alerta (confirmao para salvar ou imprimir
arquivos)
excelappl:APPLICATION:DisplayAlerts = FALSE. (ou TRUE)
Esse comando importante para controlar as mensagens do Excel. Por exemplo,
para imprimir ou salvar um arquivo onde voc no queira que aparece as
mensagens de confirmao, basta deixar o parmetro como FALSE. Sugiro colocar
sempre.
Salvar arquivos
excelappl:Workbooks:Item(1):SaveAs("c:\temp\teste.xls",,,,,,).
Cada vrgula representa um parmetro:
Os parmetros do SaveAs so:
1 Nome do arquivo

Curso de Progress

72 | P g i n a

2
3
4
5
6

Formato do arquivo (opcional)


Senha (opcional)
Senha para Escrita (opcional)
Somente leitura (True or false) (opcional)
Criar Backup (True or false) (opcional)

Obs.: comum usar apenas o Nome do arquivo conforme exemplo acima.


Visualizar a impresso
excelappl:VISIBLE = TRUE. /* para funcionar a planilha tem que estar visvel */
excelappl:ActiveWindow:SelectedSheets:PrintPreview.
Imprimir arquivos
excelappl:ActiveWindow:SelectedSheets:Printout.
Ou passando parmetros:
Excelappl:ActiveWindow:SelectedSheets:PrintOut(1,true)
Onde: Copies:=1, Collate:=True
Verificar outros parmetros do Excel caso necessrio.
Obs.: para a impresso, sugiro deixar a planilha com visible = false e
DisplayAlerts = False conforme modelo abaixo e sempre selecionar as planilhas a
serem impressas antes de executar o comando.
excelappl:worksheets:ITEM(1):SELECT. /* selecionar a(s) planilha(s) a ser(em)
impressa(s) */
excelappl:VISIBLE = FALSE.
excelappl:ActiveWindow:SelectedSheets:Printout.
excelappl:APPLICATION:DISPLAYALERTS = FALSE.
Obs2.: Imprime a planilha na impressora padro do Windows.
Nota Importante: Verificar se a verso do Excel utilizada possui o comando
desejado. Por exemplo, a configurao de campo para Separador Decimal
no existe no Excel 2000, portanto o comando no vai funcionar.

Dica muito importante:


Todos os comandos podem ser obtidos atravs do prprio Excel atravs de Macro.

Curso de Progress

73 | P g i n a

Para isso, basta abrir o Excel, escolher a opo FERRAMENTAS / MACRO / GRAVAR
NOVA MACRO. (Anote o nome da Macro) e no fechar a macro (parar gravao quadrado / stop) na janelinha de parmetro da Macro, at executar as tarefas
necessrias.
Com essa janela da macro aberta, realizar todas as alteraes desejadas, como
configurao de clula, configurao de pgina, utilizao dos botes do Excel, etc.
Depois de terminado, parar a macro (quadradinho da janela da macro).
Escolher a opo FERRAMENTAS / MACRO / MACRO (alt + F8), selecionar a macro
criada e clicar no boto Editar. Verificar o cdigo gerado e adaptar com os
comandos progress.
Caso o comando no seja exatamente igual, possvel ver a sintaxe do comando
no progress atravs do Pro Tool (componente Progress COM Object Viewer
Lupa com setinhas vermelhas)
Abrir o componente do Excel conforme modelo abaixo:

Curso de Progress

74 | P g i n a