Anda di halaman 1dari 394

Manual de Padres

Programao EMS 2.0


Maro/2006
Copyright 1998 DATASUL S.A. Todos os direitos reservados.
Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou
transmitida por qualquer meio eletrnico ou mecnico, na sua totalidade ou em
parte, sem a prvia autorizao escrita da DATASUL S.A., que reserva-se o
direito de efetuar alteraes sem aviso prvio. A DATASUL S.A no assume
nenhuma responsabilidade pelas conseqncias de quaisquer erros ou
inexatides que possam aparecer neste documento.
DATASUL S.A.
Av. Santos Dumont, 831, Joinville, SC, CEP 89.222-900
i

ndice

CAPTULO 1 Reviso do Dicionrio de Dados ....................................... 1


Construo do Dicionrio de Dados .............................................................. 2
Gatilhos do Dicionrio de Dados ................................................................... 3
Campos Livres ............................................................................................... 4
Validaes...................................................................................................... 4
Consideraes sobre o Dicionrio de Dados do Datasul-HR 1.00 ................ 5
CAPTULO 2 Estrutura de Diretrios ....................................................... 7
Datasul-EMS 2.0............................................................................................ 7
Datasul-HR 1.0 ............................................................................................ 12
CAPTULO 3 Nomenclatura .................................................................... 15
Sigla de bancos de dados ............................................................................. 15
Banco de Dados do Datasul-EMS 2.00 ................................................... 15
Banco de Dados do Datasul-HR 1.00 ...................................................... 15
Siglas de mdulos do produto...................................................................... 16
Mdulos do Datasul-EMS 2.00 ............................................................... 16
Mdulos do Datasul-HR 1.00 .................................................................. 17
Tipos de Atributos ....................................................................................... 17
Dump-name de tabelas ................................................................................ 18
Gatilhos do dicionrio de dados................................................................... 18
Programas .................................................................................................... 19
Includes ........................................................................................................ 20
Include com view-as de campos para o dicionrio de dados ................... 21
Includes de programas ............................................................................. 21
Includes padres ...................................................................................... 21
Widgets ........................................................................................................ 21
Variveis ...................................................................................................... 22
Datasul-EMS 2.00 ................................................................................... 22
ii

Datasul-HR 1.00 ...................................................................................... 22


Outros componentes da linguagem Progress ............................................... 22
Siglas de pases ............................................................................................ 23
Nomenclatura para Caixas de dilogos em programas de Zoom e
SmartBrowser .............................................................................................. 23
Adapters ....................................................................................................... 24
CAPTULO 4 Layout de Telas ................................................................. 25
Tipos de Telas (janelas) ............................................................................... 25
Janela Mestre ........................................................................................... 25
Janela Detalhe .......................................................................................... 25
Caixas de Dilogo .................................................................................... 25
Objetos ......................................................................................................... 26
Combo-boxes ........................................................................................... 26
Retngulos ............................................................................................... 26
Botes ...................................................................................................... 26
Fill-ins .................................................................................................... 26
Frames(Telas) .......................................................................................... 26
Radio-Sets ................................................................................................ 27
Editores .................................................................................................... 27
Consideraes sobre os SmartObjects ......................................................... 28
SmartBrowser .......................................................................................... 28
SmartViewer ............................................................................................ 28
SmartQuery .............................................................................................. 28
Consideraes sobre as Imagens .................................................................. 28
WebEnabler ............................................................................................. 28
CAPTULO 5 Estilos ................................................................................. 29
Cadastro Simples ......................................................................................... 29
Cadastro Complexo...................................................................................... 31
Quando utilizar o Cadastro Complexo ..................................................... 31
Cadastro Simples - Atualiza......................................................................... 32
Cadastro Complexo - Atualiza ..................................................................... 33
Pai x Filhos - Atualiza Filho ........................................................................ 34
Quando utilizar Pai x Filhos - Atualiza Filho .......................................... 34
Manuteno de Filhos .................................................................................. 35
Pai x Filhos - Atualiza Ambos ..................................................................... 36
Manuteno de Pais ..................................................................................... 37
Consulta Cadastral Simples ......................................................................... 38
Consulta Cadastral Complexa ...................................................................... 39
ndice iii

Consulta Relacionamento ............................................................................ 40


Relatrios, Clculos, Fechamentos .............................................................. 41
Parmetros nicos ....................................................................................... 45
Parmetros Mltiplos ................................................................................... 45
Formao ..................................................................................................... 46
Formao sem Navegao ........................................................................... 47
Importao ................................................................................................... 48
Exportao ................................................................................................... 50
Zoom de Tabelas.......................................................................................... 53
V Para ........................................................................................................ 54
Digitao Rpida ......................................................................................... 55
Painis .......................................................................................................... 55
Funes ........................................................................................................ 56
Relatrios Relacionados .......................................................................... 56
Consultas Relacionadas ........................................................................... 56
CAPTULO 6 Includes e Utilitrios Padro ............................................ 57
UT-FIELD.I ................................................................................................. 57
UT-RTLBL.I................................................................................................ 58
UT-RUN.I .................................................................................................... 58
UT-MSGS.P................................................................................................. 62
IND01-10.I, IND11-50.I E IND51500.I ...................................................... 64
UT-TABLE.I ............................................................................................... 65
UT-LITER.I ................................................................................................. 66
UT-LIMIT.P ................................................................................................ 67
UT-GLOB.I ................................................................................................. 67
I-FREEAC.I ................................................................................................. 67
UT-DIR.P .................................................................................................... 68
BTB917ZX.P ............................................................................................... 69
BTB917ZY.P ............................................................................................... 70
BTB917ZZ.P ............................................................................................... 71
UT-VRBIN.P ............................................................................................... 72
UT-FINFO.P ................................................................................................ 73
UT-CMDLN.P ............................................................................................. 73
UT-OSVER.P .............................................................................................. 74
I-COUNTDS.I ............................................................................................. 74
UT-WIN.I .................................................................................................... 75
UT-TRACE.P .............................................................................................. 78
iv

CAPTULO 7
Traduo ......................................................................................................... 80
TRADUO MONO-IDIOMAS ................................................................ 80
Traduo de variveis com view-as nas telas .............................................. 80
Espao Extra para traduo em relatrios .................................................... 85
TRADUO MULTI-IDIOMAS ............................................................... 86
Nomenclatura Padro e Caractersticas do modelo...................................... 86
Pontos de traduo ....................................................................................... 88
Contextos de traduo .................................................................................. 88
Itens de Traduo ......................................................................................... 89
Sequncia de busca ...................................................................................... 91
UT-TRCAMPOS.P ...................................................................................... 92
UT-TRFRRP.P ............................................................................................. 92
UT-LSTIT.P ................................................................................................. 93
UT-LITER.P ................................................................................................ 94
UT-MSGS.P ................................................................................................. 95
UT-FIELD.P ................................................................................................ 96
UT-TABLE.P ............................................................................................... 97
UT-LTMNU.P ............................................................................................. 97
OBJETOS PROGRESS NO-INDEXADOS ............................................. 99
Traduo de variveis com view-as nas telas .............................................. 99
Espao Extra para traduo em relatrios .................................................. 103
PRTICAS PARA IMPLEMENTAO MULTI-IDIOMAS ................. 104
Caso Prtico Diferenas LIST-ITEMS para LIST-ITEM-PAIRS ............. 104
Caso converso de List-items para LIST-ITEM-PAIRS ........................... 107
Traduo automtica em frame de relatrio .............................................. 108
Traduzir valor armazenado em uma varivel ............................................. 109
Tratando lista enorme de traduo em includes ......................................... 110
CAPTULO 8
Construo de Programas utilizando os Estilos e suas Tcnicas ......... 115
Como construir um Cadastro Simples ....................................................... 115
Como construir um Cadastro Complexo.................................................... 117
Como construir um Cadastro Pai X Filho - Atualiza Filho........................ 121
Como construir um Cadastro Inclui/Modifica Filho .................................. 125
Como construir um Cadastro Pai X Filho - Atualiza Ambos .................... 131
Como construir um Cadastro Inclui/Modifica Filho .................................. 135
Como construir um Cadastro Inclui/Modifica Pai ..................................... 139
Como construir um CustomBrowser Inclui/Modifica ............................... 142
Como construir um CustomBrowser Zoom Wizard .................................. 144
ndice v

Como construir uma Consulta Simples ..................................................... 148


Como construir uma Consulta Complexa .................................................. 150
Como construir uma Consulta Relacionamentos ....................................... 154
Como construir um programa de Relatrios .............................................. 157
Preparao do Relatrio - Interface ....................................................... 158
Pgina de Impresso .............................................................................. 160
Relatrios no formato RTF .................................................................... 161
Dicas para criao do Programa RP.P de Relatrio............................... 162
Preparando o Relatrio para Execuo no Mdulo JOB EXECUTION ... 168
Como construir um programa de Parmetros nicos ................................ 175
Como construir um programa de Formao .............................................. 176
Como construir um programa de Formao sem Navegao .................... 180
Seqncia ............................................................................................... 181
Como construir um programa de Importao ............................................ 183
Dicas Gerais ........................................................................................... 183
Preparao do programa ........................................................................ 184
Dicas para criao do Programa RP.P de Importao ........................... 186
Como construir um programa de Exportao ............................................ 189
Dicas Gerais ........................................................................................... 189
Preparao do programa ........................................................................ 189
Dicas para criao do Programa RP.P de Exportao ........................... 192
Como construir um programa de Pesquisa ................................................ 195
Como construir um programa "V Para" ................................................... 197
Como construir um programa de Digitao Rpida .................................. 198
Como construir um Browse de Digitao .............................................. 198
Como construir uma Query ....................................................................... 199
Como construir viewers ............................................................................. 200
Como definir viewer Padro .................................................................. 200
Como definir viewer sem campos de tabela: ......................................... 203
Como definir viewers s com campos chave: ....................................... 208
CAPTULO 9 Validaes ....................................................................... 214
Validaes de Tela ..................................................................................... 214
Validaes na Navegao de Registro ................................................... 214
Validaes Antes da Alterao .............................................................. 214
Validaes em Entrada de Dados .......................................................... 215
Validaes em Cadastro Simples........................................................... 215
Validaes em Cadastro Complexo ....................................................... 215
Validaes para Window Relatrio ....................................................... 216
Validaes em Triggers de Dicionrio de Dados ...................................... 216
vi

CAPTULO 10 Mensagens ....................................................................... 217


Regras para a criao de novas mensagens............................................ 219
Padres para traduo de mensagens para Ingls e Espanhol ................ 222
CAPTULO 11 Programas Reutilizveis ................................................. 223
Procedures Internas .................................................................................... 223
CAPTULO 12 Ferramentas ..................................................................... 225
Application Compiler ................................................................................ 225
Selecionar arquivos a serem compilados ............................................... 226
Eliminar e Modificar a lista de arquivos a serem compilados ............... 227
Opes de Compilao .......................................................................... 227
Iniciar Compilao................................................................................. 228
Roundtable ................................................................................................. 229
CAPTULO 13 APIs ................................................................................. 233
O que so APIs e como constru-las ......................................................... 233
Cdigo da API ....................................................................................... 237
Como documentar APIs ........................................................................... 238
Como implementar evolues de APIs .................................................... 239
UTAPI001.P .............................................................................................. 249
UTAPI002.P .............................................................................................. 249
UTAPI003.P .............................................................................................. 249
UTAPI004.P .............................................................................................. 250
UTAPI005.P .............................................................................................. 251
UTAPI006.P .............................................................................................. 253
UTAPI007.P .............................................................................................. 253
UTAPI008.P .............................................................................................. 253
UTAPI009.P .............................................................................................. 254
UTAPI010.P .............................................................................................. 254
UTAPI011.P .............................................................................................. 255
UTAPI012.P .............................................................................................. 255
UTAPI013.P .............................................................................................. 256
UTAPI018.P .............................................................................................. 256
UTAPI019.P .............................................................................................. 256
UTAPI027.P .............................................................................................. 257
UTAPI028.P .............................................................................................. 257
UTAPI029.P .............................................................................................. 257
APAPI009.P ............................................................................................... 258
Parmetros de Entrada ........................................................................... 258
ndice vii

Parmetros de Sada............................................................................... 259


Execuo................................................................................................ 259
CAPTULO 14 Portabilidade de RCODES .............................................. 261
Regras para Portabilidade de RCODE ....................................................... 261
Caso em Especial ....................................................................................... 262
CAPTULO 15 Tcnicas ........................................................................... 265
Como alterar o caracter de senha ............................................................... 265
Como alterar o diretrio corrente............................................................... 265
Como alterar ou criar uma varivel de ambiente ....................................... 266
Como dar foco a qualquer objeto............................................................... 267
Como deixar uma janela sempre visvel .................................................... 268
Como utilizar OCX .................................................................................... 268
Como executar um aplicativo do Windows ............................................... 289
Como implementar Correo Ortogrfica em Editores ............................. 290
Como obter as coordenadas do mouse ....................................................... 292
Como obter o diretrio corrente................................................................. 293
Como obter o diretrio de sistema do Windows........................................ 294
Como obter o diretrio do Windows ......................................................... 294
Como obter o nome do computador .......................................................... 295
Como obter o valor de uma varivel de ambiente ..................................... 296
Como transformar uma janela em barra de ferramentas ............................ 297
Como desabilitar Radio-Buttons................................................................ 298
Como executar programas que so janelas ................................................ 298
Como habilitar ou desabilitar botes em painis ....................................... 300
Como habilitar ou desabilitar botes especficos em Browse Inclui/Modifica
................................................................................................................... 301
Como implementar campos indicadores com view-as combo-box nas telas
................................................................................................................... 302
Como implementar campos indicadores com view-as radio-set nas telas . 304
Como implementar campos indicadores num SmartBrowser .................... 306
Como implementar labels em retngulos utilizando o dicionrio de dados
................................................................................................................... 307
Como implementar mensagens para o usurio .......................................... 308
Mensagem de Erro/Advertncia/Informao sem Parmetros .............. 308
Mensagem de Erro/Advertncia/Informao com Parmetros .............. 309
Mensagens com Questionamento ao Usurio ........................................ 309
Como implementar Tooltip em um determinado boto ............................. 310
Como implementar uma barra de progresso .............................................. 311
viii

Como implementar acompanhamento (UT-ACOMP) ............................... 313


Como implementar Zoom e campos de referncia para campos chave
estrangeira .................................................................................................. 315
Como implementar ThinZoom e campos de referncia para campos chave
estrangeira em SmartObjects ..................................................................... 319
Como imprimir campos editores nos relatrios ......................................... 323
Como totalizar colunas de um browse ....................................................... 324
Como adaptar a procedure pi-retorna-valor no Custom Browser Zoom
Wizard........................................................................................................ 325
Situaes necessrias ............................................................................. 325
Como implementar Parmetros de Impresso em Relatrios .................... 327
Impresso Pgina de Parmetros: .......................................................... 327
Formato de Impresso (80 colunas ou 132 colunas):............................. 329
Como implementar Boto de Filtro em Zoom ........................................... 331
Como implementar reposicionamento de registro com base nas variveis
globais ........................................................................................................ 331
Definio da Varivel Global ................................................................ 331
Reposicionamento Automtico do Browser de Zoom ............................... 333
Como validar campos em viewers diferentes ............................................ 334
Como construir gatilhos de dicionrios de dados ...................................... 336
Como implementar localizaes ................................................................ 338
Padronizao dos parmetros do progress.ini ............................................ 340
Como setar os modos de incluso (Simple/Multiple) ................................ 341
Como utilizar "functions" no UIB ............................................................. 342
Como verificar o registro de um OCX ....................................................... 343
Como construir um browse com ordenao por coluna ............................. 345
Mini-Flexibilizao .................................................................................... 347
Como registrar campo do tipo Fill-in para o WebEnabler ......................... 354
Como contar a quantidade de registros numa tabela.................................. 355
Como chamar um programa que janela a partir de uma transao ......... 356
Como descobrir se o EAI est habilitado ................................................... 357
Como enviar grficos ou documentos office para o WebEnabler.............. 357
Como migrar relatrios antigos para RTF ................................................. 358
Como converter consultas For Each para Send-SQL-Statement ............... 365
Utilitrio para Gerao de Comandos SQL ............................................... 370
Converso de Query em Frame para SmartQuery ..................................... 381
CAPTULO 16 Dicas de Desenvolvimento............................................. 383
Segurana de Banco x Objetos Dinmicos ................................................ 383
1

CAPTULO 1

Reviso do Dicionrio de Dados

Definio Antes do incio da converso de cada mdulo deve ser realizada uma reviso n
Dicionrio de Dados do MAGNUS verso 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 necessrios para limpar os campos do tipo char-1, dec-1,
int-1, etc...;
criar tabelas necessrias que hoje esto "camufladas" em arquivos
temporrios e/ou em tabelas no utilizadas;
para todos os campos que so indicadores, sejam de tipo de dado caracter
ou lgico, 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

implementar o view-as nos campos possveis. Exemplo: editor, radio-set, e


toggle-box;
substituir os campos do tipo "texto livre" por campos do tipo caracter
formato "x(15000)" view-as editor;
2

revisar os labels e column-labels dos campos para internacionalizao,


reservando espao extra para traduo;
as palavras que compem os labels e column-labels, quando no
abreviadas, devem ser acentuadas;
os labels no podem conter preposies (de, da, em ...) e pontuao (.;-);
a primeira letra de cada palavra, que compe o label ou col-label, deve ser
maiscula, as demais minsculas;
evitar column-labels com duas ou mais linhas;
sugesto: Incorporar no Field-Validation as validaes que esto no
formato de include. Exemplo: {inc/conta.fv};
Dump-Name das tabelas tem a nomenclatura: xx999, onde 'xx' a sigla do
banco conforme tabela abaixo, e 999 o nmero seqencial da tabela.
SIGLA BANCO
AD Administrativo
BH Bancos Histricos
CL Coletor de Dados
DI Distribuio
ED EDI
IN Industrial
IV Investimentos
MP MultiPlanta
PE Ponto Eletrnico
RH Recursos Humanos
UN Universal

Construo do Dicionrio de Dados


alterar o campo "CEP" nico para formato x(12) com parmetro global
formato-cep;
campo "Unidade da Federao" deve ter formato x(04);
campo "Condado(Bairro)" deve ter formato x(30);
campo "Endereo2" deve ter formato de x(40);
CAPTULO 1 Reviso do Dicionrio de Dados 3

campo "Nmero do Documento (do AP/CR)" para MAGNUS deve ter


como nomenclatura x(16);
campo "Srie do Documento" deve ter formato x(05);
os campos de "Conta + sub-conta" devem ter formato x(8) + x(8);
os campos de "Cdigos de Contribuio Fiscal (CGC, Inscrio Estadual,
etc ...)" devem ter como nomenclatura x(18);
campo "Cdigo do Item" deve ter formato x(16);
separar tudo que for especificados no Brasil em folder separados.
Exemplo: Cadastro de Cliente-Cdigo Febraban, Cacex ...;
na confeco de Relatrios evitar posicionamento de campos;
os indicadores comuns a vrias tabelas, na composio do seu nome
devem considerar o nome da tabela principal;
no existe o campo do cdigo da empresa nas telas, deve ser sempre
assumido a empresa do corrente usurio, que definida no menu, e est
disponvel na varivel global i-ep-cdigo-usurio;
em todas as tabelas, que representem pessoas fsicas ou jurdicas,
implementar o campo para endereo eletrnico da entidade: e-mail
formato 'x(40)' label "Internet E-Mail".

Gatilhos do Dicionrio de Dados


No Dicionrio de Dados, os seguintes itens devero ser obedecidos:
1. Todas as tabelas devero possuir os gatilhos de dicionrio de dados
CREATE, DELETE e WRITE mesmo que no possuam cdigo algum
para validao.
2. As triggers de WRITE e DELETE devero conter a chamada as includes
para EPCs em Gatilhos de Dicionrio de Dados.
3. Ao especificar caminhos, dever ser referenciado apenas o caminho
relativo, ou seja, a partir do diretrio de instalao do produto. O caracter
"\" (contra-barra) NO pode ser utilizado, devendo ser substitudo por "/"
(barra).
4. Todas devem ser overrideables (override = yes).
4

5. Todas devem ter o Check CRC = no.

Campos Livres
Em todas as tabelas dos bancos de dados do produto Datasul-EMS 2.0,
existem no mnimo 10 campos livres, sendo 2 de cada tipo de dado, conforme
tabela abaixo:
Campo Livre Tipo de Dado
char-1 Caracter
char-2
data-1 Data
data-2
dec-1 Decimal
dec-2
int-1 Inteiro
int-2
log-1 Lgico
log-2
Os antigos campos livres so para uso do cliente, como por exemplo, u-char-1,
u-livre-1, no so mais implementados nas tabelas.

Validaes
as validaes de campo simples permanecem no Field Validation
(VALEXP), no dicionrio de dados, entende-se por validaes simples
aquelas que dependam apenas do dado informado do prprio campo, no
fazendo referncia a outros campos da tabela. Exemplo: item.descrio-1
<> "";
todas as validaes, inclusive as constantes no Field Validation dos
campos atualizados na tela, devem ocorrer no momento de confirmao de
gravao (botes OK, Gravar, GO of frame);
normalmente, feita a validao em um destes locais, pi-validate, quando
existirem mais de uma viewer ou na local-assign-record, quando for
apenas uma;
no implementar qualquer validao no evento de leave dos campos;
CAPTULO 1 Reviso do Dicionrio de Dados 5

na SmartViewer retirar as validaes automticas do UIB, para chaves


estrangeiras, chamadas "XFTR-Foreing Keys";
todas as validaes de eliminao constantes no Delete Validation de uma
tabela no dicionrio de dados devem ser transferidas para o Delete Gatilho
desta tabela, assim o Delete Validation das tabelas fica vazio;
tambm podem ser transferidas para o Delete Gatilho as validaes de
eliminao que esto nos programas de eliminao pois antes, no eram
suportadas pelo Delete Validation.

Consideraes sobre o Dicionrio de Dados do Datasul-HR 1.00


a verso atual do Datasul-HR somente possui integrao com o produto
Datasul-EMS 2.00, e o controle do dicionrio de dados feito no DWB-
DDD;
Datasul-HR, pode acessar tabelas do banco MGUNI e neste caso, no se
deve cadastrar as tabelas do MGUNI no DWB-DDD, no sendo utilizado
o conceito do DWB de base externa, uma vez que no utilizado o
mdulo de construo de programas (DML) no DWB-DDD. O controle de
integridade referencial, nestes casos, feito manualmente nos gatilhos e
validaes;
todas as validaes do Datasul-HR so realizadas nos programas ou em
triggers de write das tabelas, no existem validaes no FIELD-
VALIDATION.
7

CAPTULO 2

Estrutura de Diretrios

Definio Este captulo relaciona e descreve os diretrios referentes ao Datasul-EMS 2.0


e o Datasul-HR 1.0.

Datasul-EMS 2.0
Diretrios Contedo
\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 mdulo Aplicaes e Emprstimos
\APP Programas do mdulo Contas a Pagar
\BCP Programas do mdulo Coleta de Dados
\BHP Programas do mdulo Bancos Histricos
\BSP Programas do mdulo Benefcios Sociais
\BTB Programas do mdulo Bsico
\CBP Programas do mdulo Caixa e Bancos
\CCP Programas do mdulo Compras
\CDP Programas do mdulo Cadastro
\CEP Programas do mdulo Controle de Estoque
\CFP Programas do mdulo Configurador Produto
\CLBRW Objetos Browsers do banco Coletor de Dados
8

\CLGO Objetos "V para" do banco Coletor de Dados


\CLINC Includes de campos indicadores do banco Coletor de
Dados
\CLQRY Objetos Queries do banco Coletor de Dados
\CLVWR Objetos Viewers do banco Coletor de Dados
\CLZOOM Zooms do banco Coletor de Dados
\CPP Programas do mdulo Controle da Produo
\CQP Programas do mdulo Controle de Qualidade
\CRP Programas do mdulo Contas a Receber
\CSP Programas do mdulo Custos
\DATABASE \DMAD Programas de Dump do banco MGADM
\DMCL Programas de Dump do banco MGLCD
\DMDI Programas de Dump do banco MGDIS
\DMIN Programas de Dump do banco MGIND
\DMIV Programas de Dump do banco MGINV
\DMMP Programas de Dump do banco MGMP
\DMPE Programas de Dump do banco MGPE
\DMRH Programas de Dump do banco MGRH
\DMUN Programas de Dump do banco MGUNI
\LDAD Programas de Dump do banco MGADM
\LDCL Programas de Dump do banco MGCLD
\LDDI Programas de Dump do banco MGDIS
\LDIN Programas de Dump do banco MGIND
\LDIV Programas de Dump do banco MGINV
\LDMP Programas de Dump do banco MGMP
\LDPE Programas de Dump do banco MGPE
\LDRH Programas de Dump do banco MGRH
\LDUN Programas de Dump do banco MGUNI
\TGAD \TAP Gatilhos de assign do banco MGADM
\TCP Gatilhos de create do banco MGADM
\TDP Gatilhos de delete do banco MGADM
\TFP Gatilhos de find do banco MGADM
\TWP Gatilhos de write do banco MGADM
\TGCL \TAP Gatilhos de assign do banco MGCLD
\TCP Gatilhos de create do banco MGCLD
\TDP Gatilhos de delete do banco MGCLD
CAPTULO 2 Estrutura de Diretrios 9

\TFP Gatilhos de find do banco MGCLD


\TWP Gatilhos de write do banco MGCLD
\TGDI \TAP Gatilhos de assign do banco MGDIS
\TCP Gatilhos de create do banco MGDIS
\TDP Gatilhos de delete do banco MGDIS
\TFP Gatilhos de find do banco MGDIS
\TWP Gatilhos de write do banco MGDIS
\TGIN \TAP Gatilhos de assign do banco MGIND
\TCP Gatilhos de create do banco MGIND
\TDP Gatilhos de delete do banco MGIND
\TFP Gatilhos de find do banco MGIND
\TWP Gatilhos de write do banco MGIND
\TGIV \TAP Gatilhos de assign do banco MGINV
\TCP Gatilhos de create do banco MGINV
\TDP Gatilhos de delete do banco MGINV
\TFP Gatilhos de find do banco MGINV
\TWP Gatilhos de write do banco MGINV
\TGPE \TAP Gatilhos de assign do banco MGPE
\TCP Gatilhos de create do banco MGPE
\TDP Gatilhos de delete do banco MGPE
\TFP Gatilhos de find do banco MGPE
\TWP Gatilhos de write do banco MGPE
\TGRH \TAP Gatilhos de assign do banco MGRH
\TCP Gatilhos de create do banco MGRH
\TDP Gatilhos de delete do banco MGRH
\TFP Gatilhos de find do banco MGRH
\TWP Gatilhos de write do banco MGRH
\TGUN \TAP Gatilhos de assign do banco MGUNI
\TCP Gatilhos de create do banco MGUNI
\TDP Gatilhos de delete do banco MGUNI
\TFP Gatilhos de find do banco MGUNI
\TWP Gatilhos de write do banco MGUNI
\DIBRW Objetos Browsers do banco Distribuio
\DIGO Objetos "V para" do banco Distribuio
\DIINC Includes de campos indicadores do banco Distribuio
\DIQRY Objetos Queries do banco Distribuio
10

\DIVWR Objetos Viewers do banco Distribuio


\DIZOOM Zooms do banco Distribuio
\DOC Mdulo Documentao
\DOCAPI Documentao de APIs
\DOCHLP Documentao dos mdulos em formato.hlp
\DOCRTF Documentao dos Manuais impressos (*.rtf)
\DPP Programas do mdulo de Desenvolvimento Produto
\ENP Programas do mdulo de Engenharia
\FCP Programas do mdulo de FASB/CMI
\FPP Programas do mdulo Folha de Pagamentos
\FRP Programas do mdulo Frias Rescises
\FTP Programas do mdulo Faturamento
\GEP Programas do mdulo Gerencial
\GRP Programas do mdulo Gerador Relatrios
\IMAGE Imagens
\IMGDIS Diretrio padro de imagens do Aplicativo
Distribuio
\IMGFIN Diretrio padro de imagens do Aplicativo Financeiro
\IMGHUR Diretrio padro de imagens do Aplicativo Recursos
Humanos
\IMGMAN Diretrio padro de imagens do Aplicativo
Manufatura
\IMGMAT Diretrio padro de imagens do Aplicativo Materiais
\IMGTEC Diretrio padro de imagens do Aplicativo
Tecnologia
\INBRW Objetos Browsers do banco Industrial
\INCLUDE Includes Padres
\INGO Objetos "V para" do banco Industrial
\ININC Includes de campos indicadores do banco Industrial
\INP Programas do mdulo Investimentos
\INQRY Objetos Queries do banco Industrial
\INTERFAC Arquivos de interfaces Produto com outros softwares
\INVWR Objetos Viewers do banco Industrial
\INZOOM Zooms do banco Industrial
\IVBRW Objetos Browsers do banco Investimentos
\IVGO Objetos "V para" do banco Investimentos
\IVINC Includes de campos indicadores do banco
CAPTULO 2 Estrutura de Diretrios 11

Investimentos
\IVQRY Objetos Queries do banco Investimentos
\IVVWR Objetos Viewers do banco Investimentos
\IVZOOM Zooms do banco Investimentos
\LAYOUT Layouts de Importao
\MASTERS Masters do SmartObjects
\MEN Mdulo Menu
\MIP Programas do mdulo Manuteno 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 mdulo MultiPlanta
\MPQRY Objetos Queries do banco MultiPlanta
\MPVWR Objetos Viewers do banco MultiPlanta
\MPZOOM Zooms do banco MultiPlanta
\OFP Programas do mdulo Obrigaes Fiscais
\PANEL Painis dos SmartObjects
\PCP Programas do mdulo Planejamento Capacidade
\PDP Programas do mdulo de Pedidos
\PEBRW Objetos Browsers do banco Ponto Eletrnico
\PEGO Objeto "V para" do banco Ponto Eletrnico
\PEINC Includes de campos indicadores do banco Ponto
Eletrnico
\PEP Programas do mdulo Ponto Eletrnico
\PEQRY Objetos Queries do banco Ponto Eletrnico
\PEVWR Objetos Viewers do banco Ponto Eletrnico
\PEZOOM Zooms do banco Ponto Eletrnico
\PIP Programas do mdulo Planejamento Manuteno
Industrial
\PLP Programas do mdulo Planejamento
\PMP Programas do mdulo Plano Mestre
\PTP Programas do mdulo Patrimnio
\PVP Programas do mdulo Previso de Vendas
\QOP Programas do mdulo Cotao de Vendas
\REP Programas do mdulo Recebimentos
\RHBRW Objetos Browsers do banco Recursos Humanos
12

\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 Aplicao
\SEC Mdulo Segurana
\SPOOL Diretrio default de destino dos Relatrios
\SPP Programas especiais dos mdulos (no ser expedido)
\SRC Includes Padres 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 Mdulo Universal
\UTP Programas Utilitrios
\VARINC Includes de variveis indicadores
\LOCAL Programas que possuem localizaes
\XXX Prefixo do Pas
\DATABASE Gatilhos do Banco de Dados do Pas

Datasul-HR 1.0
Diretrios Contedo
\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
CAPTULO 2 Estrutura de Diretrios 13

\TWP Gatilhos de write do banco MGPMG


\TGPY \TAP Gatilhos de assign do banco MGPYC
\TCP Gatilhos de create do banco MGPYC
\TDP Gatilhos de delete do banco MGPYC
\TFP Gatilhos de find do banco MGPYC
\TWP Gatilhos de write do banco MGPYC
\TGTM \TAP Gatilhos de assign do banco MGTMA
\TCP Gatilhos de create do banco MGTMA
\TDP Gatilhos de delete do banco MGTMA
\TFP Gatilhos de find do banco MGTMA
\TWP Gatilhos de write do banco MGTMA
\TGUN \TAP Gatilhos de assign do banco MGUNI
\TCP Gatilhos de create do banco MGUNI
\TDP Gatilhos de delete do banco MGUNI
\TFP Gatilhos de find do banco MGUNI
\TWP Gatilhos de write do banco MGUNI
\DOCAPI Documentao de APIs
\DOCHLP Documentao dos Mdulo em formato .hlp
\DOCRTF Documentao de Manuais Impressos (*.rtf)
\IMAGE Imagens
\IMGHUR Diretrio padro de imagens do Aplicativo Recursos
Humanos
\INCLUDE Includes Padres
\INTERFAC Arquivos de interfaces do Produto com outros softwares
\LAYOUT Layouts de importao
\MASTERS Masters do SmartObjects
\MEN Mdulo Menu
\OBJECT \SOPM \BRW Browsers do Banco MGPMG
DIALOG Filtros, narrativas, etc ... do Banco MGPMG
\QRY Objetos Queries do banco MGPMG
\GO Objetos "V para" do banco MGPMG
\VWR Objetos Viewers do banco MGPMG
\ZOOM Zoom do banco MGPMG
\SOPY \BRW Browsers do Banco MGPYC
DIALOG Filtros, narrativas, etc ... do Banco MGPYC
\QRY Objetos Queries do banco MGPYC
14

\GO Objetos "V para" do banco MGPYC


\VWR Objetos Viewers do banco MGPYC
\ZOOM Zoom do banco MGPYC
\SOTM \BRW Browsers do Banco MGTMA
DIALOG Filtros, narrativas, etc ... do Banco MGTMA
\QRY Objetos Queries do banco MGTMA
\GO Objetos "V para" do banco MGTMA
\VWR Objetos Viewers do banco MGTMA
\ZOOM Zoom do banco MGTMA
* \SOUN \BRW Browsers do Banco MGUNI
DIALOG Filtros, narrativas, etc ... do Banco MGUNI
\QRY Objetos Queries do banco MGUNI
\GO Objetos "V para" do banco MGUNI
\VWR Objetos Viewers do banco MGUNI
\ZOOM Zoom do banco MGUNI
\PANEL Painis dos SmartObjects
\PGHUR \ATP Programas do mdulo Administrao de Treinamento
\BSP Programas do mdulo Benefcios
\CAP Programas do mdulo Cargos e Salrios
\DSP Programas do mdulo Desenvolvimento de Pessoal
\FPP Programas do mdulo Folha de Pagamento
\FRP Programas do mdulo Frias e Rescises
\PEP Programas do mdulo Ponto Eletrnico
*\PRGTEC \BTB Mdulo Bsico
\DOC Mdulo Documentao
\MEN Mdulo Menu
\SEC Mdulo Segurana
\SCRIPTS Scripts de Carga da Aplicao
\SPOOL Diretrio default de destino dos Relatrios
\SRC Includes Padres PROGRESS
\SUPPORT Programas UIB customizados
\UTB Mdulo Universal
\UTP Programas Utilitrios
\VARINC Includes de variveis indicadores
* Diretrios em implementao
15

CAPTULO 3

Nomenclatura

Definio O objetivo deste captulo descrever as regras de nomenclatura para os


objetos dentro do Datasul-EMS 2.00 e Datasul-HR 1.00.

Sigla de bancos de dados


Descrio Para cada banco de dados do Datasul-EMS 2.00 e Datasul-HR 1.00, foi
determinada uma sigla de dois caracteres. Esta sigla serve para compor o
dump-name das tabelas, nome do diretrio de gatilhos, nome de objetos como
zoom e browsers.
Banco de Dados do Datasul-EMS 2.00

Banco Sigla Nome lgico


Administrativo AD MGADM
Coletor de Dados CL MGCLD
Distribuio DI MGDIS
Industrial IN MGIND
Investimentos IV MGINV
MultiPlanta MP MGMP
Ponto Eletrnico PE MGPE
Recursos Humanos RH MGRH
Universal UN MGUNI

Banco de Dados do Datasul-HR 1.00


No Datasul-HR 1.00 deve-se utilizar nomes e abreviaturas no idioma ingls.
Banco Sigla Nome lgico
16

Personal Management (Administrao de Pessoal) PM DTHRPMG


Payroll (Folha de Pagamento PY DTHRPYC
Time and Attendence (Controle de Freqncia) TA DTHRTMA
Universal (Universal) UN MGUNI

Siglas de mdulos do produto


Cada mdulo do produto possui uma sigla para ser utilizada na definio dos
nomes de seus programas e diretrios.
Mdulos do Datasul-EMS 2.00
Mdulo Sigla
Aplicaes e Emprstimos AE
Benefcios Sociais BS
Caixas e Bancos CB
Coleta de Dados BC
Coletor de Dados CL
Compras CC
Configurador Produto CF
Contabilidade CT
Contas a Pagar AP
Contas a Receber CR
Controle Contratos CN
Controle de Estoque CE
Controle de Produo CP
Controle de Qualidade CQ
Cotao de Vendas QO
Custos CS
Desenvolvimento Produto DP
EDI ED
Engenharia EN
FASB/CMI FC
Faturamento FT
Frias Rescises FR
Folha de Pagamento FP
Gerencial GE
CAPTULO 3 Nomenclatura 17

Investimentos IN
Manuteno Industrial MI
MultiPlanta MP
Obrigaes Fiscais OF
Patrimnio PT
Pedidos PD
Planejamento PL
Planejamento Capacidade PC
Planejamento Manuteno Industrial PI
Plano Mestre PM
Ponto Eletrnico PE
Recebimento RE
Recebimento Internacional RI

Mdulos do Datasul-HR 1.00

Mdulo Sigla
Administrao de Treinamento AT
Benefcios BS
Cargos e Salrios CA
Desenvolvimento de Pessoal DS
Frias e Rescises FR
Folha de Pagamento FP
Ponto Eletrnico PE

Tipos de Atributos
Tipos de Atributos so classificadores para os tipos de informaes que so
gravadas. Segue abaixo, uma lista de todos os tipos de atributos, descries e
tipos de dados.
Tipo Descrio Tipo de Dado Formato Default
cb1 Cdigo de Barra Tipo 1 Integer >>>>>>>9
cb2 Cdigo de Barra Tipo 2 Integer >>>>>>>>>>>9
cb3 Cdigo de Barra Tipo 3 Character X(20)
cdd Cdigo - Decimal Decimal >>>,>>>,>>9
cdn Cdigo - Numrico Integer >>>,>>9
cod Cdigo Character X(8)
18

dat Data Date 99/99/9999


des Descrio Character X(40)
dsl Descrio - Longa Character X(15000)
hra Hora Character 99:99:99
idi Indicador - Inteiro Integer 9
Img Imagem Character X(08)
log Lgico Logical Sim/No
mmp Memory pointer MenPtr X(8)
nom Nome Character X(30)
num Nmero 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 Vdeo 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
nmero seqencial 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 minsculas para a sigla da base de dados.
No existe processo automtico para determinar o nmero seqencial para a
tabela no banco de dados. Basta acrescentar uma unidade ao ltimo nmero j
utilizado.

Gatilhos do dicionrio de dados


Gatilho Nomenclatura Exemplos para a tabela "item"
CAPTULO 3 Nomenclatura 19

Create da tabela tcxx999.p1 database/tgint/tcp/tcin172.p


Delete da tabela tdxx999.p database/tgin/tdp/tdin172.p
Find da tabela tfxx999.p database/tgin/tfin172.p
Write da tabela twxx999.p database/tgin/twin172.p
Assign de campo TA999999.p2 database/tgin/tap/ta002242.p

Programas
A nomenclatura de um programa determinada em funo do seu tipo/estilo, e
a sua extenso .w, se possuir interface e .p, quando no. Entretanto dois
programas, mesmo se tiverem extenses diferentes, no podem ter o mesmo
nome de arquivo, porque na gerao do executvel .r, ambos tem o mesmo
nome do arquivo com extenso .r.
Todos os arquivos - sejam programas com extenso .p, includes com extenso
.i*, imagens, nomes de diretrios, etc., devero obedecer a regra imposta pelo
DOS para o seu nome, isto , o tamanho mximo do arquivo deve ter 8
caracteres e o tamanho mximo para a extenso deve ter 3 caracteres no
mximo.
Tambm, todos os nomes de arquivo dos programas devem estar em letras
minsculas.
Para os programas que so objetos (SmartObjects) e esto ligados a uma tabela
adota-se a nomenclatura abaixo:
Tipo do Objeto Diretrio destino Nomenclatura Exemplos para a tabela "item"
Browser xxbrw3 b99xx999.w4 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

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 padro, um nmero seqencial de campos em todo o Datasul-
EMS 2.0.
3
"xx" a sigla do banco de dados da tabela principal do objeto.
4
"99" um nmero seqencial de objetos de um determinado tipo para uma tabela e "xx999" e dump-name
desta tabela.
20

para os programas que esto ligados a um mdulo do Datasul-EMS 2.00,


sendo ento, containers ou programas .p, sem interface ou ainda APIs,
adota-se a nomenclatura abaixo, sendo que o diretrio destino do
programa sempre o diretrio do mdulo:
Tipo Nomenclatura Exemplos
API xxapi999.p cep/ceapi001.p
Container xx9999zz.w5 cep/ce0401.w
Subprograma de relatrio xx9999rp.p6 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 criao da numerao do nome do programa, conforme tabela
a seguir:
Numerao Tipo de Programas
0000 0099 Manutenes Cadastrais
0100 0199 Manutenes Gerais
0200 0299 Consultas Cadastrais
0300 0399 Consultas Complexas/Relacionamento
0400 0499 Listagens Cadastrais
0500 0699 Relatrios
0700 0799 Tarefas
0800 0899 Especiais/Grficos
0900 0999 Utilitrios
Os programas CADASTRAIS tem sempre uma numerao concordante,
conforme exemplo:
Cadastro: AT0017
Consulta: AT0217
Relatrio: AT0417.

Includes
Da mesma maneira que os programas, os includes, tambm, devem ter seus
nomes de arquivo em letras minsculas, e tambm, obedecem a algumas regras
5
"xx" indica a sigla do mdulo e "zz" caracteres de diferenciao entre programas e subprogramas.
6
Os caracteres "rp" so fixos para nomenclatura deste tipo de subprograma construdo atravs dos Estilos
relatrio e importao/exportao.
CAPTULO 3 Nomenclatura 21

de nomenclatura, conforme o objetivo do include. As extenses dos includes


devem ser sempre .i, i1, .i2, ... e .i9.
Include com view-as de campos para o dicionrio de dados
So includes que incorporam a definio do view-as de campos indicadores
com tipo de dado inteiro. Estes includes so fundamentais para a traduo do
produto.
Diretrio destino Nomenclatura Exemplos
varinc var99999.i7 varinc/var00002.i

Includes de programas
A nomenclatura destes includes dada em funo do seu grau de reutilizao:
Quando um include apenas utilizado por um mesmo programa/procedimento,
o nome deste include igual ao do programa, apenas com a extenso .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 vrios programas de um mesmo mdulo, o
nome deste include a sigla do mdulo mais um nmero seqencial,
geralmente acima de 9000. Exemplo: cep/ce9000.i.
Quando um include utilizado por vrios programas de vrios mdulos, o
nome deste include 'cd' mais um nmero seqencial. Exemplo:cdp/cd9500.i.
Includes padres
Os includes padres dos Estilos devem ser depositados no diretrio include, e
o seu nome de arquivo iniciar por "i-" mais um nome significativo, que indique
o estilo ou a funo. Exemplo: include/i-rpini.i.

Widgets
O padro de nomenclatura adotado um prefixo que identifique o widget mais
um nome significativo. A tabela de prefixo apresentada a seguir:
Widget Prefixo Exemplo
Boto bt- bt-ok
Browse br- br-zoom
Combo-box cb- cb-tipo-conta

7
"999999" um nmero seqencial de includes dentro do diretrio "varinc".
22

Fill-in fi- fi-texto


Radio-set rs- rs-modo-execucao
Retngulo rt- rt-moldura
Selection-list ls ls-estados
Slider sl sl-percentual
Toggle-box tb tb-ativo
Observao O padro para nome de retngulo no importante, pois dificilmente so
realizados tratamentos nos programas para este tipo de widget.

Variveis
Datasul-EMS 2.00
Quando uma varivel no for um widget o seu tipo de dados determina o
prefixo que deve ser utilizado para nomear as variveis, 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
Lgico l- l-ativo
Raw raw- raw-param
Rowid rw- rw-
Widget-handle wh- wh-botao

Datasul-HR 1.00
A nomenclatura de varivel 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 varivel V_cod_fornec

Outros componentes da linguagem Progress


Componente Prefixo Exemplo
Buffer de Tabela b- b-item
CAPTULO 3 Nomenclatura 23

Frame f- f-cad
Parmetro p- p-rw-emitente
Stream s- s-import
Temporarytable tt- tt-param

Siglas de pases
Siglas de trs letras seguindo padro internacional que utilizado para
designar objetos e diretrios criados para localizao dos produtos nos pases:
Pas Prefixo Pas Prefixo
frica do sul saf Guiana Francesa guf
Argentina arg Haiti hai
Bahamas bah Honduras hon
Barbados bar Jamaica jam
Belize bel Mxico mex
Bolvia bol Nicargua nic
Brasil bra Panam pan
Canad can Paraguai par
Chile chi Peru per
Colmbia col Porto Rico por
Costa-rica cos Repblica Dominicana rep
Cuba cub San Vicente vic
El Salvador sal Santa Lucia luc
Equador ecu Suriname sur
Estados Unidos usa Trinindad-Tobago tri
Granada gra Uruguai uru
Guatemala gua Venezuela ven
Guiana gui

Nomenclatura para Caixas de dilogos em programas de Zoom e


SmartBrowser
Principalmente, nos programas de Zoom (z99xx999), temos todas as posies
(oito) tomadas pelo prprio nome do arquivo. Nestes programas, quando
necessitamos janelas para filtros, narrativas, etc. No lemos como criar um
24

subprograma para o programa de Zoom. Nestes casos, estes subprogramas


devem ter a seguinte nomenclatura:
XX9NNN.W, onde:
XX - Sigla do Mdulo
9 - Fixo
NNN - Nmero seqencial dentro do Mdulo.
Estes subprogramas podem ser reutilizados.

Adapters
A estrutura de diretrios e o nome dos adapters devem ser definidos com o
seguinte padro:
Diretrios: adapters/[nome do parceiro]/[cicla do mdulo 3 dgitos].
Nome: a[sigla do parceiro - 2 dgitos][sigla mdulo - 2 dgitos][inteiro
seqencial - 3 nmeros].p
Exemplo: adapters/neogrid/ccp/anecc102.p - adapter Neogrid do mdulo de
compras
25

CAPTULO 4

Layout de Telas

Tipos de Telas (janelas)


Janela Mestre
So consideradas janelas mestre aquelas que so a base dos programas
chamados a partir do menu do Datasul-EMS 2.00, sendo que se caracterizam
pela existncia de um menu de barra, uma rgua de botes no topo da janela
que disponibilizam as funes existentes naquele programa, e possuem
moldura (resizeable).
Exemplo: Tela de um programa de cadastro.
Janela Detalhe
So consideradas janelas detalhe ou filhas aquelas que so chamadas a partir
de janelas mestre para realizao de funes de um programa. Estas janelas
no possuem menu de barra e a rgua de botes fica na parte de baixo da tela,
a idia simular a visualizao de um dialog-box.
Como diferenciao, no possuem moldura (resize = no).
Exemplo: Tela de um programa de zoom.
Caixas de Dilogo
Caixas de dilogo so utilizadas em funes onde imprescindvel que a
interface seja modal, normalmente em funes de grande risco aos sistemas.
Nestas caixas existe uma rgua de botes disposta na parte de baixo da caixa.
Exemplo: Programa de Clculo do Preo Mdio.
26

Observao No aconselhvel salvar uma Dialog com uma Window aberta. Quando isto
feito, possvel que o menu da Window seja copiado para a Dialog eliminando-o. Caso isto
acontea necessrio recriar a Dialog e o menu da Window.

Objetos
Combo-boxes
Ver captulo Como implementar campos indicadores com view-as combo-box
nas telas.
Retngulos
So 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.
Botes
os botes com label devem ter:
altura: 1,00 unidade de caracter;
largura: 10, 15 ou 20 unidades de caracter;
quando representarem aes e possurem labels estes termos devem ser
verbos no infinitivo. Exemplo: Cancelar, Incluir, Modificar, Eliminar ...;
boto 'OK' sempre confirma a ao e sai da tela corrente;
boto 'Cancelar' no confirma a ao e sai da tela corrente;
boto 'Ajuda' sempre disposto no canto inferior direito nas janelas
detalhe e caixas de dilogo;
os botes de 'Sair' e 'Ajuda' devem estar sempre no canto superior direito
nas janelas pai.
Fill-ins
os campos e variveis view-as fill-in devem ter altura de 0,88 unidade de
caracter, excepcionalmente, os campos e variveis view-as combo-box tem
a altura de 1,00 unidade de caracter.
Frames(Telas)
ttulo das telas feito a partir do UT-9000.i, no necessitando interveno
do programador;
CAPTULO 4 Layout de Telas 27

as telas podem ter no mximo 90 colunas, sendo que este tamanho


sempre fixo, por 17 linhas, j este tamanho pode ser varivel para menos,
mas sempre em nmero inteiro, estas dimenses acompanham o limite
para VGA. Estas dimenses devem ser informadas na "Property Sheet" da
janela no UIB, nos campos "Width" e "Height";
definida a altura e largura de uma janela, as mesmas dimenses devem ser
utilizadas para as propriedades MAX-WIDTH-CHARS e MIN-WIDTH-
CHARS (altura mxima e mnima) e MAX-HEIGHT-CHARS e MIN-
HEIGHT-CHARS (largura mxima e mnima) (isto deve ficar num include
padro). Com isso as janelas podem possuir a moldura dada pela
propriedade RESIZEABLE. O include WIN-SIZE.I faz estas atribuies.
Radio-Sets
no podem possuir label, devido limitaes do UIB, por isso devem ser
emoldurados por um retngulo com uma literal para identific-lo, que o
prprio label. Ver captulo: Como implementar labels em retngulos
utilizando o dicionrio de dados; Exemplo:

podem ser horizontais ou verticais, prevalecendo o modo vertical quando o


nmero de itens for maior que 4, sendo que maiores que 7 itens devem ser
combo-boxes.
Editores
no podem possuir label, devido ao UIB, ento quando a tabela possui
apenas um editor, que represente comentrio ou narrativa, no deve ser
colocado qualquer literal ou texto para identific-lo. Caso contrrio,
emoldur-lo com um retngulo e dispor uma literal para identific-lo;
em View-as Editor, deve-se no UIB, atribuir ou utilizar as seguintes
propriedades (Property Sheet): RETURN-INSERTED, e o fonte deve ser
escolhido o "2", padro do Progress, que um fonte fixo.
28

Consideraes sobre os SmartObjects


SmartBrowser
SmartBrowser um objeto Procedure que recupera e visualiza dados,
utilizando um browse. O nome padro do Browse no deve ser modificado.
Durante a montagem, o tamanho do SmartBrowser deve ser mantido padro
no importando o n. de campos.
SmartViewer
SmartViewer uma procedure object, o qual, visualiza os campos da base de
dados. Um SmartViewer tipicamente preenche registros da base de dados
desde um SmartQuery ou SmartBrowser.
O SmartViewer deve ter um distanciamento de uma linha aps e uma linha
antes de outros objetos na sua localizao.
SmartQuery
SmartQuery uma procedure object que contm uma base de dados query. Um
SmartQuery preenche tipicamente registros para outro SmartObjects, tal como
um SmartViewer ou SmartBrowser. Um SmartQuery pode tambm responder
a pedido de navegao de um SmartPanel.
Recomendaes Na tela de caractersticas da "Query Builder", em "Options", o campo
"Returned" deve ser alterado de "All Fields" para "Fields Used".
Observao: O identificador :T no incio de alguns comentrios, usado para a
traduo dos fontes dos templates para outros idiomas. Este identificador no
afeta em nada a funcionalidade do programa.

Consideraes sobre as Imagens


WebEnabler
WebEnabler um produto que disponibiliza o DATASUL EMS 2, EMS 5 e
HR atravs de um Web Browser, como o Internet Explorer. Assim sendo todos
as telas que utilizam imagens, normalmente no formato Bitmap (.bmp),
tambm devem possuir a mesma imagem, como mesmo nome no formato GIF
(.gif), pois o WebEnabler sendo um produto voltado para a Web s ir suportar
os padres da mesma quanto as imagens.
29

CAPTULO 5

Estilos

Cadastro Simples

Caractersticas todas as funes, com exceo do zoom e do 'v para', so realizadas na


prpria tela base do programa;
os campos devem estar alinhados pelo colon e formando colunas;
a tabulao deve ser de cima para baixo nos campos, passando por todos
os campos de uma coluna para depois passar para a outra coluna;
o menu de barra da janela contm todas as opes disponveis atravs dos
botes dispostos na tela;
30

novas funes, que no estejam contempladas na palette padro de


navegao e atualizao devem ser representadas por botes e itens no
menu de barra, quanto aos botes sugerido que sejam dispostos junto
rgua de botes no topo da janela (antes do boto de 'Consultas
Relacionadas');
no permitida a alterao da chave da tabela atravs da funo 'Alterar';
a funo 'Eliminar' deve pedir confirmao;
menu de barra tem a seguinte configurao:
Arquivo Ajuda
Primeiro Ctrl-Home Contedo
Anterior Ctrl-Left Sobre
Prximo Ctrl-Right
ltimo Ctrl-End
V Para Ctrl-T
Pesquisa Ctrl-F5
Incluir Ctrl-Ins
Copiar Ctrl-C
Alterar Ctrl-A
Eliminar Ctrl-Del
Desfazer Ctrl-U
Cancelar Ctrl-F4
Salvar Ctrl-S
Imprimir Ctrl-P
Sair Ctrl-X
CAPTULO 5 Estilos 31

Cadastro Complexo

Caractersticas menu de barra tem a mesma configurao demonstrada na tela de Cadastro


Simples. Possui porm, folders que permitem a utilizao de mais de uma
viewer.
Quando utilizar o Cadastro Complexo
deve ser usado sempre que o nmero de campos de uma tabela no
couberem em uma nica viewer.
32

Cadastro Simples - Atualiza

Caractersticas o menu de barra da janela contm apenas as opes para Atualizar, sem as
funes de 'Incluir', 'Copiar', 'Eliminar', como disposto no Cadastro
Simples.
CAPTULO 5 Estilos 33

Cadastro Complexo - Atualiza

Caractersticas tem as mesmas caractersticas do Cadastro Simples - Atualiza, porm


possui mais de uma viewer e est disposto em folders.
34

Pai x Filhos - Atualiza Filho

Caractersticas os campos devem estar alinhados pelo colon e formando colunas;


a tabulao deve ser de cima para baixo nos campos, passando por todos
os campos de uma coluna para depois passar para a outra coluna;
o menu de barra da janela contm todas as opes disponveis atravs dos
botes dispostos na tela;
novas funes, que no estejam contempladas no palette padro de
navegao e atualizao devem ser representadas por botes e itens no
menu de barra, quanto aos botes sugerido que sejam dispostos junto
rgua de botes no topo da janela (antes do boto de 'Consultas
Relacionadas');
o 'Folder' tem como objetivo, selecionar browsers de tabelas filho;
Incluir, Modificar e Eliminar serve apenas para manuteno da(s) tabela(s)
filho, as opes 'Incluir' e 'Modificar', chamam janelas semelhantes ao
Cadastro Simples ou Complexo (sem a rgua);
Quando utilizar Pai x Filhos - Atualiza Filho
feita a navegao na tabela pai e a manuteno executada somente no
campo selecionado da tabela filho, para modificao pode se selecionar
'Modificar' para abrir uma janela.
CAPTULO 5 Estilos 35

Manuteno de Filhos

Caractersticas uma janela sem painis, podendo possuir ou no folders de acordo com
a necessidade, chamada a partir de um programa Pai x Filho, a janela a
mesma tanto para incluso quanto para alterao;
a janela possui quatro botes: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o boto de 'Ok' tem funo igual tanto para chamada do programa, para
incluso, quanto para modificao;
o boto de 'Salvar', quando o programa chamado para incluso, possui
funo de salvar o registro corrente e criar um registro novo;
o boto 'Cancelar', anula qualquer mudana feita no registro corrente do
programa, ou seja, cancela apenas a ltima incluso ou a ltima alterao;
o boto 'Ajuda' responsvel por chamar o help do programa.
36

Pai x Filhos - Atualiza Ambos

Caratersticas tem as mesmas caractersticas da tela Pai x Filho - Atualiza Filho, alm de
que a atualizao no s feita no Folder como no registro pai;
o menu de barra da janela contm todas as opes disponveis atravs dos
botes dispostos na tela;
novas funes, que no estejam contempladas na palette padro de
navegao e atualizao, devem ser representadas por botes e itens no
menu de barra, quanto aos botes sugerido que sejam dispostos junto
rgua de botes no topo da janela (antes do boto de 'Consultas
Relacionadas');
Incluir, Modificar e Eliminar serve para manuteno da(s) tabela(s) filho;
as opes 'Incluir' e o 'Modificar', chamam janelas semelhantes ao
Cadastro Simples ou Complexo (sem a rgua);
Incluir, Modificar, Eliminar e Copiar serve apenas para manuteno da
tabela pai, as opes 'Incluir', 'Modificar' e 'Copiar, chamam janelas
semelhantes ao Cadastro Simples ou Complexo (sem a rgua).
CAPTULO 5 Estilos 37

Manuteno de Pais

Caratersticas uma janela sem painis, podendo possuir ou no folders, de acordo com
a necessidade, chamada a partir de um programa Pai x Filho, a janela a
mesma tanto para incluso quanto para alterao ou cpia;
a janela possui quatro botes: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o boto de 'Ok' tem funo igual tanto para chamada do programa, para
incluso, quanto para modificao;
o boto 'Salvar', quando o programa chamado para incluso, possui
funo de salvar o registro corrente e criar um registro novo;
o boto 'Ajuda' responsvel por chamar o help do programa.
38

Consulta Cadastral Simples

Caractersticas as funes com exceo do zoom e do 'V para', so realizadas na prpria


tela base do programa, apenas para consulta;
o menu de barra da janela contm as opes disponveis atravs dos botes
dispostos na tela.
CAPTULO 5 Estilos 39

Consulta Cadastral Complexa

Caractersticas alm das mesmas caractersticas da tela de Consulta Cadastral Simples,


tem um 'Folder', com o objetivo de selecionar as demais viewers da tabela;
as funes, com exceo do zoom e do 'V para', so realizadas na prpria
tela base do programa, apenas para Consulta;
o menu de barra da janela contm as opes disponveis atravs dos botes
dispostos na tela, alm do boto de 'Relacionamento'.
40

Consulta Relacionamento

Caractersticas o objetivo apresentar os relacionamentos de uma determinada tabela,


denominada tabela pai;
as funes de navegao, 'V para' e 'Pesquisa' se aplicam sobre a tabela
pai;
em cada pgina do folder apresentado um relacionamento (tabela filho)
da tabela, onde um browser apresenta os registros relacionados da tabela
filho com o corrente registro da tabela pai;
cada browser de apresentao dos relacionamentos deve possuir um boto
'Detalhar', cuja funo chamar a consulta cadastral da tabela filho,
posicionando-se no registro corrente no browser, o evento default-action
sobre estes browsers, representado por um duplo clique ou por um
pressionar na barra de espaos, um atalho para boto 'Detalhar';
acima do folder, isolados por um retngulo, ficam dispostos os principais
campos da tabela pai (normalmente, a chave primria e alguma descrio);
menu de barra da janela contm todas as opes disponveis na barra de
botes disposta no topo da tela.
CAPTULO 5 Estilos 41

Relatrios, Clculos, Fechamentos


42

Caractersticas uma janela do tipo detalhe, isto , sem menu de barra emoldura,
simulando uma caixa de dilogo;
o boto 'Executar' tem como funo executar toda a parametrizao
realizada nos Folders;
o 'Fechar' do frame sai da tela;
o boto 'Ajuda' responsvel por chamar o help do programa;
Seleo: tudo que faixa;
Classificao: Radio-se com as opes;
Parmetros: com exceo da faixa, as outras informaes que o usurio
digita;
Digitao: browse updatable.
A seguir, esto demonstrados os folders de Seleo, Classificao, Parmetros
e Digitao:
CAPTULO 5 Estilos 43
44
CAPTULO 5 Estilos 45

Parmetros nicos

Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
o default-button do frame o boto de 'Ok', que confirma a escolha do
usurio;
o cancel-button do frame o boto de 'Cancelar' que sai da tela;
o boto 'Imprimir' responsvel por chamar o browse dos relatrios
relacionados;
o boto 'Ajuda' responsvel por chamar o help do programa.

Parmetros Mltiplos
Seguir as mesmas regras dos Cadastros Simples ou Complexo, dependendo do
nmero de campos.
Exemplo: Parmetros por estabelecimento.
46

Formao

Caractersticas este estilo de formao possui o palette de navegao, portanto o programa


independente, no sendo necessrio um programa principal para sua
chamada;
os campos devem estar alinhados pelo colon e formando colunas;
o menu de barra da janela contm todas as opes disponveis atravs dos
botes dispostos na tela;
novas funes, que no estejam contempladas na palette padro de
navegao e atualizao devem estar representadas por botes e itens no
menu de barra, quanto aos botes sugerido que sejam dispostos junto
rgua de botes no topo da janela ao lado esquerdo do boto 'Consultas
Relacionadas';

o boto 'Incluir' , adiciona no Browse de formao os dados de


outras 2 tabelas;

o boto 'Deletar' , remove dados do Browse de formao;


o boto 'Modifica' chama o programa de atualizao dos atributos, que
uma janela semelhante ao Cadastro Simples ou Complexo (sem a rgua).
CAPTULO 5 Estilos 47

Formao sem Navegao

Caractersticas este estilo de formao no possui o palette de navegao, portanto o


programa dependente, sendo que ele deve ser chamado por um programa
que possua um Browser Formao;
os campos devem estar alinhados pelo colon e formando colunas;
menu de barra da janela contm todas as opes disponveis atravs dos
botes dispostos na tela;
novas funes, que no estejam contempladas na palette padro de
navegao e atualizao deve estar representadas por botes e itens no
menu de barra, quanto aos botes sugerido que sejam dispostos junto
rgua de botes no topo da janela ao lado esquerdo do boto 'Consultas
Relacionadas';

boto de 'Incluir' , adiciona no Browse de formao os dados de


outras 2 tabelas;

boto de 'Deletar' , remove dados do Browse de formao;


boto 'Modifica' chama o programa de atualizao dos atributos.
48

Importao

Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
o boto 'Executar' tem como funo disparar a importao que foi
parametrizada nos folders;
possui quatro folders: Layout, Seleo, Parmetros e Log;
no folder de "Layout" mostrado o layout do arquivo a ser importado;
o boto 'Editar Layout' permite que seja editado o arquivo de layout
atravs de um editor de texto;
no folder de "Seleo" determinada a faixa dos registros que so
importados;
no folder de "Parmetros" determinado o nome do arquivo de entrada
contendo registros a serem importados no formato do Layout;
na pgina de "Log" determinado o nome do arquivo de sada que deve
gerar uma lista com todos os registros que forem importados ou somente
os rejeitados, contm ainda a determinao do modo de execuo do
mesmo.
CAPTULO 5 Estilos 49

A seguir esto demonstrados os folders de Layout, Seleo e Parmetros:


50

Exportao

Caractersticas
CAPTULO 5 Estilos 51

uma janela do tipo detalhe, isto , sem menu de barra e moldura,


simulando uma caixa de dilogo;
o boto 'Executar' tem como funo disparar a exportao que foi
parametrizada nos folders;
possui quatro folders: Layout, Seleo, Parmetros e Log;
no folder de Layout mostrado o layout do arquivo a ser exportado;
o boto 'Editar Layout' permite que seja editado o arquivo de layout
atravs de um editor de texto;
no folder de "Seleo" determinada a faixa dos registros que sero
exportados;
no folder de "Parmetros" determinado o nome do arquivo de sada que
exportado no formato do Layout;
a pgina de "Log" contm a determinao de modo de execuo do
mesmo.
A seguir so mostrados os folders de Layout, Seleo e Parmetros:
52
CAPTULO 5 Estilos 53

Zoom de Tabelas

Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
default-button do frame o boto de 'OK', que confirma a escolha do
usurio;
cancel-button do frame o boto de 'Cancelar' que sai da tela, retornando
ao programa chamador porm sem retornar um registro escolhido;
o boto 'Implantar' responsvel por chamar o programa de cadastro da
tabela, que pode estar desativado dependendo do programa chamador;
ao lado do boto 'Implantar' que padro, devem ser colocados os botes
especficos de cada programa de zoom, por exemplo: Narrativa, Filtro,
Texto Livre, etc..., normalmente estes botes chamam caixas de dilogo;

o boto responsvel pela aplicao do valor inicial e final definido


pelo usurio sobre a query apresentada no browse;
cada folder representa uma opo de classificao disponvel no zoom;
54

os iniciais e finais devem ser apresentados no formato, independentemente


do nmero de campos para a faixa:

Label do campo: [valor inicial] ............... [valor final].


no devem ser utilizadas literais em tela para denominar inicial e final.
Observao Verificar se cada folder tem um browser diferente ou no, se isto for necessrio
inverter a ordem dos campos, conforme a classificao.
O Zoom no tem os botes de INCIO e de FIM (como no MAGNUS antigo), logo se utiliza o
teclado: "HOME" e "END", para substituir as caractersticas destas funes.

para utilizar o 'Pesquisa', usar o para acessar.

V Para

Caractersticas o objetivo permitir um reposicionamento rpido do registro corrente no


cadastro, quando o usurio tem o conhecimento da chave do registro,
evitando que o usurio tenha que navegar sobre os registros ou acionar o
zoom;
aberta uma pequena caixa de dilogo com os botes de 'Ok' e 'Cancelar' e
'Ajuda', sendo que o boto de 'Ok' o default-button, o que possibilita ao
usurio digitar a chave e apenas teclar "Enter" para confirmar a tela;
no tem possibilidade zoom;
para utilizar esta tabela, usar o para acess-la.
Observao No aconselhvel salvar uma Dialog com uma Window aberta. Quando isto
feito, possvel que o menu da Window seja copiado para a Dialog eliminando-o. Caso isto
acontea necessrio recriar a Dialog e o menu da Window.
CAPTULO 5 Estilos 55

Digitao Rpida

Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
default-button do frame o boto 'Ok', que efetiva a transao;
cancel-button do frame o boto 'Cancelar' que sai da tela sem considerar
as informaes;
as pginas iniciais so reservadas para as informaes genricas;
a ltima pgina reservada para o browser.

Painis

Estes so os painis padro mais utilizados para navegao.


56

Funes
Relatrios Relacionados

Caractersticas chama um Browser que lista todos os relatrios relacionados ao programa


que est sendo executado;
o boto 'Executar', chama o relatrio selecionado no browser.

Para utilizar a funo de "Relatrios Relacionados", usar o para acessar.


Consultas Relacionadas

Caractersticas chama um Browser que lista todas as consultas relacionadas ao programa


que est sendo executado;
o boto 'Executar', chama a consulta selecionada no browser.

Para utilizar a funo de "Consultas Relacionadas", usar o para acessar.


57

CAPTULO 6

Includes e Utilitrios Padro

UT-FIELD.I
Objetivo Retornar propriedades dos campos do dicionrio de dados, como label,
column-label, etc..
{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}
Utilizao
Onde:
<banco>: nome lgico do banco de dados que contm o campo
<tabela>: nome da tabela que contm o campo
<campo>: nome do campo
<propriedade>: nmero que identifica a propriedade conforme tabela a seguir:
Nmero Propriedade
1 Label
2 Column-Label
3 Help
4 Format
5 Initial
6 Description
7 Data Type

O retorno obtido atravs do return-value. Exemplo:


def var c-tipo as character no-undo.
{utp/ut-field.i mgadm conta tipo 1}
58

assign c-tipo:label in browse br-table = return-value.

UT-RTLBL.I
Objetivo Permitir a utilizao de literais para colar labels em retngulos na tela
minimizando os problemas de internacionalizao.
Utilizao campos view-as radio-set ou editor, onde seja necessrio emoldur-lo com
retngulo com um label para identific-lo;
literais utilizados em telas para substituir labels;
{utp/ut-rtlbl.i <banco> <tabela> <campo> <widget fill-in>}
Formato
Onde:
<banco>: nome lgico do banco de dados que contm o campo
<tabela>: nome da tabela que contm 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
Objetivo Seu objetivo executar programas que no possuam interface (.p), atravs do
recurso de RPC (Remote Procedure Call). Deve executar apenas programas
(.p), chamados a partir de programas (.w). No deve chamar um programa (.p),
a partir de um outro programa (.p), como por exemplo um programa de
impresso de relatrios xxp/xx9999rp.p, porque o programa chamador (.p), j
est rodando no servidor (Application Server) e no necessrio iniciar um
novo servidor.
Utilizao 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 necessrio relacionar ao programa os includes {utp/ut-glob.i} e
{btb/btb008za.io} no main-block, para definio de variveis e funes.

Formato Para a chamada de rotinas via RPC, tem-se:


Modelo Simplificado
Include
CAPTULO 6 Includes e Utilitrios Padro 59

{utp/ut-run.i {1} {2} {3} {4}}

Onde:
{1}: nome externo do programa
{2}: parmetros do programa
{3}:mostra mensagem de acompanhamento [Opcional]
{4}: servidor de RPC determinado [Opcional]
Nota Para informar parmetros em branco ou literal, utilize aspas duplas ("") com aspas
simples (''). Exemplo: "" ' '.
No sendo informados os parmetros opcionais estes recebero "yes" e "" ' ' respectivamente.

Funes
solicita a conexo e cria a instncia do servidor, conforme servidor do
aplicativo ou parmetro;
mostra mensagem se ocorrer um erro (por exemplo, de conexo), quando
solicitada ({3} = yes);
dispara a execuo do programa no servidor;
encerra a conexo e elimina a instncia.
Aplicaes
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:
60

{1} = nome externo do programa


{2} = parmetros do programa
{3} = nome da varivel do tipo "handle" para executar o programa persistente
[Opcional]
{btb/btb008za.i3 {1} {2}}

Onde:
{1} = nome externo do programa
{2} = nome da varivel do tipo "handle" utilizada para eliminar a procedure
persistente [Opcional]
Funes
Idnticas ao Modelo Simplificado, porm distribudas em trs includes:
solicita a conexo e cria a instncia do servidor;
dispara a execuo do programa;
encerra a conexo e elimina a instncia.
Aplicaes
Quando o programa API disparado n vezes dentro de um lao (repeat, for
each...).
def var h-handle as handle no-undo.
Exemplo
{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 funes que podem ser utilizadas no
desenvolvimento.

Consideraes Caso no seja informado nenhum servidor RPC, ser utilizado o servidor RPC
Gerais definido no aplicativo do programa;
Se o processo estiver sendo executado via RPW e o servidor RPC no foi
informado o programa ser executado On-line.
CAPTULO 6 Includes e Utilitrios Padro 61

Quando informado valor parar servidor RPC, caso ocorra algum erro no ser
possvel a execuo On-line.
Ocorrendo erros na tentativa de execuo do programa (faltou passar
parmetros, por exemplo), estes sero retornados juntamente com a mensagem
16435 (*).
Quando for informada a varivel do tipo "handle" para a include
btb/btb008za.i2, deve-se tomar dois cuidados: Primeiro, esta varivel deve
estar previamente definida no programa. E segundo, ao final da execuo,
deve-se eliminar o programa persistent passando o nome da varivel para a
include btb008za.i3.
Existe a API que transporta o contedo das variveis de ambiente do
Datasul_EMS da sesso client para a sesso do application server (remota)
quando o programa solicita a execuo de determinado programa via RPC
(Remote Procedure Call). Logo, as informaes como usurio corrente, grupos
de segurana em que o usurio se encontra, empresa do usurio... estaro
disponveis na sesso remota.
Dados:
Nome Programa: btb/btb923za.p
Sintaxe: run btb/btb923za.p
(<verso_integrao>, <handle_application_server>)
Parmetros X Programa Servidor RPC Mensagem Comportamento
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 No 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 No Informado e Yes Exibe mensagem 16432(*) via
RPC =yes Inexistente PIA_STATUS_ERROR.
Existe e Executa No Informado e No Executa ON_LINE
62

RPC =yes Inexistente


Existe e Executa Informado, No Retorna mensagem 16434(*)
RPC =yes Existe e No
disponvel
Existe e Executa No Informado, Yes Exibe as mensagens 16434(*) via
RPC =yes Existe e No PI_STATUS_ERROR
disponvel
Existe e Executa No Informado, No Executa ON-LINE
RPC =yes Existe e No
disponvel
Existe e Executa Informado, Yes Executa via RPC (**)
RPC =yes Existe e
Disponvel
Existe e Executa Informado, No Executa via RPC (***)
RPC =yes Existe e
Disponvel
Existe e Executa No Informado, Yes Executa via RPC (**)
RPC =yes Existe e
Disponvel
Existe e Executa No Informado, No Executa VIA RPC
RPC =yes Existe e
Disponvel
Observao Ocorrendo erro na conexo
do Servidor RPC, ser executado ON-LINE

(*) Mensagens:
3045 - Programa no cadastrado no menu !
6160 - No foi possvel executar o programa via RPC !
16431 - Programa no pode ser executado via RPC
16432 - No foi possvel encontrar servidor RPC para programa '&1' !
16433 - Servidor RPC no cadastrado
16434 - Servidor RPC no disponvel
164 35 - No foi possvel executar programa !
(**) Ocorrendo erros na conexo do servidor RPC, estes sero exibidos em
tela juntamente com a mensagem 6160.
(***) Ocorrendo erros na conexo do servidor RPC, estes sero retornados
juntamente com a mensagem 6160.

UT-MSGS.P
Objetivo
CAPTULO 6 Includes e Utilitrios Padro 63

Apresentar para o usurio uma mensagem previamente cadastrada, no Sistema


de Mensagens, ou ainda, retornar para o programa propriedades desta
mensagem.
Notas:
ao ser exibida uma mensagem, seu nmero vai ser exibido na barra de ttulo da caixa de
dilogo, juntamente com o tipo de mensagem. Ex.: Pergunta: (10);
antes da exibio de qualquer mensagem, ser verificado se ela possui uma substituta, se
houver, a mensagem substituta ser exibida ao invs da original. Da mesma forma, antes da
exibio da mensagem substituta, ser verificado se esta tambm, possui uma mensagem
substituta e assim por diante;
quando da exibio de mensagens substitutas, os nmeros da mensagem original e da
mensagem substituta sero exibidos na barra de ttulos da caixa de dilogo. Exemplo:
Advertncia: (134) - (354), onde 134 seria a mensagem exibida e 354 a mensagem original.

Utilizao apresentao de mensagens de erro, informao, advertncia ou


questionamentos ao usurio;
impresso de mensagens em logs.
apresentao da pilha de execuo dos programas at o ponto de chamada
da ut-msgs, atravs do boto trace.
run utp/ut-msgs.p (input <ao>
Formato
input <nmero da mensagem>
input <parmetros>).

Onde:
<ao>: ao desejada, conforme a tabela a seguir:
Ao Resultado
show Apresenta a mensagem, com texto de ajuda no padro do produto
msg Retorna o texto da mensagem
help Retorna o texto de ajuda
type Retorna o tipo da mensagem (Erro, Advertncia, Informao ou Questo)
codtype Retorna o cdigo do tipo da mensagem
<nmero da mensagem>: nmero da mensagem desejada.
<parmetros>: so os campos, tabelas e outras palavras que se deseja colocar
na mensagem no momento de sua utilizao. Cada um dos parmetros deve ser
separado por "~~" como por exemplo:
input "campo~~" + varivel + "~~tabela".
64

run utp/ut-msgs.p (input "show",


Exemplo input 1235,
input repres.cod-repres + "~~" +
regiao.cod-regiao + "~~" +
string(regiao.val-minimo).

Observaes A manuteno do cadastro das mensagens, assim como a incluso de novas


mensagens s pode ser realizada pela Datasul. Para clientes e parceiros
autorizada somente a utilizao das mensagens j cadastradas. Para acessar o
Sistema de Mensagens, voc deve primeiro entrar em contato com a equipe de
ADF e solicitar a criao de um usurio no Sistema de Mensagens. Em
seguida voc pode acessar o Sistema pelo endereo:
X:\Atalhos\SistTec\Mensagem.
Quando a opo codtype usada o retorno pode ser:
0. Mensagem no Cadastrada.
1. Mensagem de Erro.
2. Mensagem de Advertncia
3. Pergunta
4. Informao

IND01-10.I, IND11-50.I E IND51500.I


Objetivo Viabilizar a utilizao de combo-boxes e radio-sets com representao para
campos inteiros do tipo indicador.
Utilizao Nos includes de dicionrio de dados criados para cada campo indicador.
{include/ind01-10.i {1} {2}}
Formato
Onde:
{1}: indica a funo a ser realizada, conforme tabela abaixo:
Funo Objetivo
01 define view-as combo-box
02 define view-as radio-set
03 lista com os itens separados por vrgula
04 n Retorna o item n da lista
05 Retorna o nmero de itens da lista
06 item retorna a posio do item (nmero)
CAPTULO 6 Includes e Utilitrios Padro 65

07 retorna valores para a propriedade radio-buttons


{2}: utilizado quando a funo necessita de um segundo parmetro, isto , nas
opes 04 e 06.
Exemplo /******************************
* Include: i01un001.i
* Campo: tipo-cod-situacao
*******************************/
{include/i-lgcode.i}
&IF "{&LANGUAGE-CODE}" = "POR" &THEN
&global val1 Erro
&global val2 Advertncia
&global val3 Pergunta
&global val4 Informao
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ESP" &THEN
&global val1 Erro
&global val2 Advertencia
&global val3 Pregunta
&global val4 Informacin
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&global val1 Error
&global val2 Warning
&global val3 Question
&global val4 Information
&ENDIF
{include/ind01-10.i {01} {02}}
/* Fim */

UT-TABLE.I
Objetivo Retornar propriedades das tabelas do dicionrio de dados.
Utilizao nos SmartBrowsers ou Browsers para por label em campos calculados;
para utilizao de literais ou textos nas telas com funo de label, como no
retngulo que envolve o radio-set.
{utp/ut-table.i <banco> <tabela> <propriedade>}
Formato
Onde:
66

<banco>: nome lgico do banco de dados que contm o campo


<tabela>: nome da tabela que contm o campo
<propriedade>: nmero que identifica a propriedade conforme tabela abaixo:
Nmero Propriedade
1 File-Label
2 Dump_Name
3 Desc
O retorno obtido atravs do return-value. Exemplo:
def var c-tipo as character no-undo.
{utp/ut-table.i mgadm conta 1}
assign c-tipo:label in browse br-table = return-value.

UT-LITER.I
Objetivo Utilizar o cadastro de literais do Datasul-EMS, cadastrando automaticamente
as literais utilizadas no programa e retornando a traduo da literal no idioma
corrente do banco de dados.
Utilizao em todos os lugares onde literais passveis de traduo forem apresentadas
na interface do programa.
{utp/ut-liter.i <literal> <modulo contexto> <alinhamento>}
Formato
Onde:
<literal>: Literal a ser utilizada na tela com os espaos substitudos por "_"
(undescore)
<mdulo contexto>: parmetro opcional que define o contexto de traduo da
literal, este contexto um mdulo do Datasul-EMS, se omitido a literal deve
ter o contexto universal de traduo, que representado pelo valor *
(asterisco)
<alinhamento>: parmetro opcional que define onde incrementado o espao
extra para traduo, conforme tabela abaixo, se omitido deve reservar o espao
esquerda da literal:
Tipo Alinhamento
L A esquerda
C Centralizado
R A direita
O retorno obtido atravs do return-value. Exemplo:
CAPTULO 6 Includes e Utilitrios Padro 67

def var l-lista-narra as character no-undo.


{utp/ut-liter.i Lista_Narrativa MCE R}
assign l-lista-narra:label in frame {&frame-name} =
return-value.

UT-LIMIT.P
Objetivo Determinar o valor inicial e final de campos caracter, cujo formato varivel,
como por exemplo a conta-contbil.
Utilizao Na seleo de relatrios, clculos, atualizaes e zooms que tenham faixas de
seleo sobre campos caracter com formato varivel.
run utp/ut-limit.p (input <opo>,
Formato
<formato>).

Onde:
<opo>: indica o limite desejado, MIN = Mnimo e MAX = Mximo
<formato>: formato do campo caracter
O retorno obtido atravs do return-value.
Exemplo 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
Objetivo Define as variveis globais.
Formato J est definido dentro dos SmartObjects.
Exemplo de i-ep-codigo-usuario: contm a empresa corrente do usurio.
variveis definidas l-implanta: varivel lgica usada no Zoom, para habilitar o boto implanta.
c-seg-usuario: contm o nome do usurio corrente logado no menu.

I-FREEAC.I
Objetivo
68

Converter strings acentuadas e caracteres especiais para strings no acentuadas


e caracteres simples.
Utilizao nos Templates de Relatrio, Importao, Exportao e em pontos
especficos que necessitem que a sada de dados (impressora/arquivo/tela)
seja feita sem acentuao;
{include/i-freeac.i}
Formato
assign <varivel> = fn-free-accent("<string>").
display fn-free-accent("<string>").

Onde:
<varivel>: varivel que ir armazenar o valor do retorno da funo fn-free-
accent
<string>: string acentuada a ser convertida.
{include/i-freeac.i}
Exemplo define var c-texto as char no-undo.
assign c-texto = fn-free-accent ("------
-").
message fn-free-accent("--~---yy--")
chr(10) c-texto view-as alert-box.

UT-DIR.P
Objetivo Este utilitrio deve ser usado sempre que o usurio tiver que informar um
diretrio.
run utp/ut-dir.p (input <ttulo>,
Formato output <pasta>,
output <cancelado>).

Onde:
<ttulo>: ttulo para a caixa de dilogo para selecionar diretrios
<pasta>: varivel do tipo caracter onde ser retornada a pasta selecionada
<cancelado>: uma varivel do tipo lgica onde deve ser retornado se a caixa
de dilogo foi cancelada ou no
Exemplo:
run utp/ut-dir.p (input "Escolha um diretrio",
output <pasta>,
output <cancelado>).

Onde:
CAPTULO 6 Includes e Utilitrios Padro 69

<ttulo>: ttulo para a caixa de dilogo para selecionar diretrios


<pasta>: varivel do tipo caracter onde ser retornada a pasta selecionada
<cancelado>: uma varivel do tipo lgica onde deve retornado se a caixa de
dilogo foi cancelada ou no
Exemplo:
run utp/ut-dir.p (input "Escolha um diretrio,
output pasta,
output cancelado).

BTB917ZX.P
Objetivo Permitir a execuo de sons do tipo MID e WAV.
Instalao Como este programa utiliza os recursos de OCX, preciso que este OCX
esteja registrado e instalado na mquina que deve ser utilizado. Para fazer esta
instalao proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretrio \INTERFAC\SOM\;
clicar no boto de 'OK', quando for solicitado;

clicar no boto ;
clicar em 'Ok' para terminar.
run btb/btb917zx.p (input <som>).
Formato
70

Onde:
<som>: caminho completo do arquivo de som a ser executado
Exemplo:
run btb/btb917zx.p (input "c:\windows\media\start.wav").

BTB917ZY.P
Objetivo Permitir a visualizao 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 restrio do WebEnabler
Instalao Como este programa utiliza os recursos de OCX, preciso que este OCX
esteja registrado e instalado na mquina que deve ser utilizado. Para fazer esta
instalao proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretrio
\INTERFAC\IMAGEM\;
clicar no boto de 'Ok', quando for solicitado;

clicar no boto: ;
clicar em 'Ok', para terminar.
run btb/btb917zy.p (input <imagem>).
Formato
Onde:
<imagem>: caminho completo da imagem a ser visualizada
Exemplo:
run btb/btb917zy.p (input "c:\windows\egito.bmp").
CAPTULO 6 Includes e Utilitrios Padro 71

BTB917ZZ.P
Objetivo Permitir a visualizao de vdeos do tipo AVI.
Instalao Como este programa utiliza os recursos de OCX, preciso que este OCX
esteja registrado e instalado na mquina que deve ser utilizado. Para fazer esta
instalao proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretrio
\INTERFAC\VIDEO\DISK1;
clicar no boto de 'Ok', quando for solicitado;

clicar no boto: ;
clicar em 'Ok', para terminar.
run btb/btb917zz.p (input <video>)
Formato
Onde:
<vdeo>: caminho completo do vdeo a ser apresentado
Exemplo:
72

run btb/btb917zz.p (input "c:\windows\help\explorer.avi").

UT-VRBIN.P
Objetivo Este utilitrio pode ser usado sempre que for necessrio saber a verso de um
programa compilado (.R).
run utp/ut-vrbin.p (input <arquivo>,
Formato input <acomp>,
output <versao>).

Onde:
<arquivo>: varivel do tipo caracter que ir conter o nome do arquivo
compilado a ser analisado
<acomp>: varivel do tipo lgica que ir definir se a pesquisa deve apresentar
a tela de acompanhamento ou no
<versao>: varivel do tipo caracter que ir receber a verso do programa
passado como parmetro
Exemplo:
run utp/ut-vrbin.p (input "c:\tmp\cd0101.r",
input no,
output c-versao).

Observaes programa s conseguir buscar a verso dos programas que foram


construdos conforme os padres de desenvolvimento da Datasul S.A. e
que utilizem as Tcnicas e Templates do Datasul-EMS 2.0;
a tela de acompanhamento deixa o programa sensivelmente mais lento,
pois faz interaes com tela, mas em compensao, deixa o usurio
informado do que est ocorrendo naquele momento;
se o retorno da verso for "?", o programa no conseguiu obter a verso.
Os principais motivos disto so:
CAPTULO 6 Includes e Utilitrios Padro 73

programa a ser pesquisado no for encontrado;


programa no est dentro das tcnicas e templates do Datasul-EMS
2.0;
programa no possui a verso internamente.

UT-FINFO.P
Objetivo Este utilitrio pode ser usado sempre que for necessrio saber a data, a hora ou
o tamanho de um arquivo no Windows.
run utp/ut-finfo.p (input <arquivo>,
Formato
output <data>,
output <hora>,
output <tamanho>).

Onde:
<arquivo>: varivel do tipo caracter que deve conter o nome do arquivo a ser
analisado
<data>: varivel do tipo data que deve receber a data do arquivo que est
sendo analisado
<hora>: varivel do tipo caracter que deve receber a hora do arquivo que est
sendo analisado
<tamanho>: varivel do tipo inteira que deve receber o tamanho do arquivo
que est sendo analisado
Exemplo run utp/ut-finfo.p (input "c:\autoexec.bat",
output d-data,
output c-hora,
output i-tam).

Observaes Caso o programa no se encontra, o utilitrio ir retornar "?", na data e


"00:00:00", na hora.

UT-CMDLN.P
Objetivo Este utilitrio pode ser usado sempre que for necessrio saber informaes
mais detalhadas sobre a linha de comando usada para abrir a sesso corrente.
Esta funo pode ser muito til quando se deseja obter os valores dos
parmetros da sesso (ini, inp, basekey, etc ...).
run utp/ut-cmdln.p (output <linha-comando>).
Formato
74

Onde:
<linha-comando>: varivel do tipo caracter que ir receber a linha de comando
usada para abrir a sesso corrente
Exemplo:
run utp/ut-cmdln.p (output c-linha-comando).

UT-OSVER.P
Objetivo Esta tcnica pode ser usada sempre que for necessrio saber informaes mais
detalhadas sobre o Sistema Operacional (somente para Windows).
run utp/ut-osver.p (ouput <plataforma>,
Formato
output <versao>,
output <release>,
output <build>,
output <extrainfo>).

Onde:
<plataforma>: varivel do tipo caracter que ir receber o tipo plataforma
windows (Windows NT ou Windows 95/98)
<versao>: varivel do tipo inteira que ir receber, se houver, a verso do
Windows
<release>: varivel do tipo inteira que ir receber, se houver, a "release" do
Windows
<build>: varivel do tipo inteira que ir receber, se houver, o "build" do
Windows
<extrainfo>: varivel do tipo caracter que ir receber informaes extras sobre
o Windows (Verso do Service Pack, etc ...)
Exemplo run utp/ut-osver.p (output c-plataforma,
output i-versao,
output i-release,
output i-build,
output c-extrainfo).

I-COUNTDS.I
Objetivo Descobrir a quantidade de registros numa tabela de acordo a condio passada.
Utilizao Quando necessrio determinar a quantidade de registros numa tabela,
evitando que o OWNER seja includo antes do nome da tabela no
CAPTULO 6 Includes e Utilitrios Padro 75

programa compilado, quando o banco de dados acessado atravs do


DataServer (veja o item Como contar a quantidade de registros numa
tabela no cap. 15).
{include/i-countds.i &BANCO=mgadm
Formato
&TABELA=<tabela>
&COND=<condio>
&DEST=<varivel> }

Onde:
<varivel>: varivel que ir armazenar o resultado da consulta.
<condio>: clusa where que deve ser usada na consulta. Opcional.
<tabela>: tabela que deve ter o nmero de registros contados.
<banco>: banco de dados onde a tabela se encontra.
Exemplo 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.

Observaes Utilize apenas se o banco de dados no for PROGRESS, isto , for


acessado atravs do DataServer.
<condio> e <tabela> devem estar entre aspas.

UT-WIN.I
Objetivo A UT-WIN.I define procedures para acesso a funes externas de APIs do
Windows.
Procedures Abaixo segue algumas das procedures definidas na include:
CreateProcess{&A}
GetComputerName{&A}
GetEnvironmentVariable{&A}
GetLastError
GetProfileString{&A}
GetSystemDirectory{&A}
76

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 1 Ver nome do usurio logado.


DEFINE VARIABLE chrUserID AS CHARACTER NO-UNDO.
DEFINE VARIABLE intSize AS INTEGER NO-UNDO.

ASSIGN
chrUserID = FILL(' ',256)
intSize = 255.

RUN GetUserName{&A} (INPUT-OUTPUT chrUserID,


INPUT-OUTPUT intSize).

MESSAGE TRIM(chrUserID)
VIEW-AS ALERT-BOX.
CAPTULO 6 Includes e Utilitrios Padro 77

Exemplo 2 Bloquear arraste de janela.


PROCEDURE SupressWindowMove:
/*----------------------------------------------------------------------
Purpose: Disable the MOVE option of the window object.
Parameters: windowHandle window que no poder mais ser arrastada
----------------------------------------------------------------------*/

DEFINE INPUT PARAMETER windowHandle AS WIDGET-HANDLE NO-UNDO.

&SCOPED-DEFINE SC_MOVE 61456


&SCOPED-DEFINE MF_BYCOMMAND 0
&SCOPED-DEFINE MF_DELETE 512

DEFINE VARIABLE iHWND AS INTEGER INITIAL 0 NO-UNDO.


DEFINE VARIABLE iMenu AS INTEGER INITIAL 0 NO-UNDO.
DEFINE VARIABLE iResult AS INTEGER INITIAL 0 NO-UNDO.

RUN GetParent (INPUT windowHandle:HWND, OUTPUT iHWND).

RUN GetSystemMenu (INPUT iHWND, INPUT 0, OUTPUT iMenu).

RUN RemoveMenu (INPUT iMenu, INPUT {&SC_MOVE},


INPUT {&MF_BYCOMMAND} + {&MF_DELETE}, OUTPUT iResult).

RUN DrawMenuBar (INPUT iHWND, OUTPUT iResult).


END PROCEDURE.

Exemplo 3 Remover botes do sistema (maximizar, minimizar, fechar).


PROCEDURE RemoveSystemMenuItem:
/*----------------------------------------------------------------------
Purpose: Remove a SystemMenuItem
Parameters: windowHandle window que ter os itens removidos
itemId - 5 close
3 maximize
2 minimize
----------------------------------------------------------------------*/

DEFINE INPUT PARAMETER windowHandle AS WIDGET-HANDLE NO-UNDO.


DEFINE INPUT PARAMETER itemId AS INTEGER NO-UNDO.

&SCOPED-DEFINE MF_BYPOSITION 1024


&SCOPED-DEFINE MF_REMOVE 4096
78

DEFINE VARIABLE viWinHWND AS INTEGER INITIAL 0 NO-UNDO.


DEFINE VARIABLE viSysMenu AS INTEGER INITIAL 0 NO-UNDO.
DEFINE VARIABLE viRetCode AS INTEGER INITIAL 0 NO-UNDO.

IF viWinHWND = 0 THEN
RUN GetParent (windowHandle:HWND, OUTPUT viWinHWND).

RUN GetSystemMenu (INPUT viWinHWND, INPUT 0, OUTPUT viSysMenu).

RUN RemoveMenu (INPUT viSysMenu, INPUT itemId,


INPUT {&MF_BYPOSITION} + {&MF_REMOVE},
OUTPUT viRetCode).

RUN DrawMenuBar (INPUT viWinHWND, OUTPUT viRetCode).


END PROCEDURE.

Exemplo 4 Definir varivel de ambiente.


DEFINE VARIABLE intResult AS INTEGER NO-UNDO.

RUN SetEnvironmentVariableA (INPUT "DUMMYVAR",


INPUT "SOME-VALUE",
OUTPUT intResult).

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
Objetivo Exibir em tela toda a lista de programas e procedures internas executadas at o
ponto de execuo deste aplicativo. semelhante ao stack trace do Progress,
disponvel nas mensagens de erro, com a vantagem que o desenvolvedor pode
escolher o ponto do programa para exibio da pilha de execuo.

Utilizao Pode ser utilizado em qualquer template da datasul, independente do programa


ser Smart ou Thin Template. necessrio incluir no programa a include
utp/ut-trace.i e rodar o utilitrio de forma persistente. Lembrando que para isto
necessrio criar uma varivel do tipo handle (h-trace abaixo) e limpar o
handle do programa na varivel aps a execuo.
CAPTULO 6 Includes e Utilitrios Padro 79

RUN utp/ut-trace.p PERSISTENT SET h-trace.


Formato
RUN pi-monta-trace IN h-trace (OUTPUT TABLE tt-trace).
RUN utp/trace.w (INPUT TABLE tt-trace).

Exemplo
80

CAPTULO 7
Traduo

TRADUO MONO-IDIOMAS
Este modelo utilizado at as verses EMS 2.04 e HR 2.07. Acima destas
releases deve ser utilizada a tcnica multi-idiomas especificada no prximo
item neste documento.

Traduo de variveis com view-as nas telas


View-as Radio-Set Para o label do retngulo que emoldura o radio-set e d significado ao mesmo,
deve-se utilizar a tcnica Como implementar labels em retngulos.
Quanto traduo dos 'radio-buttons' da varivel view-as radio-set deve-se
utilizar o include XXINC/I99XX999.I.
Estes includes (XXINC e VARINC) precisam ser multidioma. Quando um
desenvolvedor cria um novo include de dicionrio de dados, deve cri-lo no
layout a seguir, conforme exemplo:
/*******************************************************
**
** i01ad047.i campo natureza (conta) - Devedora/Credora
**
********************************************************/
{include/i-lgcode.i}
&IF "{&LANGUAGE-CODE}" = "POR" &THEN
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ESP" &THEN
&glob val1
CAPTULO 7 Traduo 81

&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */

Observao Foi incorporada uma chamada para um include i-lgcode.i, cujo objetivo
determinar qual o idioma da instalao do Datasul-EMS 2.0.

Mas, possvel utilizar o radio-set como view-as de variveis independentes


de campos do dicionrio de dados, atravs da utilizao de includes padres,
de acordo com o roteiro abaixo:
1. Colocar um radio-set na tela (por exemplo, SmartViewer) e definir o seu
'radio-buttons' com valores 'brancos'.
2. Seguir a nomenclatura abaixo para a include que utilizada para traduo:
Para o Datasul-EMS 2.00: Dentro do diretrio VARINC, criar uma include
que tem como padro de nomenclatura um prefixo "var" e uma seqncia
que vai de 000001 at 09999.
Exemplos: var00001.i
var00002.i
.
.
var09999.i
Para o Datasul-HR 1.00: Dentro do diretrio VARINC-RH, criar uma
include que deve ter como padro de nomenclatura um prefixo "var" e
uma seqncia que vai de 10000 at 19999.
Exemplos: var10000.i
var10001.i
.
.
var19999.i
3. Este include tem o seguinte contedo:
/****************************************************
**
** var99999.i Varivel: cb-xxx Programa:xxp/xx9999.w
82

**
*****************************************************/
{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 */

4. No 'local-initialize', ou em momento prprio, em seu programa, deve-se


carregar o 'radio-buttons' deste radio-set, bem como seu valor inicial
(screen-value):
assign rs-xxx:radio-buttons in frame {&frame-name} =
{varinc/var99999.i 07}
rs-xxx:screen-value in frame {&frame-name} =
"1":U.

View-as Combo-box Inicialmente, a sua utilizao deve estar limitada representao


de campos indicadores do dicionrio de dados, e atravs dos
includes XXINC/I99XX999.I, prprios para este fim.
Os includes de dicionrio de dados (XXINC e VARINC) precisam ser
multidioma. Quando um desenvolvedor cria um novo include de dicionrio de
dados, deve cri-lo no layout a seguir:
Exemplo /***********************************************************
**
** i01ad047.i campo natureza (conta) - Devedora/Credora
**
************************************************************/
{include/i-lgcode.i}
&IF "{&LANGUAGE-CODE}" = "POR" &THEN
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ESP" &THEN
CAPTULO 7 Traduo 83

&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */

Observao Como se pode observar, foi incorporada uma chamada para um


include i-lgcode.i, cujo objetivo determinar qual o idioma da instalao do
Datasul-EMS 2.0.
Mas, possvel utilizar o combo-box, como view-as de variveis
independentes de campos do dicionrio de dados, atravs da utilizao de
includes padres, de acordo com o roteiro a seguir:
1. Colocar um combo-box na tela (por exemplo, SmartViewer) e no definir
o seu 'list-items' e 'initial'.
2. Seguir a nomenclatura abaixo para a include que utilizada para traduo:
Para o Datasul-EMS 2.00: Dentro do diretrio VARINC, criar uma include
que tem como padro de nomenclatura um prefixo "var" e uma seqncia
que vai de 00001 at 09999.
Exemplos: var00001.i
var00002.i
.
.
var09999.i
Para o Datasul-HR 1.00: Dentro do diretrio VARINC-RH, criar uma
include que deve ter como padro de nomenclatura um prefixo "var" e
uma seqncia que vai de 10000 at 19999.
Exemplos: var10000.i
var10001.i
.
.
var19999.i
3. Este include tem o seguinte contedo:
84

/****************************************************
**
** var99999.i Varivel: cb-xxx Programa:xxp/xx9999.w
**
*****************************************************/
{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 */

4. No 'local-initialize', ou em momento prprio, em seu programa, deve-se


carregar o 'list-items' deste combo-box, bem como seu valor inicial
(screen-value):
assign cb-xxx:list-items in frame {&frame-name} =
{varinc/var99999.i 03}
cb-xxx:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 1}.

5. Toda codificao que precisar referenciar o valor de um item do combo-


box, deve ser realizada atravs do include var99999.i, isto , no podem
existir referncias diretas na forma de string ("") aos itens do combo-box
no fonte. Exemplo:
ERRADO:
if cb-tipo:screen-value in frame {&frame-name} =
"Passivo" then...

CERTO:
if cb-tipo:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 2} then ...

Em ambas as utilizaes, ainda resta a traduo do label, ento no 'Main-


Block', ou 'Local-initialize', ou ainda, qualquer ponto onde o programa
CAPTULO 7 Traduo 85

execute antes da realizao do frame, deve-se implementar lgica que


altere o label do combo-box:
{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}
assign <var-combo-box>:label in frame {&frame-name} =
return-value.

View-as Toggle- No caso dos toggle-boxes e fill-ins necessrio preparar a traduo dos
Box e View-as Fill- labels, e para isto pode-se usar o include utp/ut-field.i quando se tratar de uma
in varivel like ou ainda o include utp/ut-liter.i para aproveitar o cadastro de
literais.
Utilizando utp/ut-field.i:
{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}
assign <varivel>:label in frame {&frame-name} = return-
value.

Utilizando utp/ut-liter.i:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <varivel>:label in frame {&frame-name} = return-
value.

Help Sempre que estas variveis possuam 'help', este deve ter a preparao para
traduo atravs do include utp/liter.i, conforme o exemplo:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <variavel>:help in frame {&frame-name} = return-
value.

Espao Extra para traduo em relatrios


Column-Labels o tamanho de uma coluna em um layout (down frame) est limitada ao
tamanho do formato do campo ou do label Brasil do mesmo, o que for
maior. Com base nisto, os espaos extras para traduo foram recalculados
para column-labels dos campos no dicionrio de dados;
na utilizao de literais para compor column-labels de variveis, no
necessrio preocupar-se com o espao extra para traduo, entretanto no
se deve esquecer da possibilidade de traduo.
Exemplo: {utp/ut-liter Total_Pedidos}
assign de-total-pedidos:label in frame f-relat = trim{return-
value}.
86

Cliente Descrio Total Pedidos


--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99

Side-Labels deve existir o tratamento do espao extra para traduo, 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 Descrio Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99

TRADUO MULTI-IDIOMAS
Este modelo utilizado a partir das verses EMS 2.05 e HR 2.08 ou
superiores.

Nomenclatura Padro e Caractersticas do modelo

A nova tcnica de traduo definiu uma nomenclatura para os dialetos a serem


utilizados no produto. Esta nomenclatura segue um padro de mercado j
utilizado por outras empresas de mercado, e est definida na ISO639-1. Segue
abaixo uma tabela exemplificando as definies de cada sigla para os dialetos
suportados pela Datasul:
CAPTULO 7 Traduo 87

Dialeto Nome idioma/Dialeto


en-US English - United States
es-AR Spanish - Argentina
pt-BR Portuguese - Brazil

Sendo que as siglas US, AR e BR j so consideradas customizaes do


dialeto principal expedido pela Datasul ou ainda um dialeto secundrio, e que
estas customizaes podem ser tratadas pelo cliente/distribuidor na forma
como estes julgarem conveniente para sua aplicao, sendo obrigatrio como
padro validado apenas as duas primeiras letras do cdigo do idioma/dialeto.
Quando se comenta em dialeto padro, este pode ser considerado o prprio
idioma, ou ainda o dialeto que expedido pela prpria Datasul, que atualmente
so en, es e pt, na forma de trs arquivos .d presentes na pasta \univdata abaixo
do diretrio do produto. Qualquer outro dialeto criado pelo
usurio/distribuidor considerado dialeto secundrio ou customizado, ou ainda
um dialeto qualquer do usurio, que mantm uma relao com o dialeto padro
atravs da prpria tabela de dialetos do produto, podendo este ser filho de
qualquer dialeto padro, ou ainda de algum outro dialeto que j filho de um
dialeto padro, e assim sucessivamente de acordo com a necessidade definida.
Ex: pt-nr-fm - Portugus Nordestino das indstrias farmacuticas. Podemos
dizer aqui ento que o pt-nr-fm filho de pr-nr, e pr-nr filho de pt.

Importante Para que o produto saiba que dialeto trabalhar na sesso corrente, existe na tabela
de usurios um campo chamado cod_dialeto que ir armazenar a informao do dialeto do
usurio, sendo possvel com isto em uma mesma instalao do produto vrios usurios
acessando com um idioma/dialeto diferente.

Quando o usurio realiza o login no EMS/HR, uma varivel global populada


com o valor armazenado no campo cod_dialeto da tabela usuar_mestre, e a
partir deste momento toda e qualquer traduo no produto toma como
referncia o valor armazenado nesta varivel. Caso queira-se tratar/consultar
esta varivel de alguma forma em algum programa, basta defini-la conforme
segue abaixo:
define new global shared var v_cod_dialet_corren as char no-
undo.
88

Pontos de traduo

No modelo de traduo Multi-Idiomas, para os programas que possuem telas,


sejam estes SmartObjects ou ThinTemplates, foram criados o que chamamos
de pontos de traduo. Estes pontos de traduo nada mais so do que os locais
onde foram realizadas as chamadas aos tradutores automticos de telas, ou
seja, nestes pontos, um utilitrio chamado e este identifica todos os objetos
dispostos em tela, identifica todos as propriedades destes objetos que so
passveis de traduo, como labels, tooltip's, help's, etc, e realiza uma chamada
automtica ao ut-liter para sua posterior atribuio ao valor retornado. Tudo o
que est em tela e que est antes deste ponto de traduo, no necessrio que
seja realizado nenhum tipo de interveno manual. Caso tenha-se alguma
atribuio em tela para atributos de objetos passveis de traduo aps estes
pontos, este dever ser trabalhado para que se inclua uma chamada ao utilitrio
ut-liter.p e posterior atribuio ao atributo em questo pelo valor retornado
atravs do return-value.

Os pontos de traduo so:


SmartObjects Procedure Adm-initialize
ThinTemplates Procedure InitializeInterface

Contextos de traduo

No modelo de traduo Multi-Idiomas, foi adicionado um conceito de contexto


de traduo. Este contexto pode ser usado de forma idntica ao utilizado na
verso anterior do ut-liter, atravs da sigla do mdulo, mas no fica
necessariamente limitado a esta contextualizao, podendo ser definido
qualquer tipo de semntica que se julgue necessrio para o mdulo/programa
do produto que se est trabalhando. Caso, durante a anlise para a construo
do programa, seja verificado que no existe a necessidade da criao de uma
nova contextualizao de Strings, mesmo passando-se o caracter "*" para o
utilitrio de traduo ut-liter em tempo de desenvolvimento, este programa ir
disponibilizar um contexto automtico para o cliente/usurio em tempo de
CAPTULO 7 Traduo 89

execuo, este contexto automtico disponibilizado pela sigla do mdulo.


Isto para que o cliente/distribuidor possa realizar suas customizaes, caso
julgar necessrio, sem que haja a necessidade de alterao do programa para
que o contexto seja passado de forma correta, bastando ao usurio cadastrar a
String corretamente atravs do programa btb016aa.p. Aps este cadastro, a
funcionalidade de traduo ir levar em considerao a sequncia de busca e
trazer o termo correto no ponto do mdulo onde a string foi customizada.

Nota Ver sobre seqncia de busca a seguir neste documento

O caracter "*" considerado para fins de traduo, o contexto genrico das


strings.

Itens de Traduo

Para a tcnica de traduo Multi-Idiomas, foi criado um conceito de itens de


traduo, onde cada um destes itens possui uma caracterstica que deve ser
levada em considerao no momento da incluso de novas strings, bem como
no momento da customizao dos termos em telas do produto.
Hoje existem 9 itens de traduo, sendo que estes itens, suas caractersticas, e
codificao dentro da tabela de strings externas esto descritos a seguir neste
documento. Estes itens esto todos armazenados dentro de uma tabela
chamada string_ext_produt, sendo sua chave composta pelo dialeto, contexto,
seu ID e a Origem String, sendo estes dois ltimos campos definidos como
segue:
ID Item de Traduo Origem String Descrio
1 aplicat_dtsul des_aplicat_dtsul Tabela que armazena os
aplicativos Datasul
2 modul_dtsul des_modul_dtsul Tabela que armazena os
mdulos Datasul
90

3 procedimento des_proced Tabela que armazena os


procedimentos Datasul
4 produt_dtsul des_produt_dtsul Tabela que armazena os
produtos Datasul
5 rot_dtsul des_rot_dtsul Tabela que armazena as
rotinas Datasul
6 sist_dtsul des_sist_dtsul Tabela que armazena os
sistemas Datasul
7 sub_rot_dtsul des_sub_rot_dtsul Tabela que armazena as
sub-rotinas Datasul
8 cad-msgs cd-msg Tabela que armazena as
mensagens dos produtos
Datasul

9 cad-literal cod-literal Tabela que armazena as


Literais dos produtos
Datasul*

* Os registros com este ltimo indicador ainda armazenam mais algumas


informaes relevantes para o produto, como ttulos dos programas em todos
os idiomas, e tambm todas as strings presentes nos bancos de dados do
produto, como labels, descries dos campos e tabelas, help's, etc. Sendo que
para as strings em bancos, a chave buscada sempre seguir a seguinte forma:
Para Tabela: banco.tabela.propriedade
Ex: mguni.cad-literal.desc - Com esta chave voc encontra a
traduo no dialeto desejado para a descrio da tabela cad-literal no banco
mguni. Esta chave utilizada pelo utilitrio ut-table.p, que ser abordado ainda
neste documento.
Para Campo: banco.tabela.campo.propriedade
Ex: mguni.cad-literal.cod-literal.label - Com esta chave voc
encontra a traduo no dialeto desejado para o label do campo cod-literal, na
CAPTULO 7 Traduo 91

tabela cad-literal no banco mguni. Esta chave utilizada pelo utilitrio ut-
field.p, que ser abordado ainda neste documento.

Sequncia de busca

Aps verificarmos alguns conceitos sobre o modelo de traduo Multi-


Idiomas, desde sua nomenclatura, os pontos de traduo dentro dos programas,
o que so contextos dentro deste novo processo, e os itens de traduo que
esto englobados por esta tcnica, necessrio que se consiga visualizar como
isto ir funcionar de forma prtica dentro dos programas, dentro dos mdulos
dos produtos Datasul. Para isto, foi definida uma sequncia de busca que visa
disponibilizar uma hierarquia de Dialetos, contextos e strings no intuito de
facilitar a customizao e o entendimento por parte dos usurios e
desenvolvedores da funcionalidade. Com isso, quando se passa uma
Literal/Mensagem/String/Item de Menu para qualquer um dos utilitrios que
realizam a busca na tabela de strings Externas (ut-liter, ut-msgs, ut-ltmnu), a
sequncia de busca utilizada a que segue:

Seqncia Dialeto Padro Dialeto Usurio Contexto


1 X Contexto
informado/mdulo
2 X Contexto Genrico (*)
3 X Contexto
informado/mdulo
4 X Contexto Genrico (*)

Atravs desta hierarquia de busca, possvel o cliente/distribuidor fazer


qualquer tipo de customizao de termos de negcio que julgar necessrio,
seja por regio geogrfica, por segmentao de mercado, por departamento
funcional, ou qualquer outro tipo de separao de termos que julgar
conveniente. Com as funcionalidades deste modelo de traduo abordado,
estaremos explicando abaixo o que cada um dos utilitrios criados para este
processo realizam bem como algumas situaes em programas que devem ser
analisadas para que sejam evitadas incluses de novos problemas em relao
92

traduo nos produtos Datasul. A seguir neste documento descrio destes


programas/situaes com o objetivo de facilitar/tornar sua implementao o
mais simples possvel.

UT-TRCAMPOS.P
Objetivo Realizar traduo automtica de telas. Este programa tem a funo de
pesquisar todos os objetos de uma tela Progress baseado em sua Window,
atravs da hierarquia existente, e realizar a chamada ao utilitrio ut-liter.p para
que sejam feitas as devidas tradues da interface. Este utilitrio reconhece
todas as frames que so filhas da window, e traduz todas os objetos presentes
nestas frames automaticamente.
Utilizao utilizado nos dois pontos de traduo dentro das templates:
InitializeInterface nas ThinTemplates
Adm-Initialize nos Smart Objects quando existe container definido.
Caso exista uma window que no seja de uma template padro Datasul, este
utilitrio poder ser chamado antes do view principal da frame do programa
para que a traduo automtica passe a ser realizada.
Este programa no espera nenhum parmetro de entrada, e deve ser chamado
diretamente atravs do fonte.
Ex: run utp/ut-trcampos.p.

UT-TRFRRP.P
Objetivo Difere do anterior porque realiza traduo automtica de uma nica frame,
apenas. Busca os itens de traduo apenas na hierarquia da frame que foi
passada como parmetro, buscando os objetos passveis de traduo e
realizando ento a chamada ao ut-liter.p e posterior atribuio do valor
traduzido retornado estes objetos, de forma automtica.
Utilizao Pode ser utilizado para traduzir Dialog-frames, frames de relatrio, ou
qualquer outra frame que se julgue necessrio.
CAPTULO 7 Traduo 93

Deve ser altamente utilizado para evitar alto nvel de trabalho quando da
necessidade de traduo de frames de relatrios devido a no existncia de
uma window que seja o pai destas frames nestes tipos de programas, no
podendo nestes casos ser utilizado o utilitrio anterior (ut-trcampos.p).
Ex: run utp/ut-trfrrp.p (input frame f-parametros:handle).

Obs: Quando o programa for um relatrio, existe um filtro no RTB que caso o
programa no possua nenhuma chamada a este utilitrio, esta ser feita de
forma automtica para todas as frames do relatrio antes do ponto padro de
leitura de registros desta template ou da definio do cabealho do mesmo, ou
seja, antes da include i-rpout.i ou i-rpcab.i respectivamente, dependendo da
estrutura do programa.

UT-LSTIT.P
Objetivo Converter uma String no indexada proveniente de um objeto Progress e
retorna seu contedo indexado e j traduzido no dialeto do usurio, para que
possa ser utilizado no programa chamador. Tem o objetivo de facilitar a
programao dentro da tcnica de traduo Multi-Idiomas minimizando a
necessidade de realizar tal tarefa diretamente no fonte do programa em
questo.
Utilizao Dever ser utilizado sempre quando da necessidade de uma converso de
valores de um objeto Progress no indexado para valores indexados, ou ainda,
converter valor de LIST-ITEMS para LIST-ITEM-PAIRS.
Sua utilizao 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
situaes:
Include de domnio;
Valor populado de um for each;
List-items de um campo (Este apenas caso ainda no tenha passado pelos
pontos de traduo, ou j tenha passado e necessita ser repopulado devido
a uma lgica de negcio);
Sub-programa;
94

Qualquer fonte que gere uma lista separada por vrgula e que este ser
utilizada em algum objeto Progress no-indexado (Combo-Box, Selection-
List).
O programa ir retornar na mesma varivel informada os valores j indexados
e traduzidos, conforme exemplo abaixo:
Valor cLista antes: casado,solteiro
Valor cLista depois: married,casado,single,solteiro

Podendo a atribuio ao objeto Progress indexado ser realizada da seguinte


forma:
assign combo-box:list-item-pairs = cLista. /* para combo-box
*/
assign select-list:list-item-pairs = cLista. /* para
Selection-Lits */

Importante Com a tcnica de traduo Multi-Idiomas, tudo o que antes era LIST-ITEMS,
automaticamente convertido para LIST-ITEM-PAIRS nos pontos de traduo pelos programas
j mencionados, com isso, qualquer referncia a LIST-ITEMS destes campos aps os pontos de
traduo, devero ser retrabalhados para tratar a partir de agora, LIST-ITEM-PAIRS, tendo este
utilitrio como facilitador para esta implementao. Qualquer dvida adicional, verificar o item
abaixo que trata sobre LIST-ITEMS.

UT-LITER.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR. Este
sofreu alteraes para contemplar as novas funcionalidades do modelo de
traduo Multi-Idiomas, como novo conceito de contextualizao, hierarquia
de busca e dialetos das Strings.
Utilizao Para que no fosse gerado nenhum tipo de impacto sobre todo o legado de
programas com o antigo modelo do ut-liter, seu forma de chamada e
parmetros no foram alterados, mantendo o padro j conhecido e definido
neste manual.
Sintaxe: {utp/ut-liter.i <Literal> <Contexto> <Alinhamento>}

Sendo que nesta nova ut-liter, o alinhamento no ir gerar nenhum tipo de


diferena no comportamento da string de retorno, mantida apenas para fins de
compatibilidade. Para evitar problemas com este parmetro, sempre pass-lo
CAPTULO 7 Traduo 95

com valor em branco ("") caso utilizando o programa .p, ou simplesmente no


passar, caso utilizando a include, conforme exemplos abaixo:
Ex: run utp/ut-liter.p (input Teste,*,).
{utp/ut-liter Teste *}

Onde Teste a literal sendo passada, e "*" o contexto, sendo este


considerado o contexto genrico, no sendo passado nada para o terceiro
parmetro, que seria o alinhamento, considerado ento como branco.
Importante No modelo de traduo Multi-Idiomas, nenhuma string de destino pode ser maior
que a string de origem, conforme regra que j vinha sendo utilizado no processo de traduo de
fontes. Outra regra importante que strings que possuem espaos em branco, estes espaos
devem ser convertidos para "_" antes da chamada a ut-liter.p. Ex: {utp/ut-liter.i Teste_agora *}

UT-MSGS.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR,
utilizado para apresentar as mensagens dos produtos Datasul. Este utilitrio
tambm sofreu alteraes para contemplar as novas funcionalidades descritas e
possui a caracterstica da busca por mensagens baseando-se no dialeto e no
contexto cadastrado para a mensagem.
Utilizao Para manter compatilidade com o legado existente nos produtos, sua sintaxe
foi mantida inalterada, conforme segue abaixo:
Sintaxe: run utp/ut-msgs.p (input <ao>
input <nmero da mensagem>
input <parmetros>).

Onde:
<ao> a ao que ser tomada pelo programa, podendo ser "show" para
mostrar, "msg" para retornar a mensagem, e "help" para retornar o help da
mensagem.
<nmero da mensagem> o nmero da mensagem
<parmetros> So os parmetros a serem substitudos na mensagem
Maiores detalhes podem ser consultados na referncia geral deste utilitrio
neste documento.
96

UT-FIELD.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores das propriedades dos campos do dicionrio de
dados, como label, description, etc. O que difere esta verso do modelo de
traduo Multi-Idiomas para a verso anterior que a busca no mais
realizada sobre o prprio dicionrio, e sim diretamente na tabela de strings
externas do produto, baseando-se na chave banco.tabela.campo.propriedade,
conforme mencionado em itens de traduo neste documento.
Utilizao Foi mantido basicamente para no gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substitudo pelo ut-liter,
devido sua maior facilidade de identificao e customizao futura pelo
usurio.
Sua sintaxe no foi alteradada, sendo ainda:
{utp/ut-field.i banco tabela campo propriedade}

onde propriedade pode ser:


Propriedade Descrio Observao
1 Label
2 Column-Label
3 Help
4 Format Continua
buscando do
banco
5 Initial Continua
buscando do
banco
6 Description

Ex: {utp/ut-field.i mgadm conta tipo 1}

Este exemplo ir retornar o label do campo tipo da tabela conta do banco


mgadm no dialeto do usurio.
Nota Onde Existe a frase Continua buscando do banco, significa que o comportamento do
utilitrio no foi alterado, mantendo a mesma funcionalidade da implementao anterior.
CAPTULO 7 Traduo 97

UT-TABLE.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores de propridades das tabelas do dicionrio de
dados, como desc, label, etc. O que difere esta verso do modelo de traduo
Multi-Idiomas para a verso anterior que a busca no mais realizada sobre
o prprio dicionrio, e sim diretamente na tabela de strings externas do
produto, baseando-se na chave banco.tabela.propriedade, conforme citado em
itens de traduo neste documento.
Utilizao Foi mantido basicamente para no gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substitudo pelo ut-liter,
devido sua maior facilidade de identificao e customizao futura pelo
usurio.
Sua sintaxe no foi alteradada, sendo ainda:
{utp/ut-table.i <banco> <tabela> <propriedade>}

onde propriedade :
Propriedade Descrio Observao
1 File-Label
2 Dump_name Continua
buscando do
banco
3 Desc

Ex: {utp/ut-table magadm conta 1}

Este exemplo ir retornar o label da tabela conta do banco mgadm no dialeto


do usurio.
Nota Quando comentado "Continua buscando do banco", isto quer dizer que o programa no
est buscando o valor das strings externas, e sim continua buscando do schema do banco atual
que est conectado a sesso, como a verso anterior j realizava.

UT-LTMNU.P
Objetivo Novo utilitrio criado para a traduo de todos os itens de menu (Itens de
traduo de 1 a 7). Este utilitrio realiza a busca na tabela de strings externas,
98

dos respectivos itens de menu, e retorna sua traduo para o programa


chamador.
Utilizao Para este programa passado como parmetro 4 valores, sendo estes:
Origem String substituindo os espas em branco por "_".
Contexto desejado. Neste caso, normalmente "*" (Contexto Genrico)
Identificador da String (Os itens de menu esto entre 1 e 7).
Identificador String de retorno - Para os itens de menu, existe nestas
tabelas alm das descries dos respectivos itens nos dialetos suportados,
tambm o nome de menu utilizado para que estes itens sejam apresentados
no produto. Este identificador tem o objetivo de indicar qual a string que o
desenvolvedor requer que seja retornado pelo utilitrio, tendo para este
parmetro dois possveis valores:
Parmetro Retorno
1 Descrio do Item de Menu
Traduzido
2 Descrio do nome de menu do
item de menu traduzido.

Sintaxe: run utp/ut-ltmnu.p (input r


replace(<des_item_menu>," ","_"),
Input <contexto>,
Input <Identificador>,
Input <IndStringRetorno>).

Ex: utp/ut-ltmnu.p (input replace(des_modul_dtsul,


" ","_"),
"*",
2,
1).

Este exemplo ir retornar a descrio do respectivo mdulo Datasul no dialeto


do usurio atravs do RETURN-VALUE.
CAPTULO 7 Traduo 99

OBJETOS PROGRESS NO-INDEXADOS

Para uma melhor adequao da nova tcnica de traduo ao modelo existente


anteriormente de objetos Progress no indexados, como selection-list's e
combo-box's, e ainda para no gerar muitos impactos sobre o modelo de
traduo mono-idiomas, nos pontos de traduo acima citados atravs da ut-
trcampos (InitializeInterface e Adm-Initialize), todos os objetos que utilizavam
LIST-ITEMS nos programas passaram a ser automaticamente convertidos para
LIST-ITEM-PAIRS, indexando este objeto sempre pelo seu valor original
normalmente em Portugus, fazendo com que esta alterao no gere maiores
impactos sobre lgicas de negcio utilizadas nos programas. Caso um destes
objetos Progress no-indexados for referenciado via LIST-ITEMS aps estes
pontos de traduo, ser apresentada uma mensagem Progress de erro que
evidencia a necessidade de troca de LIST-ITEMS para LIST-ITEM-PAIRS
(Erro 7454). Neste caso, dever ser utilizado o utilitrio ut-lstit.p explicado
acima neste documento para realizar o devido tratamento e sua troca de list-
items para list-item-pairs.

Traduo de variveis com view-as nas telas


View-as Radio-Set Para o label do retngulo que emoldura o radio-set e d significado ao mesmo,
pode-se utilizar a tcnica Como implementar labels em retngulos. Mas no
caso da funcionalidade multi-idiomas, isto no obrigatrio devido aos
tradutores automticos de telas j realizarem esta traduo de forma
automtica.
Para popular o valor de radio-buttons da varivel view-as radio-set pode-se
utilizar o include XXINC/I99XX999.I mas no necessariamente, podendo
estes serem realizados diretamente com os valores em Portugus, devido ao
modelo de traduo Multi-Idiomas contemplar sua traduo de forma
automtica em tela.
Estes includes (XXINC e VARINC) precisam ser idioma Portugus. Quando
um desenvolvedor cria um novo include de dicionrio de dados, deve cri-lo
no layout a seguir, conforme exemplo:
/*******************************************************
**
** i01ad047.i campo natureza (conta) - Devedora/Credora
100

**
********************************************************/
&glob val1 Devedora
&glob val2 Credora
{include/ind01-10.i} {1} {2}}
/* fim */

Observao Na verso anterior a multi-idiomas, era necessrio a include i-lgcode para


determinar o idioma. Neste novo modelo tal referncia no mais necessria, pois nesta tem-se
uma nica instalao com suporte a multi-idiomas.

Mas, possvel utilizar o radio-set como view-as de variveis independentes


de campos do dicionrio de dados, atravs da utilizao de includes padres,
de acordo com o roteiro abaixo:
1. Colocar um radio-set na tela (por exemplo, SmartViewer) e definir o seu
'radio-buttons' com valores 'brancos'.
2. Seguir a nomenclatura abaixo para a include que utilizada para popular o
campo em Portugus para traduo em Multi-idiomas:
Para o Datasul-EMS 2.05: Dentro do diretrio VARINC, criar uma include
que tem como padro de nomenclatura um prefixo "var" e uma seqncia
que vai de 000001 at 09999.
Exemplos: var00001.i
var00002.i
.
.
var09999.i
Para o Datasul-HR 2.08: Dentro do diretrio VARINC-RH, criar uma
include que deve ter como padro de nomenclatura um prefixo "var" e
uma seqncia que vai de 10000 at 19999.
Exemplos: var10000.i
var10001.i
.
.
var19999.i
3. Este include tem o seguinte contedo:
/****************************************************
**
** var99999.i Varivel: cb-xxx Programa:xxp/xx9999.w
CAPTULO 7 Traduo 101

**
*****************************************************/
&glob val1 Devedora
&glob val2 Credora
{include/ind01-10.i} {1} {2}}
/* fim */

4. No 'local-initialize' antes do dispatch da ADM deve-se carregar o 'radio-


buttons' deste radio-set, bem como seu valor inicial (screen-value):
assign rs-xxx:radio-buttons in frame {&frame-name} =
{varinc/var99999.i 07}
rs-xxx:screen-value in frame {&frame-name} =
"1":U.

View-as Combo-box Inicialmente, a sua utilizao deve estar limitada representao de


campos indicadores do dicionrio de dados, e atravs dos includes
XXINC/I99XX999.I, prprios para este fim.
Os includes de dicionrio de dados (XXINC e VARINC) precisam ser sempre
em Portugus. Quando um desenvolvedor cria um novo include de dicionrio
de dados, deve cri-lo no layout a seguir:
Exemplo /***********************************************************
**
** i01ad047.i campo natureza (conta) - Devedora/Credora
**
************************************************************/
&glob val1 Devedora
&glob val2 Credora
{include/ind01-10.i} {1} {2}}
/* fim */

Observao Na verso anterior a multi-idiomas, era necessrio a include i-lgcode para


determinar o idioma. Neste novo modelo tal referncia no mais necessria, pois nesta tem-se
uma nica instalao com suporte a multi-idiomas.

Mas, possvel utilizar o combo-box, como view-as de variveis


independentes de campos do dicionrio de dados, atravs da utilizao de
includes padres, de acordo com o roteiro a seguir:
1. Colocar um combo-box na tela (por exemplo, SmartViewer) e no definir
o seu 'list-items' e 'initial'.
2. Seguir a nomenclatura abaixo para a include que utilizada para traduo:
102

Para o Datasul-EMS 2.05: Dentro do diretrio VARINC, criar uma include


que tem como padro de nomenclatura um prefixo "var" e uma seqncia
que vai de 00001 at 09999.
Exemplos: var00001.i
var00002.i
.
.
var09999.i
Para o Datasul-HR 2.08: Dentro do diretrio VARINC-RH, criar uma
include que deve ter como padro de nomenclatura um prefixo "var" e
uma seqncia que vai de 10000 at 19999.
Exemplos: var10000.i
var10001.i
.
.
var19999.i
3. Este include tem o seguinte contedo:
/****************************************************
**
** var99999.i Varivel: cb-xxx Programa:xxp/xx9999.w
**
*****************************************************/
&glob val1 Devedora
&glob val2 Credora
{include/ind01-10.i} {1} {2}}
/* fim */

4. No 'local-initialize' antes do dispatch do mtodo ADM, ou em momento


posterior utilizando-se o utilitrio ut-lstit.p, em seu programa, deve-se
carregar o 'list-items' deste combo-box, bem como seu valor inicial
(screen-value):
assign cb-xxx:list-items in frame {&frame-name} =
{varinc/var99999.i 03}
cb-xxx:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 1}.

Importante Apenas antes do mtodo DISPATCH do procedure Adm-Initialize possvel


implementao com LIST-ITEMS. Aps este ponto, necessrio a utilizao do utilitrio ut-
lstit.p para sua devida converso para LIST-ITEM-PAIRS.
CAPTULO 7 Traduo 103

5. Toda codificao que precisar referenciar o valor de um item do combo-


box, deve ser realizada atravs do include var99999.i, isto , no podem
haver referncias diretas na forma de string ("") aos itens do combo-box
no fonte. Exemplo:
ERRADO:
if cb-tipo:screen-value in frame {&frame-name} =
"Passivo" then...

CERTO:
if cb-tipo:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 2} then ...

O seu label ser automaticamente tratado pelo tradutor automtico de


telas presente nas templates, e o valor ser a referncia em Portugus
presente na include, no gerando problemas com lgica de negcio.

Espao Extra para traduo em relatrios


Column-Labels tamanho de uma coluna num layout (down frame) est limitada ao
tamanho do formato do campo ou do label do mesmo, o que for maior.
Com base nisto, os espaos extras para traduo foram recalculados para
column-labels dos campos no dicionrio de dados;
na utilizao de literais para compor column-labels de variveis no
necessrio preocupar-se com o espao extra para traduo, entretanto no
se deve esquecer da possibilidade de traduo.
Exemplo: {utp/ut-liter Total_Pedidos}
assign de-total-pedidos:label in frame f-relat = trim{return-
value}.
Cliente Descrio Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
104

Side-Labels deve existir o tratamento do espao extra para traduo, 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 Descrio Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99

PRTICAS PARA IMPLEMENTAO MULTI-IDIOMAS

Neste item estaro sendo abordados alguns casos prticos que podem ser
encontrados durante a execuo de uma implementao/alterao de
programas para a portabilidade do produto para a nova tcnica de traduo.
Abaixo segue demonstrao de alguns casos prticos onde ser possvel
identificar algumas das principais diferenas na forma de programar para a
tcnica de traduo Multi-Idiomas em relao ao modelo anterior.

Caso Prtico Diferenas LIST-ITEMS para LIST-ITEM-PAIRS


Este primeiro caso prtico est relacionado com a utilizao de LIST-ITEM-
PAIRS e suas diferenas em relao utilizao com LIST-ITEMS.
A seguir uma lgica que era antes realizada com LIST-ITEMS, e algumas
observaes:

assign cb-tp-oper-terc:list-items in frame fPage1 = "Remessa


Beneficiamento",
CAPTULO 7 Traduo 105

"Retorno Beneficiamento",
Remessa Consignao",
"Faturamento Consignao",
"Devoluo Consignao",
"Reajuste Preo",
"Drawback" .
ASSIGN cb-tp-oper-terc:screen-value in frame fPage2 = entry(tt-
natur-oper.tp-oper-terc,cb-tp-oper-terc:list-items in frame
fPage2,",").

Se o campo tt-natur-oper.tp-oper-terc ter o valor 2 trar com SCREEN-


VALUE "Retorno Beneficiamento".

ASSIGN tt-natur-oper.tp-oper-terc = lookup(cb-tp-oper-terc,cb-


tp-oper-terc:list-items in frame fPage2,",").

Se o usurio informar na tela "Remessa Consignao" gravar o valor no


campo tt-natur-oper.tp-oper-terc como 3. Agora, esta mesma lgica depois de
convertida para LIST-ITEM-PAIRS, seja esta converso feita de forma direta
no programa ou atravs do utilitrio ut-lstit.p, ser apresentada como segue:

assign cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1


= "Remessa Beneficiamento","Remessa Beneficiamento",
"Retorno Beneficiamento","Retorno Beneficiamento",
"Remessa Consignao","Remessa Consignao",
"Faturamento Consignao","Faturamento Consignao",
"Devoluo Consignao","Devoluo Consignao",

"Reajuste Preo","Reajuste Preo",


"Drawback","Drawback" .
ASSIGN cb-tp-oper-terc:screen-value in frame fPage2 =
entry(tt-natur-oper.tp-oper-terc,cb-tp-oper-terc:list-items in
frame fPage2,",").
106

Se o campo tt-natur-oper.tp-oper-terc ter o valor 2 trar com SCREEN-


VALUE "Remessa Beneficiamento".

ASSIGN tt-natur-oper.tp-oper-terc = lookup(cb-tp-oper-


terc,cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage2,",").

Se o usurio informar na tela "Remessa Consignao" gravar o valor no


campo tt-natur-oper.tp-oper-terc como 6. Apenas tomar o cuidado de sempre
gravar o valor par, que o valor indexador do campo. Caso seja retornado o
valor impar, ser necessrio acresce-lo em 1 unidade, devido este estar
repetido, principalmente em sesses que esto executando em Portugus.
A questo principal neste trecho a necessidade de analisar onde a tt-natur-
oper.tp-oper-terc populada, e ento com isso pode-se levantar duas
alternativas:
Alterar a lgica de onde esta temp-table populada para contemplar a
localizao do item de negcio dentro do combo, que alteraria de 3 para 6
no primeiro caso.
Manter a lgica da temp-table e fazer algumas implementaes que fariam
que o nmero retornado para a tp-oper-terc seja como se estivesse sendo
tratado um LIST-ITEMS, no caso 3. Neste caso, necessrio realizar
alguns tratamentos para contemplar qualquer idioma sendo executado pelo
produto, conforme abaixo:

define variable tp-oper-terc as int init 2. /* Valor arbitrado


para fins de demonstrao */
define variable cb-tp-oper-terc as char format "x(30)" view-as
combo-box list-items "".
define frame fPage1
cb-tp-oper-terc.

assign cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1 =


"Remessa Beneficiamento,Remessa Beneficiamento,Retorno
Beneficiamento,Retorno Beneficiamento,Remessa
Consignao,Remessa Consignao,Faturamento
Consignao,Faturamento Consignao,Devoluo
CAPTULO 7 Traduo 107

Consignao,Devoluo Consignao,Reajuste Preo,Reajuste


Preo,Drawback,Drawback".
/* Considerando que esta temp-table tt-natur-oper.tp-oper-terc
sempre estar armazenando os valores como no indexados, ou
seja, ainda utilizando list-items para a sua gravao, caso
contrrio, trabalhar direto na lgica de negcio da temp-table
*/
ASSIGN cb-tp-oper-terc:screen-value in frame fPage1 =
entry(tp-oper-terc * 2,cb-tp-oper-terc:list-item-pairs in frame
fPage1,",").
update cb-tp-oper-terc with frame fPage1.
If lookup(cb-tp-oper-terc:screen-value,cb-tp-oper-terc:LIST-
ITEM-PAIRS in frame fPage1,",") mod 2 <> 0 Then
ASSIGN tp-oper-terc = (lookup(cb-tp-oper-terc:screen-
value,cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1,",") + 1)
/ 2.
else ASSIGN tp-oper-terc = lookup(cb-tp-oper-terc:screen-
value,cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1,",") / 2.

Para estes casos necessrio definir qual a melhor forma de implementao


realizando uma anlise do caso. Deixamos como sugesto, analisando-se o fato
que as manutenes estaro sendo realizadas em WorkSpaces de releases que
j esto no mercado, utilizar a lgica com gravao do valor da temp-table
ainda tomando como base o valor no-indexado, evitando assim erros com
lgicas de negcio deste mesmo programa sendo utilizado em releases
anteriores.
Importante Esta alterao direta de LIST-ITEMS para LIST-ITEM-PAIRS somente
necessria caso a referncia ao campo esteja depois dos pontos de traduo (Ver item pontos de
traduo neste documento).

Caso converso de List-items para LIST-ITEM-PAIRS

Quando da necessidade de atribuir valores a algum objeto Progress no-


indexado em tela aps os pontos de traduo, seguir o modelo de construo
abaixo:
108

Antes:
assign cb-combo:list-items = {varinc/var00002.i 04 02}

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

Onde "{&FNC_MULTI_IDIOMA}" o pr-processador que indica que a


funo de traduo em multi-idiomas est habilitada, mantendo inclusive a
lgica anterior no sentido de no gerar impacto sobre releases j liberadas
comercialmente.

Traduo automtica em frame de relatrio

Para este caso, deve ser chamado diretamente o utilitrio que realiza a traduo
atravs dos handles dos objetos presentes na relatrio frame em questo. Para
isto, dever realizar sua chamada ou imediatamente aps a definio da frame
ou antes da realizao do display da frame. Segue abaixo um exemplo de sua
aplicao:

form
skip(2)
c-lit-selecao no-label colon 55
skip(1)
tt-param.tp-etiq-ini format "zzzzzzzzz9" colon 60 "|<
>|"
tt-param.tp-etiq-fim format "zzzzzzzzz9" no-label
CAPTULO 7 Traduo 109

skip(1)
c-lit-impressao no-label colon 55
skip(1)
c-destino colon 60 "-"
tt-param.arquivo no-label format "x(30)"
with side-label stream-io width 132 frame f-fim.

&IF "{&FNC_MULTI_IDIOMA}" = "Yes" &THEN


Run utp/ut-trfrrp.p (input Frame f-fim:Handle).
&ENDIF

Traduzir valor armazenado em uma varivel

Para traduo de valores em variveis, ao invs de utilizar a include ut-liter.i,


necessrio utilizar o programa .p associado a esta include. Segue exemplo
abaixo:
define variable c-destino as char init "Destino Impresso" no-
undo.
run utp/ut-liter.p (input replace(c-destino," ","_"),"*","").
assign c-destino = return-value.
disp c-destino.

Importante Sempre passar valores fixos e de variveis substituindo-se o " " (Branco) por "_"
(underline).
110

Tratando lista enorme de traduo em includes


Objetivo Evitar a ocorrncia do erro ** More than 32000 characters in a single
statement--use -inp parm. (135) na compilao de programas que incorporam
includes de traduo para uma lista muito longa de valores. O erro 135 do
Progress devido ao limite de 32.000 caracteres para uma nica atribuio de
valores. As includes da pasta VARINC geralmente so utilizadas dessa forma:

ASSIGN c-lista-retencao = ENTRY(1,TRIM({varinc/var00137.i 03})).

Esta a situao na qual ocorre o erro 135 quando a lista de valores enorme
e ultrapassa o limite de caracteres para uma atribuio. Para evitar isso foi
desenvolvida esta tcnica que modifica a forma de chamada das includes
varinc, alm de mudar a estrutura das includes responsveis pelo retorno.
Todas as includes da nomenclatura varinc/var99999.i so utilizadas para
definio da lista de valores e utilizam outra include para realizar o tratamento
do tipo de retorno escolhido pelo usurio, 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 atravs de pr-processadores e o
valor destes so retornados todos de uma nica vez para uma varivel no
programa que incorpora a include. Sendo assim necessrio alterar a include
de retorno para gravar na varivel desejada os valores um por vez. Para tal,
necessrio 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 iterao do FOR EACH ou fazer um FIND diretamente no item
desejado.
As alteraes desta tcnica exigem um grande trabalho para adequar a include
de retorno na proposta das temp-table, porque necessrio popular a tabela
com os valores, sendo necessrio inclu-los um a um. Em compensao, o
trabalho de manipulao dos valores para retorno diminui, porque ao invs de
ficar concatenando uma lista enorme de pr-processadores basta apenas fazer
FOR EACH ou FIND na temp-table conforme a opo de retorno desejada.
Implementao As includes de retorno trabalham com 7 tipos de retorno atualmente:
1. View-as combo-box
2. View-as radio-set
CAPTULO 7 Traduo 111

3. Lista com os itens separados por virgula


4. Retorna o item n da lista
5. Retorna o numero de itens da lista
6. Retorna a posio do item (nmero)
7. Valores para a propriedade Radio-Buttons de uma Radio-Set

Para cada um desses tipos de retorno, necessrio ler a temp-table que contm
os valores da lista. Esta temp-table deve ser definida dessa forma:

DEFINE TEMP-TABLE tt-list-items NO-UNDO


FIELD posicao AS INT.
FIELD val-item AS CHAR

Em seguida, a temp-table deve ser populada com os valores dos pr-


processadores:

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.

Abaixo segue lista de tarefas para implementao da tcnica, trabalhando cada


tipo de retorno:

Tratamento para o retorno do tipo View-as Combo-box ou Lista com


os itens separados por virgula:
112

necessrio ler a temp-table atravs de FOR EACH e ir concatenando


os valores em uma varivel caracter (c-lista neste exemplo) separando
os elementos por virgula.

DEF VAR l-log AS LOG INITIAL FALSE NO-UNDO.

FOR EACH tt-list-items BY posicao:

IF l-log = NO THEN DO:


ASSIGN c-lista = tt-list-items.val-item.
ASSIGN l-log = TRUE.
END.
ELSE
ASSIGN c-lista = c-lista + "," + tt-list-
items.val-item.

END.

Neste tipo de retorno o programa precisa estar preparado para ler a


varivel c-lista.

Tratamento para o retorno do item n da lista:

FIND LAST tt-list-items WHERE posicao = {2}.


ASSIGN c-lista = tt-list-items.val-item.

O parametro {2} utilizado contm o indice do item desejado e


passado como parmetro para a include de retorno.

Tratamento para retornar o nmero total de itens na lista:

FIND LAST tt-list-items.


ASSIGN c-lista = STRING(tt-list-items.posicao).

Como a temp-table que armazena os itens possui um campo chamado


posicao, sendo os valores gravados em ordem seqencial, basta ler o
campo posio do ultimo registro da temp-table para saber o nmero
total de itens.

Tratamento para retornar a posio de um item na lista:

DEF VAR c-chave AS CHAR NO-UNDO.

ASSIGN c-chave = "{2}".


CAPTULO 7 Traduo 113

FIND FIRST tt-list-items WHERE val-item = c-chave NO-


LOCK NO-ERROR.

IF AVAIL tt-list-items THEN


ASSIGN c-lista = STRING(tt-list-items.posicao).
ELSE
ASSIGN c-lista = ?.

Neste tratamento tambm utilizamos o parmetro {2} para localizar o


item na temp-table, sendo que dessa vez o parmetro ir conter o
prprio item. Uma vez localizado esse item podemos pegar a posio
dele na lista com o campo tt-list-items.posicao.

Tratamento para retonar valores para a propriedade Radio-Buttons de


uma Radio-Set:

DEF VAR l-log AS LOG INITIAL FALSE NO-UNDO.

FOR EACH tt-list-items BY posicao:

IF l-log = NO THEN DO:


ASSIGN c-lista = tt-list-items.val-item + ","
+ STRING(tt-list-items.posicao).
ASSIGN l-log = TRUE.
END.
ELSE
ASSIGN c-lista = c-lista + "," + tt-list-
items.val-item + "," + STRING(tt-list-items.posicao).

END.

Neste caso feito tratamento semelhante para o retorno para view-as


combo-box s invertendo a ordem de um item e sua respectiva posio
na string final armazenada em c-lista.

Alterar o ponto de chamada da include VARINC nos programas que a


utilizam:

Devido as mudanas propostas pela tcnica, no possvel fazer mais


este tipo de atribuio:
114

ASSIGN c-lista-retencao = ENTRY(1,TRIM({varinc/var00137.i


03})).

necessrio colocar a include em uma linha isolada, de preferncia


logo aps a definio de variveis do programa.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 115

CAPTULO 8
Construo de Programas utilizando os
Estilos e suas Tcnicas

Como construir um Cadastro Simples


Estilo Usado Nome Fsico
Cadastro Simples Masters/w-cadsim.w
Cadastro Simples -Alterao Masters/w-cadsi2.w
Cadastro Simples - Incluso Masters/w-cadsi3.w
Implementao em Arquivo | Novo, selecionar um dos estilos relacionados acima, de
acordo com o tipo de Cadastro Simples que se deseja construir;

verificar se j existe uma SmartQuery para a tabela que se deseja construir


um Cadastro Simples. Caso no exista, criar uma nova utilizando o estilo
CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da Window Cadastro Simples e
aceitar as sugestes de SmartLinks do Wizard;
verificar se j existe um programa de v para e um programa de pesquisa
para a tabela que se deseja construir um Cadastro Simples. Caso no
existam, eles devem ser criados;
116

acessar os atributos de instncia da SmartQuery e informar no atributo


"Programa Pesquisa" o nome do programa de pesquisa da tabela e no
atributo "Programa V para" o nome do programa de V para da tabela;

criar um SmartLink do tipo STATE, tendo como Source: p-navega e como


Target: SmartQuery;
criar um SmartLink do tipo STATE, tendo Source: p-exihel e como
Target: SmartQuery;
verificar se j existe uma SmartViewer com os atributos da tabela que
devem ser editados. Caso no exista, criar uma nova SmartViewer
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na pgina 0 da SmartWindow e aceitar as


sugestes de SmartLink do Wizard;
redimensionar a SmartWindow de acordo com os objetivos que foram
colocados nela. Ter o cuidado para que a SmartViewer fique centralizada
na SmartWindow;
salvar a SmartWindow com o nome definido para o Cadastro Simples;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 117

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

Como construir um Cadastro Complexo


Estilo Usado Nome Fsico
Cadastro Complexo Masters/w-cadcom.w
Cadastro Complexo - Atualiza Masters/w-cadcon2.w
Implementao selecionar um dos estilos relacionados na tabela acima, de acordo com o
tipo de Cadastro Complexo que se deseja construir;

verificar se j existe uma SmartQuery para a tabela que se deseja construir


um Cadastro Complexo. Caso no exista, criar uma nova utilizando o
estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da SmartWindow e aceitar as
sugestes de SmartLink do Wizard;
verificar se j existe um programa de V para e um programa de pesquisa
para a tabela que se deseja construir um Cadastro Complexo. Caso no
existam eles devem ser criados;
acessar os atributos de instncia da SmartQuery e informar no atributo
"Programa Pesquisa" o nome do programa de pesquisa da tabela e no
atributo "Programa V para" o nome do programa de V para da tabela;
118

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 que
devem estar expostos na parte principal da SmartWindow, ou seja, acima
do folder. Caso no exista, criar uma nova SmartViewer utilizando o estilo
CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na pgina 0 da SmartWindow, acima do folder, e


aceitar as sugestes de SmartLink do Wizard;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 119

repetir os seguintes passos para as demais SmartViewers que devem estar


colocadas nas pginas do folder:
verificar se j existe uma SmartViewer com os atributos que devem
estar editados na pgina do folder. Caso no exista, criar uma nova,
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer em determinada pgina do folder e aceitar as


sugestes de SmartLink do Wizard;
120

criar um SmartLink de GROUP-ASSIGN, tendo como Source:


SmartViewer da pgina 0 e como Target: SmartViewer recm
instanciada no folder;
redimensionar a SmartWindow de acordo com os objetos que foram
colocados nela. Ter o cuidado para que a SmartViewer fique centralizada
na SmartWindow;

acessar as propriedades do folder e renomear os labels das pginas;


salvar a SmartWindow com o nome definido para o Cadastro Complexo.
Lista de Links:
Source Link Type Target
h_folder PAGE THIS-PROCEDURE
h_p-cadsim STATE h_p-exihel
h_p-cadsim TABLEIO h_viewer-l
h_p-navega NAVIGATION h_query
h_query RECORD h_viewer-1
h_query RECORD h_viewer-2
h_query RECORD h_viewer-3
h_query RECORD h_viewer-4
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 121

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

Como construir um Cadastro Pai X Filho - Atualiza Filho


Estilo Utilizado Nome Fsico
Window Cadastro Pai x Filho - Filho Masters/w-adf.w
Implementao selecionar o estilo relacionado na tabela acima;

verificar se j existe uma SmartQuery para a tabela pai. Caso no exista,


criar uma nova utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da SmartWindow e aceitar as
sugestes de SmartLink do Wizard;
verificar se j existe um programa de "V para" e um programa de
pesquisa para a tabela pai. Caso no existam, eles devem ser criados;
acessar os atributos de instncia da SmartQuery e informar no atributo
"Programa Pesquisa" o nome do programa de pesquisa da tabela pai e no
atributo "Programa VPara" o nome do programa de V Para da tabela pai;
122

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 pgina 0 da SmartWindow, ou seja, acima do
folder. Caso no exista, criar uma nova SmartViewer utilizando o estilo
CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na pgina 0 da SmartWindow e aceitar as


sugestes de SmartLink do Wizard;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 123

repetir os seguintes passos para os SmartBrowsers que devem estar


colocadas nas pginas do folder:
verificar se j existe um SmartBrowser para a tabela filho. Caso no
exista, criar um novo utilizando o estilo CustomBrowser
Inclui/Modifica;
colocar o SmartBrowser na pgina correspondente do folder, aceitando
os links indicados pelo Wizard;

acessar os atributos de instncia do SmartBrowser e informar o


nome do programa de atualizao da tabela filha. Se este programa
no existir, deve ser criado utilizando-se o template Cadastro
Inclui/Modifica Filho;
124

criar um SmartLink de Record, tendo como Source: SmartQuery e


como Target: SmartBrowser recm instanciado no folder;
caso seja necessrio incluir botes de Seleo e/ou Parmetros
para a tabela do SmartBrowser, deve-se incluir os botes abaixo
do browse.
ter o cuidado para que a SmartViewer fique centralizada na
SmartWindow;
salvar a SmartWindow com o nome definido para o Cadastro Pai x
Filho.
Lista de Links
Source Link Type Target
h_folder PAGE THIS-PROCEDURE
h_p-exihel STATE THIS-PROCEDURE
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browser1
h_query RECORD h_browser2
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 125

h_p-exihel STATE h_query

Como construir um Cadastro Inclui/Modifica Filho


Estilo Utilizado Nome Fsico
Window Inclui/Modifica Filho Masters/w-incmo3.w
Implementao selecionar o estilo relacionado na tabela acima;

se os campos a serem inclusos/modificados couberem em uma nica


viewer, o cadastro deve ser do tipo Simples, devendo-se eliminar o folder
da SmartWindow;

se os campos a serem inclusos/modificados no couberem em uma nica


viewer, estes devem ser divididos em mais viewers que devem ser
colocadas nas pginas do folder, formando um cadastro do tipo Complexo;
126

verificar se j existe uma SmartQuery para a tabela que se deseja construir


o Cadastro Inclui/Modifica Filho. Caso no exista, criar uma nova
utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 (zero) da Window;
para cada viewer a ser utilizada deve-se seguir os seguintes passos:
verificar se j existe uma SmartViewer com os atributos da tabela a
serem editados. Caso no exista, criar uma nova SmartViewer
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na SmartWindow ou na pgina


correspondente do folder no caso de um cadastro complexo, e aceitar
as sugestes de SmartLinks do Wizard;
criar um SmartLink de TABLEIO, tendo como Source: THIS-
PROCEDURE e como Target: SmartViewer recm instanciada;
se o cadastro for do tipo complexo:
criar links de group-assign entre a viewer principal (viewer que deve
conter a chave da tabela) e as demais viewers (ver lista de links);
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 127

incluir a seguinte linha aps o Dispatch padro na Local-Initialize:


{include/i-inifld.i}

deve-se atribuir a pgina 1 como sendo a pgina inicial do


programa. Para isso necessrio:
acessar o Procedure Properties na janela do UIB;
entrar em Propertie Pages;

em Startup on Page atribuir o valor 1.

na Local-Initialize da window, devem ser substitudas as ocorrncias de


"<viewer_principal>", pelo nome da viewer que contm o(s) campo(s)
chave(s) da tabela.
Exemplo:
run pi-atualiza-parent in h_v06pd001 (input v-row-
parent).

nas triggers de Choose dos botes de 'Ok' e 'Salvar', substituir as


ocorrncias de "<handle da viewer principal>" pelo handle da viewer que
contm o campo chave da tabela;
128

Exemplo:
{include/okfil.i h_v06pd001}

na procedure pi-reposiciona da window, substituir a ocorrncia "<query-


name>" pelo nome da query utilizada no cadastro.
Exemplo:
RUN pi-reposiciona-query IN h_q06pd001 (input v-row-
table).

na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e aps o run dispatch deve ser inserida a seguinte lgica:
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 substitudo 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 substitudo pelo nome da tabela que deve estar sendo
utilizada no cadastro.
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
Exemplo /* 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.

Se desejar preencher os campos chave da tabela pai na viewer para


incluso:
Na SmartViewer que possuir a chave da tabela, deve ser criada uma
local-display-fields e uma local-add-record, e aps o run dispatch deve
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 129

ser inserida a seguinte lgica nas duas procedures:

def buffer <nome buffer> for <tabela pai>.


find <nome buffer> where rowid(<nome buffer>) = v-row-
parent no-lock no-error.
if avail <nome buffer> then
assign <tabela filho>.<chave pai>:screen-value in
frame {&frame-name} = string(<nome buffer>.<chave pai>).
else
assign <tabela filho>.<chave pai>:screen-value in
frame {&frame-name} = .

Onde:
<nome buffer>: deve ser substitudo pelo nome que se deseja dar ao buffer da
tabela pai.
<tabela pai>: deve ser substitudo 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 substitudo pelo nome da tabela que est sendo
utilizada no cadastro.
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
Exemplo /* 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} =
"".

Se desejar preencher seqencialmente o campo chave da tabela filho para


incluso:
Na SmartViewer que possuir a chave da tabela, deve ser criada uma
local-add-record e aps o run dispatch deve ser inserida a seguinte
lgica na procedure:
130

def buffer <nome buffer> for <tabela filho>.


find last <nome buffer> where <nome buffer>.<chave pai> =
<tabela pai>.<chave pai> no-lock no-error.
if avail <nome buffer> then
assign <tabela filho>.<chave filho>:screen-value in
frame {&frame-name} = string(<nome buffer>.<chave filho>
+ 1).
else
assign <tabela filho>.<chave filho>:screen-value in
frame {&frame-name} = 1.

Onde:
<nome buffer>: deve ser substitudo pelo nome que se deseja dar ao buffer da
tabela filho.
<tabela pai>: deve ser substitudo 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 substitudo pelo nome da tabela que est sendo
utilizada no cadastro.
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
Exemplo /* 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-order for order.


find last b-order where b-order.cust-num = customer.cust-num no-
lock no-error.
if avail b-order then
assign order.order-num:screen-value in frame {&frame-name} =
string(b-order.order-num + 1).
else
assign order.order-num:screen-value in frame {&frame-name} =
1.

Lista de Links (Uma Viewer):


Source Link Type Target
THIS-PROCEDURE TABLEIO h_viewer
h_query RECORD h_viewer
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 131

Lista de Links (Mais de uma Viewer):


Source Link Type Target
h_query RECORD h_viewer1
THIS-PROCEDURE TABLEIO h_viewer1
h_viewer1 GROUP-ASSIGN h_viewer2
h_viewer1 GROUP-ASSIGN h_viewer3
h_query RECORD h_viewer2
h_query RECORD h_browser3

Como construir um Cadastro Pai X Filho - Atualiza Ambos


Estilo Utilizado Nome Fsico
Window Cadastro Pai x Filho - Ambos Masters/w-paiamb.w
Implementao selecionar o estilo relacionado na tabela acima;

verificar se j existe uma SmartQuery para a tabela pai. Caso no exista,


criar uma nova utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da SmartWindow e aceitar as
sugestes de SmartLink do Wizard;
verificar se j existe um programa de Cadastro Inclui/Modifica Pai para
manuteno da tabela Pai, caso no exista, deve ser criado, para isso
utilizar o template Cadastro Inclui/Modifica Pai;
132

verificar se j exista um programa "V para" e um programa de pesquisa


para a tabela pai. Caso no existam, eles devem ser criados;
acessar os atributos de instncia da SmartQuery e informar o nome do
programa de pesquisa da tabela pai, o nome do programa de "V Para" da
tabela pai e o nome do programa de Inclui/Modifica/Copia da tabela pai;
criar um SmartLink do tipo STATE, tendo como Source o Painel p-navega
e como Target a SmartQuery;
criar um SmartLink do tipo STATE, tendo como Source o Painel p-cadpai
e como Target a SmartQuery;
criar um SmartLink do tipo STATE, tendo como Source o Painel p-exihel
e como Target a SmartQuery;
verificar se j existe uma SmartViewer com os atributos da tabela pai que
esto expostos na pgina 0 da SmartWindow, ou seja, acima do folder.
Caso no exista, criar uma nova SmartViewer, utilizando o estilo
CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na pgina 0 da SmartWindow e aceitar as


sugestes da SmartLink do Wizard;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 133

repetir os seguintes passos para os SmartBrowsers que devem estar


colocadas nas pginas do folder:
verificar se j existe um SmartBrowser para a tabela filho. Caso no
exista, criar um novo utilizando o estilo CustomBrowser
Inclui/Modifica;
colocar o SmartBrowser na pgina correspondente do folder, aceitando
os links indicados pelo Wizard;

acessar os atributos de instncia do SmartBrowser e informar o nome


do programa de atualizao da tabela filha. Se este programa no
existir, deve ser criado utilizando-se o template Cadastro
Inclui/Modifica Filho;
134

ter o cuidado para que a SmartViewer fique centralizada na


SmartWindow;
caso seja necessrio incluir botes de Seleo e/ou Parmetros para a
tabela do SmartBrowser, deve-se incluir os botes abaixo do browse;
salvar a SmartWindow com o nome definido para o Cadastro Pai x
Filho.
Lista de Links:
Source Link Type Target
h_folder PAGE THIS-PROCEDURE
p-cadpai TABLEIO h_viewer
p-cadpai STATE h_query
h_p_exihel STATE h_query
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browse1
h_query RECORD h_browse2
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 135

Como construir um Cadastro Inclui/Modifica Filho


Estilo Utilizado Nome Fsico
Window Inclui/Modifica Filho Master/w-incmo3.w
Implementao selecionar o estilo relacionado na tabela acima;

se os campos a serem inclusos/modificados couberem em uma nica


viewer, o cadastro deve ser do tipo Simples, devendo-se eliminar o
folder da SmartWindow.

se os campos a serem inclusos/modificados no couberem em uma


nica viewer, estes devem ser divididos em mais viewers que devem
ser colocadas nas pginas do folder, formando um cadastro do tipo
Complexo;
136

verificar se j existem uma SmartQuery para a tabela que se deseja


construir o Cadastro Inclui/Modifica Filho. Caso no exista, criar uma
nova utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 (zero) da Window;
para cada viewer a ser utilizada deve-se seguir os seguintes passos:
verificar se j existe uma SmartViewer com os atributos da tabela a
serem editados. Caso no exista, criar uma nova SmartViewer
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na SmartWindow ou na pgina


correspondente do folder no caso de um cadastro complexo, e aceitar
as sugestes de SmartLinks do Wizard;
criar um SmartLink de TABLEIO, tendo como Source: THIS-
PROCEDURE e como Target: SmartViewer recm instanciada;
se o cadastro for do tipo complexo:
criar links de group-assign entre a viewer principal (viewer que
conter a chave da tabela) e as demais viewers (ver lista de links);
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 137

incluir a seguinte linha aps o Dispatch padro no Local-Initialize:


{include/i-inifld.i}

deve-se atribuir a pgina 1 como sendo a pgina inicial do programa. Para


isso necessrio:
acessar o Procedure Properties na janela do UIB;
entrar em Propertie Pages;

em Startup on Page atribuir o valor 1;

na Local-Initialize da window, devem ser substitudas as ocorrncias de


"<viewer_principal>", pelo nome da viewer que contm o(s) campo(s)
chave(s) da tabela.
Exemplo:
run pi-atualiza-parent in h_v06pd001 (input v-row-
parent).

nas triggers de Choose dos botes de 'Ok' e 'Salvar', substituir as


ocorrncias de "<handle da viewer principal>" pelo handle da viewer que
contm o campo chave da tabela;
138

Exemplo:
{include/okfil.i h_v06pd001}

na procedure pi-reposiciona da window, substituir a ocorrncia "<query-


name>" pelo nome da query utilizada no cadastro;
Exemplo:
RUN pi-reposiciona-query IN h-q06pd001 (input v-row-
table).

na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e aps o run dispatch deve ser inserida a seguinte lgica:
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 substitudo 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 substitudo pelo nome da tabela que deve estar sendo
utilizada no cadastro
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro
Exemplo /* 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.

Lista de Links (Uma Viewer):


Source Link Type Target
THIS-PROCEDURE TABLEIO h_viewer
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 139

h_query RECORD h_viewer


Lista de Links (Mais de uma Viewer):
Source Link Type Target
h_query RECORD h_viewer1
THIS-PROCEDURE TABLEIO h_viewer1
h_viewer1 GROUP-ASSIGN h_viewer2
h_viewer1 GROUP-ASSIGN h_viewer3
h_query RECORD h_viewer2
h_query RECORD h_viewer3

Como construir um Cadastro Inclui/Modifica Pai


Estilo Utilizado Nome Fsico
Window IncluiModifica Pai Master/w-incmdp.w
Implementao selecionar o estilo relacionado na tabela acima;

se os campos a serem inclusos/modificados couberem em uma nica


viewer, o cadastro deve ser do tipo Simples, devendo-se eliminar o folder
da SmartWindow;
140

se os campos a serem inclusos/modificados no couberem em uma nica


viewer, estes devem ser divididos em mais viewers que devem ser
colocadas nas pginas do folder, formando um cadastro do tipo Complexo;

verificar se j existe uma SmartQuery para a tabela que se deseja construir


o Cadastro Inclui/Modifica Filho. Caso no exista, criar uma nova
utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 (zero) da Window;
para cada viewer a ser utilizada deve-se seguir os seguintes passos:
verificar se j existe uma SmartViewer com os atributos da tabela a
serem editados. Caso no exista, criar uma nova SmartViewer
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na SmartWindow ou na pgina


correspondente do folder no caso de um cadastro complexo, e aceitar
as sugestes de SmartLinks do Wizard;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 141

criar um SmartLink de TABLEIO, tendo como Source: THIS-


PROCEDURE e como Target: SmartViewer recm instanciada;
se o cadastro for do tipo complexo:
criar links do group-assign entre a viewer principal (viewer que deve
conter a chave da tabela) e as demais viewers (ver lista de links);
incluir a seguinte linha aps o Dispatch padro na Local-Initialize:
{include/i-inifld.i}

deve-se atribuir a pgina 1 como sendo a pgina inicial do programa. Para


isso necessrio;
acessar a Procedure Properties na janela do UIB;
entrar em Propertie Pages;

em Startup on Page atribuir o valor 1;

nas triggers de Choose dos botes de 'Ok' e 'Salvar', substituir as


ocorrncias de "<handle da viewer principal>" pelo handle da viewer que
contm o campo chave da tabela;
Exemplo:
142

{include/okpai.i h_v07pd002}

na procedure pi-reposiciona da window, substituir a ocorrncia "<query-


name>" pelo nome da query utilizada no cadastro;
Exemplo:
RUN pi-reposiciona-query IN h_q07pd001 (input v-row-
table).

Lista de Links (Uma Viewer):


Source Link Type Target
THIS-PROCEDURE TABLEIO h_viewer
h_query RECORD h_viewer
Lista de Links (Mais de uma Viewer):
Source Link Type Target
h_query RECORD h_viewer1
THIS-PROCEDURE TABLEIO h_viewer1
h_viewer1 GROUP-ASSIGN h_viewer2
h_viewer1 GROUP-ASSIGN h_viewer3
h_query RECORD h_viewer2
h_query RECORD h_viewer3

Como construir um CustomBrowser Inclui/Modifica


Estilo Utilizado Nome Fsico
Window Inclui/Modifica Master/w-incmdp.w
Pai
Implementao selecionar o estilo relacionado na tabela acima;

seguir os passos do Wizard, observando que:


deve-se indicar uma tabela externa, essa tabela deve ser a mesma
tabela utilizada na query do Cadastro PaiXFilho em que o browser
deve ser utilizado;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 143

a query deve conter a tabela dos registros filhos que iro ser exibidos no
Cadastro PaiXFilho. Exemplo de query do browser:

toggle-box "Indexed-Reposition" deve ser marcado;


em "Options", a coluna "Returned" do browse, deve conter o valor
"Fields Used" e o toggle-box "Sort-ByPhrase" deve ser marcado;
144

aps a criao do browse com a ajuda do Wizard, salvar o browse de


acordo com as normas de nomenclatura.

Como construir um CustomBrowser Zoom Wizard


Estilo Utilizado Nome Fsico
Custom Browser Zoom Wizard Masters/wbrwzoo.w
Implementao selecionar o estilo relacionado na tabela acima;
seguir os passos do Wizard observando que o browse deve exibir apenas
os registros que estejam entre os limites estabelecidos pelo usurio para
isso na definio da query do browse, deve-se obedecer aos seguintes
itens:
na pgina where, deve-se entrar com a seguinte condio:
<Tabela>.<Campo> >= fi-ini-<campo> and
<Tabela>.<Campo> <= fi-fin-<campo>

Onde:
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 145

<Tabela>.<Campo>: o campo da tabela ao qual deseja-se estabelecer limites,


e, fi-ini-campo e fi-fin-campo so os fill-ins que o usurio ir entrar com a
faixa de valores

Obs.: A condio pode obedecer a valores de mais campos bastando adicion-


la. Exemplo:
<Tabela>.<Campo1> >= fi-ini-<campo1> and
<Tabela>.<Campo1> >= fi-ini-<campo1> and
<Tabela>.<Campo2> >= fi-ini-<campo2> and
<Tabela>.<Campo2> >= fi-ini-<campo2> ...

depois de concluda a definio do browse, o nome, tipo, formato e


tamanho dos fill-ins para faixa de valores devem ser alterados de modo
que se tornem compatveis com os campos utilizados na condio anterior,
para isso deve-se:
146

acessar os atributos do fill-in c-inicial, na frame f-main disposto acima do


browse;
em database fields deve-se indicar o campo que esta se fazendo a condio
para faixa de valores;
na dialog Dictionary Defaults, desmarcar os toogle-boxes Label e
Database Variable;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 147

o nome do fill-in deve ser alterado para o mesmo nome relacionado na


condio da query do browse, no formato fi-ini-<campo>. Exemplo:
fi-ini-cust-num;
repetir os mesmos passos para o fill-in c-final, observando que seu
nome deve ser alterado para o formato fi-fin-<campo>. Exemplo: fi-
fin-cust-num;
alterar o valor inicial do fill-in de incio de faixa, para o menor valor
aceito por ele. Exemplo: para um fill-in do tipo inteiro de formato
"999.999,99", seu valor inicial deve ser 0 (zero), para um fill-in do
tipo caracter de formato "x(6)", seu valor inicial deve ser "" (branco).
alterar o valor inicial do fill-in de fim de faixa para o maior valor
aceito por ele. Exemplo: para um fill-in do tipo inteiro de formato
"999.999,99", seu valor inicial deve ser 999.999,99, para um fill-in do
tipo caracter de formato "x(6)", seu valor inicial deve ser "ZZZZZZ"
(seis letras "z" maisculas).
mais campos podem ser adicionados a condio de faixa de valores,
bastando que sejam adicionados os fill-ins e que sejam seguidos os
passos citados anteriormente, ou inserir diretamente os campos na
frame e em seguida desvincul-los da base atravs de suas
propriedades e alterando seus nomes.
Obs.: se forem adicionados mais campos para a faixa de valores, as
imagens Image-1 e Image-2 devem ser copiadas e reposicionadas entre
os dois novos campos, conforme a faixa original.
na trigger do boto bt-confirma, as ocorrncias dadas por c-inicial e c-final
devem ser alteradas para fi-ini-campo e fi-fin-campo respectivamente.
148

Exemplo:
assign input frame {&frame-name} c-inicial c-final.

Para:
assign input frame {&frame-name} fi-ini-cust-num fi-fin-cust-
num.

se necessrio, ou se houverem mais de um campo para seleo de valores,


os fill-ins de inicio de faixa (fi-ini-<campo>) podero possuir labels.
Como esses fill-ins no so vinculados ao banco de dados, a atribuio do
label dever ser feita por meio do utilitrio ut-field ou ut-liter, criando a
procedure local-initialize antes do dispatch. Para isso os fill-ins no
devem se no-labels. Exemplo:
{utp/ut-field.i Sports Customer Cust-Num 1}
assign fi-ini-Cust-Num:Label in frame {&frame-name} =
return-value.

alterar a procedure pi-retorna-valor, onde:


- <tabela>: nome da tabela do browser
- <campo1>: primeiro campo do browser
- <campo2>: segundo campo do browser
- <campo...>: campo ... do browser
- <campoN>: campo N do browser
salvar o browse seguindo as normas de nomenclatura.

Como construir uma Consulta Simples


Estilo Utilizado Nome Fsico
Window Consulta Simples Masters/w-consim.w
Implementao em Arquivo | Novo, selecionar o estilo relacionado acima;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 149

verificar se j existe uma SmartQuery para a tabela que se deseja construir


a Consulta Simples. Caso no exista, criar uma nova utilizando o estilo
CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da Window Consulta Simples e
aceitar as sugestes de SmartLinks do Wizard;
verificar se j existe um programa de v para e um programa de pesquisa
para a tabela que se deseja construir a Consulta Simples. Caso no
existam, eles devem ser criados;
acessar os atributos de instncia da SmartQuery e informar no atributo
"Programa Pesquisa" o nome do programa de pesquisa da tabela e no
atributo "Programa V para" o nome do programa de V para da tabela;

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 que
devem ser editados. Caso no exista, criar uma nova SmartViewer
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica Como registrar
campo do tipo Fill-in para o WebEnabler.
150

O WebEnabler j registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que


possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na pgina 0 da SmartWindow e aceitar as


sugestes de SmartLink do Wizard;
redimensionar a altura da SmartWindow de acordo com os objetos que
foram colocados nela. Ter o cuidado para que a SmartViewer fique
centralizada na SmartWindow;
salvar a SmartWindow com o nome definido para o Cadastro Simples;
Lista de Links
Source Link Type Target
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_p-exihel STATE h_query

Como construir uma Consulta Complexa


Estilo Utilizado Nome Fsico
Window Consulta Complexa Masters/w-concom.w
Implementao selecionar o estilo relacionado na tabela acima;

verificar se j existe uma SmartQuery para a tabela que se deseja construir


um Cadastro Complexo. Caso no exista, criar uma nova utilizando o
estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da SmartWindow e aceitar as
sugestes de SmartLink do Wizard;
verificar se j existe um programa de V para e um programa de pesquisa
para a tabela que se deseja construir um Cadastro Complexo. Caso no
existam, eles devem ser criados;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 151

acessar os atributos de instncia da SmartQuery e informar no atributo


"Programa Pesquisa" o nome do programa de pesquisa da tabela e no
atributo "Programa V para" o nome do programa de V para da tabela;

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 que
devem estar expostos na parte principal da SmartWindow, ou seja, acima
do folder. Caso no exista, criar uma nova SmartViewer utilizando o estilo
Custom Viewer com Auto-Field;
instanciar a SmartViewer na pgina 0 da SmartWindow, acima do folder, e
aceitar as sugestes de SmartLink do Wizard;
152

repetir os seguintes passos para as demais SmartViewers que devem estar


colocadas nas pginas do folder:
verificar se j existe uma SmartViewer com os atributos que devem
estar dispostos na pgina do folder. Caso no exista, criar uma nova,
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer em determinada pgina do folder e aceitar as


sugestes de SmartLink do Wizard;
criar um SmartLink de GROUP-ASSIGN, tendo como Source:
SmartViewer da pgina 0 e como Target: SmartViewer recm
instanciada no folder;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 153

redimensionar a altura da SmartWindow de acordo com os objetos que


foram colocados nela. Ter o cuidado para que a SmartViewer fique
centralizada na SmartWindow;
acessar as propriedades do folder e renomear os labels das pginas;
salvar a SmartWindow com o nome definido para o Cadastro Complexo.

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
154

Como construir uma Consulta Relacionamentos


Estilo
' Utilizado Nome Fsico
Window Consulta Relacionamento Masters/w-conrel.w
Implementao selecionar o estilo relacionado na tabela acima;

verificar se j existe uma SmartQuery para a tabela que se deseja construir


uma Consulta Relacionamento. Caso no exista, criar uma nova utilizando
o estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da SmartWindow e aceitar as
sugestes de SmartLink do Wizard;
verificar se j existe um programa de V para e um programa de pesquisa
para a tabela que se deseja construir uma Consulta Relacionamento. Caso
no existam, eles devem ser criados;
acessar os atributos de instncia 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;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 155

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 pgina 0 da SmartWindow, ou seja, acima do
folder. Caso no exista, criar uma nova SmartViewer utilizando o estilo
CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na pgina 0 da SmartWindow e aceitar as


sugestes de SmartLink do Wizard;

repetir os seguintes passos para os SmartBrowsers que devem estar


colocadas nas pginas do folder:
156

verificar se j existe um SmartBrowser para a tabela filho da consulta


relacionamento. Caso no exista, criar um novo utilizando o estilo
CustomBrowser Consulta;
boto "Detalhar" deve ser responsvel por chamar um determinado
programa de consulta que deve detalhar o registro selecionado no
SmartBrowser. O critrio de escolha para esse programa deve ser o
seguinte:
1 Consulta cadastral do filho;
2 Consulta relacionamento do filho;
3 Consulta cadastral de uma tabela associativa ao filho;
deve ser implantada a tcnica de reposicionamento automtico
com base nas variveis globais para o browser;
Acessar os atributos de instncia de cada Browse e informar o
nome do programa e diretrio que deve ser chamado pelo boto
Detalhar.

criar um SmartLink de Record, tendo como Source: SmartQuery e


como Target: SmartBrowser recm instanciado no folder;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 157

redimensionar a SmartWindow de acordo com os objetos que foram


colocados nela. Ter o cuidado para que a SmartViewer fique centralizada
na SmartWindow;
salvar a SmartWindow com o nome definido para a Consulta
Relacionamento.
Lista de Links:
Source
' Link Type Target
h_folder PAGE THIS-PROCEDURE
h_p-exihel STATE THIS-PROCEDURE
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browse1
h_query RECORD h_browse2
h_p-exihel STATE h_query

Como construir um programa de Relatrios


Para a construo de relatrios que no so gerados pelo Data Viewer, deve-se
utilizar o estilo Window Relatrios/Clculos/Fechamentos (w-relat.w), que se
apresenta um pouco diferente dos demais estilos existentes, pois no se utiliza
de SmartObjects.
Outra diferena que o relatrio constitudo por dois programas, o primeiro
com o nome do formato xxp/xx9999.w o que faz a interface com o usurio
apresentando todas as opes e entradas de dados necessrias gerao do
relatrio, o segundo programa, com nome de formato xxp/xx9999rp.p, executa
a gerao do relatrio propriamente dito, conforme os parmetros passados
pelo primeiro programa.
Dicas Gerais
tabela de para de folder/pginas e com objetos relacionados:
Pgina-Folder
' Frame Imagem Preprocessador
Seleo f-pg-sel im-pg-sel PGSEL
Classificao f-pg-cla im-pg-cla PGCLA
Parmetros f-pg-par im-pg-par PGPAR
158

Digitao f-pg-dig im-pg-dig PGDIG


Impresso f-pg-imp im-pg-imp PGIMP
para selecionar uma pgina para trabalhar, na janela do UIB, clicar no
boto 'List Objects' que apresenta um browse com os objetos do programa,
selecionar a frame desejada e ento acionar o boto 'TO TOP';

Boto List Objects;

Boto to Top;
neste estilo, todo trabalho de traduo de labels, helps, screen-values
feito automaticamente por um include padro do estilo. Excees: list-
items do widget combo-box.
Preparao do Relatrio - Interface
1. Verificar quais as pginas que devem ser necessrias ao programa, se as
cinco pginas forem necessrias desconsiderar as tarefas 2, 3, 4 e 5.
2. Eliminar as frames das pginas desnecessrias com base na tabela acima.
3. Eliminar n imagens com as "orelhas" mais a direita, onde n o nmero de
pginas desnecessrias, renomeando as remanescentes conforme a tabela
acima.
4. Em 'Definitions' limpar o contedo dos preprocessadores das pginas
desnecessrias, assim se est informando ao estilo que estas pginas no
existem no relatrio. Exemplo, onde a pgina de digitao no
necessria:
&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

5. Se a pgina de seleo no existir, no 'Main-block' do programa, corrigir a


chamada do include i-rpmbl.i, adicionando o nome da imagem associada a
pgina que se deseja apresentar como inicial, exemplo:
{include/i-rpmbl.i im-pg-par}

Pgina de Seleo
1. Colocar os fill-ins de inicial e final, para cada campo que precisa de faixa.
A sugesto criar como 'Database Fields' e aps convert-los para
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 159

variveis para obter automaticamente os labels, formatos e tamanhos do


dicionrio de dados.
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

2. Corrigir os 'initial values' das variveis de inicial e final.


3. Retirar possveis queries que o UIB automaticamente queira associar a
frame.
Pgina de Classificao
1. Redefinir o 'list-items' do radio-set rs-classif , com as opes de
classificao de seu relatrio;
2. Se necessrio adicionar mais opes de classificao.
Pagina de Parmetros
1. Colocar as variveis necessrias na representao desejada (radio-set,
toggle-box, fill-in), definindo label, formato, initial e help para as mesmas.
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

2. Caso seja necessrio implementar retngulos com label, estes labels devem
ser fill-ins view-as text, e o seu valor deve ser informado no seu initial e
private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
Pgina de Digitao
1. Em 'Definitions', corrigir a definio da temp-table de digitao tt-digita
inserindo os campos necessrios;
160

2. Em 'Section Editor', para o objeto browse br-digita adaptar os seguintes


gatilhos para a nova definio 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
incluso de novas linhas, exceto quando se trata da primeira linha do
browse;
'Row-leave': salva as alteraes feitas pelo usurio.
3. Ainda em 'Section Editor', mas para os botes 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 validaes do browse br-digita devem ser feitas na procedure pi-
executar no local indicado pelo comentrio;
5. Opcionalmente, os gatilhos de 'leave' (para atributos de referncia), 'f5' e
'mouse-select-dblclick' (para acionamento do zoom), para as colunas do
browse podem ser necessrios. Neste caso, tais gatilhos devem ser
codificados " mo", no incio do 'Main Block' do programa. Exemplo:
ON F5, MOUSE-SELECT-DBLCLICK OF tt-digita.<campo> in
browse br-digita do:
{include/zoomvar.i ...}
END.

Observao Para mais detalhes sobre esta tcnica, ver captulo Como implementar Zoom e
campos de referncia para campos de chave estrangeira.

Pgina de Impresso
Na pgina de impresso no necessrio que se tenha qualquer funo
adicional para o seu correto funcionamento. Porm, se necessrio, seguir a
tcnica Como implementar Parmetros de Impresso em Relatrios.
Gravao e validao dos parmetros
1. Em 'Definitions' implementar os campos de parmetros e seleo na
definio da temp-table tt-param.
2. Na procedure 'pi-executar', colocar as validaes necessrias s opes do
usurio para execuo do relatrio no local indicado pelo comentrio,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 161

posicionar na pgina com problemas, colocando o focus no campo com


problemas.
Exemplo 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.

3. Na procedure 'pi-executar', no local indicado pelo comentrio, colocar a


lgica de gravao dos parmetros e seleo na temp-table tt-param.
4. Ainda na procedure 'pi-executar', substituir na chamada do include
{include/i-rprun.i} a literal 'XXP/XX9999RP.P' pelo programa que deve
imprimir o relatrio.

Relatrios no formato RTF


O template est preparado para gerar a sada do relatrio no formato RTF
(Rich Text Format). Para isto no necessrio realizar nenhuma alterao no
programa de interface.
Caso no deseje que o relatrio possua esta funcionalidade basta seguir os
procedimentos descritos abaixo para que o programa funcione corretamente:
Em definitions deve-se alterar o valor do preprocessador RTF para
NO.
Ex: &GLOBAL-DEFINE RTF NO
Na pgina de impresso(f-pg-imp) necessrio remover os
componentes referentes a funcionalidade de RTF. Os componentes
so: text-rtf, l-habilitaRtf, text-modelo-rtf, c-modelo-rtf, bt-modelo-rtf
e rect-rtf.
Reposicionar os componentes de execuo de acordo com o
especificado a seguir: text-modo para column 1,14 e row 4,17, rect-9
para column 2,00 e row 4,46, e rs-execucao para column 2,86 e row
4,83.
Tambm possvel passar durante a inicializao do programa um arquivo de
modelo padro para o relatrio, neste caso o usurio no ser obrigado a
162

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 contm o modelo no formato rtf
Dicas para criao do Programa RP.P de Relatrio
O programa de execuo do relatrio (rp.p) um programa procedural sem
qualquer tipo de interface com o usurio, exceto pela prpria
impresso/visualizao do relatrio e pela caixa de acompanhamento de
execuo (ut-acomp/ut-perc) quando necessrio. Da mesma forma, nenhum
programa chamado a partir de um rp.p no deve possuir qualquer tipo de
interface. Todas as validaes ou informaes com necessidade de interveno
do usurio devem ser tratadas pelo programa .w que o chama.
1. Copiar a definio das temp-tables tt-param e tt-digita (esta ltima se
houver digitao) do programa de interface (.W) para o programa que deve
gerar o relatrio (rp.p);
2. Se a implementao for uma converso de um programa originrio do
MAGNUS:
2.1. retirar a chamada para o include {cdp/cd9000.i} e substituir as
seguintes chamadas:
Include
' Velho Include Novo
Cdp\cd9500.i Include\i-rpvar.i
Cdp\cd9500.fl Include\i-rpcab.i
Cdp\cd9520.i Include\i-rpout.i
Cdp\cd9540.i Include\i-rpclo.i

2.2. caso haja opo de digitao, substituir, com base no programa


original, o work-file de digitao pela temp-table tt-digita.
2.3. substituir, as variveis de parmetro, seleo e classificao pelos
respectivos campos da temp-table tt-param.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 163

3. Utilizar um stream padro definido como STR-RP, para impresso do


relatrio, deve-se passar o parmetro &stream com o nome da stream para
os includes i-rpcab.i, i-rpcb80, i-rpc256.i, i-rpout.i e i-rpclo.i.
Exemplo {include/i-rpcab.i &stream = "str-rp"}
{include/i-rpcb80.i &stream = "str-rp"}
{include/i-rpc256.i &stream = "str-rp"}
{include/i-rpout.i &stream = "stream str-rp"}
{include/i-rpclo.i &stream = "stream str-rp"}.

4. Nas selees, ao invs de utilizar a palavra "", para dar idia de faixa,
substitu-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na
tela de seleo, e que no necessitam ser traduzidos.
5. Todos os labels que no forem do dicionrio de dados e que apaream no
relatrio devem ser tratados atravs dos includes {utp/ut-liter.i}, {utp/ut-
field.i} ou ainda {utp/ut-table.i}.
6. Em todos os forms/frames de impresso deve-se colocar a clusula stream-
io.
7. Para utilizar a funcionalidade de impresso para arquivo RTF:
7.1. definir o prprocessador conforme abaixo:
&GLOBAL-DEFINE RTF YES
7.2. definir o prprocessador abaixo setando o tamanho da pgina:
&SCOPED-DEFINE pagesize N
N o nmero de linhas por pgina e por default seu valor 42.
Este nmero deve ser ajustado para cada relatrio conforme o tamanho
do modelo RTF que vai ser utilizado. Caso este tamanho no esteja
correto ocorrer problema na quebra da pgina.
7.3. a definio da temp-table tt-param deve ser idntica a definio da
mesma no programa de interface.
7.4. condicionar o VIEW das frames de cabealho/rodap no incio do
programa, para que quando o destino for para RTF as mesmas no
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.
164

Exemplo de um /* include de controle de verso */


programa RP.P de {include/i-prgvrs.i SP0014RP 1.00.00.000}
Relatrio
/* prprocessador para ativar ou no a sada para RTF */
&GLOBAL-DEFINE RTF YES

/* prprocessador para setar o tamanho da pgina */


&SCOPED-DEFINE pagesize 42
/* definio das temp-tables para recebimento de parmetros */
DEFINE TEMP-TABLE tt-param NO-UNDO
FIELD destino AS INTEGER
FIELD arquivo AS CHARACTER FORMAT "x(35)"
FIELD usuario AS CHARACTER FORMAT "x(12)"
FIELD data-exec AS DATE
FIELD hora-exec AS INTEGER
FIELD classifica AS INTEGER
FIELD desc-classifica AS CHARACTER FORMAT "x(40)"
FIELD modelo-rtf AS CHARACTER FORMAT "x(35)" /*
arquivo modelo para RTF */
FIELD l-habilitaRtf AS LOG
FIELD ini-cust-num LIKE customer.cust-num /* campo
pgina seleo */
FIELD fim-cust-num LIKE customer.cust-num /* campo
pgina seleo */
FIELD sales-rep LIKE salesrep.sales-rep /* campo
pgina parmetros */
.

DEFINE TEMP-TABLE tt-raw-digita NO-UNDO


FIELD raw-digita AS RAW.

/* recebimento de parmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 165

DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita.

CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.

/* include padro para variveis de relatrio */


{include/i-rpvar.i}

/* definio de variveis */
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.

/* definio de frames do relatrio */


FORM /* usar ordenado por order-num */
Order.Order-num
Order.Cust-Num
Order.Order-Date
Order.Promise-Date
Order.Sales-Rep
Order.Ship-Date
Order.Carrier
WITH FRAME f-order DOWN STREAM-IO.
FORM /* usar ordenado por cust-num */
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-io.
166

/* include padro para output de relatrios */


{include/i-rpout.i &STREAM="stream str-rp"}

/* include com a definio da frame de cabealho e rodap */


{include/i-rpcab.i &STREAM="str-rp"}

/* bloco principal do programa */


ASSIGN c-programa = "SP0014RP"
c-versao = "1.00"
c-revisao = ".00.000"
c-empresa = "Empresa Teste"
c-sistema = "Sports"
c-titulo-relat = "Listagem Order".

/* para no visualizar cabealho/rodap em sada RTF */


IF tt-param.l-habilitaRTF <> YES THEN DO:
VIEW STREAM str-rp FRAME f-cabec.
VIEW STREAM str-rp FRAME f-rodape.
END.

/* executando de forma persistente o utilitrio de


acompanhamento */
RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
{utp/ut-liter.i Imprimindo *}
RUN pi-inicializar IN h-acomp (INPUT RETURN-VALUE).

/* corpo do relatrio */
IF tt-param.classifica = 1 THEN DO:
FOR EACH order WHERE
order.sales-rep = tt-param.sales-rep AND
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 167

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
Order.Cust-Num
Order.Order-num
Order.Order-Date
Order.Promise-Date
168

Order.Sales-Rep
Order.Ship-Date
Order.Carrier WITH FRAME f-customer.
DOWN STREAM str-rp WITH FRAME f-customer.
END.
END.

/*fechamento do output do relatrio*/


{include/i-rpclo.i &STREAM="stream str-rp"}
RUN pi-finalizar IN h-acomp.
RETURN "OK":U.

Preparando o Relatrio para Execuo no Mdulo JOB EXECUTION


Este mdulo, que se encontra no menu de Tecnologia, foi desenvolvido com o
objetivo de agilizar a execuo peridica de listas de programas construdos
atravs da template de relatrio onde, a cada execuo, alguns parmetros
devem ser alterados (geralmente datas). A esta lista de programas dado o
nome de JOB (tarefa).

Cadastro de Encontra-se no menu Manuteno do mdulo Job Execution e seu objetivo


Parmetros e preparar os programas a serem utilizados em uma lista de disparo. Essa
Digitaes preparao consiste em se cadastrar os parmetros e as digitaes necessrios
(JE0101) para que sejam executados estes programas.

Parmetros
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 169

So as informaes que constam nas pastas Seleo, Classificao, Parmetros


e Impresso dos programas de relatrios, ou quaisquer informaes nicas em
programas de outro tipo que sero armazenadas na tabela TT-PARAM para
execuo do mesmo.
Exemplos de parmetros: Perodos para execuo, destino (arquivo,
impressora), nome de arquivo, classificao, intervalos diversos, data e hora
para execuo e etc.

Cadastrando os
Parmetros
170

Clicando no boto Incluir ou Modificar, ser aberta a tela a seguir:

Os campos da tela acima representam exatamente todas as caractersticas dos


parmetros do programa de relatrio na temp-table tt-param.
O preenchimento de todos os campos obrigatrio.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 171

Seqncia: posio do que representa o parmetro na temp-table tt-param


Campo: cdigo do atributo na temp-table tt-param
Tipo: tipo de dado do atributo na temp-table tt-param
Extent: Indica, quando assinalado, que o atributo tem extent
Tamanho: tamanho do extent (s pode ser informado se tiver sido marcado
extent)
Formato: formato do atributo da temp-table tt-param (deve respeitar os
padres Progress)
Label: label do atributo na temp-table tt-param
Ajuda: texto de ajuda a ser apresentado ao usurio, na parte inferior da
janela, quando o cursor estiver posicionado sobre o atributo
Importante: o contedo deve esclarecer a quem estiver utilizando
o mdulo qual valor o atributo precisa assumir. Por exemplo:
Se o campo Destino pudesse ter os valores 1 e 2 os quais
significassem, respectivamente, Arquivo e Impressora, no
campo Ajuda deveria ser escrito: 1 Arquivo, 2 Impressora
Val Default valor padro a ser utilizado para o atributo e s poder ser
preenchido aps ter sido informado o formato
se o atributo extent estiver marcado, o valor default ser uma
lista de valores separados por vrgulas

Digitaes So informaes que podem ter n valores diferentes para a execuo do


programa, como segue abaixo, no relatrio Resumo de Ordens de Servio.
Cada ocorrncia (linha) dessa digitao chamada registro e sua quantidade
ilimitada. Somente programas que possuam a pasta digitaes em sua
execuo normal devero possuir digitaes cadastradas.
172

Aps cadastrados os campos de digitaes, clique no boto registros e informe


os valores default para cada campo em N registros.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 173

Consideraes Deve sempre ser observada o label e o valor default utilizada na tela do
sobre o programa original, pois muitas vezes o nome do campo no expressa em
cadastramento de detalhes o significado correto do mesmo.
campos

Exportao JOB Encontra-se no menu Tarefas do mdulo Job Execution e nessa opo fazemos
Execution (JE0104) a exportao dos parmetros e digitaes do programa que foi preparado para
ser executado neste mdulo, atravs do devido cadastramento de seus
parmetros e digitaes.
174

Para fazer a exportao, basta informar o nome do diretrio onde sero


gerados os arquivos .JED (digitaes) e .JEP (parmetros) dos programas, o
intervalo dos programas a serem gerados e clicar em Executar.
Os nomes dos arquivos sero os mesmos dos programas. Ex.: Para o programa
ap0707rp.p ser gerado o ap0707rp.jed (digitaes e ap0707.jep (parmetros).
Caso deseje consultar o lay-out do arquivo gerado, selecione a pasta Lay-out.
Nela encontram-se os lay-outs dos dois arquivos gerados: parmetros e
digitaes.
Aps a gerao destes arquivos, os mesmos devero ser gravados no
Roundtable para que sejam expedidos normalmente pelo produto e importados
na base do cliente para sua utilizao no mdulo JOB EXECUTION.
Observao O mdulo JOB EXECUTION somente estar disponvel para uso interno
(Datasul S.A.) ou para clientes que tiverem adquirido o produto. Para maiores informaes
referentes ao produto, dever ser consultado o manual do produto, localizado no diretrio
DOCPDF/DTSUL.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 175

Como construir um programa de Parmetros nicos


Estilo
' Utilizado Nome Fsico
Window Parmetros nicos Masters/w-paruni.w
Implementao selecionar o estilo relacionado na tabela acima;
verificar se j existe uma SmartQuery para a tabela que se deseja construir
o programa de Parmetros nicos. Caso no exista, criar uma nova
utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 1 da SmartWindow;
verificar se j existe uma SmartViewer com os atributos que devem ser
editados. Caso no exista, criar uma nova utilizando o estilo
CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar esta e outras SmartViewers a partir da pgina 1 no folder e


aceitar a sugesto de SmartLink do Wizard;
se existirem mais de uma SmartViewer, devem ser criados SmartLinks de
GROUP-ASSIGN, tendo como Source a SmartViewer da pgina 1 e como
a Target a SmartViewer corrente;
inserir a seguinte lgica aps o run-dispatch da local-initialize da
SmartWindow:
find first <tabela> no-lock no-error.
if not avail <tabela> then do:
run notify in this-procedure ('add-record':U).
end.
else
run new-state('update-begin':U).
run dispatch in this procedure ('enable-fields').
176

criar um SmartLink de TABLEIO, tendo como Source THIS-


PROCEDURE e como Target a SmartViewer da pgina1;
redimensionar o Folder e a SmartWindow de acordo com os objetos nela
instanciados;
salvar a SmartWindow com o nome definido para o programa de
Parmetros nicos.

Como construir um programa de Formao


Estilo
' Utilizado Nome Fsico
Window Formao Masters/w-forma.w
Implementao selecionar o estilo relacionado na tabela acima;
verificar se j existe uma SmartQuery para a tabela que se deseja construir
o programa de Formao. Caso no exista, criar uma nova utilizando o
estilo CustomQuery Wizard;
instanciar a SmartQuery na pgina 0 da SmartWindow e aceitar as
sugestes de SmartLink do Wizard;
verificar se j existe um programa de V para e um programa de pesquisa
para a tabela que se deseja construir um programa de formao. Caso no
existam, eles devem ser criados;
acessar os atributos de instncia da SmartQuery e informar no atributo
"Programa Pesquisa" o nome do programa de pesquisa da tabela e no
atributo "Programa V Para" o nome do programa de V para da tabela;
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 que
devem ser pesquisados. Caso no exista, criar uma nova SmartViewer
utilizando o estilo CustomViewer com Auto-Field;
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 177

opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.

instanciar a SmartViewer na pgina 0 da SmartWindow;


verificar se j existe um SmartBrowser que contenha os dados que servem
de fonte para o SmartBrowser de Formao. Caso no exista, criar um
novo utilizando o estilo CustomBrowser Wizard; na construo desse
SmartBrowser, deve ser observado o seguinte:
como exceo regra, ele deve ser redimensionado, de modo que
caiba no lado esquerdo dos botes bt-add e bt-del da window
formao;
deve ser criada uma trigger de MOUSE-SELECT-DOUBLE-CLICK
e inserido o seguinte cdigo:
RUN NEW-STATE(INPUT 'incluir-browse':U).

instanciar o SmartBrowser que serve de fonte para o SmartBrowser de


Formao no lado esquerdo da pgina 0 da SmartWindow;
criar um SmartLink do tipo STATE, tendo como Source: o SmartBrowser
fonte e como Target: THIS-PROCEDURE;
verificar se j existe um SmartBrowser com a tabela de formao. Caso
no exista, criar um novo utilizando o estilo CustomBrowser Formao;
na construo desse SmartBrowser, devem ser observados os seguintes
aspectos:
deve ser definida como tabela externa, a tabela utilizada na
SmartQuery do programa de Formao;
retirar os comentrios da Procedure PI-ADD-BROWSE e substituir
pelos dados a seguir:
<tabela-1>: nome da tabela que est sendo realizada a navegao
<tabela-2>: nome da tabela do SmartBrowser fonte
<tabela-formao>: nome da tabela do SmartBrowser formao
<campo-1>: campo da <tabela-1> que deve constituir parte da chave
da tabela de formao
178

<campo-2>: campo da <tabela-2> que deve constituir parte da chave


da tabela de formao
se for necessrio, ajustar a lgica da Procedure PI-ADD-BROWSE de
modo que atenda as necessidades do programa.
Exemplo def input parameter rw-row-1 as rowid no-undo.
def input parameter rw-row-2 as rowid no-undo.
def var i-next-line-num as integer no-undo.
find order where rowid(order) = rw-row-1 no-lock.
find item where rowid(item) = rw-row-2 no-lock.
find last order-line
where order-line.order-num = order.order-num no-lock no-error.
if avail order-line then
assign i-next-line-num = order-line.order-num + 1.
else
assign i-next-1 line num = 1.
create order-line.
assign order-line.order-num = order.order-num
order-line.item-num = item.item-num
order-line.line-num = i-next-line-num.

inserir o seguinte cdigo na trigger de MOUSE-SELECT-CLICK:


RUN PI-POSICAO-BROWSE IN THIS-PROCEDURE (OUTPUT v-
row).
FIND <tabela-formao> WHERE ROWID (<tabela-formao>)
= V-ROW no-error.
IF AVAIL (<tabela-formao>) THEN DO:
DELETE (<tabela-formao>).
RUN DISPATCH IN THIS-PROCEDURE (INPUT 'open-
query':U).
END.

instanciar o SmartBrowser de formao no lado direito da pgina 0 da


SmartWindow;
criar um SmartLink do tipo STATE, tendo como Source: SmartBrowser
formao e como Target: THIS-PROCEDURE;
acessar os atributos de instncia do SmartBrowser de formao e informar
no atributo "Programa Atributo" o nome do programa de modificao dos
atributos do registro de formao. Para criar este programa de
modificao, deve ser utilizado o estilo Window Inclui/Modifica Filho;
na procedure STATE-CHANGED da SmartWindow e na trigger do boto
"INCLUIR(>)", retirar os comentrios e substituir pelos dados a seguir:
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 179

<h_query>: handle da SmartQuery


<h_browse>: handle do SmartBrowser fonte do SmartBrowser de
formao
<h_browse-formao>: handle do SmartBrowser de formao
na trigger do boto de "RETORNO(<)", retirar os comentrios e substituir
pelos dados a seguir:
<h_browse>: handle do SmartBrowser de formao
<tabela-formao>: nome da tabela de formao
redimensionar a SmartWindow de acordo com os objetos que foram
colocados na tela. Ter o cuidado para que a SmartViewer fique
centralizada na SmartWindow;
salvar a SmartWindow com o nome definido para a Consulta
Relacionamento.

Lista de Links:
Source
' Link Type Target
h_browse-formao STATE THIS-PROCEDURE
h_p-exihel STATE h_query
180

h_p-navega NAVIGATION h_query


h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browse-formao
THIS PROCEDURE STATE h_browse-fonte

Como construir um programa de Formao sem Navegao


Estilo
' Utilizado Nome Fsico
Window Formao sem Navegao Masters/w-form2.w
Implementao estilo de formao sem navegao dependente, ou seja, deve sempre ser
chamado a partir de um CustomBrowser Formao Filho. O boto
"Formao" deve chamar o estilo de Formao sem Navegao;
o template utilizado para construo deste tipo de programa no utiliza
SmartObjects;
identifique que tabelas servem como:
Pai;
Origem;
Destino;
seguir sempre a seqncia descrita neste documento pois a ordem em que
as tarefas so executadas podem afetar o resultado da construo do
programa (por exemplo, os campos da tabela pai no podem jamais ser a
primeira coisa a ser colocada na tela, bem como a consulta da tabela
destino deve ser feita aps definirmos a consulta da tabela origem);
jamais eliminar um "include" padro mesmo que ele no possua nenhum
contedo/lgica;
Objetos do programa:
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 181

Seqncia
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 seo 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 seo de definies com o nome da tabela pai;
5. Acrescentar dentro da procedure local-initialize lgica para carregar a
temp-table com os registros que j existem na tabela de destino.
182

6. Criar funes e procedures internas:


criar funo para mostrar o registro da tabela pai (pi-show-master-
record);
criar incluso no browse destino:
Procedure pi-ins - l os registros selecionados verifica se o registro
pode ser includo, atravs da funo is-create-allowed, e caso a
incluso seja permitida executa a procedure pi-add-to-target;
Funo is-create-allowed - valida se o registro no existe ainda no
browse destino, ou realiza outras regras de negcio que verificam
se a incluso valida retorna um status que indica o resultado dos
testes;
Procedure pi-add-to-target - realiza o create e o assign no browse
destino (temp-table);
criar eliminao do browse destino:
Procedure pi-del - l os registros selecionados e para cada um
deles executa regras de negcio que verificam se a eliminao
permitida (atravs da funo is-delete-allowed) e realiza a
eliminao quando permitida pela funo atravs da procedure pi-
delete-from-target (elimina da temp-table).
criar uma procedure interna (pi-commit) que transfira os registros da
temp-table para a tabela de destino, esta procedure chamada pelo
evento choose do boto 'Ok':
Como construir um Browse Formao Filho
Estilo
' Utilizado Nome Fsico
CustomBrowser Formao Filho Masters/wbrwfrm.w
Implementao utilizar o wizard, atentando para o seguinte:
deve ser informada a tabela externa;
na clusula Options, deve-se fazer as seguintes alteraes:
modificar na coluna Returned de All Fields para Fields Used;
desmarcar as opes Key-Phrase e SortBy-Phrase.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 183

o index-reposition deve ser sempre setado. Para tanto, na clusula


Table, deve-se marcar a opo Indexed-Reposition.
salvar o CustomBrowse com o nome definido para Browse de Formao
Filho.

Como construir um programa de Importao


Para a construo de programas de importao deve-se utilizar o estilo
Window Importao/Exportao (w-impor.w), que uma variao do estilo de
relatrios, portanto sem SmartViewer e SmartFolders.
Dicas Gerais
tabela de para de folder/pginas e com objetos relacionados:
Pgina-Folder
' Frame Imagem Preprocessador
Layout f-pg-lay im-pg-lay PGLAY
Seleo f-pg-sel im-pg-sel PGSEL
Parmetros f-pg-par im-pg-par PGPAR
Log f-pg-log im-pg-log PGLOG
para selecionar uma pgina para trabalhar utilizar o boto 'List-Objects',
que apresenta um browse com os objetos do programa, ento sobre o
frame relacionado pgina, acionar o boto 'TO TOP';

Boto List Objects;

Boto To Top;
tambm, neste estilo, todo trabalho de traduo de labels, helps, screen-
values deve ser feito automaticamente por um include padro do estilo.
Excees: list-items do widget combo-box;
durante a importao, existem duas streams abertas, uma para importao
dos dados e outra para impresso do log;
o log de importao pode ser completo, na opo. 'Todos' ou imprimir
somente os registros que apresentaram erro, atravs da opo 'Rejeitados'.
184

Preparao do programa
1. Verificar quantas pginas so necessrias, as pginas de layout,
parmetros e log so obrigatrias, somente a pgina de seleo opcional,
caso haja seleo 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 contedo dos preprocessadores PGSEL
&GLOBAL-DEFINE PGLAY f-pg-lay
&GLOBAL-DEFINE PGSEL
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGLOG f-pg-log

5. Se a pgina de seleo no existir, no 'Main-block' do programa, corrigir a


chamada do include i-immbl.i, passando como parmetro posicional a
imagem da pgina, onde o programa deve apresentar inicialmente,
exemplo:
{include/i-immbl.i im-pg-par}

Pgina de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parmetros, informar neste o nome do
programa no formato XX9999 e a verso do layout no formato 999 (o
valor inicial da verso 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versolayout=001 }

Criar um arquivo que contenha o layout de importao, nos padres do


Produto Datasul-EMS.
2. Este arquivo tem o seguinte nome e path: LAYOUT/LOXX9999.001.
Pgina de Seleo
1. Colocar os fill-ins de inicial e final, para cada campo que precisar de
faixa. A sugesto cri-los como 'Database Fields' e aps convert-los
para variveis para obter automaticamente os labels, formatos e tamanhos
do dicionrio de dados.
2. Corrigir os 'initial values' das variveis de inicial e final.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 185

3. Retirar possveis queries que o UIB automaticamente queira associar a


frame.
Pagina de Parmetros
1. Colocar as variveis necessrias na representao desejada (radio-set,
toggle-box, fill-in), definindo label, formato, initial e help para as mesmas.
2. Caso seja necessrio implementar retngulos com label, estes labels devem
ser fill-ins 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. No on choose do bt-arquivo-entrada, pode ser adicionado um terceiro
parmetro na include i-imarq.i , onde possvel passar como parmetro os
filtros que sero utilizados na sistem dialog, se no for passado nada neste
parmetro a include assumira como padro o tipo de arquivo *.lst e todos
os tipos de arquivos.
Exemplo
DO:
{include/i-imarq.i c-arquivo-entrada f-pg-par "'*.XLS' '*.xls' , 'todos' '*.*'" }
END.

Pgina de Log
No existem tarefas.
Gravao e validao dos parmetros
1. Em 'Definitions', implementar os campos de parmetros e seleo na
definio da temp-table tt-param.
2. Na procedure 'pi-executar', colocar as das pginas de parmetros e seleo,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
posicionar na pgina com problemas, colocando o focus no campo com
problemas.
Exemplo 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.
186

3. Na procedure 'pi-executar', colocar a lgica de gravao dos parmetros e


seleo na temp-table tt-param.
4. Ainda na procedure 'pi-executar', substituir na chamada do include
{include/i-imrun.i} a literal 'XXP/XX9999RP.P' pelo programa que deve
importar os registros.
Dicas para criao do Programa RP.P de Importao
O programa de execuo do relatrio (rp.p) um programa procedural sem
qualquer tipo de interface com o usurio, exceto pela caixa de
acompanhamento de execuo (ut-acomp/ut-perc) quando necessrio. Da
mesma forma, nenhum programa chamado a partir de um rp.p no deve
possuir qualquer tipo de interface. Todas as validaes ou informaes com
necessidade de interveno do usurio devem ser tratadas pelo programa .w
que o chama.
1. Definir uma stream para a importao, deixando a stream padro definido
como STR-RP para a impresso do log.
2. Se a implementao for uma converso de um programa originrio do
MAGNUS, retirar a chamada para o include {cdp/cd9000.i} e substituir as
seguintes chamadas, referentes a impresso do log de importao:
Include
' Velho Include Novo
Cdp\cd9500.i Include\i-rpvar.i
Cdp\cd9500.fl Include\i-rpcab.i
Cdp\cd9520.i Include\i-rpout.i
Cdp\cd9540.i Include\i-rpclo.i
2.1. Substituir as variveis de parmetros e seleo pelos respectivos
campos da temp-table tt-param.
3. Utilizar um stream padro definido como STR-RP, para impresso do log,
deve-se passar o parmetro &stream com o nome da stream para os
includes i-rpcab.i, i-rpcb80, i-rpc256.i, i-rpout.i e i-rpclo.i.
Exemplo {include/i-rpcab.i &stream = "str-rp"}
{include/i-rpcb80.i &stream = "str-rp"}
{include/i-rpc256.i &stream = "str-rp"}
{include/i-rpout.i &stream = "stream str-rp"}
{include/i-rpclo.i &stream = "stream str-rp"}.

4. Na chamada do include i-rpout.i, passar o parmetros {&tofile}. Exemplo:


{include/i-rpout.i &tofile=tt-param.arq-destino}
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 187

5. Todos os labels que no forem do dicionrio de dados e que apaream no


log devem ser tratados atravs dos includes {utp/ut-liter.i}, {utp/ut-field.i}
ou ainda {utp/ut-table.i}.
6. Em todos os forms/frames de impresso deve-se colocar a clusula stream-
io.
7. Nas selees, ao invs de utilizar a palavra "", para dar idia de faixa,
substitu-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na
tela de seleo, e que no necessitam ser traduzidos.
Exemplo de um /* include de controle de verso */
programa RP.P de {include/i-prgvrs.i XX9999RP 1.00.00.000}
Importao /* definio das temp-tables para recebimento de parmetros */
define temp-table tt-param
field destino as integer
field arq-destino as char
field arq-entrada as char
field todos as integer
field usuario as char
field data-exec as date
field hora-exec as integer
field cust-ini as integer
field cust-fim as integer

def temp-table tt-raw-digita


field raw-digita as raw.
/* recebimento de parmetros */
def input parameter raw-param as raw no-undo.
def input parameter tabel for tt-raw-digita.
create tt-param.
raw-transfer.raw-param to tt-param.
/* include padro para variveis para o log */
{include/i-rpvar.i}
/* definio de variveis e streams */
def stream s-imp.
def var h-acomp as handle no-undo.
def var c-linha as char no-undo.
def var i-cust as int no-undo.
/* definio de frames do log */
/* include padro para output de log */
188

{include/i-rpout.i &STREAM="stream str-rp" &TOFILE=tt-param.arq-


destino}
/* include com a definio da frame de cabealho e rodap */
{include/i-rpcab.i &STREAM="str-rp"}
/* bloco principal do programa */
assign c-programa = "XX0006RP"
c-versao = "1.00"
c-revisao = ".00.000"
c-empresa = "Empresa Teste"
c-sistema = 'Sports'
c-titulo-relat = "Listagem de Erros da Importao de
Clientes".
view stream str-rp frame f-cabec.
view stream str-rp frame f-rodape.
run utp/ut-acomp.p persistent set h-acomp.
{utp/ut-liter.i Importando *}

run pi-inicializar in h-acomp (input RETURN-VALUE).


/* define o arquivo de entrada informando na pgina de
parmetros */
input stream s-imp from value(tt-param.arq-entrada).
/* bloco principal do programa */
repeat on stop undo, leave:
import stream s-imp unformatted c-linha.
run pi-acompanhar in h-acomp (input c-linha).
assign i-cust = integer(substring(c-linha,1,5)).
find customer where customer.cust-num = i-cust no-lock.
if not avail customer then do:
create customer.
assign customer.cust-num = i-cust
customer.name = substring(c-linha,5).
end.
end.
input stream s-imp close.
/* fechamento do output do log */
{include/i-rpclo.i &STREAM="stream str-rp"}
run pi-finalizar in h-acomp.
return "Ok":U.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 189

Como construir um programa de Exportao


Para a construo de programas de exportao deve-se utilizar o estilo
Window Importao/Exportao (w-impor.w), que uma variao do estilo de
relatrios, portanto sem SmartViewers e SmartFolders.
Dicas Gerais
tabela de para de folder/pginas e com objetos relacionados:
Pgina-Folder
' Frame Imagem Preprocessador
Layout f-pg-lay im-pg-lay PGLAY
Seleo f-pg-sel im-pg-sel PGSEL
Parmetros f-pg-par im-pg-par PGPAR
Log f-pg-log im-pg-log PGLOG
para selecionar uma pgina para trabalhar utilizar o boto 'List-Objects',
que apresenta um browse com os objetos do programa, ento sobre o
frame relacionado pgina, acionar o boto 'TO TOP';

Boto List Objects;

Boto To Top;
tambm, neste estilo, todo trabalho de traduo de labels, helps, screen-
values deve ser feito automaticamente por um include padro do estilo.
Excees: list-items do widget combo-box;
durante a exportao, existem duas streams abertas, uma para exportao
dos dados e outra para impresso do log;
Preparao do programa
1. Verificar quantas pginas so necessrias, as pginas de layout,
parmetros e log so obrigatrias, somente a pgina de seleo opcional,
caso haja seleo 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 contedo dos preprocessadores PGSEL
190

&GLOBAL-DEFINE PGLAY f-pg-lay


&GLOBAL-DEFINE PGSEL
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGLOG f-pg-log

5. Se a pgina de seleo no existir, no 'Main-block' do programa, corrigir a


chamada do include i-immbl.i, passando como parmetro posicional a
imagem da pgina, onde o programa deve apresentar inicialmente,
exemplo:
{include/i-immbl.i im-pg-par}

Pgina de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parmetros, informar neste o nome do
programa no formato XX9999 e a verso do layout no formato 999 (o
valor inicial da verso 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versolayout=001 }

2. Criar um arquivo que contenha o layout de importao, nos padres do


Produto Datasul-EMS.
3. Este arquivo tem o seguinte nome e path: LAYOUT/LOXX9999.001.

Pgina de Seleo
1. Colocar os fill-ins de inicial e final, para cada campo que precisar de
faixa. A sugesto cri-los como 'Database Fields' e aps convert-los
para variveis para obter automaticamente os labels, formatos e tamanhos
do dicionrio de dados.
2. Corrigir os 'initial values' das variveis de inicial e final.
3. Retirar possveis queries que o UIB automaticamente queira associar a
frame.
Pgina de Parmetros
1. Colocar as variveis necessrias na representao desejada (radio-set,
toggle-box, fill-in), definindo label, formato, initial e help para as mesmas.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 191

2. Caso seja necessrio implementar retngulos com label, estes labels devem
ser fill-ins 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
retngulo para "Arquivo de Sada".
4. No on choose do bt-arquivo-entrada, pode ser adicionado um terceiro
parmetro na include i-imarq.i , onde possvel passar como parmetro os
filtros que sero utilizados na sistem dialog, se no for passado nada neste
parmetro a include assumira como padro o tipo de arquivo *.lst e todos
os tipos de arquivos.
Exemplo
DO:
{include/i-imarq.i c-arquivo-entrada f-pg-par "'*.XLS' '*.xls' , 'todos' '*.*'" }
END.

Pgina de Log
1. Remover o retngulo, o label e o radio-set com as opes "Todos" e
"Rejeitados".
2. Mover todos os outros objetos desta frame para cima. No esquecer do
boto "Configurar Impressora".
Gravao e validao dos parmetros
1. Em 'Definitions', implementar os campos de parmetros e seleo na
definio da temp-table tt-param.
2. Eliminar o campo todos da temp-table tt-param.
3. Na procedure 'pi-executar', colocar as validaes das pginas de
parmetros e seleo, lembrando que elas devem apresentar uma
mensagem de erro cadastrada, posicionar na pgina com problemas,
colocando o focus no campo com problemas.
Exemplo if input frame f-pg-par i-nr-nivel > 19 then do:
run utp/ut-msgs.p (input "show",
input 73,
192

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.

4. Na procedure 'pi-executar', substituir o cdigo de validao do arquivo de


entrada:
assign file-info: file-name = input frame f-pg-par c-arquivo-
entrada.
if file-info:pathname = ? then do:
run utp/ut-msgs.p (input "show",
input 326,
input c-arquivo-entrada).
apply 'mouse-select-click' to im-pg-par in frame f-import.
apply 'entry' to c-arquivo-entrada 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.

5. Na procedure 'pi-executar', colocar a lgica de gravao dos parmetros e


seleo na temp-table tt-param.
6. Ainda na procedure 'pi-executar', substituir na chamada do include
{include/i-imrun.i} a literal 'XXP/XX9999RP.P' pelo programa que
exportar os registros.
Dicas para criao do Programa RP.P de Exportao
O programa de execuo da exportao (rp.p) um programa procedural sem
qualquer tipo de interface com o usurio, exceto pela caixa de
acompanhamento de execuo (ut-acomp/ut-perc) quando necessrio. Da
mesma forma, nenhum programa chamado a partir de um rp.p no deve
possuir qualquer tipo de interface. Todas as validaes ou informaes com
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 193

necessidade de interveno do usurio devem ser tratadas pelo programa .w


que o chama.
1. Definir uma stream para a importao, deixando a stream padro definido
como STR-RP para a impresso do log.
2. Se a implementao for uma converso de um programa originrio do
MAGNUS, retirar a chamada para o include {cdp/cd9000.i} e substituir as
seguintes chamadas, referentes a impresso do log de exportao:
Include
' Velho Include Novo
Cdp\cd9500.i Include\i-rpvar.i
Cdp\cd9500.fl Include\i-rpcab.i
Cdp\cd9520.i Include\i-rpout.i
Cdp\cd9540.i Include\i-rpclo.i
2.1 Substituir as variveis de parmetros e seleo pelos respectivos
campos da temp-table tt-param.
3. Utilizar um stream padro definido como STR-RP, para impresso do log,
deve-se passar o parmetro &stream com o nome da stream para os
includes i-rpcab.i, i-rpcb80, i-rpc256.i, i-rpout.i e i-rpclo.i.
Exemplo {include/i-rpcab.i &stream = "str-rp"}
{include/i-rpcb80.i &stream = "str-rp"}
{include/i-rpc256.i &stream = "str-rp"}
{include/i-rpout.i &stream = "stream str-rp"}
{include/i-rpclo.i &stream = "stream str-rp"}.

4. Na chamada do include i-rpout.i, passar o parmetro {&tofile}. Exemplo:


{include/i-rpout.i &stream = "stream str-rp" &tofile=tt-
param.arq-destino}

5. Todos os labels que no forem do dicionrio de dados e que apaream no


log devem ser tratados atravs dos includes {utp/ut-liter.i}, {utp/ut-field.i}
ou ainda {utp/ut-table.i}.
6. Em todos os forms/frames de impresso deve-se colocar a clusula stream-
io.
7. Nas selees, ao invs de utilizar a palavra "", para dar idia de faixa,
substitu-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na
tela de seleo, e que no necessitam ser traduzidos.
194

Exemplo de um /* include de controle de verso */


programa RP.P de {include/i-prgvrs.i XX9999RP 1.00.00.000}
Exportao /* definio das temp-tables para recebimento de parmetros */
define temp-table tt-param
field destino as integer
field arq-destino as char
field arq-entrada as char
field usuario as char
field data-exec as date
field hora-exec as integer

def temp-table tt-raw-digita


field raw-digita as raw.
/* recebimento de parmetros */
def input parameter raw-param as raw no-undo.
def input parameter tabel for tt-raw-digita.
create tt-param.
raw-transfer.raw-param to tt-param.
/* include padro para variveis para o log */
{include/i-rpvar.i}
/* definio de variveis e streams */
def stream s-exp.
def var h-acomp as handle no-undo.

/* definio de frames do log */


/* include padro para output de log */
{include/i-rpout.i &STREAM="stream str-rp" &TOFILE=tt-param.arq-
destino}
/* include com a definio da frame de cabealho e rodap */
{include/i-rpcab.i &STREAM="str-rp"}
/* bloco principal do programa */
assign c-programa = "XX0006RP"
c-versao = "1.00"
c-revisao = ".00.000"
c-empresa = "Empresa Teste"
c-sistema = 'Sports'
c-titulo-relat = "Listagem de Erros da Exportao de
Clientes".
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 195

view stream str-rp frame f-cabec.


view stream str-rp frame f-rodape.
run utp/ut-acomp.p persistent set h-acomp.
{utp/ut-liter.i Exportando *}

run pi-inicializar in h-acomp (input RETURN-VALUE).


/* define a sada para o arquivo de sada informando na pgina
de parmetros */
output stream s-exp from value(tt-param.arq-entrada).
/* bloco principal do programa */
for each customer on stop undo, leave:
run pi-acompanhar in h-acomp (input string(customer.cust-
num)).
put stream s-exp unformatted string(customer.cust,
"99999")
string(customer.name,"x(40)")
skip.
end.
output stream s-exp close.
/*fechamento do output do log */
{include/i-rpclo.i &STREAM="stream str-rp"}
run pi-finalizar in h-acomp.
return "Ok":U.

Como construir um programa de Pesquisa


'Estilo utilizado Nome Fsico
Window Pesquisa Masters/w-pesqui.w
Implementao selecionar o estilo relacionado na tabela acima;
necessrio utilizar um SmartBrowser para cada classificao do
programa de Pesquisa, onde a ordem das colunas no browser deve ser a
ordem de classificao, para todos os SmartBrowsers que devem estar
colocados no programa de Pesquisa, seguir os seguintes passos:
verificar se j existe um SmartBrowser com os dados necessrios para
a pesquisa e se eles devem estar na mesma ordem da classificao
196

desejada. Caso no exista, criar um novo utilizando o estilo


CustomBrowserZoom Wizard;
instanciar o SmartBrowser no SmartFolder;

criar um SmartLink do tipo STATE, tendo como Source o


SmartBrowser recm instanciado e como Target, THIS-
PROCEDURE;
recomenda-se que cada SmartBrowser das diferentes pginas do
SmartFolder tenha o mesmo tamanho;
redimensionar o SmartFolder e a SmartWindow de acordo com os objetos
nela instanciados;
alterar os labels das pginas dos folders atravs do Instance Atributes;
salvar a SmartWindow com o nome definido para o programa pesquisa.
Source
' Link Type Target
h_browse STATE THIS-PROCEDURE
h_folder PATE THIS-PROCEDURE
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 197

Como construir um programa "V Para"


Estilo
' Utilizado Nome Fsico
Dialog VaPara Masters/d-vapara.w
Implementao em New, selecionar o template acima;
escolher a tabela que o programa dever consultar;

Escolher os campos que devem existir na tela do V para:

Ajustar os campos na tela;


salvar o SmartDialog com o nome definido para o programa "V Para".
Observao O template ir gerar automticamente a TRIGGER GO da janela que faz todo o
tratamento necessrio para o programa
198

Sugesto Para que os campos sejam exibidos no tamanho adequado (altura 0.88) voc deve
alterar as seguintes propriedades:
1. No AppBuilder Acessar Options - Preferences
2. Selecionar o folder Grid Units
3. Alterar a opo Layout Units para Pixel
4. Preencher os campos com valor 1
Ou alterar o tamanho dos campos manualmente.

Como construir um programa de Digitao Rpida


Estilo
' Utilizado Nome Fsico
Window Digitao Rpida Masters/w-digit.w
Implementao selecionar o estilo relacionado na tabela acima;
verificar se j existe uma CustomViewerDigita que atenda as
necessidades, caso no exista, deve ser criada uma nova, utilizando o estilo
CustomViewerDigita, lembrando-se que a nica condio para esta viewer
a utilizao de variveis, e no a utilizao de DBFields;
instanciar a CustomViewerDigita na pgina 1 da
WindowDigitaoRpida;
verificar se j existe um CustomBrowserDigita que atenda as
necessidades, caso no exista, deve ser criado um novo, utilizando o estilo
CustomBrowserDigita. Este browser deve utilizar uma temp-table;
instanciar o CustomBrowserDigita na pgina 2 da
WindowDigitaoRpida;
redimensionar a WindowDigitaoRpida de acordo com os objetos que
foram colocados nela;
salvar a WindowDigitaoRpida com o nome definido para Janela
Digitao Rpida;
Como construir um Browse de Digitao
Estilo
' Utilizado Nome Fsico
CustomBrowserDigita Masters/b-digit.w
Implementao selecionar o estilo relacionado na tabela acima;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 199

alterar a definio da temp-table no bloco de definitions conforme


necessidade. No eliminar o campo "line";
alterar a trigger de open_query, substituindo a clusula <temp-table> pelo
nome da temp-table definida anteriormente;
alterar a trigger de display, substituindo as clusulas <campo1> <campo2>
pelos campos que devem estar no browse; aps o comando enable
substituir as clusulas <campo1> <campo2> pelos campos editveis do
browse;
alterar a pi-salva-rel para que esta possa gravar todos os valores do
browse. No necessrio gravar o campo "line"; na chamada da pi-busca-
valor, conforme instrues na pi, informar o nome das variveis que esto
na viewer e que se deseja retornar o valor destas para o browse, os valores
sero retornados por intermdio do comando return-value, a lista retornada
ser gravada numa varivel e o usurio deve utilizar esta varivel e o
comando ENTRY para trabalhar com estes valores;
colocar todas as validaes na pi-salva-rel, validando assim os valores
informados no browse a cada incluso de um novo registro no browse;
na pi-cria-registro deve ser feita a leitura dos registros da temp-table e
criados os registros na tabela fsica. Esta pi chamada no choose bo boto
OK;
salvar o browse com o nome definido para Browse de Digitao Rpida.

Como construir uma Query


Estilo
' Utilizado Nome Fsico
Custom Query Wizard Masters/wquery.w
Implementao em Arquivo | Novo, selecionar o estilo relacionado acima;

seguir os passos indicados pelo Wizard atentando para que, se a viewer


no contiver clusula where, em query definitions seja assinalado o toggle
box Index Reposition;
200

Como construir viewers


Estilo
' Utilizado Nome Fsico
Custom Viewer com AutoField Masters/vieweraf.w
Implementao em Arquivo | Novo, selecionar o estilo citado acima;
de acordo com os objetos a serem instanciados na viewer, seguir a tcnica
correspondente:
Padro;
Sem campos de tabela;
S com campos chave;
Como definir viewer Padro
Viewer Padro aquela que possui ao menos um campo no chave de tabela.
necessrio para uma Viewer Padro, possuir ao menos um campo de tabela
habilitado, esse campo no pode ser chave de tabela.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 201

na dialog que se abrir logo aps a seleo do template, selecionar a(s)


tabela(s) a serem utilizadas na viewer;
na janela aps a seleo da(s) tabela(s), selecionar os campos a serem
utilizados;
a seguir pode ou no ser apresentada uma mensagem questionando se a
viewer deve suportar chaves estrangeiras, caso acontea, clicar em Cancel;
se a viewer for utilizada em um cadastro do tipo simples, no incio da
procedure local-assign-records necessrio substituir a linha contendo:
{include/i-valid.i}

por estas a seguir:


if not frame {&frame-name}:validate() then
return 'ASM-ERROR':U.

alterar a altura de todos os atributos de tipo fill-in para 0.88;


para os atributos que formam a chave de acesso da tabela, caso forem
postos na tela:
tornar os atributos desabilitados, atravs de propriedades,
desmarcando o toggle-box 'Enable';
em propriedades e Advanced, marcar o toggle-box '{&ADM-
CREATE-FIELDS}';
colocar o primeiro atributo na linha 1.17;
caso exista mais de um atributo chave:
coloc-los em espaamento 1, ou seja, na linha 2.17, 3.17, etc.;
alterar a altura do retngulo rt-key para o nmero de atributos
chave + 0.25, ou seja, 2.25, 3.23, etc.;
alterar a linha inicial do retngulo rt-mold para a altura do rt-key +
1.25;
se no forem colocados atributos chave:
eliminar o retngulo rt-key;
mover o retngulo rt-mold para a linha 1;
202

para os atributos que no 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 espaamento de 1 (Exemplo:
3.67, 4.67);
alterar a altura do retngulo rt-mold de modo a apenas caber os
atributos dentro;
colocar na SmartViewer outros objetos, como por exemplo combo-box,
que no esto associados aos campos no banco de dados;
para os objetos no associados ao banco de dados e que devem ser
atualizados pelo usurio, 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
inicializaes dos objetos sejam feitas. Essas inicializaes das
variveis podem ser, atribuio de labels (para traduo automtica),
atribuio de itens para combo-boxes e radio-sets, etc., e devem ser
feitas antes do dispatch padro;
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
{utp/ut-liter.i Preo * 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. */

na procedure LOCAL-ENABLE-FIELDS comentar a linha que


contm a ocorrncia:"if-adm-new-record=yes then";
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 203

a procedure LOCAL-DISPLAY-FIELDS deve ser customizada para


que o valor da varivel seja exibido, para isso, antes do dispatch
padro deve-se atribuir a varivel o valor a ser exibido.
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
if avail order-line then
assign fill-in_Price = Order-Line.Price.
else
assign fill-in_price = 0.
/* Dispatch standard ADM method. */
/* RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U).*/
/* Code placed here will execute AFTER standard behavior. */

quanto largura da SmartViewer:


se a SmartViewer for usada dentro de um folder de Cadastro
Inclui/Modifica Filho, alterar a largura de rt-key e rt-mold para 76,72;
se a SmartViewer for usada dentro do Cadastro Inclui/Modifica Filho
sem folder, alterar a largura de rt-key e rt-mold para 79,29;
se for usada dentro de outro folder que no seja em um Cadastro
Inclui/Modifica Filho, alterar a largura de rt-key e rt-mold para 85.72;
acessar as propriedades da frame da SmartViewer, clicar em 'Tab Order' e
no combo-box 'Tabbing Options' escolher a opo 'Left-to-Right By
Columns';
salvar a SmartViewer com o nome definido, de acordo com os Padres de
Nomenclatura;
Como definir viewer sem campos de tabela:
Viewer sem campos de tabela aquela que possui apenas objetos (widgets)
no vinculados a uma base de dados, ou seja, so variveis dispostas na tela de
modos que o usurio possa alterar os seus valores em tempo de execuo.
cancelar a tela de seleo de tabelas exibida aps a escolha da template;
se a viewer for utilizada em um cadastro do tipo simples, no incio da
local-assign-records necessrio substituir a linha:
{include/i-valid.i}

por estas a seguir:


if not frame {&frame-name}:validate() then
204

return 'ADM-ERROR':U.

definir no Method-Library a include i-auxtab.i, deve ser a primeira da


lista;
definir ao menos uma tabela externa;
inserir os objetos (fill-ins, combo-boxes, radio-sets, retngulos, etc) na
viewer, esses objetos no podem ser campos de tabelas;
desabilitar todos os objetos da tela que no devam ser mostrados
habilitados;
Ateno: o controle de habilitao/desabilitao de campos deve ser feito
pelo usurio. Para isso, deve-se colocar os campos nos preprocessadores
de acordo com a tabela abaixo:

Tipo de Objetos Preprocessador Finalidade
Chaves (variveis que Adm-create-fields Habilitados somente na
representam chaves) criao de um novo registro.
Outras variveis Adm-modify-fields Habilitados nas operaes de
Adm-assign-fields ADD, COPY e MODIFY.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 205

customizar a procedure LOCAL-INITIALIZE para que as inicializaes


dos objetos sejam feitas. Essas inicializaes das variveis podem ser,
atribuio de labels (preparao para traduo), atribuio de itens para
combo-boxes e radio-sets, etc.;
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
{utp/ut-liter.i Quantidade * R}
assign fill-in_Qty:label in frame {&frame-name} = return-Comentar
value. chamada
{utp/ut-liter.i Preo * R} padro
assign fill-in_Price:Label in frame {&frame-name} = return-
value.
{utp/ut-liter.i Pas * L}
assign cb-country: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. */

customizar a procedure LOCAL-DISPLAY-FIELDS, sendo que nessa


procedure que os valores dos objetos sero exibidos:
comentar o dispatch padro;
inserir os comandos para que os valores dos objetos sejam exibidos.
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
Comentar
/* Dispatch standard ADM method. */ chamada
/* RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U). */
padro
/* Code placed here will execute AFTER standard behavior. */
DISPLAY Order-Line Qty @ fill-in_Qty
Order-Line.Price @ fill-in_Price
Order-Line.Order-num @ fill-in_order-num
Order-Line.Line-num @ fill-in_line-num
Order-Line.Item-num @ fill-in_item-num
Order-Line.Discount @ fill-in_Discount
WITH FRAME {&FRAME-NAME}

customizar a procedure LOCAL-ENABLE-FIELDS, sendo que nessa


procedure que os objetos so habilitados:
comentar o dispatch padro;
206

comentar a linha em que consta a seguinte sentena: if adm-new-


record then.
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */ Comentar
chamada
/* RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U). */
padro
/* Code placed here will execute AFTER standard behavior. */
/* if adm-new-record = yes then */
&if defined(ADM-MODIFY-FIELDS) &then
enable {&ADM-MODIFY-FIELDS} with frame {&frame-name}.
&endif

Caso seja uma viewer principal, incluir:


RUN notify ('enable-fields, GROUP-ASSIGN-TARGET':U).

customizar a procedure LOCAL-DISABLE-FIELDS, sendo que nessa


procedure que os objetos so desabilitados:
comentar o dispatch padro;
inserir as seguintes linhas:
&if defined(ADM-CREATE-FIELDS) &then
disable {&ADM-CREATE-FIELDS} with frame {&frame-name}.
&endif

Exemplo /* Code placed here will execute PRIOR to standard behavior. */


/* Dispatch standard ADM method. */ Comentar
chamada
/* RUN dispatch IN THIS-PROCEDURE (INPUT 'disable-fields':U). */
padro
/* Code placed here will execute AFTER standard behavior. */
&if defined(ADM-CREATE-FIELDS) &then
disable {&ADM-CREATE-FIELDS} with frame {&frame-name}.
&endif
&if defined {ADM-MODIFY-FIELDS} &THEN
disable {&ADM-MODIFY-FIELDS} with frame {&frame-name}.
&endif

Caso seja uma viewer principal colocar:


RUN notify ('disable-fields, GROUP-ASSIGN-TARGET':U).

customizar a procedure LOCAL-ASSIGN-STANTEMENT, sendo que


nessa procedure que os objetos tero seus valores salvos:
comentar o dispatch padro;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 207

inserir a lgica de gravao dos valores das variveis.


Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
/* RUN dispatch IN THIS-PROCEDURE (INPUT 'assign-statement':U).
Comentar
*/ chamada
padro
/* Code placed here will execute AFTER standard behavior. */
DO WITH FRAME {&FRAME-NAME} ON ERROR UNDO, RETURN "ADM-ERROR":
ASSIGN {&ADM-CREATE-FIELDS}{&ADM-MODIFY-FIELDS}.
ASSIGN order-line.Discount = FILL-IN_Discount
order-line.Item-num = FILL-IN_Item-num
order-line.Line-num = FILL-IN_Line-num
order-line.Order-num = FILL-IN_Order-num when adm-
new-record = yes
order-line.Price = FILL-IN_Price
order-line.Qty = FILL-IN_Qty
NO-ERROR.
IF ERROR-STATUS:ERROR THEN
RUN dispatch IN THIS-PROCEDURE ('show-erros':U).
END.

alterar a altura de todos os atributos para 0.88;


para os atributos que representam a chave de acesso a tabelas, caso forem
postos na tela:
colocar o primeiro atributo na linha 1.17
caso existam mais de um atributo que represente uma chave:
coloc-los com espaamento 1, ou seja, na linha 2.17, 3.17, etc.
alterar a altura do retngulo rt-key para o nmero de atributos
chave + 0.25, ou seja, 2.25, 3.23, etc.
alterar a linha inicial do retngulo rt-mold para a altura do rt-key +
1.25
se no forem colocados atributos que representem chaves:
eliminar o retngulo rt-key;
mover o retngulo rt-mold para a linha 1;
para os atributos que no formam a chave de acesso da tabela, caso forem
postos na tela:
208

colocar o primeiro atributo na linha de rt-mold + 0.17 (Exemplo:


2.67);
colocar os demais atributos com um espaamento de 1 (Exemplo:
3.67, 4.67);
alterar a altura do retngulo rt-mold de modo a apenas caber os
atributos dentro;
se no forem colocados atributos no chave, retirar o retngulo rt-mold;
quanto largura da SmartViewer:
se a SmartViewer for usada dentro de um folder de Cadastro
Inclui/Modifica, alterar a largura de rt-key e rt-mold para 76,72;
se a SmartViewer for usada dentro do Cadastro Inclui/Modifica sem
folder, alterar a largura de rt-key e rt-mold para 79,29;
se for usada dentro de outro folder que no seja em um Cadastro
Inclui/Modifica, alterar a largura de rt-key e rt-mold para 85.72;
acessar as propriedades da frame da SmartViewer, clicar em 'Tab Order' e
no combo-box 'Tabbing Option' escolher a opo 'Left-to-Right By
Columns';
salvar a SmartViewer com o nome definido, de acordo com os Padres de
Nomenclatura;
Como definir viewers s com campos chave:
Viewer s com campos chave aquela que no possui campos no chave
dispostos na tela. Essa viewer poder conter variveis dispostas para entrada
de dados pelo usurio;
na dialog que se abrir logo aps a seleo do template, selecionar a(s)
tabela(s) a serem utilizadas na viewer;
na janela aps a seleo da(s) tabela(s), selecionar os campos a serem
utilizados;
a seguir, pode ou no ser apresentada uma mensagem questionando se a
viewer deve suportar chaves estrangeiras, caso acontea, clicar em Cancel;
definir no Method-Library a include i-auxtab.i, deve ser a primeira da
lista;
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 209

desabilitar todos os campos da tela;


Ateno: o controle de habilitao/desabilitao de campos deve ser feito pelo
usurio. Mais instrues a seguir:
colocar os campos nos preprocessadores de acordo com a tabela abaixo:
Preprocessador Finalidade
Adm-create-fields Habilitados somente na criao de um novo registro
Adm-assign-fields Exemplo: operaes de ADD e COPY
Adm-modify-fields Devem ser marcados os objetos que sero habilitados para alterao de
uma ocorrncia na tabela. Observe que ndices de tabelas no podem ser
alterados.
customizar a procedure LOCAL-INITIALIZE para que as inicializaes
dos objetos sejam feitas. Essas inicializaes podem ser, atribuio de
labels (preparao para traduo), atribuio de itens para combo-boxes e
radio-sets, etc.;
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
{utp/ut-liter.i Quantidade * R}
assign fill-in_Qty:label in frame {&frame-name} = return-
value.
210

{utp/ut-liter.i Preo * R}
assign Order-line.Price:label in frame {&frame-name} =
return-value.
{utp/ut-liter.i Pas * 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. */

caso existam na viewer objetos no vinculados ao banco de dados


(variveis), customizar a procedure LOCAL-DISPLAY-FIELDS para que
seus valores sejam exibidos.
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U).
/* Code placed here will execute AFTER standard behavior. */
if avail Order-Line then
DISLPAY order-line.Qty = fill-in_Qty
order-line.Price = fill-in_Price
WITH FRAME {&FRAME-NAME}.

customizar a procedure LOCAL-ENABLE-FIELDS:


comentar o dispatch padro;
comentado a linha em que aparea a sentena: if adm-new-record =
yes then;
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
/* RUN dispatch IN THIS-PROCEDURE (INPUT 'enable-fields':U). */
/* Code placed here will execute AFTER standard behavior */
/*if adm-new-record = yes then */
&if defined(ADM-MODIFY-FIELDS) &then
enable {&ADM-MODIFY FIELDS} with frame {&frame-name}.
&endif

Caso seja uma viewer principal, incluir:


RUN notify ('enable-fields, GROUP-ASSIGN-TARGET':U).
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 211

caso existam na viewer objetos no vinculados ao banco de dados


(variveis), customizar a procedure LOCAL-ASSIGN-RECORD para que
seus valores sejam salvos. Exemplo:
(...)
/* Dispatch standard ADM method.
RUN dispatch IN THIS-PROCEDURE (INPUT 'assign-record':U ).
/* Todos os assigns no feitos pelo assign-record devem ser
feitos aqui */
assign order-line.qty = fi-3.

criar e customizar a procedure LOCAL-ASSIGN-STATEMENT;


inserir o seguinte cdigo aps o dispatch padro:
do with frame {&frame-name} on error undo, return "ADM-
ERROR":
&if defined(ADM-CREATE-FIELDS) &then
if ADM-NEW-RECORD then assign {&ADM-CREATE-FIELDS}.
&endif
&if defined(ADM-MODIFY-FIELDS) &then
assign {&ADM-MODIFY-FIELDS}.
&endif
end.

alterar a altura de todos os atributos para 0.88;


para os atributos que formam a chave de acesso da tabela:
colocar o primeiro atributo na linha 1.17;
caso exista mais de um atributo chave:
coloc-los com espaamento 1, ou seja, na linha 2.17, 3.17,
etc.;
alterar a altura do retngulo rt-key para o nmero de atributos
chave + 0.25, ou seja, 2.25, 3.23, etc.;
alterar a linha inicial do retngulo rt-mold para altura do rt-key
+ 1.25;
para os atributos que no formam a chave de acesso da tabela, caso forem
postos na tela:
212

colocar o primeiro atributo na linha de rt-mold + 0.17 (Exemplo:


2.67);
colocar os demais atributos com um espaamento de 1 (Exemplo:
3.67, 4.67);
alterar a altura do retngulo rt-mold de modo a apenas caber os
atributos dentro;
se no forem colocados atributos no chave, retirar o retngulo rt-mold.
Obs.: apesar da viewer s com campos chave no conter outros campos,
poder conter variveis;
colocar na SmartViewer outros objetos, como por exemplo combo-box,
que no esto associados ao banco de dados;
para os objetos no associados ao banco de dados e que devem ser
atualizados pelo usurio, 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}';
quanto largura da SmartViewer:
se a SmartViewer for usada dentro de um folder de Cadastro
Inclui/Modifica, alterar a largura de rt-key e rt-mold para 76, 72;
se a SmartViewer for usada dentro do Cadastro Inclui/Modifica sem
folder, alterar a largura de rt-key e rt-mold para 79,29;
se for usada dentro do outro folder que no seja em um Cadastro
Inclui/Modifica, alterar a largura de rt-key e rt-mold para 85.72;
acessar as propriedades da frame da SmartViewer, clicar em 'Tab Order' e
no combo-box 'Tabbing Options' escolher a opo 'Left-to-Right By
Columns';
salvar a SmartViewer com o nome definido, de acordo com os Padres de
Nomenclatura;

Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 213

zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica 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
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.
214

CAPTULO 9

Validaes

Validaes de Tela
As validaes tm o objetivo de conferir as entradas de dados fornecidas pelo
usurio a um programa, de modo que estejam condizentes com o que o
programa pede e que no sejam passadas informaes errneas de modo a
prejudicar o andamento correto das operaes.
Validaes na Navegao de Registro
Em certos casos necessrio validar um registro assim que acessado atravs
da navegao na tabela. Este caso aplica-se para executar uma funo qualquer
como apresentar uma mensagem informativa ao usurio referindo-se quele
registro ou desabilitar o boto de alterao ou cpia.
Para que o boto de Modificao seja habilitado deve ser seguida a tcnica
Como habilitar ou desabilitar Botes em Painis.
Deve-se ter cuidado com esse tipo de validao, pois cada vez que o usurio
navegar na tabela, a validao ser feita podendo prejudicar a performance do
programa.
Validaes Antes da Alterao
Da mesma forma que nas Validaes na Navegao de Registro (item X.2).
existem casos em que necessrio validar um registro para permitir ou no a
sua alterao, porm em alguns desses casos a validao pode ser complexa e
demorada, consequentemente prejudicial a performance do programa.
Para evitar que a validao acabe afetando a performance do programa, deve-
se fazer a validao apenas quando houver a tentativa de alterao, incluindo o
cdigo a seguir antes do dispatch padro da procedure Local-Enable-Fields:
CAPTULO 9 Validaes 215

define variable c-p-cadsim as character no-undo.


if not adm-new-record and available <tabela> then do:
if <condio> then do:
RUN get-link-handle IN adm-broker-hdl
(INPUT THIS-PROCEDURE,
INPUT "TableIO-Source",
OUTPUT c-p-cadsim).
if valid-handle(widget-handle(c-p-cadsim)) then do:
RUN pi-cancelar IN widget-handle(c-p-
cadsim).
<mensagem>.
return "ADM-ERROR":U.
end.
end.
end.

Onde:
<tabela>: a tabela que est sendo utilizada na manuteno
<condio>: uma condio qualquer que indica que o registro no pode ser
alterado
<mensagem>: uma mensagem a ser apresentada ao usurio informando
impossibilidade da alterao para o registro.
Observao Essa tcnica deve ser evitada, pois o usurio ver o boto de alterao habilitado
e ao tentar alterar o registro a mensagem ir interromp-lo, contradizendo a funo do boto.

Validaes em Entrada de Dados


As validaes feitas para valores de entradas de dados devem ser feitas sempre
no momento de sua confirmao, de modo que na ocorrncia de alguma
inconformidade em qualquer dos valores requisitados pelo programa, este
dever apresentar uma mensagem de erro atravs do utilitrio ut-msgs.p e
posicionar o foco no campo em que ocorreu o problema para que o usurio
possa corrigi-lo.
Validaes em Cadastro Simples
As validaes em um Cadastro Simples devem ser feitas antes do dispatch da
procedure Local-assign-record da Viewer.
Validaes em Cadastro Complexo
O cadastro complexo possui mais de uma Viewer por isso tem uma forma
diferente de fazer as validaes para suas entradas de valores.
As validaes dos dados de entrada em um Cadastro Complexo so feitas nas
procedures pi-validate das Viewers que compem o cadastro.
216

Validaes para Window Relatrio


Pelo fato da Window Relatrio ser um Template no composto por
SmartObjects, a validao de seus valores tem as seguintes caractersticas:

Validaes das pginas de Parmetros, Seleo e Classificao


Os valores dessas pginas so validados dentro da procedure pi-executar, aps o comentrio:
/* Coloque aqui as validaes das outras pginas, lembrando que elas devem apresentar uma
mensagem de erro cadastrada, posicionar na pgina com problemas e colocar o foco no campo
com problemas */

Browse de Digitao
Os valores do browse de digitao devem ser validados no momento que o usurio sai do
registro, no evento Row-Leave do browse.

Validao da Pgina de Impresso


A pgina de impresso no precisa sofrer qualquer tipo de validao, o Template se encarrega
de confirmar os valores para essa pgina. Porm, isso no acontece para os campos que no
pertencem originalmente ao Template, que foram adicionados posteriormente.

Validaes em Triggers de Dicionrio de Dados


Existem casos que imprescindvel que haja validaes de dicionrio de dados
para as tabelas de modo a assegurar que no ocorram entradas de dados que
no condizem com o esperado.
Porm as validaes de dicionrio de dados podem acarretar o mau
funcionamento nos Templates, por isso no so indicadas, j que esse tipo de
validao no pode retornar informaes do problema ocorrido para que seja
tratado conforme necessrio.
Para que isso no ocorra, as validaes de dicionrio devem ser replicadas nos
programas, nos locais indicados conforme o Template utilizado, fazendo com
que seja possvel o tratamento dos problemas que possam ocorrer no
andamento das validaes.
217

CAPTULO 10

Mensagens

Este captulo apresenta mensagens padres para algumas situaes comuns no


Datasul-EMS 2.00. As mensagens j cadastradas e utilizadas que se encaixem
nas situaes abaixo devem ser alteradas, mas no necessrio realizar esta
alterao agora, somente quando o programa for aberto para outras
manutenes. Para auxiliar o cadastro e manuteno de mensagens, existe o
Sistema de Mensagens. Para acessar o Sistema de Mensagens, voc deve
primeiro entrar em contato com a equipe de ADF e solicitar a criao de um
usurio no Sistema de Mensagens. Em seguida voc pode acessar o Sistema
pelo endereo: X:\Atalhos\SistTec\Mensagem.
Importante 1. Os novos programas devem utilizar estas mensagens;
2. Quando o parmetro solicitar o label da tabela, deve-se utilizar o return-
value do include utp/ut-table.i.
Observaes A manuteno do cadastro das mensagens, assim como a incluso de novas
mensagens s pode ser realizada pela Datasul. Para clientes e parceiros
autorizada somente a utilizao das mensagens j cadastradas.

Mensagem: &1 j existente !


Nmero: 1
Help: J existe ocorrncia em &1 com a chave informada.
Parmetros: &1 = label da tabela
Mensagens substitudas: &1 j cadastrado.
&1 j cadastrada.
Registro &1 j cadastrado.
Agncia j cadastrada.
&1 j informado !
218

Observaes: utiliza-se palavra 'existente', pois ela no possui


gnero;
as palavras derivadas do termo 'cadastro' como
cadastrado, cadastrada e cadastramento devem ser
evitadas;
a palavra 'registro', tambm, deve ser evitada, pois
trata-se de um termo computacional estranho ao
usurio, devendo ser substituda por 'ocorrncia';
no necessrio apresentar o contedo da chave da
tabela, pois este est na tela.

Mensagem: &1 j existente !


Nmero: 56
Verificar se existe uma ocorrncia para a(o) &1 informado
Help:
em seu cadastro.
Parmetros: &1 = label da tabela
Mensagens substitudas: &1 no cadastrado.
&1 no cadastrada.
Registro &1 no cadastrado.
Agncia no cadastrada.
&1 incorreto(a) !
&1 invlido.
&1 invlida.
Observaes: utiliza-se palavra 'existente', pois ela no possui
gnero;
as palavras derivadas do termo 'cadastro' como
cadastrado, cadastrada e cadastramento devem ser
evitadas;
A palavra 'invlido', tambm, deve ser evitada, pois se pode
obter sentido no desejado. Exemplo: Funcionrio invlido !

Mensagem: &1 possui relacionamentos ativos com &2 !


Nmero: 5
A corrente ocorrncia de &1 possui relacionamento ativos
Help:
com a tabela &2, portanto no pode ser eliminada.
Parmetros: &1 = label da tabela pai no relacionamento
CAPTULO 10 Mensagens 219

&2 = label da tabela filho no relacionamento


Mensagens substitudas: &1 possui relacionamentos ativos.
&1 possui &2 cadastrado(s).
&1 possui &2 cadastrada(s).
Banco possui Agncia cadastrada.
Observaes: As palavras derivadas do termo 'cadastro' como
cadastrado, cadastrada e cadastramento devem ser
evitadas;

Mensagem: No encontrado(a) &1 para chave informada !


Nmero: 2
No foi encontrada ocorrncia em &1 com a chave
Help:
informada.
Parmetros: &1 = label da tabela
Mensagens substitudas: Chave informada no encontrada.
Observaes: mensagem padro para incluso de ocorrncias numa
tabela temporria de digitao, quando esta possuir
ndice nico.

Regras para a criao de novas mensagens


Estas regras devem ser seguidas por todos os programadores e analistas que
esto desenvolvendo o Datasul-EMS 2.00. As mesmas visam facilitar o
controle das mensagens (para que no haja o acmulo de informaes que no
sero utilizadas ou ento repetitivas) e tambm, facilitar o trabalho de
traduo, pois seguindo estas normas o nmero de mensagens criadas diminui.
no utilizar ponto de exclamao ou ponto final, a no ser que haja
sentena posterior.
Exemplo: O cdigo da referncia deve ser preenchido. Informe um cdigo
diferente de branco;
As reticncias podem ser utilizadas somente nos casos de uso do gerndio.
Exemplo: Calculando ... ; Imprimindo ... ; Executando ...
Outros exemplos de mensagens cadastradas que no podem ocorrer:
Exemplo: Eliminando clculo antigo ...
Quando o programador tiver a necessidade de ressaltar a mensagem,
utilizar a funo "alert-box warning".
220

Exemplo de mensagem incorreta:


Eliminao invlida !
no utilizar ponto ao abreviar palavra.
Exemplo de mensagem incorreta: Cond. Pagto.
revisar possveis erros gramaticais, de concordncia e de grafia. Exemplo
de mensagens incorretas:
Sero criadas as mesmas contas para todos os grupos de clientes
Informe se ser ir ser executado um processo de substituio de &1
modificado em &2 registrados para &3
Permitindo somente a incluso de trs tipos de mo de obra
&1 no pode ser eliminad(o)a !
... de Fim de Perdodo
Confirma elimanao ?
Ano fiscal j est encerrado.
Elimino invlida !
utilizar acentuao sempre. Exemplo:
Perodos para o ano ja cadastrados.
Moeda do credito nao tem cotacao para hoje.
no utilizar letras maisculas no meio da frase sem que seja nome prprio.
Exemplos:
Linha Possui Ordens Valorizadas !
Ordem de Produo No Possui &1.
evitar repetir a mesma palavra vrias vezes. Exemplos:
Operao &1 no est cadastra para o Roteiro &2. Informe outra
operao para este Roteiro ou cadastre a Operao &1 para o Roteiro
&2.
antes de criar uma nova mensagem verificar se no h outra similar que
possa ser utilizada. Exemplo:
Eliminao Invlida !
CAPTULO 10 Mensagens 221

Eliminao invlida!
Para auxiliar esta operao, o Sistema de Mensagens possui o boto Pesquisa,
onde voc pode buscar por Cdigo ou pelo Texto da Mensagem. Alm disso,
ainda possui a opo de Filtro onde voc informa palavras que deseja procurar
dentro do sistema.
no abreviar palavras sem necessidade (somente por questes de espao).
Exemplo:
Cond. Pagto.
Estabelec
Dt Ent Prev
Cod Dest Merc
Encer calc no efetuado.
no utilizar palavras ou jarges tcnicos. Exemplos:
Ttulo j existe no browse
Script do Automanager no encontrado.
utilizar o help da mensagem somente se necessrio, se houver algo a
acrescentar. No utiliz-lo, somente para repetir a mesma mensagem.
Exemplo:
Agncia no cadastrada. Help Agncia no cadastrada!
Item para debito direto - Help Item para debito direto.
procurar ser formal. No utilizar grias. Exemplo:
Linha Possui Ordens Valorizadas ! No pode alterar !
No utilizar o tratamento VOC.
utilizar somente o idioma portugus (com exceo de palavras tcnicas
especficas). Exemplo:
Parmetros
El cdigo de grupo informado no existe !
no utilizar sinais ortogrficos ou espaos em branco ao incio das
mensagens. Exemplo:
222

** Pendencias de Credito do Cliente


no criar mensagens sem sentido. Exemplos:
a
nd
fghfhdfh - fhdfjhdfghdf
Vrios
Representante
teteretert
fadfads
a mensagem deve ser o mais clara e sucinta possvel. Qualquer
necessidade de detalhamento, utilizar o help;
no criar mensagem somente com letras maisculas.
Padres para traduo de mensagens para Ingls e Espanhol
utilizar os mesmos padres para criao de mensagens novas;
no caso de dvidas, consultar Glossrio ou demais membros da equipe de
traduo.
223

CAPTULO 11

Programas Reutilizveis

Procedures Internas
Procedures Internas reutilizveis so definidas em includes que devem ser
incorporados aos programas. Se forem incorporadas a programas .w, no
devem fazer acesso muito grande a dados pois se isto acontecer devem ser
transformadas em API(s). As procedures tratadas neste tpico diferem de
outras ou mesmo de outros includes pelo fato de serem documentadas
(posteriormente) em Manual Tcnico do Mdulo, e disponibilizadas para
clientes e parceiros da DATASUL.
Exemplo :
Clculo do valor presente de uma cotao de preos;
Converso de valores entre moedas;
Rotinas de Extenso.
Nomenclatura A nomenclatura dos includes que contm este tipo de procedure interna deve
ser a seguinte:
XXINC999.i, onde:
XX - Sigla do Mdulo
INC - Fixo
999 - Seqencial.
225

CAPTULO 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
ento, exibida a janela a seguir, na qual se deve informar os arquivos que se
deseja compilar e as opes de compilao.
226

Selecionar arquivos a serem compilados


Para selecionar os arquivos que devem ser compilados seguir os passos abaixo:
1. Pressionar o boto "Add" na janela anterior.
2. Ento, deve ser exibida uma caixa de dilogo, na qual, deve ser informado
o diretrio e/ou nome dos arquivos e/ou tipo dos arquivos a serem
compilados. Pode-se, informar mais de um tipo de arquivos, separando-os
por espao. Pode-se, tambm, utilizar o boto 'Files', para exibir uma caixa
de dilogo padro do Windows, na qual pode-se localizar mais facilmente
os arquivos desejados.
3. Pressionar o boto 'Ok' e ento o diretrio e os arquivos devem ser
exibidos na janela do Application Compiler.

Caso os arquivos desejados estejam em diretrios diferentes pode-se adicionar


mais diretrios e/ou arquivos a lista.
E ainda, caso queira incluir a lista de arquivos a serem compilados num
diretrio do PROPATH do Progress, deve-se seguir os passos abaixo:
1. Pressionar o boto 'Propath', deve ser exibida uma caixa de dilogo com
todos os caminhos existentes no PROPATH do Progress.
2. Pressionar o boto esquerdo do mouse sobre os diretrios desejados,
selecionando-os.
3. Pressionar o boto 'Ok'.
CAPTULO 12 Ferramentas 227

Eliminar e Modificar a lista de arquivos a serem compilados


Para modificar algum dos diretrios da lista de arquivos a serem compilados,
deve-se seguir os passos abaixo:
1. Pressionar o boto esquerdo do mouse sobre o diretrio e/ou arquivo da
lista a ser modificado.
2. Depois pressionar o boto 'Modify' e ser exibida uma caixa de dilogo, na
qual, pode-se modificar o diretrio e/ou arquivos e/ou tipos de arquivos a
serem compilados.
3. Aps feitas as devidas modificaes pressionar o boto 'Ok', retornando
assim a janela anterior.
Para eliminar alguns dos diretrios da lista de arquivos a serem compilados,
seguir os passos abaixo:
1. Pressionar o boto esquerdo do mouse sobre o diretrio e/ou arquivos da
lista a ser eliminado, ficando assim selecionado.
2. Depois pressionar o boto 'Delete'.
Opes de Compilao
O Application Compiler disponibiliza algumas opes de compilao,
descritas abaixo:
salvar os novos arquivos .R gerados - para isso marcar a caixa de
combinao Save New .r Files;
compilar arquivos existentes nos subdiretrios dos diretrios da lista de
compilao, para isso marcar a caixa de combinao Look in
Subdirectories;
228

eliminar os antigos .R existentes - para isso marcar a caixa de combinao


Remove Old .r Files;
compilar somente os arquivos que no possuam .R - para isso marcar a
caixa de combinao Only Compile If No .r File;
exibir status da compilao dos arquivos - para isso marcar o item de
menu Show Status que se encontra no menu Options;
salvar as alteraes realizadas nas opes de compilao - para isso marcar
o item de menu Save Settings on Exit que se encontra no menu Options.
Alm das opes descritas anteriormente, o Application Compiler possui
outras opes de compilao. Estas opes podem ser acessadas atravs do
menu Options, item Compiler.
Ser ento exibida uma caixa de dilogo denominada Compiler Options, na
qual, pode-se informar algumas opes adicionais, tais como:
tipos de arquivos padro a serem compilados - digitar os tipos de arquivos
na caixa de texto Default File Spec.;
arquivo de LOG, este arquivo deve armazenar os resultados (arquivos
compilados com sucesso, erros encontrados, ...) da compilao dos
arquivos - digitar o diretrio e o nome do arquivo de LOG na caixa de
texto Message Log File;
diretrio, no qual devem ser gravados os novos arquivos .R - digitar o
nome do diretrio onde estes arquivos devem ser gravados, na caixa de
texto Save Into; caso os novos arquivos .R devam ser gravados no mesmo
diretrio dos arquivos de origem, no informar nenhum diretrio nesta
caixa de texto.
Iniciar Compilao
Para iniciar a compilao dos arquivos deve-se pressionar o boto 'Start
Compile'.
Caso o item de menu Show Status esteja marcado, ser exibida uma caixa de
dilogo com informaes sobre o status da compilao (arquivos compilados
com sucesso, erros encontrados, ... ); caso este item de menu no esteja
marcado, ser exibida a mesma caixa de dilogo mas, somente ao final da
compilao dos arquivos.
CAPTULO 12 Ferramentas 229

Roundtable
O Roundtable uma ferramenta que facilita o controle de verso de
programas, objetos e includes.
Para a utilizao do Roundtable, deve-se seguir os passos descritos abaixo:
1. Selecionar a Workspace;

2. Criar uma task para poder desenvolver os programas, veja os passos a


seguir:
ir no menu Task - Task Maintenance;
230

ir em File - New Task;


digitar na opo Summary a descrio da Task;
digitar na opo Manager, a quem est designado (opcional);
clicar no boto 'Ok';
clicar no boto 'Done'.
3. Aps criada a task, selecionar a task que foi criada na opo Task.
Observao: Poder ter mais de uma Task criada para um mesmo usurio.
4. Como editar um objeto:
estar com a task selecionada;
selecionar o objeto que se quer editar;
Observao: No h necessidade de se fazer os dois prximos itens, caso o objeto j esteja na
sua task.

ir em File - Check Object Out:


CAPTULO 12 Ferramentas 231

Observao: Caso essa opo no 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'.

selecionar a opo Patch Level;


ir em File - Edit Selected Object:
Observao Com isso deve abrir o programa no Procedure Editor. Caso se queira abrir no
Interface Builder -

Abrir o Interface Builder e Ir no menu File - Open.


Se for selecionada a opo View Selected Object, deve ser aberto o programa
somente para leitura.
5. Como completar uma task:
depois de feitas as devidas alteraes no(s) objeto(s) preciso
completar a task para liberar o(s) objetos(s) presos a task. Para isso,
deve-se ir no menu Task - Task Maintanence, File - Complete Task e
deve-se perguntar se deseja completar a task e deve-se responder que
sim. Com isso, o Roundtable deve liberar todos os objetos presos a
task, desde que estes estejam sem erros.
232

6. Como liberar um nico objeto:


ir no menu compile - Compile Object With Xref;
ir na opo File - Check Object In do menu;
clicar em Ok.
7. Como saber se todos os objetos esto associados a task:
selecionar a task desejada;
ir no menu View, opo Object in Task View.
233

CAPTULO 13

APIs

O que so APIs e como constru-las


Objetivo API (Application Program Interface), um programa que recebe parmetros
especficos para a realizao de alguma tarefa. Esta tarefa, pode ser desde uma
atualizao, quanto um programa que retorne informaes. Visando facilitar a
customizao e a integrao dos mdulos.
Caractersticas Uma API, no pode ser chamada diretamente, ou seja, sempre executada a
partir de um outro programa, que passa os devidos parmetros.
As APIs so usadas pelos:
prprios programas do mdulo, evitando duplicidade de cdigo e
as mantendo atualizadas;
outros mdulos, alcanando assim a independncia dos
aplicativos;
equipes de desenvolvimento especfico para customizao dos
mdulos;
parceiros de desenvolvimento da DATASUL;
prprio cliente, quando desejar fazer alguma customizao.
Com isto, o cliente e mesmo os outros mdulos, no precisam conhecer em
detalhes o modelo de dados de um mdulo para criar registros.
Este conceito, tambm, segue a idia de orientao a objeto, ou seja, a
reutilizao de cdigo. para acessar determinado objeto, somente um elemento
preestabelecido pode efetuar tal operao.
234

Funcionamento A API deve ser construda de forma que, receba parmetros e execute alguma
ao. A API, no deve ter tratamento com tela, deve ser sempre via troca de
parmetros. Isto facilita no momento da utilizao do RPC.
A entrada dos parmetros na API, deve ser da seguinte forma:
INPUT-OUTPUT PARAMETER TEMP-TABLE: este a nica
forma de comunicao de dados com a API, podendo-se utilizar
uma ou mais tabelas temporrias para faz-la.
Logo, dados como empresa, usurio, devem ser enviados para a API, atravs
da temp-table, de forma alguma pode ser utilizado os valores das variveis
globais definidas no ut-glob.i, ou qualquer outro tipo de varivel global.
O retorno da API, deve ocorrer das seguintes formas:
RETURN-VALUE: retornando OK ou NOK, para determinar o
sucesso completo (OK) ou parcial (NOK) ou nulo (NOK) da
execuo;
INPUT-OUTPUT PARAMETER TEMP-TABLE: pode-se
atualizar em um atributo da temp-table de entrada de dados com o
cdigo da mensagem de erro que ocorreu com o registro. Pode ser
utilizada tambm, uma temp-table somente de retorno, devolvendo
informaes ao programa chamador. Alm disto, pode ser
utilizada uma temp-table, parar retornar todos os erros ocorridos
com determinado registro.
Cabe ao projetista/programador, definir a forma que mais se adapta ao
programa a ser criado. As APIs devem ter a nomenclatura:
XXAPI999.P, onde:
XXX - indica o nome do mdulo
999 - um nmero seqencial de APIs dentro do mdulo.
A definio das temp-tables, deve ficar num include de nome semelhante ao
programa API, apenas com a extenso .I. Assim, se o programa API, tem o
nome externo MPAPI001.P, o include que contm as definies das temp-
tables de integrao tem o nome externo MPAPI001.I.
Verso de A API deve ter um controle interno para a verso corrente de integrao. Esta
Integrao verso fixa no programa API, sendo controlada pelo programador (deve ser
obrigatoriamente um nmero seqencial). Esta verso deve ser incrementada,
CAPTULO 13 APIs 235

sempre que ocorrer alguma alterao no layout das temp-tables, ou na forma


de passar e receber os parmetros.
Utilizar um campo com nome cod-versao-integracao.
O programa chamador deve obrigatoriamente passar esta verso como
parmetro de entrada (sempre o primeiro campo da temp-table) e a API faz a
consistncia, verificando se a verso em que est o programa chamador
compatvel com a verso de integrao da API. Cabe ao responsvel do
programa chamador, adequar seu programa s exigncias impostas pela API.
No caso, da verso de integrao estiver incompatvel, deve ser utilizada a
mensagem de erro nmero 3941.
Importante lembrar que, esta verso de integrao da API diferente da
verso do programa da API, uma vez que, pode alterar o programa e gerar uma
nova verso, sem que seja necessrio alterar a verso de integrao da API.
Retorno de Erros Sempre que a API encontrar algum problema, com os dados recebidos por ela,
a mesma deve retornar no prprio registro da temp-table de entrada com
problemas, ou atravs de uma temp-table de erros de dois campos com as
seguintes informaes:
Campo Descrio
cod-erro Nmero da mensagem de erro
desc-erro Descrio da mensagem de erro
A mensagem deve estar obrigatoriamente cadastrada no cadastro de
mensagens, e a descrio o texto da mensagem.
Documentao ** Item parcialmente definido **
A documentao da API, deve ser feita pelo mdulo responsvel, devendo
estar sempre atualizada. Esta documentao est contida no manual tcnico do
mdulo.
Deve ser utilizado mdulo de documentao do Datasul-EMS, para gerar o
help da documentao da API. Existe um manual para cada mdulo contendo
todas as suas APIs.
A documentao da API, deve conter as seguintes informaes:
nome fsico do programa;
verso de integrao;
objetivo;
236

parmetros de entrada e sada (o que significam os campos na(s)


tabelas temporria(s));
nome do include que contm a definio das temp-tables de
integrao;
execuo (validaes e aes);
consideraes gerais.
No manual tcnico do mdulo deve conter uma relao com todas as APIS do
mdulo; nome fsico da API, objetivo e nome do arquivo help. Se o usurio
precisar utilizar a API, este deve buscar via BBS o help corrente da API.
Exemplo Nome Fsico: mmp/mpapi001.p
Verso de Integrao: 1
Objetivo: verificar se deve replicar transao nas mquinas remotas e por
buscar cdigo da mquina local.
Parmetros de Entrada: Para executar a API necessrio utilizar o include
{mpp/mpapi001.i} que contm a definio dos parmetros de entrada do
programa.
/**************************************************************
** Include: MPAPI001.i
** Definio das temp-tables utilizadas para verificar
** replicao 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 Descrio
cod-versao-integracao Nmero da verso de integrao
cod-transacao
log-replica-msg
cod-erro
CAPTULO 13 APIs 237

desc-erro
cd-maquina-local

Cdigo da API
/*************************************************************
** Programa : MPAPI001.P
** API responsvel por verificar se deve replicar transao nas
** mquinas remotas e por buscar cdigo da mquina 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.
238

end.
else
return "NOK".
/* fim */

Como documentar APIs


Foi criado um documento modelo do Microsoft Word (.dot), que est no
diretrio \FERRAMENTAS\MANUAL, com o nome "API.dot", para
facilitar a documentao tcnica das APIs (Application Program Interface),
do DATASUL-EMS 2.00.
O arquivo Word, com a documentao de cada API, deve ter o mesmo nome
da API com extenso (.doc) e ser armazenado no diretrio \DOCAPI\, por
exemplo:
Nome do programa API: cep/ceapi003.p
Nome do documento API: docapi/ceapi003.doc
Existem duas APIs documentadas, que podem servir de exemplo:
btb912zb.doc (API de Criao de Pedidos de Execuo para o RPW);
btb917zb.doc (API de Eliminao de Pedidos de Execuo para o RPW).
Algumas recomendaes no uso:
este documento deve ser escrito de forma mais clara possvel, pois deve
estar disponvel para clientes e parceiros comerciais;
fonte padro do documento Arial 10;
fonte dentro das tabelas Arial 8;
a verso do documento deve estar no formato V.99 (exemplo V.01);
o nome do nosso produto Datasul-EMS ( importante observar as letras
maisculas e minsculas para no confundir com o produto internacional);
usar negrito e itlico de forma moderada, procurando destacar nomes ou
aspectos importantes para o entendimento;
o documento, obviamente, pode sofrer alteraes no layout, mas, que estas
no sejam muito significativas e no fiquem fora do padro;
CAPTULO 13 APIs 239

Como implementar evolues de APIs


Implementar novas funcionalidades nos programas, fazendo com que as
customizaes feitas pelos clientes/parceiros continuem funcionando.
Evoluo de lgica
de API, sem
mudana de
parmetros

Para este tipo de evoluo, basta alterar o cdigo principal da API.


Exemplo /* API antiga */
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.

/* 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.

Observao O resultado obtido atravs da nova API deve ser, sempre que
possvel, idntico ao resultado da antiga.
Evoluo de lgica
de API , com
mudanas de
parmetros
240

Para este tipo de evoluo, deve ser criada uma nova API com o mesmo nome
da API antiga, acrescida de um diferenciador. EX.: UTAPI001.P
UTAPI001A.P.
Esta nova API deve possuir uma procedure interna EXECUTE, que receber
os novos parmetros e uma lgica.
A API antiga deve chamar a nova API de forma persistente e roda a procedure
interna EXECUTE, passando todos os antigos parmetros e um valor padro
para cada um dos novos parmetros.
Exemplo /* API antiga - UTAPI001.P */
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.

/* API antiga e alterada - UTAPI001.P */


define input param param-1 as char no-undo.
define input param param-2 as int no-undo.

define var h-api as handle no-undo.


run utp/utapi001a.p persistent set h-api.
run execute in h-api (input param-1,
input param-1,
input yes).
delete procedure h-api.
CAPTULO 13 APIs 241

/* API nova - UTAPI001A.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.

find first param-global exclusive-lock no-error.


if avail param-global then
assign param-global.taxa =
if param-3 = yes
then 0.3 else 03 + param-global.indic.
end procedure.

Observao Os parmetros novos que so passados como padro para a nova API, devem
garantir que o resultado seja o mesmo da antiga API.

Evoluo de lgica
de API, com
alterao de
campos na temp-
tables de
parmetros

Para este tipo de evoluo, deve ser criada uma nova API com o mesmo nome
da API antiga, acrescida de um diferenciador. Ex.: UTAPI001.P
UTAPI001A.P.
Esta nova API deve possuir uma procedure interna EXECUTE, que receber
os novos parmetros e uma lgica.
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.
Exemplo /* API antiga - UTAPI001.P */
define temp-table tt-clientes
field cliente as char.
define input param table for tt-clientes.
242

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.

/* API antiga e alterada - UTAPI001.P */


define temp-table tt-clientes
field cliente as char.
define temp-table tt-new-clientes
field cliente as char
field taxa as int.
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/utapi001a.p persistent set h-api.
run execute in h-api (input table tt-clientes).
delete procedure h-api.

/* API antiga - UTAPI001.P */


define temp-table tt-new-clientes
field cliente as char
field taxa as int.
procedure execute:
define input param table for tt-new-clientes.
find first param-global exclusive-lock no-error.
if avail param-global then do:
find first tt-new-clientes no-lock no-error.
if avail tt-new-clientes then
assign param-global.ult-cliente = tt-new-clientes.cliente
param-global.taxa = tt-new-clientes.taxa.
end procedure.

Observao Caso a temp-table seja input-output, no retorno da API evoluda, devem ser
repassados os registros da nova temp-table para a antiga.
CAPTULO 13 APIs 243

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/utapi001a.p persistent set h-api.
run execute in h-api (input table tt-clientes).
delete procedure h-api.

/* API nova - UTAPI001A.P */


define temp-table tt-new-clientes
field cliente as char
field taxa as int.
procedure execute:
define input param table for tt-new-clientes.
find first param-global exclusive-lock no-error.
if avail param-global then do:
find first tt-new-clientes no-lock no-error.
if avail tt-new-clientes then
assign param-global.ult-cliente = tt-new-clientes.cliente
param-global.taxa = tt-new-clientes.taxa.
end procedure.

Observao Caso a temp-table antiga seja input-output, no retorno da API evoluda, devem
ser repassados os registros da nova temp-table para a antiga.

Evoluo de lgica
de API, com
mudana de
parmetros, que j
foi evoluda
244

Para este tipo de evoluo, 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 parmetros e possuir toda a
lgica.
A procedure interna antiga deve chamar a nova procedure, passando todos os
antigos parmetros e um valor padro para cada um dos novos parmetros.
Exemplo /* API antiga - UTAPI001A.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.
if param-3 = yes 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-global.indic.
end.
end procedure.

/* API antiga alterada - UTAPI001A.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 execute2 (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.
CAPTULO 13 APIs 245

define input param param-4 as int no-undo.


find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa =
if paam-4 0 then 0.3 else 0.3 + param-4.
end procedure.

Observao Os parmetros novos que so passados como padro para a nova procedure
interna, devem garantir que o resultado seja o mesmo da antiga procedure interna.

Evoluo de lgica
de API com
mudana de
parmetros, onde
no possvel
determinar um
valor padro para o
novo parmetro ou
o novo parmetro
obrigatrio

Para este tipo de evoluo, 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 no possvel determinar valores padro, 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 no foi executada e qual o
motivo da obrigatoriedade de novo parmetro.
Exemplo /* API antiga - UTAPI001A.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.
246

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.

/* API nova - UTAPI001A.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.
define var h-execute as handle no-undo.
run execute2 (input param-1,
input param-2,
input param-3,
input 0).
return return-value.
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.
return "999".
end procedure.
procedure execute3:
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
CAPTULO 13 APIs 247

define input param param-3 as log no-undo.


define input param param-4 as int no-undo.
define input param param-5 as int no-undo.
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3 + param-4 * param-5
end procedure.

Observao Isto somente deve ser feito caso no exista nenhuma maneira de definir um valor
padro para o novo parmetro ou o parmetro seja obrigatrio. A mensagem de que a API
possui uma nova verso com parmetro obrigatrio, deve ser somente apresentada no programa
chamador, e nunca na prpria API, j que as APIs no devem possuir eventos de interface. Esta
mensagem deve apresentar um erro dizendo que esta API est desatualizada e o motivo de sua
extino.

Evoluo de lgica
de API com
mudana de verso
de integrao

Para este tipo de evoluo, 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 verso de
integrao para o programa chamador.
Exemplo /* API antiga - UTAPI001.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.
248

/* API antiga alterada - UTAPI001.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.
return "999".

/* API nova- UTAPI001A.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.
define input param param-4 as int no-undo.
define input param param-5 as int no-undo.
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3 + param-4 * param-5.
end procedure.
procedure get-integration-version:
define output param i-version as int no-undo.
assign i-version = 4.
end procedure.

Observao Esta tcnica pode ser utilizada quando as outras tcnicas citadas implicarem
muito na performance da API. Antes de rodar a nova API, o programa chamador deve rodar o
mtodo Get-Integration-Version da nova API e verificar se a verso est correta. Lembrar que,
qualquer mensagem para o usurio deve ser emitida pelo programa chamador e nunca pela API.

Importante Para novos programas que venham a utilizar a API utapi0001, recomendado
entrar em contato com a equipe de Suporte ao Desenvolvimento no ramal 7125 antes de utiliza-
l. Para os programas antigos que j utilizam essa API, no deve-se realizar nenhuma alterao
pois esto sendo feitas correes nessa API.
CAPTULO 13 APIs 249

UTAPI001.P
A API de gerao de grficos tem por finalidade exibir grficos de acordo com
os parmetros a ela passados.
Essa API constituda por uma include utp/utapi001.i, que contm as
definies das templates utilizadas pela prpria API e pelos programas que
iro utiliz-la, um programa, utp/utapi001.p, que a prpria API, e, objetos
no Progress contidos em interfac/grafico que fazem parte de Datgraph
(visualizador de grficos).
Maiores informaes podem ser obtidas na documentao da API de Gerao
de Grficos (doc-api/utapi001.doc).
Importante Para novos programas que venham a utilizar esta API,
recomendado entrar em contato com a equipe de Suporte ao Desenvolvimento
no ramal 7125 antes de utiliza-l. Para os programas antigos que j utilizam
essa API, no deve-se realizar nenhuma alterao pois esto sendo feitas
correes nessa API.

UTAPI002.P
A API utp/utapi002.p faz a integrao entre Progress e Microsoft Word 97,
permitindo a criao de arquivos, baseados em formulrios, para o Microsoft
Word.
Maiores informaes podem ser obtidas na documentao da API de
Integrao 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 invs deste.

UTAPI003.P
A API utp/utapi003.p faz a Integrao entre PROGRESS e Microsoft Excel
97, permitindo a construo de planilhas e, tambm, grficos.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre PROGRESS e Microsoft Excel 97 (docapi/utapi003.doc).
250

Importante Para novos programas que venham a utilizar esta API,


recomendado que seja utilizado o programa utp/utapi013 ao invs deste.

UTAPI004.P
Objetivo Permitir o envio de E-Mail ou FAX atravs do EMS 2.0 usando o MS-
Exchagne (OLE Automation).
Parmetros o primeiro parmetro deve ser endereo E-Mail do destinatrio (Exemplo:
"fulano@internet.com.br") ou o nmero do FAX (Exemplo:
"[FAX:9999999]");
o segundo parmetro deve ser o E-Mail ou o nmero do FAX para uma
"Cpia Carbono" (Cc);
o terceiro parmetro o Assunto (Subject);
o quarto parmetro a mensagem;
o quinto parmetro o arquivo anexo (attachment);
o sexto parmetro o Grau de Importncia, onde 0 Baixo, 1 Mdio,
2 Alto;
o stimo parmetro a Confirmao de Envio, ou seja, receber um E-Mail
quando o E-Mail foi enviado;
o oitavo parmetro a Confirmao de Leitura, ou seja, receber um E-
Mail quando o destinatrio tiver lido a mensagem;
o nono e ltimo parmetro o Acompanhamento, ou seja, verificar o
andamento do envio de E-Mail (UT-ACOMP);
run utp/utapi004.p (input "fulano@internet.com.br",
Exemplo input "",
input "Manual",
input "Mensagem do manual ... ",
input "c:\autoexec.bat, c:\config.sys",
input 0,
input no,
input no,
input yes).

Retorno NPG No existe registro na tabela de Parmetros Globais do Sistema.


NEX O Servidor de E-Mail no MS-Exchange conforme os Parmetros
Globais do Sistema.
CAPTULO 13 APIs 251

NDE Destinatrio invlido.


NCC Destinatrio da Cpia Carbono invlido.
ATT O Arquivo Anexo no foi encontrado.
OK E-Mail enviado com sucesso.
Configurao Para que o programa de envio de E-Mail funcione preciso que esteja
cadastrado corretamente o endereo IP do servidor de E-Mail a sua porta nos
Parmetros Globais do Sistema.

UTAPI005.P
Objetivo Permitir o envio de E-Mail atravs do EMS 2.0 usando um servidor UNIX ou
qualquer outro servidor com suporte ao protocolo SMTP.
Parmetros Devem ser passados oito parmetros para este programa:
o primeiro parmetro deve ser o endereo IP do servidor de E-Mail que
pode ser adquirido da tabela de Parmetros Globais do Sistema (param-
global serv-mail);
o segundo parmetro deve ser a porta do servidor de E-Mail, que tambm
pode ser adquirida na tabela de Parmetros Globais do Sistema (param-
global.porta-mail);
o terceiro parmetro deve ser o remetente (Exemplo: "fulano");
o quarto parmetro deve ser o endereo E-Mail do destinatrio (Exemplo:
"fulano@internet.com.br");
o quinto parmetro deve ser o E-Mail para uma "Cpia Carbono" (Cc);
o sexto parmetro o Assunto (Subject);
o stimo parmetro a mensagem;
o oitavo parmetro, caso esteja enviando E-Mail via UNIX, deve ser o
diretrio para a criao do SCRIPT de envio de E-Mail, seno, pode ser
deixado em branco.
run utp/utapi004.p (input "172.16.1.89",
Exemplo input 25,
input c-from,
input c-to,
input c-cc,
252

input c-assunto,
input c-mesg,
input "").

Retorno Se o retorno (return-value) desse programa for igual a Ok, o mail foi enviado
com sucesso, seno algum erro ocorreu no envio ou os parmetros passados
no esto corretos.
Configurao Para que o programa de envio de E-Mail funcione preciso que esteja
cadastrado corretamente o endereo IP do servidor de E-Mail e a sua porta nos
Parmetros Globais do Sistema.

Observao O programa permite enviar um E-Mail para vrias pessoas. Para isto deve-se
passar cada nome separado por "," (vrgula) ou por ";" (ponto e vrgula). O mesmo acontece para
a Cpia 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 espaos em branco.

Instalao Para que o programa de envio de E-Mail funcione, deve ser executado o
arquivo INSTALA.BAT, que se encontra no diretrio \INTERFAC\MAIL.
CAPTULO 13 APIs 253

Interface Este programa no possui interface. Apenas envia o E-Mail.

UTAPI006.P
A API utp/utapi006.p permite a busca de dados de uma planilha Excel para o
Progress.
No programa responsvel por buscar os dados deve ser feita a incluso do
include: utp/utapi006.i, onde esto as definies das temp-tables que devem
ser passadas como parmetros API utp/utapi003.p.
A chamada da API deve seguir o padro abaixo:
run utp/utapi006.p (input-output table tt-dados,
output table tt-erros).

Maiores informaes podem ser obtidas na documentao da API para Busca


de Dados do Excel para o Progress (docapi/utapi006.doc).

UTAPI007.P
A API utp/utapi007.p permite o uso de funes do Excel, para retornar os
resultados para um programa Progress.
No programa responsvel por usar esta API deve ser feita a incluso do
include: utp/utapi007.i, onde esto as definies das temp-tables que devem
ser passadas como parmetros API utp/utapi007.p.
A chamada da API deve seguir o padro abaixo:
run utp/utapi007.p (input-output table tt-dados,
output table tt-erros).

Maiores informaes podem ser obtidas na documentao da API para Uso de


Funes do Excel no Progress (docapi/utapi007.doc).

UTAPI008.P
Nome Fsico: utp/utapi008.p
Nome do Include com os Parmetros: utp/utapi008.i
Verso de Integrao: 001
Objetivo
254

Atualizao de arquivos para o Microsoft Excel 97 e retorno de informaes


para o Progress.
Maiores informaes podem ser obtidas na documentao da API de
Integrao 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 invs deste.

UTAPI009.P
Nome Fsico: utp/utapi009.p
Nome do Include com os Parmetros: utp/utapi009.i
Verso de Integrao: 001
Objetivo Envio de mensagens atravs do servidor de correio eletrnico e envio de FAX
atravs de servidor de FAX.
Maiores informaes podem ser obtidas na documentao 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 invs deste.

UTAPI010.P
Nome Fsico: utp/utapi010.p
Nome do Include com os Parmetros: utp/utapi010.i
Verso de Integrao: 001
Objetivo Permitir que impressoras cadastradas no EMS sejam utilizadas em programas
compilados contra os bancos do MAGNUS.
Maiores informaes podem ser obtidas na documentao da API para
Compartilhar Impressoras do EMS com Programas Magnus
(docapi/utapi010.doc).
CAPTULO 13 APIs 255

UTAPI011.P
Nome Fsico: utp/utapi011.p
Nome do Include com os Parmetros: utp/utapi011.i
Verso de Integrao: 003
Objetivo A API de gerao de grficos tem por finalidade exibir grficos de acordo com
os parmetros a ela passados.
Maiores informaes podem ser obtidas na documentao da API para
Criao de Grficos (docapi/utapi011.doc).
Importante Para novos programas que venham a utilizar esta API,
recomendado entrar em contato com a equipe de Suporte ao Desenvolvimento
no ramal 7125 antes de utiliza-l. Para os programas antigos que j utilizam
essa API, no deve-se realizar nenhuma alterao pois esto sendo feitas
correes nessa API.

UTAPI012.P
Nome Fsico: utp/utapi012.p
Nome do Include com os Parmetros: utp/utapi012.i
Verso de Integrao: 001
Objetivo Criao de arquivos, baseados em formulrios, para o Microsoft Word. Sendo
que os parmetros recebidos so utilizados para preencher os campos de
formulrio existentes no documento.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Word (docapi/utapi012.doc).
256

UTAPI013.P
Nome Fsico: utp/utapi013.p
Nome do Include com os Parmetros: utp/utapi013.i
Verso de Integrao: 001
Objetivo Faz a Integrao entre Progress e Microsoft Excel, permitindo a construo de
planilhas e, tambm, grficos.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Excel (docapi/utapi013.doc).

UTAPI018.P
Nome Fsico: utp/utapi018.p
Nome do Include com os Parmetros: utp/utapi018.i
Verso de Integrao: 001
Objetivo Atualizao de arquivos para o Microsoft Excel e retorno de informaes para
o Progress..
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Excel (docapi/utapi018.doc).

UTAPI019.P
Nome Fsico: utp/utapi019.p
Nome do Include com os Parmetros: utp/utapi019.i
Verso de Integrao: 001
Objetivo Envio de mensagens atravs do servidor de correio eletrnico e envio de FAX
atravs de servidor de FAX.
Maiores informaes podem ser obtidas na documentao da API de Envio de
FAX/E-mail (docapi/utapi019.doc).
CAPTULO 13 APIs 257

UTAPI027.P
Nome Fsico: utp/utapi027.p
Nome do Include com os Parmetros: utp/utapi027.i
Verso de Integrao: 001
Objetivo Criao de documentos, baseados em formulrios para o Microsoft Word,
sendo que a deciso de gravar ou no o documento caber ao usurio final.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Word (docapi/utapi027.doc).

UTAPI028.P
Nome Fsico: utp/utapi028.p
Nome do Include com os Parmetros: utp/utapi028.i
Verso de Integrao: 001
Objetivo Envio de compromisso do tipo reunio via Microsoft Outlook.
Maiores informaes podem ser obtidas na documentao da API de Envio de
compromisso via Outlook (docapi/utapi028.doc).

UTAPI029.P
Nome Fsico: utp/utapi029.p
Nome do Include com os Parmetros: utp/utapi029.i
Verso de Integrao: 001
Objetivo A API de Integrao com excel tem como funo gerar cdigo javascript para
gerar planilhas e grficos no excel em programas estilo pai x filho.
Maiores informaes podem ser obtidas na documentao da API de
Integrao com Excel Web (docapi/utapi029.doc).
258

APAPI009.P
Nome Fsico: app/apapi009.p
Nome do Include com os Parmetros: app/apapi009.i
Verso de Integrao: 001
Objetivo Consistir os parmetros passados e caso estejam Ok atualizar os pagamentos.
Consideraes devem ser passadas 1 (uma) temp-table de entrada e 1 (uma) de sada
Gerais contendo as informaes para atualizao dos PFs;
todas as temp-tables so passadas como parmetro atravs dos comandos
INPUT TABLE ou OUTPUT TABLE.
Exemplo:
run utp/utapi008.p (input table tt-referencia,
output table tt-erro-pef).

a API funciona da seguinte forma: Recebe como parmetro a temp-table,


faz as crticas e caso no tenha ocorrido nenhum problema atualiza os
pagamentos.
Parmetros de Entrada
Temp-table tt-referencia: nesta temp-table devero ser repassadas as
informaes de atualizao dos pagamentos extra fornecedor.
TEMP-TABLE TT-REFERENCIA
Atributo Tipo Formato Valor Inicial Obrigatrio
i-ep-codigo Integer Sim
c-referencia Character Sim
Cod-versao-integ Integer Sim
c-usuario Character Sim
l-vid-rel Logical Sim
l-acompanha Logical Sim

Atributo Descrio
i-ep-codigo Empresa do pagamento
c-referencia Referncia a ser atualizada
cod-versao-integ Verso de integrao
CAPTULO 13 APIs 259

c-usuario Usurio corrente


l-vid-rel Mostra mensagens na tela ou gera temp-table de erros
l-acompanha Mostra acompanhamento na tela?

Parmetros de Sada
Temp-table tt-erro-pef: sero gerados registros nesta temp-table quando tt-
referencial.l-vid-rel=yes com o cdigo do erro, descrio e informaes dos
registros com inconsistncias.
TEMP-TABLE TT-ERRO-PEF
Atributo Tipo Formato Valor Inicial Obrigatrio
i-cod-erro Integer 9999999 Sim
c-desc-erro Character "x(70)" Sim
c-arquivo-erro Character "x(100)" No

Atributo Descrio
i-cod-erro Cdigo da mensagem de erro
c-desc-erro Descrio da mensagem de erro
c-arquivo-erro Informaes com inconsistncias

Execuo
O programa app/apapi009.p ir primeiramente validar a verso de integrao:
Validao: Verso de Integrao
O programa ir verificar se o programa chamador est ntegro com a API, e
isto ocorre atravs da verificao da verso de integrao passada como
parmetro atravs da temp-table tt-referencia (campo cod-versao-integ). Caso
a verso esteja incompatvel, a API abortar a execuo retornando atravs da
temp-table tt-erro-pef o cdigo de erro 3941.
Nmero do Erro Mensagem Ajuda
3941 Verso de integrao incorreta ! Averso de integrao informada
atravs dos parmetros internos
incompatvel com a verso atual da
API. Favor contatar suporte tcnico.
Alm da verso de integrao so efetuadas, tambm as seguintes
consistncias.
Nmero do Erro Mensagem Ajuda
774 Empresa &1 no cadastrada Empresa &1 no cadastrada.
260

8759 Parmetro do Contas a Pagar no Parmetro do Contas a Pagar no


cadastrado cadastrado para esta empresa
6280 Referncia inexistente ! No foram encontrado movimentos
PEF/PEC pendentes cadastrados
com a referncia informada.
Caso ocorra um dos erros acima, a seleo no ser feita.
Cabe ao programa de origem, verificar os registros que esto com erro.
CAPTULO 14 Portabilidade de RCODES 261

CAPTULO 14

Portabilidade de RCODES

Objetivo O objetivo da anlise de portabilidade de RCODES validar o funcionamento


dos programas compilados em ambiente Windows e executados em ambientes
Unix. Isto se faz necessrio porque programas que respeitam as regras para
portabilidade de RCODE, podem ser executados via RPW/RPC e geralmente
em ambiente Unix. Caso contrrio, isto no possvel.
Ao executar programas no Unix, compilados em ambiente Windows e que no
tenha respeitado as regras de portabilidade, apresentado o erro 4438 como
descrito a seguir:
Program <program-name> was compiled under another incompatible display
environment. Cannot run without recompile. (4438)
You have frames in your program. You compiled it under one windowing
system (for example, MS-Windows) and tried to run it under another (for
example, tty). R-code with user interface components in it is only portable
within a windowing system. Your procedure file is portable across windowing
system, but you need to produce separate r-code files for each windowing
system.

Regras para Portabilidade de RCODE


Para que seja possvel a portabilidade de RCODES, trs regras bsicas devem
ser obedecidas, caso contrrio, existe a necessidade de recompilao do
programa. As trs regras so:
cdigos que no possuem comandos de User-Interface (especificamente,
cdigos que no criam frames, tanto explcitas como implcitas), no
262

pertencem a nenhuma arquitetura para mostrar informaes. Como


exemplo, esto os programas em batch (RPW);
mesmo tipo de banco de dados;
mesma classe de plataforma de servidor, deve ter o mesmo tamanho de
palavra e alinhamento de bytes.
Um exemplo para o problema da no compatibilidade de RCODE e sua
correo, o uso de frames ou comandos que criam frames. Para que o erro
4438 ocorra, necessrio compilar um programa que possui frame em
ambiente Windows e tentar executar o mesmo (RCODE) em ambiente UNIX.
Por exemplo:
output to value(c-arquivo)
find emitente where emitente.cod-emitente = 10 no-lock.
display emitente.cod-emitente.

O comando DISPLAY cria uma FRAME impossibilitando o uso do programa


compilado em ambiente Windows, em um ambiente Unix ou vice-versa.
Para solucionar este problema de incompatibilidade, necessrio utilizar a
funo STREAM-IO para reformatar a sada para texto puro, sem formatao
de fonte:
output to value(c-arquivo)
find emitente where emitente.cod-emitente = 10 no-lock.
display emitente.cod-emitente with stream-io.

Outra soluo para este problema, usar o comando PUT, pois o mesmo no
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 no utilizar comandos que criam FRAMES explcitas ou
implcitas, alguns problemas foram detectados com a descoberta de comandos
que criam, por algum motivo, FRAMES implcitas.
CAPTULO 14 Portabilidade de RCODES 263

At o momento foi constatado o problema nos comandos CREATE SERVER


e EXPORT. Para solucionar o problema, necessrio identificar se existe
outra maneira para realizar a tarefa desejada, caso contrrio, ser necessrio
manter RCODES para cada ambiente existente.
Para os casos identificados, o comando EXPORT pode ser substitudo por
PUT ou DIPLAY (utilizando a opo STREAM-IO). Para o comando
CREATE SERVER, ser necessrio manter um RCODE por ambiente
existente, isto , um RCODE para ambiente Windows e outro para ambiente
Unix.
265

CAPTULO 15

Tcnicas

Como alterar o caracter de senha


Objetivo Esta tcnica pode ser usada sempre quando for usado um fill-in do tipo blank,
ou seja, sempre que for colocada alguma informao que no possa ser
visualizada.
Implementao inserir a chamada da include i-win.i, no incio do bloco de definies;
{include/i-win.i}

rodar o procedimento SendMessageA, passando os seguintes parmetros:


o atributo hWnd do fill-in;
o valor {&EM_SetPasswordChar};
o caracter que deve ser mostrado na entrada da senha;
o valor 0 (zero).
run SendmessageA in hpApi (input fill-in-2:hwnd,
input {&EM_SetPasswordChar},
input ASC ("*"),
input 0).

Como alterar o diretrio corrente


Objetivo Esta tcnica pode ser usada quando for necessrio mudar o diretrio corrente
em tempo de execuo. Isto permite que o diretrio corrente seja fixo.
Implementao inserir a chamada da include i-win.i, no incio do bloco de definies;
266

{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento SetCurrentDir que deve estar dentro do programa ut-


utils.p passado o seguinte parmetro:
a novo caminho do diretrio corrente;
run SetCurrentDir in h-prog(input "C:\WINDOWS\TEMP").

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquece de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Como alterar ou criar uma varivel de ambiente


Objetivo Esta tcnica permite inserir ou alterar uma varivel de ambiente em tempo de
execuo. Sempre utilizar esta tcnica ao invs de usar o comando OS-
COMAND SET (...), pois este far com que a varivel de ambiente fique
setada apenas na sesso DOS que foi aberta. Esta tcnica seta uma varivel de
ambiente do WINDOWS e no DOS.
Implementao inserir a chamada da include i-win.i, no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento SetEnv que est dentro do programa ut-utils.p,


passando os seguintes parmetros:
a varivel de ambiente que deve ser criada:
CAPTULO 15 Tcnicas 267

o valor para esta varivel de ambiente;


run SetEnv in h-prog(input "TEMP", input
"C:\WINDOWS\TEMP").

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste o


sistema pode ficar sem recursos e travar.

Como dar foco a qualquer objeto


Objetivo Essa tcnica deve ser utilizada quando for necessrio dar foco a qualquer
objeto, mesmo sendo uma janela.
Implementao inserir a chamada da include i-win.i, no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento ApplyFocus que est dentro do programa ut-utils.p,


passando o seguinte parmetro:
o atributo hWnd do objeto que deve receber o foco;
run ApplyFocus in h-prog(input {&window-name}:hWnd).

eliminar o programa ut-utils.p que foi rodado persistente na memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.
268

Como deixar uma janela sempre visvel


Objetivo Esta tcnica pode ser usada sempre que uma janela, mesmo perdendo o foco,
permanea visvel.
Implementao inserir a chamada da include i-win.i, no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento SetTopMost que est dentro do programa ut-utils.p,


passando os seguintes parmetros:
o atributo hWnd da window que deve ficar sempre visvel;
o valor yes se a janela deve ficar sempre visvel;
run SetTopMost in h-prog(input {&window-name}:hWnd,
input yes).

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Como utilizar OCX


Objetivo Permitir a construo de programas que utilizam OCX.
Instalao Faz-se necessrio que o OCX esteja registrado na mquina onde ser
desenvolvido o programa. O programa para registrar e instalar cada OCX
encontra-se na pasta interfac dos produtos Datasul.

TreeView O diretrio onde se encontra o pacote para instalao desse ActiveX em


\interfac\Estruct\ e o arquivo que possui esse componente
MSCOMCTL.ocx. O nome do componente a ser utilizado Microsoft
CAPTULO 15 Tcnicas 269

Treeview Control, Version 6.0.


Este ActiveX Controle possui os seguintes mtodos:
1. Nodes: Clear Remove todas as entradas.
ChTreeView:TreeView:Nodes:Clear().
2. Nodes: Add Adiciona um item para a estrutura.
Sintaxe: TreeView:Nodes:Add(<Nivel relativo>, <Grau>, <Identificador>,
<Label>)
Onde:
<Nivel relativo> - O pai de item a ser incluso. Caso o item seja do primeiro
nvel, este deve ser em branco.
<Grau>- Caso o item a ser incluso seja um filho, deve ser passado 4 seno
deve ser em branco.
<Identificador>- Chave nica para o item a ser incluso.
<Label>- O label do item a ser incluso.
ChTreeView:TreeView:Nodes:Add(, , "Nivel1", "Pai").
ChTreeView:TreeView:Nodes:Add("Nivel", 4, "Nivel2", "Filho").
Neste exemplo, criado um item "Pai" com um identificador "Nivel1" e logo
aps criado um item "Filho" para o "Nivel1" com um identificador "Nivel2".
Para criar-se um filho deve-se utilizar o grau 4.
3. SelectedItem:Key Retona a chave do nodo selecionado na rvore.
Exemplo:
MESSAGE ChTreeView:TreeView:SelectedItem:KEY
VIEW-AS ALERT-BOX INFO BUTTONS OK.
O comando contido neste exemplo mostrar uma mensagem contendo a
chave do nodo selecionado. Considerando que o nodo selecionado fosse o
nodo de label Pai do exemplo do mtodo Nodes:Add, o valor exibido
seria Nvel1.
4. SelectedItem:Index Retorna o indice do nodo selecionado na
rvore.
Exemplo:
ASSIGN i-escolha = chCtrlFrame:TreeView:SelectedItem:Index.
270

Nesse caso o indice do nodo selecionado ficar armazenado na varivel i-


escolha. Contando que foram criados 4 (quatro) nodos Pai e um nodo
filho, o valor armazenado seria 5 (cinco) caso o filho fosse o nodo
selecionado.
5. SelectedItem:Text Retorna o texto do nodo selecionado na rvore.
Exemplo:
ChTreeView:TreeView:Nodes:Add("rh-1", 4, "rh-1-2", "Folha de Pgto
").
/* Aps seleo do novo nodo criado acima */
MESSAGE ChTreeView:TreeView:SelectedItem:Text
VIEW-AS ALERT-BOX INFO BUTTONS OK.
A mensagem desse exemplo exibira o texto Folha de Pgto quando o
nodo criado acima for selecionado.

Observao Deve-se utilizar sempre o TreeView da Microsoft (COMCTL32.OCX). Todos os


programas que hoje esto construdos e utilizando o TreeView da Datasul, no precisam ser
alterados.
CAPTULO 15 Tcnicas 271

ImageList Dever ser colocado na propriedade tag do OCX (TreeView ou ListView) o


nome do ImageList utilizado. Se estivermos utilizando um OCX TreeView o
nome do OCX dever ser TreeView, e se estivermos utilizando um OCX
ListView o nome do OCX dever ser ListView..
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Grafico \ e o arquivo que possui esse componente COMCTL32.ocx.
O nome do componente a ser utilizado Microsoft ImageList Control, version
5.0.

No objeto ImageList dever ser colocado o nome do arquivo da imagem na


propriedade tag de cada imagem dentro do mesmo. As imagens adicionadas no
ImageList devero ser expedidas dentro da pasta imagens do produto.
272

Observao A utilizao do ImageList necessria para que o programa possa ser executado
pelo WebEnabler. Na ausncia do mesmo o programa executar sem imagens.

PSTimer Este controle permite que sejam programadas execues 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.
Esse componente j acompanha o Progress e por isso no 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 Lgico (true/false), sempre que
for setado para true o evento Ticker ser disparado aps 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
ocorrncia do evento Ticker e outra. Caso o valor setado seja 0 no
ser disparado o evento.
Sintaxe: <com-handle>:Controls:Item(1):Interval.
chCtrlFrame:Controls:Item(1):Interval = 50.
Evento
CAPTULO 15 Tcnicas 273

Tick o evento que disparado aps cada intervalo de tempo


determinado.

Imagem A imagem um componente OCX que permite a visualizao de imagens em


um programa progress.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\imagem\ e o arquivo que possui esse componente DATIMAGE.ocx.
O nome do componente a ser utilizado DatasulImage.Imagem.
Propriedades:
Imagem - Informa-se o caminho da imagem desejada, esta propriedade
tanto de leitura quanto de escrita.
Sintaxe: <com-handle>:Controls:Item(1):imagem.
chCtrlFrame:Controls:Item(1):imagem = "c:/tmp/amostra.jpg".
Largura - Largura da rea onde a imagem poder ser exibida, o valor
dessa propriedade pode ser utilizado para leitura e para escrita.
Sintaxe: <com-handle>:Controls:Item(1):Largura.
chCtrlFrame:Controls:Item(1):Largura = 500.
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.
274

MediaPlayer Componente que permite a execuo de filmes em aplicaes progress. Possui


a propriedade arquivo que informa ou recebe o nome do arquivo est sendo
executado ou que ir ser executado, e a propriedade comando que recebe ou
informa o comando que est sendo executado.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\video\ e o arquivo que possui esse componente DATVIDEO.ocx. O
nome do componente a ser utilizado DatasulMultimedia.MediaPlayer.
Exemplo:
ASSIGN chCtrlFrame:Controls:Item(1):arquivo = "c:/tmp/count.avi"
chCtrlFrame:Controls:Item(1):comando = "open"
chCtrlFrame:Controls:Item(1):comando = "play".
PAUSE.
ASSIGN chCtrlFrame:Controls:Item(1):comando = "stop".

ListView O diretrio onde se encontra o pacote para instalao desse componente em


\interfac\Estruct\ e o arquivo que possui esse componente MSCOMCTL.ocx.
O nome do componente a ser utilizado Microsoft ListView Control, version
6.0.
Este componente funciona de maneira muito semelhante ao TreeView, sendo
que seus mtodos bsicos so:
ListView:ListItems:Clear Este mtodo elimina todas as entradas da
ListView.
Sintaxe: <com-handle>:ListView:ListItems:Clear.
chCtrlFrame: ListView:ListItems:Clear.
ListView:ListItems:Add Adiciona um item ListView.
Sintaxe: <com-handle>: Add (<Index>, <Key>, <Text>, <Icon>,
<SmallIcon>).
Onde:
<Index> - o ndice do item dentro da ListView, caso no seja
necessrio esse controle pode-se omitir essa informao.
<Key> - uma chave nica de cada item, a Key no pode repetir nos
itens da ListView.
<Text> - o texto que ir ser exibido na ListView para representar o
item.
<Icon> - o ndice do cone na lista de cones, esse ndice opcional.
CAPTULO 15 Tcnicas 275

<SmallIcon> - o ndice do smallicon na lista de smallicons, esse


ndice tambm opcional.

chCtrlFrame:ListView:ListItems:Add ( , "indice", "Item1", , 3).


chCtrlFrame:ListView:ListItems:Add ( 1, "indice", "Item1", , ).

Observao Deve-se utilizar sempre o ListView da Microsoft (COMCTL32.OCX).

CellView O diretrio onde se encontra o pacote para instalao desse componente em


\interfac\Cellsvwr\ e o arquivo que possui esse componente
CELLSVWR.ocx. O nome do componente a ser utilizado
CellsVwr.CellView.
Esse componente possibilita a visualizao de clulas, seus principais mtodos
e propriedades so:
ClearCells Este mtodo limpa todas as clulas.
Sintaxe: <com-handle>:ClearCells.
chctrlframe:CellView:ClearCells.
CellsCount Propriedade apenas para leitura, que informa a
quantidade de clulas existentes.
Sintaxe: <com-handle>:CellsCount.
chctrlframe:CellView:CellsCount.
AddLink Este mtodo utilizado para adicionar clulas, todos os
parmetros so obrigatrios.
Sintaxe: <com-handle>: AddLink (Integer-Level,Character-
PrevKey,Character-PrevText,Character-PrevToolTipText,Character-
Key,Character-Text, Character-ToolTipText).
chctrlframe:CellView:AddLink
(0,"Key1","Item1","Tip1","Key2","Item2","Tip2").
Click Evento disparado quando um item, que foi criado, recebe um
clique do usurio. Existe um parmetro de entrada que a Key do item
selecionado.
Sintaxe: <control-frame>.<control>.Click.
PROCEDURE CtrlFrame.OCX.Click :
DEFINE INPUT PARAMETER Key AS CHARACTER.
END PROCEDURE.
276

DTPicker Componente para visualizao de calendrio, seu atributo mais utilizado o


Value.
Sintaxe: <com-handle>:Value.
Exemplo: chCtrlFrame:Controls:Item(1):value = today.
No exemplo acima, atribumos a data corrente do sistema operacional para o
componente DTPicker.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\calendar\ e o arquivo que possui esse componente
MSCOMCT2.ocx. O nome do componente a ser utilizado Microsoft Date
and Time Picker Control 6.0.

Aloca_Tarefa Esse componente OCX permite a exibio de um grfico que facilita a


representao da agenda de compromissos de uma ou vrias pessoas. O grfico
gerado exibe a locao dos horrios por tarefa cadastrada.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\barra\ e o arquivo que possui esse componente BARRAS_2.ocx. O
nome do componente a ser utilizado Barras.Aloca_Tarefa.
Seus principais mtodos so:
Data_Inicial_Setar Este mtodo informa qual a data inicial que ser
utilizada pelo componente.
Sintaxe: <com-handle>: Data_Inicial_Setar (dt-ini AS DATE).
chctrlframe:Aloca_Tarefa:Data_Inicial_Setar (DATE(01,01,2004)).
objetos_mostrar Mtodo que exibe no componente as tarefas que
foram inseridas no mesmo.
Sintaxe: <com-handle>:objetos_mostrar.
chctrlframe:Aloca_Tarefa:objetos_mostrar.
Tela_limpar Quando este mtodo invocado, todas as tarefas que
estavam sendo exibidas deixam de ser exibidas no componente.
Sintaxe: <com-handle>:Tela_limpar.
chctrlframe:Aloca_Tarefa:Tela_limpar.
Tarefa_Retorna_Id Mtodo que retorna um valor caracter que
representa o id da tarefa que est selecionada.
Sintaxe: <com-handle>:Tarefa_Retorna_Id().
chctrlframe:Aloca_Tarefa:Tarefa_Retorna_Id().
CAPTULO 15 Tcnicas 277

Alocacoes_Tarefa_Navegar Este mtodo faz com que o


componente exiba a locao de horrios das tarefas que esto na
mesma data que a tarefa que estava selecionada no momento em que o
mtodo foi chamado.
Sintaxe: <com-handle>:Alocacoes_Tarefa_Navegar().
chctrlframe:Aloca_Tarefa:Alocacoes_Tarefa_Navegar().
Alocar utilizando esse mtodo que se adiciona tarefas para o
componente.
Sintaxe: <com-handle>: Alocar ( Character-tarefa_id, Character-
texto_tar, Character-tooltip_tar, Character-hora_ini, Character-
hora_fim, Date-dt_aloc, Character-tooltip_aloc, Integer-cor_aloc ).
Onde:
<tarefa_id>: o identificador da tarefa, este valor pode se repetir mas
quando isso acontecer todas as tarefas com o mesmo id sero exibidas
em uma mesma linha.
<texto_tar>: Texto que exibido no canto esquerdo do grfico e
indica qual tarefa est sendo representada naquela linha.
<tooltip_tar>: o tooltip do texto da tarefa.
<hora_ini>: Horrio de incio da tarefa.
<hora_fim>: Horrio de trmino da tarefa.
<dt_aloc>: Data em que a tarefa est sendo alocada.
<tooltip_aloc>: o tooltip da representao de locao de horrio no
componente.
<cor_aloc>: Atravs desse parmetro possvel alterar a cor de
exibio da locao de horrio.
chctrlframe:Aloca_Tarefa:Alocar ("1","Tarefa 01","TIP - Tarefa 01",
"08:30","12:00","01/05/2004",
"08:30 - 12:00 / 3 Pessoas",500).

UColunas Componente para gerao de grficos em colunas que possibilita a exibio de


diversas colunas e cada coluna com no mximo mais 5 colunas.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\graf-col\ e o arquivo que possui esse componente COLUNAS5.ocx.
O nome do componente a ser utilizado PColunas51.Ucolunas.
Seus principais mtodos e atributos so:
Tela_Limpar Como o prprio nome do mtodo sugere, sua
funcionalidade de limpar as barras que j estejam sendo exibidas.
278

Sintaxe: <com-handle>:Tela_Limpar().
chCtrlFrame:UColunas:Tela_Limpar().
Linhas_Trocar_Estilo Utilizando esse mtodo podemos alterar os
estilos das linhas dos grficos, basta invocar o mtodo e passar um
valor inteiro para definir o estilo da linha.
Os estilos de linha so: 1 Sem linha; 2 Pontilhado; 3 Tracejado; 4
Linhas.
Sintaxe: <com-handle>:Linhas_Trocar_Estilo (Valor AS Integer).
chCtrlFrame:UColunas:Linhas_Trocar_Estilo (4).
Valor_Maximo_Setar Esse mtodo permite que seja definido qual o
valor mximo das colunas do grfico.
Sintaxe: <com-handle>: Valor_Maximo_Setar (Valor AS
FLOAT,Character-c_format ).
chCtrlFrame:UColunas:Valor_Maximo_Setar (10,">>>>>,>>9.99").
Colunas_Criar Este mtodo permite a criao de grupos de coluna
sendo que cada grupo composto por no mximo 5 colunas.
Sintaxe: <com-handle>: Colunas_Criar (Id AS SHORT, val1 AS
FLOAT, val2 AS FLOAT, val3 AS FLOAT, val4 AS FLOAT, val5
AS FLOAT, Character-leg_x1, Character-leg_x2).
Onde:
<Id>: o identificador de cada grupo.
<val1 val5>: o valor correspondente de cada coluna do grupo.
<leg_x1 e leg_x2>: So as legendas que podem ser atribudas para os
grupos de colunas do componente.
Exemplo: chCtrlFrame:UColunas:Colunas_Criar (1, 10, 9, 8, 7, 6,
"Teste1", "Texto 2").
Objetos_Mostrar Mtodo que exibe os grupos de colunas criados na
tela.
Sintaxe: <com-handle>:Objetos_Mostrar().
chCtrlFrame:UColunas:Objetos_Mostrar().
Coluna_Selecionada Este mtodo retorna uma string com o
identificador + posio da coluna no grupo. Essa string permite
identificar unicamente cada uma das colunas.
Sintaxe: <com-handle>:Coluna_Selecionada().
chCtrlFrame:UColunas:Coluna_Selecionada().
CAPTULO 15 Tcnicas 279

MSComm O MSComm um componente OCX produzido pela Microsoft que possibilita


a comunicao da aplicao com outros dispositivos que estejam previamente
configurados e aptos para realizar essa comunicao.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\BCportaserial\ e o arquivo que possui esse componente
MSCOMM32.ocx. O nome do componente a ser utilizado Microsoft
Communications Control, version 6.0.
Suas propriedades mais utilizadas so:
CommPort Com essa propriedade podemos ver ou alterar qual a
porta que o componente ir utilizar para se comunicar com outros
dispositivos.
Sintaxe: <com-handle>:CommPort.
ASSIGN chComm:MSComm:CommPort =500.
Handshaking Handshaking o protocolo que utilizado pelo
hoardware para se comunicar atravs da porta serial. Essa propriedade
aceita apenas valores inteiros e os possveis valores para a propriedade
so: 0 NoHandshaking; 1 XonXoff; 2 RtsCts; 3
XonXoffAndRtsCts.
Sintaxe: <com-handle>:Handshaking.
ASSIGN chComm:MSComm:Handshaking = 0.
Settings Atravs dessa propriedade definimos as configuraes que
sero utilizadas para se comunicar com o outro disposito, essas
configuraes so os nmeros de bits por segundo, a paridade,
quantidade de bits e o bit de parada. Todas as configuraes devem ser
atribudas ao componente atravs de uma string que deve separar cada
informao 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
comunicao e tambm 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.
280

ProgressBar Como o prprio nome sugere, trata-se de um componente OCX que exibe a
barra de progresso de um determinado procedimento que esteja sendo
executado.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Grafico\ e o arquivo que possui esse componente COMCTL32.ocx.
O nome do componente a ser utilizado Microsoft ProgressBar Control,
version 5.0.
Min Nessa propriedade do objeto definimos qual o valor mnimo
que a barra pode assumir.
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 no ultrapasse o valor mximo, 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.

TabStrip O TabStrip um componente que permite que sejam criadas diversas


tabulaes de trabalho, permitindo assim que em uma mesma frame se consiga
trabalhar com diversas informaes de uma forma muito organizada.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Grafico\ e o arquivo que possui esse componente COMCTL32.ocx.
O nome do componente a ser utilizado Microsoft TabStrip Control, version
5.0.
Seus principais mtodos e propriedades so:
CLEAR O mtodo Clear do componente TabStrip faz com que
sejam eliminadas todas as tabs criadas anteriormente no componente.
Sintaxe: <com-handle>:Clear().
chCtrlFrame:TabStrip:Tabs:CLEAR().
CAPTULO 15 Tcnicas 281

COUNT Por meio dessa propriedade conseguimos obter a


quantidade exata de tabs criadas.
Sintaxe: <com-handle>:Count.
chCtrlFrame:TabStrip:Tabs:COUNT
INDEX Essa propriedade retorna o valor do index da tab que est
selecionada no instante em que se pega o valor da mesma.
Sintaxe: <com-handle>:Index.
chCtrlFrame:TabStrip:SelectedItem:INDEX.
REMOVE Mtodo utilizado para remover uma determinada tab do
componente.
Sintaxe: <com-handle>:Remove (Index BY-VARIANT-POINTER).
chCtrlFrame:TabStrip:Tabs:Remove(chCtrlFrame:TabStrip:SelectedIt
em:INDEX).
ADD Esse mtodo utilizado para adicionar as tabs no
componente, as tabs devem ser adicionadas uma de cada vez.
Sintaxe: <com-handle>:Add(Index BY-VARIANT-POINTER,
Key BY-VARIANT-POINTER,
Caption BY-VARIANT-POINTER,
Image BY-VARIANT-POINTER ).
Onde:
<Index>: o ndice da tab que est sendo adicionanda.
<Key>: Key o valor da tab, esse dado no obrigatrio.
<Caption>: Caption o texto de exibio da tab que est criada.
<Image>: o ndice da imagem da lista de imagem que ser exibida
nessa tab, essa informao no obrigatria.
chCtrlFrame:TabStrip:Tabs:ADD( 1 BY-VARIANT-POINTER , ,
"Teste1" BY-VARIANT-POINTER , ).

DTelnet DTelnet um componente ActiveX que possibilita que programas se conectem


a servidores remotos por meio de conexes Telnet e que troquem informaes
com esses servidores.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Telnet\ e o arquivo que possui esse componente D_TNET32.ocx. O
nome do componente a ser utilizado Distinct Telnet ActiveX Control.
Seus principais mtodos e propriedades so:
CONECT O mtodo Conect responsvel por fazer com que o
componente consiga se conectar ao servidor telnet especificado. Esse
282

mtodo retorna um valor do tipo lgico que representa se o


componente conseguiu se conectar ou no no servidor.
Sintaxe: <com-handle>:Connect (Host as Character,
Tty AS Character).
Onde:
<Host>: Especifica o nome do servidor Telnet ao qual se deseja
conectar.
<Tty>: o tipo de conexo telnet que se deseja estabelecer com o
servidor informado.
chCtrlFrame:Connect(trim("TelnetServer"),'vt100').
DISCONNECT Esse mtodo solicita ao servidor que seja encerrada
a sesso Telnet e finaliza a conexo com o servidor. Esse mtodo
retorna uma varivel do tipo lgico que pode ser verdadeiro no caso de
ter concludo o encerramento da conexo Telnet ou falso no caso de
ter ocorrido algum problema que no possibilite o encerramento da
conexo.
Sintaxe: <com-handle>:Disconnect ( ).
chCtrlFrame:Disconnect().
RECEIVE Mtodo que recebe as informaes que o servidor Telnet
est enviando para o programa. Esse mtodo retorna uma varavel do
tipo character com as informaes enviadas pelo servidor.
Sintaxe: <com-handle>:Receive.
chCtrlFrame:Receive.

Sound Componente que possibilita e execuo de arquivos de sons como wav e mid
em aplicaes progress. Possui a propriedade arquivo que informa ou recebe
o nome do arquivo est sendo executado ou que ir ser executado, e a
propriedade comando que recebe ou informa o comando que est sendo
executado.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\som\ e o arquivo que possui esse componente DATSOUND.ocx. O
nome do componente a ser utilizado DatasulSound.Sound.
Exemplo:
ASSIGN chCtrlFrame:Controls:Item(1):arquivo = "c:/tmp/som1.wav".
ASSIGN chCtrlFrame:Controls:Item(1):comando = "sound".
CAPTULO 15 Tcnicas 283

Tree Chart Componente OCX destinado definio do lay-out de posicionamento das


clulas no organograma.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Tree Chart\ e o arquivo que possui esse componente
TREECHART.ocx. O nome do componente a ser utilizado Tree Chart
Control.
Seus principais mtodos e propriedades so:
LAYERDISTANCE Atrinbuto que define o tamanho das linhas
verticais do diagrama.
Sintaxe: Get: [ Decimal-Var = ] <com-handle>:LayerDistance.
Set: <com-handle>:LayerDistance [ = Decimal-Var ].
Exemplo: chTree_Layout:LayerDistance = 300.

VERTEXDISTANCE Atrinbuto que define o tamanho das linhas


horizontais do diagrama.
Sintaxe: Get: [ Decimal-Var = ] <com-handle>:VertexDistance.
Set: <com-handle>:VertexDistance [ = Decimal-Var ].
Exemplo: chTree_Layout:VertexDistance = 300.

ORIENTATION Atributo que define a posio das clulas pai em


relao s clulas filhas.
Valores: 0 Norte;
1 Leste;
2 Sul;
3 Oeste.

Sintaxe: Get: [ <user-defined>-Var = ] <com-handle>:Orientation.


Set: <com-handle>:Orientation [ = <user-defined>-Var ].
Exemplo: chTree_Layout:Orientation = 0.
284

LAYOUT Aplica o lay-out definido no componente de diagrama


definido em Com-Handle-Control.
Sintaxe: NO-RETURN-VALUE <com-handle>: Layout ( Com-Handle-
Control ).
Exemplo: no-return-value chTree_layout:Layout(chOrg).
Onde chOrg o componente que ser aplicado o Layout.

Print Chart Componente OCX destinado ao tratamento dos parmetros de impresso para
outros componentes OCX.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Print Chart\ e o arquivo que possui esse componente
PRINTCHART.ocx. O nome do componente a ser utilizado Print Chart
Activex Control.
Seus principais mtodos e propriedades so:
HWNDFLOW Esse mtodo utilizado para armazenar o
componente que possui os dados a serem impressos.
Sintaxe: Get: [Integer-Var =] <com-handle>:hWndFlow.
Set: <com-handle>:hWndFlow [ = Integer-Var ].
Exemplo: chPrn:hWndFlow = chOrg:hwnd .
Onde chOrg o componente que possui os dados a serem impressos.

DOCNAME Esse mtodo armazena o nome do respectivo


documento.
Sintaxe: Get: [Character-Var = ] <com-handle>:DocName.
Set: <com-handle>:DocName [ = Character-Var ].
Exemplo: chPrn:DocName = "Nome do arquivo".

FITTOPAGE Mtodo utilizado para acomodar o contedo a ser


impresso em uma nica pgina.
Sintaxe: Get: [ Logical-Var = ] <com-handle>:FitToPage.
CAPTULO 15 Tcnicas 285

Set: <com-handle>:FitToPage [ = Logical-Var ].


Exemplo: chPrn:FitToPage = TRUE.

PREVIEW Mtodo utilizado para apresentar a tela de preview de


impresso.
Sintaxe: Get: [ Logical-Var = ] <com-handle>:Preview.
Set: <com-handle>:Preview [ = Logical-Var ].
Exemplo: chPrn:Preview = TRUE.

PRINTERSETTINGS Mtodo utilizado para apresentar a tela de


propriedades de impresso.
Sintaxe: Get: [ Logical-Var = ] <com-handle>:PrinterSettings.
Set: <com-handle>:PrinterSettings [ = Logical-Var ].
Exemplo: chPrn:PrinterSettings = true.

ORIENTATION Mtodo utilizado para informar a orientao da


folha ( Retrato ou Paisagem ).
Sintaxe: Get: [ <user-defined>-Var = ] <com-handle>:Orientation.
Set: <com-handle>:Orientation [ = <user-defined>-Var ].
Exemplo: chPrn:orientation = 2.

PRINTDOC Mtodo utilizado para imprimir o respectivo


documento.
Sintaxe: NO-RETURN-VALUE <com-handle>: PrintDoc.
Exemplo: chPrn:PrintDoc.

Org Chart Componente OCX destinado criao de organogramas. O diretrio onde se


encontra o pacote para instalao desse componente em \interfac\Org Chart\
286

e o arquivo que possui esse componente ORGCHART.ocx. O nome do


componente a ser utilizado Org Chart Activex Control.
Seus principais mtodos e propriedades so:
FILLCOLOR Mtodo utilizado para definir a cor das clulas do
diagrama.
Sintaxe: Get: [ Integer-Var = ] <com-handle>:FillColor.
Set: <com-handle>:FillColor [ = Integer-Var ].
Exemplo: chorg:fillcolor = rgb-value(255,255,255).

FORECOLOR Mtodo utilizado para definir a cor dos labels do


diagrama.
Sintaxe: Get: [ Integer-Var = ] <com-handle>:ForeColor.
Set: <com-handle>:ForeColor [ = Integer-Var ].
Exemplo: chorg:forecolor = rgb-value(0,0,0).

BACKCOLOR Mtodo utilizado para determinar a cor de fundo do


diagrama.
Sintaxe: Get: [ Integer-Var = ] <com-handle>:BackColor.
Set: <com-handle>:BackColor [ = Integer-Var ].
Exemplo: chorg:backcolor = rgb-value(255,255,255).

FONT Mtodo responsvel pelo tratamento de fontes.


Sintaxe: Get: [ Com-Handle-Var = ] <com-handle>:Font.
Set: <com-handle>:Font [ = Com-Handle-Var ].
Exemplo: chOrg:FONT:NAME = "Tahoma".
chOrg:FONT:SIZE = 7.

SAVEFILE Salva um diagrama em um arquivo


CAPTULO 15 Tcnicas 287

Sintaxe: NO-RETURN-VALUE <com-handle>: SaveFile (


Character-file ).
Exemplo: no-return-value chOrg:FONT: SaveFile( name file ).

SAVEIMAGE Salva um diagrama em um formato meta-arquivo.


Sintaxe: NO-RETURN-VALUE <com-handle>: SaveImage (
Integer-tymed,
Integer-format,
Character-file ).
Exemplo: no-return-value chOrg:FONT: SaveFile( 0, 0, name file).
Onde Integer-tymed: afTypeMediumFile = 0
afTypeMediumClipboard = 1
Integer-format: afWMF = 0
afEMF = 1

SHAPE Mtodo utilizado para definir a figura geomtrica das


clulas do organograma.
Sintaxe: Get: [ Integer-Var = ] <com-handle>:Shape.
Set: <com-handle>:Shape [ = Integer-Var ].
Exemplo: chOrg:shape = 2.

AUTOSCROLL Atravs desse mtodo pode-se determinar se o


diagrama ir apresentar as barras de rolagem quando necessrio.
Sintaxe: Get: [ Logical-Var = ] <com-handle>:AutoScroll.
Set: <com-handle>:AutoScroll [ = Logical-Var ].
Exemplo: chOrg:AutoScroll = true.

SELECTALL Mtodo utilizado para selecionar todo o diagrama.


288

Sintaxe: NO-RETURN-VALUE <com-handle>: SelectAll ( ).


Exemplo: chOrg:SelectAll.

DELETESEL Mtodo utilizado para apagar os itens selecionados.


Sintaxe: NO-RETURN-VALUE <com-handle>: DeleteSel ( ).
Exemplo: chOrg:DeleteSel.

ADD Mtodo utilizado para adicionar novas clulas no diagrama.


Sintaxe: [ Com-Handle-Var = ] <com-handle>: Add (
Decimal-Left AS FLOAT,
Decimal-Top AS FLOAT,
Decimal-Width AS FLOAT,
Decimal-Height AS FLOAT ).

Para criarmos novas clulas no diagrama deve-se, primeiramente,


definir trs variveis do tipo com-handle:
def var chNode as com-handle extent 9999 no-undo.
def var chNodos as com-handle no-undo.
def var chLiga as com-handle no-undo.

Utilizando o mtodo nodes do componente OCX OrgChart, associ-


lo varivel chNodos:
chNodos = chOrg:nodes.
Onde chOrg o nome do componente OCX OrgChart.

A varivel chNode ser utilizada para armazenar as novas clulas


criadas, sendo que a varivel sequncia ser utilizada para
armazenar a seqncia na hierarquia do organograma:
chNode[sequncia] = chNodos:add(0,0,1500,600).
CAPTULO 15 Tcnicas 289

A varivel chLiga utilizada para montar os links entre as clulas.


Utilizando o mtodo outlinks criamos a ligao entre a clula pai e a
celula filho.
chLiga = chNode[seqncia pai]:outlinks:add(chNode[sequncia]).

O cdigo abaixo mostra um exemplo da ligao das clulas do


organograma:
IF chOrg:nodes:count > 0 then do:
repeat i = 1 to chOrg:nodes:count:
chNodos = chOrg:nodes(i).
repeat j = 1 to chNodos:links:count:
chliga = chNodos:links(j).
chliga:LinkStyle = 4.
chLiga:Rigid = true.
end.
end.

Como executar um aplicativo do Windows


Objetivo Esta tcnica deve ser usada sempre que for executado um programa externo.
Essa funo substitui a antiga funo WINEXEC.
Implementao inserir a chamada da include i-win.i no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento Execute que est dentro do programa ut-utils.p,


passando os seguintes parmetros:
290

caminho do programa para ser executado;


os parmetros para o programa a ser executado;
run Execute in h-prog(input "c:\windows\calc,exe",
input "").

se o retorno for "Ok" a operao foi feita com sucesso;


If return-value = "Ok" then message "A operao foi feita com
sucesso".

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Como implementar Correo Ortogrfica em Editores


Objetivo Esta tcnica tem com objetivo fazer com que seja possvel executar a correo
ortogrfica do Word 97 para o texto que foi inserido em um determinado
campo ou varivel view-as editor.
Implementao criar um boto e coloc-lo ao lado direito superior do Editor;
alterar os atributos do tamanho do boto para:
Width: 4,00
CAPTULO 15 Tcnicas 291

Height: 1,25
deixar o boto sem label;
inserir o Help:"Corretor ortogrfico" no boto para implementar o
Tooltip;
definir a varivel 1-control-spell em Definitions. Exemplo:
define variable l-control-spell as logical no-undo init no.

na procedure local-display-fields da SmartViewer ou na procedure local-


initialize da SmartWindow, dependendo onde se encontra o Editor, deve
ser inserida aps o Run Dispatch, a chamada da include i-inispl.i, passando
como parmetro o nome do boto que foi criado. Exemplo:
{include/i-inispl.i <nome-do-boto>}

no MAIN-BLOCK, deve ser inserida a chamada da include i-spell.i,


passando como primeiro parmetro o nome do Editor que sofre a correo
ortogrfica, e como segundo parmetro, o nome do boto que foi criado e
que dispara a correo ortogrfica. Exemplo:
{include/i-spell.i <nome-do-editor> <nome-do-boto>}

importante ressaltar que esta tcnica s ir funcionar para quem possui o


Word 97, instalado na sua mquina.
Aps a implementao da tcnica, ela funciona assim:
no incio, a imagem do boto check deve estar em vermelho, indicando
que o texto do Editor ainda no passou pela correo ortogrfica.
Exemplo:

quando o boto for disparado, a Dialog de correo ortogrfica do Word


97 chamada e todos os seus recursos devem estar disponveis:
292

terminada a execuo do corretor ortogrfico, a imagem do boto check


est em verde, indicando que o texto do Editor j passou pela correo
ortogrfica. Exemplo:

Como obter as coordenadas do mouse


Objetivo Utilizar esta tcnica sempre que for necessrio verificar se o mouse est dentro
de uma determinada regio da janela no momento do clique. Pode ser usado
em browsers para ordenao automtica com base em um clique.
Implementao inserir a chamada da include i-win.i no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.
CAPTULO 15 Tcnicas 293

rodar o procedimento GetMousePos que est dentro do programa ut-


utils.p, passando os seguintes parmetros:
handle da window onde deve ser verificada a posio do mouse;
uma varivel do tipo inteiro para retornar o valor da coordenada X;
uma varivel do tipo inteiro para retornar o valor da coordenada Y;
run GetMousePos in h-prog(input {&window-name}:handle,
output i-x,
output i-y).

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

este procedimento pode ser usado na trigger de Select-Mouse-Click de um


objeto, fazendo com que este retorne a coordenada do mouse no momento
foi dado o clique no objeto.

Como obter o diretrio corrente


Objetivo Utilizar sempre que for necessrio obter o diretrio corrente do aplicativo que
est sendo executado.
Implementao inserir a chamada da include i-win.i no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento GetCurrentDir que est dentro do programa ut-


utils.p, passando o seguinte parmetro:
uma varivel do tipo caracter onde deve ser retornado o diretrio
corrente;
run GetCurrentDir in h-prog(output c-dir).
294

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Como obter o diretrio de sistema do Windows


Objetivo Utilizar esta tcnica sempre que for necessrio retornar o diretrio de sistema
do windows. Pode ser usada quando se deseja copiar algum arquivo para o
diretrio SYSTEM.
Implementao inserir a chamada da include i-win.i no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento GetSysDir que deve estar dentro do programa ut-


utils.p, passando o seguinte parmetro:
uma varivel do tipo caracter para retornar o caminho do diretrio de
sistema do windows;
run GetSysDir in h-prog(output c-path).

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Como obter o diretrio do Windows


Objetivo Utilizar esta tcnica sempre que for necessrio retornar o diretrio do
windows. Pode ser usada quando se deseja copiar algum arquivo para o
diretrio WINDOWS.
CAPTULO 15 Tcnicas 295

Implementao inserir a chamada da include i-win.i no incio do bloco de definies;


{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento GetWinDir que deve estar dentro do programa ut-


utils.p, passando os seguintes parmetros:
uma varivel do tipo caracter onde deve ser retornado o caminho do
diretrio do windows;
run GetWinDir in h-prog(output c-path).

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Como obter o nome do computador


Objetivo Essa tcnica deve ser usada quando for necessrio obter ou at mesmo
informar o nome do computador que deve estar executando a aplicao.
Implementao inserir a chamada da include i-win.i no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento GetComputerName que deve estar dentro do


programa ut-utils.p, passando o seguinte parmetro:
296

uma varivel do tipo caracter onde deve ser retornado o nome do


computador;
run GetComputerName in h-prog(output c-computador).

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Como obter o valor de uma varivel de ambiente


Objetivo Utilizar esta tcnica sempre que for necessrio ler alguma varivel de
ambiente;
Implementao inserir a chamada da include i-win.i no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento GetEnv que deve estar dentro do programa ut-


utils.p, passando os seguintes parmetros:
a varivel de ambiente que deseja-se saber o valor;
uma varivel do tipo caracter para retornar o valor da varivel de
ambiente informada;
run GetEnv in h-prog(input "PATH", output c-path).

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.
CAPTULO 15 Tcnicas 297

Como transformar uma janela em barra de ferramentas


Objetivo Esta tcnica deve ser usada sempre que for necessrio implementar uma janela
que esteja sempre visvel e que contenha funes de ferramentas, ou seja,
funes que no estejam ligadas a nenhum objeto ou programa especfico.
Implementao inserir a chamada da include i-win.i no incio do bloco de definies;
{include/i-win.i}

definir uma varivel do tipo handle;


def var h-prog as handle no-undo.

rodar o programa ut-style.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-style.p persistent set h-prog.

rodar o procedimento AddPaletteStyle que deve estar dentro do programa


winstyle.p, passando os seguintes parmetros:
atributo hWnd da janela a ser transformada;
run AddPaletteStyle in h-prog(input {&window-name}:hWnd).

eliminar o programa ut-style.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

verificar a possibilidade de deixar a barra de ferramentas sempre visvel.


Se a barra for sempre visvel, o que o mais normal, veja Como deixar
uma janela sempre visvel;
298

Como desabilitar Radio-Buttons


A sintaxe normal para desabilitar radio-buttons :
DISABLE(LABEL_DO_RADIO_BUTTON).

Entretanto essa tcnica no corresponde as nossas necessidades, visto que, o


label do radio-button, muda para cada lngua. Para isso, iremos adotar uma
tcnica que utiliza a seguinte sintaxe:
IF nome-rs:DISABLE(ENTRY(X,(nome-rs:RADIO-BUTTONS IN FRAME
{&FRAME-NAME}))) THEN.

Onde:
Nome-rs: Nome do Radio-set
X: Nmero que obtm a entrada desejada do radio-set. Este nmero obtido
pela seguinte frmulaX=2 * (entrada desejada)-1.
Observao o Radio-Set Properties mostra que as strings so: "string", 1, "string", 2, ..., ento
para obter a posio desejada necessrio utilizar a frmula descrita anteriormente.
Exemplo:
desabilitar o radio-button emprstimo
Tipo-modalidade.transacao
1 - Aplicao
2 - Emprstimo
X = 2(2) -1
X=3
If tipo-modalidade.transacao:disable(entry(3, tipo-
modalidade:radio-buttons)) in frame {&frame-name} then.

Como executar programas que so janelas


Objetivo Esta tcnica demonstra a forma correta para execuo de um programa (.w) a
partir de um outro programa que j uma janela, evitando a ocorrncia do erro
4123 ("None of the widgets used in WAIT-FOR statement are SENSITIVE
WAIT-FOR terminated. (4123))" durante a sua execuo.
CAPTULO 15 Tcnicas 299

Implementao deve ser definida uma varivel do tipo handle. Exemplo:


def var h-programa as handle no-undo.

o programa deve ser executado de forma persistente usando a varivel


handle que foi definida e a inicializao do programa deve ser feita atravs
da execuo da "initialize", exemplo:
run xxp/xx999.w persistent set h-programa.
If valid-handle(h-programa) then
run dispatch in h-programa ('initialize').

logo aps a execuo persistente do programa, se necessrio, podem-se


executar procedimentos do mesmo, antes ou depois de sua inicializao,
sendo que para cada procedimento a ser executado deve-se verificar a
validade do handle. Exemplo:
run xxp/xx9999.w persistent set h-programa.
If valid-handle(h-programa) then
run pi-seta-parametros in h-programa (input "teste"). 8

If valid-handle(h-programa) then
run dispatch in h-programa ('initialize').9
If valid-handle(h-programa) then do:10
run pi-reposiciona-tabela1 in h-programa (input 123).
run pi-reposiciona-tabela2 in h-programa (input 456). 11

End.

Para verificar se a implementao foi realizada de forma correta, basta fechar


a "janela chamadora" antes de fechar a "janela chamada". Quando for
encerrada a "janela chamada" o erro no deve ocorrer, se a tcnica foi
utilizada. O conceito GUI / MS Windows / Progress indica que uma janela
deve rodar como um objeto independente, por isso a execuo de programa
chamado deve ser de forma persistente.

8
Procedure pertencente ao programa chamado executada antes de sua inicializao;
9
Inicializao do programa chamado. Dever sempre ser feita separadamente de outras execues de
procedimentos devido a possibilidade de a inicializao o handle tornar-se invlido;
10
Validao do handle agrupando mais de uma execuo de procedimentos. Isso pode ser feito desde que a
inicializao do programa no esteja no mesmo bloco da condio 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 no tem possiblidade de ocasionar a invalidade do handle, contido em um bloco com
mais procedimentos.
300

Como habilitar ou desabilitar botes em painis


Foram criados procedures internas, nas masters, para habilitar ou desabilitar
todos os botes dos painis de Cadastro e Alterao. Para executar a procedure
e habilitar/desabilitar necessrio ter um link do tipo STATE, entre o painel e
a Window (THIS-PROCEDURE). A chamada desta procedure deve ser feita
dentro do local-initialize, depois do run-dispatch, na Window.
A sintaxe desta procedure :
RUN enable-<funo-do-boto> in <handle do painel> (Input
<logical>).

Onde:
<funo-do-boto>: Funo especfica do boto a ser trabalhado
<handle-do-painel>: Handle do painel, onde o link source
<logical>: Varivel em fator lgico, onde "yes" habilita e "no" desabilita.

Funes
Inclui
Elimina
Modifica
Copia
Cancela
Desfaz
Salva
Va-para
Zoom
Relacionamento
Relatrio

Caso voc queira desabilitar os botes do painel, conforme alguma validao


existente em uma viewer ou em um browser, voc deve proceder da seguinte
maneira:
Executar a procedure habilitar/desabilitar no state-changed, na Windows.
Criar um Smart-link, do tipo state, tendo como Source a Viewer ou
Browser e como Target a SmartWindow(this-procedure).
CAPTULO 15 Tcnicas 301

Na procedure local-row-available ou outro local, da Viewer ou do


Browser, conforme necessidade do usurio, inserir a lgica abaixo:
if ... validao qualquer ...
then run new-state("habilitar":U).
else run new-state("nao-habilitar":U).

na state-changed da Window, inserir a lgica abaixo:


if p-state = "nao-habilitar":U
then do:
run enable-<funo-do-boto> in <handle do painel>
(Input <logical>).
end.
if p-state = "habilitar":U
then do:
run enable-<funo-do-boto> in <handle do painel>
(Input <logical>).
end.

Observao No utilize a opo "else", pois nesta procedure passam vrios outros states.

Como habilitar ou desabilitar botes especficos em Browse


Inclui/Modifica
Objetivo Esta tcnica pode ser usada quando for necessrio desabilitar/habilitar outros
botes em Browse Inclui/Modifica conforme a existncia ou no de registro no
Browse.
Implementao inserir o cdigo, em destaque, na procedure STATE-CHANGED do
Browse Inclui/Modifica;
PROCEDURE state-changed:
/* ---------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
----------------------------------------------------- */
302

DEFINE INPUT PARAMETER p-issuer-hdl AS HANDLE NO-UNDO.


DEFINE INPUT PARAMETER p-state AS CHARACTER NO-UNDO.
CASE p-state:
when "no-record-available":U then
assign bt-name:SENSITIVE in frame {&FRAME-NAME} =
no.
when "no-external-record-available":U then
assign bt-name:SENSITIVE in frame {&FRAME-NAME} =
no.
when "record-available":U then
assign bt-name:SENSITIVE in frame {&FRAME-NAME} =
yes.
/* Object instance CASEs can go here to replace standard
behavior or add new cases. */
{src/adm/template/bstates.i}
END CASE.
run pi-trata-state (p-issuer-hdl, p-state).
END PROCEDURE.

Observaes No elimine o cdigo existente na procedure STATE-CHANGED.


E, ainda, os botes de Modifica/Eliminar so desabilitados automaticamente.

Como implementar campos indicadores com view-as combo-box nas


telas
Os campos indicadores podem ser representados nas telas com view-as
combo-box e para isto deve-se seguir os passos, nos cdigos abaixo:
XX: sigla do banco de dados
XXINC/I99XX999.I: include do dicionrio de dados para o campo indicador
<varivel-combo-box>: nome da varivel view-as combo-box que na tela
representa o campo indicador
<tabela>: tabela que possui o campo tipo indicador
<campo>: campo tipo indicador representado pelo combo-box
1. Colocar um combo-box na tela com formato maior que o tamanho do
maior elemento do list-items deste campo indicador;
CAPTULO 15 Tcnicas 303

Nas propriedades avanadas deste combo-box, marcar os 'Custom lists',


conforme o tipo de SmartViewer:
Viewers de Cadastro Simples Viewers de Folders
ADM-CREATE-FIELDS
ADM-ASSIGN-FIELDS ADM-MODIFY-FIELDS
ADM-MODIFY-FIELDS
2. Retirar a propriedade Enable do combo-box.
3. Na procedure "local-initialize" implementar, antes do run dispatch, uma
lgica que prepare o "list-items" da varivel combo-box:
assign <variavel-combo-box>:list-items in frame {&frame-name}
= {XXINC/I99XX999.I 03}.
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U).

4. Na procedure "local-display-fields" implementar, aps o run dispatch, uma


lgica que apresente o valor caracter correspondente ao valor inteiro do
campo indicador:
/* Dispatch standard ADM method.
RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U).
/* Code placed here will execute AFTER standard behavior. */
if avail <tabela> then
assign <variavel-combo-box>:screen-value in frame {&frame-
name} = {XXINC/I99XX999.I 04 <tabela>.<campo>}.
end.
else
assign <variavel-combo-box>:screen-value in frame
{&frame-name} = {XXINC/I99XX999.I 04 1}.
end.

5. Para gravao do contedo do combo-box, na base de dados:


a) Quando for um Cadastro Simples, implementar a seguinte lgica aps
o "run dispatch da local-assign-record":
assign <tabela>.<campo> = {XXINC/I99XX999.I 06 <varivel-
combo-box>}.

b) Quando for um Cadastro Complexo, implementar a seguinte lgica


aps o "run dispatch da local-assign-statement":
304

assign input frame {&frame-name} <varivel-combo-box>


<tabela>.<campo> = {XXINC/I99XX999.I 06 <varivel-combo-
box>}.

6. Na procedure local-enable-fields, comentar a lgica abaixo:


/* if adm-new-record = yes then */

Observao Quando da utilizao de campos indicadores com view-as combo-box, e este


campo no fizer parte da chave primria, para atualiz-lo deve ser criada a local-assign-record e
aps o run dispatch fazer o assign da varivel para o campo da tabela. Caso este campo faa
parte da chave, o assign deve ser feito na local-create-record, tambm aps o run dispatch.

Como implementar campos indicadores com view-as radio-set nas


telas
Os campos indicadores podem ser representados nas telas com view-as radio-
set e para isto deve-se seguir os passos, nos cdigos abaixo:
XX : sigla do banco de dados
XXINC/I99XX999.I: include do dicionrio de dados para o campo indicador
<varivel-radio-set>: nome da varivel view-as radio-set que na tela
representa o campo indicador
<tabela>: tabela que possui o campo tipo indicador
<campo>: campo tipo indicador representado pelo radio-set
1. Colocar um radio-set na tela com formato maior que o tamanho do maior
elemento do list-items deste campo indicador e do tipo caracter;
Nas propriedades avanadas deste radio-set, marcar os 'Custom lists',
conforme o tipo de SmartViewer:
Viewers de Cadastro Simples Viewers de Folders
ADM-CREATE-FIELDS
ADM-ASSIGN-FIELDS ADM-MODIFY-FIELDS
ADM-MODIFY-FIELDS
2. Retirar a propriedade Enable do radio-set.
3. Definir as seguintes variveis no bloco de Definitions da viewer:
define variable c-lista as character no-undo.
define variable i-cont as integer no-undo.
CAPTULO 15 Tcnicas 305

4. Na procedure "local-initialize" implementar, antes do run dispatch, uma


lgica que prepare o "list-items" da varivel radio-set:
do i-cont = 1 to num-entries({XXINC/I99XX999.I 03}):
assign c-lista = c-lista + entry(i,{XXINC/I99XX999.I 03}) +
"," + string(i-cont) + ",".
end.
assign c-lista = substring(c-lista,1,lenght(c-lista) - 1).
assign <variavel-radio-set>:radio-buttons in frame {&frame-
name} = c-lista.
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U).

5. Na procedure "local-display-fields" implementar, aps o run dispatch, uma


lgica que apresente o valor caracter correspondente ao valor inteiro do
campo indicador:
/* Dispatch standard ADM method.
RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U).
/* Code placed here will execute AFTER standard behavior. */
if avail <tabela> then
assign <variavel-radio-set>:screen-value in frame {&frame-
name} = {XXINC/I99XX999.I 04 <tabela>.<campo>}.
end.
else
assign <variavel-radio-set>:screen-value in frame
{&frame-name} = {XXINC/I99XX999.I 04 1}.
end.

6. Para gravao do contedo do radio-set, na base de dados:


a) Quando for um Cadastro Simples, implementar a seguinte lgica aps
o "run dispatch da local-assign-record":
assign <tabela>.<campo> = {XXINC/I99XX999.I 06 <varivel-
radio-set>}.

b) Quando for um Cadastro Complexo, implementar a seguinte lgica


aps o "run dispatch da local-assign-statement":
assign input frame {&frame-name} <varivel-radio-set>
<tabela>.<campo> = {XXINC/I99XX999.I 06 <varivel-radio-
set>}.

7. Na procedure local-enable-fields, comentar a lgica abaixo:


306

/* if adm-new-record = yes then */

Observao Quando da utilizao de campos indicadores com view-as radio-set, e este


campo no fizer parte da chave primria, para atualiz-lo deve ser criada a local-assign-record e
aps o run dispatch fazer o assign da varivel para o campo da tabela. Caso este campo faa
parte da chave, o assign deve ser feito na local-create-record, tambm aps o run dispatch.

Quando for mostrar o campo indicador, em consulta, com view-as radio-set,


deve ser mostrado num fill-in, somente a descrio correspondente ao valor
cadastrado. Na procedure local-display-fields, deve ser dado um assign no fill-
in utilizando a include do dicionrio conforme exemplo abaixo:
assign <variavel-fill-in>:screen-value in frame <frame-
name> = {XXINC/I99XX999.I 04 <tabela-campo>}.

Como implementar campos indicadores num SmartBrowser


Quando se precisar colocar um campo do tipo indicador (view-as, radio-set ou
combo-box) num SmartBrowser necessrio utilizar um campo calculado
("Calculate Field") e neste implementar uma lgica com o comando entry para
apresentar o contedo do campo significativo para o usurio, porque estes
campos indicadores so inteiros e deve ser apresentado o valor caracter
correspondente. Exemplo:
entry(conta.tipo,"Ativo,Passivo,Receita,Despesa,Vendas,Ttulo")
@ c-tipo

1. Em Definitions do SmartBrowser definir duas novas variveis para o


campo indicador, uma conter o seu 'label' e ser a coluna do campo
calculado no browse e outra character para conter o seu 'list-items'.
Exemplo:
def var c-tipo as character no-undo. /* coluna no browse */
def var c-lista-tipo as character no-undo. /* list-items */

2. No Main-Block do SmartBrowser deve-se preparar o contedo da varivel


com o 'list-items' e buscar o label do dicionrio de dados.
/* include que retornar o label do campo */
Exemplo
{utp/ut-field.i mgadm conta tipo 1}
/* acerta o column-label no browse */
assign c-tipo:label in browse br-table = return-value.
/* busca o list-items conforme o include padro */
assign c-lista-tipo = {adind/i02ad049.i 03}
CAPTULO 15 Tcnicas 307

Onde:
{03}:indica a funo a ser realizada, conforme a tabela abaixo:
Funo Objetivo
01 define view-as Combo-Box
02 define view-as Radio-Set
03 lista com os itens separados por vrgula
04 n retorna o item n da lista
05 retorna o nmero de itens da lista
06 item retorna a posio do item (nmero)
3. Nas propriedades do SmartBrowser colocar um Calculate Field (campo
calculado) que retorna a entrada no 'list-items' de acordo com o contedo
do registro. Exemplo:
entry(conta.tipo, c-lista-tipo) @ c-tipo

Como implementar labels em retngulos utilizando o dicionrio de


dados
Quando se precisar colocar um campo (view-as, radio-set ou editor) num
SmartViewer necessrio (opcionalmente para o editor) seja emoldurado com
um retngulo e colocar um 'text' sobre o mesmo para identificar o campo.
O problema que este 'text' deveria conter o label do dicionrio de dados para
o campo. Exemplo:
1. Colocar na tela um fill-in, ao invs de um text, como label do retngulo,
nas suas propriedades defini-lo como 'view-as text', 'no-label', assinalar a
propriedade 'display' e retirar a propriedade 'enable'. Exemplo:

2. No Local-Initialize da SmartViewer fazer a chamada do include ut-rtlbl.i


para definir o screen-value deste fill-in. Exemplo:
{utp/ut-rtlbl.i mgadm conta natureza text-1}
308

3. Na Local-Display-Fields da SmartViewer tambm fazer a chamada do


include ut-rtlbl.i para redefinir o screen-value deste fill-in na incluso,
aps a chamada do ADM Method 'display-fields' que aplica um clear no
frame desejado. Exemplo:
RUN dispatch IN THIS-PROCEDURE (input 'display-fields').
{utp/ut-rtlbl.i mgadm conta natureza text-1}

4. Na Local-Add-Record da SmartViewer, depois do


RUN dispatch IN THIS-PROCEDURE (input 'Add_Record:U').

incluir
{utp/ut-rtlbl.i mgadm conta natureza text-1}

Aps, quando o SmartViewer estiver rodando, o radio-set fica assim:

Como implementar mensagens para o usurio


A partir da utilizao do programa utilitrio UTP/UT-MSGS.P para
apresentao de mensagens ou retorno de propriedades, descreve-se abaixo
algumas tcnicas para sua utilizao.
Observao As mensagens padres esto descritas no captulo "Mensagens".

Mensagem de Erro/Advertncia/Informao sem Parmetros


1. Chamar o programa utp/ut-cdmsg.p e criar a mensagem, com texto de
help. Este aplicativo de uso exclusivo da Datasul. Para quem est
desenvolvendo especficos e precisa utilizar mensagens que no esto
cadastradas, pode-se utilizar o comando Progress MESSAGE. Se a
mensagem j existir, pode ser utilizado o passo 3 desta tcnica. Exemplo:

Nmero: 1234
Mensagem: Data de converso invlida !
Tipo: Erro
Help: Data de converso no pode ser menor que a data de ...
CAPTULO 15 Tcnicas 309

2. Para apresentar a mensagem. Exemplo:


run utp/ut-msgs.p (input "show",
input 1234,
input "").

3. Ou, para utilizar alguma propriedade da mesma. Exemplo:


run utp/ut-msgs.p (input "msg", (ou help)
input 1234,
input "").
display return-value @ c-erro with frame f-log.

Mensagem de Erro/Advertncia/Informao com Parmetros


1. Chamar o programa utp/ut-cdmsg.p e criar a mensagem com texto de help.
Este aplicativo de uso exclusivo da Datasul. Para quem est
desenvolvendo especficos e precisa utilizar mensagens que no esto
cadastradas, pode-se utilizar o comando Progress MESSAGE. Se a
mensagem j existir, pode ser utilizado o passo 3 desta tcnica. Exemplo:

Nmero: 1235
Mensagem: &1 no pode ser representante na regio &2 nesta situao
Tipo: Erro
Help: O representante &1 no est habilitado para operar na regio &2
para valores inferiores a &3.

2. Para apresentar a mensagem.


run utp/ut-msgs.p (input "show",
Exemplo
input 1235,
input repres.cod-repres + "~~" + regiao.cod-
regiao + "~~" + string(regiao.val-minimo).

3. Ou, para utilizar alguma propriedade da mesma.


run utp/ut-msgs.p (input "msgs", (ou help)
Exemplo
input 1235,
input repres.cod-repres + "~~" + regiao.cod-
regiao + "~~" + string(regiao.val-minimo).
display return-value @ c-erro with frame f-log.

Mensagens com Questionamento ao Usurio


1. Chamar o programa utp/ut-cdmsg.p e criar a mensagem, com texto de
help. Este aplicativo de uso exclusivo da Datasul. Para quem est
desenvolvendo especficos e precisa utilizar mensagens que no esto
cadastradas, pode-se utilizar o comando Progress MESSAGE. Se a
310

mensagem j existir, esta tcnica pode ser utilizada normalmente.


Exemplo:

Nmero: 1236
Mensagem: Verificao completa. Confirma atualizao ?
Tipo: Questo
Help: A verificao dos dados foi completada, estando os dados
preparados para atualizao

2. Para apresentar a mensagem.


run utp/ut-msgs.p (input "show",
Exemplo input 1236,
input "").
if return-value = "no" then
return.
else
if return-value = "yes" then
message "Aguarde, em Processamento ...".

Como implementar Tooltip em um determinado boto


O tooltip um help que apresentado ao usurio sempre que o ponteiro do
mouse permanece por alguns instantes sobre um boto. Como pode ser
verificado, os botes padres (aqueles que formam os painis) j passaram a
apresentar tooltips durante a execuo dos programas. Contudo, todos os
botes criados num determinado programa tambm devem contar com Tooltip
e, para tanto, esta tcnica demonstra como deve ser feita essa implementao.
Implementao para que um boto no padro apresente seu tooltip necessrio que o
mesmo possua help, pois a include padro {src/adm/method/smart.i} foi
alterada para copiar o help para o tooltip em todos os botes de todas as
telas;
para informar o help de um boto, deve-se no UIB editar as propriedades
avanadas deste boto e informar a propriedades avanadas deste boto e
informar a propriedade help em idioma portugus, no sendo necessrio
qualquer tratamento para traduo, pois os estilo fazem a traduo
automaticamente dos helps e labels de botes. Exemplo:
CAPTULO 15 Tcnicas 311

Em tempo: no informar a propriedade tooltip.

Como implementar uma barra de progresso


Objetivo Utilizar esta tcnica sempre que for executado um processo longo e que se
deseja manter o usurio informado sobre o andamento do mesmo.
Implementao definir uma varivel do tipo handle;
def var h-prog as handle no-undo.

rodar o programa ut/ut-perc.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-perc.p persistent set h-prog.

rodar o procedimento pi-inicializar que deve estar dentro do programa ut-


perc.p, passando os seguintes parmetros:
ttulo da janela da barra de processo;
nmero total de iteraes que a barra deve acompanhar;
for each item no-lock:
assign i-tot = i-tot + 1.
312

end.
run pi-inicializar in h-prog(input "Importando arquivos",
i-tot).

rodar o procedimento pi-acompanhar, que est dentro do programa ut-


perc.p para cada iterao:
for each item no-lock on stop undo, leave:
run pi-acompanhar in h-prog.
end.

rodar o procedimento pi-finalizar, que est dentro do programa ut-perc.p,


logo aps a sada da iterao:
run pi-finalizar in h-prog.

para que seja visualizado o registro que est sendo processado no


momento (na barra de ttulo), deve-se rodar o procedimento pi-registro
logo aps a pi-acompanhar, passando como parmetro, uma string que ir
identificar o registro processado:
for each item no-lock on stop undo, leave:
run pi-acompanhar in h-prog.
run pi-registro in h-prog (input string(item.it-codigo)).
end.

para verificar se o processo foi cancelado, deve-se apenas rodar o


procedimento pi-returna-status antes da pi-finalizar e este retornar uma
das seguintes informaes:
NOK Caso o procedimento tenha sido cancelado;
OK Caso o procedimento tenha sido executado at o fim.
run pi-retorna-status in h-prog (output c-status).

para desabilitar ou habilitar o boto cancela, deve-se rodar os


procedimentos pi-desabilita-cancela e pi-habilita-cancela logo aps a pi-
inicializar:
run pi-inicializar in h-prog(input "Importando arquivos",
500).
run pi-desabilita-cancela in h-prog.
CAPTULO 15 Tcnicas 313

Como implementar acompanhamento (UT-ACOMP)


Objetivo Utilizar esta tcnica sempre quando executar um processo longo e que se
deseje manter o usurio informado sobre o andamento do mesmo. Esta tcnica
deve ser utilizada sempre que no for conhecido o nmero total de registros a
serem processados.
Implementao definir uma varivel do tipo handle;
def var h-prog as handle no-undo.

rodar o programa ut/ut-acomp.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-acomp.p persistent set h-prog.

rodar o procedimento pi-inicializar que deve estar dentro do programa ut-


acomp.p, passando os seguintes parmetros:
ttulo da janela da barra de processo;
run pi-inicializar in h-prog(input "Importando arquivos").

rodar o procedimento pi-acompanhar, que est dentro do programa ut-


acomp.p para cada iterao, passando o seguinte parmetro:
o texto a ser visualizado pelo usurio;
for each item no-lock on stop undo, leave:
run pi-acompanhar in h-prog(input string(item.it-codigo)).
end.

para setar o ttulo da janela de barra de processo necessrio rodar o


procedimento pi-seta-titulo passando o seguinte parmetro:
ttulo da janela da barra de processo;
run pi-seta-titulo in h-prog(input "Exportando Arquivos").

rodar o procedimento pi-finalizar, que est dentro do programa ut-


acomp.p, logo aps a sada da iterao:
run pi-finalizar in h-prog.

para desabilitar ou habilitar o boto cancela, deve-se rodar os


procedimentos pi-desabilita-cancela e pi-habilita-cancela logo aps a pi-
inicializar:
314

run pi-inicializar in h-prog(input "Importando arquivos",


500).
run pi-desabilita-cancela in h-prog.

para verificar se o processo foi cancelado, deve-se apenas rodar o


procedimento pi-returna-status antes da pi-finalizar e este retornar uma
das seguintes informaes:
NOK Caso o procedimento tenha sido cancelado;
OK Caso o procedimento tenha sido executado at o fim.
run pi-retorna-status in h-prog (output c-status).

para desabilitar ou habilitar o boto cancela, deve-se rodar os


procedimentos pi-desabilita-cancela e pi-habilita-cancela logo aps a pi-
inicializar:
run pi-inicializar in h-prog(input "Importando arquivos", 500).
run pi-desabilita-cancela in h-prog.

para determinar um intervalo de tempo para a exibio do registro corrente


do processamento, deve-se incluir no arquivo .ini utilizado pelo EMS uma
nova chave nomeada TimeAComp com o valor do tempo desejado em
segundos no bloco de definies Datasul_EMS2. Exemplo:

[Datasul_EMS2]
Show-Report-Program=notepad.exe
TimeAComp=60

Neste exemplo, o utilitrio somente exibir qual o registro corrente a cada 60


segundos. Caso no seja informado nenhum valor para TimeAComp ou ela
nem mesmo existir no arquivo .ini, o utilitrio continuar tendo o
comportamento padro de exibir cada registro processado.
CAPTULO 15 Tcnicas 315

Como implementar Zoom e campos de referncia para campos chave


estrangeira
Para implementar o zoom em campos chave estrangeira, alm de apresentar
campos de referncia no retorno do zoom ou na sada do campo chave
estrangeira devem ser feitas as seguintes alteraes quando da criao da
viewer do programa que chama o zoom:
Observao Nos exemplos de cdigo abaixo, customer a tabela que possui uma chave
estrangeira no campo state, relacionando-a com a tabela state e o campo state-name o campo
de referncia para o usurio.

Passos:
1. Deve ser criada uma varivel do tipo caracter view-as fill-in, na qual
armazenado o campo de referncia 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 referncia state-name temos a varivel c-state-
name.
2. Criar a procedure local-display-fields e nela, antes do run dispatch, deve
ser inserida uma lgica para carregar o valor inicial da varivel para o
campo de referncia.
if available customer then do:
Exemplo 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
lgica para determinar o valor do campo de referncia com base no que o
usurio digitou no campo que possui zoom.
{include/leave.i &tabela=state
Exemplo &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 referncia da tabela da chave estrangeira;
316

<variavel-ref>: varivel criada para receber o campo de referncia;


<where>: clusula where para localizar o registro na tabela de referncia;
4. Atravs do include ZOOMVAR.I padronizada a chamada do zoom para
os campos que so chave estrangeira, que atende as seguintes situaes de
acesso ao zoom;
a partir de um campo chave estrangeira de uma tabela;
a partir de uma varivel;
a partir de um campo chave estrangeira de uma tabela cujo nome no
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 situaes com a possibilidade de passagem de parmetros para o
programa de zoom;
Sintaxe:
{include/zoomvar.i &prog-zoom=diretrio/programa
&campo=variavel/tabela.atributo
&campozoom=nome-atributo
[&frame=nome-frame]
[&browse=nome-browse]
[&parametros="run pi-procedure in wh-
pesquisa".]}

Onde:
<prog-zoom>: o nome do programa de zoom
<campo>: o campo/varivel na viewer ou frame onde est sendo colocado o
zoom, sendo um campo de tabela, deve ser especificado no formato
tabela.campo
<campozoom>: o campo no SmartBrowser do zoom de onde o valor
buscado, no deve ser informado o nome da tabela
<frame>: parmetro opcional utilizado quando o frame onde est o campo que
possui zoom diferente de {&frame-name}
<browse>: parmetro opcional utilizado quando o zoom acionado a partir de
uma coluna de um browse updateable;
<parmetros>: chama uma procedure dentro da Window do programa de
CAPTULO 15 Tcnicas 317

zoom, que recebe os parmetros. Deve conter um valor do tipo:


&parametros="run pi-procedure in wh-pesquisa(input 'inicio', input 'fim').".
Exemplos:
a) chamada de zoom para atributos em um frame:
ON F5 OF ord-prod.it-codigo in frame {&FRAME-NAME}
OR MOUSE-SELECT-DBLCLICK OF ord-prod.it-codigo in frame
{&FRAME-NAME} DO:
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=ord-prod.it-codigo
&campozoom=it-codigo}
END.

b) chamada do zoom para mais de um atributo de um frame:


ON F5 OF det-rateio.ct-codigo in frame {&FRAME-NAME}
OR MOUSE-SELECT-DBLCLICK OF det-rateio.ct-codigo in frame
{&FRAME-NAME} DO:
{include/zoomvar.i &prog-zoom=adzoom/z01ad049.w
&campo=det-rateio.ct-final
&campozoom=ct-codigo
&campo2=det-rateio.sc-final
&campozoom2=sc-codigo}
END.

c) chamada do zoom para variveis em um frame:


ON F5 OF ord-prod.it-codigo in frame {&FRAME-NAME}
OR MOUSE-SELECT-DBLCLICK OF ord-prod.it-codigo in frame
{&FRAME-NAME} DO:
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=c-item-pai
&campozoom=it-codigo}
END.

Observao 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
318

&campozoom=it-codigo
&browse=br-digita}
END.

Observao A nica diferena est na utilizao do parmetro &browse, que recebe o nome do
browse onde o campo/varivel se encontra.

e) chamada de zoom para telas com mais de uma frame (estilo de relatrios):
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.

Observao A nica diferena est na utilizao do parmetro &frame, que recebe o nome da
frame onde o atributo se encontra.

f) chamada de zoom com passagem de parmetros:


criao na Window do programa de zoom de uma procedure que
recebe e trata os parmetros e os repassa para os browses do zoom:
define input parameter p-tipo-contr as char no-undo.
run pi-seta-inicial in h_b25in172 (input p-tipo-contr).
run pi-seta-inicial in h_b26in172 (input p-tipo-contr).

criao nos browses do zoom de uma procedure que recebe os


parmetros recebidos da Window de zoom, e transfere o contedo para
variveis que influenciaro a abertura da query:
define input parameter p-tipo-contr as char no-undo.
assign c-tipo-contr = p-tipo-contr.

cdigo do open query de cada browser que compe o zoom:


open query br-table for each item
where item.it-codigo >= c-item-ini
and item.it-codigo <= c-item-fim
and item.tipo-contr = p-tipo-contr.

passagem para o include de zoom dos parmetros atravs de


&parametros.
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:
CAPTULO 15 Tcnicas 319

{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=item.it-codigo
&campozoom=c-item-pai
&parametros="run pi-seta-inicial in
wh-pesquisa (input param-cp.tipo-contr)."}
END.

Observao Quando o zoom chamado, executa o contedo de &parmetros. Este, no


exemplo, chama a procedure pi-seta-inicial, localizada dentro da Window do programa de zoom
(representada pela varivel wh-pesquisa), passando para esta procedure como parmetro um
valor de sistema (param-cp.tipo-contr). A procedure pi-seta-inicial, na Window do zoom, recebe
o parmetro e o envia para o browse, atravs do chamado da procedure pi-seta-inicial, dentro do
browse, recebe o valor e atribui varivel de filtro (c-tipo-contr) utilizada para abrir a query.

Por fim, para todos os campos em frames (no possvel para colunas de
browsers) que possuem zoom necessrio alterar o ponteiro do mouse, atravs
do mtodo 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}.

Observao Utilizar sempre a sintaxe acima, no incio do Main Block.


5. Criar o gatilho de Mouse-Select-DblClick o campo que possui o zoom
com o seguinte cdigo:
apply 'F5' to self.

6. No Main-block, deve-se alterar o ponteiro do mouse para o campo chave


estrangeira. No exemplo:
costumer.state:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.

Como implementar ThinZoom e campos de referncia para campos


chave estrangeira em SmartObjects
Para implementar o ThinZoom em campos chave estrangeira, alm de
apresentar campos de referncia no retorno do zoom ou na sada do campo
chave estrangeira devem ser feitas as seguintes alteraes quando da criao
da viewer do programa que chama o zoom:
Observao Nos exemplos de cdigo abaixo, customer a tabela que possui uma chave
estrangeira no campo state, relacionando-a com a tabela state e o campo state-name o campo
de referncia para o usurio.
320

Passos:
1. Deve ser criada uma varivel do tipo caracter view-as fill-in, na qual
armazenado o campo de referncia 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 tambm ser definida na seo
definitions uma varivel do tipo Handle chamada hProgramZoom.
Exemplo: Para o campo de referncia state-name temos a varivel 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 lgica para carregar o valor inicial da varivel para o
campo de referncia.
if available customer then do:
Exemplo
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
lgica para determinar o valor do campo de referncia com base no que o
usurio digitou no campo que possui zoom.
{include/leave.i &tabela=state
Exemplo
&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 referncia da tabela da chave
estrangeira;
<variavel-ref>: varivel criada para receber o campo de referncia;
<where>: clusula where para localizar o registro na tabela de
referncia;
4. Atravs do include ZoomFields.i padronizada a chamada do zoom para
os campos que so chave estrangeira, que atende as seguintes situaes de
acesso ao zoom;
CAPTULO 15 Tcnicas 321

a partir de um campo chave estrangeira de uma tabela;


a partir de uma varivel;
a partir de um campo chave estrangeira de uma tabela cujo nome no
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);

Sintaxe:
{method/ZoomFields.i &ProgramZoom="nome do programa"
&FieldZoomN="nome do campo que retorna"
&FieldScreenN="nome do campo ou varivel"
&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 nmero que pode variar de 1 at 10;
<FieldScreenN>: Indica o nome do campo (varivel) que deve receber o valor
retornado pelo programa de pesquisa, N indica um nmero que pode variar de
1 at 10;
<FrameN>: Indica o nome da frame na qual est o campo (varivel) que deve
receber o valor retornado pelo programa de pesquisa, N indica um nmero
que pode variar de 1 at 10;
<RunMethod>: Indica a linha de comando, que contm a chamada a um
mtodo do programa de pesquisa. A varivel hProgramZoom contm o handle
do programa de pesquisa;
<EnabledImplant>: Os valores YES e NO indicam se o boto Implantar ser
habilitado ou no;
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"
322

&FieldZoom1="Sales-Rep"
&FieldScreen1="ttCustomer.Sales-Rep"
&Frame1="fPage2"
&RunMethod="RUN setaVariable IN
hProgramZoom (INPUT 'Representante')."
&EnableImplant="NO"}

END.

b) chamada do zoom para mais de um atributo de 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"
&FieldZoom2="Rep-Name"
&FieldScreen2="fiRepName"
&Frame2="fPage2"
&RunMethod="RUN setaVariable IN
hProgramZoom (INPUT 'Representante')."
&EnableImplant="NO"}

END.

c) chamada do zoom para variveis 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="cRepresentante"
&Frame1="fPage2"
&RunMethod="RUN setaVariable IN
hProgramZoom (INPUT 'Representante')."
&EnableImplant="NO"}

END.

Observao Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo nome
na viewer difere no nome do atributo no browse da pesquisa.
CAPTULO 15 Tcnicas 323

Por fim, para todos os campos em frames que possuem zoom necessrio
alterar o ponteiro do mouse, atravs do mtodo 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}.

Observao Utilizar sempre a sintaxe acima, no incio do Main Block.


5. Criar o gatilho de Mouse-Select-DblClick no campo que possui o zoom
com o seguinte cdigo:
apply 'F5' to self.

6. No Main-block, deve-se alterar o ponteiro do mouse para o campo chave


estrangeira.
No exemplo:
costumer.state:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.

Como imprimir campos editores nos relatrios


Para imprimir campos com view-as editor, deve-se seguir os passos abaixo:
1. Na rea de definies do programa implementar a chamada para o include
tt-edit.i, que define uma temp-table chamada tt-editor.
{include/tt-edit.i}

2. No incluir o campo editor na definio do form de impresso, ele deve


ser impresso num form separado. Incluir o campo tt-editor.conteudo num
novo form vazio, determinando o formato ocupado no layout do relatrio.
Exemplo:
form
item.it-codigo
/* item.narrativa */
with stream-io width 132 frame f-imp.
form
tt-editor.conteudo format "x(50)" no-label
with stream-io width 132 frame f-imp.

3. No final do programa de impresso, na rea de procedures internas,


implementar a chamada para o include pi-edit.i, que define a procedure
interna pi-print-editor.
324

{include/pi-edit.i}

4. Na impresso do campo editor, deve-se chamar a procedure interna pi-


print-editor:
for each item no-lock:
run pi-print-editor (item.narrativa, 50).
find first tt-editor no-erro.
disp item.it-codigo
with frame f-imp.
down with frame f-imp.
for each tt-editor:
disp tt-editor.conteudo
with frame f-imp.
down with frame f-imp.
end.
end.

Como totalizar colunas de um browse


Para totalizar colunas (valores) de um browse numa consulta ou outro
programa necessrio seguir alguns passos:
1. Estes totais devem ser apresentados em variveis view-as fill-in, pois no
possvel que se apresentem como a ltima linha do browse.
a) Nos programas de consulta, a recomendao que sejam apresentados
numa caixa de dilogo (utilizar CustomDialog) que acionada por um
boto na rgua de botes. Este boto utiliza como imagem "image/im-
total.bmp" e como imagem insensitive "image/ii-total.bmp".
b) No caso de caixa de dilogo, necessrio criar um novo programa
para que se apresente, seu nome externo igual a de um subprograma
(.w) deste programa.
2. No gatilho de choose deste boto deve-se implementar uma lgica para
totalizar os campos, com o objetivo de no reler a base de dados, pois, na
maioria dos casos, os registros j esto na query.
DO:
Exemplo
/* desvincula a query do browse */
ASSIGN br-browse:REFRESHABLE IN FRAME {&frame-name}= no.
ASSIGN de-tot-debito = 0
de-tot-credito = 0.
CAPTULO 15 Tcnicas 325

GET FIRST br-browse.


DO WHILE AVAIL tabela: /* tabela da query */
ASSIGN de-tot-debito = de-tot-debito + tabela.val-debito
de-tot-credito = de-tot-credito + tabela.val-
credito.
GET NEXT br-browse.
END.
/* vincula a query no browse e torna disponvel o registro
corrente */
ASSIGN br-browse:REFRESHABLE IN FRAME {&frame-name} = yes.
If br-browse:FETCH-SELECTED-ROW(1) in frame {&frame-name} then.
/* chama o programa da caixa de dilogo */
RUN XXP/XX999X.W (input de-tot-debito,
input de-tot-credito).
END.

Como adaptar a procedure pi-retorna-valor no Custom Browser


Zoom Wizard
Quando desenvolvemos um Custom Browser Zoom Wizard, uma procedure
interna denominada pi-retorna-valor gerada automaticamente, no momento
em que salvo o programa.
Esta procedure interna responsvel por retornar ao campo chamador do zoom
o valor escolhido pelo usurio. Inicialmente, ela gerada para devolver
campos da tabela principal do browse, ou seja, a primeira a ser referenciada
em sua criao. Desta forma, o zoom de chave estrangeira fica restrito a
campos desta tabela denominada principal.
Entretanto, surgiram duas outras situaes em que h necessidade do zoom
retornar outros campos ou variveis que compe o browse de zoom. Diante
disso, implementamos a possibilidade do programador interferir na gerao
desta procedure interna.
Para interferir, basta marcar o toggle-box "Manuteno Manual da PI-
RETORNA-VALOR", na tela que apresentada, quando o SmartObject
gravado. A partir de ento ela s pode ser modificada pelo programador e no
vai ser gerada pelo estilo como at ento.
Situaes necessrias
campo de outra tabela:
326

Para campos de uma tabela alm da tabela da principal, o desenvolvedor deve


alterar a pi-retorna-valor, para que devolva o campo desejado.
/********************************/
Exemplo
/* PI-RETORNA-VALOR **/
/*******************************/
DEFINE input parameter p-campo as character no-undo.
DEFINE variable p-valor as char initial "" no-undo.
if avail mguni.proced_consult_proced then do:
case p-campo:
when "cond_proced" then
assign p-valor =
string(proced_consult_proced.cod_proced).
when "des_prog_dtsul" then
assign p-valor = prog_dtsul.des_prog_dtsul.
end case.
end.
return p-valor.

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 descrio do programa
(des_prog_dtsul) ento, foi acrescentado o cdigo:
when "des_prog_dtsul" then
assign p_valor = prog_dtsul.des_prog_dtsul.

variveis / campos calculados:


Para esta situao, o desenvolvedor deve alterar a procedure pi-retorna-valor
para que esta devolva a varivel / campo calculado desejado.
/********************************/
Exemplo
/* PI-RETORNA-VALOR **/
/*******************************/
DEFINE input parameter p-campo as character no-undo.
DEFINE variable p-valor as char initial "" no-undo.
if avail proced_consult_proced then do:
case p-campo:
when "cond_proced" then
assign p-valor =
string(proced_consult_proced.cod_proced).
when "c-descricao" then
assign p-valor = c-descricao.
end case.
end.
return p-valor.
CAPTULO 15 Tcnicas 327

No caso, o Custom Browser Zoom Wizard criou automaticamente a pi-retorna-


valor para o campo cod_proced que pertence a tabela principal do browse,
como o desejado que o mesmo retorne a descrio que est gravada em uma
varivel e esta varivel consta no browse foi acrescentado o cdigo:
when "c-descricao" then
assign p-valor = c-descricao.

Neste caso, na chamada do zoomvar.i, em vez do nome do campo da tabela


que se deseja retornar, coloca-se o nome da varivel.

Como implementar Parmetros de Impresso em Relatrios


Caso haja a necessidade de implementar Parmetros de Impresso em
Relatrios devem ser seguidos os passos abaixo:
Impresso Pgina de Parmetros:
1. Na rea de Definies do Programa incluir o campo parmetro, do tipo
logical, na definio da Temp-Table tt-param.
define temp-table tt-param
field destino as integer
field arquivo as char
field usurio as char
field data-exec as date
field hora-exec as integer
field classifica as integer
field desc-classifica as char format "x(40)"
field parametro as logical.

2. No frame f-pg-imp, inserir um objeto rectangle, com as propriedades


abaixo:
Column: 2,00
Row: 8,63
Width: 46,29
Height: 1,71
3. Na frame f-pg-imp, inserir um objeto fill-in, com as propriedades a seguir:
Object: text-parametro
No-Label: selecionado
Column: 1,29
Row: 8,25
328

Width: 24,72
Height: 0,67
Display: no selecionado
Enable: no selecionado
View-as-Text: selecionado
Initial Value: Parmetros de Impresso
Private Data: Parmetros de Impresso
4. Na frame f-pg-imp, inserir um objeto toggle-box, com as propriedades
abaixo:
Object: tb-parametro
Label: Imprimir Pgina de Parmetros
No-Label: no selecionado
Column: 3,20
Row: 9,00
Width: 32,00
Height: 0,83
Initial Value: no
5. Na procedure pi-executar, alterar a lgica de assign da Temp-table tt-
param para gravar o campo parametro
assign tt-param.usuario = c-seg-usuario
tt-param.destino = input frame f-pg-imp rs-
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.

6. No programa RP.P, realizar o tratamento do valor do campo parametro,


para imprimir ou no a Pgina de Parmetro.
CAPTULO 15 Tcnicas 329

if parametro = yes then do:


Exemplo page.
display c-parametro
c-impressao
c-destino
tt-param.arquivo
tt-param.usuario
with frame f-parametros.
down with frame f-parametros.
end.

Formato de Impresso (80 colunas ou 132 colunas):


1. Na rea de Definies do Programa, incluir o campo formato, do tipo
integer, na definio da Temp-Table tt-param.
define temp-table tt-param
field destino as integer
field arquivo as char
field usuario as char format "x(12)"
field data-exec as date
field hora-exec as integer
field classifica as char format "x(40)"
field desc-classifica as char format "x(40)"
field formato as integer.

2. Na frame f-pg-imp, inserir um objeto rectangle, com as propriedades


abaixo:
Column: 2,00
Row: 8,63
Width: 46,29
Height: 1,71 ou 2.79 (caso exista o objeto tb-parametro)
3. Na frame f-pg-imp, inserir um objeto fill-in, com as propriedades abaixo:
Object: text-parametro
No-Label: selecionado
Column: 1,29
Row: 8,25
Width: 31,00
Height: 0,92
330

Initial Value: Parmetros de Impresso


Private Data: Parmetros de Impresso
4. Na frame f-pg-imp, inserir um objeto radio-set, com as propriedades
abaixo:
Object: rs-formato
Buttons:
"80 colunas", 1,
"132 colunas", 2
Column: 3
Row: 9,00 ou 10,08 (caso exista o objeto tb-parametro)
Width: 32,00
Height: 0,83
Horizontal: selecionado
Initial Value: 2
Help: Formato de Impresso
5. Na procedure pi-executar, alterar a lgica de assign da Temp-table tt-
param para gravar o campo formato
assign tt-param.usuario = c-seg-usuario
tt-param.destino = input frame f-pg-imp rs-destino
tt-param.data-exec = today
tt-param.hora-exec = time
tt-param.classifica = input frame f-pg-cla rs-classif
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.

6. No programa RP.P, alm de incluir o include: include/i-rpcab.i deve ser


includo o include: include/i-rpcb80.i que idntico ao anterior, mas
possui a definio de forms de cabealho e rodap de 80 colunas,
exemplo:
if tt-param.formato = 1
then do: {include/i-rpcb80.i} end.
else do: {include/i-rpcab.i} end.
CAPTULO 15 Tcnicas 331

7. No programa RP.P, definir forms de 132 colunas e 80 colunas para o


relatrio. Para tanto, deve ser alterado o posicionamento dos campos no
form e a propriedade width.
8. No momento de realizar o display dos campos, verificar qual o valor do
campo tt-param.formato e utilizar uma frame ou outro frame.
if tt-param.formato = 1 then do:
Exemplo view frame f-cabec-80.
view frame f-rodape-80.
end.
else do:
view frame f-cabec.
view frame f-rodape.
end.

Como implementar Boto de Filtro em Zoom


Quando for necessrio reabrir as querys do browse, a partir de selees
efetuadas (Exemplo: Boto do FILTRO), deve-se no choose do boto, aps a
chamada da tela de filtro, enviar uma mensagem de notify (open query) para a
Window, conforme comando abaixo:
RUN notify IN this-procedure ('open-query, container-
target':U).

O Zoom Z02IN172.W, pode ser consultado como exemplo.

Como implementar reposicionamento de registro com base nas


variveis globais
Toda tabela deve possuir no produto uma varivel global do tipo rowid, que
deve conter o rowid do ltimo registro acessado na sua tabela.
Assim, se o usurio acessar um programa qualquer e atravs da navegao
estiver posicionado num registro X de uma tabela t, ao chamar outro programa
que utilize a mesma tabela para navegao, este programa inicia posicionado
no registro X.
Definio da Varivel Global
A varivel global deve ser definida na rea de DEFINITIONS da Window e da
Viewer. Para definir esta varivel, deve-se utilizar o include "i-vrtab.i"
conforme mostrado a seguir:
332

{include/i-vrtab.i <nome-tabela>}

Na VIEWER, criada a procedure LOCAL-ROW-AVAILABLE com o


cdigo:
if avail <nome-tabela> then
assign gr-<nome-tabela> = rowid(<nome-tabela>).

Este cdigo implementado depois do RUN DISPATCH ...


Programa chamado:
Varivel global deve ser definida em DEFINITIONS da Window.
criado a PROCEDURE LOCAL-INITIALIZE e inserir o cdigo a seguir
antes do RUN DISPATCH ...
RUN set-attribute-list IN h_<home-query>
(INPUT "Reposition-Pending=YES":U).

Alm disso, deve ser incluso o cdigo a seguir aps 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).

Ao utilizar uma mesma viewer em dois programas e um deles consulta do


outro, a varivel global zerada. Para que seja evitado este problema, faa o
seguinte:
criar, na Window do programa chamado, na rea de DEFINITIONS, uma
varivel LOCAL como ROWID:
def var rw-<nome-tabela> as rowid no-undo.

atualizar a procedure LOCAL-INITIALIZE, da Window do programa


chamado, com o cdigo antes do RUN DISPATCH:
ASSIGN rw-<nome-tabela> = gr-<nome-tabela>.
RUN set-attribute-list IN h_<nome-query>
(INPUT "Reposition-Pending=YES":U).

aps o RUN DISPATCH substituir a varivel global pela local, isto :


IF rw-<nome-tabela> <> ? THEN
RUN pi-reposiciona-query IN h_<nome-query>
(INPUT rw-<nome-tabela>).
CAPTULO 15 Tcnicas 333

ELSE
RUN dispatch IN h_<nome-query>
(INPUT "get-first":U).
ASSIGN gr-<nome-tabela> = rw-<nome-tabela>.

Para prevenir programas posteriores, fazer em todos os programas onde so


utilizadas.
Observao Em caso de posicionamento de Browser, se o programa chamador for do tipo
Consulta-Relacionamento, ou seja, com Browse, colocar o mesmo cdigo do LOCAL-ROW-
AVAILABLE, no Gatilho VALUE-CHANGED do Browse, sendo que o <nome-tabela>, ento
passa a ser a tabela do browse.

Reposicionamento Automtico do Browser de Zoom


Observao Somente implementar a tcnica nas variveis INICIAL de faixa, cujo tipo de
dado for CARACTER ou INTEIRO.

editar os SmartBrowsers que compe o programa de zoom e selecionar a


varivel inicial de faixa (no exemplo c-inicial);

criar um gatilho para o evento ANY-KEY destas variveis com a chamada


do include i-anykey, existe o preprocessador &variavel que deve conter o
nome da varivel inicial de faixa:
334

criar um gatilho para o evento TAB destas variveis com a chamada do


include i-tab.i, existe o preprocessador &variavel que deve conter o nome
da varivel inicial de faixa:

criar um gatilho para o evento BACK-TAB destas variveis com a


chamada do include i-tab.i, existe o preprocessador &variavel que deve
conter o nome da varivel inicial de faixa:

salvar e fechar o SmartBrowser.

Como validar campos em viewers diferentes


Abra a viewer que voc deseja fazer a validao, entre na procedure de
validao (normalmente a pi-validade, mas pode-se fazer em qualquer outra
procedure interna, conforme a necessidade) e entre no menu Inserir, depois em
procedure call. Se voc estiver numa verso 9 ou superior clique no boto V8
CAPTULO 15 Tcnicas 335

call. No combo-box Object escolha adm-broker-hdl, em Show Procedures


escolha Methods e nos methods procure por Get-Field-Screen-Value.

Retorna a seguinte lgica:


RUN Get-Field-Screen-Value IN adm-broker-hdl
(INPUT <handle atual>,
INPUT <campo a ser validado>).

Em <handle atual> deve ser colocado o nome da varivel handle, a partir da


qual deve ser procurado o valor do campo. Neste caso, utilize sempre a
varivel de programa this-procedure, pois com ela voc estar passando o
handle da viewer que voc estiver trabalhando. Vale lembrar que no se deve
passar o handle da viewer onde estiver o campo a ser procurado, pois seno o
programa no encontra o campo.
O <campo a ser validado> vai utilizar o nome do campo que deve ser buscado
o valor. Por exemplo, se quiser validar um campo a partir do customer.name,
tem que ser como parmetro <name>.
Ex:
RUN Get-Field-Screen-Value IN adm-broker-hdl
(INPUT this-procedure,
INPUT name).
336

if RETURN-VALUE = then do:


/*insira aqui o tratamento do erro*/
return ADM-ERROR:U.
end.

Como construir gatilhos de dicionrios de dados


So apresentados a seguir, modelos de cada tipo de gatilho de dicionrio de
dados. Esses modelos que servem de exemplo para construo dos gatilhos so
compostos por:
cabealho;
definio do gatilho;
definio da varivel de verso do gatilho;
cdigo do gatilho;
include para chamada da EPC, sendo que este s ocorre nos gatilhos de
WRITE e DELETE.
/*************************************************************
Gatilho de Create
** Copyright DATASUL S.A. (1997)
** Todos os Direitos Reservados.
**
** Este fonte de propriedade exclusiva da DATASUL, sua
** reproduo parcial ou total por qualquer meio, s poder ser
** feita mediante autorizao expressa.
**
** Gatilho de Dicionrio.: CREATE/<nome-da-tabela>
** Data de Criao......: XX/XX/XXXX
**
***************************************************************/
TRIGGER PROCEDURE FOR CREATE OF <nome-da-tabela>.
/** Definio da varivel que indica a verso do gatilho **/
def var c-versao-mg97 as char init "01.00.00" no-undo.
/** Cdigo do gatilho de Create **/
/** Fim de Include **/
/*************************************************************
Gatilho de Delete
**
CAPTULO 15 Tcnicas 337

** Copyright DATASUL S.A. (1997)


** Todos os Direitos Reservados.
**
** Este fonte de propriedade exclusiva da DATASUL, sua
** reproduo parcial ou total por qualquer meio, s poder ser
** feita mediante autorizao expressa.
**
** Gatilho de Dicionrio.: DELETE/<nome-da-tabela>
** Data de Criao.......: XX/XX/XXXX
**
*********************************************************/
TRIGGER PROCEDURE FOR DELETE OF <nome-da-tabela>.
/** Definio da varivel que indica a verso do gatilho **/
def var c-versao-mg97 as char init "01.00.00" no-undo.
/** Validaes de eliminao **/
/** Include para chamada de EPC **/
{include/i-epc102.i <nome-da-tabela>}
/** Eliminao em cascata **/
/*************************************************************
Gatilho de Write ** Copyright DATASUL S.A. (1997)
** Todos os Direitos Reservados.
**
** Este fonte de propriedade exclusiva da DATASUL, sua
** reproduo parcial ou total por qualquer meio, s poder ser
** feita mediante autorizao expressa.
**
** Gatilho de Dicionrio.: WRITE/<nome-da-tabela>
** Data de Criao......: XX/XX/XXXX
**
***************************************************************/
TRIGGER PROCEDURE FOR WRITE OF <nome-da-tabela> OLD BUFFER <b-
old-nome-da-tabela>.
/** Definio da varivel que indica a verso do gatilho **/
def var c-versao-mg97 as char init "01.00.00" no-undo.
/** Cdigo do gatilho de Write **/
/** Include para chamada da EPC **/
{include/i-epc101.i <nome-da-tabela> <b-old-nome-da-tabela>}

Gatilho de Find No recomendada a utilizao do gatilho de Find.


Gatilho de Assign No recomendada a utilizao do gatilho de Assign, sendo que este pode ser
substitudo, utilizando a seguinte lgica no gatilho de Write:
338

if new <nome-da-tabela>
or <nome-da-tabela>.<campo> <> <b-old-nome-da-
tabela>.<campo> then do:
Cdigo desejado no gatilho de assign.
end.

Como implementar localizaes


Objetivando viabilizar a administrao de localizaes do Datasul-EMS 2.00,
para atender as necessidades de um determinado pas, adotado um padro
para sua implementao, conforme segue:
1. Todos os objetos que compoem a localizao para um determinado pas
tem na composio do seu nome uma sigla de trs letras, que identifica o
pas da localizao. Ver subcaptulo Siglas de pases.
2. Todos os arquivos (programas, includes, bancos, etc) criados para a
localizao de um pas so armazenados num subdiretrio, que identifica o
pas dentro do diretrio local. Por exemplo, os objetos para localizao
para a Argentina ficam armazenados no diretrio local/arg, abaixo do
diretrio de instalao do Datasul-EMS. E todas as triggers criadas so
armazenadas dentro de um subdiretrio do diretrio do prprio pas numa
pasta chamada database, por exemplo, local/arg/database.
3. Para a construo de programas podem ser utilizados os mesmo estilos,
demonstrados no Captulo 5, com a mesma dinmica utilizada e que pode
permitir a integrao com outros programas implementados.
4. Na nomenclatura destes programas, adotar o padro a seguir:
Onde:
XXX - a sigla do pas;
e os trs primeiros 999 - o nmero Dump-name da tabela;
Pas Base de Dados Objetos Triggers
Padro lcxxx.db xxx9999.w xxxv999.w (viewer)
xxx9999.i xxxb999.w(browser)
xxx9999.il xxxq999.w(query)
xxx9999a.p xxxz999.w(zoom)
xxx9999a.i1 xxxg999.w(v para)
xxxi999.i(include de
dicionrios)
CAPTULO 15 Tcnicas 339

Argentina lcarg.db arg9999.w argv999.w(viewer) tcarg999.p(create da tabela)


(exemplo) arg9999.i argb999.w(browser) tdarg999.o(delete da tabela)
arg9999.i1 argq999.w(query) tfarg999.p(find da tabela
arg9999a.p argz999(zoom) twarg999.p(write da tabela)
arg9999a.i1 argi999.i(include de tgarg999.p(assign de campo)
dicionrios)
Estados lcusa.db usa9999.w usav999.w(viewer
Unidos usa9999.i usab999.w(browser)
(exemplo) usa9999.il usaq999.w(query)
usa9999a.p usaz999.w(zoom)
usa9999a.il usag999.w(v para)
usai999.i(include de
dicionrios)
5. Casa Pas deve ter uma base de dados prpria, sempre no padro 'lcxxx',
conforme a nomenclatura demonstrada na tabela acima.
6. Cada base de dados contm a extenso dos arquivos necessrios para a
localizao, como no Exemplo:
Campos da tabela: tipo-tax
cod-tax
descrio
tax-perc
tributados
ct-tax
tipo
sc-tax
conta-tax
ind-data-base
ct-percepcao
sc-percepcao
conta-percepcao
sc-retencao
ct-retencao
conta-retencao
perc-percepcao
cod-esp
serie
340

incidencia-impto
ndices da tabela tipo-tax:
Flags IndexName Cnt Field Name
pu ch-tipo-tax 1 + cod-tax

Campos da tabela ext-tipo-tax


cod-tax
cod-sicore
ndices da tabela ext-tipo-tax:
Flags IndexName Cnt Field Name
pu cg-tipo-tax 1 + cod-tax
7. No mdulo de Segurana so administradas as informaes do produto
Datasul-EMS 2.00, atravs da implementao de nveis de segurana a um
determinado pas, definindo-se a permisso para cada um, e portanto,
conceder automaticamente a mesma permisso para todos os usurios que
fazem parte deste pas;
8. Para a localizao de programas do Datasul-EMS, onde no realizada a
substituio completa do mesmo, deve-se utilizar a tcnica de construo
de APPC - Application Partner Program Call (ainda no documentada).

Padronizao dos parmetros do progress.ini


Objetivo Padronizar os parmetros de que influem no tamanho dos objetos no UIB, para
com isso, evitar problemas como programas que foram construdos com
determinados parmetros e depois so executados com outros.
Implementao Existem dois parmetros no progress.ini que afetam diretamente a interface
dos programas:
Use-3D-Size
Keep3DfillinBorder
O parmetro Keep3DfillinBorder de menor importncia, mas o valor
padro para o mesmo YES; a sua funo determinar se os fill-ins iro
manter a borda 3D quando desabilitados. A vantagem de manter a borda,
CAPTULO 15 Tcnicas 341

informar ao usurio que determina rea na interface um campo ou varivel


do sistema, e no um adereo da interface.
J o parmetro Use-3D-Sizen determina se os objetos devem usar uma
dimenso 3D ou no, na prtica determina se o efeito 3D para fora ou para
dentro das dimenses do objeto. Ento, se o valor for "yes" os objetos ficam
um pouco maiores (em pixels). O valor padro NO.
Como no houve um padro no incio do desenvolvimento do Datasul-EMS
2.0, uma parcela dos desenvolvedores est com o parmetro Use-3D-Size
como "yes" e outra parcela como "no", assim deve haver situaes onde um
programa foi desenvolvido com Use-3D-Size=no e no roda onde use-3d-
size=yes, ou o inverso.
Contudo, indispensvel que sejam padronizados esses dois parmetros nos
arquivos progress.ini, conforme exposto acima. Caso alguns programas
passem a no rodar (erro: **Cannot fit <objeto> in frame ...) possvel que a
soluo seja recompilar o objeto ou ento editar o objeto (aumentando as
dimenses do frame, normalmente a distncia do topo do frame e o primeiro
objeto).

Como setar os modos de incluso (Simple/Multiple)


Para os panels de Incluso (panel/p-cadsim.w e panel/p-cadsi4.w) existe uma
propriedade, chamada AddFunction, utilizada para setar o modo de incluso
do papel.
Ou seja, quando esta propriedade est setada como o valor Simple, aps
gravar um novo registro no habilitada a tela para uma prxima incluso.
Porm, quando o valor Multiple, aps gravar um novo registro habilitada a
tela para uma prxima incluso.
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>: varivel que contenha o valor do handle do panel
<valor>: valor para a propriedade que pode ser: Simple ou Multiple
342

Como utilizar "functions" no UIB


Desde o incio da utilizao da verso 8.2 do Progress, foi possvel notar uma
nova section no UIB. A section functions veio para facilitar a implementao
de rotinas de clculo que antes eram confusas de serem utilizadas e esta
tcnica deve demonstrar este recurso.
Implementao ao entrar em section functions do UIB, questionado o nome da nova
funo e o tipo de dado que retornado por ela. Para nome da funo foi
determinado que utilizado o seguinte padro: fn-"nome que qualifica a
funo". Quanto ao retorno da funo, deve ser colocado o tipo de dado
que a funo retorna no final de sua execuo. Exemplo:

Depois de ter criado a funo, deve ser declarado os valores a serem


transferidos para ela, conforme exemplo abaixo. Para que a funo retorne o
valor calculado por ela, devem ser retiradas as "" do comando RETURN e
acrescentado no seu lugar o nome da varivel que possui o valor a ser
retornado para quem chamou a funo.
RETURNS DECIMAL
Exemplo
(input de-valor as decimal): valor transferido
/*------------------------------------------------------------
Purpose:
Notes:
-------------------------------------------------------------*/
assign de-valor = (de valor + 1000). lgica da funo
Return de-valor. valor retornado da funo
END FUNCTION.

Esta funo muito til para os campos calculados de browsers. Antes era
necessrio utilizar ON-FIND TABELA no MAIN-BLOCK do programa para
calcular o valor de um campo que possua uma lgica mais complexa
(Exemplo: pesquisa em outras tabelas). Agora basta seguir a seguinte sintaxe:
fn-nome da funo (valor a ser transferido) na expresso de um calculated
field para utilizar uma funo e atribuir o valor retornado a uma outra varivel
do browser. Exemplo:
CAPTULO 15 Tcnicas 343

Neste exemplo, temos que a funo "fn-valor" est sendo acionada utilizando o
valor do campo banco.vl-lim-aplic. Conforme a expresso do calculated field,
o valor retornado da funo mostrado na varivel de soma-aplic do browser.
Observao Recomenda-se que no sejam utilizadas temp-tables. Na verso 8.2A do
Progress, a utilizao de tabelas temporrias dentro de funes est causando SYSTEM ERROR
(130).

Como verificar o registro de um OCX


Objetivo Esta tcnica deve ser usada sempre que for utilizado um OCX no programa.
Ela consiste basicamente em verificar se o OCX est registrado corretamente
na mquina para que no seja disparado um erro PROGRESS.
Implementao definir uma varivel do tipo handle;
def var h-prog as handle no-undo.

rodar o programa ut-utils.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

rodar o procedimento IsRegistered que deve estar dentro do programa ut-


utils.p, passando o seguinte parmetro:
nome do OCX a ser verificado;
344

procurar rodar este procedimento no incio do Main-Block, antes que o


PROGRESS dispare o erro.
run IsRegistered in h-prog(input " COMCTL.TreeCtrl.l ").
Caso o return-value seja diferente de "Ok" mostrar a mensagem padro de
inexistncia de OCX e fechar o programa:
passar como parmetro para a mensagem o nome do OCX;
if return-value <> "Ok" then do:
run utp/ut-msgs.p (input "show", input 16808, input
"TreeView").
return.
end.

eliminar o programa ut-utils.p que foi rodado persistente da memria.


delete procedure h-prog.

Observao No esquecer de executar o ltimo procedimento descrito, pois na falta deste, o


sistema pode ficar sem recursos e travar.

Nome de OCX homologados no Datasul EMS 2.0


OCX Nome
BARRAS_2.OCX Barras.Aloca_Tarefa
MSCOMM32.OCX Communications Control
CELLSVWR.OCX CellsVwr.CellsView
CIMAIL.OCX CIMAIL.CISMTPCtrl.1
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
CAPTULO 15 Tcnicas 345

Como construir um browse com ordenao por coluna


Objetivo Esta tcnica deve ser usada sempre que for preciso construir um browse que
ter ordenao por coluna.
Implementao criar um browse e definir todos os campos que sero utilizados para
ordenao com a propriedade enable marcada;

inicializar o atributo READ-ONLY de todos os campos que sero


utilizados para ordenao como YES:
ASSIGN Customer.Name:READ-ONLY IN BROWSE {&BROWSE-NAME} = TRUE
Customer.City:READ-ONLY IN BROWSE {&BROWSE-NAME} = TRUE.

marcar o atributo column-searching do browse;


346

na trigger START-SEARCH do browse inserir o seguinte:


DEFINE VARIABLE columnHandle AS HANDLE NO-UNDO.

ASSIGN columnHandle = {&BROWSE-NAME}:CURRENT-COLUMN.


APPLY 'END-SEARCH' TO {&BROWSE-NAME}.

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}
FOR EACH Customer NO-LOCK BY Customer.City.
END CASE.
CAPTULO 15 Tcnicas 347

Mini-Flexibilizao
Em muitas situaes faz-se necessria a implementao de mini-flexibilizao,
para implementar funcionalidades ou caractersticas especficas para uma
verso do produto ou um tipo especfico de banco de dados, por exemplo.
Para tanto se deve saber qual o tipo de mini-flexibilizao desejada, que so:
Tipo Descrio
Tipo de Banco de Mini-flexibilizao visando atender necessidades de
Dados implementaes especficas a um determinado tipo de
banco de dados
Verso de Banco de Mini-flexibilizao visando atender necessidades de
Dados implementaes especficas a uma determinada verso
ou release do banco de dados
Especifica Mini-flexibilizao visando atender necessidades de
implementaes especficas a um determinado mdulo
ou funes, podendo ser utilizada para atender as mais
diversas situaes

Independentemente do tipo de mini-flexibilizao, a linha geral de codificao


semelhante para todos os tipos, seguindo as regras a seguir:
inserir a chamada ao include de especificao dos pr-processadores de
mini-flexibilizao, conforme seu tipo;
fazer a utilizao dos pr-processadores necessrios atravs das diretivas
de pr-processadores: &IF, &THEN, &ELSEIF, &ELSE e &ENDIF.

Mini-Flexibilizao Esta tcnica oferece possibilidade para o desenvolvimento de implementaes


para Tipo de Banco especficas para determinados tipos de bancos de dados, a saber: Progress,
de Dados Oracle e MS SQL-Server. Para tanto devem ser seguidas algumas regras,
descritas a seguir:
Inserir a chamada ao include de especificao dos pr-processadores de
mini-flexibilizao para tipos de banco de dados, chamado
include/i_dbtype.i;

A chamada ao include torna disponvel uma srie de pr-processadores, para


cada um dos bancos de dados dos produtos Datasul. Contendo como valor a
sigla do banco de dados utilizado no produto (no ambiente especfico de
desenvolvimento e expedio do produto corrente).
348

Os valores, ou seja, as siglas suportadas pelo include esto apresentadas a


seguir:
Banco de Dados Sigla
Progress progress
Oracle oracle
MS SQL-Server mss

Outro fato relacionado a insero da chamada ao include que esta deve ser
feita uma nica vez em todo o programa, e mais especificamente no incio do
programa. Isto se deve ao fato dos pr-processadores definidos no include
terem escopo global, ficando assim disponveis em todo o escopo do
programa.
E os pr-processadores disponveis para utilizao esto 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
mgcex_dbtype
mgmp_dbtype
mgmfg_dbtype
mgsop_dbtype
lcarg_dbtype
movadm_dbtype
movdis_dbtype
movind_dbtype
CAPTULO 15 Tcnicas 349

Nome do pr-processador
movmnt_dbtype
movmfg_dbtype
Produto HR
dthrpyc_dbtype
dthrpmg_dbtype
dthrtma_dbtype

Fazer a utilizao dos pr-processadores disponveis no include atravs das


diretivas de pr-processadores: &IF, &THEN, &ELSEIF, &ELSE e &ENDIF.
A utilizao dos pr-processadores, em conjunto com as diretivas de pr-
processadores, na maioria das vezes visa implementar solues para contornar
ou diminuir as deficincias e/ou limitaes de bancos de dados no-Progress.
Isto faz com que o uso dos pr-processadores utilize uma estrutura simples que
consiste em: caso o banco de dados seja Progress executada uma lgica
seno executada outra lgica.
A seguir veja dois exemplos de utilizao de pr-processadores de mini-
flexibilizao para banco de dados:
Exemplo 1:
{include/i_dbtype.i}

&IF "{&ems_dbtype}":U = "progress":U &THEN


GET LAST {&QueryName} NO-LOCK.
&ELSE
MESSAGE "Funo no disponvel!" VIEW-AS ALERT-BOX.
&ENDIF

Exemplo 2:
{include/i_dbtype.i}

CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".

&IF "{&ems_dbtype}":U <> "progress":U &THEN


VALIDATE customer.
&ENDIF

IF customer.credit-limit > 1000 THEN


...
350

Mini-Flexibilizao Esta tcnica oferece possibilidade para o desenvolvimento de implementaes


para Tipo de Banco especficas em DBOs para determinados tipos de bancos de dados, a saber:
de Dados em DBOs Progress, Oracle e MS SQL-Server. Para tanto devem ser seguidas algumas
regras, descritas a seguir:
Fazer a utilizao do pr-processadore disponveis no include de servio,
pr-existente nos DBOs, atravs das diretivas de pr-processadores: &IF,
&THEN, &ELSEIF, &ELSE e &ENDIF.

O pr-processador existente chama-se DBType, podendo assumir os valores, ou


seja, as siglas suportadas para especificar o tipo de banco de dados. Sendo que
os valores/siglas permitidos so:
Banco de Dados Sigla
Progress progress
Oracle oracle
MS SQL-Server mss

A utilizao do pr-processador, em conjunto com as diretivas de pr-


processadores, na maioria das vezes visa implementar solues para contornar
ou diminuir as deficincias e/ou limitaes de bancos de dados no-Progress.
Isto faz com que o uso do pr-processador utilize uma estrutura simples que
consiste em: caso o banco de dados seja Progress executada uma lgica
seno executada outra lgica.
A seguir veja um exemplo de utilizao de pr-processador de mini-
flexibilizao para banco de dados:
Exemplo 1:
PROCEDURE afterNewRecord:
&IF "{&DBType}":U = "PROGRESS":U &THEN
GET LAST {&QueryName} NO-LOCK.
&ENDIF
END PROCEDURE.

Mini-Flexibilizao Esta tcnica oferece possibilidade para o desenvolvimento de implementaes


para Verso de especficas para determinadas verses de bancos de dados. Para tanto devem
Banco de Dados ser seguidas algumas regras, descritas a seguir:
Inserir a chamada ao include de especificao dos pr-processadores de
mini-flexibilizao para verso de banco de dados, chamado
include/i_dbvers.i;
CAPTULO 15 Tcnicas 351

A chamada ao include torna disponvel uma srie de pr-processadores, para


cada um dos bancos de dados dos produtos Datasul. Contendo como valor a
verso do banco de dados utilizado (no ambiente especfico de
desenvolvimento e expedio do produto corrente).
Outro fato relacionado a insero da chamada ao include que esta deve ser
feita uma nica vez em todo o programa, e mais especificamente no incio do
programa. Isto se deve ao fato dos pr-processadores definidos no include
terem escopo global, ficando assim disponveis em todo o escopo do
programa.
E os pr-processadores disponveis para utilizao esto listados a seguir:
Nome do pr-processador
Produto EMS 5
emsbas_version
emsedi_version
emsfin_version
emsuni_version
Produto EMS 2
mgadm_version
mgdis_version
mgind_version
mguni_version
mgcld_version
mginv_version
mgsws_version
mgmrp_version
mgven_version
mgcex_version
mgmp_version
mgmfg_version
mgsop_version
lcarg_version
movadm_version
movdis_version
movind_version
movmnt_version
movmfg_version
mgrac_version
movrac_version
Produto HR
352

Nome do pr-processador
dthrpyc_version
dthrpmg_version
dthrtma_version

Fazer a utilizao dos pr-processadores disponveis no include atravs das


diretivas de pr-processadores: &IF, &THEN, &ELSEIF, &ELSE e &ENDIF.
A utilizao dos pr-processadores, em conjunto com as diretivas de pr-
processadores, visa implementar caractersticas e funcionalidades disponveis
para uma verso (ou a partir de uma verso) especfica do banco de dados.
Isto faz com que o uso dos pr-processadores utilize uma estrutura simples que
consiste em: caso a verso do banco de dados seja maior ou igual a um valor
especfico ento executada uma lgica seno executada outra lgica.
A seguir veja um exemplo de utilizao de pr-processadores de mini-
flexibilizao para verso de produto:
Exemplo 1:
{include/i_dbvers.i}

CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".

&IF "{&mgadm_version}":U >= "2.04":U &THEN


ASSIGN customer.credit-limit = 1500.
&ELSE
ASSIGN customer.dec-1 = 1500.
&ENDIF

Mini-Flexibilizao Esta tcnica oferece possibilidade para o desenvolvimento de implementaes


Especfica especficas para as mais diversas necessidades e situaes. Para tanto devem
ser seguidas algumas regras, descritas a seguir:
Criar o include de especificao dos pr-processadores especficos;
O include de mini-flexibilizao especfica visa atender as necessidades de
implementaes de cada um dos mdulos dos produtos Datasul. E assim deve-
se ter apenas um include para cada um dos mdulos dos produtos. Ento caso
o include de mini-flexibilizao especfica j esteja criado para um
determinado mdulo, deve-se ento apenas alter-lo (ou seja, acrescentar
novos pr-processadores).
CAPTULO 15 Tcnicas 353

A nomenclatura e localizao dos arquivos de mini-flexibilizao especfica


devem seguir o padro:
<diretrio_do_mdulo>/cfg<sigla_do_mdulo>.i

O modelo de estrutura do include simples, consistindo em: verificao de re-


definio do include no escopo e definio de pr-processadores de escopo
global.
Um exemplo de include de mini-flexibilizao especfica pode ser visto a
seguir:
Exemplo 1:
&IF DEFINED(include_sports) = 0 &THEN /* Verificao de
* definio do
* include */
&GLOBAL-DEFINE fn-calculo-lambda
&ENDIF

Quanto aos nomes dos pr-processadores, deve-se seguir a padronizao de


nomenclatura definida para os produtos Datasul. E em relao ao valor dos
pr-processadores no h um padro, podendo ser ou no definidos.
Geralmente pode-se optar pela no definio de valor para os pr-
processadores, facilitando a utilizao dos mesmos. Pois isto permite que os
programas que fazem uso destes pr-processadores, preocupem-se apenas em
verificar a existncia ou inexistncia destes.
Inserir a chamada ao include de especificao dos pr-processadores de
mini-flexibilizao especfica, conforme mdulo do produto associado ao
programa no qual deseja-se implementar a mini-flexibilizao;
Outro fato relacionado a insero da chamada ao include que esta deve ser
feita uma nica vez em todo o programa, e mais especificamente no incio do
programa. Isto se deve ao fato dos pr-processadores definidos no include
terem escopo global, ficando assim disponveis em todo o escopo do
programa.
Fazer a utilizao dos pr-processadores disponveis no include atravs das
diretivas de pr-processadores: &IF, &THEN, &ELSEIF, &ELSE e &ENDIF e
funo de pr-processador DEFINED.
A utilizao dos pr-processadores, em conjunto com as diretivas e funes de
pr-processadores, visam as mais diversas necessidades e situaes.
354

Embora o uso dos pr-processadores seja para as mais diversas necessidades,


sua estrutura de utilizao em geral simples, consistindo em: caso o pr-
processador esteja definido ento executada uma lgica seno executada
outra lgica.
A seguir veja um exemplo de utilizao de pr-processadore de mini-
flexibilizao especfica:
Exemplo 1:
{<diretrio_do_modulo>/cfg<sigla_do_modulo>.i}

CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".

&IF DEFINED(fn-calculo-lambda) > 0 &THEN


ASSIGN customer.credit-limit = fn-credit-limit-default().
&ELSE
ASSIGN customer.credit-limit = 1500.
&ENDIF

Neste tipo de mini-flexibilizao pode-se optar por apenas inserir lgica


somente quando o pr-processador estiver definido. Desta forma o exemplo
anterior ficar da seguinte forma:
Exemplo 2:
{<diretrio_do_modulo>/cfg<sigla_do_modulo>.i}

CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".

&IF DEFINED(fn-calculo-lambda) > 0 &THEN


ASSIGN customer.credit-limit = fn-credit-limit-default().
&ENDIF

Como registrar campo do tipo Fill-in para o WebEnabler


Objetivo Esta tcnica deve ser utilizada somente para os campos do tipo fill-in que
possua uma trigger de "LEAVE"/"VALUE-CHANGED" e no tenha lupa
como cursor do mouse ou um boto de zoom na sua direita; ou possua uma
trigger de "ENTRY".
Implementao
CAPTULO 15 Tcnicas 355

Colocar a chamada da include i-wenrgm.i no Main Block, passando como


parmetro o nome do campo e o evento que deseja habilitar, conforme
exemplo abaixo;

Exemplo {include/i-wenrgm.i &field1=FILL-IN-1 &event1="leave"


&field2=FILL-IN-2 &event2="entry"
&field3=FILL-IN-4 &event3="focus-gained"
&field4=FILL-IN-4 &event4="focus-lost"}.

{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"}.
Observao: 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.

Como contar a quantidade de registros numa tabela


Objetivo Esta tcnica deve ser utilizada quando for necessrio contar a quantidade de
registros numa tabela, usando uma condio (clusula WHERE) ou no.
Implementao Primeiramente define-se a varivel que receber a quantidades de registros.
Depois a tcnica de mini-flexibilizao para o tipo de banco de dados usada
356

para separar o cdigo para banco PROGRESS do cdigo para banco ORACLE
ou SQL Server, acessado atravs do DataServer.
Para banco PROGRESS o comando :
SELECT COUNT(*) INTO <var> FROM <tabela>
WHERE <condio>.
Para os outros bancos use o include include/i-count.p, descrito no item I-
COUNTDS.I do cap. 6 deste manual.
Exemplo {include/i_dbtype.i}
DEFINE VARIABLE iCount AS INTEGER NO-UNDO.
&IF "{&mgadm_dbtype}" = "progress" &THEN
SELECT COUNT(*) INTO iCount FROM cheque-pend
WHERE cod-banco > 20.
&ELSE
{include/i-countds.i &BANCO=mgadm
&TABELA="cheque-pend"
&COND="where cod-banco > 20"
&DEST=iCount}
&ENDIF

Como chamar um programa que janela a partir de uma transao


Objetivo Esta tcnica deve ser utilizada quando for necessrio chamar um programa que
janela a partir de uma transao de incluso / modificao de registros.

Implementao Quando um programa janela chamado a partir de uma transao de incluso


de registro dentro de local-assign-record, por exemplo necessrio que a
janela pai seja desabilitada enquanto a nova no for fechada.
Primeiro voc deve verificar com que template o programa chamado est
cadastrado no EMS. Se o cadastro indicar um dos seguintes tipos:
Inclui/Modifica Pai, Inclui/Modifica Filho, Pesquisa, Janela Detalhe,
Formao sem Navegao ou Estrutura; no necessrio nenhum cdigo
adicional, uma vez que o prprio template do programa trata de desabilitar a
janela pai.
Se o programa chamado estiver cadastrado com outro template, voc
desabilitar a janela pai manualmente.
Exemplo ASSIGN {&WINDOW-NAME}:SENSITIVE = NO.
RUN xxx/xxNNNN.w.
ASSIGN {&WINDOW-NAME}:SENSITIVE = TRUE.
CAPTULO 15 Tcnicas 357

Como descobrir se o EAI est habilitado


Esta tcnica deve ser utilizada quando for necessrio descobrir se o EAI est
Objetivo habilitado e configurado.

Implementao Nos programas que possuem integrao atravs do EAI, antes da chamada dos
adapters necessrio verificar se o EAI est configurado. Para isso deve-se
incluir a include i_dbeai.i e verificar o valor da varivel v_log_eai_habilit.
Durante o login o valor dessa varivel alterado para YES se o EAI estiver
configurado, habilitando assim a integrao.
Exemplo {include/i_dbeai.i}
IF v_log_eai_habilit THEN DO:
/* Chamada do adapter. */
END.

Como enviar grficos ou documentos office para o WebEnabler


Objetivo Esta tcnica permite enviar informaes para o WebEnabler visando
construo de grficos ou a abertura de documentos office nos programas que
no utilizam as apis UTAPI011, UTAPI012, UTAPI013.
Para o caso da abertura de documentos office, o objetivo enviar ao lado
client do WebEnabler, atravs dos programas WEN0001 e WEN0006, a
informao de que existe um novo arquivo no servidor, pronto para download.
Aps o download o client do WebEnabler se encarregar de abrir o arquivo.
Para o caso da construo de grficos o objetivo enviar ao client WebEnabler
as informaes para a construo do dataset que gerar o grfico atravs dos
mesmos programas citados acima. Ao receber essas informaes o client
WebEnabler ir gerar o grfico utilizando o Datasul ChartViewer.
Implementao definir a varivel global do tipo handle que contm o endereo da API
WebEnabler na memria;
DEFINE SHARED VARIABLE hWenController AS HANDLE NO-UNDO.

rodar a procedure setRemoteActionSequence da API WebEnabler visando


incrementar a sequncia de aes remotas. Este procedimento deve ser
executado somente uma vez para cada tipo de ao remota, ou seja, antes
de enviar a solicitao de abertura de arquivo ou de enviar os dados para
gerao do grfico;
358

RUN setRemoteActionSequence IN hWenController.

rodar a procedure requestRemoteAction da API WebEnabler visando


passar as informaes para o client deste;
RUN requestRemoteAction IN hWenController(<Tipo de Ao
Remota>,<Nome do Parametro>,<Valor do Parmetro>).
Parmetros:
Tipo de Ao Remota Os tipos de ao que devem ser
utilizados so: chartviewer (para criao de grficos) e
opendocument (para a abertura de documentos office);
Nome do Parmetro Nome dado ao parmetro (para o caso de
abertura de documentos office utilizar "file", para o caso da
criao de grficos ver documentao DatGraph);
Valor do Parmetro Valor dado ao parmetro (para o caso de
abertura de documentos office utlizar o nome do arquivo sem
o path, para o caso da criao de grficos utilizar os
valores referentes as parmetros criados maiores
informaes ver documentao DatGraph)

Observao No esquecer que a execuo do segundo procedimento nica, mesmo que sejam
enviadas diversas informaes, como no caso da criao de um grfico, este comando deve ser
executado uma nica vez por ao.

Como migrar relatrios antigos para RTF


Objetivo Esta tcnica permite gerar a sada do relatrio em um arquivo RTF nos
programas que foram criados antes da alterao que incluiu esta funcionalidae
no template.
Implementao Em Definitions, acrescentar aps &GLOBAL-DEFINE PGIMP:
&GLOBAL-DEFINE RTF YES

Na definio da temp-table tt-param, acrescente os campos:


field modelo-rtf as char format "x(35)"
field l-habilitaRtf as LOG.

Inclua aps a definio da varivel local c-terminal:


def var c-rtf as char no-undo.
CAPTULO 15 Tcnicas 359

def var c-modelo-default as char no-undo.


DEFINE SHARED VARIABLE hWenController AS HANDLE NO-UNDO.

Para criar os componentes utilizados pela funcionalidade de RTF


necessrio abrir o programa que est sendo alterado no procedure editor e
executar os passos abaixo:
Aps a definio do boto bt-config-impr(DEFINE BUTTON bt-
config-impr) inserir o seguinte cdigo:
DEFINE BUTTON bt-modelo-rtf
IMAGE-UP FILE "image\im-sea":U
IMAGE-INSENSITIVE FILE "image\ii-sea":U
LABEL ""
SIZE 4 BY 1.

Aps a definio da varivel c-arquivo(DEFINE VARIABLE c-


arquivo AS CHARACTER) inserir o seguinte cdigo:
DEFINE VARIABLE c-modelo-rtf AS CHARACTER
VIEW-AS EDITOR MAX-CHARS 256
SIZE 40 BY .88
BGCOLOR 15 NO-UNDO.

Aps a definio da varivel text-destino(DEFINE VARIABLE text-


destino AS CHARACTER) inserir o seguinte cdigo:
DEFINE VARIABLE text-modelo-rtf AS CHARACTER FORMAT
"X(256)":U INITIAL "Modelo:"
VIEW-AS TEXT
SIZE 10.86 BY .63 NO-UNDO.

Aps a definio da varivel text-modo(DEFINE VARIABLE text-


modo AS CHARACTER) inserir o seguinte cdigo:
DEFINE VARIABLE text-rtf AS CHARACTER FORMAT
"X(256)":U INITIAL "Rich Text Format(RTF)"
VIEW-AS TEXT
SIZE 20.86 BY .63 NO-UNDO.

Aps a definio do retngulo rect-9 (DEFINE RECTANGLE


RECT-9) inserir o seguinte cdigo:
DEFINE RECTANGLE rect-rtf
360

EDGE-PIXELS 2 GRAPHIC-EDGE NO-FILL


SIZE 46.29 BY 3.54.

DEFINE VARIABLE l-habilitaRtf AS LOGICAL INITIAL no


LABEL "RTF"
VIEW-AS TOGGLE-BOX
SIZE 44 BY 1.08 NO-UNDO.

Alterar a definio da frame f-pg-imp (DEFINE FRAME f-pg-imp)


para:
DEFINE FRAME f-pg-imp
rs-destino AT ROW 1.63 COL 3.29 HELP
"Destino de Impresso do Relatrio" NO-LABEL
bt-config-impr AT ROW 2.71 COL 43.29 HELP
"Configurao da impressora"
bt-arquivo AT ROW 2.71 COL 43.29 HELP
"Escolha do nome do arquivo"
c-arquivo AT ROW 2.75 COL 3.29 HELP
"Nome do arquivo de destino do relatrio" NO-LABEL
l-habilitaRtf AT ROW 4.83 COL 3.29
c-modelo-rtf AT ROW 6.63 COL 3 HELP
"Nome do arquivo de modelo do relatrio" NO-LABEL
bt-modelo-rtf AT ROW 6.63 COL 43 HELP
"Escolha do nome do arquivo"
rs-execucao AT ROW 8.88 COL 2.86 HELP
"Modo de Execuo" NO-LABEL
text-destino AT ROW 1.04 COL 3.86 NO-LABEL
text-rtf AT ROW 4.17 COL 1.14 COLON-ALIGNED NO-LABEL
text-modelo-rtf AT ROW 5.96 COL 1.14 COLON-ALIGNED NO-
LABEL
text-modo AT ROW 8.13 COL 1.14 COLON-ALIGNED NO-
LABEL
rect-rtf AT ROW 4.46 COL 2
RECT-7 AT ROW 1.33 COL 2.14
RECT-9 AT ROW 8.33 COL 2
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 3 ROW 3
CAPTULO 15 Tcnicas 361

SIZE 73.72 BY 10.5.

Abrir o programa no AppBuilder e alterar a trigger de


VALUE_CHANGED do componente l-habilitaRTF, colocando o
seguinte cdigo:
DO:
&IF "{&RTF}":U = "YES":U &THEN
RUN pi-habilitaRtf.
&endif
END.

Substituir o cdigo da trigger de VALUE-CHANGED do componente


rs-destino pelo cdigo abaixo:
DO:
do with frame f-pg-imp:
case self:screen-value:
when "1" then do:
assign c-arquivo:sensitive = no
bt-arquivo:visible = no
bt-config-impr:visible = YES
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive = NO
l-habilitaRtf:SCREEN-VALUE IN FRAME f-pg-
imp = "No"
l-habilitaRtf = NO
&endif
.
end.
when "2" then do:
assign c-arquivo:sensitive = yes
362

bt-arquivo:visible = yes
bt-config-impr:visible = NO
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive = YES
&endif
.
end.
when "3" then do:
assign c-arquivo:sensitive = no
bt-arquivo:visible = no
bt-config-impr:visible = no
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive = YES
&endif
.
&IF "{&RTF}":U = "YES":U &THEN
IF VALID-HANDLE(hWenController) THEN DO:
ASSIGN l-habilitaRtf:sensitive = NO
l-habilitaRtf:SCREEN-VALUE IN FRAME f-
pg-imp = "No"
l-habilitaRtf = NO.
END.
&endif
end.
end case.
end.
&IF "{&RTF}":U = "YES":U &THEN
RUN pi-habilitaRtf.
&endif
END.
CAPTULO 15 Tcnicas 363

Alterar a trigger de CHOOSE do boto bt-modelo-rtf para o seguinte


cdigo:
DO:
def var c-arq-conv as char no-undo.
def var l-ok as logical no-undo.

assign c-modelo-rtf = replace(input frame {&frame-name}


c-modelo-rtf, "/", "\").
SYSTEM-DIALOG GET-FILE c-arq-conv
FILTERS "*.rtf" "*.rtf",
"*.*" "*.*"
DEFAULT-EXTENSION "rtf"
INITIAL-DIR "modelos"
MUST-EXIST
USE-FILENAME
UPDATE l-ok.
if l-ok = yes then
assign c-modelo-rtf:screen-value in frame {&frame-
name} = replace(c-arq-conv, "\", "/").

END.

Na procedure pi-executar aps o bloco de teste de validao do arquivo


informado(if input frame f-pg-imp rs-destino = 2 and input frame f-pg-
imp rs-execucao = 1 then do:) inserir o cdigo abaixo que responsvel
por validar o modelo informado:
&IF "{&RTF}":U = "YES":U &THEN
IF ( INPUT FRAME f-pg-imp c-modelo-rtf = "" AND
INPUT FRAME f-pg-imp l-habilitaRtf = "Yes" ) OR
( SEARCH(INPUT FRAME f-pg-imp c-modelo-rtf) = ? AND
input frame f-pg-imp rs-execucao = 1 AND
INPUT FRAME f-pg-imp l-habilitaRtf = "Yes" )
THEN DO:
364

run utp/ut-msgs.p (input "show":U, input 73, input "").


apply "MOUSE-SELECT-CLICK":U to im-pg-imp in frame f-
relat.
return error.
END.
&endif

Na procedure pi-executar, ao criar o registro na tt-param, acrescente o


seguinte trecho de cdigo no comando assign:
&IF "{&RTF}":U = "YES":U &THEN
tt-param.modelo-rtf = INPUT FRAME f-pg-imp c-modelo-
rtf
tt-param.l-habilitaRtf = INPUT FRAME f-pg-imp l-
habilitaRtf
&endif

Alteraes no Programa RP:

1. Acrescentar aps include/i-prgvrs.i o pr-processador:


&GLOBAL-DEFINE RTF YES

2. Na definio da temp-table tt-param, acrescente os campos


field modelo-rtf as char format "x(35)"
field l-habilitaRtf as LOG.

3. Condicionar o VIEW das FRAMES no incio do programa:


IF tt-param.l-habilitaRTF <> YES THEN DO:
VIEW STREAM str-rp FRAME f-cabec.
VIEW STREAM str-rp FRAME f-rodape.
END.
CAPTULO 15 Tcnicas 365

Como converter consultas For Each para Send-SQL-Statement


Objetivo Esta tcnica deve ser utilizada apenas para revisar programas de relatrio que
apresentam problemas em Oracle.
Implementao Transformar a consulta de for each (ou eachs encadeados) em um ou mais
de um comando select. Deve-se observar o banco das tabelas. O comando
select pode conter apenas tabelas de um mesmo banco. Deve-se prestar
ateno nos nomes dos campos, pois em Oracle no permite que seja
utilizado (trao) no nome de campos e tabelas. Ento as tabelas que tem
(trao) no nome, no Oracle tem um _ (underline):
FOR EACH ped-venda FIELDS(cod-estabel nome-abrev)
WHERE cod-estabel = c-cod-estabel
AND nome-abrev = c-nome-abrev:
END.
Para:
SELECT cod_estabel, nome_abrev FROM ped_venda P
WHERE P.cod_estabel = c-cod-estabel
AND P.nome_abrev = c-nome-abrev.

Este comando select ser passado como parmetro para o send-sql-


statement, ento ele deve ser montado numa varivel CHAR, montando
cuidadosamente o comando de consulta, realizando as converses de tipos
de dados entre Progress e Oracle necessrias. Esta a fase mais crtica da
converso. Aqui podem ser gerados erros que acarretaro diferenas no
resultado. Esta converso de for each para send-sql-statement tem que
estar perfeitamente correta antes de se passar para a prxima atividade.
Certifique-se que as duas consultas retornam o mesmo resultado antes de
passar para a prxima fase. Para converso dos tipos de dados entre
Progress e Oracle, foram criadas algumas funes que esto disponveis na
include utp/ut-oraFunConv.i. Existem nesta include funes para campos
do tipo CHAR, INTEGER ou DATE, e a converso pode ser feita do
Progress para Oracle (usando as funes que comeam com p2o) ou do
Oracle para o Progress (usando as funes que comeam com o2p). No
exemplo abaixo, podemos notar a utilizao de algumas dessas funes:
ASSIGN cComandoSQL = "SELECT cod_estabel, nome_abrev FROM ped_venda
P" + CHR(10) + "WHERE" + CHR(10) +
"P.cod_estabel = " + p2oCharacter(c-cod-estabel) + CHR(10) +
"P.nome_abrev = " + p20Character(c-nome-abrev) .
366

Uma vez que o comando SQL foi definido, o prximo passo executar o
comando RUN STORED-PROCEDURE no Progress. Primeiramente,
executamos o comando SELECT montado (contido na varivel
cComandoSQL neste exemplo) atravs do comando RUN STORED-
PROCEDURE. Como a consulta montada dentro do prprio programa
Progress, passamos "send-sql-statement" como parmetro do RUN
STORED-PROCEDURE (este um nome padro para a stored-procedure
a ser executada). Caso seja necessrio 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 funo de passar
parmetros para a stored-procedure. Em ambas as situaes, a funo
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. necessrio definir uma varivel INT
para receber esse valor. No exemplo, utilizamos a varivel chamada
iHandle1:
RUN STORED-PROCEDURE send-sql-statement iHandle1 = PROC-
HANDLE(oracleCommand).

O resultado da execuo do comando SELECT retornado pelo progress


numa temp-table que tem apenas um campo CHAR, onde todos os valores
de cada linha so concatenados, formando uma string nica. necessrio
separ-los em vrios campos, conforme a consulta. A temp-table de
retorno tem um nome padro, que proc-text-buffer. Essa temp-table tem
apenas um campo, chamado proc-text. Abaixo um exemplo de como ler
essa temp-table e desmembrar os valores retornados. importante
salientar que cada campo ocupa, na string concatenada, o exato espao de
seu tamanho no banco, ento numa consulta com 2 campos, onde o
primeiro tem 10 de tamanho e o segundo tem 30, a string concatenada teria
40 posio. Para pegar os valores, existem funes (definidas na include
utp/ut-oraFunConv.i) que retornam conforme o tipo de dado. Algumas
funes recebem 2 parmetros: o buffer e a posio a partir de onde se
deseja ler, outras recebem 3 parmetros: o buffer, a posio e o tamanho a
ser importado. Para receber os valores, necessrio criar uma temp-table
com os campos que foram consultados. Para aproveitar a lgica j
existente do relatrio, a definio dessa temp-table deve seguir alguns
padres, por exemplo, a temp-table pode ter um nome qualquer, entretanto
o nome dos campos deve ser formado por: nomeTabela_nomeCampo. Isso
ficar mais fcil de entender no exemplo abaixo, primeiramente vemos
CAPTULO 15 Tcnicas 367

alguns campos, convertidos para o nome padro na temp-table, e depois


uma definio da temp-table e tambm a leitura da proc-text-buffer:

ped-venda.cod-estabel => pedVenda_codEstabel.


ped-venda.nome-abrev => pedVenda_nomeAbrev.
******

DEFINE TEMP-TABLE oracleLine


FIELD pedVenda_codEstabel like ped-venda.cod-estabel
FIELD pedVenda_nomeAbrev like ped-venda.nome-abrev.

FOR EACH proc-text-buffer WHERE PROC-HANDLE = iHandle1:


CREATE oracleLine.
ASSIGN oracleLine.pedVenda_codEstabel =
o2pGetString(proc-text, 1, 3)
oracleLine.pedVenda_nomeAbrev = o2pGetString(proc-
text, 4, 12).
END.

Por fim, executa-se o comando CLOSE STORED-PROCEDURE para


terminar o uso daquela consulta. Aps este comando , os registros no
estaro mais disponveis no proc-text-buffer:
CLOSE STORED-PROCEDURE send-sql-statement WHERE PROC-HANDLE =
handle1.

Agora os dados j foram consultados. Afim de aproveitar as lgicas pr-


existentes de negcio no relatrio, deve-se agora substituir o(s) for each
(ou eachs) na tabela do banco por um for each simples na(s) temp-table(s)
de resultados que acabamos de popular. Deve-se ento fazer um search e
replace para cada campo, fazendo a modificao que definimos
anteriormente, como no exemplo:
Search: ped-venda.cod-estabel
Replace: oracleLine.pedVenda_codEstabel.
Search: ped-venda.nome-abrev
Replace: oracleLine.pedVenda_nomeAbrev.
368

Exemplo de programa convertido:


Programa atual:
FOR EACH order WHERE order-num >= 100 AND
order-num <= 900 AND
sales-rep >= c-sales-rep-ini AND
sales-rep <= c-sales-rep-fim AND
promise-date >= da-entrega-ini AND
promise-date <= da-entrega-fim
BY order-num NO-LOCK:
DISPLAY STREAM str-rp
order.order-num
order.cust-num
order.Promise-Date
order.Sales-Rep WITH FRAME f-pedido.
END.

Programa com a tcnica:

DEFINE VAR oracleCommand AS CHAR NO-UNDO.


DEFINE VAR handle1 AS HANDLE NO-UNDO.
DEFINE TEMP-TABLE oracleLine
FIELDS order_orderNum like order.order-num
FIELDS order_custNum like order.cust-num
FIELDS order_promiseDate like order.promise-date
FIELDS order_salesRep like order.sales-rep.

{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) +
CAPTULO 15 Tcnicas 369

" 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) + ")) ".

RUN STORED-PROCEDURE send-sql-statement handle1 = PROC-


HANDLE(oracleCommand).
FOR EACH proc-text-buffer WHERE PROC-HANDLE = handle1:
CREATE oracleLine.
ASSIGN oracleLine.order_orderNum = o2pGetNumber(proc-
text, 1).
oracleLine.order_custNum = o2pGetNumber(proc-text,
30)
oracleLine.order_promiseDate = o2pGetDate(proc-
text, 60).
oracleLine.order_salesRep = o2pGetString(proc-
text, 80, 8).
END.

CLOSE STORED-PROCEDURE send-sql-statement WHERE PROC-HANDLE =


handle1.

FOR EACH oracleLine BY order-num:


DISPLAY STREAM str-rp
oracleLine.order_orderNum
oracleLine.order_custNum
oracleLine.order_promiseDate
oracleLine.order_salesRep WITH FRAME f-pedido.
END.
370

Utilitrio para Gerao de Comandos SQL


Objetivo Esta tcnica tem por objetivo apresentar uma alternativa para efetuar consultas
em bases Oracle. Atualmente o acesso bases Oracle feito de maneira
transparente ao desenvolvedor, ficando cargo do DataServer a interface entre
os comandos Progress e SQL. Nem sempre os comandos convertidos pelo
DataServer so os mais eficazes, gerando perda de performance se
comparamos processos executados utilizando banco Progress e banco Oracle.

Para implementar tal processo o desenvolvedor far uso de dois utilitrios que
so:

O programa ut-select.p: Permite ao programador montar o comando


SQL conforme a necessidade.
Importante: compatvel com Ansi SQL.

A include ut-send-sql.i: Include responsvel pelo envio do comando


SQL criado pela ut-select.p ao banco de dados.

O desenvolvedor ir desmembrar o comando FOR EACH em partes, que sero


repassados ao programa ut-select, tal cdigo dever ser enviado include ut-
send-sql.i que ir retornar ao programa executor uma temp-table contendo o
resultado da consulta.
Implementao Definir uma varivel do tipo handle;
define variable utSelect as handle no-undo.

Definir uma temp-table que ser utilizada para armazenar o resultado da


consulta realizada no banco de dados. A temp-table dever conter todos os
campos retornados da consulta, se a consulta compreender campos de mais
de uma tabela do mesmo banco, tais campos devero ser definidos na
mesma temp-table.
Convencionamos que os campos da temp-table de retorno seguiro a
nomenclatura dos campos da tabela, seguindo o seguinte modelo:
tabela1.campo1 = tabela1_campo1
tabela1.cod_campo2 = tabela1_codCampo2
tabela1.campo3_campo = tabela1_campo3Campo

DEFINE TEMP-TABLE oracleLine NO-UNDO


CAPTULO 15 Tcnicas 371

FIELD customer_cust-num LIKE customer.cust-num


FIELD customer_name LIKE customer.name
FIELD customer_address LIKE customer.address
FIELD customer_address2 LIKE customer.Address2
FIELD customer_city LIKE customer.city
FIELD customer_country LIKE customer.country
FIELD customer_credit-limit LIKE customer.credit-limit
FIELD order_order-num LIKE order.order-num
FIELD item_item-num LIKE item.item-num
FIELD item_price LIKE item.price
FIELD order-line_qty LIKE order-line.qty
FIELD customer_comments LIKE customer.comments.

Rodar o programa ut-select.p persistente e atribuir o seu handle para a


varivel que foi criada anteriormente;
run utp/ut-select.p persistent set utSelect.

O programa ut-select.p disponibiliza procedures auxiliares para a criao


do comando SQL, so elas:
adicionarBetween: Adiciona ao comando SQL a clusula
BETWEEN. O operador Between pode ser usado para especificar um
critrio de seleo.
Parmetros:
INPUT inAbreParenteses: nmero de parnteses que sero abertos
para esta linha.
INPUT inCampoBanco: Nome do campo da tabela a ser referenciado
pela clusula BETWEEN.
INPUT inDe: Valor inicial do intervalo a ser pesquisado. Para campos
de tabela, deve-se utilizar " para a passagem do parmetro.
Ex.: INPUT "order-line.qty"
Para a passagem de variveis ou valores, deve-se utilizar STRING(x).
Ex.: INPUT STRING(i-qty-ini)
INPUT STRING(180)

INPUT inAte: Valor final do intervalo a ser pesquisado. Para campos


de tabela, deve-se utilizar " para a passagem do parmetro.
Ex.: INPUT "order-line.qty"
372

Para a passagem de variveis ou valores, deve-se utilizar STRING(x).


Ex.: INPUT STRING(i-qty-ini)
INPUT STRING(180)

INPUT inTipoDado: Tipo de dado do campo a ser referenciado. Pode


ser integer, decimal, logical, character, date ou field.
INPUT inFechaParenteses: nmero de parnteses que sero fechados
nesta linha. Ser sempre includo antes do operador lgico.
INPUT inOperadorLogico: Define a condio lgica a ser aplicada
para essa linha, pode se AND, OR ou .
Exemplo:
Para incluir a clusula BETWEEN: sports.order-line.qty BETWEEN
i-qty-ini AND i-qty-fim executar o cdigo abaixo:
RUN adicionarBetween IN utSelect(INPUT 0,
INPUT "order-line.qty",
INPUT STRING(i-qty-ini),
INPUT STRING(i-qty-fim),
INPUT "Integer",
INPUT 0,
INPUT "").

adicionarWhere: Adiciona ao comando SQL uma clusula WHERE.


Parmetros:
INPUT inAbreParenteses: nmero de parnteses que sero abertos
para esta linha.
INPUT inCampo: Nome do campo da tabela a ser referenciado pela
clusula Where.
INPUT inOperador: Nome do operador de comparao a ser utilizado,
pode ser =, > ou < ou <>.
INPUT inValor: parmetro destinado a informao do campo ou valor
a ser comparado na clusula Where. Para campos de tabela, deve-se
utilizar " para a passagem do parmetro.
CAPTULO 15 Tcnicas 373

Ex.: INPUT "order-line.qty"


Para a passagem de variveis ou valores, deve-se utilizar STRING(x).
Ex.: INPUT STRING(i-qty-ini)
INPUT STRING(180)

INPUT inTipoDado: Tipo de dado do campo a ser referenciado. Pode


ser integer, decimal, logical, character , date ou field.
INPUT inFechaParenteses: nmero de parnteses que sero fechados
nesta linha.
INPUT inOperadorLogico: Define a condio lgica a ser aplicada
para essa linha, pode se AND, OR ou .
Exemplo:
Para incluir a clusula Where: AND sports.item.price > 18 executar
o cdigo abaixo:
RUN adicionarWhere IN utSelect(INPUT 0,

INPUT "item.price",
INPUT ">",
INPUT STRING(18),
INPUT "integer",
INPUT 0,
INPUT "").

gerarSelect: Gera o comando SELECT propriamente dito. Utiliza as


informaes passadas pelas procedures adicionarBetween e
adicionarWhere para gerar o comando SELECT retornando o mesmo
para o programa executor atravs parmetro comando.
Parmetros:
INPUT Campos: Informa os campos que sero retornados pelo
comando SELECT.
INPUT Tabelas: Informa as tabelas que sero utilizadas no comando
SELECT. Formaro a clusula FROM do comando SELECT.
OUTPUT Comando: Retorna ao programa executor o comando
SELECT gerado.
374

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
AND item.price > 18
AND order-line.qty BETWEEN i-qty-ini AND i-qty-fim
Executar os procedimentos apresentados anteriormente para criao
das clusulas BETWEEN e Where juntamente com o cdigo abaixo:

RUN gerarSelect IN utSelect


(INPUT " 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 " ,
INPUT " Customer, order, order-line, item ",
OUTPUT oracleCommand).
CAPTULO 15 Tcnicas 375

Para enviar o comando gerado pelo programa ut-select.p ao banco de


dados utiliza-se a include ut-send-sql.i, passando o comando retornado
pelo programa ut-select.p, a temp-table que ser retornada pela include e o
nome do banco envolvido na consulta:
Importante: A include no permite a utilizao de tabelas em bancos
diferentes.
{utp\ut-send-sql.i oracleCommand oracleLine mgmov}

Observao 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 crtico 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 verificao no cdigo
INPUT IF <campo> = ? THEN INTEGER ELSE CHARACTER.

necessrio eliminar o buffer da tabela de consulta o qual criado pela


include ut-send-sql.i. O cdigo que dever ser acrescentado no programa
que esta utilizando a tcnica ut-select :
delete object send-sql-bh.

Ao final do processo, deve-se eliminar o objeto persistente.


delete object utSelect.

Exemplo de programa convertido:

/* include de controle de verso */


{include/i-prgvrs.i TESTE2RP 2.00.00.025}
/* prprocessador para ativar ou no a sada para RTF */
&GLOBAL-DEFINE RTF YES
/* prprocessador para setar o tamanho da pgina */
&SCOPED-DEFINE pagesize 42
376

/* definio das temp-tables para recebimento de parmetros */


DEFINE TEMP-TABLE tt-param NO-UNDO
FIELD destino AS INTEGER
FIELD arquivo AS CHARACTER FORMAT "x(35)"
FIELD usuario AS CHARACTER FORMAT "x(12)"
FIELD data-exec AS DATE
FIELD hora-exec AS INTEGER
FIELD classifica AS INTEGER
FIELD desc-classifica AS CHARACTER FORMAT "x(40)"
FIELD modelo-rtf AS CHARACTER FORMAT "x(35)" /*
arquivo modelo para RTF */
FIELD l-habilitaRtf AS LOG
FIELD sel-inicial AS INTEGER
FIELD sel-final AS INTEGER.

DEFINE TEMP-TABLE tt-raw-digita NO-UNDO


FIELD raw-digita AS RAW.

&IF "{&EMS_DBTYPE}" = "Oracle" &THEN


DEFINE VARIABLE oracleCommand AS CHARACTER NO-UNDO.
DEFINE VARIABLE utSelect AS HANDLE NO-UNDO.

DEFINE TEMP-TABLE OracleLine NO-UNDO


FIELD orderLine_OrderNum LIKE order-line.Order-num
FIELD orderLine_lineNum LIKE order-line.line-num
FIELD orderLine_itemNum LIKE order-line.item-num
FIELD orderLine_price LIKE order-line.price
FIELD orderLine_qty LIKE order-line.qty
FIELD orderLine_discount LIKE order-line.discount
FIELD orderLine_extendedPrice LIKE order-line.extended-
price.
&endif
CAPTULO 15 Tcnicas 377

/* recebimento de parmetros */
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 padro para variveis de relatrio */


{include/i-rpvar.i}
/* definio de variveis */
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.
/* definio de frames do relatrio */
&IF "{&EMS_DBTYPE}" = "Oracle" &THEN
FORM
OracleLine.orderLine_OrderNum
OracleLine.orderLine_lineNum
OracleLine.orderLine_itemNum
OracleLine.orderLine_price
OracleLine.orderLine_qty
OracleLine.orderLine_discount
OracleLine.orderLine_extendedPrice
WITH FRAME f-order-line DOWN STREAM-IO.
&ELSE IF
FORM
OracleLine.orderLine_OrderNum
OracleLine.orderLine_lineNum
OracleLine.orderLine_itemNum
OracleLine.orderLine_price
OracleLine.orderLine_qty
OracleLine.orderLine_discount
OracleLine.orderLine_extendedPrice
WITH FRAME f-order-line DOWN STREAM-IO.
378

&endif

/* include padro para output de relatrios */


{include/i-rpout.i &STREAM="stream str-rp"}

/* include com a definio da frame de cabealho e rodap */


{include/i-rpcab.i &STREAM="str-rp"}

/* bloco principal do programa */


ASSIGN c-programa = "SMARTRP"
c-versao = "1.00"
c-revisao = ".00.000"
c-empresa = "Empresa Teste"
c-sistema = "Sports"
c-titulo-relat = "Listagem Order-Line".

/* para no visualizar cabealho/rodap em sada RTF */


IF tt-param.l-habilitaRTF <> YES THEN DO:
VIEW STREAM str-rp FRAME f-cabec.
VIEW STREAM str-rp FRAME f-rodape.
END.

/* executando de forma persistente o utilitrio de


acompanhamento */
RUN utp/ut-acomp.p PERSISTENT SET h-acomp.
{utp/ut-liter.i Imprimindo *}
RUN pi-inicializar IN h-acomp (INPUT RETURN-VALUE).

/* corpo do relatrio */
&IF "{&EMS_DBTYPE}" = "Oracle" &THEN
RUN utp/ut-select.p PERSISTENT SET utSelect.
CAPTULO 15 Tcnicas 379

RUN adicionarBetween IN utSelect(INPUT 0,


INPUT "order-line.order-num",
INPUT STRING(tt-param.sel-inicial),
INPUT STRING(tt-param.sel-final),
INPUT "Integer",
INPUT 0,
INPUT "").

RUN gerarSelect IN utSelect (INPUT "order-line.Order-num," +


" order-line.line-num, " +
" order-line.item-num, order-line.price, " +
" order-line.qty, order-line.discount, " +
" order-line.extended-price ",
INPUT "order-line",
OUTPUT oracleCommand).
{utp\ut-send-sql.i oracleCommand OracleLine Sports}

DELETE OBJECT send-sql-bh.


DELETE OBJECT utSelect.

FOR EACH OracleLine WHERE


OracleLine.orderLine_orderNum >= tt-param.sel-inicial
AND
OracleLine.orderLine_orderNum <= tt-param.sel-final
NO-LOCK ON STOP UNDO, LEAVE:
RUN pi-acompanhar IN h-acomp (INPUT
STRING(OracleLine.orderLine_OrderNum)).
DISPLAY STREAM str-rp
OracleLine.orderLine_OrderNum
OracleLine.orderLine_lineNum
OracleLine.orderLine_itemNum
OracleLine.orderLine_price
380

OracleLine.orderLine_qty
OracleLine.orderLine_discount
OracleLine.orderLine_extendedPrice WITH FRAME f-
order-line.
DOWN STREAM str-rp WITH FRAME f-order-line.
END.
&Else IF
FOR EACH OracleLine WHERE
OracleLine.orderLine_orderNum >= tt-param.sel-inicial
AND
OracleLine.orderLine_orderNum <= tt-param.sel-final
NO-LOCK ON STOP UNDO, LEAVE:
RUN pi-acompanhar IN h-acomp (INPUT
STRING(OracleLine.orderLine_orderNum)).
DISPLAY STREAM str-rp
OracleLine.orderLine_OrderNum
OracleLine.orderLine_lineNum
OracleLine.orderLine_itemNum
OracleLine.orderLine_price
OracleLine.orderLine_qty
OracleLine.orderLine_discount
OracleLine.orderLine_extendedPrice WITH FRAME f-order-
line.
DOWN STREAM str-rp WITH FRAME f-order-line.
END.
&endif
/*END.*/
/*fechamento do output do relatrio*/
{include/i-rpclo.i &STREAM="stream str-rp"}
RUN pi-finalizar IN h-acomp.
RETURN "OK":U.
CAPTULO 15 Tcnicas 381

Converso de Query em Frame para SmartQuery


Objetivo O objetivo desta tcnica converter os programas que possuem queries
definidas na frame do programa para que utilizem SmartQueries. Caso
contrrio estes programas no podero ser beneficiados com as melhorias
realizadas no template de SmartQuery que melhoraram as performance dos
programas em ambiente ORACLE.
Esta tcnica prev tarefas para converso de um programa estilo
Inclui/Modifica Filho. No se pode converter programas do template de
Relatrio porque no possvel instanciar uma SmartQuery neste tipo de
programa uma vez que eles no possuem uma SmartWindow como container.
Caso seja necessrio converter algum programa de outro estilo consulte a
equipe de Suporte ao Desenvolvimento. As tarefas para converso de um
programa Inclui/Modifica Filho so:

Verificar se j existe uma SmartQuery para a consulta existente na


query da Frame do Programa. Caso no exista, criar uma nova
utilizando o estilo CustomQuery Wizard.
Desfazer a query da frame. Na efetivao desta ao aparecer a
questo abaixo que deve ser respondida com Sim:

Remover o SmartLink do tipo RECORD que tem como source THIS-


PROCEDURE e target a viewer do programa.
Instanciar a Smart Query e aceitar a sugesto de SmartLink do tipo
RECORD do Wizard, que tem coom source a Query e target a Viewer
do Programa:
382

Editar a procedure pi-reposiciona substituir a ocorrncia "<query-


name>" na linha de comando abaixo pelo nome da SmartQuery
instanciada:

RUN pi-reposiciona-query IN h_<query-name> (input v-row-


table).

Este comando deve ser o nico existente na procedure para fazer


posicionamento na query. Caso existe outros comandos que faam
procedimento semelhante, devem ser comentados e/ou retirados. Como
por exemplo o trecho de cdigo abaixo:

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).
CAPTULO 16 Dicas de Desenvolvimento 383

CAPTULO 16

Dicas de Desenvolvimento

Segurana de Banco x Objetos Dinmicos


Objetivo Indicar os motivos pelos quais no deve-se utilizar objetos dinmicos nos
programas Datasul.

Detalhamento No Progress existem dois tipos de objetos: os estticos e os dinmicos.


Objetos estticos so aqueles que j esto resolvidos em tempo de
desenvolvimento e o executvel do programa j possui a informao de sua
existncia. J objetos dinmicos so aqueles que so criados em tempo de
execuo. Os objetos dinmicos podem ser de tela (campos, botes) ou de
acesso a campos (queries, buffers e tabelas).
A segurana de um produto pode ser feita de duas maneiras: no banco ou
no sistema. Na Datasul, definimos que a segurana seria feita no sistema, ou
seja, cadastramos nossos usurios e grupos de usurios e definimos mdulos,
programas que podem ser acessados. Porm, atualmente, muitos de nossos
clientes optam por utilizar a segurana de banco, ou mesmo so obrigados a
utilizar esta segurana para no terem problemas com auditorias ou,
igualmente, a fim de evitar que seus dados fiquem expostos ou corram o risco
de serem alterados sem autorizao.
Na segunda situao, quando uma base de dados possui configurada a
segurana de banco, para que os programas tenham acesso aos dados, os
mesmos devem, ou ser compilados contra o banco que possui segurana (na
compilao o Progress j inclui as senhas de acesso no .r) ou ento deve-se
inserir a senha de acesso num .r j criado, atravs do aplicativo Rcodekey. Este
aplicativo insere nos programas compilados as informaes que seriam
inseridas no .r caso fosse feita compilao contra o banco que possui
segurana.
384

A utilizao de objetos dinmicos nos programas Datasul causa um


problema em clientes que utilizam segurana em banco de dados. Uma vez que
o objeto s criado em tempo de execuo, o Progress atualmente no tem
como incluir os dados de segurana no .r, pois neste momento ele desconhece
qual objeto a query ou buffer dinmico representam.
Sendo assim, desaconselha-se a utilizao de objetos dinmicos de
acesso a dados, como query ou buffer. Deve-se sempre esgotar a busca por
uma alternativa a utilizao destes recursos, para evitar problemas nos clientes
que utilizam segurana no banco de dados.
Alm dos objetos dinmicos, os comandos de disable triggers tambm
causam o mesmo problema com os clientes que utilizam segurana em banco
de dados, por essa razo, deve-se evitar utilizar comandos de disable triggers
em programas normais do produto. Apenas em casos especiais de programas
que sero executados uma nica vez, por exemplo.
A figura abaixo representa o erro que ocorre nestas situaes:

Anda mungkin juga menyukai