Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação EMS
2.0
Março/2006
Copyright © 1998 DATASUL S.A. Todos os direitos reservados.
Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou
transmitida por qualquer meio eletrônico ou mecânico, na sua totalidade ou em
parte, sem a prévia autorização escrita da DATASUL S.A., que reserva-se o
direito de efetuar alterações sem aviso prévio. A DATASUL S.A não assume
nenhuma responsabilidade pelas conseqüências de quaisquer erros ou
inexatidões que possam aparecer neste documento.
DATASUL S.A.
Av. Santos Dumont, 831, Joinville, SC, CEP 89.222-900
i
Índice
Manutenção de Pais....................................................................................38
Consulta Cadastral Simples.........................................................................39
Consulta Cadastral Complexa.....................................................................40
Consulta Relacionamento............................................................................41
Relatórios, Cálculos, Fechamentos.............................................................42
Parâmetros Únicos......................................................................................46
Parâmetros Múltiplos..................................................................................46
Formação....................................................................................................47
Formação sem Navegação...........................................................................48
Importação..................................................................................................49
Exportação..................................................................................................51
Zoom de Tabelas.........................................................................................54
Vá Para.......................................................................................................55
Digitação Rápida.........................................................................................56
Painéis.........................................................................................................56
Funções.......................................................................................................57
Relatórios Relacionados
................................................................................................................57
Consultas Relacionadas...........................................................................57
CAPÍTULO 6 Includes e Utilitários Padrão..................................................58
UT-FIELD.I................................................................................................58
UT-RTLBL.I...............................................................................................59
UT-RUN.I...................................................................................................59
UT-MSGS.P................................................................................................64
IND01-10.I, IND11-50.I E IND51500.I......................................................65
UT-TABLE.I...............................................................................................67
UT-LITER.I................................................................................................67
UT-LIMIT.P...............................................................................................68
UT-GLOB.I................................................................................................69
I-FREEAC.I................................................................................................69
UT-DIR.P....................................................................................................69
BTB917ZX.P..............................................................................................70
BTB917ZY.P..............................................................................................71
BTB917ZZ.P...............................................................................................72
UT-VRBIN.P..............................................................................................73
UT-FINFO.P...............................................................................................74
UT-CMDLN.P............................................................................................75
UT-OSVER.P.............................................................................................75
I-COUNTDS.I.............................................................................................76
UT-WIN.I...................................................................................................77
UT-TRACE.P.............................................................................................80
CAPÍTULO 7
Tradução........................................................................................................81
TRADUÇÃO MONO-IDIOMAS...............................................................81
Tradução de variáveis com view-as nas telas..............................................81
Espaço Extra para tradução em relatórios...................................................86
TRADUÇÃO MULTI-IDIOMAS...............................................................87
Nomenclatura Padrão e Características do modelo.....................................87
Pontos de tradução .....................................................................................89
Contextos de tradução ................................................................................89
Itens de Tradução ......................................................................................90
Sequência de busca.....................................................................................92
UT-TRCAMPOS.P.....................................................................................93
UT-TRFRRP.P............................................................................................94
UT-LSTIT.P................................................................................................94
UT-LITER.P...............................................................................................95
UT-MSGS.P................................................................................................96
UT-FIELD.P...............................................................................................97
UT-TABLE.P..............................................................................................98
UT-LTMNU.P............................................................................................99
OBJETOS PROGRESS NÃO-INDEXADOS...........................................100
Tradução de variáveis com view-as nas telas............................................100
Espaço Extra para tradução em relatórios.................................................104
PRÁTICAS PARA IMPLEMENTAÇÃO MULTI-IDIOMAS.................105
Caso Prático Diferenças LIST-ITEMS para LIST-ITEM-PAIRS.............106
Caso conversão de List-items para LIST-ITEM-PAIRS...........................109
Tradução automática em frame de relatório..............................................110
Traduzir valor armazenado em uma variável............................................111
Tratando lista enorme de tradução em includes.........................................111
CAPÍTULO 8
Construção de Programas utilizando os Estilos e suas Técnicas..........116
Como construir um Cadastro Simples.......................................................116
Como construir um Cadastro Complexo...................................................118
Como construir um Cadastro Pai X Filho - Atualiza Filho........................122
Como construir um Cadastro Inclui/Modifica Filho..................................127
Como construir um Cadastro Pai X Filho - Atualiza Ambos.....................133
Como construir um Cadastro Inclui/Modifica Filho..................................137
Índice v
Código da API......................................................................................242
Como documentar API´s...........................................................................243
Como implementar evoluções de API´s....................................................244
UTAPI001.P.............................................................................................254
UTAPI002.P.............................................................................................254
UTAPI003.P.............................................................................................255
UTAPI004.P.............................................................................................255
UTAPI005.P.............................................................................................256
UTAPI006.P.............................................................................................258
UTAPI007.P.............................................................................................258
UTAPI008.P.............................................................................................259
UTAPI009.P.............................................................................................259
UTAPI010.P.............................................................................................259
UTAPI011.P.............................................................................................260
UTAPI012.P.............................................................................................260
UTAPI013.P.............................................................................................261
UTAPI018.P.............................................................................................261
UTAPI019.P.............................................................................................261
Índice vii
UTAPI027.P.............................................................................................262
UTAPI028.P.............................................................................................262
UTAPI029.P.............................................................................................262
APAPI009.P..............................................................................................263
Parâmetros de Entrada..........................................................................263
Parâmetros de Saída..............................................................................264
Execução...............................................................................................264
CAPÍTULO 14 Portabilidade de RCODES..................................................266
Regras para Portabilidade de RCODE......................................................266
Caso em Especial......................................................................................267
CAPÍTULO 15 Técnicas...............................................................................269
Como alterar o caracter de senha..............................................................269
Como alterar o diretório corrente..............................................................269
Como alterar ou criar uma variável de ambiente.......................................270
Como dar foco a qualquer objeto..............................................................271
Como deixar uma janela sempre visível....................................................272
Como utilizar OCX...................................................................................272
Como executar um aplicativo do Windows...............................................294
Como implementar Correção Ortográfica em Editores.............................295
Como obter as coordenadas do mouse......................................................297
Como obter o diretório corrente................................................................298
Como obter o diretório de sistema do Windows........................................299
Como obter o diretório do Windows.........................................................299
Como obter o nome do computador..........................................................300
Como obter o valor de uma variável de ambiente.....................................301
Como transformar uma janela em barra de ferramentas............................301
Como desabilitar Radio-Buttons...............................................................302
Como executar programas que são janelas................................................303
Como habilitar ou desabilitar botões em painéis.......................................304
Como habilitar ou desabilitar botões específicos em Browse Inclui/Modifica
..................................................................................................................306
Como implementar campos indicadores com view-as combo-box nas telas
..................................................................................................................307
Como implementar campos indicadores com view-as radio-set nas telas. 309
Como implementar campos indicadores num SmartBrowser....................311
Como implementar labels em retângulos utilizando o dicionário de dados
..................................................................................................................312
Como implementar mensagens para o usuário..........................................313
Mensagem de Erro/Advertência/Informação sem Parâmetros...............313
Mensagem de Erro/Advertência/Informação com Parâmetros..............314
Mensagens com Questionamento ao Usuário........................................314
Como implementar Tooltip em um determinado botão.............................315
Como implementar uma barra de progresso..............................................316
Como implementar acompanhamento (UT-ACOMP)...............................318
Como implementar Zoom e campos de referência para campos chave
estrangeira.................................................................................................320
Como implementar ThinZoom e campos de referência para campos chave
estrangeira em SmartObjects.....................................................................324
Como imprimir campos editores nos relatórios.........................................328
Como totalizar colunas de um browse.......................................................329
Como adaptar a procedure pi-retorna-valor no Custom Browser Zoom
Wizard......................................................................................................330
Situações necessárias............................................................................331
Como implementar Parâmetros de Impressão em Relatórios....................332
Impressão Página de Parâmetros:..........................................................332
Formato de Impressão (80 colunas ou 132 colunas):............................334
Como implementar Botão de Filtro em Zoom...........................................336
Como implementar reposicionamento de registro com base nas variáveis
globais.......................................................................................................337
Definição da Variável Global................................................................337
Reposicionamento Automático do Browser de Zoom...............................338
Como validar campos em viewers diferentes............................................340
Como construir gatilhos de dicionários de dados......................................341
Como implementar localizações...............................................................343
Padronização dos parâmetros do progress.ini............................................346
Como setar os modos de inclusão (Simple/Multiple) ...............................347
Como utilizar "functions" no UIB.............................................................347
Como verificar o registro de um OCX......................................................349
Como construir um browse com ordenação por coluna.............................351
Mini-Flexibilização...................................................................................353
Como registrar campo do tipo Fill-in para o WebEnabler.........................360
Como contar a quantidade de registros numa tabela.................................361
Como chamar um programa que é janela a partir de uma transação..........362
Como descobrir se o EAI está habilitado..................................................363
Como enviar gráficos ou documentos office para o WebEnabler..............363
Como migrar relatórios antigos para RTF.................................................364
Como converter consultas For Each para Send-SQL-Statement...............371
Utilitário para Geração de Comandos SQL...............................................376
Índice ix
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.ide Emitente.identific
ntific
"C"liente 1
"F"ornecedo 2
r
"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 Tipo de
Livre 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);
Construção de Programas utilizando os Estilos e suas Técnicas 5
CAPÍTULO 2
Estrutura de Diretórios
Datasul-EMS 2.0
Diretório Conteúdo
s
\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
\ Zooms do banco Administrativo
ADZOOM
\
\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
Construção de Programas utilizando os Estilos e suas Técnicas 7
CAPÍTULO 3
Nomenclatura
EDI ED
Engenharia EN
FASB/CMI FC
Faturamento FT
Férias Rescisões FR
Folha de Pagamento FP
Gerencial GE
Investimentos IN
Manutenção Industrial MI
MultiPlanta MP
Obrigações Fiscais OF
Patrimônio PT
Pedidos PD
Planejamento PL
Planejamento PC
Capacidade
Planejamento PI
Manutenção Industrial
Plano Mestre PM
Ponto Eletrônico PE
Recebimento RE
Recebimento RI
Internacional
Módulos do Datasul-HR 1.00
Módulo Sigla
Administração de AT
Treinamento
Benefícios BS
Cargos e Salários CA
Desenvolvimento de DS
Pessoal
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.
Tip Descrição Tipo de Formato
o Dado 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)
dat Data Date 99/99/9999
des Descrição Character X(40)
dsl Descrição - Longa Character X(15000)
hra Hora Character 99:99:99
idi Indicador - Inteiro Integer 9
Img Imagem Character X(08)
log Lógico Logical Sim/Não
mm Memory pointer MenPtr X(8)
p
no Nome Character X(30)
m
nu Número Integer >>>>,>>9
m
qtd Quantidade Decimal ->>>>,>>9.9999
qti Quantidade - Inteira Integer >>>,>>9
raw Raw Character X(15000)
rec Recid Recid >>>>>>9
row Rowid Rowid X(20)
so Som Character X(40)
m
val Valor Decimal ->>,>>>,>>>,>>9.99
vid Vídeo Character X(40)
vli Valor-inteiro Integer >>>,>>9
wg Widget-Handle Widget-Handle >>>>>>9
h
Construção de Programas utilizando os Estilos e suas Técnicas 19
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
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.
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 Diretório Nomencla Exemplos para a tabela
Objeto destino tura "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 xxzoom z99xx999.p z01in172.w
(Pesquisa)
• para os programas que estão ligados a um módulo do Datasul-EMS 2.00,
sendo então, containers ou programas .p, sem interface ou ainda API´s,
adota-se a nomenclatura abaixo, sendo que o diretório destino do
programa é sempre o diretório do módulo:
Tipo Nomencla Exemplos
tura
API xxapi999.p cep/ceapi001.p
Container xx9999zz.w5 cep/ce0401.w
Subprograma de relatório xx9999rp.p 6
cep/ce0401rp.p
Subprograma qualquer xx9999zz.p cep/ce0401a.p
sem interface
• para programas do produto Datasul-HR 1.00 deve ser observado um
controle na criação da numeração do nome do programa, conforme tabela
a seguir:
Numeração Tipo de Programas
0000 à 0099 Manutenções Cadastrais
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.
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.
Construção de Programas utilizando os Estilos e suas Técnicas 21
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 de nomenclatura, conforme o objetivo do include. As extensões dos
includes devem ser sempre .i, i1, .i2, ... e .i9.
Include com view-as de campos para o dicionário
de dados
São includes que incorporam a definição do view-as de campos indicadores
com tipo de dado inteiro. Estes includes são fundamentais para a tradução do
produto.
Diretório Nomencla Exemplos
destino tura
varinc var99999.i7 varinc/var00002.i
Includes de programas
A nomenclatura destes includes é dada em função do seu grau de reutilização:
Quando um include é apenas utilizado por um mesmo programa/procedimento,
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.
7
"999999" é um número seqüencial de includes dentro do diretório "varinc".
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 Prefi Exemplo
xo
Botão bt- bt-ok
Browse br- br-zoom
Combo- cb- cb-tipo-conta
box
Fill-in fi- fi-texto
Radio-set rs- rs-modo-execucao
Retângul rt- rt-moldura
o
Selection ls ls-estados
-list
Slider sl sl-percentual
Toggle- tb tb-ativo
box
Observação O padrão para nome de retângulo não é importante, pois dificilmente são
realizados tratamentos nos programas para este tipo de widget.
Construção de Programas utilizando os Estilos e suas Técnicas 23
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 Prefi Exemplo
dado xo
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- wh- wh-botao
handle
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
9 - Fixo
NNN - Número seqüencial dentro do Módulo.
Estes subprogramas podem ser reutilizados.
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
26
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;
• as telas podem ter no máximo 90 colunas, sendo que este tamanho é
sempre fixo, por 17 linhas, já este tamanho pode ser variável para menos,
mas sempre em número inteiro, estas dimensões acompanham o limite
para VGA. Estas dimensões devem ser informadas na "Property Sheet" da
janela no UIB, nos campos "Width" e "Height";
• definida a altura e largura de uma janela, as mesmas dimensões devem ser
utilizadas para as propriedades MAX-WIDTH-CHARS e MIN-WIDTH-
CHARS (altura máxima e mínima) e MAX-HEIGHT-CHARS e MIN-
HEIGHT-CHARS (largura máxima e mínima) (isto deve ficar num include
padrão). Com isso as janelas podem possuir a moldura dada pela
propriedade RESIZEABLE. O include WIN-SIZE.I faz estas atribuições.
Radio-Sets
• não podem possuir label, devido à limitações do UIB, por isso devem ser
emoldurados por um retângulo com uma literal para identificá-lo, que é o
próprio label. Ver capítulo: Como implementar labels em retângulos
utilizando o dicionário de dados; Exemplo:
CAPÍTULO 5
Estilos
Cadastro Simples
Característic • todas as funções, com exceção do zoom e do 'vá para', são realizadas na
as 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;
Construção de Programas utilizando os Estilos e suas Técnicas 31
Característic • o menu de barra da janela contém apenas as opções para Atualizar, sem as
as funções de 'Incluir', 'Copiar', 'Eliminar', como disposto no Cadastro
Simples.
Cadastro Complexo - Atualiza
Característic • é uma janela sem painéis, podendo possuir ou não folders de acordo com
as 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.
Construção de Programas utilizando os Estilos e suas Técnicas 37
Caraterística • tem as mesmas características da tela Pai x Filho - Atualiza Filho, além de
s 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).
Manutenção de Pais
Caraterística • é uma janela sem painéis, podendo possuir ou não folders, de acordo com
s 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.
Construção de Programas utilizando os Estilos e suas Técnicas 39
Característic • as funções com exceção do zoom e do 'Vá para', são realizadas na própria
as 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.
Consulta Cadastral Complexa
Consulta Relacionamento
Característic • é uma janela do tipo detalhe, isto é, sem menu de barra emoldura,
as 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:
Construção de Programas utilizando os Estilos e suas Técnicas 45
Parâmetros Únicos
Característic • é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
as 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.
Construção de Programas utilizando os Estilos e suas Técnicas 47
Formação
Importação
Característic • é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
as 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.
A seguir estão demonstrados os folders de Layout, Seleção e Parâmetros:
Construção de Programas utilizando os Estilos e suas Técnicas 51
Exportação
Característic • é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
as simulando uma caixa de diálogo;
• o botão 'Executar' tem como função disparar a exportaçã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 exportado;
• 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 serão
exportados;
• no folder de "Parâmetros" é determinado o nome do arquivo de saída que é
exportado no formato do Layout;
• a página de "Log" contém a determinação de modo de execução do
mesmo.
A seguir são mostrados os folders de Layout, Seleção e Parâmetros:
Construção de Programas utilizando os Estilos e suas Técnicas 53
Zoom de Tabelas
Característic • é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
as 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
Característic • é uma janela do tipo detalhe, isto é, sem menu de barra e moldura,
as 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úme Propriedad
ro e
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}}
Construção de Programas utilizando os Estilos e suas Técnicas 61
Onde:
{1} = nome externo do programa
{2} = parâmetros do programa
{3} = nome da variável do tipo "handle" para executar o programa persistente
[Opcional]
{btb/btb008za.i3 {1} {2}}
Onde:
{1} = nome externo do programa
{2} = nome da variável do tipo "handle" utilizada para eliminar a procedure
persistente [Opcional]
Funções
Idênticas ao Modelo Simplificado, 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
Gerai definido no aplicativo do programa;
s
Se o processo estiver sendo executado via RPW e o servidor RPC não foi
informado o programa será executado On-line.
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 Mensag Comportamento
Com RPC em
porta Inexistente - Yes Exibe mensagem 3045(*) via
ment PI_STATUS_ERROR.
o Inexistente - No Retorna mensagem 3045(*)
Existe e - Yes Exibe mensagem 16431(*) via
Executa PI_STATUS_ERROR.
RPC =no
Existe e Informado No Retorna mensagem 16431(*)
Executa
RPC =no
Existe e Não Informado No Executa ON-LINE
Executa
RPC =no
Existe e Informado e Yes Exibe mensagem 16433(*) via
Construção de Programas utilizando os Estilos e suas Técnicas 63
(*) 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 Apresentar para o usuário uma mensagem previamente cadastrada, no Sistema
de Mensagens, ou ainda, retornar para o programa propriedades desta
mensagem.
Notas:
• ao ser exibida uma mensagem, seu número vai ser exibido na barra de título da caixa de
diálogo, juntamente com o tipo de mensagem. Ex.: Pergunta: (10);
• antes da exibição de qualquer mensagem, será verificado se ela possui uma substituta, se
houver, a mensagem substituta será exibida ao invés da original. Da mesma forma, antes da
exibição da mensagem substituta, será verificado se esta também, possui uma mensagem
substituta e assim por diante;
• quando da exibição de mensagens substitutas, os números da mensagem original e da
mensagem substituta serão exibidos na barra de títulos da caixa de diálogo. Exemplo:
Advertência: (134) - (354), onde 134 seria a mensagem exibida e 354 a mensagem original.
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)
Construção de Programas utilizando os Estilos e suas Técnicas 65
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:
<banco>: nome lógico do banco de dados que contém o campo
<tabela>: nome da tabela que contém o campo
<propriedade>: número que identifica a propriedade conforme tabela abaixo:
Núme Proprieda
ro de
1 File-Label
2 Dump_Name
3 Desc
O retorno é obtido através do return-value. Exemplo:
def var c-tipo as character no-undo.
{utp/ut-table.i mgadm conta 1}
assign c-tipo:label in browse br-table = return-value.
UT-LITER.I
Objetivo Utilizar o cadastro de literais do Datasul-EMS, cadastrando automaticamente
as literais utilizadas no programa e retornando a 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:
Tip Alinhame
o nto
L A esquerda
C Centralizado
R A direita
O retorno é obtido através do return-value. Exemplo:
def var l-lista-narra as character no-undo.
{utp/ut-liter.i Lista_Narrativa MCE R}
assign l-lista-narra:label in frame {&frame-name} =
return-value.
UT-LIMIT.P
Objetivo Determinar o valor inicial e final de campos caracter, cujo formato é 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.
Construção de Programas utilizando os Estilos e suas Técnicas 69
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á l-implanta: variável lógica usada no Zoom, para habilitar o botão implanta.
veis c-seg-usuario: contém o nome do usuário corrente logado no menu.
defin
idas
I-FREEAC.I
Objetivo Converter strings acentuadas e caracteres especiais para strings não acentuadas
e caracteres simples.
Utilização • nos Templates de Relatório, Importação, Exportação e em pontos
específicos que necessitem que a saída de dados (impressora/arquivo/tela)
seja feita sem acentuação;
{include/i-freeac.i}
Formato
assign <variável> = fn-free-accent("<string>").
display fn-free-accent("<string>").
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:
<título>: título para a caixa de diálogo para selecionar diretórios
<pasta>: variável do tipo caracter onde será retornada a pasta selecionada
<cancelado>: uma variável do tipo lógica onde deve retornado se a caixa de
diálogo foi cancelada ou não
Exemplo:
run utp/ut-dir.p (input "Escolha um diretório,
output pasta,
output cancelado).
BTB917ZX.P
Objetivo Permitir a execução de sons do tipo MID e WAV.
Construção de Programas utilizando os Estilos e suas Técnicas 71
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
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").
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;
Construção de Programas utilizando os Estilos e suas Técnicas 73
• 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:
run btb/btb917zz.p (input "c:\windows\help\explorer.avi").
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,
Construção de Programas utilizando os Estilos e suas Técnicas 75
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
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
programa compilado, quando o banco de dados é acessado através do
DataServer (veja o item “Como contar a quantidade de registros numa
tabela” no cap. 15).
{include/i-countds.i &BANCO=mgadm
Formato
&TABELA=<tabela>
&COND=<condição>
&DEST=<variável> }
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.
Construção de Programas utilizando os Estilos e suas Técnicas 77
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}
• 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.
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
Construção de Programas utilizando os Estilos e suas Técnicas 81
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.
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 */
/****************************************************
**
** 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 ...
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
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.
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:
Construção de Programas utilizando os Estilos e suas Técnicas 95
• 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;
• 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
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:
Construção de Programas utilizando os Estilos e suas Técnicas 97
<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.
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.
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_nam Continua
e buscando
do banco
3 Desc
Este exemplo irá retornar o label da tabela conta do banco mgadm no dialeto
do usuário.
Construção de Programas utilizando os Estilos e suas Técnicas 99
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,
dos respectivos itens de menu, e retorna sua tradução para o programa
chamador.
Utilização Para este programa é passado como parâmetro 4 valores, sendo estes:
• Origem String substituindo os espaçõs em branco por "_".
• Contexto desejado. Neste caso, normalmente "*" (Contexto Genérico)
• Identificador da String (Os itens de menu estão entre 1 e 7).
• Identificador String de retorno - Para os itens de menu, existe nestas
tabelas além das descrições dos respectivos itens nos dialetos suportados,
também o nome de menu utilizado para que estes itens sejam apresentados
no produto. Este identificador tem o objetivo de indicar qual a string que o
desenvolvedor requer que seja retornado pelo utilitário, tendo para este
parâmetro dois possíveis valores:
Parâmetro Retorno
1 Descrição do Item de Menu
Traduzido
2 Descrição do nome de menu do
item de menu traduzido.
/* 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.
Caso Prático Diferenças LIST-ITEMS para LIST-
ITEM-PAIRS
Este primeiro caso prático está relacionado com a utilização de LIST-ITEM-
PAIRS e suas diferenças em relação à utilização com LIST-ITEMS.
A seguir uma lógica que era antes realizada com LIST-ITEMS, e algumas
observações:
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
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).
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ç As includes de retorno trabalham com 7 tipos de retorno atualmente:
ão 1. View-as combo-box
2. View-as radio-set
3. Lista com os itens separados por virgula
4. Retorna o item n da lista
5. Retorna o numero de itens da lista
6. Retorna a posição do item (número)
7. Valores para a propriedade Radio-Buttons de uma Radio-Set
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.
Construção de Programas utilizando os Estilos e suas Técnicas 113
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.
ELSE
ASSIGN c-lista = c-lista + "," + tt-list-
items.val-item + "," + STRING(tt-list-items.posicao).
END.
• 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;
Construção de Programas utilizando os Estilos e suas Técnicas 123
• 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.
Construção de Programas utilizando os Estilos e suas Técnicas 131
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} =
"".
• Se desejar preencher seqüencialmente o campo chave da tabela filho para
inclusão:
• Na SmartViewer que possuir a chave da tabela, deve ser criada
uma local-add-record e após o run dispatch deve ser inserida a
seguinte lógica na procedure:
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;
• verificar se já exista um programa "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 o nome do
programa de pesquisa da tabela pai, o nome do programa de "Vá Para" da
tabela pai e o nome do programa de Inclui/Modifica/Copia da tabela pai;
• criar um SmartLink do tipo STATE, tendo como Source o Painel p-navega
e como Target a SmartQuery;
• criar um SmartLink do tipo STATE, tendo como Source o Painel p-cadpai
e como Target a SmartQuery;
• criar um SmartLink do tipo STATE, tendo como Source o Painel p-exihel
e como Target a SmartQuery;
• verificar se já existe uma SmartViewer com os atributos da tabela pai que
estão expostos na página 0 da SmartWindow, ou seja, acima do folder.
Caso não exista, criar uma nova SmartViewer, utilizando o estilo
CustomViewer com Auto-Field;
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 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.
• 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:
RUN dispatch IN THIS-PROCEDURE ( INPUT 'create-record':U ) .
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
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 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.
PROCEDURE
h_viewer1 GROUP-ASSIGN h_viewer2
h_viewer1 GROUP-ASSIGN h_viewer3
h_query RECORD h_viewer2
h_query RECORD h_viewer3
Onde:
<Tabela>.<Campo>: é o campo da tabela ao qual deseja-se estabelecer limites,
e, fi-ini-campo e fi-fin-campo são os fill-ins que o usuário irá entrar com a
faixa de valores
Para:
assign input frame {&frame-name} fi-ini-cust-num fi-fin-cust-
num.
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 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.
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
5. Se a página de seleção não existir, no 'Main-block' do programa, corrigir a
chamada do include i-rpmbl.i, adicionando o nome da imagem associada a
página que se deseja apresentar como inicial, exemplo:
{include/i-rpmbl.i im-pg-par}
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
variáveis para obter automaticamente os labels, formatos e tamanhos do
dicionário de dados.
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 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.
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;
2. Em 'Section Editor', para o objeto browse br-digita adaptar os seguintes
gatilhos para a nova definição da temp-table tt-digita e outras
necessidades:
'Display': define os campos da temp-table a serem apresentados e quais
devem ficar habilitados;
'Row-entry': determina valores iniciais para os campos da temp-table na
inclusão de novas linhas, exceto quando se trata da primeira linha do
browse;
'Row-leave': salva as alterações feitas pelo usuário.
3. Ainda em 'Section Editor', mas para os botões bt-inserir e bt-alterar,
adaptar os seus gatilhos de 'Choose', na linha que aplica um evento 'Entry',
sobre o primeiro campo habilitado no browse;
4. Todas as validações do browse br-digita devem ser feitas na procedure pi-
executar no local indicado pelo comentário;
5. Opcionalmente, os gatilhos de 'leave' (para atributos de referência), 'f5' e
'mouse-select-dblclick' (para acionamento do zoom), para as colunas do
browse podem ser necessários. Neste caso, tais gatilhos devem ser
codificados "à mão", no início do 'Main Block' do programa. Exemplo:
ON F5, MOUSE-SELECT-DBLCLICK OF tt-digita.<campo> in
browse br-digita do:
{include/zoomvar.i ...}
END.
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,
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.
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
Construção de Programas utilizando os Estilos e suas Técnicas 167
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.
Exemplo de /* include de controle de versão */
um {include/i-prgvrs.i SP0014RP 1.00.00.000}
progr
ama
/* préprocessador para ativar ou não a saída para RTF */
RP.P
de &GLOBAL-DEFINE RTF YES
Relat
ório /* préprocessador para setar o tamanho da página */
&SCOPED-DEFINE pagesize 42
/* definição das temp-tables para recebimento de parâmetros */
DEFINE TEMP-TABLE tt-param NO-UNDO
FIELD destino AS INTEGER
FIELD arquivo AS CHARACTER FORMAT "x(35)"
FIELD usuario AS CHARACTER FORMAT "x(12)"
FIELD data-exec AS DATE
FIELD hora-exec AS INTEGER
FIELD classifica AS INTEGER
FIELD desc-classifica AS CHARACTER FORMAT "x(40)"
FIELD modelo-rtf AS CHARACTER FORMAT "x(35)" /*
arquivo modelo para RTF */
FIELD l-habilitaRtf AS LOG
FIELD ini-cust-num LIKE customer.cust-num /* campo
página seleção */
FIELD fim-cust-num LIKE customer.cust-num /* campo
página seleção */
FIELD sales-rep LIKE salesrep.sales-rep /* campo
página parâmetros */
.
/* 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.
/* 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
order.cust-num >= tt-param.ini-cust-num AND
order.cust-num <= tt-param.fim-cust-num
NO-LOCK
ON STOP UNDO, LEAVE:
RUN pi-acompanhar IN h-acomp (INPUT STRING(order.order-
num)).
DISPLAY STREAM str-rp
Order.Cust-Num
Order.Order-num
Order.Order-Date
Order.Promise-Date
Order.Sales-Rep
Order.Ship-Date
Order.Carrier WITH FRAME f-order.
DOWN STREAM str-rp WITH FRAME f-order.
END.
END.
ELSE DO:
FOR EACH order WHERE
order.sales-rep = tt-param.sales-rep AND
order.cust-num >= tt-param.ini-cust-num AND
Construção de Programas utilizando os Estilos e suas Técnicas 171
Cadastrando
os
Parâ
metr
os
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.
Construção de Programas utilizando os Estilos e suas Técnicas 175
else
run new-state('update-begin':U).
run dispatch in this procedure ('enable-fields').
Lista de Links:
Source
' Link Type Target
h_browse- STATE THIS-PROCEDURE
formação
h_p-exihel STATE h_query
h_p-navega NAVIGATION h_query
h_p-navega STATE h_query
h_query RECORD h_viewer
h_query RECORD h_browse-formação
THIS STATE h_browse-fonte
PROCEDURE
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'.
Construção de Programas utilizando os Estilos e suas Técnicas 187
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.
Construção de Programas utilizando os Estilos e suas Técnicas 189
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.
Construção de Programas utilizando os Estilos e suas Técnicas 193
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.
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.
Construção de Programas utilizando os Estilos e suas Técnicas 195
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.
'
Window Masters/w-pesqui.w
Pesquisa
Implementaç • selecionar o estilo relacionado na tabela acima;
ão
• é necessário utilizar um SmartBrowser para cada classificação do
programa de Pesquisa, onde a ordem das colunas no browser deve ser a
ordem de classificação, para todos os SmartBrowsers que devem estar
colocados no programa de Pesquisa, seguir os seguintes passos:
• verificar se já existe um SmartBrowser com os dados
necessários para a pesquisa e se eles devem estar na mesma ordem da
classificação desejada. Caso não exista, criar um novo utilizando o
estilo CustomBrowserZoom Wizard;
• instanciar o SmartBrowser no SmartFolder;
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.
{utp/ut-liter.i Quantidade * R}
assign fill-in_Qty:label in frame {&frame-name} = return-
value.
{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. */
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:
define variable c-p-cadsim as character no-undo.
if not adm-new-record and available <tabela> then do:
if <condição> then do:
RUN get-link-handle IN adm-broker-hdl
(INPUT THIS-PROCEDURE,
INPUT "TableIO-Source",
OUTPUT c-p-cadsim).
if valid-handle(widget-handle(c-p-cadsim)) then do:
RUN pi-cancelar IN widget-handle(c-p-
cadsim).
<mensagem>.
return "ADM-ERROR":U.
end.
end.
end.
Onde:
<tabela>: a tabela que está sendo utilizada na manutenção
<condição>: uma condição qualquer que indica que o registro não pode ser
alterado
<mensagem>: uma mensagem a ser apresentada ao usuário informando
impossibilidade da alteração para o registro.
Observação Essa técnica deve ser evitada, pois o usuário verá o botão de alteração
habilitado e ao tentar alterar o registro a mensagem irá interrompê-lo, contradizendo a função do
botão.
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
• antes de criar uma nova mensagem verificar se não há outra similar que
possa ser utilizada. Exemplo:
Eliminação Inválida !
Eliminação inválida!
Para auxiliar esta operação, o Sistema de Mensagens possui o botão Pesquisa,
onde você pode buscar por Código ou pelo Texto da Mensagem. Além disso,
ainda possui a opção de Filtro onde você informa palavras que deseja procurar
dentro do sistema.
• não abreviar palavras sem necessidade (somente por questões de espaço).
Exemplo:
Cond. Pagto.
Estabelec
Dt Ent Prev
Cod Dest Merc
Encer calc não efetuado.
• não utilizar palavras ou jargões técnicos. Exemplos:
Título já existe no browse
Script do Automanager não encontrado.
• utilizar o help da mensagem somente se necessário, se houver algo a
acrescentar. Não utilizá-lo, somente para repetir a mesma mensagem.
Exemplo:
Agência não cadastrada. Help Agência não cadastrada!
Item para debito direto - Help Item para debito direto.
• procurar ser formal. Não utilizar gírias. Exemplo:
Linha Possui Ordens Valorizadas ! Não pode alterar !
• Não utilizar o tratamento VOCÊ.
• utilizar somente o idioma português (com exceção de palavras técnicas
específicas). Exemplo:
Parámetros
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:
** Pendencias de Credito do Cliente
• não criar mensagens sem sentido. Exemplos:
a
nd
fghfhdfh - fhdfjhdfghdf
Vários
Representante
teteretert
fadfads
• a mensagem deve ser o mais clara e sucinta possível. Qualquer
necessidade de detalhamento, utilizar o help;
• não criar mensagem somente com letras maiúsculas.
Padrões para tradução de mensagens para Inglês
e Espanhol
• utilizar os mesmos padrões para criação de mensagens novas;
• no caso de dúvidas, consultar Glossário ou demais membros da equipe de
tradução.
229
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.
Nomenclatur A nomenclatura dos includes que contém este tipo de procedure interna deve
a ser a seguinte:
XXINC999.i, onde:
XX - Sigla do Módulo
INC - Fixo
999 - Seqüencial.
230
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.
Construção de Programas utilizando os Estilos e suas Técnicas 231
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;
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
Campo Descrição
cod-versao- Número da versão de integração
integracao
cod-transacao
log-replica-msg
cod-erro
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",
Construção de Programas utilizando os Estilos e suas Técnicas 243
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.
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.
Construção de Programas utilizando os Estilos e suas Técnicas 245
Evolução de
lógic
a de
API ,
com
muda
nças
de
parâ
metr
os
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ógic
a de
API,
com
alter
ação
de
camp
os na
temp
-
table Para este tipo de evolução, deve ser criada uma nova API com o mesmo nome
s de da API antiga, acrescida de um diferenciador. Ex.: UTAPI001.P
parâ UTAPI001A.P.
metr Esta nova API deve possuir uma procedure interna EXECUTE, que receberá
os 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
Construção de Programas utilizando os Estilos e suas Técnicas 247
Evolução de
lógic
a de
API,
com
muda
nça
de
parâ
metr
os,
que
já foi Para este tipo de evolução, deve ser criada uma nova procedure interna com o
evolu mesmo nome da procedure interna antiga, acrescida de um diferenciador. Ex.:
ída 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.
Evolução de Observação Os parâmetros novos que são passados como padrão para a nova procedure
lógic interna, devem garantir que o resultado seja o mesmo da antiga procedure interna.
a de
API
com
muda
nça
de
parâ
metr
os,
onde
não é
possí
vel Para este tipo de evolução, deve ser criada uma nova procedure interna ou API
deter com o mesmo nome da procedure interna antiga, acrescida de um
mina diferenciador, conforme exemplificando nos itens anteriores.
r um
valor Como não é possível determinar valores padrão, a procedure interna ou API
padr antiga deve retornar um erro para que o programa que o chamou emita uma
ão mensagem de erro explicando o motivo que a API não foi executada e qual o
para motivo da obrigatoriedade de novo parâmetro.
o
novo
parâ
metr
o ou
o
novo
parâ
metr
oé
obrig
atóri
o
Construção de Programas utilizando os Estilos e suas Técnicas 251
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ógic
a de
API
com
muda
nça
de
versã
o de
integ
raçã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.
Construção de Programas utilizando os Estilos e suas Técnicas 253
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.
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.
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.
Construção de Programas utilizando os Estilos e suas Técnicas 255
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).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi013 ao invés deste.
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);
Construção de Programas utilizando os Estilos e suas Técnicas 257
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.
Interface Este programa não possui interface. Apenas envia o E-Mail.
UTAPI006.P
A API utp/utapi006.p permite a busca de dados de uma planilha Excel para o
Progress.
No programa 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 Atualização de arquivos para o Microsoft Excel 97 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 97 (docapi/utapi008.doc).
Importante Para novos programas que venham a utilizar esta API, é
recomendado que seja utilizado o programa utp/utapi018 ao invés deste.
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).
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.
Construção de Programas utilizando os Estilos e suas Técnicas 261
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).
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
Construção de Programas utilizando os Estilos e suas Técnicas 263
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).
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çõe • devem ser passadas 1 (uma) temp-table de entrada e 1 (uma) de saída
s contendo as informações para atualização dos PF´s;
Gerai
• todas as temp-tables são passadas como parâmetro através dos comandos
s
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
c-usuario Usuário corrente
l-vid-rel Mostra mensagens na tela ou gera temp-table de erros
l-acompanha Mostra acompanhamento na tela?
Parâmetros de Saída
Temp-table tt-erro-pef: serão gerados registros nesta temp-table quando 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 Mensagem Ajuda
Erro
3941 Versão de integração incorreta ! Aversão de integração informada
Construção de Programas utilizando os Estilos e suas Técnicas 265
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.
Até o momento foi constatado o problema nos comandos CREATE SERVER
e EXPORT. Para solucionar o problema, é necessário identificar se existe
outra maneira para realizar a tarefa desejada, caso contrário, será necessário
manter RCODES para cada ambiente existente.
Para os casos identificados, o comando EXPORT pode ser substituído por
PUT ou DIPLAY (utilizando a opção STREAM-IO). Para o comando
CREATE SERVER, será necessário manter um RCODE por ambiente
existente, isto é, um RCODE para ambiente Windows e outro para ambiente
Unix.
269
CAPÍTULO 15
Técnicas
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.
Como deixar uma janela sempre visível
Objetivo Esta técnica pode ser usada sempre que uma janela, mesmo perdendo o foco,
permaneça visível.
Implementaç • inserir a chamada da include i-win.i, no início do bloco de definições;
ão {include/i-win.i}
Instalação Faz-se necessário que o OCX esteja registrado na máquina onde será
desenvolvido o programa. O programa para registrar e instalar cada OCX
encontra-se na pasta interfac dos produtos Datasul.
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”.
Construção de Programas utilizando os Estilos e suas Técnicas 277
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
• Tick É o evento que é disparado após cada intervalo de tempo
determinado.
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.
Construção de Programas utilizando os Estilos e suas Técnicas 285
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.
conexão.
Sintaxe: <com-handle>:Disconnect ( ).
chCtrlFrame:Disconnect().
• RECEIVE Método que recebe as informações que o servidor
Telnet está enviando para o programa. Esse método retorna uma
varíavel do tipo character com as informações enviadas pelo servidor.
Sintaxe: <com-handle>:Receive.
chCtrlFrame:Receive.
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".
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 é
Construção de Programas utilizando os Estilos e suas Técnicas 289
Decimal-Left AS FLOAT,
Decimal-Top AS FLOAT,
Decimal-Width AS FLOAT,
Decimal-Height AS FLOAT ).
É 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:
IF nome-rs:DISABLE(ENTRY(X,(nome-rs:RADIO-BUTTONS IN FRAME
{&FRAME-NAME}))) THEN.
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.
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.
Construção de Programas utilizando os Estilos e suas Técnicas 305
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.
record e após o run dispatch fazer o assign da variável para o campo da tabela. Caso este campo
faça parte da chave, o assign deve ser feito na local-create-record, também após o run dispatch.
Onde:
{03}:indica a função a ser realizada, conforme a tabela abaixo:
Funçã Objetivo
o
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 retorna a posição do item (número)
item
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 ...
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:
Construção de Programas utilizando os Estilos e suas Técnicas 321
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
zoom, que recebe os parâmetros. Deve conter um valor do tipo:
¶metros="run pi-procedure in wh-pesquisa(input 'inicio', input 'fim').".
Exemplos:
a) chamada de zoom para atributos em um frame:
ON F5 OF ord-prod.it-codigo in frame {&FRAME-NAME}
OR MOUSE-SELECT-DBLCLICK OF ord-prod.it-codigo in frame
{&FRAME-NAME} DO:
{include/zoomvar.i &prog-zoom=inzoom/z01in172.w
&campo=ord-prod.it-codigo
&campozoom=it-codigo}
END.
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.
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.
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;
• a partir de um campo chave estrangeira de uma tabela;
• a partir de uma variável;
• a partir de um campo chave estrangeira de uma tabela cujo nome não
coincide com o nome do campo no browse de pesquisa, de onde o valor
será buscado (Exemplo: Na viewer o campo chama-se it-codigo-pai, e no
browse o campo chama-se it-codigo, simplesmente - comum em tabelas
com auto-relacionamento);
Sintaxe:
{method/ZoomFields.i &ProgramZoom="nome do programa"
&FieldZoomN="nome do campo que retorna"
&FieldScreenN="nome do campo ou 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:
Construção de Programas utilizando os Estilos e suas Técnicas 327
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.
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}.
form
tt-editor.conteudo format "x(50)" no-label
with stream-io width 132 frame f-imp.
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.
Column: 2,00
Row: 8,63
Width: 46,29
Height: 1,71
3. Na frame f-pg-imp, inserir um objeto fill-in, com as propriedades a seguir:
• Object: text-parametro
• No-Label: selecionado
• Column: 1,29
• Row: 8,25
• 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.
• Width: 46,29
• Height: 1,71 ou 2.79 (caso exista o objeto tb-parametro)
3. Na frame f-pg-imp, inserir um objeto fill-in, com as propriedades abaixo:
• Object: text-parametro
• No-Label: selecionado
• Column: 1,29
• Row: 8,25
• Width: 31,00
• Height: 0,92
• Initial Value: Parâmetros de Impressão
• Private Data: Parâmetros de Impressão
4. Na frame f-pg-imp, inserir um objeto radio-set, com as propriedades
abaixo:
• Object: rs-formato
• Buttons:
"80 colunas", 1,
"132 colunas", 2
• Column: 3
• Row: 9,00 ou 10,08 (caso exista o objeto tb-parametro)
• Width: 32,00
• Height: 0,83
• Horizontal: selecionado
• Initial Value: 2
• Help: Formato de Impressão
5. Na procedure pi-executar, alterar a lógica de assign da Temp-table tt-
param para gravar o campo formato
assign tt-param.usuario = c-seg-usuario
tt-param.destino = input frame f-pg-imp rs-destino
tt-param.data-exec = today
tt-param.hora-exec = time
tt-param.classifica = input frame f-pg-cla rs-classif
tt-param.desc-classifica = entry((tt-param.classifica
- 1) * 2 + 1, rs-classif:radio-buttons in frame f-pg-cla)
tt-param.formato = if input frame f-pg-imp rs-formato
= "1" then 1 else 2.
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).
Ao utilizar uma mesma viewer em dois programas e um deles é consulta do
outro, a variável global é zerada. Para que seja evitado este problema, faça o
seguinte:
• criar, na Window do programa chamado, na área de DEFINITIONS, uma
variável LOCAL como ROWID:
def var rw-<nome-tabela> as rowid no-undo.
Campos da tabela
ext-tipo-tax
cod-tax
cod-sicore
Índices da tabela ext-tipo-tax:
Flag IndexNa Cnt Field
s me Name
pu cg-tipo-tax 1 + cod-tax
7. No módulo de Segurança são administradas as informações do produto
Datasul-EMS 2.00, através da implementação de níveis de segurança a um
determinado país, definindo-se a permissão para cada um, e portanto,
conceder automaticamente a mesma permissão para todos os usuários que
fazem parte deste país;
8. Para a localização de programas do Datasul-EMS, onde não é realizada a
substituição completa do mesmo, deve-se utilizar a técnica de construção
de APPC - Application Partner Program Call (ainda não documentada).
Onde:
<handle-panel>: variável que contenha o valor do handle do panel
<valor>: valor para a propriedade que pode ser: Simple ou Multiple
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:
Construção de Programas utilizando os Estilos e suas Técnicas 349
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).
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.
Construção de Programas utilizando os Estilos e suas Técnicas 353
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
movmnt_dbtype
Construção de Programas utilizando os Estilos e suas Técnicas 355
Nome do pré-processador
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".
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.
Implementaç Nos programas que possuem integração através do EAI, antes da chamada dos
ão 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.
LABEL
text-modo AT ROW 8.13 COL 1.14 COLON-ALIGNED NO-
LABEL
rect-rtf AT ROW 4.46 COL 2
RECT-7 AT ROW 1.33 COL 2.14
RECT-9 AT ROW 8.33 COL 2
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 3 ROW 3
SIZE 73.72 BY 10.5.
end case.
end.
&IF "{&RTF}":U = "YES":U &THEN
RUN pi-habilitaRtf.
&endif
END.
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) +
" order.order-num >= 100 AND" + CHR(10) +
" order.order-num <= 900 AND" + CHR(10) +
" (order.sales-rep BETWEEN UPPER(" + p2oCharacter(c-
sales-rep-ini) + ") AND LOWER(" + p2oCharacter(c-sales-rep-
fim) + ")) AND" + CHR(10) +
" (order.Promise-Date BETWEEN " + p2oDate(da-entrega-
ini) + " AND " + p2oDate(da-entrega-fim) + ")) ".
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:
Construção de Programas utilizando os Estilos e suas Técnicas 381
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”.
/* corpo do relat¾rio */
&IF "{&EMS_DBTYPE}" = "Oracle" &THEN
RUN utp/ut-select.p PERSISTENT SET utSelect.
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