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

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

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

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

"F"ornecedor

"A"mbos

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;

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

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).

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
char-1

Tipo de Dado
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

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 DWBDDD;

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 FIELDVALIDATION.

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

\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
\DATABASE

Programas do mdulo Custos


\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
\TGAD

\TGCL

Programas de Dump do banco MGUNI


\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

\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

\TGDI

\TGIN

\TGIV

\TGPE

\TGRH

\TGUN

\TFP

Gatilhos de find do banco MGCLD

\TWP

Gatilhos de write do banco MGCLD

\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

\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

\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

\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

\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

\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
\DATABASE

Contedo
\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
\TGPM

Includes de campos indicadores do banco MGUNI


\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

\TGPY

\TGTM

\TGUN

13

\TWP

Gatilhos de write do banco MGPMG

\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

\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

\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

\SOPY

\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

\BRW

Browsers do Banco MGPYC

DIALOG

Filtros, narrativas, etc ... do Banco MGPYC

\QRY

Objetos Queries do banco MGPYC

14

\SOTM

\SOUN

\GO

Objetos "V para" do banco MGPYC

\VWR

Objetos Viewers do banco MGPYC

\ZOOM

Zoom do banco MGPYC

\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

\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
\PGHUR

*\PRGTEC

Painis dos SmartObjects


\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

\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

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

"xx999" o dump-name da tabela.


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 DatasulEMS 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.
2

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.
Os caracteres "rp" so fixos para nomenclatura deste tipo de subprograma construdo atravs dos Estilos
relatrio e importao/exportao.
6

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

"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-WIDTHCHARS (altura mxima e mnima) e MAX-HEIGHT-CHARS e MINHEIGHT-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

Cadastro Complexo - Atualiza

Caractersticas

tem as mesmas caractersticas do Cadastro Simples - Atualiza, porm


possui mais de uma viewer e est disposto em folders.

33

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

Relatrios, Clculos, Fechamentos

41

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'
outras 2 tabelas;

o boto 'Deletar'

o boto 'Modifica' chama o programa de atualizao dos atributos, que


uma janela semelhante ao Cadastro Simples ou Complexo (sem a rgua).

, adiciona no Browse de formao os dados de

, remove dados do Browse de formao;

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'
outras 2 tabelas;

, adiciona no Browse de formao os dados de

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

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

49

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

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 acessar.

V Para

Caractersticas

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

Utilizao

{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}

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

Label

Column-Label

Help

Format

Initial

Description

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;

Formato

{utp/ut-rtlbl.i <banco> <tabela> <campo> <widget fill-in>}

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 ttmvto, 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...).
Exemplo

def var h-handle as handle no-undo.


