Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação
EMS 2.0
Março/2011
Copyright © 2009 TOTVS S.A. Todos os direitos reservados.
Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou
transmitida por qualquer meio eletrônico ou mecânico, na sua totalidade ou em
parte, sem a prévia autorização escrita da TOTVS S.A., que reserva-se o
direito de efetuar alterações sem aviso prévio. A TOTVS S.A não assume
nenhuma responsabilidade pelas conseqüências de quaisquer erros ou
inexatidões que possam aparecer neste documento.
TOTVS S.A.
Av. Santos Dumont, 831, Joinville, SC, CEP 89.222-900
i
Índice
Includes padrões.....................................................................................26
Widgets.......................................................................................................27
Variáveis.....................................................................................................27
Datasul-EMS 2.00...................................................................................27
Datasul-HR 1.00.....................................................................................27
Outros componentes da linguagem Progress...............................................28
Siglas de países...........................................................................................28
Nomenclatura para Caixas de diálogos em programas de Zoom e
SmartBrowser.............................................................................................29
Adapters......................................................................................................29
CAPÍTULO 4 Layout de Telas.................................................................31
Tipos de Telas (janelas)...............................................................................31
Janela Mestre..........................................................................................31
Janela Detalhe.........................................................................................31
Caixas de Diálogo...................................................................................31
Objetos........................................................................................................32
Combo-boxes..........................................................................................32
Retângulos..............................................................................................32
Botões.....................................................................................................32
Fill-in´s...................................................................................................32
Frames(Telas).........................................................................................32
Radio-Sets...............................................................................................33
Editores...................................................................................................33
Considerações sobre os SmartObjects.........................................................34
SmartBrowser.........................................................................................34
SmartViewer...........................................................................................34
SmartQuery.............................................................................................34
Considerações sobre as Imagens.................................................................34
WebEnabler.............................................................................................34
CAPÍTULO 5 Estilos................................................................................35
Cadastro Simples........................................................................................35
Cadastro Complexo.....................................................................................37
Quando utilizar o Cadastro Complexo....................................................37
Cadastro Simples - Atualiza........................................................................38
Cadastro Complexo - Atualiza....................................................................39
Pai x Filhos - Atualiza Filho.......................................................................40
Quando utilizar Pai x Filhos - Atualiza Filho..........................................40
Manutenção de Filhos.................................................................................41
Índice iii
CAPÍTULO 8
Construção de Programas utilizando os Estilos e suas Técnicas.........127
Como construir um Cadastro Simples.......................................................127
Como construir um Cadastro Complexo...................................................129
Como construir um Cadastro Pai X Filho - Atualiza Filho........................133
Como construir um Cadastro Inclui/Modifica Filho.................................137
Como construir um Cadastro Pai X Filho - Atualiza Ambos.....................143
Como construir um Cadastro Inclui/Modifica Filho.................................147
Como construir um Cadastro Inclui/Modifica Pai.....................................151
Como construir um CustomBrowser Inclui/Modifica...............................154
Como construir um CustomBrowser Zoom Wizard..................................156
Como construir uma Consulta Simples.....................................................160
Como construir uma Consulta Complexa..................................................162
Como construir uma Consulta Relacionamentos.......................................166
Como construir um programa de Relatórios.............................................169
Preparação do Relatório - Interface.......................................................170
Página de Impressão.............................................................................172
Relatórios no formato RTF...................................................................173
Preparando documento Word (.DOC) para RTF...................................174
Dicas para criação do Programa RP.P de Relatório...............................175
Preparando o Relatório para Execução no Módulo JOB EXECUTION....181
Como construir um programa de Parâmetros Únicos................................188
Como construir um programa de Formação..............................................189
Como construir um programa de Formação sem Navegação....................193
Seqüência..............................................................................................194
Como construir um programa de Importação............................................196
Dicas Gerais..........................................................................................196
Preparação do programa.......................................................................197
Dicas para criação do Programa RP.P de Importação............................199
Como construir um programa de Exportação............................................202
Dicas Gerais..........................................................................................202
Preparação do programa.......................................................................202
Dicas para criação do Programa RP.P de Exportação............................205
Como construir um programa de Pesquisa................................................208
Como construir um programa "Vá Para"...................................................210
Como construir um programa de Digitação Rápida..................................211
Como construir um Browse de Digitação..............................................211
Como construir uma Query.......................................................................212
Como construir viewers............................................................................213
Como definir viewer Padrão.................................................................213
Como definir viewer sem campos de tabela:.........................................216
Como definir viewers só com campos chave:.......................................221
CAPÍTULO 9 Validações.......................................................................227
Validações de Tela.....................................................................................227
Validações na Navegação de Registro...................................................227
Validações Antes da Alteração..............................................................227
Validações em Entrada de Dados..........................................................228
Validações em Cadastro Simples..........................................................228
Validações em Cadastro Complexo.......................................................228
Validações para Window Relatório.......................................................229
Validações em Triggers de Dicionário de Dados.......................................229
CAPÍTULO 10 Mensagens......................................................................231
Regras para a criação de novas mensagens...........................................233
Padrões para tradução de mensagens para Inglês e Espanhol................236
CAPÍTULO 11 Programas Reutilizáveis................................................237
Procedures Internas...................................................................................237
CAPÍTULO 12 Ferramentas....................................................................239
Application Compiler................................................................................239
Selecionar arquivos a serem compilados...............................................240
Eliminar e Modificar a lista de arquivos a serem compilados...............241
Opções de Compilação.........................................................................241
Iniciar Compilação................................................................................242
Roundtable................................................................................................243
CAPÍTULO 13 API´s................................................................................247
O que são API´s e como construí-las.........................................................247
Código da API.......................................................................................251
Como documentar API´s...........................................................................252
Como implementar evoluções de API´s....................................................253
UTAPI002.P..............................................................................................263
UTAPI003.P..............................................................................................263
UTAPI004.P..............................................................................................263
UTAPI005.P..............................................................................................264
UTAPI006.P..............................................................................................266
UTAPI007.P..............................................................................................267
UTAPI008.P..............................................................................................267
UTAPI009.P..............................................................................................268
Índice vii
UTAPI010.P..............................................................................................268
UTAPI012.P..............................................................................................268
UTAPI013.P..............................................................................................269
UTAPI018.P..............................................................................................269
UTAPI019.P..............................................................................................269
UTAPI027.P..............................................................................................270
UTAPI028.P..............................................................................................270
UTAPI029.P..............................................................................................270
APAPI009.P..............................................................................................271
Parâmetros de Entrada..........................................................................271
Parâmetros de Saída..............................................................................272
Execução...............................................................................................272
CAPÍTULO 14 Portabilidade de RCODES.............................................274
Regras para Portabilidade de RCODE......................................................274
Caso em Especial......................................................................................275
CAPÍTULO 15 Técnicas..........................................................................277
Como alterar o caracter de senha..............................................................277
Como alterar o diretório corrente..............................................................277
Como alterar ou criar uma variável de ambiente.......................................278
Como dar foco a qualquer objeto..............................................................279
Como deixar uma janela sempre visível....................................................280
Como utilizar OCX...................................................................................280
Como executar um aplicativo do Windows...............................................303
Como implementar Correção Ortográfica em Editores.............................304
Como obter as coordenadas do mouse......................................................306
Como obter o diretório corrente................................................................307
Como obter o diretório de sistema do Windows........................................307
Como obter o diretório do Windows.........................................................308
Como obter o nome do computador..........................................................309
Como obter o valor de uma variável de ambiente.....................................309
Como transformar uma janela em barra de ferramentas............................310
Como desabilitar Radio-Buttons...............................................................311
Como executar programas que são janelas................................................312
Como habilitar ou desabilitar botões em painéis.......................................313
Como habilitar ou desabilitar botões específicos em Browse Inclui/Modifica
..................................................................................................................315
Como implementar campos indicadores com view-as combo-box nas telas
..................................................................................................................316
Como implementar campos indicadores com view-as radio-set nas telas. 317
Como implementar campos indicadores num SmartBrowser....................319
Como implementar labels em retângulos utilizando o dicionário de dados
..................................................................................................................321
Como implementar mensagens para o usuário..........................................322
Mensagem de Erro/Advertência/Informação sem Parâmetros...............322
Mensagem de Erro/Advertência/Informação com Parâmetros..............322
Mensagens com Questionamento ao Usuário........................................323
Como implementar Tooltip em um determinado botão.............................324
Como implementar uma barra de progresso..............................................325
Como implementar acompanhamento (UT-ACOMP)...............................327
Como implementar Zoom e campos de referência para campos chave
estrangeira.................................................................................................329
Como implementar ThinZoom e campos de referência para campos chave
estrangeira em SmartObjects.....................................................................333
Como imprimir campos editores nos relatórios.........................................337
Como totalizar colunas de um browse......................................................338
Como adaptar a procedure pi-retorna-valor no Custom Browser Zoom
Wizard.......................................................................................................339
Situações necessárias............................................................................339
Como implementar Parâmetros de Impressão em Relatórios....................341
Impressão Página de Parâmetros:..........................................................341
Formato de Impressão (80 colunas ou 132 colunas):............................343
Como implementar Botão de Filtro em Zoom...........................................345
Como implementar reposicionamento de registro com base nas variáveis
globais.......................................................................................................345
Definição da Variável Global................................................................345
Reposicionamento Automático do Browser de Zoom...............................347
Como validar campos em viewers diferentes............................................348
Como construir gatilhos de dicionários de dados......................................350
Como implementar localizações...............................................................352
Padronização dos parâmetros do progress.ini............................................355
Como setar os modos de inclusão (Simple/Multiple)................................356
Como utilizar "functions" no UIB.............................................................356
Como verificar o registro de um OCX......................................................358
Como construir um browse com ordenação por coluna............................360
Mini-Flexibilização...................................................................................362
Como registrar campo do tipo Fill-in para o WebEnabler.........................370
Como contar a quantidade de registros numa tabela.................................371
Como chamar um programa que é janela a partir de uma transação..........372
Índice ix
CAPÍTULO 1
Antes do início da conversão de cada módulo deve ser realizada uma revisão n
Dicionário de Dados do MAGNUS versão I.00, que abrange os seguintes itens:
trocar os campos do tipo narrativa (exemplo: "x(76)" x10) nas tabelas por
campos view-as editor e formato "X(2000)";
criar os campos necessários para limpar os campos do tipo char-1, dec-1,
int-1, etc...;
criar tabelas necessárias que hoje estão "camufladas" em arquivos
temporários e/ou em tabelas não utilizadas;
para todos os campos que são indicadores, sejam de tipo de dado caracter
ou lógico, trocar por campo indicador correspondente com tipo de dado
inteiro. Exemplo:
DE PARA
Emitente.identific Emitente.identific
"C"liente 1
"F"ornecedor 2
"A"mbos 3
Campos Livres
Em todas as tabelas dos bancos de dados do produto Datasul-EMS 2.0,
existem no mínimo 10 campos livres, sendo 2 de cada tipo de dado, conforme
tabela abaixo:
Campo Tipo de Dado
Livre
char-1 Caracter
char-2
data-1 Data
data-2
dec-1 Decimal
dec-2
int-1 Inteiro
int-2
log-1 Lógico
log-2
Os antigos campos livres são para uso do cliente, como por exemplo, u-char-1,
u-livre-1, não são mais implementados nas tabelas.
Validações
as validações de campo simples permanecem no Field Validation
(VALEXP), no dicionário de dados, entende-se por validações simples
aquelas que dependam apenas do dado informado do próprio campo, não
fazendo referência a outros campos da tabela. Exemplo: item.descrição-1
<> "";
todas as validações, inclusive as constantes no Field Validation dos
campos atualizados na tela, devem ocorrer no momento de confirmação de
gravação (botões OK, Gravar, GO of frame);
normalmente, é feita a validação em um destes locais, pi-validate, quando
existirem mais de uma viewer ou na local-assign-record, quando for
apenas uma;
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 5
CAPÍTULO 2
Estrutura de Diretórios
Datasul-EMS 2.0
Diretórios Conteúdo
\ADBRW Objetos Browsers do banco Administrativo
\ADGO Objetos "Vá para" do banco Administrativo
\ADINC Includes de campos indicadores do banco
Administrativo
\ADQRY Objetos Queries do banco Administrativo
\ADVWR Objetos Viewers do banco Administrativo
\ADZOOM\ Zooms do banco Administrativo
\AEP Programas do módulo Aplicações e Empréstimos
\APP Programas do módulo Contas a Pagar
\BCP Programas do módulo Coleta de Dados
\BHP Programas do módulo Bancos Históricos
\BSP Programas do módulo Benefícios Sociais
\BTB Programas do módulo Básico
\CBP Programas do módulo Caixa e Bancos
\CCP Programas do módulo Compras
\CDP Programas do módulo Cadastro
\CEP Programas do módulo Controle de Estoque
\CFP Programas do módulo Configurador Produto
8
Investimentos
\IVQRY Objetos Queries do banco Investimentos
\IVVWR Objetos Viewers do banco Investimentos
\IVZOOM Zooms do banco Investimentos
\LAYOUT Layout´s de Importação
\MASTERS Masters do SmartObjects
\MEN Módulo Menu
\MIP Programas do módulo Manutenção Industrial
\MPBRW Objetos Browsers do banco MultiPlanta
\MPGO Objetos "Vá para" do banco MultiPlanta
\MPINC Includes de campos indicadores do banco MultiPlanta
\MPP Programas do módulo MultiPlanta
\MPQRY Objetos Queries do banco MultiPlanta
\MPVWR Objetos Viewers do banco MultiPlanta
\MPZOOM Zooms do banco MultiPlanta
\OFP Programas do módulo Obrigações Fiscais
\PANEL Painéis dos SmartObjects
\PCP Programas do módulo Planejamento Capacidade
\PDP Programas do módulo de Pedidos
\PEBRW Objetos Browsers do banco Ponto Eletrônico
\PEGO Objeto "Vá para" do banco Ponto Eletrônico
\PEINC Includes de campos indicadores do banco Ponto
Eletrônico
\PEP Programas do módulo Ponto Eletrônico
\PEQRY Objetos Queries do banco Ponto Eletrônico
\PEVWR Objetos Viewers do banco Ponto Eletrônico
\PEZOOM Zooms do banco Ponto Eletrônico
\PIP Programas do módulo Planejamento Manutenção
Industrial
\PLP Programas do módulo Planejamento
\PMP Programas do módulo Plano Mestre
\PTP Programas do módulo Patrimônio
\PVP Programas do módulo Previsão de Vendas
\QOP Programas do módulo Cotação de Vendas
\REP Programas do módulo Recebimentos
\RHBRW Objetos Browsers do banco Recursos Humanos
\RHGO Objetos "Vá para" do banco Recursos Humanos
\RHINC Includes de campos indicadores do banco Recursos
Humanos
\RHQRY Objetos Queries do banco Recursos Humanos
\RHVWR Objetos Viewers do banco Recursos Humanos
\RHZOOM Zooms do banco Recursos Humanos
\SCRIPTS Scripts de Carga da Aplicação
\SEC Módulo Segurança
\SPOOL Diretório default de destino dos Relatórios
\SPP Programas especiais dos módulos (não será expedido)
\SRC Includes Padrões PROGRESS
\SUPPORT Programas UIB customizados
\UNBRW Objetos Browsers do banco Universal
\UNGO Objetos "Vá para" do banco Universal
\UNINC Includes de campos indicadores do banco Universal
\UNQRY Objetos Queries do banco Universal
\UNVWR Objetos Viewers do banco Universal
\UNZOOM Zooms do banco Universal
\UTB Módulo Universal
\UTP Programas Utilitários
\VARINC Includes de variáveis indicadores
\LOCAL Programas que possuem localizações
\XXX Prefixo do País
\DATABASE Gatilhos do Banco de Dados do País
Datasul-HR 1.0
Diretórios Conteúdo
\DATABASE \INPM Includes de campos indicadores do banco MGPMG
\INPY Includes de campos indicadores do banco MGPYC
\INTM Includes de campos indicadores do banco MGTMA
\INUN Includes de campos indicadores do banco MGUNI
\TGPM \TAP Gatilhos de assign do banco MGPMG
\TCP Gatilhos de create do banco MGPMG
\TDP Gatilhos de delete do banco MGPMG
\TFP Gatilhos de find do banco MGPMG
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 13
15
CAPÍTULO 3
Nomenclatura
16
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 17
tt = td “trigger de delete”.
ddddd = ad098 “dump-name da tabela do produto padrão”.
Observação O DWB do EMS5 usa o underline como separador entre cada uma das
abreviaturas e o DWB do EMS2 usa o hífen.
Definição
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 19
Módulo Sigla
Administração de Treinamento AT
Benefícios BS
Cargos e Salários CA
Desenvolvimento de Pessoal DS
Férias e Rescisões FR
Folha de Pagamento FP
Ponto Eletrônico PE
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 23
Tipos de Atributos
Tipos de Atributos são classificadores para os tipos de informações que são
gravadas. Segue abaixo, uma lista de todos os tipos de atributos, descrições e
tipos de dados.
Tipo Descrição Tipo de Dado Formato Default
cb1 Código de Barra Tipo 1 Integer >>>>>>>9
cb2 Código de Barra Tipo 2 Integer >>>>>>>>>>>9
cb3 Código de Barra Tipo 3 Character X(20)
cdd Código - Decimal Decimal >>>,>>>,>>9
cdn Código - Numérico Integer >>>,>>9
cod Código Character X(8)
dat Data Date 99/99/9999
des Descrição Character X(40)
dsl Descrição - Longa Character X(15000)
hra Hora Character 99:99:99
idi Indicador - Inteiro Integer 9
Img Imagem Character X(08)
log Lógico Logical Sim/Não
mmp Memory pointer MenPtr X(8)
nom Nome Character X(30)
num Número Integer >>>>,>>9
qtd Quantidade Decimal ->>>>,>>9.9999
qti Quantidade - Inteira Integer >>>,>>9
raw Raw Character X(15000)
rec Recid Recid >>>>>>9
row Rowid Rowid X(20)
som Som Character X(40)
val Valor Decimal ->>,>>>,>>>,>>9.99
vid Vídeo Character X(40)
vli Valor-inteiro Integer >>>,>>9
wgh Widget-Handle Widget-Handle >>>>>>9
Dump-name de tabelas
O Dump-name de uma tabela, tem o formato "xx999", onde "xx" é a sigla do
banco de dados do produto, no qual, a tabela é armazenada, e 999 é um
número seqüencial único dentro do banco de dados, Assim, a tabela "item" que
está no banco de dados industrial tem o dump-name "in172". É importante
utilizar letras minúsculas para a sigla da base de dados.
Não existe processo automático para determinar o número seqüencial para a
tabela no banco de dados. Basta acrescentar uma unidade ao último número já
utilizado.
Programas
A nomenclatura de um programa é determinada em função do seu tipo/estilo, e
a sua extensão é .w, se possuir interface e .p, quando não. Entretanto dois
programas, mesmo se tiverem extensões diferentes, não podem ter o mesmo
nome de arquivo, porque na geração do executável .r, ambos tem o mesmo
nome do arquivo com extensão .r.
Todos os arquivos - sejam programas com extensão .p, includes com
extensão .i*, imagens, nomes de diretórios, etc., deverão obedecer a regra
imposta pelo DOS para o seu nome, isto é, o tamanho máximo do arquivo
deve ter 8 caracteres e o tamanho máximo para a extensão deve ter 3
caracteres no máximo.
Também, todos os nomes de arquivo dos programas devem estar em letras
minúsculas.
1
"xx999" é o dump-name da tabela.
2
O gatilhos de assign do campo obedece a nomenclatura diferenciada pois podemos ter mais de um gatilho
assign por tabela, assim a parte 999999, no padrão, é um número seqüencial de campos em todo o Datasul-
EMS 2.0.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 25
Para os programas que são objetos (SmartObjects) e estão ligados a uma tabela
adota-se a nomenclatura abaixo:
Tipo do Objeto Diretório destino Nomenclatura Exemplos para a tabela "item"
Browser xxbrw 3
b99xx999.w 4
bo01in172.w
Dialog xxdialog d99xx999.w d01in172.w
Go (Vá para) xxgo g99xx999.w g01in172.w
Query xxqry q99xx999.w q01in172.w
Viewer xxvwr v99xx999.w v01in172.w
Zoom (Pesquisa) xxzoom z99xx999.p z01in172.w
para os programas que estão ligados a um módulo do Datasul-EMS 2.00,
sendo então, containers ou programas .p, sem interface ou ainda API´s,
adota-se a nomenclatura abaixo, sendo que o diretório destino do
programa é sempre o diretório do módulo:
Tipo Nomenclatura Exemplos
API xxapi999.p cep/ceapi001.p
Container xx9999zz.w5 cep/ce0401.w
Subprograma de relatório xx9999rp.p 6
cep/ce0401rp.p
Subprograma qualquer sem interface xx9999zz.p cep/ce0401a.p
para programas do produto Datasul-HR 1.00 deve ser observado um
controle na criação da numeração do nome do programa, conforme tabela
a seguir:
Numeração Tipo de Programas
0000 à 0099 Manutenções Cadastrais
0100 à 0199 Manutenções Gerais
0200 à 0299 Consultas Cadastrais
0300 à 0399 Consultas Complexas/Relacionamento
0400 à 0499 Listagens Cadastrais
0500 à 0699 Relatórios
0700 à 0799 Tarefas
0800 à 0899 Especiais/Gráficos
0900 à 0999 Utilitários
3
"xx" é a sigla do banco de dados da tabela principal do objeto.
4
"99" é um número seqüencial de objetos de um determinado tipo para uma tabela e "xx999" e dump-name
desta tabela.
5
"xx" indica a sigla do módulo e "zz" caracteres de diferenciação entre programas e subprogramas.
6
Os caracteres "rp" são fixos para nomenclatura deste tipo de subprograma construído através dos Estilos
relatório e importação/exportação.
Os programas CADASTRAIS tem sempre uma numeração concordante,
conforme exemplo:
Cadastro: AT0017
Consulta: AT0217
Relatório: AT0417.
Includes
Da mesma maneira que os programas, os includes, também, devem ter seus
nomes de arquivo em letras minúsculas, e também, obedecem a algumas regras
de nomenclatura, conforme o objetivo do include. As extensões dos includes
devem ser sempre .i, i1, .i2, ... e .i9.
Include com view-as de campos para o dicionário de dados
São includes que incorporam a definição do view-as de campos indicadores
com tipo de dado inteiro. Estes includes são fundamentais para a tradução do
produto.
Diretório destino Nomenclatura Exemplos
varinc var99999.i 7
varinc/var00002.i
Includes de programas
A nomenclatura destes includes é dada em função do seu grau de reutilização:
Quando um include é apenas utilizado por um mesmo programa/procedimento,
o nome deste include é igual ao do programa, apenas com a extensão .i ou .i1 a
.i9. Exemplo: cdp/cd0206.i para cdp/cd0206.w ou advwr/v01ad102.i para
advwr/v01ad102.w.
Quando um include é utilizado por vários programas de um mesmo módulo, o
nome deste include é a sigla do módulo mais um número seqüencial,
geralmente acima de 9000. Exemplo: cep/ce9000.i.
Quando um include é utilizado por vários programas de vários módulos, o
nome deste include é 'cd' mais um número seqüencial. Exemplo:cdp/cd9500.i.
7
"999999" é um número seqüencial de includes dentro do diretório "varinc".
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 27
Includes padrões
Os includes padrões dos Estilos devem ser depositados no diretório include, e
o seu nome de arquivo iniciar por "i-" mais um nome significativo, que
indique o estilo ou a função. Exemplo: include/i-rpini.i.
Widgets
O padrão de nomenclatura adotado é um prefixo que identifique o widget mais
um nome significativo. A tabela de prefixo é apresentada a seguir:
Widget Prefixo Exemplo
Botão bt- bt-ok
Browse br- br-zoom
Combo-box cb- cb-tipo-conta
Fill-in fi- fi-texto
Radio-set rs- rs-modo-execucao
Retângulo rt- rt-moldura
Selection-list ls ls-estados
Slider sl sl-percentual
Toggle-box tb tb-ativo
Observação O padrão para nome de retângulo não é importante, pois dificilmente são
realizados tratamentos nos programas para este tipo de widget.
Variáveis
Datasul-EMS 2.00
Quando uma variável não for um widget o seu tipo de dados determina o
prefixo que deve ser utilizado para nomear as variáveis, conforme tabela a
seguir:
Tipo de dado Prefixo Exemplo
Caracter c- c-conta
Inteiro i- i-contador
Data da- da-atualizacao
Decimal de- de-total-geral
Handle h- h-acomp
Lógico l- l-ativo
Raw raw- raw-param
Rowid rw- rw-
Widget-handle wh- wh-botao
Datasul-HR 1.00
A nomenclatura de variável é formada de acordo com a seguinte regra:
v_tipo de atributo_qualificador
Tipo de Atributo Qualificador Exemplo
Conforme tabela no item 4.3 Nome que qualifica a variável V_cod_fornec
Siglas de países
Será utiliza a norma ISO 3166-1 para definição das siglas dos países. A norma
ISO 3166-1 pode ser consultada em http://pt.wikipedia.org/wiki/ISO_3166-1
Será utilizada sempre a sigla de três letras:
Num Alfa-3 Alfa-2 Pais
32 ARG AR Argentina
44 BHS BS Bahamas
68 BOL BO Bolívia
76 BRA BR Brasil
124 CAN CA Canadá
152 CHL CL Chile
170 COL CO Colômbia
188 CRI CR Costa Rica
192 CUB CU Cuba
222 SLV SV El Salvador
218 ECU EC Equador
Estados Unidos da
840 USA US América
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 29
Adapters
A estrutura de diretórios e o nome dos adapters devem ser definidos com o
seguinte padrão:
Diretórios: adapters/[nome do parceiro]/[cicla do módulo – 3 dígitos].
Nome: a[sigla do parceiro - 2 dígitos][sigla módulo - 2 dígitos][inteiro
seqüencial - 3 números].p
Exemplo: adapters/neogrid/ccp/anecc102.p - adapter Neogrid do módulo de
compras
31
CAPÍTULO 4
Layout de Telas
Observação Não é aconselhável salvar uma Dialog com uma Window aberta. Quando isto é
feito, é possível que o menu da Window seja copiado para a Dialog eliminando-o. Caso isto
aconteça é necessário recriar a Dialog e o menu da Window.
Objetos
Combo-boxes
Ver capítulo Como implementar campos indicadores com view-as combo-box
nas telas.
Retângulos
São utilizados para agrupar a chave de acesso das telas, agrupar campos de um
mesmo assunto, emoldurar itens de radio-set e emoldurar editores que
necessitem de label.
Botões
os botões com label devem ter:
altura: 1,00 unidade de caracter;
largura: 10, 15 ou 20 unidades de caracter;
quando representarem ações e possuírem labels estes termos devem ser
verbos no infinitivo. Exemplo: Cancelar, Incluir, Modificar, Eliminar ...;
botão 'OK' sempre confirma a ação e sai da tela corrente;
botão 'Cancelar' não confirma a ação e sai da tela corrente;
botão 'Ajuda' sempre é disposto no canto inferior direito nas janelas
detalhe e caixas de diálogo;
os botões de 'Sair' e 'Ajuda' devem estar sempre no canto superior direito
nas janelas pai.
Fill-in´s
os campos e variáveis view-as fill-in devem ter altura de 0,88 unidade de
caracter, excepcionalmente, os campos e variáveis view-as combo-box tem
a altura de 1,00 unidade de caracter.
Frames(Telas)
título das telas é feito a partir do UT-9000.i, não necessitando intervenção
do programador;
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 33
35
CAPÍTULO 5
Estilos
Cadastro Simples
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 37
Cadastro Complexo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 39
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 41
Manutenção de Filhos
é uma janela sem painéis, podendo possuir ou não folders de acordo com
a necessidade, é chamada a partir de um programa Pai x Filho, a janela é a
mesma tanto para inclusão quanto para alteração;
a janela possui quatro botões: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o botão de 'Ok' tem função igual tanto para chamada do programa, para
inclusão, quanto para modificação;
o botão de 'Salvar', quando o programa é chamado para inclusão, possui
função de salvar o registro corrente e criar um registro novo;
o botão 'Cancelar', anula qualquer mudança feita no registro corrente do
programa, ou seja, cancela apenas a última inclusão ou a última alteração;
o botão 'Ajuda' é responsável por chamar o help do programa.
Caraterísticas
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 43
Manutenção de Pais
é uma janela sem painéis, podendo possuir ou não folders, de acordo com
a necessidade, é chamada a partir de um programa Pai x Filho, a janela é a
mesma tanto para inclusão quanto para alteração ou cópia;
a janela possui quatro botões: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o botão de 'Ok' tem função igual tanto para chamada do programa, para
inclusão, quanto para modificação;
o botão 'Salvar', quando o programa é chamado para inclusão, possui
função de salvar o registro corrente e criar um registro novo;
o botão 'Ajuda' é responsável por chamar o help do programa.
Características
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 45
Consulta Relacionamento
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 51
Parâmetros Únicos
Parâmetros Múltiplos
Seguir as mesmas regras dos Cadastros Simples ou Complexo, dependendo do
número de campos.
Exemplo: Parâmetros por estabelecimento.
Características
Formação
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 53
Importação
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 57
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 59
Zoom de Tabelas
Vá Para
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 61
Digitação Rápida
Painéis
Funções
Relatórios Relacionados
63
CAPÍTULO 6
UT-FIELD.I
Retornar propriedades dos campos do dicionário de dados, como label,
column-label, etc..
{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}
Onde:
<banco>: nome lógico do banco de dados que contém o campo
<tabela>: nome da tabela que contém o campo
<campo>: nome do campo
<propriedade>: número que identifica a propriedade conforme tabela a seguir:
Número Propriedade
1 Label
2 Column-Label
3 Help
4 Format
5 Initial
6 Description
7 Data Type
64
UT-RTLBL.I
Permitir a utilização de literais para colar labels em retângulos na tela
minimizando os problemas de internacionalização.
campos view-as radio-set ou editor, onde seja necessário emoldurá-lo com
retângulo com um label para identificá-lo;
literais utilizados em telas para substituir labels;
{utp/ut-rtlbl.i <banco> <tabela> <campo> <widget fill-in>}
Onde:
<banco>: nome lógico do banco de dados que contém o campo
<tabela>: nome da tabela que contém o campo
<campo>: nome do campo
<widget fill-in>: fill-in view-as text colocado na tela
Exemplo:
{utp/ut-rtlbl.i mgadm conta natureza text-1}
UT-RUN.I
Seu objetivo é executar programas que não possuam interface (.p), através do
recurso de RPC (Remote Procedure Call). Deve executar apenas programas
(.p), chamados a partir de programas (.w). Não deve chamar um programa (.p),
a partir de um outro programa (.p), como por exemplo um programa de
impressão de relatórios xxp/xx9999rp.p, porque o programa chamador (.p), já
está rodando no servidor (Application Server) e não é necessário iniciar um
novo servidor.
Sempre que for chamado algum programa sem interface a partir de um .W e
que este programa seja candidato para ser executado via RPC.
Nota Para utilizar os includes é necessário relacionar ao programa os includes {utp/ut-glob.i}
e {btb/btb008za.io} no main-block, para definição de variáveis e funções.
Onde:
{1}: nome externo do programa
{2}: parâmetros do programa
{3}:mostra mensagem de acompanhamento [Opcional]
{4}: servidor de RPC determinado [Opcional]
Nota Para informar parâmetros em branco ou literal, utilize aspas duplas ("") com aspas
simples (''). Exemplo: ' " " '.
Não sendo informados os parâmetros opcionais estes receberão "yes" e ' " " ' respectivamente.
Funções
solicita a conexão e cria a instância do servidor, conforme servidor do
aplicativo ou parâmetro;
mostra mensagem se ocorrer um erro (por exemplo, de conexão), quando
solicitada ({3} = yes);
dispara a execução do programa no servidor;
encerra a conexão e elimina a instância.
Aplicações
Quando o programa API será disparado uma única vez para realizar todo o
processo.
Exemplo: {utp/ut-run.i cep/ceapi001.p "input-output table tt-
mvto, input-output table tt-erro, input yes ' " " '}
Modelo Aberto
Includes
{btb/btb008za.i1 {1} {2} {3}}
Onde:
{1} = nome externo do programa
{2} = mostra mensagem de acompanhamento
{3} = servidor de RPC determinado
{btb/btb008za.i2 {1} {2} {3}}
Onde:
Considerações
Exemplo
Gerais
Onde:
{1} = nome externo do programa
{2} = nome da variável do tipo "handle" utilizada para eliminar a procedure
persistente [Opcional]
Funções
Idênticas ao Modelo Simplificado, porém distribuídas em três includes:
solicita a conexão e cria a instância do servidor;
dispara a execução do programa;
encerra a conexão e elimina a instância.
Aplicações
Quando o programa API é disparado n vezes dentro de um laço (repeat, for
each...).
def var h-handle as handle no-undo.
{btb/ btb008za.i1 cep/ceapi001.p yes "rpc-test"}
for each cta_ctbl no-lock:
/* Prepara tt_movto */
{btb/btb008za.i2 cep/ceapi001.p "input tt_movto, output
tt_erro" "h-handle"}
end.
{btb/btb008za.i3 cep/ceapi001.p "h-handle"}
Nota Existe a API BTAPI008 que possui funções que podem ser utilizadas no desenvolvimento.
Caso não seja informado nenhum servidor RPC, será utilizado o servidor RPC
definido no aplicativo do programa;
Se o processo estiver sendo executado via RPW e o servidor RPC não foi
informado o programa será executado On-line.
Parâmetros X
Compo
rtament
o
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 67
Quando informado valor parar servidor RPC, caso ocorra algum erro não será
possível a execução On-line.
Ocorrendo erros na tentativa de execução do programa (faltou passar
parâmetros, por exemplo), estes serão retornados juntamente com a mensagem
16435 (*).
Quando for informada a variável do tipo "handle" para a include
btb/btb008za.i2, deve-se tomar dois cuidados: Primeiro, esta variável deve
estar previamente definida no programa. E segundo, ao final da execução,
deve-se eliminar o programa persistent passando o nome da variável para a
include btb008za.i3.
Existe a API que transporta o conteúdo das variáveis de ambiente do
Datasul_EMS da sessão client para a sessão do application server (remota)
quando o programa solicita a execução de determinado programa via RPC
(Remote Procedure Call). Logo, as informações como usuário corrente, grupos
de segurança em que o usuário se encontra, empresa do usuário... estarão
disponíveis na sessão remota.
Dados:
Nome Programa: btb/btb923za.p
Sintaxe: run btb/btb923za.p
(<versão_integração>, <handle_application_server>)
Programa Servidor RPC Mensagem Comportamento
Inexistente - Yes Exibe mensagem 3045(*) via
PI_STATUS_ERROR.
Inexistente - No Retorna mensagem 3045(*)
Existe e Executa - Yes Exibe mensagem 16431(*) via
RPC =no PI_STATUS_ERROR.
Existe e Executa Informado No Retorna mensagem 16431(*)
RPC =no
Existe e Executa Não Informado No Executa ON-LINE
RPC =no
Existe e Executa Informado e Yes Exibe mensagem 16433(*) via
RPC =yes Inexistente PI_STATUS_ERROR.
Existe e Executa Informado e No Retorna mensagem 16433(*)
RPC =yes Inexistente
Existe e Executa Não Informado e Yes Exibe mensagem 16432(*) via
RPC =yes Inexistente PIA_STATUS_ERROR.
Existe e Executa Não Informado e No Executa ON_LINE
RPC =yes Inexistente
Existe e Executa Informado, No Retorna mensagem 16434(*)
RPC =yes Existe e Não
disponível
Existe e Executa Não Informado, Yes Exibe as mensagens 16434(*) via
RPC =yes Existe e Não PI_STATUS_ERROR
disponível
Existe e Executa Não Informado, No Executa ON-LINE
RPC =yes Existe e Não
disponível
Existe e Executa Informado, Yes Executa via RPC (**)
RPC =yes Existe e
Disponível
Existe e Executa Informado, No Executa via RPC (***)
RPC =yes Existe e
Disponível
Existe e Executa Não Informado, Yes Executa via RPC (**)
RPC =yes Existe e
Disponível
Existe e Executa Não Informado, No Executa VIA RPC
RPC =yes Existe e
Disponível
Observação Ocorrendo erro na conexão
do Servidor RPC, será executado ON-LINE
(*) Mensagens:
3045 - Programa não cadastrado no menu !
6160 - Não foi possível executar o programa via RPC !
16431 - Programa não pode ser executado via RPC
16432 - Não foi possível encontrar servidor RPC para programa '&1' !
16433 - Servidor RPC não cadastrado
16434 - Servidor RPC não disponível
164 35 - Não foi possível executar programa !
(**) Ocorrendo erros na conexão do servidor RPC, estes serão exibidos em
tela juntamente com a mensagem 6160.
(***) Ocorrendo erros na conexão do servidor RPC, estes serão retornados
juntamente com a mensagem 6160.
Formato
Utilização
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 69
UT-MSGS.P
Apresentar para o usuário uma mensagem previamente cadastrada, no Sistema
de Mensagens, ou ainda, retornar para o programa propriedades desta
mensagem.
Notas :
ao ser exibida uma mensagem, seu número vai ser exibido na barra de título da caixa de
diálogo, juntamente com o tipo de mensagem. Ex.: Pergunta: (10);
antes da exibição de qualquer mensagem, será verificado se ela possui uma substituta, se
houver, a mensagem substituta será exibida ao invés da original. Da mesma forma, antes da
exibição da mensagem substituta, será verificado se esta também, possui uma mensagem
substituta e assim por diante;
quando da exibição de mensagens substitutas, os números da mensagem original e da
mensagem substituta serão exibidos na barra de títulos da caixa de diálogo. Exemplo:
Advertência: (134) - (354), onde 134 seria a mensagem exibida e 354 a mensagem original.
Onde:
<ação>: ação desejada, conforme a tabela a seguir:
Ação Resultado
show Apresenta a mensagem, com texto de ajuda no padrão do produto
msg Retorna o texto da mensagem
help Retorna o texto de ajuda
type Retorna o tipo da mensagem (Erro, Advertência, Informação ou Questão)
codtype Retorna o código do tipo da mensagem
<número da mensagem>: número da mensagem desejada.
<parâmetros>: são os campos, tabelas e outras palavras que se deseja colocar
na mensagem no momento de sua utilização. Cada um dos parâmetros deve ser
separado por "~~" como por exemplo:
Formato
Utilização
Objetivo
Observações
Exemplo
Onde:
{1}: indica a função a ser realizada, conforme tabela abaixo:
Função Objetivo
01 define view-as combo-box
02 define view-as radio-set
03 lista com os itens separados por vírgula
04 n Retorna o item n da lista
05 Retorna o número de itens da lista
Formato
Utilização
Objetivo
Exemplo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 71
UT-TABLE.I
Retornar propriedades das tabelas do dicionário de dados.
nos SmartBrowsers ou Browsers para por label em campos calculados;
para utilização de literais ou textos nas telas com função de label, como no
retângulo que envolve o radio-set.
{utp/ut-table.i <banco> <tabela> <propriedade>}
Onde:
Formato
Utilização
Objetivo
UT-LITER.I
Utilizar o cadastro de literais do Datasul-EMS, cadastrando automaticamente
as literais utilizadas no programa e retornando a tradução da literal no idioma
corrente do banco de dados.
em todos os lugares onde literais passíveis de tradução forem apresentadas
na interface do programa.
{utp/ut-liter.i <literal> <modulo contexto> <alinhamento>}
Onde:
<literal>: Literal a ser utilizada na tela com os espaços substituídos por "_"
(undescore). OBS.: Se a literal passada terminar com “:U” a literal não será
traduzida e a mesma será retornada sem os dois últimos caracteres.
<módulo contexto>: parâmetro opcional que define o contexto de tradução da
literal, este contexto é um módulo do Datasul-EMS, se omitido a literal deve
ter o contexto universal de tradução, que é representado pelo valor *
(asterisco)
<alinhamento>: parâmetro opcional que define onde é incrementado o espaço
extra para tradução, conforme tabela abaixo, se omitido deve reservar o espaço
à esquerda da literal:
Tipo Alinhamento
L A esquerda
C Centralizado
R A direita
Exemplo de
Formato
Utilização
Objetivo
variáve
is
definid
as
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 73
UT-LIMIT.P
Determinar o valor inicial e final de campos caracter, cujo formato é variável,
como por exemplo a conta-contábil.
Na seleção de relatórios, cálculos, atualizações e zooms que tenham faixas de
seleção sobre campos caracter com formato variável.
run utp/ut-limit.p (input <opção>,
<formato>).
Onde:
<opção>: indica o limite desejado, MIN = Mínimo e MAX = Máximo
<formato>: formato do campo caracter
O retorno é obtido através do return-value.
def var c-conta-ini as char no-undo.
find first param-global no-lock no-error.
run utp/ut-limit.p (input "MIN",
input param-global. formato-conta-contabil).
Assign c-conta-ini = return-value.
UT-GLOB.I
Define as variáveis globais.
Já está definido dentro dos SmartObjects.
i-ep-codigo-usuario: contém a empresa corrente do usuário.
l-implanta: variável lógica usada no Zoom, para habilitar o botão implanta.
c-seg-usuario: contém o nome do usuário corrente logado no menu.
Exemplo
Formato
Utilização
Objetivo
I-FREEAC.I
Converter strings acentuadas e caracteres especiais para strings não acentuadas
e caracteres simples.
nos Templates de Relatório, Importação, Exportação e em pontos
específicos que necessitem que a saída de dados (impressora/arquivo/tela)
seja feita sem acentuação;
{include/i-freeac.i}
assign <variável> = fn-free-accent("<string>").
display fn-free-accent("<string>").
Onde:
<variável>: variável que irá armazenar o valor do retorno da função fn-free-
accent
<string>: string acentuada a ser convertida.
{include/i-freeac.i}
define var c-texto as char no-undo.
assign c-texto = fn-free-accent ("ÁÀÃÂÄ-ÉÈÊË-ÍÌÎÏ-ÓÒÔÕÖ-ÚÙÛÜ-ÝŸ-
Ç-Ñ").
message fn-free-accent("áàãâä-éèêë-~íìîï-óòõôö-úùûü-y´¨y-ç-ñ")
chr(10) c-texto view-as alert-box.
UT-DIR.P
Este utilitário deve ser usado sempre que o usuário tiver que informar um
diretório.
run utp/ut-dir.p (input <título>,
output <pasta>,
output <cancelado>).
Onde:
<título>: título para a caixa de diálogo para selecionar diretórios
<pasta>: variável do tipo caracter onde será retornada a pasta selecionada
<cancelado>: uma variável do tipo lógica onde deve ser retornado se a caixa
de diálogo foi cancelada ou não
Exemplo:
Instalação
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 75
Onde:
<título>: título para a caixa de diálogo para selecionar diretórios
<pasta>: variável do tipo caracter onde será retornada a pasta selecionada
<cancelado>: uma variável do tipo lógica onde deve retornado se a caixa de
diálogo foi cancelada ou não
Exemplo:
run utp/ut-dir.p (input "Escolha um diretório,
output pasta,
output cancelado).
BTB917ZX.P
Permitir a execução de sons do tipo MID e WAV.
Como este programa utiliza os recursos de OCX, é preciso que este OCX
esteja registrado e instalado na máquina que deve ser utilizado. Para fazer esta
instalação proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretório \INTERFAC\SOM\;
clicar no botão de 'OK', quando for solicitado;
Objetivo
Formato
clicar no botão ;
clicar em 'Ok' para terminar.
run btb/btb917zx.p (input <som>).
Onde:
<som>: caminho completo do arquivo de som a ser executado
Exemplo:
run btb/btb917zx.p (input "c:\windows\media\start.wav").
BTB917ZY.P
Permitir a visualização dos seguintes tipos de imagens:
Bitmaps (*.bmp; *.dib);
Gif Images (*.gif);
JPEG Images (*.jpg);
Metafiles (*.wmf, *.emf);
Icons (*.ico, *.cur).
Nota As imagens em formato Bitmap (.bmp) devem possuir um correspondente de mesmo
nome no formato GIF (.gif) devido a uma restrição do WebEnabler
Instalação Como este programa utiliza os recursos de OCX, é preciso que este OCX
esteja registrado e instalado na máquina que deve ser utilizado. Para fazer esta
instalação proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretório
\INTERFAC\IMAGEM\;
clicar no botão de 'Ok', quando for solicitado;
clicar no botão: ;
clicar em 'Ok', para terminar.
run btb/btb917zy.p (input <imagem>).
Onde:
Formato
Instalação
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 77
BTB917ZZ.P
Permitir a visualização de vídeos do tipo AVI.
Como este programa utiliza os recursos de OCX, é preciso que este OCX
esteja registrado e instalado na máquina que deve ser utilizado. Para fazer esta
instalação proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretório
\INTERFAC\VIDEO\DISK1;
clicar no botão de 'Ok', quando for solicitado;
clicar no botão: ;
clicar em 'Ok', para terminar.
run btb/btb917zz.p (input <video>)
Observações
Formato
Objetivo
Onde:
<vídeo>: caminho completo do vídeo a ser apresentado
Exemplo:
run btb/btb917zz.p (input "c:\windows\help\explorer.avi").
UT-VRBIN.P
Este utilitário pode ser usado sempre que for necessário saber a versão de um
programa compilado (.R).
run utp/ut-vrbin.p (input <arquivo>,
input <acomp>,
output <versao>).
Onde:
<arquivo>: variável do tipo caracter que irá conter o nome do arquivo
compilado a ser analisado
<acomp>: variável do tipo lógica que irá definir se a pesquisa deve apresentar
a tela de acompanhamento ou não
<versao>: variável do tipo caracter que irá receber a versão do programa
passado como parâmetro
Exemplo:
run utp/ut-vrbin.p (input "c:\tmp\cd0101.r",
input no,
output c-versao).
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 79
UT-FINFO.P
Este utilitário pode ser usado sempre que for necessário saber a data, a hora ou
o tamanho de um arquivo no Windows.
run utp/ut-finfo.p (input <arquivo>,
output <data>,
output <hora>,
output <tamanho>).
Onde:
<arquivo>: variável do tipo caracter que deve conter o nome do arquivo a ser
analisado
<data>: variável do tipo data que deve receber a data do arquivo que está
sendo analisado
<hora>: variável do tipo caracter que deve receber a hora do arquivo que está
sendo analisado
<tamanho>: variável do tipo inteira que deve receber o tamanho do arquivo
que está sendo analisado
run utp/ut-finfo.p (input "c:\autoexec.bat",
output d-data,
output c-hora,
output i-tam).
UT-CMDLN.P
Este utilitário pode ser usado sempre que for necessário saber informações
mais detalhadas sobre a linha de comando usada para abrir a sessão corrente.
Esta função pode ser muito útil quando se deseja obter os valores dos
parâmetros da sessão (ini, inp, basekey, etc ...).
run utp/ut-cmdln.p (output <linha-comando>).
Onde:
<linha-comando>: variável do tipo caracter que irá receber a linha de comando
usada para abrir a sessão corrente
Exemplo:
run utp/ut-cmdln.p (output c-linha-comando).
UT-OSVER.P
Esta técnica pode ser usada sempre que for necessário saber informações mais
detalhadas sobre o Sistema Operacional (somente para Windows).
run utp/ut-osver.p (ouput <plataforma>,
output <versao>,
output <release>,
output <build>,
output <extrainfo>).
Onde:
<plataforma>: variável do tipo caracter que irá receber o tipo plataforma
windows (Windows NT ou Windows 95/98)
<versao>: variável do tipo inteira que irá receber, se houver, a versão do
Windows
<release>: variável do tipo inteira que irá receber, se houver, a "release" do
Windows
<build>: variável do tipo inteira que irá receber, se houver, o "build" do
Windows
<extrainfo>: variável do tipo caracter que irá receber informações extras sobre
o Windows (Versão do Service Pack, etc ...)
run utp/ut-osver.p (output c-plataforma,
output i-versao,
output i-release,
Observações
Exemplo
Formato
Utilização
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 81
output i-build,
output c-extrainfo).
I-COUNTDS.I
Descobrir a quantidade de registros numa tabela de acordo a condição passada.
Quando é necessário determinar a quantidade de registros numa tabela,
evitando que o OWNER seja incluído antes do nome da tabela no
programa compilado, quando o banco de dados é acessado através do
DataServer (veja o item “Como contar a quantidade de registros numa
tabela” no cap. 15).
{include/i-countds.i &BANCO=mgadm
&TABELA=<tabela>
&COND=<condição>
&DEST=<variável> }
Onde:
<variável>: variável que irá armazenar o resultado da consulta.
<condição>: cláusa where que deve ser usada na consulta. Opcional.
<tabela>: tabela que deve ter o número de registros contados.
<banco>: banco de dados onde a tabela se encontra.
DEF VAR iCount AS INT NO-UNDO.
{include/i-countds.i &BANCO=mgadm
&TABELA="cheque-pend"
&COND="WHERE cod-banco > 20"
&DEST=iCount}
message iCount view-as alert-box.
UT-WIN.I
A UT-WIN.I define procedures para acesso a funções externas de API’s do
Windows.
Abaixo segue algumas das procedures definidas na include:
CreateProcess{&A}
GetComputerName{&A}
GetEnvironmentVariable{&A}
GetLastError
GetProfileString{&A}
GetSystemDirectory{&A}
GetWindowsDirectory{&A}
LoadLibrary{&A}
SetEnvironmentVariable{&A}
WinExec
GetCurrentDirectory{&A}
FindExecutable{&A}
ShellExecute{&A}
AdjustWindowRect
ClientToScreen
CreateModal
DeleteMenu
DrawMenuBar
FlashWindow
GetClientRect
GetMenuItemCount
GetParent
GetSystemMenu
GetWindowLong{&A}
GetWindowRect
InvalidateRect
RemoveMenu
SetCursorPos
SetWindowContextHelpId
SetWindowLong{&A}
SetWindowPos
ShowScrollBar
ShowWindow
SystemParametersInfo{&A}
GetUserName{&A}
Exemplo 321
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 83
ASSIGN
chrUserID = FILL(' ',256)
intSize = 255.
MESSAGE TRIM(chrUserID)
VIEW-AS ALERT-BOX.
PROCEDURE RemoveSystemMenuItem:
/*----------------------------------------------------------------------
Purpose: Remove a SystemMenuItem
Parameters: windowHandle – window que terá os itens removidos
itemId - 5 close
3 maximize
2 minimize
----------------------------------------------------------------------*/
IF viWinHWND = 0 THEN
RUN GetParent (windowHandle:HWND, OUTPUT viWinHWND).
IF intResult = 1 THEN
MESSAGE "Environment Variable Has Been Changed" VIEW-AS ALERT-BOX.
ELSE
MESSAGE "Function Failed. Not Sure Why" VIEW-AS ALERT-BOX.
UT-TRACE.P
Exibir em tela toda a lista de programas e procedures internas executadas até o
ponto de execução deste aplicativo. É semelhante ao stack trace do Progress,
Exemplo
Formato
Utilização
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 85
UT-LOCK.I
Retornar se um registro já está locado na base, substituindo a função LOCKED
do PROGRESS que não funciona corretamente em ambiente ORACLE.
Normalmente utiliza-se um FIND EXCLUSIVE-LOCK com a cláusula NO-
WAIT para buscar um registro que pode estar locado. Dessa forma, o
programa não fica parado no EXCLUSIVE-LOCK esperando o registro ser
liberado. Neste caso utilizávamos a função LOCKED pra confirmar se a
indisponibilidade de dados deve-se ao fato do registro desejado já estar locado
em outra sessão, mas conforme dito anteriormente, esta função não funciona
no ambiente ORACLE. Este utilitário verifica o estado de lock do registro
diretamente no banco ORACLE para garantir esta funcionalidade.
Onde:
<banco>: nome lógico do banco de dados que contém a tabela.
<tabela>: nome da tabela na qual está se realizando a busca.
<tipo_busca >: a clausula de busca do registro, podendo ser: First Last, Next,
Prev ou Current.
<where_clause>: Opcional. Clausula where de condição de busca do registro.
Para o correto funcionamento do utilitário, deve ser exatamente o mesmo
where clause do FIND realizado com EXCLUSIVE-LOCK e NO-WAIT.
Deve-se definir um pré-processador para armazenar a cláusula do Where pois
em alguns casos a complexidade da consulta não permite que a mesma seja
transferida através da chamada da include.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 87
UT-ZIP.P
Este utilitário faz o tratamento de arquivos zipados, compactando os arquivos
listados em um arquivo denominado zipFileName.
Uma outra aplicação além da compactação dos arquivos listados é a proteção
dos arquivos com uma senha.
{utp/ut-zip.i}
Exemplo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 89
UT-GENXML.P
Este utilitário facilita a criação e manipulação de arquivos XML.
UT-VALIDA-FACELIFT.P
Este utilitário verifica: versão, patch e fix do progress instalado na máquina,
ele retorna um campo lógico informando se a estação está apta para executar o
produto com facelift.
O utilitário deve ser chamado por outro programa passando um campo lógico
como parâmetro.
IF l-aplica-facelift THEN
MESSAGE "Ambiente apto para alicar facelift !" VIEW-AS ALERT-BOX.
ELSE
MESSAGE "Ambiente não apto para alicar facelift !" VIEW-AS ALERT-BOX.
Observações Se o ambiente estiver apto para ser aplicado o facelift a variável l-aplica-
facelift terá valor “True”, caso contrário terá valor “False”.
Exemplo
Utilização
Objetivo
UT-VERIF-RAW.P
Este utilitário verifica se o campo passado por parâmetro é do tipo RAW ou
não. Caso seja do tipo RAW, o utilitário irá retornar "OK". Caso não, retornará
"NOK". Se o banco, tabela ou campo passados como parâmetros não existirem
o retorno será “?”.
O utilitário deve ser chamado por outro programa passando o banco, tabela e
campo como parâmetro.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 91
BTB962ZZ.P
Permitir a desconexão de um banco de dados específico, gerando logs para
rastreamento (programa e usuário que fizeram a solicitação de desconexão) e
eliminando todos os ALIASES pertinentes.
Para desconectar um determinado banco de dados;
RUN btb/btb962zz.p (input <ldbname>)
Formato Onde:
<ldbname>: nome lógico do banco de dados que deve ser desconectado
Exemplo:
RUN btb/btb962zz.p (input “mguni”)
View-as Radio-Set
CAPÍTULO 7
Tradução
TRADUÇÃO MONO-IDIOMAS
Este modelo é utilizado até as versões EMS 2.04 e HR 2.07. Acima destas
releases deve ser utilizada a técnica multi-idiomas especificada no próximo
item neste documento.
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
Observação Foi incorporada uma chamada para um include i-lgcode.i, cujo objetivo é
determinar qual o idioma da instalação do Datasul-EMS 2.0.
**
*****************************************************/
{include/i-lgcode.i}
&IF "{&LANGUAGE-CODE}" = "POR" &THEN
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ESP" &THEN
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
CERTO:
if cb-tipo:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 2} then ...
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 97
Utilizando utp/ut-liter.i:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <variável>:label in frame {&frame-name} = return-
value.
Sempre que estas variáveis possuam 'help', este deve ter a preparação para
tradução através do include utp/liter.i, conforme o exemplo:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <variavel>:help in frame {&frame-name} = return-
value.
deve existir o tratamento do espaço extra para tradução, que deve ser
reservado sempre à esquerda do label.
{utp/ut-liter ____Total_Geral}
assign de-total-geral:label in frame f-total = return-value.
Cliente Descrição Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99
TRADUÇÃO MULTI-IDIOMAS
Este modelo é utilizado a partir das versões EMS 2.05 e HR 2.08 ou
superiores.
Importante Para que o produto saiba que dialeto trabalhar na sessão corrente, existe na tabela
de usuários um campo chamado cod_dialeto que irá armazenar a informação do dialeto do
usuário, sendo possível com isto em uma mesma instalação do produto vários usuários
acessando com um idioma/dialeto diferente.
Contextos de tradução
Itens de Tradução
tabela cad-literal no banco mguni. Esta chave é utilizada pelo utilitário ut-
field.p, que será abordado ainda neste documento.
Sequência de busca
UT-TRCAMPOS.P
Realizar tradução automática de telas. Este programa tem a função de
pesquisar todos os objetos de uma tela Progress baseado em sua Window,
através da hierarquia existente, e realizar a chamada ao utilitário ut-liter.p para
que sejam feitas as devidas traduções da interface. Este utilitário reconhece
todas as frames que são filhas da window, e traduz todas os objetos presentes
nestas frames automaticamente.
É utilizado nos dois pontos de tradução dentro das templates:
InitializeInterface nas ThinTemplates
Adm-Initialize nos Smart Objects quando existe container definido.
Caso exista uma window que não seja de uma template padrão Datasul, este
utilitário poderá ser chamado antes do view principal da frame do programa
para que a tradução automática passe a ser realizada.
Este programa não espera nenhum parâmetro de entrada, e deve ser chamado
diretamente através do fonte.
Ex: run utp/ut-trcampos.p.
UT-TRFRRP.P
Difere do anterior porque realiza tradução automática de uma única frame,
apenas. Busca os itens de tradução apenas na hierarquia da frame que foi
passada como parâmetro, buscando os objetos passíveis de tradução e
realizando então a chamada ao ut-liter.p e posterior atribuição do valor
traduzido retornado à estes objetos, de forma automática.
Pode ser utilizado para traduzir Dialog-frames, frames de relatório, ou
qualquer outra frame que se julgue necessário.
Utilização
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 105
Deve ser altamente utilizado para evitar alto nível de trabalho quando da
necessidade de tradução de frames de relatórios devido a não existência de
uma window que seja o pai destas frames nestes tipos de programas, não
podendo nestes casos ser utilizado o utilitário anterior (ut-trcampos.p).
Ex: run utp/ut-trfrrp.p (input frame f-parametros:handle).
Obs: Quando o programa for um relatório, existe um filtro no RTB que caso o
programa não possua nenhuma chamada a este utilitário, esta será feita de
forma automática para todas as frames do relatório antes do ponto padrão de
leitura de registros desta template ou da definição do cabeçalho do mesmo, ou
seja, antes da include i-rpout.i ou i-rpcab.i respectivamente, dependendo da
estrutura do programa.
UT-LSTIT.P
Converter uma String não indexada proveniente de um objeto Progress e
retorna seu conteúdo indexado e já traduzido no dialeto do usuário, para que
possa ser utilizado no programa chamador. Tem o objetivo de facilitar a
programação dentro da técnica de tradução Multi-Idiomas minimizando a
necessidade de realizar tal tarefa diretamente no fonte do programa em
questão.
Deverá ser utilizado sempre quando da necessidade de uma conversão de
valores de um objeto Progress não indexado para valores indexados, ou ainda,
converter valor de LIST-ITEMS para LIST-ITEM-PAIRS.
Sua utilização deve ser da seguinte forma:
Sintaxe: run utp/ut-lstit.p (input-output cLista).
Onde cLista deve ser uma lista separada por "," provinda de uma das seguintes
situações:
Include de domínio;
Valor populado de um for each;
List-items de um campo (Este apenas caso ainda não tenha passado pelos
pontos de tradução, ou já tenha passado e necessita ser repopulado devido
a uma lógica de negócio);
Sub-programa;
Utilização
Objetivo
Qualquer fonte que gere uma lista separada por vírgula e que este será
utilizada em algum objeto Progress não-indexado (Combo-Box, Selection-
List).
O programa irá retornar na mesma variável informada os valores já indexados
e traduzidos, conforme exemplo abaixo:
Valor cLista antes: “casado,solteiro”
Valor cLista depois: “married,casado,single,solteiro”
Importante Com a técnica de tradução Multi-Idiomas, tudo o que antes era LIST-ITEMS, é
automaticamente convertido para LIST-ITEM-PAIRS nos pontos de tradução pelos programas já
mencionados, com isso, qualquer referência a LIST-ITEMS destes campos após os pontos de
tradução, deverão ser retrabalhados para tratar a partir de agora, LIST-ITEM-PAIRS, tendo este
utilitário como facilitador para esta implementação. Qualquer dúvida adicional, verificar o item
abaixo que trata sobre LIST-ITEMS.
UT-LITER.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR. Este
sofreu alterações para contemplar as novas funcionalidades do modelo de
tradução Multi-Idiomas, como novo conceito de contextualização, hierarquia
de busca e dialetos das Strings.
Para que não fosse gerado nenhum tipo de impacto sobre todo o legado de
programas com o antigo modelo do ut-liter, seu forma de chamada e
parâmetros não foram alterados, mantendo o padrão já conhecido e definido
neste manual.
Sintaxe: {utp/ut-liter.i <Literal> <Contexto> <Alinhamento>}
Sendo que nesta nova ut-liter, o alinhamento não irá gerar nenhum tipo de
diferença no comportamento da string de retorno, mantida apenas para fins de
compatibilidade. Para evitar problemas com este parâmetro, sempre passá-lo
Utilização
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 107
com valor em branco ("") caso utilizando o programa .p, ou simplesmente não
passar, caso utilizando a include, conforme exemplos abaixo:
Ex: run utp/ut-liter.p (input “Teste”,”*”,””).
{utp/ut-liter Teste *}
UT-MSGS.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR,
utilizado para apresentar as mensagens dos produtos Datasul. Este utilitário
também sofreu alterações para contemplar as novas funcionalidades descritas e
possui a característica da busca por mensagens baseando-se no dialeto e no
contexto cadastrado para a mensagem.
Para manter compatilidade com o legado existente nos produtos, sua sintaxe
foi mantida inalterada, conforme segue abaixo:
Sintaxe: run utp/ut-msgs.p (input <ação>
input <número da mensagem>
input <parâmetros>).
Onde:
<ação> é a ação que será tomada pelo programa, podendo ser "show" para
mostrar, "msg" para retornar a mensagem, e "help" para retornar o help da
mensagem.
<número da mensagem> é o número da mensagem
<parâmetros> São os parâmetros a serem substituídos na mensagem
Utilização
Objetivo
UT-FIELD.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores das propriedades dos campos do dicionário de
dados, como label, description, etc. O que difere esta versão do modelo de
tradução Multi-Idiomas para a versão anterior é que a busca não é mais
realizada sobre o próprio dicionário, e sim diretamente na tabela de strings
externas do produto, baseando-se na chave banco.tabela.campo.propriedade,
conforme mencionado em itens de tradução neste documento.
Foi mantido basicamente para não gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substituído pelo ut-liter,
devido sua maior facilidade de identificação e customização futura pelo
usuário.
Sua sintaxe não foi alteradada, sendo ainda:
{utp/ut-field.i banco tabela campo propriedade}
Este exemplo irá retornar o label do campo tipo da tabela conta do banco
mgadm no dialeto do usuário.
Nota Onde Existe a frase “Continua buscando do banco”, significa que o comportamento do
utilitário não foi alterado, mantendo a mesma funcionalidade da implementação anterior.
Utilização
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 109
UT-TABLE.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores de propridades das tabelas do dicionário de
dados, como desc, label, etc. O que difere esta versão do modelo de tradução
Multi-Idiomas para a versão anterior é que a busca não é mais realizada sobre
o próprio dicionário, e sim diretamente na tabela de strings externas do
produto, baseando-se na chave banco.tabela.propriedade, conforme citado em
itens de tradução neste documento.
Foi mantido basicamente para não gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substituído pelo ut-liter,
devido sua maior facilidade de identificação e customização futura pelo
usuário.
Sua sintaxe não foi alteradada, sendo ainda:
{utp/ut-table.i <banco> <tabela> <propriedade>}
onde propriedade é:
Propriedade Descrição Observação
1 File-Label
2 Dump_name Continua
buscando do
banco
3 Desc
Este exemplo irá retornar o label da tabela conta do banco mgadm no dialeto
do usuário.
Nota Quando comentado "Continua buscando do banco", isto quer dizer que o programa não
está buscando o valor das strings externas, e sim continua buscando do schema do banco atual
que está conectado a sessão, como a versão anterior já realizava.
UT-LTMNU.P
Novo utilitário criado para a tradução de todos os itens de menu (Itens de
tradução de 1 a 7). Este utilitário realiza a busca na tabela de strings externas,
Utilização
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 111
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 113
**
*****************************************************/
&glob val1 Devedora
&glob val2 Credora
{include/ind01-10.i} {1} {2}}
/* fim */
View-as Combo-box
"1":U.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 115
CERTO:
if cb-tipo:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 2} then ...
deve existir o tratamento do espaço extra para tradução, que deve ser
reservado sempre à esquerda do label.
{utp/ut-liter.i Total_Geral}
assign de-total-geral:label in frame f-total = return-value.
Cliente Descrição Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99
Neste item estarão sendo abordados alguns casos práticos que podem ser
encontrados durante a execução de uma implementação/alteração de
programas para a portabilidade do produto para a nova técnica de tradução.
Abaixo segue demonstração de alguns casos práticos onde será possível
identificar algumas das principais diferenças na forma de programar para a
técnica de tradução Multi-Idiomas em relação ao modelo anterior.
Depois:
&if "{&FNC_MULTI_IDIOMA}" = "Yes" &then
assign cLista = {varinc/var00002.i 04 02}.
run utp/ut-lstit.p (input-output cLista).
assign cb-combo:list-item-pairs = cLista.
&else
assign cb-combo:list-items = {varinc/var00002.i 04 02}
&endif
Para este caso, deve ser chamado diretamente o utilitário que realiza a tradução
através dos handles dos objetos presentes na relatório frame em questão. Para
isto, deverá realizar sua chamada ou imediatamente após a definição da frame
ou antes da realização do display da frame. Segue abaixo um exemplo de sua
aplicação:
form
skip(2)
c-lit-selecao no-label colon 55
skip(1)
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 121
Importante Sempre passar valores fixos e de variáveis substituindo-se o " " (Branco) por "_"
(underline).
Implementação
Objetivo
Esta é a situação na qual ocorre o erro 135 quando a lista de valores é enorme
e ultrapassa o limite de caracteres para uma atribuição. Para evitar isso foi
desenvolvida esta técnica que modifica a forma de chamada das includes
varinc, além de mudar a estrutura das includes responsáveis pelo retorno.
Todas as includes da nomenclatura varinc/var99999.i são utilizadas para
definição da lista de valores e utilizam outra include para realizar o tratamento
do tipo de retorno escolhido pelo usuário, que pode ser um list-items de
COMBO-BOX, valores para RADIO-BUTTON, um único elemento da lista,
entre outros. O retorno dos valores é montado através de pré-processadores e o
valor destes são retornados todos de uma única vez para uma variável no
programa que incorpora a include. Sendo assim é necessário alterar a include
de retorno para gravar na variável desejada os valores um por vez. Para tal, é
necessário gravar os valores dos pré-processadores da lista em uma temp-table
e realizar um FOR EACH nesta temp-table para gravar os valores um por vez,
a cada iteração do FOR EACH ou fazer um FIND diretamente no item
desejado.
As alterações desta técnica exigem um grande trabalho para adequar a include
de retorno na proposta das temp-table, porque é necessário popular a tabela
com os valores, sendo necessário incluí-los um a um. Em compensação, o
trabalho de manipulação dos valores para retorno diminui, porque ao invés de
ficar concatenando uma lista enorme de pré-processadores basta apenas fazer
FOR EACH ou FIND na temp-table conforme a opção de retorno desejada.
As includes de retorno trabalham com 7 tipos de retorno atualmente:
1. View-as combo-box
2. View-as radio-set
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 123
Para cada um desses tipos de retorno, é necessário ler a temp-table que contém
os valores da lista. Esta temp-table deve ser definida dessa forma:
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val1}"
tt-list-items.posicao = 1.
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val2}"
tt-list-items.posicao = 2.
.
.
.
.
.
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val250}"
tt-list-items.posicao = 250.
END.
END.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 127
CAPÍTULO 8
Construção de Programas utilizando os
Estilos e suas Técnicas
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 129
Lista de Links:
Source Link Type target
h_p-cadsim STATE h_p-exihel
h_p-cadsim TABLEIO h_viewer
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_p-exihel STATE h_query
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 133
verificar se já existe uma SmartQuery para a tabela pai. Caso não exista,
criar uma nova utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na página 0 da SmartWindow e aceitar as
sugestões de SmartLink do Wizard;
verificar se já existe um programa de "Vá para" e um programa de
pesquisa para a tabela pai. Caso não existam, eles devem ser criados;
acessar os atributos de instância da SmartQuery e informar no atributo
"Programa Pesquisa" o nome do programa de pesquisa da tabela pai e no
atributo "Programa VáPara" o nome do programa de Vá Para da tabela pai;
criar um SmartLink do tipo STATE, tendo como Source: p-navega e como
Target: SmartQuery;
criar um SmartLink do tipo STATE, tendo como Source: p-exihel e como
Target: SmartQuery;
verificar se já existe uma SmartViewer com os atributos da tabela pai que
devem estar expostos na página 0 da SmartWindow, ou seja, acima do
folder. Caso não exista, criar uma nova SmartViewer utilizando o estilo
CustomViewer com Auto-Field;
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 141
{include/okfil.i h_v06pd001}
na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e após o run dispatch deve ser inserida a seguinte lógica:
find <tabela pai> where rowid (<tabela pai>) = v-row-
parent no-lock no-error.
if available <tabela pai> then do:
assign <tabela filho>.<chave pai> = <tabela pai>.<chave
pai>.
end.
Onde:
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
está utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substituído pelo nome da tabela que deve estar sendo
utilizada no cadastro.
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
/* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'create-record':U ).
/* Code placed here will execute AFTER standard behavior. */
find order where rowid (order) = v-row-parent no-lock no-error.
if available order then
assign order-line.order-num = order.order-num.
Onde:
<nome buffer>: deve ser substituído pelo nome que se deseja dar ao buffer da
tabela pai.
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
está utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substituído pelo nome da tabela que está sendo
utilizada no cadastro.
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
/* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'add-record':U ).
/* Code placed here will execute AFTER standard behavior. */
def buffer b-customer for customer.
find b-customer where rowid(b-customer) = v-row-parent no-lock
no-error.
if avail b-customer then
assign order.cust-num:screen-value in frame {&frame-name} =
string(b-customer.cust-num).
else
assign order.cust-num:screen-value in frame {&frame-name} =
"".
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 143
Onde:
<nome buffer>: deve ser substituído pelo nome que se deseja dar ao buffer da
tabela filho.
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
está utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substituído pelo nome da tabela que está sendo
utilizada no cadastro.
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
/* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'add-record':U ).
/* Code placed here will execute AFTER standard behavior. */
verificar se já existe uma SmartQuery para a tabela pai. Caso não exista,
criar uma nova utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na página 0 da SmartWindow e aceitar as
sugestões de SmartLink do Wizard;
verificar se já existe um programa de Cadastro Inclui/Modifica Pai para
manutenção da tabela Pai, caso não exista, deve ser criado, para isso
utilizar o template Cadastro Inclui/Modifica Pai;
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 145
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 151
{include/okfil.i h_v06pd001}
na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e após o run dispatch deve ser inserida a seguinte lógica:
find <tabela pai> where rowid (<tabela pai>) = v-row-parent
no-lock no-error.
if available <tabela pai> then do:
assign <tabela filho>.<chave pai> = <tabela pai>.<chave
pai>.
end.
Onde:
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
esta utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa
<tabela filho>: deve ser substituído pelo nome da tabela que deve estar sendo
utilizada no cadastro
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro
/* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method.
RUN dispatch IN THIS-PROCEDURE ( INPUT 'create-record':U ).
/* Code placed here will execute AFTER standard behavior. */
find order where rowid (order) = v-row-parent no-error.
if available order then
assign order-line.order-num = order.order-num.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 155
{include/okpai.i h_v07pd002}
a query deve conter a tabela dos registros filhos que irão ser exibidos no
Cadastro PaiXFilho. Exemplo de query do browser:
Implementação
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 157
Onde:
<Tabela>.<Campo>: é o campo da tabela ao qual deseja-se estabelecer limites,
e, fi-ini-campo e fi-fin-campo são os fill-ins que o usuário irá entrar com a
faixa de valores
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 161
Exemplo:
assign input frame {&frame-name} c-inicial c-final.
Para:
assign input frame {&frame-name} fi-ini-cust-num fi-fin-cust-
num.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 163
Source
' Link Type Target
h_folder PAGE THIS-PROCEDURE
h_p-navega NAVIGATION h_query
h_query RECORD h_viewer1
h_query RECORD h_viewer2
h_query RECORD h_viewer3
h_query RECORD h_viewer4
h_viewer-1 GROUP-ASSIGN h_viewer-2
h_viewer-1 GROUP-ASSIGN h_viewer-3
h_viewer-1 GROUP-ASSIGN h_viewer-4
h_p-exihel STATE h_query
h_p-navega STATE h_query
Implementação
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 167
Botão to Top;
neste estilo, todo trabalho de tradução de labels, helps, screen-values é
feito automaticamente por um include padrão do estilo. Exceções: list-
items do widget combo-box.
Preparação do Relatório - Interface
1. Verificar quais as páginas que devem ser necessárias ao programa, se as
cinco páginas forem necessárias desconsiderar as tarefas 2, 3, 4 e 5.
2. Eliminar as frames das páginas desnecessárias com base na tabela acima.
3. Eliminar n imagens com as "orelhas" mais a direita, onde n é o número de
páginas desnecessárias, renomeando as remanescentes conforme a tabela
acima.
4. Em 'Definitions' limpar o conteúdo dos preprocessadores das páginas
desnecessárias, assim se está informando ao estilo que estas páginas não
existem no relatório. Exemplo, onde a página de digitação não é
necessária:
&GLOBAL-DEFINE PGSEL f-pg-sel
&GLOBAL-DEFINE PGCLA f-pg-cla
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGDIG
&GLOBAL-DEFINE PGIMP f-pg-imp
Observação Não deve ser alterado o tamanho da frame de relatório, pois há possibilidade de
gerar erros na interface quando os programas são executados com Facelift.
Página de Seleção
1. Colocar os fill-in´s de inicial e final, para cada campo que precisa de faixa.
A sugestão é criar como 'Database Fields' e após convertê-los para
variáveis para obter automaticamente os labels, formatos e tamanhos do
dicionário de dados.
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
2. Caso seja necessário implementar retângulos com label, estes labels devem
ser fill-in´s view-as text, e o seu valor deve ser informado no seu initial e
private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 173
Página de Digitação
1. Em 'Definitions', corrigir a definição da temp-table de digitação tt-digita
inserindo os campos necessários;
2. Em 'Section Editor', para o objeto browse br-digita adaptar os seguintes
gatilhos para a nova definição da temp-table tt-digita e outras
necessidades:
'Display': define os campos da temp-table a serem apresentados e quais
devem ficar habilitados;
'Row-entry': determina valores iniciais para os campos da temp-table na
inclusão de novas linhas, exceto quando se trata da primeira linha do
browse;
'Row-leave': salva as alterações feitas pelo usuário.
3. Ainda em 'Section Editor', mas para os botões bt-inserir e bt-alterar,
adaptar os seus gatilhos de 'Choose', na linha que aplica um evento 'Entry',
sobre o primeiro campo habilitado no browse;
4. Todas as validações do browse br-digita devem ser feitas na procedure pi-
executar no local indicado pelo comentário;
5. Opcionalmente, os gatilhos de 'leave' (para atributos de referência), 'f5' e
'mouse-select-dblclick' (para acionamento do zoom), para as colunas do
browse podem ser necessários. Neste caso, tais gatilhos devem ser
codificados "à mão", no início do 'Main Block' do programa. Exemplo:
ON F5, MOUSE-SELECT-DBLCLICK OF tt-digita.<campo> in
browse br-digita do:
{include/zoomvar.i ...}
END.
Observação Para mais detalhes sobre esta técnica, ver capítulo Como implementar Zoom e
campos de referência para campos de chave estrangeira.
Página de Impressão
Na página de impressão não é necessário que se tenha qualquer função
adicional para o seu correto funcionamento. Porém, se necessário, seguir a
técnica Como implementar Parâmetros de Impressão em Relatórios.
Gravação e validação dos parâmetros
Exemplo
para column 2,00 e row 4,46, e rs-execucao para column 2,86 e row
4,83.
Também é possível passar durante a inicialização do programa um arquivo de
modelo padrão para o relatório, neste caso o usuário não será obrigado a
informar um modelo manualmente. Para isto basta incluir no Main Block do
programa, antes da chamada a procedure “enable_UI”, a linha abaixo:
ASSIGN c-modelo-default = SEARCH("<pasta>\<modelo.rtf>").
onde:
<pasta> = sub-pasta aonde se encontra o arquivo de modelo no propath
<modelo.rtf> = arquivo que contém o modelo no formato rtf
Principais Tags:
4. Nas seleções, ao invés de utilizar a palavra "à", para dar idéia de faixa,
substituí-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na
tela de seleção, e que não necessitam ser traduzidos.
5. Todos os labels que não forem do dicionário de dados e que apareçam no
relatório devem ser tratados através dos includes {utp/ut-liter.i}, {utp/ut-
field.i} ou ainda {utp/ut-table.i}.
6. Em todos os forms/frames de impressão deve-se colocar a cláusula stream-
io.
7. Para utilizar a funcionalidade de impressão para arquivo RTF:
7.1. definir o préprocessador conforme abaixo:
&GLOBAL-DEFINE RTF YES
7.2. definir o préprocessador abaixo setando o tamanho da página:
&SCOPED-DEFINE pagesize N
N é o número de linhas por página e por default seu valor é 42.
Este número deve ser ajustado para cada relatório conforme o tamanho
do modelo RTF que vai ser utilizado. Caso este tamanho não esteja
correto ocorrerá problema na quebra da página.
7.3. a definição da temp-table tt-param deve ser idêntica a definição da
mesma no programa de interface.
7.4. condicionar o VIEW das frames de cabeçalho/rodapé no início do
programa, para que quando o destino for para RTF as mesmas não
sejam apresentadas. Segue exemplo abaixo:
IF tt-param.l-habilitaRTF <> YES THEN DO:
VIEW STREAM str-rp FRAME f-cabec.
VIEW STREAM str-rp FRAME f-rodape.
END.
Observação Para geração de relatórios em formato PDF é necessário que o view das frames
de cabeçalho e rodapé esteja definido corretamente. Sem esta definição não será possível gerar
relatórios em formato PDF.
/* recebimento de parâmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita.
CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.
/* definição de variáveis */
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.
/* corpo do relatório */
IF tt-param.classifica = 1 THEN DO:
FOR EACH order WHERE
order.sales-rep = tt-param.sales-rep AND
order.cust-num >= tt-param.ini-cust-num AND
order.cust-num <= tt-param.fim-cust-num
NO-LOCK
ON STOP UNDO, LEAVE:
RUN pi-acompanhar IN h-acomp (INPUT STRING(order.order-
num)).
DISPLAY STREAM str-rp
Order.Cust-Num
Order.Order-num
Order.Order-Date
Order.Promise-Date
Order.Sales-Rep
Order.Ship-Date
Order.Carrier WITH FRAME f-order.
DOWN STREAM str-rp WITH FRAME f-order.
END.
END.
ELSE DO:
FOR EACH order WHERE
order.sales-rep = tt-param.sales-rep AND
order.cust-num >= tt-param.ini-cust-num AND
order.cust-num <= tt-param.fim-cust-num
NO-LOCK
BY order.cust-num
ON STOP UNDO, LEAVE:
RUN pi-acompanhar IN h-acomp (INPUT STRING(order.order-
num)).
DISPLAY STREAM str-rp
Cadastro de
Parâme
tros e
Digitaç
ões
(JE010
1)
Order.Cust-Num
Order.Order-num
Order.Order-Date
Order.Promise-Date
Order.Sales-Rep
Order.Ship-Date
Order.Carrier WITH FRAME f-customer.
DOWN STREAM str-rp WITH FRAME f-customer.
END.
END.
RUN pi-finalizar IN h-acomp.
/*fechamento do output do relatório*/
{include/i-rpclo.i &STREAM="stream str-rp"}
RETURN "OK":U.
Parâmetros
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 185
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 187
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 189
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
Lista de Links:
Source
' Link Type Target
h_browse-formação STATE THIS-PROCEDURE
h_p-exihel STATE h_query
Implementação
Seqüência
1. Criar browse origem:
definir query;
definir campos para display.
2. Colocar campos da tabela pai.
3. Criar browse destino:
criar uma temp-table (na seção definitions):
colocar nesta temp-table os atributos da tabela destino.
definir query (relacionando esta com a tabela pai) para a temp-table,
portanto esta deve ser uma freeform query;
definir campos para display.
4. Preencher pré-processor da seção de definições com o nome da tabela pai;
5. Acrescentar dentro da procedure local-initialize lógica para carregar a
temp-table com os registros que já existem na tabela de destino.
Implementação
Botão To Top;
também, neste estilo, todo trabalho de tradução de labels, helps, screen-
values deve ser feito automaticamente por um include padrão do estilo.
Exceções: list-items do widget combo-box;
durante a importação, existem duas streams abertas, uma para importação
dos dados e outra para impressão do log;
o log de importação pode ser completo, na opção. 'Todos' ou imprimir
somente os registros que apresentaram erro, através da opção 'Rejeitados'.
Preparação do programa
1. Verificar quantas páginas são necessárias, as páginas de layout, parâmetros
e log são obrigatórias, somente a página de seleção é opcional, caso haja
seleção desconsiderar as tarefas 2, 3 e 4.
2. Eliminar a frame f-pg-sel.
3. Eliminar a imagens im-pg-log e renomear as imagens:
im-pg-par > im-pg-log
im-pg-sel > im-pg-par
4. Em 'Definitions' limpar o conteúdo dos preprocessadores PGSEL
&GLOBAL-DEFINE PGLAY f-pg-lay
&GLOBAL-DEFINE PGSEL
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGLOG f-pg-log
Página de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parâmetros, informar neste o nome do
programa no formato XX9999 e a versão do layout no formato 999 (o
valor inicial da versão é 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versãolayout=001 }
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 199
DO:
{include/i-imarq.i c-arquivo-entrada f-pg-par "'*.XLS' '*.xls' , 'todos' '*.*'" }
END.
Página de Log
Não existem tarefas.
Gravação e validação dos parâmetros
1. Em 'Definitions', implementar os campos de parâmetros e seleção na
definição da temp-table tt-param.
2. Na procedure 'pi-executar', colocar as das páginas de parâmetros e seleção,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
posicionar na página com problemas, colocando o focus no campo com
problemas.
if input frame f-pg-par i-nr-nivel > 19 then do:
run utp/ut-msgs.p (input "show",
input 73,
input " ").
apply 'mouse-select-click' to im-pg-par in frame f-relat.
apply 'entry' to i-nr-nivel in frame f-pg-par.
return error.
end.
Exemplo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 201
Botão To Top;
também, neste estilo, todo trabalho de tradução de labels, helps, screen-
values deve ser feito automaticamente por um include padrão do estilo.
Exceções: list-items do widget combo-box;
durante a exportação, existem duas streams abertas, uma para exportação
dos dados e outra para impressão do log;
Preparação do programa
1. Verificar quantas páginas são necessárias, as páginas de layout, parâmetros
e log são obrigatórias, somente a página de seleção é opcional, caso haja
seleção desconsiderar as tarefas 2, 3 e 4.
2. Eliminar a frame f-pg-sel.
3. Eliminar a imagens im-pg-log e renomear as imagens:
im-pg-par > im-pg-log
im-pg-sel > im-pg-par
4. Em 'Definitions' limpar o conteúdo dos preprocessadores PGSEL
&GLOBAL-DEFINE PGLAY f-pg-lay
&GLOBAL-DEFINE PGSEL
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGLOG f-pg-log
Página de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parâmetros, informar neste o nome do
programa no formato XX9999 e a versão do layout no formato 999 (o
valor inicial da versão é 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versãolayout=001 }
Página de Seleção
1. Colocar os fill-in´s de inicial e final, para cada campo que precisar de
faixa. A sugestão é criá-los como 'Database Fields' e após convertê-los
para variáveis para obter automaticamente os labels, formatos e tamanhos
do dicionário de dados.
2. Corrigir os 'initial values' das variáveis de inicial e final.
3. Retirar possíveis queries que o UIB automaticamente queira associar a
frame.
Página de Parâmetros
1. Colocar as variáveis necessárias na representação desejada (radio-set,
toggle-box, fill-in), definindo label, formato, initial e help para as mesmas.
Exemplo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 205
2. Caso seja necessário implementar retângulos com label, estes labels devem
ser fill-in´s view-as text, e o seu valor deve ser informado no seu initial e
private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
3. Mudar o private-data e o initial do label "Arquivo de Entrada" do
retângulo para "Arquivo de Saída".
4. No on choose do bt-arquivo-entrada, pode ser adicionado um terceiro
parâmetro na include i-imarq.i , onde é possível passar como parâmetro os
filtros que serão utilizados na sistem dialog, se não for passado nada neste
parâmetro a include assumira como padrão o tipo de arquivo *.lst e todos
os tipos de arquivos.
DO:
{include/i-imarq.i c-arquivo-entrada f-pg-par "'*.XLS' '*.xls' , 'todos' '*.*'" }
END.
Página de Log
1. Remover o retângulo, o label e o radio-set com as opções "Todos" e
"Rejeitados".
2. Mover todos os outros objetos desta frame para cima. Não esquecer do
botão "Configurar Impressora".
Gravação e validação dos parâmetros
1. Em 'Definitions', implementar os campos de parâmetros e seleção na
definição da temp-table tt-param.
2. Eliminar o campo todos da temp-table tt-param.
3. Na procedure 'pi-executar', colocar as validações das páginas de
parâmetros e seleção, lembrando que elas devem apresentar uma
mensagem de erro cadastrada, posicionar na página com problemas,
colocando o focus no campo com problemas.
if input frame f-pg-par i-nr-nivel > 19 then do:
run utp/ut-msgs.p (input "show",
input 73,
input " ").
apply 'mouse-select-click' to im-pg-par in frame f-relat.
apply 'entry' to i-nr-nivel in frame f-pg-par.
return error.
end.
por:
run utp/ut-vlarq.p (input frame f-pg-par c-arquivo-entrada).
if return-value = "nok" then do:
run utp/ut-msgs.p (input "show",
input 73,
input "").
apply 'mouse-select-click' to im-pg-log in frame f-import.
apply 'entry' to c-arquivo-destino in frame f-pg-log.
return error.
end.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 207
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 209
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 211
'
Dialog VaPara Masters/d-vapara.w
em New, selecionar o template acima;
escolher a tabela que o programa deverá consultar;
Sugestão Para que os campos sejam exibidos no tamanho adequado (altura 0.88) você deve
alterar as seguintes propriedades:
Implementação
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 213
para os atributos que não formam a chave de acesso da tabela, caso forem
postos na tela:
colocar o primeiro atributo na linha de rt-mold + 0.17 (Exemplo:
2.67);
colocar os demais atributos com um espaçamento de 1 (Exemplo:
3.67, 4.67);
alterar a altura do retângulo rt-mold de modo a apenas caber os
atributos dentro;
colocar na SmartViewer outros objetos, como por exemplo combo-box,
que não estão associados aos campos no banco de dados;
para os objetos não associados ao banco de dados e que devem ser
atualizados pelo usuário, acessar as 'Property' e:
tornar o objeto desabilitado (em propriedades, desmarcar o toggle-box
'Enable');
em propriedades e Advanced, marcar o toggle-box '{&ADM-
MODIFY-FIELDS}';
customizar a procedure LOCAL-INITIALIZE para que as
inicializações dos objetos sejam feitas. Essas inicializações das
variáveis podem ser, atribuição de labels (para tradução automática),
atribuição de itens para combo-boxes e radio-sets, etc., e devem ser
feitas antes do dispatch padrão;
/* Code placed here will execute PRIOR to standard behavior. */
{utp/ut-liter.i Preço * R}
assign fill-in_Price:label in frame {&frame-name} = return-
value
cb-country:list-items in frame {&frame-name} =
{pdinc/i01pd001.i 03}.
/* Dispatch standard ADM method.
RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ).
/* Code placed here will execute AFTER standard behavior. */
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 217
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 219
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 221
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 223
{utp/ut-liter.i Preço * R}
assign Order-line.Price:label in frame {&frame-name} =
return-value.
{utp/ut-liter.i País * L}
assign cb-country:label in frame {*frame-name} = return-value
{pdinc/i01pd001.i 03}.
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ).
/* Code placed here will execute AFTER standard behavior. */
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
CAPÍTULO 9
Validações
Validações de Tela
As validações têm o objetivo de conferir as entradas de dados fornecidas pelo
usuário a um programa, de modo que estejam condizentes com o que o
programa pede e que não sejam passadas informações errôneas de modo a
prejudicar o andamento correto das operações.
Validações na Navegação de Registro
Em certos casos é necessário validar um registro assim que é acessado através
da navegação na tabela. Este caso aplica-se para executar uma função qualquer
como apresentar uma mensagem informativa ao usuário referindo-se àquele
registro ou desabilitar o botão de alteração ou cópia.
Para que o botão de Modificação seja habilitado deve ser seguida a técnica
Como habilitar ou desabilitar Botões em Painéis.
Deve-se ter cuidado com esse tipo de validação, pois cada vez que o usuário
navegar na tabela, a validação será feita podendo prejudicar a performance do
programa.
Validações Antes da Alteração
Da mesma forma que nas Validações na Navegação de Registro (item X.2).
existem casos em que é necessário validar um registro para permitir ou não a
sua alteração, porém em alguns desses casos a validação pode ser complexa e
demorada, consequentemente prejudicial a performance do programa.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 229
Onde:
<tabela>: a tabela que está sendo utilizada na manutenção
<condição>: uma condição qualquer que indica que o registro não pode ser
alterado
<mensagem>: uma mensagem a ser apresentada ao usuário informando
impossibilidade da alteração para o registro.
Observação Essa técnica deve ser evitada, pois o usuário verá o botão de alteração habilitado
e ao tentar alterar o registro a mensagem irá interrompê-lo, contradizendo a função do botão.
Browse de Digitação
Os valores do browse de digitação devem ser validados no momento que o usuário sai do
registro, no evento Row-Leave do browse.
Para que isso não ocorra, as validações de dicionário devem ser replicadas nos
programas, nos locais indicados conforme o Template utilizado, fazendo com
que seja possível o tratamento dos problemas que possam ocorrer no
andamento das validações.
Observações
Importante
233
CAPÍTULO 10
Mensagens
&1 já informado !
Observações: utiliza-se palavra 'existente', pois ela não possui
gênero;
as palavras derivadas do termo 'cadastro' como
cadastrado, cadastrada e cadastramento devem ser
evitadas;
a palavra 'registro', também, deve ser evitada, pois
trata-se de um termo computacional estranho ao
usuário, devendo ser substituída por 'ocorrência';
não é necessário apresentar o conteúdo da chave da
tabela, pois este está na tela.
antes de criar uma nova mensagem verificar se não há outra similar que
possa ser utilizada. Exemplo:
Eliminação Inválida !
Eliminação inválida!
Para auxiliar esta operação, o Sistema de Mensagens possui o botão Pesquisa,
onde você pode buscar por Código ou pelo Texto da Mensagem. Além disso,
ainda possui a opção de Filtro onde você informa palavras que deseja procurar
dentro do sistema.
não abreviar palavras sem necessidade (somente por questões de espaço).
Exemplo:
Cond. Pagto.
Estabelec
Dt Ent Prev
Cod Dest Merc
Encer calc não efetuado.
não utilizar palavras ou jargões técnicos. Exemplos:
Título já existe no browse
Script do Automanager não encontrado.
utilizar o help da mensagem somente se necessário, se houver algo a
acrescentar. Não utilizá-lo, somente para repetir a mesma mensagem.
Exemplo:
Agência não cadastrada. Help Agência não cadastrada!
Item para debito direto - Help Item para debito direto.
procurar ser formal. Não utilizar gírias. Exemplo:
Linha Possui Ordens Valorizadas ! Não pode alterar !
Não utilizar o tratamento VOCÊ.
utilizar somente o idioma português (com exceção de palavras técnicas
específicas). Exemplo:
Parámetros
El código de grupo informado não existe !
não utilizar sinais ortográficos ou espaços em branco ao início das
mensagens. Exemplo:
** Pendencias de Credito do Cliente
não criar mensagens sem sentido. Exemplos:
a
nd
fghfhdfh - fhdfjhdfghdf
Vários
Representante
teteretert
fadfads
a mensagem deve ser o mais clara e sucinta possível. Qualquer
necessidade de detalhamento, utilizar o help;
não criar mensagem somente com letras maiúsculas.
Padrões para tradução de mensagens para Inglês e Espanhol
utilizar os mesmos padrões para criação de mensagens novas;
no caso de dúvidas, consultar Glossário ou demais membros da equipe de
tradução.
Nomenclatura
239
CAPÍTULO 11
Programas Reutilizáveis
Procedures Internas
Procedures Internas reutilizáveis são definidas em includes que devem ser
incorporados aos programas. Se forem incorporadas a programas .w, não
devem fazer acesso muito grande a dados pois se isto acontecer devem ser
transformadas em API(s). As procedures tratadas neste tópico diferem de
outras ou mesmo de outros includes pelo fato de serem documentadas
(posteriormente) em Manual Técnico do Módulo, e disponibilizadas para
clientes e parceiros da DATASUL.
Exemplo :
Cálculo do valor presente de uma cotação de preços;
Conversão de valores entre moedas;
Rotinas de Extenso.
A nomenclatura dos includes que contém este tipo de procedure interna deve
ser a seguinte:
XXINC999.i, onde:
XX - Sigla do Módulo
INC - Fixo
999 - Seqüencial.
241
CAPÍTULO 12
Ferramentas
Application Compiler
O Application Compiler é uma ferramenta Progress utilizada para compilar
arquivos.
Para iniciar o Application Compiler, deve-se estar com qualquer uma das
ferramentas Progress abertas (Data Dictionary, Procedure Editor, UIB ... ),
pressionar o menu Tools e em seguida o item Application Compiler. Sendo
então, exibida a janela a seguir, na qual se deve informar os arquivos que se
deseja compilar e as opções de compilação.
242
Roundtable
O Roundtable é uma ferramenta que facilita o controle de versão de
programas, objetos e includes.
Para a utilização do Roundtable, deve-se seguir os passos descritos abaixo:
1. Selecionar a Workspace;
Observação: Caso essa opção não esteja habilitada certifique-se que a task esteja selecionada
ou se o objeto já está em uso por outra pessoa.
Para verificar se o objeto já está em uso Ir em Folder - Spec (que está na tela
principal do Roundtable) - na última label Event, que deve estar escrito 'Work
in process'.
249
CAPÍTULO 13
API´s
250
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 251
A API deve ter um controle interno para a versão corrente de integração. Esta
versão é fixa no programa API, sendo controlada pelo programador (deve ser
obrigatoriamente um número seqüencial). Esta versão deve ser incrementada,
sempre que ocorrer alguma alteração no layout das temp-table´s, ou na forma
de passar e receber os parâmetros.
Utilizar um campo com nome cod-versao-integracao.
O programa chamador deve obrigatoriamente passar esta versão como
parâmetro de entrada (sempre o primeiro campo da temp-table) e a API faz a
consistência, verificando se a versão em que está o programa chamador é
compatível com a versão de integração da API. Cabe ao responsável do
programa chamador, adequar seu programa às exigências impostas pela API.
No caso, da versão de integração estiver incompatível, deve ser utilizada a
mensagem de erro número 3941.
Importante lembrar que, esta versão de integração da API é diferente da
versão do programa da API, uma vez que, pode alterar o programa e gerar uma
nova versão, sem que seja necessário alterar a versão de integração da API.
Sempre que a API encontrar algum problema, com os dados recebidos por ela,
a mesma deve retornar no próprio registro da temp-table de entrada com
problemas, ou através de uma temp-table de erros de dois campos com as
seguintes informações:
Campo Descrição
cod-erro Número da mensagem de erro
desc-erro Descrição da mensagem de erro
A mensagem deve estar obrigatoriamente cadastrada no cadastro de
mensagens, e a descrição é o texto da mensagem.
** Item parcialmente definido **
A documentação da API, deve ser feita pelo módulo responsável, devendo
estar sempre atualizada. Esta documentação está contida no manual técnico do
módulo.
Deve ser utilizado módulo de documentação do Datasul-EMS, para gerar o
help da documentação da API. Existe um manual para cada módulo contendo
todas as suas API´s.
A documentação da API, deve conter as seguintes informações:
nome físico do programa;
Exemplo
versão de integração;
objetivo;
parâmetros de entrada e saída (o que significam os campos na(s)
tabelas temporária(s));
nome do include que contém a definição das temp-tables de
integração;
execução (validações e ações);
considerações gerais.
No manual técnico do módulo deve conter uma relação com todas as API´S do
módulo; nome físico da API, objetivo e nome do arquivo help. Se o usuário
precisar utilizar a API, este deve buscar via BBS o help corrente da API.
Nome Físico: mmp/mpapi001.p
Versão de Integração: 1
Objetivo: verificar se deve replicar transação nas máquinas remotas e por
buscar código da máquina local.
Parâmetros de Entrada: Para executar a API é necessário utilizar o include
{mpp/mpapi001.i} que contém a definição dos parâmetros de entrada do
programa.
/**************************************************************
** Include: MPAPI001.i
** Definição das temp-tables utilizadas para verificar
** replicação das mensagens para uma planta remota - Multiplanta
**
***************************************************************
def temp-table tt-replic-msg
field cod-versao-integracao as integer format "999"
field cod-transacao as char format "x(8)"
field log-replica-msg as logical
field cod-erro as integer format "99999"
field desc-erro as char format "x(60)"
field cd-maquina-local as integer format "999".
Campo Descrição
cod-versao-integracao Número da versão de integração
cod-transacao
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 253
log-replica-msg
cod-erro
desc-erro
cd-maquina-local
Código da API
/*************************************************************
** Programa : MPAPI001.P
** API responsável por verificar se deve replicar transação nas
** máquinas remotas e por buscar código da máquina local
**
*************************************************************/
{mpp/mpapi001.i}
def input-output parameter table for tt-replic-msg.
def var i-versao-integ as integer format "999" no-undo.
assign i-versao-integ = 001.
find first tt-replic-msg no-lock no error.
if avail tt-replic-msg then do:
if tt-replic-msg.cod-versao-integracao <> i-versao-integ
then do:
run utp/ut-msgs.p (input "msg",
input 3941,
input "")
assign tt-replic-msg.cod-erro = 3941
tt-replic-msg.desc-erro = return-value.
return "NOK"
end.
else do:
find first maq-dest-trans where maq-dest-trans. cd-
trans = tt-replic-msg.cod-transacao no-lock no-error.
if avail maqui-dest-trans then
assign tt-replic-msg.log-replica-msg = yes.
find first maquina where maquina.tp-conexao = 1 no-lock no-
error.
if avail maquina then
assign tt-replic-msg.cd-maquina-local =
maquina.cd-maquina.
else do:
run utp/ut-msgs.p (input "msg",
input 3942,
input "").
Assign tt-replic-msg.cod-erro = 3942
tt-replic-msg.desc-erro = return-value
tt-replic-msg.cd-maquina-local = 0.
Return "NOK".
end.
end.
end.
else
return "NOK".
/* fim */
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 255
/* API nova */
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3. + param-global.indic.
Observação O resultado obtido através da nova API deve ser, sempre que
possível, idêntico ao resultado da antiga.
Evolução de lógica
Exemplo
de
API ,
com
mudan
ças de
parâme
tros
Para este tipo de evolução, deve ser criada uma nova API com o mesmo nome
da API antiga, acrescida de um diferenciador. EX.: UTAPI012.P
UTAPI012A.P.
Esta nova API deve possuir uma procedure interna EXECUTE, que receberá
os novos parâmetros e uma lógica.
A API antiga deve chamar a nova API de forma persistente e roda a procedure
interna EXECUTE, passando todos os antigos parâmetros e um valor padrão
para cada um dos novos parâmetros.
/* API antiga - UTAPI012.P */
define input-output parameter table for tt-configuracao2.
define input-output parameter table for tt-dados.
define input-output parameter table for tt-erros.
for each tt-erros:
delete tt-erros.
end.
end procedure.
Observação Os parâmetros novos que são passados como padrão para a nova API, devem
garantir que o resultado seja o mesmo da antiga API.
Para este tipo de evolução, deve ser criada uma nova API com o mesmo nome
da API antiga, acrescida de um diferenciador. Ex.: UTAPI012.P
UTAPI012A.P.
Esta nova API deve possuir uma procedure interna EXECUTE, que receberá
os novos parâmetros e uma lógica.
A API antiga deve, primeiramente, copiar todos os campos da antiga temp-
table para a nova, chamar a nova API de forma persistente e rodar a procedure
interna EXECUTE.
/* API antiga - UTAPI012.P */
define temp-table tt-clientes
field cliente as char.
define input param table for tt-clientes.
find first param-global exclusive-lock no-error.
if avail param-global then do:
find first tt-clientes no-lock no-error.
if avail tt-clientes then
assign param-global.ult-cliente = tt-clientes.cliente.
param-global.taxa = tt-new-clientes.taxa.
end procedure.
Observação Caso a temp-table seja input-output, no retorno da API evoluída, devem ser
repassados os registros da nova temp-table para a antiga.
define input param table for tt-clientes.
define var h-api as handle no-undo.
for each tt-clientes no-lock:
create tt-new-clientes.
buffer-copy tt-clientes to tt-new-clientes
assign tt-new-clientes.taxa= = 1.
end.
run utp/utapi012a.p persistent set h-api.
run execute in h-api (input table tt-clientes).
delete procedure h-api.
Observação Caso a temp-table antiga seja input-output, no retorno da API evoluída, devem
ser repassados os registros da nova temp-table para a antiga.
Evolução de lógica
Exemplo
de API,
com
mudan
ça de
parâme
tros,
que já
foi
evoluíd
a
Para este tipo de evolução, deve ser criada uma nova procedure interna com o
mesmo nome da procedure interna antiga, acrescida de um diferenciador. Ex.:
EXECUTE EXECUTE2.
Esta nova procedure interna deve receber os novos parâmetros e possuir toda a
lógica.
A procedure interna antiga deve chamar a nova procedure, passando todos os
antigos parâmetros e um valor padrão para cada um dos novos parâmetros.
/* API antiga - UTAPI012A.P */
procedure execute:
define input-output param table for tt-configuracao2.
define input-output param table for tt-dados.
define input-output param table for tt-erros.
< código customizado>
end procedure.
Observação Os parâmetros novos que são passados como padrão para a nova procedure
interna, devem garantir que o resultado seja o mesmo da antiga procedure interna.
Para este tipo de evolução, deve ser criada uma nova procedure interna ou API
com o mesmo nome da procedure interna antiga, acrescida de um
diferenciador, conforme exemplificando nos itens anteriores.
Como não é possível determinar valores padrão, a procedure interna ou API
antiga deve retornar um erro para que o programa que o chamou emita uma
mensagem de erro explicando o motivo que a API não foi executada e qual o
motivo da obrigatoriedade de novo parâmetro.
/* API antiga - UTAPI012A.P */
procedure execute:
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
define input param param-3 as log no-undo.
run execute 2 (input param-1,
input param-2,
input param-3,
input 0).
end procedure.
procedure execute2:
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
define input param param-3 as log no-undo.
define input param param-4 as int no-undo.
if param-4 = 0 then
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3.
end.
else do:
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3 + param-4.
end.
end procedure.
Observação Isto somente deve ser feito caso não exista nenhuma maneira de definir um valor
padrão para o novo parâmetro ou o parâmetro seja obrigatório. A mensagem de que a API possui
uma nova versão com parâmetro obrigatório, deve ser somente apresentada no programa
chamador, e nunca na própria API, já que as API´s não devem possuir eventos de interface. Esta
mensagem deve apresentar um erro dizendo que esta API está desatualizada e o motivo de sua
extinção.
Para este tipo de evolução, deve ser criada uma nova procedure interna ou API
com o mesmo nome da procedure interna antiga, acrescida de um
diferenciador, conforme exemplificando nos itens anteriores.
A antiga API deve retornar um erro para o programa chamador.
A nova API deve conter uma procedure interna que retorne a versão de
integração para o programa chamador.
/* API antiga - UTAPI012.P */
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
define input param param-3 as log no-undo.
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3 * param-2.
Observação Esta técnica pode ser utilizada quando as outras técnicas citadas implicarem
muito na performance da API. Antes de rodar a nova API, o programa chamador deve rodar o
método Get-Integration-Version da nova API e verificar se a versão está correta. Lembrar que,
qualquer mensagem para o usuário deve ser emitida pelo programa chamador e nunca pela API.
Parâmetros
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 265
UTAPI002.P
A API utp/utapi002.p faz a integração entre Progress e Microsoft Word 97,
permitindo a criação de arquivos, baseados em formulários, para o Microsoft
Word.
Maiores informações podem ser obtidas na documentação da API de
Integração entre PROGRESS e Microsoft Word 97 (docapi/utapi002.doc).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi012 ao invés deste.
UTAPI003.P
A API utp/utapi003.p faz a Integração entre PROGRESS e Microsoft Excel 97,
permitindo a construção de planilhas e, também, gráficos.
Maiores informações podem ser obtidas na documentação da API de
Integração entre PROGRESS e Microsoft Excel 97 (docapi/utapi003.doc).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi013 ao invés deste.
UTAPI004.P
Permitir o envio de E-Mail ou FAX através do EMS 2.0 usando o MS-
Exchagne (OLE Automation).
o primeiro parâmetro deve ser endereço E-Mail do destinatário (Exemplo:
"fulano@internet.com.br") ou o número do FAX (Exemplo:
"[FAX:9999999]");
o segundo parâmetro deve ser o E-Mail ou o número do FAX para uma
"Cópia Carbono" (Cc);
o terceiro parâmetro é o Assunto (Subject);
o quarto parâmetro é a mensagem;
o quinto parâmetro é o arquivo anexo (attachment);
Parâmetros
Objetivo
Configuração
Retorno
Exemplo
UTAPI005.P
Permitir o envio de E-Mail através do EMS 2.0 usando um servidor UNIX ou
qualquer outro servidor com suporte ao protocolo SMTP.
Devem ser passados oito parâmetros para este programa:
Configuração
Retorno
Exemplo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 267
Se o retorno (return-value) desse programa for igual a Ok, o mail foi enviado
com sucesso, senão algum erro ocorreu no envio ou os parâmetros passados
não estão corretos.
Para que o programa de envio de E-Mail funcione é preciso que esteja
cadastrado corretamente o endereço IP do servidor de E-Mail e a sua porta nos
Parâmetros Globais do Sistema.
Interface
Instalação
Observação O programa permite enviar um E-Mail para várias pessoas. Para isto deve-se
passar cada nome separado por "," (vírgula) ou por ";" (ponto e vírgula). O mesmo acontece para
a Cópia Carbono.
Exemplo: fulano@internet.com.br, beltrano@internet.com.br". O assunto e a mensagem podem
ser passadas em branco.
Exemplo: ("") O remetente nunca pode conter espaços em branco.
UTAPI006.P
A API utp/utapi006.p permite a busca de dados de uma planilha Excel para o
Progress.
No programa responsável por buscar os dados deve ser feita a inclusão do
include: utp/utapi006.i, onde estão as definições das temp-table´s que devem
ser passadas como parâmetros à API utp/utapi003.p.
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 269
UTAPI007.P
A API utp/utapi007.p permite o uso de funções do Excel, para retornar os
resultados para um programa Progress.
No programa responsável por usar esta API deve ser feita a inclusão do
include: utp/utapi007.i, onde estão as definições das temp-table´s que devem
ser passadas como parâmetros à API utp/utapi007.p.
A chamada da API deve seguir o padrão abaixo:
run utp/utapi007.p (input-output table tt-dados,
output table tt-erros).
UTAPI008.P
Nome Físico: utp/utapi008.p
Nome do Include com os Parâmetros: utp/utapi008.i
Versão de Integração: 001
Atualização de arquivos para o Microsoft Excel 97 e retorno de informações
para o Progress.
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Excel 97 (docapi/utapi008.doc).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi018 ao invés deste.
Objetivo
UTAPI009.P
Nome Físico: utp/utapi009.p
Nome do Include com os Parâmetros: utp/utapi009.i
Versão de Integração: 001
Envio de mensagens através do servidor de correio eletrônico e envio de FAX
através de servidor de FAX.
Maiores informações podem ser obtidas na documentação da API de Envio de
FAX/E-mail (docapi/utapi009.doc).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi019 ao invés deste.
UTAPI010.P
Nome Físico: utp/utapi010.p
Nome do Include com os Parâmetros: utp/utapi010.i
Versão de Integração: 001
Permitir que impressoras cadastradas no EMS sejam utilizadas em programas
compilados contra os bancos do MAGNUS.
Maiores informações podem ser obtidas na documentação da API para
Compartilhar Impressoras do EMS com Programas Magnus
(docapi/utapi010.doc).
UTAPI012.P
Nome Físico: utp/utapi012.p
Nome do Include com os Parâmetros: utp/utapi012.i
Versão de Integração: 001
Criação de arquivos, baseados em formulários, para o Microsoft Word. Sendo
que os parâmetros recebidos são utilizados para preencher os campos de
formulário existentes no documento.
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 271
UTAPI013.P
Nome Físico: utp/utapi013.p
Nome do Include com os Parâmetros: utp/utapi013.i
Versão de Integração: 001
Faz a Integração entre Progress e Microsoft Excel, permitindo a construção de
planilhas e, também, gráficos.
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Excel (docapi/utapi013.doc).
UTAPI018.P
Nome Físico: utp/utapi018.p
Nome do Include com os Parâmetros: utp/utapi018.i
Versão de Integração: 001
Atualização de arquivos para o Microsoft Excel e retorno de informações para
o Progress..
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Excel (docapi/utapi018.doc).
UTAPI019.P
Nome Físico: utp/utapi019.p
Nome do Include com os Parâmetros: utp/utapi019.i
Versão de Integração: 001
Objetivo
UTAPI027.P
Nome Físico: utp/utapi027.p
Nome do Include com os Parâmetros: utp/utapi027.i
Versão de Integração: 001
Criação de documentos, baseados em formulários para o Microsoft Word,
sendo que a decisão de gravar ou não o documento caberá ao usuário final.
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Word (docapi/utapi027.doc).
UTAPI028.P
Nome Físico: utp/utapi028.p
Nome do Include com os Parâmetros: utp/utapi028.i
Versão de Integração: 001
Envio de compromisso do tipo reunião via Microsoft Outlook.
Maiores informações podem ser obtidas na documentação da API de Envio de
compromisso via Outlook (docapi/utapi028.doc).
UTAPI029.P
Nome Físico: utp/utapi029.p
Nome do Include com os Parâmetros: utp/utapi029.i
Versão de Integração: 001
Considerações
Objetivo
Gerais
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 273
A API de Integração com excel tem como função gerar código javascript para
gerar planilhas e gráficos no excel em programas estilo pai x filho.
Maiores informações podem ser obtidas na documentação da API de
Integração com Excel Web (docapi/utapi029.doc).
APAPI009.P
Nome Físico: app/apapi009.p
Nome do Include com os Parâmetros: app/apapi009.i
Versão de Integração: 001
Consistir os parâmetros passados e caso estejam Ok atualizar os pagamentos.
devem ser passadas 1 (uma) temp-table de entrada e 1 (uma) de saída
contendo as informações para atualização dos PF´s;
todas as temp-tables são passadas como parâmetro através dos comandos
INPUT TABLE ou OUTPUT TABLE.
Exemplo:
run utp/utapi008.p (input table tt-referencia,
output table tt-erro-pef).
Atributo Descrição
i-ep-codigo Empresa do pagamento
c-referencia Referência a ser atualizada
cod-versao-integ Versão de integração
c-usuario Usuário corrente
l-vid-rel Mostra mensagens na tela ou gera temp-table de erros
l-acompanha Mostra acompanhamento na tela?
Parâmetros de Saída
Temp-table tt-erro-pef: serão gerados registros nesta temp-table quando tt-
referencial.l-vid-rel=yes com o código do erro, descrição e informações dos
registros com inconsistências.
TEMP-TABLE TT-ERRO-PEF
Atributo Tipo Formato Valor Inicial Obrigatório
i-cod-erro Integer 9999999 Sim
c-desc-erro Character "x(70)" Sim
c-arquivo-erro Character "x(100)" Não
Atributo Descrição
i-cod-erro Código da mensagem de erro
c-desc-erro Descrição da mensagem de erro
c-arquivo-erro Informações com inconsistências
Execução
O programa app/apapi009.p irá primeiramente validar a versão de integração:
Validação: Versão de Integração
O programa irá verificar se o programa chamador está íntegro com a API, e
isto ocorre através da verificação da versão de integração passada como
parâmetro através da temp-table tt-referencia (campo cod-versao-integ). Caso
a versão esteja incompatível, a API abortará a execução retornando através da
temp-table tt-erro-pef o código de erro 3941.
Número do Erro Mensagem Ajuda
3941 Versão de integração incorreta ! Aversão de integração informada
através dos parâmetros internos é
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 275
CAPÍTULO 14
Portabilidade de RCODES
Outra solução para este problema, é usar o comando PUT, pois o mesmo não
usa FRAME.
output to value(c-arquivo)
find emitente where emitente.cod-emitente = 10 no-lock.
put emitente.cod-emitente.
Caso em Especial
A partir da regra de não utilizar comandos que criam FRAMES explícitas ou
implícitas, alguns problemas foram detectados com a descoberta de comandos
que criam, por algum motivo, FRAMES implícitas.
Até o momento foi constatado o problema nos comandos CREATE SERVER e
EXPORT. Para solucionar o problema, é necessário identificar se existe outra
maneira para realizar a tarefa desejada, caso contrário, será necessário manter
RCODES para cada ambiente existente.
Para os casos identificados, o comando EXPORT pode ser substituído por PUT
ou DIPLAY (utilizando a opção STREAM-IO). Para o comando CREATE
SERVER, será necessário manter um RCODE por ambiente existente, isto é,
um RCODE para ambiente Windows e outro para ambiente Unix.
Implementação
Objetivo
279
CAPÍTULO 15
Técnicas
280
Observação Não esquece de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 281
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Implementação
Objetivo
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 283
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 285
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 287
Observação A utilização do ImageList é necessária para que o programa possa ser executado
pelo WebEnabler. Na ausência do mesmo o programa executará sem imagens.
Este controle permite que sejam programadas execuções de uma rotina dentro
de determinados intervalos de tempo. Para interagir com esse objeto você deve
utilizar o evento “Tick” do mesmo. Esse evento é disparado sempre que se
passar o intervalo de tempo determinado na propriedade “Interval”.
Imagem
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 289
Esse componente já acompanha o Progress e por isso não precisa ser instalado,
o arquivo que possui esse componente é PSTIMER.ocx. O nome do
componente a ser utilizado é Progress Timer Control.
Propriedades
Enabled É uma propriedade do tipo Lógico (true/false), sempre que
for setado para true o evento Ticker será disparado após o intervalo de
tempo determinado.
Sintaxe: <com-handle>:Controls:Item(1):ENABLED.
chCtrlFrame:Controls:Item(1):ENABLED = TRUE.
Interval É uma propriedade do tipo Integer e nela especifica-se qual
o intervalo de tempo(em milisegundos) que se quer esperar entre uma
ocorrência do evento Ticker e outra. Caso o valor setado seja 0 não
será disparado o evento.
Sintaxe: <com-handle>:Controls:Item(1):Interval.
chCtrlFrame:Controls:Item(1):Interval = 50.
Evento
Tick É o evento que é disparado após cada intervalo de tempo
determinado.
Altura - Altura da área onde a imagem poderá ser exibida, este valor
pode ser lido e alterado.
Sintaxe: <com-handle>:Controls:Item(1):Altura.
chCtrlFrame:Controls:Item(1):Altura = 500.
LarguraFigura - Largura da imagem, propriedade de escrita e de
leitura.
Sintaxe: <com-handle>:Controls:Item(1):LarguraFigura.
chCtrlFrame:Controls:Item(1):LarguraFigura = 500.
AlturaFigura - Altura da imagem, propriedade de escrita e de leitura.
Sintaxe: <com-handle>:Controls:Item(1):AlturaFigura.
chCtrlFrame:Controls:Item(1):AlturaFigura = 500.
Ajusta - Determina-se se a imagem irá se ajustar para ser totalmente
exibida dentro da área determinada, este valor pode ser acessado tanto
para leitura quanto para escrita.
Sintaxe: <com-handle>:Controls:Item(1):ajusta.
chCtrlFrame:Controls:Item(1):ajusta = yes.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 291
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 295
Nota: Devido a problemas encontrados na utilização deste OCX o mesmo deixa de fazer parte
dos OCX homologados. Estamos mantendo sua documentação apenas para registro por
eventuais programas que já tenham sido construídos utilizando este OCX.
dispositivos.
Sintaxe: <com-handle>:CommPort.
ASSIGN chComm:MSComm:CommPort =500.
Handshaking Handshaking é o protocolo que é utilizado pelo
hoardware para se comunicar através da porta serial. Essa propriedade
aceita apenas valores inteiros e os possíveis valores para a propriedade
são: 0 – NoHandshaking; 1 – XonXoff; 2 – RtsCts; 3 –
XonXoffAndRtsCts.
Sintaxe: <com-handle>:Handshaking.
ASSIGN chComm:MSComm:Handshaking = 0.
Settings Através dessa propriedade definimos as configurações que
serão utilizadas para se comunicar com o outro disposito, essas
configurações são os números de bits por segundo, a paridade,
quantidade de bits e o bit de parada. Todas as configurações devem ser
atribuídas ao componente através de uma string que deve separar cada
informação com uma “,”.
Sintaxe: <com-handle>:Settings.
ASSIGN chComm:MSComm:Settings = “5,2,4,1”.
PortOpen Com essa propriedade podemos abrir ou fechar a porta de
comunicação e também podemos apenas obter qual o estado atual da
porta. Caso a proprieade seja chamada e o valor obtido for “no”
significa que a porta está fechada e se o valor for “yes” significa que a
porta está aberta, e para abrir ou fechar a porta basta setar yes ou no
para a porta.
Sintaxe: <com-handle>: PortOpen.
chComm:MSComm:PortOpen = NO.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 297
Sintaxe: <com-handle>:Min.
ASSIGN chctrlframe:ProgressBar:Min = 0.
Max Por meio dessa propriedade definimos qual o maior valor que
a barra de progresso poderá assumir. É importante que se controle o
valor da barra para que não ultrapasse o valor máximo, pois isso causa
erro.
Sintaxe: <com-handle>:Max.
ASSIGN chctrlframe:ProgressBar:Max = 10.
Value Value é propriedade do componente onde podemos obter o
valor atual que a barra está exibindo ou que podemos informar qual o
novo valor que a barra deve exibir o progresso do processo..
Sintaxe: <com-handle>:Value.
ASSIGN chctrlframe:ProgressBar:Value =
chctrlframe:ProgressBar:VALUE + 1.
Nota: Devido a problemas encontrados na utilização deste OCX o mesmo deixa de fazer parte
dos OCX homologados. Estamos mantendo sua documentação apenas para registro por
eventuais programas que já tenham sido construídos utilizando este OCX.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 299
Nota: Devido a problemas encontrados na utilização deste OCX o mesmo deixa de fazer parte
dos OCX homologados. Estamos mantendo sua documentação apenas para registro por
eventuais programas que já tenham sido construídos utilizando este OCX.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 305
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Implementação
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 307
É importante ressaltar que esta técnica só irá funcionar para quem possui o
Word 97, instalado na sua máquina.
Após a implementação da técnica, ela funciona assim:
no início, a imagem do botão check deve estar em vermelho, indicando
que o texto do Editor ainda não passou pela correção ortográfica.
Exemplo:
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 309
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 311
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 313
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Onde:
Nome-rs: Nome do Radio-set
X: Número que obtém a entrada desejada do radio-set. Este número é obtido
pela seguinte fórmulaX=2 * (entrada desejada)-1.
Observação o Radio-Set Properties mostra que as strings são: "string", 1, "string", 2, ..., então
para obter a posição desejada é necessário utilizar a fórmula descrita anteriormente.
Exemplo:
desabilitar o radio-button empréstimo
Tipo-modalidade.transacao
1 - Aplicação
2 - Empréstimo
X = 2(2) -1
X=3
If tipo-modalidade.transacao:disable(entry(3, tipo-
modalidade:radio-buttons)) in frame {&frame-name} then.
Implementação
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 315
8
Procedure pertencente ao programa chamado executada antes de sua inicialização;
9
Inicialização do programa chamado. Deverá sempre ser feita separadamente de outras execuções de
procedimentos devido a possibilidade de a inicialização o handle tornar-se inválido;
10
Validação do handle agrupando mais de uma execução de procedimentos. Isso pode ser feito desde que a
inicialização do programa não esteja no mesmo bloco da condição e que nenhum dos procedimentos
contidos no bloco possam ocasionar a perda da validade do handle. Isso pode acontecer se, por exemplo, o
procedimento feche o programa chamado.
11
Procedimento, que não tem possiblidade de ocasionar a invalidade do handle, contido em um bloco com
mais procedimentos.
Para verificar se a implementação foi realizada de forma correta, basta fechar
a "janela chamadora" antes de fechar a "janela chamada". Quando for
encerrada a "janela chamada" o erro não deve ocorrer, se a técnica foi
utilizada. O conceito GUI / MS Windows / Progress indica que uma janela
deve rodar como um objeto independente, por isso a execução de programa
chamado deve ser de forma persistente.
Onde:
<função-do-botão>: Função específica do botão a ser trabalhado
<handle-do-painel>: Handle do painel, onde o link é source
<logical>: Variável em fator lógico, onde "yes" habilita e "no" desabilita.
Funções
Inclui
Elimina
Modifica
Copia
Cancela
Desfaz
Salva
Va-para
Zoom
Relacionamento
Relatório
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 317
Observação Não utilize a opção "else", pois nesta procedure passam vários outros state´s.
ADM-ASSIGN-FIELDS ADM-MODIFY-FIELDS
ADM-MODIFY-FIELDS
2. Retirar a propriedade Enable do radio-set.
3. Definir as seguintes variáveis no bloco de Definitions da viewer:
define variable c-lista as character no-undo.
define variable i-cont as integer no-undo.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 323
Onde:
{03}:indica a função a ser realizada, conforme a tabela abaixo:
Função Objetivo
01 define view-as Combo-Box
02 define view-as Radio-Set
03 lista com os itens separados por vírgula
04 n retorna o item n da lista
05 retorna o número de itens da lista
06 item retorna a posição do item (número)
3. Nas propriedades do SmartBrowser colocar um Calculate Field (campo
calculado) que retorna a entrada no 'list-items' de acordo com o conteúdo
do registro. Exemplo:
entry(conta.tipo, c-lista-tipo) @ c-tipo
incluir
{utp/ut-rtlbl.i mgadm conta natureza text-1}
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 325
Número: 1234
Mensagem: Data de conversão inválida !
Tipo: Erro
Help: Data de conversão não pode ser menor que a data de ...
Número: 1235
Mensagem: &1 não pode ser representante na região &2 nesta situação
Tipo: Erro
Help: O representante &1 não está habilitado para operar na região &2
para valores inferiores a &3.
Número: 1236
Mensagem: Verificação completa. Confirma atualização ?
Tipo: Questão
Help: A verificação dos dados foi completada, estando os dados
preparados para atualização
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 327
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 329
[Datasul_EMS2]
Show-Report-Program=notepad.exe
TimeAComp=60
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 331
Passos:
1. Deve ser criada uma variável do tipo caracter view-as fill-in, na qual é
armazenado o campo de referência da chave estrangeira e deve ser
colocada ao lado do campo que tem zoom. Acessar as propriedades deste
campo e retirar a propriedade 'Enable'.
Exemplo: Para o campo de referência state-name temos a variável c-state-
name.
2. Criar a procedure local-display-fields e nela, antes do run dispatch, deve
ser inserida uma lógica para carregar o valor inicial da variável para o
campo de referência.
if available customer then do:
find state where state.state = customer.state no-lock no-
error.
assign c-state-name = if avail state then state.state-name
else "":U.
end.
3. No gatilho de leave do campo que possui zoom deve ser inserida uma
lógica para determinar o valor do campo de referência com base no que o
usuário digitou no campo que possui zoom.
Exemplo
{include/leave.i &tabela=state
&atributo-ref=state-name
&variavel-ref=c-state-name
&where="state.state = input frame {&frame-name}
customer.state"}
Onde:
<tabela>: tabela que possui a chave estrangeira;
<atributo-ref>: recebe o campo de referência da tabela da chave estrangeira;
<variavel-ref>: variável criada para receber o campo de referência;
<where>: cláusula where para localizar o registro na tabela de referência;
4. Através do include ZOOMVAR.I é padronizada a chamada do zoom para
os campos que são chave estrangeira, que atende as seguintes situações de
acesso ao zoom;
a partir de um campo chave estrangeira de uma tabela;
a partir de uma variável;
a partir de um campo chave estrangeira de uma tabela cujo nome não
coincide com o nome do campo no browse de pesquisa, de onde o
valor será buscado (Exemplo: Na viewer o campo chama-se it-codigo-
pai, e no browse o campo chama-se it-codigo, simplesmente - comum
em tabelas com auto-relacionamento);
a partir de uma coluna num browse;
Todas estas situações com a possibilidade de passagem de parâmetros para o
programa de zoom;
Sintaxe:
{include/zoomvar.i &prog-zoom=diretório/programa
&campo=variavel/tabela.atributo
&campozoom=nome-atributo
[&frame=nome-frame]
[&browse=nome-browse]
[¶metros="run pi-procedure in wh-
pesquisa".]}
Onde:
<prog-zoom>: é o nome do programa de zoom
<campo>: é o campo/variável na viewer ou frame onde está sendo colocado o
zoom, sendo um campo de tabela, deve ser especificado no formato
tabela.campo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 333
Observação Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo
nome na viewer difere no nome do atributo no browse da pesquisa.
d) chamada de zoom para colunas de um browse updateable:
ON F5 OF tt-digita.it-codigo in browse {&browse-NAME}
OR MOUSE-SELECT-DBLCLICK OF tt-digita.it-codigo in browse
{&BROWSE-NAME} DO:
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=tt-digita.it-codigo
&campozoom=it-codigo
&browse=br-digita}
END.
Observação A única diferença está na utilização do parâmetro &browse, que recebe o nome do
browse onde o campo/variável se encontra.
e) chamada de zoom para telas com mais de uma frame (estilo de relatórios):
ON F5 OF c-item-pai in frame f-pg-par
OR MOUSE-SELECT-DBLCLICK OF c-item-pai in frame f-pg-par
DO:
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=c-item-pai
&campozoom=it-codigo
&frame=f-frame}
END.
Observação A única diferença está na utilização do parâmetro &frame, que recebe o nome da
frame onde o atributo se encontra.
Por fim, para todos os campos em frames (não é possível para colunas de
browsers) que possuem zoom é necessário alterar o ponteiro do mouse, através
do método load-mouse-pointer, normalmente isto é realizado no main-block do
programa. Exemplo:
c-item-pai:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.
Passos:
1. Deve ser criada uma variável do tipo caracter view-as fill-in, na qual é
armazenado o campo de referência da chave estrangeira e deve ser
colocada ao lado do campo que tem zoom. Acessar as propriedades deste
campo e retirar a propriedade 'Enable'. Deve também ser definida na seção
definitions uma variável do tipo Handle chamada hProgramZoom.
Exemplo: Para o campo de referência state-name temos a variável c-state-
name.
DEFINE VARIABLE hProgramZoom AS HANDLE NO-UNDO
2. Criar a procedure local-display-fields e nela, antes do run dispatch, deve
ser inserida uma lógica para carregar o valor inicial da variável para o
campo de referência.
if available customer then do:
find state where state.state = customer.state no-lock no-
error.
assign c-state-name = if avail state then state.state-name
else "":U.
end.
3. No gatilho de leave do campo que possui zoom deve ser inserida uma
lógica para determinar o valor do campo de referência com base no que o
usuário digitou no campo que possui zoom.
{include/leave.i &tabela=state
&atributo-ref=state-name
&variavel-ref=c-state-name
&where="state.state = input frame {&frame-name}
customer.state"}
Onde:
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 337
Sintaxe:
{method/ZoomFields.i &ProgramZoom="nome do programa"
&FieldZoomN="nome do campo que retorna"
&FieldScreenN="nome do campo ou variável"
&FrameN="frame"
&RunMethod="run procedure in hProgramZoom"
&EnableImplant="yes/no"}
Onde:
<ProgramZoom>: Nome do programa de Pesquisa a ser executado;
<FieldZoomN>: Indica o nome do campo que deve ser retornado pelo
programa de Pesquisa, N indica um número que pode variar de 1 até 10;
<FieldScreenN>: Indica o nome do campo (variável) que deve receber o valor
retornado pelo programa de pesquisa, N indica um número que pode variar de
1 até 10;
<FrameN>: Indica o nome da frame na qual está o campo (variável) que deve
receber o valor retornado pelo programa de pesquisa, N indica um número
que pode variar de 1 até 10;
<RunMethod>: Indica a linha de comando, que contém a chamada a um
método do programa de pesquisa. A variável hProgramZoom contém o handle
do programa de pesquisa;
<EnabledImplant>: Os valores YES e NO indicam se o botão Implantar será
habilitado ou não;
Exemplos:
a) chamada de zoom para atributos em um frame:
ON F5 OF ttcustomer.sales-rep in frame fPage2
OR MOUSE-SELECT-DBLCLICK OF ttcustomer.sales-rep in frame
fPage2 DO:
{method/ZoomFields.i &ProgramZoom="spp/spzoom.w"
&FieldZoom1="Sales-Rep"
&FieldScreen1="ttCustomer.Sales-Rep"
&Frame1="fPage2"
&RunMethod="RUN setaVariable IN
hProgramZoom (INPUT 'Representante')."
&EnableImplant="NO"}
END.
END.
&Frame1="fPage2"
&RunMethod="RUN setaVariable IN
hProgramZoom (INPUT 'Representante')."
&EnableImplant="NO"}
END.
Observação Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo
nome na viewer difere no nome do atributo no browse da pesquisa.
Por fim, para todos os campos em frames que possuem zoom é necessário
alterar o ponteiro do mouse, através do método load-mouse-pointer,
normalmente isto é realizado no main-block do programa. Exemplo:
c-item-pai:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 341
No caso, o Custom Browser Zoom Wizard por default criou a procedure pi-
retorna-valor para o campo cod_proced que pertence a tabela principal do
browse, como o desejado é que o mesmo retorne a descrição do programa
(des_prog_dtsul) então, foi acrescentado o código:
when "des_prog_dtsul" then
assign p_valor = prog_dtsul.des_prog_dtsul.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 345
destino
tt-param.data-exec = today
tt-param.hora-exec = time
tt-param.classifica = input frame f-pg-imp rs-
destino
tt-param.desc-classifica = entry((tt-
param.classifica - 1) * 2 + 1, rs-classif:radio-buttons in
frame f-pg-cla)
tt-param.parametro = if input frame f-pg-imp tb-
parametro = "yes" then yes else no.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 347
tt-param.desc-classifica = entry((tt-param.classifica
- 1) * 2 + 1, rs-classif:radio-buttons in frame f-pg-cla)
tt-param.formato = if input frame f-pg-imp rs-formato
= "1" then 1 else 2.
Além disso, deve ser incluso o código a seguir após o RUN DISPATCH ..., em
todas as consultas e nos cadastros em que for usado.
IF gr-<nome-tabela> <> ? THEN
RUN pi-reposiciona-query IN h_<nome-query>
(INPUT gr-<nome-tabela>).
ELSE
RUN dispatch IN h_<nome-query>
(INPUT "get-first":U).
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 349
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 353
/*************************************************************
** Copyright DATASUL S.A. (1997)
** Todos os Direitos Reservados.
**
** Este fonte é de propriedade exclusiva da DATASUL, sua
** reprodução parcial ou total por qualquer meio, só poderá ser
** feita mediante autorização expressa.
**
** Gatilho de Dicionário.: CREATE/<nome-da-tabela>
** Data de Criação......: XX/XX/XXXX
**
***************************************************************/
TRIGGER PROCEDURE FOR CREATE OF <nome-da-tabela>.
/** Definição da variável que indica a versão do gatilho **/
def var c-versao-mg97 as char init "01.00.00" no-undo.
/** Código do gatilho de Create **/
/** Fim de Include **/
/*************************************************************
**
** Copyright DATASUL S.A. (1997)
** Todos os Direitos Reservados.
**
** Este fonte é de propriedade exclusiva da DATASUL, sua
** reprodução parcial ou total por qualquer meio, só poderá ser
** feita mediante autorização expressa.
**
** Gatilho de Dicionário.: DELETE/<nome-da-tabela>
** Data de Criação.......: XX/XX/XXXX
**
*********************************************************/
TRIGGER PROCEDURE FOR DELETE OF <nome-da-tabela>.
/** Definição da variável que indica a versão do gatilho **/
def var c-versao-mg97 as char init "01.00.00" no-undo.
/** Validações de eliminação **/
/** Include para chamada de EPC **/
{include/i-epc102.i <nome-da-tabela>}
/** Eliminação em cascata **/
/*************************************************************
** Copyright DATASUL S.A. (1997)
** Todos os Direitos Reservados.
**
** Este fonte é de propriedade exclusiva da DATASUL, sua
Gatilho de Assign
Find
Novo padrão: Como existem localizações distintas para cada um dos produtos
Datasul (EMS2 e EMS5) e existirá um banco de dados de localização para
cada um dos produtos (ver item Padrões de Localização no capítulo 3) foi
necessário adaptar o padrão acima para evitar a existência de programas
diferentes (exemplo, gatilhos) com a mesma nomenclatura nos produtos
EMS2 e EMS5.
Os programas que tem a nomenclatura relacionada com o Dump-name da
tabela devem usar a sigla do Dump-name ou invés da sigla do país.
Exemplo para a localização do Produto EM2 para a Argentina, onde o Dump-
name tem a seguinte codificação:
AR2999:
AR = sigla duas letras do país Argentina
2 = indica que se trata do produto EMS2; 5 = indica produto EMS5
999 = número seqüencial iniciando em 001.
5. Casa País deve ter uma base de dados própria, sempre no padrão 'lcxxx',
conforme a nomenclatura demonstrada na tabela acima.
6. Cada base de dados contém a extensão das tabelas necessárias para a
localização, como no Exemplo:
Campos da tabela: tipo-tax
cod-tax
descrição
tax-perc
tributados
ct-tax
tipo
sc-tax
conta-tax
ind-data-base
ct-percepcao
sc-percepcao
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 357
conta-percepcao
sc-retencao
ct-retencao
conta-retencao
perc-percepcao
cod-esp
serie
incidencia-impto
Índices da tabela tipo-tax:
Flags IndexName Cnt Field Name
pu ch-tipo-tax 1 + cod-tax
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 359
Ou seja, quando esta propriedade está setada como o valor Simple, após
gravar um novo registro não é habilitada a tela para uma próxima inclusão.
Porém, quando o valor é Multiple, após gravar um novo registro é habilitada a
tela para uma próxima inclusão.
O valor default para esta propriedade é Multiple.
A sintaxe a ser utilizada para setar esta propriedade é:
RUN set-attribute-list IN <handle-panel> (INPUT
"AddFunction=<valor>":U).
Onde:
<handle-panel>: variável que contenha o valor do handle do panel
<valor>: valor para a propriedade que pode ser: Simple ou Multiple
Esta função é muito útil para os campos calculados de browsers. Antes era
necessário utilizar ON-FIND TABELA no MAIN-BLOCK do programa para
calcular o valor de um campo que possuía uma lógica mais complexa
(Exemplo: pesquisa em outras tabelas). Agora basta seguir a seguinte sintaxe:
fn-nome da função (valor a ser transferido) na expressão de um calculated
field para utilizar uma função e atribuir o valor retornado a uma outra variável
do browser. Exemplo:
Neste exemplo, temos que a função "fn-valor" está sendo acionada utilizando
o valor do campo banco.vl-lim-aplic. Conforme a expressão do calculated
field, o valor retornado da função é mostrado na variável de soma-aplic do
browser.
Observação Recomenda-se que não sejam utilizadas temp-tables. Na versão 8.2 A do
Progress, a utilização de tabelas temporárias dentro de funções está causando SYSTEM ERROR
(130).
Implementação
Objetivo
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 361
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
CTWAVE32.OCX CtWAVE.ctWaveCtrl.l
MSCOMCT2.OCX Date and Time Picker Control
TREEVIEW.OCX DatTreeView.TreeView
DATIMAGE.OCX DatasulImage.Imagem
DATSOUND.OCX DatasulSound.Sound
DATVIDEO.OCX DatasulMultimedia.MediaPlayer
MIDIFL32.OCX Mabry.Midifile Ctl
MCI32.OCX MCI.MMControl.l
COMCTL32.OCX Microsoft TreeView Control
COMDLG32.OCX Microsoft Common Dialog Control
CASE columnHandle:NAME:
WHEN 'Name' THEN
OPEN QUERY {&BROWSE-NAME}
FOR EACH Customer NO-LOCK BY Customer.Name.
WHEN 'City' THEN
OPEN QUERY {&BROWSE-NAME}
Mini-Flexibilização
para
Tipo de
Banco
de
Dados
Mini-Flexibilização
Em muitas situações faz-se necessária a implementação de mini-flexibilização,
para implementar funcionalidades ou características específicas para uma
versão do produto ou um tipo específico de banco de dados, por exemplo.
Para tanto se deve saber qual o tipo de mini-flexibilização desejada, que são:
Tipo Descrição
Tipo de Banco de Mini-flexibilização visando atender necessidades de
Dados implementações específicas a um determinado tipo de
banco de dados
Versão de Banco de Mini-flexibilização visando atender necessidades de
Dados implementações específicas a uma determinada versão
ou release do banco de dados
Versão/Release do Mini-flexibilização visando atender necessidades de
Produto implementações específicas a uma determinada
release/versão do produto
Especifica Mini-flexibilização visando atender necessidades de
implementações específicas a um determinado módulo
ou funções, podendo ser utilizada para atender as mais
diversas situações
Outro fato relacionado a inserção da chamada ao include é que esta deve ser
feita uma única vez em todo o programa, e mais especificamente no início do
programa. Isto se deve ao fato dos pré-processadores definidos no include
terem escopo global, ficando assim disponíveis em todo o escopo do
programa.
E os pré-processadores disponíveis para utilização estão listados a seguir:
Nome do pré-processador
ems_dbtype
Produto EMS 5
emsbas_dbtype
emsedi_dbtype
emsfin_dbtype
emsuni_dbtype
Produto EMS 2
mgadm_dbtype
mgdis_dbtype
mgind_dbtype
mguni_dbtype
mgcld_dbtype
mginv_dbtype
mgsws_dbtype
mgmrp_dbtype
mgven_dbtype
Nome do pré-processador
mgcex_dbtype
mgmp_dbtype
mgmfg_dbtype
mgsop_dbtype
lcarg_dbtype
movadm_dbtype
movdis_dbtype
movind_dbtype
movmnt_dbtype
movmfg_dbtype
Produto HR
dthrpyc_dbtype
dthrpmg_dbtype
dthrtma_dbtype
Exemplo 2:
{include/i_dbtype.i}
Mini-Flexibilização
para
Tipo de
Banco
de
Dados
em
DBOs
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 367
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
Nome do pré-processador
lcarg_version
movadm_version
movdis_version
movind_version
movmnt_version
movmfg_version
mgrac_version
movrac_version
Produto HR
dthrpyc_version
dthrpmg_version
dthrtma_version
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 373
{include/i-wenrgm.i &field1=v_num_pessoa_fisic
&event1="leave"
&field2=funcionario.dat_admis_func
&event2="leave"
&field3=funcionario.qti_meses_trab_ant
&event3="leave"
&field4=funcionario.qti_dias_contrat_trab
&event4="leave"
&field5=funcionario.dat_term_contrat_trab
&field6=funcionario.cdn_vinc_empregat
&event6="leave"}.
Observação: Existe um limite de 10 campos a serem utilizados em cada chamada da include.
Caso esse limite seja excedido o programador deverá definir uma nova chamada da include
passando os demais campos.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 375
Implementação Nos programas que possuem integração através do EAI, antes da chamada dos
adapters é necessário verificar se o EAI está configurado. Para isso deve-se
incluir a include i_dbeai.i e verificar o valor da variável v_log_eai_habilit.
Durante o login o valor dessa variável é alterado para YES se o EAI estiver
configurado, habilitando assim a integração.
Exemplo {include/i_dbeai.i}
IF v_log_eai_habilit THEN DO:
/* Chamada do adapter. */
END.
Observação Não esquecer que a execução do segundo procedimento é única, mesmo que sejam
enviadas diversas informações, como no caso da criação de um gráfico, este comando deve ser
executado uma única vez por ação.
DO:
def var c-arq-conv as char no-undo.
def var l-ok as logical no-undo.
END.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 383
Importante Antes de utilizar esta técnica, tente primeiro fazer a conversão utilizando a
técnica do utilitário UT-SELECT. O desenvolvimento com a técnica de UT-
SELECT é mais rápido e eficiente.
Caso existam restrições no uso da técnica de UT-SELECT, então deve ser
utilizada esta técnica.
Uma vez que o comando SQL foi definido, o próximo passo é executar o
comando RUN STORED-PROCEDURE no Progress. Primeiramente,
executamos o comando SELECT montado (contido na variável
cComandoSQL neste exemplo) através do comando RUN STORED-
PROCEDURE. Como a consulta é montada dentro do próprio programa
Progress, passamos "send-sql-statement" como parâmetro do RUN
STORED-PROCEDURE (este é um nome padrão para a stored-procedure
a ser executada). Caso seja necessário rodar uma stored-procedure já
existente na base de dados, podemos passar o nome dela no lugar de send-
sql-statement. Neste caso a PROC-HANDLE tem a função de passar
parâmetros para a stored-procedure. Em ambas as situações, a função
PROC-HANDLE retorna o handle (no formato Integer) que referencia
aquela consulta no buffer. Este handle será usado posteriormente para
leitura do resultado da consulta. É necessário definir uma variável INT
para receber esse valor. No exemplo, utilizamos a variável chamada
iHandle1:
RUN STORED-PROCEDURE send-sql-statement iHandle1 = PROC-
HANDLE(oracleCommand).
{utp/ut-oraFunConv.i }
ASSIGN oracleCommand = "SELECT" +
" order.order-num, order.cust-num, " + CHR(10) +
" order.Promise-Date, order.Sales-Rep " + CHR(10) +
"FROM order " + CHR(10) + "WHERE" + CHR(10) +
" order.order-num >= 100 AND" + CHR(10) +
" order.order-num <= 900 AND" + CHR(10) +
" (order.sales-rep BETWEEN UPPER(" + p2oCharacter(c-
sales-rep-ini) + ") AND LOWER(" + p2oCharacter(c-sales-rep-
fim) + ")) AND" + CHR(10) +
" (order.Promise-Date BETWEEN " + p2oDate(da-entrega-
ini) + " AND " + p2oDate(da-entrega-fim) + ")) ".
oracleLine.order_promiseDate
oracleLine.order_salesRep WITH FRAME f-pedido.
END.
Para implementar tal processo o desenvolvedor fará uso de dois utilitários que
são:
Observação Esta convenção de nome pode gerar problema com os tamanhos de campos, caso
ocorra este tipo de situação o desenvolvedor deverá utilizar o pré-processador UsaSeqField
= YES .
Com a utilização deste pré-processador o desenvolvedor deverá observar a sequência dos
campos informados na definição da temp-table e utilizar a mesma seqüência dos campos na
procedure gerarSelect. Isto deve ser feito porque a atribuição automática de valores para a
temp-table utilizará a sequência dos campos para determinar o valor correspondente de cada
campo. Sem o pré-processador UsaSeqField esta rotina utiliza o nome do campo.
Exemplo:
Para incluir a cláusula BETWEEN: “sports.order-line.qty BETWEEN
i-qty-ini AND i-qty-fim” executar o código abaixo:
INPUT 0,
INPUT "").
Exemplo:
Para obtermos o comando:
SELECT customer.cust-num, customer.NAME,
customer.address, Customer.Address2 ,
Customer.City, Customer.Country,
Customer.Credit-Limit, order.order-num,
item.item-num, item.price, order-line.qty,
Customer.Comments
FROM Customer, order, order-line, item
WHERE customer.cust-num = order.cust-num
AND order.order-num = order-line.order-num
AND order-line.item-num = ITEM.item-num
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 393
Observação Para tabelas em bancos diferentes pode-se optar por duas alternativas. A primeira
será utilizar a include para cada banco, gerando duas temp-tables. A outra seria identificar o
banco mais crítico e utilizar a include apenas nesse banco. Os demais bancos seriam tratados
com comandos FOR EACH, utilizando a temp-table retornada pela include.
Importante Para campos CHAR deverá ser feito a seguinte verificação no código
INPUT IF <campo> = ? THEN “INTEGER” ELSE “CHARACTER”.
/* recebimento de parâmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita.
CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.
/* include padrão para variáveis de relatório */
{include/i-rpvar.i}
/* definição de variáveis */
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.
c-titulo-relat = "Customer".
/* corpo do relatório */
&IF "{&EMS_DBTYPE}" <> "progress" &THEN
FOR EACH sqlLine NO-LOCK ON STOP UNDO, LEAVE
BY sqlLine.customer_custnum:
RUN pi-acompanhar IN h-acomp (INPUT
sqlLine.customer_name).
IF tt-param.tt_address-2 = YES AND
tt-param.tt_country = YES THEN DO:
DISPLAY STREAM str-rp
sqlLine.customer_custnum
sqlLine.customer_name
sqlLine.customer_city
sqlLine.customer_state
sqlLine.customer_address2
sqlLine.customer_country
WITH FRAME f-complete.
DOWN STREAM str-rp WITH FRAME f-complete.
END.
END.
&ELSE
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 399
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 401
find {&first-table-in-query-{&frame-name}}
where rowid({&first-table-in-query-{&frame-name}}) =
v-row-table
no-lock no-wait no-error.
if available ({&first-table-in-query-{&frame-name}}) then
run notify In this-procedure ("row-available":U).
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 403
END.
else do transaction:
create tt-digita.
open query br-digita for each tt-digita.
apply "entry" to tt-digita.cdn_cargo in browse br-digita.
end.
END.
Objetivo Esta técnica tem como objetivo aplicar o facelift nos programas que não estão
no padrão.
Como exemplo, podemos citar programas Masterdetail que no definitions não
foi marcado a opção de frames, para que não aparecessem as abas, pois a troca
de página é feita automaticamente de acordo com alguns critérios de negócio.
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 405
Após a sua definição é necessário chamar o utilitário, sua chamada deverá ser
executada na procedure de inicialização do templete, para os templates smart
deverá ser aplicado na procedure local-initialize, caso for thintemplate deverá
ser aplicado na procedure intitializeInterface, segue a baixo o código a ser
utilizado:
&IF "{&mguni_version}" >= "2.06b" or "{&aplica_facelift}" = "YES" &THEN
define new global shared variable h-facelift as handle no-undo.
if not valid-handle(h-facelift) then run btb/btb901zo.p persistent
set h-facelift.
&ENDIF
A variável handle será global, para que seja executado apenas no início da
sessão, porém caso aconteça alguma interrupção do processamento e o handle
for perdido o mesmo irá carregar o utilitário novamente.
&ENDIF
&ENDIF
{Utp/ut-glob.i}
Após isto, basta apenas colocar a chamada para include ut9000 na Initialize do
programa, antes do dispacth:
{Utp/ut9000.i "TESTE" "1.00.00.000"}
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 407
CREATE WIDGET-POOL.
Nota O codigo do módulo a ser informado deve fazer parte dos módulos contratados que estao
disponiveis na licença enviada para o cliente.
Exemplo:
&IF "{&EMSFND_VERSION}" >= "1.00" &THEN
{include/i-license-manager.i CT0301D MCT}
&ENDIF
Sendo,
Nota O codigo do módulo a ser informado deve fazer parte dos módulos contratados que estao
disponiveis na licença enviada para o cliente.
Exemplo:
&IF "{&EMSFND_VERSION}" >= "1.00" &THEN
{include/i-license-manager.i CT0301D MCT}
&ENDIF
APÍTULO 8 Construção de
rogramas utilizando os Estilos e suas Técnicas 411
ttErrosConexao.mensagem
With Width 300.
End.
UPC:
if p-ind-event = "INITIALIZE"
and p-ind-object = "CONTAINER" then do:
Programa upcRun:
CAPÍTULO 16
Dicas de Desenvolvimento