ndice
CAPTULO 7
Traduo ......................................................................................................... 80
TRADUO MONO-IDIOMAS ................................................................ 80
Traduo de variveis com view-as nas telas .............................................. 80
Espao Extra para traduo em relatrios .................................................... 85
TRADUO MULTI-IDIOMAS ............................................................... 86
Nomenclatura Padro e Caractersticas do modelo...................................... 86
Pontos de traduo ....................................................................................... 88
Contextos de traduo .................................................................................. 88
Itens de Traduo ......................................................................................... 89
Sequncia de busca ...................................................................................... 91
UT-TRCAMPOS.P ...................................................................................... 92
UT-TRFRRP.P ............................................................................................. 92
UT-LSTIT.P ................................................................................................. 93
UT-LITER.P ................................................................................................ 94
UT-MSGS.P ................................................................................................. 95
UT-FIELD.P ................................................................................................ 96
UT-TABLE.P ............................................................................................... 97
UT-LTMNU.P ............................................................................................. 97
OBJETOS PROGRESS NO-INDEXADOS ............................................. 99
Traduo de variveis com view-as nas telas .............................................. 99
Espao Extra para traduo em relatrios .................................................. 103
PRTICAS PARA IMPLEMENTAO MULTI-IDIOMAS ................. 104
Caso Prtico Diferenas LIST-ITEMS para LIST-ITEM-PAIRS ............. 104
Caso converso de List-items para LIST-ITEM-PAIRS ........................... 107
Traduo automtica em frame de relatrio .............................................. 108
Traduzir valor armazenado em uma varivel ............................................. 109
Tratando lista enorme de traduo em includes ......................................... 110
CAPTULO 8
Construo de Programas utilizando os Estilos e suas Tcnicas ......... 115
Como construir um Cadastro Simples ....................................................... 115
Como construir um Cadastro Complexo.................................................... 117
Como construir um Cadastro Pai X Filho - Atualiza Filho........................ 121
Como construir um Cadastro Inclui/Modifica Filho .................................. 125
Como construir um Cadastro Pai X Filho - Atualiza Ambos .................... 131
Como construir um Cadastro Inclui/Modifica Filho .................................. 135
Como construir um Cadastro Inclui/Modifica Pai ..................................... 139
Como construir um CustomBrowser Inclui/Modifica ............................... 142
Como construir um CustomBrowser Zoom Wizard .................................. 144
ndice v
CAPTULO 1
Definio Antes do incio da converso de cada mdulo deve ser realizada uma reviso n
Dicionrio de Dados do MAGNUS verso I.00, que abrange os seguintes itens:
trocar os campos do tipo narrativa (exemplo: "x(76)" x10) nas tabelas por
campos view-as editor e formato "X(2000)";
criar os campos necessrios para limpar os campos do tipo char-1, dec-1,
int-1, etc...;
criar tabelas necessrias que hoje esto "camufladas" em arquivos
temporrios e/ou em tabelas no utilizadas;
para todos os campos que so indicadores, sejam de tipo de dado caracter
ou lgico, trocar por campo indicador correspondente com tipo de dado
inteiro. Exemplo:
DE PARA
Emitente.identific Emitente.identific
"C"liente 1
"F"ornecedor 2
"A"mbos 3
Campos Livres
Em todas as tabelas dos bancos de dados do produto Datasul-EMS 2.0,
existem no mnimo 10 campos livres, sendo 2 de cada tipo de dado, conforme
tabela abaixo:
Campo Livre Tipo de Dado
char-1 Caracter
char-2
data-1 Data
data-2
dec-1 Decimal
dec-2
int-1 Inteiro
int-2
log-1 Lgico
log-2
Os antigos campos livres so para uso do cliente, como por exemplo, u-char-1,
u-livre-1, no so mais implementados nas tabelas.
Validaes
as validaes de campo simples permanecem no Field Validation
(VALEXP), no dicionrio de dados, entende-se por validaes simples
aquelas que dependam apenas do dado informado do prprio campo, no
fazendo referncia a outros campos da tabela. Exemplo: item.descrio-1
<> "";
todas as validaes, inclusive as constantes no Field Validation dos
campos atualizados na tela, devem ocorrer no momento de confirmao de
gravao (botes OK, Gravar, GO of frame);
normalmente, feita a validao em um destes locais, pi-validate, quando
existirem mais de uma viewer ou na local-assign-record, quando for
apenas uma;
no implementar qualquer validao no evento de leave dos campos;
CAPTULO 1 Reviso do Dicionrio de Dados 5
CAPTULO 2
Estrutura de Diretrios
Datasul-EMS 2.0
Diretrios Contedo
\ADBRW Objetos Browsers do banco Administrativo
\ADGO Objetos "V para" do banco Administrativo
\ADINC Includes de campos indicadores do banco
Administrativo
\ADQRY Objetos Queries do banco Administrativo
\ADVWR Objetos Viewers do banco Administrativo
\ADZOOM\ Zooms do banco Administrativo
\AEP Programas do mdulo Aplicaes e Emprstimos
\APP Programas do mdulo Contas a Pagar
\BCP Programas do mdulo Coleta de Dados
\BHP Programas do mdulo Bancos Histricos
\BSP Programas do mdulo Benefcios Sociais
\BTB Programas do mdulo Bsico
\CBP Programas do mdulo Caixa e Bancos
\CCP Programas do mdulo Compras
\CDP Programas do mdulo Cadastro
\CEP Programas do mdulo Controle de Estoque
\CFP Programas do mdulo Configurador Produto
\CLBRW Objetos Browsers do banco Coletor de Dados
8
Investimentos
\IVQRY Objetos Queries do banco Investimentos
\IVVWR Objetos Viewers do banco Investimentos
\IVZOOM Zooms do banco Investimentos
\LAYOUT Layouts de Importao
\MASTERS Masters do SmartObjects
\MEN Mdulo Menu
\MIP Programas do mdulo Manuteno Industrial
\MPBRW Objetos Browsers do banco MultiPlanta
\MPGO Objetos "V para" do banco MultiPlanta
\MPINC Includes de campos indicadores do banco MultiPlanta
\MPP Programas do mdulo MultiPlanta
\MPQRY Objetos Queries do banco MultiPlanta
\MPVWR Objetos Viewers do banco MultiPlanta
\MPZOOM Zooms do banco MultiPlanta
\OFP Programas do mdulo Obrigaes Fiscais
\PANEL Painis dos SmartObjects
\PCP Programas do mdulo Planejamento Capacidade
\PDP Programas do mdulo de Pedidos
\PEBRW Objetos Browsers do banco Ponto Eletrnico
\PEGO Objeto "V para" do banco Ponto Eletrnico
\PEINC Includes de campos indicadores do banco Ponto
Eletrnico
\PEP Programas do mdulo Ponto Eletrnico
\PEQRY Objetos Queries do banco Ponto Eletrnico
\PEVWR Objetos Viewers do banco Ponto Eletrnico
\PEZOOM Zooms do banco Ponto Eletrnico
\PIP Programas do mdulo Planejamento Manuteno
Industrial
\PLP Programas do mdulo Planejamento
\PMP Programas do mdulo Plano Mestre
\PTP Programas do mdulo Patrimnio
\PVP Programas do mdulo Previso de Vendas
\QOP Programas do mdulo Cotao de Vendas
\REP Programas do mdulo Recebimentos
\RHBRW Objetos Browsers do banco Recursos Humanos
12
Datasul-HR 1.0
Diretrios Contedo
\DATABASE \INPM Includes de campos indicadores do banco MGPMG
\INPY Includes de campos indicadores do banco MGPYC
\INTM Includes de campos indicadores do banco MGTMA
\INUN Includes de campos indicadores do banco MGUNI
\TGPM \TAP Gatilhos de assign do banco MGPMG
\TCP Gatilhos de create do banco MGPMG
\TDP Gatilhos de delete do banco MGPMG
\TFP Gatilhos de find do banco MGPMG
CAPTULO 2 Estrutura de Diretrios 13
CAPTULO 3
Nomenclatura
Investimentos IN
Manuteno Industrial MI
MultiPlanta MP
Obrigaes Fiscais OF
Patrimnio PT
Pedidos PD
Planejamento PL
Planejamento Capacidade PC
Planejamento Manuteno Industrial PI
Plano Mestre PM
Ponto Eletrnico PE
Recebimento RE
Recebimento Internacional RI
Mdulo Sigla
Administrao de Treinamento AT
Benefcios BS
Cargos e Salrios CA
Desenvolvimento de Pessoal DS
Frias e Rescises FR
Folha de Pagamento FP
Ponto Eletrnico PE
Tipos de Atributos
Tipos de Atributos so classificadores para os tipos de informaes que so
gravadas. Segue abaixo, uma lista de todos os tipos de atributos, descries e
tipos de dados.
Tipo Descrio Tipo de Dado Formato Default
cb1 Cdigo de Barra Tipo 1 Integer >>>>>>>9
cb2 Cdigo de Barra Tipo 2 Integer >>>>>>>>>>>9
cb3 Cdigo de Barra Tipo 3 Character X(20)
cdd Cdigo - Decimal Decimal >>>,>>>,>>9
cdn Cdigo - Numrico Integer >>>,>>9
cod Cdigo Character X(8)
18
Dump-name de tabelas
O Dump-name de uma tabela, tem o formato "xx999", onde "xx" a sigla do
banco de dados do produto, no qual, a tabela armazenada, e 999 um
nmero seqencial nico dentro do banco de dados, Assim, a tabela "item" que
est no banco de dados industrial tem o dump-name "in172". importante
utilizar letras minsculas para a sigla da base de dados.
No existe processo automtico para determinar o nmero seqencial para a
tabela no banco de dados. Basta acrescentar uma unidade ao ltimo nmero j
utilizado.
Programas
A nomenclatura de um programa determinada em funo do seu tipo/estilo, e
a sua extenso .w, se possuir interface e .p, quando no. Entretanto dois
programas, mesmo se tiverem extenses diferentes, no podem ter o mesmo
nome de arquivo, porque na gerao do executvel .r, ambos tem o mesmo
nome do arquivo com extenso .r.
Todos os arquivos - sejam programas com extenso .p, includes com extenso
.i*, imagens, nomes de diretrios, etc., devero obedecer a regra imposta pelo
DOS para o seu nome, isto , o tamanho mximo do arquivo deve ter 8
caracteres e o tamanho mximo para a extenso deve ter 3 caracteres no
mximo.
Tambm, todos os nomes de arquivo dos programas devem estar em letras
minsculas.
Para os programas que so objetos (SmartObjects) e esto ligados a uma tabela
adota-se a nomenclatura abaixo:
Tipo do Objeto Diretrio destino Nomenclatura Exemplos para a tabela "item"
Browser xxbrw3 b99xx999.w4 bo01in172.w
Dialog xxdialog d99xx999.w d01in172.w
Go (V para) xxgo g99xx999.w g01in172.w
Query xxqry q99xx999.w q01in172.w
Viewer xxvwr v99xx999.w v01in172.w
Zoom (Pesquisa) xxzoom z99xx999.p z01in172.w
1
"xx999" o dump-name da tabela.
2
O gatilhos de assign do campo obedece a nomenclatura diferenciada pois podemos ter mais de um gatilho
assign por tabela, assim a parte 999999, no padro, um nmero seqencial de campos em todo o Datasul-
EMS 2.0.
3
"xx" a sigla do banco de dados da tabela principal do objeto.
4
"99" um nmero seqencial de objetos de um determinado tipo para uma tabela e "xx999" e dump-name
desta tabela.
20
Includes
Da mesma maneira que os programas, os includes, tambm, devem ter seus
nomes de arquivo em letras minsculas, e tambm, obedecem a algumas regras
5
"xx" indica a sigla do mdulo e "zz" caracteres de diferenciao entre programas e subprogramas.
6
Os caracteres "rp" so fixos para nomenclatura deste tipo de subprograma construdo atravs dos Estilos
relatrio e importao/exportao.
CAPTULO 3 Nomenclatura 21
Includes de programas
A nomenclatura destes includes dada em funo do seu grau de reutilizao:
Quando um include apenas utilizado por um mesmo programa/procedimento,
o nome deste include igual ao do programa, apenas com a extenso .i ou .i1 a
.i9. Exemplo: cdp/cd0206.i para cdp/cd0206.w ou advwr/v01ad102.i para
advwr/v01ad102.w.
Quando um include utilizado por vrios programas de um mesmo mdulo, o
nome deste include a sigla do mdulo mais um nmero seqencial,
geralmente acima de 9000. Exemplo: cep/ce9000.i.
Quando um include utilizado por vrios programas de vrios mdulos, o
nome deste include 'cd' mais um nmero seqencial. Exemplo:cdp/cd9500.i.
Includes padres
Os includes padres dos Estilos devem ser depositados no diretrio include, e
o seu nome de arquivo iniciar por "i-" mais um nome significativo, que indique
o estilo ou a funo. Exemplo: include/i-rpini.i.
Widgets
O padro de nomenclatura adotado um prefixo que identifique o widget mais
um nome significativo. A tabela de prefixo apresentada a seguir:
Widget Prefixo Exemplo
Boto bt- bt-ok
Browse br- br-zoom
Combo-box cb- cb-tipo-conta
7
"999999" um nmero seqencial de includes dentro do diretrio "varinc".
22
Variveis
Datasul-EMS 2.00
Quando uma varivel no for um widget o seu tipo de dados determina o
prefixo que deve ser utilizado para nomear as variveis, conforme tabela a
seguir:
Tipo de dado Prefixo Exemplo
Caracter c- c-conta
Inteiro i- i-contador
Data da- da-atualizacao
Decimal de- de-total-geral
Handle h- h-acomp
Lgico l- l-ativo
Raw raw- raw-param
Rowid rw- rw-
Widget-handle wh- wh-botao
Datasul-HR 1.00
A nomenclatura de varivel formada de acordo com a seguinte regra:
v_tipo de atributo_qualificador
Tipo de Atributo Qualificador Exemplo
Conforme tabela no item 4.3 Nome que qualifica a varivel V_cod_fornec
Frame f- f-cad
Parmetro p- p-rw-emitente
Stream s- s-import
Temporarytable tt- tt-param
Siglas de pases
Siglas de trs letras seguindo padro internacional que utilizado para
designar objetos e diretrios criados para localizao dos produtos nos pases:
Pas Prefixo Pas Prefixo
frica do sul saf Guiana Francesa guf
Argentina arg Haiti hai
Bahamas bah Honduras hon
Barbados bar Jamaica jam
Belize bel Mxico mex
Bolvia bol Nicargua nic
Brasil bra Panam pan
Canad can Paraguai par
Chile chi Peru per
Colmbia col Porto Rico por
Costa-rica cos Repblica Dominicana rep
Cuba cub San Vicente vic
El Salvador sal Santa Lucia luc
Equador ecu Suriname sur
Estados Unidos usa Trinindad-Tobago tri
Granada gra Uruguai uru
Guatemala gua Venezuela ven
Guiana gui
Adapters
A estrutura de diretrios e o nome dos adapters devem ser definidos com o
seguinte padro:
Diretrios: adapters/[nome do parceiro]/[cicla do mdulo 3 dgitos].
Nome: a[sigla do parceiro - 2 dgitos][sigla mdulo - 2 dgitos][inteiro
seqencial - 3 nmeros].p
Exemplo: adapters/neogrid/ccp/anecc102.p - adapter Neogrid do mdulo de
compras
25
CAPTULO 4
Layout de Telas
Observao No aconselhvel salvar uma Dialog com uma Window aberta. Quando isto
feito, possvel que o menu da Window seja copiado para a Dialog eliminando-o. Caso isto
acontea necessrio recriar a Dialog e o menu da Window.
Objetos
Combo-boxes
Ver captulo Como implementar campos indicadores com view-as combo-box
nas telas.
Retngulos
So utilizados para agrupar a chave de acesso das telas, agrupar campos de um
mesmo assunto, emoldurar itens de radio-set e emoldurar editores que
necessitem de label.
Botes
os botes com label devem ter:
altura: 1,00 unidade de caracter;
largura: 10, 15 ou 20 unidades de caracter;
quando representarem aes e possurem labels estes termos devem ser
verbos no infinitivo. Exemplo: Cancelar, Incluir, Modificar, Eliminar ...;
boto 'OK' sempre confirma a ao e sai da tela corrente;
boto 'Cancelar' no confirma a ao e sai da tela corrente;
boto 'Ajuda' sempre disposto no canto inferior direito nas janelas
detalhe e caixas de dilogo;
os botes de 'Sair' e 'Ajuda' devem estar sempre no canto superior direito
nas janelas pai.
Fill-ins
os campos e variveis view-as fill-in devem ter altura de 0,88 unidade de
caracter, excepcionalmente, os campos e variveis view-as combo-box tem
a altura de 1,00 unidade de caracter.
Frames(Telas)
ttulo das telas feito a partir do UT-9000.i, no necessitando interveno
do programador;
CAPTULO 4 Layout de Telas 27
CAPTULO 5
Estilos
Cadastro Simples
Cadastro Complexo
Caractersticas o menu de barra da janela contm apenas as opes para Atualizar, sem as
funes de 'Incluir', 'Copiar', 'Eliminar', como disposto no Cadastro
Simples.
CAPTULO 5 Estilos 33
Manuteno de Filhos
Caractersticas uma janela sem painis, podendo possuir ou no folders de acordo com
a necessidade, chamada a partir de um programa Pai x Filho, a janela a
mesma tanto para incluso quanto para alterao;
a janela possui quatro botes: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o boto de 'Ok' tem funo igual tanto para chamada do programa, para
incluso, quanto para modificao;
o boto de 'Salvar', quando o programa chamado para incluso, possui
funo de salvar o registro corrente e criar um registro novo;
o boto 'Cancelar', anula qualquer mudana feita no registro corrente do
programa, ou seja, cancela apenas a ltima incluso ou a ltima alterao;
o boto 'Ajuda' responsvel por chamar o help do programa.
36
Caratersticas tem as mesmas caractersticas da tela Pai x Filho - Atualiza Filho, alm de
que a atualizao no s feita no Folder como no registro pai;
o menu de barra da janela contm todas as opes disponveis atravs dos
botes dispostos na tela;
novas funes, que no estejam contempladas na palette padro de
navegao e atualizao, devem ser representadas por botes e itens no
menu de barra, quanto aos botes sugerido que sejam dispostos junto
rgua de botes no topo da janela (antes do boto de 'Consultas
Relacionadas');
Incluir, Modificar e Eliminar serve para manuteno da(s) tabela(s) filho;
as opes 'Incluir' e o 'Modificar', chamam janelas semelhantes ao
Cadastro Simples ou Complexo (sem a rgua);
Incluir, Modificar, Eliminar e Copiar serve apenas para manuteno da
tabela pai, as opes 'Incluir', 'Modificar' e 'Copiar, chamam janelas
semelhantes ao Cadastro Simples ou Complexo (sem a rgua).
CAPTULO 5 Estilos 37
Manuteno de Pais
Caratersticas uma janela sem painis, podendo possuir ou no folders, de acordo com
a necessidade, chamada a partir de um programa Pai x Filho, a janela a
mesma tanto para incluso quanto para alterao ou cpia;
a janela possui quatro botes: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o boto de 'Ok' tem funo igual tanto para chamada do programa, para
incluso, quanto para modificao;
o boto 'Salvar', quando o programa chamado para incluso, possui
funo de salvar o registro corrente e criar um registro novo;
o boto 'Ajuda' responsvel por chamar o help do programa.
38
Consulta Relacionamento
Caractersticas uma janela do tipo detalhe, isto , sem menu de barra emoldura,
simulando uma caixa de dilogo;
o boto 'Executar' tem como funo executar toda a parametrizao
realizada nos Folders;
o 'Fechar' do frame sai da tela;
o boto 'Ajuda' responsvel por chamar o help do programa;
Seleo: tudo que faixa;
Classificao: Radio-se com as opes;
Parmetros: com exceo da faixa, as outras informaes que o usurio
digita;
Digitao: browse updatable.
A seguir, esto demonstrados os folders de Seleo, Classificao, Parmetros
e Digitao:
CAPTULO 5 Estilos 43
44
CAPTULO 5 Estilos 45
Parmetros nicos
Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
o default-button do frame o boto de 'Ok', que confirma a escolha do
usurio;
o cancel-button do frame o boto de 'Cancelar' que sai da tela;
o boto 'Imprimir' responsvel por chamar o browse dos relatrios
relacionados;
o boto 'Ajuda' responsvel por chamar o help do programa.
Parmetros Mltiplos
Seguir as mesmas regras dos Cadastros Simples ou Complexo, dependendo do
nmero de campos.
Exemplo: Parmetros por estabelecimento.
46
Formao
Importao
Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
o boto 'Executar' tem como funo disparar a importao que foi
parametrizada nos folders;
possui quatro folders: Layout, Seleo, Parmetros e Log;
no folder de "Layout" mostrado o layout do arquivo a ser importado;
o boto 'Editar Layout' permite que seja editado o arquivo de layout
atravs de um editor de texto;
no folder de "Seleo" determinada a faixa dos registros que so
importados;
no folder de "Parmetros" determinado o nome do arquivo de entrada
contendo registros a serem importados no formato do Layout;
na pgina de "Log" determinado o nome do arquivo de sada que deve
gerar uma lista com todos os registros que forem importados ou somente
os rejeitados, contm ainda a determinao do modo de execuo do
mesmo.
CAPTULO 5 Estilos 49
Exportao
Caractersticas
CAPTULO 5 Estilos 51
Zoom de Tabelas
Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
default-button do frame o boto de 'OK', que confirma a escolha do
usurio;
cancel-button do frame o boto de 'Cancelar' que sai da tela, retornando
ao programa chamador porm sem retornar um registro escolhido;
o boto 'Implantar' responsvel por chamar o programa de cadastro da
tabela, que pode estar desativado dependendo do programa chamador;
ao lado do boto 'Implantar' que padro, devem ser colocados os botes
especficos de cada programa de zoom, por exemplo: Narrativa, Filtro,
Texto Livre, etc..., normalmente estes botes chamam caixas de dilogo;
V Para
Digitao Rpida
Caractersticas uma janela do tipo detalhe, isto , sem menu de barra e moldura,
simulando uma caixa de dilogo;
default-button do frame o boto 'Ok', que efetiva a transao;
cancel-button do frame o boto 'Cancelar' que sai da tela sem considerar
as informaes;
as pginas iniciais so reservadas para as informaes genricas;
a ltima pgina reservada para o browser.
Painis
Funes
Relatrios Relacionados
CAPTULO 6
UT-FIELD.I
Objetivo Retornar propriedades dos campos do dicionrio de dados, como label,
column-label, etc..
{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}
Utilizao
Onde:
<banco>: nome lgico do banco de dados que contm o campo
<tabela>: nome da tabela que contm o campo
<campo>: nome do campo
<propriedade>: nmero que identifica a propriedade conforme tabela a seguir:
Nmero Propriedade
1 Label
2 Column-Label
3 Help
4 Format
5 Initial
6 Description
7 Data Type
UT-RTLBL.I
Objetivo Permitir a utilizao de literais para colar labels em retngulos na tela
minimizando os problemas de internacionalizao.
Utilizao campos view-as radio-set ou editor, onde seja necessrio emoldur-lo com
retngulo com um label para identific-lo;
literais utilizados em telas para substituir labels;
{utp/ut-rtlbl.i <banco> <tabela> <campo> <widget fill-in>}
Formato
Onde:
<banco>: nome lgico do banco de dados que contm o campo
<tabela>: nome da tabela que contm o campo
<campo>: nome do campo
<widget fill-in>: fill-in view-as text colocado na tela
Exemplo:
{utp/ut-rtlbl.i mgadm conta natureza text-1}
UT-RUN.I
Objetivo Seu objetivo executar programas que no possuam interface (.p), atravs do
recurso de RPC (Remote Procedure Call). Deve executar apenas programas
(.p), chamados a partir de programas (.w). No deve chamar um programa (.p),
a partir de um outro programa (.p), como por exemplo um programa de
impresso de relatrios xxp/xx9999rp.p, porque o programa chamador (.p), j
est rodando no servidor (Application Server) e no necessrio iniciar um
novo servidor.
Utilizao Sempre que for chamado algum programa sem interface a partir de um .W e
que este programa seja candidato para ser executado via RPC.
Nota Para utilizar os includes necessrio relacionar ao programa os includes {utp/ut-glob.i} e
{btb/btb008za.io} no main-block, para definio de variveis e funes.
Onde:
{1}: nome externo do programa
{2}: parmetros do programa
{3}:mostra mensagem de acompanhamento [Opcional]
{4}: servidor de RPC determinado [Opcional]
Nota Para informar parmetros em branco ou literal, utilize aspas duplas ("") com aspas
simples (''). Exemplo: "" ' '.
No sendo informados os parmetros opcionais estes recebero "yes" e "" ' ' respectivamente.
Funes
solicita a conexo e cria a instncia do servidor, conforme servidor do
aplicativo ou parmetro;
mostra mensagem se ocorrer um erro (por exemplo, de conexo), quando
solicitada ({3} = yes);
dispara a execuo do programa no servidor;
encerra a conexo e elimina a instncia.
Aplicaes
Quando o programa API ser disparado uma nica vez para realizar todo o
processo.
Exemplo: {utp/ut-run.i cep/ceapi001.p "input-output table tt-
mvto, input-output table tt-erro, input yes "" ' '}
Modelo Aberto
Includes
{btb/btb008za.i1 {1} {2} {3}}
Onde:
{1} = nome externo do programa
{2} = mostra mensagem de acompanhamento
{3} = servidor de RPC determinado
{btb/btb008za.i2 {1} {2} {3}}
Onde:
60
Onde:
{1} = nome externo do programa
{2} = nome da varivel do tipo "handle" utilizada para eliminar a procedure
persistente [Opcional]
Funes
Idnticas ao Modelo Simplificado, porm distribudas em trs includes:
solicita a conexo e cria a instncia do servidor;
dispara a execuo do programa;
encerra a conexo e elimina a instncia.
Aplicaes
Quando o programa API disparado n vezes dentro de um lao (repeat, for
each...).
def var h-handle as handle no-undo.
Exemplo
{btb/ btb008za.i1 cep/ceapi001.p yes "rpc-test"}
for each cta_ctbl no-lock:
/* Prepara tt_movto */
{btb/btb008za.i2 cep/ceapi001.p "input tt_movto, output
tt_erro" "h-handle"}
end.
{btb/btb008za.i3 cep/ceapi001.p "h-handle"}
Nota Existe a API BTAPI008 que possui funes que podem ser utilizadas no
desenvolvimento.
Consideraes Caso no seja informado nenhum servidor RPC, ser utilizado o servidor RPC
Gerais definido no aplicativo do programa;
Se o processo estiver sendo executado via RPW e o servidor RPC no foi
informado o programa ser executado On-line.
CAPTULO 6 Includes e Utilitrios Padro 61
Quando informado valor parar servidor RPC, caso ocorra algum erro no ser
possvel a execuo On-line.
Ocorrendo erros na tentativa de execuo do programa (faltou passar
parmetros, por exemplo), estes sero retornados juntamente com a mensagem
16435 (*).
Quando for informada a varivel do tipo "handle" para a include
btb/btb008za.i2, deve-se tomar dois cuidados: Primeiro, esta varivel deve
estar previamente definida no programa. E segundo, ao final da execuo,
deve-se eliminar o programa persistent passando o nome da varivel para a
include btb008za.i3.
Existe a API que transporta o contedo das variveis de ambiente do
Datasul_EMS da sesso client para a sesso do application server (remota)
quando o programa solicita a execuo de determinado programa via RPC
(Remote Procedure Call). Logo, as informaes como usurio corrente, grupos
de segurana em que o usurio se encontra, empresa do usurio... estaro
disponveis na sesso remota.
Dados:
Nome Programa: btb/btb923za.p
Sintaxe: run btb/btb923za.p
(<verso_integrao>, <handle_application_server>)
Parmetros X Programa Servidor RPC Mensagem Comportamento
Comportamento Inexistente - Yes Exibe mensagem 3045(*) via
PI_STATUS_ERROR.
Inexistente - No Retorna mensagem 3045(*)
Existe e Executa - Yes Exibe mensagem 16431(*) via
RPC =no PI_STATUS_ERROR.
Existe e Executa Informado No Retorna mensagem 16431(*)
RPC =no
Existe e Executa No Informado No Executa ON-LINE
RPC =no
Existe e Executa Informado e Yes Exibe mensagem 16433(*) via
RPC =yes Inexistente PI_STATUS_ERROR.
Existe e Executa Informado e No Retorna mensagem 16433(*)
RPC =yes Inexistente
Existe e Executa No Informado e Yes Exibe mensagem 16432(*) via
RPC =yes Inexistente PIA_STATUS_ERROR.
Existe e Executa No Informado e No Executa ON_LINE
62
(*) Mensagens:
3045 - Programa no cadastrado no menu !
6160 - No foi possvel executar o programa via RPC !
16431 - Programa no pode ser executado via RPC
16432 - No foi possvel encontrar servidor RPC para programa '&1' !
16433 - Servidor RPC no cadastrado
16434 - Servidor RPC no disponvel
164 35 - No foi possvel executar programa !
(**) Ocorrendo erros na conexo do servidor RPC, estes sero exibidos em
tela juntamente com a mensagem 6160.
(***) Ocorrendo erros na conexo do servidor RPC, estes sero retornados
juntamente com a mensagem 6160.
UT-MSGS.P
Objetivo
CAPTULO 6 Includes e Utilitrios Padro 63
Onde:
<ao>: ao desejada, conforme a tabela a seguir:
Ao Resultado
show Apresenta a mensagem, com texto de ajuda no padro do produto
msg Retorna o texto da mensagem
help Retorna o texto de ajuda
type Retorna o tipo da mensagem (Erro, Advertncia, Informao ou Questo)
codtype Retorna o cdigo do tipo da mensagem
<nmero da mensagem>: nmero da mensagem desejada.
<parmetros>: so os campos, tabelas e outras palavras que se deseja colocar
na mensagem no momento de sua utilizao. Cada um dos parmetros deve ser
separado por "~~" como por exemplo:
input "campo~~" + varivel + "~~tabela".
64
UT-TABLE.I
Objetivo Retornar propriedades das tabelas do dicionrio de dados.
Utilizao nos SmartBrowsers ou Browsers para por label em campos calculados;
para utilizao de literais ou textos nas telas com funo de label, como no
retngulo que envolve o radio-set.
{utp/ut-table.i <banco> <tabela> <propriedade>}
Formato
Onde:
66
UT-LITER.I
Objetivo Utilizar o cadastro de literais do Datasul-EMS, cadastrando automaticamente
as literais utilizadas no programa e retornando a traduo da literal no idioma
corrente do banco de dados.
Utilizao em todos os lugares onde literais passveis de traduo forem apresentadas
na interface do programa.
{utp/ut-liter.i <literal> <modulo contexto> <alinhamento>}
Formato
Onde:
<literal>: Literal a ser utilizada na tela com os espaos substitudos por "_"
(undescore)
<mdulo contexto>: parmetro opcional que define o contexto de traduo da
literal, este contexto um mdulo do Datasul-EMS, se omitido a literal deve
ter o contexto universal de traduo, que representado pelo valor *
(asterisco)
<alinhamento>: parmetro opcional que define onde incrementado o espao
extra para traduo, conforme tabela abaixo, se omitido deve reservar o espao
esquerda da literal:
Tipo Alinhamento
L A esquerda
C Centralizado
R A direita
O retorno obtido atravs do return-value. Exemplo:
CAPTULO 6 Includes e Utilitrios Padro 67
UT-LIMIT.P
Objetivo Determinar o valor inicial e final de campos caracter, cujo formato varivel,
como por exemplo a conta-contbil.
Utilizao Na seleo de relatrios, clculos, atualizaes e zooms que tenham faixas de
seleo sobre campos caracter com formato varivel.
run utp/ut-limit.p (input <opo>,
Formato
<formato>).
Onde:
<opo>: indica o limite desejado, MIN = Mnimo e MAX = Mximo
<formato>: formato do campo caracter
O retorno obtido atravs do return-value.
Exemplo def var c-conta-ini as char no-undo.
find first param-global no-lock no-error.
run utp/ut-limit.p (input "MIN",
input param-global. formato-conta-contabil).
Assign c-conta-ini = return-value.
UT-GLOB.I
Objetivo Define as variveis globais.
Formato J est definido dentro dos SmartObjects.
Exemplo de i-ep-codigo-usuario: contm a empresa corrente do usurio.
variveis definidas l-implanta: varivel lgica usada no Zoom, para habilitar o boto implanta.
c-seg-usuario: contm o nome do usurio corrente logado no menu.
I-FREEAC.I
Objetivo
68
Onde:
<varivel>: varivel que ir armazenar o valor do retorno da funo fn-free-
accent
<string>: string acentuada a ser convertida.
{include/i-freeac.i}
Exemplo define var c-texto as char no-undo.
assign c-texto = fn-free-accent ("------
-").
message fn-free-accent("--~---yy--")
chr(10) c-texto view-as alert-box.
UT-DIR.P
Objetivo Este utilitrio deve ser usado sempre que o usurio tiver que informar um
diretrio.
run utp/ut-dir.p (input <ttulo>,
Formato output <pasta>,
output <cancelado>).
Onde:
<ttulo>: ttulo para a caixa de dilogo para selecionar diretrios
<pasta>: varivel do tipo caracter onde ser retornada a pasta selecionada
<cancelado>: uma varivel do tipo lgica onde deve ser retornado se a caixa
de dilogo foi cancelada ou no
Exemplo:
run utp/ut-dir.p (input "Escolha um diretrio",
output <pasta>,
output <cancelado>).
Onde:
CAPTULO 6 Includes e Utilitrios Padro 69
BTB917ZX.P
Objetivo Permitir a execuo de sons do tipo MID e WAV.
Instalao Como este programa utiliza os recursos de OCX, preciso que este OCX
esteja registrado e instalado na mquina que deve ser utilizado. Para fazer esta
instalao proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretrio \INTERFAC\SOM\;
clicar no boto de 'OK', quando for solicitado;
clicar no boto ;
clicar em 'Ok' para terminar.
run btb/btb917zx.p (input <som>).
Formato
70
Onde:
<som>: caminho completo do arquivo de som a ser executado
Exemplo:
run btb/btb917zx.p (input "c:\windows\media\start.wav").
BTB917ZY.P
Objetivo Permitir a visualizao dos seguintes tipos de imagens:
Bitmaps (*.bmp; *.dib);
Gif Images (*.gif);
JPEG Images (*.jpg);
Metafiles (*.wmf, *.emf);
Icons (*.ico, *.cur).
Nota As imagens em formato Bitmap (.bmp) devem possuir um correspondente de mesmo
nome no formato GIF (.gif) devido a uma restrio do WebEnabler
Instalao Como este programa utiliza os recursos de OCX, preciso que este OCX
esteja registrado e instalado na mquina que deve ser utilizado. Para fazer esta
instalao proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretrio
\INTERFAC\IMAGEM\;
clicar no boto de 'Ok', quando for solicitado;
clicar no boto: ;
clicar em 'Ok', para terminar.
run btb/btb917zy.p (input <imagem>).
Formato
Onde:
<imagem>: caminho completo da imagem a ser visualizada
Exemplo:
run btb/btb917zy.p (input "c:\windows\egito.bmp").
CAPTULO 6 Includes e Utilitrios Padro 71
BTB917ZZ.P
Objetivo Permitir a visualizao de vdeos do tipo AVI.
Instalao Como este programa utiliza os recursos de OCX, preciso que este OCX
esteja registrado e instalado na mquina que deve ser utilizado. Para fazer esta
instalao proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretrio
\INTERFAC\VIDEO\DISK1;
clicar no boto de 'Ok', quando for solicitado;
clicar no boto: ;
clicar em 'Ok', para terminar.
run btb/btb917zz.p (input <video>)
Formato
Onde:
<vdeo>: caminho completo do vdeo a ser apresentado
Exemplo:
72
UT-VRBIN.P
Objetivo Este utilitrio pode ser usado sempre que for necessrio saber a verso de um
programa compilado (.R).
run utp/ut-vrbin.p (input <arquivo>,
Formato input <acomp>,
output <versao>).
Onde:
<arquivo>: varivel do tipo caracter que ir conter o nome do arquivo
compilado a ser analisado
<acomp>: varivel do tipo lgica que ir definir se a pesquisa deve apresentar
a tela de acompanhamento ou no
<versao>: varivel do tipo caracter que ir receber a verso do programa
passado como parmetro
Exemplo:
run utp/ut-vrbin.p (input "c:\tmp\cd0101.r",
input no,
output c-versao).
UT-FINFO.P
Objetivo Este utilitrio pode ser usado sempre que for necessrio saber a data, a hora ou
o tamanho de um arquivo no Windows.
run utp/ut-finfo.p (input <arquivo>,
Formato
output <data>,
output <hora>,
output <tamanho>).
Onde:
<arquivo>: varivel do tipo caracter que deve conter o nome do arquivo a ser
analisado
<data>: varivel do tipo data que deve receber a data do arquivo que est
sendo analisado
<hora>: varivel do tipo caracter que deve receber a hora do arquivo que est
sendo analisado
<tamanho>: varivel do tipo inteira que deve receber o tamanho do arquivo
que est sendo analisado
Exemplo run utp/ut-finfo.p (input "c:\autoexec.bat",
output d-data,
output c-hora,
output i-tam).
UT-CMDLN.P
Objetivo Este utilitrio pode ser usado sempre que for necessrio saber informaes
mais detalhadas sobre a linha de comando usada para abrir a sesso corrente.
Esta funo pode ser muito til quando se deseja obter os valores dos
parmetros da sesso (ini, inp, basekey, etc ...).
run utp/ut-cmdln.p (output <linha-comando>).
Formato
74
Onde:
<linha-comando>: varivel do tipo caracter que ir receber a linha de comando
usada para abrir a sesso corrente
Exemplo:
run utp/ut-cmdln.p (output c-linha-comando).
UT-OSVER.P
Objetivo Esta tcnica pode ser usada sempre que for necessrio saber informaes mais
detalhadas sobre o Sistema Operacional (somente para Windows).
run utp/ut-osver.p (ouput <plataforma>,
Formato
output <versao>,
output <release>,
output <build>,
output <extrainfo>).
Onde:
<plataforma>: varivel do tipo caracter que ir receber o tipo plataforma
windows (Windows NT ou Windows 95/98)
<versao>: varivel do tipo inteira que ir receber, se houver, a verso do
Windows
<release>: varivel do tipo inteira que ir receber, se houver, a "release" do
Windows
<build>: varivel do tipo inteira que ir receber, se houver, o "build" do
Windows
<extrainfo>: varivel do tipo caracter que ir receber informaes extras sobre
o Windows (Verso do Service Pack, etc ...)
Exemplo run utp/ut-osver.p (output c-plataforma,
output i-versao,
output i-release,
output i-build,
output c-extrainfo).
I-COUNTDS.I
Objetivo Descobrir a quantidade de registros numa tabela de acordo a condio passada.
Utilizao Quando necessrio determinar a quantidade de registros numa tabela,
evitando que o OWNER seja includo antes do nome da tabela no
CAPTULO 6 Includes e Utilitrios Padro 75
Onde:
<varivel>: varivel que ir armazenar o resultado da consulta.
<condio>: clusa where que deve ser usada na consulta. Opcional.
<tabela>: tabela que deve ter o nmero de registros contados.
<banco>: banco de dados onde a tabela se encontra.
Exemplo DEF VAR iCount AS INT NO-UNDO.
{include/i-countds.i &BANCO=mgadm
&TABELA="cheque-pend"
&COND="WHERE cod-banco > 20"
&DEST=iCount}
message iCount view-as alert-box.
UT-WIN.I
Objetivo A UT-WIN.I define procedures para acesso a funes externas de APIs do
Windows.
Procedures Abaixo segue algumas das procedures definidas na include:
CreateProcess{&A}
GetComputerName{&A}
GetEnvironmentVariable{&A}
GetLastError
GetProfileString{&A}
GetSystemDirectory{&A}
76
GetWindowsDirectory{&A}
LoadLibrary{&A}
SetEnvironmentVariable{&A}
WinExec
GetCurrentDirectory{&A}
FindExecutable{&A}
ShellExecute{&A}
AdjustWindowRect
ClientToScreen
CreateModal
DeleteMenu
DrawMenuBar
FlashWindow
GetClientRect
GetMenuItemCount
GetParent
GetSystemMenu
GetWindowLong{&A}
GetWindowRect
InvalidateRect
RemoveMenu
SetCursorPos
SetWindowContextHelpId
SetWindowLong{&A}
SetWindowPos
ShowScrollBar
ShowWindow
SystemParametersInfo{&A}
GetUserName{&A}
ASSIGN
chrUserID = FILL(' ',256)
intSize = 255.
MESSAGE TRIM(chrUserID)
VIEW-AS ALERT-BOX.
CAPTULO 6 Includes e Utilitrios Padro 77
IF viWinHWND = 0 THEN
RUN GetParent (windowHandle:HWND, OUTPUT viWinHWND).
IF intResult = 1 THEN
MESSAGE "Environment Variable Has Been Changed" VIEW-AS ALERT-BOX.
ELSE
MESSAGE "Function Failed. Not Sure Why" VIEW-AS ALERT-BOX.
UT-TRACE.P
Objetivo Exibir em tela toda a lista de programas e procedures internas executadas at o
ponto de execuo deste aplicativo. semelhante ao stack trace do Progress,
disponvel nas mensagens de erro, com a vantagem que o desenvolvedor pode
escolher o ponto do programa para exibio da pilha de execuo.
Exemplo
80
CAPTULO 7
Traduo
TRADUO MONO-IDIOMAS
Este modelo utilizado at as verses EMS 2.04 e HR 2.07. Acima destas
releases deve ser utilizada a tcnica multi-idiomas especificada no prximo
item neste documento.
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
Observao Foi incorporada uma chamada para um include i-lgcode.i, cujo objetivo
determinar qual o idioma da instalao do Datasul-EMS 2.0.
**
*****************************************************/
{include/i-lgcode.i}
&IF "{&LANGUAGE-CODE}" = "POR" &THEN
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ESP" &THEN
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
/****************************************************
**
** var99999.i Varivel: cb-xxx Programa:xxp/xx9999.w
**
*****************************************************/
{include/i-lgcode.i}
&IF "{&LANGUAGE-CODE}" = "POR" &THEN
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ESP" &THEN
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
CERTO:
if cb-tipo:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 2} then ...
View-as Toggle- No caso dos toggle-boxes e fill-ins necessrio preparar a traduo dos
Box e View-as Fill- labels, e para isto pode-se usar o include utp/ut-field.i quando se tratar de uma
in varivel like ou ainda o include utp/ut-liter.i para aproveitar o cadastro de
literais.
Utilizando utp/ut-field.i:
{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}
assign <varivel>:label in frame {&frame-name} = return-
value.
Utilizando utp/ut-liter.i:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <varivel>:label in frame {&frame-name} = return-
value.
Help Sempre que estas variveis possuam 'help', este deve ter a preparao para
traduo atravs do include utp/liter.i, conforme o exemplo:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <variavel>:help in frame {&frame-name} = return-
value.
Side-Labels deve existir o tratamento do espao extra para traduo, que deve ser
reservado sempre esquerda do label.
{utp/ut-liter ____Total_Geral}
assign de-total-geral:label in frame f-total = return-value.
Cliente Descrio Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99
TRADUO MULTI-IDIOMAS
Este modelo utilizado a partir das verses EMS 2.05 e HR 2.08 ou
superiores.
Importante Para que o produto saiba que dialeto trabalhar na sesso corrente, existe na tabela
de usurios um campo chamado cod_dialeto que ir armazenar a informao do dialeto do
usurio, sendo possvel com isto em uma mesma instalao do produto vrios usurios
acessando com um idioma/dialeto diferente.
Pontos de traduo
Contextos de traduo
Itens de Traduo
tabela cad-literal no banco mguni. Esta chave utilizada pelo utilitrio ut-
field.p, que ser abordado ainda neste documento.
Sequncia de busca
UT-TRCAMPOS.P
Objetivo Realizar traduo automtica de telas. Este programa tem a funo de
pesquisar todos os objetos de uma tela Progress baseado em sua Window,
atravs da hierarquia existente, e realizar a chamada ao utilitrio ut-liter.p para
que sejam feitas as devidas tradues da interface. Este utilitrio reconhece
todas as frames que so filhas da window, e traduz todas os objetos presentes
nestas frames automaticamente.
Utilizao utilizado nos dois pontos de traduo dentro das templates:
InitializeInterface nas ThinTemplates
Adm-Initialize nos Smart Objects quando existe container definido.
Caso exista uma window que no seja de uma template padro Datasul, este
utilitrio poder ser chamado antes do view principal da frame do programa
para que a traduo automtica passe a ser realizada.
Este programa no espera nenhum parmetro de entrada, e deve ser chamado
diretamente atravs do fonte.
Ex: run utp/ut-trcampos.p.
UT-TRFRRP.P
Objetivo Difere do anterior porque realiza traduo automtica de uma nica frame,
apenas. Busca os itens de traduo apenas na hierarquia da frame que foi
passada como parmetro, buscando os objetos passveis de traduo e
realizando ento a chamada ao ut-liter.p e posterior atribuio do valor
traduzido retornado estes objetos, de forma automtica.
Utilizao Pode ser utilizado para traduzir Dialog-frames, frames de relatrio, ou
qualquer outra frame que se julgue necessrio.
CAPTULO 7 Traduo 93
Deve ser altamente utilizado para evitar alto nvel de trabalho quando da
necessidade de traduo de frames de relatrios devido a no existncia de
uma window que seja o pai destas frames nestes tipos de programas, no
podendo nestes casos ser utilizado o utilitrio anterior (ut-trcampos.p).
Ex: run utp/ut-trfrrp.p (input frame f-parametros:handle).
Obs: Quando o programa for um relatrio, existe um filtro no RTB que caso o
programa no possua nenhuma chamada a este utilitrio, esta ser feita de
forma automtica para todas as frames do relatrio antes do ponto padro de
leitura de registros desta template ou da definio do cabealho do mesmo, ou
seja, antes da include i-rpout.i ou i-rpcab.i respectivamente, dependendo da
estrutura do programa.
UT-LSTIT.P
Objetivo Converter uma String no indexada proveniente de um objeto Progress e
retorna seu contedo indexado e j traduzido no dialeto do usurio, para que
possa ser utilizado no programa chamador. Tem o objetivo de facilitar a
programao dentro da tcnica de traduo Multi-Idiomas minimizando a
necessidade de realizar tal tarefa diretamente no fonte do programa em
questo.
Utilizao Dever ser utilizado sempre quando da necessidade de uma converso de
valores de um objeto Progress no indexado para valores indexados, ou ainda,
converter valor de LIST-ITEMS para LIST-ITEM-PAIRS.
Sua utilizao deve ser da seguinte forma:
Sintaxe: run utp/ut-lstit.p (input-output cLista).
Onde cLista deve ser uma lista separada por "," provinda de uma das seguintes
situaes:
Include de domnio;
Valor populado de um for each;
List-items de um campo (Este apenas caso ainda no tenha passado pelos
pontos de traduo, ou j tenha passado e necessita ser repopulado devido
a uma lgica de negcio);
Sub-programa;
94
Qualquer fonte que gere uma lista separada por vrgula e que este ser
utilizada em algum objeto Progress no-indexado (Combo-Box, Selection-
List).
O programa ir retornar na mesma varivel informada os valores j indexados
e traduzidos, conforme exemplo abaixo:
Valor cLista antes: casado,solteiro
Valor cLista depois: married,casado,single,solteiro
Importante Com a tcnica de traduo Multi-Idiomas, tudo o que antes era LIST-ITEMS,
automaticamente convertido para LIST-ITEM-PAIRS nos pontos de traduo pelos programas
j mencionados, com isso, qualquer referncia a LIST-ITEMS destes campos aps os pontos de
traduo, devero ser retrabalhados para tratar a partir de agora, LIST-ITEM-PAIRS, tendo este
utilitrio como facilitador para esta implementao. Qualquer dvida adicional, verificar o item
abaixo que trata sobre LIST-ITEMS.
UT-LITER.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR. Este
sofreu alteraes para contemplar as novas funcionalidades do modelo de
traduo Multi-Idiomas, como novo conceito de contextualizao, hierarquia
de busca e dialetos das Strings.
Utilizao Para que no fosse gerado nenhum tipo de impacto sobre todo o legado de
programas com o antigo modelo do ut-liter, seu forma de chamada e
parmetros no foram alterados, mantendo o padro j conhecido e definido
neste manual.
Sintaxe: {utp/ut-liter.i <Literal> <Contexto> <Alinhamento>}
UT-MSGS.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR,
utilizado para apresentar as mensagens dos produtos Datasul. Este utilitrio
tambm sofreu alteraes para contemplar as novas funcionalidades descritas e
possui a caracterstica da busca por mensagens baseando-se no dialeto e no
contexto cadastrado para a mensagem.
Utilizao Para manter compatilidade com o legado existente nos produtos, sua sintaxe
foi mantida inalterada, conforme segue abaixo:
Sintaxe: run utp/ut-msgs.p (input <ao>
input <nmero da mensagem>
input <parmetros>).
Onde:
<ao> a ao que ser tomada pelo programa, podendo ser "show" para
mostrar, "msg" para retornar a mensagem, e "help" para retornar o help da
mensagem.
<nmero da mensagem> o nmero da mensagem
<parmetros> So os parmetros a serem substitudos na mensagem
Maiores detalhes podem ser consultados na referncia geral deste utilitrio
neste documento.
96
UT-FIELD.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores das propriedades dos campos do dicionrio de
dados, como label, description, etc. O que difere esta verso do modelo de
traduo Multi-Idiomas para a verso anterior que a busca no mais
realizada sobre o prprio dicionrio, e sim diretamente na tabela de strings
externas do produto, baseando-se na chave banco.tabela.campo.propriedade,
conforme mencionado em itens de traduo neste documento.
Utilizao Foi mantido basicamente para no gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substitudo pelo ut-liter,
devido sua maior facilidade de identificao e customizao futura pelo
usurio.
Sua sintaxe no foi alteradada, sendo ainda:
{utp/ut-field.i banco tabela campo propriedade}
UT-TABLE.P
Objetivo Utilitrio j existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores de propridades das tabelas do dicionrio de
dados, como desc, label, etc. O que difere esta verso do modelo de traduo
Multi-Idiomas para a verso anterior que a busca no mais realizada sobre
o prprio dicionrio, e sim diretamente na tabela de strings externas do
produto, baseando-se na chave banco.tabela.propriedade, conforme citado em
itens de traduo neste documento.
Utilizao Foi mantido basicamente para no gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substitudo pelo ut-liter,
devido sua maior facilidade de identificao e customizao futura pelo
usurio.
Sua sintaxe no foi alteradada, sendo ainda:
{utp/ut-table.i <banco> <tabela> <propriedade>}
onde propriedade :
Propriedade Descrio Observao
1 File-Label
2 Dump_name Continua
buscando do
banco
3 Desc
UT-LTMNU.P
Objetivo Novo utilitrio criado para a traduo de todos os itens de menu (Itens de
traduo de 1 a 7). Este utilitrio realiza a busca na tabela de strings externas,
98
**
********************************************************/
&glob val1 Devedora
&glob val2 Credora
{include/ind01-10.i} {1} {2}}
/* fim */
**
*****************************************************/
&glob val1 Devedora
&glob val2 Credora
{include/ind01-10.i} {1} {2}}
/* fim */
CERTO:
if cb-tipo:screen-value in frame {&frame-name} =
{varinc\var99999.i 04 2} then ...
Side-Labels deve existir o tratamento do espao extra para traduo, que deve ser
reservado sempre esquerda do label.
{utp/ut-liter.i Total_Geral}
assign de-total-geral:label in frame f-total = return-value.
Cliente Descrio Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99
Neste item estaro sendo abordados alguns casos prticos que podem ser
encontrados durante a execuo de uma implementao/alterao de
programas para a portabilidade do produto para a nova tcnica de traduo.
Abaixo segue demonstrao de alguns casos prticos onde ser possvel
identificar algumas das principais diferenas na forma de programar para a
tcnica de traduo Multi-Idiomas em relao ao modelo anterior.
"Retorno Beneficiamento",
Remessa Consignao",
"Faturamento Consignao",
"Devoluo Consignao",
"Reajuste Preo",
"Drawback" .
ASSIGN cb-tp-oper-terc:screen-value in frame fPage2 = entry(tt-
natur-oper.tp-oper-terc,cb-tp-oper-terc:list-items in frame
fPage2,",").
Antes:
assign cb-combo:list-items = {varinc/var00002.i 04 02}
Depois:
&if "{&FNC_MULTI_IDIOMA}" = "Yes" &then
assign cLista = {varinc/var00002.i 04 02}.
run utp/ut-lstit.p (input-output cLista).
assign cb-combo:list-item-pairs = cLista.
&else
assign cb-combo:list-items = {varinc/var00002.i 04 02}
&endif
Para este caso, deve ser chamado diretamente o utilitrio que realiza a traduo
atravs dos handles dos objetos presentes na relatrio frame em questo. Para
isto, dever realizar sua chamada ou imediatamente aps a definio da frame
ou antes da realizao do display da frame. Segue abaixo um exemplo de sua
aplicao:
form
skip(2)
c-lit-selecao no-label colon 55
skip(1)
tt-param.tp-etiq-ini format "zzzzzzzzz9" colon 60 "|<
>|"
tt-param.tp-etiq-fim format "zzzzzzzzz9" no-label
CAPTULO 7 Traduo 109
skip(1)
c-lit-impressao no-label colon 55
skip(1)
c-destino colon 60 "-"
tt-param.arquivo no-label format "x(30)"
with side-label stream-io width 132 frame f-fim.
Importante Sempre passar valores fixos e de variveis substituindo-se o " " (Branco) por "_"
(underline).
110
Esta a situao na qual ocorre o erro 135 quando a lista de valores enorme
e ultrapassa o limite de caracteres para uma atribuio. Para evitar isso foi
desenvolvida esta tcnica que modifica a forma de chamada das includes
varinc, alm de mudar a estrutura das includes responsveis pelo retorno.
Todas as includes da nomenclatura varinc/var99999.i so utilizadas para
definio da lista de valores e utilizam outra include para realizar o tratamento
do tipo de retorno escolhido pelo usurio, que pode ser um list-items de
COMBO-BOX, valores para RADIO-BUTTON, um nico elemento da lista,
entre outros. O retorno dos valores montado atravs de pr-processadores e o
valor destes so retornados todos de uma nica vez para uma varivel no
programa que incorpora a include. Sendo assim necessrio alterar a include
de retorno para gravar na varivel desejada os valores um por vez. Para tal,
necessrio gravar os valores dos pr-processadores da lista em uma temp-table
e realizar um FOR EACH nesta temp-table para gravar os valores um por vez,
a cada iterao do FOR EACH ou fazer um FIND diretamente no item
desejado.
As alteraes desta tcnica exigem um grande trabalho para adequar a include
de retorno na proposta das temp-table, porque necessrio popular a tabela
com os valores, sendo necessrio inclu-los um a um. Em compensao, o
trabalho de manipulao dos valores para retorno diminui, porque ao invs de
ficar concatenando uma lista enorme de pr-processadores basta apenas fazer
FOR EACH ou FIND na temp-table conforme a opo de retorno desejada.
Implementao As includes de retorno trabalham com 7 tipos de retorno atualmente:
1. View-as combo-box
2. View-as radio-set
CAPTULO 7 Traduo 111
Para cada um desses tipos de retorno, necessrio ler a temp-table que contm
os valores da lista. Esta temp-table deve ser definida dessa forma:
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val1}"
tt-list-items.posicao = 1.
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val2}"
tt-list-items.posicao = 2.
.
.
.
.
.
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val250}"
tt-list-items.posicao = 250.
END.
END.
CAPTULO 8
Construo de Programas utilizando os
Estilos e suas Tcnicas
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
Exemplo:
{include/okfil.i h_v06pd001}
na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e aps o run dispatch deve ser inserida a seguinte lgica:
find <tabela pai> where rowid (<tabela pai>) = v-row-
parent no-lock no-error.
if available <tabela pai> then do:
assign <tabela filho>.<chave pai> = <tabela pai>.<chave
pai>.
end.
Onde:
<tabela pai>: deve ser substitudo pelo nome da tabela pai da tabela que se
est utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substitudo pelo nome da tabela que deve estar sendo
utilizada no cadastro.
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'create-record':U ).
/* Code placed here will execute AFTER standard behavior. */
find order where rowid (order) = v-row-parent no-lock no-error.
if available order then
assign order-line.order-num = order.order-num.
Onde:
<nome buffer>: deve ser substitudo pelo nome que se deseja dar ao buffer da
tabela pai.
<tabela pai>: deve ser substitudo pelo nome da tabela pai da tabela que se
est utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substitudo pelo nome da tabela que est sendo
utilizada no cadastro.
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'add-record':U ).
/* Code placed here will execute AFTER standard behavior. */
def buffer b-customer for customer.
find b-customer where rowid(b-customer) = v-row-parent no-lock
no-error.
if avail b-customer then
assign order.cust-num:screen-value in frame {&frame-name} =
string(b-customer.cust-num).
else
assign order.cust-num:screen-value in frame {&frame-name} =
"".
Onde:
<nome buffer>: deve ser substitudo pelo nome que se deseja dar ao buffer da
tabela filho.
<tabela pai>: deve ser substitudo pelo nome da tabela pai da tabela que se
est utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substitudo pelo nome da tabela que est sendo
utilizada no cadastro.
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE (INPUT 'add-record':U ).
/* Code placed here will execute AFTER standard behavior. */
Exemplo:
{include/okfil.i h_v06pd001}
na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e aps o run dispatch deve ser inserida a seguinte lgica:
find <tabela pai> where rowid (<tabela pai>) = v-row-parent
no-lock no-error.
if available <tabela pai> then do:
assign <tabela filho>.<chave pai> = <tabela pai>.<chave
pai>.
end.
Onde:
<tabela pai>: deve ser substitudo pelo nome da tabela pai da tabela que se
esta utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa
<tabela filho>: deve ser substitudo pelo nome da tabela que deve estar sendo
utilizada no cadastro
<chave pai>: deve ser substitudo pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
/* Dispatch standard ADM method.
RUN dispatch IN THIS-PROCEDURE ( INPUT 'create-record':U ).
/* Code placed here will execute AFTER standard behavior. */
find order where rowid (order) = v-row-parent no-error.
if available order then
assign order-line.order-num = order.order-num.
{include/okpai.i h_v07pd002}
a query deve conter a tabela dos registros filhos que iro ser exibidos no
Cadastro PaiXFilho. Exemplo de query do browser:
Onde:
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 145
Exemplo:
assign input frame {&frame-name} c-inicial c-final.
Para:
assign input frame {&frame-name} fi-ini-cust-num fi-fin-cust-
num.
Source
' Link Type Target
h_folder PAGE THIS-PROCEDURE
h_p-navega NAVIGATION h_query
h_query RECORD h_viewer1
h_query RECORD h_viewer2
h_query RECORD h_viewer3
h_query RECORD h_viewer4
h_viewer-1 GROUP-ASSIGN h_viewer-2
h_viewer-1 GROUP-ASSIGN h_viewer-3
h_viewer-1 GROUP-ASSIGN h_viewer-4
h_p-exihel STATE h_query
h_p-navega STATE h_query
154
Boto to Top;
neste estilo, todo trabalho de traduo de labels, helps, screen-values
feito automaticamente por um include padro do estilo. Excees: list-
items do widget combo-box.
Preparao do Relatrio - Interface
1. Verificar quais as pginas que devem ser necessrias ao programa, se as
cinco pginas forem necessrias desconsiderar as tarefas 2, 3, 4 e 5.
2. Eliminar as frames das pginas desnecessrias com base na tabela acima.
3. Eliminar n imagens com as "orelhas" mais a direita, onde n o nmero de
pginas desnecessrias, renomeando as remanescentes conforme a tabela
acima.
4. Em 'Definitions' limpar o contedo dos preprocessadores das pginas
desnecessrias, assim se est informando ao estilo que estas pginas no
existem no relatrio. Exemplo, onde a pgina de digitao no
necessria:
&GLOBAL-DEFINE PGSEL f-pg-sel
&GLOBAL-DEFINE PGCLA f-pg-cla
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGDIG
&GLOBAL-DEFINE PGIMP f-pg-imp
Pgina de Seleo
1. Colocar os fill-ins de inicial e final, para cada campo que precisa de faixa.
A sugesto criar como 'Database Fields' e aps convert-los para
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 159
2. Caso seja necessrio implementar retngulos com label, estes labels devem
ser fill-ins view-as text, e o seu valor deve ser informado no seu initial e
private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
Pgina de Digitao
1. Em 'Definitions', corrigir a definio da temp-table de digitao tt-digita
inserindo os campos necessrios;
160
Observao Para mais detalhes sobre esta tcnica, ver captulo Como implementar Zoom e
campos de referncia para campos de chave estrangeira.
Pgina de Impresso
Na pgina de impresso no necessrio que se tenha qualquer funo
adicional para o seu correto funcionamento. Porm, se necessrio, seguir a
tcnica Como implementar Parmetros de Impresso em Relatrios.
Gravao e validao dos parmetros
1. Em 'Definitions' implementar os campos de parmetros e seleo na
definio da temp-table tt-param.
2. Na procedure 'pi-executar', colocar as validaes necessrias s opes do
usurio para execuo do relatrio no local indicado pelo comentrio,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 161
4. Nas selees, ao invs de utilizar a palavra "", para dar idia de faixa,
substitu-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na
tela de seleo, e que no necessitam ser traduzidos.
5. Todos os labels que no forem do dicionrio de dados e que apaream no
relatrio devem ser tratados atravs dos includes {utp/ut-liter.i}, {utp/ut-
field.i} ou ainda {utp/ut-table.i}.
6. Em todos os forms/frames de impresso deve-se colocar a clusula stream-
io.
7. Para utilizar a funcionalidade de impresso para arquivo RTF:
7.1. definir o prprocessador conforme abaixo:
&GLOBAL-DEFINE RTF YES
7.2. definir o prprocessador abaixo setando o tamanho da pgina:
&SCOPED-DEFINE pagesize N
N o nmero de linhas por pgina e por default seu valor 42.
Este nmero deve ser ajustado para cada relatrio conforme o tamanho
do modelo RTF que vai ser utilizado. Caso este tamanho no esteja
correto ocorrer problema na quebra da pgina.
7.3. a definio da temp-table tt-param deve ser idntica a definio da
mesma no programa de interface.
7.4. condicionar o VIEW das frames de cabealho/rodap no incio do
programa, para que quando o destino for para RTF as mesmas no
sejam apresentadas. Segue exemplo abaixo:
IF tt-param.l-habilitaRTF <> YES THEN DO:
VIEW STREAM str-rp FRAME f-cabec.
VIEW STREAM str-rp FRAME f-rodape.
END.
164
/* recebimento de parmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 165
CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.
/* definio de variveis */
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.
/* corpo do relatrio */
IF tt-param.classifica = 1 THEN DO:
FOR EACH order WHERE
order.sales-rep = tt-param.sales-rep AND
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 167
Order.Sales-Rep
Order.Ship-Date
Order.Carrier WITH FRAME f-customer.
DOWN STREAM str-rp WITH FRAME f-customer.
END.
END.
Parmetros
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 169
Cadastrando os
Parmetros
170
Consideraes Deve sempre ser observada o label e o valor default utilizada na tela do
sobre o programa original, pois muitas vezes o nome do campo no expressa em
cadastramento de detalhes o significado correto do mesmo.
campos
Exportao JOB Encontra-se no menu Tarefas do mdulo Job Execution e nessa opo fazemos
Execution (JE0104) a exportao dos parmetros e digitaes do programa que foi preparado para
ser executado neste mdulo, atravs do devido cadastramento de seus
parmetros e digitaes.
174
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler j registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.
Lista de Links:
Source
' Link Type Target
h_browse-formao STATE THIS-PROCEDURE
h_p-exihel STATE h_query
180
Seqncia
1. Criar browse origem:
definir query;
definir campos para display.
2. Colocar campos da tabela pai.
3. Criar browse destino:
criar uma temp-table (na seo definitions):
colocar nesta temp-table os atributos da tabela destino.
definir query (relacionando esta com a tabela pai) para a temp-table,
portanto esta deve ser uma freeform query;
definir campos para display.
4. Preencher pr-processor da seo de definies com o nome da tabela pai;
5. Acrescentar dentro da procedure local-initialize lgica para carregar a
temp-table com os registros que j existem na tabela de destino.
182
Boto To Top;
tambm, neste estilo, todo trabalho de traduo de labels, helps, screen-
values deve ser feito automaticamente por um include padro do estilo.
Excees: list-items do widget combo-box;
durante a importao, existem duas streams abertas, uma para importao
dos dados e outra para impresso do log;
o log de importao pode ser completo, na opo. 'Todos' ou imprimir
somente os registros que apresentaram erro, atravs da opo 'Rejeitados'.
184
Preparao do programa
1. Verificar quantas pginas so necessrias, as pginas de layout,
parmetros e log so obrigatrias, somente a pgina de seleo opcional,
caso haja seleo desconsiderar as tarefas 2, 3 e 4.
2. Eliminar a frame f-pg-sel.
3. Eliminar a imagens im-pg-log e renomear as imagens:
im-pg-par > im-pg-log
im-pg-sel > im-pg-par
4. Em 'Definitions' limpar o contedo dos preprocessadores PGSEL
&GLOBAL-DEFINE PGLAY f-pg-lay
&GLOBAL-DEFINE PGSEL
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGLOG f-pg-log
Pgina de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parmetros, informar neste o nome do
programa no formato XX9999 e a verso do layout no formato 999 (o
valor inicial da verso 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versolayout=001 }
Pgina de Log
No existem tarefas.
Gravao e validao dos parmetros
1. Em 'Definitions', implementar os campos de parmetros e seleo na
definio da temp-table tt-param.
2. Na procedure 'pi-executar', colocar as das pginas de parmetros e seleo,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
posicionar na pgina com problemas, colocando o focus no campo com
problemas.
Exemplo if input frame f-pg-par i-nr-nivel > 19 then do:
run utp/ut-msgs.p (input "show",
input 73,
input " ").
apply 'mouse-select-click' to im-pg-par in frame f-relat.
apply 'entry' to i-nr-nivel in frame f-pg-par.
return error.
end.
186
Boto To Top;
tambm, neste estilo, todo trabalho de traduo de labels, helps, screen-
values deve ser feito automaticamente por um include padro do estilo.
Excees: list-items do widget combo-box;
durante a exportao, existem duas streams abertas, uma para exportao
dos dados e outra para impresso do log;
Preparao do programa
1. Verificar quantas pginas so necessrias, as pginas de layout,
parmetros e log so obrigatrias, somente a pgina de seleo opcional,
caso haja seleo desconsiderar as tarefas 2, 3 e 4.
2. Eliminar a frame f-pg-sel.
3. Eliminar a imagens im-pg-log e renomear as imagens:
im-pg-par > im-pg-log
im-pg-sel > im-pg-par
4. Em 'Definitions' limpar o contedo dos preprocessadores PGSEL
190
Pgina de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parmetros, informar neste o nome do
programa no formato XX9999 e a verso do layout no formato 999 (o
valor inicial da verso 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versolayout=001 }
Pgina de Seleo
1. Colocar os fill-ins de inicial e final, para cada campo que precisar de
faixa. A sugesto cri-los como 'Database Fields' e aps convert-los
para variveis para obter automaticamente os labels, formatos e tamanhos
do dicionrio de dados.
2. Corrigir os 'initial values' das variveis de inicial e final.
3. Retirar possveis queries que o UIB automaticamente queira associar a
frame.
Pgina de Parmetros
1. Colocar as variveis necessrias na representao desejada (radio-set,
toggle-box, fill-in), definindo label, formato, initial e help para as mesmas.
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 191
2. Caso seja necessrio implementar retngulos com label, estes labels devem
ser fill-ins view-as text, e o seu valor deve ser informado no seu initial e
private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
3. Mudar o private-data e o initial do label "Arquivo de Entrada" do
retngulo para "Arquivo de Sada".
4. No on choose do bt-arquivo-entrada, pode ser adicionado um terceiro
parmetro na include i-imarq.i , onde possvel passar como parmetro os
filtros que sero utilizados na sistem dialog, se no for passado nada neste
parmetro a include assumira como padro o tipo de arquivo *.lst e todos
os tipos de arquivos.
Exemplo
DO:
{include/i-imarq.i c-arquivo-entrada f-pg-par "'*.XLS' '*.xls' , 'todos' '*.*'" }
END.
Pgina de Log
1. Remover o retngulo, o label e o radio-set com as opes "Todos" e
"Rejeitados".
2. Mover todos os outros objetos desta frame para cima. No esquecer do
boto "Configurar Impressora".
Gravao e validao dos parmetros
1. Em 'Definitions', implementar os campos de parmetros e seleo na
definio da temp-table tt-param.
2. Eliminar o campo todos da temp-table tt-param.
3. Na procedure 'pi-executar', colocar as validaes das pginas de
parmetros e seleo, lembrando que elas devem apresentar uma
mensagem de erro cadastrada, posicionar na pgina com problemas,
colocando o focus no campo com problemas.
Exemplo if input frame f-pg-par i-nr-nivel > 19 then do:
run utp/ut-msgs.p (input "show",
input 73,
192
por:
run utp/ut-vlarq.p (input frame f-pg-par c-arquivo-entrada).
if return-value = "nok" then do:
run utp/ut-msgs.p (input "show",
input 73,
input "").
apply 'mouse-select-click' to im-pg-log in frame f-
import.
apply 'entry' to c-arquivo-destino in frame f-pg-log.
return error.
end.
Sugesto Para que os campos sejam exibidos no tamanho adequado (altura 0.88) voc deve
alterar as seguintes propriedades:
1. No AppBuilder Acessar Options - Preferences
2. Selecionar o folder Grid Units
3. Alterar a opo Layout Units para Pixel
4. Preencher os campos com valor 1
Ou alterar o tamanho dos campos manualmente.
return 'ADM-ERROR':U.
{utp/ut-liter.i Preo * R}
assign Order-line.Price:label in frame {&frame-name} =
return-value.
{utp/ut-liter.i Pas * L}
assign cb-country:label in frame {*frame-name} = return-value
{pdinc/i01pd001.i 03}.
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ).
/* Code placed here will execute AFTER standard behavior. */
Observao Para os campos do tipo fill-ins, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e no tenha lupa como cursor do mouse ou um boto de
CAPTULO 8 Construo de Programas
utilizando os Estilos e suas Tcnicas 213
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opes acima, deve ser efetuado o registro para o WebEnabler, conforme tcnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler j registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possurem a lupa como cursor do mouse, ou que possurem um boto de zoom na sua direita.
Portanto no necessrio efetuar o registro para esses fill-ins.
214
CAPTULO 9
Validaes
Validaes de Tela
As validaes tm o objetivo de conferir as entradas de dados fornecidas pelo
usurio a um programa, de modo que estejam condizentes com o que o
programa pede e que no sejam passadas informaes errneas de modo a
prejudicar o andamento correto das operaes.
Validaes na Navegao de Registro
Em certos casos necessrio validar um registro assim que acessado atravs
da navegao na tabela. Este caso aplica-se para executar uma funo qualquer
como apresentar uma mensagem informativa ao usurio referindo-se quele
registro ou desabilitar o boto de alterao ou cpia.
Para que o boto de Modificao seja habilitado deve ser seguida a tcnica
Como habilitar ou desabilitar Botes em Painis.
Deve-se ter cuidado com esse tipo de validao, pois cada vez que o usurio
navegar na tabela, a validao ser feita podendo prejudicar a performance do
programa.
Validaes Antes da Alterao
Da mesma forma que nas Validaes na Navegao de Registro (item X.2).
existem casos em que necessrio validar um registro para permitir ou no a
sua alterao, porm em alguns desses casos a validao pode ser complexa e
demorada, consequentemente prejudicial a performance do programa.
Para evitar que a validao acabe afetando a performance do programa, deve-
se fazer a validao apenas quando houver a tentativa de alterao, incluindo o
cdigo a seguir antes do dispatch padro da procedure Local-Enable-Fields:
CAPTULO 9 Validaes 215
Onde:
<tabela>: a tabela que est sendo utilizada na manuteno
<condio>: uma condio qualquer que indica que o registro no pode ser
alterado
<mensagem>: uma mensagem a ser apresentada ao usurio informando
impossibilidade da alterao para o registro.
Observao Essa tcnica deve ser evitada, pois o usurio ver o boto de alterao habilitado
e ao tentar alterar o registro a mensagem ir interromp-lo, contradizendo a funo do boto.
Browse de Digitao
Os valores do browse de digitao devem ser validados no momento que o usurio sai do
registro, no evento Row-Leave do browse.
CAPTULO 10
Mensagens
Eliminao invlida!
Para auxiliar esta operao, o Sistema de Mensagens possui o boto Pesquisa,
onde voc pode buscar por Cdigo ou pelo Texto da Mensagem. Alm disso,
ainda possui a opo de Filtro onde voc informa palavras que deseja procurar
dentro do sistema.
no abreviar palavras sem necessidade (somente por questes de espao).
Exemplo:
Cond. Pagto.
Estabelec
Dt Ent Prev
Cod Dest Merc
Encer calc no efetuado.
no utilizar palavras ou jarges tcnicos. Exemplos:
Ttulo j existe no browse
Script do Automanager no encontrado.
utilizar o help da mensagem somente se necessrio, se houver algo a
acrescentar. No utiliz-lo, somente para repetir a mesma mensagem.
Exemplo:
Agncia no cadastrada. Help Agncia no cadastrada!
Item para debito direto - Help Item para debito direto.
procurar ser formal. No utilizar grias. Exemplo:
Linha Possui Ordens Valorizadas ! No pode alterar !
No utilizar o tratamento VOC.
utilizar somente o idioma portugus (com exceo de palavras tcnicas
especficas). Exemplo:
Parmetros
El cdigo de grupo informado no existe !
no utilizar sinais ortogrficos ou espaos em branco ao incio das
mensagens. Exemplo:
222
CAPTULO 11
Programas Reutilizveis
Procedures Internas
Procedures Internas reutilizveis so definidas em includes que devem ser
incorporados aos programas. Se forem incorporadas a programas .w, no
devem fazer acesso muito grande a dados pois se isto acontecer devem ser
transformadas em API(s). As procedures tratadas neste tpico diferem de
outras ou mesmo de outros includes pelo fato de serem documentadas
(posteriormente) em Manual Tcnico do Mdulo, e disponibilizadas para
clientes e parceiros da DATASUL.
Exemplo :
Clculo do valor presente de uma cotao de preos;
Converso de valores entre moedas;
Rotinas de Extenso.
Nomenclatura A nomenclatura dos includes que contm este tipo de procedure interna deve
ser a seguinte:
XXINC999.i, onde:
XX - Sigla do Mdulo
INC - Fixo
999 - Seqencial.
225
CAPTULO 12
Ferramentas
Application Compiler
O Application Compiler uma ferramenta Progress utilizada para compilar
arquivos.
Para iniciar o Application Compiler, deve-se estar com qualquer uma das
ferramentas Progress abertas (Data Dictionary, Procedure Editor, UIB ... ),
pressionar o menu Tools e em seguida o item Application Compiler. Sendo
ento, exibida a janela a seguir, na qual se deve informar os arquivos que se
deseja compilar e as opes de compilao.
226
Roundtable
O Roundtable uma ferramenta que facilita o controle de verso de
programas, objetos e includes.
Para a utilizao do Roundtable, deve-se seguir os passos descritos abaixo:
1. Selecionar a Workspace;
Observao: Caso essa opo no esteja habilitada certifique-se que a task esteja selecionada
ou se o objeto j est em uso por outra pessoa.
Para verificar se o objeto j est em uso Ir em Folder - Spec (que est na tela
principal do Roundtable) - na ltima label Event, que deve estar escrito 'Work
in process'.
CAPTULO 13
APIs
Funcionamento A API deve ser construda de forma que, receba parmetros e execute alguma
ao. A API, no deve ter tratamento com tela, deve ser sempre via troca de
parmetros. Isto facilita no momento da utilizao do RPC.
A entrada dos parmetros na API, deve ser da seguinte forma:
INPUT-OUTPUT PARAMETER TEMP-TABLE: este a nica
forma de comunicao de dados com a API, podendo-se utilizar
uma ou mais tabelas temporrias para faz-la.
Logo, dados como empresa, usurio, devem ser enviados para a API, atravs
da temp-table, de forma alguma pode ser utilizado os valores das variveis
globais definidas no ut-glob.i, ou qualquer outro tipo de varivel global.
O retorno da API, deve ocorrer das seguintes formas:
RETURN-VALUE: retornando OK ou NOK, para determinar o
sucesso completo (OK) ou parcial (NOK) ou nulo (NOK) da
execuo;
INPUT-OUTPUT PARAMETER TEMP-TABLE: pode-se
atualizar em um atributo da temp-table de entrada de dados com o
cdigo da mensagem de erro que ocorreu com o registro. Pode ser
utilizada tambm, uma temp-table somente de retorno, devolvendo
informaes ao programa chamador. Alm disto, pode ser
utilizada uma temp-table, parar retornar todos os erros ocorridos
com determinado registro.
Cabe ao projetista/programador, definir a forma que mais se adapta ao
programa a ser criado. As APIs devem ter a nomenclatura:
XXAPI999.P, onde:
XXX - indica o nome do mdulo
999 - um nmero seqencial de APIs dentro do mdulo.
A definio das temp-tables, deve ficar num include de nome semelhante ao
programa API, apenas com a extenso .I. Assim, se o programa API, tem o
nome externo MPAPI001.P, o include que contm as definies das temp-
tables de integrao tem o nome externo MPAPI001.I.
Verso de A API deve ter um controle interno para a verso corrente de integrao. Esta
Integrao verso fixa no programa API, sendo controlada pelo programador (deve ser
obrigatoriamente um nmero seqencial). Esta verso deve ser incrementada,
CAPTULO 13 APIs 235
Campo Descrio
cod-versao-integracao Nmero da verso de integrao
cod-transacao
log-replica-msg
cod-erro
CAPTULO 13 APIs 237
desc-erro
cd-maquina-local
Cdigo da API
/*************************************************************
** Programa : MPAPI001.P
** API responsvel por verificar se deve replicar transao nas
** mquinas remotas e por buscar cdigo da mquina local
**
*************************************************************/
{mpp/mpapi001.i}
def input-output parameter table for tt-replic-msg.
def var i-versao-integ as integer format "999" no-undo.
assign i-versao-integ = 001.
find first tt-replic-msg no-lock no error.
if avail tt-replic-msg then do:
if tt-replic-msg.cod-versao-integracao <> i-versao-integ
then do:
run utp/ut-msgs.p (input "msg",
input 3941,
input "")
assign tt-replic-msg.cod-erro = 3941
tt-replic-msg.desc-erro = return-value.
return "NOK"
end.
else do:
find first maq-dest-trans where maq-dest-trans. cd-
trans = tt-replic-msg.cod-transacao no-lock no-error.
if avail maqui-dest-trans then
assign tt-replic-msg.log-replica-msg = yes.
find first maquina where maquina.tp-conexao = 1 no-lock no-
error.
if avail maquina then
assign tt-replic-msg.cd-maquina-local =
maquina.cd-maquina.
else do:
run utp/ut-msgs.p (input "msg",
input 3942,
input "").
Assign tt-replic-msg.cod-erro = 3942
tt-replic-msg.desc-erro = return-value
tt-replic-msg.cd-maquina-local = 0.
Return "NOK".
end.
end.
238
end.
else
return "NOK".
/* fim */
/* API nova */
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3. + param-global.indic.
Observao O resultado obtido atravs da nova API deve ser, sempre que
possvel, idntico ao resultado da antiga.
Evoluo de lgica
de API , com
mudanas de
parmetros
240
Para este tipo de evoluo, deve ser criada uma nova API com o mesmo nome
da API antiga, acrescida de um diferenciador. EX.: UTAPI001.P
UTAPI001A.P.
Esta nova API deve possuir uma procedure interna EXECUTE, que receber
os novos parmetros e uma lgica.
A API antiga deve chamar a nova API de forma persistente e roda a procedure
interna EXECUTE, passando todos os antigos parmetros e um valor padro
para cada um dos novos parmetros.
Exemplo /* API antiga - UTAPI001.P */
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3.
Observao Os parmetros novos que so passados como padro para a nova API, devem
garantir que o resultado seja o mesmo da antiga API.
Evoluo de lgica
de API, com
alterao de
campos na temp-
tables de
parmetros
Para este tipo de evoluo, deve ser criada uma nova API com o mesmo nome
da API antiga, acrescida de um diferenciador. Ex.: UTAPI001.P
UTAPI001A.P.
Esta nova API deve possuir uma procedure interna EXECUTE, que receber
os novos parmetros e uma lgica.
A API antiga deve, primeiramente, copiar todos os campos da antiga temp-
table para a nova, chamar a nova API de forma persistente e rodar a procedure
interna EXECUTE.
Exemplo /* API antiga - UTAPI001.P */
define temp-table tt-clientes
field cliente as char.
define input param table for tt-clientes.
242
Observao Caso a temp-table seja input-output, no retorno da API evoluda, devem ser
repassados os registros da nova temp-table para a antiga.
CAPTULO 13 APIs 243
Observao Caso a temp-table antiga seja input-output, no retorno da API evoluda, devem
ser repassados os registros da nova temp-table para a antiga.
Evoluo de lgica
de API, com
mudana de
parmetros, que j
foi evoluda
244
Para este tipo de evoluo, deve ser criada uma nova procedure interna com o
mesmo nome da procedure interna antiga, acrescida de um diferenciador. Ex.:
EXECUTE EXECUTE2.
Esta nova procedure interna deve receber os novos parmetros e possuir toda a
lgica.
A procedure interna antiga deve chamar a nova procedure, passando todos os
antigos parmetros e um valor padro para cada um dos novos parmetros.
Exemplo /* API antiga - UTAPI001A.P */
procedure execute:
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
define input param param-3 as log no-undo.
if param-3 = yes then
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3.
end.
else do:
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3 + param-global.indic.
end.
end procedure.
Observao Os parmetros novos que so passados como padro para a nova procedure
interna, devem garantir que o resultado seja o mesmo da antiga procedure interna.
Evoluo de lgica
de API com
mudana de
parmetros, onde
no possvel
determinar um
valor padro para o
novo parmetro ou
o novo parmetro
obrigatrio
Para este tipo de evoluo, deve ser criada uma nova procedure interna ou API
com o mesmo nome da procedure interna antiga, acrescida de um
diferenciador, conforme exemplificando nos itens anteriores.
Como no possvel determinar valores padro, a procedure interna ou API
antiga deve retornar um erro para que o programa que o chamou emita uma
mensagem de erro explicando o motivo que a API no foi executada e qual o
motivo da obrigatoriedade de novo parmetro.
Exemplo /* API antiga - UTAPI001A.P */
procedure execute:
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
define input param param-3 as log no-undo.
run execute 2 (input param-1,
input param-2,
input param-3,
input 0).
end procedure.
246
procedure execute2:
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
define input param param-3 as log no-undo.
define input param param-4 as int no-undo.
if param-4 = 0 then
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3.
end.
else do:
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3 + param-4.
end.
end procedure.
Observao Isto somente deve ser feito caso no exista nenhuma maneira de definir um valor
padro para o novo parmetro ou o parmetro seja obrigatrio. A mensagem de que a API
possui uma nova verso com parmetro obrigatrio, deve ser somente apresentada no programa
chamador, e nunca na prpria API, j que as APIs no devem possuir eventos de interface. Esta
mensagem deve apresentar um erro dizendo que esta API est desatualizada e o motivo de sua
extino.
Evoluo de lgica
de API com
mudana de verso
de integrao
Para este tipo de evoluo, deve ser criada uma nova procedure interna ou API
com o mesmo nome da procedure interna antiga, acrescida de um
diferenciador, conforme exemplificando nos itens anteriores.
A antiga API deve retornar um erro para o programa chamador.
A nova API deve conter uma procedure interna que retorne a verso de
integrao para o programa chamador.
Exemplo /* API antiga - UTAPI001.P */
define input param param-1 as char no-undo.
define input param param-2 as int no-undo.
define input param param-3 as log no-undo.
find first param-global exclusive-lock no-error.
if avail param-global then
assign param-global.taxa = 0.3 * param-2.
248
Observao Esta tcnica pode ser utilizada quando as outras tcnicas citadas implicarem
muito na performance da API. Antes de rodar a nova API, o programa chamador deve rodar o
mtodo Get-Integration-Version da nova API e verificar se a verso est correta. Lembrar que,
qualquer mensagem para o usurio deve ser emitida pelo programa chamador e nunca pela API.
Importante Para novos programas que venham a utilizar a API utapi0001, recomendado
entrar em contato com a equipe de Suporte ao Desenvolvimento no ramal 7125 antes de utiliza-
l. Para os programas antigos que j utilizam essa API, no deve-se realizar nenhuma alterao
pois esto sendo feitas correes nessa API.
CAPTULO 13 APIs 249
UTAPI001.P
A API de gerao de grficos tem por finalidade exibir grficos de acordo com
os parmetros a ela passados.
Essa API constituda por uma include utp/utapi001.i, que contm as
definies das templates utilizadas pela prpria API e pelos programas que
iro utiliz-la, um programa, utp/utapi001.p, que a prpria API, e, objetos
no Progress contidos em interfac/grafico que fazem parte de Datgraph
(visualizador de grficos).
Maiores informaes podem ser obtidas na documentao da API de Gerao
de Grficos (doc-api/utapi001.doc).
Importante Para novos programas que venham a utilizar esta API,
recomendado entrar em contato com a equipe de Suporte ao Desenvolvimento
no ramal 7125 antes de utiliza-l. Para os programas antigos que j utilizam
essa API, no deve-se realizar nenhuma alterao pois esto sendo feitas
correes nessa API.
UTAPI002.P
A API utp/utapi002.p faz a integrao entre Progress e Microsoft Word 97,
permitindo a criao de arquivos, baseados em formulrios, para o Microsoft
Word.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre PROGRESS e Microsoft Word 97 (docapi/utapi002.doc).
Importante Para novos programas que venham a utilizar esta API,
recomendado que seja utilizado o programa utp/utapi012 ao invs deste.
UTAPI003.P
A API utp/utapi003.p faz a Integrao entre PROGRESS e Microsoft Excel
97, permitindo a construo de planilhas e, tambm, grficos.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre PROGRESS e Microsoft Excel 97 (docapi/utapi003.doc).
250
UTAPI004.P
Objetivo Permitir o envio de E-Mail ou FAX atravs do EMS 2.0 usando o MS-
Exchagne (OLE Automation).
Parmetros o primeiro parmetro deve ser endereo E-Mail do destinatrio (Exemplo:
"fulano@internet.com.br") ou o nmero do FAX (Exemplo:
"[FAX:9999999]");
o segundo parmetro deve ser o E-Mail ou o nmero do FAX para uma
"Cpia Carbono" (Cc);
o terceiro parmetro o Assunto (Subject);
o quarto parmetro a mensagem;
o quinto parmetro o arquivo anexo (attachment);
o sexto parmetro o Grau de Importncia, onde 0 Baixo, 1 Mdio,
2 Alto;
o stimo parmetro a Confirmao de Envio, ou seja, receber um E-Mail
quando o E-Mail foi enviado;
o oitavo parmetro a Confirmao de Leitura, ou seja, receber um E-
Mail quando o destinatrio tiver lido a mensagem;
o nono e ltimo parmetro o Acompanhamento, ou seja, verificar o
andamento do envio de E-Mail (UT-ACOMP);
run utp/utapi004.p (input "fulano@internet.com.br",
Exemplo input "",
input "Manual",
input "Mensagem do manual ... ",
input "c:\autoexec.bat, c:\config.sys",
input 0,
input no,
input no,
input yes).
UTAPI005.P
Objetivo Permitir o envio de E-Mail atravs do EMS 2.0 usando um servidor UNIX ou
qualquer outro servidor com suporte ao protocolo SMTP.
Parmetros Devem ser passados oito parmetros para este programa:
o primeiro parmetro deve ser o endereo IP do servidor de E-Mail que
pode ser adquirido da tabela de Parmetros Globais do Sistema (param-
global serv-mail);
o segundo parmetro deve ser a porta do servidor de E-Mail, que tambm
pode ser adquirida na tabela de Parmetros Globais do Sistema (param-
global.porta-mail);
o terceiro parmetro deve ser o remetente (Exemplo: "fulano");
o quarto parmetro deve ser o endereo E-Mail do destinatrio (Exemplo:
"fulano@internet.com.br");
o quinto parmetro deve ser o E-Mail para uma "Cpia Carbono" (Cc);
o sexto parmetro o Assunto (Subject);
o stimo parmetro a mensagem;
o oitavo parmetro, caso esteja enviando E-Mail via UNIX, deve ser o
diretrio para a criao do SCRIPT de envio de E-Mail, seno, pode ser
deixado em branco.
run utp/utapi004.p (input "172.16.1.89",
Exemplo input 25,
input c-from,
input c-to,
input c-cc,
252
input c-assunto,
input c-mesg,
input "").
Retorno Se o retorno (return-value) desse programa for igual a Ok, o mail foi enviado
com sucesso, seno algum erro ocorreu no envio ou os parmetros passados
no esto corretos.
Configurao Para que o programa de envio de E-Mail funcione preciso que esteja
cadastrado corretamente o endereo IP do servidor de E-Mail e a sua porta nos
Parmetros Globais do Sistema.
Observao O programa permite enviar um E-Mail para vrias pessoas. Para isto deve-se
passar cada nome separado por "," (vrgula) ou por ";" (ponto e vrgula). O mesmo acontece para
a Cpia Carbono.
Exemplo: fulano@internet.com.br, beltrano@internet.com.br". O assunto e a mensagem podem
ser passadas em branco.
Exemplo: ("") O remetente nunca pode conter espaos em branco.
Instalao Para que o programa de envio de E-Mail funcione, deve ser executado o
arquivo INSTALA.BAT, que se encontra no diretrio \INTERFAC\MAIL.
CAPTULO 13 APIs 253
UTAPI006.P
A API utp/utapi006.p permite a busca de dados de uma planilha Excel para o
Progress.
No programa responsvel por buscar os dados deve ser feita a incluso do
include: utp/utapi006.i, onde esto as definies das temp-tables que devem
ser passadas como parmetros API utp/utapi003.p.
A chamada da API deve seguir o padro abaixo:
run utp/utapi006.p (input-output table tt-dados,
output table tt-erros).
UTAPI007.P
A API utp/utapi007.p permite o uso de funes do Excel, para retornar os
resultados para um programa Progress.
No programa responsvel por usar esta API deve ser feita a incluso do
include: utp/utapi007.i, onde esto as definies das temp-tables que devem
ser passadas como parmetros API utp/utapi007.p.
A chamada da API deve seguir o padro abaixo:
run utp/utapi007.p (input-output table tt-dados,
output table tt-erros).
UTAPI008.P
Nome Fsico: utp/utapi008.p
Nome do Include com os Parmetros: utp/utapi008.i
Verso de Integrao: 001
Objetivo
254
UTAPI009.P
Nome Fsico: utp/utapi009.p
Nome do Include com os Parmetros: utp/utapi009.i
Verso de Integrao: 001
Objetivo Envio de mensagens atravs do servidor de correio eletrnico e envio de FAX
atravs de servidor de FAX.
Maiores informaes podem ser obtidas na documentao da API de Envio de
FAX/E-mail (docapi/utapi009.doc).
Importante Para novos programas que venham a utilizar esta API,
recomendado que seja utilizado o programa utp/utapi019 ao invs deste.
UTAPI010.P
Nome Fsico: utp/utapi010.p
Nome do Include com os Parmetros: utp/utapi010.i
Verso de Integrao: 001
Objetivo Permitir que impressoras cadastradas no EMS sejam utilizadas em programas
compilados contra os bancos do MAGNUS.
Maiores informaes podem ser obtidas na documentao da API para
Compartilhar Impressoras do EMS com Programas Magnus
(docapi/utapi010.doc).
CAPTULO 13 APIs 255
UTAPI011.P
Nome Fsico: utp/utapi011.p
Nome do Include com os Parmetros: utp/utapi011.i
Verso de Integrao: 003
Objetivo A API de gerao de grficos tem por finalidade exibir grficos de acordo com
os parmetros a ela passados.
Maiores informaes podem ser obtidas na documentao da API para
Criao de Grficos (docapi/utapi011.doc).
Importante Para novos programas que venham a utilizar esta API,
recomendado entrar em contato com a equipe de Suporte ao Desenvolvimento
no ramal 7125 antes de utiliza-l. Para os programas antigos que j utilizam
essa API, no deve-se realizar nenhuma alterao pois esto sendo feitas
correes nessa API.
UTAPI012.P
Nome Fsico: utp/utapi012.p
Nome do Include com os Parmetros: utp/utapi012.i
Verso de Integrao: 001
Objetivo Criao de arquivos, baseados em formulrios, para o Microsoft Word. Sendo
que os parmetros recebidos so utilizados para preencher os campos de
formulrio existentes no documento.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Word (docapi/utapi012.doc).
256
UTAPI013.P
Nome Fsico: utp/utapi013.p
Nome do Include com os Parmetros: utp/utapi013.i
Verso de Integrao: 001
Objetivo Faz a Integrao entre Progress e Microsoft Excel, permitindo a construo de
planilhas e, tambm, grficos.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Excel (docapi/utapi013.doc).
UTAPI018.P
Nome Fsico: utp/utapi018.p
Nome do Include com os Parmetros: utp/utapi018.i
Verso de Integrao: 001
Objetivo Atualizao de arquivos para o Microsoft Excel e retorno de informaes para
o Progress..
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Excel (docapi/utapi018.doc).
UTAPI019.P
Nome Fsico: utp/utapi019.p
Nome do Include com os Parmetros: utp/utapi019.i
Verso de Integrao: 001
Objetivo Envio de mensagens atravs do servidor de correio eletrnico e envio de FAX
atravs de servidor de FAX.
Maiores informaes podem ser obtidas na documentao da API de Envio de
FAX/E-mail (docapi/utapi019.doc).
CAPTULO 13 APIs 257
UTAPI027.P
Nome Fsico: utp/utapi027.p
Nome do Include com os Parmetros: utp/utapi027.i
Verso de Integrao: 001
Objetivo Criao de documentos, baseados em formulrios para o Microsoft Word,
sendo que a deciso de gravar ou no o documento caber ao usurio final.
Maiores informaes podem ser obtidas na documentao da API de
Integrao entre Progress e Microsoft Word (docapi/utapi027.doc).
UTAPI028.P
Nome Fsico: utp/utapi028.p
Nome do Include com os Parmetros: utp/utapi028.i
Verso de Integrao: 001
Objetivo Envio de compromisso do tipo reunio via Microsoft Outlook.
Maiores informaes podem ser obtidas na documentao da API de Envio de
compromisso via Outlook (docapi/utapi028.doc).
UTAPI029.P
Nome Fsico: utp/utapi029.p
Nome do Include com os Parmetros: utp/utapi029.i
Verso de Integrao: 001
Objetivo A API de Integrao com excel tem como funo gerar cdigo javascript para
gerar planilhas e grficos no excel em programas estilo pai x filho.
Maiores informaes podem ser obtidas na documentao da API de
Integrao com Excel Web (docapi/utapi029.doc).
258
APAPI009.P
Nome Fsico: app/apapi009.p
Nome do Include com os Parmetros: app/apapi009.i
Verso de Integrao: 001
Objetivo Consistir os parmetros passados e caso estejam Ok atualizar os pagamentos.
Consideraes devem ser passadas 1 (uma) temp-table de entrada e 1 (uma) de sada
Gerais contendo as informaes para atualizao dos PFs;
todas as temp-tables so passadas como parmetro atravs dos comandos
INPUT TABLE ou OUTPUT TABLE.
Exemplo:
run utp/utapi008.p (input table tt-referencia,
output table tt-erro-pef).
Atributo Descrio
i-ep-codigo Empresa do pagamento
c-referencia Referncia a ser atualizada
cod-versao-integ Verso de integrao
CAPTULO 13 APIs 259
Parmetros de Sada
Temp-table tt-erro-pef: sero gerados registros nesta temp-table quando tt-
referencial.l-vid-rel=yes com o cdigo do erro, descrio e informaes dos
registros com inconsistncias.
TEMP-TABLE TT-ERRO-PEF
Atributo Tipo Formato Valor Inicial Obrigatrio
i-cod-erro Integer 9999999 Sim
c-desc-erro Character "x(70)" Sim
c-arquivo-erro Character "x(100)" No
Atributo Descrio
i-cod-erro Cdigo da mensagem de erro
c-desc-erro Descrio da mensagem de erro
c-arquivo-erro Informaes com inconsistncias
Execuo
O programa app/apapi009.p ir primeiramente validar a verso de integrao:
Validao: Verso de Integrao
O programa ir verificar se o programa chamador est ntegro com a API, e
isto ocorre atravs da verificao da verso de integrao passada como
parmetro atravs da temp-table tt-referencia (campo cod-versao-integ). Caso
a verso esteja incompatvel, a API abortar a execuo retornando atravs da
temp-table tt-erro-pef o cdigo de erro 3941.
Nmero do Erro Mensagem Ajuda
3941 Verso de integrao incorreta ! Averso de integrao informada
atravs dos parmetros internos
incompatvel com a verso atual da
API. Favor contatar suporte tcnico.
Alm da verso de integrao so efetuadas, tambm as seguintes
consistncias.
Nmero do Erro Mensagem Ajuda
774 Empresa &1 no cadastrada Empresa &1 no cadastrada.
260
CAPTULO 14
Portabilidade de RCODES
Outra soluo para este problema, usar o comando PUT, pois o mesmo no
usa FRAME.
output to value(c-arquivo)
find emitente where emitente.cod-emitente = 10 no-lock.
put emitente.cod-emitente.
Caso em Especial
A partir da regra de no utilizar comandos que criam FRAMES explcitas ou
implcitas, alguns problemas foram detectados com a descoberta de comandos
que criam, por algum motivo, FRAMES implcitas.
CAPTULO 14 Portabilidade de RCODES 263
CAPTULO 15
Tcnicas
{include/i-win.i}
Observao A utilizao do ImageList necessria para que o programa possa ser executado
pelo WebEnabler. Na ausncia do mesmo o programa executar sem imagens.
PSTimer Este controle permite que sejam programadas execues de uma rotina dentro
de determinados intervalos de tempo. Para interagir com esse objeto voc deve
utilizar o evento Tick do mesmo. Esse evento disparado sempre que se
passar o intervalo de tempo determinado na propriedade Interval.
Esse componente j acompanha o Progress e por isso no precisa ser instalado,
o arquivo que possui esse componente PSTIMER.ocx. O nome do
componente a ser utilizado Progress Timer Control.
Propriedades
Enabled uma propriedade do tipo Lgico (true/false), sempre que
for setado para true o evento Ticker ser disparado aps o intervalo de
tempo determinado.
Sintaxe: <com-handle>:Controls:Item(1):ENABLED.
chCtrlFrame:Controls:Item(1):ENABLED = TRUE.
Interval uma propriedade do tipo Integer e nela especifica-se qual
o intervalo de tempo(em milisegundos) que se quer esperar entre uma
ocorrncia do evento Ticker e outra. Caso o valor setado seja 0 no
ser disparado o evento.
Sintaxe: <com-handle>:Controls:Item(1):Interval.
chCtrlFrame:Controls:Item(1):Interval = 50.
Evento
CAPTULO 15 Tcnicas 273
Sintaxe: <com-handle>:Tela_Limpar().
chCtrlFrame:UColunas:Tela_Limpar().
Linhas_Trocar_Estilo Utilizando esse mtodo podemos alterar os
estilos das linhas dos grficos, basta invocar o mtodo e passar um
valor inteiro para definir o estilo da linha.
Os estilos de linha so: 1 Sem linha; 2 Pontilhado; 3 Tracejado; 4
Linhas.
Sintaxe: <com-handle>:Linhas_Trocar_Estilo (Valor AS Integer).
chCtrlFrame:UColunas:Linhas_Trocar_Estilo (4).
Valor_Maximo_Setar Esse mtodo permite que seja definido qual o
valor mximo das colunas do grfico.
Sintaxe: <com-handle>: Valor_Maximo_Setar (Valor AS
FLOAT,Character-c_format ).
chCtrlFrame:UColunas:Valor_Maximo_Setar (10,">>>>>,>>9.99").
Colunas_Criar Este mtodo permite a criao de grupos de coluna
sendo que cada grupo composto por no mximo 5 colunas.
Sintaxe: <com-handle>: Colunas_Criar (Id AS SHORT, val1 AS
FLOAT, val2 AS FLOAT, val3 AS FLOAT, val4 AS FLOAT, val5
AS FLOAT, Character-leg_x1, Character-leg_x2).
Onde:
<Id>: o identificador de cada grupo.
<val1 val5>: o valor correspondente de cada coluna do grupo.
<leg_x1 e leg_x2>: So as legendas que podem ser atribudas para os
grupos de colunas do componente.
Exemplo: chCtrlFrame:UColunas:Colunas_Criar (1, 10, 9, 8, 7, 6,
"Teste1", "Texto 2").
Objetos_Mostrar Mtodo que exibe os grupos de colunas criados na
tela.
Sintaxe: <com-handle>:Objetos_Mostrar().
chCtrlFrame:UColunas:Objetos_Mostrar().
Coluna_Selecionada Este mtodo retorna uma string com o
identificador + posio da coluna no grupo. Essa string permite
identificar unicamente cada uma das colunas.
Sintaxe: <com-handle>:Coluna_Selecionada().
chCtrlFrame:UColunas:Coluna_Selecionada().
CAPTULO 15 Tcnicas 279
ProgressBar Como o prprio nome sugere, trata-se de um componente OCX que exibe a
barra de progresso de um determinado procedimento que esteja sendo
executado.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Grafico\ e o arquivo que possui esse componente COMCTL32.ocx.
O nome do componente a ser utilizado Microsoft ProgressBar Control,
version 5.0.
Min Nessa propriedade do objeto definimos qual o valor mnimo
que a barra pode assumir.
Sintaxe: <com-handle>:Min.
ASSIGN chctrlframe:ProgressBar:Min = 0.
Max Por meio dessa propriedade definimos qual o maior valor que
a barra de progresso poder assumir. importante que se controle o
valor da barra para que no ultrapasse o valor mximo, pois isso causa
erro.
Sintaxe: <com-handle>:Max.
ASSIGN chctrlframe:ProgressBar:Max = 10.
Value Value propriedade do componente onde podemos obter o
valor atual que a barra est exibindo ou que podemos informar qual o
novo valor que a barra deve exibir o progresso do processo..
Sintaxe: <com-handle>:Value.
ASSIGN chctrlframe:ProgressBar:Value =
chctrlframe:ProgressBar:VALUE + 1.
Sound Componente que possibilita e execuo de arquivos de sons como wav e mid
em aplicaes progress. Possui a propriedade arquivo que informa ou recebe
o nome do arquivo est sendo executado ou que ir ser executado, e a
propriedade comando que recebe ou informa o comando que est sendo
executado.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\som\ e o arquivo que possui esse componente DATSOUND.ocx. O
nome do componente a ser utilizado DatasulSound.Sound.
Exemplo:
ASSIGN chCtrlFrame:Controls:Item(1):arquivo = "c:/tmp/som1.wav".
ASSIGN chCtrlFrame:Controls:Item(1):comando = "sound".
CAPTULO 15 Tcnicas 283
Print Chart Componente OCX destinado ao tratamento dos parmetros de impresso para
outros componentes OCX.
O diretrio onde se encontra o pacote para instalao desse componente em
\interfac\Print Chart\ e o arquivo que possui esse componente
PRINTCHART.ocx. O nome do componente a ser utilizado Print Chart
Activex Control.
Seus principais mtodos e propriedades so:
HWNDFLOW Esse mtodo utilizado para armazenar o
componente que possui os dados a serem impressos.
Sintaxe: Get: [Integer-Var =] <com-handle>:hWndFlow.
Set: <com-handle>:hWndFlow [ = Integer-Var ].
Exemplo: chPrn:hWndFlow = chOrg:hwnd .
Onde chOrg o componente que possui os dados a serem impressos.
Height: 1,25
deixar o boto sem label;
inserir o Help:"Corretor ortogrfico" no boto para implementar o
Tooltip;
definir a varivel 1-control-spell em Definitions. Exemplo:
define variable l-control-spell as logical no-undo init no.
Onde:
Nome-rs: Nome do Radio-set
X: Nmero que obtm a entrada desejada do radio-set. Este nmero obtido
pela seguinte frmulaX=2 * (entrada desejada)-1.
Observao o Radio-Set Properties mostra que as strings so: "string", 1, "string", 2, ..., ento
para obter a posio desejada necessrio utilizar a frmula descrita anteriormente.
Exemplo:
desabilitar o radio-button emprstimo
Tipo-modalidade.transacao
1 - Aplicao
2 - Emprstimo
X = 2(2) -1
X=3
If tipo-modalidade.transacao:disable(entry(3, tipo-
modalidade:radio-buttons)) in frame {&frame-name} then.
If valid-handle(h-programa) then
run dispatch in h-programa ('initialize').9
If valid-handle(h-programa) then do:10
run pi-reposiciona-tabela1 in h-programa (input 123).
run pi-reposiciona-tabela2 in h-programa (input 456). 11
End.
8
Procedure pertencente ao programa chamado executada antes de sua inicializao;
9
Inicializao do programa chamado. Dever sempre ser feita separadamente de outras execues de
procedimentos devido a possibilidade de a inicializao o handle tornar-se invlido;
10
Validao do handle agrupando mais de uma execuo de procedimentos. Isso pode ser feito desde que a
inicializao do programa no esteja no mesmo bloco da condio e que nenhum dos procedimentos
contidos no bloco possam ocasionar a perda da validade do handle. Isso pode acontecer se, por exemplo, o
procedimento feche o programa chamado.
11
Procedimento, que no tem possiblidade de ocasionar a invalidade do handle, contido em um bloco com
mais procedimentos.
300
Onde:
<funo-do-boto>: Funo especfica do boto a ser trabalhado
<handle-do-painel>: Handle do painel, onde o link source
<logical>: Varivel em fator lgico, onde "yes" habilita e "no" desabilita.
Funes
Inclui
Elimina
Modifica
Copia
Cancela
Desfaz
Salva
Va-para
Zoom
Relacionamento
Relatrio
Observao No utilize a opo "else", pois nesta procedure passam vrios outros states.
Onde:
{03}:indica a funo a ser realizada, conforme a tabela abaixo:
Funo Objetivo
01 define view-as Combo-Box
02 define view-as Radio-Set
03 lista com os itens separados por vrgula
04 n retorna o item n da lista
05 retorna o nmero de itens da lista
06 item retorna a posio do item (nmero)
3. Nas propriedades do SmartBrowser colocar um Calculate Field (campo
calculado) que retorna a entrada no 'list-items' de acordo com o contedo
do registro. Exemplo:
entry(conta.tipo, c-lista-tipo) @ c-tipo
incluir
{utp/ut-rtlbl.i mgadm conta natureza text-1}
Nmero: 1234
Mensagem: Data de converso invlida !
Tipo: Erro
Help: Data de converso no pode ser menor que a data de ...
CAPTULO 15 Tcnicas 309
Nmero: 1235
Mensagem: &1 no pode ser representante na regio &2 nesta situao
Tipo: Erro
Help: O representante &1 no est habilitado para operar na regio &2
para valores inferiores a &3.
Nmero: 1236
Mensagem: Verificao completa. Confirma atualizao ?
Tipo: Questo
Help: A verificao dos dados foi completada, estando os dados
preparados para atualizao
end.
run pi-inicializar in h-prog(input "Importando arquivos",
i-tot).
[Datasul_EMS2]
Show-Report-Program=notepad.exe
TimeAComp=60
Passos:
1. Deve ser criada uma varivel do tipo caracter view-as fill-in, na qual
armazenado o campo de referncia da chave estrangeira e deve ser
colocada ao lado do campo que tem zoom. Acessar as propriedades deste
campo e retirar a propriedade 'Enable'.
Exemplo: Para o campo de referncia state-name temos a varivel c-state-
name.
2. Criar a procedure local-display-fields e nela, antes do run dispatch, deve
ser inserida uma lgica para carregar o valor inicial da varivel para o
campo de referncia.
if available customer then do:
Exemplo find state where state.state = customer.state no-lock no-
error.
assign c-state-name = if avail state then state.state-
name else "":U.
end.
3. No gatilho de leave do campo que possui zoom deve ser inserida uma
lgica para determinar o valor do campo de referncia com base no que o
usurio digitou no campo que possui zoom.
{include/leave.i &tabela=state
Exemplo &atributo-ref=state-name
&variavel-ref=c-state-name
&where="state.state = input frame {&frame-name}
customer.state"}
Onde:
<tabela>: tabela que possui a chave estrangeira;
<atributo-ref>: recebe o campo de referncia da tabela da chave estrangeira;
316
Onde:
<prog-zoom>: o nome do programa de zoom
<campo>: o campo/varivel na viewer ou frame onde est sendo colocado o
zoom, sendo um campo de tabela, deve ser especificado no formato
tabela.campo
<campozoom>: o campo no SmartBrowser do zoom de onde o valor
buscado, no deve ser informado o nome da tabela
<frame>: parmetro opcional utilizado quando o frame onde est o campo que
possui zoom diferente de {&frame-name}
<browse>: parmetro opcional utilizado quando o zoom acionado a partir de
uma coluna de um browse updateable;
<parmetros>: chama uma procedure dentro da Window do programa de
CAPTULO 15 Tcnicas 317
Observao Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo nome
na viewer difere no nome do atributo no browse da pesquisa.
&campozoom=it-codigo
&browse=br-digita}
END.
Observao A nica diferena est na utilizao do parmetro &browse, que recebe o nome do
browse onde o campo/varivel se encontra.
e) chamada de zoom para telas com mais de uma frame (estilo de relatrios):
ON F5 OF c-item-pai in frame f-pg-par
OR MOUSE-SELECT-DBLCLICK OF c-item-pai in frame f-pg-par
DO:
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=c-item-pai
&campozoom=it-codigo
&frame=f-frame}
END.
Observao A nica diferena est na utilizao do parmetro &frame, que recebe o nome da
frame onde o atributo se encontra.
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=item.it-codigo
&campozoom=c-item-pai
¶metros="run pi-seta-inicial in
wh-pesquisa (input param-cp.tipo-contr)."}
END.
Por fim, para todos os campos em frames (no possvel para colunas de
browsers) que possuem zoom necessrio alterar o ponteiro do mouse, atravs
do mtodo load-mouse-pointer, normalmente isto realizado no main-block
do programa. Exemplo:
c-item-pai:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.
Passos:
1. Deve ser criada uma varivel do tipo caracter view-as fill-in, na qual
armazenado o campo de referncia da chave estrangeira e deve ser
colocada ao lado do campo que tem zoom. Acessar as propriedades deste
campo e retirar a propriedade 'Enable'. Deve tambm ser definida na seo
definitions uma varivel do tipo Handle chamada hProgramZoom.
Exemplo: Para o campo de referncia state-name temos a varivel c-state-
name.
DEFINE VARIABLE hProgramZoom AS HANDLE NO-UNDO
2. Criar a procedure local-display-fields e nela, antes do run dispatch, deve
ser inserida uma lgica para carregar o valor inicial da varivel para o
campo de referncia.
if available customer then do:
Exemplo
find state where state.state = customer.state no-lock no-
error.
assign c-state-name = if avail state then state.state-
name else "":U.
end.
3. No gatilho de leave do campo que possui zoom deve ser inserida uma
lgica para determinar o valor do campo de referncia com base no que o
usurio digitou no campo que possui zoom.
{include/leave.i &tabela=state
Exemplo
&atributo-ref=state-name
&variavel-ref=c-state-name
&where="state.state = input frame {&frame-name}
customer.state"}
Onde:
<tabela>: tabela que possui a chave estrangeira;
<atributo-ref>: recebe o campo de referncia da tabela da chave
estrangeira;
<variavel-ref>: varivel criada para receber o campo de referncia;
<where>: clusula where para localizar o registro na tabela de
referncia;
4. Atravs do include ZoomFields.i padronizada a chamada do zoom para
os campos que so chave estrangeira, que atende as seguintes situaes de
acesso ao zoom;
CAPTULO 15 Tcnicas 321
Sintaxe:
{method/ZoomFields.i &ProgramZoom="nome do programa"
&FieldZoomN="nome do campo que retorna"
&FieldScreenN="nome do campo ou varivel"
&FrameN="frame"
&RunMethod="run procedure in hProgramZoom"
&EnableImplant="yes/no"}
Onde:
<ProgramZoom>: Nome do programa de Pesquisa a ser executado;
<FieldZoomN>: Indica o nome do campo que deve ser retornado pelo
programa de Pesquisa, N indica um nmero que pode variar de 1 at 10;
<FieldScreenN>: Indica o nome do campo (varivel) que deve receber o valor
retornado pelo programa de pesquisa, N indica um nmero que pode variar de
1 at 10;
<FrameN>: Indica o nome da frame na qual est o campo (varivel) que deve
receber o valor retornado pelo programa de pesquisa, N indica um nmero
que pode variar de 1 at 10;
<RunMethod>: Indica a linha de comando, que contm a chamada a um
mtodo do programa de pesquisa. A varivel hProgramZoom contm o handle
do programa de pesquisa;
<EnabledImplant>: Os valores YES e NO indicam se o boto Implantar ser
habilitado ou no;
Exemplos:
a) chamada de zoom para atributos em um frame:
ON F5 OF ttcustomer.sales-rep in frame fPage2
OR MOUSE-SELECT-DBLCLICK OF ttcustomer.sales-rep in frame
fPage2 DO:
{method/ZoomFields.i &ProgramZoom="spp/spzoom.w"
322
&FieldZoom1="Sales-Rep"
&FieldScreen1="ttCustomer.Sales-Rep"
&Frame1="fPage2"
&RunMethod="RUN setaVariable IN
hProgramZoom (INPUT 'Representante')."
&EnableImplant="NO"}
END.
END.
END.
Observao Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo nome
na viewer difere no nome do atributo no browse da pesquisa.
CAPTULO 15 Tcnicas 323
Por fim, para todos os campos em frames que possuem zoom necessrio
alterar o ponteiro do mouse, atravs do mtodo load-mouse-pointer,
normalmente isto realizado no main-block do programa. Exemplo:
c-item-pai:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.
{include/pi-edit.i}
No caso, o Custom Browser Zoom Wizard por default criou a procedure pi-
retorna-valor para o campo cod_proced que pertence a tabela principal do
browse, como o desejado que o mesmo retorne a descrio do programa
(des_prog_dtsul) ento, foi acrescentado o cdigo:
when "des_prog_dtsul" then
assign p_valor = prog_dtsul.des_prog_dtsul.
Width: 24,72
Height: 0,67
Display: no selecionado
Enable: no selecionado
View-as-Text: selecionado
Initial Value: Parmetros de Impresso
Private Data: Parmetros de Impresso
4. Na frame f-pg-imp, inserir um objeto toggle-box, com as propriedades
abaixo:
Object: tb-parametro
Label: Imprimir Pgina de Parmetros
No-Label: no selecionado
Column: 3,20
Row: 9,00
Width: 32,00
Height: 0,83
Initial Value: no
5. Na procedure pi-executar, alterar a lgica de assign da Temp-table tt-
param para gravar o campo parametro
assign tt-param.usuario = c-seg-usuario
tt-param.destino = input frame f-pg-imp rs-
destino
tt-param.data-exec = today
tt-param.hora-exec = time
tt-param.classifica = input frame f-pg-imp rs-
destino
tt-param.desc-classifica = entry((tt-
param.classifica - 1) * 2 + 1, rs-classif:radio-buttons in
frame f-pg-cla)
tt-param.parametro = if input frame f-pg-imp tb-
parametro = "yes" then yes else no.
{include/i-vrtab.i <nome-tabela>}
Alm disso, deve ser incluso o cdigo a seguir aps o RUN DISPATCH ..., em
todas as consultas e nos cadastros em que for usado.
IF gr-<nome-tabela> <> ? THEN
RUN pi-reposiciona-query IN h_<nome-query>
(INPUT gr-<nome-tabela>).
ELSE
RUN dispatch IN h_<nome-query>
(INPUT "get-first":U).
ELSE
RUN dispatch IN h_<nome-query>
(INPUT "get-first":U).
ASSIGN gr-<nome-tabela> = rw-<nome-tabela>.
if new <nome-da-tabela>
or <nome-da-tabela>.<campo> <> <b-old-nome-da-
tabela>.<campo> then do:
Cdigo desejado no gatilho de assign.
end.
incidencia-impto
ndices da tabela tipo-tax:
Flags IndexName Cnt Field Name
pu ch-tipo-tax 1 + cod-tax
Onde:
<handle-panel>: varivel que contenha o valor do handle do panel
<valor>: valor para a propriedade que pode ser: Simple ou Multiple
342
Esta funo muito til para os campos calculados de browsers. Antes era
necessrio utilizar ON-FIND TABELA no MAIN-BLOCK do programa para
calcular o valor de um campo que possua uma lgica mais complexa
(Exemplo: pesquisa em outras tabelas). Agora basta seguir a seguinte sintaxe:
fn-nome da funo (valor a ser transferido) na expresso de um calculated
field para utilizar uma funo e atribuir o valor retornado a uma outra varivel
do browser. Exemplo:
CAPTULO 15 Tcnicas 343
Neste exemplo, temos que a funo "fn-valor" est sendo acionada utilizando o
valor do campo banco.vl-lim-aplic. Conforme a expresso do calculated field,
o valor retornado da funo mostrado na varivel de soma-aplic do browser.
Observao Recomenda-se que no sejam utilizadas temp-tables. Na verso 8.2A do
Progress, a utilizao de tabelas temporrias dentro de funes est causando SYSTEM ERROR
(130).
CASE columnHandle:NAME:
WHEN 'Name' THEN
OPEN QUERY {&BROWSE-NAME}
FOR EACH Customer NO-LOCK BY Customer.Name.
WHEN 'City' THEN
OPEN QUERY {&BROWSE-NAME}
FOR EACH Customer NO-LOCK BY Customer.City.
END CASE.
CAPTULO 15 Tcnicas 347
Mini-Flexibilizao
Em muitas situaes faz-se necessria a implementao de mini-flexibilizao,
para implementar funcionalidades ou caractersticas especficas para uma
verso do produto ou um tipo especfico de banco de dados, por exemplo.
Para tanto se deve saber qual o tipo de mini-flexibilizao desejada, que so:
Tipo Descrio
Tipo de Banco de Mini-flexibilizao visando atender necessidades de
Dados implementaes especficas a um determinado tipo de
banco de dados
Verso de Banco de Mini-flexibilizao visando atender necessidades de
Dados implementaes especficas a uma determinada verso
ou release do banco de dados
Especifica Mini-flexibilizao visando atender necessidades de
implementaes especficas a um determinado mdulo
ou funes, podendo ser utilizada para atender as mais
diversas situaes
Outro fato relacionado a insero da chamada ao include que esta deve ser
feita uma nica vez em todo o programa, e mais especificamente no incio do
programa. Isto se deve ao fato dos pr-processadores definidos no include
terem escopo global, ficando assim disponveis em todo o escopo do
programa.
E os pr-processadores disponveis para utilizao esto listados a seguir:
Nome do pr-processador
ems_dbtype
Produto EMS 5
emsbas_dbtype
emsedi_dbtype
emsfin_dbtype
emsuni_dbtype
Produto EMS 2
mgadm_dbtype
mgdis_dbtype
mgind_dbtype
mguni_dbtype
mgcld_dbtype
mginv_dbtype
mgsws_dbtype
mgmrp_dbtype
mgven_dbtype
mgcex_dbtype
mgmp_dbtype
mgmfg_dbtype
mgsop_dbtype
lcarg_dbtype
movadm_dbtype
movdis_dbtype
movind_dbtype
CAPTULO 15 Tcnicas 349
Nome do pr-processador
movmnt_dbtype
movmfg_dbtype
Produto HR
dthrpyc_dbtype
dthrpmg_dbtype
dthrtma_dbtype
Exemplo 2:
{include/i_dbtype.i}
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
Nome do pr-processador
dthrpyc_version
dthrpmg_version
dthrtma_version
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
CREATE customer.
ASSIGN customer.cust-num = 1000
customer.name = "Bob Song".
{include/i-wenrgm.i &field1=v_num_pessoa_fisic
&event1="leave"
&field2=funcionario.dat_admis_func
&event2="leave"
&field3=funcionario.qti_meses_trab_ant
&event3="leave"
&field4=funcionario.qti_dias_contrat_trab
&event4="leave"
&field5=funcionario.dat_term_contrat_trab
&field6=funcionario.cdn_vinc_empregat
&event6="leave"}.
Observao: Existe um limite de 10 campos a serem utilizados em cada chamada da include.
Caso esse limite seja excedido o programador dever definir uma nova chamada da include
passando os demais campos.
para separar o cdigo para banco PROGRESS do cdigo para banco ORACLE
ou SQL Server, acessado atravs do DataServer.
Para banco PROGRESS o comando :
SELECT COUNT(*) INTO <var> FROM <tabela>
WHERE <condio>.
Para os outros bancos use o include include/i-count.p, descrito no item I-
COUNTDS.I do cap. 6 deste manual.
Exemplo {include/i_dbtype.i}
DEFINE VARIABLE iCount AS INTEGER NO-UNDO.
&IF "{&mgadm_dbtype}" = "progress" &THEN
SELECT COUNT(*) INTO iCount FROM cheque-pend
WHERE cod-banco > 20.
&ELSE
{include/i-countds.i &BANCO=mgadm
&TABELA="cheque-pend"
&COND="where cod-banco > 20"
&DEST=iCount}
&ENDIF
Implementao Nos programas que possuem integrao atravs do EAI, antes da chamada dos
adapters necessrio verificar se o EAI est configurado. Para isso deve-se
incluir a include i_dbeai.i e verificar o valor da varivel v_log_eai_habilit.
Durante o login o valor dessa varivel alterado para YES se o EAI estiver
configurado, habilitando assim a integrao.
Exemplo {include/i_dbeai.i}
IF v_log_eai_habilit THEN DO:
/* Chamada do adapter. */
END.
Observao No esquecer que a execuo do segundo procedimento nica, mesmo que sejam
enviadas diversas informaes, como no caso da criao de um grfico, este comando deve ser
executado uma nica vez por ao.
bt-arquivo:visible = yes
bt-config-impr:visible = NO
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive = YES
&endif
.
end.
when "3" then do:
assign c-arquivo:sensitive = no
bt-arquivo:visible = no
bt-config-impr:visible = no
&IF "{&RTF}":U = "YES":U &THEN
l-habilitaRtf:sensitive = YES
&endif
.
&IF "{&RTF}":U = "YES":U &THEN
IF VALID-HANDLE(hWenController) THEN DO:
ASSIGN l-habilitaRtf:sensitive = NO
l-habilitaRtf:SCREEN-VALUE IN FRAME f-
pg-imp = "No"
l-habilitaRtf = NO.
END.
&endif
end.
end case.
end.
&IF "{&RTF}":U = "YES":U &THEN
RUN pi-habilitaRtf.
&endif
END.
CAPTULO 15 Tcnicas 363
END.
Uma vez que o comando SQL foi definido, o prximo passo executar o
comando RUN STORED-PROCEDURE no Progress. Primeiramente,
executamos o comando SELECT montado (contido na varivel
cComandoSQL neste exemplo) atravs do comando RUN STORED-
PROCEDURE. Como a consulta montada dentro do prprio programa
Progress, passamos "send-sql-statement" como parmetro do RUN
STORED-PROCEDURE (este um nome padro para a stored-procedure
a ser executada). Caso seja necessrio rodar uma stored-procedure j
existente na base de dados, podemos passar o nome dela no lugar de send-
sql-statement. Neste caso a PROC-HANDLE tem a funo de passar
parmetros para a stored-procedure. Em ambas as situaes, a funo
PROC-HANDLE retorna o handle (no formato Integer) que referencia
aquela consulta no buffer. Este handle ser usado posteriormente para
leitura do resultado da consulta. necessrio definir uma varivel INT
para receber esse valor. No exemplo, utilizamos a varivel chamada
iHandle1:
RUN STORED-PROCEDURE send-sql-statement iHandle1 = PROC-
HANDLE(oracleCommand).
{utp/ut-oraFunConv.i }
ASSIGN oracleCommand = "SELECT" +
" order.order-num, order.cust-num, " + CHR(10) +
" order.Promise-Date, order.Sales-Rep " + CHR(10) +
"FROM order " + CHR(10) + "WHERE" + CHR(10) +
CAPTULO 15 Tcnicas 369
Para implementar tal processo o desenvolvedor far uso de dois utilitrios que
so:
INPUT "item.price",
INPUT ">",
INPUT STRING(18),
INPUT "integer",
INPUT 0,
INPUT "").
Exemplo:
Para obtermos o comando:
SELECT customer.cust-num, customer.NAME,
customer.address, Customer.Address2 ,
Customer.City, Customer.Country,
Customer.Credit-Limit, order.order-num,
item.item-num, item.price, order-line.qty,
Customer.Comments
FROM Customer, order, order-line, item
WHERE customer.cust-num = order.cust-num
AND order.order-num = order-line.order-num
AND order-line.item-num = ITEM.item-num
AND item.price > 18
AND order-line.qty BETWEEN i-qty-ini AND i-qty-fim
Executar os procedimentos apresentados anteriormente para criao
das clusulas BETWEEN e Where juntamente com o cdigo abaixo:
Observao Para tabelas em bancos diferentes pode-se optar por duas alternativas. A primeira
ser utilizar a include para cada banco, gerando duas temp-tables. A outra seria identificar o
banco mais crtico e utilizar a include apenas nesse banco. Os demais bancos seriam tratados
com comandos FOR EACH, utilizando a temp-table retornada pela include.
Importante Para campos CHAR dever ser feito a seguinte verificao no cdigo
INPUT IF <campo> = ? THEN INTEGER ELSE CHARACTER.
/* recebimento de parmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita.
CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.
&endif
/* corpo do relatrio */
&IF "{&EMS_DBTYPE}" = "Oracle" &THEN
RUN utp/ut-select.p PERSISTENT SET utSelect.
CAPTULO 15 Tcnicas 379
OracleLine.orderLine_qty
OracleLine.orderLine_discount
OracleLine.orderLine_extendedPrice WITH FRAME f-
order-line.
DOWN STREAM str-rp WITH FRAME f-order-line.
END.
&Else IF
FOR EACH OracleLine WHERE
OracleLine.orderLine_orderNum >= tt-param.sel-inicial
AND
OracleLine.orderLine_orderNum <= tt-param.sel-final
NO-LOCK ON STOP UNDO, LEAVE:
RUN pi-acompanhar IN h-acomp (INPUT
STRING(OracleLine.orderLine_orderNum)).
DISPLAY STREAM str-rp
OracleLine.orderLine_OrderNum
OracleLine.orderLine_lineNum
OracleLine.orderLine_itemNum
OracleLine.orderLine_price
OracleLine.orderLine_qty
OracleLine.orderLine_discount
OracleLine.orderLine_extendedPrice WITH FRAME f-order-
line.
DOWN STREAM str-rp WITH FRAME f-order-line.
END.
&endif
/*END.*/
/*fechamento do output do relatrio*/
{include/i-rpclo.i &STREAM="stream str-rp"}
RUN pi-finalizar IN h-acomp.
RETURN "OK":U.
CAPTULO 15 Tcnicas 381
find {&first-table-in-query-{&frame-name}}
where rowid({&first-table-in-query-{&frame-name}}) =
v-row-table
no-lock no-wait no-error.
if available ({&first-table-in-query-{&frame-name}}) then
run notify In this-procedure ("row-available":U).
CAPTULO 16 Dicas de Desenvolvimento 383
CAPTULO 16
Dicas de Desenvolvimento