{btb/ btb008za.i1 cep/ceapi001.p yes "rpc-test"}
for each cta_ctbl no-lock:
/* Prepara tt_movto */
{btb/btb008za.i2 cep/ceapi001.p "input tt_movto, output
tt_erro" "h-handle"}
end.
{btb/btb008za.i3 cep/ceapi001.p "h-handle"}

Nota Existe a API BTAPI008 que possui funes que podem ser utilizadas no
desenvolvimento.

Consideraes
Gerais

Caso no seja informado nenhum servidor RPC, ser utilizado o servidor RPC
definido no aplicativo do programa;
Se o processo estiver sendo executado via RPW e o servidor RPC 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
Comportamento

Programa

Servidor RPC

Mensagem

Comportamento

Inexistente

Yes

Exibe mensagem 3045(*) via


PI_STATUS_ERROR.

Inexistente

No

Retorna mensagem 3045(*)

Existe e Executa
RPC =no

Yes

Exibe mensagem 16431(*) via


PI_STATUS_ERROR.

Existe e Executa
RPC =no
Existe e Executa
RPC =no
Existe e Executa
RPC =yes

Informado

No

Retorna mensagem 16431(*)

No Informado

No

Executa ON-LINE

Informado e
Inexistente

Yes

Exibe mensagem 16433(*) via


PI_STATUS_ERROR.

Existe e Executa
RPC =yes

Informado e
Inexistente

No

Retorna mensagem 16433(*)

Existe e Executa
RPC =yes

No Informado e Yes
Inexistente

Exibe mensagem 16432(*) via


PIA_STATUS_ERROR.

Existe e Executa

No Informado e No

Executa ON_LINE

62

RPC =yes

Inexistente

Existe e Executa
RPC =yes

Informado,
Existe e No
disponvel

No

Retorna mensagem 16434(*)

Existe e Executa
RPC =yes

No Informado,
Existe e No
disponvel

Yes

Exibe as mensagens 16434(*) via


PI_STATUS_ERROR

Existe e Executa
RPC =yes

No Informado,
Existe e No
disponvel

No

Executa ON-LINE

Existe e Executa
RPC =yes

Informado,
Existe e
Disponvel

Yes

Executa via RPC (**)

Existe e Executa
RPC =yes

Informado,
Existe e
Disponvel

No

Executa via RPC (***)

Existe e Executa
RPC =yes

No Informado,
Existe e
Disponvel

Yes

Executa via RPC (**)

Existe e Executa
RPC =yes

No Informado,
Existe e
Disponvel

No

Executa VIA RPC

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:

Utilizao

Formato

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.

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>


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

Exemplo

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


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.

Formato

{include/ind01-10.i {1} {2}}

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

07

65

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.

Formato

{utp/ut-table.i <banco> <tabela> <propriedade>}

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

File-Label

Dump_Name

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

Formato

{utp/ut-liter.i <literal> <modulo contexto> <alinhamento>}

em todos os lugares onde literais passveis de traduo forem apresentadas


na interface do programa.

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

A esquerda

Centralizado

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.

Formato

run utp/ut-limit.p (input <opo>,


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

i-ep-codigo-usuario: contm a empresa corrente do usurio.


Exemplo de
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

Formato

{include/i-freeac.i}

nos Templates de Relatrio, Importao, Exportao e em pontos


especficos que necessitem que a sada de dados (impressora/arquivo/tela)
seja feita sem acentuao;
assign <varivel> = fn-free-accent("<string>").
display fn-free-accent("<string>").

Onde:
<varivel>: varivel que ir armazenar o valor do retorno da funo fn-freeaccent
<string>: string acentuada a ser convertida.
Exemplo

{include/i-freeac.i}
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.

Formato

run utp/ut-dir.p (input <ttulo>,


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:

Formato

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>).

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

Formato

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>).

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:

Formato

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>)

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).

Formato

run utp/ut-vrbin.p (input <arquivo>,


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

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.

73

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.

Formato

run utp/ut-finfo.p (input <arquivo>,


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 ...).

Formato

run utp/ut-cmdln.p (output <linha-comando>).

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).

Formato

run utp/ut-osver.p (ouput <plataforma>,


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


output
output
output
output

c-plataforma,
i-versao,
i-release,
i-build,
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

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).
Formato

{include/i-countds.i &BANCO=mgadm
&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}

75

76

Exemplo 1

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}

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

Exemplo 2

Bloquear arraste de janela.

77

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

Formato

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


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

Exemplo

79

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}" =
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" =
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" =
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1}

"POR" &THEN

"ESP" &THEN

"ING" &THEN

{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}" =
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" =
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" =
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1}

"POR" &THEN

"ESP" &THEN

"ING" &THEN

{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 combobox, 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 'MainBlock', 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 ToggleBox e View-as Fillin

No caso dos toggle-boxes e fill-ins necessrio preparar a traduo dos


labels, e para isto pode-se usar o include utp/ut-field.i quando se tratar de uma
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} = returnvalue.

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

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} = returnvalue.

Espao Extra para traduo em relatrios


Column-Labels

Exemplo:

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.

{utp/ut-liter Total_Pedidos}
assign de-total-pedidos:label in frame f-relat = trim{returnvalue}.

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

Dialeto

Nome idioma/Dialeto

en-US
es-AR
pt-BR

English - United States


Spanish - Argentina
Portuguese - Brazil

87

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 noundo.

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

aplicat_dtsul

des_aplicat_dtsul

modul_dtsul

des_modul_dtsul

Descrio

Tabela que armazena os


aplicativos Datasul
Tabela que armazena os
mdulos Datasul

90

procedimento

des_proced

Tabela que armazena os


procedimentos Datasul

produt_dtsul

des_produt_dtsul

Tabela que armazena os


produtos Datasul

rot_dtsul

des_rot_dtsul

Tabela que armazena as


rotinas Datasul

sist_dtsul

