Está en la página 1de 414

Manual de Padrões

Programação
EMS 2.0
Novembro/2007

Copyright © 1998 DATASUL S.A. Todos os direitos reservados.
Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou
transmitida por qualquer meio eletrônico ou mecânico, na sua totalidade ou em
parte, sem a prévia autorização escrita da DATASUL S.A., que reserva-se o
direito de efetuar alterações sem aviso prévio. A DATASUL S.A não assume
nenhuma responsabilidade pelas conseqüências de quaisquer erros ou
inexatidões que possam aparecer neste documento.
DATASUL S.A.
Av. Santos Dumont, 831, Joinville, SC, CEP 89.222-900

i

Índice
CAPÍTULO 1

Revisão do Dicionário de Dados.......................................1

Construção do Dicionário de Dados..............................................................2
Gatilhos do Dicionário de Dados..................................................................3
Campos Livres..............................................................................................4
Validações.....................................................................................................4
Considerações sobre o Dicionário de Dados do Datasul-HR 1.00................5
CAPÍTULO 2

Estrutura de Diretórios......................................................7

Datasul-EMS 2.0...........................................................................................7
Datasul-HR 1.0...........................................................................................12
CAPÍTULO 3

Nomenclatura....................................................................15

Padrões para Localização............................................................................15
Nomenclatura para bancos de dados de Localização...................................16
Nomenclatura padrão para programas DPC de Triggers de Localização.....17
Nomenclatura para Tabelas de Localização................................................18
Nomenclatura para Setup de Localização (XML).......................................19
Sigla de bancos de dados............................................................................20
Banco de Dados do Datasul-HR 1.00......................................................21
Siglas de módulos do produto.....................................................................21
Módulos do Datasul-EMS 2.00...............................................................21
Módulos do Datasul-HR 1.00.................................................................22
Tipos de Atributos.......................................................................................22
Dump-name de tabelas................................................................................23
Gatilhos do dicionário de dados..................................................................24
Programas...................................................................................................24
Includes.......................................................................................................26
Include com view-as de campos para o dicionário de dados...................26
Includes de programas............................................................................26

ii

Includes padrões.....................................................................................26
Widgets.......................................................................................................27
Variáveis.....................................................................................................27
Datasul-EMS 2.00...................................................................................27
Datasul-HR 1.00.....................................................................................27
Outros componentes da linguagem Progress...............................................28
Siglas de países...........................................................................................28
Nomenclatura para Caixas de diálogos em programas de Zoom e
SmartBrowser.............................................................................................29
Adapters......................................................................................................29
CAPÍTULO 4

Layout de Telas.................................................................31

Tipos de Telas (janelas)...............................................................................31
Janela Mestre..........................................................................................31
Janela Detalhe.........................................................................................31
Caixas de Diálogo...................................................................................31
Objetos........................................................................................................32
Combo-boxes..........................................................................................32
Retângulos..............................................................................................32
Botões.....................................................................................................32
Fill-in´s...................................................................................................32
Frames(Telas).........................................................................................32
Radio-Sets...............................................................................................33
Editores...................................................................................................33
Considerações sobre os SmartObjects.........................................................34
SmartBrowser.........................................................................................34
SmartViewer...........................................................................................34
SmartQuery.............................................................................................34
Considerações sobre as Imagens.................................................................34
WebEnabler.............................................................................................34
CAPÍTULO 5

Estilos................................................................................35

Cadastro Simples........................................................................................35
Cadastro Complexo.....................................................................................37
Quando utilizar o Cadastro Complexo....................................................37
Cadastro Simples - Atualiza........................................................................38
Cadastro Complexo - Atualiza....................................................................39
Pai x Filhos - Atualiza Filho.......................................................................40
Quando utilizar Pai x Filhos - Atualiza Filho..........................................40
Manutenção de Filhos.................................................................................41

Índice

iii

Pai x Filhos - Atualiza Ambos.....................................................................42
Manutenção de Pais....................................................................................43
Consulta Cadastral Simples........................................................................44
Consulta Cadastral Complexa.....................................................................45
Consulta Relacionamento...........................................................................46
Relatórios, Cálculos, Fechamentos.............................................................47
Parâmetros Únicos......................................................................................51
Parâmetros Múltiplos..................................................................................51
Formação....................................................................................................52
Formação sem Navegação..........................................................................53
Importação..................................................................................................54
Exportação..................................................................................................56
Zoom de Tabelas.........................................................................................59
Vá Para.......................................................................................................60
Digitação Rápida........................................................................................61
Painéis.........................................................................................................61
Funções.......................................................................................................62
Relatórios Relacionados..........................................................................62
Consultas Relacionadas..........................................................................62
CAPÍTULO 6

Includes e Utilitários Padrão...........................................63

UT-FIELD.I................................................................................................63
UT-RTLBL.I...............................................................................................64
UT-RUN.I...................................................................................................64
UT-MSGS.P................................................................................................69
IND01-10.I, IND11-50.I E IND51500.I......................................................70
UT-TABLE.I...............................................................................................71
UT-LITER.I................................................................................................72
UT-LIMIT.P................................................................................................73
UT-GLOB.I.................................................................................................73
I-FREEAC.I................................................................................................74
UT-DIR.P....................................................................................................74
BTB917ZX.P..............................................................................................75
BTB917ZY.P..............................................................................................76
BTB917ZZ.P..............................................................................................77
UT-VRBIN.P..............................................................................................78
UT-FINFO.P...............................................................................................79
UT-CMDLN.P............................................................................................80
UT-OSVER.P..............................................................................................80
I-COUNTDS.I............................................................................................81

UT-WIN.I....................................................................................................82
UT-TRACE.P..............................................................................................85
UT-LOCK.I.................................................................................................86
UT-ZIP.P.....................................................................................................87
UT-GENXML.P..........................................................................................89
UT-VALIDA-FACELIFT.P.........................................................................89
CAPÍTULO 7
Tradução........................................................................................................ 90

TRADUÇÃO MONO-IDIOMAS...............................................................90
Tradução de variáveis com view-as nas telas..............................................90
Espaço Extra para tradução em relatórios...................................................95
TRADUÇÃO MULTI-IDIOMAS...............................................................96
Nomenclatura Padrão e Características do modelo.....................................96
Pontos de tradução......................................................................................98
Contextos de tradução.................................................................................98
Itens de Tradução........................................................................................99
Sequência de busca...................................................................................101
UT-TRCAMPOS.P...................................................................................102
UT-TRFRRP.P..........................................................................................102
UT-LSTIT.P..............................................................................................103
UT-LITER.P.............................................................................................104
UT-MSGS.P..............................................................................................105
UT-FIELD.P.............................................................................................106
UT-TABLE.P............................................................................................107
UT-LTMNU.P...........................................................................................107
OBJETOS PROGRESS NÃO-INDEXADOS...........................................109
Tradução de variáveis com view-as nas telas............................................109
Espaço Extra para tradução em relatórios.................................................113
PRÁTICAS PARA IMPLEMENTAÇÃO MULTI-IDIOMAS..................114
Caso Prático Diferenças LIST-ITEMS para LIST-ITEM-PAIRS..............114
Caso conversão de List-items para LIST-ITEM-PAIRS............................117
Tradução automática em frame de relatório..............................................118
Traduzir valor armazenado em uma variável............................................119
Tratando lista enorme de tradução em includes.........................................120
CAPÍTULO 8
Construção de Programas utilizando os Estilos e suas Técnicas.........125

Como construir um Cadastro Simples.......................................................125
Como construir um Cadastro Complexo...................................................127

Índice

v

Como construir um Cadastro Pai X Filho - Atualiza Filho........................131
Como construir um Cadastro Inclui/Modifica Filho.................................135
Como construir um Cadastro Pai X Filho - Atualiza Ambos.....................141
Como construir um Cadastro Inclui/Modifica Filho.................................145
Como construir um Cadastro Inclui/Modifica Pai.....................................149
Como construir um CustomBrowser Inclui/Modifica...............................152
Como construir um CustomBrowser Zoom Wizard..................................154
Como construir uma Consulta Simples.....................................................158
Como construir uma Consulta Complexa..................................................160
Como construir uma Consulta Relacionamentos.......................................164
Como construir um programa de Relatórios..............................................167
Preparação do Relatório - Interface.......................................................168
Página de Impressão.............................................................................170
Relatórios no formato RTF...................................................................171
Dicas para criação do Programa RP.P de Relatório...............................172
Preparando o Relatório para Execução no Módulo JOB EXECUTION....178
Como construir um programa de Parâmetros Únicos................................185
Como construir um programa de Formação..............................................186
Como construir um programa de Formação sem Navegação....................190
Seqüência..............................................................................................191
Como construir um programa de Importação............................................193
Dicas Gerais..........................................................................................193
Preparação do programa.......................................................................194
Dicas para criação do Programa RP.P de Importação............................196
Como construir um programa de Exportação............................................199
Dicas Gerais..........................................................................................199
Preparação do programa.......................................................................199
Dicas para criação do Programa RP.P de Exportação............................202
Como construir um programa de Pesquisa................................................205
Como construir um programa "Vá Para"...................................................207
Como construir um programa de Digitação Rápida..................................208
Como construir um Browse de Digitação.............................................208
Como construir uma Query.......................................................................209
Como construir viewers............................................................................210
Como definir viewer Padrão.................................................................210
Como definir viewer sem campos de tabela:.........................................213
Como definir viewers só com campos chave:.......................................218
CAPÍTULO 9

Validações.......................................................................224

Validações de Tela.....................................................................................224

Validações na Navegação de Registro...................................................224
Validações Antes da Alteração..............................................................224
Validações em Entrada de Dados..........................................................225
Validações em Cadastro Simples..........................................................225
Validações em Cadastro Complexo.......................................................225
Validações para Window Relatório.......................................................226
Validações em Triggers de Dicionário de Dados.......................................226
CAPÍTULO 10

Mensagens......................................................................227

Regras para a criação de novas mensagens...........................................229
Padrões para tradução de mensagens para Inglês e Espanhol................232
CAPÍTULO 11

Programas Reutilizáveis................................................233

Procedures Internas...................................................................................233
CAPÍTULO 12

Ferramentas....................................................................235

Application Compiler................................................................................235
Selecionar arquivos a serem compilados...............................................236
Eliminar e Modificar a lista de arquivos a serem compilados...............237
Opções de Compilação.........................................................................237
Iniciar Compilação................................................................................238
Roundtable................................................................................................239
CAPÍTULO 13

API´s................................................................................243

O que são API´s e como construí-las.........................................................243
Código da API.......................................................................................247
Como documentar API´s...........................................................................248
Como implementar evoluções de API´s....................................................249
UTAPI002.P..............................................................................................259
UTAPI003.P..............................................................................................259
UTAPI004.P..............................................................................................259
UTAPI005.P..............................................................................................260
UTAPI006.P..............................................................................................262
UTAPI007.P..............................................................................................263
UTAPI008.P..............................................................................................263
UTAPI009.P..............................................................................................264
UTAPI010.P..............................................................................................264
UTAPI012.P..............................................................................................264
UTAPI013.P..............................................................................................265
UTAPI018.P..............................................................................................265

..................................................Índice vii UTAPI019............................306 Como habilitar ou desabilitar botões em painéis.............................274 Como dar foco a qualquer objeto.........................................................................................................................................................................................................268 Execução...................P.......................................273 Como alterar o diretório corrente.........................................................................................268 CAPÍTULO 14 Portabilidade de RCODES...............................................P............................................................270 Caso em Especial...................................266 UTAPI029..................................................................................................................................308 Como habilitar ou desabilitar botões específicos em Browse Inclui/Modifica .....271 CAPÍTULO 15 Técnicas.......................................................................................................................267 Parâmetros de Entrada...............................................................................276 Como utilizar OCX......................298 Como obter as coordenadas do mouse.........265 UTAPI027.................................................273 Como alterar o caracter de senha...........................................305 Como desabilitar Radio-Buttons..........P......... 312 Como implementar campos indicadores num SmartBrowser..................275 Como deixar uma janela sempre visível..........................................300 Como obter o diretório corrente..............302 Como obter o diretório do Windows...................................P......................................................................................................................................306 Como executar programas que são janelas...........267 Parâmetros de Saída.................................................266 APAPI009..............................................................................................................276 Como executar um aplicativo do Windows...............................314 Como implementar labels em retângulos utilizando o dicionário de dados ..................................301 Como obter o diretório de sistema do Windows....................................................................................315 ................304 Como transformar uma janela em barra de ferramentas...................................................P...............................................................................273 Como alterar ou criar uma variável de ambiente..............................310 Como implementar campos indicadores com view-as radio-set nas telas............................................................270 Regras para Portabilidade de RCODE......................266 UTAPI028............................................................................................................................309 Como implementar campos indicadores com view-as combo-box nas telas ...................................................303 Como obter o valor de uma variável de ambiente...............................................................................................................................297 Como implementar Correção Ortográfica em Editores..........................302 Como obter o nome do computador.................................................

...316 Mensagem de Erro/Advertência/Informação sem Parâmetros......................364 Como descobrir se o EAI está habilitado........373 ...........339 Reposicionamento Automático do Browser de Zoom.................................................................................................331 Como totalizar colunas de um browse..............332 Como adaptar a procedure pi-retorna-valor no Custom Browser Zoom Wizard.........................316 Mensagem de Erro/Advertência/Informação com Parâmetros.............Como implementar mensagens para o usuário..........................................................................................................342 Como construir gatilhos de dicionários de dados....................................365 Como migrar relatórios antigos para RTF...............................................................348 Como setar os modos de inclusão (Simple/Multiple).................323 Como implementar ThinZoom e campos de referência para campos chave estrangeira em SmartObjects.....................335 Impressão Página de Parâmetros:........................................................350 Como verificar o registro de um OCX...............................355 Como registrar campo do tipo Fill-in para o WebEnabler.................337 Como implementar Botão de Filtro em Zoom...................................................................................................................................................................................................................................................339 Definição da Variável Global.....................................................349 Como utilizar "functions" no UIB........317 Mensagens com Questionamento ao Usuário............................................................................................................346 Padronização dos parâmetros do progress......................................................................366 Como converter consultas For Each para Send-SQL-Statement........339 Como implementar reposicionamento de registro com base nas variáveis globais.....................351 Como construir um browse com ordenação por coluna..363 Como chamar um programa que é janela a partir de uma transação.............................................................................353 Mini-Flexibilização.......................................319 Como implementar acompanhamento (UT-ACOMP)..335 Formato de Impressão (80 colunas ou 132 colunas):.......365 Como enviar gráficos ou documentos office para o WebEnabler..............341 Como validar campos em viewers diferentes.................333 Como implementar Parâmetros de Impressão em Relatórios..............................................................362 Como contar a quantidade de registros numa tabela............321 Como implementar Zoom e campos de referência para campos chave estrangeira...................................................................................317 Como implementar Tooltip em um determinado botão..............ini......................................318 Como implementar uma barra de progresso.....................................................................................................333 Situações necessárias.................................327 Como imprimir campos editores nos relatórios...............................................................344 Como implementar localizações..................................

Índice

ix

Utilitário para Geração de Comandos SQL...............................................378
Conversão de Query em Frame para SmartQuery.....................................391
Utilizando ZOOM na página de digitação.................................................393
Aplicar facelift em programas fora do padrão...........................................394
Como implementar segurança em programas específicos.........................396
Como Ignorar Códigos no WBD...............................................................396
Como Salvar chaves em Oracle e evitar o erro de UNIQUE-CONSTRAINT
..................................................................................................................397
CAPÍTULO 16

Dicas de Desenvolvimento............................................398

Segurança de Banco x Objetos Dinâmicos................................................398

Definição

1

CAPÍTULO 1

Revisão do Dicionário de Dados
Antes do início da conversão de cada módulo deve ser realizada uma revisão n
Dicionário de Dados do MAGNUS versão I.00, que abrange os seguintes itens:

trocar os campos do tipo narrativa (exemplo: "x(76)" x10) nas tabelas por
campos view-as editor e formato "X(2000)";

criar os campos necessários para limpar os campos do tipo char-1, dec-1,
int-1, etc...;

criar tabelas necessárias que hoje estão "camufladas" em arquivos
temporários e/ou em tabelas não utilizadas;

para todos os campos que são indicadores, sejam de tipo de dado caracter
ou lógico, trocar por campo indicador correspondente com tipo de dado
inteiro. Exemplo:
DE

PARA

Emitente.identific

Emitente.identific

"C"liente

1

"F"ornecedor

2

"A"mbos

3

implementar o view-as nos campos possíveis. Exemplo: editor, radio-set, e
toggle-box;

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

2

revisar os labels e column-labels dos campos para internacionalização,
reservando espaço extra para tradução;

as palavras que compõem os labels e column-labels, quando não
abreviadas, devem ser acentuadas;

os labels não podem conter preposições (de, da, em ...) e pontuação (.;-);

a primeira letra de cada palavra, que compõe o label ou col-label, deve ser
maiúscula, as demais minúsculas;

evitar column-labels com duas ou mais linhas;

sugestão: Incorporar no Field-Validation as validações que estão 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 número seqüencial da tabela.
SIGLA

BANCO

AD

Administrativo

BH

Bancos Históricos

CL

Coletor de Dados

DI

Distribuição

ED

EDI

IN

Industrial

IV

Investimentos

MP

MultiPlanta

PE

Ponto Eletrônico

RH

Recursos Humanos

UN

Universal

Construção do Dicionário de Dados

alterar o campo "CEP" único para formato x(12) com parâmetro global
formato-cep;

campo "Unidade da Federação" deve ter formato x(04);

campo "Condado(Bairro)" deve ter formato x(30);

campo "Endereço2" deve ter formato de x(40);

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
3

campo "Número do Documento (do AP/CR)" para MAGNUS deve ter
como nomenclatura x(16);

campo "Série do Documento" deve ter formato x(05);

os campos de "Conta + sub-conta" devem ter formato x(8) + x(8);

os campos de "Códigos de Contribuição Fiscal (CGC, Inscrição Estadual,
etc ...)" devem ter como nomenclatura x(18);

campo "Código do Item" deve ter formato x(16);

separar tudo que for especificados no Brasil em folder separados.
Exemplo: Cadastro de Cliente-Código Febraban, Cacex ...;

na confecção de Relatórios evitar posicionamento de campos;

os indicadores comuns a várias tabelas, na composição do seu nome
devem considerar o nome da tabela principal;

não existe o campo do código da empresa nas telas, deve ser sempre
assumido a empresa do corrente usuário, que é definida no menu, e está
disponível na variável global i-ep-código-usuário;

em todas as tabelas, que representem pessoas físicas ou jurídicas,
implementar o campo para endereço eletrônico da entidade: e-mail
formato 'x(40)' label "Internet E-Mail".

Gatilhos do Dicionário de Dados
No Dicionário de Dados, os seguintes itens deverão ser obedecidos:
1. Todas as tabelas deverão possuir os gatilhos de dicionário de dados
CREATE, DELETE e WRITE mesmo que não possuam código algum
para validação.
2. As triggers de WRITE e DELETE deverão conter a chamada as includes
para EPC´s em Gatilhos de Dicionário de Dados.
3. Ao especificar caminhos, deverá ser referenciado apenas o caminho
relativo, ou seja, a partir do diretório de instalação do produto. O caracter
"\" (contra-barra) NÃO pode ser utilizado, devendo ser substituído 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 mínimo 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

Lógico

log-2

Os antigos campos livres são para uso do cliente, como por exemplo, u-char-1,
u-livre-1, não são mais implementados nas tabelas.

Validações

as validações de campo simples permanecem no Field Validation
(VALEXP), no dicionário de dados, entende-se por validações simples
aquelas que dependam apenas do dado informado do próprio campo, não
fazendo referência a outros campos da tabela. Exemplo: item.descrição-1
<> "";

todas as validações, inclusive as constantes no Field Validation dos
campos atualizados na tela, devem ocorrer no momento de confirmação de
gravação (botões OK, Gravar, GO of frame);

normalmente, é feita a validação em um destes locais, pi-validate, quando
existirem mais de uma viewer ou na local-assign-record, quando for
apenas uma;

não implementar qualquer validação no evento de leave dos campos;

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
5

na SmartViewer retirar as validações automáticas do UIB, para chaves
estrangeiras, chamadas "XFTR-Foreing Keys";

todas as validações de eliminação constantes no Delete Validation de uma
tabela no dicionário de dados devem ser transferidas para o Delete Gatilho
desta tabela, assim o Delete Validation das tabelas fica vazio;

também podem ser transferidas para o Delete Gatilho as validações de
eliminação que estão nos programas de eliminação pois antes, não eram
suportadas pelo Delete Validation.

Considerações sobre o Dicionário de Dados do Datasul-HR 1.00

a versão atual do Datasul-HR somente possui integração com o produto
Datasul-EMS 2.00, e o controle do dicionário de dados é feito no DWBDDD;

Datasul-HR, pode acessar tabelas do banco MGUNI e neste caso, não se
deve cadastrar as tabelas do MGUNI no DWB-DDD, não sendo utilizado
o conceito do DWB de base externa, uma vez que não é utilizado o
módulo de construção de programas (DML) no DWB-DDD. O controle de
integridade referencial, nestes casos, é feito manualmente nos gatilhos e
validações;

todas as validações do Datasul-HR são realizadas nos programas ou em
trigger´s de write das tabelas, não existem validações no FIELDVALIDATION.

Definição

7

CAPÍTULO 2

Estrutura de Diretórios
Este capítulo relaciona e descreve os diretórios referentes ao Datasul-EMS 2.0
e o Datasul-HR 1.0.

Datasul-EMS 2.0
Diretórios

Conteúdo

\ADBRW

Objetos Browsers do banco Administrativo

\ADGO

Objetos "Vá para" do banco Administrativo

\ADINC

Includes de campos indicadores do banco
Administrativo

\ADQRY

Objetos Queries do banco Administrativo

\ADVWR

Objetos Viewers do banco Administrativo

\ADZOOM\

Zooms do banco Administrativo

\AEP

Programas do módulo Aplicações e Empréstimos

\APP

Programas do módulo Contas a Pagar

\BCP

Programas do módulo Coleta de Dados

\BHP

Programas do módulo Bancos Históricos

\BSP

Programas do módulo Benefícios Sociais

\BTB

Programas do módulo Básico

\CBP

Programas do módulo Caixa e Bancos

\CCP

Programas do módulo Compras

\CDP

Programas do módulo Cadastro

\CEP

Programas do módulo Controle de Estoque

\CFP

Programas do módulo Configurador Produto

8

\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 módulo Controle da Produção

\CQP

Programas do módulo Controle de Qualidade

\CRP

Programas do módulo Contas a Receber

\CSP

Programas do módulo Custos

\DATABASE

\DMAD

Programas de Dump do banco MGADM

\DMCL

Programas de Dump do banco MGLCD

\DMDI

Programas de Dump do banco MGDIS

\DMIN

Programas de Dump do banco MGIND

\DMIV

Programas de Dump do banco MGINV

\DMMP

Programas de Dump do banco MGMP

\DMPE

Programas de Dump do banco MGPE

\DMRH

Programas de Dump do banco MGRH

\DMUN

Programas de Dump do banco MGUNI

\LDAD

Programas de Dump do banco MGADM

\LDCL

Programas de Dump do banco MGCLD

\LDDI

Programas de Dump do banco MGDIS

\LDIN

Programas de Dump do banco MGIND

\LDIV

Programas de Dump do banco MGINV

\LDMP

Programas de Dump do banco MGMP

\LDPE

Programas de Dump do banco MGPE

\LDRH

Programas de Dump do banco MGRH

\LDUN

Programas de Dump do banco MGUNI

\TGAD

\TGCL

\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

APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 9 \TGDI \TGIN \TGIV \TGPE \TGRH \TGUN \TDP Gatilhos de delete do banco MGCLD \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 Distribuição \DIGO Objetos "Vá para" do banco Distribuição \DIINC Includes de campos indicadores do banco Distribuição .

\DIQRY Objetos Queries do banco Distribuição \DIVWR Objetos Viewers do banco Distribuição \DIZOOM Zooms do banco Distribuição \DOC Módulo Documentação \DOCAPI Documentação de API´s \DOCHLP Documentação dos módulos em formato.rtf) \DPP Programas do módulo de Desenvolvimento Produto \ENP Programas do módulo de Engenharia \FCP Programas do módulo de FASB/CMI \FPP Programas do módulo Folha de Pagamentos \FRP Programas do módulo Férias Rescisões \FTP Programas do módulo Faturamento \GEP Programas do módulo Gerencial \GRP Programas do módulo Gerador Relatórios \IMAGE Imagens \IMGDIS Diretório padrão de imagens do Aplicativo Distribuição \IMGFIN Diretório padrão de imagens do Aplicativo Financeiro \IMGHUR Diretório padrão de imagens do Aplicativo Recursos Humanos \IMGMAN Diretório padrão de imagens do Aplicativo Manufatura \IMGMAT Diretório padrão de imagens do Aplicativo Materiais \IMGTEC Diretório padrão de imagens do Aplicativo Tecnologia \INBRW Objetos Browsers do banco Industrial \INCLUDE Includes Padrões \INGO Objetos "Vá para" do banco Industrial \ININC Includes de campos indicadores do banco Industrial \INP Programas do módulo 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 .hlp \DOCRTF Documentação dos Manuais impressos (*.

APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 11 Investimentos \IVQRY Objetos Queries do banco Investimentos \IVVWR Objetos Viewers do banco Investimentos \IVZOOM Zooms do banco Investimentos \LAYOUT Layout´s de Importação \MASTERS Masters do SmartObjects \MEN Módulo Menu \MIP Programas do módulo Manutenção Industrial \MPBRW Objetos Browsers do banco MultiPlanta \MPGO Objetos "Vá para" do banco MultiPlanta \MPINC Includes de campos indicadores do banco MultiPlanta \MPP Programas do módulo MultiPlanta \MPQRY Objetos Queries do banco MultiPlanta \MPVWR Objetos Viewers do banco MultiPlanta \MPZOOM Zooms do banco MultiPlanta \OFP Programas do módulo Obrigações Fiscais \PANEL Painéis dos SmartObjects \PCP Programas do módulo Planejamento Capacidade \PDP Programas do módulo de Pedidos \PEBRW Objetos Browsers do banco Ponto Eletrônico \PEGO Objeto "Vá para" do banco Ponto Eletrônico \PEINC Includes de campos indicadores do banco Ponto Eletrônico \PEP Programas do módulo Ponto Eletrônico \PEQRY Objetos Queries do banco Ponto Eletrônico \PEVWR Objetos Viewers do banco Ponto Eletrônico \PEZOOM Zooms do banco Ponto Eletrônico \PIP Programas do módulo Planejamento Manutenção Industrial \PLP Programas do módulo Planejamento \PMP Programas do módulo Plano Mestre \PTP Programas do módulo Patrimônio \PVP Programas do módulo Previsão de Vendas \QOP Programas do módulo Cotação de Vendas \REP Programas do módulo Recebimentos \RHBRW Objetos Browsers do banco Recursos Humanos .

0 Diretórios \DATABASE Conteúdo \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 .\RHGO Objetos "Vá para" do banco Recursos Humanos \RHINC Includes de campos indicadores do banco Recursos Humanos \RHQRY Objetos Queries do banco Recursos Humanos \RHVWR Objetos Viewers do banco Recursos Humanos \RHZOOM Zooms do banco Recursos Humanos \SCRIPTS Scripts de Carga da Aplicação \SEC Módulo Segurança \SPOOL Diretório default de destino dos Relatórios \SPP Programas especiais dos módulos (não será expedido) \SRC Includes Padrões PROGRESS \SUPPORT Programas UIB customizados \UNBRW Objetos Browsers do banco Universal \UNGO Objetos "Vá para" do banco Universal \UNINC Includes de campos indicadores do banco Universal \UNQRY Objetos Queries do banco Universal \UNVWR Objetos Viewers do banco Universal \UNZOOM Zooms do banco Universal \UTB Módulo Universal \UTP Programas Utilitários \VARINC Includes de variáveis indicadores \LOCAL Programas que possuem localizações \XXX Prefixo do País \DATABASE Gatilhos do Banco de Dados do País Datasul-HR 1.

. narrativas. 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..hlp \DOCRTF Documentação de Manuais Impressos (*.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 13 \TGPY \TGTM \TGUN \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 Documentação de API´s \DOCHLP Documentação dos Módulo em formato .rtf) \IMAGE Imagens \IMGHUR Diretório padrão de imagens do Aplicativo Recursos Humanos \INCLUDE Includes Padrões \INTERFAC Arquivos de interfaces do Produto com outros softwares \LAYOUT Layout´s de importação \MASTERS Masters do SmartObjects \MEN Módulo Menu \OBJECT \SOPM \SOPY \BRW Browsers do Banco MGPMG DIALOG Filtros.. etc . do Banco MGPYC \QRY Objetos Queries do banco MGPYC . 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 Painéis dos SmartObjects \ATP Programas do módulo Administração de Treinamento \BSP Programas do módulo Benefícios \CAP Programas do módulo Cargos e Salários \DSP Programas do módulo Desenvolvimento de Pessoal \FPP Programas do módulo Folha de Pagamento \FRP Programas do módulo Férias e Rescisões \PEP Programas do módulo Ponto Eletrônico \BTB Módulo Básico \DOC Módulo Documentação \MEN Módulo Menu \SEC Módulo Segurança \SCRIPTS Scripts de Carga da Aplicação \SPOOL Diretório default de destino dos Relatórios \SRC Includes Padrões PROGRESS \SUPPORT Programas UIB customizados \UTB Módulo Universal \UTP Programas Utilitários \VARINC Includes de variáveis indicadores * Diretórios em implementação ..\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. 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. etc . narrativas. etc ..

e outros.00.Definição 15 CAPÍTULO 3 Nomenclatura O objetivo deste capítulo é descrever as regras de nomenclatura para os objetos dentro do Datasul-EMS 2. ou seja. Inclusive as tabelas de extensão dos bancos de dados somente multi-estabelecimentos como: MGDIS.00 e Datasul-HR 1. Padrões para Localização Cada produto EMS2 e EMS5 terão sua própria Localização. Para cada país terá dois bancos de dados próprios um para Cadastros e um para Movimentos (se necessário). as tabelas que precisarem devem conter também o código da empresa a exemplo do MGADM. Os bancos de dados de localização devem “nascer” multi-empresa. . MGMAT.

conforme norma 3166-1.  Para o banco dos Cadastros do EMS5: 'emsxxx' onde ‘xxx’ é a sigla do país. ‘5’ representa o produto “EMS5” e ‘999’ é uma numeração seqüencial gerada pelo DWB. conforme norma 3166-1. Exemplo: lcmex.  Para os Dump-names dos bancos de Localização do EMS2: 'xx2999' onde ‘xx’ é a sigla de duas letras do país. .  Para os Dump-names dos bancos de Localização do EMS5: 'xx5999' onde ‘xx’ é a sigla de duas letras do país. Exemplo: mov5mex.  Para o banco dos Movimentos do EMS2: 'mov2xxx' onde ‘xxx’ é a sigla do país. conforme norma 31661.00.00 e Datasul-EMS 5. ‘2’ representa o produto “EMS2” e ‘999’ é uma numeração seqüencial gerada pelo DWB. conforme norma 31661. Exemplo: mov2mex.  Para o banco dos Movimentos do EMS5: 'mov5xxx' onde ‘xxx’ é a sigla do país.Definição 16 Nomenclatura para bancos de dados de Localização O objetivo deste capítulo é descrever as regras de nomenclatura para os bancos de dados de localização do Datasul-EMS 2. Veja abaixo exemplos de nomenclatura de bancos de localização:  Para o banco dos Cadastros do EMS2: 'lcxxx' onde ‘xxx’ é a sigla do país. conforme norma 3166-1. conforme norma 3166-1. Exemplo: emsmex.

p”.  Exemplo: Para a tabela “Emitente” do produto padrão tem o dump-name “ad098”. Funcionamento dos programas DPC de triggers de localização:  Para tratar as regras de Localização de determinado país é criada uma tabela de extensão para a tabela do produto padrão no banco de dados do país (ex. ddddd = dump-name da tabela do produto padrão. No ambiente de localização são criados programas DPC que são cadastrados e invocados nos programas triggers da tabela padrão com a finalidade de manter a sincronização entre a tabela padrão e a tabela de extensão. “TW” para trigger de write. lcmex). conforme norma ISSO 3166-1. Nomes dos programas DPC de triggers de localização:  Os códigos destes programas DPC de Triggers ficarão amarrados ao dump-name da tabela do produto padrão. “TC” para trigger de create. então para o programa DPC de trigger de delete da localização “Emitente” para o país México deverá ter a seguinte nomenclatura: “mextdad098. onde: ppp tt = sigla do pais. Deverão também usar como prefixo a sigla do País (ISO 3166-1). cujo trigger vai chamar o programa DPC de localização. A tabela “mexext-emitente” do banco “lcmex” tem o dump-name “mx2001”. onde: ppp = mex “sigla do pais” .  O padrão de nomenclatura será: “pppttddddd. = “TD” para trigger de delete.p”.Definição APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 17 Nomenclatura padrão para programas DPC de Triggers de Localização O objetivo deste capítulo é descrever as regras de nomenclatura para as os programas DPC de triggers de localização. ao invés de utilizar o dump-name da tabela de extensão.

00.’. Exemplo: mexext-movto-extrat-bco.00 e Datasul-EMS 5. Nomes das tabelas de extensão para localização:   Para as tabelas de extensão. Exemplo: chi-movto-estoq. devem iniciar com a sigla do país. .p Nomenclatura para Tabelas de Localização O objetivo deste capítulo é descrever as regras de nomenclatura para as tabelas dos bancos de localização do Datasul-EMS 2. Veja abaixo exemplos de nomenclatura das tabelas de localização: Nomes das tabelas de localização:   Para as tabelas de localização teremos a seguinte regra. o padrão é começar com o prefixo (abreviatura) ‘xxxext’ onde ‘xxx’ é a abreviatura da sigla do país e ‘ext’ indica que é uma tabela de extensão.. Observação O DWB do EMS5 usa o underline como separador entre cada uma das abreviaturas e o DWB do EMS2 usa o hífen. onde ‘xxx’ é a abreviatura da sigla do país e ‘yyy..Definição tt = td “trigger de delete”. ddddd = ad098 “dump-name da tabela do produto padrão”.. formato ‘xxx-yyy.  Estes programas DPC devem ficar armazenados no mesmo diretório físico dos triggers de localização daquele país.. Exemplo: local/mex/database/mextdad098.’ será uma ou mais abreviaturas cadastradas.

exemplo:  local/arg  local/chi  local/pry  local/mex  local/col Observação salvo exceções homologadas a sigla do diretório do país respeita a codificação de países definida na norma ISO 3166-1.local/mex/lmx2setup.Definição APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 19 Decidiu-se que inicialmente estes padrões serão inspecionados no momento da Homologação de dicionário.xsd”. Cada país que possui localização contém um subdiretório com três letras abaixo do diretório local. pp = ´sigla país com 2 letras. 2 = ´Produto EMS2´)  Exemplos: .local/col/lco2setup. O arquivo do XML Schema deve ficar gravado na raiz do diretório “local”. O arquivo XML do setup de cada país ficará abaixo do respectivo diretório do país.xml . No futuro pode-se alterar a ferramenta DWB para validar em tempo real.00. Padrão para o produto EMS2: A nomenclatura padrão para o XML schema será “setup_localiz. A nomenclatura do arquivo xml deve respeitar a seguinte padronização:  Lpp2setup. Nomenclatura para Setup de Localização (XML) O objetivo deste capítulo é descrever as regras de nomenclatura para os arquivos de Setup de Localização do Datasul-EMS 2.00 e Datasul-EMS 5.xml . conforme norma ISO3166-1´.xml (L = ´Localização´.local/arg/lar2setup.xml Padrão para o produto EMS5: .

prgfin/lmx/lmx5setup. Banco Sigla Nome lógico Administrativo AD MGADM Coletor de Dados CL MGCLD Distribuição DI MGDIS Industrial IN MGIND .xml (L = ´Localização´. O arquivo xml do setup de cada país ficara abaixo do respectivo diretório do módulo de localização do país: A nomenclatura do arquivo xml deve respeitar a seguinte padronização:  Lpp5setup. foi determinada uma sigla de dois caracteres. com a mesma sigla do módulo da localização. abaixo do diretório prgfin. a sigla do módulo da localização do país.xml .Descrição O produto EMS5 não trabalha com o diretório “local”. começará com “L” seguida da sigla de 2 letras do país definida na norma ISO 3166-1. 5 = ´Produto EMS5´)  Exemplos: . O arquivo do XML Schema deve ficar gravado na raiz do diretório “prgfin/lschema” (module lschema do RoundTable).xml Sigla de bancos de dados Para cada banco de dados do Datasul-EMS 2. nome de objetos como zoom e browsers.00. pp = ´Sigla país com duas letras´. exemplo:  prgfin/nam  prgfin/lco  prgfin/lmx Observação salvo exceções homologadas.prgfin/lco/lco5setup. Esta sigla serve para compor o dump-name das tabelas. A nomenclatura padrão para o XML Schema será “setup_localiz. O equivalente será o próprio diretório “prgfin”. nome do diretório de gatilhos.xsd”. Cada país que possui localização contém um subdiretório com três letras.00 e Datasul-HR 1.

00 Módulo Sigla Aplicações e Empréstimos AE Benefícios 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 Produção CP Controle de Qualidade CQ Cotação de Vendas QO Custos CS .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 21 Investimentos IV MGINV MultiPlanta MP MGMP Ponto Eletrônico PE MGPE Recursos Humanos RH MGRH Universal UN MGUNI Banco de Dados do Datasul-HR 1. Módulos do Datasul-EMS 2. Banco Sigla Nome lógico Personal Management (Administração de Pessoal) PM DTHRPMG Payroll (Folha de Pagamento PY DTHRPYC Time and Attendence (Controle de Freqüência) TA DTHRTMA Universal (Universal) UN MGUNI Siglas de módulos do produto Cada módulo do produto possui uma sigla para ser utilizada na definição dos nomes de seus programas e diretórios.00 No Datasul-HR 1.00 deve-se utilizar nomes e abreviaturas no idioma inglês.

Desenvolvimento Produto DP EDI ED Engenharia EN FASB/CMI FC Faturamento FT Férias Rescisões FR Folha de Pagamento FP Gerencial GE Investimentos IN Manutenção Industrial MI MultiPlanta MP Obrigações Fiscais OF Patrimônio PT Pedidos PD Planejamento PL Planejamento Capacidade PC Planejamento Manutenção Industrial PI Plano Mestre PM Ponto Eletrônico PE Recebimento RE Recebimento Internacional RI Módulos do Datasul-HR 1.00 Módulo Sigla Administração de Treinamento AT Benefícios BS Cargos e Salários CA Desenvolvimento de Pessoal DS Férias e Rescisões FR Folha de Pagamento FP Ponto Eletrônico PE .

descrições e tipos de dados.>>9 cod Código Character X(8) dat Data Date 99/99/9999 des Descrição Character X(40) dsl Descrição .>>9 qtd Quantidade Decimal ->>>>.>>>.Decimal Decimal >>>. uma lista de todos os tipos de atributos.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 23 Tipos de Atributos Tipos de Atributos são classificadores para os tipos de informações que são gravadas.>>9 cdn Código .>>9.>>9.>>9 raw Raw Character X(15000) rec Recid Recid >>>>>>9 row Rowid Rowid X(20) som Som Character X(40) val Valor Decimal ->>.Inteiro Integer 9 Img Imagem Character X(08) log Lógico Logical Sim/Não mmp Memory pointer MenPtr X(8) nom Nome Character X(30) num Número Integer >>>>. Segue abaixo.>>9 wgh Widget-Handle Widget-Handle >>>>>>9 .>>>.99 vid Vídeo Character X(40) vli Valor-inteiro Integer >>>.>>>.Longa Character X(15000) hra Hora Character 99:99:99 idi Indicador . Tipo Descrição Tipo de Dado Formato Default cb1 Código de Barra Tipo 1 Integer >>>>>>>9 cb2 Código de Barra Tipo 2 Integer >>>>>>>>>>>9 cb3 Código de Barra Tipo 3 Character X(20) cdd Código .Inteira Integer >>>.9999 qti Quantidade .Numérico Integer >>>.

a tabela "item" que está no banco de dados industrial tem o dump-name "in172".p.p Assign de campo TA999999.p Find da tabela tfxx999. o tamanho máximo do arquivo deve ter 8 caracteres e o tamanho máximo para a extensão deve ter 3 caracteres no máximo. É importante utilizar letras minúsculas para a sigla da base de dados. deverão obedecer a regra imposta pelo DOS para o seu nome. mesmo se tiverem extensões diferentes.p database/tgin/tfin172. quando não.p database/tgin/tdp/tdin172. 2 . tem o formato "xx999".i*. nomes de diretórios. Não existe processo automático para determinar o número seqüencial para a tabela no banco de dados. a tabela é armazenada. é um número seqüencial de campos em todo o DatasulEMS 2. ambos tem o mesmo nome do arquivo com extensão .p Delete da tabela tdxx999. Gatilhos do dicionário de dados Gatilho Nomenclatura Exemplos para a tabela "item" Create da tabela tcxx999. Entretanto dois programas.p 2 database/tgin/tap/ta002242.. se possuir interface e . no padrão.Dump-name de tabelas O Dump-name de uma tabela. não podem ter o mesmo nome de arquivo. includes com extensão .p1 database/tgint/tcp/tcin172. Todos os arquivos . imagens.r. no qual. Assim. e a sua extensão é . onde "xx" é a sigla do banco de dados do produto.r. etc.p. porque na geração do executável .w.p² database/tgin/twin172. O gatilhos de assign do campo obedece a nomenclatura diferenciada pois podemos ter mais de um gatilho assign por tabela. todos os nomes de arquivo dos programas devem estar em letras minúsculas. 1 "xx999" é o dump-name da tabela.p Write da tabela twxx999. isto é. assim a parte 999999.p Programas A nomenclatura de um programa é determinada em função do seu tipo/estilo. e 999 é um número seqüencial único dentro do banco de dados. Basta acrescentar uma unidade ao último número já utilizado.sejam programas com extensão . Também.0.

w xxgo g99xx999.w q01in172.p z01in172.w g01in172.w v01in172.w xxdialog d99xx999. sendo que o diretório destino do programa é sempre o diretório do módulo: Tipo Nomenclatura Exemplos API xxapi999. sendo então.p Subprograma qualquer sem interface xx9999zz.w5 Subprograma de relatório xx9999rp.p cep/ce0401a. sem interface ou ainda API´s.w d01in172.w para os programas que estão ligados a um módulo do Datasul-EMS 2. 5 "xx" indica a sigla do módulo e "zz" caracteres de diferenciação entre programas e subprogramas.w Viewer xxvwr v99xx999.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 25 Para os programas que são objetos (SmartObjects) e estão ligados a uma tabela adota-se a nomenclatura abaixo: Tipo do Objeto   3 Diretório destino Browser xxbrw Dialog Go (Vá para) 3 Nomenclatura 4 Exemplos para a tabela "item" b99xx999.00. 6 Os caracteres "rp" são fixos para nomenclatura deste tipo de subprograma construído através dos Estilos relatório e importação/exportação.w Query xxqry q99xx999. conforme tabela a seguir: Numeração Tipo de Programas 0000 à 0099 Manutenções Cadastrais 0100 à 0199 Manutenções Gerais 0200 à 0299 Consultas Cadastrais 0300 à 0399 Consultas Complexas/Relacionamento 0400 à 0499 Listagens Cadastrais 0500 à 0699 Relatórios 0700 à 0799 Tarefas 0800 à 0899 Especiais/Gráficos 0900 à 0999 Utilitários "xx" é a sigla do banco de dados da tabela principal do objeto.w bo01in172.w Zoom (Pesquisa) xxzoom z99xx999. "99" é um número seqüencial de objetos de um determinado tipo para uma tabela e "xx999" e dump-name desta tabela.p cep/ceapi001. adota-se a nomenclatura abaixo.w cep/ce0401rp.00 deve ser observado um controle na criação da numeração do nome do programa. containers ou programas . 4 .p para programas do produto Datasul-HR 1.p 6 cep/ce0401.p.p Container xx9999zz.

conforme exemplo: Cadastro: AT0017 Consulta: AT0217 Relatório: AT0417.i. Includes Da mesma maneira que os programas.i1 a . e também. . os includes. o nome deste include é 'cd' mais um número seqüencial. Quando um include é utilizado por vários programas de vários módulos. Exemplo: cdp/cd0206. Diretório destino varinc Nomenclatura var99999.Os programas CADASTRAIS tem sempre uma numeração concordante. o nome deste include é igual ao do programa. apenas com a extensão . geralmente acima de 9000. e .i2.w ou advwr/v01ad102. o nome deste include é a sigla do módulo mais um número seqüencial. .i9.. devem ter seus nomes de arquivo em letras minúsculas. Estes includes são fundamentais para a tradução do produto. 7 "999999" é um número seqüencial de includes dentro do diretório "varinc".i 7 Exemplos varinc/var00002.i Includes de programas A nomenclatura destes includes é dada em função do seu grau de reutilização: Quando um include é apenas utilizado por um mesmo programa/procedimento. Exemplo:cdp/cd9500. Include com view-as de campos para o dicionário de dados São includes que incorporam a definição do view-as de campos indicadores com tipo de dado inteiro. Exemplo: cep/ce9000. .i para cdp/cd0206. Quando um include é utilizado por vários programas de um mesmo módulo. conforme o objetivo do include. i1.i. também. As extensões dos includes devem ser sempre . obedecem a algumas regras de nomenclatura.i9.w.i..i ou .i para advwr/v01ad102.

e o seu nome de arquivo iniciar por "i-" mais um nome significativo.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 27 Includes padrões Os includes padrões dos Estilos devem ser depositados no diretório include. pois dificilmente são realizados tratamentos nos programas para este tipo de widget. Widgets O padrão de nomenclatura adotado é um prefixo que identifique o widget mais um nome significativo. Exemplo: include/i-rpini. Variáveis Datasul-EMS 2. que indique o estilo ou a função. conforme tabela a seguir: Tipo de dado Prefixo Exemplo Caracter c- c-conta Inteiro i- i-contador Data da- da-atualizacao Decimal de- de-total-geral Handle h- h-acomp Lógico l- l-ativo . A tabela de prefixo é apresentada a seguir: Widget Prefixo Exemplo Botão bt- bt-ok Browse br- br-zoom Combo-box cb- cb-tipo-conta Fill-in fi- fi-texto Radio-set rs- rs-modo-execucao Retângulo rt- rt-moldura Selection-list ls ls-estados Slider sl sl-percentual Toggle-box tb tb-ativo Observação O padrão para nome de retângulo não é importante.i.00 Quando uma variável não for um widget o seu tipo de dados determina o prefixo que deve ser utilizado para nomear as variáveis.

3 Nome que qualifica a variável V_cod_fornec Outros componentes da linguagem Progress Componente Prefixo Exemplo Buffer de Tabela b- b-item Frame f- f-cad Parâmetro p- p-rw-emitente Stream s- s-import Temporarytable tt- tt-param Siglas de países Será utiliza a norma ISO 3166-1 para definição das siglas dos países.00 A nomenclatura de variável é formada de acordo com a seguinte regra:  v_tipo de atributo_qualificador Tipo de Atributo Qualificador Exemplo Conforme tabela no item 4. A norma ISO 3166-1 pode ser consultada em http://pt.Raw raw- raw-param Rowid rw- rw- Widget-handle wh- wh-botao Datasul-HR 1.org/wiki/ISO_3166-1 Será utilizada sempre a sigla de três letras: Num Alfa-3 Alfa-2 Pais 32 44 68 76 124 152 170 188 192 222 218 ARG BHS BOL BRA CAN CHL COL CRI CUB SLV ECU AR BS BO BR CA CL CO CR CU SV EC 840 USA US Argentina Bahamas Bolívia Brasil Canadá Chile Colômbia Costa Rica Cuba El Salvador Equador Estados Unidos da América .wikipedia.

Sigla do Módulo 9 . .W.Número seqüencial dentro do Módulo. temos todas as posições (oito) tomadas pelo próprio nome do arquivo.Fixo NNN . nos programas de Zoom (z99xx999). Nestes programas. Estes subprogramas podem ser reutilizados. estes subprogramas devem ter a seguinte nomenclatura: XX9NNN. narrativas. Nestes casos.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 29 308 320 328 388 484 558 591 600 604 630 858 862 GRD GTM GUY JAM MEX NIC PAN PRY PER PRI URY VEN GD GT GY JM MX NI PA PY PE PR UY VE Grenada Guatemala Guiana Jamaica México Nicarágua Panamá Paraguai Peru Porto Rico Uruguai Venezuela Nomenclatura para Caixas de diálogos em programas de Zoom e SmartBrowser Principalmente. quando necessitamos janelas para filtros. etc. onde: XX . Adapters A estrutura de diretórios e o nome dos adapters devem ser definidos com o seguinte padrão: Diretórios: adapters/[nome do parceiro]/[cicla do módulo – 3 dígitos]. Não lemos como criar um subprograma para o programa de Zoom.

p Exemplo: adapters/neogrid/ccp/anecc102.2 dígitos][inteiro seqüencial .adapter Neogrid do módulo de compras .p .3 números].2 dígitos][sigla módulo .Nome: a[sigla do parceiro .

Exemplo: Tela de um programa de zoom. Exemplo: Tela de um programa de cadastro. normalmente em funções de grande risco aos sistemas. a idéia é simular a visualização de um dialog-box. Nestas caixas existe uma régua de botões disposta na parte de baixo da caixa. Janela Detalhe São consideradas janelas detalhe ou filhas aquelas que são chamadas a partir de janelas mestre para realização de funções de um programa.00.31 CAPÍTULO 4 Layout de Telas Tipos de Telas (janelas) Janela Mestre São consideradas janelas mestre aquelas que são a base dos programas chamados a partir do menu do Datasul-EMS 2. uma régua de botões no topo da janela que disponibilizam as funções existentes naquele programa. sendo que se caracterizam pela existência de um menu de barra. e possuem moldura (resizeable). Exemplo: Programa de Cálculo do Preço Médio. não possuem moldura (resize = no). . Como diferenciação. Estas janelas não possuem menu de barra e a régua de botões fica na parte de baixo da tela. Caixas de Diálogo Caixas de diálogo são utilizadas em funções onde é imprescindível que a interface seja modal.

15 ou 20 unidades de caracter. Incluir.32 Observação Não é aconselhável salvar uma Dialog com uma Window aberta. Objetos Combo-boxes Ver capítulo Como implementar campos indicadores com view-as combo-box nas telas. Modificar. Quando isto é feito.  largura: 10.  botão 'OK' sempre confirma a ação e sai da tela corrente. Botões  os botões com label devem ter:  altura: 1. Retângulos São utilizados para agrupar a chave de acesso das telas..00 unidade de caracter. excepcionalmente. é possível que o menu da Window seja copiado para a Dialog eliminando-o..i. emoldurar itens de radio-set e emoldurar editores que necessitem de label. Eliminar .. Fill-in´s  os campos e variáveis view-as fill-in devem ter altura de 0. Exemplo: Cancelar.  os botões de 'Sair' e 'Ajuda' devem estar sempre no canto superior direito nas janelas pai. os campos e variáveis view-as combo-box tem a altura de 1.88 unidade de caracter. agrupar campos de um mesmo assunto.00 unidade de caracter.  botão 'Cancelar' não confirma a ação e sai da tela corrente. Frames(Telas)  título das telas é feito a partir do UT-9000. Caso isto aconteça é necessário recriar a Dialog e o menu da Window.  botão 'Ajuda' sempre é disposto no canto inferior direito nas janelas detalhe e caixas de diálogo.  quando representarem ações e possuírem labels estes termos devem ser verbos no infinitivo. . não necessitando intervenção do programador.

Radio-Sets  não podem possuir label. estas dimensões acompanham o limite para VGA. não deve ser colocado qualquer literal ou texto para identificá-lo. sendo que este tamanho é sempre fixo. mas sempre em número inteiro.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 33  as telas podem ter no máximo 90 colunas. sendo que maiores que 7 itens devem ser combo-boxes. e o fonte deve ser escolhido o "2". já este tamanho pode ser variável para menos. Estas dimensões devem ser informadas na "Property Sheet" da janela no UIB. devido ao UIB. Editores  não podem possuir label. . por isso devem ser emoldurados por um retângulo com uma literal para identificá-lo. Ver capítulo: Como implementar labels em retângulos utilizando o dicionário de dados. padrão do Progress. que é o próprio label.  definida a altura e largura de uma janela. deve-se no UIB. Com isso as janelas podem possuir a moldura dada pela propriedade RESIZEABLE. devido à limitações do UIB. Caso contrário. atribuir ou utilizar as seguintes propriedades (Property Sheet): RETURN-INSERTED. emoldurá-lo com um retângulo e dispor uma literal para identificá-lo. por 17 linhas. prevalecendo o modo vertical quando o número de itens for maior que 4.I faz estas atribuições.  em View-as Editor. que represente comentário ou narrativa. então quando a tabela possui apenas um editor. que é um fonte fixo. nos campos "Width" e "Height". as mesmas dimensões devem ser utilizadas para as propriedades MAX-WIDTH-CHARS e MIN-WIDTHCHARS (altura máxima e mínima) e MAX-HEIGHT-CHARS e MINHEIGHT-CHARS (largura máxima e mínima) (isto deve ficar num include padrão). Exemplo:  podem ser horizontais ou verticais. O include WIN-SIZE.

também devem possuir a mesma imagem. tal como um SmartViewer ou SmartBrowser. SmartViewer SmartViewer é uma procedure object. utilizando um browse. O SmartViewer deve ter um distanciamento de uma linha após e uma linha antes de outros objetos na sua localização. é usado para a tradução dos fontes dos templates para outros idiomas. Um SmartViewer tipicamente preenche registros da base de dados desde um SmartQuery ou SmartBrowser.º de campos. Considerações sobre as Imagens WebEnabler WebEnabler é um produto que disponibiliza o DATASUL EMS 2. pois o WebEnabler sendo um produto voltado para a Web só irá suportar os padrões da mesma quanto as imagens. como o Internet Explorer. EMS 5 e HR através de um Web Browser. Na tela de características da "Query Builder".Recomendações Considerações sobre os SmartObjects SmartBrowser SmartBrowser é um objeto Procedure que recupera e visualiza dados. Durante a montagem. como mesmo nome no formato GIF (. Este identificador não afeta em nada a funcionalidade do programa. visualiza os campos da base de dados.bmp). O nome padrão do Browse não deve ser modificado.gif). . Um SmartQuery preenche tipicamente registros para outro SmartObjects. SmartQuery SmartQuery é uma procedure object que contém uma base de dados query. Um SmartQuery pode também responder a pedido de navegação de um SmartPanel. o qual. Observação: O identificador :T no início de alguns comentários. o campo "Returned" deve ser alterado de "All Fields" para "Fields Used". em "Options". o tamanho do SmartBrowser deve ser mantido padrão não importando o n. Assim sendo todos as telas que utilizam imagens. normalmente no formato Bitmap (.

passando por todos os campos de uma coluna para depois passar para a outra coluna.  os campos devem estar alinhados pelo colon e formando colunas. .  o menu de barra da janela contém todas as opções disponíveis através dos botões dispostos na tela. com exceção do zoom e do 'vá para'.Características 35 CAPÍTULO 5 Estilos Cadastro Simples  todas as funções.  a tabulação deve ser de cima para baixo nos campos. são realizadas na própria tela base do programa.

que não estejam contempladas na palette padrão de navegação e atualização devem ser representadas por botões e itens no menu de barra.  menu de barra tem a seguinte configuração: Arquivo Primeiro Ajuda Ctrl-Home Conteúdo Sobre Anterior Ctrl-Left Próximo 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 .36  novas funções.  não é permitida a alteração da chave da tabela através da função 'Alterar'. quanto aos botões é sugerido que sejam dispostos junto à régua de botões no topo da janela (antes do botão de 'Consultas Relacionadas').  a função 'Eliminar' deve pedir confirmação.

Possui porém. Quando utilizar o Cadastro Complexo  deve ser usado sempre que o número de campos de uma tabela não couberem em uma única viewer.Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 37 Cadastro Complexo  menu de barra tem a mesma configuração demonstrada na tela de Cadastro Simples. . folders que permitem a utilização de mais de uma viewer.

'Copiar'. sem as funções de 'Incluir'. 'Eliminar'. como disposto no Cadastro Simples.Atualiza  o menu de barra da janela contém apenas as opções para Atualizar.Características Cadastro Simples . .

Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 39 Cadastro Complexo .Atualiza.Atualiza  tem as mesmas características do Cadastro Simples . . porém possui mais de uma viewer e está disposto em folders.

 a tabulação deve ser de cima para baixo nos campos. Quando utilizar Pai x Filhos .  novas funções.Características Pai x Filhos . .Atualiza Filho É feita a navegação na tabela pai e a manutenção é executada somente no campo selecionado da tabela filho. passando por todos os campos de uma coluna para depois passar para a outra coluna.Atualiza Filho  os campos devem estar alinhados pelo colon e formando colunas.  o menu de barra da janela contém todas as opções disponíveis através dos botões dispostos na tela. que não estejam contempladas no palette padrão de navegação e atualização devem ser representadas por botões e itens no menu de barra. selecionar browsers de tabelas filho. as opções 'Incluir' e 'Modificar'.  Incluir. para modificação pode se selecionar 'Modificar' para abrir uma janela.  o 'Folder' tem como objetivo. Modificar e Eliminar serve apenas para manutenção da(s) tabela(s) filho. chamam janelas semelhantes ao Cadastro Simples ou Complexo (sem a régua). quanto aos botões é sugerido que sejam dispostos junto à régua de botões no topo da janela (antes do botão de 'Consultas Relacionadas').

 o botão de 'Ok' tem função igual tanto para chamada do programa.  o botão de 'Salvar'. possui função de salvar o registro corrente e criar um registro novo. 'Cancelar' e 'Ajuda'.  o botão 'Ajuda' é responsável por chamar o help do programa. anula qualquer mudança feita no registro corrente do programa. cancela apenas a última inclusão ou a última alteração. para inclusão. quando o programa é chamado para inclusão.  o botão 'Cancelar'. é chamada a partir de um programa Pai x Filho. a janela é a mesma tanto para inclusão quanto para alteração. 'Salvar'. quanto para modificação.  a janela possui quatro botões: 'Ok'.Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 41 Manutenção de Filhos  é uma janela sem painéis. podendo possuir ou não folders de acordo com a necessidade. . ou seja.

que não estejam contempladas na palette padrão de navegação e atualização. 'Modificar' e 'Copiar. as opções 'Incluir'. além de que a atualização não só é feita no Folder como no registro pai. Modificar e Eliminar serve para manutenção da(s) tabela(s) filho. chamam janelas semelhantes ao Cadastro Simples ou Complexo (sem a régua).  as opções 'Incluir' e o 'Modificar'. devem ser representadas por botões e itens no menu de barra. Eliminar e Copiar serve apenas para manutenção da tabela pai.  o menu de barra da janela contém todas as opções disponíveis através dos botões dispostos na tela.  novas funções. quanto aos botões é sugerido que sejam dispostos junto à régua de botões no topo da janela (antes do botão de 'Consultas Relacionadas').Atualiza Ambos  tem as mesmas características da tela Pai x Filho . .Atualiza Filho. Modificar.  Incluir.Caraterísticas Pai x Filhos . chamam janelas semelhantes ao Cadastro Simples ou Complexo (sem a régua).  Incluir.

'Cancelar' e 'Ajuda'.Caraterísticas APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 43 Manutenção de Pais  é uma janela sem painéis.  o botão de 'Ok' tem função igual tanto para chamada do programa.  a janela possui quatro botões: 'Ok'. de acordo com a necessidade. para inclusão. podendo possuir ou não folders. 'Salvar'. quando o programa é chamado para inclusão. a janela é a mesma tanto para inclusão quanto para alteração ou cópia.  o botão 'Ajuda' é responsável por chamar o help do programa. quanto para modificação. .  o botão 'Salvar'. possui função de salvar o registro corrente e criar um registro novo. é chamada a partir de um programa Pai x Filho.

são realizadas na própria tela base do programa. .Características Consulta Cadastral Simples  as funções com exceção do zoom e do 'Vá para'. apenas para consulta.  o menu de barra da janela contém as opções disponíveis através dos botões dispostos na tela.

apenas para Consulta. com o objetivo de selecionar as demais viewers da tabela. com exceção do zoom e do 'Vá para'. são realizadas na própria tela base do programa. além do botão de 'Relacionamento'.  as funções.Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 45 Consulta Cadastral Complexa  além das mesmas características da tela de Consulta Cadastral Simples.  o menu de barra da janela contém as opções disponíveis através dos botões dispostos na tela. tem um 'Folder'. .

 as funções de navegação. onde um browser apresenta os registros relacionados da tabela filho com o corrente registro da tabela pai.  acima do folder. representado por um duplo clique ou por um pressionar na barra de espaços. o evento default-action sobre estes browsers. posicionando-se no registro corrente no browser.Características Consulta Relacionamento  o objetivo é apresentar os relacionamentos de uma determinada tabela. . é um atalho para botão 'Detalhar'.  cada browser de apresentação dos relacionamentos deve possuir um botão 'Detalhar'.  menu de barra da janela contém todas as opções disponíveis na barra de botões disposta no topo da tela. ficam dispostos os principais campos da tabela pai (normalmente. a chave primária e alguma descrição). cuja função é chamar a consulta cadastral da tabela filho. isolados por um retângulo.  em cada página do folder é apresentado um relacionamento (tabela filho) da tabela. denominada tabela pai. 'Vá para' e 'Pesquisa' se aplicam sobre a tabela pai.

Fechamentos 47 .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas Relatórios. Cálculos.

Características  é uma janela do tipo detalhe. estão demonstrados os folders de Seleção.  Seleção: tudo que é faixa.  o botão 'Ajuda' é responsável por chamar o help do programa.  o 'Fechar' do frame sai da tela.  Digitação: browse updatable.  o botão 'Executar' tem como função executar toda a parametrização realizada nos Folders.  Classificação: Radio-se com as opções. isto é. A seguir. Parâmetros e Digitação: . simulando uma caixa de diálogo. as outras informações que o usuário digita. sem menu de barra emoldura. Classificação.  Parâmetros: com exceção da faixa.

APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 49 .

.

Parâmetros Múltiplos Seguir as mesmas regras dos Cadastros Simples ou Complexo.  o default-button do frame é o botão de 'Ok'.  o botão 'Imprimir' é responsável por chamar o browse dos relatórios relacionados. dependendo do número de campos. Exemplo: Parâmetros por estabelecimento. sem menu de barra e moldura.  o cancel-button do frame é o botão de 'Cancelar' que sai da tela. que confirma a escolha do usuário. simulando uma caixa de diálogo.Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 51 Parâmetros Únicos  é uma janela do tipo detalhe. . isto é.  o botão 'Ajuda' é responsável por chamar o help do programa.

 novas funções. remove dados do Browse de formação.Características Formação  este estilo de formação possui o palette de navegação.  o botão 'Deletar'  o botão 'Modifica' chama o programa de atualização dos atributos.  o botão 'Incluir' outras 2 tabelas.  os campos devem estar alinhados pelo colon e formando colunas. . quanto aos botões é sugerido que sejam dispostos junto à régua de botões no topo da janela ao lado esquerdo do botão 'Consultas Relacionadas'. portanto o programa é independente.  o menu de barra da janela contém todas as opções disponíveis através dos botões dispostos na tela. que não estejam contempladas na palette padrão de navegação e atualização devem estar representadas por botões e itens no menu de barra. que é uma janela semelhante ao Cadastro Simples ou Complexo (sem a régua). . adiciona no Browse de formação os dados de . não sendo necessário um programa principal para sua chamada.

 os campos devem estar alinhados pelo colon e formando colunas. portanto o programa é dependente.Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 53 Formação sem Navegação  este estilo de formação não possui o palette de navegação.  botão 'Modifica' chama o programa de atualização dos atributos.  botão de 'Incluir' outras 2 tabelas. adiciona no Browse de formação os dados de  botão de 'Deletar' . .  novas funções. quanto aos botões é sugerido que sejam dispostos junto à régua de botões no topo da janela ao lado esquerdo do botão 'Consultas Relacionadas'. remove dados do Browse de formação. sendo que ele deve ser chamado por um programa que possua um Browser Formação. .  menu de barra da janela contém todas as opções disponíveis através dos botões dispostos na tela. que não estejam contempladas na palette padrão de navegação e atualização deve estar representadas por botões e itens no menu de barra.

.  no folder de "Parâmetros" é determinado o nome do arquivo de entrada contendo registros a serem importados no formato do Layout. Parâmetros e Log. contém ainda a determinação do modo de execução do mesmo.  o botão 'Executar' tem como função disparar a importação que foi parametrizada nos folders.  no folder de "Layout" é mostrado o layout do arquivo a ser importado. sem menu de barra e moldura.  possui quatro folders: Layout.  na página de "Log" é determinado o nome do arquivo de saída que deve gerar uma lista com todos os registros que forem importados ou somente os rejeitados. simulando uma caixa de diálogo.  o botão 'Editar Layout' permite que seja editado o arquivo de layout através de um editor de texto. Seleção.  no folder de "Seleção" é determinada a faixa dos registros que são importados. isto é.Características Importação  é uma janela do tipo detalhe.

Seleção e Parâmetros: .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 55 A seguir estão demonstrados os folders de Layout.

Exportação .

Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 57  é uma janela do tipo detalhe.  o botão 'Executar' tem como função disparar a exportação que foi parametrizada nos folders. Parâmetros e Log. isto é.  o botão 'Editar Layout' permite que seja editado o arquivo de layout através de um editor de texto.  a página de "Log" contém a determinação de modo de execução do mesmo. simulando uma caixa de diálogo. A seguir são mostrados os folders de Layout.  no folder de "Seleção" é determinada a faixa dos registros que serão exportados. Seleção.  no folder de "Parâmetros" é determinado o nome do arquivo de saída que é exportado no formato do Layout.  no folder de Layout é mostrado o layout do arquivo a ser exportado.  possui quatro folders: Layout. sem menu de barra e moldura. Seleção e Parâmetros: .

.

 cancel-button do frame é o botão de 'Cancelar' que sai da tela.  ao lado do botão 'Implantar' que é padrão. devem ser colocados os botões específicos de cada programa de zoom. . por exemplo: Narrativa.  cada folder representa uma opção de classificação disponível no zoom.. Texto Livre. simulando uma caixa de diálogo. normalmente estes botões chamam caixas de diálogo. que pode estar desativado dependendo do programa chamador. Filtro. isto é.Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 59 Zoom de Tabelas  é uma janela do tipo detalhe. retornando ao programa chamador porém sem retornar um registro escolhido. sem menu de barra e moldura. etc..  o botão 'Implantar' é responsável por chamar o programa de cadastro da tabela.  default-button do frame é o botão de 'OK'..  o botão é responsável pela aplicação do valor inicial e final definido pelo usuário sobre a query apresentada no browse. que confirma a escolha do usuário.

sendo que o botão de 'Ok' é o default-button.. conforme a classificação. Vá Para para acessá-la. não devem ser utilizadas literais em tela para denominar inicial e final. O Zoom não tem os botões de INÍCIO e de FIM (como no MAGNUS antigo).  é aberta uma pequena caixa de diálogo com os botões de 'Ok' e 'Cancelar' e 'Ajuda'. evitando que o usuário tenha que navegar sobre os registros ou acionar o zoom.. independentemente do número de campos para a faixa: Label do campo: [valor inicial]  .. [valor final].... Caso isto aconteça é necessário recriar a Dialog e o menu da Window. para substituir as características destas funções.  para utilizar esta tabela. logo se utiliza o teclado: "HOME" e "END".. quando o usuário tem o conhecimento da chave do registro.  não tem possibilidade zoom. o que possibilita ao usuário digitar a chave e apenas teclar "Enter" para confirmar a tela. é possível que o menu da Window seja copiado para a Dialog eliminando-o.. Quando isto é feito. usar o  o objetivo é permitir um reposicionamento rápido do registro corrente no cadastro..  para utilizar o 'Pesquisa'..Características  os iniciais e finais devem ser apresentados no formato.. se isto for necessário inverter a ordem dos campos.. Observação Não é aconselhável salvar uma Dialog com uma Window aberta.. . usar o para acessar. Observação Verificar se cada folder tem um browser diferente ou não..

 as páginas iniciais são reservadas para as informações genéricas.  cancel-button do frame é o botão 'Cancelar' que sai da tela sem considerar as informações. simulando uma caixa de diálogo.Características APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 61 Digitação Rápida  é uma janela do tipo detalhe. que efetiva a transação.  default-button do frame é o botão 'Ok'. Painéis Estes são os painéis padrão mais utilizados para navegação. isto é. sem menu de barra e moldura.  a última página é reservada para o browser. .

chama o relatório selecionado no browser.  o botão 'Executar'. Para utilizar a função de "Relatórios Relacionados". chama a consulta selecionada no browser. . usar o para acessar.Características Funções Relatórios Relacionados  chama um Browser que lista todos os relatórios relacionados ao programa que está sendo executado.  o botão 'Executar'. Consultas Relacionadas  chama um Browser que lista todas as consultas relacionadas ao programa que está sendo executado. Para utilizar a função de "Consultas Relacionadas". usar o para acessar.

{utp/ut-field. etc.i mgadm conta tipo 1} .i <banco> <tabela> <campo> <propriedade>} Onde: <banco>: nome lógico do banco de dados que contém o campo <tabela>: nome da tabela que contém o campo <campo>: nome do campo <propriedade>: número que identifica a propriedade conforme tabela a seguir: Número Propriedade 1 Label 2 Column-Label 3 Help 4 Format 5 Initial 6 Description 7 Data Type O retorno é obtido através do return-value. {utp/ut-field..Utilização Objetivo 63 CAPÍTULO 6 Includes e Utilitários Padrão UT-FIELD. como label. Exemplo: def var c-tipo as character no-undo. column-label.I Retornar propriedades dos campos do dicionário de dados.

através do recurso de RPC (Remote Procedure Call). Deve executar apenas programas (.io} no main-block.p.w).p).W e que este programa seja candidato para ser executado via RPC.p). como por exemplo um programa de impressão de relatórios xxp/xx9999rp. a partir de um outro programa (. UT-RTLBL.I Seu objetivo é executar programas que não possuam interface (. chamados a partir de programas (. já está rodando no servidor (Application Server) e não é necessário iniciar um novo servidor. Não deve chamar um programa (.i <banco> <tabela> <campo> <widget fill-in>} Onde: <banco>: nome lógico do banco de dados que contém o campo <tabela>: nome da tabela que contém o campo <campo>: nome do campo <widget fill-in>: fill-in view-as text colocado na tela Exemplo: {utp/ut-rtlbl.  literais utilizados em telas para substituir labels.  campos view-as radio-set ou editor. {utp/ut-rtlbl.p).p). Nota Para utilizar os includes é necessário relacionar ao programa os includes {utp/ut-glob.i} e {btb/btb008za.Formato Utilização Objetivo 64 assign c-tipo:label in browse br-table = return-value. onde seja necessário emoldurá-lo com retângulo com um label para identificá-lo. tem-se: Modelo Simplificado .p).i mgadm conta natureza text-1} UT-RUN. Sempre que for chamado algum programa sem interface a partir de um . porque o programa chamador (. Para a chamada de rotinas via RPC. para definição de variáveis e funções.I Permitir a utilização de literais para colar labels em retângulos na tela minimizando os problemas de internacionalização.

i2 {1} {2} {3}} Onde: . input-output table tt-erro.p "input-output table ttmvto. 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. quando solicitada ({3} = yes).  dispara a execução do programa no servidor. Funções  solicita a conexão e cria a instância do servidor. Não sendo informados os parâmetros opcionais estes receberão "yes" e "" ' ' respectivamente. utilize aspas duplas ("") com aspas simples (''). de conexão).i cep/ceapi001. Exemplo: {utp/ut-run.i {1} {2} {3} {4}} Onde: {1}: nome externo do programa {2}: parâmetros do programa {3}:mostra mensagem de acompanhamento [Opcional] {4}: servidor de RPC determinado [Opcional] Nota Para informar parâmetros em branco ou literal. conforme servidor do aplicativo ou parâmetro. Exemplo: "" ' '.  mostra mensagem se ocorrer um erro (por exemplo.  encerra a conexão e elimina a instância.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 65 Include {utp/ut-run. Aplicações Quando o programa API será disparado uma única vez para realizar todo o processo.

Considerações Exemplo Gerais {1} = nome externo do programa {2} = parâmetros do programa {3} = nome da variável do tipo "handle" para executar o programa persistente [Opcional] {btb/btb008za.p "input tt_movto.i3 cep/ceapi001.p "h-handle"} Nota Existe a API BTAPI008 que possui funções que podem ser utilizadas no desenvolvimento.  encerra a conexão e elimina a instância. output tt_erro" "h-handle"} end.  dispara a execução do programa.i1 cep/ceapi001. será utilizado o servidor RPC definido no aplicativo do programa.i3 {1} {2}} Onde: {1} = nome externo do programa {2} = nome da variável do tipo "handle" utilizada para eliminar a procedure persistente [Opcional] Funções Idênticas ao Modelo Simplificado. .p yes "rpc-test"} for each cta_ctbl no-lock: /* Prepara tt_movto */ {btb/btb008za. Caso não seja informado nenhum servidor RPC. {btb/btb008za.. Se o processo estiver sendo executado via RPW e o servidor RPC não foi informado o programa será executado On-line. {btb/ btb008za. def var h-handle as handle no-undo.. porém distribuídas em três includes:  solicita a conexão e cria a instância do servidor. for each. Aplicações Quando o programa API é disparado n vezes dentro de um laço (repeat.i2 cep/ceapi001.).

estes serão retornados juntamente com a mensagem 16435 (*). Dados: Nome Programa: btb/btb923za. Existe e Executa RPC =yes Informado e Inexistente No Retorna mensagem 16433(*) Existe e Executa RPC =yes Não Informado e Yes Inexistente Exibe mensagem 16432(*) via PIA_STATUS_ERROR. empresa do usuário. as informações como usuário corrente. Quando for informada a variável do tipo "handle" para a include btb/btb008za. caso ocorra algum erro não será possível a execução On-line.i2.Parâmetros X Compor tament o APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 67 Quando informado valor parar servidor RPC.p Sintaxe: run btb/btb923za.p (<versão_integração>. E segundo. Inexistente - No Retorna mensagem 3045(*) Existe e Executa RPC =no - Yes Exibe mensagem 16431(*) via PI_STATUS_ERROR. por exemplo). Logo. Existe a API que transporta o conteúdo das variáveis de ambiente do Datasul_EMS da sessão client para a sessão do application server (remota) quando o programa solicita a execução de determinado programa via RPC (Remote Procedure Call). estarão disponíveis na sessão remota.i3. grupos de segurança em que o usuário se encontra. <handle_application_server>) Programa Servidor RPC Mensagem Comportamento Inexistente - Yes Exibe mensagem 3045(*) via PI_STATUS_ERROR.. deve-se tomar dois cuidados: Primeiro.. Existe e Executa RPC =no Existe e Executa RPC =no Existe e Executa RPC =yes Informado No Retorna mensagem 16431(*) Não Informado No Executa ON-LINE Informado e Inexistente Yes Exibe mensagem 16433(*) via PI_STATUS_ERROR. ao final da execução. Existe e Executa Não Informado e No Executa ON_LINE . deve-se eliminar o programa persistent passando o nome da variável para a include btb008za. Ocorrendo erros na tentativa de execução do programa (faltou passar parâmetros. esta variável deve estar previamente definida no programa.

Existe e Disponível No Executa via RPC (***) Existe e Executa RPC =yes Não Informado. (***) Ocorrendo erros na conexão do servidor RPC.RPC =yes Inexistente Existe e Executa RPC =yes Informado.Servidor RPC não cadastrado 16434 .Não foi possível executar programa ! (**) Ocorrendo erros na conexão do servidor RPC. Existe e Não disponível No Executa ON-LINE Existe e Executa RPC =yes Informado. Existe e Disponível Yes Executa via RPC (**) Existe e Executa RPC =yes Não Informado. será executado ON-LINE (*) Mensagens: 3045 . Existe e Não disponível No Retorna mensagem 16434(*) Existe e Executa RPC =yes Não Informado. Existe e Disponível Yes Executa via RPC (**) Existe e Executa RPC =yes Informado. estes serão exibidos em tela juntamente com a mensagem 6160. .Não foi possível executar o programa via RPC ! 16431 .Não foi possível encontrar servidor RPC para programa '&1' ! 16433 .Programa não pode ser executado via RPC 16432 . estes serão retornados juntamente com a mensagem 6160.Programa não cadastrado no menu ! 6160 .Servidor RPC não disponível 164 35 . Existe e Não disponível Yes Exibe as mensagens 16434(*) via PI_STATUS_ERROR Existe e Executa RPC =yes Não Informado. Existe e Disponível No Executa VIA RPC Observação Ocorrendo erro na conexão do Servidor RPC.

Da mesma forma. no Sistema de Mensagens.P Apresentar para o usuário uma mensagem previamente cadastrada.  antes da exibição de qualquer mensagem. <parâmetros>: são os campos.Formato Utilização Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 69 UT-MSGS. possui uma mensagem substituta e assim por diante. os números da mensagem original e da mensagem substituta serão exibidos na barra de títulos da caixa de diálogo. Cada um dos parâmetros deve ser separado por "~~" como por exemplo: . ou ainda. Notas:  ao ser exibida uma mensagem. conforme a tabela a seguir: Ação Resultado show Apresenta a mensagem.  quando da exibição de mensagens substitutas.  impressão de mensagens em log´s. Advertência.p (input <ação> input <número da mensagem> input <parâmetros>).  apresentação da pilha de execução dos programas até o ponto de chamada da ut-msgs. se houver. tabelas e outras palavras que se deseja colocar na mensagem no momento de sua utilização. será verificado se ela possui uma substituta. run utp/ut-msgs.  apresentação de mensagens de erro. Informação ou Questão) codtype Retorna o código do tipo da mensagem <número da mensagem>: número da mensagem desejada. através do botão “trace”. onde 134 seria a mensagem exibida e 354 a mensagem original. Ex. Onde: <ação>: ação desejada. retornar para o programa propriedades desta mensagem. seu número vai ser exibido na barra de título da caixa de diálogo.(354). com texto de ajuda no padrão do produto msg Retorna o texto da mensagem help Retorna o texto de ajuda type Retorna o tipo da mensagem (Erro. informação. antes da exibição da mensagem substituta. juntamente com o tipo de mensagem. será verificado se esta também.: Pergunta: (10). advertência ou questionamentos ao usuário. a mensagem substituta será exibida ao invés da original. Exemplo: Advertência: (134) .

1. input 1235. input repres.i {1} {2}} Onde: {1}: indica a função a ser realizada. assim como a inclusão de novas mensagens só pode ser realizada pela Datasul.I.val-minimo). A manutenção do cadastro das mensagens.I E IND51500. Para acessar o Sistema de Mensagens. 2. Mensagem não Cadastrada. IND11-50.I Viabilizar a utilização de combo-boxe´s e radio-set´s com representação para campos inteiros do tipo indicador.p (input "show". Quando a opção codtype é usada o retorno pode ser: 0. conforme tabela abaixo: Função Objetivo 01 define view-as combo-box 02 define view-as radio-set 03 lista com os itens separados por vírgula 04 n Retorna o item n da lista 05 Retorna o número de itens da lista . Mensagem de Advertência 3.cod-regiao + "~~" + string(regiao. {include/ind01-10.cod-repres + "~~" + regiao.Formato Utilização Objetivo Observações Exemplo input "campo~~" + variável + "~~tabela". Nos includes de dicionário de dados criados para cada campo indicador. run utp/ut-msgs. Informação IND01-10. Pergunta 4. Para clientes e parceiros é autorizada somente a utilização das mensagens já cadastradas. você deve primeiro entrar em contato com a equipe de ADF e solicitar a criação de um usuário no Sistema de Mensagens. Em seguida você pode acessar o Sistema pelo endereço: X:\Atalhos\SistTec\Mensagem. Mensagem de Erro.

 para utilização de literais ou textos nas telas com função de label.I Retornar propriedades das tabelas do dicionário de dados.  nos SmartBrowsers ou Browsers para por label em campos calculados. isto é.i <banco> <tabela> <propriedade>} Onde: .i * Campo: tipo-cod-situacao *******************************/ {include/i-lgcode. {utp/ut-table. /****************************** * Include: i01un001.Formato Utilização Objetivo Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 71 06 item retorna a posição do item (número) 07 retorna valores para a propriedade radio-buttons {2}: utilizado quando a função necessita de um segundo parâmetro. como no retângulo que envolve o radio-set. nas opções 04 e 06.i {01} {02}} /* Fim */ UT-TABLE.i} &IF "{&LANGUAGE-CODE}" = "POR" &THEN &global val1 Erro &global val2 Advertência &global val3 Pergunta &global val4 Informação &ENDIF &IF "{&LANGUAGE-CODE}" = "ESP" &THEN &global val1 Erro &global val2 Advertencia &global val3 Pregunta &global val4 Información &ENDIF &IF "{&LANGUAGE-CODE}" = "ING" &THEN &global val1 Error &global val2 Warning &global val3 Question &global val4 Information &ENDIF {include/ind01-10.

se omitido a literal deve ter o contexto universal de tradução. UT-LITER. conforme tabela abaixo. cadastrando automaticamente as literais utilizadas no programa e retornando a tradução da literal no idioma corrente do banco de dados. {utp/ut-liter.i <literal> <modulo contexto> <alinhamento>} Onde: <literal>: Literal a ser utilizada na tela com os espaços substituídos por "_" (undescore). se omitido deve reservar o espaço à esquerda da literal: Tipo Alinhamento L A esquerda C Centralizado R A direita . <módulo contexto>: parâmetro opcional que define o contexto de tradução da literal. este contexto é um módulo do Datasul-EMS.i mgadm conta 1} assign c-tipo:label in browse br-table = return-value. {utp/ut-table.I Utilizar o cadastro de literais do Datasul-EMS. Exemplo: def var c-tipo as character no-undo. que é representado pelo valor * (asterisco) <alinhamento>: parâmetro opcional que define onde é incrementado o espaço extra para tradução.: Se a literal passada terminar com “:U” a literal não será traduzida e a mesma será retornada sem os dois últimos caracteres.  em todos os lugares onde literais passíveis de tradução forem apresentadas na interface do programa. OBS.Formato Utilização Objetivo <banco>: nome lógico do banco de dados que contém o campo <tabela>: nome da tabela que contém o campo <propriedade>: número que identifica a propriedade conforme tabela abaixo: Número Propriedade 1 File-Label 2 Dump_Name 3 Desc O retorno é obtido através do return-value.

p (input "MIN". find first param-global no-lock no-error. Assign c-conta-ini = return-value.i Lista_Narrativa MCE R} assign l-lista-narra:label in frame {&frame-name} = return-value. cujo formato é variável.Exemplo de Formato Utilização Objetivo variávei s definida s APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 73 O retorno é obtido através do return-value. i-ep-codigo-usuario: contém a empresa corrente do usuário. Onde: <opção>: indica o limite desejado.p (input <opção>. run utp/ut-limit. cálculos. def var c-conta-ini as char no-undo. <formato>). atualizações e zooms que tenham faixas de seleção sobre campos caracter com formato variável. Já está definido dentro dos SmartObjects. para habilitar o botão implanta. UT-LIMIT. UT-GLOB. Na seleção de relatórios. .P Determinar o valor inicial e final de campos caracter. formato-conta-contabil). run utp/ut-limit. MIN = Mínimo e MAX = Máximo <formato>: formato do campo caracter O retorno é obtido através do return-value. l-implanta: variável lógica usada no Zoom. input param-global. Exemplo: def var l-lista-narra as character no-undo. como por exemplo a conta-contábil. c-seg-usuario: contém o nome do usuário corrente logado no menu.I Define as variáveis globais. {utp/ut-liter.

I Converter strings acentuadas e caracteres especiais para strings não acentuadas e caracteres simples. Onde: <variável>: variável que irá armazenar o valor do retorno da função fn-freeaccent <string>: string acentuada a ser convertida. Importação.i} assign <variável> = fn-free-accent("<string>").P Este utilitário deve ser usado sempre que o usuário tiver que informar um diretório. UT-DIR. Onde: <título>: título para a caixa de diálogo para selecionar diretórios <pasta>: variável do tipo caracter onde será retornada a pasta selecionada <cancelado>: uma variável do tipo lógica onde deve ser retornado se a caixa de diálogo foi cancelada ou não Exemplo: . message fn-free-accent("áàãâä-éèêë-~íìîï-óòõôö-úùûü-y´¨y-ç-ñ") chr(10) c-texto view-as alert-box. assign c-texto = fn-free-accent ("ÁÀÃÂÄ-ÉÈÊË-ÍÌÎÏ-ÓÒÔÕÖ-ÚÙÛÜ-ÝŸÇ-Ñ").  nos Templates de Relatório.Exemplo Formato Utilização Objetivo I-FREEAC. output <cancelado>). {include/i-freeac. {include/i-freeac. display fn-free-accent("<string>").p (input <título>. run utp/ut-dir.i} define var c-texto as char no-undo. output <pasta>. Exportação e em pontos específicos que necessitem que a saída de dados (impressora/arquivo/tela) seja feita sem acentuação.

Onde: <título>: título para a caixa de diálogo para selecionar diretórios <pasta>: variável do tipo caracter onde será retornada a pasta selecionada <cancelado>: uma variável do tipo lógica onde deve retornado se a caixa de diálogo foi cancelada ou não Exemplo: run utp/ut-dir. Como este programa utiliza os recursos de OCX. output cancelado). output <pasta>. quando for solicitado. que se encontra no diretório \INTERFAC\SOM\. BTB917ZX. output pasta. é preciso que este OCX esteja registrado e instalado na máquina que deve ser utilizado.p (input "Escolha um diretório.EXE. Para fazer esta instalação proceda da seguinte forma:  executar o SETUP.P Permitir a execução de sons do tipo MID e WAV.Instalação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 75 run utp/ut-dir. output <cancelado>). .  clicar no botão de 'OK'.p (input "Escolha um diretório".

Para fazer esta instalação proceda da seguinte forma:  executar o SETUP. é preciso que este OCX esteja registrado e instalado na máquina que deve ser utilizado.p (input <som>). para terminar. *. run btb/btb917zy.  JPEG Images (*.bmp. .wav"). quando for solicitado.ico.gif) devido a uma restrição do WebEnabler Instalação Como este programa utiliza os recursos de OCX.EXE.cur).P Permitir a visualização dos seguintes tipos de imagens:  Bitmaps (*.Objetivo Formato  clicar no botão  clicar em 'Ok' para terminar.  clicar no botão de 'Ok'. Onde: .wmf.  Metafiles (*.  Icons (*. Onde: <som>: caminho completo do arquivo de som a ser executado Exemplo: run btb/btb917zx. Nota As imagens em formato Bitmap (. BTB917ZY.jpg). .  clicar no botão:  clicar em 'Ok'. run btb/btb917zx.gif). *.p (input "c:\windows\media\start.bmp) devem possuir um correspondente de mesmo nome no formato GIF (.emf). que se encontra no diretório \INTERFAC\IMAGEM\. *.  Gif Images (*.p (input <imagem>).dib).

EXE. que se encontra no diretório \INTERFAC\VIDEO\DISK1. run btb/btb917zz.P Permitir a visualização de vídeos do tipo AVI. . Como este programa utiliza os recursos de OCX. BTB917ZZ.  clicar no botão:  clicar em 'Ok'.  clicar no botão de 'Ok'.p (input "c:\windows\egito. Para fazer esta instalação proceda da seguinte forma:  executar o SETUP.p (input <video>) . quando for solicitado.Formato Instalação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 77 <imagem>: caminho completo da imagem a ser visualizada Exemplo: run btb/btb917zy.bmp"). é preciso que este OCX esteja registrado e instalado na máquina que deve ser utilizado. para terminar.

p (input "c:\windows\help\explorer.avi"). output <versao>). output c-versao). UT-VRBIN.A.R).0.p (input <arquivo>.P Este utilitário pode ser usado sempre que for necessário saber a versão de um programa compilado (. . input no.p (input "c:\tmp\cd0101. input <acomp>.  programa só conseguirá buscar a versão dos programas que foram construídos conforme os padrões de desenvolvimento da Datasul S. Onde: <arquivo>: variável do tipo caracter que irá conter o nome do arquivo compilado a ser analisado <acomp>: variável do tipo lógica que irá definir se a pesquisa deve apresentar a tela de acompanhamento ou não <versao>: variável do tipo caracter que irá receber a versão do programa passado como parâmetro Exemplo: run utp/ut-vrbin.r".Observações Formato Objetivo Onde: <vídeo>: caminho completo do vídeo a ser apresentado Exemplo: run btb/btb917zz. e que utilizem as Técnicas e Templates do Datasul-EMS 2. run utp/ut-vrbin.

na hora. output <hora>. a hora ou o tamanho de um arquivo no Windows.  programa não possui a versão internamente.p (input "c:\autoexec. mas em compensação. output <data>. pois faz interações com tela. Onde: <arquivo>: variável do tipo caracter que deve conter o nome do arquivo a ser analisado <data>: variável do tipo data que deve receber a data do arquivo que está sendo analisado <hora>: variável do tipo caracter que deve receber a hora do arquivo que está sendo analisado <tamanho>: variável do tipo inteira que deve receber o tamanho do arquivo que está sendo analisado run utp/ut-finfo. output i-tam). . o programa não conseguiu obter a versão. na data e "00:00:00".  se o retorno da versão for "?". deixa o usuário informado do que está ocorrendo naquele momento.p (input <arquivo>. output <tamanho>).P Este utilitário pode ser usado sempre que for necessário saber a data. o utilitário irá retornar "?". output c-hora.bat". output d-data. Os principais motivos disto são:  programa a ser pesquisado não for encontrado. Caso o programa não se encontra. UT-FINFO.  programa não está dentro das técnicas e templates do Datasul-EMS 2. run utp/ut-finfo.Observações Exemplo Formato Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 79  a tela de acompanhamento deixa o programa sensivelmente mais lento.0.

etc ... output <versao>. run utp/ut-cmdln. Onde: <plataforma>: variável do tipo caracter que irá receber o tipo plataforma windows (Windows NT ou Windows 95/98) <versao>: variável do tipo inteira que irá receber. output i-release.P Esta técnica pode ser usada sempre que for necessário saber informações mais detalhadas sobre o Sistema Operacional (somente para Windows). a "release" do Windows <build>: variável do tipo inteira que irá receber. basekey..p (ouput <plataforma>. output <build>. output <release>. se houver. se houver. Esta função pode ser muito útil quando se deseja obter os valores dos parâmetros da sessão (ini. inp.p (output c-plataforma. .. output <extrainfo>).) run utp/ut-osver.).P Este utilitário pode ser usado sempre que for necessário saber informações mais detalhadas sobre a linha de comando usada para abrir a sessão corrente. UT-OSVER. output i-versao. run utp/ut-osver.p (output c-linha-comando). etc . o "build" do Windows <extrainfo>: variável do tipo caracter que irá receber informações extras sobre o Windows (Versão do Service Pack.Exemplo Formato Objetivo UT-CMDLN. a versão do Windows <release>: variável do tipo inteira que irá receber. Onde: <linha-comando>: variável do tipo caracter que irá receber a linha de comando usada para abrir a sessão corrente Exemplo: run utp/ut-cmdln.p (output <linha-comando>). se houver.

<banco>: banco de dados onde a tabela se encontra. Opcional. evitando que o OWNER seja incluído antes do nome da tabela no programa compilado. {include/i-countds. isto é. output c-extrainfo).  Quando é necessário determinar a quantidade de registros numa tabela. .  <condição> e <tabela> devem estar entre aspas. DEF VAR iCount AS INT NO-UNDO. I-COUNTDS. 15).I Descobrir a quantidade de registros numa tabela de acordo a condição passada. <tabela>: tabela que deve ter o número de registros contados.i &BANCO=mgadm &TABELA="cheque-pend" &COND="WHERE cod-banco > 20" &DEST=iCount} message iCount view-as alert-box. <condição>: cláusa where que deve ser usada na consulta. {include/i-countds.  Utilize apenas se o banco de dados não for PROGRESS. quando o banco de dados é acessado através do DataServer (veja o item “Como contar a quantidade de registros numa tabela” no cap.i &BANCO=mgadm &TABELA=<tabela> &COND=<condição> &DEST=<variável> } Onde: <variável>: variável que irá armazenar o resultado da consulta.Observações Exemplo Formato Utilização Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 81 output i-build. for acessado através do DataServer.

I define procedures para acesso a funções externas de API’s do Windows.I A UT-WIN. Abaixo segue algumas das procedures definidas na include:                                  CreateProcess{&A} GetComputerName{&A} GetEnvironmentVariable{&A} GetLastError GetProfileString{&A} GetSystemDirectory{&A} GetWindowsDirectory{&A} LoadLibrary{&A} SetEnvironmentVariable{&A} WinExec GetCurrentDirectory{&A} FindExecutable{&A} ShellExecute{&A} AdjustWindowRect ClientToScreen CreateModal DeleteMenu DrawMenuBar FlashWindow GetClientRect GetMenuItemCount GetParent GetSystemMenu GetWindowLong{&A} GetWindowRect InvalidateRect RemoveMenu SetCursorPos SetWindowContextHelpId SetWindowLong{&A} SetWindowPos ShowScrollBar ShowWindow .Procedures Objetivo UT-WIN.

PROCEDURE SupressWindowMove: /*---------------------------------------------------------------------Purpose: Disable the MOVE option of the window object. RUN GetUserName{&A} (INPUT-OUTPUT chrUserID. RUN RemoveMenu (INPUT iMenu.Exemplo 21 APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 83   SystemParametersInfo{&A} GetUserName{&A} Ver nome do usuário logado. INPUT {&MF_BYCOMMAND} + {&MF_DELETE}. RUN GetParent (INPUT windowHandle:HWND. Bloquear arraste de janela. INPUT 0. DEFINE VARIABLE iMenu AS INTEGER INITIAL 0 NO-UNDO. DEFINE VARIABLE iResult AS INTEGER INITIAL 0 NO-UNDO. OUTPUT iMenu). OUTPUT iHWND). END PROCEDURE. MESSAGE TRIM(chrUserID) VIEW-AS ALERT-BOX. Parameters: windowHandle – window que não poderá mais ser arrastada ----------------------------------------------------------------------*/ DEFINE INPUT PARAMETER windowHandle AS WIDGET-HANDLE NO-UNDO.256) intSize = 255. OUTPUT iResult). INPUT-OUTPUT intSize). . DEFINE VARIABLE intSize AS INTEGER NO-UNDO. DEFINE VARIABLE chrUserID AS CHARACTER NO-UNDO. INPUT {&SC_MOVE}. OUTPUT iResult). &SCOPED-DEFINE SC_MOVE 61456 &SCOPED-DEFINE MF_BYCOMMAND 0 &SCOPED-DEFINE MF_DELETE 512 DEFINE VARIABLE iHWND AS INTEGER INITIAL 0 NO-UNDO. ASSIGN chrUserID = FILL(' '. RUN DrawMenuBar (INPUT iHWND. RUN GetSystemMenu (INPUT iHWND.

DEFINE VARIABLE viRetCode AS INTEGER INITIAL 0 NO-UNDO. Definir variável de ambiente. DEFINE VARIABLE viSysMenu AS INTEGER INITIAL 0 NO-UNDO. . INPUT 0.5 close 3 maximize 2 minimize ----------------------------------------------------------------------*/ DEFINE INPUT PARAMETER windowHandle AS WIDGET-HANDLE NO-UNDO. OUTPUT viWinHWND). RUN RemoveMenu (INPUT viSysMenu. ELSE MESSAGE "Function Failed. IF viWinHWND = 0 THEN RUN GetParent (windowHandle:HWND. Not Sure Why" VIEW-AS ALERT-BOX. PROCEDURE RemoveSystemMenuItem: /*---------------------------------------------------------------------Purpose: Remove a SystemMenuItem Parameters: windowHandle – window que terá os itens removidos itemId . OUTPUT viSysMenu). OUTPUT intResult). RUN GetSystemMenu (INPUT viWinHWND. &SCOPED-DEFINE MF_BYPOSITION 1024 &SCOPED-DEFINE MF_REMOVE 4096 DEFINE VARIABLE viWinHWND AS INTEGER INITIAL 0 NO-UNDO. OUTPUT viRetCode). INPUT {&MF_BYPOSITION} + {&MF_REMOVE}. INPUT "SOME-VALUE". DEFINE INPUT PARAMETER itemId AS INTEGER NO-UNDO. IF intResult = 1 THEN MESSAGE "Environment Variable Has Been Changed" VIEW-AS ALERT-BOX. minimizar. INPUT itemId. DEFINE VARIABLE intResult AS INTEGER NO-UNDO.Exemplo 43 Remover botões do sistema (maximizar. RUN DrawMenuBar (INPUT viWinHWND. fechar). RUN SetEnvironmentVariableA (INPUT "DUMMYVAR". END PROCEDURE. OUTPUT viRetCode).

Exemplo Formato Utilização Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 85 UT-TRACE. RUN utp/ut-trace. Pode ser utilizado em qualquer template da datasul.P Exibir em tela toda a lista de programas e procedures internas executadas até o ponto de execução deste aplicativo. . É necessário incluir no programa a include utp/uttrace. RUN utp/trace.w (INPUT TABLE tt-trace). Lembrando que para isto é necessário criar uma variável do tipo handle (h-trace abaixo) e limpar o handle do programa na variável após a execução. independente do programa ser Smart ou Thin Template.i e rodar o utilitário de forma persistente. RUN pi-monta-trace IN h-trace (OUTPUT TABLE tt-trace). disponível nas mensagens de erro.p PERSISTENT SET h-trace. É semelhante ao stack trace do Progress. com a vantagem que o desenvolvedor pode escolher o ponto do programa para exibição da pilha de execução.

substituindo a função LOCKED do PROGRESS que não funciona corretamente em ambiente ORACLE. Neste caso utilizávamos a função LOCKED pra confirmar se a indisponibilidade de dados deve-se ao fato do registro desejado já estar locado em outra sessão. Normalmente utiliza-se um FIND EXCLUSIVE-LOCK com a cláusula NOWAIT para buscar um registro que pode estar locado. <tipo_busca >: a clausula de busca do registro. Para o correto funcionamento do utilitário. o programa não fica parado no EXCLUSIVE-LOCK esperando o registro ser liberado. {utp/ut-lock. <where_clause>: Opcional. . Deve-se definir um pré-processador para armazenar a cláusula do Where pois em alguns casos a complexidade da consulta não permite que a mesma seja transferida através da chamada da include.alan""" ~ + CHR(10) + "AND cd-planejado = ""0010""" FIND FIRST ITEM WHERE it-codigo = ". mas conforme dito anteriormente. &GLOBAL-DEFINE WHERE-LOCKED "where it-codigo = "".Exemplo Formato Utilização Objetivo UT-LOCK. Next. deve ser exatamente o mesmo where clause do FIND realizado com EXCLUSIVE-LOCK e NO-WAIT.i <banco> <tabela> <tipo_busca> <where_clause>} <tratamento de retorno com a variável lRetorno> Onde: <banco>: nome lógico do banco de dados que contém a tabela.alan" AND cd-planejado = "0010" EXCLUSIVE-LOCK NO-ERROR NO-WAIT. podendo ser: First Last. Este utilitário verifica o estado de lock do registro diretamente no banco ORACLE para garantir esta funcionalidade. esta função não funciona no ambiente ORACLE. Pode ser utilizado em qualquer template da datasul. Prev ou Current. <tabela>: nome da tabela na qual está se realizando a busca.I Retornar se um registro já está locado na base. Ou mesmo um fonte qualquer. independente do programa ser Smart ou Thin Template. Clausula where de condição de busca do registro. Dessa forma.

independente do programa ser Smart ou Thin Template. END CASE. CASE lRetorno: WHEN ? THEN MESSAGE "Registro não existe" VIEW-AS ALERT-BOX INFO BUTTONS OK. Onde: <zipFileName>: receber o endereço completo do arquivo .i mgind ITEM FIRST {&WHERE-LOCKED}}. input <tt-listFiles>. output <tabela erro>).zip”) . run utp\ut-zip.P Este utilitário faz o tratamento de arquivos zipados.Formato Utilização Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 87 {utp\ut-lock. UT-ZIP. run zipFiles in h-zip (input <zipFileName>.ZIP a ser gerado (Ex. input <logical>. compactando os arquivos listados em um arquivo denominado zipFileName.: “c:\tmp\teste. Uma outra aplicação além da compactação dos arquivos listados é a proteção dos arquivos com uma senha. WHEN NO THEN MESSAGE "Registro livre" VIEW-AS ALERT-BOX INFO BUTTONS OK. Ou mesmo um fonte qualquer. Pode ser utilizado em qualquer template da Datasul.p persistent set h-zip. WHEN YES THEN MESSAGE "Registro locado" VIEW-AS ALERT-BOX INFO BUTTONS OK.

END.cFile = "c:\temp\teste02. FOR EACH tt-erros: DISP tt-erros.cFile = "c:\temp\teste01. RUN utp/ut-zip.<tt-listFiles>: temp-table onde são definidas as informações referentes a cada um dos arquivos que deve ser inserido no arquivo . OUTPUT TABLE tt-erros). END. ASSIGN tt-listFiles. RUN zipFiles IN h-zip (INPUT "c:\temp\teste01. FOR EACH tt-erros: DISP tt-erros.txt".zip". Delete procedure h-zip. CREATE tt-listFiles.ZIP gerado <logical>: variável que irá Verificar se o arquivo zipFileName pode ser sobrescrito e se não puder verifica se o arquivo já existe para retornar a mensagem de erro <tabela erro>: Temp-table que armazena os erros que ocorreram durante o processo de compactação. CREATE tt-listFiles. INPUT TABLE tt-listFiles. INPUT TABLE tt-listFiles. definida na include utp\ut-zip.p PERSISTENT SET h-zip.zip".i Exemplo {utp/ut-zip. .txt".i} DEFINE VARIABLE h-zip AS HANDLE NO-UNDO. ASSIGN tt-listFiles. INPUT "senha". RUN zipFilesEncrypt IN h-zip (INPUT "c:\temp\teste02. OUTPUT TABLE tt-erros). INPUT TRUE. INPUT FALSE.

RUN utp\ut-valida-facelift. ELSE MESSAGE "Ambiente não apto para alicar facelift !" VIEW-AS ALERT-BOX.p. O utilitário deve ser chamado por outro programa passando um campo lógico como parâmetro. O programa que deve ser executado para manipulação de XML é o xmlutp/utgenxml. DEF VAR l-aplica-facelift AS LOGICAL NO-UNDO.doc.Exemplo Utilização Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 89 UT-GENXML. UT-VALIDA-FACELIFT. patch e fix do progress instalado na máquina. A documentação do mesmo encontra-se no capítulo 4 ( Utilizando API XML ) do arquivo xmlmanual/ ManualConstrucaoAdapters.p (OUTPUT l-aplica-facelift).P Este utilitário verifica: versão.P Este utilitário facilita a criação e manipulação de arquivos XML. Observações Se o ambiente estiver apto para ser aplicado o facelift a variável l-aplicafacelift terá valor “True”. . ele retorna um campo lógico informando se a estação está apta para executar o produto com facelift. IF l-aplica-facelift THEN MESSAGE "Ambiente apto para alicar facelift !" VIEW-AS ALERT-BOX. caso contrário terá valor “False”.

Quando um desenvolvedor cria um novo include de dicionário de dados.i} &IF "{&LANGUAGE-CODE}" = "POR" &THEN &glob val1 Devedora &glob val2 Credora &ENDIF &IF "{&LANGUAGE-CODE}" = "ESP" &THEN &glob val1 .04 e HR 2. Acima destas releases deve ser utilizada a técnica multi-idiomas especificada no próximo item neste documento.View-as Radio-Set CAPÍTULO 7 Tradução TRADUÇÃO MONO-IDIOMAS Este modelo é utilizado até as versões EMS 2.I.07. conforme exemplo: /******************************************************* ** ** i01ad047.Devedora/Credora ** ********************************************************/ {include/i-lgcode. deve-se utilizar a técnica Como implementar labels em retângulos. Tradução de variáveis com view-as nas telas Para o label do retângulo que emoldura o radio-set e dá significado ao mesmo. Quanto à tradução dos 'radio-buttons' da variável view-as radio-set deve-se utilizar o include XXINC/I99XX999. Estes includes (XXINC e VARINC) precisam ser multidioma.i campo natureza (conta) . deve criá-lo no layout a seguir.

i var00002. 2. Seguir a nomenclatura abaixo para a include que é utilizada para tradução: Para o Datasul-EMS 2. através da utilização de includes padrões.i . Este include tem o seguinte conteúdo: /**************************************************** ** ** var99999.00: Dentro do diretório VARINC. var19999. .i var10001. Exemplos: var10000.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 91 &glob val2 &ENDIF &IF "{&LANGUAGE-CODE}" = "ING" &THEN &glob val1 &glob val2 &ENDIF {include/ind01-10. . Colocar um radio-set na tela (por exemplo.w .i Variável: cb-xxx Programa:xxp/xx9999. cujo objetivo é determinar qual o idioma da instalação do Datasul-EMS 2.i. criar uma include que tem como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 000001 até 09999. de acordo com o roteiro abaixo: 1. var09999. Mas. criar uma include que deve ter como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 10000 até 19999. Exemplos: var00001.00: Dentro do diretório VARINC-RH.0.i 3. é possível utilizar o radio-set como view-as de variáveis independentes de campos do dicionário de dados.i} {1} {2}} /* fim */ Observação Foi incorporada uma chamada para um include i-lgcode.i . SmartViewer) e definir o seu 'radio-buttons' com valores 'brancos'.i Para o Datasul-HR 1.

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. ou em momento próprio.I.i 07} rs-xxx:screen-value in frame {&frame-name} = "1":U. View-as Combo-box Inicialmente.Devedora/Credora ** ************************************************************/ {include/i-lgcode. No 'local-initialize'. em seu programa.Exemplo ** *****************************************************/ {include/i-lgcode. Quando um desenvolvedor cria um novo include de dicionário de dados.i campo natureza (conta) . deve-se carregar o 'radio-buttons' deste radio-set. Os includes de dicionário de dados (XXINC e VARINC) precisam ser multidioma. bem como seu valor inicial (screen-value): assign rs-xxx:radio-buttons in frame {&frame-name} = {varinc/var99999. deve criá-lo no layout a seguir: /*********************************************************** ** ** i01ad047.i} &IF "{&LANGUAGE-CODE}" = "POR" &THEN &glob val1 Devedora &glob val2 Credora &ENDIF &IF "{&LANGUAGE-CODE}" = "ESP" &THEN . e através dos includes XXINC/I99XX999. a sua utilização deve estar limitada à representação de campos indicadores do dicionário de dados.i} {1} "POR" &THEN "ESP" &THEN "ING" &THEN {2}} /* fim */ 4. próprios para este fim.

APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 93 &glob val1 &glob val2 &ENDIF &IF "{&LANGUAGE-CODE}" = "ING" &THEN &glob val1 &glob val2 &ENDIF {include/ind01-10. Colocar um combo-box na tela (por exemplo. de acordo com o roteiro a seguir: 1.i var10001.i 3. var09999.00: Dentro do diretório VARINC-RH. Este include tem o seguinte conteúdo: .0. é possível utilizar o combo-box. cujo objetivo é determinar qual o idioma da instalação do Datasul-EMS 2. 2. SmartViewer) e não definir o seu 'list-items' e 'initial'. . criar uma include que tem como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 00001 até 09999.i} {1} {2}} /* fim */ Observação Como se pode observar.i. Exemplos: var10000.00: Dentro do diretório VARINC. Seguir a nomenclatura abaixo para a include que é utilizada para tradução: Para o Datasul-EMS 2. através da utilização de includes padrões. Mas.i .i . . Exemplos: var00001.i Para o Datasul-HR 1. foi incorporada uma chamada para um include i-lgcode. var19999.i var00002. como view-as de variáveis independentes de campos do dicionário de dados. criar uma include que deve ter como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 10000 até 19999.

i} {1} "POR" &THEN "ESP" &THEN "ING" &THEN {2}} /* fim */ 4.i 04 1}. deve ser realizada através do include var99999. ainda resta a tradução do label. então no 'MainBlock'. CERTO: if cb-tipo:screen-value in frame {&frame-name} = {varinc\var99999. isto é..i. Exemplo: ERRADO: if cb-tipo:screen-value in frame {&frame-name} = "Passivo" then. Toda codificação que precisar referenciar o valor de um item do combobox.. Em ambas as utilizações. não podem existir referências diretas na forma de string ("") aos itens do combo-box no fonte.i 03} cb-xxx:screen-value in frame {&frame-name} = {varinc\var99999. qualquer ponto onde o programa .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. ou ainda./**************************************************** ** ** var99999. ou em momento próprio. 5... deve-se carregar o 'list-items' deste combo-box. ou 'Local-initialize'.w ** *****************************************************/ {include/i-lgcode.i Variável: cb-xxx Programa:xxp/xx9999. No 'local-initialize'.i 04 2} then . em seu programa. bem como seu valor inicial (screen-value): assign cb-xxx:list-items in frame {&frame-name} = {varinc/var99999.

i <literal> <modulo> <alinhamento>} assign <variavel>:help in frame {&frame-name} = returnvalue. não é necessário preocupar-se com o espaço extra para tradução. este deve ter a preparação para tradução através do include utp/liter. .i: {utp/ut-field. e para isto pode-se usar o include utp/ut-field.i quando se tratar de uma variável like ou ainda o include utp/ut-liter.i <banco> <tabela> <campo> <propriedade>} assign <var-combo-box>:label in frame {&frame-name} = return-value.i <banco> <tabela> <campo> <propriedade>} assign <variável>:label in frame {&frame-name} = returnvalue. entretanto não se deve esquecer da possibilidade de tradução. Utilizando utp/ut-liter. Sempre que estas variáveis possuam 'help'.i: {utp/ut-liter. conforme o exemplo: {utp/ut-liter. No caso dos toggle-boxes e fill-in´s é necessário preparar a tradução dos labels.View-as Toggle-Box Exemplo: Column-Labels Help e Viewas Fill-in APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 95 execute antes da realização do frame. Utilizando utp/ut-field.i. Com base nisto. os espaços extras para tradução foram recalculados para column-labels dos campos no dicionário de dados.i <literal> <modulo> <alinhamento>} assign <variável>:label in frame {&frame-name} = returnvalue.i para aproveitar o cadastro de literais. Espaço Extra para tradução em relatórios  o tamanho de uma coluna em um layout (down frame) está limitada ao tamanho do formato do campo ou do label Brasil do mesmo. {utp/ut-liter Total_Pedidos} assign de-total-pedidos:label in frame f-relat = trim{returnvalue}.  na utilização de literais para compor column-labels de variáveis. deve-se implementar lógica que altere o label do combo-box: {utp/ut-field. o que for maior.

>>9. que deve ser reservado sempre à esquerda do label.>>>.>>>.>>>.05 e HR 2.99 >>>>>9 XXXXXXXXXXXXXXXX >. Cliente Descrição Total Pedidos ------------------------------------->>>>>9 XXXXXXXXXXXXXXXX >. e está definida na ISO639-1.99 >>>>>9 XXXXXXXXXXXXXXXX >.>>9. {utp/ut-liter ____Total_Geral} assign de-total-geral:label in frame f-total = return-value. Nomenclatura Padrão e Características do modelo A nova técnica de tradução definiu uma nomenclatura para os dialetos a serem utilizados no produto.99 TRADUÇÃO MULTI-IDIOMAS Este modelo é utilizado a partir das versões EMS 2.99 ____Total Geral: >>. Esta nomenclatura segue um padrão de mercado já utilizado por outras empresas de mercado.99 >>>>>9 XXXXXXXXXXXXXXXX >.Side-Labels Cliente Descrição Total Pedidos ------------------------------------->>>>>9 XXXXXXXXXXXXXXXX >.99  deve existir o tratamento do espaço extra para tradução.>>9.>>9.>>>.>>>. Segue abaixo uma tabela exemplificando as definições de cada sigla para os dialetos suportados pela Datasul: .>>9.>>9.99 >>>>>9 XXXXXXXXXXXXXXXX >.>>>.08 ou superiores.>>9.>>>.

que atualmente são en. ou ainda o dialeto que é expedido pela própria Datasul. Qualquer outro dialeto criado pelo usuário/distribuidor é considerado dialeto secundário ou customizado. existe na tabela de usuários um campo chamado cod_dialeto que irá armazenar a informação do dialeto do usuário. que mantém uma relação com o dialeto padrão através da própria tabela de dialetos do produto.Brazil Sendo que as siglas US. AR e BR já são consideradas customizações do dialeto principal expedido pela Datasul ou ainda um dialeto secundário. sendo obrigatório como padrão validado apenas as duas primeiras letras do código do idioma/dialeto. Quando se comenta em dialeto padrão.Argentina Portuguese . uma variável global é populada com o valor armazenado no campo cod_dialeto da tabela usuar_mestre. e a partir deste momento toda e qualquer tradução no produto toma como referência o valor armazenado nesta variável. ou ainda de algum outro dialeto que já é filho de um dialeto padrão. Importante Para que o produto saiba que dialeto trabalhar na sessão corrente. Caso queira-se tratar/consultar esta variável de alguma forma em algum programa. na forma de três arquivos . ou ainda um dialeto qualquer do usuário. sendo possível com isto em uma mesma instalação do produto vários usuários acessando com um idioma/dialeto diferente. e que estas customizações podem ser tratadas pelo cliente/distribuidor na forma como estes julgarem conveniente para sua aplicação. Ex: pt-nr-fm .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 97 Dialeto en-US es-AR pt-BR Nome idioma/Dialeto English . es e pt.Português Nordestino das indústrias farmacêuticas. e pr-nr é filho de pt.United States Spanish . Quando o usuário realiza o login no EMS/HR.d presentes na pasta \univdata abaixo do diretório do produto. e assim sucessivamente de acordo com a necessidade definida. este pode ser considerado o próprio idioma. Podemos dizer aqui então que o pt-nr-fm é filho de pr-nr. basta defini-la conforme segue abaixo: define new global shared var v_cod_dialet_corren as char noundo. . podendo este ser filho de qualquer dialeto padrão.

p e posterior atribuição ao atributo em questão pelo valor retornado através do return-value. ou seja.Pontos de tradução No modelo de tradução Multi-Idiomas. Este contexto pode ser usado de forma idêntica ao utilizado na versão anterior do ut-liter. como labels. mesmo passando-se o caracter "*" para o utilitário de tradução ut-liter em tempo de desenvolvimento. através da sigla do módulo. este deverá ser trabalhado para que se inclua uma chamada ao utilitário ut-liter. durante a análise para a construção do programa. e realiza uma chamada automática ao ut-liter para sua posterior atribuição ao valor retornado. Caso tenha-se alguma atribuição em tela para atributos de objetos passíveis de tradução após estes pontos. para os programas que possuem telas. nestes pontos. não é necessário que seja realizado nenhum tipo de intervenção manual. sejam estes SmartObjects ou ThinTemplates. seja verificado que não existe a necessidade da criação de uma nova contextualização de Strings. identifica todos as propriedades destes objetos que são passíveis de tradução. help's. um utilitário é chamado e este identifica todos os objetos dispostos em tela. Estes pontos de tradução nada mais são do que os locais onde foram realizadas as chamadas aos tradutores automáticos de telas. este programa irá disponibilizar um contexto automático para o cliente/usuário em tempo de . Os pontos de tradução são:  SmartObjects – Procedure Adm-initialize  ThinTemplates – Procedure InitializeInterface Contextos de tradução No modelo de tradução Multi-Idiomas. etc. Tudo o que está em tela e que está antes deste ponto de tradução. tooltip's. mas não fica necessariamente limitado a esta contextualização. podendo ser definido qualquer tipo de semântica que se julgue necessário para o módulo/programa do produto que se está trabalhando. Caso. foram criados o que chamamos de pontos de tradução. foi adicionado um conceito de contexto de tradução.

seu ID e a Origem String. a funcionalidade de tradução irá levar em consideração a sequência de busca e trazer o termo correto no ponto do módulo onde a string foi customizada. este contexto automático disponibilizado é pela sigla do módulo. sem que haja a necessidade de alteração do programa para que o contexto seja passado de forma correta. Nota Ver sobre seqüência de busca a seguir neste documento O caracter "*" é considerado para fins de tradução. bem como no momento da customização dos termos em telas do produto. foi criado um conceito de itens de tradução. bastando ao usuário cadastrar a String corretamente através do programa btb016aa.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 99 execução. Após este cadastro. e codificação dentro da tabela de strings externas estão descritos a seguir neste documento. Itens de Tradução Para a técnica de tradução Multi-Idiomas. onde cada um destes itens possui uma característica que deve ser levada em consideração no momento da inclusão de novas strings. o contexto genérico das strings. sendo que estes itens. sendo sua chave composta pelo dialeto. caso julgar necessário. Isto para que o cliente/distribuidor possa realizar suas customizações. Estes itens estão todos armazenados dentro de uma tabela chamada string_ext_produt. suas características. Hoje existem 9 itens de tradução. contexto.p. sendo estes dois últimos campos definidos como segue: ID Item de Tradução Origem String 1 aplicat_dtsul des_aplicat_dtsul 2 modul_dtsul des_modul_dtsul Descrição Tabela que armazena os aplicativos Datasul Tabela que armazena os .

módulos
Datasul
Tabela que armazena os
procedimentos Datasul

3

procedimento

des_proced

4

produt_dtsul

des_produt_dtsul

Tabela que armazena os
produtos Datasul

5

rot_dtsul

des_rot_dtsul

Tabela que armazena as
rotinas Datasul

6

sist_dtsul

des_sist_dtsul

Tabela que armazena os
sistemas Datasul

7

sub_rot_dtsul

des_sub_rot_dtsul

Tabela que armazena as subrotinas Datasul

8

cad-msgs

cd-msg

Tabela que armazena as
mensagens dos produtos
Datasul

9

cad-literal

cod-literal

Tabela que armazena as
Literais dos produtos Datasul*

* Os registros com este último indicador ainda armazenam mais algumas
informações relevantes para o produto, como títulos dos programas em todos
os idiomas, e também todas as strings presentes nos bancos de dados do
produto, como labels, descrições 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
tradução no dialeto desejado para a descrição da tabela cad-literal no banco
mguni. Esta chave é utilizada pelo utilitário 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 tradução no dialeto desejado para o label do campo cod-literal, na

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
101

tabela cad-literal no banco mguni. Esta chave é utilizada pelo utilitário utfield.p, que será abordado ainda neste documento.

Sequência de busca
Após verificarmos alguns conceitos sobre o modelo de tradução MultiIdiomas, desde sua nomenclatura, os pontos de tradução dentro dos programas,
o que são contextos dentro deste novo processo, e os itens de tradução que
estão englobados por esta técnica, é necessário que se consiga visualizar como
isto irá funcionar de forma prática dentro dos programas, dentro dos módulos
dos produtos Datasul. Para isto, foi definida uma sequência de busca que visa
disponibilizar uma hierarquia de Dialetos, contextos e strings no intuito de
facilitar a customização e o entendimento por parte dos usuários e
desenvolvedores da funcionalidade. Com isso, quando se passa uma
Literal/Mensagem/String/Item de Menu para qualquer um dos utilitários que
realizam a busca na tabela de strings Externas (ut-liter, ut-msgs, ut-ltmnu), a
sequência de busca utilizada é a que segue:
Seqüência
1

Dialeto
Padrão
X

Dialeto
Usuário

2

X

3

X

4

X

Contexto
Contexto
informado/módulo
Contexto Genérico
(“*”)
Contexto
informado/módulo
Contexto Genérico
(“*”)

Através desta hierarquia de busca, é possível o cliente/distribuidor fazer
qualquer tipo de customização de termos de negócio que julgar necessário,
seja por região geográfica, por segmentação de mercado, por departamento
funcional, ou qualquer outro tipo de separação de termos que julgar
conveniente. Com as funcionalidades deste modelo de tradução abordado,
estaremos explicando abaixo o que cada um dos utilitários criados para este

Utilização
Objetivo

processo realizam bem como algumas situações em programas que devem ser
analisadas para que sejam evitadas inclusões de novos problemas em relação à
tradução nos produtos Datasul. A seguir neste documento descrição destes
programas/situações com o objetivo de facilitar/tornar sua implementação o
mais simples possível.

UT-TRCAMPOS.P
Realizar tradução automática de telas. Este programa tem a função de
pesquisar todos os objetos de uma tela Progress baseado em sua Window,
através da hierarquia existente, e realizar a chamada ao utilitário ut-liter.p para
que sejam feitas as devidas traduções da interface. Este utilitário reconhece
todas as frames que são filhas da window, e traduz todas os objetos presentes
nestas frames automaticamente.
É utilizado nos dois pontos de tradução dentro das templates:

InitializeInterface nas ThinTemplates

Adm-Initialize nos Smart Objects quando existe container definido.

Caso exista uma window que não seja de uma template padrão Datasul, este
utilitário poderá ser chamado antes do view principal da frame do programa
para que a tradução automática passe a ser realizada.
Este programa não espera nenhum parâmetro de entrada, e deve ser chamado
diretamente através do fonte.
Ex: run utp/ut-trcampos.p.

UT-TRFRRP.P
Difere do anterior porque realiza tradução automática de uma única frame,
apenas. Busca os itens de tradução apenas na hierarquia da frame que foi
passada como parâmetro, buscando os objetos passíveis de tradução e
realizando então a chamada ao ut-liter.p e posterior atribuição do valor
traduzido retornado à estes objetos, de forma automática.
Pode ser utilizado para traduzir Dialog-frames, frames de relatório, ou
qualquer outra frame que se julgue necessário.

Utilização
Objetivo

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
103

Deve ser altamente utilizado para evitar alto nível de trabalho quando da
necessidade de tradução de frames de relatórios devido a não existência de
uma window que seja o pai destas frames nestes tipos de programas, não
podendo nestes casos ser utilizado o utilitário anterior (ut-trcampos.p).
Ex: run utp/ut-trfrrp.p (input frame f-parametros:handle).

Obs: Quando o programa for um relatório, existe um filtro no RTB que caso o
programa não possua nenhuma chamada a este utilitário, esta será feita de
forma automática para todas as frames do relatório antes do ponto padrão de
leitura de registros desta template ou da definição do cabeçalho do mesmo, ou
seja, antes da include i-rpout.i ou i-rpcab.i respectivamente, dependendo da
estrutura do programa.

UT-LSTIT.P
Converter uma String não indexada proveniente de um objeto Progress e
retorna seu conteúdo indexado e já traduzido no dialeto do usuário, para que
possa ser utilizado no programa chamador. Tem o objetivo de facilitar a
programação dentro da técnica de tradução Multi-Idiomas minimizando a
necessidade de realizar tal tarefa diretamente no fonte do programa em
questão.
Deverá ser utilizado sempre quando da necessidade de uma conversão de
valores de um objeto Progress não indexado para valores indexados, ou ainda,
converter valor de LIST-ITEMS para LIST-ITEM-PAIRS.
Sua utilização deve ser da seguinte forma:
Sintaxe:

run utp/ut-lstit.p (input-output cLista).

Onde cLista deve ser uma lista separada por "," provinda de uma das seguintes
situações:

Include de domínio;

Valor populado de um for each;

List-items de um campo (Este apenas caso ainda não tenha passado pelos
pontos de tradução, ou já tenha passado e necessita ser repopulado devido
a uma lógica de negócio);

Sub-programa;

Utilização
Objetivo

Qualquer fonte que gere uma lista separada por vírgula e que este será
utilizada em algum objeto Progress não-indexado (Combo-Box, SelectionList).

O programa irá retornar na mesma variável informada os valores já indexados
e traduzidos, conforme exemplo abaixo:
Valor cLista antes: “casado,solteiro”
Valor cLista depois: “married,casado,single,solteiro”

Podendo a atribuição 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 técnica de tradução Multi-Idiomas, tudo o que antes era LIST-ITEMS, é
automaticamente convertido para LIST-ITEM-PAIRS nos pontos de tradução pelos programas já
mencionados, com isso, qualquer referência a LIST-ITEMS destes campos após os pontos de
tradução, deverão ser retrabalhados para tratar a partir de agora, LIST-ITEM-PAIRS, tendo este
utilitário como facilitador para esta implementação. Qualquer dúvida adicional, verificar o item
abaixo que trata sobre LIST-ITEMS.

UT-LITER.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR. Este
sofreu alterações para contemplar as novas funcionalidades do modelo de
tradução Multi-Idiomas, como novo conceito de contextualização, hierarquia
de busca e dialetos das Strings.
Para que não fosse gerado nenhum tipo de impacto sobre todo o legado de
programas com o antigo modelo do ut-liter, seu forma de chamada e
parâmetros não foram alterados, mantendo o padrão já conhecido e definido
neste manual.
Sintaxe: {utp/ut-liter.i <Literal> <Contexto> <Alinhamento>}

Sendo que nesta nova ut-liter, o alinhamento não irá gerar nenhum tipo de
diferença no comportamento da string de retorno, mantida apenas para fins de
compatibilidade. Para evitar problemas com este parâmetro, sempre passá-lo

Utilização
Objetivo

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
105

com valor em branco ("") caso utilizando o programa .p, ou simplesmente não
passar, caso utilizando a include, conforme exemplos abaixo:
Ex:

run utp/ut-liter.p (input “Teste”,”*”,””).
{utp/ut-liter Teste *}

Onde “Teste” é a literal sendo passada, e "*" é o contexto, sendo este
considerado o contexto genérico, não sendo passado nada para o terceiro
parâmetro, que seria o alinhamento, considerado então como branco.
Importante No modelo de tradução Multi-Idiomas, nenhuma string de destino pode ser maior
que a string de origem, conforme regra que já vinha sendo utilizado no processo de tradução de
fontes. Outra regra importante é que strings que possuem espaços em branco, estes espaços
devem ser convertidos para "_" antes da chamada a ut-liter.p. Ex: {utp/ut-liter.i Teste_agora *}
OBS.: Se a literal passada terminar com “:U” a literal não será traduzida e a mesma será
retornada sem os dois últimos caracteres.

UT-MSGS.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR,
utilizado para apresentar as mensagens dos produtos Datasul. Este utilitário
também sofreu alterações para contemplar as novas funcionalidades descritas e
possui a característica da busca por mensagens baseando-se no dialeto e no
contexto cadastrado para a mensagem.
Para manter compatilidade com o legado existente nos produtos, sua sintaxe
foi mantida inalterada, conforme segue abaixo:
Sintaxe: run utp/ut-msgs.p (input <ação>
input <número da mensagem>
input <parâmetros>).

Onde:
<ação> é a ação que será tomada pelo programa, podendo ser "show" para
mostrar, "msg" para retornar a mensagem, e "help" para retornar o help da
mensagem.
<número da mensagem> é o número da mensagem
<parâmetros> São os parâmetros a serem substituídos na mensagem

Utilização
Objetivo

Maiores detalhes podem ser consultados na referência geral deste utilitário
neste documento.

UT-FIELD.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores das propriedades dos campos do dicionário de
dados, como label, description, etc. O que difere esta versão do modelo de
tradução Multi-Idiomas para a versão anterior é que a busca não é mais
realizada sobre o próprio dicionário, e sim diretamente na tabela de strings
externas do produto, baseando-se na chave banco.tabela.campo.propriedade,
conforme mencionado em itens de tradução neste documento.
Foi mantido basicamente para não gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substituído pelo ut-liter,
devido sua maior facilidade de identificação e customização futura pelo
usuário.
Sua sintaxe não foi alteradada, sendo ainda:
{utp/ut-field.i banco tabela campo propriedade}

onde propriedade pode ser:
Propriedade

Descrição

1
2
3
4

Label
ColumnLabel
Help
Format

5

Initial

6

Description

Observaçã
o

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 usuário.
Nota Onde Existe a frase “Continua buscando do banco”, significa que o comportamento do
utilitário não foi alterado, mantendo a mesma funcionalidade da implementação anterior.

Utilização
Objetivo

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
107

UT-TABLE.P
Utilitário já existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores de propridades das tabelas do dicionário de
dados, como desc, label, etc. O que difere esta versão do modelo de tradução
Multi-Idiomas para a versão anterior é que a busca não é mais realizada sobre
o próprio dicionário, e sim diretamente na tabela de strings externas do
produto, baseando-se na chave banco.tabela.propriedade, conforme citado em
itens de tradução neste documento.
Foi mantido basicamente para não gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substituído pelo ut-liter,
devido sua maior facilidade de identificação e customização futura pelo
usuário.
Sua sintaxe não foi alteradada, sendo ainda:
{utp/ut-table.i <banco> <tabela> <propriedade>}

onde propriedade é:
Propriedade

Descrição

1
2

File-Label
Dump_nam
e

3

Desc

Observaçã
o
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 usuário.
Nota Quando comentado "Continua buscando do banco", isto quer dizer que o programa não
está buscando o valor das strings externas, e sim continua buscando do schema do banco atual
que está conectado a sessão, como a versão anterior já realizava.

1). Input <IndStringRetorno>). Este utilitário realiza a busca na tabela de strings externas. 2.  Identificador String de retorno . também o nome de menu utilizado para que estes itens sejam apresentados no produto. existe nestas tabelas além das descrições dos respectivos itens nos dialetos suportados. "*". sendo estes:  Origem String substituindo os espaçõs em branco por "_". Ex: utp/ut-ltmnu. normalmente "*" (Contexto Genérico)  Identificador da String (Os itens de menu estão entre 1 e 7).P Novo utilitário criado para a tradução de todos os itens de menu (Itens de tradução de 1 a 7).p (input replace(des_modul_dtsul."_"). Sintaxe: run utp/ut-ltmnu. Neste caso."_").Utilização Objetivo UT-LTMNU. tendo para este parâmetro dois possíveis valores: Parâmetro 1 2 Retorno Descrição do Item de Menu Traduzido Descrição do nome de menu do item de menu traduzido. . e retorna sua tradução para o programa chamador. Para este programa é passado como parâmetro 4 valores.Para os itens de menu. dos respectivos itens de menu. " ".p (input r replace(<des_item_menu>.  Contexto desejado. Input <Identificador>." ". Input <contexto>. Este identificador tem o objetivo de indicar qual a string que o desenvolvedor requer que seja retornado pelo utilitário.

podendo estes serem realizados diretamente com os valores em Português. será apresentada uma mensagem Progress de erro que evidencia a necessidade de troca de LIST-ITEMS para LIST-ITEM-PAIRS (Erro 7454).I mas não necessariamente. pode-se utilizar a técnica Como implementar labels em retângulos. Caso um destes objetos Progress não-indexados for referenciado via LIST-ITEMS após estes pontos de tradução. Tradução de variáveis com view-as nas telas Para o label do retângulo que emoldura o radio-set e dá significado ao mesmo. fazendo com que esta alteração não gere maiores impactos sobre lógicas de negócio utilizadas nos programas. . nos pontos de tradução acima citados através da uttrcampos (InitializeInterface e Adm-Initialize). Mas no caso da funcionalidade multi-idiomas. deverá ser utilizado o utilitário ut-lstit. como selection-list's e combo-box's. isto não é obrigatório devido aos tradutores automáticos de telas já realizarem esta tradução de forma automática. e ainda para não gerar muitos impactos sobre o modelo de tradução mono-idiomas. Para popular o valor de ‘radio-buttons’ da variável view-as radio-set pode-se utilizar o include XXINC/I99XX999. devido ao modelo de tradução Multi-Idiomas contemplar sua tradução de forma automática em tela. OBJETOS PROGRESS NÃO-INDEXADOS Para uma melhor adequação da nova técnica de tradução ao modelo existente anteriormente de objetos Progress não indexados. indexando este objeto sempre pelo seu valor original normalmente em Português.p explicado acima neste documento para realizar o devido tratamento e sua troca de listitems para list-item-pairs.View-as Radio-Set APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 109 Este exemplo irá retornar a descrição do respectivo módulo Datasul no dialeto do usuário através do RETURN-VALUE. Neste caso. todos os objetos que utilizavam LIST-ITEMS nos programas passaram a ser automaticamente convertidos para LIST-ITEM-PAIRS.

. era necessário a include i-lgcode para determinar o idioma. é possível utilizar o radio-set como view-as de variáveis independentes de campos do dicionário de dados.05: Dentro do diretório VARINC. var09999.Devedora/Credora ** ********************************************************/ &glob val1 Devedora &glob val2 Credora {include/ind01-10.i campo natureza (conta) . Colocar um radio-set na tela (por exemplo. .i var10001. Exemplos: var00001. através da utilização de includes padrões.08: Dentro do diretório VARINC-RH. SmartViewer) e definir o seu 'radio-buttons' com valores 'brancos'. Neste novo modelo tal referência não é mais necessária.i Para o Datasul-HR 2.Estes includes (XXINC e VARINC) precisam ser idioma Português.i . criar uma include que deve ter como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 10000 até 19999.i} {1} {2}} /* fim */ Observação Na versão anterior a multi-idiomas.i . Exemplos: var10000. Quando um desenvolvedor cria um novo include de dicionário de dados. deve criá-lo no layout a seguir. pois nesta tem-se uma única instalação com suporte a multi-idiomas. conforme exemplo: /******************************************************* ** ** i01ad047. de acordo com o roteiro abaixo: 1. 2.i var00002. Mas. Seguir a nomenclatura abaixo para a include que é utilizada para popular o campo em Português para tradução em Multi-idiomas: Para o Datasul-EMS 2. criar uma include que tem como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 000001 até 09999.

w ** *****************************************************/ &glob val1 Devedora &glob val2 Credora {include/ind01-10.i 3. deve criá-lo no layout a seguir: /*********************************************************** ** ** i01ad047.i campo natureza (conta) . Os includes de dicionário de dados (XXINC e VARINC) precisam ser sempre em Português. e através dos includes XXINC/I99XX999. var19999.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 111 .i 07} rs-xxx:screen-value in frame {&frame-name} = View-as Combo-box "1":U. a sua utilização deve estar limitada à representação de campos indicadores do dicionário de dados. Este include tem o seguinte conteúdo: /**************************************************** ** ** var99999.i} {1} {2}} /* fim */ .Devedora/Credora ** ************************************************************/ &glob val1 Devedora &glob val2 Credora {include/ind01-10.i} {1} {2}} /* fim */ 4. Quando um desenvolvedor cria um novo include de dicionário de dados.i Variável: cb-xxx Programa:xxp/xx9999. No 'local-initialize' antes do dispatch da ADM deve-se carregar o 'radiobuttons' deste radio-set.I. próprios para este fim. bem como seu valor inicial (screen-value): assign rs-xxx:radio-buttons in frame {&frame-name} = {varinc/var99999. Inicialmente.

Exemplos: var10000.i Variável: cb-xxx Programa:xxp/xx9999. como view-as de variáveis independentes de campos do dicionário de dados.i var00002. era necessário a include i-lgcode para determinar o idioma. 2.i 3.08: Dentro do diretório VARINC-RH. Seguir a nomenclatura abaixo para a include que é utilizada para tradução: Para o Datasul-EMS 2.i} {1} {2}} /* fim */ .Observação Na versão anterior a multi-idiomas. pois nesta tem-se uma única instalação com suporte a multi-idiomas.w ** *****************************************************/ &glob val1 Devedora &glob val2 Credora {include/ind01-10. Colocar um combo-box na tela (por exemplo. Neste novo modelo tal referência não é mais necessária. . var09999.i var10001. criar uma include que deve ter como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 10000 até 19999.05: Dentro do diretório VARINC. através da utilização de includes padrões. criar uma include que tem como padrão de nomenclatura um prefixo "var" e uma seqüência que vai de 00001 até 09999.i Para o Datasul-HR 2. de acordo com o roteiro a seguir: 1. é possível utilizar o combo-box.i . SmartViewer) e não definir o seu 'list-items' e 'initial'. var19999. Mas. . Este include tem o seguinte conteúdo: /**************************************************** ** ** var99999.i . Exemplos: var00001.

os espaços extras para tradução foram recalculados para column-labels dos campos no dicionário de dados. entretanto não se deve esquecer da possibilidade de tradução. e o valor será a referência em Português presente na include. Espaço Extra para tradução em relatórios  tamanho de uma coluna num layout (down frame) está limitada ao tamanho do formato do campo ou do label do mesmo.p. não gerando problemas com lógica de negócio. Após este ponto. o que for maior.p para sua devida conversão para LIST-ITEM-PAIRS. ou em momento posterior utilizando-se o utilitário ut-lstit. não podem haver referências diretas na forma de string ("") aos itens do combo-box no fonte. deve-se carregar o 'list-items' deste combo-box.. em seu programa. O seu label será automaticamente tratado pelo tradutor automático de telas presente nas templates.i 03} cb-xxx:screen-value in frame {&frame-name} = {varinc\var99999. CERTO: if cb-tipo:screen-value in frame {&frame-name} = {varinc\var99999.  na utilização de literais para compor column-labels de variáveis não é necessário preocupar-se com o espaço extra para tradução. No 'local-initialize' antes do dispatch do método ADM. Importante Apenas antes do método DISPATCH do procedure Adm-Initialize é possível implementação com LIST-ITEMS. Com base nisto.i 04 2} then .i 04 1}.Column-Labels APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 113 4. 5.i. é necessário a utilização do utilitário utlstit. isto é. deve ser realizada através do include var99999.. . Exemplo: ERRADO: if cb-tipo:screen-value in frame {&frame-name} = "Passivo" then... bem como seu valor inicial (screen-value): assign cb-xxx:list-items in frame {&frame-name} = {varinc/var99999. Toda codificação que precisar referenciar o valor de um item do combobox.

>>>.99 >>>>>9 XXXXXXXXXXXXXXXX >. Cliente Descrição Total Pedidos ------------------------------------->>>>>9 XXXXXXXXXXXXXXXX >. {utp/ut-liter.99 ____Total Geral: >>.>>9.>>>.>>9. Cliente Descrição Total Pedidos ------------------------------------->>>>>9 XXXXXXXXXXXXXXXX >.>>>.99 >>>>>9 XXXXXXXXXXXXXXXX >.99 PRÁTICAS PARA IMPLEMENTAÇÃO MULTI-IDIOMAS Neste item estarão sendo abordados alguns casos práticos que podem ser encontrados durante a execução de uma implementação/alteração de programas para a portabilidade do produto para a nova técnica de tradução.99  deve existir o tratamento do espaço extra para tradução. que deve ser reservado sempre à esquerda do label.>>9. . Abaixo segue demonstração de alguns casos práticos onde será possível identificar algumas das principais diferenças na forma de programar para a técnica de tradução Multi-Idiomas em relação ao modelo anterior.>>>.99 >>>>>9 XXXXXXXXXXXXXXXX >.>>9.i Total_Geral} assign de-total-geral:label in frame f-total = return-value.Side-Labels Exemplo: {utp/ut-liter Total_Pedidos} assign de-total-pedidos:label in frame f-relat = trim{returnvalue}.>>>.>>9.99 >>>>>9 XXXXXXXXXXXXXXXX >.>>9.>>>.>>9.>>>.

"Remessa Beneficiamento"."). será apresentada como segue: assign cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1 = "Remessa Beneficiamento". "Retorno Beneficiamento". "Reajuste Preço".tp-oper-terc = lookup(cb-tp-oper-terc.cb-tp-oper-terc:list-items in frame fPage2."). "Retorno Beneficiamento".tp-oper-terc como 3. seja esta conversão feita de forma direta no programa ou através do utilitário ut-lstit. Se o campo tt-natur-oper. ”Remessa Consignação".p.". . "Devolução Consignação".". e algumas observações: assign cb-tp-oper-terc:list-items in frame fPage1 = "Remessa Beneficiamento".tp-oper-terc. "Drawback" . "Faturamento Consignação". "Remessa Consignação". ASSIGN tt-natur-oper. Agora. A seguir uma lógica que era antes realizada com LIST-ITEMS. ASSIGN cb-tp-oper-terc:screen-value in frame fPage2 = entry(ttnatur-oper."Retorno Beneficiamento". esta mesma lógica depois de convertida para LIST-ITEM-PAIRS.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 115 Caso Prático Diferenças LIST-ITEMS para LIST-ITEM-PAIRS Este primeiro caso prático está relacionado com a utilização de LIST-ITEMPAIRS e suas diferenças em relação à utilização com LIST-ITEMS. Se o usuário informar na tela "Remessa Consignação" gravará o valor no campo tt-natur-oper."Remessa Consignação".cbtp-oper-terc:list-items in frame fPage2.tp-oper-terc ter o valor 2 trará com SCREEN-VALUE "Retorno Beneficiamento".

é necessário realizar alguns tratamentos para contemplar qualquer idioma sendo executado pelo produto. Apenas tomar o cuidado de sempre gravar o valor par. ASSIGN cb-tp-oper-terc:screen-value in frame fPage2 = entry(tt-natur-oper.tp-oper-terc = lookup(cb-tp-operterc."."). conforme abaixo: define variable tp-oper-terc as int init 2.tp-oper-terc é populada. que é o valor indexador do campo. principalmente em sessões que estão executando em Português. Se o campo tt-natur-oper. Neste caso. devido este estar repetido. no caso 3.tp-oper-terc."Reajuste Preço".tp-oper-terc ter o valor 2 trará com SCREEN-VALUE "Remessa Beneficiamento".").".cb-tp-oper-terc:list-items in frame fPage2. e então com isso pode-se levantar duas alternativas:  Alterar a lógica de onde esta temp-table é populada para contemplar a localização do item de negócio dentro do combo. A questão principal neste trecho é a necessidade de analisar onde a tt-naturoper. será necessário acresce-lo em 1 unidade.  Manter a lógica da temp-table e fazer algumas implementações que fariam que o número retornado para a tp-oper-terc seja como se estivesse sendo tratado um LIST-ITEMS. que alteraria de 3 para 6 no primeiro caso."Devolução Consignação". "Drawback".tp-oper-terc como 6. ASSIGN tt-natur-oper."Drawback" ."Faturamento Consignação". Caso seja retornado o valor impar. Se o usuário informar na tela "Remessa Consignação" gravará o valor no campo tt-natur-oper. /* Valor arbitrado para fins de demonstração */ ."Faturamento Consignação".cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage2. "Reajuste Preço". "Devolução Consignação".

Reajuste Preço. evitando assim erros com lógicas de negócio deste mesmo programa sendo utilizado em releases anteriores.". else ASSIGN tp-oper-terc = lookup(cb-tp-oper-terc:screenvalue. Deixamos como sugestão. Importante Esta alteração direta de LIST-ITEMS para LIST-ITEM-PAIRS somente é necessária caso a referência ao campo esteja depois dos pontos de tradução (Ver item pontos de tradução neste documento).".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. trabalhar direto na lógica de negócio da temp-table */ ASSIGN cb-tp-oper-terc:screen-value in frame fPage1 = entry(tp-oper-terc * 2.Faturamento Consignação. .Remessa Beneficiamento.Remessa Consignação.") / 2.Devolução Consignação. define frame fPage1 cb-tp-oper-terc.".APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 117 define variable cb-tp-oper-terc as char format "x(30)" view-as combo-box list-items "". caso contrário. ou seja.cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1. /* Considerando que esta temp-table tt-natur-oper. update cb-tp-oper-terc with frame fPage1.Reajuste Preço.".tp-oper-terc sempre estará armazenando os valores como não indexados.Devolução Consignação.Drawback".Faturamento Consignação.Retorno Beneficiamento.Remessa Consignação. Para estes casos é necessário definir qual a melhor forma de implementação realizando uma análise do caso. utilizar a lógica com gravação do valor da temp-table ainda tomando como base o valor não-indexado.Drawback.Retorno Beneficiamento.cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1."). ainda utilizando list-items para a sua gravação.") + 1) / 2. assign cb-tp-oper-terc:LIST-ITEM-PAIRS in frame fPage1 = "Remessa Beneficiamento. analisando-se o fato que as manutenções estarão sendo realizadas em WorkSpaces de releases que já estão no mercado. If lookup(cb-tp-oper-terc:screen-value.

Tradução automática em frame de relatório Para este caso. run utp/ut-lstit.Caso conversão de List-items para LIST-ITEM-PAIRS Quando da necessidade de atribuir valores a algum objeto Progress nãoindexado em tela após os pontos de tradução.p (input-output cLista). Para isto. seguir o modelo de construção abaixo: Antes: assign cb-combo:list-items = {varinc/var00002. assign cb-combo:list-item-pairs = cLista.i 04 02} &endif Onde "{&FNC_MULTI_IDIOMA}" é o pré-processador que indica que a função de tradução em multi-idiomas está habilitada. &else assign cb-combo:list-items = {varinc/var00002.i 04 02}. deverá realizar sua chamada ou imediatamente após a definição da frame ou antes da realização do display da frame.i 04 02} Depois: &if "{&FNC_MULTI_IDIOMA}" = "Yes" &then assign cLista = {varinc/var00002. mantendo inclusive a lógica anterior no sentido de não gerar impacto sobre releases já liberadas comercialmente. deve ser chamado diretamente o utilitário que realiza a tradução através dos handles dos objetos presentes na relatório frame em questão. Segue abaixo um exemplo de sua aplicação: .

é necessário utilizar o programa ." ". &IF "{&FNC_MULTI_IDIOMA}" = "Yes" &THEN Run utp/ut-trfrrp.tp-etiq-ini format "zzzzzzzzz9" colon 60 "|< tt-param. ao invés de utilizar a include ut-liter."*".p (input Frame f-fim:Handle).""). run utp/ut-liter.arquivo no-label format "x(30)" with side-label stream-io width 132 frame f-fim."_"). &ENDIF Traduzir valor armazenado em uma variável Para tradução de valores em variáveis.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 119 form skip(2) c-lit-selecao no-label colon 55 skip(1) tt-param.i.tp-etiq-fim format "zzzzzzzzz9" no-label >|" skip(1) c-lit-impressao no-label colon 55 skip(1) c-destino colon 60 "-" tt-param. .p associado a esta include.p (input replace(c-destino. Segue exemplo abaixo: define variable c-destino as char init "Destino Impressão" noundo.

Para evitar isso foi desenvolvida esta técnica que modifica a forma de chamada das includes varinc. As alterações desta técnica exigem um grande trabalho para adequar a include de retorno na proposta das temp-table. porque é necessário popular a tabela com os valores.i são utilizadas para definição da lista de valores e utilizam outra include para realizar o tratamento do tipo de retorno escolhido pelo usuário.Objetivo assign c-destino = return-value. porque ao invés de . além de mudar a estrutura das includes responsáveis pelo retorno.TRIM({varinc/var00137. Para tal. Esta é a situação na qual ocorre o erro 135 quando a lista de valores é enorme e ultrapassa o limite de caracteres para uma atribuição. entre outros. Em compensação. O retorno dos valores é montado através de pré-processadores e o valor destes são retornados todos de uma única vez para uma variável no programa que incorpora a include. Importante Sempre passar valores fixos e de variáveis substituindo-se o " " (Branco) por "_" (underline). Todas as includes da nomenclatura varinc/var99999. O erro 135 do Progress é devido ao limite de 32. disp c-destino. que pode ser um list-items de COMBO-BOX. Sendo assim é necessário alterar a include de retorno para gravar na variável desejada os valores um por vez. (135) na compilação de programas que incorporam includes de tradução para uma lista muito longa de valores. Tratando lista enorme de tradução em includes Evitar a ocorrência do erro ** More than 32000 characters in a single statement--use -inp parm.i 03})). o trabalho de manipulação dos valores para retorno diminui. é necessário gravar os valores dos pré-processadores da lista em uma temp-table e realizar um FOR EACH nesta temp-table para gravar os valores um por vez.000 caracteres para uma única atribuição de valores. a cada iteração do FOR EACH ou fazer um FIND diretamente no item desejado. valores para RADIO-BUTTON. um único elemento da lista. sendo necessário incluí-los um a um. As includes da pasta VARINC geralmente são utilizadas dessa forma: ASSIGN c-lista-retencao = ENTRY(1.

As includes de retorno trabalham com 7 tipos de retorno atualmente: 1.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 121 ficar concatenando uma lista enorme de pré-processadores basta apenas fazer FOR EACH ou FIND na temp-table conforme a opção de retorno desejada. . é necessário ler a temp-table que contém os valores da lista. View-as radio-set 3.val-item = "{&val250}" tt-list-items. FIELD val-item AS CHAR Em seguida. View-as combo-box 2.posicao = 1. .val-item = "{&val1}" tt-list-items. Retorna o item n da lista 5. . Retorna o numero de itens da lista 6. ASSIGN tt-list-items. ASSIGN tt-list-items. Valores para a propriedade Radio-Buttons de uma Radio-Set Para cada um desses tipos de retorno. Lista com os itens separados por virgula 4. . Esta temp-table deve ser definida dessa forma: DEFINE TEMP-TABLE tt-list-items NO-UNDO FIELD posicao AS INT. a temp-table deve ser populada com os valores dos préprocessadores: CREATE tt-list-items. Retorna a posição do item (número) 7. CREATE tt-list-items.posicao = 250. . CREATE tt-list-items. . ASSIGN tt-list-items.posicao = 2.val-item = "{&val2}" tt-list-items.

END.val-item.  Tratamento para o retorno do item n da lista: FIND LAST tt-list-items WHERE posicao = {2}.posicao). basta ler o ." + tt-listitems.val-item. FOR EACH tt-list-items BY posicao: IF l-log = NO THEN DO: ASSIGN c-lista = tt-list-items. O parametro {2} utilizado contém o indice do item desejado e é passado como parâmetro para a include de retorno. ELSE ASSIGN c-lista = c-lista + ". ASSIGN c-lista = STRING(tt-list-items. ASSIGN l-log = TRUE. Neste tipo de retorno o programa precisa estar preparado para ler a variável c-lista. sendo os valores gravados em ordem seqüencial. DEF VAR l-log AS LOG INITIAL FALSE NO-UNDO.  Tratamento para retornar o número total de itens na lista: FIND LAST tt-list-items.Abaixo segue lista de tarefas para implementação da técnica. Como a temp-table que armazena os itens possui um campo chamado “posicao”. trabalhando cada tipo de retorno:  Tratamento para o retorno do tipo View-as Combo-box ou Lista com os itens separados por virgula: É necessário ler a temp-table através de FOR EACH e ir concatenando os valores em uma variável caracter (c-lista neste exemplo) separando os elementos por virgula. END.val-item. ASSIGN c-lista = tt-list-items.

val-item + ".val-item + ".posicao. FIND FIRST tt-list-items WHERE val-item = c-chave NOLOCK NO-ERROR. ASSIGN c-chave = "{2}". IF AVAIL tt-list-items THEN ASSIGN c-lista = STRING(tt-list-items." + STRING(tt-list-items. Uma vez localizado esse item podemos pegar a posição dele na lista com o campo tt-list-items." + tt-listitems.  Tratamento para retornar a posição de um item na lista: DEF VAR c-chave AS CHAR NO-UNDO. Neste tratamento também utilizamos o parâmetro {2} para localizar o item na temp-table. END. sendo que dessa vez o parâmetro irá conter o próprio item.posicao). FOR EACH tt-list-items BY posicao: IF l-log = NO THEN DO: ASSIGN c-lista = tt-list-items. ELSE ASSIGN c-lista = c-lista + "." + STRING(tt-list-items.  Tratamento para retonar valores para a propriedade Radio-Buttons de uma Radio-Set: DEF VAR l-log AS LOG INITIAL FALSE NO-UNDO. Neste caso é feito tratamento semelhante para o retorno para view-as combo-box só invertendo a ordem de um item e sua respectiva posição na string final armazenada em c-lista.posicao). .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 123 campo posição do ultimo registro da temp-table para saber o número total de itens.posicao). ASSIGN l-log = TRUE. END. ELSE ASSIGN c-lista = ?.

i 03})). É necessário colocar a include em uma linha isolada.TRIM({varinc/var00137. . de preferência logo após a definição de variáveis do programa. não é possível fazer mais este tipo de atribuição: ASSIGN c-lista-retencao = ENTRY(1. Alterar o ponto de chamada da include VARINC nos programas que a utilizam: Devido as mudanças propostas pela técnica.

de acordo com o tipo de Cadastro Simples que se deseja construir.w Cadastro Simples . Caso não exista.  instanciar a SmartQuery na página 0 da Window Cadastro Simples e aceitar as sugestões de SmartLinks do Wizard.w Cadastro Simples -Alteração Masters/w-cadsi2.  verificar se já existe um programa de vá para e um programa de pesquisa para a tabela que se deseja construir um Cadastro Simples.w  em Arquivo | Novo. selecionar um dos estilos relacionados acima. criar uma nova utilizando o estilo CustomQuery Wizard. Caso não existam.Inclusão Masters/w-cadsi3.  verificar se já existe uma SmartQuery para a tabela que se deseja construir um Cadastro Simples. eles devem ser criados.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 125 CAPÍTULO 8 Construção de Programas utilizando os Estilos e suas Técnicas Como construir um Cadastro Simples Estilo Usado Nome Físico Cadastro Simples Masters/w-cadsim. .

Caso não exista. Ter o cuidado para que a SmartViewer fique centralizada na SmartWindow. Caso o fill-in se encaixe em uma das opções acima. acessar os atributos de instância 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. deve ser efetuado o registro para o WebEnabler. ou que possuírem um botão de zoom na sua direita. Portanto não é necessário efetuar o registro para esses fill-ins.  salvar a SmartWindow com o nome definido para o Cadastro Simples. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita.  criar um SmartLink do tipo STATE.  redimensionar a SmartWindow de acordo com os objetivos que foram colocados nela.  instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. ou possua trigger de "ENTRY".  verificar se já existe uma SmartViewer com os atributos da tabela que devem ser editados.  criar um SmartLink do tipo STATE. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. Observação Para os campos do tipo fill-in’s. tendo Source: p-exihel e como Target: SmartQuery. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field. tendo como Source: p-navega e como Target: SmartQuery. .

de acordo com o tipo de Cadastro Complexo que se deseja construir. .w  selecionar um dos estilos relacionados na tabela acima.  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 não exista. criar uma nova utilizando o estilo CustomQuery Wizard.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 127 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 Físico Cadastro Complexo Masters/w-cadcom.  instanciar a SmartQuery na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard.  acessar os atributos de instância 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. Caso não existam eles devem ser criados.Atualiza Masters/w-cadcon2.  verificar se já existe uma SmartQuery para a tabela que se deseja construir um Cadastro Complexo.w Cadastro Complexo .

ou que possuírem um botão de zoom na sua direita. . Caso o fill-in se encaixe em uma das opções acima. criar um SmartLink do tipo STATE. Observação Para os campos do tipo fill-in’s. e aceitar as sugestões de SmartLink do Wizard. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field. acima do folder. tendo como Source: p-exihel e como Target: SmartQuery.  instanciar a SmartViewer na página 0 da SmartWindow. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. deve ser efetuado o registro para o WebEnabler.  criar um SmartLink do tipo STATE. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. Portanto não é necessário efetuar o registro para esses fill-ins. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. ou seja. Caso não exista. acima do folder. tendo como Source: p-navega 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 possua trigger de "ENTRY".

conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. deve ser efetuado o registro para o WebEnabler.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 129  repetir os seguintes passos para as demais SmartViewers que devem estar colocadas nas páginas do folder:  verificar se já existe uma SmartViewer com os atributos que devem estar editados na página do folder. Portanto não é necessário efetuar o registro para esses fill-ins. Observação Para os campos do tipo fill-in’s. ou que possuírem um botão de zoom na sua direita.  instanciar a SmartViewer em determinada página do folder e aceitar as sugestões de SmartLink do Wizard. utilizando o estilo CustomViewer com Auto-Field. Caso não exista. . criar uma nova. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. Caso o fill-in se encaixe em uma das opções acima. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. ou possua trigger de "ENTRY".

Ter o cuidado para que a SmartViewer fique centralizada na SmartWindow. tendo como Source: SmartViewer da página 0 e como Target: SmartViewer recém instanciada no folder.  redimensionar a SmartWindow de acordo com os objetos que foram colocados nela. 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 .  acessar as propriedades do folder e renomear os labels das páginas.  salvar a SmartWindow com o nome definido para o Cadastro Complexo. criar um SmartLink de GROUP-ASSIGN.

Caso não existam. criar uma nova utilizando o estilo CustomQuery Wizard.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 131 h_viewer-1 GROUP-ASSIGN h_viewer-2 h_viewer-1 GROUP-ASSIGN h_viewer-3 h_viewer-1 GROUP-ASSIGN h_viewer-4 h_p-exihel STATE h_query h_p-navega STATE h_query Como construir um Cadastro Pai X Filho .  instanciar a SmartQuery na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard. Caso não exista.Filho Masters/w-adf.  verificar se já existe uma SmartQuery para a tabela pai. .Atualiza Filho Estilo Utilizado Nome Físico Window Cadastro Pai x Filho . eles devem ser criados.w  selecionar o estilo relacionado na tabela acima.  verificar se já existe um programa de "Vá para" e um programa de pesquisa para a tabela pai.  acessar os atributos de instância da SmartQuery e informar no atributo "Programa Pesquisa" o nome do programa de pesquisa da tabela pai e no atributo "Programa VáPara" o nome do programa de Vá Para da tabela pai.

ou possua trigger de "ENTRY". ou seja. deve ser efetuado o registro para o WebEnabler. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field.  criar um SmartLink do tipo STATE.  instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard. tendo como Source: p-exihel e como Target: SmartQuery. . tendo como Source: p-navega e como Target: SmartQuery. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. Portanto não é necessário efetuar o registro para esses fill-ins. acima do folder. Caso o fill-in se encaixe em uma das opções acima. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. criar um SmartLink do tipo STATE.  verificar se já existe uma SmartViewer com os atributos da tabela pai que devem estar expostos na página 0 da SmartWindow. Observação Para os campos do tipo fill-in’s. ou que possuírem um botão de zoom na sua direita. Caso não exista. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler.

aceitando os links indicados pelo Wizard. . Caso não exista.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 133  repetir os seguintes passos para os SmartBrowsers que devem estar colocadas nas páginas do folder:  verificar se já existe um SmartBrowser para a tabela filho.  colocar o SmartBrowser na página correspondente do folder. criar um novo utilizando o estilo CustomBrowser Inclui/Modifica.

. acessar os atributos de instância do SmartBrowser e informar o nome do programa de atualização da tabela filha. Se este programa não existir. deve ser criado utilizando-se o template Cadastro Inclui/Modifica Filho.

tendo como Source: SmartQuery e como Target: SmartBrowser recém instanciado no folder. deve-se incluir os botões 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.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 135  criar um SmartLink de Record.  caso seja necessário incluir botões de Seleção e/ou Parâmetros para a tabela do SmartBrowser. 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 .

estes devem ser divididos em mais viewers que devem ser colocadas nas páginas do folder.  se os campos a serem inclusos/modificados couberem em uma única viewer.w  selecionar o estilo relacionado na tabela acima.Implementação h_p-exihel STATE h_query Como construir um Cadastro Inclui/Modifica Filho Estilo Utilizado Nome Físico Window Inclui/Modifica Filho Masters/w-incmo3. formando um cadastro do tipo Complexo. o cadastro deve ser do tipo Simples. devendo-se eliminar o folder da SmartWindow. .  se os campos a serem inclusos/modificados não couberem em uma única viewer.

ou possua trigger de "ENTRY". e aceitar as sugestões de SmartLinks do Wizard. criar uma nova utilizando o estilo CustomQuery Wizard. Caso o fill-in se encaixe em uma das opções acima.  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. deve ser efetuado o registro para o WebEnabler. Portanto não é necessário efetuar o registro para esses fill-ins. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse.  criar um SmartLink de TABLEIO.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 137  verificar se já existe uma SmartQuery para a tabela que se deseja construir o Cadastro Inclui/Modifica Filho. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field. se o cadastro for do tipo complexo: . conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. Caso não exista. Caso não exista. ou que possuírem um botão de zoom na sua direita. tendo como Source: THISPROCEDURE e como Target: SmartViewer recém instanciada. Observação Para os campos do tipo fill-in’s.  instanciar a SmartQuery na página 0 (zero) da Window.   instanciar a SmartViewer na SmartWindow ou na página correspondente do folder no caso de um cadastro complexo. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita.

 em Startup on Page atribuir o valor 1.  entrar em Propertie Pages. 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).  na Local-Initialize da window. . pelo nome da viewer que contém o(s) campo(s) chave(s) da tabela. devem ser substituídas as ocorrências de "<viewer_principal>".  incluir a seguinte linha após o Dispatch padrão na Local-Initialize: {include/i-inifld.i}  deve-se atribuir a página 1 como sendo a página inicial do programa. Para isso é necessário:  acessar o Procedure Properties na janela do UIB. Exemplo: run pi-atualiza-parent in h_v06pd001 (input v-row-parent).

A tabela pai deve ser a mesma utilizada na query do Cadastro PaiXFilho que deve chamar este programa. RUN dispatch IN THIS-PROCEDURE (INPUT 'create-record':U ). . substituir as ocorrências de "<handle da viewer principal>" pelo handle da viewer que contém o campo chave da tabela. <tabela filho>: deve ser substituído pelo nome da tabela que deve estar sendo utilizada no cadastro. */ find order where rowid (order) = v-row-parent no-lock no-error. Onde: <tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se está utilizando no cadastro. */ /* Code placed here will execute AFTER standard behavior.<chave pai> = <tabela pai>. end. <chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que estabelece relacionamento com a tabela que deve estar sendo utilizada no cadastro. if available order then assign order-line.<chave pai>. substituir a ocorrência "<queryname>" pelo nome da query utilizada no cadastro. /* Code placed here will execute PRIOR to standard behavior.order-num. */ /* Dispatch standard ADM method. deve ser criada uma localcreate-record e após o run dispatch deve ser inserida a seguinte lógica: find <tabela pai> where rowid (<tabela pai>) = v-rowparent no-lock no-error.order-num = order. Exemplo: RUN pi-reposiciona-query IN h_q06pd001 (input v-rowtable).i h_v06pd001}  na procedure pi-reposiciona da window.  na SmartViewer que possuir a chave da tabela. Exemplo: {include/okfil.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 139  nas triggers de Choose dos botões de 'Ok' e 'Salvar'. if available <tabela pai> then do: assign <tabela filho>.

Onde: <nome buffer>: deve ser substituído pelo nome que se deseja dar ao buffer da tabela pai.cust-num:screen-value in frame {&frame-name} = "". if avail <nome buffer> then assign <tabela filho>. .cust-num). deve ser criada uma local-display-fields e uma local-add-record.cust-num:screen-value in frame {&frame-name} = string(b-customer. if avail b-customer then assign order.<chave pai>:screen-value in frame {&frame-name} = string(<nome buffer>. /* Code placed here will execute PRIOR to standard behavior. A tabela pai deve ser a mesma utilizada na query do Cadastro PaiXFilho que deve chamar este programa. e após o run dispatch deve ser inserida a seguinte lógica nas duas procedures: def buffer <nome buffer> for <tabela pai>.Exemplo  Se desejar preencher os campos chave da tabela pai na viewer para inclusão:  Na SmartViewer que possuir a chave da tabela. find <nome buffer> where rowid(<nome buffer>) = v-rowparent no-lock no-error. <tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se está utilizando no cadastro. else assign order.<chave pai>). */ def buffer b-customer for customer. <chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que estabelece relacionamento com a tabela que deve estar sendo utilizada no cadastro. find b-customer where rowid(b-customer) = v-row-parent no-lock no-error. */ /* Code placed here will execute AFTER standard behavior. RUN dispatch IN THIS-PROCEDURE (INPUT 'add-record':U ). */ /* Dispatch standard ADM method. <tabela filho>: deve ser substituído pelo nome da tabela que está sendo utilizada no cadastro. else assign <tabela filho>.<chave pai>:screen-value in frame {&frame-name} = “”.

<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se está utilizando no cadastro. */ /* Code placed here will execute AFTER standard behavior. deve ser criada uma local-add-record e após o run dispatch deve ser inserida a seguinte lógica na procedure: def buffer <nome buffer> for <tabela filho>. Onde: <nome buffer>: deve ser substituído pelo nome que se deseja dar ao buffer da tabela filho. find last b-order where b-order.<chave pai> = <tabela pai>. <chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que estabelece relacionamento com a tabela que deve estar sendo utilizada no cadastro.cust-num = customer. else assign order. */ def buffer b-order for order. <tabela filho>: deve ser substituído pelo nome da tabela que está sendo utilizada no cadastro.<chave filho> + 1). if avail b-order then assign order. /* Code placed here will execute PRIOR to standard behavior.<chave filho>:screen-value in frame {&frame-name} = string(<nome buffer>. A tabela pai deve ser a mesma utilizada na query do Cadastro PaiXFilho que deve chamar este programa.<chave pai> no-lock no-error. .order-num:screen-value in frame {&frame-name} = string(b-order.<chave filho>:screen-value in frame {&frame-name} = “1”.cust-num nolock no-error. else assign <tabela filho>. */ /* Dispatch standard ADM method. find last <nome buffer> where <nome buffer>. if avail <nome buffer> then assign <tabela filho>.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 141  Se desejar preencher seqüencialmente o campo chave da tabela filho para inclusão:  Na SmartViewer que possuir a chave da tabela.order-num:screen-value in frame {&frame-name} = “1”.order-num + 1). RUN dispatch IN THIS-PROCEDURE (INPUT 'add-record':U ).

caso não exista.w  selecionar o estilo relacionado na tabela acima.  verificar se já existe uma SmartQuery para a tabela pai. .  verificar se já existe um programa de Cadastro Inclui/Modifica Pai para manutenção da tabela Pai. para isso utilizar o template Cadastro Inclui/Modifica Pai.Ambos Masters/w-paiamb.  instanciar a SmartQuery na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard.Atualiza Ambos Estilo Utilizado Nome Físico Window Cadastro Pai x Filho . criar uma nova utilizando o estilo CustomQuery Wizard.Implementação 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_browser3 Como construir um Cadastro Pai X Filho . Caso não exista. deve ser criado.

deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. Caso não existam. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. . Portanto não é necessário efetuar o registro para esses fill-ins.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 143  verificar se já exista um programa "Vá para" e um programa de pesquisa para a tabela pai. tendo como Source o Painel p-exihel e como Target a SmartQuery. deve ser efetuado o registro para o WebEnabler.  criar um SmartLink do tipo STATE. o nome do programa de "Vá Para" da tabela pai e o nome do programa de Inclui/Modifica/Copia da tabela pai. acima do folder. criar uma nova SmartViewer. tendo como Source o Painel p-cadpai e como Target a SmartQuery. utilizando o estilo CustomViewer com Auto-Field.  criar um SmartLink do tipo STATE. ou que possuírem um botão de zoom na sua direita. Caso não exista.  verificar se já existe uma SmartViewer com os atributos da tabela pai que estão expostos na página 0 da SmartWindow. ou possua trigger de "ENTRY".  acessar os atributos de instância da SmartQuery e informar o nome do programa de pesquisa da tabela pai. ou seja.  criar um SmartLink do tipo STATE. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. Observação Para os campos do tipo fill-in’s. eles devem ser criados. Caso o fill-in se encaixe em uma das opções acima. tendo como Source o Painel p-navega e como Target a SmartQuery.

 repetir os seguintes passos para os SmartBrowsers que devem estar colocadas nas páginas do folder:  verificar se já existe um SmartBrowser para a tabela filho. . Caso não exista. criar um novo utilizando o estilo CustomBrowser Inclui/Modifica.  acessar os atributos de instância do SmartBrowser e informar o nome do programa de atualização da tabela filha. deve ser criado utilizando-se o template Cadastro Inclui/Modifica Filho. aceitando os links indicados pelo Wizard. Se este programa não existir. instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões da SmartLink do Wizard.  colocar o SmartBrowser na página correspondente do folder.

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 . deve-se incluir os botões abaixo do browse.  caso seja necessário incluir botões de Seleção e/ou Parâmetros para a tabela do SmartBrowser.  salvar a SmartWindow com o nome definido para o Cadastro Pai x Filho.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 145  ter o cuidado para que a SmartViewer fique centralizada na SmartWindow.

w  selecionar o estilo relacionado na tabela acima. o cadastro deve ser do tipo Simples.  se os campos a serem inclusos/modificados couberem em uma única viewer. formando um cadastro do tipo Complexo. . devendo-se eliminar o folder da SmartWindow.Implementação Como construir um Cadastro Inclui/Modifica Filho Estilo Utilizado Nome Físico Window Inclui/Modifica Filho Master/w-incmo3.  se os campos a serem inclusos/modificados não couberem em uma única viewer. estes devem ser divididos em mais viewers que devem ser colocadas nas páginas do folder.

deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 147  verificar se já existem uma SmartQuery para a tabela que se deseja construir o Cadastro Inclui/Modifica Filho.  criar um SmartLink de TABLEIO.  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. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. Caso não exista. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. deve ser efetuado o registro para o WebEnabler. Caso o fill-in se encaixe em uma das opções acima.  instanciar a SmartQuery na página 0 (zero) da Window. ou possua trigger de "ENTRY". ou que possuírem um botão de zoom na sua direita. Portanto não é necessário efetuar o registro para esses fill-ins. tendo como Source: THISPROCEDURE e como Target: SmartViewer recém instanciada. e aceitar as sugestões de SmartLinks do Wizard. se o cadastro for do tipo complexo: . Caso não exista. criar uma nova utilizando o estilo CustomQuery Wizard. Observação Para os campos do tipo fill-in’s.   instanciar a SmartViewer na SmartWindow ou na página correspondente do folder no caso de um cadastro complexo.

 entrar em Propertie Pages. Para isso é necessário:  acessar o Procedure Properties na janela do UIB. criar links de group-assign entre a viewer principal (viewer que conterá a chave da tabela) e as demais viewers (ver lista de links). devem ser substituídas as ocorrências de "<viewer_principal>". na Local-Initialize da window.  incluir a seguinte linha após o Dispatch padrão no Local-Initialize: {include/i-inifld.   em Startup on Page atribuir o valor 1. . pelo nome da viewer que contém o(s) campo(s) chave(s) da tabela.i}  deve-se atribuir a página 1 como sendo a página inicial do programa. Exemplo: run pi-atualiza-parent in h_v06pd001 (input v-row-parent).

<chave pai>. Exemplo: RUN pi-reposiciona-query IN h-q06pd001 (input v-rowtable). /* Code placed here will execute AFTER standard behavior. Onde: <tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se esta utilizando no cadastro. if available order then assign order-line.i h_v06pd001}  na procedure pi-reposiciona da window. substituir a ocorrência "<queryname>" pelo nome da query utilizada no cadastro. Exemplo: {include/okfil. */ /* Dispatch standard ADM method. substituir as ocorrências de "<handle da viewer principal>" pelo handle da viewer que contém o campo chave da tabela. */ . find order where rowid (order) = v-row-parent no-error.order-num = order. RUN dispatch IN THIS-PROCEDURE ( INPUT 'create-record':U ).<chave pai> = <tabela pai>.  na SmartViewer que possuir a chave da tabela.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 149  nas triggers de Choose dos botões de 'Ok' e 'Salvar'.order-num. deve ser criada uma localcreate-record e após o run dispatch deve ser inserida a seguinte lógica: find <tabela pai> where rowid (<tabela pai>) = v-row-parent no-lock no-error. if available <tabela pai> then do: assign <tabela filho>. end. A tabela pai deve ser a mesma utilizada na query do Cadastro PaiXFilho que deve chamar este programa <tabela filho>: deve ser substituído pelo nome da tabela que deve estar sendo utilizada no cadastro <chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que estabelece relacionamento com a tabela que deve estar sendo utilizada no cadastro /* Code placed here will execute PRIOR to standard behavior.

 se os campos a serem inclusos/modificados couberem em uma única viewer.Implementação 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 Cadastro Inclui/Modifica Pai Estilo Utilizado Nome Físico Window IncluiModifica Pai Master/w-incmdp. . o cadastro deve ser do tipo Simples. devendo-se eliminar o folder da SmartWindow.w  selecionar o estilo relacionado na tabela acima.

criar uma nova utilizando o estilo CustomQuery Wizard. Caso não exista.  para cada viewer a ser utilizada deve-se seguir os seguintes passos: . formando um cadastro do tipo Complexo.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 151  se os campos a serem inclusos/modificados não couberem em uma única viewer.  verificar se já existe uma SmartQuery para a tabela que se deseja construir o Cadastro Inclui/Modifica Filho.  instanciar a SmartQuery na página 0 (zero) da Window. estes devem ser divididos em mais viewers que devem ser colocadas nas páginas do folder.

 em Startup on Page atribuir o valor 1.  acessar a Procedure Properties na janela do UIB. Caso não exista. ou que possuírem um botão de zoom na sua direita.   instanciar a SmartViewer na SmartWindow ou na página correspondente do folder no caso de um cadastro complexo. Observação Para os campos do tipo fill-in’s. Para isso é necessário.i}  deve-se atribuir a página 1 como sendo a página inicial do programa.  entrar em Propertie Pages. 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). Caso o fill-in se encaixe em uma das opções acima. e aceitar as sugestões de SmartLinks do Wizard.  incluir a seguinte linha após o Dispatch padrão na Local-Initialize: {include/i-inifld. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. deve ser efetuado o registro para o WebEnabler. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field. . deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. tendo como Source: THISPROCEDURE e como Target: SmartViewer recém instanciada. Portanto não é necessário efetuar o registro para esses fill-ins. verificar se já existe uma SmartViewer com os atributos da tabela a serem editados. ou possua trigger de "ENTRY". O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse.  criar um SmartLink de TABLEIO.

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 .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 153  nas triggers de Choose dos botões de 'Ok' e 'Salvar'. substituir a ocorrência "<queryname>" pelo nome da query utilizada no cadastro. substituir as ocorrências de "<handle da viewer principal>" pelo handle da viewer que contém o campo chave da tabela. Exemplo: RUN pi-reposiciona-query IN h_q07pd001 (input v-rowtable). Exemplo: {include/okpai.i h_v07pd002}  na procedure pi-reposiciona da window.

a query deve conter a tabela dos registros filhos que irão ser exibidos no Cadastro PaiXFilho. essa tabela deve ser a mesma tabela utilizada na query do Cadastro PaiXFilho em que o browser deve ser utilizado.  seguir os passos do Wizard.w  selecionar o estilo relacionado na tabela acima. observando que:   deve-se indicar uma tabela externa. Exemplo de query do browser: .Implementação h_viewer1 GROUP-ASSIGN h_viewer3 h_query RECORD h_viewer2 h_query RECORD h_viewer3 Como construir um CustomBrowser Inclui/Modifica Estilo Utilizado Nome Físico Window Inclui/Modifica Pai Master/w-incmdp.

APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 155  toggle-box "Indexed-Reposition" deve ser marcado. . a coluna "Returned" do browse. deve conter o valor "Fields Used" e o toggle-box "Sort-ByPhrase" deve ser marcado.  em "Options".

deve-se entrar com a seguinte condição: <Tabela>.Implementação  após a criação do browse com a ajuda do Wizard. Como construir um CustomBrowser Zoom Wizard Estilo Utilizado Nome Físico Custom Browser Zoom Wizard Masters/wbrwzoo. deve-se obedecer aos seguintes itens:  na página where.  seguir os passos do Wizard observando que o browse deve exibir apenas os registros que estejam entre os limites estabelecidos pelo usuário para isso na definição da query do browse.<Campo> <= fi-fin-<campo> Onde: .<Campo> >= fi-ini-<campo> and <Tabela>.w  selecionar o estilo relacionado na tabela acima. salvar o browse de acordo com as normas de nomenclatura.

. formato e tamanho dos fill-in´s para faixa de valores devem ser alterados de modo que se tornem compatíveis com os campos utilizados na condição anterior. e.: A condição pode obedecer a valores de mais campos bastando adicionála.<Campo2>  >= >= >= >= fi-ini-<campo1> fi-ini-<campo1> fi-ini-<campo2> fi-ini-<campo2> and and and .<Campo2> <Tabela>.<Campo>: é o campo da tabela ao qual deseja-se estabelecer limites. para isso deve-se: . tipo.<Campo1> <Tabela>. o nome. Exemplo: <Tabela>. fi-ini-campo e fi-fin-campo são os fill-ins que o usuário irá entrar com a faixa de valores Obs.. depois de concluída a definição do browse.<Campo1> <Tabela>.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 157 <Tabela>.

. acessar os atributos do fill-in c-inicial.  na dialog Dictionary Defaults. na frame f-main disposto acima do browse.  em database fields deve-se indicar o campo que esta se fazendo a condição para faixa de valores. desmarcar os toogle-boxes Label e Database Variable.

as imagens Image-1 e Image-2 devem ser copiadas e reposicionadas entre os dois novos campos. . seu valor inicial deve ser 999. Obs. Exemplo: para um fill-in do tipo inteiro de formato "999. Exemplo: fi-ini-cust-num. bastando que sejam adicionados os fill-in´s e que sejam seguidos os passos citados anteriormente.999. para um fill-in do tipo caracter de formato "x(6)". seu valor inicial deve ser "ZZZZZZ" (seis letras "z" maiúsculas). Exemplo: fifin-cust-num.999. observando que seu nome deve ser alterado para o formato fi-fin-<campo>. no formato fi-ini-<campo>.  mais campos podem ser adicionados a condição de faixa de valores. ou inserir diretamente os campos na frame e em seguida desvinculá-los da base através de suas propriedades e alterando seus nomes. para um fill-in do tipo caracter de formato "x(6)".  alterar o valor inicial do fill-in de fim de faixa para o maior valor aceito por ele. para o menor valor aceito por ele.  repetir os mesmos passos para o fill-in c-final. seu valor inicial deve ser 0 (zero).APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 159  o nome do fill-in deve ser alterado para o mesmo nome relacionado na condição da query do browse.: se forem adicionados mais campos para a faixa de valores. seu valor inicial deve ser "" (branco).999.99".  alterar o valor inicial do fill-in de início de faixa. conforme a faixa original.99. Exemplo: para um fill-in do tipo inteiro de formato "999.99".

os fill-in´s de inicio de faixa (fi-ini-<campo>) poderão possuir labels. Exemplo: assign input frame {&frame-name} c-inicial c-final. Como construir uma Consulta Simples  Estilo Utilizado Nome Físico Window Consulta Simples Masters/w-consim. . do browser - <campoN>: campo N do browser  salvar o browse seguindo as normas de nomenclatura.w em Arquivo | Novo.i Sports Customer Cust-Num 1} assign fi-ini-Cust-Num:Label in frame {&frame-name} = return-value. as ocorrências dadas por c-inicial e c-final devem ser alteradas para fi-ini-campo e fi-fin-campo respectivamente.. criando a procedure local-initialize antes do dispatch. Para: assign input frame {&frame-name} fi-ini-cust-num fi-fin-custnum.  se necessário.>: campo ..Implementação  na trigger do botão bt-confirma. Exemplo: {utp/ut-field.  alterar a procedure pi-retorna-valor. ou se houverem mais de um campo para seleção de valores. Para isso os fill-in´s não devem se no-labels. onde: - <tabela>: nome da tabela do browser - <campo1>: primeiro campo do browser - <campo2>: segundo campo do browser - <campo.. a atribuição do label deverá ser feita por meio do utilitário ut-field ou ut-liter. Como esses fill-in´s não são vinculados ao banco de dados.. selecionar o estilo relacionado acima.

Caso não existam.  verificar se já existe uma SmartViewer com os atributos da tabela que devem ser editados. criar uma nova utilizando o estilo CustomQuery 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 não exista. . tendo como Source: p-exihel e como Target: SmartQuery.  acessar os atributos de instância 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.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 161  verificar se já existe uma SmartQuery para a tabela que se deseja construir a Consulta Simples. eles devem ser criados. Caso não exista. tendo como Source: p-navega e como Target: SmartQuery.  criar um SmartLink do tipo STATE. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field.  instanciar a SmartQuery na página 0 da Window Consulta Simples e aceitar as sugestões de SmartLinks do Wizard.

 verificar se já existe uma SmartQuery para a tabela que se deseja construir um Cadastro Complexo. Lista de Links Source Link Type Target h_p-navega NAVIGATION h_query h_p-navega STATE h_query h_query RECORD h_viewer h_p-exihel STATE h_query Como construir uma Consulta Complexa Estilo Utilizado Nome Físico Window Consulta Complexa Masters/w-concom.Implementação Observação Para os campos do tipo fill-in’s. Ter o cuidado para que a SmartViewer fique centralizada na SmartWindow. ou que possuírem um botão de zoom na sua direita. Caso o fill-in se encaixe em uma das opções acima.  redimensionar a altura da SmartWindow de acordo com os objetos que foram colocados nela. deve ser efetuado o registro para o WebEnabler. Portanto não é necessário efetuar o registro para esses fill-ins. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler.w  selecionar o estilo relacionado na tabela acima.  instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. .  salvar a SmartWindow com o nome definido para o Cadastro Simples. ou possua trigger de "ENTRY". O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. Caso não exista. criar uma nova utilizando o estilo CustomQuery Wizard.

eles devem ser criados.  acessar os atributos de instância da SmartQuery e informar no atributo "Programa Pesquisa" o nome do programa de pesquisa da tabela e no atributo "Programa Vá para" o nome do programa de Vá para da tabela.  verificar se já existe uma SmartViewer com os atributos da tabela que devem estar expostos na parte principal da SmartWindow. e aceitar as sugestões de SmartLink do Wizard.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 163  instanciar a SmartQuery na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard.  instanciar a SmartViewer na página 0 da SmartWindow. Caso não existam. .  criar um SmartLink do tipo STATE. criar uma nova SmartViewer utilizando o estilo Custom Viewer com Auto-Field.  criar um SmartLink do tipo STATE. tendo como Source: p-exihel e como Target: SmartQuery. acima do folder. acima do folder.  verificar se já existe um programa de Vá para e um programa de pesquisa para a tabela que se deseja construir um Cadastro Complexo. tendo como Source: p-navega e como Target: SmartQuery. ou seja. Caso não exista.

ou possua trigger de "ENTRY". Portanto não é necessário efetuar o registro para esses fill-ins. ou que possuírem um botão de zoom na sua direita. Caso não exista. Caso o fill-in se encaixe em uma das opções acima. . criar uma nova.  criar um SmartLink de GROUP-ASSIGN. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. deve ser efetuado o registro para o WebEnabler. repetir os seguintes passos para as demais SmartViewers que devem estar colocadas nas páginas do folder:  verificar se já existe uma SmartViewer com os atributos que devem estar dispostos na página do folder. tendo como Source: SmartViewer da página 0 e como Target: SmartViewer recém instanciada no folder.  instanciar a SmartViewer em determinada página do folder e aceitar as sugestões de SmartLink do Wizard. Observação Para os campos do tipo fill-in’s. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. utilizando o estilo CustomViewer com Auto-Field.

APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 165  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. 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 .  acessar as propriedades do folder e renomear os labels das páginas.  salvar a SmartWindow com o nome definido para o Cadastro Complexo.

Caso não exista. . Caso não existam.  verificar se já existe um programa de Vá para e um programa de pesquisa para a tabela que se deseja construir uma Consulta Relacionamento.w  selecionar o estilo relacionado na tabela acima.  instanciar a SmartQuery na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard.  verificar se já existe uma SmartQuery para a tabela que se deseja construir uma Consulta Relacionamento. criar uma nova utilizando o estilo CustomQuery Wizard.Implementação Como construir uma Consulta Relacionamentos Estilo Utilizado ' Nome Físico Window Consulta Relacionamento Masters/w-conrel. tendo como Source: p-navega e como Target: SmartQuery.  criar um SmartLink do tipo STATE. eles devem ser criados.  acessar os atributos de instância da SmartQuery e informar no atributo "Programa Pesquisa" o nome do programa de pesquisa da tabela pai e no atributo "Programa Vá para" o nome do programa de vá para da tabela pai.

Observação Para os campos do tipo fill-in’s. ou seja. Portanto não é necessário efetuar o registro para esses fill-ins.  verificar se já existe uma SmartViewer com os atributos da tabela pai que devem estar expostos na página 0 da SmartWindow. ou que possuírem um botão de zoom na sua direita. acima do folder. Caso o fill-in se encaixe em uma das opções acima. deve ser efetuado o registro para o WebEnabler. tendo como Source: p-exihel e como Target: SmartQuery. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field. Caso não exista. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita.  repetir os seguintes passos para os SmartBrowsers que devem estar colocadas nas páginas do folder: . O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. ou possua trigger de "ENTRY".APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 167  criar um SmartLink do tipo STATE.  instanciar a SmartViewer na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard.

Caso não exista.  2º Consulta relacionamento do filho. criar um novo utilizando o estilo CustomBrowser Consulta. O critério de escolha para esse programa deve ser o seguinte:  1º Consulta cadastral do filho. .  botão "Detalhar" deve ser responsável por chamar um determinado programa de consulta que deve detalhar o registro selecionado no SmartBrowser. verificar se já existe um SmartBrowser para a tabela filho da consulta relacionamento.  Acessar os atributos de instância de cada Browse e informar o nome do programa e diretório que deve ser chamado pelo botão Detalhar.  deve ser implantada a técnica de reposicionamento automático com base nas variáveis globais para o browser.  criar um SmartLink de Record.  3º Consulta cadastral de uma tabela associativa ao filho. tendo como Source: SmartQuery e como Target: SmartBrowser recém instanciado no folder.

pois não se utiliza de SmartObjects. executa a geração do relatório propriamente dito.  salvar a SmartWindow com o nome definido para a Consulta Relacionamento. Ter o cuidado para que a SmartViewer fique centralizada na SmartWindow. deve-se utilizar o estilo Window Relatórios/Cálculos/Fechamentos (w-relat. o primeiro com o nome do formato xxp/xx9999.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 169  redimensionar a SmartWindow de acordo com os objetos que foram colocados nela. Outra diferença é que o relatório é constituído por dois programas. com nome de formato xxp/xx9999rp. o segundo programa. Dicas Gerais  tabela de para de folder/páginas e com objetos relacionados: 'Página-Folder Frame Imagem Preprocessador Seleção f-pg-sel im-pg-sel PGSEL Classificação f-pg-cla im-pg-cla PGCLA Parâmetros f-pg-par im-pg-par PGPAR .p. que se apresenta um pouco diferente dos demais estilos existentes.w é o que faz a interface com o usuário apresentando todas as opções e entradas de dados necessárias à geração do relatório. conforme os parâmetros passados pelo primeiro programa.w). 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 Relatórios Para a construção de relatórios que não são gerados pelo Data Viewer.

exemplo: {include/i-rpmbl. onde a página de digitação não é necessária: &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. Digitação f-pg-dig im-pg-dig PGDIG Impressão f-pg-imp im-pg-imp PGIMP para selecionar uma página para trabalhar. 2. todo trabalho de tradução de labels. Se a página de seleção não existir. 4. assim se está informando ao estilo que estas páginas não existem no relatório. Eliminar as frames das páginas desnecessárias com base na tabela acima. adicionando o nome da imagem associada a página que se deseja apresentar como inicial. clicar no botão 'List Objects' que apresenta um browse com os objetos do programa. Botão List Objects. pois há possibilidade de gerar erros na interface quando os programas são executados com Facelift.Interface 1. no 'Main-block' do programa. Botão to Top. se as cinco páginas forem necessárias desconsiderar as tarefas 2.i im-pg-par} Observação Não deve ser alterado o tamanho da frame de relatório. renomeando as remanescentes conforme a tabela acima. na janela do UIB.  neste estilo. Eliminar n imagens com as "orelhas" mais a direita. Verificar quais as páginas que devem ser necessárias ao programa. Exceções: listitems do widget combo-box. selecionar a frame desejada e então acionar o botão 'TO TOP'. Exemplo. Em 'Definitions' limpar o conteúdo dos preprocessadores das páginas desnecessárias. 3. helps. screen-values é feito automaticamente por um include padrão do estilo. 3. . Preparação do Relatório .i. corrigir a chamada do include i-rpmbl. onde n é o número de páginas desnecessárias. 4 e 5.

Página de Classificação 1. 3. A sugestão é criar como 'Database Fields' e após convertê-los para variáveis para obter automaticamente os labels. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. formato. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. definindo label. Portanto não é necessário efetuar o registro para esses fill-ins. e o seu valor deve ser informado no seu initial e private-data. deve ser efetuado o registro para o WebEnabler. As propriedades 'Display' e 'Enable' devem ser retiradas. ou que possuírem um botão de zoom na sua direita. para cada campo que precisa de faixa. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. ou possua trigger de "ENTRY". ou possua trigger de "ENTRY". Se necessário adicionar mais opções de classificação. Colocar os fill-in´s de inicial e final. formatos e tamanhos do dicionário de dados. ou que possuírem um botão de zoom na sua direita. Colocar as variáveis necessárias na representação desejada (radio-set. Caso seja necessário implementar retângulos com label. Redefinir o 'list-items' do radio-set rs-classif . . Portanto não é necessário efetuar o registro para esses fill-ins. Observação Para os campos do tipo fill-in’s. Caso o fill-in se encaixe em uma das opções acima. 2. toggle-box. Observação Para os campos do tipo fill-in’s. fill-in). O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. Corrigir os 'initial values' das variáveis de inicial e final. com as opções de classificação de seu relatório. Pagina de Parâmetros 1. deve ser efetuado o registro para o WebEnabler. initial e help para as mesmas. 2. 2. Retirar possíveis queries que o UIB automaticamente queira associar a frame. Caso o fill-in se encaixe em uma das opções acima. estes labels devem ser fill-in´s view-as text.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 171 Página de Seleção 1.

Porém. 2. 'f5' e 'mouse-select-dblclick' (para acionamento do zoom). para as colunas do browse podem ser necessários. 5. os gatilhos de 'leave' (para atributos de referência). para o objeto browse br-digita adaptar os seguintes gatilhos para a nova definição da temp-table tt-digita e outras necessidades: 'Display': define os campos da temp-table a serem apresentados e quais devem ficar habilitados. Ainda em 'Section Editor'. adaptar os seus gatilhos de 'Choose'. 4. exceto quando se trata da primeira linha do browse. Observação Para mais detalhes sobre esta técnica. seguir a técnica Como implementar Parâmetros de Impressão em Relatórios. Em 'Section Editor'. MOUSE-SELECT-DBLCLICK OF tt-digita. Opcionalmente.Página de Digitação 1. sobre o primeiro campo habilitado no browse.i . 'Row-entry': determina valores iniciais para os campos da temp-table na inclusão de novas linhas. tais gatilhos devem ser codificados "à mão". Exemplo: ON F5. 'Row-leave': salva as alterações feitas pelo usuário.<campo> in browse br-digita do: {include/zoomvar. Página de Impressão Na página de impressão não é necessário que se tenha qualquer função adicional para o seu correto funcionamento. Todas as validações do browse br-digita devem ser feitas na procedure piexecutar no local indicado pelo comentário. Em 'Definitions'. na linha que aplica um evento 'Entry'. 3. se necessário. no início do 'Main Block' do programa.} END. Gravação e validação dos parâmetros . Neste caso... ver capítulo Como implementar Zoom e campos de referência para campos de chave estrangeira. corrigir a definição da temp-table de digitação tt-digita inserindo os campos necessários. mas para os botões bt-inserir e bt-alterar.

Caso não deseje que o relatório 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”. no local indicado pelo comentário. return error. input " ").17. colocando o focus no campo com problemas.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 173 1. rect-9 . text-modelo-rtf. colocar as validações necessárias às opções do usuário para execução do relatório no local indicado pelo comentário. 4. Na procedure 'pi-executar'. l-habilitaRtf. Relatórios no formato RTF O template está preparado para gerar a saída do relatório no formato RTF (Rich Text Format). input 73. if input frame f-pg-par i-nr-nivel > 19 then do: run utp/ut-msgs.  Reposicionar os componentes de execução de acordo com o especificado a seguir: text-modo para column 1. Na procedure 'pi-executar'. Para isto não é necessário realizar nenhuma alteração no programa de interface. apply 'mouse-select-click' to im-pg-par in frame f-relat. bt-modelo-rtf e rect-rtf.p (input "show".i} a literal 'XXP/XX9999RP.P' pelo programa que deve imprimir o relatório. lembrando que elas devem apresentar uma mensagem de erro cadastrada. apply 'entry' to i-nr-nivel in frame f-pg-par.14 e row 4. end. Ainda na procedure 'pi-executar'. 2. c-modelo-rtf. posicionar na página com problemas. Os componentes são: text-rtf. 3. Em 'Definitions' implementar os campos de parâmetros e seleção na definição da temp-table tt-param. Ex: &GLOBAL-DEFINE RTF NO  Na página de impressão(f-pg-imp) é necessário remover os componentes referentes a funcionalidade de RTF. colocar a lógica de gravação dos parâmetros e seleção na temp-table tt-param. substituir na chamada do include {include/i-rprun.

Se a implementação for uma conversão de um programa originário do MAGNUS: 2.rtf> = arquivo que contém o modelo no formato rtf Dicas para criação do Programa RP. .83. Da mesma forma. 1. e rs-execucao para column 2. substituir.p não deve possuir qualquer tipo de interface.w que o chama.P de Relatório O programa de execução do relatório (rp.i Include\i-rpout.1. retirar a chamada para o include {cdp/cd9000. onde: <pasta> = sub-pasta aonde se encontra o arquivo de modelo no propath <modelo. exceto pela própria impressão/visualização do relatório e pela caixa de acompanhamento de execução (ut-acomp/ut-perc) quando necessário.86 e row 4. 2.i} e substituir as seguintes chamadas: Include Velho ' Include Novo Cdp\cd9500. Também é possível passar durante a inicialização do programa um arquivo de modelo padrão para o relatório.rtf>").00 e row 4. com base no programa original. neste caso o usuário não será obrigado a informar um modelo manualmente.i Cdp\cd9540.i Cdp\cd9500. nenhum programa chamado a partir de um rp.i Cdp\cd9520.i 2. o work-file de digitação pela temp-table tt-digita. a linha abaixo: ASSIGN c-modelo-default = SEARCH("<pasta>\<modelo. Para isto basta incluir no Main Block do programa.W) para o programa que deve gerar o relatório (rp. Copiar a definição das temp-tables tt-param e tt-digita (esta última se houver digitação) do programa de interface (.p) é um programa procedural sem qualquer tipo de interface com o usuário. caso haja opção de digitação.i Include\i-rpclo.p).46.2.fl Include\i-rpcab. Todas as validações ou informações com necessidade de intervenção do usuário devem ser tratadas pelo programa . antes da chamada a procedure “enable_UI”.para column 2.i Include\i-rpvar.

i} ou ainda {utp/ut-table. substituí-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na tela de seleção.i &stream = "str-rp"} {include/i-rpcb80. 7.1. 3.i.i &stream = "stream str-rp"} {include/i-rpclo.3. e que não necessitam ser traduzidos. 4.2. 7. a definição da temp-table tt-param deve ser idêntica a definição da mesma no programa de interface. 6. deve-se passar o parâmetro &stream com o nome da stream para os includes i-rpcab. Utilizar um stream padrão definido como STR-RP. Em todos os forms/frames de impressão deve-se colocar a cláusula streamio.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 175 2.i. Caso este tamanho não esteja correto ocorrerá problema na quebra da página.4. Para utilizar a funcionalidade de impressão para arquivo RTF: 7.l-habilitaRTF <> YES THEN DO: VIEW STREAM str-rp FRAME f-cabec. para impressão do relatório. Este número deve ser ajustado para cada relatório conforme o tamanho do modelo RTF que vai ser utilizado. as variáveis de parâmetro.i.i e i-rpclo. substituir. . 5.3. para dar idéia de faixa. {include/i-rpcab. i-rpcb80. 7. Segue exemplo abaixo: IF tt-param. para que quando o destino for para RTF as mesmas não sejam apresentadas. {utp/utfield. Todos os labels que não forem do dicionário de dados e que apareçam no relatório devem ser tratados através dos includes {utp/ut-liter.i &stream = "stream str-rp"}. seleção e classificação pelos respectivos campos da temp-table tt-param.i}.i}. condicionar o VIEW das frames de cabeçalho/rodapé no início do programa. ao invés de utilizar a palavra "à". i-rpout.i &stream = "str-rp"} {include/i-rpout. definir o préprocessador abaixo setando o tamanho da página: &SCOPED-DEFINE pagesize N N é o número de linhas por página e por default seu valor é 42. Nas seleções.i &stream = "str-rp"} {include/i-rpc255. definir o préprocessador conforme abaixo: &GLOBAL-DEFINE RTF YES 7. i-rpc255.

000} /* préprocessador para ativar ou não a saída para RTF */ &GLOBAL-DEFINE RTF YES /* préprocessador para setar o tamanho da página */ &SCOPED-DEFINE pagesize 42 /* definição das temp-tables para recebimento de parâmetros */ 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 página seleção */ LIKE customer. DEFINE TEMP-TABLE tt-raw-digita NO-UNDO FIELD raw-digita AS RAW.i SP0014RP 1. /* include de controle de versão */ {include/i-prgvrs. .Exemplo de um progra ma RP.00. END.00.cust-num /* campo FIELD sales-rep página parâmetros */ LIKE salesrep.sales-rep /* campo .cust-num /* campo FIELD fim-cust-num página seleção */ LIKE customer.P de Relatóri o VIEW STREAM str-rp FRAME f-rodape.

Cust-Num Order.Order-num Order.Order-Date Order.Carrier NO-UNDO. /* include padrão para variáveis de relatório */ {include/i-rpvar.Cust-Num Order.Promise-Date Order.Order-num Order.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 177 /* recebimento de parâmetros */ DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.Ship-Date Order.Promise-Date Order. FORM /* usar ordenado por cust-num */ Order. DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita.Order-Date Order.Carrier WITH FRAME f-order DOWN STREAM-IO. CREATE tt-param.Sales-Rep Order.i} /* definição de variáveis DEFINE VARIABLE h-acomp */ AS HANDLE /* definição de frames do relatório */ FORM /* usar ordenado por order-num */ Order. .Ship-Date Order.Sales-Rep Order. RAW-TRANSFER raw-param TO tt-param.

/* include padrão para output de relatórios */ {include/i-rpout.i &STREAM="stream str-rp"} /* include com a definição da frame de cabeçalho e rodapé */ {include/i-rpcab.00.l-habilitaRTF <> YES THEN DO: VIEW STREAM str-rp FRAME f-cabec.i &STREAM="str-rp"} /* bloco principal do programa */ ASSIGN c-programa = "SP0014RP" c-versao = "1.classifica = 1 THEN DO: . /* executando de forma persistente o utilitário de acompanhamento */ RUN utp/ut-acomp. {utp/ut-liter. VIEW STREAM str-rp FRAME f-rodape.000" c-empresa = "Empresa Teste" c-sistema = "Sports" c-titulo-relat = "Listagem Order".WITH FRAME f-customer DOWN stream-io.i Imprimindo *} RUN pi-inicializar IN h-acomp (INPUT RETURN-VALUE). /* para não visualizar cabeçalho/rodapé em saída RTF */ IF tt-param. /* corpo do relatório */ IF tt-param.p PERSISTENT SET h-acomp.00" c-revisao = ". END.

Sales-Rep Order. END.cust-num >= tt-param.ini-cust-num AND order.Promise-Date Order.Order-num . ELSE DO: FOR EACH order WHERE order.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 179 FOR EACH order WHERE order. DISPLAY STREAM str-rp Order.Cust-Num Order.sales-rep = tt-param.fim-cust-num NO-LOCK ON STOP UNDO.Order-Date Order.sales-rep AND order.sales-rep = tt-param.cust-num >= tt-param. DISPLAY STREAM str-rp Order.Carrier WITH FRAME f-order.cust-num <= tt-param. LEAVE: RUN pi-acompanhar IN h-acomp (INPUT STRING(order.Cust-Num Order. LEAVE: RUN pi-acompanhar IN h-acomp (INPUT STRING(order.ordernum)). END.Ship-Date Order.ordernum)).ini-cust-num AND order.Order-num Order.cust-num ON STOP UNDO. DOWN STREAM str-rp WITH FRAME f-order.cust-num <= tt-param.fim-cust-num NO-LOCK BY order.sales-rep AND order.

. END. foi desenvolvido com o objetivo de agilizar a execução periódica de listas de programas construídos através da template de relatório onde. Essa preparação consiste em se cadastrar os parâmetros e as digitações necessários para que sejam executados estes programas.Ship-Date Order. Preparando o Relatório para Execução no Módulo JOB EXECUTION Este módulo. que se encontra no menu de Tecnologia.Cadastro de Parâme tros e Digitaç ões (JE0101 ) Order.Sales-Rep Order.Order-Date Order.Promise-Date Order. Encontra-se no menu Manutenção do módulo Job Execution e seu objetivo é preparar os programas a serem utilizados em uma lista de disparo. RETURN "OK":U. END. /*fechamento do output do relatório*/ {include/i-rpclo. alguns parâmetros devem ser alterados (geralmente datas). A esta lista de programas é dado o nome de JOB (tarefa).i &STREAM="stream str-rp"} RUN pi-finalizar IN h-acomp.Carrier WITH FRAME f-customer. a cada execução. DOWN STREAM str-rp WITH FRAME f-customer.

APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 181 Parâmetros São as informações que constam nas pastas Seleção. destino (arquivo. . impressora). ou quaisquer informações únicas em programas de outro tipo que serão armazenadas na tabela TT-PARAM para execução do mesmo. nome de arquivo. Parâmetros e Impressão dos programas de relatórios. classificação. Exemplos de parâmetros: Períodos para execução. intervalos diversos. data e hora para execução e etc. Classificação.

Cadastrando os Parâme tros Clicando no botão Incluir ou Modificar. será aberta a tela a seguir: Os campos da tela acima representam exatamente todas as características dos parâmetros do programa de relatório na temp-table tt-param. . O preenchimento de todos os campos é obrigatório.

Somente programas que possuam a pasta digitações em sua execução normal deverão possuir digitações cadastradas. respectivamente. quando o cursor estiver posicionado sobre o atributo Importante: o conteúdo deve esclarecer a quem estiver utilizando o módulo qual valor o atributo precisa assumir. no campo Ajuda deveria ser escrito: “1 – Arquivo.Digitações APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 183 Seqüência: Campo: Tipo: Extent: Tamanho: Formato: Label: Ajuda: Val Default posição do que representa o parâmetro na temp-table tt-param código do atributo na temp-table tt-param tipo de dado do atributo na temp-table tt-param Indica. o valor default será uma lista de valores separados por vírgulas São informações que podem ter n valores diferentes para a execução do programa. 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 padrões Progress) label do atributo na temp-table tt-param texto de ajuda a ser apresentado ao usuário. quando assinalado. Cada ocorrência (linha) dessa digitação é chamada registro e sua quantidade é ilimitada. 2 – Impressora” valor padrão a ser utilizado para o atributo e só poderá ser preenchido após ter sido informado o formato se o atributo “extent” estiver marcado. “Arquivo” e “Impressora”. Por exemplo: Se o campo Destino pudesse ter os valores “1” e “2” os quais significassem. . como segue abaixo. na parte inferior da janela. no relatório Resumo de Ordens de Serviço.

. clique no botão registros e informe os valores default para cada campo em N registros.Após cadastrados os campos de digitações.

Encontra-se no menu Tarefas do módulo Job Execution e nessa opção fazemos a exportação dos parâmetros e digitações do programa que foi preparado para ser executado neste módulo. através do devido cadastramento de seus parâmetros e digitações. . pois muitas vezes o nome do campo não expressa em detalhes o significado correto do mesmo.Considerações Exportação JOB sobre o Executi cadastr on amento (JE0104 )de campos APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 185 Deve sempre ser observada o label e o valor default utilizada na tela do programa original.

Caso deseje consultar o lay-out do arquivo gerado. . Os nomes dos arquivos serão os mesmos dos programas. os mesmos deverão ser gravados no Roundtable para que sejam expedidos normalmente pelo produto e importados na base do cliente para sua utilização no módulo JOB EXECUTION. localizado no diretório DOCPDF/DTSUL.jed (digitações e ap0707. Ex. Após a geração destes arquivos.JEP (parâmetros) dos programas.) ou para clientes que tiverem adquirido o produto. deverá ser consultado o manual do produto. o intervalo dos programas a serem gerados e clicar em Executar. basta informar o nome do diretório onde serão gerados os arquivos .A.JED (digitações) e . selecione a pasta Lay-out. Para maiores informações referentes ao produto.Para fazer a exportação.: Para o programa ap0707rp.jep (parâmetros). Nela encontram-se os lay-outs dos dois arquivos gerados: parâmetros e digitações. Observação O módulo JOB EXECUTION somente estará disponível para uso interno (Datasul S.p será gerado o ap0707rp.

deve ser efetuado o registro para o WebEnabler. ou possua trigger de "ENTRY". ou que possuírem um botão de zoom na sua direita. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. end. run dispatch in this procedure ('enable-fields'). Observação Para os campos do tipo fill-in’s.  verificar se já existe uma SmartQuery para a tabela que se deseja construir o programa de Parâmetros Únicos. tendo como Source a SmartViewer da página 1 e como a Target a SmartViewer corrente.  se existirem mais de uma SmartViewer.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 187 Como construir um programa de Parâmetros Únicos Estilo Utilizado ' Nome Físico Window Parâmetros Únicos Masters/w-paruni. .  instanciar esta e outras SmartViewers a partir da página 1 no folder e aceitar a sugestão de SmartLink do Wizard. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. criar uma nova utilizando o estilo CustomQuery Wizard.  instanciar a SmartQuery na página 1 da SmartWindow.w  selecionar o estilo relacionado na tabela acima. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. Portanto não é necessário efetuar o registro para esses fill-ins. Caso não exista.  verificar se já existe uma SmartViewer com os atributos que devem ser editados. Caso não exista. Caso o fill-in se encaixe em uma das opções acima. devem ser criados SmartLinks de GROUP-ASSIGN. criar uma nova utilizando o estilo CustomViewer com Auto-Field. else run new-state('update-begin':U).  inserir a seguinte lógica após 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).

criar uma nova SmartViewer utilizando o estilo CustomViewer com Auto-Field. Observação Para os campos do tipo fill-in’s. Caso não existam. tendo como Source: p-exihel e como Target: SmartQuery.  salvar a SmartWindow com o nome definido para o programa de Parâmetros Únicos.  acessar os atributos de instância 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. ou possua trigger de "ENTRY". deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita.  verificar se já existe uma SmartViewer com os atributos da tabela que devem ser pesquisados. Caso não exista.  verificar se já existe um programa de Vá para e um programa de pesquisa para a tabela que se deseja construir um programa de formação.  redimensionar o Folder e a SmartWindow de acordo com os objetos nela instanciados.  criar um SmartLink do tipo STATE.w  selecionar o estilo relacionado na tabela acima. tendo como Source: p-navega e como Target: SmartQuery. criar uma nova utilizando o estilo CustomQuery Wizard. Caso o fill-in se encaixe em uma das . Como construir um programa de Formação Estilo Utilizado ' Nome Físico Window Formação Masters/w-forma.  instanciar a SmartQuery na página 0 da SmartWindow e aceitar as sugestões de SmartLink do Wizard.  criar um SmartLink do tipo STATE.Implementação  criar um SmartLink de TABLEIO.  verificar se já existe uma SmartQuery para a tabela que se deseja construir o programa de Formação. eles devem ser criados. Caso não exista. tendo como Source THISPROCEDURE e como Target a SmartViewer da página1.

conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. a tabela utilizada na SmartQuery do programa de Formação. deve ser efetuado o registro para o WebEnabler.  instanciar a SmartViewer na página 0 da SmartWindow. de modo que caiba no lado esquerdo dos botões bt-add e bt-del da window formação. criar um novo utilizando o estilo CustomBrowser Wizard. criar um novo utilizando o estilo CustomBrowser Formação.  verificar se já existe um SmartBrowser que contenha os dados que servem de fonte para o SmartBrowser de Formação. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse.  verificar se já existe um SmartBrowser com a tabela de formação.  criar um SmartLink do tipo STATE. Caso não exista. ou que possuírem um botão de zoom na sua direita.  retirar os comentários da Procedure PI-ADD-BROWSE e substituir pelos dados a seguir: <tabela-1>: nome da tabela que está sendo realizada a navegação <tabela-2>: nome da tabela do SmartBrowser fonte <tabela-formação>: nome da tabela do SmartBrowser formação <campo-1>: campo da <tabela-1> que deve constituir parte da chave da tabela de formação . na construção desse SmartBrowser. devem ser observados os seguintes aspectos:  deve ser definida como tabela externa. Portanto não é necessário efetuar o registro para esses fill-ins. ele deve ser redimensionado.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 189 opções acima. Caso não exista.  instanciar o SmartBrowser que serve de fonte para o SmartBrowser de Formação no lado esquerdo da página 0 da SmartWindow. deve ser observado o seguinte:  como exceção à regra.  deve ser criada uma trigger de MOUSE-SELECT-DOUBLE-CLICK e inserido o seguinte código: RUN NEW-STATE(INPUT 'incluir-browse':U). tendo como Source: o SmartBrowser fonte e como Target: THIS-PROCEDURE.  na construção desse SmartBrowser.

 instanciar o SmartBrowser de formação no lado direito da página 0 da SmartWindow. assign order-line.item-num = item. if avail order-line then assign i-next-line-num = order-line.item-num order-line. find item where rowid(item) = rw-row-2 no-lock. tendo como Source: SmartBrowser formação e como Target: THIS-PROCEDURE.order-num no-lock no-error. deve ser utilizado o estilo Window Inclui/Modifica Filho.order-num order-line.  inserir o seguinte código na trigger de MOUSE-SELECT-CLICK: RUN PI-POSICAO-BROWSE IN THIS-PROCEDURE (OUTPUT vrow). . RUN DISPATCH IN THIS-PROCEDURE (INPUT 'openquery':U). def input parameter rw-row-2 as rowid no-undo.Exemplo <campo-2>: campo da <tabela-2> que deve constituir parte da chave da tabela de formação  se for necessário. FIND <tabela-formação> WHERE ROWID (<tabela-formação>) = V-ROW no-error. Para criar este programa de modificação. ajustar a lógica da Procedure PI-ADD-BROWSE de modo que atenda as necessidades do programa.order-num + 1. IF AVAIL (<tabela-formação>) THEN DO: DELETE (<tabela-formação>). create order-line. find order where rowid(order) = rw-row-1 no-lock.order-num = order. find last order-line where order-line. def input parameter rw-row-1 as rowid no-undo.line-num = i-next-line-num.  criar um SmartLink do tipo STATE. def var i-next-line-num as integer no-undo. END.order-num = order. else assign i-next-1 line num = 1.  acessar os atributos de instância do SmartBrowser de formação e informar no atributo "Programa Atributo" o nome do programa de modificação dos atributos do registro de formação.

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 .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 191  na procedure STATE-CHANGED da SmartWindow e na trigger do botão "INCLUIR(>)". retirar os comentários e substituir pelos dados a seguir: <h_query>: handle da SmartQuery <h_browse>: handle do SmartBrowser fonte do SmartBrowser de formação <h_browse-formação>: handle do SmartBrowser de formação  na trigger do botão de "RETORNO(<)". retirar os comentários e substituir pelos dados a seguir: <h_browse>: handle do SmartBrowser de formação <tabela-formação>: nome da tabela de formação  redimensionar a SmartWindow de acordo com os objetos que foram colocados na tela.

O botão "Formação" deve chamar o estilo de Formação sem Navegação. Objetos do programa: .w  estilo de formação sem navegação é dependente.  jamais eliminar um "include" padrão mesmo que ele não possua nenhum conteúdo/lógica. deve sempre ser chamado a partir de um CustomBrowser Formação Filho. ou seja.  o template utilizado para construção deste tipo de programa não utiliza SmartObjects. os campos da tabela pai não podem jamais ser a primeira coisa a ser colocada na tela.  seguir sempre a seqüência descrita neste documento pois a ordem em que as tarefas são executadas podem afetar o resultado da construção do programa (por exemplo. Destino.Implementação ' h_browse-formação STATE THIS-PROCEDURE 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_browse-formação THIS PROCEDURE STATE h_browse-fonte Como construir um programa de Formação sem Navegação Estilo Utilizado ' Nome Físico Window Formação sem Navegação Masters/w-form2. Origem.  identifique que tabelas servem como: Pai. bem como a consulta da tabela destino deve ser feita após definirmos a consulta da tabela origem).

. 3. 2. Colocar campos da tabela pai.  definir campos para display.  definir query (relacionando esta com a tabela pai) para a temp-table. portanto esta deve ser uma freeform query. 5. Criar browse destino:  criar uma temp-table (na seção definitions):  colocar nesta temp-table os atributos da tabela destino. 4.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 193 Seqüência 1. Acrescentar dentro da procedure local-initialize lógica para carregar a temp-table com os registros que já existem na tabela de destino.  definir campos para display. Preencher pré-processor da seção de definições com o nome da tabela pai. Criar browse origem:  definir query.

deve-se fazer as seguintes alterações:  modificar na coluna Returned de All Fields para Fields Used. criar uma procedure interna (pi-commit) que transfira os registros da temp-table para a tabela de destino.  Função is-create-allowed . Criar funções e procedures internas:  criar função para mostrar o registro da tabela pai (pi-show-masterrecord). atentando para o seguinte:  deve ser informada a tabela externa. criar eliminação do browse destino:   Procedure pi-del .  na cláusula Options.realiza o create e o assign no browse destino (temp-table).lê os registros selecionados e para cada um deles executa regras de negócio que verificam se a eliminação é permitida (através da função is-delete-allowed) e realiza a eliminação quando permitida pela função através da procedure pidelete-from-target (elimina da temp-table). e caso a inclusão seja permitida executa a procedure pi-add-to-target.  Procedure pi-add-to-target . esta procedure é chamada pelo evento choose do botão 'Ok': Como construir um Browse Formação Filho  Estilo Utilizado ' Nome Físico CustomBrowser Formação Filho Masters/wbrwfrm.w utilizar o wizard.Implementação 6.valida se o registro não existe ainda no browse destino. através da função is-create-allowed.  desmarcar as opções Key-Phrase e SortBy-Phrase. ou realiza outras regras de negócio que verificam se a inclusão é valida retorna um status que indica o resultado dos testes.lê os registros selecionados verifica se o registro pode ser incluído.  criar inclusão no browse destino:   Procedure pi-ins . .

através da opção 'Rejeitados'.  também. helps. na opção. na cláusula Table.w). todo trabalho de tradução de labels. uma para importação dos dados e outra para impressão do log. Para tanto. Exceções: list-items do widget combo-box. Botão To Top. neste estilo. 'Todos' ou imprimir somente os registros que apresentaram erro. portanto sem SmartViewer e SmartFolders.  o log de importação pode ser completo.  durante a importação. screenvalues deve ser feito automaticamente por um include padrão do estilo. . Dicas Gerais   tabela de para de folder/páginas e com objetos relacionados: Página-Folder ' Frame Imagem Preprocessador Layout f-pg-lay im-pg-lay PGLAY Seleção f-pg-sel im-pg-sel PGSEL Parâmetros f-pg-par im-pg-par PGPAR Log f-pg-log im-pg-log PGLOG para selecionar uma página para trabalhar utilizar o botão 'List-Objects'. acionar o botão 'TO TOP'. deve-se marcar a opção Indexed-Reposition. que apresenta um browse com os objetos do programa.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 195   o index-reposition deve ser sempre setado. então sobre o frame relacionado à página. existem duas streams abertas. salvar o CustomBrowse com o nome definido para Browse de Formação Filho. Como construir um programa de Importação Para a construção de programas de importação deve-se utilizar o estilo Window Importação/Exportação (w-impor. que é uma variação do estilo de relatórios. Botão List Objects.

i}. Corrigir os 'initial values' das variáveis de inicial e final. formatos e tamanhos do dicionário de dados. corrigir a chamada do include i-immbl. somente a página de seleção é opcional.Preparação do programa 1. Verificar quantas páginas são necessárias. . caso haja seleção desconsiderar as tarefas 2. Exemplo: { include/i-imvrf. nos padrões do Produto Datasul-EMS. 3 e 4. as páginas de layout. passando como parâmetro posicional a imagem da página. Colocar os fill-in´s de inicial e final. A sugestão é criá-los como 'Database Fields' e após convertê-los para variáveis para obter automaticamente os labels. Eliminar a imagens im-pg-log e renomear as imagens: im-pg-par > im-pg-log im-pg-sel > im-pg-par 4. No 'Main Block'. parâmetros e log são obrigatórias. que possue dois parâmetros.001. 3. onde o programa deve apresentar inicialmente. 2. existe a chamada para um include denominado {include/i-imvrf. 2. exemplo: {include/i-immbl.i im-pg-par} Página de Layout 1.i. Eliminar a frame f-pg-sel.i &programa=CP0406 &versãolayout=001 } Criar um arquivo que contenha o layout de importação. 2. Página de Seleção 1. no 'Main-block' do programa. Este arquivo tem o seguinte nome e path: LAYOUT/LOXX9999. informar neste o nome do programa no formato XX9999 e a versão do layout no formato 999 (o valor inicial da versão é 001). Se a página de seleção não existir. Em 'Definitions' limpar o conteúdo 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. para cada campo que precisar de faixa.

colocando o focus no campo com problemas. posicionar na página com problemas. apply 'mouse-select-click' to im-pg-par in frame f-relat.p (input "show". input 73.lst e todos os tipos de arquivos. No on choose do bt-arquivo-entrada. Em 'Definitions'. return error. 2. Pagina de Parâmetros 1.i c-arquivo-entrada f-pg-par "'*. toggle-box. input " ").*'" } END. e o seu valor deve ser informado no seu initial e private-data. se não for passado nada neste parâmetro a include assumira como padrão o tipo de arquivo *. fill-in). Retirar possíveis queries que o UIB automaticamente queira associar a frame.i . Colocar as variáveis necessárias na representação desejada (radio-set. Na procedure 'pi-executar'. As propriedades 'Display' e 'Enable' devem ser retiradas 3. pode ser adicionado um terceiro parâmetro na include i-imarq. formato. lembrando que elas devem apresentar uma mensagem de erro cadastrada. implementar os campos de parâmetros e seleção na definição da temp-table tt-param. definindo label. 'todos' '*. colocar as das páginas de parâmetros e seleção.xls' . DO: {include/i-imarq. Página de Log Não existem tarefas.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 197 3. onde é possível passar como parâmetro os filtros que serão utilizados na sistem dialog.XLS' '*. Caso seja necessário implementar retângulos com label. estes labels devem ser fill-in´s view-as text. end. if input frame f-pg-par i-nr-nivel > 19 then do: run utp/ut-msgs. apply 'entry' to i-nr-nivel in frame f-pg-par. 2. initial e help para as mesmas. . Gravação e validação dos parâmetros 1.

1.i Include\i-rpclo.i.i e i-rpclo. Todas as validações ou informações com necessidade de intervenção do usuário devem ser tratadas pelo programa . Ainda na procedure 'pi-executar'.p não deve possuir qualquer tipo de interface. colocar a lógica de gravação dos parâmetros e seleção na temp-table tt-param. Na procedure 'pi-executar'.i Cdp\cd9520.p) é um programa procedural sem qualquer tipo de interface com o usuário. Se a implementação for uma conversão de um programa originário do MAGNUS.i} a literal 'XXP/XX9999RP.i &stream = "str-rp"} {include/i-rpc255. i-rpc255.i} e substituir as seguintes chamadas. Definir uma stream para a importação.i &stream = "stream str-rp"} {include/i-rpclo. 4. 4. Dicas para criação do Programa RP. i-rpcb80. i-rpout.Exemplo 3. referentes a impressão do log de importação: Include Velho ' Include Novo Cdp\cd9500. 2.i &stream = "str-rp"} {include/i-rpcb80. Exemplo: {include/i-rpout.i Include\i-rpout. Na chamada do include i-rpout.i.P' pelo programa que deve importará os registros.w que o chama.i &stream = "str-rp"} {include/i-rpout.i. passar o parâmetros {&tofile}. nenhum programa chamado a partir de um rp.i 2. retirar a chamada para o include {cdp/cd9000. para impressão do log. Da mesma forma.i Cdp\cd9500.P de Importação O programa de execução do relatório (rp. {include/i-rpcab. deixando a stream padrão definido como STR-RP para a impressão do log. 1. exceto pela caixa de acompanhamento de execução (ut-acomp/ut-perc) quando necessário.i Include\i-rpvar. Substituir as variáveis de parâmetros e seleção pelos respectivos campos da temp-table tt-param. Utilizar um stream padrão definido como STR-RP.i.fl Include\i-rpcab.i &tofile=tt-param. deve-se passar o parâmetro &stream com o nome da stream para os includes i-rpcab.i &stream = "stream str-rp"}.arq-destino} . substituir na chamada do include {include/i-imrun.i Cdp\cd9540. 3.

i} /* definição de variáveis e streams */ def def def def stream s-imp. 6.000} /* definição das temp-tables para recebimento de parâmetros */ 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.00. substituí-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na tela de seleção.i}. var c-linha as char no-undo. raw-transfer. e que não necessitam ser traduzidos. Nas seleções.Exemplo de um progra ma RP. var i-cust as int no-undo. {utp/ut-field.i}.raw-param to tt-param.i XX9999RP 1. var h-acomp as handle no-undo. 7. para dar idéia de faixa.i} ou ainda {utp/ut-table. def input parameter tabel for tt-raw-digita.P de Importa ção APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 199 5. Em todos os forms/frames de impressão deve-se colocar a cláusula streamio. /* recebimento de parâmetros */ def input parameter raw-param as raw no-undo. /* definição de frames do log */ /* include padrão para output de log */ */ . /* include padrão para variáveis para o log {include/i-rpvar. ao invés de utilizar a palavra "à". create tt-param.00. /* include de controle de versão */ {include/i-prgvrs. Todos os labels que não forem do dicionário de dados e que apareçam no log devem ser tratados através dos includes {utp/ut-liter.

name = substring(c-linha.i &STREAM="str-rp"} /* bloco principal do programa */ assign c-programa = c-versao = c-revisao = c-empresa = c-sistema = c-titulo-relat Clientes". view stream str-rp frame f-rodape.i &STREAM="stream str-rp"} run pi-finalizar in h-acomp.cust-num = i-cust customer.5)). find customer where customer. input stream s-imp close.00. /* bloco principal do programa */ repeat on stop undo. assign i-cust = integer(substring(c-linha.000" "Empresa Teste" 'Sports' = "Listagem de Erros da Importação de view stream str-rp frame f-cabec.cust-num = i-cust no-lock.i Importando *} run pi-inicializar in h-acomp (input RETURN-VALUE).arqdestino} /* include com a definição da frame de cabeçalho e rodapé */ {include/i-rpcab. run pi-acompanhar in h-acomp (input c-linha). assign customer.5).{include/i-rpout.1. . /* define o arquivo de entrada informando na página de parâmetros */ input stream s-imp from value(tt-param.00" ". end. /* fechamento do output do log */ {include/i-rpclo. end.arq-entrada). "XX0006RP" "1. run utp/ut-acomp. leave: import stream s-imp unformatted c-linha. if not avail customer then do: create customer.p persistent set h-acomp. return "Ok":U. {utp/ut-liter.i &STREAM="stream str-rp" &TOFILE=tt-param.

w). caso haja seleção desconsiderar as tarefas 2. helps. que é uma variação do estilo de relatórios. 3. Verificar quantas páginas são necessárias. Botão To Top. parâmetros e log são obrigatórias. existem duas streams abertas. acionar o botão 'TO TOP'. as páginas de layout. 2. Em 'Definitions' limpar o conteúdo dos preprocessadores PGSEL . que apresenta um browse com os objetos do programa. todo trabalho de tradução de labels. Preparação do programa 1. uma para exportação dos dados e outra para impressão do log.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 201 Como construir um programa de Exportação Para a construção de programas de exportação deve-se utilizar o estilo Window Importação/Exportação (w-impor. Eliminar a frame f-pg-sel. neste estilo. screenvalues deve ser feito automaticamente por um include padrão do estilo. Eliminar a imagens im-pg-log e renomear as imagens: im-pg-par > im-pg-log im-pg-sel > im-pg-par 4.  também. portanto sem SmartViewers e SmartFolders.  durante a exportação. então sobre o frame relacionado à página. somente a página de seleção é opcional. Exceções: list-items do widget combo-box. Botão List Objects. 3 e 4. Dicas Gerais   tabela de para de folder/páginas e com objetos relacionados: Página-Folder ' Frame Imagem Preprocessador Layout f-pg-lay im-pg-lay PGLAY Seleção f-pg-sel im-pg-sel PGSEL Parâmetros f-pg-par im-pg-par PGPAR Log f-pg-log im-pg-log PGLOG para selecionar uma página para trabalhar utilizar o botão 'List-Objects'.

toggle-box. Retirar possíveis queries que o UIB automaticamente queira associar a frame. corrigir a chamada do include i-immbl. Corrigir os 'initial values' das variáveis de inicial e final. nos padrões do Produto Datasul-EMS. Exemplo: { include/i-imvrf. A sugestão é criá-los como 'Database Fields' e após convertê-los para variáveis para obter automaticamente os labels. formato. Página de Parâmetros 1. definindo label. initial e help para as mesmas. onde o programa deve apresentar inicialmente. informar neste o nome do programa no formato XX9999 e a versão do layout no formato 999 (o valor inicial da versão é 001). no 'Main-block' do programa. 3. Se a página de seleção não existir. 2. que possue dois parâmetros. formatos e tamanhos do dicionário de dados. fill-in). .i. existe a chamada para um include denominado {include/i-imvrf. Criar um arquivo que contenha o layout de importação. exemplo: {include/i-immbl. Este arquivo tem o seguinte nome e path: LAYOUT/LOXX9999. passando como parâmetro posicional a imagem da página. 3.i im-pg-par} Página de Layout 1. Colocar os fill-in´s de inicial e final.i}.001. para cada campo que precisar de faixa. Colocar as variáveis necessárias na representação desejada (radio-set.i &programa=CP0406 &versãolayout=001 } 2.&GLOBAL-DEFINE &GLOBAL-DEFINE &GLOBAL-DEFINE &GLOBAL-DEFINE PGLAY f-pg-lay PGSEL PGPAR f-pg-par PGLOG f-pg-log 5. Página de Seleção 1. No 'Main Block'.

3. implementar os campos de parâmetros e seleção na definição da temp-table tt-param. e o seu valor deve ser informado no seu initial e private-data. 'todos' '*. Página de Log 1.*'" } END. Gravação e validação dos parâmetros 1. estes labels devem ser fill-in´s view-as text.XLS' '*.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 203 2. se não for passado nada neste parâmetro a include assumira como padrão o tipo de arquivo *. o label e o radio-set com as opções "Todos" e "Rejeitados".i . Caso seja necessário implementar retângulos com label. input 73. Em 'Definitions'. pode ser adicionado um terceiro parâmetro na include i-imarq.i c-arquivo-entrada f-pg-par "'*. DO: {include/i-imarq. Mudar o private-data e o initial do label "Arquivo de Entrada" do retângulo para "Arquivo de Saída". 3. lembrando que elas devem apresentar uma mensagem de erro cadastrada.lst e todos os tipos de arquivos. Remover o retângulo. onde é possível passar como parâmetro os filtros que serão utilizados na sistem dialog. No on choose do bt-arquivo-entrada. 2. Na procedure 'pi-executar'. 2. if input frame f-pg-par i-nr-nivel > 19 then do: run utp/ut-msgs. colocando o focus no campo com problemas. Mover todos os outros objetos desta frame para cima. 4. . colocar as validações das páginas de parâmetros e seleção. posicionar na página com problemas. Eliminar o campo todos da temp-table tt-param. As propriedades 'Display' e 'Enable' devem ser retiradas.xls' . Não esquecer do botão "Configurar Impressora".p (input "show".

p não deve possuir qualquer tipo de interface. end. return error. if file-info:pathname = ? then do: run utp/ut-msgs. substituir na chamada do include {include/i-imrun. Na procedure 'pi-executar'. colocar a lógica de gravação dos parâmetros e seleção na temp-table tt-param. input 73.p (input frame f-pg-par c-arquivo-entrada). por: run utp/ut-vlarq. 5. 4. Da mesma forma.p (input "show". apply 'mouse-select-click' to im-pg-log in frame f-import. exceto pela caixa de acompanhamento de execução (ut-acomp/ut-perc) quando necessário.p) é um programa procedural sem qualquer tipo de interface com o usuário.input " ").p (input "show".P' pelo programa que exportará os registros.i} a literal 'XXP/XX9999RP. apply 'entry' to c-arquivo-destino in frame f-pg-log. Todas as validações ou informações com . if return-value = "nok" then do: run utp/ut-msgs. Ainda na procedure 'pi-executar'. end. apply 'mouse-select-click' to im-pg-par in frame f-import. nenhum programa chamado a partir de um rp. input 326. end.P de Exportação O programa de execução da exportação (rp. input c-arquivo-entrada). apply 'mouse-select-click' to im-pg-par in frame f-relat. return error. substituir o código de validação do arquivo de entrada: assign file-info: file-name = input frame f-pg-par c-arquivoentrada. Na procedure 'pi-executar'. 6. return error. input ""). apply 'entry' to c-arquivo-entrada in frame f-pg-par. Dicas para criação do Programa RP. apply 'entry' to i-nr-nivel in frame f-pg-par.

Se a implementação for uma conversão de um programa originário do MAGNUS.i. substituí-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na tela de seleção.i &stream = "stream str-rp"}.w que o chama.00.i &stream = "str-rp"} {include/i-rpout.i 2. e que não necessitam ser traduzidos. Exemplo: {include/i-rpout.P de Exporta ção APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 205 necessidade de intervenção do usuário devem ser tratadas pelo programa .fl Include\i-rpcab.i Cdp\cd9520.1 Substituir as variáveis de parâmetros e seleção pelos respectivos campos da temp-table tt-param.i &stream = "str-rp"} {include/i-rpc255.i &stream = "stream str-rp" &tofile=ttparam. i-rpcb80. i-rpout.i XX9999RP 1.i &stream = "stream str-rp"} {include/i-rpclo.i. {include/i-rpcab. passar o parâmetro {&tofile}.i}. {utp/ut-field. Utilizar um stream padrão definido como STR-RP. /* include de controle de versão */ {include/i-prgvrs. deixando a stream padrão definido como STR-RP para a impressão do log.i Include\i-rpclo.i} e substituir as seguintes chamadas. 7. 4. retirar a chamada para o include {cdp/cd9000. ao invés de utilizar a palavra "à". para impressão do log. 1. Definir uma stream para a importação. deve-se passar o parâmetro &stream com o nome da stream para os includes i-rpcab.i Include\i-rpout. referentes a impressão do log de exportação: Include Velho ' Include Novo Cdp\cd9500. 3.i Include\i-rpvar.i Cdp\cd9540.i. Nas seleções.000} .i} ou ainda {utp/ut-table. Na chamada do include i-rpout.i e i-rpclo.Exemplo de um progra ma RP.i Cdp\cd9500.i}. 2.arq-destino} 5. Todos os labels que não forem do dicionário de dados e que apareçam no log devem ser tratados através dos includes {utp/ut-liter. para dar idéia de faixa.i. 6.i &stream = "str-rp"} {include/i-rpcb80. Em todos os forms/frames de impressão deve-se colocar a cláusula streamio.00. i-rpc255.

def var h-acomp as handle no-undo.000" "Empresa Teste" 'Sports' = "Listagem de Erros da Exportação de view stream str-rp frame f-cabec. .00. view stream str-rp frame f-rodape.i &STREAM="stream str-rp" &TOFILE=tt-param.raw-param to tt-param. def input parameter tabel for tt-raw-digita.i &STREAM="str-rp"} /* bloco principal do programa */ assign c-programa = c-versao = c-revisao = c-empresa = c-sistema = c-titulo-relat Clientes". raw-transfer.i} /* definição de variáveis e streams */ def stream s-exp.00" ". /* recebimento de parâmetros */ def input parameter raw-param as raw no-undo. /* include padrão para variáveis para o log */ {include/i-rpvar./* definição das temp-tables para recebimento de parâmetros */ 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.arqdestino} /* include com a definição da frame de cabeçalho e rodapé */ {include/i-rpcab. "XX0006RP" "1. /* definição de frames do log */ /* include padrão para output de log */ {include/i-rpout. create tt-param.

end.p persistent set h-acomp. . leave: run pi-acompanhar in h-acomp (input string(customer.arq-entrada). Como construir um programa de Pesquisa Estilo utilizado ' Nome Físico Window Pesquisa Masters/w-pesqui. /* bloco principal do programa */ for each customer on stop undo.cust. return "Ok":U.name. onde a ordem das colunas no browser deve ser a ordem de classificação."x(40)") skip. output stream s-exp close. Caso não exista. /* define a saída para o arquivo de saída informando na página de parâmetros */ output stream s-exp from value(tt-param. "99999") string(customer.custnum)).i &STREAM="stream str-rp"} run pi-finalizar in h-acomp. seguir os seguintes passos:  verificar se já existe um SmartBrowser com os dados necessários para a pesquisa e se eles devem estar na mesma ordem da classificação desejada. /*fechamento do output do log */ {include/i-rpclo.i Exportando *} run pi-inicializar in h-acomp (input RETURN-VALUE). {utp/ut-liter.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 207 run utp/ut-acomp. criar um novo utilizando o estilo CustomBrowserZoom Wizard.  é necessário utilizar um SmartBrowser para cada classificação do programa de Pesquisa. put stream s-exp unformatted string(customer.w  selecionar o estilo relacionado na tabela acima. para todos os SmartBrowsers que devem estar colocados no programa de Pesquisa.

 alterar os labels das páginas dos folders através do Instance Atributes.  criar um SmartLink do tipo STATE.  salvar a SmartWindow com o nome definido para o programa pesquisa. THISPROCEDURE. tendo como Source o SmartBrowser recém instanciado e como Target. Source ' Link Type Target h_browse STATE THIS-PROCEDURE h_folder PATE THIS-PROCEDURE .  redimensionar o SmartFolder e a SmartWindow de acordo com os objetos nela instanciados.  recomenda-se que cada SmartBrowser das diferentes páginas do SmartFolder tenha o mesmo tamanho. instanciar o SmartBrowser no SmartFolder.

Observação O template irá gerar automáticamente a TRIGGER GO da janela que faz todo o tratamento necessário para o programa .  salvar o SmartDialog com o nome definido para o programa "Vá Para". 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.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 209 Como construir um programa "Vá Para" Estilo Utilizado ' Nome Físico Dialog VaPara Masters/d-vapara.w  em New.

Este browser deve utilizar uma temp-table. caso não exista. caso não exista. Como construir um programa de Digitação Rápida Estilo Utilizado ' Nome Físico Window Digitação Rápida Masters/w-digit. Selecionar o folder Grid Units 3.w  selecionar o estilo relacionado na tabela acima.Preferences 2.  salvar a WindowDigitaçãoRápida com o nome definido para Janela Digitação Rápida. . e não a utilização de DBFields. deve ser criado um novo.  instanciar o CustomBrowserDigita na página 2 da WindowDigitaçãoRápida. utilizando o estilo CustomViewerDigita. deve ser criada uma nova.  verificar se já existe uma CustomViewerDigita que atenda as necessidades. Preencher os campos com valor 1 Ou alterar o tamanho dos campos manualmente.88) você deve alterar as seguintes propriedades: 1. No AppBuilder Acessar Options .Implementação Sugestão Para que os campos sejam exibidos no tamanho adequado (altura 0.  verificar se já existe um CustomBrowserDigita que atenda as necessidades. Alterar a opção Layout Units para Pixel 4. utilizando o estilo CustomBrowserDigita. Como construir um Browse de Digitação  Estilo Utilizado ' Nome Físico CustomBrowserDigita Masters/b-digit.w selecionar o estilo relacionado na tabela acima. lembrando-se que a única condição para esta viewer é a utilização de variáveis.  redimensionar a WindowDigitaçãoRápida de acordo com os objetos que foram colocados nela.  instanciar a CustomViewerDigita na página 1 da WindowDigitaçãoRápida.

substituindo as cláusulas <campo1> <campo2> pelos campos que devem estar no browse. após o comando enable substituir as cláusulas <campo1> <campo2> pelos campos editáveis do browse.  alterar a trigger de open_query.w em Arquivo | Novo.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 211  alterar a definição da temp-table no bloco de definitions conforme necessidade. Esta pi é chamada no choose bo botão OK.  alterar a trigger de display. conforme instruções na pi. . informar o nome das variáveis que estão na viewer e que se deseja retornar o valor destas para o browse. substituindo a cláusula <temp-table> pelo nome da temp-table definida anteriormente. Não eliminar o campo "line".  colocar todas as validações na pi-salva-rel. a lista retornada será gravada numa variável e o usuário deve utilizar esta variável e o comando ENTRY para trabalhar com estes valores. os valores serão retornados por intermédio do comando return-value. validando assim os valores informados no browse a cada inclusão de um novo registro no browse. selecionar o estilo relacionado acima.  na pi-cria-registro deve ser feita a leitura dos registros da temp-table e criados os registros na tabela física. Não é necessário gravar o campo "line".  salvar o browse com o nome definido para Browse de Digitação Rápida.  alterar a pi-salva-rel para que esta possa gravar todos os valores do browse. na chamada da pi-buscavalor. Como construir uma Query  'Estilo Utilizado Nome Físico Custom Query Wizard Masters/wquery.

Implementação  seguir os passos indicados pelo Wizard atentando para que.  de acordo com os objetos a serem instanciados na viewer. . em query definitions seja assinalado o toggle box Index Reposition. seguir a técnica correspondente:  Padrão.  Sem campos de tabela. se a viewer não contiver cláusula where. Como definir viewer Padrão Viewer Padrão é aquela que possui ao menos um campo não chave de tabela. selecionar o estilo citado acima. Como construir viewers Estilo Utilizado ' Nome Físico Custom Viewer com AutoField Masters/vieweraf.w  em Arquivo | Novo.  Só com campos chave.

25.  alterar a linha inicial do retângulo rt-mold para a altura do rt-key + 1. clicar em Cancel.  na dialog que se abrirá logo após a seleção do template. 2. 3.23. 3.  caso exista mais de um atributo chave:  colocá-los em espaçamento 1. caso forem postos na tela:   tornar os atributos desabilitados. ou seja..17. possuir ao menos um campo de tabela habilitado.  alterar a altura do retângulo rt-key para o número de atributos chave + 0.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 213 É necessário para uma Viewer Padrão. na linha 2.. etc. selecionar a(s) tabela(s) a serem utilizadas na viewer.  em propriedades e Advanced.25.17. marcar o toggle-box '{&ADMCREATE-FIELDS}'. caso aconteça. através de propriedades.  colocar o primeiro atributo na linha 1.  alterar a altura de todos os atributos de tipo fill-in para 0.25.  a seguir pode ou não ser apresentada uma mensagem questionando se a viewer deve suportar chaves estrangeiras. desmarcando o toggle-box 'Enable'. ou seja.  para os atributos que formam a chave de acesso da tabela. etc.i} por estas a seguir: if not frame {&frame-name}:validate() then return 'ADM-ERROR':U. selecionar os campos a serem utilizados.17.  se a viewer for utilizada em um cadastro do tipo simples. esse campo não pode ser chave de tabela.  na janela após a seleção da(s) tabela(s). . no início da procedure local-assign-records é necessário substituir a linha contendo: {include/i-valid. se não forem colocados atributos chave:  eliminar o retângulo rt-key.88.

67).. .67. 4.  em propriedades e Advanced. marcar o toggle-box '{&ADMMODIFY-FIELDS}'. que não estão associados aos campos no banco de dados. */  na procedure LOCAL-ENABLE-FIELDS comentar a linha que contém a ocorrência:"if-adm-new-record=yes then". desmarcar o toggle-box 'Enable'). Essas inicializações das variáveis podem ser.i 03}. /* Code placed here will execute PRIOR to standard behavior. atribuição de itens para combo-boxes e radio-sets. /* Dispatch standard ADM method. como por exemplo combo-box. RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ). etc. e devem ser feitas antes do dispatch padrão.67). atribuição de labels (para tradução automática).17 (Exemplo: 2. acessar as 'Property' e:  tornar o objeto desabilitado (em propriedades. caso forem postos na tela:  colocar o primeiro atributo na linha de rt-mold + 0. /* Code placed here will execute AFTER standard behavior.Exemplo   mover o retângulo rt-mold para a linha 1.  customizar a procedure LOCAL-INITIALIZE para que as inicializações dos objetos sejam feitas.  alterar a altura do retângulo rt-mold de modo a apenas caber os atributos dentro. */ {utp/ut-liter.i Preço * R} assign fill-in_Price:label in frame {&frame-name} = returnvalue cb-country:list-items in frame {&frame-name} = {pdinc/i01pd001. para os atributos que não formam a chave de acesso da tabela.  colocar os demais atributos com um espaçamento de 1 (Exemplo: 3.  colocar na SmartViewer outros objetos.  para os objetos não associados ao banco de dados e que devem ser atualizados pelo usuário.

 se a SmartViewer for usada dentro do Cadastro Inclui/Modifica Filho sem folder.  acessar as propriedades da frame da SmartViewer.*/ /* Code placed here will execute AFTER standard behavior.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 215  a procedure LOCAL-DISPLAY-FIELDS deve ser customizada para que o valor da variável seja exibido. para isso.  se a viewer for utilizada em um cadastro do tipo simples. alterar a largura de rt-key e rt-mold para 76.i} por estas a seguir: . */ if avail order-line then assign fill-in_Price = Order-Line.  se for usada dentro de outro folder que não seja em um Cadastro Inclui/Modifica Filho. else assign fill-in_price = 0.72.  salvar a SmartViewer com o nome definido.72.29. */ /* RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U).  */ quanto à largura da SmartViewer:  se a SmartViewer for usada dentro de um folder de Cadastro Inclui/Modifica Filho. no início da local-assign-records é necessário substituir a linha: {include/i-valid. são variáveis dispostas na tela de modos que o usuário possa alterar os seus valores em tempo de execução. de acordo com os Padrões de Nomenclatura. alterar a largura de rt-key e rt-mold para 85. ou seja. /* Dispatch standard ADM method.  cancelar a tela de seleção de tabelas exibida após a escolha da template. clicar em 'Tab Order' e no combo-box 'Tabbing Options' escolher a opção 'Left-to-Right By Columns'. /* Code placed here will execute PRIOR to standard behavior. antes do dispatch padrão deve-se atribuir a variável o valor a ser exibido. alterar a largura de rt-key e rt-mold para 79.Price. Como definir viewer sem campos de tabela: Viewer sem campos de tabela é aquela que possui apenas objetos (widgets) não vinculados a uma base de dados.

radio-sets. deve ser a primeira da lista. . Para isso. combo-boxes. etc) na viewer.  definir no Method-Library a include i-auxtab. retângulos. Outras variáveis Adm-modify-fields Adm-assign-fields Habilitados nas operações de ADD.i. COPY e MODIFY.  inserir os objetos (fill-in´s.  Atenção: o controle de habilitação/desabilitação de campos deve ser feito pelo usuário.  desabilitar todos os objetos da tela que não devam ser mostrados habilitados. deve-se colocar os campos nos preprocessadores de acordo com a tabela abaixo:  Tipo de Objetos Preprocessador Finalidade Chaves (variáveis que representam chaves) Adm-create-fields Habilitados somente na criação de um novo registro.  definir ao menos uma tabela externa.if not frame {&frame-name}:validate() then return 'ADM-ERROR':U. esses objetos não podem ser campos de tabelas.

Comenta r value. atribuição de labels (preparação para tradução). */  customizar a procedure LOCAL-DISPLAY-FIELDS. */ {utp/ut-liter. Essas inicializações das variáveis podem ser.i 03}. /* Code placed here will execute AFTER standard behavior. chamada {utp/ut-liter.. atribuição de itens para combo-boxes e radio-sets. /* Code placed here will execute PRIOR to standard behavior. etc.i País * L} assign cb-country:label in frame {&frame-name} = return-value cb-country:list-items in frame {&frame-name} = {pdinc/i01pd001. sendo que é nessa procedure que os valores dos objetos serão exibidos: .i Quantidade * R} assign fill-in_Qty:label in frame {&frame-name} = return. {utp/ut-liter. */ RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U). /* Dispatch standard ADM method.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 217  customizar a procedure LOCAL-INITIALIZE para que as inicializações dos objetos sejam feitas.i Preço * R} padrão assign fill-in_Price:Label in frame {&frame-name} = returnvalue.

 customizar a procedure LOCAL-DISABLE-FIELDS.Item-num Order-Line.chamada */ padrão /* Code placed here will execute AFTER standard behavior. &endif Caso seja uma viewer principal. */ padrão /* if adm-new-record = yes then */ &if defined(ADM-MODIFY-FIELDS) &then enable {&ADM-MODIFY-FIELDS} with frame {&frame-name}. */ r /* RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U).Line-num Order-Line. GROUP-ASSIGN-TARGET':U).Exemplo  comentar o dispatch padrão.  inserir as seguintes linhas: .Price Order-Line.Order-num Order-Line.  inserir os comandos para que os valores dos objetos sejam exibidos. */ r /* RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U).  comentar a linha em que consta a seguinte sentença: if adm-newrecord then. */ Comenta /* Dispatch standard ADM method. sendo que é nessa procedure que os objetos são habilitados:  comentar o dispatch padrão. incluir: RUN notify ('enable-fields. sendo que é nessa procedure que os objetos são desabilitados:  comentar o dispatch padrão.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. */ chamada /* Code placed here will execute AFTER standard behavior. */ Comenta /* Dispatch standard ADM method. */ DISPLAY Order-Line Qty Order-Line. /* Code placed here will execute PRIOR to standard behavior. /* Code placed here will execute PRIOR to standard behavior.

*/ Comenta /* Dispatch standard ADM method. */padrão &if defined(ADM-CREATE-FIELDS) &then disable {&ADM-CREATE-FIELDS} with frame {&frame-name}. sendo que é nessa procedure que os objetos terão seus valores salvos:  comentar o dispatch padrão. */ r */ /* RUN dispatch IN THIS-PROCEDURE (INPUT 'disable-fields':U). ASSIGN order-line. END. IF ERROR-STATUS:ERROR THEN RUN dispatch IN THIS-PROCEDURE ('show-erros':U).Line-num = FILL-IN_Line-num order-line. Comenta */ r chamada /* Code placed here will execute AFTER standard behavior. . /* Code placed here will execute PRIOR to standard behavior. GROUP-ASSIGN-TARGET':U). */ /* RUN dispatch IN THIS-PROCEDURE (INPUT 'assign-statement':U).Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 219 &if defined(ADM-CREATE-FIELDS) &then disable {&ADM-CREATE-FIELDS} with frame {&frame-name}. RETURN "ADM-ERROR": ASSIGN {&ADM-CREATE-FIELDS}{&ADM-MODIFY-FIELDS}.Qty = FILL-IN_Qty NO-ERROR. &endif /* Code placed here will execute PRIOR to standard behavior. */ padrão DO WITH FRAME {&FRAME-NAME} ON ERROR UNDO. &endif Caso seja uma viewer principal colocar: RUN notify ('disable-fields.Item-num = FILL-IN_Item-num order-line.Order-num = FILL-IN_Order-num when admnew-record = yes order-line. &endif &if defined {ADM-MODIFY-FIELDS} &THEN disable {&ADM-MODIFY-FIELDS} with frame {&frame-name}.Discount = FILL-IN_Discount order-line.  customizar a procedure LOCAL-ASSIGN-STANTEMENT.Price = FILL-IN_Price order-line. */ /* Dispatch standard ADM method. chamada /* Code placed here will execute AFTER standard behavior.  inserir a lógica de gravação dos valores das variáveis.

ou seja.  colocar os demais atributos com um espaçamento de 1 (Exemplo: 3.67. caso forem postos na tela:  colocar o primeiro atributo na linha de rt-mold + 0. caso forem postos na tela:    colocar o primeiro atributo na linha 1.25 se não forem colocados atributos que representem chaves:  eliminar o retângulo rt-key. retirar o retângulo rt-mold. ou seja.  alterar a linha inicial do retângulo rt-mold para a altura do rt-key + 1.17.  se for usada dentro de outro folder que não seja em um Cadastro Inclui/Modifica. para os atributos que não formam a chave de acesso da tabela. 2.17.29.  se a SmartViewer for usada dentro do Cadastro Inclui/Modifica sem folder.67).17  caso existam mais de um atributo que represente uma chave:  colocá-los com espaçamento 1.25.  alterar a altura do retângulo rt-mold de modo a apenas caber os atributos dentro. alterar a altura de todos os atributos para 0. etc. alterar a largura de rt-key e rt-mold para 76.  alterar a altura do retângulo rt-key para o número de atributos chave + 0.  mover o retângulo rt-mold para a linha 1.23.  se não forem colocados atributos não chave.17 (Exemplo: 2.25.  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 79. na linha 2. .88. alterar a largura de rt-key e rt-mold para 85.72.67). 3. 4.  para os atributos que representam a chave de acesso a tabelas. etc.72. 3.

i. . pode ou não ser apresentada uma mensagem questionando se a viewer deve suportar chaves estrangeiras. clicar em 'Tab Order' e no combo-box 'Tabbing Option' escolher a opção 'Left-to-Right By Columns'.  na janela após a seleção da(s) tabela(s).  a seguir.  salvar a SmartViewer com o nome definido. clicar em Cancel.  na dialog que se abrirá logo após a seleção do template. Essa viewer poderá conter variáveis dispostas para entrada de dados pelo usuário. deve ser a primeira da lista. caso aconteça. selecionar a(s) tabela(s) a serem utilizadas na viewer.  definir no Method-Library a include i-auxtab.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 221  acessar as propriedades da frame da SmartViewer. de acordo com os Padrões de Nomenclatura. selecionar os campos a serem utilizados. Como definir viewers só com campos chave: Viewer só com campos chave é aquela que não possui campos não chave dispostos na tela.

i Preço * R} assign Order-line.Exemplo  desabilitar todos os campos da tela. Essas inicializações podem ser. {utp/ut-liter. atribuição de labels (preparação para tradução). */ {utp/ut-liter. RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ). /* Code placed here will execute PRIOR to standard behavior.i Quantidade * R} assign fill-in_Qty:label in frame {&frame-name} = returnvalue. atribuição de itens para combo-boxes e radio-sets. customizar a procedure LOCAL-DISPLAY-FIELDS para que seus valores sejam exibidos. /* Code placed here will execute PRIOR to standard behavior.i 03}. /* Dispatch standard ADM method. */ /* Code placed here will execute AFTER standard behavior. */  caso existam na viewer objetos não vinculados ao banco de dados (variáveis). Observe que índices de tabelas não podem ser alterados. */ RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U). /* Dispatch standard ADM method. Atenção: o controle de habilitação/desabilitação de campos deve ser feito pelo usuário. */ */ .. {utp/ut-liter.i País * L} assign cb-country:label in frame {*frame-name} = return-value {pdinc/i01pd001. etc. Mais instruções a seguir:  colocar os campos nos preprocessadores de acordo com a tabela abaixo: Preprocessador Finalidade Adm-create-fields Adm-assign-fields Habilitados somente na criação de um novo registro Adm-modify-fields Devem ser marcados os objetos que serão habilitados para alteração de uma ocorrência na tabela.  Exemplo: operações de ADD e COPY customizar a procedure LOCAL-INITIALIZE para que as inicializações dos objetos sejam feitas. /* Code placed here will execute AFTER standard behavior.Price:label in frame {&frame-name} = return-value.

*/ /* Dispatch standard ADM method.  criar e customizar a procedure LOCAL-ASSIGN-STATEMENT. /* Code placed here will execute PRIOR to standard behavior.  = fill-in_Qty = fill-in_Price customizar a procedure LOCAL-ENABLE-FIELDS:  comentar o dispatch padrão.  inserir o seguinte código após o dispatch padrão: 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}. /* Todos os assign´s não feitos pelo assign-record devem ser feitos aqui */ assign order-line.Qty order-line.Price WITH FRAME {&FRAME-NAME}. &endif . */ /* RUN dispatch IN THIS-PROCEDURE (INPUT 'enable-fields':U).qty = fi-3.) /* Dispatch standard ADM method..Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 223 if avail Order-Line then DISLPAY order-line. incluir: RUN notify ('enable-fields.  comentado a linha em que apareça a sentença: if adm-new-record = yes then. customizar a procedure LOCAL-ASSIGN-RECORD para que seus valores sejam salvos. GROUP-ASSIGN-TARGET':U). Exemplo: (.  caso existam na viewer objetos não vinculados ao banco de dados (variáveis). RUN dispatch IN THIS-PROCEDURE (INPUT 'assign-record':U ). &endif Caso seja uma viewer principal. */ /* 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}..

desmarcar o toggle-box 'Enable').88. poderá conter variáveis. 2. 3.  alterar a altura do retângulo rt-key para o número de atributos chave + 0.  colocar na SmartViewer outros objetos.  alterar a linha inicial do retângulo rt-mold para altura do rt-key + 1. caso forem postos na tela:  colocar o primeiro atributo na linha de rt-mold + 0.  alterar a altura do retângulo rt-mold de modo a apenas caber os atributos dentro. para os atributos que não formam a chave de acesso da tabela.25. ou seja. se não forem colocados atributos não chave.: apesar da viewer só com campos chave não conter outros campos.  para os objetos não associados ao banco de dados e que devem ser atualizados pelo usuário. acessar as 'Property' e:  tornar o objeto desabilitado (em propriedades. Obs.25.. 4. que não estão associados ao banco de dados.23.17 (Exemplo: 2.&if defined(ADM-MODIFY-FIELDS) &then assign {&ADM-MODIFY-FIELDS}.25. 3.  para os atributos que formam a chave de acesso da tabela:  colocar o primeiro atributo na linha 1. retirar o retângulo rt-mold. . ou seja. etc.    alterar a altura de todos os atributos para 0.  caso exista mais de um atributo chave:  colocá-los com espaçamento 1.67..17. etc.17. como por exemplo combo-box.  colocar os demais atributos com um espaçamento de 1 (Exemplo: 3. &endif end. na linha 2.67).67).17.

alterar a largura de rt-key e rt-mold para 79. conforme técnica Como registrar campo do tipo Fill-in para o WebEnabler. clicar em 'Tab Order' e no combo-box 'Tabbing Options' escolher a opção 'Left-to-Right By Columns'. alterar a largura de rt-key e rt-mold para 76. quanto à largura da SmartViewer:  se a SmartViewer for usada dentro de um folder de Cadastro Inclui/Modifica. Portanto não é necessário efetuar o registro para esses fill-ins. . ou possua trigger de "ENTRY". alterar a largura de rt-key e rt-mold para 85. de acordo com os Padrões de Nomenclatura. marcar o toggle-box '{&ADMMODIFY-FIELDS}'. deve ser observado se o mesmo possue trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita.29.72.  acessar as propriedades da frame da SmartViewer. Caso o fill-in se encaixe em uma das opções acima. ou que possuírem um botão de zoom na sua direita. Observação Para os campos do tipo fill-in’s.  salvar a SmartViewer com o nome definido.  se for usada dentro do outro folder que não seja em um Cadastro Inclui/Modifica.  se a SmartViewer for usada dentro do Cadastro Inclui/Modifica sem folder.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 225   em propriedades e Advanced. O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que possuírem a lupa como cursor do mouse. deve ser efetuado o registro para o WebEnabler. 72.

a validação será feita podendo prejudicar a performance do programa. Validações Antes da Alteração Da mesma forma que nas Validações na Navegação de Registro (item X. Validações na Navegação de Registro Em certos casos é necessário validar um registro assim que é acessado através da navegação na tabela. Para que o botão de Modificação seja habilitado deve ser seguida a técnica Como habilitar ou desabilitar Botões em Painéis. de modo que estejam condizentes com o que o programa pede e que não sejam passadas informações errôneas de modo a prejudicar o andamento correto das operações.CAPÍTULO 9 Validações Validações de Tela As validações têm o objetivo de conferir as entradas de dados fornecidas pelo usuário a um programa. . existem casos em que é necessário validar um registro para permitir ou não a sua alteração. Deve-se ter cuidado com esse tipo de validação. pois cada vez que o usuário navegar na tabela. Este caso aplica-se para executar uma função qualquer como apresentar uma mensagem informativa ao usuário referindo-se àquele registro ou desabilitar o botão de alteração ou cópia. consequentemente prejudicial a performance do programa.2). porém em alguns desses casos a validação pode ser complexa e demorada.

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
227

Para evitar que a validação acabe afetando a performance do programa, devese fazer a validação apenas quando houver a tentativa de alteração, incluindo o
código a seguir antes do dispatch padrão da procedure Local-Enable-Fields:
define variable c-p-cadsim as character no-undo.
if not adm-new-record and available <tabela> then do:
if <condição> 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 manutenção
<condição>: uma condição qualquer que indica que o registro não pode ser
alterado
<mensagem>: uma mensagem a ser apresentada ao usuário informando
impossibilidade da alteração para o registro.
Observação Essa técnica deve ser evitada, pois o usuário verá o botão de alteração habilitado
e ao tentar alterar o registro a mensagem irá interrompê-lo, contradizendo a função do botão.

Validações em Entrada de Dados
As validações feitas para valores de entradas de dados devem ser feitas sempre
no momento de sua confirmação, de modo que na ocorrência de alguma
inconformidade em qualquer dos valores requisitados pelo programa, este
deverá apresentar uma mensagem de erro através do utilitário ut-msgs.p e
posicionar o foco no campo em que ocorreu o problema para que o usuário
possa corrigi-lo.

Validações em Cadastro Simples
As validações em um Cadastro Simples devem ser feitas antes do dispatch da
procedure Local-assign-record da Viewer.

Validações em Cadastro Complexo
O cadastro complexo possui mais de uma Viewer por isso tem uma forma
diferente de fazer as validações para suas entradas de valores.
As validações dos dados de entrada em um Cadastro Complexo são feitas nas
procedures pi-validate das Viewers que compõem o cadastro.

Validações para Window Relatório
Pelo fato da Window Relatório ser um Template não composto por
SmartObjects, a validação de seus valores tem as seguintes características:
Validações das páginas de Parâmetros, Seleção e Classificação
Os valores dessas páginas são validados dentro da procedure pi-executar, após o comentário:
/* Coloque aqui as validações das outras páginas, lembrando que elas devem apresentar uma
mensagem de erro cadastrada, posicionar na página com problemas e colocar o foco no campo
com problemas */

Browse de Digitação
Os valores do browse de digitação devem ser validados no momento que o usuário sai do
registro, no evento Row-Leave do browse.

Validação da Página de Impressão
A página de impressão não precisa sofrer qualquer tipo de validação, o Template se encarrega de
confirmar os valores para essa página. Porém, isso não acontece para os campos que não
pertencem originalmente ao Template, que foram adicionados posteriormente.

Validações em Triggers de Dicionário de Dados
Existem casos que é imprescindível que haja validações de dicionário de dados
para as tabelas de modo a assegurar que não ocorram entradas de dados que
não condizem com o esperado.
Porém as validações de dicionário de dados podem acarretar o mau
funcionamento nos Templates, por isso não são indicadas, já que esse tipo de
validação não pode retornar informações do problema ocorrido para que seja
tratado conforme necessário.

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
229

Para que isso não ocorra, as validações de dicionário devem ser replicadas nos
programas, nos locais indicados conforme o Template utilizado, fazendo com
que seja possível o tratamento dos problemas que possam ocorrer no
andamento das validações.

Observações
Importante

231

CAPÍTULO 10

Mensagens
Este capítulo apresenta mensagens padrões para algumas situações comuns no
Datasul-EMS 2.00. As mensagens já cadastradas e utilizadas que se encaixem
nas situações abaixo devem ser alteradas, mas não é necessário realizar esta
alteração agora, somente quando o programa for aberto para outras
manutenções. Para auxiliar o cadastro e manutenção 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 criação de um
usuário no Sistema de Mensagens. Em seguida você pode acessar o Sistema
pelo endereço: X:\Atalhos\SistTec\Mensagem.
1. Os novos programas devem utilizar estas mensagens;
2. Quando o parâmetro solicitar o label da tabela, deve-se utilizar o returnvalue do include utp/ut-table.i.
A manutenção do cadastro das mensagens, assim como a inclusão de novas
mensagens só pode ser realizada pela Datasul. Para clientes e parceiros é
autorizada somente a utilização das mensagens já cadastradas.
Mensagem: &1 já existente !
Número: 1
Help: Já existe ocorrência em &1 com a chave informada.
Parâmetros: &1 = label da tabela
Mensagens substituídas: &1 já cadastrado.
&1 já cadastrada.
Registro &1 já cadastrado.
Agência já cadastrada.

232

&1 já informado !
Observações: 

utiliza-se palavra 'existente', pois ela não possui
gênero;

as palavras derivadas do termo 'cadastro' como
cadastrado, cadastrada e cadastramento devem ser
evitadas;

a palavra 'registro', também, deve ser evitada, pois
trata-se de um termo computacional estranho ao
usuário, devendo ser substituída por 'ocorrência';

não é necessário apresentar o conteúdo da chave da
tabela, pois este está na tela.

Mensagem: &1 já existente !
Número: 56
Help:

Verificar se existe uma ocorrência para a(o) &1 informado
em seu cadastro.

Parâmetros: &1 = label da tabela
Mensagens substituídas: &1 não cadastrado.
&1 não cadastrada.
Registro &1 não cadastrado.
Agência não cadastrada.
&1 incorreto(a) !
&1 inválido.
&1 inválida.
Observações: 

utiliza-se palavra 'existente', pois ela não possui
gênero;
as palavras derivadas do termo 'cadastro' como
cadastrado, cadastrada e cadastramento devem ser
evitadas;

A palavra 'inválido', também, deve ser evitada, pois se pode
obter sentido não desejado. Exemplo: Funcionário inválido !

Mensagem: &1 possui relacionamentos ativos com &2 !
Número: 5
Help:

A corrente ocorrência de &1 possui relacionamento ativos
com a tabela &2, portanto não pode ser eliminada.

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
233

Parâmetros: &1 = label da tabela pai no relacionamento
&2 = label da tabela filho no relacionamento
Mensagens substituídas: &1 possui relacionamentos ativos.
&1 possui &2 cadastrado(s).
&1 possui &2 cadastrada(s).
Banco possui Agência cadastrada.
Observações: As palavras derivadas do termo 'cadastro' como
cadastrado, cadastrada e cadastramento devem ser
evitadas;

Mensagem: Não encontrado(a) &1 para chave informada !
Número: 2
Help:

Não foi encontrada ocorrência em &1 com a chave
informada.

Parâmetros: &1 = label da tabela
Mensagens substituídas: Chave informada não encontrada.
Observações: 

mensagem padrão para inclusão de ocorrências numa
tabela temporária de digitação, quando esta possuir
índice único.

Regras para a criação de novas mensagens
Estas regras devem ser seguidas por todos os programadores e analistas que
estão desenvolvendo o Datasul-EMS 2.00. As mesmas visam facilitar o
controle das mensagens (para que não haja o acúmulo de informações que não
serão utilizadas ou então repetitivas) e também, facilitar o trabalho de
tradução, pois seguindo estas normas o número de mensagens criadas diminui.

não utilizar ponto de exclamação ou ponto final, a não ser que haja
sentença posterior.

Exemplo: O código da referência deve ser preenchido. Informe um código
diferente de branco;

As reticências podem ser utilizadas somente nos casos de uso do gerúndio.

Exemplo: Calculando ... ; Imprimindo ... ; Executando ...

Outros exemplos de mensagens cadastradas que não podem ocorrer:

Exemplo: Eliminando cálculo antigo ...

Quando o programador tiver a necessidade de ressaltar a mensagem,
utilizar a função "alert-box warning".

Exemplo de mensagem incorreta:

Eliminação inválida !

não utilizar ponto ao abreviar palavra.

Exemplo de mensagem incorreta: Cond. Pagto.

revisar possíveis erros gramaticais, de concordância e de grafia. Exemplo
de mensagens incorretas:
Serão criadas as mesmas contas para todos os grupos de clientes
Informe se será irá ser executado um processo de substituição de &1
modificado em &2 registrados para &3
Permitindo somente a inclusão de três tipos de mão de obra
&1 não pode ser eliminad(o)a !
... de Fim de Perídodo
Confirma elimanação ?
Ano fiscal já esté encerrado.
Eliminção inválida !

utilizar acentuação sempre. Exemplo:
Períodos para o ano ja cadastrados.
Moeda do credito nao tem cotacao para hoje.

não utilizar letras maiúsculas no meio da frase sem que seja nome próprio.
Exemplos:
Linha Possui Ordens Valorizadas !
Ordem de Produção Não Possui &1.

evitar repetir a mesma palavra várias vezes. Exemplos:
Operação &1 não está cadastra para o Roteiro &2. Informe outra
operação para este Roteiro ou cadastre a Operação &1 para o Roteiro
&2.

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
235

antes de criar uma nova mensagem verificar se não há outra similar que
possa ser utilizada. Exemplo:
Eliminação Inválida !
Eliminação inválida!

Para auxiliar esta operação, o Sistema de Mensagens possui o botão Pesquisa,
onde você pode buscar por Código ou pelo Texto da Mensagem. Além disso,
ainda possui a opção de Filtro onde você informa palavras que deseja procurar
dentro do sistema.

não abreviar palavras sem necessidade (somente por questões de espaço).
Exemplo:
Cond. Pagto.
Estabelec
Dt Ent Prev
Cod Dest Merc
Encer calc não efetuado.

não utilizar palavras ou jargões técnicos. Exemplos:
Título já existe no browse
Script do Automanager não encontrado.

utilizar o help da mensagem somente se necessário, se houver algo a
acrescentar. Não utilizá-lo, somente para repetir a mesma mensagem.
Exemplo:
Agência não cadastrada. Help Agência não cadastrada!
Item para debito direto - Help Item para debito direto.

procurar ser formal. Não utilizar gírias. Exemplo:
Linha Possui Ordens Valorizadas ! Não pode alterar !

Não utilizar o tratamento VOCÊ.

utilizar somente o idioma português (com exceção de palavras técnicas
específicas). Exemplo:
Parámetros

consultar Glossário ou demais membros da equipe de tradução.El código de grupo informado não existe !  não utilizar sinais ortográficos ou espaços em branco ao início das mensagens. .fhdfjhdfghdf Vários Representante teteretert fadfads  a mensagem deve ser o mais clara e sucinta possível.  não criar mensagem somente com letras maiúsculas. utilizar o help. Exemplo: ** Pendencias de Credito do Cliente  não criar mensagens sem sentido. Padrões para tradução de mensagens para Inglês e Espanhol  utilizar os mesmos padrões para criação de mensagens novas. Exemplos: a nd fghfhdfh . Qualquer necessidade de detalhamento.  no caso de dúvidas.

Nomenclatura 237 CAPÍTULO 11 Programas Reutilizáveis Procedures Internas Procedures Internas reutilizáveis são definidas em includes que devem ser incorporados aos programas.Sigla do Módulo INC .w.Seqüencial. A nomenclatura dos includes que contém este tipo de procedure interna deve ser a seguinte: XXINC999. Exemplo : Cálculo do valor presente de uma cotação de preços. onde: XX .Fixo 999 . e disponibilizadas para clientes e parceiros da DATASUL. As procedures tratadas neste tópico diferem de outras ou mesmo de outros includes pelo fato de serem documentadas (posteriormente) em Manual Técnico do Módulo. Se forem incorporadas a programas . . não devem fazer acesso muito grande a dados pois se isto acontecer devem ser transformadas em API(s).i. Rotinas de Extenso. Conversão de valores entre moedas.

.. deve-se estar com qualquer uma das ferramentas Progress abertas (Data Dictionary. ).239 CAPÍTULO 12 Ferramentas Application Compiler O Application Compiler é uma ferramenta Progress utilizada para compilar arquivos. pressionar o menu Tools e em seguida o item Application Compiler. exibida a janela a seguir. Procedure Editor. . UIB . na qual se deve informar os arquivos que se deseja compilar e as opções de compilação. Para iniciar o Application Compiler. Sendo então.

caso queira incluir a lista de arquivos a serem compilados num diretório do PROPATH do Progress.Selecionar arquivos a serem compilados Para selecionar os arquivos que devem ser compilados seguir os passos abaixo: 1. . 3. utilizar o botão 'Files'. deve ser exibida uma caixa de diálogo com todos os caminhos existentes no PROPATH do Progress. deve-se seguir os passos abaixo: 1. Pode-se. Pressionar o botão 'Propath'. 3. deve ser exibida uma caixa de diálogo. Pressionar o botão esquerdo do mouse sobre os diretórios desejados. Pode-se. 2. na qual pode-se localizar mais facilmente os arquivos desejados. separando-os por espaço. 2. Pressionar o botão 'Ok' e então o diretório e os arquivos devem ser exibidos na janela do Application Compiler. Então. Caso os arquivos desejados estejam em diretórios diferentes pode-se adicionar mais diretórios e/ou arquivos a lista. informar mais de um tipo de arquivos. para exibir uma caixa de diálogo padrão do Windows. Pressionar o botão 'Ok'. E ainda. Pressionar o botão "Add" na janela anterior. na qual. selecionando-os. deve ser informado o diretório e/ou nome dos arquivos e/ou tipo dos arquivos a serem compilados. também.

Opções de Compilação O Application Compiler disponibiliza algumas opções de compilação.R gerados . descritas abaixo:  salvar os novos arquivos . seguir os passos abaixo: 1. retornando assim a janela anterior. . para isso marcar a caixa de combinação Look in Subdirectories. Depois pressionar o botão 'Delete'. Depois pressionar o botão 'Modify' e será exibida uma caixa de diálogo. Após feitas as devidas modificações pressionar o botão 'Ok'.para isso marcar a caixa de combinação Save New . Pressionar o botão esquerdo do mouse sobre o diretório e/ou arquivo da lista a ser modificado. 2. Para eliminar alguns dos diretórios da lista de arquivos a serem compilados. deve-se seguir os passos abaixo: 1. 3. Pressionar o botão esquerdo do mouse sobre o diretório e/ou arquivos da lista a ser eliminado.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 241 Eliminar e Modificar a lista de arquivos a serem compilados Para modificar algum dos diretórios da lista de arquivos a serem compilados. na qual. ficando assim selecionado.r Files.  compilar arquivos existentes nos subdiretórios dos diretórios da lista de compilação. pode-se modificar o diretório e/ou arquivos e/ou tipos de arquivos a serem compilados. 2.

para isso marcar o item de menu Save Settings on Exit que se encontra no menu Options. Além das opções descritas anteriormente. item Compiler. caso este item de menu não esteja marcado.  exibir status da compilação dos arquivos .para isso marcar a caixa de combinação Only Compile If No . caso os novos arquivos .  arquivo de LOG. pode-se informar algumas opções adicionais. tais como:  tipos de arquivos padrão a serem compilados . erros encontrados. erros encontrados.r File. na caixa de texto Save Into.digitar o diretório e o nome do arquivo de LOG na caixa de texto Message Log File.para isso marcar o item de menu Show Status que se encontra no menu Options.para isso marcar a caixa de combinação Remove Old .. eliminar os antigos .digitar o nome do diretório onde estes arquivos devem ser gravados. o Application Compiler possui outras opções de compilação. Caso o item de menu Show Status esteja marcado.  salvar as alterações realizadas nas opções de compilação .digitar os tipos de arquivos na caixa de texto Default File Spec. . no qual devem ser gravados os novos arquivos . . será exibida a mesma caixa de diálogo mas. na qual.R existentes . este arquivo deve armazenar os resultados (arquivos compilados com sucesso..R .r Files.) da compilação dos arquivos .  compilar somente os arquivos que não possuam . somente ao final da compilação dos arquivos.. será exibida uma caixa de diálogo com informações sobre o status da compilação (arquivos compilados com sucesso. Estas opções podem ser acessadas através do menu Options. Iniciar Compilação Para iniciar a compilação dos arquivos deve-se pressionar o botão 'Start Compile'.R devam ser gravados no mesmo diretório dos arquivos de origem. . )..R .  diretório. Será então exibida uma caixa de diálogo denominada Compiler Options.. não informar nenhum diretório nesta caixa de texto.

objetos e includes.Task Maintenance. Para a utilização do Roundtable. veja os passos a seguir:  ir no menu Task . Criar uma task para poder desenvolver os programas. Selecionar a Workspace. 2. deve-se seguir os passos descritos abaixo: 1. .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 243 Roundtable O Roundtable é uma ferramenta que facilita o controle de versão de programas.

Após criada a task. 4.  digitar na opção Summary a descrição da Task. Como editar um objeto:  estar com a task selecionada.Check Object Out: . caso o objeto já esteja na sua task. ir em File . selecionar a task que foi criada na opção Task.New Task.  digitar na opção Manager. Observação: Poderá ter mais de uma Task criada para um mesmo usuário.  clicar no botão 'Ok'. 3.  selecionar o objeto que se quer editar. a quem está designado (opcional).  ir em File .  clicar no botão 'Done'. Observação: Não há necessidade de se fazer os dois próximos itens.

o Roundtable deve liberar todos os objetos presos a task.Open.Task Maintanence. deve-se ir no menu Task .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 245 Observação: Caso essa opção não esteja habilitada certifique-se que a task esteja selecionada ou se o objeto já está em uso por outra pessoa. deve ser aberto o programa somente para leitura.  ir em File . Caso se queira abrir no Interface Builder - Abrir o Interface Builder e Ir no menu File .  selecionar a opção Patch Level. Se for selecionada a opção View Selected Object.Edit Selected Object: Observação Com isso deve abrir o programa no Procedure Editor. File .na última label Event. Para isso. Com isso. Como completar uma task:  depois de feitas as devidas alterações no(s) objeto(s) é preciso completar a task para liberar o(s) objetos(s) presos a task. 5.Complete Task e deve-se perguntar se deseja completar a task e deve-se responder que sim. que deve estar escrito 'Work in process'. Para verificar se o objeto já está em uso Ir em Folder . . desde que estes estejam sem erros.Spec (que está na tela principal do Roundtable) .

Como liberar um único objeto:  ir no menu compile .  ir na opção File .  ir no menu View. .Compile Object With Xref.Check Object In do menu.6. opção Object in Task View.  clicar em Ok. 7. Como saber se todos os objetos estão associados a task:  selecionar a task desejada.

alcançando assim a independência dos aplicativos. o cliente e mesmo os outros módulos. que passa os devidos parâmetros. . Uma API. pode ser desde uma atualização. Com isto. Esta tarefa.  outros módulos.  próprio cliente.  parceiros de desenvolvimento da DATASUL. quanto um programa que retorne informações. evitando duplicidade de código e as mantendo atualizadas. não pode ser chamada diretamente. ou seja.  equipes de desenvolvimento específico para customização dos módulos. é sempre executada a partir de um outro programa. quando desejar fazer alguma customização. Visando facilitar a customização e a integração dos módulos. As API´s são usadas pelos:  próprios programas do módulo. é um programa que recebe parâmetros específicos para a realização de alguma tarefa.Características Objetivo 247 CAPÍTULO 13 API´s O que são API´s e como construí-las API (Application Program Interface). não precisam conhecer em detalhes o modelo de dados de um módulo para criar registros.

ou qualquer outro tipo de variável global. apenas com a extensão .P. A API. através da temp-table.um número seqüencial de API´s dentro do módulo. dados como empresa. Isto facilita no momento da utilização do RPC. o include que contém as definições das temptables de integração tem o nome externo MPAPI001. As API´s devem ter a nomenclatura: XXAPI999. Pode ser utilizada também. se o programa API. devem ser enviados para a API. . Logo. deve ficar num include de nome semelhante ao programa API. tem o nome externo MPAPI001. para acessar determinado objeto. devolvendo informações ao programa chamador. podendo-se utilizar uma ou mais tabelas temporárias para fazê-la. pode ser utilizada uma temp-table. deve ser da seguinte forma:  INPUT-OUTPUT PARAMETER TEMP-TABLE: este é a única forma de comunicação de dados com a API. a reutilização de código.I. Assim. não deve ter tratamento com tela.P. A entrada dos parâmetros na API.indica o nome do módulo 999 . uma temp-table somente de retorno. Além disto. deve ser sempre via troca de parâmetros. O retorno da API. também. segue a idéia de orientação a objeto. parar retornar todos os erros ocorridos com determinado registro.  INPUT-OUTPUT PARAMETER TEMP-TABLE: pode-se atualizar em um atributo da temp-table de entrada de dados com o código da mensagem de erro que ocorreu com o registro. Cabe ao projetista/programador. usuário. definir a forma que mais se adapta ao programa a ser criado. ou seja. onde: XXX . para determinar o sucesso completo (OK) ou parcial (NOK) ou nulo (NOK) da execução.Funcionamento 248 Este conceito. somente um elemento preestabelecido pode efetuar tal operação. de forma alguma pode ser utilizado os valores das variáveis globais definidas no ut-glob.i.I. deve ocorrer das seguintes formas:  RETURN-VALUE: retornando OK ou NOK. A definição das temp-tables. A API deve ser construída de forma que. receba parâmetros e execute alguma ação.

uma vez que. Esta versão é fixa no programa API. e a descrição é o texto da mensagem. pode alterar o programa e gerar uma nova versão. para gerar o help da documentação da API. Esta documentação está contida no manual técnico do módulo. Existe um manual para cada módulo contendo todas as suas API´s. . No caso. devendo estar sempre atualizada. Esta versão deve ser incrementada. esta versão de integração da API é diferente da versão do programa da API. Utilizar um campo com nome cod-versao-integracao. deve ser utilizada a mensagem de erro número 3941. adequar seu programa às exigências impostas pela API. ou na forma de passar e receber os parâmetros. O programa chamador deve obrigatoriamente passar esta versão como parâmetro de entrada (sempre o primeiro campo da temp-table) e a API faz a consistência. Sempre que a API encontrar algum problema. deve conter as seguintes informações:  nome físico do programa. ou através de uma temp-table de erros de dois campos com as seguintes informações: Campo Descrição cod-erro Número da mensagem de erro desc-erro Descrição da mensagem de erro A mensagem deve estar obrigatoriamente cadastrada no cadastro de mensagens. ** Item parcialmente definido ** A documentação da API. a mesma deve retornar no próprio registro da temp-table de entrada com problemas. Deve ser utilizado módulo de documentação do Datasul-EMS. sempre que ocorrer alguma alteração no layout das temp-table´s. da versão de integração estiver incompatível. sem que seja necessário alterar a versão de integração da API. sendo controlada pelo programador (deve ser obrigatoriamente um número seqüencial).Documentação Versão Retorno de de Erros Integra ção APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 249 A API deve ter um controle interno para a versão corrente de integração. Cabe ao responsável do programa chamador. Importante lembrar que. verificando se a versão em que está o programa chamador é compatível com a versão de integração da API. com os dados recebidos por ela. deve ser feita pelo módulo responsável. A documentação da API.

No manual técnico do módulo deve conter uma relação com todas as API´S do módulo.i} que contém a definição dos parâmetros de entrada do programa.i ** Definição das temp-tables utilizadas para verificar ** replicação das mensagens para uma planta remota .  execução (validações e ações). objetivo e nome do arquivo help.  parâmetros de entrada e saída (o que significam os campos na(s) tabelas temporária(s)).Exemplo  versão de integração. Nome Físico: mmp/mpapi001. este deve buscar via BBS o help corrente da API.  nome do include que contém a definição das temp-tables de integração. Se o usuário precisar utilizar a API. /************************************************************** ** Include: MPAPI001.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". nome físico da API.p Versão de Integração: 1 Objetivo: verificar se deve replicar transação nas máquinas remotas e por buscar código da máquina local. Campo Descrição cod-versao-integracao Número da versão de integração .  considerações gerais.  objetivo. Parâmetros de Entrada: Para executar a API é necessário utilizar o include {mpp/mpapi001.

find first tt-replic-msg no-lock no error.P ** API responsável por verificar se deve replicar transação nas ** máquinas remotas e por buscar código da máquina local ** *************************************************************/ {mpp/mpapi001.cod-erro = 3942 tt-replic-msg. else do: find first maq-dest-trans where maq-dest-trans. input ""). else do: run utp/ut-msgs. return "NOK" end. input 3942. cdtrans = tt-replic-msg.cod-versao-integracao <> i-versao-integ then do: run utp/ut-msgs.cod-transacao no-lock no-error.cd-maquina-local = maquina.cod-erro = 3941 tt-replic-msg. if avail maquina then assign tt-replic-msg. if avail tt-replic-msg then do: if tt-replic-msg.p (input "msg".cd-maquina.i} def input-output parameter table for tt-replic-msg. input "") assign tt-replic-msg. assign i-versao-integ = 001.desc-erro = return-value .log-replica-msg = yes. find first maquina where maquina. Assign tt-replic-msg.tp-conexao = 1 no-lock noerror.desc-erro = return-value.p (input "msg". input 3941.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 251 cod-transacao log-replica-msg cod-erro desc-erro cd-maquina-local Código da API /************************************************************* ** Programa : MPAPI001. if avail maqui-dest-trans then assign tt-replic-msg. def var i-versao-integ as integer format "999" no-undo.

.  fonte padrão do documento é Arial 10.doc (API de Eliminação de Pedidos de Execução para o RPW). que podem servir de exemplo:  btb912zb. procurando destacar nomes ou aspectos importantes para o entendimento. end. else return "NOK".cd-maquina-local = 0.99 (exemplo V.tt-replic-msg. Return "NOK".doc Existem duas API´s documentadas. end.doc) e ser armazenado no diretório \DOCAPI\. /* fim */ Como documentar API´s Foi criado um documento modelo do Microsoft Word (.  btb917zb.  usar negrito e itálico de forma moderada. que está no diretório \\enseada\desems2\ferramentas\ddk2000\ModeloDocAPI-DBO. do DATASUL-EMS 2. com o nome "API. para facilitar a documentação técnica das API´s (Application Program Interface).  o nome do nosso produto é Datasul-EMS (é importante observar as letras maiúsculas e minúsculas para não confundir com o produto internacional). deve ter o mesmo nome da API com extensão (. por exemplo: Nome do programa API: cep/ceapi003. end.  a versão do documento deve estar no formato V.  fonte dentro das tabelas Arial 8.p Nome do documento API: docapi/ceapi003. pois deve estar disponível para clientes e parceiros comerciais.doc (API de Criação de Pedidos de Execução para o RPW).00.dot).dot". O arquivo Word. Algumas recomendações no uso:  este documento deve ser escrito de forma mais clara possível. com a documentação de cada API.01).

indic. + param-global.3. define input param param-2 as int no-undo.taxa = 0.taxa = 0. basta alterar o código principal da API. Como implementar evoluções de API´s Implementar novas funcionalidades nos programas. idêntico ao resultado da antiga. mas. obviamente. que estas não sejam muito significativas e não fiquem fora do padrão. sempre que possível. /* API antiga */ define input param param-1 as char no-undo. Observação O resultado obtido através da nova API deve ser. sem mudanç a de parâme tros APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 253  o documento. fazendo com que as customizações feitas pelos clientes/parceiros continuem funcionando.Evolução de lógica Exemplo de API. find first param-global exclusive-lock no-error.3. define input param param-2 as int no-undo. . if avail param-global then assign param-global. if avail param-global then assign param-global. pode sofrer alterações no layout. find first param-global exclusive-lock no-error. /* API nova */ define input param param-1 as char no-undo. Para este tipo de evolução.

Esta nova API deve possuir uma procedure interna EXECUTE. /* API antiga e alterada .P */ define input-output parameter table for tt-configuracao2. define input-output parameter table for tt-erros. acrescida de um diferenciador.UTAPI012. define var h-api as handle no-undo. passando todos os antigos parâmetros e um valor padrão para cada um dos novos parâmetros. deve ser criada uma nova API com o mesmo nome da API antiga. com mudanç as de parâme tros Para este tipo de evolução.UTAPI012. define input-output parameter table for tt-erros. for each tt-erros: delete tt-erros. EX.P  UTAPI012A.Evolução de lógica Exemplo de API .P. /* API antiga . A API antiga deve chamar a nova API de forma persistente e roda a procedure interna EXECUTE. que receberá os novos parâmetros e uma lógica. end. define input-output parameter table for tt-dados.P */ define input-output parameter table for tt-configuracao2. . define input-output parameter table for tt-dados.: UTAPI012.

p persistent set h-api. chamar a nova API de forma persistente e rodar a procedure interna EXECUTE.Evolução de lógica Exemplo de API.P  UTAPI012A. acrescida de um diferenciador.P. < código customizado> end procedure. que receberá os novos parâmetros e uma lógica. devem garantir que o resultado seja o mesmo da antiga API. A API antiga deve.P */ . /* API nova . /* API antiga . Ex. delete procedure h-api. run execute in h-api (input table tt-configuracao2. Esta nova API deve possuir uma procedure interna EXECUTE. define input-output param table for tt-erros. com alteraçã o de campos na tempAPÍTULO 8 tables tilizando os Estilos e suas Técnicas de parâme tros Construção de Programas 255 run utp/utapi012a. deve ser criada uma nova API com o mesmo nome da API antiga.UTAPI012. copiar todos os campos da antiga temptable para a nova. input table tt-erros). define input-output param table for tt-dados.UTAPI012A. primeiramente.: UTAPI012. Observação Os parâmetros novos que são passados como padrão para a nova API. Para este tipo de evolução. input table tt-dados.P */ procedure execute: define input-output param table for tt-configuracao2.

if avail tt-new-clientes then assign param-global. if avail tt-clientes then assign param-global.UTAPI012.ult-cliente = tt-clientes. run utp/utapi012a. if avail param-global then do: find first tt-new-clientes no-lock no-error. run execute in h-api (input table tt-clientes). define input param table for tt-clientes. delete procedure h-api.cliente. /* API antiga e alterada . find first param-global exclusive-lock no-error. for each tt-clientes no lock: create tt-new-clientes.P */ define temp-table tt-new-clientes field cliente as char field taxa as int. define var h-api as handle no-undo.P */ define temp-table tt-clientes field cliente as char.UTAPI012. /* API antiga .taxa = 1.ult-cliente = tt-new-clientes. if avail param-global then do: find first tt-clientes no-lock no-error.p persistent set h-api.cliente . find first param-global exclusive-lock no-error. buffer-copy tt-clientes to tt-new-clientes assign tt-new-clientes. end. define input param table for tt-clientes. define temp-table tt-new-clientes field cliente as char field taxa as int.define temp-table tt-clientes field cliente as char. procedure execute: define input param table for tt-new-clientes.

delete procedure h-api. procedure execute: define input param table for tt-new-clientes. buffer-copy tt-clientes to tt-new-clientes assign tt-new-clientes. define input param table for tt-clientes.taxa = tt-new-clientes. if avail tt-new-clientes then assign param-global. if avail param-global then do: find first tt-new-clientes no-lock no-error.ult-cliente = tt-new-clientes. no retorno da API evoluída.taxa. end procedure. devem ser repassados os registros da nova temp-table para a antiga. no retorno da API evoluída. devem ser repassados os registros da nova temp-table para a antiga.P */ define temp-table tt-new-clientes field cliente as char field taxa as int. end. for each tt-clientes no-lock: create tt-new-clientes.taxa. run utp/utapi012a.taxa = tt-new-clientes.taxa= = 1. . Observação Caso a temp-table seja input-output. find first param-global exclusive-lock no-error. define var h-api as handle no-undo.UTAPI012A. Observação Caso a temp-table antiga seja input-output. end procedure.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 257 param-global.cliente param-global. /* API nova .p persistent set h-api. run execute in h-api (input table tt-clientes).

A procedure interna antiga deve chamar a nova procedure.UTAPI012A. input table tt-error.P */ procedure execute: define input-output param table for tt-configuracao2.UTAPI012A. Esta nova procedure interna deve receber os novos parâmetros e possuir toda a lógica. deve ser criada uma nova procedure interna com o mesmo nome da procedure interna antiga. run execute2 (input table tt-configuracao2.: EXECUTE  EXECUTE2.P */ procedure execute: define input-output param table for tt-configuracao2. /* API antiga . < código customizado> end procedure. /* API antiga alterada . . passando todos os antigos parâmetros e um valor padrão para cada um dos novos parâmetros. input table tt-dados. define input-output param table for tt-erros.Evolução de lógica Exemplo de API. com mudanç a de parâme tros. define input-output param table for tt-erros. acrescida de um diferenciador. define input-output param table for tt-dados. define input-output param table for tt-dados. Ex. que já foi evoluíd a Para este tipo de evolução.

Para este tipo de evolução.3 + param-4. valor padrão end procedure. onde APÍTULO 8 Construção de Programas não é tilizando os Estilos e suas Técnicas 259 possíve l determi nar um input 0). parâme define input-output param table for tt-dados. parâme find first param-global exclusive-lock no-error. a procedure interna ou API antiga deve retornar um erro para que o programa que o chamou emita uma mensagem de erro explicando o motivo que a API não foi executada e qual o motivo da obrigatoriedade de novo parâmetro. deve ser criada uma nova procedure interna ou API com o mesmo nome da procedure interna antiga. novo define input param param-4 as int no-undo. tro ou o define input-output param table for tt-erros. acrescida de um diferenciador. define input param param-2 as int no-undo. Observação Os parâmetros novos que são passados como padrão para a nova procedure interna. /* API antiga .3 else 0.UTAPI012A. tro é if avail param-global then obrigat assign param-global. conforme exemplificando nos itens anteriores. para o procedure execute2: novo define input-output param table for tt-configuracao2. . devem garantir que o resultado seja o mesmo da antiga procedure interna. Como não é possível determinar valores padrão.P */ procedure execute: define input param param-1 as char no-undo.taxa = ório if param-4 0 then 0.Evolução de lógica Exemplo de API com mudanç a de parâme tros. end procedure.

run execute 2 (input input input input param-1. run execute2 (input param-1. define input param param-3 as log no-undo. define var h-execute as handle no-undo. define input param param-3 as log no-undo. 0). int no-undo. end procedure. input param-3. . int no-undo. if avail param-global then assign param-global. if avail param-global then assign param-global.3 + param-4. procedure execute2: define input param param-1 as char no-undo.define input param param-3 as log no-undo.3.UTAPI012A.taxa = 0. else do: find first param-global exclusive-lock no-error. return return-value. define input param param-2 as int no-undo. param-2. param-3. if param-4 = 0 then find first param-global exclusive-lock no-error. 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. define input param param-2 as int no-undo. log no-undo. end procedure. end procedure.P */ procedure execute: define input param param-1 as char no-undo. input param-2. end. end. input 0). /* API nova .taxa = 0.

Evolução de lógica Exemplo de API com mudanç a de versão de integra APÍTULO 8 ção tilizando os Estilos e suas Técnicas Construção de Programas 261 define input param param-4 as int no-undo. conforme exemplificando nos itens anteriores.taxa = 0. int no-undo.3 + param-4 * param-5 end procedure. if avail param-global then assign param-global. return "999". deve ser somente apresentada no programa chamador. acrescida de um diferenciador. já que as API´s não devem possuir eventos de interface. Para este tipo de evolução.P */ . A antiga API deve retornar um erro para o programa chamador. end procedure. Observação Isto somente deve ser feito caso não exista nenhuma maneira de definir um valor padrão para o novo parâmetro ou o parâmetro seja obrigatório. /* API antiga . find first param-global exclusive-lock no-error. deve ser criada uma nova procedure interna ou API com o mesmo nome da procedure interna antiga. log no-undo. Esta mensagem deve apresentar um erro dizendo que esta API está desatualizada e o motivo de sua extinção. A nova API deve conter uma procedure interna que retorne a versão de integração para o programa chamador. procedure execute3: 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. e nunca na própria API. A mensagem de que a API possui uma nova versão com parâmetro obrigatório. int no-undo. int no-undo.UTAPI012.

3 * param-2. if avail param-global then assign param-global.taxa = 0. assign i-version = 4.P */ define input param param-1 as char no-undo.define input param param-1 as char no-undo. . end procedure. int no-undo. if avail param-global then assign param-global. Lembrar que.UTAPI012A. return "999". log no-undo. int no-undo. o programa chamador deve rodar o método Get-Integration-Version da nova API e verificar se a versão está correta. define input param param-3 as log no-undo. find first param-global exclusive-lock no-error. end procedure. define input param param-3 as log no-undo. int no-undo.3 + param-4 * param-5. Antes de rodar a nova API. /* API antiga alterada . find first param-global exclusive-lock no-error. define input param param-2 as int no-undo.UTAPI012. procedure get-integration-version: define output param i-version as int no-undo.taxa = 0.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. qualquer mensagem para o usuário deve ser emitida pelo programa chamador e nunca pela API. /* API nova. define input param param-2 as int no-undo. Observação Esta técnica pode ser utilizada quando as outras técnicas citadas implicarem muito na performance da API.

UTAPI004. é recomendado que seja utilizado o programa utp/utapi012 ao invés deste.p faz a integração entre Progress e Microsoft Word 97. gráficos. é recomendado que seja utilizado o programa utp/utapi013 ao invés deste. permitindo a construção de planilhas e.doc).P Permitir o envio de E-Mail ou FAX através do EMS 2.P A API utp/utapi003.doc).0 usando o MSExchagne (OLE Automation).br") ou o número do FAX (Exemplo: "[FAX:9999999]").com.  o quarto parâmetro é a mensagem. baseados em formulários. Maiores informações podem ser obtidas na documentação da API de Integração entre PROGRESS e Microsoft Excel 97 (docapi/utapi003. permitindo a criação de arquivos. também. Importante Para novos programas que venham a utilizar esta API. para o Microsoft Word.  o primeiro parâmetro deve ser endereço E-Mail do destinatário (Exemplo: "fulano@internet.P A API utp/utapi002. Maiores informações podem ser obtidas na documentação da API de Integração entre PROGRESS e Microsoft Word 97 (docapi/utapi002.  o terceiro parâmetro é o Assunto (Subject). UTAPI003.  o quinto parâmetro é o arquivo anexo (attachment). .p faz a Integração entre PROGRESS e Microsoft Excel 97. Importante Para novos programas que venham a utilizar esta API.  o segundo parâmetro deve ser o E-Mail ou o número do FAX para uma "Cópia Carbono" (Cc).Parâmetros Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 263 UTAPI002.

yes). ATT  O Arquivo Anexo não foi encontrado. verificar o andamento do envio de E-Mail (UT-ACOMP). ". no. "c:\autoexec.  o sétimo parâmetro é a Confirmação de Envio. Devem ser passados oito parâmetros para este programa: .Parâmetros Objetivo Configuração Retorno Exemplo  o sexto parâmetro é o Grau de Importância. 1  Médio.  o nono e último parâmetro é o Acompanhamento.com.P Permitir o envio de E-Mail através do EMS 2.br". ou seja.p (input input input input input input input input input "fulano@internet. receber um EMail quando o destinatário tiver lido a mensagem. "Manual". "". ou seja. 0. ou seja. Para que o programa de envio de E-Mail funcione é preciso que esteja cadastrado corretamente o endereço IP do servidor de E-Mail a sua porta nos Parâmetros Globais do Sistema. NPG  Não existe registro na tabela de Parâmetros Globais do Sistema.bat. NDE  Destinatário inválido.. no. NEX  O Servidor de E-Mail não é MS-Exchange conforme os Parâmetros Globais do Sistema. onde 0  Baixo.0 usando um servidor UNIX ou qualquer outro servidor com suporte ao protocolo SMTP. c:\config. 2  Alto. OK  E-Mail enviado com sucesso.sys". run utp/utapi004. UTAPI005.. NCC  Destinatário da Cópia Carbono inválido.  o oitavo parâmetro é a Confirmação de Leitura. receber um E-Mail quando o E-Mail foi enviado. "Mensagem do manual .

senão. Se o retorno (return-value) desse programa for igual a Ok.  o oitavo parâmetro. . senão algum erro ocorreu no envio ou os parâmetros passados não estão corretos. deve ser o diretório para a criação do SCRIPT de envio de E-Mail.  o sétimo parâmetro é a mensagem. Para que o programa de envio de E-Mail funcione é preciso que esteja cadastrado corretamente o endereço IP do servidor de E-Mail e a sua porta nos Parâmetros Globais do Sistema.89". ""). que também pode ser adquirida na tabela de Parâmetros Globais do Sistema (paramglobal.1.  o segundo parâmetro deve ser a porta do servidor de E-Mail. c-to.  o terceiro parâmetro deve ser o remetente (Exemplo: "fulano"). run utp/utapi004.  o sexto parâmetro é o Assunto (Subject). c-from. pode ser deixado em branco.  o quarto parâmetro deve ser o endereço E-Mail do destinatário (Exemplo: "fulano@internet. c-mesg. c-assunto.com.Configuração Retorno Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 265  o primeiro parâmetro deve ser o endereço IP do servidor de E-Mail que pode ser adquirido da tabela de Parâmetros Globais do Sistema (paramglobal serv-mail). c-cc.br"). caso esteja enviando E-Mail via UNIX.porta-mail).16. 25.  o quinto parâmetro deve ser o E-Mail para uma "Cópia Carbono" (Cc).p (input input input input input input input input "172. o mail foi enviado com sucesso.

UTAPI006. Para isto deve-se passar cada nome separado por ".br".P A API utp/utapi006. O assunto e a mensagem podem ser passadas em branco.com.BAT. O mesmo acontece para a Cópia Carbono. que se encontra no diretório \INTERFAC\MAIL.i. Este programa não possui interface.com.p. onde estão as definições das temp-table´s que devem ser passadas como parâmetros à API utp/utapi003. Para que o programa de envio de E-Mail funcione.Interface Instalação Observação O programa permite enviar um E-Mail para várias pessoas. ." (ponto e vírgula). beltrano@internet." (vírgula) ou por ". deve ser executado o arquivo INSTALA. No programa responsável por buscar os dados deve ser feita a inclusão do include: utp/utapi006. Apenas envia o E-Mail.br.p permite a busca de dados de uma planilha Excel para o Progress. Exemplo: ("") O remetente nunca pode conter espaços em branco. Exemplo: fulano@internet.

P Nome Físico: utp/utapi008. Maiores informações podem ser obtidas na documentação da API para Uso de Funções do Excel no Progress (docapi/utapi007. UTAPI008. onde estão as definições das temp-table´s que devem ser passadas como parâmetros à API utp/utapi007. Importante Para novos programas que venham a utilizar esta API. para retornar os resultados para um programa Progress. Maiores informações podem ser obtidas na documentação da API para Busca de Dados do Excel para o Progress (docapi/utapi006.P A API utp/utapi007. output table tt-erros).i Versão de Integração: 001 Atualização de arquivos para o Microsoft Excel 97 e retorno de informações para o Progress.p Nome do Include com os Parâmetros: utp/utapi008.p.doc). .Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 267 A chamada da API deve seguir o padrão abaixo: run utp/utapi006.p (input-output table tt-dados.i. No programa responsável por usar esta API deve ser feita a inclusão do include: utp/utapi007. Maiores informações podem ser obtidas na documentação da API de Integração entre Progress e Microsoft Excel 97 (docapi/utapi008. A chamada da API deve seguir o padrão abaixo: run utp/utapi007. output table tt-erros).doc). UTAPI007.doc).p (input-output table tt-dados.p permite o uso de funções do Excel. é recomendado que seja utilizado o programa utp/utapi018 ao invés deste.

i Versão de Integração: 001 Permitir que impressoras cadastradas no EMS sejam utilizadas em programas compilados contra os bancos do MAGNUS.p Nome do Include com os Parâmetros: utp/utapi009. Sendo que os parâmetros recebidos são utilizados para preencher os campos de formulário existentes no documento. Importante Para novos programas que venham a utilizar esta API.i Versão de Integração: 001 Envio de mensagens através do servidor de correio eletrônico e envio de FAX através de servidor de FAX.p Nome do Include com os Parâmetros: utp/utapi010. UTAPI010. Maiores informações podem ser obtidas na documentação da API para Compartilhar Impressoras do EMS com Programas Magnus (docapi/utapi010. . é recomendado que seja utilizado o programa utp/utapi019 ao invés deste.p Nome do Include com os Parâmetros: utp/utapi012.doc).i Versão de Integração: 001 Criação de arquivos.P Nome Físico: utp/utapi009.doc).Objetivo UTAPI009. UTAPI012.P Nome Físico: utp/utapi012. baseados em formulários.P Nome Físico: utp/utapi010. para o Microsoft Word. Maiores informações podem ser obtidas na documentação da API de Envio de FAX/E-mail (docapi/utapi009.

doc). UTAPI019.i Versão de Integração: 001 Atualização de arquivos para o Microsoft Excel e retorno de informações para o Progress. gráficos.Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 269 Maiores informações podem ser obtidas na documentação da API de Integração entre Progress e Microsoft Word (docapi/utapi012. UTAPI018.doc). Maiores informações podem ser obtidas na documentação da API de Integração entre Progress e Microsoft Excel (docapi/utapi013. também.P Nome Físico: utp/utapi018. permitindo a construção de planilhas e. UTAPI013.p Nome do Include com os Parâmetros: utp/utapi013.p Nome do Include com os Parâmetros: utp/utapi018.P Nome Físico: utp/utapi013. Maiores informações podem ser obtidas na documentação da API de Integração entre Progress e Microsoft Excel (docapi/utapi018.i Versão de Integração: 001 .p Nome do Include com os Parâmetros: utp/utapi019.doc).P Nome Físico: utp/utapi019.i Versão de Integração: 001 Faz a Integração entre Progress e Microsoft Excel..

i Versão de Integração: 001 Criação de documentos. UTAPI027.P Nome Físico: utp/utapi028. Maiores informações podem ser obtidas na documentação da API de Envio de compromisso via Outlook (docapi/utapi028.p Nome do Include com os Parâmetros: utp/utapi028. baseados em formulários para o Microsoft Word.doc). Maiores informações podem ser obtidas na documentação da API de Envio de FAX/E-mail (docapi/utapi019.p Nome do Include com os Parâmetros: utp/utapi029.i Versão de Integração: 001 . Maiores informações podem ser obtidas na documentação da API de Integração entre Progress e Microsoft Word (docapi/utapi027.doc).i Versão de Integração: 001 Envio de compromisso do tipo reunião via Microsoft Outlook.p Nome do Include com os Parâmetros: utp/utapi027.P Nome Físico: utp/utapi027.doc).Objetivo Envio de mensagens através do servidor de correio eletrônico e envio de FAX através de servidor de FAX. UTAPI028.P Nome Físico: utp/utapi029. sendo que a decisão de gravar ou não o documento caberá ao usuário final. UTAPI029.

P Nome Físico: app/apapi009. Parâmetros de Entrada Temp-table tt-referencia: nesta temp-table deverão ser repassadas as informações de atualização dos pagamentos extra fornecedor. APAPI009.Considerações Objetivo Gerais APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 271 A API de Integração com excel tem como função gerar código javascript para gerar planilhas e gráficos no excel em programas estilo pai x filho.  devem ser passadas 1 (uma) temp-table de entrada e 1 (uma) de saída contendo as informações para atualização dos PF´s. TEMP-TABLE TT-REFERENCIA Atributo Tipo Formato Valor Inicial Obrigatório i-ep-codigo Integer Sim c-referencia Character Sim Cod-versao-integ Integer Sim c-usuario Character Sim l-vid-rel Logical Sim .i Versão de Integração: 001 Consistir os parâmetros passados e caso estejam Ok atualizar os pagamentos.doc). output table tt-erro-pef).  a API funciona da seguinte forma: Recebe como parâmetro a temp-table.p Nome do Include com os Parâmetros: app/apapi009. Exemplo: run utp/utapi008.  todas as temp-tables são passadas como parâmetro através dos comandos INPUT TABLE ou OUTPUT TABLE. faz as críticas e caso não tenha ocorrido nenhum problema atualiza os pagamentos.p (input table tt-referencia. Maiores informações podem ser obtidas na documentação da API de Integração com Excel Web (docapi/utapi029.

descrição e informações dos registros com inconsistências.l-vid-rel=yes com o código do erro.l-acompanha Logical Sim Atributo Descrição i-ep-codigo Empresa do pagamento c-referencia Referência a ser atualizada cod-versao-integ Versão de integração c-usuario Usuário corrente l-vid-rel Mostra mensagens na tela ou gera temp-table de erros l-acompanha Mostra acompanhamento na tela? Parâmetros de Saída Temp-table tt-erro-pef: serão gerados registros nesta temp-table quando ttreferencial.p irá primeiramente validar a versão de integração: Validação: Versão de Integração O programa irá verificar se o programa chamador está íntegro com a API. e isto ocorre através da verificação da versão de integração passada como parâmetro através da temp-table tt-referencia (campo cod-versao-integ). 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)" Não Atributo Descrição i-cod-erro Código da mensagem de erro c-desc-erro Descrição da mensagem de erro c-arquivo-erro Informações com inconsistências Obrigatório Execução O programa app/apapi009. a API abortará a execução retornando através da temp-table tt-erro-pef o código de erro 3941. Número do Erro Mensagem Ajuda 3941 Versão de integração incorreta ! Aversão de integração informada através dos parâmetros internos é . Caso a versão esteja incompatível.

Além da versão de integração são efetuadas. Cabe ao programa de origem. 8759 Parâmetro do Contas a Pagar não Parâmetro do Contas a Pagar não cadastrado cadastrado para esta empresa 6280 Referência inexistente ! Não foram encontrado movimentos PEF/PEC pendentes cadastrados com a referência informada. verificar os registros que estão com erro. Caso ocorra um dos erros acima.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 273 incompatível com a versão atual da API. Favor contatar suporte técnico. . a seleção não será feita. também as seguintes consistências. Número do Erro Mensagem Ajuda 774 Empresa &1 não cadastrada Empresa &1 não cadastrada.

Objetivo

CAPÍTULO 14

Portabilidade de RCODES
O objetivo da análise de portabilidade de RCODES é validar o funcionamento
dos programas compilados em ambiente Windows e executados em ambientes
Unix. Isto se faz necessário porque programas que respeitam as regras para
portabilidade de RCODE, podem ser executados via RPW/RPC e geralmente
em ambiente Unix. Caso contrário, isto não é possível.
Ao executar programas no Unix, compilados em ambiente Windows e que não
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 possível a portabilidade de RCODES, três regras básicas devem
ser obedecidas, caso contrário, existe a necessidade de recompilação do
programa. As três regras são:

códigos que não possuem comandos de User-Interface (especificamente,
códigos que não criam frames, tanto explícitas como implícitas), não

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
275

pertencem a nenhuma arquitetura para mostrar informações. Como
exemplo, estão 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 não compatibilidade de RCODE e sua
correção, é o uso de frames ou comandos que criam frames. Para que o erro
4438 ocorra, é necessário 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, é necessário utilizar a
função STREAM-IO para reformatar a saída para texto puro, sem formatação
de fonte:
output to value(c-arquivo)
find emitente where emitente.cod-emitente = 10 no-lock.
display emitente.cod-emitente with stream-io.

Outra solução para este problema, é usar o comando PUT, pois o mesmo não
usa FRAME.
output to value(c-arquivo)
find emitente where emitente.cod-emitente = 10 no-lock.
put emitente.cod-emitente.

Caso em Especial
A partir da regra de não utilizar comandos que criam FRAMES explícitas ou
implícitas, alguns problemas foram detectados com a descoberta de comandos
que criam, por algum motivo, FRAMES implícitas.

Até o momento foi constatado o problema nos comandos CREATE SERVER e
EXPORT. Para solucionar o problema, é necessário identificar se existe outra
maneira para realizar a tarefa desejada, caso contrário, será necessário manter
RCODES para cada ambiente existente.
Para os casos identificados, o comando EXPORT pode ser substituído por PUT
ou DIPLAY (utilizando a opção STREAM-IO). Para o comando CREATE
SERVER, será necessário manter um RCODE por ambiente existente, isto é,
um RCODE para ambiente Windows e outro para ambiente Unix.

Implementação
Objetivo

277

CAPÍTULO 15

Técnicas

Como alterar o caracter de senha
Esta técnica pode ser usada sempre quando for usado um fill-in do tipo blank,
ou seja, sempre que for colocada alguma informação que não possa ser
visualizada.

inserir a chamada da include i-win.i, no início do bloco de definições;
{include/i-win.i}

rodar o procedimento SendMessageA, passando os seguintes parâmetros:

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 diretório corrente
Esta técnica pode ser usada quando for necessário mudar o diretório corrente
em tempo de execução. Isto permite que o diretório corrente seja fixo.

Objetivo
Implementação

278

inserir a chamada da include i-win.i, no início do bloco de definições;
{include/i-win.i}

definir uma variável 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
variável 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 parâmetro:

a novo caminho do diretório corrente;
run SetCurrentDir in h-prog(input "C:\WINDOWS\TEMP").

eliminar o programa ut-utils.p que foi rodado persistente da memória.
delete procedure h-prog.

Observação Não esquece de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.

Como alterar ou criar uma variável de ambiente
Esta técnica permite inserir ou alterar uma variável de ambiente em tempo de
execução. Sempre utilizar esta técnica ao invés de usar o comando OSCOMAND SET (...), pois este fará com que a variável de ambiente fique
setada apenas na sessão DOS que foi aberta. Esta técnica seta uma variável de
ambiente do WINDOWS e não DOS.

inserir a chamada da include i-win.i, no início do bloco de definições;
{include/i-win.i}

definir uma variável 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
variável que foi criada anteriormente;
run utp/ut-utils.p persistent set h-prog.

Implementação
Objetivo

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
279

rodar o procedimento SetEnv que está dentro do programa ut-utils.p,
passando os seguintes parâmetros:

a variável de ambiente que deve ser criada:

o valor para esta variável de ambiente;
run SetEnv in h-prog(input "TEMP", input
"C:\WINDOWS\TEMP").

eliminar o programa ut-utils.p que foi rodado persistente da memória.
delete procedure h-prog.

Observação Não 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
Essa técnica deve ser utilizada quando for necessário dar foco a qualquer
objeto, mesmo sendo uma janela.

inserir a chamada da include i-win.i, no início do bloco de definições;
{include/i-win.i}

definir uma variável 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
variável 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 parâmetro:

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 memória.
delete procedure h-prog.

Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.

Implementação
Objetivo

Como deixar uma janela sempre visível
Esta técnica pode ser usada sempre que uma janela, mesmo perdendo o foco,
permaneça visível.

inserir a chamada da include i-win.i, no início do bloco de definições;
{include/i-win.i}

definir uma variável 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
variável 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 parâmetros:

o atributo hWnd da window que deve ficar sempre visível;

o valor yes se a janela deve ficar sempre visível;
run SetTopMost in h-prog(input {&window-name}:hWnd,
input yes).

eliminar o programa ut-utils.p que foi rodado persistente da memória.
delete procedure h-prog.

Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.

Como utilizar OCX
Permitir a construção de programas que utilizam OCX.

TreeView
Instalação

APÍTULO 8
tilizando os Estilos e suas Técnicas

Construção de Programas
281

Faz-se necessário que o OCX esteja registrado na máquina onde será
desenvolvido o programa. O programa para registrar e instalar cada OCX
encontra-se na pasta interfac dos produtos Datasul.
O diretório onde se encontra o pacote para instalação desse ActiveX é em
\interfac\Estruct\ e o arquivo que possui esse componente é
MSCOMCTL.ocx. O nome do componente a ser utilizado é Microsoft
Treeview Control, Version 6.0.
Este ActiveX Controle possui os seguintes métodos:
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
nível, este deve ser em branco.
<Grau>- Caso o item a ser incluso seja um filho, deve ser passado 4 senão
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
após é 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

"Folha de Pgto "). 4. o valor armazenado seria 5 (cinco) caso o filho fosse o nodo selecionado. .OCX). /* Após seleção do novo nodo criado acima */ MESSAGE ChTreeView:TreeView:SelectedItem:Text VIEW-AS ALERT-BOX INFO BUTTONS OK. Nesse caso o indice do nodo selecionado ficará armazenado na variável iescolha. 5. não precisam ser alterados. SelectedItem:Text  Retorna o texto do nodo selecionado na árvore. o valor exibido seria “Nível1”. Todos os programas que hoje estão construídos e utilizando o TreeView da Datasul. SelectedItem:Index  Retorna o indice do nodo selecionado na árvore. Observação Deve-se utilizar sempre o TreeView da Microsoft (COMCTL32. 4. "rh-1-2". Exemplo: ASSIGN i-escolha = chCtrlFrame:TreeView:SelectedItem:Index. Exemplo: ChTreeView:TreeView:Nodes:Add("rh-1". A mensagem desse exemplo exibira o texto “Folha de Pgto” quando o nodo criado acima for selecionado.nodo de label “Pai” do exemplo do método Nodes:Add. Contando que foram criados 4 (quatro) nodos Pai e um nodo filho.

0. e se estivermos utilizando um OCX ListView o nome do OCX deverá ser ListView. Se estivermos utilizando um OCX TreeView o nome do OCX deverá ser TreeView.ocx. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Grafico \ e o arquivo que possui esse componente é COMCTL32. . O nome do componente a ser utilizado é Microsoft ImageList Control. version 5.ImageList APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 283 Deverá ser colocado na propriedade tag do OCX (TreeView ou ListView) o nome do ImageList utilizado..

Na ausência do mesmo o programa executará sem imagens.PSTimer No objeto ImageList deverá ser colocado o nome do arquivo da imagem na propriedade tag de cada imagem dentro do mesmo. Este controle permite que sejam programadas execuções de uma rotina dentro de determinados intervalos de tempo. Esse evento é disparado sempre que se passar o intervalo de tempo determinado na propriedade “Interval”. Para interagir com esse objeto você deve utilizar o evento “Tick” do mesmo. Observação A utilização do ImageList é necessária para que o programa possa ser executado pelo WebEnabler. . As imagens adicionadas no ImageList deverão ser expedidas dentro da pasta imagens do produto.

chCtrlFrame:Controls:Item(1):Largura = 500. chCtrlFrame:Controls:Item(1):Interval = 50.Imagem. o valor dessa propriedade pode ser utilizado para leitura e para escrita. O nome do componente a ser utilizado é Progress Timer Control.ocx. Propriedades  Enabled  É uma propriedade do tipo Lógico (true/false). Evento  Tick  É o evento que é disparado após cada intervalo de tempo determinado. esta propriedade é tanto de leitura quanto de escrita.Largura da área onde a imagem poderá ser exibida.Imagem APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 285 Esse componente já acompanha o Progress e por isso não precisa ser instalado. Sintaxe: <com-handle>:Controls:Item(1):imagem. Propriedades:  Imagem . Sintaxe: <com-handle>:Controls:Item(1):Largura. o arquivo que possui esse componente é PSTIMER. chCtrlFrame:Controls:Item(1):imagem = "c:/tmp/amostra.Informa-se o caminho da imagem desejada. A imagem é um componente OCX que permite a visualização de imagens em um programa progress.  Largura .ocx. Sintaxe: <com-handle>:Controls:Item(1):Interval.jpg".  Interval  É uma propriedade do tipo Integer e nela especifica-se qual o intervalo de tempo(em milisegundos) que se quer esperar entre uma ocorrência do evento Ticker e outra. sempre que for setado para true o evento Ticker será disparado após o intervalo de tempo determinado. . O diretório onde se encontra o pacote para instalação desse componente é em \interfac\imagem\ e o arquivo que possui esse componente é DATIMAGE. O nome do componente a ser utilizado é DatasulImage. Sintaxe: <com-handle>:Controls:Item(1):ENABLED. Caso o valor setado seja 0 não será disparado o evento. chCtrlFrame:Controls:Item(1):ENABLED = TRUE.

chCtrlFrame:Controls:Item(1):LarguraFigura = 500. este valor pode ser lido e alterado. Exemplo: ASSIGN chCtrlFrame:Controls:Item(1):arquivo = "c:/tmp/count. e a propriedade comando que recebe ou informa o comando que está sendo executado. Sintaxe: <com-handle>:Controls:Item(1):AlturaFigura. propriedade de escrita e de leitura. chCtrlFrame:Controls:Item(1):AlturaFigura = 500. ASSIGN chCtrlFrame:Controls:Item(1):comando = "stop".  AlturaFigura . chCtrlFrame:Controls:Item(1):ajusta = yes. propriedade de escrita e de leitura. O nome do componente a ser utilizado é DatasulMultimedia. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\video\ e o arquivo que possui esse componente é DATVIDEO.MediaPlayer  Altura . Possui a propriedade “arquivo” que informa ou recebe o nome do arquivo está sendo executado ou que irá ser executado.Determina-se se a imagem irá se ajustar para ser totalmente exibida dentro da área determinada. Sintaxe: <com-handle>:Controls:Item(1):ajusta.MediaPlayer.Largura da imagem. este valor pode ser acessado tanto para leitura quanto para escrita. Sintaxe: <com-handle>:Controls:Item(1):Altura.ocx.Altura da área onde a imagem poderá ser exibida. . chCtrlFrame:Controls:Item(1):Altura = 500.  Ajusta . Componente que permite a execução de filmes em aplicações progress. Sintaxe: <com-handle>:Controls:Item(1):LarguraFigura.avi" chCtrlFrame:Controls:Item(1):comando = "open" chCtrlFrame:Controls:Item(1):comando = "play".Altura da imagem. PAUSE.  LarguraFigura .

CellView. Onde: <Index> . Sintaxe: <com-handle>:ListView:ListItems:Clear. chCtrlFrame:ListView:ListItems:Add ( 1. sendo que seus métodos básicos são:  ListView:ListItems:Clear Este método elimina todas as entradas da ListView.É uma chave única de cada item. . Observação Deve-se utilizar sempre o ListView da Microsoft (COMCTL32. ). <Icon>. esse índice também é opcional. <SmallIcon>). O nome do componente a ser utilizado é Microsoft ListView Control. 3). version 6. chCtrlFrame: ListView:ListItems:Clear. a Key não pode repetir nos itens da ListView. <Key> . Esse componente possibilita a visualização de células. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Cellsvwr\ e o arquivo que possui esse componente é CELLSVWR.  ListView:ListItems:Add  Adiciona um item à ListView. chCtrlFrame:ListView:ListItems:Add ( . esse índice é opcional.OCX). <Text>.É o texto que irá ser exibido na ListView para representar o item.0.CellView ListView APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 287 O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Estruct\ e o arquivo que possui esse componente é MSCOMCTL. . <Icon> . "indice". <SmallIcon> .ocx. seus principais métodos e propriedades são: .ocx. "Item1". Este componente funciona de maneira muito semelhante ao TreeView.É o índice do ícone na lista de ícones. "indice".É o índice do item dentro da ListView. caso não seja necessário esse controle pode-se omitir essa informação. <Text> . <Key>. O nome do componente a ser utilizado é CellsVwr.É o índice do smallicon na lista de smallicons. Sintaxe: <com-handle>: Add (<Index>. "Item1".

Sintaxe: <com-handle>: AddLink (Integer-Level. No exemplo acima. chctrlframe:CellView:CellsCount.0.Character-PrevText.ocx. que foi criado.Character-PrevToolTipText."Item1".Click. END PROCEDURE.CharacterKey. Componente para visualização de calendário. Sintaxe: <control-frame>.  CellsCount  Propriedade apenas para leitura. Exemplo: chCtrlFrame:Controls:Item(1):value = today.Click : DEFINE INPUT PARAMETER Key AS CHARACTER."Tip2"). Sintaxe: <com-handle>:ClearCells.  Click  Evento disparado quando um item. atribuímos a data corrente do sistema operacional para o componente DTPicker.Character-Text.Aloca_Tarefa DTPicker  ClearCells  Este método limpa todas as células."Item2"."Tip1"."Key1". que informa a quantidade de células existentes. seu atributo mais utilizado é o Value. O nome do componente a ser utilizado é Microsoft Date and Time Picker Control 6."Key2". Sintaxe: <com-handle>:CellsCount.  AddLink  Este método é utilizado para adicionar células. chctrlframe:CellView:AddLink (0.<control>. Esse componente OCX permite a exibição de um gráfico que facilita a representação da agenda de compromissos de uma ou várias pessoas.OCX. Sintaxe: <com-handle>:Value. PROCEDURE CtrlFrame. recebe um clique do usuário. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\calendar\ e o arquivo que possui esse componente é MSCOMCT2. Character-ToolTipText).CharacterPrevKey. O gráfico . todos os parâmetros são obrigatórios. Existe um parâmetro de entrada que é a Key do item selecionado. chctrlframe:CellView:ClearCells.

O diretório onde se encontra o pacote para instalação desse componente é em \interfac\barra\ e o arquivo que possui esse componente é BARRAS_2. Character-tooltip_aloc.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 289 gerado exibe a locação dos horários por tarefa cadastrada. . chctrlframe:Aloca_Tarefa:Tela_limpar.  objetos_mostrar  Método que exibe no componente as tarefas que foram inseridas no mesmo. chctrlframe:Aloca_Tarefa:objetos_mostrar. Sintaxe: <com-handle>: Data_Inicial_Setar (dt-ini AS DATE). O nome do componente a ser utilizado é Barras.Aloca_Tarefa. Sintaxe: <com-handle>:Alocacoes_Tarefa_Navegar(). Sintaxe: <com-handle>: Alocar ( Character-tarefa_id.ocx.  Tela_limpar  Quando este método é invocado. Charactertexto_tar.  Alocacoes_Tarefa_Navegar  Este método faz com que o componente exiba a locação de horários das tarefas que estão na mesma data que a tarefa que estava selecionada no momento em que o método foi chamado. este valor pode se repetir mas quando isso acontecer todas as tarefas com o mesmo id serão exibidas em uma mesma linha. Sintaxe: <com-handle>:Tela_limpar. Characterhora_fim.2004)). Seus principais métodos são:  Data_Inicial_Setar  Este método informa qual a data inicial que será utilizada pelo componente.  Alocar  É utilizando esse método que se adiciona tarefas para o componente. Character-tooltip_tar. chctrlframe:Aloca_Tarefa:Data_Inicial_Setar (DATE(01. Date-dt_aloc. chctrlframe:Aloca_Tarefa:Tarefa_Retorna_Id(). Integer-cor_aloc ). todas as tarefas que estavam sendo exibidas deixam de ser exibidas no componente. Sintaxe: <com-handle>:Tarefa_Retorna_Id().01. Onde: <tarefa_id>: É o identificador da tarefa.  Tarefa_Retorna_Id  Método que retorna um valor caracter que representa o id da tarefa que está selecionada. chctrlframe:Aloca_Tarefa:Alocacoes_Tarefa_Navegar(). Sintaxe: <com-handle>:objetos_mostrar. Character-hora_ini.

<cor_aloc>: Através desse parâmetro é possível alterar a cor de exibição da locação de horário.>>9. Os estilos de linha são: 1 – Sem linha. 3 – Tracejado. <tooltip_aloc>: É o tooltip da representação de locação de horário no componente.Tarefa 01". Sintaxe: <com-handle>: Valor_Maximo_Setar (Valor AS FLOAT. chCtrlFrame:UColunas:Tela_Limpar().12:00 / 3 Pessoas"."01/05/2004". <tooltip_tar>: É o tooltip do texto da tarefa. <dt_aloc>: Data em que a tarefa está sendo alocada.500)."TIP .  Linhas_Trocar_Estilo  Utilizando esse método podemos alterar os estilos das linhas dos gráficos.UColunas <texto_tar>: Texto que é exibido no canto esquerdo do gráfico e indica qual tarefa está sendo representada naquela linha.ocx. sua funcionalidade é de limpar as barras que já estejam sendo exibidas. <hora_fim>: Horário de término da tarefa.  Valor_Maximo_Setar  Esse método permite que seja definido qual o valor máximo das colunas do gráfico. chCtrlFrame:UColunas:Valor_Maximo_Setar (10. chCtrlFrame:UColunas:Linhas_Trocar_Estilo (4). 4 – Linhas.">>>>>. chctrlframe:Aloca_Tarefa:Alocar ("1". Sintaxe: <com-handle>:Tela_Limpar(). basta invocar o método e passar um valor inteiro para definir o estilo da linha. O nome do componente a ser utilizado é PColunas51.Character-c_format ).Ucolunas. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\graf-col\ e o arquivo que possui esse componente é COLUNAS5. . <hora_ini>: Horário de início da tarefa. "08:30 . Componente para geração de gráficos em colunas que possibilita a exibição de diversas colunas e cada coluna com no máximo mais 5 colunas."12:00". "08:30". 2 – Pontilhado."Tarefa 01". Sintaxe: <com-handle>:Linhas_Trocar_Estilo (Valor AS Integer).99"). Seus principais métodos e atributos são:  Tela_Limpar  Como o próprio nome do método sugere.

 Objetos_Mostrar  Método que exibe os grupos de colunas criados na tela. chCtrlFrame:UColunas:Coluna_Selecionada(). val5 AS FLOAT. Suas propriedades mais utilizadas são:  CommPort  Com essa propriedade podemos ver ou alterar qual a porta que o componente irá utilizar para se comunicar com outros dispositivos. Onde: <Id>: É o identificador de cada grupo. <leg_x1 e leg_x2>: São as legendas que podem ser atribuídas para os grupos de colunas do componente. Essa string permite identificar unicamente cada uma das colunas. 7. Character-leg_x1.ocx. Character-leg_x2). . Sintaxe: <com-handle>:CommPort. Sintaxe: <com-handle>: Colunas_Criar (Id AS SHORT. ASSIGN chComm:MSComm:CommPort =500. O nome do componente a ser utilizado é Microsoft Communications Control. "Teste1". 9. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\BCportaserial\ e o arquivo que possui esse componente é MSCOMM32. val1 AS FLOAT. "Texto 2"). 8. chCtrlFrame:UColunas:Objetos_Mostrar(). val2 AS FLOAT. version 6. <val1 – val5>: É o valor correspondente de cada coluna do grupo.MSComm APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 291  Colunas_Criar  Este método permite a criação de grupos de coluna sendo que cada grupo é composto por no máximo 5 colunas. O MSComm é um componente OCX produzido pela Microsoft que possibilita a comunicação da aplicação com outros dispositivos que estejam previamente configurados e aptos para realizar essa comunicação. Sintaxe: <com-handle>:Coluna_Selecionada(). 10. Exemplo: chCtrlFrame:UColunas:Colunas_Criar (1.0. 6. val4 AS FLOAT. val3 AS FLOAT. Sintaxe: <com-handle>:Objetos_Mostrar().  Coluna_Selecionada  Este método retorna uma string com o identificador + posição da coluna no grupo.

Sintaxe: <com-handle>:Handshaking. Sintaxe: <com-handle>:Settings. . 1 – XonXoff. O nome do componente a ser utilizado é Microsoft ProgressBar Control. Sintaxe: <com-handle>:Min.”.  Min  Nessa propriedade do objeto definimos qual o valor mínimo que a barra pode assumir. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Grafico\ e o arquivo que possui esse componente é COMCTL32. Todas as configurações devem ser atribuídas ao componente através de uma string que deve separar cada informação com uma “. trata-se de um componente OCX que exibe a barra de progresso de um determinado procedimento que esteja sendo executado. ASSIGN chctrlframe:ProgressBar:Min = 0. version 5. 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. essas configurações são os números de bits por segundo.4. 3 – XonXoffAndRtsCts. Sintaxe: <com-handle>: PortOpen. Como o próprio nome sugere.1”. ASSIGN chComm:MSComm:Settings = “5. chComm:MSComm:PortOpen = NO.  PortOpen  Com essa propriedade podemos abrir ou fechar a porta de comunicação e também podemos apenas obter qual o estado atual da porta. quantidade de bits e o bit de parada.ocx. 2 – RtsCts.2.ProgressBar  Handshaking  Handshaking é o protocolo que é utilizado pelo hoardware para se comunicar através da porta serial.  Settings  Através dessa propriedade definimos as configurações que serão utilizadas para se comunicar com o outro disposito. a paridade. e para abrir ou fechar a porta basta setar yes ou no para a porta. ASSIGN chComm:MSComm:Handshaking = 0.0. Essa propriedade aceita apenas valores inteiros e os possíveis valores para a propriedade são: 0 – NoHandshaking.

Sintaxe: <com-handle>:Clear(). chCtrlFrame:TabStrip:Tabs:CLEAR(). ASSIGN chctrlframe:ProgressBar:Value = chctrlframe:ProgressBar:VALUE + 1. Seus principais métodos e propriedades são:  CLEAR  O método Clear do componente TabStrip faz com que sejam eliminadas todas as tabs criadas anteriormente no componente.0. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Grafico\ e o arquivo que possui esse componente é COMCTL32.  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.  REMOVE  Método utilizado para remover uma determinada tab do componente. pois isso causa erro. Sintaxe: <com-handle>:Remove (Index BY-VARIANT-POINTER). ASSIGN chctrlframe:ProgressBar:Max = 10. permitindo assim que em uma mesma frame se consiga trabalhar com diversas informações de uma forma muito organizada.TabStrip APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 293  Max  Por meio dessa propriedade definimos qual o maior valor que a barra de progresso poderá assumir. version 5. Sintaxe: <com-handle>:Max. 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. chCtrlFrame:TabStrip:SelectedItem:INDEX.  COUNT  Por meio dessa propriedade conseguimos obter a quantidade exata de tabs criadas. Sintaxe: <com-handle>:Index. É importante que se controle o valor da barra para que não ultrapasse o valor máximo. .ocx. O TabStrip é um componente que permite que sejam criadas diversas tabulações de trabalho.. Sintaxe: <com-handle>:Value. Sintaxe: <com-handle>:Count. O nome do componente a ser utilizado é Microsoft TabStrip Control.

DTelnet chCtrlFrame:TabStrip:Tabs:Remove(chCtrlFrame:TabStrip:SelectedIte m:INDEX). chCtrlFrame:Connect(trim("TelnetServer"). <Caption>: Caption é o texto de exibição da tab que está criada. Caption BY-VARIANT-POINTER. essa informação não é obrigatória. "Teste1" BY-VARIANT-POINTER . .ocx. chCtrlFrame:TabStrip:Tabs:ADD( 1 BY-VARIANT-POINTER . as tabs devem ser adicionadas uma de cada vez. Seus principais métodos e propriedades são:  CONECT  O método Conect é responsável por fazer com que o componente consiga se conectar ao servidor telnet especificado. esse dado não é obrigatório. Esse método retorna um valor do tipo lógico que representa se o componente conseguiu se conectar ou não no servidor. O nome do componente a ser utilizado é Distinct Telnet ActiveX Control. Onde: <Index>: É o índice da tab que está sendo adicionanda. <Tty>: É o tipo de conexão telnet que se deseja estabelecer com o servidor informado. Image BY-VARIANT-POINTER ). DTelnet é um componente ActiveX que possibilita que programas se conectem a servidores remotos por meio de conexões Telnet e que troquem informações com esses servidores. Sintaxe: <com-handle>:Add(Index BY-VARIANT-POINTER. ). O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Telnet\ e o arquivo que possui esse componente é D_TNET32.  ADD  Esse método é utilizado para adicionar as tabs no componente. . Sintaxe: <com-handle>:Connect (Host as Character. Onde: <Host>: Especifica o nome do servidor Telnet ao qual se deseja conectar. <Image>: É o índice da imagem da lista de imagem que será exibida nessa tab. Tty AS Character). Key BY-VARIANT-POINTER. <Key>: Key é o valor da tab.'vt100').

Possui a propriedade “arquivo” que informa ou recebe o nome do arquivo está sendo executado ou que irá ser executado. Esse método retorna uma varíavel do tipo character com as informações enviadas pelo servidor. ASSIGN chCtrlFrame:Controls:Item(1):comando = "sound".Sound.  RECEIVE  Método que recebe as informações que o servidor Telnet está enviando para o programa. Sintaxe: <com-handle>:Receive.ocx. Componente OCX destinado à definição do lay-out de posicionamento das células no organograma. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Tree Chart\ e o arquivo que possui esse componente é TREECHART. Seus principais métodos e propriedades são:  LAYERDISTANCE  Atrinbuto que define o tamanho das linhas verticais do diagrama.ocx. e a propriedade “comando” que recebe ou informa o comando que está sendo executado.wav". chCtrlFrame:Disconnect(). O nome do componente a ser utilizado é DatasulSound. chCtrlFrame:Receive. O nome do componente a ser utilizado é Tree Chart Control.Tree Chart Sound APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 295  DISCONNECT  Esse método solicita ao servidor que seja encerrada a sessão Telnet e finaliza a conexão com o servidor. Exemplo: ASSIGN chCtrlFrame:Controls:Item(1):arquivo = "c:/tmp/som1. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\som\ e o arquivo que possui esse componente é DATSOUND. . Componente que possibilita e execução de arquivos de sons como wav e mid em aplicações progress. Esse método retorna uma variável do tipo lógico que pode ser verdadeiro no caso de ter concluído o encerramento da conexão Telnet ou falso no caso de ter ocorrido algum problema que não possibilite o encerramento da conexão. Sintaxe: <com-handle>:Disconnect ( ).

Set: <com-handle>:Orientation [ = <user-defined>-Var ].Sintaxe: Get: [ Decimal-Var = ] <com-handle>:LayerDistance. Sintaxe: Get: [ <user-defined>-Var = ] <com-handle>:Orientation. Exemplo: no-return-value chTree_layout:Layout(chOrg).  VERTEXDISTANCE  Atrinbuto que define o tamanho das linhas horizontais do diagrama. 1 – Leste. Exemplo: chTree_Layout:VertexDistance = 300.  ORIENTATION  Atributo que define a posição das células pai em relação às células filhas. Exemplo: chTree_Layout:Orientation = 0. Sintaxe: Get: [ Decimal-Var = ] <com-handle>:VertexDistance. Sintaxe: NO-RETURN-VALUE <com-handle>: Layout ( Com-HandleControl ). Set: <com-handle>:LayerDistance [ = Decimal-Var ]. Exemplo: chTree_Layout:LayerDistance = 300. 3 – Oeste. Valores: 0 – Norte. . Set: <com-handle>:VertexDistance [ = Decimal-Var ]. 2 – Sul.  LAYOUT  Aplica o lay-out definido no componente de diagrama definido em Com-Handle-Control. Onde chOrg é o componente que será aplicado o Layout.

O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Print Chart\ e o arquivo que possui esse componente é PRINTCHART. Set: <com-handle>:Preview [ = Logical-Var ]. Onde chOrg é o componente que possui os dados a serem impressos. Set: <com-handle>:hWndFlow [ = Integer-Var ].ocx.  DOCNAME  Esse método armazena o nome do respectivo documento. O nome do componente a ser utilizado é Print Chart Activex Control. Sintaxe: Get: [Integer-Var =] <com-handle>:hWndFlow. Exemplo: chPrn:FitToPage = TRUE. Exemplo: chPrn:DocName = "Nome do arquivo". Sintaxe: Get: [ Logical-Var = ] <com-handle>:FitToPage.  PREVIEW  Método utilizado para apresentar a tela de preview de impressão.Print Chart APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 297 Componente OCX destinado ao tratamento dos parâmetros de impressão para outros componentes OCX. Exemplo: chPrn:hWndFlow = chOrg:hwnd . . Set: <com-handle>:FitToPage [ = Logical-Var ]. Seus principais métodos e propriedades são:  HWNDFLOW  Esse método é utilizado para armazenar o componente que possui os dados a serem impressos.  FITTOPAGE  Método utilizado para acomodar o conteúdo a ser impresso em uma única página. Sintaxe: Get: [Character-Var = ] <com-handle>:DocName. Sintaxe: Get: [ Logical-Var = ] <com-handle>:Preview. Set: <com-handle>:DocName [ = Character-Var ].

255.  PRINTDOC  Método utilizado para imprimir o respectivo documento. Set: <com-handle>:Orientation [ = <user-defined>-Var ].ocx. Exemplo: chPrn:orientation = 2. Set: <com-handle>:PrinterSettings [ = Logical-Var ].  PRINTERSETTINGS  Método utilizado para apresentar a tela de propriedades de impressão. Sintaxe: NO-RETURN-VALUE <com-handle>: PrintDoc. Sintaxe: Get: [ Integer-Var = ] <com-handle>:FillColor.Exemplo: chPrn:Preview = TRUE. O diretório onde se encontra o pacote para instalação desse componente é em \interfac\Org Chart\ e o arquivo que possui esse componente é ORGCHART. Exemplo: chPrn:PrintDoc. Seus principais métodos e propriedades são:  FILLCOLOR  Método utilizado para definir a cor das células do diagrama. . Exemplo: chPrn:PrinterSettings = true. Exemplo: chorg:fillcolor = rgb-value(255. O nome do componente a ser utilizado é Org Chart Activex Control.  ORIENTATION  Método utilizado para informar a orientação da folha ( Retrato ou Paisagem ). Sintaxe: Get: [ <user-defined>-Var = ] <com-handle>:Orientation. Org Chart Componente OCX destinado à criação de organogramas. Sintaxe: Get: [ Logical-Var = ] <com-handle>:PrinterSettings. Set: <com-handle>:FillColor [ = Integer-Var ].255).

0).0. Exemplo: chOrg:FONT:NAME = "Tahoma".  BACKCOLOR  Método utilizado para determinar a cor de fundo do diagrama.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 299  FORECOLOR  Método utilizado para definir a cor dos labels do diagrama. Exemplo: no-return-value chOrg:FONT: SaveFile( name file ). Sintaxe: NO-RETURN-VALUE <com-handle>: SaveImage ( Integer-tymed. Set: <com-handle>:BackColor [ = Integer-Var ]. Sintaxe: Get: [ Integer-Var = ] <com-handle>:ForeColor. Exemplo: chorg:forecolor = rgb-value(0. Set: <com-handle>:ForeColor [ = Integer-Var ].  SAVEFILE  Salva um diagrama em um arquivo Sintaxe: NO-RETURN-VALUE <com-handle>: SaveFile ( Character-file ).255. Sintaxe: Get: [ Integer-Var = ] <com-handle>:BackColor. Exemplo: chorg:backcolor = rgb-value(255. Set: <com-handle>:Font [ = Com-Handle-Var ].255). Sintaxe: Get: [ Com-Handle-Var = ] <com-handle>:Font.  SAVEIMAGE  Salva um diagrama em um formato meta-arquivo. . chOrg:FONT:SIZE = 7.  FONT  Método responsável pelo tratamento de fontes.

Exemplo: chOrg:AutoScroll = true. Sintaxe: NO-RETURN-VALUE <com-handle>: SelectAll ( ). name file). . Sintaxe: Get: [ Logical-Var = ] <com-handle>:AutoScroll.  DELETESEL  Método utilizado para apagar os itens selecionados.Integer-format. Set: <com-handle>:AutoScroll [ = Logical-Var ]. Set: <com-handle>:Shape [ = Integer-Var ]. Exemplo: chOrg:SelectAll.  SELECTALL  Método utilizado para selecionar todo o diagrama. Onde Integer-tymed: afTypeMediumFile = 0 afTypeMediumClipboard = 1 Integer-format: afWMF = 0 afEMF = 1  SHAPE  Método utilizado para definir a figura geométrica das células do organograma. Exemplo: no-return-value chOrg:FONT: SaveFile( 0. Exemplo: chOrg:DeleteSel. Exemplo: chOrg:shape = 2.  AUTOSCROLL  Através desse método pode-se determinar se o diagrama irá apresentar as barras de rolagem quando necessário. Character-file ). Sintaxe: NO-RETURN-VALUE <com-handle>: DeleteSel ( ). 0. Sintaxe: Get: [ Integer-Var = ] <com-handle>:Shape.

O código abaixo mostra um exemplo da ligação das células do organograma: IF chOrg:nodes:count > 0 then do: . Sintaxe: [ Com-Handle-Var = ] <com-handle>: Add ( Decimal-Left AS FLOAT.0. sendo que a variável “sequência” será utilizada para armazenar a seqüência na hierarquia do organograma: chNode[sequência] = chNodos:add(0. A variável chLiga é utilizada para montar os links entre as células. def var chNodos as com-handle no-undo. definir três variáveis do tipo com-handle: def var chNode as com-handle extent 9999 no-undo. Decimal-Width AS FLOAT. Utilizando o método “nodes” do componente OCX OrgChart. Utilizando o método “outlinks” criamos a ligação entre a célula pai e a cáelula filho. Decimal-Height AS FLOAT ).600). chLiga = chNode[seqüência pai]:outlinks:add(chNode[sequência]). associálo à variável chNodos: chNodos = chOrg:nodes. Para criarmos novas células no diagrama deve-se. Decimal-Top AS FLOAT. Onde chOrg é o nome do componente OCX OrgChart.1500.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 301  ADD  Método utilizado para adicionar novas células no diagrama. primeiramente. A variável chNode será utilizada para armazenar as novas células criadas. def var chLiga as com-handle no-undo.

exe". end. end. chLiga:Rigid = true. .  inserir a chamada da include i-win.p persistente e atribuir o seu handle para a variável que foi criada anteriormente. If return-value = "Ok" then message "A operação foi feita com sucesso". Como executar um aplicativo do Windows Esta técnica deve ser usada sempre que for executado um programa externo.  rodar o programa ut-utils. input "").  rodar o procedimento Execute que está dentro do programa ut-utils.Implementação Objetivo repeat i = 1 to chOrg:nodes:count: chNodos = chOrg:nodes(i).  se o retorno for "Ok" a operação foi feita com sucesso.i}  definir uma variável do tipo handle. passando os seguintes parâmetros:  caminho do programa para ser executado.p que foi rodado persistente da memória. def var h-prog as handle no-undo. run Execute in h-prog(input "c:\windows\calc. {include/i-win.i no início do bloco de definições. Essa função substitui a antiga função WINEXEC. chliga:LinkStyle = 4. repeat j = 1 to chNodos:links:count: chliga = chNodos:links(j).  os parâmetros para o programa a ser executado. run utp/ut-utils.p persistent set h-prog.  eliminar o programa ut-utils.p.

 criar um botão e colocá-lo ao lado direito superior do Editor.  inserir o Help:"Corretor ortográfico" no botão para implementar o Tooltip.25  deixar o botão sem label. deve .Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 303 delete procedure h-prog.  na procedure local-display-fields da SmartViewer ou na procedure localinitialize da SmartWindow.  alterar os atributos do tamanho do botão para: Width: 4. pois na falta deste. dependendo onde se encontra o Editor. Como implementar Correção Ortográfica em Editores Esta técnica tem com objetivo fazer com que seja possível executar a correção ortográfica do Word 97 para o texto que foi inserido em um determinado campo ou variável view-as editor.00 Height: 1. o sistema pode ficar sem recursos e travar.  definir a variável 1-control-spell em Definitions. Observação Não esquecer de executar o último procedimento descrito. Exemplo: define variable l-control-spell as logical no-undo init no.

Exemplo: {include/i-spell.ser inserida após o Run Dispatch. Exemplo: {include/i-inispl. indicando que o texto do Editor ainda não passou pela correção ortográfica. a Dialog de correção ortográfica do Word 97 é chamada e todos os seus recursos devem estar disponíveis: . e como segundo parâmetro. Após a implementação da técnica. passando como parâmetro o nome do botão que foi criado. instalado na sua máquina.i <nome-do-editor> <nome-do-botão>} É importante ressaltar que esta técnica só irá funcionar para quem possui o Word 97. o nome do botão que foi criado e que dispara a correção ortográfica.i <nome-do-botão>}  no MAIN-BLOCK.i. passando como primeiro parâmetro o nome do Editor que sofre a correção ortográfica. a imagem do botão check deve estar em vermelho. ela funciona assim:  no início.i. deve ser inserida a chamada da include i-spell. Exemplo:  quando o botão for disparado. a chamada da include i-inispl.

Exemplo: Como obter as coordenadas do mouse Utilizar esta técnica sempre que for necessário verificar se o mouse está dentro de uma determinada região da janela no momento do clique. output i-x.  rodar o programa ut-utils.p persistent set h-prog. def var h-prog as handle no-undo. Pode ser usado em browsers para ordenação automática com base em um clique.  inserir a chamada da include i-win.Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 305  terminada a execução do corretor ortográfico.  rodar o procedimento GetMousePos que está dentro do programa ututils. indicando que o texto do Editor já passou pela correção ortográfica.p. output i-y).  uma variável do tipo inteiro para retornar o valor da coordenada X.i}  definir uma variável do tipo handle. . run GetMousePos in h-prog(input {&window-name}:handle.  uma variável do tipo inteiro para retornar o valor da coordenada Y.  eliminar o programa ut-utils. {include/i-win. a imagem do botão check está em verde.p que foi rodado persistente da memória.p persistente e atribuir o seu handle para a variável que foi criada anteriormente.i no início do bloco de definições. passando os seguintes parâmetros:  handle da window onde deve ser verificada a posição do mouse. run utp/ut-utils.

. Observação Não esquecer de executar o último procedimento descrito. pois na falta deste. delete procedure h-prog.p persistente e atribuir o seu handle para a variável que foi criada anteriormente.p persistent set h-prog.p que foi rodado persistente da memória. o sistema pode ficar sem recursos e travar.p. Como obter o diretório corrente Utilizar sempre que for necessário obter o diretório corrente do aplicativo que está sendo executado. pois na falta deste. fazendo com que este retorne a coordenada do mouse no momento foi dado o clique no objeto.i}  definir uma variável do tipo handle.  inserir a chamada da include i-win.  rodar o procedimento GetCurrentDir que está dentro do programa ututils.  eliminar o programa ut-utils. passando o seguinte parâmetro:  uma variável do tipo caracter onde deve ser retornado o diretório corrente. def var h-prog as handle no-undo.  rodar o programa ut-utils.Implementação Objetivo delete procedure h-prog.i no início do bloco de definições.  este procedimento pode ser usado na trigger de Select-Mouse-Click de um objeto. run GetCurrentDir in h-prog(output c-dir). o sistema pode ficar sem recursos e travar. {include/i-win. Observação Não esquecer de executar o último procedimento descrito. run utp/ut-utils.

 inserir a chamada da include i-win. run utp/ut-utils. Como obter o diretório do Windows Utilizar esta técnica sempre que for necessário retornar o diretório do windows.i no início do bloco de definições. Pode ser usada quando se deseja copiar algum arquivo para o diretório WINDOWS.  rodar o programa ut-utils. {include/i-win. .p que foi rodado persistente da memória.Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 307 Como obter o diretório de sistema do Windows Utilizar esta técnica sempre que for necessário retornar o diretório de sistema do windows.p persistente e atribuir o seu handle para a variável que foi criada anteriormente. {include/i-win.i}  definir uma variável do tipo handle. delete procedure h-prog. def var h-prog as handle no-undo.  eliminar o programa ut-utils. Observação Não esquecer de executar o último procedimento descrito.i no início do bloco de definições. passando o seguinte parâmetro:  uma variável do tipo caracter para retornar o caminho do diretório de sistema do windows. o sistema pode ficar sem recursos e travar. Pode ser usada quando se deseja copiar algum arquivo para o diretório SYSTEM. def var h-prog as handle no-undo.  rodar o procedimento GetSysDir que deve estar dentro do programa ututils. pois na falta deste.p persistent set h-prog.i}  definir uma variável do tipo handle. run GetSysDir in h-prog(output c-path).p.  inserir a chamada da include i-win.

run GetComputerName in h-prog(output c-computador). def var h-prog as handle no-undo.p. run GetWinDir in h-prog(output c-path). run utp/ut-utils.p persistent set h-prog. delete procedure h-prog.p.p que foi rodado persistente da memória.p persistent set h-prog.i no início do bloco de definições. {include/i-win.p persistente e atribuir o seu handle para a variável que foi criada anteriormente.  inserir a chamada da include i-win.p que foi rodado persistente da memória.p persistente e atribuir o seu handle para a variável que foi criada anteriormente.  eliminar o programa ut-utils. . o sistema pode ficar sem recursos e travar.  rodar o programa ut-utils. run utp/ut-utils. passando o seguinte parâmetro:  uma variável do tipo caracter onde deve ser retornado o nome do computador.  eliminar o programa ut-utils. pois na falta deste. passando os seguintes parâmetros:  uma variável do tipo caracter onde deve ser retornado o caminho do diretório do windows.Implementação Objetivo  rodar o programa ut-utils.  rodar o procedimento GetWinDir que deve estar dentro do programa ututils. Como obter o nome do computador Essa técnica deve ser usada quando for necessário obter ou até mesmo informar o nome do computador que deve estar executando a aplicação. delete procedure h-prog. Observação Não esquecer de executar o último procedimento descrito.  rodar o procedimento GetComputerName que deve estar dentro do programa ut-utils.i}  definir uma variável do tipo handle.

 inserir a chamada da include i-win.  rodar o procedimento GetEnv que deve estar dentro do programa ututils. Como transformar uma janela em barra de ferramentas Esta técnica deve ser usada sempre que for necessário implementar uma janela que esteja sempre visível e que contenha funções de ferramentas.p. run utp/ut-utils. output c-path).i no início do bloco de definições. funções que não estejam ligadas a nenhum objeto ou programa específico. pois na falta deste. passando os seguintes parâmetros:  a variável de ambiente que deseja-se saber o valor. {include/i-win.  eliminar o programa ut-utils. delete procedure h-prog.i no início do bloco de definições. def var h-prog as handle no-undo.i} .Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 309 Observação Não esquecer de executar o último procedimento descrito. run GetEnv in h-prog(input "PATH".  uma variável do tipo caracter para retornar o valor da variável de ambiente informada. Observação Não esquecer de executar o último procedimento descrito.i}  definir uma variável do tipo handle. ou seja.p persistente e atribuir o seu handle para a variável que foi criada anteriormente.p persistent set h-prog. pois na falta deste.  inserir a chamada da include i-win. o sistema pode ficar sem recursos e travar. {include/i-win. o sistema pode ficar sem recursos e travar.p que foi rodado persistente da memória. Como obter o valor de uma variável de ambiente Utilizar esta técnica sempre que for necessário ler alguma variável de ambiente.  rodar o programa ut-utils.

delete procedure h-prog. o que é o mais normal.(nome-rs:RADIO-BUTTONS IN FRAME {&FRAME-NAME}))) THEN.p. visto que. definir uma variável do tipo handle. run utp/ut-style.  verificar a possibilidade de deixar a barra de ferramentas sempre visível. iremos adotar uma técnica que utiliza a seguinte sintaxe: IF nome-rs:DISABLE(ENTRY(X.p persistent set h-prog.p que foi rodado persistente da memória. muda para cada língua.  rodar o programa ut-style.  rodar o procedimento AddPaletteStyle que deve estar dentro do programa winstyle.  eliminar o programa ut-style. o sistema pode ficar sem recursos e travar. o label do radio-button. . def var h-prog as handle no-undo. pois na falta deste. run AddPaletteStyle in h-prog(input {&window-name}:hWnd). Se a barra for sempre visível. Como desabilitar Radio-Buttons A sintaxe normal para desabilitar radio-buttons é: DISABLE(LABEL_DO_RADIO_BUTTON).p persistente e atribuir o seu handle para a variável que foi criada anteriormente. Para isso. veja Como deixar uma janela sempre visível. passando os seguintes parâmetros:  atributo hWnd da janela a ser transformada. Observação Não esquecer de executar o último procedimento descrito. Entretanto essa técnica não corresponde as nossas necessidades.

w persistent set h-programa. "string". Exemplo: def var h-programa as handle no-undo.  o programa deve ser executado de forma persistente usando a variável handle que foi definida e a inicialização do programa deve ser feita através da execução da "initialize". 2. Este número é obtido pela seguinte fórmulaX=2 * (entrada desejada)-1. Exemplo: desabilitar o radio-button empréstimo Tipo-modalidade.Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 311 Onde: Nome-rs: Nome do Radio-set X: Número que obtém a entrada desejada do radio-set..transacao:disable(entry(3. . If valid-handle(h-programa) then run dispatch in h-programa ('initialize'). Como executar programas que são janelas Esta técnica demonstra a forma correta para execução de um programa (..  deve ser definida uma variável do tipo handle. exemplo: run xxp/xx999.w) a partir de um outro programa que já é uma janela. tipomodalidade:radio-buttons)) in frame {&frame-name} then.Aplicação 2 . . Observação o Radio-Set Properties mostra que as strings são: "string".Empréstimo X = 2(2) -1 X=3 If tipo-modalidade.. evitando a ocorrência do erro 4123 ("None of the widgets used in WAIT-FOR statement are SENSITIVE WAIT-FOR terminated.transacao 1 . (4123))" durante a sua execução. então para obter a posição desejada é necessário utilizar a fórmula descrita anteriormente. 1.

Isso pode acontecer se. Quando for encerrada a "janela chamada" o erro não deve ocorrer. logo após a execução persistente do programa. se a técnica foi utilizada. Inicialização do programa chamado. 9 . A chamada desta procedure deve ser feita dentro do local-initialize. depois do run-dispatch. 11 Procedimento. entre o painel e a Window (THIS-PROCEDURE). antes ou depois de sua inicialização. Exemplo: run xxp/xx9999. Isso pode ser feito desde que a inicialização do programa não esteja no mesmo bloco da condição e que nenhum dos procedimentos contidos no bloco possam ocasionar a perda da validade do handle. podem-se executar procedimentos do mesmo. basta fechar a "janela chamadora" antes de fechar a "janela chamada". A sintaxe desta procedure é: RUN enable-<função-do-botão> in <handle do painel> (Input <logical>). 10 Validação do handle agrupando mais de uma execução de procedimentos. por isso a execução de programa chamado deve ser de forma persistente. nas masters. na Window. run pi-reposiciona-tabela2 in h-programa (input 456). Deverá sempre ser feita separadamente de outras execuções de procedimentos devido a possibilidade de a inicialização o handle tornar-se inválido. Para executar a procedure e habilitar/desabilitar é necessário ter um link do tipo STATE. Como habilitar ou desabilitar botões em painéis Foram criados procedures internas. se necessário. para habilitar ou desabilitar todos os botões dos painéis de Cadastro e Alteração. sendo que para cada procedimento a ser executado deve-se verificar a validade do handle. 11 End. por exemplo.w persistent set h-programa. 8 If valid-handle(h-programa) then run dispatch in h-programa ('initialize'). O conceito GUI / MS Windows / Progress indica que uma janela deve rodar como um objeto independente. o procedimento feche o programa chamado. que não tem possiblidade de ocasionar a invalidade do handle. If valid-handle(h-programa) then run pi-seta-parametros in h-programa (input "teste"). contido em um bloco com mais procedimentos. Para verificar se a implementação foi realizada de forma correta. 8 Procedure pertencente ao programa chamado executada antes de sua inicialização.9 If valid-handle(h-programa) then do:10 run pi-reposiciona-tabela1 in h-programa (input 123).

conforme necessidade do usuário. da Viewer ou do Browser. validação qualquer .. then run new-state("habilitar":U). else run new-state("nao-habilitar":U).  Na procedure local-row-available ou outro local. na Windows.  na state-changed da Window.. onde o link é source <logical>: Variável em fator lógico. tendo como Source a Viewer ou Browser e como Target a SmartWindow(this-procedure). onde "yes" habilita e "no" desabilita. inserir a lógica abaixo: if p-state = "nao-habilitar":U then do: .. Funções Inclui Elimina Modifica Copia Cancela Desfaz Salva Va-para Zoom Relacionamento Relatório Caso você queira desabilitar os botões do painel.  Criar um Smart-link. você deve proceder da seguinte maneira:  Executar a procedure habilitar/desabilitar no state-changed. inserir a lógica abaixo: if . do tipo state.. conforme alguma validação existente em uma viewer ou em um browser.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 313 Onde: <função-do-botão>: Função específica do botão a ser trabalhado <handle-do-painel>: Handle do painel.

Observação Não utilize a opção "else". em destaque. if p-state = "habilitar":U then do: run enable-<função-do-botão> in <handle do painel> (Input <logical>).*/ DEFINE INPUT PARAMETER p-issuer-hdl AS HANDLE DEFINE INPUT PARAMETER p-state NO-UNDO. . end.  inserir o código.Implementação Objetivo run enable-<função-do-botão> in <handle do painel> (Input <logical>). end. Como habilitar ou desabilitar botões específicos em Browse Inclui/Modifica Esta técnica pode ser usada quando for necessário desabilitar/habilitar outros botões em Browse Inclui/Modifica conforme a existência ou não de registro no Browse. pois nesta procedure passam vários outros state´s. na procedure STATE-CHANGED do Browse Inclui/Modifica. AS CHARACTER NO-UNDO. CASE p-state: when "no-record-available":U then assign bt-name:SENSITIVE in frame {&FRAME-NAME} = no. PROCEDURE state-changed: /* --------------------------------------------------------Purpose: Parameters: <none> Notes: ----------------------------------------------------. when "no-external-record-available":U then assign bt-name:SENSITIVE in frame {&FRAME-NAME} = no.

Colocar um combo-box na tela com formato maior que o tamanho do maior elemento do list-items deste campo indicador. Na procedure "local-initialize" implementar. */ {src/adm/template/bstates. END PROCEDURE. Nas propriedades avançadas deste combo-box. uma lógica que prepare o "list-items" da variável combo-box: .i} END CASE.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 315 when "record-available":U then assign bt-name:SENSITIVE in frame {&FRAME-NAME} = yes. antes do run dispatch. 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.I: include do dicionário de dados para o campo indicador <variável-combo-box>: nome da variável 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. os botões de Modifica/Eliminar são desabilitados automaticamente. Observações Não elimine o código existente na procedure STATE-CHANGED. marcar os 'Custom lists'. run pi-trata-state (p-issuer-hdl. E. p-state). 3. ainda. nos códigos abaixo: XX: sigla do banco de dados XXINC/I99XX999. /* Object instance CASEs can go here to replace standard behavior or add new cases. Retirar a propriedade Enable do combo-box. 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.

implementar a seguinte lógica após o "run dispatch da local-assign-record": assign <tabela>. /* Dispatch standard ADM method. Para gravação do conteúdo do combo-box. . comentar a lógica abaixo: /* if adm-new-record = yes then */ Observação Quando da utilização de campos indicadores com view-as combo-box. /* Code placed here will execute AFTER standard behavior. implementar a seguinte lógica após o "run dispatch da local-assign-statement": assign input frame {&frame-name} <variável-combo-box> <tabela>. */ if avail <tabela> then assign <variavel-combo-box>:screen-value in frame {&framename} = {XXINC/I99XX999. 5. Na procedure local-enable-fields. para atualizá-lo deve ser criada a local-assign-record e após o run dispatch fazer o assign da variável para o campo da tabela. 6.I 06 <variávelcombo-box>}. Na procedure "local-display-fields" implementar. RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U). b) Quando for um Cadastro Complexo.I 03}. 4. após o run dispatch. Caso este campo faça parte da chave. também após o run dispatch. end. o assign deve ser feito na local-create-record. na base de dados: a) Quando for um Cadastro Simples.I 06 <variável-combobox>}. e este campo não fizer parte da chave primária.<campo> = {XXINC/I99XX999. else assign <variavel-combo-box>:screen-value in frame {&framename} = {XXINC/I99XX999.I 04 <tabela>.I 04 1}.<campo>}.assign <variavel-combo-box>:list-items in frame {&frame-name} = {XXINC/I99XX999.<campo> = {XXINC/I99XX999. uma lógica que apresente o valor caracter correspondente ao valor inteiro do campo indicador: /* Dispatch standard ADM method. */ RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U). end.

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. assign <variavel-radio-set>:radio-buttons in frame {&framename} = c-lista. /* Dispatch standard ADM method. uma lógica que prepare o "list-items" da variável radio-set: do i-cont = 1 to num-entries({XXINC/I99XX999. 3. Retirar a propriedade Enable do radio-set. end. antes do run dispatch.I 03}): assign c-lista = c-lista + entry(i. 4. Definir as seguintes variáveis no bloco de Definitions da viewer: define variable c-lista as character no-undo." + string(i-cont) + ". nos códigos abaixo: XX : sigla do banco de dados XXINC/I99XX999.I: include do dicionário de dados para o campo indicador <variável-radio-set>: nome da variável 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. */ RUN dispatch IN THIS-PROCEDURE (INPUT 'initialize':U). define variable i-cont as integer no-undo.{XXINC/I99XX999. marcar os 'Custom lists'.". Nas propriedades avançadas deste radio-set.lenght(c-lista) .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 317 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. .I 03}) + ". assign c-lista = substring(c-lista. Na procedure "local-initialize" implementar.1.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.

Na procedure "local-display-fields" implementar. com view-as radio-set. uma lógica que apresente o valor caracter correspondente ao valor inteiro do campo indicador: /* Dispatch standard ADM method.<campo> = {XXINC/I99XX999. Caso este campo faça parte da chave. implementar a seguinte lógica após o "run dispatch da local-assign-record": assign <tabela>. end. na base de dados: a) Quando for um Cadastro Simples. 6. Na procedure local-enable-fields.I 06 <variável-radioset>}.I 04 <tabela>. /* Code placed here will execute AFTER standard behavior. Na procedure local-display-fields. Para gravação do conteúdo do radio-set. else assign <variavel-radio-set>:screen-value in frame {&framename} = {XXINC/I99XX999. também após o run dispatch. deve ser mostrado num fill-in. comentar a lógica abaixo: /* if adm-new-record = yes then */ Observação Quando da utilização de campos indicadores com view-as radio-set. após o run dispatch. deve ser dado um assign no fillin utilizando a include do dicionário conforme exemplo abaixo: assign <variavel-fill-in>:screen-value in frame <framename> = {XXINC/I99XX999.I 04 1}. para atualizá-lo deve ser criada a local-assign-record e após o run dispatch fazer o assign da variável para o campo da tabela. RUN dispatch IN THIS-PROCEDURE (INPUT 'display-fields':U). 7. o assign deve ser feito na local-create-record. . e este campo não fizer parte da chave primária. end.<campo>}.I 06 <variávelradio-set>}. somente a descrição correspondente ao valor cadastrado. b) Quando for um Cadastro Complexo. implementar a seguinte lógica após o "run dispatch da local-assign-statement": assign input frame {&frame-name} <variável-radio-set> <tabela>.5. Quando for mostrar o campo indicador. */ if avail <tabela> then assign <variavel-radio-set>:screen-value in frame {&framename} = {XXINC/I99XX999.<campo> = {XXINC/I99XX999.I 04 <tabela-campo>}. em consulta.

Título") @ c-tipo 1."Ativo. /* coluna no browse */ def var c-lista-tipo as character no-undo.Receita. /* busca o list-items conforme o include padrão assign c-lista-tipo = {adind/i02ad049. Em Definitions do SmartBrowser definir duas novas variáveis para o campo indicador. /* include que retornará o label do campo {utp/ut-field. radio-set ou combo-box) num SmartBrowser é necessário utilizar um campo calculado ("Calculate Field") e neste implementar uma lógica com o comando entry para apresentar o conteúdo do campo significativo para o usuário.Passivo.tipo. Exemplo: entry(conta.Vendas. conforme a tabela abaixo: Função Objetivo 01 define view-as Combo-Box 02 define view-as Radio-Set 03 lista com os itens separados por vírgula 04 n retorna o item n da lista 05 retorna o número de itens da lista 06 item retorna a posição do item (número) . uma conter o seu 'label' e ser a coluna do campo calculado no browse e outra character para conter o seu 'list-items'.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 319 Como implementar campos indicadores num SmartBrowser Quando se precisar colocar um campo do tipo indicador (view-as. No Main-Block do SmartBrowser deve-se preparar o conteúdo da variável com o 'list-items' e buscar o label do dicionário de dados.i 03} */ Onde: {03}:indica a função a ser realizada.Despesa. /* list-items */ 2.i mgadm conta tipo 1} */ /* acerta o column-label no browse */ assign c-tipo:label in browse br-table = return-value. Exemplo: def var c-tipo as character no-undo. porque estes campos indicadores são inteiros e deve ser apresentado o valor caracter correspondente.

como label do retângulo. Nas propriedades do SmartBrowser colocar um Calculate Field (campo calculado) que retorna a entrada no 'list-items' de acordo com o conteúdo do registro. radio-set ou editor) num SmartViewer é necessário (opcionalmente para o editor) seja emoldurado com um retângulo e colocar um 'text' sobre o mesmo para identificar o campo.i para definir o screen-value deste fill-in.i mgadm conta natureza text-1} 4. c-lista-tipo) @ c-tipo Como implementar labels em retângulos utilizando o dicionário de dados Quando se precisar colocar um campo (view-as. Exemplo: RUN dispatch IN THIS-PROCEDURE (input 'display-fields'). Colocar na tela um fill-in. Exemplo: 1. Exemplo: 2. No Local-Initialize da SmartViewer fazer a chamada do include ut-rtlbl. Na Local-Add-Record da SmartViewer. incluir {utp/ut-rtlbl. 'no-label'.3. nas suas propriedades defini-lo como 'view-as text'. assinalar a propriedade 'display' e retirar a propriedade 'enable'. ao invés de um text. Exemplo: {utp/ut-rtlbl. {utp/ut-rtlbl.tipo.i mgadm conta natureza text-1} 3.i mgadm conta natureza text-1} .i para redefinir o screen-value deste fill-in na inclusão. após a chamada do ADM Method 'display-fields' que aplica um clear no frame desejado. Exemplo: entry(conta. O problema é que este 'text' deveria conter o label do dicionário de dados para o campo. depois do RUN dispatch IN THIS-PROCEDURE (input 'Add_Record:U'). Na Local-Display-Fields da SmartViewer também fazer a chamada do include ut-rtlbl.

(ou help) input 1234. . Para quem está desenvolvendo específicos e precisa utilizar mensagens que não estão cadastradas. input ""). descreve-se abaixo algumas técnicas para sua utilização. pode ser utilizado o passo 3 desta técnica. o radio-set fica assim: Como implementar mensagens para o usuário A partir da utilização do programa utilitário UTP/UT-MSGS. Chamar o programa utp/ut-cdmsg. input ""). 3. Este aplicativo é de uso exclusivo da Datasul. com texto de help.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 321 Após. display return-value @ c-erro with frame f-log. Mensagem de Erro/Advertência/Informação sem Parâmetros 1. quando o SmartViewer estiver rodando.. Para apresentar a mensagem.P para apresentação de mensagens ou retorno de propriedades. Se a mensagem já existir.p e criar a mensagem. Exemplo: Número: 1234 Mensagem: Data de conversão inválida ! Tipo: Erro Help: Data de conversão não pode ser menor que a data de . Observação As mensagens padrões estão descritas no capítulo "Mensagens".. 2. Ou. pode-se utilizar o comando Progress MESSAGE.p (input "show".p (input "msg". input 1234. Exemplo: run utp/ut-msgs. Exemplo: run utp/ut-msgs. para utilizar alguma propriedade da mesma.

p e criar a mensagem. 3. Mensagens com Questionamento ao Usuário 1. Chamar o programa utp/ut-cdmsg. display return-value @ c-erro with frame f-log. pode ser utilizado o passo 3 desta técnica. pode-se utilizar o comando Progress MESSAGE. para utilizar alguma propriedade da mesma. 2.Exemplo Mensagem de Erro/Advertência/Informação com Parâmetros 1. run utp/ut-msgs.cod-repres + "~~" + regiao. Se a mensagem já existir. com texto de help.val-minimo). Este aplicativo é de uso exclusivo da Datasul.codregiao + "~~" + string(regiao. esta técnica pode ser utilizada normalmente. input repres. Para apresentar a mensagem. Ou. pode-se utilizar o comando Progress MESSAGE. Confirma atualização ? Tipo: Questão Help: A verificação dos dados foi completada. Se a mensagem já existir. Para quem está desenvolvendo específicos e precisa utilizar mensagens que não estão cadastradas.codregiao + "~~" + string(regiao.p e criar a mensagem com texto de help. Exemplo: Número: 1235 Mensagem: &1 não pode ser representante na região &2 nesta situação Tipo: Erro Help: O representante &1 não está habilitado para operar na região &2 para valores inferiores a &3. estando os dados preparados para atualização 2. (ou help) input 1235.p (input "msgs". Chamar o programa utp/ut-cdmsg.p (input "show". Exemplo: Número: 1236 Mensagem: Verificação completa.cod-repres + "~~" + regiao. input 1235. input repres. Este aplicativo é de uso exclusivo da Datasul. run utp/ut-msgs. . Para quem está desenvolvendo específicos e precisa utilizar mensagens que não estão cadastradas. Para apresentar a mensagem.val-minimo).

".. input ""). if return-value = "no" then return. pois a include padrão {src/adm/method/smart.i} foi alterada para copiar o help para o tooltip em todos os botões de todas as telas. else if return-value = "yes" then message "Aguarde..Implementação Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 323 run utp/ut-msgs. não sendo necessário qualquer tratamento para tradução.p (input "show". deve-se no UIB editar as propriedades avançadas deste botão e informar a propriedades avançadas deste botão e informar a propriedade help em idioma português.  para informar o help de um botão. para tanto. Contudo. input 1236. pois os estilo fazem a tradução automaticamente dos help´s e label´s de botões. Como implementar Tooltip em um determinado botão O tooltip é um help que é apresentado ao usuário sempre que o ponteiro do mouse permanece por alguns instantes sobre um botão.  para que um botão não padrão apresente seu tooltip é necessário que o mesmo possua help. os botões padrões (aqueles que formam os painéis) já passaram a apresentar tooltips durante a execução dos programas. Exemplo: . em Processamento . todos os botões criados num determinado programa também devem contar com Tooltip e. esta técnica demonstra como deve ser feita essa implementação. Como pode ser verificado.

p persistente e atribuir o seu handle para a variável que foi criada anteriormente.  definir uma variável do tipo handle. run utp/ut-perc.p.  rodar o programa ut/ut-perc.  rodar o procedimento pi-inicializar que deve estar dentro do programa utperc. for each item no-lock: assign i-tot = i-tot + 1. def var h-prog as handle no-undo. Como implementar uma barra de progresso Utilizar esta técnica sempre que for executado um processo longo e que se deseja manter o usuário informado sobre o andamento do mesmo.p persistent set h-prog. passando os seguintes parâmetros:  título da janela da barra de processo.Implementação Objetivo Em tempo: não informar a propriedade tooltip. .  número total de iterações que a barra deve acompanhar.

deve-se rodar os procedimentos pi-desabilita-cancela e pi-habilita-cancela logo após a piinicializar: run pi-inicializar in h-prog(input "Importando arquivos". que está dentro do programa utperc. run pi-desabilita-cancela in h-prog.  rodar o procedimento pi-acompanhar. end. uma string que irá identificar o registro processado: for each item no-lock on stop undo. logo após a saída da iteração: run pi-finalizar in h-prog. leave: run pi-acompanhar in h-prog. end.p. passando como parâmetro.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 325 end.  para desabilitar ou habilitar o botão cancela.  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 informações:  NOK  Caso o procedimento tenha sido cancelado.  OK  Caso o procedimento tenha sido executado até o fim. i-tot).p para cada iteração: for each item no-lock on stop undo. deve-se rodar o procedimento pi-registro logo após a pi-acompanhar. run pi-registro in h-prog (input string(item. leave: run pi-acompanhar in h-prog. .  rodar o procedimento pi-finalizar. run pi-inicializar in h-prog(input "Importando arquivos".  para que seja visualizado o registro que está sendo processado no momento (na barra de título). 500). que está dentro do programa ut-perc.it-codigo)). run pi-retorna-status in h-prog (output c-status).

 rodar o procedimento pi-finalizar.  definir uma variável do tipo handle.  rodar o procedimento pi-acompanhar. run utp/ut-acomp.  para setar o título da janela de barra de processo é necessário rodar o procedimento pi-seta-titulo passando o seguinte parâmetro:  título da janela da barra de processo. end.  rodar o programa ut/ut-acomp. logo após a saída da iteração: .Implementação Objetivo Como implementar acompanhamento (UT-ACOMP) Utilizar esta técnica sempre quando executar um processo longo e que se deseje manter o usuário informado sobre o andamento do mesmo. que está dentro do programa utacomp.p persistent set h-prog. Esta técnica deve ser utilizada sempre que não for conhecido o número total de registros a serem processados.it-codigo)). run pi-seta-titulo in h-prog(input "Exportando Arquivos").p. passando os seguintes parâmetros:  título da janela da barra de processo.p para cada iteração.p persistente e atribuir o seu handle para a variável que foi criada anteriormente. run pi-inicializar in h-prog(input "Importando arquivos"). passando o seguinte parâmetro:  o texto a ser visualizado pelo usuário.p.  rodar o procedimento pi-inicializar que deve estar dentro do programa utacomp. que está dentro do programa utacomp. def var h-prog as handle no-undo. leave: run pi-acompanhar in h-prog(input string(item. for each item no-lock on stop undo.

deve-se rodar os procedimentos pi-desabilita-cancela e pi-habilita-cancela logo após a piinicializar: run pi-inicializar in h-prog(input "Importando arquivos". Caso não seja informado nenhum valor para “TimeAComp” ou ela nem mesmo existir no arquivo . 500).  para desabilitar ou habilitar o botão cancela. run pi-desabilita-cancela in h-prog. deve-se rodar os procedimentos pi-desabilita-cancela e pi-habilita-cancela logo após a piinicializar: run pi-inicializar in h-prog(input "Importando arquivos".  para desabilitar ou habilitar o botão cancela. o utilitário continuará tendo o comportamento padrão de exibir cada registro processado. run pi-desabilita-cancela in h-prog. o utilitário somente exibirá qual é o registro corrente a cada 60 segundos.exe TimeAComp=60 Neste exemplo.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 327 run pi-finalizar in h-prog.  para determinar um intervalo de tempo para a exibição do registro corrente do processamento. deve-se apenas rodar o procedimento pi-returna-status antes da pi-finalizar e este retornará uma das seguintes informações:  NOK  Caso o procedimento tenha sido cancelado. 500).  para verificar se o processo foi cancelado. . deve-se incluir no arquivo . run pi-retorna-status in h-prog (output c-status).ini.ini utilizado pelo EMS uma nova chave nomeada “TimeAComp” com o valor do tempo desejado em segundos no bloco de definições Datasul_EMS2.  OK  Caso o procedimento tenha sido executado até o fim. Exemplo: [Datasul_EMS2] Show-Report-Program=notepad.

customer é a tabela que possui uma chave estrangeira no campo state. No gatilho de leave do campo que possui zoom deve ser inserida uma lógica para determinar o valor do campo de referência com base no que o usuário digitou no campo que possui zoom.Exemplo Como implementar Zoom e campos de referência para campos chave estrangeira Para implementar o zoom em campos chave estrangeira. assign c-state-name = if avail state then state. Acessar as propriedades deste campo e retirar a propriedade 'Enable'.state = customer. antes do run dispatch.i &tabela=state &atributo-ref=state-name . Deve ser criada uma variável do tipo caracter view-as fill-in. 2.state no-lock noerror. {include/leave. end. na qual é armazenado o campo de referência da chave estrangeira e deve ser colocada ao lado do campo que tem zoom. Criar a procedure local-display-fields e nela. 3. relacionando-a com a tabela state e o campo state-name é o campo de referência para o usuário. Exemplo: Para o campo de referência state-name temos a variável c-statename. Passos: 1. if available customer then do: find state where state. deve ser inserida uma lógica para carregar o valor inicial da variável para o campo de referência.state-name else "":U. além de apresentar campos de referência no retorno do zoom ou na saída do campo chave estrangeira devem ser feitas as seguintes alterações quando da criação da viewer do programa que chama o zoom: Observação Nos exemplos de código abaixo.

e no browse o campo chama-se it-codigo. que atende as seguintes situações de acesso ao zoom.state"} Onde: <tabela>: tabela que possui a chave estrangeira. não deve ser informado o nome da tabela .i &prog-zoom=diretório/programa &campo=variavel/tabela. de onde o valor será buscado (Exemplo: Na viewer o campo chama-se it-codigopai.campo <campozoom>: é o campo no SmartBrowser do zoom de onde o valor é buscado. deve ser especificado no formato tabela.comum em tabelas com auto-relacionamento).  a partir de um campo chave estrangeira de uma tabela.  a partir de um campo chave estrangeira de uma tabela cujo nome não coincide com o nome do campo no browse de pesquisa. sendo um campo de tabela. <atributo-ref>: recebe o campo de referência da tabela da chave estrangeira.  a partir de uma coluna num browse. Através do include ZOOMVAR.state = input frame {&frame-name} customer.  a partir de uma variável. <variavel-ref>: variável criada para receber o campo de referência.I é padronizada a chamada do zoom para os campos que são chave estrangeira. Todas estas situações com a possibilidade de passagem de parâmetros para o programa de zoom.atributo &campozoom=nome-atributo [&frame=nome-frame] [&browse=nome-browse] [&parametros="run pi-procedure in whpesquisa". <where>: cláusula where para localizar o registro na tabela de referência.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 329 &variavel-ref=c-state-name &where="state.]} Onde: <prog-zoom>: é o nome do programa de zoom <campo>: é o campo/variável na viewer ou frame onde está sendo colocado o zoom. 4. simplesmente . Sintaxe: {include/zoomvar.

it-codigo in frame {&FRAME-NAME} OR MOUSE-SELECT-DBLCLICK OF ord-prod.i &prog-zoom=inzoom/z01in172. Exemplos: a) chamada de zoom para atributos em um frame: ON F5 OF ord-prod.ct-final &campozoom=ct-codigo &campo2=det-rateio.<frame>: parâmetro opcional utilizado quando o frame onde está o campo que possui zoom é diferente de {&frame-name} <browse>: parâmetro opcional utilizado quando o zoom é acionado a partir de uma coluna de um browse updateable. Observação Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo nome na viewer difere no nome do atributo no browse da pesquisa.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. c) chamada do zoom para variáveis em um frame: ON F5 OF ord-prod.sc-final &campozoom2=sc-codigo} END.w &campo=det-rateio. b) chamada do zoom para mais de um atributo de um frame: ON F5 OF det-rateio.w &campo=c-item-pai &campozoom=it-codigo} END.it-codigo &campozoom=it-codigo} END.it-codigo in frame {&FRAME-NAME} DO: {include/zoomvar.". d) chamada de zoom para colunas de um browse updateable: . <parâmetros>: chama uma procedure dentro da Window do programa de zoom. Deve conter um valor do tipo: &parametros="run pi-procedure in wh-pesquisa(input 'inicio'.ct-codigo in frame {&FRAME-NAME} DO: {include/zoomvar. que recebe os parâmetros.ct-codigo in frame {&FRAME-NAME} OR MOUSE-SELECT-DBLCLICK OF det-rateio.i &prog-zoom=adzoom/z01ad049. input 'fim').w &campo=ord-prod.

e) chamada de zoom para telas com mais de uma frame (estilo de relatórios): ON F5 OF c-item-pai in frame f-pg-par OR MOUSE-SELECT-DBLCLICK OF c-item-pai in frame f-pg-par DO: {include/zoomvar. que recebe o nome do browse onde o campo/variável se encontra.w &campo=tt-digita. run pi-seta-inicial in h_b26in172 (input p-tipo-contr).  código do open query de cada browser que compõe o zoom: open query br-table for each item where item. f) chamada de zoom com passagem de parâmetros:  criação na Window do programa de zoom de uma procedure que recebe e trata os parâmetros e os repassa para os browses do zoom: define input parameter p-tipo-contr as char no-undo.it-codigo in browse {&BROWSE-NAME} DO: {include/zoomvar.it-codigo <= c-item-fim and item.w &campo=c-item-pai &campozoom=it-codigo &frame=f-frame} END. Observação A única diferença está na utilização do parâmetro &browse.it-codigo &campozoom=it-codigo &browse=br-digita} END.it-codigo >= c-item-ini and item. que recebe o nome da frame onde o atributo se encontra. run pi-seta-inicial in h_b25in172 (input p-tipo-contr).APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 331 ON F5 OF tt-digita.  criação nos browses do zoom de uma procedure que recebe os parâmetros recebidos da Window de zoom. Observação A única diferença está na utilização do parâmetro &frame.tipo-contr = p-tipo-contr.i &prog-zoom=inzoom/z01in172. assign c-tipo-contr = p-tipo-contr. e transfere o conteúdo para variáveis que influenciarão a abertura da query: define input parameter p-tipo-contr as char no-undo. .i &prog-zoom=inzoom/z01in172.it-codigo in browse {&browse-NAME} OR MOUSE-SELECT-DBLCLICK OF tt-digita.

recebe o parâmetro e o envia para o browse. Como implementar ThinZoom e campos de referência para campos chave estrangeira em SmartObjects Para implementar o ThinZoom em campos chave estrangeira. no início do Main Block. No Main-block. na Window do zoom. Este. através do método load-mouse-pointer.tipo-contr). A procedure pi-seta-inicial.tipo-contr). dentro do browse.i &prog-zoom=inzoom/z01in172. através do chamado da procedure pi-seta-inicial.w &campo=item.state:load-mouse-pointer ("image/lupa. para todos os campos em frames (não é possível para colunas de browsers) que possuem zoom é necessário alterar o ponteiro do mouse. executa o conteúdo de &parâmetros. chama a procedure pi-seta-inicial. 6.cur") in frame {&frame-name}."} END. além de apresentar campos de referência no retorno do zoom ou na saída do campo .cur") in frame {&frame-name}. Observação Quando o zoom é chamado. 5. localizada dentro da Window do programa de zoom (representada pela variável wh-pesquisa).it-codigo &campozoom=c-item-pai &parametros="run pi-seta-inicial in wh-pesquisa (input param-cp. deve-se alterar o ponteiro do mouse para o campo chave estrangeira. Exemplo: c-item-pai:load-mouse-pointer ("image/lupa. Observação Utilizar sempre a sintaxe acima. normalmente isto é realizado no main-block do programa. 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. Por fim. no exemplo. passagem para o include de zoom dos parâmetros através de &parametros. Criar o gatilho de Mouse-Select-DblClick o campo que possui o zoom com o seguinte código: apply 'F5' to self. passando para esta procedure como parâmetro um valor de sistema (param-cp. No exemplo: costumer. recebe o valor e atribui à variável de filtro (c-tipo-contr) utilizada para abrir a query.

Passos: 1.state"} Onde: <tabela>: tabela que possui a chave estrangeira. Deve também ser definida na seção definitions uma variável do tipo Handle chamada hProgramZoom. antes do run dispatch. na qual é armazenado o campo de referência da chave estrangeira e deve ser colocada ao lado do campo que tem zoom. <variavel-ref>: variável criada para receber o campo de referência.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 333 chave estrangeira devem ser feitas as seguintes alterações quando da criação da viewer do programa que chama o zoom: Observação Nos exemplos de código abaixo. assign c-state-name = if avail state then state. Deve ser criada uma variável do tipo caracter view-as fill-in. Criar a procedure local-display-fields e nela. Acessar as propriedades deste campo e retirar a propriedade 'Enable'. 3.i &tabela=state &atributo-ref=state-name &variavel-ref=c-state-name &where="state.state = customer. <atributo-ref>: recebe o campo de referência da tabela da chave estrangeira. if available customer then do: find state where state. end. customer é a tabela que possui uma chave estrangeira no campo state. No gatilho de leave do campo que possui zoom deve ser inserida uma lógica para determinar o valor do campo de referência com base no que o usuário digitou no campo que possui zoom. .state = input frame {&frame-name} customer.state-name else "":U. deve ser inserida uma lógica para carregar o valor inicial da variável para o campo de referência. Exemplo: Para o campo de referência state-name temos a variável c-statename. DEFINE VARIABLE hProgramZoom AS HANDLE NO-UNDO 2. {include/leave.state no-lock noerror. relacionando-a com a tabela state e o campo state-name é o campo de referência para o usuário.

Através do include ZoomFields. Exemplos: .i &ProgramZoom="nome do programa" &FieldZoomN="nome do campo que retorna" &FieldScreenN="nome do campo ou variável" &FrameN="frame" &RunMethod="run procedure in hProgramZoom" &EnableImplant="yes/no"} Onde: <ProgramZoom>: Nome do programa de Pesquisa a ser executado.comum em tabelas com auto-relacionamento). 4.  a partir de um campo chave estrangeira de uma tabela. <FieldScreenN>: Indica o nome do campo (variável) que deve receber o valor retornado pelo programa de pesquisa.  a partir de uma variável. N indica um número que pode variar de 1 até 10. Sintaxe: {method/ZoomFields. A variável hProgramZoom contém o handle do programa de pesquisa. <EnabledImplant>: Os valores YES e NO indicam se o botão Implantar será habilitado ou não. que contém a chamada a um método do programa de pesquisa. e no browse o campo chama-se it-codigo.i é padronizada a chamada do zoom para os campos que são chave estrangeira. N indica um número que pode variar de 1 até 10.  a partir de um campo chave estrangeira de uma tabela cujo nome não coincide com o nome do campo no browse de pesquisa. N indica um número que pode variar de 1 até 10. que atende as seguintes situações de acesso ao zoom. simplesmente . <RunMethod>: Indica a linha de comando.<where>: cláusula where para localizar o registro na tabela de referência. de onde o valor será buscado (Exemplo: Na viewer o campo chama-se it-codigo-pai. <FrameN>: Indica o nome da frame na qual está o campo (variável) que deve receber o valor retornado pelo programa de pesquisa. <FieldZoomN>: Indica o nome do campo que deve ser retornado pelo programa de Pesquisa.

Sales-Rep" &Frame1="fPage2" &RunMethod="RUN setaVariable IN hProgramZoom (INPUT 'Representante').sales-rep in frame fPage2 OR MOUSE-SELECT-DBLCLICK OF ttcustomer.i &ProgramZoom="spp/spzoom. c) chamada do zoom para variáveis em um frame: ON F5 OF ttcustomer.sales-rep in frame fPage2 DO: {method/ZoomFields.sales-rep in frame fPage2 DO: {method/ZoomFields.sales-rep in frame fPage2 DO: {method/ZoomFields.Sales-Rep" &Frame1="fPage2" &FieldZoom2="Rep-Name" &FieldScreen2="fiRepName" &Frame2="fPage2" &RunMethod="RUN setaVariable IN hProgramZoom (INPUT 'Representante').w" &FieldZoom1="Sales-Rep" &FieldScreen1="ttCustomer.i &ProgramZoom="spp/spzoom.sales-rep in frame fPage2 OR MOUSE-SELECT-DBLCLICK OF ttcustomer.i &ProgramZoom="spp/spzoom.w" &FieldZoom1="Sales-Rep" &FieldScreen1="ttCustomer. 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." &EnableImplant="NO"} END.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 335 a) chamada de zoom para atributos em um frame: ON F5 OF ttcustomer." &EnableImplant="NO"} END.w" &FieldZoom1="Sales-Rep" &FieldScreen1="cRepresentante" &Frame1="fPage2" &RunMethod="RUN setaVariable IN hProgramZoom (INPUT 'Representante')." &EnableImplant="NO"} .

i} 2. Como imprimir campos editores nos relatórios Para imprimir campos com view-as editor. Exemplo: form item. através do método load-mouse-pointer. No exemplo: costumer. Observação Utilizar sempre a sintaxe acima.narrativa */ with stream-io width 132 frame f-imp. determinando o formato ocupado no layout do relatório. Observação Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo nome na viewer difere no nome do atributo no browse da pesquisa.state:load-mouse-pointer ("image/lupa. {include/tt-edit. No Main-block. deve-se seguir os passos abaixo: 1. deve-se alterar o ponteiro do mouse para o campo chave estrangeira. Criar o gatilho de Mouse-Select-DblClick no campo que possui o zoom com o seguinte código: apply 'F5' to self. 5.conteudo num novo form vazio. para todos os campos em frames que possuem zoom é necessário alterar o ponteiro do mouse. Não incluir o campo editor na definição do form de impressão. Exemplo: c-item-pai:load-mouse-pointer ("image/lupa. Incluir o campo tt-editor. que define uma temp-table chamada tt-editor.i.END.cur") in frame {&frame-name}.cur") in frame {&frame-name}. ele deve ser impresso num form separado. normalmente isto é realizado no main-block do programa. Na área de definições do programa implementar a chamada para o include tt-edit. Por fim.it-codigo /* item. 6. no início do Main Block. .

Estes totais devem ser apresentados em variáveis view-as fill-in.conteudo with frame f-imp. find first tt-editor no-erro.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 337 form tt-editor. No final do programa de impressão. for each tt-editor: disp tt-editor. 50). 3.conteudo format "x(50)" no-label with stream-io width 132 frame f-imp.narrativa.it-codigo with frame f-imp. deve-se chamar a procedure interna piprint-editor: for each item no-lock: run pi-print-editor (item. seu nome externo é igual a de um subprograma (. {include/pi-edit.w) deste programa. down with frame f-imp. . na área de procedures internas. pois não é possível que se apresentem como a última linha do browse. end.i} 4. down with frame f-imp. que define a procedure interna pi-print-editor. b) No caso de caixa de diálogo. Como totalizar colunas de um browse Para totalizar colunas (valores) de um browse numa consulta ou outro programa é necessário seguir alguns passos: 1. é necessário criar um novo programa para que se apresente. a) Nos programas de consulta.i. Este botão utiliza como imagem "image/imtotal. disp item.bmp". a recomendação é que sejam apresentados numa caixa de diálogo (utilizar CustomDialog) que é acionada por um botão na régua de botões.bmp" e como imagem insensitive "image/ii-total. end. implementar a chamada para o include pi-edit. Na impressão do campo editor.

DO WHILE AVAIL tabela: /* tabela da query */ ASSIGN de-tot-debito = de-tot-debito + tabela. o zoom de chave estrangeira fica restrito a campos desta tabela denominada principal. com o objetivo de não reler a base de dados. na maioria dos casos.Exemplo 2. Diante . ou seja. /* chama o programa da caixa de diálogo */ RUN XXP/XX999X.val-debito de-tot-credito = de-tot-credito + tabela. ela é gerada para devolver campos da tabela principal do browse. a primeira a ser referenciada em sua criação. GET FIRST br-browse. Entretanto. surgiram duas outras situações em que há necessidade do zoom retornar outros campos ou variáveis que compõe o browse de zoom. Desta forma. Como adaptar a procedure pi-retorna-valor no Custom Browser Zoom Wizard Quando desenvolvemos um Custom Browser Zoom Wizard. END. pois. input de-tot-credito). os registros já estão na query.valcredito.W (input de-tot-debito. No gatilho de choose deste botão deve-se implementar uma lógica para totalizar os campos. GET NEXT br-browse. uma procedure interna denominada pi-retorna-valor é gerada automaticamente. no momento em que é salvo o programa. Inicialmente. If br-browse:FETCH-SELECTED-ROW(1) in frame {&frame-name} then. ASSIGN de-tot-debito = 0 de-tot-credito = 0. END. /* vincula a query no browse e torna disponível o registro corrente */ ASSIGN br-browse:REFRESHABLE IN FRAME {&frame-name} = yes. DO: /* desvincula a query do browse */ ASSIGN br-browse:REFRESHABLE IN FRAME {&frame-name}= no. Esta procedure interna é responsável por retornar ao campo chamador do zoom o valor escolhido pelo usuário.

implementamos a possibilidade do programador interferir na geração desta procedure interna. if avail mguni. basta marcar o toggle-box "Manutenção Manual da PIRETORNA-VALOR". para que devolva o campo desejado. when "des_prog_dtsul" then assign p-valor = prog_dtsul. quando o SmartObject é gravado. na tela que é apresentada. /********************************/ /* PI-RETORNA-VALOR **/ /*******************************/ DEFINE input parameter p-campo as character no-undo. end. Situações necessárias  campo de outra tabela: Para campos de uma tabela além da tabela da principal. DEFINE variable p-valor as char initial "" no-undo. /********************************/ /* PI-RETORNA-VALOR **/ /*******************************/ DEFINE input parameter p-campo as character no-undo.  variáveis / campos calculados: Para esta situação.des_prog_dtsul. Para interferir. return p-valor. o desenvolvedor deve alterar a procedure pi-retorna-valor para que esta devolva a variável / campo calculado desejado. No caso.Exemplo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 339 disso. end case. 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 descrição do programa (des_prog_dtsul) então. A partir de então ela só pode ser modificada pelo programador e não vai ser gerada pelo estilo como até então. DEFINE variable p-valor as char initial "" no-undo. foi acrescentado o código: when "des_prog_dtsul" then assign p_valor = prog_dtsul.cod_proced). o desenvolvedor deve alterar a pi-retorna-valor.proced_consult_proced then do: case p-campo: when "cond_proced" then assign p-valor = string(proced_consult_proced.des_prog_dtsul. .

do tipo logical. No caso.i. em vez do nome do campo da tabela que se deseja retornar.63 . Neste caso. No frame f-pg-imp. como o desejado é que o mesmo retorne a descrição que está gravada em uma variável e esta variável consta no browse foi acrescentado o código: when "c-descricao" then assign p-valor = c-descricao.cod_proced). Como implementar Parâmetros de Impressão em Relatórios Caso haja a necessidade de implementar Parâmetros de Impressão em Relatórios devem ser seguidos os passos abaixo: Impressão Página de Parâmetros: 1.00 Row: 8. Na área de Definições do Programa incluir o campo parâmetro. return p-valor. na chamada do zoomvar. 2. coloca-se o nome da variável. na definição da Temp-Table tt-param. o Custom Browser Zoom Wizard criou automaticamente a pi-retornavalor para o campo cod_proced que pertence a tabela principal do browse. end. inserir um objeto rectangle. com as propriedades abaixo: Column: 2. define temp-table tt-param field destino as integer field arquivo as char field usuário 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. when "c-descricao" then assign p-valor = c-descricao. end case.if avail proced_consult_proced then do: case p-campo: when "cond_proced" then assign p-valor = string(proced_consult_proced.

29  Row: 8. Na procedure pi-executar.20  Row: 9.71 3.29 Height: 1. alterar a lógica de assign da Temp-table ttparam para gravar o campo parametro .72  Height: 0. inserir um objeto fill-in. com as propriedades a seguir:  Object: text-parametro  No-Label: selecionado  Column: 1. Na frame f-pg-imp.67  Display: não selecionado  Enable: não selecionado  View-as-Text: selecionado  Initial Value: Parâmetros de Impressão  Private Data: Parâmetros de Impressão 4.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 341 Width: 46.25  Width: 24.00  Height: 0. inserir um objeto toggle-box. Na frame f-pg-imp.83  Initial Value: no 5.00  Width: 32. com as propriedades abaixo:  Object: tb-parametro  Label: Imprimir Página de Parâmetros  No-Label: não selecionado  Column: 3.

na definição da Temp-Table tt-param. Na área de Definições do Programa.classifica .parametro = if input frame f-pg-imp tbparametro = "yes" then yes else no. No programa RP. para imprimir ou não a Página de Parâmetro. do tipo integer.63  Width: 46.usuario = c-seg-usuario tt-param. display c-parametro c-impressao c-destino tt-param.P.29 . 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. if parametro = yes then do: page.desc-classifica = entry((ttparam.hora-exec = time tt-param. down with frame f-parametros.classifica = input frame f-pg-imp rsdestino tt-param. 6.data-exec = today tt-param. inserir um objeto rectangle. rs-classif:radio-buttons in frame f-pg-cla) tt-param. realizar o tratamento do valor do campo parametro. com as propriedades abaixo:  Column: 2. Formato de Impressão (80 colunas ou 132 colunas): 1.1) * 2 + 1.usuario with frame f-parametros.arquivo tt-param. end. Na frame f-pg-imp.Exemplo assign tt-param. incluir o campo formato.destino = input frame f-pg-imp rsdestino tt-param. 2.00  Row: 8.

25  Width: 31.08 (caso exista o objeto tb-parametro)  Width: 32.00  Height: 0.83  Horizontal: selecionado  Initial Value: 2  Help: Formato de Impressão 5.79 (caso exista o objeto tb-parametro) 3.00  Height: 0. Na frame f-pg-imp. alterar a lógica de assign da Temp-table ttparam para gravar o campo formato assign tt-param. 1. "132 colunas". inserir um objeto fill-in.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 343  Height: 1.29  Row: 8. Na procedure pi-executar. Na frame f-pg-imp. com as propriedades abaixo:  Object: text-parametro  No-Label: selecionado  Column: 1. inserir um objeto radio-set.92  Initial Value: Parâmetros de Impressão  Private Data: Parâmetros de Impressão 4.00 ou 10.71 ou 2. com as propriedades abaixo:  Object: rs-formato  Buttons: "80 colunas". 2  Column: 3  Row: 9.destino = input frame f-pg-imp rs-destino .usuario = c-seg-usuario tt-param.

8.Exemplo tt-param. containertarget':U). Para tanto.classifica . a partir de seleções efetuadas (Exemplo: Botão do FILTRO). após a chamada da tela de filtro. mas possui a definição de form´s de cabeçalho e rodapé de 80 colunas. exemplo: if tt-param. . No programa RP. enviar uma mensagem de notify (open query) para a Window.formato = 1 then do: {include/i-rpcb80.formato = if input frame f-pg-imp rs-formato = "1" then 1 else 2.i que é idêntico ao anterior. else do: {include/i-rpcab. definir form´s de 132 colunas e 80 colunas para o relatório. end.classifica = input frame f-pg-cla rs-classif tt-param.W.formato = 1 then do: view frame f-cabec-80. else do: view frame f-cabec. deve-se no choose do botão. verificar qual o valor do campo tt-param. Como implementar Botão de Filtro em Zoom Quando for necessário reabrir as querys do browse. end. além de incluir o include: include/i-rpcab.i} end. 6.1) * 2 + 1.i} end.P. if tt-param. pode ser consultado como exemplo. No momento de realizar o display dos campos.formato e utilizar uma frame ou outro frame.desc-classifica = entry((tt-param. view frame f-rodape. conforme comando abaixo: RUN notify IN this-procedure ('open-query.P.i deve ser incluído o include: include/i-rpcb80.hora-exec = time tt-param. view frame f-rodape-80.data-exec = today tt-param. rs-classif:radio-buttons in frame f-pg-cla) tt-param. O Zoom Z02IN172. No programa RP. 7. deve ser alterado o posicionamento dos campos no form e a propriedade width.

que deve conter o rowid do último registro acessado na sua tabela.. Programa chamado: Variável global deve ser definida em DEFINITIONS da Window. se o usuário acessar um programa qualquer e através da navegação estiver posicionado num registro X de uma tabela t. deve ser incluso o código a seguir após o RUN DISPATCH . em todas as consultas e nos cadastros em que for usado. Assim. ao chamar outro programa que utilize a mesma tabela para navegação. É criado a PROCEDURE LOCAL-INITIALIZE e inserir o código a seguir antes do RUN DISPATCH . este programa inicia posicionado no registro X. ELSE RUN dispatch IN h_<nome-query> (INPUT "get-first":U). . RUN set-attribute-list IN h_<home-query> (INPUT "Reposition-Pending=YES":U).i <nome-tabela>} Na VIEWER. deve-se utilizar o include "i-vrtab. Definição da Variável Global A variável global deve ser definida na área de DEFINITIONS da Window e da Viewer.. IF gr-<nome-tabela> <> ? THEN RUN pi-reposiciona-query IN h_<nome-query> (INPUT gr-<nome-tabela>). Este código é implementado depois do RUN DISPATCH ....APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 345 Como implementar reposicionamento de registro com base nas variáveis globais Toda tabela deve possuir no produto uma variável global do tipo rowid. Para definir esta variável. é criada a procedure LOCAL-ROW-AVAILABLE com o código: if avail <nome-tabela> then assign gr-<nome-tabela> = rowid(<nome-tabela>).i" conforme é mostrado a seguir: {include/i-vrtab... Além disso.

na área de DEFINITIONS. ou seja. sendo que o <nome-tabela>. então passa a ser a tabela do browse. da Window do programa chamado. . faça o seguinte:  criar. com Browse. Observação Em caso de posicionamento de Browser.Ao utilizar uma mesma viewer em dois programas e um deles é consulta do outro. ASSIGN gr-<nome-tabela> = rw-<nome-tabela>. se o programa chamador for do tipo Consulta-Relacionamento. Reposicionamento Automático do Browser de Zoom Observação Somente implementar a técnica nas variáveis INICIAL de faixa. Para prevenir programas posteriores.  editar os SmartBrowsers que compõe o programa de zoom e selecionar a variável inicial de faixa (no exemplo c-inicial).  atualizar a procedure LOCAL-INITIALIZE. Para que seja evitado este problema. isto é: IF rw-<nome-tabela> <> ? THEN RUN pi-reposiciona-query IN h_<nome-query> (INPUT rw-<nome-tabela>).  após o RUN DISPATCH substituir a variável global pela local. uma variável LOCAL como ROWID: def var rw-<nome-tabela> as rowid no-undo. com o código antes do RUN DISPATCH: ASSIGN rw-<nome-tabela> = gr-<nome-tabela>. a variável global é zerada. ELSE RUN dispatch IN h_<nome-query> (INPUT "get-first":U). no Gatilho VALUE-CHANGED do Browse. na Window do programa chamado. cujo tipo de dado for CARACTER ou INTEIRO. RUN set-attribute-list IN h_<nome-query> (INPUT "Reposition-Pending=YES":U). colocar o mesmo código do LOCAL-ROWAVAILABLE. fazer em todos os programas onde são utilizadas.

i.i.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 347  criar um gatilho para o evento ANY-KEY destas variáveis com a chamada do include i-anykey. existe o preprocessador &variavel que deve conter o nome da variável inicial de faixa:  criar um gatilho para o evento BACK-TAB destas variáveis com a chamada do include i-tab. existe o preprocessador &variavel que deve conter o nome da variável inicial de faixa: . existe o preprocessador &variavel que deve conter o nome da variável inicial de faixa:  criar um gatilho para o evento TAB destas variáveis com a chamada do include i-tab.

entre na procedure de validação (normalmente a pi-validade. depois em procedure call. No combo-box Object escolha adm-broker-hdl. salvar e fechar o SmartBrowser. Retorna a seguinte lógica: . conforme a necessidade) e entre no menu Inserir. em Show Procedures escolha Methods e nos methods procure por Get-Field-Screen-Value. mas pode-se fazer em qualquer outra procedure interna. Como validar campos em viewers diferentes Abra a viewer que você deseja fazer a validação. Se você estiver numa versão 9 ou superior clique no botão “V8 call”.

name. Esses modelos que servem de exemplo para construção dos gatilhos são compostos por:  cabeçalho. Vale lembrar que não se deve passar o handle da viewer onde estiver o campo a ser procurado. pois com ela você estará passando o handle da viewer que você estiver trabalhando. utilize sempre a variável de programa this-procedure. a partir da qual deve ser procurado o valor do campo. sendo que este só ocorre nos gatilhos de WRITE e DELETE.  código do gatilho. end. Como construir gatilhos de dicionários de dados São apresentados a seguir. pois senão o programa não encontra o campo.  include para chamada da EPC. INPUT <campo a ser validado>). INPUT “name”). tem que ser como parâmetro <name>. Por exemplo. . O <campo a ser validado> vai utilizar o nome do campo que deve ser buscado o valor. modelos de cada tipo de gatilho de dicionário de dados. Ex: RUN Get-Field-Screen-Value IN adm-broker-hdl (INPUT this-procedure.  definição da variável de versão do gatilho.  definição do gatilho. se quiser validar um campo a partir do customer. if RETURN-VALUE = “” then do: /*insira aqui o tratamento do erro*/ return ‘ADM-ERROR’:U.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 349 RUN Get-Field-Screen-Value IN adm-broker-hdl (INPUT <handle atual>. Em <handle atual> deve ser colocado o nome da variável handle. Neste caso.

: CREATE/<nome-da-tabela> ** Data de Criação.Gatilho de Write Create Delete /************************************************************* ** Copyright DATASUL S. /** Validações de eliminação **/ **/ /** Include para chamada de EPC **/ {include/i-epc102.00" no-undo. /** Definição da variável que indica a versão do gatilho def var c-versao-mg97 as char init "01. ** ** Este fonte é de propriedade exclusiva da DATASUL. ** ** Gatilho de Dicionário.. /** Código do gatilho de Create /** Fim de Include **/ **/ **/ /************************************************************* ** ** Copyright DATASUL S.. (1997) ** Todos os Direitos Reservados.: XX/XX/XXXX ** ***************************************************************/ TRIGGER PROCEDURE FOR CREATE OF <nome-da-tabela>. sua ...A..: XX/XX/XXXX ** *********************************************************/ TRIGGER PROCEDURE FOR DELETE OF <nome-da-tabela>.. ** ** Este fonte é de propriedade exclusiva da DATASUL. ** ** Este fonte é de propriedade exclusiva da DATASUL..00.i <nome-da-tabela>} /** Eliminação em cascata **/ /************************************************************* ** Copyright DATASUL S.. só poderá ser ** feita mediante autorização expressa..: DELETE/<nome-da-tabela> ** Data de Criação.A. (1997) ** Todos os Direitos Reservados.00" no-undo. (1997) ** Todos os Direitos Reservados.00.. ** ** Gatilho de Dicionário. só poderá ser ** feita mediante autorização expressa. /** Definição da variável que indica a versão do gatilho def var c-versao-mg97 as char init "01.. sua ** reprodução parcial ou total por qualquer meio.A. sua ** reprodução parcial ou total por qualquer meio.

Ver subcapítulo Siglas de países. E todas as triggers criadas são armazenadas dentro de um subdiretório do diretório do próprio país numa pasta chamada database. includes.00. ** ** Gatilho de Dicionário. local/arg/database.<campo> then do: Código desejado no gatilho de assign. por exemplo.i <nome-da-tabela> <b-old-nome-da-tabela>} Não é recomendada a utilização do gatilho de Find. Todos os arquivos (programas.: WRITE/<nome-da-tabela> ** Data de Criação. utilizando a seguinte lógica no gatilho de Write: if new <nome-da-tabela> or <nome-da-tabela>.00" no-undo.00.<campo> <> <b-old-nome-databela>.Gatilho de Assign Find APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 351 ** reprodução parcial ou total por qualquer meio. para atender as necessidades de um determinado país.. . Não é recomendada a utilização do gatilho de Assign. só poderá ser ** feita mediante autorização expressa. é adotado um padrão para sua implementação. end.. Todos os objetos que compoem a localização para um determinado país tem na composição do seu nome uma sigla de três letras. conforme segue: 1. Como implementar localizações Objetivando viabilizar a administração de localizações do Datasul-EMS 2. etc) criados para a localização de um país são armazenados num subdiretório. /** Código do gatilho de Write **/ **/ /** Include para chamada da EPC **/ {include/i-epc101..: XX/XX/XXXX ** ***************************************************************/ TRIGGER PROCEDURE FOR WRITE OF <nome-da-tabela> OLD BUFFER <bold-nome-da-tabela>. os objetos para localização para a Argentina ficam armazenados no diretório local/arg. que identifica o país dentro do diretório local. 2. sendo que este pode ser substituído. bancos. Por exemplo.. abaixo do diretório de instalação do Datasul-EMS.. que identifica o país da localização. /** Definição da variável que indica a versão do gatilho def var c-versao-mg97 as char init "01.

db arg9999. Cada base de dados contém a extensão dos arquivos necessários para a localização.é o número Dump-name da tabela.i(include de dicionários) Argentina lcarg.i(include de dicionários) 5.w(browser) (exemplo) usa9999. Para a construção de programas podem ser utilizados os mesmo estilos.w(zoom) xxx9999a.p argz999(zoom) twarg999.i1 argi999.p usaz999. 4.w(viewer Unidos usa9999.o(delete da tabela) arg9999. 6. como no Exemplo: Campos da tabela: tipo-tax cod-tax .il usag999.w(browser) xxx9999. e os três primeiros 999 .w(vá para) (exemplo) Estados lcusa.i(include de dicionários) tgarg999.il usaq999.p xxxz999.w(viewer) tcarg999.db xxx9999.w xxxv999. com a mesma dinâmica utilizada e que pode permitir a integração com outros programas implementados.i xxxb999.p(create da tabela) arg9999. Casa País deve ter uma base de dados própria.i1 xxxg999.i1 argq999. demonstrados no Capítulo 5.é a sigla do país.w(query) xxx9999a.p(find da tabela arg9999a.p(assign de campo) usa9999.w(query) usa9999a. País Base de Dados Objetos Triggers Padrão lcxxx.i argb999.w(vá para) xxxi999. sempre no padrão 'lcxxx'.p(write da tabela) arg9999a.db usai999.w argv999.w usav999.w (viewer) xxx9999. Na nomenclatura destes programas.w(zoom) usa9999a.3. adotar o padrão a seguir: Onde: XXX .i usab999.il xxxq999. conforme a nomenclatura demonstrada na tabela acima.w(query) tfarg999.w(browser) tdarg999.

No módulo de Segurança são administradas as informações do produto Datasul-EMS 2.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 353 descrição 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 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. . e portanto.00. conceder automaticamente a mesma permissão para todos os usuários que fazem parte deste país. através da implementação de níveis de segurança a um determinado país. definindo-se a permissão para cada um.

Implementação Objetivo 8. evitar problemas como programas que foram construídos com determinados parâmetros e depois são executados com outros. e não um adereço da interface.0.ini. . Então. ou o inverso.ini Padronizar os parâmetros de que influem no tamanho dos objetos no UIB. Já o parâmetro Use-3D-Sizen determina se os objetos devem usar uma dimensão 3D ou não. na prática determina se o efeito 3D é para fora ou para dentro das dimensões do objeto. uma parcela dos desenvolvedores está com o parâmetro Use-3D-Size como "yes" e outra parcela como "no". é informar ao usuário que determina área na interface é um campo ou variável do sistema. a sua função é determinar se os fill-in´s irão manter a borda 3D quando desabilitados. A vantagem de manter a borda. assim deve haver situações onde um programa foi desenvolvido com Use-3D-Size=no e não roda onde use-3dsize=yes. normalmente a distância do topo do frame e o primeiro objeto). mas o valor padrão para o mesmo é YES. onde não é realizada a substituição completa do mesmo. Caso alguns programas passem a não rodar (erro: **Cannot fit <objeto> in frame . conforme exposto acima.ini que afetam diretamente a interface dos programas:  Use-3D-Size  Keep3DfillinBorder O parâmetro Keep3DfillinBorder é de menor importância. Contudo. Como não houve um padrão no início do desenvolvimento do Datasul-EMS 2..) é possível que a solução seja recompilar o objeto ou então editar o objeto (aumentando as dimensões do frame. O valor padrão é NO. se o valor for "yes" os objetos ficam um pouco maiores (em pixels). para com isso. deve-se utilizar a técnica de construção de APPC . Para a localização de programas do Datasul-EMS. é indispensável que sejam padronizados esses dois parâmetros nos arquivos progress. Existem dois parâmetros no progress. Padronização dos parâmetros do progress.Application Partner Program Call (ainda não documentada)..

após gravar um novo registro não é habilitada a tela para uma próxima inclusão. Exemplo: Depois de ter criado a função. utilizada para setar o modo de inclusão do papel. é questionado o nome da nova função e o tipo de dado que é retornado por ela. Para que a função retorne o . A sintaxe a ser utilizada para setar esta propriedade é: RUN set-attribute-list IN <handle-panel> (INPUT "AddFunction=<valor>":U). quando esta propriedade está setada como o valor Simple.  ao entrar em section functions do UIB. Para nome da função foi determinado que é utilizado o seguinte padrão: fn-"nome que qualifica a função". conforme exemplo abaixo. Quanto ao retorno da função. Onde: <handle-panel>: variável que contenha o valor do handle do panel <valor>: valor para a propriedade que pode ser: Simple ou Multiple Como utilizar "functions" no UIB Desde o início da utilização da versão 8.w) existe uma propriedade. deve ser colocado o tipo de dado que a função retorna no final de sua execução. O valor default para esta propriedade é Multiple. A section functions veio para facilitar a implementação de rotinas de cálculo que antes eram confusas de serem utilizadas e esta técnica deve demonstrar este recurso. Porém.2 do Progress. quando o valor é Multiple. deve ser declarado os valores a serem transferidos para ela.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 355 Como setar os modos de inclusão (Simple/Multiple) Para os panels de Inclusão (panel/p-cadsim. foi possível notar uma nova section no UIB. Ou seja. chamada AddFunction.w e panel/p-cadsi4. após gravar um novo registro é habilitada a tela para uma próxima inclusão.

vl-lim-aplic.Exemplo valor calculado por ela. Antes era necessário utilizar ON-FIND TABELA no MAIN-BLOCK do programa para calcular o valor de um campo que possuía uma lógica mais complexa (Exemplo: pesquisa em outras tabelas). RETURNS DECIMAL (input de-valor as decimal):  valor transferido /*-----------------------------------------------------------Purpose: Notes: -------------------------------------------------------------*/ assign de-valor = (de valor + 1000). Esta função é muito útil para os campos calculados de browsers.  lógica da função Return de-valor.  valor retornado da função END FUNCTION. temos que a função "fn-valor" está sendo acionada utilizando o valor do campo banco. Conforme a expressão do calculated . Agora basta seguir a seguinte sintaxe: fn-nome da função (valor a ser transferido) na expressão de um calculated field para utilizar uma função e atribuir o valor retornado a uma outra variável do browser. devem ser retiradas as "" do comando RETURN e acrescentado no seu lugar o nome da variável que possui o valor a ser retornado para quem chamou a função. Exemplo: Neste exemplo.

Observação Não esquecer de executar o último procedimento descrito. Ela consiste basicamente em verificar se o OCX está registrado corretamente na máquina para que não seja disparado um erro PROGRESS. run utp/ut-utils.  rodar o procedimento IsRegistered que deve estar dentro do programa ututils.Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 357 field. delete procedure h-prog. if return-value <> "Ok" then do: run utp/ut-msgs.2 A do Progress.p.  eliminar o programa ut-utils. Observação Recomenda-se que não sejam utilizadas temp-tables.  rodar o programa ut-utils. run IsRegistered in h-prog(input " COMCTL. Na versão 8. input 16808. o sistema pode ficar sem recursos e travar.p persistente e atribuir o seu handle para a variável que foi criada anteriormente. Como verificar o registro de um OCX Esta técnica deve ser usada sempre que for utilizado um OCX no programa. return.l "). input "TreeView"). . o valor retornado da função é mostrado na variável de soma-aplic do browser. end. a utilização de tabelas temporárias dentro de funções está causando SYSTEM ERROR (130). pois na falta deste.  definir uma variável do tipo handle.p que foi rodado persistente da memória.p persistent set h-prog.p (input "show". passando o seguinte parâmetro:  nome do OCX a ser verificado. antes que o PROGRESS dispare o erro.  procurar rodar este procedimento no início do Main-Block.  Caso o return-value seja diferente de "Ok" mostrar a mensagem padrão de inexistência de OCX e fechar o programa:  passar como parâmetro para a mensagem o nome do OCX. def var h-prog as handle no-undo.TreeCtrl.

OCX COMCTL32.l Date and Time Picker Control DatTreeView.  criar um browse e definir todos os campos que serão utilizados para ordenação com a propriedade enable marcada.Sound DatasulMultimedia.Imagem DatasulSound.CISMTPCtrl.OCX DATSOUND.OCX Barras.OCX COMDLG32.OCX TREEVIEW.OCX CELLSVWR.0 OCX Nome BARRAS_2.CellsView CIMAIL.OCX DATVIDEO.Midifile Ctl MCI.OCX CIMAIL.MMControl. .TreeView DatasulImage.1 CtWAVE.Aloca_Tarefa Communications Control CellsVwr.OCX MCI32.OCX MSCOMCT2.l Microsoft TreeView Control Microsoft Common Dialog Control Como construir um browse com ordenação por coluna Esta técnica deve ser usada sempre que for preciso construir um browse que terá ordenação por coluna.MediaPlayer Mabry.Implementação Objetivo Nome de OCX homologados no Datasul EMS 2.OCX CTWAVE32.OCX MSCOMM32.OCX MIDIFL32.ctWaveCtrl.OCX DATIMAGE.

.Name:READ-ONLY IN BROWSE {&BROWSE-NAME} = TRUE Customer.City:READ-ONLY IN BROWSE {&BROWSE-NAME} = TRUE.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 359  inicializar o atributo READ-ONLY de todos os campos que serão utilizados para ordenação como YES: ASSIGN Customer.  marcar o atributo column-searching do browse.

ASSIGN columnHandle = {&BROWSE-NAME}:CURRENT-COLUMN. APPLY 'END-SEARCH' TO {&BROWSE-NAME}. WHEN 'City' THEN OPEN QUERY {&BROWSE-NAME} FOR EACH Customer NO-LOCK BY Customer.Name.City. na trigger START-SEARCH do browse inserir o seguinte: DEFINE VARIABLE columnHandle AS HANDLE NO-UNDO. END CASE. . CASE columnHandle:NAME: WHEN 'Name' THEN OPEN QUERY {&BROWSE-NAME} FOR EACH Customer NO-LOCK BY Customer.

a linha geral de codificação é semelhante para todos os tipos. por exemplo. que são: Tipo Descrição Tipo de Banco de Mini-flexibilização visando atender necessidades de Dados implementações específicas a um determinado tipo de banco de dados Versão de Banco de Mini-flexibilização visando atender necessidades de Dados implementações específicas a uma determinada versão ou release do banco de dados Especifica Mini-flexibilização visando atender necessidades de implementações específicas a um determinado módulo ou funções. Para tanto se deve saber qual o tipo de mini-flexibilização desejada. seguindo as regras a seguir:  inserir a chamada ao include de especificação dos pré-processadores de mini-flexibilização. Oracle e MS SQL-Server.  fazer a utilização dos pré-processadores necessários através das diretivas de pré-processadores: &IF. Contendo como valor a sigla do banco de dados utilizado no produto (no ambiente específico de desenvolvimento e expedição do produto corrente). . &ELSEIF. A chamada ao include torna disponível uma série de pré-processadores. a saber: Progress. &ELSE e &ENDIF. conforme seu tipo. chamado include/i_dbtype. podendo ser utilizada para atender as mais diversas situações Independentemente do tipo de mini-flexibilização.Mini-Flexibilização para Tipo de Banco de Dados APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 361 Mini-Flexibilização Em muitas situações faz-se necessária a implementação de mini-flexibilização. para cada um dos bancos de dados dos produtos Datasul. descritas a seguir:  Inserir a chamada ao include de especificação dos pré-processadores de mini-flexibilização para tipos de banco de dados. Para tanto devem ser seguidas algumas regras. Esta técnica oferece possibilidade para o desenvolvimento de implementações específicas para determinados tipos de bancos de dados. para implementar funcionalidades ou características específicas para uma versão do produto ou um tipo específico de banco de dados.i. &THEN.

E os pré-processadores disponíveis para utilização estão listados a seguir: Nome do pré-processador ems_dbtype Produto EMS 5 emsbas_dbtype emsedi_dbtype emsfin_dbtype emsuni_dbtype Produto EMS 2 mgadm_dbtype mgdis_dbtype mgind_dbtype mguni_dbtype mgcld_dbtype mginv_dbtype mgsws_dbtype mgmrp_dbtype mgven_dbtype mgcex_dbtype mgmp_dbtype mgmfg_dbtype mgsop_dbtype lcarg_dbtype movadm_dbtype movdis_dbtype movind_dbtype .Os valores. ou seja. as siglas suportadas pelo include estão apresentadas a seguir: Banco de Dados Progress Oracle MS SQL-Server Sigla progress oracle mss Outro fato relacionado a inserção da chamada ao include é que esta deve ser feita uma única vez em todo o programa. ficando assim disponíveis em todo o escopo do programa. e mais especificamente no início do programa. Isto se deve ao fato dos pré-processadores definidos no include terem escopo global.

. A seguir veja dois exemplos de utilização de pré-processadores de miniflexibilização para banco de dados: Exemplo 1: {include/i_dbtype. A utilização dos pré-processadores..name = "Bob Song". &ENDIF IF customer. &ELSE MESSAGE "Função não disponível!" VIEW-AS ALERT-BOX.i} CREATE customer..cust-num = 1000 customer. na maioria das vezes visa implementar soluções para contornar ou diminuir as deficiências e/ou limitações de bancos de dados não-Progress. &IF "{&ems_dbtype}":U <> "progress":U &THEN VALIDATE customer. &ELSEIF. 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 lógica senão é executada outra lógica.credit-limit > 1000 THEN .i} &IF "{&ems_dbtype}":U = "progress":U &THEN GET LAST {&QueryName} NO-LOCK. &THEN. &ELSE e &ENDIF.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 363 Nome do pré-processador movmnt_dbtype movmfg_dbtype Produto HR dthrpyc_dbtype dthrpmg_dbtype dthrtma_dbtype  Fazer a utilização dos pré-processadores disponíveis no include através das diretivas de pré-processadores: &IF. em conjunto com as diretivas de préprocessadores. &ENDIF Exemplo 2: {include/i_dbtype. ASSIGN customer.

&ENDIF END PROCEDURE. as siglas suportadas para especificar o tipo de banco de dados.Mini-Flexibilização para Tipo de Versão Banco de de Banco Dados de em Dados DBOs Esta técnica oferece possibilidade para o desenvolvimento de implementações específicas em DBOs para determinados tipos de bancos de dados. pré-existente nos DBOs. descritas a seguir:  Fazer a utilização do pré-processadore disponíveis no include de serviço. O pré-processador existente chama-se DBType. em conjunto com as diretivas de préprocessadores. 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 lógica senão é executada outra lógica. através das diretivas de préprocessadores: &IF. &ELSE e &ENDIF. Para tanto devem ser seguidas algumas regras. A seguir veja um exemplo de utilização de pré-processador de miniflexibilização para banco de dados: Exemplo 1: PROCEDURE afterNewRecord: &IF "{&DBType}":U = "PROGRESS":U &THEN GET LAST {&QueryName} NO-LOCK. na maioria das vezes visa implementar soluções para contornar ou diminuir as deficiências e/ou limitações de bancos de dados não-Progress. podendo assumir os valores. Esta técnica oferece possibilidade para o desenvolvimento de implementações específicas para determinadas versões de bancos de dados. Para tanto devem ser seguidas algumas regras. &ELSEIF. descritas a seguir: . Sendo que os valores/siglas permitidos são: Banco de Dados Progress Oracle MS SQL-Server Sigla progress oracle mss A utilização do pré-processador. a saber: Progress. &THEN. ou seja. Oracle e MS SQL-Server.

i. E os pré-processadores disponíveis para utilização estão 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 . Isto se deve ao fato dos pré-processadores definidos no include terem escopo global. Contendo como valor a versão do banco de dados utilizado (no ambiente específico de desenvolvimento e expedição do produto corrente). e mais especificamente no início do programa. A chamada ao include torna disponível uma série de pré-processadores. Outro fato relacionado a inserção da chamada ao include é que esta deve ser feita uma única vez em todo o programa.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 365  Inserir a chamada ao include de especificação dos pré-processadores de mini-flexibilização para versão de banco de dados. chamado include/i_dbvers. para cada um dos bancos de dados dos produtos Datasul. ficando assim disponíveis em todo o escopo do programa.

&ELSE ASSIGN customer.cust-num = 1000 customer. visa implementar características e funcionalidades disponíveis para uma versão (ou a partir de uma versão) específica do banco de dados. A seguir veja um exemplo de utilização de pré-processadores de miniflexibilização para versão de produto: Exemplo 1: {include/i_dbvers. descritas a seguir:  Criar o include de especificação dos pré-processadores específicos.name = "Bob Song". &ENDIF Esta técnica oferece possibilidade para o desenvolvimento de implementações específicas para as mais diversas necessidades e situações. &ELSE e &ENDIF. &IF "{&mgadm_version}":U >= "2.04":U &THEN ASSIGN customer. Para tanto devem ser seguidas algumas regras. em conjunto com as diretivas de préprocessadores. Isto faz com que o uso dos pré-processadores utilize uma estrutura simples que consiste em: caso a versão do banco de dados seja maior ou igual a um valor específico então é executada uma lógica senão é executada outra lógica.Mini-Flexibilização Específi ca Nome do pré-processador movmfg_version mgrac_version movrac_version Produto HR dthrpyc_version dthrpmg_version dthrtma_version  Fazer a utilização dos pré-processadores disponíveis no include através das diretivas de pré-processadores: &IF.dec-1 = 1500.credit-limit = 1500. &THEN.i} CREATE customer. ASSIGN customer. &ELSEIF. . A utilização dos pré-processadores.

acrescentar novos pré-processadores). Isto se deve ao fato dos pré-processadores definidos no include terem escopo global.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 367 O include de mini-flexibilização específica visa atender as necessidades de implementações de cada um dos módulos dos produtos Datasul. e mais especificamente no início do programa. A nomenclatura e localização dos arquivos de mini-flexibilização específica devem seguir o padrão: <diretório_do_módulo>/cfg<sigla_do_módulo>. deve-se seguir a padronização de nomenclatura definida para os produtos Datasul. Outro fato relacionado a inserção da chamada ao include é que esta deve ser feita uma única vez em todo o programa. E assim devese ter apenas um include para cada um dos módulos dos produtos. podendo ser ou não definidos. preocupem-se apenas em verificar a existência ou inexistência destes. deve-se então apenas alterá-lo (ou seja. ficando assim disponíveis em todo o escopo do programa. consistindo em: verificação de redefinição do include no escopo e definição de pré-processadores de escopo global. conforme módulo do produto associado ao programa no qual deseja-se implementar a mini-flexibilização. Pois isto permite que os programas que fazem uso destes pré-processadores.  Inserir a chamada ao include de especificação dos pré-processadores de mini-flexibilização específica.i O modelo de estrutura do include é simples. facilitando a utilização dos mesmos. . Geralmente pode-se optar pela não definição de valor para os préprocessadores. Um exemplo de include de mini-flexibilização específica pode ser visto a seguir: Exemplo 1: &IF DEFINED(include_sports) = 0 &THEN /* Verificação de * definição do * include */ &GLOBAL-DEFINE fn-calculo-lambda &ENDIF Quanto aos nomes dos pré-processadores. Então caso o include de mini-flexibilização específica já esteja criado para um determinado módulo. E em relação ao valor dos pré-processadores não há um padrão.

&ELSEIF. visam as mais diversas necessidades e situações.cust-num = 1000 customer. ASSIGN customer. em conjunto com as diretivas e funções de pré-processadores. A utilização dos pré-processadores.name = "Bob Song". &IF DEFINED(fn-calculo-lambda) > 0 &THEN ASSIGN customer. Embora o uso dos pré-processadores seja para as mais diversas necessidades. consistindo em: caso o préprocessador esteja definido então é executada uma lógica senão é executada outra lógica.name = "Bob Song". Fazer a utilização dos pré-processadores disponíveis no include através das diretivas de pré-processadores: &IF. Desta forma o exemplo anterior ficará da seguinte forma: Exemplo 2: {<diretório_do_modulo>/cfg<sigla_do_modulo>.credit-limit = fn-credit-limit-default(). A seguir veja um exemplo de utilização de pré-processadore de miniflexibilização específica: Exemplo 1: {<diretório_do_modulo>/cfg<sigla_do_modulo>. &ENDIF .i} CREATE customer. &ENDIF Neste tipo de mini-flexibilização pode-se optar por apenas inserir lógica somente quando o pré-processador estiver definido. &IF DEFINED(fn-calculo-lambda) > 0 &THEN ASSIGN customer.i} CREATE customer.credit-limit = 1500.cust-num = 1000 customer.credit-limit = fn-credit-limit-default(). sua estrutura de utilização em geral é simples. &THEN. &ELSE ASSIGN customer. &ELSE e &ENDIF e função de pré-processador DEFINED. ASSIGN customer.

Exemplo {include/i-wenrgm. ou possua uma trigger de "ENTRY". .qti_dias_contrat_trab &event4="leave" &field5=funcionario. Observação: Existe um limite de 10 campos a serem utilizados em cada chamada da include.Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 369 Como registrar campo do tipo Fill-in para o WebEnabler Esta técnica deve ser utilizada somente para os campos do tipo fill-in que possua uma trigger de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de zoom na sua direita. passando como parâmetro o nome do campo e o evento que deseja habilitar. Caso esse limite seja excedido o programador deverá definir uma nova chamada da include passando os demais campos.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.qti_meses_trab_ant &event3="leave" &field4=funcionario. Colocar a chamada da include i-wenrgm.dat_admis_func &event2="leave" &field3=funcionario.i no Main Block.cdn_vinc_empregat &event6="leave"}. conforme exemplo abaixo.i &field1=v_num_pessoa_fisic &event1="leave" &field2=funcionario.dat_term_contrat_trab &field6=funcionario.

Implementação Quando um programa janela é chamado a partir de uma transação de inclusão de registro – dentro de local-assign-record. Primeiro você deve verificar com que template o programa chamado está cadastrado no EMS. &ELSE {include/i-countds. . “Janela Detalhe”. 6 deste manual. “Inclui/Modifica Filho”.p”.I do cap.i} DEFINE VARIABLE iCount AS INTEGER NO-UNDO. por exemplo – é necessário que a janela pai seja desabilitada enquanto a nova não for fechada. Depois a técnica de mini-flexibilização para o tipo de banco de dados é usada para separar o código para banco PROGRESS do código para banco ORACLE ou SQL Server. Para banco PROGRESS o comando é: SELECT COUNT(*) INTO <var> FROM <tabela> WHERE <condição>.i &BANCO=mgadm &TABELA="cheque-pend" &COND="where cod-banco > 20" &DEST=iCount} &ENDIF Como chamar um programa que é janela a partir de uma transação Objetivo Esta técnica deve ser utilizada quando for necessário chamar um programa que é janela a partir de uma transação de inclusão / modificação de registros. usando uma condição (cláusula WHERE) ou não. Se o cadastro indicar um dos seguintes tipos: “Inclui/Modifica Pai”. Exemplo {include/i_dbtype. “Formação sem Navegação” ou “Estrutura”. uma vez que o próprio template do programa trata de desabilitar a janela pai. Para os outros bancos use o include “include/i-count. descrito no item ICOUNTDS. &IF "{&mgadm_dbtype}" = "progress" &THEN SELECT COUNT(*) INTO iCount FROM cheque-pend WHERE cod-banco > 20. Primeiramente define-se a variável que receberá a quantidades de registros.Implementação Objetivo Como contar a quantidade de registros numa tabela Esta técnica deve ser utilizada quando for necessário contar a quantidade de registros numa tabela. acessado através do DataServer. não é necessário nenhum código adicional. “Pesquisa”.

pronto para download. Implementação Nos programas que possuem integração através do EAI.i} IF v_log_eai_habilit THEN DO: /* Chamada do adapter. . Para o caso da construção de gráficos o objetivo é enviar ao client WebEnabler as informações para a construção do dataset que gerará o gráfico através dos mesmos programas citados acima. Como descobrir se o EAI está habilitado Objetivo Esta técnica deve ser utilizada quando for necessário descobrir se o EAI está habilitado e configurado. você desabilitar a janela pai manualmente. Exemplo ASSIGN {&WINDOW-NAME}:SENSITIVE = NO. Para o caso da abertura de documentos office. o objetivo é enviar ao lado client do WebEnabler.w. RUN xxx/xxNNNN.i e verificar o valor da variável v_log_eai_habilit. Exemplo {include/i_dbeai. antes da chamada dos adapters é necessário verificar se o EAI está configurado.Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 371 Se o programa chamado estiver cadastrado com outro template. Durante o login o valor dessa variável é alterado para YES se o EAI estiver configurado. através dos programas WEN0001 e WEN0006. Após o download o client do WebEnabler se encarregará de abrir o arquivo. a informação de que existe um novo arquivo no servidor. Como enviar gráficos ou documentos office para o WebEnabler Esta técnica permite enviar informações para o WebEnabler visando à construção de gráficos ou a abertura de documentos office nos programas que não utilizam as apis UTAPI012. Ao receber essas informações o client WebEnabler irá gerar o gráfico utilizando o Datasul ChartViewer. habilitando assim a integração. */ END. UTAPI013. ASSIGN {&WINDOW-NAME}:SENSITIVE = TRUE. Para isso deve-se incluir a include i_dbeai.

este comando deve ser executado uma única vez por ação. RUN setRemoteActionSequence IN hWenController. como no caso da criação de um gráfico.<Nome do Parametro>. Valor do Parâmetro – Valor dado ao parâmetro (para o caso de abertura de documentos office utlizar o nome do arquivo – sem o path. antes de enviar a solicitação de abertura de arquivo ou de enviar os dados para geração do gráfico.  Em Definitions. para o caso da criação de gráficos utilizar os valores referentes as parâmetros criados – maiores informações ver documentação DatGraph) Observação Não esquecer que a execução do segundo procedimento é única.  rodar a procedure setRemoteActionSequence da API WebEnabler visando incrementar a sequência de ações remotas. RUN requestRemoteAction IN hWenController(<Tipo de Ação Remota>.  rodar a procedure requestRemoteAction da API WebEnabler visando passar as informações para o client deste. Parâmetros: Tipo de Ação Remota – Os tipos de ação que devem ser utilizados são: chartviewer (para criação de gráficos) e opendocument (para a abertura de documentos office). Como migrar relatórios antigos para RTF Esta técnica permite gerar a saída do relatório em um arquivo RTF nos programas que foram criados antes da alteração que incluiu esta funcionalidae no template. ou seja.<Valor do Parâmetro>).Objetivo Implementação  definir a variável global do tipo handle que contém o endereço da API WebEnabler na memória. para o caso da criação de gráficos ver documentação DatGraph). mesmo que sejam enviadas diversas informações. Este procedimento deve ser executado somente uma vez para cada tipo de ação remota. DEFINE SHARED VARIABLE hWenController AS HANDLE NO-UNDO. Nome do Parâmetro – Nome dado ao parâmetro (para o caso de abertura de documentos office utilizar "file". acrescentar após &GLOBAL-DEFINE PGIMP: &GLOBAL-DEFINE RTF YES .

DEFINE SHARED VARIABLE hWenController AS HANDLE NO-UNDO. Inclua após a definição da variável local c-terminal: def var c-rtf as char no-undo. def var c-modelo-default as char no-undo.86 BY .  Após a definição da variável c-arquivo(“DEFINE VARIABLE carquivo AS CHARACTER”) inserir o seguinte código: DEFINE VARIABLE c-modelo-rtf AS CHARACTER VIEW-AS EDITOR MAX-CHARS 256 SIZE 40 BY . .  Após a definição da variável text-destino(“DEFINE VARIABLE textdestino AS CHARACTER”) inserir o seguinte código: DEFINE VARIABLE text-modelo-rtf AS CHARACTER FORMAT "X(256)":U INITIAL "Modelo:" VIEW-AS TEXT SIZE 10.63 NO-UNDO.88 BGCOLOR 15 NO-UNDO.  Para criar os componentes utilizados pela funcionalidade de RTF é necessário abrir o programa que está sendo alterado no procedure editor e executar os passos abaixo:  Após a definição do botão bt-config-impr(“DEFINE BUTTON btconfig-impr”) inserir o seguinte código: DEFINE BUTTON bt-modelo-rtf IMAGE-UP FILE "image\im-sea":U IMAGE-INSENSITIVE FILE "image\ii-sea":U LABEL "" SIZE 4 BY 1. acrescente os campos: field modelo-rtf as char format "x(35)" field l-habilitaRtf as LOG.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 373   Na definição da temp-table tt-param.

54.63 COL 3.17 COL 1.29 c-modelo-rtf AT ROW 6.83 COL 3.96 COL 1.86 NO-LABEL text-rtf AT ROW 4.14 COLON-ALIGNED NO-LABEL text-modelo-rtf AT ROW 5.04 COL 3.86 HELP "Modo de Execução" NO-LABEL text-destino AT ROW 1.29 BY 3.08 NO-UNDO.63 COL 3 HELP "Nome do arquivo de modelo do relatório" NO-LABEL bt-modelo-rtf AT ROW 6.29 HELP "Escolha do nome do arquivo" c-arquivo AT ROW 2. DEFINE VARIABLE l-habilitaRtf AS LOGICAL INITIAL no LABEL "RTF" VIEW-AS TOGGLE-BOX SIZE 44 BY 1.88 COL 2.63 COL 43 HELP "Escolha do nome do arquivo" rs-execucao AT ROW 8. Alterar a definição da frame f-pg-imp (“DEFINE FRAME f-pg-imp”) para: DEFINE FRAME f-pg-imp rs-destino AT ROW 1.29 HELP "Configuração da impressora" bt-arquivo AT ROW 2.  Após a definição do retângulo rect-9 (“DEFINE RECTANGLE RECT9”) inserir o seguinte código: DEFINE RECTANGLE rect-rtf EDGE-PIXELS 2 GRAPHIC-EDGE NO-FILL SIZE 46.29 HELP "Destino de Impressão do Relatório" NO-LABEL bt-config-impr AT ROW 2.14 COLON-ALIGNED NO- .86 BY .71 COL 43.75 COL 3.63 NO-UNDO.71 COL 43. Após a definição da variável text-modo(“DEFINE VARIABLE textmodo AS CHARACTER”) inserir o seguinte código: DEFINE VARIABLE text-rtf AS CHARACTER FORMAT "X(256)":U INITIAL "Rich Text Format(RTF)" VIEW-AS TEXT SIZE 20.29 HELP "Nome do arquivo de destino do relatório" NO-LABEL l-habilitaRtf AT ROW 4.

14 COLON-ALIGNED NOLABEL rect-rtf AT ROW 4.33 COL 2.  Substituir o código da trigger de “VALUE-CHANGED” do componente rs-destino pelo código abaixo: DO: do with frame f-pg-imp: case self:screen-value: when "1" then do: assign c-arquivo:sensitive = no bt-arquivo:visible = no bt-config-impr:visible = YES &IF "{&RTF}":U = "YES":U &THEN l-habilitaRtf:sensitive = NO .APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 375 LABEL text-modo AT ROW 8.46 COL 2 RECT-7 AT ROW 1.13 COL 1.5.14 RECT-9 AT ROW 8. &endif END.  Abrir o programa no AppBuilder e alterar a trigger de “VALUE_CHANGED” do componente l-habilitaRTF.33 COL 2 WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY SIDE-LABELS NO-UNDERLINE THREE-D AT COL 3 ROW 3 SIZE 73. colocando o seguinte código: DO: &IF "{&RTF}":U = "YES":U &THEN RUN pi-habilitaRtf.72 BY 10.

END. &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. 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 . . when "2" then do: assign c-arquivo:sensitive = yes bt-arquivo:visible = yes bt-config-impr:visible = NO &IF "{&RTF}":U = "YES":U &THEN l-habilitaRtf:sensitive = YES &endif .l-habilitaRtf:SCREEN-VALUE IN FRAME f-pgimp = "No" l-habilitaRtf = NO &endif .

if name} l-ok = yes then assign c-modelo-rtf:screen-value in frame {&frame= replace(c-arq-conv.rtf" "*. "*. "/").*" DEFAULT-EXTENSION "rtf" INITIAL-DIR "modelos" MUST-EXIST USE-FILENAME UPDATE l-ok.  Alterar a trigger de “CHOOSE” do botão bt-modelo-rtf para o seguinte código: DO: def var c-arq-conv as char no-undo. END. def var l-ok as logical no-undo. "/". end. &IF "{&RTF}":U = "YES":U &THEN RUN pi-habilitaRtf.  Na procedure pi-executar após o bloco de teste de validação do arquivo informado(“if input frame f-pg-imp rs-destino = 2 and input frame f-pgimp rs-execucao = 1 then do:”) inserir o código abaixo que é responsável por validar o modelo informado: .rtf".APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 377 end case. &endif END. "\". SYSTEM-DIALOG GET-FILE c-arq-conv FILTERS "*. "\"). assign c-modelo-rtf = replace(input frame {&frame-name} c-modelo-rtf.*" "*.

&endif  Na procedure pi-executar. return error. Acrescentar após include/i-prgvrs.l-habilitaRtf habilitaRtf = INPUT FRAME f-pg-imp l- &endif  Alterações no Programa RP: 1. Na definição da temp-table tt-param. input ""). acrescente os campos field modelo-rtf as char format "x(35)" field l-habilitaRtf as LOG. ao criar o registro na tt-param. . acrescente o seguinte trecho de código no comando assign: &IF "{&RTF}":U = "YES":U &THEN tt-param. input 73.&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: run utp/ut-msgs.i o pré-processador: &GLOBAL-DEFINE RTF YES 2. END. apply "MOUSE-SELECT-CLICK":U to im-pg-imp in frame frelat.modelo-rtf rtf = INPUT FRAME f-pg-imp c-modelo- tt-param.p (input "show":U.

Como converter consultas For Each para Send-SQL-Statement Esta técnica deve ser utilizada apenas para revisar programas de relatório que apresentam problemas em Oracle.l-habilitaRTF <> YES THEN DO: VIEW STREAM str-rp FRAME f-cabec. Condicionar o VIEW das FRAMES no início do programa : IF tt-param. Para: SELECT cod_estabel. VIEW STREAM str-rp FRAME f-rodape. Caso existam restrições no uso da técnica de UT-SELECT. Importante Antes de utilizar esta técnica. tente primeiro fazer a conversão utilizando a técnica do utilitário UT-SELECT. O desenvolvimento com a técnica de UTSELECT é mais rápido e eficiente.  Transformar a consulta de for each (ou eachs encadeados) em um ou mais de um comando select. Deve-se prestar atenção nos nomes dos campos.Objetivo Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 379 3. pois em Oracle não permite que seja utilizado – (traço) no nome de campos e tabelas. O comando select pode conter apenas tabelas de um mesmo banco. Deve-se observar o banco das tabelas. END. nome_abrev FROM ped_venda P WHERE P. Então as tabelas que tem – (traço) no nome. então deve ser utilizada esta técnica.cod_estabel = c-cod-estabel AND P. 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.nome_abrev = c-nome-abrev. .

utilizamos a variável chamada iHandle1: RUN STORED-PROCEDURE send-sql-statement HANDLE(oracleCommand). No exemplo abaixo.i. realizando as conversões de tipos de dados entre Progress e Oracle necessárias. e a conversão pode ser feita do Progress para Oracle (usando as funções que começam com p2o) ou do Oracle para o Progress (usando as funções que começam com o2p). Esta é a fase mais crítica da conversão. No exemplo.cod_estabel = " + p2oCharacter(c-cod-estabel) + CHR(10) + "P. INTEGER ou DATE. então ele deve ser montado numa variável CHAR. Neste caso a PROC-HANDLE tem a função de passar parâmetros para a stored-procedure. iHandle1 = PROC- . podemos notar a utilização de algumas dessas funções: ASSIGN cComandoSQL = "SELECT cod_estabel. Em ambas as situações. podemos passar o nome dela no lugar de sendsql-statement. É necessário definir uma variável INT para receber esse valor.  Uma vez que o comando SQL foi definido. nome_abrev FROM ped_venda P" + CHR(10) + "WHERE" + CHR(10) + "P. Caso seja necessário rodar uma stored-procedure já existente na base de dados.nome_abrev = " + p20Character(c-nome-abrev) . montando cuidadosamente o comando de consulta. a função PROC-HANDLE retorna o handle (no formato Integer) que referencia aquela consulta no buffer. executamos o comando SELECT montado (contido na variável cComandoSQL neste exemplo) através do comando RUN STOREDPROCEDURE. Como a consulta é montada dentro do próprio programa Progress. Esta conversão de for each para send-sql-statement tem que estar perfeitamente correta antes de se passar para a próxima atividade. foram criadas algumas funções que estão disponíveis na include utp/ut-oraFunConv. Certifique-se que as duas consultas retornam o mesmo resultado antes de passar para a próxima fase. Para conversão dos tipos de dados entre Progress e Oracle. Este comando select será passado como parâmetro para o send-sqlstatement. passamos "send-sql-statement" como parâmetro do RUN STORED-PROCEDURE (este é um nome padrão para a stored-procedure a ser executada). Este handle será usado posteriormente para leitura do resultado da consulta. Aqui podem ser gerados erros que acarretarão diferenças no resultado. o próximo passo é executar o comando RUN STORED-PROCEDURE no Progress. Existem nesta include funções para campos do tipo CHAR. Primeiramente.

Para pegar os valores. e depois uma definição da temp-table e também a leitura da proc-text-buffer: ped-venda. Para receber os valores. É importante salientar que cada campo ocupa. a temp-table pode ter um nome qualquer. Essa temp-table tem apenas um campo. chamado proc-text. Algumas funções recebem 2 parâmetros: o buffer e a posição a partir de onde se deseja ler. outras recebem 3 parâmetros: o buffer.cod-estabel => pedVenda_codEstabel. A temp-table de retorno tem um nome padrão. FOR EACH proc-text-buffer WHERE PROC-HANDLE = iHandle1: CREATE oracleLine. o exato espaço de seu tamanho no banco. ****** DEFINE TEMP-TABLE oracleLine FIELD pedVenda_codEstabel like ped-venda. a string concatenada teria 40 posição. formando uma string única. a definição dessa temp-table deve seguir alguns padrões. convertidos para o nome padrão na temp-table. é necessário criar uma temp-table com os campos que foram consultados. que é proc-text-buffer. existem funções (definidas na include utp/ut-oraFunConv.nome-abrev. entretanto o nome dos campos deve ser formado por: nomeTabela_nomeCampo. onde o primeiro tem 10 de tamanho e o segundo tem 30.i) que retornam conforme o tipo de dado. primeiramente vemos alguns campos.cod-estabel FIELD pedVenda_nomeAbrev like ped-venda. Isso ficará mais fácil de entender no exemplo abaixo. Abaixo um exemplo de como ler essa temp-table e desmembrar os valores retornados. 1. 3) .pedVenda_codEstabel = o2pGetString(proc-text. a posição e o tamanho a ser importado. por exemplo. Para aproveitar a lógica já existente do relatório. ped-venda. ASSIGN oracleLine. então numa consulta com 2 campos. É necessário separá-los em vários campos. onde todos os valores de cada linha são concatenados.nome-abrev => pedVenda_nomeAbrev. conforme a consulta.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 381  O resultado da execução do comando SELECT é retornado pelo progress numa temp-table que tem apenas um campo CHAR. na string concatenada.

Afim de aproveitar as lógicas préexistentes de negócio no relatório.Promise-Date order. 4. como no exemplo: Search: ped-venda.  Por fim.order-num order.cod-estabel Replace: oracleLine.pedVenda_codEstabel.oracleLine. END.  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.Sales-Rep WITH FRAME f-pedido.cust-num order. END. 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. Search: ped-venda.  Agora os dados já foram consultados. executa-se o comando CLOSE STORED-PROCEDURE para terminar o uso daquela consulta. fazendo a modificação que definimos anteriormente. . Após este comando .pedVenda_nomeAbrev.pedVenda_nomeAbrev = o2pGetString(proctext. os registros não estarão mais disponíveis no proc-text-buffer: CLOSE STORED-PROCEDURE send-sql-statement WHERE PROC-HANDLE = ihandle1. Deve-se então fazer um search e replace para cada campo. 12).nome-abrev Replace: oracleLine.

60). order.Promise-Date. {utp/ut-oraFunConv. oracleLine. 1).order-num. 30) oracleLine. ASSIGN oracleLine.order-num <= 900 AND" + CHR(10) + " (order.promise-date FIELDS order_salesRep like order.order_orderNum = o2pGetNumber(proctext. FOR EACH proc-text-buffer WHERE PROC-HANDLE = ihandle1: CREATE oracleLine. RUN STORED-PROCEDURE send-sql-statement ihandle1 = PROCHANDLE(oracleCommand).cust-num FIELDS order_promiseDate like order. order.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 383 Programa com a técnica: DEFINE VAR oracleCommand AS CHAR NO-UNDO.i } ASSIGN oracleCommand = "SELECT" + " order. DEFINE VAR ihandle1 AS INTEGER NO-UNDO.cust-num.Promise-Date BETWEEN " + p2oDate(da-entregaini) + " AND " + p2oDate(da-entrega-fim) + ")) ". .sales-rep.Sales-Rep " + CHR(10) + "FROM order " + CHR(10) + "WHERE" + CHR(10) + " order.order_custNum = o2pGetNumber(proc-text.sales-rep BETWEEN UPPER(" + p2oCharacter(csales-rep-ini) + ") AND LOWER(" + p2oCharacter(c-sales-repfim) + ")) AND" + CHR(10) + " (order. DEFINE TEMP-TABLE oracleLine FIELDS order_orderNum like order.order-num >= 100 AND" + CHR(10) + " order. " + CHR(10) + " order.order-num FIELDS order_custNum like order.order_promiseDate = o2pGetDate(proctext.

8). END.order_orderNum oracleLine. Importante: compatível com Ansi SQL.Objetivo oracleLine.order_salesRep = o2pGetString(proctext. Para implementar tal processo o desenvolvedor fará uso de dois utilitários que são:  O programa ut-select. CLOSE STORED-PROCEDURE send-sql-statement WHERE PROC-HANDLE = ihandle1.order_custNum oracleLine. Nem sempre os comandos convertidos pelo DataServer são os mais eficazes.order_salesRep WITH FRAME f-pedido.p ao banco de dados.  A include ut-send-sql. tal código deverá ser enviado à include ut- . END. 80.p: Permite ao programador montar o comando SQL conforme a necessidade. que serão repassados ao programa ut-select. Atualmente o acesso às bases Oracle e SQL Server é feito de maneira transparente ao desenvolvedor. gerando perda de performance se comparamos processos executados utilizando banco Progress. O desenvolvedor irá desmembrar o comando FOR EACH em partes. FOR EACH oracleLine BY order-num: DISPLAY STREAM str-rp oracleLine. ficando à cargo do DataServer a interface entre os comandos Progress e SQL.order_promiseDate oracleLine.i: Include responsável pelo envio do comando SQL criado pela ut-select. Utilitário para Geração de Comandos SQL Esta técnica tem por objetivo apresentar uma alternativa para efetuar consultas em bases Oracle ou SQL Server.

i que irá retornar ao programa executor uma temp-table contendo o resultado da consulta. se a consulta compreender campos de mais de uma tabela do mesmo banco. caso ocorra este tipo de situação o desenvolvedor deverá utilizar o pré-processador UsaSeqField = YES .name FIELD customer_city LIKE customer.p persistente e atribuir o seu handle para a variável que foi criada anteriormente.country FIELD customer_salesrep LIKE customer. . Isto deve ser feito porque a atribuição automática de valores para a temp-table utilizará a sequência dos campos para determinar o valor correspondente de cada campo. tais campos deverão ser definidos na mesma temp-table.cod_campo2 = tabela1_codCampo2 tabela1.city FIELD customer_state LIKE customer.Address2 FIELD customer_country LIKE customer. Observação Esta convenção de nome pode gerar problema com os tamanhos de campos.  Rodar o programa ut-select. Com a utilização deste pré-processador o desenvolvedor deverá observar a sequência dos campos informados na definição da temp-table e utilizar a mesma seqüência dos campos na procedure gerarSelect.campo1 = tabela1_campo1 tabela1. define variable utSelect as handle no-undo.sales-rep. A temp-table deverá conter todos os campos retornados da consulta.  Definir uma temp-table que será utilizada para armazenar o resultado da consulta realizada no banco de dados. Convencionamos que os campos da temp-table de retorno seguirão a nomenclatura dos campos da tabela.state FIELD customer_address2 LIKE customer. Sem o pré-processador UsaSeqField esta rotina utiliza o nome do campo.campo3_campo = tabela1_campo3Campo DEFINE TEMP-TABLE sqlLine NO-UNDO FIELD customer_custnum LIKE customer. seguindo o seguinte modelo: tabela1.cust-num FIELD customer_name LIKE customer.  Definir uma variável do tipo handle.Implementação APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 385 send-sql.

OR ou “”. Ex. Ex. Para a passagem de variáveis ou valores.  O programa ut-select.: INPUT STRING(tt-param. deve-se utilizar " para a passagem do parâmetro. Ex.tt_iIniCustNum) INPUT STRING(180) INPUT inAte: Valor final do intervalo a ser pesquisado.p persistent set utSelect. decimal.tt_iFimCustNum) INPUT STRING(180) INPUT inTipoDado: Tipo de dado do campo a ser referenciado. . Pode ser integer. character. logical. Para a passagem de variáveis ou valores. são elas:  adicionarBetween: Adiciona ao comando SQL a cláusula BETWEEN. deve-se utilizar STRING(x). deve-se utilizar " para a passagem do parâmetro.: INPUT STRING(tt-param. O operador Between pode ser usado para especificar um critério de seleção. Ex.run utp/ut-select. Para campos de tabela.: INPUT "Integer" INPUT inFechaParenteses: número de parênteses que serão fechados nesta linha. deve-se utilizar STRING(x).cust_num" INPUT inDe: Valor inicial do intervalo a ser pesquisado.: INPUT 0 INPUT inOperadorLogico: Define a condição lógica a ser aplicada para essa linha. Ex. Para campos de tabela. date ou field.p disponibiliza procedures auxiliares para a criação do comando SQL. Ex.: INPUT "customer.: INPUT 0 INPUT inCampoBanco: Nome do campo da tabela a ser referenciado pela cláusula BETWEEN. Será sempre incluído antes do operador lógico. pode se AND. Parâmetros: INPUT inAbreParenteses: número de parênteses que serão abertos para esta linha.

Ex.tt_iIniCustNum).: INPUT STRING(i-qty-ini) INPUT STRING(180) .order-line. INPUT "customer. Parâmetros: INPUT inAbreParenteses: número de parênteses que serão abertos para esta linha.: INPUT " customer.address2" INPUT inOperador: Nome do operador de comparação a ser utilizado. INPUT 0.cust_num".APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 387 Exemplo: Para incluir a cláusula BETWEEN: “sports. INPUT STRING(tt-param. deve-se utilizar " para a passagem do parâmetro.: INPUT "<>" INPUT inValor: parâmetro destinado a informação do campo ou valor a ser comparado na cláusula Where. Para a passagem de variáveis ou valores. pode ser ‘=’.qty BETWEEN i-qty-ini AND i-qty-fim” executar o código abaixo: RUN adicionarBetween IN utSelect(INPUT 0. ‘>’ ou ‘<’ ou ‘<>’. Para campos de tabela. INPUT STRING(tt-param.tt_iFimCustNum).  adicionarWhere: Adiciona ao comando SQL uma cláusula WHERE. INPUT inCampo: Nome do campo da tabela a ser referenciado pela cláusula Where. INPUT "Integer". INPUT ""). deve-se utilizar STRING(x). Ex. Ex.

: INPUT " character" INPUT inFechaParenteses: número de parênteses que serão fechados nesta linha.INPUT inTipoDado: Tipo de dado do campo a ser referenciado. Exemplo: Para obtermos o comando: SELECT customer. Ex. INPUT STRING("").  gerarSelect: Gera o comando SELECT propriamente dito. OR ou “”. pode se AND.address2 <> “” ” executar o código abaixo: RUN adicionarWhere IN utSelect(INPUT 0. Formarão a cláusula FROM do comando SELECT. INPUT ""). customer. Utiliza as informações passadas pelas procedures ‘adicionarBetween’ e ‘adicionarWhere’ para gerar o comando SELECT retornando o mesmo para o programa executor através parâmetro ‘comando’. Pode ser integer.NAME. OUTPUT Comando: Retorna ao programa executor o comando SELECT gerado. INPUT "<>". logical. Parâmetros: INPUT Campos: Informa os campos que serão retornados pelo comando SELECT. INPUT "customer. INPUT 0. INPUT inOperadorLogico: Define a condição lógica a ser aplicada para essa linha. date ou field. INPUT "character".cust-num. INPUT Tabelas: Informa as tabelas que serão utilizadas no comando SELECT. decimal. character .address2". . Exemplo: Para incluir a cláusula Where: “ customer.

Country. order-line. Customer.price > 18 AND order-line. item.cust-num AND order.order-num.qty.Address2 . order. Customer. order.cust-num. order.item-num AND item.item-num = ITEM.price. Customer.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 389 customer.cust-num = order. " + " Customer. Customer. item WHERE customer.Address2. . OUTPUT sqlCommand).address.order-num = order-line. " + " item.qty. Customer. Ex.address. INPUT " Customer. a mesma condição será utilizada para as próximas consultas.City.qty BETWEEN i-qty-ini AND i-qty-fim Executar os procedimentos apresentados anteriormente para criação das cláusulas BETWEEN e Where juntamente com o código abaixo: RUN gerarSelect IN utSelect (INPUT " customer. " + " Customer. customer.Credit-Limit.price. Customer.: RUN resetWhere IN utSelect.  resetWhere: Utilizado para limpar a temp-table utilizada para armazenar a cláusula WHERE criada pelo comando “adicionarWhere”.item-num.NAME.order-num AND order-line.Comments " .Credit-Limit. Customer.Comments FROM Customer.Country. order-line. item ".order-num. Customer. Se caso o usuário não limpar a temp-table através desse comando. item. order-line. " + " order-line. item. " + " customer.City. order.item-num.

p. gerando duas temp-tables.p ao banco de dados utiliza-se a include ut-send-sql. Importante Para campos CHAR deverá ser feito a seguinte verificação no código INPUT IF <campo> = ? THEN “INTEGER” ELSE “CHARACTER”. utilizando a temp-table retornada pela include. Para enviar o comando gerado pelo programa ut-select.000} /* préprocessador para ativar ou não a saída para RTF */ &GLOBAL-DEFINE RTF YES /* préprocessador para setar o tamanho da página */ &SCOPED-DEFINE pagesize 42 /* definição das temp-tables para recebimento de parâmetros */ . delete object utSelect. passando o comando retornado pelo programa ut-select.i.  Ao final do processo.00. Os demais bancos seriam tratados com comandos FOR EACH. A outra seria identificar o banco mais crítico e utilizar a include apenas nesse banco. O código que deverá ser acrescentado no programa que esta utilizando a técnica ut-select é: delete object send-sql-bh.i. deve-se eliminar o objeto persistente. {utp\ut-send-sql.  É necessário eliminar o buffer da tabela de consulta o qual é criado pela include ut-send-sql.i XX9999 9.  Exemplo de programa convertido: /* include de controle de versão */ {include/i-prgvrs.00.i sqlCommand sqlLine Sports} Observação Para tabelas em bancos diferentes pode-se optar por duas alternativas. a temp-table que será retornada pela include e o nome do banco envolvido na consulta: Importante: A include não permite a utilização de tabelas em bancos diferentes. A primeira será utilizar a include para cada banco.

DEFINE TEMP-TABLE sqlLine NO-UNDO FIELD customer_custnum LIKE customer.country LIKE customer.state LIKE customer.Address2 FIELD customer_country FIELD customer_salesrep LIKE customer. &endif /* recebimento de parâmetros */ . &IF "{&EMS_DBTYPE}" <> "progress" &THEN DEFINE VARIABLE sqlCommand AS CHARACTER DEFINE VARIABLE utSelect NO-UNDO.cust-num FIELD customer_name LIKE customer.city FIELD customer_state FIELD customer_address2 LIKE customer.sales-rep.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 391 define temp-table tt-param no-undo field destino as integer field arquivo as char format "x(35)" field usuario as char format "x(12)" field data-exec as date field hora-exec as integer field classifica as integer field desc-classifica as char format "x(40)" field modelo-rtf as char format "x(35)" field l-habilitaRtf as LOG FIELD tt_iIniCustNum AS INTEGER FIELD tt_iFimCustNum AS INTEGER FIELD tt_classifica AS INTEGER FIELD tt_address-2 AS LOGICAL FIELD tt_country AS LOGICAL. DEFINE TEMP-TABLE tt-raw-digita NO-UNDO FIELD raw-digita AS RAW.name FIELD customer_city LIKE customer. AS HANDLE NO-UNDO.

CREATE tt-param. &ELSE FORM customer.address2 customer.customer_custnum sqlLine.customer_city sqlLine.customer_country WITH FRAME f-complete DOWN STREAM-IO. &endif /* include padrão para output de relatórios */ .NAME customer.customer_state sqlLine.state customer. /* include padrão para variáveis de relatório */ {include/i-rpvar. /* definição de frames do relatório */ &IF "{&EMS_DBTYPE}" <> "progress" &THEN FORM sqlLine.i} /* definição de variáveis DEFINE VARIABLE h-acomp */ AS HANDLE NO-UNDO.DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.city customer.cust-num customer.customer_address2 sqlLine. RAW-TRANSFER raw-param TO tt-param.customer_name sqlLine.country WITH FRAME f-complete DOWN stream-io. DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita.

i &STREAM="str-rp"} /* bloco principal do programa */ ASSIGN c-programa = "wRelatRP" c-versao = "1. END. VIEW STREAM str-rp FRAME f-rodape. INPUT STRING(tt-param. {utp/ut-liter. &IF "{&EMS_DBTYPE}" <> "progress" &THEN RUN utp/ut-select. RUN adicionarBetween IN utSelect(INPUT 0.00. /* executando de acompanhamento */ forma persistente o utilitário RUN utp/ut-acomp. INPUT "Integer". INPUT "customer.tt_iFimCustNum). /* para não visualizar cabeçalho/rodapé em saída RTF */ IF tt-param.p PERSISTENT SET h-acomp. de .00" c-revisao = ".i Imprimindo *} RUN pi-inicializar IN h-acomp (INPUT RETURN-VALUE).APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 393 {include/i-rpout.000" c-empresa = "Empresa Teste" c-sistema = "Sports" c-titulo-relat = "Customer".tt_iIniCustNum).cust_num".p PERSISTENT SET utSelect.l-habilitaRTF <> YES THEN DO: VIEW STREAM str-rp FRAME f-cabec.i &STREAM="stream str-rp"} /* include com a definição da frame de cabeçalho e rodapé */ {include/i-rpcab. INPUT STRING(tt-param.

city. OUTPUT sqlCommand). INPUT "AND").tt_country = YES THEN DO: DISPLAY STREAM str-rp (INPUT . customer. INPUT 0.address2.INPUT 0. RUN gerarSelect IN utSelect (INPUT "customer. {utp\ut-send-sql. " + " customer. RUN adicionarWhere IN utSelect(INPUT 0.state. &endif /* corpo do relatório */ &IF "{&EMS_DBTYPE}" <> "progress" &THEN FOR EACH sqlLine NO-LOCK ON STOP UNDO. IN h-acomp IF tt-param. RUN resetWhere IN utSelect. INPUT "customer.NAME.i sqlCommand sqlLine Sports} DELETE OBJECT send-sql-bh.customer_custnum: RUN pi-acompanhar sqlLine. DELETE OBJECT utSelect." + " customer.cust-num. " + " customer. INPUT "customer". INPUT STRING(""). LEAVE BY sqlLine.country".tt_address-2 = YES AND tt-param.customer_name). INPUT "").address2". INPUT "<>". customer. INPUT "character".

tt_address-2 = YES AND tt-param. &ELSE FOR EACH customer NO-LOCK WHERE customer. END.tt_country = YES THEN DO: DISPLAY STREAM str-rp customer.customer_custnum sqlLine.address2 customer. END.customer_city sqlLine. END.cust-num >= tt-param.country WITH FRAME f-complete.address2 <> “” BY customer.state customer. END.tt_iFimCustNum AND customer.cust-num : RUN pi-acompanhar IN h-acomp (INPUT customer.cust-num <= tt-param.tt_iIniCustNum AND customer.NAME).city customer.customer_name sqlLine.cust-num customer. DOWN STREAM str-rp WITH FRAME f-complete. . DOWN STREAM str-rp WITH FRAME f-complete.NAME customer.customer_country WITH FRAME f-complete. IF tt-param.customer_state sqlLine.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 395 sqlLine.customer_address2 sqlLine.

.cust-num". INPUT "customer.p ao banco de dados utiliza-se a include utp/ut-delete-sql.p PERSISTENT SET utSelect. RETURN "OK":U.i &STREAM="stream str-rp"} RUN pi-finalizar IN h-acomp.i sqlCommand Sports} Ao final do processo. RUN adicionarWhere IN utSelect (INPUT 0.  gerarDelete: Utilizado para gerar comandos SQL de DELETE para execução em bases de dados não Progress. RUN utp/ut-select. delete object utSelect. passando o comando retornado pelo programa ut-select. run resetWhere in utSelect.i. A include não faz o tratamento de retorno de execução para o usuário.&endif /*fechamento do output do relatório*/ {include/i-rpclo. Utiliza as informações passadas pelas procedures ‘adicionarBetween’ e ‘adicionarWhere’ para gerar o comando DELETE retornando o mesmo para o programa executor através parâmetro ‘comando’.  Para enviar o comando gerado pelo programa ut-select.p e o nome do banco envolvido: Importante: A include não permite a utilização de tabelas em bancos diferentes. deve-se eliminar o objeto persistente. {  utp/ut-delete-sql.

end procedure. output SQLCommand).i SQLCommand Sports} DELETE OBJECT utSelect. Esta técnica prevê tarefas para conversão de um programa estilo Inclui/Modifica Filho. As tarefas para conversão de um programa Inclui/Modifica Filho são:  Verificar se já existe uma SmartQuery para a consulta existente na query da Frame do Programa. criar uma nova utilizando o estilo CustomQuery Wizard. Não se pode converter programas do template de Relatório porque não é possível instanciar uma SmartQuery neste tipo de programa uma vez que eles não possuem uma SmartWindow como container.Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 397 INPUT "=". Conversão de Query em Frame para SmartQuery O objetivo desta técnica é converter os programas que possuem queries definidas na frame do programa para que utilizem SmartQueries. Caso seja necessário converter algum programa de outro estilo consulte a equipe de Suporte ao Desenvolvimento. Caso não exista. INPUT "integer".  Desfazer a query da frame. run gerarDelete in utSelect (input "customer". Na efetivação desta ação aparecerá a questão abaixo que deve ser respondida com “Sim”: . Caso contrário estes programas não poderão ser beneficiados com as melhorias realizadas no template de SmartQuery que melhoraram as performance dos programas em ambiente ORACLE. INPUT ""). INPUT 0. {utp/ut-delete-sql. INPUT STRING(iCust-num).

IN h_<query-name> (input v-row- Este comando deve ser o único existente na procedure para fazer posicionamento na query. Como por exemplo o trecho de código abaixo: . Caso existe outros comandos que façam procedimento semelhante.  Instanciar a Smart Query e aceitar a sugestão de SmartLink do tipo RECORD do Wizard. Remover o SmartLink do tipo RECORD que tem como source THISPROCEDURE e target a viewer do programa. que tem coom source a Query e target a Viewer do Programa:  Editar a procedure pi-reposiciona substituir a ocorrência "<queryname>" na linha de comando abaixo pelo nome da SmartQuery instanciada: RUN pi-reposiciona-query table). devem ser comentados e/ou retirados.

ON CHOOSE OF bt-inserir IN FRAME f-pg-dig /* Inserir */ DO: assign bt-alterar:SENSITIVE in frame f-pg-dig = yes bt-retirar:SENSITIVE in frame f-pg-dig = yes bt-salvar:SENSITIVE in frame f-pg-dig = yes. if available ({&first-table-in-query-{&frame-name}}) then run notify In this-procedure ("row-available":U). antes e após a execução do método INSERT-ROW. Ao utilizar ZOOM nos campos de um browser de digitação deveremos fazer algumas alterações na trigger do botão inserir.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 399 find {&first-table-in-query-{&frame-name}} where rowid({&first-table-in-query-{&frame-name}}) = v-row-table no-lock no-wait no-error. Editar o botão inserir e acrescentar os seguintes pontos em comentário abaixo ao código do programa. if num-results("br-digita") > 0 then DO: . Utilizando ZOOM na página de digitação Objetivo Está técnica tem como objetivo fazer algumas adptações no zoom na página de digitação.

else do transaction: create tt-digita. apply "entry" to tt-digita. para que o valor da segunda coluna não se repita na nova linha. que é um método do browse responsavel por sincronizar os dados do browse com a query. ASSIGN hColuna = br-digita:GET-BROWSE-COLUMN(1). br-digita:INSERT-ROW("after") in frame f-pg-dig. END. ASSIGN hColuna = br-digita:GET-BROWSE-COLUMN(2). Observação No evento do ROW-LEAVE é executado o CREATE-RESULT-LIST. /*Criado pela Técnica Zoom na pagina de digitação*/ DEFINE VAR hColuna AS WIDGET-HANDLE NO-UNDO. open query br-digita for each tt-digita./*Criado pela Técnica Zoom na pagina de digitação*/ APPLY "ROW-LEAVE" TO br-digita IN FRAME f-pg-dig. hColuna:EDIT-CLEAR(). Com isso os dados das linhas anteriores não serão perdidos no momento da exclusão da linha atual. /*Criado pela Técnica Zoom na pagina de digitação*/ END.cdn_cargo in browse br-digita. hColuna:EDIT-CLEAR(). No método edit-clear obtermos o handle da coluna. end. .

if not valid-handle(h-facelift) then run btb/btb901zo. pois a troca de página é feita automaticamente de acordo com alguns critérios de negócio.APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 401 Aplicar facelift em programas fora do padrão Objetivo Esta técnica tem como objetivo aplicar o facelift nos programas que não estão no padrão. o btb/btb901zo.p persistent set h-facelift. para que seja executado apenas no início da sessão. para os templates smart deverá ser aplicado na procedure local-initialize. Quando este programa for executado em um ambiente de facelift não serão aplicadas as novas técnicas de visual do facelift.i} Após a sua definição é necessário chamar o utilitário. Como exemplo. porém caso aconteça alguma interrupção do processamento e o handle for perdido o mesmo irá carregar o utilitário novamente.p. sua chamada deverá ser executada na procedure de inicialização do templete. conforme exemplo a seguir: &IF "{&mguni_version}" >= "2. para que não aparecessem as abas. segue a baixo o código a ser utilizado: &IF "{&mguni_version}" >= "2. o usuário precisa passar a handle da frame para uma pi do utilitário. Para aplicar o facelift em todos os objetos do programas deverá ser executado a procedure pi_aplica_facelift_thin. &ENDIF A variável handle será global.06b" or "{&aplica_facelift}" = "YES" &THEN . Para que o utilitário aplique os novos padrões de interface. podemos citar programas Masterdetail que no definitions não foi marcado a opção de frames. caso for thintemplate deverá ser aplicado na procedure intitializeInterface. Para estes casos deverá ser executado o utilitário responsável pela aplicação da técnica do facelift. para que o mesmo seja executado é necessário que seja definido na sessão de definitions a include a qual define se o processador do Facelift está ativado ou não. {include/i_fclpreproc.06b" or "{&aplica_facelift}" = "YES" &THEN define new global shared variable h-facelift as handle no-undo.

i TESTE 1. */ . basta apenas colocar a chamada para include ut9000 na Initialize do programa.00.00. &ENDIF Para aplicar o facelift em um único objeto.i "TESTE" "1. No caso destes programas. é necessário colocar no definitions do programa chamadas para as includes i-prgvrs. Para evitar isto. Está técnica é bastante simples e consiste em colocar as chamadas em 2 pontos. */ /* Dispatch standard ADM method.i exemplo conforme abaixo: {Include/i-prgvrs.00. deverá ser utilizada a procedure pi_aplica_facelift_smart.06b" or "{&aplica_facelift}" = "YES" &THEN run pi_aplica_facelift_smart in h-facelift ( input widget_do_usuario:handle ). o usuário consegue roda-lós sem estar logado no produto. Primeiro. antes do dispacth: {Utp/ut9000. é necessário que o desenvolver coloque no programa chamadas para as includes de segurança do produto.000"} /* Code placed here will execute PRIOR to standard behavior..i e ut-glob.run pi_aplica_facelift_thin in h-facelift ( input frame frame_do_usuario:handle ).00.i} Após isto.000} {Utp/ut-glob. conforme código abaixo: &IF "{&mguni_version}" >= "2. &ENDIF Como implementar segurança em programas específicos Objetivo Esta técnica tem como objetivo implementar segurança em programas específicos que são executados em bases do produto e que não são construídos utilizando os templates da Datasul.

1. 2.cust-num FRAME {&FRAME-NAME}) = customer. 2. /** WBD: END_NULL_CODE **/ Como Salvar chaves em Oracle e evitar o erro de UNIQUECONSTRAINT Evitar que ocorram erros de chaves duplicadas em base Oracle quando se utiliza Smart Viewer. /** WBD: BEGIN_NULL_CODE **/ assign this-procedure:private-data = "HLP=16":U.cust-num:SCREEN-VALUE IN . 1. Definir na Smart Viewer uma Procedure chamada SALVAR_CHAVE. Inserir o comentário /** WBD: BEGIN_NULL_CODE **/ no início do código que se deseja ignorar. */ Como Ignorar Códigos no WBD Esta técnica pode ser usada sempre que se desejar que o WBD desconsidere um trecho do código que irá ser analisado. O código dessa procedure deve atribuir aos campos chave da tabela os valores definidos pelo usuário na interface.Exemplo Implementação Objetivo APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 403 RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ) . Inserir o comentário /** WBD: END_NULL_CODE **/ no final do código que se deseja ignorar. PROCEDURE salvar_chave: /*-------------------------------------------------------------Purpose: Parameters: <none> Notes: --------------------------------------------------------------*/ assign customer. /* Code placed here will execute AFTER standard behavior.

.END PROCEDURE.

r já criado. programas que podem ser acessados. ou mesmo são obrigados a utilizar esta segurança para não terem problemas com auditorias ou. através do aplicativo Rcodekey.r) ou então deve-se inserir a senha de acesso num . Na segunda situação. A segurança de um produto pode ser feita de duas maneiras: no banco ou no sistema. botões) ou de acesso a campos (queries. cadastramos nossos usuários e grupos de usuários e definimos módulos. os mesmos devem. Este aplicativo insere nos programas compilados as informações que seriam . Porém. a fim de evitar que seus dados fiquem expostos ou corram o risco de serem alterados sem autorização. Na Datasul. Detalhamento No Progress existem dois tipos de objetos: os estáticos e os dinâmicos. ou seja. quando uma base de dados possui configurada a segurança de banco. para que os programas tenham acesso aos dados. ou ser compilados contra o banco que possui segurança (na compilação o Progress já inclui as senhas de acesso no . Objetos estáticos são aqueles que já estão resolvidos em tempo de desenvolvimento e o executável do programa já possui a informação de sua existência. buffers e tabelas).APÍTULO 8 tilizando os Estilos e suas Técnicas Construção de Programas 405 CAPÍTULO 16 Dicas de Desenvolvimento Segurança de Banco x Objetos Dinâmicos Objetivo Indicar os motivos pelos quais não deve-se utilizar objetos dinâmicos nos programas Datasul. atualmente. definimos que a segurança seria feita no sistema. igualmente. muitos de nossos clientes optam por utilizar a segurança de banco. Já objetos dinâmicos são aqueles que são criados em tempo de execução. Os objetos dinâmicos podem ser de tela (campos.

por essa razão. como query ou buffer.inseridas no . Além dos objetos dinâmicos. para evitar problemas nos clientes que utilizam segurança no banco de dados. Sendo assim. A utilização de objetos dinâmicos nos programas Datasul causa um problema em clientes que utilizam segurança em banco de dados. o Progress atualmente não tem como incluir os dados de segurança no . A figura abaixo representa o erro que ocorre nestas situações: . Deve-se sempre esgotar a busca por uma alternativa a utilização destes recursos. desaconselha-se a utilização de objetos dinâmicos de acesso a dados. por exemplo. Uma vez que o objeto só é criado em tempo de execução.r caso fosse feita à compilação contra o banco que possui segurança. os comandos de disable triggers também causam o mesmo problema com os clientes que utilizam segurança em banco de dados.r. deve-se evitar utilizar comandos de disable triggers em programas normais do produto. Apenas em casos especiais de programas que serão executados uma única vez. pois neste momento ele desconhece qual objeto a query ou buffer dinâmico representam.