Escolar Documentos
Profissional Documentos
Cultura Documentos
Manual de Padrões. Programação EMS 2.0. Março - 2006
Manual de Padrões. Programação EMS 2.0. Março - 2006
Índice
CAPÍTULO 7
Tradução ......................................................................................................... 80
TRADUÇÃO MONO-IDIOMAS ................................................................ 80
Tradução de variáveis com view-as nas telas .............................................. 80
Espaço Extra para tradução em relatórios .................................................... 85
TRADUÇÃO MULTI-IDIOMAS ............................................................... 86
Nomenclatura Padrão e Características do modelo...................................... 86
Pontos de tradução ....................................................................................... 88
Contextos de tradução .................................................................................. 88
Itens de Tradução ......................................................................................... 89
Sequência 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 NÃO-INDEXADOS ............................................. 99
Tradução de variáveis com view-as nas telas .............................................. 99
Espaço Extra para tradução em relatórios .................................................. 103
PRÁTICAS PARA IMPLEMENTAÇÃO MULTI-IDIOMAS ................. 104
Caso Prático Diferenças LIST-ITEMS para LIST-ITEM-PAIRS ............. 104
Caso conversão de List-items para LIST-ITEM-PAIRS ........................... 107
Tradução automática em frame de relatório .............................................. 108
Traduzir valor armazenado em uma variável ............................................. 109
Tratando lista enorme de tradução em includes ......................................... 110
CAPÍTULO 8
Construção de Programas utilizando os Estilos e suas Técnicas ......... 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
CAPÍTULO 1
Definição Antes do início da conversão de cada módulo deve ser realizada uma revisão n
Dicionário de Dados do MAGNUS versão I.00, que abrange os seguintes itens:
trocar os campos do tipo narrativa (exemplo: "x(76)" x10) nas tabelas por
campos view-as editor e formato "X(2000)";
criar os campos necessários para limpar os campos do tipo char-1, dec-1,
int-1, etc...;
criar tabelas necessárias que hoje estão "camufladas" em arquivos
temporários e/ou em tabelas não utilizadas;
para todos os campos que são indicadores, sejam de tipo de dado caracter
ou lógico, trocar por campo indicador correspondente com tipo de dado
inteiro. Exemplo:
DE PARA
Emitente.identific Emitente.identific
"C"liente 1
"F"ornecedor 2
"A"mbos 3
Campos Livres
Em todas as tabelas dos bancos de dados do produto Datasul-EMS 2.0,
existem no mínimo 10 campos livres, sendo 2 de cada tipo de dado, conforme
tabela abaixo:
Campo 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 Lógico
log-2
Os antigos campos livres são para uso do cliente, como por exemplo, u-char-1,
u-livre-1, não são mais implementados nas tabelas.
Validações
as validações de campo simples permanecem no Field Validation
(VALEXP), no dicionário de dados, entende-se por validações simples
aquelas que dependam apenas do dado informado do próprio campo, não
fazendo referência a outros campos da tabela. Exemplo: item.descrição-1
<> "";
todas as validações, inclusive as constantes no Field Validation dos
campos atualizados na tela, devem ocorrer no momento de confirmação de
gravação (botões OK, Gravar, GO of frame);
normalmente, é feita a validação em um destes locais, pi-validate, quando
existirem mais de uma viewer ou na local-assign-record, quando for
apenas uma;
não implementar qualquer validação no evento de leave dos campos;
CAPÍTULO 1 Revisão do Dicionário de Dados 5
CAPÍTULO 2
Estrutura de Diretórios
Datasul-EMS 2.0
Diretórios Conteúdo
\ADBRW Objetos Browsers do banco Administrativo
\ADGO Objetos "Vá para" do banco Administrativo
\ADINC Includes de campos indicadores do banco
Administrativo
\ADQRY Objetos Queries do banco Administrativo
\ADVWR Objetos Viewers do banco Administrativo
\ADZOOM\ Zooms do banco Administrativo
\AEP Programas do módulo Aplicações e Empréstimos
\APP Programas do módulo Contas a Pagar
\BCP Programas do módulo Coleta de Dados
\BHP Programas do módulo Bancos Históricos
\BSP Programas do módulo Benefícios Sociais
\BTB Programas do módulo Básico
\CBP Programas do módulo Caixa e Bancos
\CCP Programas do módulo Compras
\CDP Programas do módulo Cadastro
\CEP Programas do módulo Controle de Estoque
\CFP Programas do módulo Configurador Produto
\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 Layout´s de Importação
\MASTERS Masters do SmartObjects
\MEN Módulo Menu
\MIP Programas do módulo Manutenção Industrial
\MPBRW Objetos Browsers do banco MultiPlanta
\MPGO Objetos "Vá para" do banco MultiPlanta
\MPINC Includes de campos indicadores do banco MultiPlanta
\MPP Programas do módulo MultiPlanta
\MPQRY Objetos Queries do banco MultiPlanta
\MPVWR Objetos Viewers do banco MultiPlanta
\MPZOOM Zooms do banco MultiPlanta
\OFP Programas do módulo Obrigações Fiscais
\PANEL Painéis dos SmartObjects
\PCP Programas do módulo Planejamento Capacidade
\PDP Programas do módulo de Pedidos
\PEBRW Objetos Browsers do banco Ponto Eletrônico
\PEGO Objeto "Vá para" do banco Ponto Eletrônico
\PEINC Includes de campos indicadores do banco Ponto
Eletrônico
\PEP Programas do módulo Ponto Eletrônico
\PEQRY Objetos Queries do banco Ponto Eletrônico
\PEVWR Objetos Viewers do banco Ponto Eletrônico
\PEZOOM Zooms do banco Ponto Eletrônico
\PIP Programas do módulo Planejamento Manutenção
Industrial
\PLP Programas do módulo Planejamento
\PMP Programas do módulo Plano Mestre
\PTP Programas do módulo Patrimônio
\PVP Programas do módulo Previsão de Vendas
\QOP Programas do módulo Cotação de Vendas
\REP Programas do módulo Recebimentos
\RHBRW Objetos Browsers do banco Recursos Humanos
12
Datasul-HR 1.0
Diretórios Conteúdo
\DATABASE \INPM Includes de campos indicadores do banco MGPMG
\INPY Includes de campos indicadores do banco MGPYC
\INTM Includes de campos indicadores do banco MGTMA
\INUN Includes de campos indicadores do banco MGUNI
\TGPM \TAP Gatilhos de assign do banco MGPMG
\TCP Gatilhos de create do banco MGPMG
\TDP Gatilhos de delete do banco MGPMG
\TFP Gatilhos de find do banco MGPMG
CAPÍTULO 2 Estrutura de Diretórios 13
CAPÍTULO 3
Nomenclatura
Investimentos IN
Manutenção Industrial MI
MultiPlanta MP
Obrigações Fiscais OF
Patrimônio PT
Pedidos PD
Planejamento PL
Planejamento Capacidade PC
Planejamento Manutenção Industrial PI
Plano Mestre PM
Ponto Eletrônico PE
Recebimento RE
Recebimento Internacional RI
Módulo Sigla
Administração de Treinamento AT
Benefícios BS
Cargos e Salários CA
Desenvolvimento de Pessoal DS
Férias e Rescisões FR
Folha de Pagamento FP
Ponto Eletrônico PE
Tipos de Atributos
Tipos de Atributos são classificadores para os tipos de informações que são
gravadas. Segue abaixo, uma lista de todos os tipos de atributos, descrições e
tipos de dados.
Tipo Descrição Tipo de Dado Formato Default
cb1 Código de Barra Tipo 1 Integer >>>>>>>9
cb2 Código de Barra Tipo 2 Integer >>>>>>>>>>>9
cb3 Código de Barra Tipo 3 Character X(20)
cdd Código - Decimal Decimal >>>,>>>,>>9
cdn Código - Numérico Integer >>>,>>9
cod Código Character X(8)
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
número seqüencial único dentro do banco de dados, Assim, a tabela "item" que
está no banco de dados industrial tem o dump-name "in172". É importante
utilizar letras minúsculas para a sigla da base de dados.
Não existe processo automático para determinar o número seqüencial para a
tabela no banco de dados. Basta acrescentar uma unidade ao último número já
utilizado.
Programas
A nomenclatura de um programa é determinada em função do seu tipo/estilo, e
a sua extensão é .w, se possuir interface e .p, quando não. Entretanto dois
programas, mesmo se tiverem extensões diferentes, não podem ter o mesmo
nome de arquivo, porque na geração do executável .r, ambos tem o mesmo
nome do arquivo com extensão .r.
Todos os arquivos - sejam programas com extensão .p, includes com extensão
.i*, imagens, nomes de diretórios, etc., deverão obedecer a regra imposta pelo
DOS para o seu nome, isto é, o tamanho máximo do arquivo deve ter 8
caracteres e o tamanho máximo para a extensão deve ter 3 caracteres no
máximo.
Também, todos os nomes de arquivo dos programas devem estar em letras
minúsculas.
Para os programas que são objetos (SmartObjects) e estão ligados a uma tabela
adota-se a nomenclatura abaixo:
Tipo do Objeto Diretório destino Nomenclatura Exemplos para a tabela "item"
Browser 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 padrão, é um número seqüencial 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 número seqüencial 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, também, devem ter seus
nomes de arquivo em letras minúsculas, e também, obedecem a algumas regras
5
"xx" indica a sigla do módulo e "zz" caracteres de diferenciação entre programas e subprogramas.
6
Os caracteres "rp" são fixos para nomenclatura deste tipo de subprograma construído através dos Estilos
relatório e importação/exportação.
CAPÍTULO 3 Nomenclatura 21
Includes de programas
A nomenclatura destes includes é dada em função do seu grau de reutilização:
Quando um include é apenas utilizado por um mesmo programa/procedimento,
o nome deste include é igual ao do programa, apenas com a extensão .i ou .i1 a
.i9. Exemplo: cdp/cd0206.i para cdp/cd0206.w ou advwr/v01ad102.i para
advwr/v01ad102.w.
Quando um include é utilizado por vários programas de um mesmo módulo, o
nome deste include é a sigla do módulo mais um número seqüencial,
geralmente acima de 9000. Exemplo: cep/ce9000.i.
Quando um include é utilizado por vários programas de vários módulos, o
nome deste include é 'cd' mais um número seqüencial. Exemplo:cdp/cd9500.i.
Includes padrões
Os includes padrões dos Estilos devem ser depositados no diretório include, e
o seu nome de arquivo iniciar por "i-" mais um nome significativo, que indique
o estilo ou a função. Exemplo: include/i-rpini.i.
Widgets
O padrão de nomenclatura adotado é um prefixo que identifique o widget mais
um nome significativo. A tabela de prefixo é apresentada a seguir:
Widget Prefixo Exemplo
Botão bt- bt-ok
Browse br- br-zoom
Combo-box cb- cb-tipo-conta
7
"999999" é um número seqüencial de includes dentro do diretório "varinc".
22
Variáveis
Datasul-EMS 2.00
Quando uma variável não for um widget o seu tipo de dados determina o
prefixo que deve ser utilizado para nomear as variáveis, conforme tabela a
seguir:
Tipo de dado Prefixo Exemplo
Caracter c- c-conta
Inteiro i- i-contador
Data da- da-atualizacao
Decimal de- de-total-geral
Handle h- h-acomp
Lógico l- l-ativo
Raw raw- raw-param
Rowid rw- rw-
Widget-handle wh- wh-botao
Datasul-HR 1.00
A nomenclatura de variável é formada de acordo com a seguinte regra:
v_tipo de atributo_qualificador
Tipo de Atributo Qualificador Exemplo
Conforme tabela no item 4.3 Nome que qualifica a variável V_cod_fornec
Frame f- f-cad
Parâmetro p- p-rw-emitente
Stream s- s-import
Temporarytable tt- tt-param
Siglas de países
Siglas de três letras seguindo padrão internacional que é utilizado para
designar objetos e diretórios criados para localização dos produtos nos países:
País Prefixo País Prefixo
África do sul saf Guiana Francesa guf
Argentina arg Haiti hai
Bahamas bah Honduras hon
Barbados bar Jamaica jam
Belize bel México mex
Bolívia bol Nicarágua nic
Brasil bra Panamá pan
Canadá can Paraguai par
Chile chi Peru per
Colômbia col Porto Rico por
Costa-rica cos República 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 diretórios e o nome dos adapters devem ser definidos com o
seguinte padrão:
Diretórios: adapters/[nome do parceiro]/[cicla do módulo – 3 dígitos].
Nome: a[sigla do parceiro - 2 dígitos][sigla módulo - 2 dígitos][inteiro
seqüencial - 3 números].p
Exemplo: adapters/neogrid/ccp/anecc102.p - adapter Neogrid do módulo de
compras
25
CAPÍTULO 4
Layout de Telas
Observação Não é aconselhável salvar uma Dialog com uma Window aberta. Quando isto é
feito, é possível que o menu da Window seja copiado para a Dialog eliminando-o. Caso isto
aconteça é necessário recriar a Dialog e o menu da Window.
Objetos
Combo-boxes
Ver capítulo Como implementar campos indicadores com view-as combo-box
nas telas.
Retângulos
São utilizados para agrupar a chave de acesso das telas, agrupar campos de um
mesmo assunto, emoldurar itens de radio-set e emoldurar editores que
necessitem de label.
Botões
os botões com label devem ter:
altura: 1,00 unidade de caracter;
largura: 10, 15 ou 20 unidades de caracter;
quando representarem ações e possuírem labels estes termos devem ser
verbos no infinitivo. Exemplo: Cancelar, Incluir, Modificar, Eliminar ...;
botão 'OK' sempre confirma a ação e sai da tela corrente;
botão 'Cancelar' não confirma a ação e sai da tela corrente;
botão 'Ajuda' sempre é disposto no canto inferior direito nas janelas
detalhe e caixas de diálogo;
os botões de 'Sair' e 'Ajuda' devem estar sempre no canto superior direito
nas janelas pai.
Fill-in´s
os campos e variáveis view-as fill-in devem ter altura de 0,88 unidade de
caracter, excepcionalmente, os campos e variáveis view-as combo-box tem
a altura de 1,00 unidade de caracter.
Frames(Telas)
título das telas é feito a partir do UT-9000.i, não necessitando intervenção
do programador;
CAPÍTULO 4 Layout de Telas 27
CAPÍTULO 5
Estilos
Cadastro Simples
Características todas as funções, com exceção do zoom e do 'vá para', são realizadas na
própria tela base do programa;
os campos devem estar alinhados pelo colon e formando colunas;
a tabulação deve ser de cima para baixo nos campos, passando por todos
os campos de uma coluna para depois passar para a outra coluna;
o menu de barra da janela contém todas as opções disponíveis através dos
botões dispostos na tela;
30
Cadastro Complexo
Características o menu de barra da janela contém apenas as opções para Atualizar, sem as
funções de 'Incluir', 'Copiar', 'Eliminar', como disposto no Cadastro
Simples.
CAPÍTULO 5 Estilos 33
Manutenção de Filhos
Características é uma janela sem painéis, podendo possuir ou não folders de acordo com
a necessidade, é chamada a partir de um programa Pai x Filho, a janela é a
mesma tanto para inclusão quanto para alteração;
a janela possui quatro botões: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o botão de 'Ok' tem função igual tanto para chamada do programa, para
inclusão, quanto para modificação;
o botão de 'Salvar', quando o programa é chamado para inclusão, possui
função de salvar o registro corrente e criar um registro novo;
o botão 'Cancelar', anula qualquer mudança feita no registro corrente do
programa, ou seja, cancela apenas a última inclusão ou a última alteração;
o botão 'Ajuda' é responsável por chamar o help do programa.
36
Caraterísticas tem as mesmas características da tela Pai x Filho - Atualiza Filho, além de
que a atualização não só é feita no Folder como no registro pai;
o menu de barra da janela contém todas as opções disponíveis através dos
botões dispostos na tela;
novas funções, que não estejam contempladas na palette padrão de
navegação e atualização, devem ser representadas por botões e itens no
menu de barra, quanto aos botões é sugerido que sejam dispostos junto à
régua de botões no topo da janela (antes do botão de 'Consultas
Relacionadas');
Incluir, Modificar e Eliminar serve para manutenção da(s) tabela(s) filho;
as opções 'Incluir' e o 'Modificar', chamam janelas semelhantes ao
Cadastro Simples ou Complexo (sem a régua);
Incluir, Modificar, Eliminar e Copiar serve apenas para manutenção da
tabela pai, as opções 'Incluir', 'Modificar' e 'Copiar, chamam janelas
semelhantes ao Cadastro Simples ou Complexo (sem a régua).
CAPÍTULO 5 Estilos 37
Manutenção de Pais
Caraterísticas é uma janela sem painéis, podendo possuir ou não folders, de acordo com
a necessidade, é chamada a partir de um programa Pai x Filho, a janela é a
mesma tanto para inclusão quanto para alteração ou cópia;
a janela possui quatro botões: 'Ok', 'Salvar', 'Cancelar' e 'Ajuda';
o botão de 'Ok' tem função igual tanto para chamada do programa, para
inclusão, quanto para modificação;
o botão 'Salvar', quando o programa é chamado para inclusão, possui
função de salvar o registro corrente e criar um registro novo;
o botão 'Ajuda' é responsável por chamar o help do programa.
38
Características as funções com exceção do zoom e do 'Vá para', são realizadas na própria
tela base do programa, apenas para consulta;
o menu de barra da janela contém as opções disponíveis através dos botões
dispostos na tela.
CAPÍTULO 5 Estilos 39
Consulta Relacionamento
Características é uma janela do tipo detalhe, isto é, sem menu de barra emoldura,
simulando uma caixa de diálogo;
o botão 'Executar' tem como função executar toda a parametrização
realizada nos Folders;
o 'Fechar' do frame sai da tela;
o botão 'Ajuda' é responsável por chamar o help do programa;
Seleção: tudo que é faixa;
Classificação: Radio-se com as opções;
Parâmetros: com exceção da faixa, as outras informações que o usuário
digita;
Digitação: browse updatable.
A seguir, estão demonstrados os folders de Seleção, Classificação, Parâmetros
e Digitação:
CAPÍTULO 5 Estilos 43
44
CAPÍTULO 5 Estilos 45
Parâmetros Únicos
Características é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
simulando uma caixa de diálogo;
o default-button do frame é o botão de 'Ok', que confirma a escolha do
usuário;
o cancel-button do frame é o botão de 'Cancelar' que sai da tela;
o botão 'Imprimir' é responsável por chamar o browse dos relatórios
relacionados;
o botão 'Ajuda' é responsável por chamar o help do programa.
Parâmetros Múltiplos
Seguir as mesmas regras dos Cadastros Simples ou Complexo, dependendo do
número de campos.
Exemplo: Parâmetros por estabelecimento.
46
Formação
Importação
Características é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
simulando uma caixa de diálogo;
o botão 'Executar' tem como função disparar a importação que foi
parametrizada nos folders;
possui quatro folders: Layout, Seleção, Parâmetros e Log;
no folder de "Layout" é mostrado o layout do arquivo a ser importado;
o botão 'Editar Layout' permite que seja editado o arquivo de layout
através de um editor de texto;
no folder de "Seleção" é determinada a faixa dos registros que são
importados;
no folder de "Parâmetros" é determinado o nome do arquivo de entrada
contendo registros a serem importados no formato do Layout;
na página de "Log" é determinado o nome do arquivo de saída que deve
gerar uma lista com todos os registros que forem importados ou somente
os rejeitados, contém ainda a determinação do modo de execução do
mesmo.
CAPÍTULO 5 Estilos 49
Exportação
Características
CAPÍTULO 5 Estilos 51
Zoom de Tabelas
Características é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
simulando uma caixa de diálogo;
default-button do frame é o botão de 'OK', que confirma a escolha do
usuário;
cancel-button do frame é o botão de 'Cancelar' que sai da tela, retornando
ao programa chamador porém sem retornar um registro escolhido;
o botão 'Implantar' é responsável por chamar o programa de cadastro da
tabela, que pode estar desativado dependendo do programa chamador;
ao lado do botão 'Implantar' que é padrão, devem ser colocados os botões
específicos de cada programa de zoom, por exemplo: Narrativa, Filtro,
Texto Livre, etc..., normalmente estes botões chamam caixas de diálogo;
Vá Para
Digitação Rápida
Características é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
simulando uma caixa de diálogo;
default-button do frame é o botão 'Ok', que efetiva a transação;
cancel-button do frame é o botão 'Cancelar' que sai da tela sem considerar
as informações;
as páginas iniciais são reservadas para as informações genéricas;
a última página é reservada para o browser.
Painéis
Funções
Relatórios Relacionados
CAPÍTULO 6
UT-FIELD.I
Objetivo Retornar propriedades dos campos do dicionário de dados, como label,
column-label, etc..
{utp/ut-field.i <banco> <tabela> <campo> <propriedade>}
Utilização
Onde:
<banco>: nome lógico do banco de dados que contém o campo
<tabela>: nome da tabela que contém o campo
<campo>: nome do campo
<propriedade>: número que identifica a propriedade conforme tabela a seguir:
Número Propriedade
1 Label
2 Column-Label
3 Help
4 Format
5 Initial
6 Description
7 Data Type
UT-RTLBL.I
Objetivo Permitir a utilização de literais para colar labels em retângulos na tela
minimizando os problemas de internacionalização.
Utilização campos view-as radio-set ou editor, onde seja necessário emoldurá-lo com
retângulo com um label para identificá-lo;
literais utilizados em telas para substituir labels;
{utp/ut-rtlbl.i <banco> <tabela> <campo> <widget fill-in>}
Formato
Onde:
<banco>: nome lógico do banco de dados que contém o campo
<tabela>: nome da tabela que contém o campo
<campo>: nome do campo
<widget fill-in>: fill-in view-as text colocado na tela
Exemplo:
{utp/ut-rtlbl.i mgadm conta natureza text-1}
UT-RUN.I
Objetivo Seu objetivo é executar programas que não possuam interface (.p), através do
recurso de RPC (Remote Procedure Call). Deve executar apenas programas
(.p), chamados a partir de programas (.w). Não deve chamar um programa (.p),
a partir de um outro programa (.p), como por exemplo um programa de
impressão de relatórios xxp/xx9999rp.p, porque o programa chamador (.p), já
está rodando no servidor (Application Server) e não é necessário iniciar um
novo servidor.
Utilização Sempre que for chamado algum programa sem interface a partir de um .W e
que este programa seja candidato para ser executado via RPC.
Nota Para utilizar os includes é necessário relacionar ao programa os includes {utp/ut-glob.i} e
{btb/btb008za.io} no main-block, para definição de variáveis e funções.
Onde:
{1}: nome externo do programa
{2}: parâmetros do programa
{3}:mostra mensagem de acompanhamento [Opcional]
{4}: servidor de RPC determinado [Opcional]
Nota Para informar parâmetros em branco ou literal, utilize aspas duplas ("") com aspas
simples (''). Exemplo: "" ' '.
Não sendo informados os parâmetros opcionais estes receberão "yes" e "" ' ' respectivamente.
Funções
solicita a conexão e cria a instância do servidor, conforme servidor do
aplicativo ou parâmetro;
mostra mensagem se ocorrer um erro (por exemplo, de conexão), quando
solicitada ({3} = yes);
dispara a execução do programa no servidor;
encerra a conexão e elimina a instância.
Aplicações
Quando o programa API será disparado uma única vez para realizar todo o
processo.
Exemplo: {utp/ut-run.i cep/ceapi001.p "input-output table tt-
mvto, input-output table tt-erro, input yes "" ' '}
Modelo Aberto
Includes
{btb/btb008za.i1 {1} {2} {3}}
Onde:
{1} = nome externo do programa
{2} = mostra mensagem de acompanhamento
{3} = servidor de RPC determinado
{btb/btb008za.i2 {1} {2} {3}}
Onde:
60
Onde:
{1} = nome externo do programa
{2} = nome da variável do tipo "handle" utilizada para eliminar a procedure
persistente [Opcional]
Funções
Idênticas ao Modelo Simplificado, porém distribuídas em três includes:
solicita a conexão e cria a instância do servidor;
dispara a execução do programa;
encerra a conexão e elimina a instância.
Aplicações
Quando o programa API é disparado n vezes dentro de um laço (repeat, for
each...).
def var h-handle as handle no-undo.
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 funções que podem ser utilizadas no
desenvolvimento.
Considerações Caso não 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 não foi
informado o programa será executado On-line.
CAPÍTULO 6 Includes e Utilitários Padrão 61
Quando informado valor parar servidor RPC, caso ocorra algum erro não será
possível a execução On-line.
Ocorrendo erros na tentativa de execução do programa (faltou passar
parâmetros, por exemplo), estes serão retornados juntamente com a mensagem
16435 (*).
Quando for informada a variável do tipo "handle" para a include
btb/btb008za.i2, deve-se tomar dois cuidados: Primeiro, esta variável deve
estar previamente definida no programa. E segundo, ao final da execução,
deve-se eliminar o programa persistent passando o nome da variável para a
include btb008za.i3.
Existe a API que transporta o conteúdo das variáveis de ambiente do
Datasul_EMS da sessão client para a sessão do application server (remota)
quando o programa solicita a execução de determinado programa via RPC
(Remote Procedure Call). Logo, as informações como usuário corrente, grupos
de segurança em que o usuário se encontra, empresa do usuário... estarão
disponíveis na sessão remota.
Dados:
Nome Programa: btb/btb923za.p
Sintaxe: run btb/btb923za.p
(<versão_integração>, <handle_application_server>)
Parâmetros 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 Não Informado No Executa ON-LINE
RPC =no
Existe e Executa Informado e Yes Exibe mensagem 16433(*) via
RPC =yes Inexistente PI_STATUS_ERROR.
Existe e Executa Informado e No Retorna mensagem 16433(*)
RPC =yes Inexistente
Existe e Executa Não Informado e Yes Exibe mensagem 16432(*) via
RPC =yes Inexistente PIA_STATUS_ERROR.
Existe e Executa Não Informado e No Executa ON_LINE
62
(*) Mensagens:
3045 - Programa não cadastrado no menu !
6160 - Não foi possível executar o programa via RPC !
16431 - Programa não pode ser executado via RPC
16432 - Não foi possível encontrar servidor RPC para programa '&1' !
16433 - Servidor RPC não cadastrado
16434 - Servidor RPC não disponível
164 35 - Não foi possível executar programa !
(**) Ocorrendo erros na conexão do servidor RPC, estes serão exibidos em
tela juntamente com a mensagem 6160.
(***) Ocorrendo erros na conexão do servidor RPC, estes serão retornados
juntamente com a mensagem 6160.
UT-MSGS.P
Objetivo
CAPÍTULO 6 Includes e Utilitários Padrão 63
Onde:
<ação>: ação desejada, conforme a tabela a seguir:
Ação Resultado
show Apresenta a mensagem, com texto de ajuda no padrão do produto
msg Retorna o texto da mensagem
help Retorna o texto de ajuda
type Retorna o tipo da mensagem (Erro, Advertência, Informação ou Questão)
codtype Retorna o código do tipo da mensagem
<número da mensagem>: número da mensagem desejada.
<parâmetros>: são os campos, tabelas e outras palavras que se deseja colocar
na mensagem no momento de sua utilização. Cada um dos parâmetros deve ser
separado por "~~" como por exemplo:
input "campo~~" + variável + "~~tabela".
64
UT-TABLE.I
Objetivo Retornar propriedades das tabelas do dicionário de dados.
Utilização nos SmartBrowsers ou Browsers para por label em campos calculados;
para utilização de literais ou textos nas telas com função de label, como no
retângulo que envolve o radio-set.
{utp/ut-table.i <banco> <tabela> <propriedade>}
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 tradução da literal no idioma
corrente do banco de dados.
Utilização em todos os lugares onde literais passíveis de tradução forem apresentadas
na interface do programa.
{utp/ut-liter.i <literal> <modulo contexto> <alinhamento>}
Formato
Onde:
<literal>: Literal a ser utilizada na tela com os espaços substituídos por "_"
(undescore)
<módulo contexto>: parâmetro opcional que define o contexto de tradução da
literal, este contexto é um módulo do Datasul-EMS, se omitido a literal deve
ter o contexto universal de tradução, que é representado pelo valor *
(asterisco)
<alinhamento>: parâmetro opcional que define onde é incrementado o espaço
extra para tradução, conforme tabela abaixo, se omitido deve reservar o espaço
à esquerda da literal:
Tipo Alinhamento
L A esquerda
C Centralizado
R A direita
O retorno é obtido através do return-value. Exemplo:
CAPÍTULO 6 Includes e Utilitários Padrão 67
UT-LIMIT.P
Objetivo Determinar o valor inicial e final de campos caracter, cujo formato é variável,
como por exemplo a conta-contábil.
Utilização Na seleção de relatórios, cálculos, atualizações e zooms que tenham faixas de
seleção sobre campos caracter com formato variável.
run utp/ut-limit.p (input <opção>,
Formato
<formato>).
Onde:
<opção>: indica o limite desejado, MIN = Mínimo e MAX = Máximo
<formato>: formato do campo caracter
O retorno é obtido através do return-value.
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 variáveis globais.
Formato Já está definido dentro dos SmartObjects.
Exemplo de i-ep-codigo-usuario: contém a empresa corrente do usuário.
variáveis definidas l-implanta: variável lógica usada no Zoom, para habilitar o botão implanta.
c-seg-usuario: contém o nome do usuário corrente logado no menu.
I-FREEAC.I
Objetivo
68
Onde:
<variável>: variável que irá armazenar o valor do retorno da função fn-free-
accent
<string>: string acentuada a ser convertida.
{include/i-freeac.i}
Exemplo define var c-texto as char no-undo.
assign c-texto = fn-free-accent ("ÁÀÃÂÄ-ÉÈÊË-ÍÌÎÏ-ÓÒÔÕÖ-ÚÙÛÜ-ÝŸ-
Ç-Ñ").
message fn-free-accent("áàãâä-éèêë-~íìîï-óòõôö-úùûü-y´¨y-ç-ñ")
chr(10) c-texto view-as alert-box.
UT-DIR.P
Objetivo Este utilitário deve ser usado sempre que o usuário tiver que informar um
diretório.
run utp/ut-dir.p (input <título>,
Formato output <pasta>,
output <cancelado>).
Onde:
<título>: título para a caixa de diálogo para selecionar diretórios
<pasta>: variável do tipo caracter onde será retornada a pasta selecionada
<cancelado>: uma variável do tipo lógica onde deve ser retornado se a caixa
de diálogo foi cancelada ou não
Exemplo:
run utp/ut-dir.p (input "Escolha um diretório",
output <pasta>,
output <cancelado>).
Onde:
CAPÍTULO 6 Includes e Utilitários Padrão 69
BTB917ZX.P
Objetivo Permitir a execução de sons do tipo MID e WAV.
Instalação Como este programa utiliza os recursos de OCX, é preciso que este OCX
esteja registrado e instalado na máquina que deve ser utilizado. Para fazer esta
instalação proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretório \INTERFAC\SOM\;
clicar no botão de 'OK', quando for solicitado;
clicar no botão ;
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 visualização dos seguintes tipos de imagens:
Bitmaps (*.bmp; *.dib);
Gif Images (*.gif);
JPEG Images (*.jpg);
Metafiles (*.wmf, *.emf);
Icons (*.ico, *.cur).
Nota As imagens em formato Bitmap (.bmp) devem possuir um correspondente de mesmo
nome no formato GIF (.gif) devido a uma restrição do WebEnabler
Instalação Como este programa utiliza os recursos de OCX, é preciso que este OCX
esteja registrado e instalado na máquina que deve ser utilizado. Para fazer esta
instalação proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretório
\INTERFAC\IMAGEM\;
clicar no botão de 'Ok', quando for solicitado;
clicar no botão: ;
clicar em 'Ok', para terminar.
run btb/btb917zy.p (input <imagem>).
Formato
Onde:
<imagem>: caminho completo da imagem a ser visualizada
Exemplo:
run btb/btb917zy.p (input "c:\windows\egito.bmp").
CAPÍTULO 6 Includes e Utilitários Padrão 71
BTB917ZZ.P
Objetivo Permitir a visualização de vídeos do tipo AVI.
Instalação Como este programa utiliza os recursos de OCX, é preciso que este OCX
esteja registrado e instalado na máquina que deve ser utilizado. Para fazer esta
instalação proceda da seguinte forma:
executar o SETUP.EXE, que se encontra no diretório
\INTERFAC\VIDEO\DISK1;
clicar no botão de 'Ok', quando for solicitado;
clicar no botão: ;
clicar em 'Ok', para terminar.
run btb/btb917zz.p (input <video>)
Formato
Onde:
<vídeo>: caminho completo do vídeo a ser apresentado
Exemplo:
72
UT-VRBIN.P
Objetivo Este utilitário pode ser usado sempre que for necessário saber a versão de um
programa compilado (.R).
run utp/ut-vrbin.p (input <arquivo>,
Formato input <acomp>,
output <versao>).
Onde:
<arquivo>: variável do tipo caracter que irá conter o nome do arquivo
compilado a ser analisado
<acomp>: variável do tipo lógica que irá definir se a pesquisa deve apresentar
a tela de acompanhamento ou não
<versao>: variável do tipo caracter que irá receber a versão do programa
passado como parâmetro
Exemplo:
run utp/ut-vrbin.p (input "c:\tmp\cd0101.r",
input no,
output c-versao).
UT-FINFO.P
Objetivo Este utilitário pode ser usado sempre que for necessário saber a data, a hora ou
o tamanho de um arquivo no Windows.
run utp/ut-finfo.p (input <arquivo>,
Formato
output <data>,
output <hora>,
output <tamanho>).
Onde:
<arquivo>: variável do tipo caracter que deve conter o nome do arquivo a ser
analisado
<data>: variável do tipo data que deve receber a data do arquivo que está
sendo analisado
<hora>: variável do tipo caracter que deve receber a hora do arquivo que está
sendo analisado
<tamanho>: variável do tipo inteira que deve receber o tamanho do arquivo
que está sendo analisado
Exemplo run utp/ut-finfo.p (input "c:\autoexec.bat",
output d-data,
output c-hora,
output i-tam).
Observações Caso o programa não se encontra, o utilitário irá retornar "?", na data e
"00:00:00", na hora.
UT-CMDLN.P
Objetivo Este utilitário pode ser usado sempre que for necessário saber informações
mais detalhadas sobre a linha de comando usada para abrir a sessão corrente.
Esta função pode ser muito útil quando se deseja obter os valores dos
parâmetros da sessão (ini, inp, basekey, etc ...).
run utp/ut-cmdln.p (output <linha-comando>).
Formato
74
Onde:
<linha-comando>: variável do tipo caracter que irá receber a linha de comando
usada para abrir a sessão corrente
Exemplo:
run utp/ut-cmdln.p (output c-linha-comando).
UT-OSVER.P
Objetivo Esta técnica pode ser usada sempre que for necessário saber informações mais
detalhadas sobre o Sistema Operacional (somente para Windows).
run utp/ut-osver.p (ouput <plataforma>,
Formato
output <versao>,
output <release>,
output <build>,
output <extrainfo>).
Onde:
<plataforma>: variável do tipo caracter que irá receber o tipo plataforma
windows (Windows NT ou Windows 95/98)
<versao>: variável do tipo inteira que irá receber, se houver, a versão do
Windows
<release>: variável do tipo inteira que irá receber, se houver, a "release" do
Windows
<build>: variável do tipo inteira que irá receber, se houver, o "build" do
Windows
<extrainfo>: variável do tipo caracter que irá receber informações extras sobre
o Windows (Versão do Service Pack, etc ...)
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 condição passada.
Utilização Quando é necessário determinar a quantidade de registros numa tabela,
evitando que o OWNER seja incluído antes do nome da tabela no
CAPÍTULO 6 Includes e Utilitários Padrão 75
Onde:
<variável>: variável que irá armazenar o resultado da consulta.
<condição>: cláusa where que deve ser usada na consulta. Opcional.
<tabela>: tabela que deve ter o número de registros contados.
<banco>: banco de dados onde a tabela se encontra.
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.
Observações Utilize apenas se o banco de dados não for PROGRESS, isto é, for
acessado através do DataServer.
<condição> e <tabela> devem estar entre aspas.
UT-WIN.I
Objetivo A UT-WIN.I define procedures para acesso a funções externas de API’s 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.
CAPÍTULO 6 Includes e Utilitários Padrão 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 execução deste aplicativo. É semelhante ao stack trace do Progress,
disponível nas mensagens de erro, com a vantagem que o desenvolvedor pode
escolher o ponto do programa para exibição da pilha de execução.
Exemplo
80
CAPÍTULO 7
Tradução
TRADUÇÃO MONO-IDIOMAS
Este modelo é utilizado até as versões EMS 2.04 e HR 2.07. Acima destas
releases deve ser utilizada a técnica multi-idiomas especificada no próximo
item neste documento.
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
Observação Foi incorporada uma chamada para um include i-lgcode.i, cujo objetivo é
determinar qual o idioma da instalação do Datasul-EMS 2.0.
**
*****************************************************/
{include/i-lgcode.i}
&IF "{&LANGUAGE-CODE}" = "POR" &THEN
&glob val1 Devedora
&glob val2 Credora
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ESP" &THEN
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
&glob val1
&glob val2
&ENDIF
&IF "{&LANGUAGE-CODE}" = "ING" &THEN
&glob val1
&glob val2
&ENDIF
{include/ind01-10.i} {1} {2}}
/* fim */
/****************************************************
**
** var99999.i Variável: 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-in´s é necessário preparar a tradução 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 variável 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 <variável>:label in frame {&frame-name} = return-
value.
Utilizando utp/ut-liter.i:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <variável>:label in frame {&frame-name} = return-
value.
Help Sempre que estas variáveis possuam 'help', este deve ter a preparação para
tradução através do include utp/liter.i, conforme o exemplo:
{utp/ut-liter.i <literal> <modulo> <alinhamento>}
assign <variavel>:help in frame {&frame-name} = return-
value.
Side-Labels deve existir o tratamento do espaço extra para tradução, que deve ser
reservado sempre à esquerda do label.
{utp/ut-liter ____Total_Geral}
assign de-total-geral:label in frame f-total = return-value.
Cliente Descrição Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99
TRADUÇÃO MULTI-IDIOMAS
Este modelo é utilizado a partir das versões EMS 2.05 e HR 2.08 ou
superiores.
Importante Para que o produto saiba que dialeto trabalhar na sessão corrente, existe na tabela
de usuários um campo chamado cod_dialeto que irá armazenar a informação do dialeto do
usuário, sendo possível com isto em uma mesma instalação do produto vários usuários
acessando com um idioma/dialeto diferente.
Pontos de tradução
Contextos de tradução
Itens de Tradução
tabela cad-literal no banco mguni. Esta chave é utilizada pelo utilitário ut-
field.p, que será abordado ainda neste documento.
Sequência de busca
UT-TRCAMPOS.P
Objetivo Realizar tradução automática de telas. Este programa tem a função de
pesquisar todos os objetos de uma tela Progress baseado em sua Window,
através da hierarquia existente, e realizar a chamada ao utilitário ut-liter.p para
que sejam feitas as devidas traduções da interface. Este utilitário reconhece
todas as frames que são filhas da window, e traduz todas os objetos presentes
nestas frames automaticamente.
Utilização É utilizado nos dois pontos de tradução dentro das templates:
InitializeInterface nas ThinTemplates
Adm-Initialize nos Smart Objects quando existe container definido.
Caso exista uma window que não seja de uma template padrão Datasul, este
utilitário poderá ser chamado antes do view principal da frame do programa
para que a tradução automática passe a ser realizada.
Este programa não espera nenhum parâmetro de entrada, e deve ser chamado
diretamente através do fonte.
Ex: run utp/ut-trcampos.p.
UT-TRFRRP.P
Objetivo Difere do anterior porque realiza tradução automática de uma única frame,
apenas. Busca os itens de tradução apenas na hierarquia da frame que foi
passada como parâmetro, buscando os objetos passíveis de tradução e
realizando então a chamada ao ut-liter.p e posterior atribuição do valor
traduzido retornado à estes objetos, de forma automática.
Utilização Pode ser utilizado para traduzir Dialog-frames, frames de relatório, ou
qualquer outra frame que se julgue necessário.
CAPÍTULO 7 Tradução 93
Deve ser altamente utilizado para evitar alto nível de trabalho quando da
necessidade de tradução de frames de relatórios devido a não existência de
uma window que seja o pai destas frames nestes tipos de programas, não
podendo nestes casos ser utilizado o utilitário anterior (ut-trcampos.p).
Ex: run utp/ut-trfrrp.p (input frame f-parametros:handle).
Obs: Quando o programa for um relatório, existe um filtro no RTB que caso o
programa não possua nenhuma chamada a este utilitário, esta será feita de
forma automática para todas as frames do relatório antes do ponto padrão de
leitura de registros desta template ou da definição do cabeçalho do mesmo, ou
seja, antes da include i-rpout.i ou i-rpcab.i respectivamente, dependendo da
estrutura do programa.
UT-LSTIT.P
Objetivo Converter uma String não indexada proveniente de um objeto Progress e
retorna seu conteúdo indexado e já traduzido no dialeto do usuário, para que
possa ser utilizado no programa chamador. Tem o objetivo de facilitar a
programação dentro da técnica de tradução Multi-Idiomas minimizando a
necessidade de realizar tal tarefa diretamente no fonte do programa em
questão.
Utilização Deverá ser utilizado sempre quando da necessidade de uma conversão de
valores de um objeto Progress não indexado para valores indexados, ou ainda,
converter valor de LIST-ITEMS para LIST-ITEM-PAIRS.
Sua utilização deve ser da seguinte forma:
Sintaxe: run utp/ut-lstit.p (input-output cLista).
Onde cLista deve ser uma lista separada por "," provinda de uma das seguintes
situações:
Include de domínio;
Valor populado de um for each;
List-items de um campo (Este apenas caso ainda não tenha passado pelos
pontos de tradução, ou já tenha passado e necessita ser repopulado devido
a uma lógica de negócio);
Sub-programa;
94
Qualquer fonte que gere uma lista separada por vírgula e que este será
utilizada em algum objeto Progress não-indexado (Combo-Box, Selection-
List).
O programa irá retornar na mesma variável informada os valores já indexados
e traduzidos, conforme exemplo abaixo:
Valor cLista antes: “casado,solteiro”
Valor cLista depois: “married,casado,single,solteiro”
Importante Com a técnica de tradução Multi-Idiomas, tudo o que antes era LIST-ITEMS, é
automaticamente convertido para LIST-ITEM-PAIRS nos pontos de tradução pelos programas
já mencionados, com isso, qualquer referência a LIST-ITEMS destes campos após os pontos de
tradução, deverão ser retrabalhados para tratar a partir de agora, LIST-ITEM-PAIRS, tendo este
utilitário como facilitador para esta implementação. Qualquer dúvida adicional, verificar o item
abaixo que trata sobre LIST-ITEMS.
UT-LITER.P
Objetivo Utilitário já existente em releases anteriores dos produtos EMS 2 e HR. Este
sofreu alterações para contemplar as novas funcionalidades do modelo de
tradução Multi-Idiomas, como novo conceito de contextualização, hierarquia
de busca e dialetos das Strings.
Utilização Para que não fosse gerado nenhum tipo de impacto sobre todo o legado de
programas com o antigo modelo do ut-liter, seu forma de chamada e
parâmetros não foram alterados, mantendo o padrão já conhecido e definido
neste manual.
Sintaxe: {utp/ut-liter.i <Literal> <Contexto> <Alinhamento>}
Sendo que nesta nova ut-liter, o alinhamento não irá gerar nenhum tipo de
diferença no comportamento da string de retorno, mantida apenas para fins de
compatibilidade. Para evitar problemas com este parâmetro, sempre passá-lo
CAPÍTULO 7 Tradução 95
com valor em branco ("") caso utilizando o programa .p, ou simplesmente não
passar, caso utilizando a include, conforme exemplos abaixo:
Ex: run utp/ut-liter.p (input “Teste”,”*”,””).
{utp/ut-liter Teste *}
UT-MSGS.P
Objetivo Utilitário já existente em releases anteriores dos produtos EMS 2 e HR,
utilizado para apresentar as mensagens dos produtos Datasul. Este utilitário
também sofreu alterações para contemplar as novas funcionalidades descritas e
possui a característica da busca por mensagens baseando-se no dialeto e no
contexto cadastrado para a mensagem.
Utilização Para manter compatilidade com o legado existente nos produtos, sua sintaxe
foi mantida inalterada, conforme segue abaixo:
Sintaxe: run utp/ut-msgs.p (input <ação>
input <número da mensagem>
input <parâmetros>).
Onde:
<ação> é a ação que será tomada pelo programa, podendo ser "show" para
mostrar, "msg" para retornar a mensagem, e "help" para retornar o help da
mensagem.
<número da mensagem> é o número da mensagem
<parâmetros> São os parâmetros a serem substituídos na mensagem
Maiores detalhes podem ser consultados na referência geral deste utilitário
neste documento.
96
UT-FIELD.P
Objetivo Utilitário já existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores das propriedades dos campos do dicionário de
dados, como label, description, etc. O que difere esta versão do modelo de
tradução Multi-Idiomas para a versão anterior é que a busca não é mais
realizada sobre o próprio dicionário, e sim diretamente na tabela de strings
externas do produto, baseando-se na chave banco.tabela.campo.propriedade,
conforme mencionado em itens de tradução neste documento.
Utilização Foi mantido basicamente para não gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substituído pelo ut-liter,
devido sua maior facilidade de identificação e customização futura pelo
usuário.
Sua sintaxe não foi alteradada, sendo ainda:
{utp/ut-field.i banco tabela campo propriedade}
Este exemplo irá retornar o label do campo tipo da tabela conta do banco
mgadm no dialeto do usuário.
Nota Onde Existe a frase “Continua buscando do banco”, significa que o comportamento do
utilitário não foi alterado, mantendo a mesma funcionalidade da implementação anterior.
CAPÍTULO 7 Tradução 97
UT-TABLE.P
Objetivo Utilitário já existente em releases anteriores dos produtos EMS 2 e HR.
Utilizado para retornar valores de propridades das tabelas do dicionário de
dados, como desc, label, etc. O que difere esta versão do modelo de tradução
Multi-Idiomas para a versão anterior é que a busca não é mais realizada sobre
o próprio dicionário, e sim diretamente na tabela de strings externas do
produto, baseando-se na chave banco.tabela.propriedade, conforme citado em
itens de tradução neste documento.
Utilização Foi mantido basicamente para não gerar incompatibilidade com o legado
existente nos produtos, mas pode ser totalmente substituído pelo ut-liter,
devido sua maior facilidade de identificação e customização futura pelo
usuário.
Sua sintaxe não foi alteradada, sendo ainda:
{utp/ut-table.i <banco> <tabela> <propriedade>}
onde propriedade é:
Propriedade Descrição Observação
1 File-Label
2 Dump_name Continua
buscando do
banco
3 Desc
Este exemplo irá retornar o label da tabela conta do banco mgadm no dialeto
do usuário.
Nota Quando comentado "Continua buscando do banco", isto quer dizer que o programa não
está buscando o valor das strings externas, e sim continua buscando do schema do banco atual
que está conectado a sessão, como a versão anterior já realizava.
UT-LTMNU.P
Objetivo Novo utilitário criado para a tradução de todos os itens de menu (Itens de
tradução de 1 a 7). Este utilitário realiza a busca na tabela de strings externas,
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 espaço extra para tradução, que deve ser
reservado sempre à esquerda do label.
{utp/ut-liter.i Total_Geral}
assign de-total-geral:label in frame f-total = return-value.
Cliente Descrição Total Pedidos
--------------------------------------
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
>>>>>9 XXXXXXXXXXXXXXXX >.>>>.>>9,99
____Total Geral: >>.>>>.>>9,99
Neste item estarão sendo abordados alguns casos práticos que podem ser
encontrados durante a execução de uma implementação/alteração de
programas para a portabilidade do produto para a nova técnica de tradução.
Abaixo segue demonstração de alguns casos práticos onde será possível
identificar algumas das principais diferenças na forma de programar para a
técnica de tradução Multi-Idiomas em relação ao modelo anterior.
"Retorno Beneficiamento",
”Remessa Consignação",
"Faturamento Consignação",
"Devolução Consignação",
"Reajuste Preço",
"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 utilitário que realiza a tradução
através dos handles dos objetos presentes na relatório frame em questão. Para
isto, deverá realizar sua chamada ou imediatamente após a definição da frame
ou antes da realização do display da frame. Segue abaixo um exemplo de sua
aplicação:
form
skip(2)
c-lit-selecao no-label colon 55
skip(1)
tt-param.tp-etiq-ini format "zzzzzzzzz9" colon 60 "|<
>|"
tt-param.tp-etiq-fim format "zzzzzzzzz9" no-label
CAPÍTULO 7 Tradução 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 variáveis substituindo-se o " " (Branco) por "_"
(underline).
110
Esta é a situação na qual ocorre o erro 135 quando a lista de valores é enorme
e ultrapassa o limite de caracteres para uma atribuição. Para evitar isso foi
desenvolvida esta técnica que modifica a forma de chamada das includes
varinc, além de mudar a estrutura das includes responsáveis pelo retorno.
Todas as includes da nomenclatura varinc/var99999.i são utilizadas para
definição da lista de valores e utilizam outra include para realizar o tratamento
do tipo de retorno escolhido pelo usuário, que pode ser um list-items de
COMBO-BOX, valores para RADIO-BUTTON, um único elemento da lista,
entre outros. O retorno dos valores é montado através de pré-processadores e o
valor destes são retornados todos de uma única vez para uma variável no
programa que incorpora a include. Sendo assim é necessário alterar a include
de retorno para gravar na variável desejada os valores um por vez. Para tal, é
necessário gravar os valores dos pré-processadores da lista em uma temp-table
e realizar um FOR EACH nesta temp-table para gravar os valores um por vez,
a cada iteração do FOR EACH ou fazer um FIND diretamente no item
desejado.
As alterações desta técnica exigem um grande trabalho para adequar a include
de retorno na proposta das temp-table, porque é necessário popular a tabela
com os valores, sendo necessário incluí-los um a um. Em compensação, o
trabalho de manipulação dos valores para retorno diminui, porque ao invés de
ficar concatenando uma lista enorme de pré-processadores basta apenas fazer
FOR EACH ou FIND na temp-table conforme a opção de retorno desejada.
Implementação As includes de retorno trabalham com 7 tipos de retorno atualmente:
1. View-as combo-box
2. View-as radio-set
CAPÍTULO 7 Tradução 111
Para cada um desses tipos de retorno, é necessário ler a temp-table que contém
os valores da lista. Esta temp-table deve ser definida dessa forma:
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val1}"
tt-list-items.posicao = 1.
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val2}"
tt-list-items.posicao = 2.
.
.
.
.
.
CREATE tt-list-items.
ASSIGN tt-list-items.val-item = "{&val250}"
tt-list-items.posicao = 250.
END.
END.
CAPÍTULO 8
Construção de Programas utilizando os
Estilos e suas Técnicas
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
verificar se já existe uma SmartQuery para a tabela pai. Caso não exista,
criar uma nova utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na página 0 da SmartWindow e aceitar as
sugestões de SmartLink do Wizard;
verificar se já existe um programa de "Vá para" e um programa de
pesquisa para a tabela pai. Caso não existam, eles devem ser criados;
acessar os atributos de instância da SmartQuery e informar no atributo
"Programa Pesquisa" o nome do programa de pesquisa da tabela pai e no
atributo "Programa VáPara" o nome do programa de Vá Para da tabela pai;
122
Exemplo:
{include/okfil.i h_v06pd001}
na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e após o run dispatch deve ser inserida a seguinte lógica:
find <tabela pai> where rowid (<tabela pai>) = v-row-
parent no-lock no-error.
if available <tabela pai> then do:
assign <tabela filho>.<chave pai> = <tabela pai>.<chave
pai>.
end.
Onde:
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
está utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substituído pelo nome da tabela que deve estar sendo
utilizada no cadastro.
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
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 substituído pelo nome que se deseja dar ao buffer da
tabela pai.
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
está utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substituído pelo nome da tabela que está sendo
utilizada no cadastro.
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
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 substituído pelo nome que se deseja dar ao buffer da
tabela filho.
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
está utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa.
<tabela filho>: deve ser substituído pelo nome da tabela que está sendo
utilizada no cadastro.
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro.
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. */
verificar se já existe uma SmartQuery para a tabela pai. Caso não exista,
criar uma nova utilizando o estilo CustomQuery Wizard;
instanciar a SmartQuery na página 0 da SmartWindow e aceitar as
sugestões de SmartLink do Wizard;
verificar se já existe um programa de Cadastro Inclui/Modifica Pai para
manutenção da tabela Pai, caso não exista, deve ser criado, para isso
utilizar o template Cadastro Inclui/Modifica Pai;
132
Exemplo:
{include/okfil.i h_v06pd001}
na SmartViewer que possuir a chave da tabela, deve ser criada uma local-
create-record e após o run dispatch deve ser inserida a seguinte lógica:
find <tabela pai> where rowid (<tabela pai>) = v-row-parent
no-lock no-error.
if available <tabela pai> then do:
assign <tabela filho>.<chave pai> = <tabela pai>.<chave
pai>.
end.
Onde:
<tabela pai>: deve ser substituído pelo nome da tabela pai da tabela que se
esta utilizando no cadastro. A tabela pai deve ser a mesma utilizada na query
do Cadastro PaiXFilho que deve chamar este programa
<tabela filho>: deve ser substituído pelo nome da tabela que deve estar sendo
utilizada no cadastro
<chave pai>: deve ser substituído pelo nome do campo chave da tabela pai que
estabelece relacionamento com a tabela que deve estar sendo utilizada no
cadastro
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 irão ser exibidos no
Cadastro PaiXFilho. Exemplo de query do browser:
Onde:
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 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
Botão to Top;
neste estilo, todo trabalho de tradução de labels, helps, screen-values é
feito automaticamente por um include padrão do estilo. Exceções: list-
items do widget combo-box.
Preparação do Relatório - Interface
1. Verificar quais as páginas que devem ser necessárias ao programa, se as
cinco páginas forem necessárias desconsiderar as tarefas 2, 3, 4 e 5.
2. Eliminar as frames das páginas desnecessárias com base na tabela acima.
3. Eliminar n imagens com as "orelhas" mais a direita, onde n é o número de
páginas desnecessárias, renomeando as remanescentes conforme a tabela
acima.
4. Em 'Definitions' limpar o conteúdo dos preprocessadores das páginas
desnecessárias, assim se está informando ao estilo que estas páginas não
existem no relatório. Exemplo, onde a página de digitação não é
necessária:
&GLOBAL-DEFINE PGSEL f-pg-sel
&GLOBAL-DEFINE PGCLA f-pg-cla
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGDIG
&GLOBAL-DEFINE PGIMP f-pg-imp
Página de Seleção
1. Colocar os fill-in´s de inicial e final, para cada campo que precisa de faixa.
A sugestão é criar como 'Database Fields' e após convertê-los para
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 159
2. Caso seja necessário implementar retângulos com label, estes labels devem
ser fill-in´s view-as text, e o seu valor deve ser informado no seu initial e
private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
Página de Digitação
1. Em 'Definitions', corrigir a definição da temp-table de digitação tt-digita
inserindo os campos necessários;
160
Observação Para mais detalhes sobre esta técnica, ver capítulo Como implementar Zoom e
campos de referência para campos de chave estrangeira.
Página de Impressão
Na página de impressão não é necessário que se tenha qualquer função
adicional para o seu correto funcionamento. Porém, se necessário, seguir a
técnica Como implementar Parâmetros de Impressão em Relatórios.
Gravação e validação dos parâmetros
1. Em 'Definitions' implementar os campos de parâmetros e seleção na
definição da temp-table tt-param.
2. Na procedure 'pi-executar', colocar as validações necessárias às opções do
usuário para execução do relatório no local indicado pelo comentário,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 161
4. Nas seleções, ao invés de utilizar a palavra "à", para dar idéia de faixa,
substituí-la pelos caracteres "|< >|" semelhantes as imagens utilizadas na
tela de seleção, e que não necessitam ser traduzidos.
5. Todos os labels que não forem do dicionário de dados e que apareçam no
relatório devem ser tratados através dos includes {utp/ut-liter.i}, {utp/ut-
field.i} ou ainda {utp/ut-table.i}.
6. Em todos os forms/frames de impressão deve-se colocar a cláusula stream-
io.
7. Para utilizar a funcionalidade de impressão para arquivo RTF:
7.1. definir o préprocessador conforme abaixo:
&GLOBAL-DEFINE RTF YES
7.2. definir o préprocessador abaixo setando o tamanho da página:
&SCOPED-DEFINE pagesize N
N é o número de linhas por página e por default seu valor é 42.
Este número deve ser ajustado para cada relatório conforme o tamanho
do modelo RTF que vai ser utilizado. Caso este tamanho não esteja
correto ocorrerá problema na quebra da página.
7.3. a definição da temp-table tt-param deve ser idêntica a definição da
mesma no programa de interface.
7.4. condicionar o VIEW das frames de cabeçalho/rodapé no início do
programa, para que quando o destino for para RTF as mesmas não
sejam apresentadas. Segue exemplo abaixo:
IF tt-param.l-habilitaRTF <> YES THEN DO:
VIEW STREAM str-rp FRAME f-cabec.
VIEW STREAM str-rp FRAME f-rodape.
END.
164
/* recebimento de parâmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 165
CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.
/* definição de variáveis */
DEFINE VARIABLE h-acomp AS HANDLE NO-UNDO.
/* corpo do relatório */
IF tt-param.classifica = 1 THEN DO:
FOR EACH order WHERE
order.sales-rep = tt-param.sales-rep AND
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 167
Order.Sales-Rep
Order.Ship-Date
Order.Carrier WITH FRAME f-customer.
DOWN STREAM str-rp WITH FRAME f-customer.
END.
END.
Parâmetros
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 169
Cadastrando os
Parâmetros
170
Digitações São informações que podem ter n valores diferentes para a execução do
programa, como segue abaixo, no relatório Resumo de Ordens de Serviço.
Cada ocorrência (linha) dessa digitação é chamada registro e sua quantidade é
ilimitada. Somente programas que possuam a pasta digitações em sua
execução normal deverão possuir digitações cadastradas.
172
Considerações 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 não expressa em
cadastramento de detalhes o significado correto do mesmo.
campos
Exportação JOB Encontra-se no menu Tarefas do módulo Job Execution e nessa opção fazemos
Execution (JE0104) a exportação dos parâmetros e digitações do programa que foi preparado para
ser executado neste módulo, através do devido cadastramento de seus
parâmetros e digitações.
174
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
Lista de Links:
Source
' Link Type Target
h_browse-formação STATE THIS-PROCEDURE
h_p-exihel STATE h_query
180
Seqüência
1. Criar browse origem:
definir query;
definir campos para display.
2. Colocar campos da tabela pai.
3. Criar browse destino:
criar uma temp-table (na seção definitions):
colocar nesta temp-table os atributos da tabela destino.
definir query (relacionando esta com a tabela pai) para a temp-table,
portanto esta deve ser uma freeform query;
definir campos para display.
4. Preencher pré-processor da seção de definições com o nome da tabela pai;
5. Acrescentar dentro da procedure local-initialize lógica para carregar a
temp-table com os registros que já existem na tabela de destino.
182
Botão To Top;
também, neste estilo, todo trabalho de tradução de labels, helps, screen-
values deve ser feito automaticamente por um include padrão do estilo.
Exceções: list-items do widget combo-box;
durante a importação, existem duas streams abertas, uma para importação
dos dados e outra para impressão do log;
o log de importação pode ser completo, na opção. 'Todos' ou imprimir
somente os registros que apresentaram erro, através da opção 'Rejeitados'.
184
Preparação do programa
1. Verificar quantas páginas são necessárias, as páginas de layout,
parâmetros e log são obrigatórias, somente a página de seleção é opcional,
caso haja seleção desconsiderar as tarefas 2, 3 e 4.
2. Eliminar a frame f-pg-sel.
3. Eliminar a imagens im-pg-log e renomear as imagens:
im-pg-par > im-pg-log
im-pg-sel > im-pg-par
4. Em 'Definitions' limpar o conteúdo dos preprocessadores PGSEL
&GLOBAL-DEFINE PGLAY f-pg-lay
&GLOBAL-DEFINE PGSEL
&GLOBAL-DEFINE PGPAR f-pg-par
&GLOBAL-DEFINE PGLOG f-pg-log
Página de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parâmetros, informar neste o nome do
programa no formato XX9999 e a versão do layout no formato 999 (o
valor inicial da versão é 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versãolayout=001 }
Página de Log
Não existem tarefas.
Gravação e validação dos parâmetros
1. Em 'Definitions', implementar os campos de parâmetros e seleção na
definição da temp-table tt-param.
2. Na procedure 'pi-executar', colocar as das páginas de parâmetros e seleção,
lembrando que elas devem apresentar uma mensagem de erro cadastrada,
posicionar na página com problemas, colocando o focus no campo com
problemas.
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
Botão To Top;
também, neste estilo, todo trabalho de tradução de labels, helps, screen-
values deve ser feito automaticamente por um include padrão do estilo.
Exceções: list-items do widget combo-box;
durante a exportação, existem duas streams abertas, uma para exportação
dos dados e outra para impressão do log;
Preparação do programa
1. Verificar quantas páginas são necessárias, as páginas de layout,
parâmetros e log são obrigatórias, somente a página de seleção é opcional,
caso haja seleção desconsiderar as tarefas 2, 3 e 4.
2. Eliminar a frame f-pg-sel.
3. Eliminar a imagens im-pg-log e renomear as imagens:
im-pg-par > im-pg-log
im-pg-sel > im-pg-par
4. Em 'Definitions' limpar o conteúdo dos preprocessadores PGSEL
190
Página de Layout
1. No 'Main Block', existe a chamada para um include denominado
{include/i-imvrf.i}, que possue dois parâmetros, informar neste o nome do
programa no formato XX9999 e a versão do layout no formato 999 (o
valor inicial da versão é 001). Exemplo:
{ include/i-imvrf.i &programa=CP0406 &versãolayout=001 }
Página de Seleção
1. Colocar os fill-in´s de inicial e final, para cada campo que precisar de
faixa. A sugestão é criá-los como 'Database Fields' e após convertê-los
para variáveis para obter automaticamente os labels, formatos e tamanhos
do dicionário de dados.
2. Corrigir os 'initial values' das variáveis de inicial e final.
3. Retirar possíveis queries que o UIB automaticamente queira associar a
frame.
Página de Parâmetros
1. Colocar as variáveis necessárias na representação desejada (radio-set,
toggle-box, fill-in), definindo label, formato, initial e help para as mesmas.
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 191
2. Caso seja necessário implementar retângulos com label, estes labels devem
ser fill-in´s view-as text, e o seu valor deve ser informado no seu initial e
private-data. As propriedades 'Display' e 'Enable' devem ser retiradas.
3. Mudar o private-data e o initial do label "Arquivo de Entrada" do
retângulo para "Arquivo de Saída".
4. No on choose do bt-arquivo-entrada, pode ser adicionado um terceiro
parâmetro na include i-imarq.i , onde é possível passar como parâmetro os
filtros que serão utilizados na sistem dialog, se não for passado nada neste
parâmetro a include assumira como padrão o tipo de arquivo *.lst e todos
os tipos de arquivos.
Exemplo
DO:
{include/i-imarq.i c-arquivo-entrada f-pg-par "'*.XLS' '*.xls' , 'todos' '*.*'" }
END.
Página de Log
1. Remover o retângulo, o label e o radio-set com as opções "Todos" e
"Rejeitados".
2. Mover todos os outros objetos desta frame para cima. Não esquecer do
botão "Configurar Impressora".
Gravação e validação dos parâmetros
1. Em 'Definitions', implementar os campos de parâmetros e seleção na
definição da temp-table tt-param.
2. Eliminar o campo todos da temp-table tt-param.
3. Na procedure 'pi-executar', colocar as validações das páginas de
parâmetros e seleção, lembrando que elas devem apresentar uma
mensagem de erro cadastrada, posicionar na página com problemas,
colocando o focus no campo com problemas.
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.
Sugestão 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 opção Layout Units para Pixel
4. Preencher os campos com valor 1
Ou alterar o tamanho dos campos manualmente.
para os atributos que não formam a chave de acesso da tabela, caso forem
postos na tela:
colocar o primeiro atributo na linha de rt-mold + 0.17 (Exemplo:
2.67);
colocar os demais atributos com um espaçamento de 1 (Exemplo:
3.67, 4.67);
alterar a altura do retângulo rt-mold de modo a apenas caber os
atributos dentro;
colocar na SmartViewer outros objetos, como por exemplo combo-box,
que não estão associados aos campos no banco de dados;
para os objetos não associados ao banco de dados e que devem ser
atualizados pelo usuário, acessar as 'Property' e:
tornar o objeto desabilitado (em propriedades, desmarcar o toggle-box
'Enable');
em propriedades e Advanced, marcar o toggle-box '{&ADM-
MODIFY-FIELDS}';
customizar a procedure LOCAL-INITIALIZE para que as
inicializações dos objetos sejam feitas. Essas inicializações das
variáveis podem ser, atribuição de labels (para tradução automática),
atribuição de itens para combo-boxes e radio-sets, etc., e devem ser
feitas antes do dispatch padrão;
Exemplo /* Code placed here will execute PRIOR to standard behavior. */
{utp/ut-liter.i Preço * R}
assign fill-in_Price:label in frame {&frame-name} = return-
value
cb-country:list-items in frame {&frame-name} =
{pdinc/i01pd001.i 03}.
/* Dispatch standard ADM method.
RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ).
/* Code placed here will execute AFTER standard behavior. */
return 'ADM-ERROR':U.
{utp/ut-liter.i Preço * R}
assign Order-line.Price:label in frame {&frame-name} =
return-value.
{utp/ut-liter.i País * L}
assign cb-country:label in frame {*frame-name} = return-value
{pdinc/i01pd001.i 03}.
/* Dispatch standard ADM method. */
RUN dispatch IN THIS-PROCEDURE ( INPUT 'initialize':U ).
/* Code placed here will execute AFTER standard behavior. */
Observação Para os campos do tipo fill-in’s, deve ser observado se o mesmo possue trigger
de "LEAVE"/"VALUE-CHANGED" e não tenha lupa como cursor do mouse ou um botão de
CAPÍTULO 8 Construção de Programas
utilizando os Estilos e suas Técnicas 213
zoom na sua direita; ou possua trigger de "ENTRY". Caso o fill-in se encaixe em uma das
opções acima, deve ser efetuado o registro para o WebEnabler, conforme técnica Como registrar
campo do tipo Fill-in para o WebEnabler.
O WebEnabler já registra automaticamente o evento de "LEAVE" para TODOS os fill-ins que
possuírem a lupa como cursor do mouse, ou que possuírem um botão de zoom na sua direita.
Portanto não é necessário efetuar o registro para esses fill-ins.
214
CAPÍTULO 9
Validações
Validações de Tela
As validações têm o objetivo de conferir as entradas de dados fornecidas pelo
usuário a um programa, de modo que estejam condizentes com o que o
programa pede e que não sejam passadas informações errôneas de modo a
prejudicar o andamento correto das operações.
Validações na Navegação de Registro
Em certos casos é necessário validar um registro assim que é acessado através
da navegação na tabela. Este caso aplica-se para executar uma função qualquer
como apresentar uma mensagem informativa ao usuário referindo-se àquele
registro ou desabilitar o botão de alteração ou cópia.
Para que o botão de Modificação seja habilitado deve ser seguida a técnica
Como habilitar ou desabilitar Botões em Painéis.
Deve-se ter cuidado com esse tipo de validação, pois cada vez que o usuário
navegar na tabela, a validação será feita podendo prejudicar a performance do
programa.
Validações Antes da Alteração
Da mesma forma que nas Validações na Navegação de Registro (item X.2).
existem casos em que é necessário validar um registro para permitir ou não a
sua alteração, porém em alguns desses casos a validação pode ser complexa e
demorada, consequentemente prejudicial a performance do programa.
Para evitar que a validação acabe afetando a performance do programa, deve-
se fazer a validação apenas quando houver a tentativa de alteração, incluindo o
código a seguir antes do dispatch padrão da procedure Local-Enable-Fields:
CAPÍTULO 9 Validações 215
Onde:
<tabela>: a tabela que está sendo utilizada na manutenção
<condição>: uma condição qualquer que indica que o registro não pode ser
alterado
<mensagem>: uma mensagem a ser apresentada ao usuário informando
impossibilidade da alteração para o registro.
Observação Essa técnica deve ser evitada, pois o usuário verá o botão de alteração habilitado
e ao tentar alterar o registro a mensagem irá interrompê-lo, contradizendo a função do botão.
Browse de Digitação
Os valores do browse de digitação devem ser validados no momento que o usuário sai do
registro, no evento Row-Leave do browse.
CAPÍTULO 10
Mensagens
Eliminação inválida!
Para auxiliar esta operação, o Sistema de Mensagens possui o botão Pesquisa,
onde você pode buscar por Código ou pelo Texto da Mensagem. Além disso,
ainda possui a opção de Filtro onde você informa palavras que deseja procurar
dentro do sistema.
não abreviar palavras sem necessidade (somente por questões de espaço).
Exemplo:
Cond. Pagto.
Estabelec
Dt Ent Prev
Cod Dest Merc
Encer calc não efetuado.
não utilizar palavras ou jargões técnicos. Exemplos:
Título já existe no browse
Script do Automanager não encontrado.
utilizar o help da mensagem somente se necessário, se houver algo a
acrescentar. Não utilizá-lo, somente para repetir a mesma mensagem.
Exemplo:
Agência não cadastrada. Help Agência não cadastrada!
Item para debito direto - Help Item para debito direto.
procurar ser formal. Não utilizar gírias. Exemplo:
Linha Possui Ordens Valorizadas ! Não pode alterar !
Não utilizar o tratamento VOCÊ.
utilizar somente o idioma português (com exceção de palavras técnicas
específicas). Exemplo:
Parámetros
El código de grupo informado não existe !
não utilizar sinais ortográficos ou espaços em branco ao início das
mensagens. Exemplo:
222
CAPÍTULO 11
Programas Reutilizáveis
Procedures Internas
Procedures Internas reutilizáveis são definidas em includes que devem ser
incorporados aos programas. Se forem incorporadas a programas .w, não
devem fazer acesso muito grande a dados pois se isto acontecer devem ser
transformadas em API(s). As procedures tratadas neste tópico diferem de
outras ou mesmo de outros includes pelo fato de serem documentadas
(posteriormente) em Manual Técnico do Módulo, e disponibilizadas para
clientes e parceiros da DATASUL.
Exemplo :
Cálculo do valor presente de uma cotação de preços;
Conversão de valores entre moedas;
Rotinas de Extenso.
Nomenclatura A nomenclatura dos includes que contém este tipo de procedure interna deve
ser a seguinte:
XXINC999.i, onde:
XX - Sigla do Módulo
INC - Fixo
999 - Seqüencial.
225
CAPÍTULO 12
Ferramentas
Application Compiler
O Application Compiler é uma ferramenta Progress utilizada para compilar
arquivos.
Para iniciar o Application Compiler, deve-se estar com qualquer uma das
ferramentas Progress abertas (Data Dictionary, Procedure Editor, UIB ... ),
pressionar o menu Tools e em seguida o item Application Compiler. Sendo
então, exibida a janela a seguir, na qual se deve informar os arquivos que se
deseja compilar e as opções de compilação.
226
Roundtable
O Roundtable é uma ferramenta que facilita o controle de versão de
programas, objetos e includes.
Para a utilização do Roundtable, deve-se seguir os passos descritos abaixo:
1. Selecionar a Workspace;
Observação: Caso essa opção não esteja habilitada certifique-se que a task esteja selecionada
ou se o objeto já está em uso por outra pessoa.
Para verificar se o objeto já está em uso Ir em Folder - Spec (que está na tela
principal do Roundtable) - na última label Event, que deve estar escrito 'Work
in process'.
CAPÍTULO 13
API´s
Funcionamento A API deve ser construída de forma que, receba parâmetros e execute alguma
ação. A API, não deve ter tratamento com tela, deve ser sempre via troca de
parâmetros. Isto facilita no momento da utilização do RPC.
A entrada dos parâmetros na API, deve ser da seguinte forma:
INPUT-OUTPUT PARAMETER TEMP-TABLE: este é a única
forma de comunicação de dados com a API, podendo-se utilizar
uma ou mais tabelas temporárias para fazê-la.
Logo, dados como empresa, usuário, devem ser enviados para a API, através
da temp-table, de forma alguma pode ser utilizado os valores das variáveis
globais definidas no ut-glob.i, ou qualquer outro tipo de variável 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
execução;
INPUT-OUTPUT PARAMETER TEMP-TABLE: pode-se
atualizar em um atributo da temp-table de entrada de dados com o
código da mensagem de erro que ocorreu com o registro. Pode ser
utilizada também, uma temp-table somente de retorno, devolvendo
informações ao programa chamador. Além 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 API´s devem ter a nomenclatura:
XXAPI999.P, onde:
XXX - indica o nome do módulo
999 - um número seqüencial de API´s dentro do módulo.
A definição das temp-tables, deve ficar num include de nome semelhante ao
programa API, apenas com a extensão .I. Assim, se o programa API, tem o
nome externo MPAPI001.P, o include que contém as definições das temp-
tables de integração tem o nome externo MPAPI001.I.
Versão de A API deve ter um controle interno para a versão corrente de integração. Esta
Integração versão é fixa no programa API, sendo controlada pelo programador (deve ser
obrigatoriamente um número seqüencial). Esta versão deve ser incrementada,
CAPÍTULO 13 API´s 235
Campo Descrição
cod-versao-integracao Número da versão de integração
cod-transacao
log-replica-msg
cod-erro
CAPÍTULO 13 API´s 237
desc-erro
cd-maquina-local
Código da API
/*************************************************************
** Programa : MPAPI001.P
** API responsável por verificar se deve replicar transação nas
** máquinas remotas e por buscar código da máquina local
**
*************************************************************/
{mpp/mpapi001.i}
def input-output parameter table for tt-replic-msg.
def var i-versao-integ as integer format "999" no-undo.
assign i-versao-integ = 001.
find first tt-replic-msg no-lock no error.
if avail tt-replic-msg then do:
if tt-replic-msg.cod-versao-integracao <> i-versao-integ
then do:
run utp/ut-msgs.p (input "msg",
input 3941,
input "")
assign tt-replic-msg.cod-erro = 3941
tt-replic-msg.desc-erro = return-value.
return "NOK"
end.
else do:
find first maq-dest-trans where maq-dest-trans. cd-
trans = tt-replic-msg.cod-transacao no-lock no-error.
if avail maqui-dest-trans then
assign tt-replic-msg.log-replica-msg = yes.
find first maquina where maquina.tp-conexao = 1 no-lock no-
error.
if avail maquina then
assign tt-replic-msg.cd-maquina-local =
maquina.cd-maquina.
else do:
run utp/ut-msgs.p (input "msg",
input 3942,
input "").
Assign tt-replic-msg.cod-erro = 3942
tt-replic-msg.desc-erro = return-value
tt-replic-msg.cd-maquina-local = 0.
Return "NOK".
end.
end.
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.
Observação O resultado obtido através da nova API deve ser, sempre que
possível, idêntico ao resultado da antiga.
Evolução de lógica
de API , com
mudanças de
parâmetros
240
Para este tipo de evolução, 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 parâmetros e uma lógica.
A API antiga deve chamar a nova API de forma persistente e roda a procedure
interna EXECUTE, passando todos os antigos parâmetros e um valor padrão
para cada um dos novos parâmetros.
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.
Observação Os parâmetros novos que são passados como padrão para a nova API, devem
garantir que o resultado seja o mesmo da antiga API.
Evolução de lógica
de API, com
alteração de
campos na temp-
tables de
parâmetros
Para este tipo de evolução, 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 parâmetros e uma lógica.
A API antiga deve, primeiramente, copiar todos os campos da antiga temp-
table para a nova, chamar a nova API de forma persistente e rodar a procedure
interna EXECUTE.
Exemplo /* API antiga - UTAPI001.P */
define temp-table tt-clientes
field cliente as char.
define input param table for tt-clientes.
242
Observação Caso a temp-table seja input-output, no retorno da API evoluída, devem ser
repassados os registros da nova temp-table para a antiga.
CAPÍTULO 13 API´s 243
Observação Caso a temp-table antiga seja input-output, no retorno da API evoluída, devem
ser repassados os registros da nova temp-table para a antiga.
Evolução de lógica
de API, com
mudança de
parâmetros, que já
foi evoluída
244
Para este tipo de evolução, deve ser criada uma nova procedure interna com o
mesmo nome da procedure interna antiga, acrescida de um diferenciador. Ex.:
EXECUTE EXECUTE2.
Esta nova procedure interna deve receber os novos parâmetros e possuir toda a
lógica.
A procedure interna antiga deve chamar a nova procedure, passando todos os
antigos parâmetros e um valor padrão para cada um dos novos parâmetros.
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.
Observação Os parâmetros novos que são passados como padrão para a nova procedure
interna, devem garantir que o resultado seja o mesmo da antiga procedure interna.
Evolução de lógica
de API com
mudança de
parâmetros, onde
não é possível
determinar um
valor padrão para o
novo parâmetro ou
o novo parâmetro é
obrigatório
Para este tipo de evolução, deve ser criada uma nova procedure interna ou API
com o mesmo nome da procedure interna antiga, acrescida de um
diferenciador, conforme exemplificando nos itens anteriores.
Como não é possível determinar valores padrão, a procedure interna ou API
antiga deve retornar um erro para que o programa que o chamou emita uma
mensagem de erro explicando o motivo que a API não foi executada e qual o
motivo da obrigatoriedade de novo parâmetro.
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.
Observação Isto somente deve ser feito caso não exista nenhuma maneira de definir um valor
padrão para o novo parâmetro ou o parâmetro seja obrigatório. A mensagem de que a API
possui uma nova versão com parâmetro obrigatório, deve ser somente apresentada no programa
chamador, e nunca na própria API, já que as API´s não devem possuir eventos de interface. Esta
mensagem deve apresentar um erro dizendo que esta API está desatualizada e o motivo de sua
extinção.
Evolução de lógica
de API com
mudança de versão
de integração
Para este tipo de evolução, deve ser criada uma nova procedure interna ou API
com o mesmo nome da procedure interna antiga, acrescida de um
diferenciador, conforme exemplificando nos itens anteriores.
A antiga API deve retornar um erro para o programa chamador.
A nova API deve conter uma procedure interna que retorne a versão de
integração para o programa chamador.
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
Observação Esta técnica pode ser utilizada quando as outras técnicas citadas implicarem
muito na performance da API. Antes de rodar a nova API, o programa chamador deve rodar o
método Get-Integration-Version da nova API e verificar se a versão está correta. Lembrar que,
qualquer mensagem para o usuário deve ser emitida pelo programa chamador e nunca pela API.
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, não deve-se realizar nenhuma alteração
pois estão sendo feitas correções nessa API.
CAPÍTULO 13 API´s 249
UTAPI001.P
A API de geração de gráficos tem por finalidade exibir gráficos de acordo com
os parâmetros a ela passados.
Essa API é constituída por uma include utp/utapi001.i, que contém as
definições das templates utilizadas pela própria API e pelos programas que
irão utilizá-la, um programa, utp/utapi001.p, que é a própria API, e, objetos
não Progress contidos em interfac/grafico que fazem parte de Datgraph
(visualizador de gráficos).
Maiores informações podem ser obtidas na documentação da API de Geração
de Gráficos (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, não deve-se realizar nenhuma alteração pois estão sendo feitas
correções nessa API.
UTAPI002.P
A API utp/utapi002.p faz a integração entre Progress e Microsoft Word 97,
permitindo a criação de arquivos, baseados em formulários, para o Microsoft
Word.
Maiores informações podem ser obtidas na documentação da API de
Integração entre PROGRESS e Microsoft Word 97 (docapi/utapi002.doc).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi012 ao invés deste.
UTAPI003.P
A API utp/utapi003.p faz a Integração entre PROGRESS e Microsoft Excel
97, permitindo a construção de planilhas e, também, gráficos.
Maiores informações podem ser obtidas na documentação da API de
Integração entre PROGRESS e Microsoft Excel 97 (docapi/utapi003.doc).
250
UTAPI004.P
Objetivo Permitir o envio de E-Mail ou FAX através do EMS 2.0 usando o MS-
Exchagne (OLE Automation).
Parâmetros o primeiro parâmetro deve ser endereço E-Mail do destinatário (Exemplo:
"fulano@internet.com.br") ou o número do FAX (Exemplo:
"[FAX:9999999]");
o segundo parâmetro deve ser o E-Mail ou o número do FAX para uma
"Cópia Carbono" (Cc);
o terceiro parâmetro é o Assunto (Subject);
o quarto parâmetro é a mensagem;
o quinto parâmetro é o arquivo anexo (attachment);
o sexto parâmetro é o Grau de Importância, onde 0 Baixo, 1 Médio,
2 Alto;
o sétimo parâmetro é a Confirmação de Envio, ou seja, receber um E-Mail
quando o E-Mail foi enviado;
o oitavo parâmetro é a Confirmação de Leitura, ou seja, receber um E-
Mail quando o destinatário tiver lido a mensagem;
o nono e último parâmetro é 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 através do EMS 2.0 usando um servidor UNIX ou
qualquer outro servidor com suporte ao protocolo SMTP.
Parâmetros Devem ser passados oito parâmetros para este programa:
o primeiro parâmetro deve ser o endereço IP do servidor de E-Mail que
pode ser adquirido da tabela de Parâmetros Globais do Sistema (param-
global serv-mail);
o segundo parâmetro deve ser a porta do servidor de E-Mail, que também
pode ser adquirida na tabela de Parâmetros Globais do Sistema (param-
global.porta-mail);
o terceiro parâmetro deve ser o remetente (Exemplo: "fulano");
o quarto parâmetro deve ser o endereço E-Mail do destinatário (Exemplo:
"fulano@internet.com.br");
o quinto parâmetro deve ser o E-Mail para uma "Cópia Carbono" (Cc);
o sexto parâmetro é o Assunto (Subject);
o sétimo parâmetro é a mensagem;
o oitavo parâmetro, caso esteja enviando E-Mail via UNIX, deve ser o
diretório para a criação do SCRIPT de envio de E-Mail, senão, 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, senão algum erro ocorreu no envio ou os parâmetros passados
não estão corretos.
Configuração Para que o programa de envio de E-Mail funcione é preciso que esteja
cadastrado corretamente o endereço IP do servidor de E-Mail e a sua porta nos
Parâmetros Globais do Sistema.
Observação O programa permite enviar um E-Mail para várias pessoas. Para isto deve-se
passar cada nome separado por "," (vírgula) ou por ";" (ponto e vírgula). O mesmo acontece para
a Cópia Carbono.
Exemplo: fulano@internet.com.br, beltrano@internet.com.br". O assunto e a mensagem podem
ser passadas em branco.
Exemplo: ("") O remetente nunca pode conter espaços em branco.
Instalação Para que o programa de envio de E-Mail funcione, deve ser executado o
arquivo INSTALA.BAT, que se encontra no diretório \INTERFAC\MAIL.
CAPÍTULO 13 API´s 253
UTAPI006.P
A API utp/utapi006.p permite a busca de dados de uma planilha Excel para o
Progress.
No programa responsável por buscar os dados deve ser feita a inclusão do
include: utp/utapi006.i, onde estão as definições das temp-table´s que devem
ser passadas como parâmetros à API utp/utapi003.p.
A chamada da API deve seguir o padrão 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 funções do Excel, para retornar os
resultados para um programa Progress.
No programa responsável por usar esta API deve ser feita a inclusão do
include: utp/utapi007.i, onde estão as definições das temp-table´s que devem
ser passadas como parâmetros à API utp/utapi007.p.
A chamada da API deve seguir o padrão abaixo:
run utp/utapi007.p (input-output table tt-dados,
output table tt-erros).
UTAPI008.P
Nome Físico: utp/utapi008.p
Nome do Include com os Parâmetros: utp/utapi008.i
Versão de Integração: 001
Objetivo
254
UTAPI009.P
Nome Físico: utp/utapi009.p
Nome do Include com os Parâmetros: utp/utapi009.i
Versão de Integração: 001
Objetivo Envio de mensagens através do servidor de correio eletrônico e envio de FAX
através de servidor de FAX.
Maiores informações podem ser obtidas na documentação da API de Envio de
FAX/E-mail (docapi/utapi009.doc).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi019 ao invés deste.
UTAPI010.P
Nome Físico: utp/utapi010.p
Nome do Include com os Parâmetros: utp/utapi010.i
Versão de Integração: 001
Objetivo Permitir que impressoras cadastradas no EMS sejam utilizadas em programas
compilados contra os bancos do MAGNUS.
Maiores informações podem ser obtidas na documentação da API para
Compartilhar Impressoras do EMS com Programas Magnus
(docapi/utapi010.doc).
CAPÍTULO 13 API´s 255
UTAPI011.P
Nome Físico: utp/utapi011.p
Nome do Include com os Parâmetros: utp/utapi011.i
Versão de Integração: 003
Objetivo A API de geração de gráficos tem por finalidade exibir gráficos de acordo com
os parâmetros a ela passados.
Maiores informações podem ser obtidas na documentação da API para
Criação de Gráficos (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, não deve-se realizar nenhuma alteração pois estão sendo feitas
correções nessa API.
UTAPI012.P
Nome Físico: utp/utapi012.p
Nome do Include com os Parâmetros: utp/utapi012.i
Versão de Integração: 001
Objetivo Criação de arquivos, baseados em formulários, para o Microsoft Word. Sendo
que os parâmetros recebidos são utilizados para preencher os campos de
formulário existentes no documento.
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Word (docapi/utapi012.doc).
256
UTAPI013.P
Nome Físico: utp/utapi013.p
Nome do Include com os Parâmetros: utp/utapi013.i
Versão de Integração: 001
Objetivo Faz a Integração entre Progress e Microsoft Excel, permitindo a construção de
planilhas e, também, gráficos.
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Excel (docapi/utapi013.doc).
UTAPI018.P
Nome Físico: utp/utapi018.p
Nome do Include com os Parâmetros: utp/utapi018.i
Versão de Integração: 001
Objetivo Atualização de arquivos para o Microsoft Excel e retorno de informações para
o Progress..
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Excel (docapi/utapi018.doc).
UTAPI019.P
Nome Físico: utp/utapi019.p
Nome do Include com os Parâmetros: utp/utapi019.i
Versão de Integração: 001
Objetivo Envio de mensagens através do servidor de correio eletrônico e envio de FAX
através de servidor de FAX.
Maiores informações podem ser obtidas na documentação da API de Envio de
FAX/E-mail (docapi/utapi019.doc).
CAPÍTULO 13 API´s 257
UTAPI027.P
Nome Físico: utp/utapi027.p
Nome do Include com os Parâmetros: utp/utapi027.i
Versão de Integração: 001
Objetivo Criação de documentos, baseados em formulários para o Microsoft Word,
sendo que a decisão de gravar ou não o documento caberá ao usuário final.
Maiores informações podem ser obtidas na documentação da API de
Integração entre Progress e Microsoft Word (docapi/utapi027.doc).
UTAPI028.P
Nome Físico: utp/utapi028.p
Nome do Include com os Parâmetros: utp/utapi028.i
Versão de Integração: 001
Objetivo Envio de compromisso do tipo reunião via Microsoft Outlook.
Maiores informações podem ser obtidas na documentação da API de Envio de
compromisso via Outlook (docapi/utapi028.doc).
UTAPI029.P
Nome Físico: utp/utapi029.p
Nome do Include com os Parâmetros: utp/utapi029.i
Versão de Integração: 001
Objetivo A API de Integração com excel tem como função gerar código javascript para
gerar planilhas e gráficos no excel em programas estilo pai x filho.
Maiores informações podem ser obtidas na documentação da API de
Integração com Excel Web (docapi/utapi029.doc).
258
APAPI009.P
Nome Físico: app/apapi009.p
Nome do Include com os Parâmetros: app/apapi009.i
Versão de Integração: 001
Objetivo Consistir os parâmetros passados e caso estejam Ok atualizar os pagamentos.
Considerações devem ser passadas 1 (uma) temp-table de entrada e 1 (uma) de saída
Gerais contendo as informações para atualização dos PF´s;
todas as temp-tables são passadas como parâmetro através dos comandos
INPUT TABLE ou OUTPUT TABLE.
Exemplo:
run utp/utapi008.p (input table tt-referencia,
output table tt-erro-pef).
Atributo Descrição
i-ep-codigo Empresa do pagamento
c-referencia Referência a ser atualizada
cod-versao-integ Versão de integração
CAPÍTULO 13 API´s 259
Parâmetros de Saída
Temp-table tt-erro-pef: serão gerados registros nesta temp-table quando tt-
referencial.l-vid-rel=yes com o código do erro, descrição e informações dos
registros com inconsistências.
TEMP-TABLE TT-ERRO-PEF
Atributo Tipo Formato Valor Inicial Obrigatório
i-cod-erro Integer 9999999 Sim
c-desc-erro Character "x(70)" Sim
c-arquivo-erro Character "x(100)" Não
Atributo Descrição
i-cod-erro Código da mensagem de erro
c-desc-erro Descrição da mensagem de erro
c-arquivo-erro Informações com inconsistências
Execução
O programa app/apapi009.p irá primeiramente validar a versão de integração:
Validação: Versão de Integração
O programa irá verificar se o programa chamador está íntegro com a API, e
isto ocorre através da verificação da versão de integração passada como
parâmetro através da temp-table tt-referencia (campo cod-versao-integ). Caso
a versão esteja incompatível, a API abortará a execução retornando através da
temp-table tt-erro-pef o código de erro 3941.
Número do Erro Mensagem Ajuda
3941 Versão de integração incorreta ! Aversão de integração informada
através dos parâmetros internos é
incompatível com a versão atual da
API. Favor contatar suporte técnico.
Além da versão de integração são efetuadas, também as seguintes
consistências.
Número do Erro Mensagem Ajuda
774 Empresa &1 não cadastrada Empresa &1 não cadastrada.
260
CAPÍTULO 14
Portabilidade de RCODES
Outra solução para este problema, é usar o comando PUT, pois o mesmo não
usa FRAME.
output to value(c-arquivo)
find emitente where emitente.cod-emitente = 10 no-lock.
put emitente.cod-emitente.
Caso em Especial
A partir da regra de não utilizar comandos que criam FRAMES explícitas ou
implícitas, alguns problemas foram detectados com a descoberta de comandos
que criam, por algum motivo, FRAMES implícitas.
CAPÍTULO 14 Portabilidade de RCODES 263
CAPÍTULO 15
Técnicas
{include/i-win.i}
Observação Não esquece de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
268
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação A utilização do ImageList é necessária para que o programa possa ser executado
pelo WebEnabler. Na ausência do mesmo o programa executará sem imagens.
PSTimer Este controle permite que sejam programadas execuções de uma rotina dentro
de determinados intervalos de tempo. Para interagir com esse objeto você deve
utilizar o evento “Tick” do mesmo. Esse evento é disparado sempre que se
passar o intervalo de tempo determinado na propriedade “Interval”.
Esse componente já acompanha o Progress e por isso não precisa ser instalado,
o arquivo que possui esse componente é PSTIMER.ocx. O nome do
componente a ser utilizado é Progress Timer Control.
Propriedades
Enabled É uma propriedade do tipo Lógico (true/false), sempre que
for setado para true o evento Ticker será disparado após o intervalo de
tempo determinado.
Sintaxe: <com-handle>:Controls:Item(1):ENABLED.
chCtrlFrame:Controls:Item(1):ENABLED = TRUE.
Interval É uma propriedade do tipo Integer e nela especifica-se qual
o intervalo de tempo(em milisegundos) que se quer esperar entre uma
ocorrência do evento Ticker e outra. Caso o valor setado seja 0 não
será disparado o evento.
Sintaxe: <com-handle>:Controls:Item(1):Interval.
chCtrlFrame:Controls:Item(1):Interval = 50.
Evento
CAPÍTULO 15 Técnicas 273
Sintaxe: <com-handle>:Tela_Limpar().
chCtrlFrame:UColunas:Tela_Limpar().
Linhas_Trocar_Estilo Utilizando esse método podemos alterar os
estilos das linhas dos gráficos, basta invocar o método e passar um
valor inteiro para definir o estilo da linha.
Os estilos de linha são: 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 método permite que seja definido qual o
valor máximo das colunas do gráfico.
Sintaxe: <com-handle>: Valor_Maximo_Setar (Valor AS
FLOAT,Character-c_format ).
chCtrlFrame:UColunas:Valor_Maximo_Setar (10,">>>>>,>>9.99").
Colunas_Criar Este método permite a criação de grupos de coluna
sendo que cada grupo é composto por no máximo 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>: São as legendas que podem ser atribuídas para os
grupos de colunas do componente.
Exemplo: chCtrlFrame:UColunas:Colunas_Criar (1, 10, 9, 8, 7, 6,
"Teste1", "Texto 2").
Objetos_Mostrar Método que exibe os grupos de colunas criados na
tela.
Sintaxe: <com-handle>:Objetos_Mostrar().
chCtrlFrame:UColunas:Objetos_Mostrar().
Coluna_Selecionada Este método retorna uma string com o
identificador + posição da coluna no grupo. Essa string permite
identificar unicamente cada uma das colunas.
Sintaxe: <com-handle>:Coluna_Selecionada().
chCtrlFrame:UColunas:Coluna_Selecionada().
CAPÍTULO 15 Técnicas 279
ProgressBar Como o próprio nome sugere, trata-se de um componente OCX que exibe a
barra de progresso de um determinado procedimento que esteja sendo
executado.
O diretório onde se encontra o pacote para instalação 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 mínimo
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 não ultrapasse o valor máximo, pois isso causa
erro.
Sintaxe: <com-handle>:Max.
ASSIGN chctrlframe:ProgressBar:Max = 10.
Value Value é propriedade do componente onde podemos obter o
valor atual que a barra está exibindo ou que podemos informar qual o
novo valor que a barra deve exibir o progresso do processo..
Sintaxe: <com-handle>:Value.
ASSIGN chctrlframe:ProgressBar:Value =
chctrlframe:ProgressBar:VALUE + 1.
Sound Componente que possibilita e execução de arquivos de sons como wav e mid
em aplicações 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 diretório onde se encontra o pacote para instalação 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".
CAPÍTULO 15 Técnicas 283
Print Chart Componente OCX destinado ao tratamento dos parâmetros de impressão para
outros componentes OCX.
O diretório onde se encontra o pacote para instalação desse componente é em
\interfac\Print Chart\ e o arquivo que possui esse componente é
PRINTCHART.ocx. O nome do componente a ser utilizado é Print Chart
Activex Control.
Seus principais métodos e propriedades são:
HWNDFLOW Esse método é 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.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Height: 1,25
deixar o botão sem label;
inserir o Help:"Corretor ortográfico" no botão para implementar o
Tooltip;
definir a variável 1-control-spell em Definitions. Exemplo:
define variable l-control-spell as logical no-undo init no.
É importante ressaltar que esta técnica só irá funcionar para quem possui o
Word 97, instalado na sua máquina.
Após a implementação da técnica, ela funciona assim:
no início, a imagem do botão check deve estar em vermelho, indicando
que o texto do Editor ainda não passou pela correção ortográfica.
Exemplo:
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
CAPÍTULO 15 Técnicas 297
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
Onde:
Nome-rs: Nome do Radio-set
X: Número que obtém a entrada desejada do radio-set. Este número é obtido
pela seguinte fórmulaX=2 * (entrada desejada)-1.
Observação o Radio-Set Properties mostra que as strings são: "string", 1, "string", 2, ..., então
para obter a posição desejada é necessário utilizar a fórmula descrita anteriormente.
Exemplo:
desabilitar o radio-button empréstimo
Tipo-modalidade.transacao
1 - Aplicação
2 - Empréstimo
X = 2(2) -1
X=3
If tipo-modalidade.transacao:disable(entry(3, tipo-
modalidade:radio-buttons)) in frame {&frame-name} then.
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 inicialização;
9
Inicialização do programa chamado. Deverá sempre ser feita separadamente de outras execuções de
procedimentos devido a possibilidade de a inicialização o handle tornar-se inválido;
10
Validação do handle agrupando mais de uma execução de procedimentos. Isso pode ser feito desde que a
inicialização do programa não esteja no mesmo bloco da condição e que nenhum dos procedimentos
contidos no bloco possam ocasionar a perda da validade do handle. Isso pode acontecer se, por exemplo, o
procedimento feche o programa chamado.
11
Procedimento, que não tem possiblidade de ocasionar a invalidade do handle, contido em um bloco com
mais procedimentos.
300
Onde:
<função-do-botão>: Função específica do botão a ser trabalhado
<handle-do-painel>: Handle do painel, onde o link é source
<logical>: Variável em fator lógico, onde "yes" habilita e "no" desabilita.
Funções
Inclui
Elimina
Modifica
Copia
Cancela
Desfaz
Salva
Va-para
Zoom
Relacionamento
Relatório
Observação Não utilize a opção "else", pois nesta procedure passam vários outros state´s.
Onde:
{03}:indica a função a ser realizada, conforme a tabela abaixo:
Função Objetivo
01 define view-as Combo-Box
02 define view-as Radio-Set
03 lista com os itens separados por vírgula
04 n retorna o item n da lista
05 retorna o número de itens da lista
06 item retorna a posição do item (número)
3. Nas propriedades do SmartBrowser colocar um Calculate Field (campo
calculado) que retorna a entrada no 'list-items' de acordo com o conteúdo
do registro. Exemplo:
entry(conta.tipo, c-lista-tipo) @ c-tipo
incluir
{utp/ut-rtlbl.i mgadm conta natureza text-1}
Número: 1234
Mensagem: Data de conversão inválida !
Tipo: Erro
Help: Data de conversão não pode ser menor que a data de ...
CAPÍTULO 15 Técnicas 309
Número: 1235
Mensagem: &1 não pode ser representante na região &2 nesta situação
Tipo: Erro
Help: O representante &1 não está habilitado para operar na região &2
para valores inferiores a &3.
Número: 1236
Mensagem: Verificação completa. Confirma atualização ?
Tipo: Questão
Help: A verificação dos dados foi completada, estando os dados
preparados para atualização
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 variável do tipo caracter view-as fill-in, na qual é
armazenado o campo de referência da chave estrangeira e deve ser
colocada ao lado do campo que tem zoom. Acessar as propriedades deste
campo e retirar a propriedade 'Enable'.
Exemplo: Para o campo de referência state-name temos a variável c-state-
name.
2. Criar a procedure local-display-fields e nela, antes do run dispatch, deve
ser inserida uma lógica para carregar o valor inicial da variável para o
campo de referência.
if available customer then do:
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
lógica para determinar o valor do campo de referência com base no que o
usuário digitou no campo que possui zoom.
{include/leave.i &tabela=state
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 referência da tabela da chave estrangeira;
316
Onde:
<prog-zoom>: é o nome do programa de zoom
<campo>: é o campo/variável na viewer ou frame onde está sendo colocado o
zoom, sendo um campo de tabela, deve ser especificado no formato
tabela.campo
<campozoom>: é o campo no SmartBrowser do zoom de onde o valor é
buscado, não deve ser informado o nome da tabela
<frame>: parâmetro opcional utilizado quando o frame onde está o campo que
possui zoom é diferente de {&frame-name}
<browse>: parâmetro opcional utilizado quando o zoom é acionado a partir de
uma coluna de um browse updateable;
<parâmetros>: chama uma procedure dentro da Window do programa de
CAPÍTULO 15 Técnicas 317
Observação Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo nome
na viewer difere no nome do atributo no browse da pesquisa.
&campozoom=it-codigo
&browse=br-digita}
END.
Observação A única diferença está na utilização do parâmetro &browse, que recebe o nome do
browse onde o campo/variável se encontra.
e) chamada de zoom para telas com mais de uma frame (estilo de relatórios):
ON F5 OF c-item-pai in frame f-pg-par
OR MOUSE-SELECT-DBLCLICK OF c-item-pai in frame f-pg-par
DO:
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=c-item-pai
&campozoom=it-codigo
&frame=f-frame}
END.
Observação A única diferença está na utilização do parâmetro &frame, que recebe o nome da
frame onde o atributo se encontra.
{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 (não é possível para colunas de
browsers) que possuem zoom é necessário alterar o ponteiro do mouse, através
do método load-mouse-pointer, normalmente isto é realizado no main-block
do programa. Exemplo:
c-item-pai:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.
Passos:
1. Deve ser criada uma variável do tipo caracter view-as fill-in, na qual é
armazenado o campo de referência da chave estrangeira e deve ser
colocada ao lado do campo que tem zoom. Acessar as propriedades deste
campo e retirar a propriedade 'Enable'. Deve também ser definida na seção
definitions uma variável do tipo Handle chamada hProgramZoom.
Exemplo: Para o campo de referência state-name temos a variável c-state-
name.
DEFINE VARIABLE hProgramZoom AS HANDLE NO-UNDO
2. Criar a procedure local-display-fields e nela, antes do run dispatch, deve
ser inserida uma lógica para carregar o valor inicial da variável para o
campo de referência.
if available customer then do:
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
lógica para determinar o valor do campo de referência com base no que o
usuário digitou no campo que possui zoom.
{include/leave.i &tabela=state
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 referência da tabela da chave
estrangeira;
<variavel-ref>: variável criada para receber o campo de referência;
<where>: cláusula where para localizar o registro na tabela de
referência;
4. Através do include ZoomFields.i é padronizada a chamada do zoom para
os campos que são chave estrangeira, que atende as seguintes situações de
acesso ao zoom;
CAPÍTULO 15 Técnicas 321
Sintaxe:
{method/ZoomFields.i &ProgramZoom="nome do programa"
&FieldZoomN="nome do campo que retorna"
&FieldScreenN="nome do campo ou variável"
&FrameN="frame"
&RunMethod="run procedure in hProgramZoom"
&EnableImplant="yes/no"}
Onde:
<ProgramZoom>: Nome do programa de Pesquisa a ser executado;
<FieldZoomN>: Indica o nome do campo que deve ser retornado pelo
programa de Pesquisa, N indica um número que pode variar de 1 até 10;
<FieldScreenN>: Indica o nome do campo (variável) que deve receber o valor
retornado pelo programa de pesquisa, N indica um número que pode variar de
1 até 10;
<FrameN>: Indica o nome da frame na qual está o campo (variável) que deve
receber o valor retornado pelo programa de pesquisa, N indica um número
que pode variar de 1 até 10;
<RunMethod>: Indica a linha de comando, que contém a chamada a um
método do programa de pesquisa. A variável hProgramZoom contém o handle
do programa de pesquisa;
<EnabledImplant>: Os valores YES e NO indicam se o botão Implantar será
habilitado ou não;
Exemplos:
a) chamada de zoom para atributos em um frame:
ON F5 OF ttcustomer.sales-rep in frame fPage2
OR MOUSE-SELECT-DBLCLICK OF ttcustomer.sales-rep in frame
fPage2 DO:
{method/ZoomFields.i &ProgramZoom="spp/spzoom.w"
322
&FieldZoom1="Sales-Rep"
&FieldScreen1="ttCustomer.Sales-Rep"
&Frame1="fPage2"
&RunMethod="RUN setaVariable IN
hProgramZoom (INPUT 'Representante')."
&EnableImplant="NO"}
END.
END.
END.
Observação Esta mesma sintaxe deve ser utilizada para colocar zoom em atributos cujo nome
na viewer difere no nome do atributo no browse da pesquisa.
CAPÍTULO 15 Técnicas 323
Por fim, para todos os campos em frames que possuem zoom é necessário
alterar o ponteiro do mouse, através do método load-mouse-pointer,
normalmente isto é realizado no main-block do programa. Exemplo:
c-item-pai:load-mouse-pointer ("image/lupa.cur") in frame
{&frame-name}.
{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 descrição do programa
(des_prog_dtsul) então, foi acrescentado o código:
when "des_prog_dtsul" then
assign p_valor = prog_dtsul.des_prog_dtsul.
Width: 24,72
Height: 0,67
Display: não selecionado
Enable: não selecionado
View-as-Text: selecionado
Initial Value: Parâmetros de Impressão
Private Data: Parâmetros de Impressão
4. Na frame f-pg-imp, inserir um objeto toggle-box, com as propriedades
abaixo:
Object: tb-parametro
Label: Imprimir Página de Parâmetros
No-Label: não selecionado
Column: 3,20
Row: 9,00
Width: 32,00
Height: 0,83
Initial Value: no
5. Na procedure pi-executar, alterar a lógica 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>}
Além disso, deve ser incluso o código a seguir após o RUN DISPATCH ..., em
todas as consultas e nos cadastros em que for usado.
IF gr-<nome-tabela> <> ? THEN
RUN pi-reposiciona-query IN h_<nome-query>
(INPUT gr-<nome-tabela>).
ELSE
RUN dispatch IN h_<nome-query>
(INPUT "get-first":U).
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:
Código 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>: variável que contenha o valor do handle do panel
<valor>: valor para a propriedade que pode ser: Simple ou Multiple
342
Esta função é muito útil para os campos calculados de browsers. Antes era
necessário utilizar ON-FIND TABELA no MAIN-BLOCK do programa para
calcular o valor de um campo que possuía uma lógica mais complexa
(Exemplo: pesquisa em outras tabelas). Agora basta seguir a seguinte sintaxe:
fn-nome da função (valor a ser transferido) na expressão de um calculated
field para utilizar uma função e atribuir o valor retornado a uma outra variável
do browser. Exemplo:
CAPÍTULO 15 Técnicas 343
Neste exemplo, temos que a função "fn-valor" está sendo acionada utilizando o
valor do campo banco.vl-lim-aplic. Conforme a expressão do calculated field,
o valor retornado da função é mostrado na variável de soma-aplic do browser.
Observação Recomenda-se que não sejam utilizadas temp-tables. Na versão 8.2A do
Progress, a utilização de tabelas temporárias dentro de funções está causando SYSTEM ERROR
(130).
Observação Não esquecer de executar o último procedimento descrito, pois na falta deste, o
sistema pode ficar sem recursos e travar.
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.
CAPÍTULO 15 Técnicas 347
Mini-Flexibilização
Em muitas situações faz-se necessária a implementação de mini-flexibilização,
para implementar funcionalidades ou características específicas para uma
versão do produto ou um tipo específico de banco de dados, por exemplo.
Para tanto se deve saber qual o tipo de mini-flexibilização desejada, que são:
Tipo Descrição
Tipo de Banco de Mini-flexibilização visando atender necessidades de
Dados implementações específicas a um determinado tipo de
banco de dados
Versão de Banco de Mini-flexibilização visando atender necessidades de
Dados implementações específicas a uma determinada versão
ou release do banco de dados
Especifica Mini-flexibilização visando atender necessidades de
implementações específicas a um determinado módulo
ou funções, podendo ser utilizada para atender as mais
diversas situações
Outro fato relacionado a inserção da chamada ao include é que esta deve ser
feita uma única vez em todo o programa, e mais especificamente no início do
programa. Isto se deve ao fato dos pré-processadores definidos no include
terem escopo global, ficando assim disponíveis em todo o escopo do
programa.
E os pré-processadores disponíveis para utilização estão listados a seguir:
Nome do pré-processador
ems_dbtype
Produto EMS 5
emsbas_dbtype
emsedi_dbtype
emsfin_dbtype
emsuni_dbtype
Produto EMS 2
mgadm_dbtype
mgdis_dbtype
mgind_dbtype
mguni_dbtype
mgcld_dbtype
mginv_dbtype
mgsws_dbtype
mgmrp_dbtype
mgven_dbtype
mgcex_dbtype
mgmp_dbtype
mgmfg_dbtype
mgsop_dbtype
lcarg_dbtype
movadm_dbtype
movdis_dbtype
movind_dbtype
CAPÍTULO 15 Técnicas 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"}.
Observação: Existe um limite de 10 campos a serem utilizados em cada chamada da include.
Caso esse limite seja excedido o programador deverá definir uma nova chamada da include
passando os demais campos.
para separar o código para banco PROGRESS do código para banco ORACLE
ou SQL Server, acessado através do DataServer.
Para banco PROGRESS o comando é:
SELECT COUNT(*) INTO <var> FROM <tabela>
WHERE <condição>.
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
Implementação Nos programas que possuem integração através do EAI, antes da chamada dos
adapters é necessário verificar se o EAI está configurado. Para isso deve-se
incluir a include i_dbeai.i e verificar o valor da variável v_log_eai_habilit.
Durante o login o valor dessa variável é alterado para YES se o EAI estiver
configurado, habilitando assim a integração.
Exemplo {include/i_dbeai.i}
IF v_log_eai_habilit THEN DO:
/* Chamada do adapter. */
END.
Observação Não esquecer que a execução do segundo procedimento é única, mesmo que sejam
enviadas diversas informações, como no caso da criação de um gráfico, este comando deve ser
executado uma única vez por ação.
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.
CAPÍTULO 15 Técnicas 363
END.
Uma vez que o comando SQL foi definido, o próximo passo é executar o
comando RUN STORED-PROCEDURE no Progress. Primeiramente,
executamos o comando SELECT montado (contido na variável
cComandoSQL neste exemplo) através do comando RUN STORED-
PROCEDURE. Como a consulta é montada dentro do próprio programa
Progress, passamos "send-sql-statement" como parâmetro do RUN
STORED-PROCEDURE (este é um nome padrão para a stored-procedure
a ser executada). Caso seja necessário rodar uma stored-procedure já
existente na base de dados, podemos passar o nome dela no lugar de send-
sql-statement. Neste caso a PROC-HANDLE tem a função de passar
parâmetros para a stored-procedure. Em ambas as situações, a função
PROC-HANDLE retorna o handle (no formato Integer) que referencia
aquela consulta no buffer. Este handle será usado posteriormente para
leitura do resultado da consulta. É necessário definir uma variável INT
para receber esse valor. No exemplo, utilizamos a variável chamada
iHandle1:
RUN STORED-PROCEDURE send-sql-statement iHandle1 = PROC-
HANDLE(oracleCommand).
{utp/ut-oraFunConv.i }
ASSIGN oracleCommand = "SELECT" +
" order.order-num, order.cust-num, " + CHR(10) +
" order.Promise-Date, order.Sales-Rep " + CHR(10) +
"FROM order " + CHR(10) + "WHERE" + CHR(10) +
CAPÍTULO 15 Técnicas 369
Para implementar tal processo o desenvolvedor fará uso de dois utilitários que
são:
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 criação
das cláusulas BETWEEN e Where juntamente com o código abaixo:
Observação Para tabelas em bancos diferentes pode-se optar por duas alternativas. A primeira
será utilizar a include para cada banco, gerando duas temp-tables. A outra seria identificar o
banco mais crítico e utilizar a include apenas nesse banco. Os demais bancos seriam tratados
com comandos FOR EACH, utilizando a temp-table retornada pela include.
Importante Para campos CHAR deverá ser feito a seguinte verificação no código
INPUT IF <campo> = ? THEN “INTEGER” ELSE “CHARACTER”.
/* recebimento de parÔmetros */
DEFINE INPUT PARAMETER raw-param AS RAW NO-UNDO.
DEFINE INPUT PARAMETER TABLE FOR tt-raw-digita.
CREATE tt-param.
RAW-TRANSFER raw-param TO tt-param.
&endif
/* corpo do relat¾rio */
&IF "{&EMS_DBTYPE}" = "Oracle" &THEN
RUN utp/ut-select.p PERSISTENT SET utSelect.
CAPÍTULO 15 Técnicas 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 relat¾rio*/
{include/i-rpclo.i &STREAM="stream str-rp"}
RUN pi-finalizar IN h-acomp.
RETURN "OK":U.
CAPÍTULO 15 Técnicas 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).
CAPÍTULO 16 Dicas de Desenvolvimento 383
CAPÍTULO 16
Dicas de Desenvolvimento