des_sist_dtsul

Tabela que armazena os


sistemas Datasul

sub_rot_dtsul

des_sub_rot_dtsul

Tabela que armazena as


sub-rotinas Datasul

cad-msgs

cd-msg

Tabela que armazena as


mensagens dos produtos
Datasul

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 utfield.p, que ser abordado ainda neste documento.

Sequncia de busca
Aps verificarmos alguns conceitos sobre o modelo de traduo MultiIdiomas, 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
X

Dialeto Usurio

2
3

Contexto
Contexto
informado/mdulo
Contexto Genrico (*)
Contexto
informado/mdulo
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, SelectionList).

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
Selection-Lits */

cLista.

/*

para

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

1
2
3
4

Descrio
Label
Column-Label
Help
Format

Initial

Description

Observao

Continua
buscando do
banco
Continua
buscando do
banco

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

1
2

Descrio
File-Label
Dump_name

Desc

Observao
Continua
buscando do
banco

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

Descrio do Item de Menu


Traduzido
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 uttrcampos (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 listitems 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 'radiobuttons' 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 utlstit.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 combobox, 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

Exemplo:

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.

{utp/ut-liter Total_Pedidos}
assign de-total-pedidos:label in frame f-relat = trim{returnvalue}.
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-ITEMPAIRS 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(ttnatur-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 SCREENVALUE "Retorno Beneficiamento".


ASSIGN tt-natur-oper.tp-oper-terc = lookup(cb-tp-oper-terc,cbtp-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 SCREENVALUE "Remessa Beneficiamento".


ASSIGN tt-natur-oper.tp-oper-terc
= lookup(cb-tp-operterc,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-naturoper.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:LISTITEM-PAIRS in frame fPage1,",") mod 2 <> 0 Then
ASSIGN tp-oper-terc
= (lookup(cb-tp-oper-terc:screenvalue,cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1,",") + 1)
/ 2.
else ASSIGN tp-oper-terc
= lookup(cb-tp-oper-terc:screenvalue,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 noindexado 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" noundo.
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 prprocessadores:


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-listitems.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 NOLOCK 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-listitems.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
utilizando os Estilos e suas Tcnicas

Construo de Programas

115

CAPTULO 8

Construo de Programas utilizando os


Estilos e suas Tcnicas

Como construir um Cadastro Simples

Implementao

Estilo Usado

Nome Fsico

Cadastro Simples

Masters/w-cadsim.w

Cadastro Simples -Alterao

Masters/w-cadsi2.w

Cadastro Simples - Incluso

Masters/w-cadsi3.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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

121

Como construir um Cadastro Pai X Filho - Atualiza Filho

Implementao

Estilo Utilizado

Nome Fsico

Window Cadastro Pai x Filho - Filho

Masters/w-adf.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

h_p-exihel

STATE

125

h_query

Como construir um Cadastro Inclui/Modifica Filho

Implementao

Estilo Utilizado

Nome Fsico

Window Inclui/Modifica Filho

Masters/w-incmo3.w

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: THISPROCEDURE 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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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-rowparent).

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 "<queryname>" pelo nome da query utilizada no cadastro.

Exemplo:
RUN pi-reposiciona-query IN h_q06pd001 (input v-rowtable).

na SmartViewer que possuir a chave da tabela, deve ser criada uma localcreate-record e aps o run dispatch deve ser inserida a seguinte lgica:
find <tabela pai> where rowid (<tabela pai>) = v-rowparent 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
utilizando os Estilos e suas Tcnicas

Construo de Programas

129

ser inserida a seguinte lgica nas duas procedures:


def buffer <nome buffer> for <tabela pai>.
find <nome buffer> where rowid(<nome buffer>) = v-rowparent 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 nolock 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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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

Implementao

Estilo Utilizado

Nome Fsico

Window Cadastro Pai x Filho - Ambos

Masters/w-paiamb.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

135

Como construir um Cadastro Inclui/Modifica Filho

Implementao

Estilo Utilizado

Nome Fsico

Window Inclui/Modifica Filho

Master/w-incmo3.w

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: THISPROCEDURE 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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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-rowparent).

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 "<queryname>" pelo nome da query utilizada no cadastro;
Exemplo:
RUN pi-reposiciona-query IN h-q06pd001 (input v-rowtable).

na SmartViewer que possuir a chave da tabela, deve ser criada uma localcreate-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
utilizando os Estilos e suas Tcnicas

Construo de Programas

h_query

RECORD

139

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

Implementao

Estilo Utilizado

Nome Fsico

Window IncluiModifica Pai

Master/w-incmdp.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

141

criar um SmartLink de TABLEIO, tendo como Source: THISPROCEDURE 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 "<queryname>" pelo nome da query utilizada no cadastro;
Exemplo:
RUN pi-reposiciona-query IN h_q07pd001 (input v-rowtable).

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

Implementao

Estilo Utilizado

Nome Fsico

Window Inclui/Modifica
Pai

Master/w-incmdp.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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

Implementao

Estilo Utilizado

Nome Fsico

Custom Browser Zoom Wizard

Masters/wbrwzoo.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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 adicionla. Exemplo:
<Tabela>.<Campo1>
<Tabela>.<Campo1>
<Tabela>.<Campo2>
<Tabela>.<Campo2>

>=
>=
>=
>=

fi-ini-<campo1>
fi-ini-<campo1>
fi-ini-<campo2>
fi-ini-<campo2>

and
and
and
...

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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: fifin-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-custnum.

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

Implementao

Estilo Utilizado

Nome Fsico

Window Consulta Simples

Masters/w-consim.w

em Arquivo | Novo, selecionar o estilo relacionado acima;

CAPTULO 8
utilizando os Estilos e suas Tcnicas

Construo de Programas

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

Implementao

Estilo Utilizado

Nome Fsico

Window Consulta Complexa

Masters/w-concom.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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

Implementao

Estilo
Utilizado
'

Nome Fsico

Window Consulta Relacionamento

Masters/w-conrel.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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: listitems 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
&GLOBAL-DEFINE
&GLOBAL-DEFINE
&GLOBAL-DEFINE
&GLOBAL-DEFINE

PGSEL
PGCLA
PGPAR
PGDIG
PGIMP

f-pg-sel
f-pg-cla
f-pg-par
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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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 piexecutar 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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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/utfield.i} ou ainda {utp/ut-table.i}.
6. Em todos os forms/frames de impresso deve-se colocar a clusula streamio.
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
programa RP.P de
Relatrio

/* include de controle de verso */


{include/i-prgvrs.i SP0014RP 1.00.00.000}

/* 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
pgina seleo */

LIKE customer.cust-num

/* campo

FIELD fim-cust-num
pgina seleo */

LIKE customer.cust-num

/* campo

FIELD sales-rep
pgina parmetros */

LIKE salesrep.sales-rep

/* campo

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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.

165

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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.ordernum)).
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.ordernum)).
DISPLAY STREAM str-rp
Order.Cust-Num
Order.Order-num
Order.Order-Date
Order.Promise-Date

167

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
Parmetros e
Digitaes
(JE0101)

Parmetros

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


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

CAPTULO 8
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Seqncia:
Campo:
Tipo:
Extent:
Tamanho:
Formato:
Label:
Ajuda:

Val Default

Digitaes

Construo de Programas

171

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


cdigo do atributo na temp-table tt-param
tipo de dado do atributo na temp-table tt-param
Indica, quando assinalado, que o atributo tem extent
tamanho do extent (s pode ser informado se tiver sido marcado
extent)
formato do atributo da temp-table tt-param (deve respeitar os
padres Progress)
label do atributo na temp-table tt-param
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
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

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
utilizando os Estilos e suas Tcnicas

Consideraes
sobre o
cadastramento de
campos

Construo de Programas

173

Deve sempre ser observada o label e o valor default utilizada na tela do


programa original, pois muitas vezes o nome do campo no expressa em
detalhes o significado correto do mesmo.

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

175

Como construir um programa de Parmetros nicos

Implementao

Estilo
Utilizado
'

Nome Fsico

Window Parmetros nicos

Masters/w-paruni.w

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 THISPROCEDURE 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

Implementao

Estilo
Utilizado
'

Nome Fsico

Window Formao

Masters/w-forma.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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

Exemplo

se for necessrio, ajustar a lgica da Procedure PI-ADD-BROWSE de


modo que atenda as necessidades do programa.

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 vrow).
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 'openquery':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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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

Implementao

Estilo
Utilizado
'

Nome Fsico

Window Formao sem Navegao

Masters/w-form2.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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-masterrecord);

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 pidelete-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

Implementao

Estilo
Utilizado
'

Nome Fsico

CustomBrowser Formao Filho

Masters/wbrwfrm.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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, screenvalues 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
&GLOBAL-DEFINE
&GLOBAL-DEFINE
&GLOBAL-DEFINE

PGLAY f-pg-lay
PGSEL
PGPAR f-pg-par
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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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 streamio.
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
programa RP.P de
Importao

/* include de controle de verso */


{include/i-prgvrs.i XX9999RP 1.00.00.000}
/* definio das temp-tables para recebimento de parmetros */
define temp-table tt-param
field destino
as
field arq-destino
as
field arq-entrada
as
field todos
as
field usuario
as
field data-exec
as
field hora-exec
as
field cust-ini
as
field cust-fim
as

integer
char
char
integer
char
date
integer
integer
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
def
def
def

stream s-imp.
var h-acomp as handle no-undo.
var c-linha as char no-undo.
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.arqdestino}


/* include com a definio da frame de cabealho e rodap */
{include/i-rpcab.i &STREAM="str-rp"}
/* bloco principal do programa */
assign c-programa
=
c-versao
=
c-revisao
=
c-empresa
=
c-sistema
=
c-titulo-relat
Clientes".

"XX0006RP"
"1.00"
".00.000"
"Empresa Teste"
'Sports'
= "Listagem de Erros da Importao de

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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, screenvalues 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
&GLOBAL-DEFINE
&GLOBAL-DEFINE
&GLOBAL-DEFINE

PGLAY f-pg-lay
PGSEL
PGPAR f-pg-par
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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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-arquivoentrada.
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 fimport.
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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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=ttparam.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 streamio.
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
programa RP.P de
Exportao

/* include de controle de verso */


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

integer
char
char
char
date
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.arqdestino}
/* include com a definio da frame de cabealho e rodap */
{include/i-rpcab.i &STREAM="str-rp"}
/* bloco principal do programa */
assign c-programa
=
c-versao
=
c-revisao
=
c-empresa
=
c-sistema
=
c-titulo-relat
Clientes".

"XX0006RP"
"1.00"
".00.000"
"Empresa Teste"
'Sports'
= "Listagem de Erros da Exportao de

CAPTULO 8
utilizando os Estilos e suas Tcnicas

Construo de Programas

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.custnum)).
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

Implementao

'Estilo utilizado

Nome Fsico

Window Pesquisa

Masters/w-pesqui.w

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, THISPROCEDURE;

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

197

Como construir um programa "V Para"

Implementao

Estilo
Utilizado
'

Nome Fsico

Dialog VaPara

Masters/d-vapara.w

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

Implementao

Estilo
Utilizado
'

Nome Fsico

Window Digitao Rpida

Masters/w-digit.w

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

Implementao

Estilo
Utilizado
'

Nome Fsico

CustomBrowserDigita

Masters/b-digit.w

selecionar o estilo relacionado na tabela acima;

CAPTULO 8
utilizando os Estilos e suas Tcnicas

Construo de Programas

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-buscavalor, 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

Implementao

Estilo
Utilizado
'

Nome Fsico

Custom Query Wizard

Masters/wquery.w

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

Implementao

Estilo
Utilizado
'

Nome Fsico

Custom Viewer com AutoField

Masters/vieweraf.w

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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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 '{&ADMCREATE-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

Exemplo

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 '{&ADMMODIFY-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;

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


{utp/ut-liter.i Preo * R}
assign fill-in_Price:label in frame {&frame-name} = returnvalue
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
utilizando os Estilos e suas Tcnicas

Exemplo

Construo de Programas

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.

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


representam chaves)

Adm-create-fields

Habilitados somente na
criao de um novo registro.

Outras variveis

Adm-modify-fields
Adm-assign-fields

Habilitados nas operaes de


ADD, COPY e MODIFY.

CAPTULO 8
utilizando os Estilos e suas Tcnicas

Exemplo

Construo de Programas

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.;

/* 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
chamada
value.
padro
{utp/ut-liter.i Preo * R}
assign fill-in_Price:Label in frame {&frame-name} = returnvalue.
{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. */

Exemplo

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.

/* 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
Order-Line.Price
Order-Line.Order-num
Order-Line.Line-num
Order-Line.Item-num
Order-Line.Discount
WITH FRAME {&FRAME-NAME}

@
@
@
@
@
@

fill-in_Qty
fill-in_Price
fill-in_order-num
fill-in_line-num
fill-in_item-num
fill-in_Discount

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


procedure que os objetos so habilitados:

comentar o dispatch padro;

206

Exemplo

comentar a linha em que consta a seguinte sentena: if adm-newrecord then.

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


Comentar
/* Dispatch standard ADM method.
*/
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
utilizando os Estilos e suas Tcnicas

Exemplo

Construo de Programas

207

inserir a lgica de gravao dos valores das variveis.

/* 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 admnew-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
utilizando os Estilos e suas Tcnicas

Construo de Programas

209

desabilitar todos os campos da tela;

Ateno: o controle de habilitao/desabilitao de campos deve ser feito pelo


usurio. Mais instrues a seguir:

Preprocessador

Finalidade

Adm-create-fields
Adm-assign-fields

Habilitados somente na criao de um novo registro

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.

Exemplo

colocar os campos nos preprocessadores de acordo com a tabela abaixo:

Exemplo: operaes de ADD e COPY

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.;

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


{utp/ut-liter.i Quantidade * R}
assign fill-in_Qty:label in frame {&frame-name} = returnvalue.

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.

*/

Exemplo

caso existam na viewer objetos no vinculados ao banco de dados


(variveis), customizar a procedure LOCAL-DISPLAY-FIELDS para que
seus valores sejam exibidos.

/* 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
order-line.Price
WITH FRAME {&FRAME-NAME}.

Exemplo

= fill-in_Qty
= fill-in_Price

customizar a procedure LOCAL-ENABLE-FIELDS:

comentar o dispatch padro;

comentado a linha em que aparea a sentena: if adm-new-record =


yes then;

/* 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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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 "ADMERROR":


&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 '{&ADMMODIFY-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
utilizando os Estilos e suas Tcnicas

Construo de Programas

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, devese 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-pcadsim).
<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 returnvalue 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
Help:

Verificar se existe uma ocorrncia para a(o) &1 informado


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
Help:

A corrente ocorrncia de &1 possui relacionamento ativos


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
Help:

No foi encontrada ocorrncia em &1 com a chave


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

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;

229

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 temptables de integrao tem o nome externo MPAPI001.I.
Verso de
Integrao

A API deve ter um controle interno para a verso corrente de integrao. Esta
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. cdtrans = 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 noerror.
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

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

239

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 temptables 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 temptable 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
input
input
input

param-1,
param-2,
param-3,
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
input
input
input
end procedure.

param-1,
param-2,
param-3,
0).

246

procedure execute2:
define
define
define
define

input
input
input
input

param
param
param
param

param-1
param-2
param-3
param-4

as
as
as
as

char no-undo.
int no-undo.
log no-undo.
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
define
define
define

input
input
input
input

param
param
param
param

param-1
param-2
param-3
param-4

as
as
as
as

char no-undo.
int no-undo.
log no-undo.
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
define
define
define
define

input
input
input
input
input

param
param
param
param
param

param-1
param-2
param-3
param-4
param-5

as
as
as
as
as

char no-undo.
int no-undo.
log no-undo.
int no-undo.
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 utilizal. 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 MSExchagne (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 EMail 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);

Exemplo

run utp/utapi004.p (input


input
input
input
input
input
input
input
input

"fulano@internet.com.br",
"",
"Manual",
"Mensagem do manual ... ",
"c:\autoexec.bat, c:\config.sys",
0,
no,
no,
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:

Exemplo

o primeiro parmetro deve ser o endereo IP do servidor de E-Mail que


pode ser adquirido da tabela de Parmetros Globais do Sistema (paramglobal 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 (paramglobal.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


input
input
input
input

"172.16.1.89",
25,
c-from,
c-to,
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
Gerais

devem ser passadas 1 (uma) temp-table de entrada e 1 (uma) de sada


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 ttreferencial.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

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

Obrigatrio

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 ututils.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 OSCOMAND 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 iescolha. 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

Imagem

273

Tick o evento que disparado aps cada intervalo de tempo


determinado.

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,CharacterPrevKey,Character-PrevText,Character-PrevToolTipText,CharacterKey,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

UColunas

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, Charactertexto_tar, Character-tooltip_tar, Character-hora_ini, Characterhora_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).

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

TabStrip

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.

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

DTelnet

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 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').

Sound

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.

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-HandleControl ).


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, associlo 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 localinitialize 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 ututils.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 ututils.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 ututils.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

Implementao

295

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 ututils.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 ututils.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, tipomodalidade: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

Implementao

299

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").

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.

Procedure pertencente ao programa chamado executada antes de sua inicializao;


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.
9

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


DEFINE INPUT PARAMETER p-state

NO-UNDO.

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 {&framename} = {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 <varivelcombo-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-combobox>}.

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 radioset 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 {&framename} = 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 {&framename} = {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 <varivelradio-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-radioset>}.

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 fillin utilizando a include do dicionrio conforme exemplo abaixo:
assign <variavel-fill-in>:screen-value in frame <framename> = {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.
Exemplo

/* include que retornar o label do campo


{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.


Exemplo

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


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

3. Ou, para utilizar alguma propriedade da mesma.


Exemplo

run utp/ut-msgs.p (input "msgs", (ou help)


input 1235,
input repres.cod-repres + "~~" + regiao.codregiao + "~~" + 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.


Exemplo

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


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 utperc.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 utperc.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 piinicializar:
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 utacomp.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 utacomp.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 utacomp.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 piinicializar:

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 piinicializar:

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

if available customer then do:


find state where state.state = customer.state no-lock noerror.
assign c-state-name = if avail state then state.statename 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.
Exemplo

{include/leave.i &tabela=state
&atributo-ref=state-name
&variavel-ref=c-state-name
&where="state.state = input frame {&frame-name}
customer.state"}

Onde:
<tabela>: tabela que possui a chave estrangeira;
<atributo-ref>: recebe o campo de 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-codigopai, 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 whpesquisa".]}

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

if available customer then do:


find state where state.state = customer.state no-lock noerror.
assign c-state-name = if avail state then state.statename 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.
Exemplo

{include/leave.i &tabela=state
&atributo-ref=state-name
&variavel-ref=c-state-name
&where="state.state = input frame {&frame-name}
customer.state"}

Onde:
<tabela>: tabela que possui a chave estrangeira;
<atributo-ref>: recebe o campo de 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 piprint-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/imtotal.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.
Exemplo

DO:
/* 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.valcredito.
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 PIRETORNA-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 piretorna-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-retornavalor 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 ttparam para gravar o campo parametro
assign tt-param.usuario
= c-seg-usuario
tt-param.destino
= input frame f-pg-imp rsdestino
tt-param.data-exec
= today
tt-param.hora-exec
= time
tt-param.classifica
= input frame f-pg-imp rsdestino
tt-param.desc-classifica
= entry((ttparam.classifica - 1) * 2 + 1, rs-classif:radio-buttons in
frame f-pg-cla)
tt-param.parametro
= if input frame f-pg-imp tbparametro = "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

Exemplo

if parametro = yes then do:


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
field
field
field
field
field
field
field
field

temp-table tt-param
destino
as integer
arquivo
as char
usuario
as char format "x(12)"
data-exec
as date
hora-exec
as integer
classifica
as char format "x(40)"
desc-classifica as char format "x(40)"
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 ttparam 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.
Exemplo

if tt-param.formato = 1 then do:


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, containertarget':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-ROWAVAILABLE, 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:

Gatilho de Create

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.

/*************************************************************
** 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 <bold-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-databela>.<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

Argentina

339

lcarg.db

arg9999.w

argv999.w(viewer)

tcarg999.p(create da tabela)

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
dicionrios)

tgarg999.p(assign de campo)

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)

(exemplo)

Estados

lcusa.db

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-3dsize=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.
Exemplo

RETURNS DECIMAL
(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 ututils.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
MSCOMM32.OCX
CELLSVWR.OCX
CIMAIL.OCX
CTWAVE32.OCX
MSCOMCT2.OCX
TREEVIEW.OCX
DATIMAGE.OCX
DATSOUND.OCX
DATVIDEO.OCX
MIDIFL32.OCX
MCI32.OCX
COMCTL32.OCX
COMDLG32.OCX

Barras.Aloca_Tarefa
Communications Control
CellsVwr.CellsView
CIMAIL.CISMTPCtrl.1
CtWAVE.ctWaveCtrl.l
Date and Time Picker Control
DatTreeView.TreeView
DatasulImage.Imagem
DatasulSound.Sound
DatasulMultimedia.MediaPlayer
Mabry.Midifile Ctl
MCI.MMControl.l
Microsoft TreeView Control
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,
Oracle e MS SQL-Server. Para tanto devem ser seguidas algumas regras,
de Dados
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
Progress
Oracle
MS SQL-Server

Sigla
progress
oracle
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 prprocessadores, 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 miniflexibilizao 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
Progress
Oracle
MS SQL-Server

Sigla
progress
oracle
mss

A utilizao do pr-processador, em conjunto com as diretivas de prprocessadores, 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 miniflexibilizao 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


especficas para determinadas verses de bancos de dados. Para tanto devem
para Verso de
ser seguidas algumas regras, descritas a seguir:
Banco de Dados

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 prprocessadores, 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 miniflexibilizao 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


especficas para as mais diversas necessidades e situaes. Para tanto devem
Especfica
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 devese 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 redefinio 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 prprocessadores, 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 prprocessador esteja definido ento executada uma lgica seno executada
outra lgica.
A seguir veja um exemplo de utilizao de pr-processadore de miniflexibilizao 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

Implementao

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".

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 ICOUNTDS.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


Objetivo

Esta tcnica deve ser utilizada quando for necessrio descobrir se o EAI est
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

def var c-modelo-default

359

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 btconfig-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 carquivo 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 textdestino 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 textmodo 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 NOLABEL
text-modo AT ROW 8.13 COL 1.14 COLON-ALIGNED NOLABEL
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
bt-arquivo:visible

= no
= no

bt-config-impr:visible = YES
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive

= NO

l-habilitaRtf:SCREEN-VALUE IN FRAME f-pgimp = "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 fpg-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
name}

l-ok = yes then


assign c-modelo-rtf:screen-value in frame {&frame= 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-pgimp 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 frelat.
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
rtf

= INPUT FRAME f-pg-imp c-modelo-

tt-param.l-habilitaRtf
habilitaRtf

= INPUT FRAME f-pg-imp l-

&endif

Alteraes no Programa RP:


1.

Acrescentar aps include/i-prgvrs.i o pr-processador:


&GLOBAL-DEFINE RTF YES

2.

3.

Na definio da temp-table tt-param, acrescente os campos


field modelo-rtf

as char format "x(35)"

field l-habilitaRtf

as LOG.

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-sqlstatement, 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 STOREDPROCEDURE. 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 sendsql-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
HANDLE(oracleCommand).

iHandle1

PROC-

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(proctext, 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 prexistentes 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(csales-rep-ini) + ") AND LOWER(" + p2oCharacter(c-sales-repfim) + ")) AND" + CHR(10) +
" (order.Promise-Date BETWEEN " + p2oDate(da-entregaini) + " AND " + p2oDate(da-entrega-fim) + ")) ".

RUN STORED-PROCEDURE send-sql-statement handle1 = PROCHANDLE(oracleCommand).


FOR EACH proc-text-buffer WHERE PROC-HANDLE = handle1:
CREATE oracleLine.
ASSIGN oracleLine.order_orderNum = o2pGetNumber(proctext, 1).
oracleLine.order_custNum = o2pGetNumber(proc-text,
30)
oracleLine.order_promiseDate = o2pGetDate(proctext, 60).
oracleLine.order_salesRep = o2pGetString(proctext, 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:

Implementao

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 utsend-sql.i que ir retornar ao programa executor uma temp-table contendo o
resultado da consulta.
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

FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD
FIELD

371

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

LIKE
LIKE
LIKE
LIKE
LIKE
LIKE
LIKE
LIKE
LIKE
LIKE
LIKE
LIKE

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.

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

DEFINE VARIABLE utSelect

AS HANDLE

NO-UNDO.
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.extendedprice.


&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
c-sistema

= "Empresa Teste"
= "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 forder-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-orderline.
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 THISPROCEDURE 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 "<queryname>" na linha de comando abaixo pelo nome da SmartQuery
instanciada:

RUN pi-reposiciona-query
table).

IN

h_<query-name>

(input

v-row-

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: