Você está na página 1de 147

Manual de Técnicas

Interface para WEB


Janeiro/2007
Copyright © 2009 TOTVS 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 TOTVS S.A., que reserva-se o
direito de efetuar alterações sem aviso prévio. A TOTVS S.A não assume
nenhuma responsabilidade pelas conseqüências de quaisquer erros ou
inexatidões que possam aparecer neste documento.
TOTVS S.A.
Av. Santos Dumont, 831, Joinville, SC, CEP 89.222-900
i

Índice

CAPÍTULO 1 Introdução..............................................3
Aculturação WEB.........................................................................................5
HTML...........................................................................................................6
TAGS HTML...............................................................................................7
Webspeed....................................................................................................19
Desenvolvimento de Aplicações em WebSpeed.........................................21
JavaScript....................................................................................................23
CAPÍTULO 2 Templates para WEB.....................................29
Como utilizar o SWG..................................................................................29
Construindo um Cadastro/Consulta Simples...............................................32
Tarefas........................................................................................................32
Construindo um Cadastro/Consulta Complexo...........................................38
Tarefas........................................................................................................39
Construindo um Pai x Filho........................................................................44
Tarefas – Consulta Pai................................................................................45
Tarefas – Consulta Filho.............................................................................49
Construindo um Cadastro Pai Simples/Complexo......................................53
Tarefas........................................................................................................53
Construindo um Cadastro Filho Simples/Complexo...................................58
Tarefas........................................................................................................58
Construindo um Vá Para.............................................................................63
Tarefas........................................................................................................63
Construindo um Pesquisa / Zoom...............................................................67
Tarefas........................................................................................................67
Construindo um Relatório...........................................................................74
Tarefas........................................................................................................75
CAPÍTULO 3 Includes...............................................82
CAPÍTULO 4 Utilitários............................................85
WU-GRAF..................................................................................................85
CAPÍTULO 5 Como usar uma BO.......................................90
CAPÍTULO 6 Contexto de Sessão.....................................93
ii

Funcionamento...........................................................................................93
CAPÍTULO 7 Contexto de Transação..................................97
Funcionamento...........................................................................................98
Recuperando o número da última seqüência.............................................100
CAPÍTULO 8 API de Browse – wu-browse.p...........................101
CAPÍTULO 9 Técnicas e Considerações Gerais.......................109
Includes do EMS 2 GUI............................................................................109
Label dos Campos no HTML´s.................................................................109
Controles para a não utilização de cache...................................................110
Inclusão recursiva.....................................................................................110
Fechamento de janelas de inclusão de pai.................................................110
Validações em Geral.................................................................................110
Validação de Inicial e Final......................................................................111
Validações em Relatórios..........................................................................111
Desenvolvimento Específico/Customizações............................................111
Como fazer links para detalhe do registro.................................................112
Como habilitar/desabilitar campos nos HTML´s......................................113
Utilizar a área do label do radio-set e check-box para click do mouse......113
Botão de zoom para tabela estrangeira......................................................114
Como selecionar um Texto via JavaScript................................................114
Como definir nomes das FRAMES(Janelas):............................................116
Blocos de Assign e funções do Webspeed................................................118
Programa de filho chamando um outro programa de Pai x Filho..............119
Selecionar , Inverter e Desmarcar CHECKBOX via JavaScript................123
Como trazer em relatórios o servidor default do usuário...........................124
Como acrescentar um botão “Implantar” no Zoom...................................126
Utilizando Help na WEB..........................................................................127
Perfil do Usuário.......................................................................................127
Consultas Relacionadas............................................................................129
Uso de páginas de código..........................................................................131
Customização de arquivos WebSpeed......................................................132
Tratamento de Erros..................................................................................135
Validações de Campos na WEB................................................................137
Preferências do Usuário – wu-uspf.p........................................................140
Como posicionar o cursor em um campo via JavaScript...........................143
Como migrar relatórios antigos para RTF.................................................144
Retirar opção de impressão em RTF.........................................................150
Características
Definição

CAPÍTULO 1

Introdução

Este manual tem por objetivo relacionar as técnicas para construção de


programas de interface para WEB (verifique também o manual de técnicas de
BO´s).
As principais características são:

Nomenclatura
 o nome do programa deve ser “w” + nome do programa GUI
correspondente. Exemplo: wpd0501.w
 o nome do HTML é o nome do programa “.w” correspondente + a
terminação “html”. Exemplo: wpd0501.html.
 os programas criados para WEB devem estar em letras minúsculas.

Estrutura de Diretórios
A estrutura para diretórios deve ser desta forma:
1º Nível 2º Nível 3º Nível Finalidade
<Diretório Produto> web/ app/ Contém os programas dos módulos (.w, .html, .i).
ccp/
pdp/
ctp/
...
adzoom/ Programas de zoom separados por aplicativos.
unzoom/
Observação:

inzoom/
dizoom/
adgo/ Programas de VáPara (goto) separados por
aplicativo.
ungo/
ingo/
digo/
wimages/ Imagens utilizadas nos programas de interface da
web.
winclude/ Includes específicos para includes dos templates
web.
wutp/ Utilitários específicos para web.

Imagens
As imagens devem estar nos padrões .GIF OU .JPG.
Devem ser criadas sempre no diretório: WEB/wimages
A referência a imagens nos programas e htmls deve ser:
/ems20web/wimages/<nome-image>

/ems20web/ é um alias que deve ser configurado no webserver para que as


imagens possam ser localizadas. Este alias deve ser inicializado com <dir-
base>/web/ (dir-base é o diretório onde foi instalado as transações web).

Testes com Nestcape e Internet Explorer


Os programas para WEB são desenvolvidos utilizando como browsers padrão
o Nestcape e Internet Explorer.
Portanto, os programas devem ser testados nestes dois browsers, para garantir
o correto funcionamento dos programas nestes browsers padrão.
Se algum programa apresentar problema em um dos dois browsers, deve-se
procurar simplificar a interface de forma a solucionar o problema. Deve-se
procurar usar os recursos mais simples.
A Internet:

Templates para WEB 5

Aculturação WEB

O ambiente WEB tem um conceito diferente do client-server, pois todo o


processamento é feito no servidor WEB.

Rede composta por milhares de redes de computadores espalhadas pelo mundo


todo.
A informação disponível na Internet é encontrada em computadores chamados
servidores. Eles recebem este nome porque mediante solicitação, eles servem
(ou fornecem) a informação ao solicitante.
Existem servidores específicos para os diferentes formatos de informação
disponível na rede. Por exemplo, existem servidores para a web, para ftp e
para correio eletrônico.
Programas clientes são programas com a capacidade de fazer uma solicitação a
um servidor e receber sua resposta.

Protocolos Protocolo é um conjunto de regras que determinam como um computador deve


proceder para estabelecer uma conexão para troca de informação com outro
computador.
Existem protocolos específicos para cada tipo de serviço disponível na Internet
e, para dois computadores trocarem informações através dela, é necessário que
ambos estejam seguindo o mesmo protocolo.

Url’s, Endereços, URL (Uniform Resource Location) é a maneira mais precisa de definir a
IP’s, DNS localização de um recurso na Rede.
O formato de uma URL é: protocolo://host/diretório/arquivo
Ex: http://www2.datasul.com.br/br/planeta2000/planeta2000_tec.htm
Todo computador na Internet é identificado por seu endereço IP, que é
formado por quatro conjunto de números separados pelo caracter “.” .
Ex: 200.247.1.1
DNS (Domain Name System) é um sistema que associa termos comuns de
nossa linguagem à endereços IP para facilitar a memorização dos nomes dos
computadores.
Ex: www.datasul.com.br --> 200.247.35.1

World Wide Web A Web é um serviço multimídia e estruturado de acordo com o conceito de
hipertexto que está disponível na Internet.
Documentos para a Web são escritos em HTML, que permite a criação de
ligações entre eles. Estas ligações, características do hipertexto, recebem o
nome de link e possibilitam que se navegue entre documentos com facilidade.

O HTML é uma linguagem de marcação. Ele possui um conjunto de marcas,


chamadas de tag, que determinam a aparência e a funcionalidade do
documento. A maioria das tags é subdividida em tag de abertura e tag de
fechamento que definem seu escopo de atuação.

O cliente para acessar a Web recebe o nome de Browser.


Ex.: Internet Explorer, Netscape.

HTML

HTML é a abreviação de “Hyper Text Markup Language”, e nada mais que uma
linguagem de marcação, ou seja, um conjunto de indicadores (chamados de
“TAGS”) que definem o texto e os objetos dos documentos (Estático).

É uma linguagem versátil que permiter criar vínculos (chamadas) a outros


documentos (Links).

Pode ser criado e lido em qualquer editor de textos.


Templates para WEB 7

Sua interpretação não requer nenhum compilador, é feita através de browsers


(Netscape, Internet Explorer da Microsoft, etc)
.

TAGS HTML

São um conjunto de indicadores ( “TAGS”) que definem o texto e os objetos


dos documentos.

Escopo <html> Primeira tag de um documento, determina que seu conteúdo estará escrito em
HTML.
Ex.:

<html>
Conteúdo
</html>

Cabeçalho <head> Forma o cabeçalho da página. O cabeçalho contém informações que não farão
parte do texto do documento.
Ex.:

<html>
<head>
Conteúdo
</head>
</html>

Comentário
“<!-- informação -->”
Tag utilizada para inserir comentários dentro do documento.
Ex.:
<html>
<head>
<!-- Este é o meu comentário -->
</head>
</html>

Título <title> Define o título da página. É exibido no topo da janela do browser.


Ex:
<title>
Este é o titulo de minha página
</title>

Corpo do Define o corpo da página. É o conteúdo que será exibido no interior do


Documento <Body> browser.
Ex.:
<html>
<head>
</head>
<body background=“imagem” bgcolor=“Cor” text=“Cor”>
Conteúdo
</body>
</html>

Onde:
background: Especifica a imagem (GIF ou JPEG) usada para preencher o
fundo da tela.
bgcolor: Define a cor de fundo da tela.
text: Determina a cor padrão do texto da página.

Negrito <b>
Define que o texto deve ser exibido em negrito.
Ex.:
<b> Texto </b>
Templates para WEB 9

Sublinhado <u> Define que o texto deve ser sublinhado.


Sintaxe:
<u> Texto </u>

Itálico <i> Define que o texto deve ser exibido em itálico.


Ex.:
<i> Texto </i>

Quebra de linha Força uma quebra de linha, sem espaçamento entre elas. Não possui tag de
<br> fechamento.
Ex.:
<br>Texto </br>

Parágrafo <p> Define um novo parágrafo. Exibe um espaço entre as linhas.


Ex.:
<p> Texto </p>

Formatação <font> Exibe o texto no tamanho de fonte e cores especificados.


Ex.:
<font size=“n” color=“Cor” face=“tipodefonte”>
Texto
</font>

Onde:
size: Tamanho da fonte (1a7).
color: Exibe o texto na cor especificada.
face: Exibe o texto utilizando a fonte escolhida.

Lista Numerada Cria uma lista numerada.


<ol>,<li> Ex.:
<ol>
<li> item 1
<li> item 2
</ol>

Lista Não Numerada Cria uma lista não numerada.


<ul>,<li> Sintaxe:
<ul type=“tipo”>
<li> item 1
<li> item 2
</ul>
Onde:
type: Tipo de botão que precede cada item.
Tipos disponíveis:
- disk: Pequeno disco sólido.
- square: Quadrado preenchido.
- circle: Círculo.
Link <a> Cria um link na página.
Ex.:

<a href=“arquivo.htm” target=“quadro> Texto ou imagem que será o


link</a>
<a href=“http://host/dir/arq.htm” target=“quadro> Texto ou imagem que
será o link </a>
<a href=“mailto:user@dom.com.br”> Texto ou imagem que será o link
</a>
<a href=“#rótulo”> Texto ou imagem que será o link </a> <a
name=“rótulo”> </a>

Onde:
href: Destino do link.
name: Rótulo dado a uma parte do documento.
target: Quadro aonde a página deverá ser exibida.
Templates para WEB 11

Além de quadros criados com a tag <frameset>, pode ter os valores:


- _blank: Exibe o link em uma nova janela.
- _parent: Exibe o link no frame pai.
- _top: Remove todos os frames e exibe numa janela inteira.

Imagem <img> Insere uma imagem na página.


Ex.:

<img src=“imagem” alt=“texto” border=“n1” height=“n2” width=“n3”


vspace=“n4” hspace=“n5” align=“posição”>

Onde:
src: Localização e nome do arquivo da imagem a ser inserida.
alt: Frase alternativa a ser exibida no lugar da imagem.
border: Espessura da borda em torno da imagem.
height: Altura da imagem.
width: Largura da imagem.
vspace: Espaçamento vertical entre a imagem e o texto.
hspace: Espaçamento horizontal entre a imagem e o texto.
align: Define como a imagem e o texto serão alinhados.
Opções:
- left: Alinha a imagem com a margem esquerda e faz o texto fluir do lado
direito da imagem.
- right: Alinha a imagem com a margem direita e faz o texto fluir do lado
esquerdo da imagem.
- top: Alinha o topo da imagem com o topo do item mais alto na linha de texto
da imagem.
- middle: Alinha o meio da imagem com a base da linha de texto.

Tabelas <table> Criação de tabelas.


Ex.:
<table border=“n1” height=“n2” width=“n3” cellspacing=“n4”
bgcolor=”cor">
<tr>
</tr>
<tr>
</tr>
</table>
Onde:
border: Espessura da borda em torno das células da tabela.
height: Altura da tabela na tela.
width: Largura da tabela na tela.
cellspacing : Espaço entre as células individuais da tabela.
bgcolor: Cor de fundo da tabela.

Linhas para Tabela Criação de linhas em uma tabela.


<tr> Ex.:
<tr align=“tipo1” valign=“tipo2” bgcolor=”cor">
<td> Texto ou imagens </td>
...
</tr>
Onde:
align: Alinhamento horizontal do conteúdo das células.
Opções:
- Left
- Right
- Center
valign: Alinhamento vertical do conteúdo das céluas.
Opções:
- Top
- Middle
- Bottom
bgcolor: Cor de fundo da tabela.

Título de colunas Definição das células da linha de título em uma tabela.


para tabela <th> Ex.:
<th colspan=“n1” rowspan=“n2” width=“n3” align=“t1”
valign=“t2” bgcolor=”cor” nowrap>
Templates para WEB 13

Texto ou imagens
</th>
Onde:
colspan: Quantidade de colunas que serão ocupadas pela célula.
rowspan: Quantidade de linhas que serão ocupadas pela célula.
width: Define a largura da célula.
align: Alinhamento horizontal do conteúdo das células.
Opções:
- Left
- Right
- Center
valign: Alinhamento vertical do conteúdo das céluas.
Opções:
- Top
- Middle
- Bottom
nowrap: Exibe o texto como uma linha contínua, não permitindo quebras.
bgcolor: Cor de fundo da tabela.

Definição de Células Definição das células em uma tabela.


para tabela <td> Ex.:
<td colspan=“n1” rowspan=“n2” width=“n3” align=“t1”
valign=“t2” bgcolor=”cor" nowrap>
Texto ou imagens
</td>
Onde:
colspan: Quantidade de colunas que serão ocupadas pela célula.
rowspan: Quantidade de linhas que serão ocupadas pela célula.
width: Define a largura da célula.
align: Alinhamento horizontal do conteúdo das células.
Opções:
- Left
- Right
- Center
valign: Alinhamento vertical do conteúdo das céluas.
Opções:
- Top
- Middle
- Bottom
nowrap: Exibe o texto como uma linha contínua, não permitindo quebras.
bgcolor: Cor de fundo da tabela.

Formulário <form> Criação de formulário para troca de dados com o servidor.


Ex.:
<form action=“programa” method=“POST” >
Texto, imagens e elementos de formulários
</form>
Onde:
action: Define para onde enviar o conteúdo do formulário.
method: Define como o conteúdo do formulário será enviado. As opções são
GET e POST. Sempre será usado o método POST.

Objetos <input Definição de campo para digitação de dados.


type=”text”> Ex.:
<input type="text" name=”nome" size=”n1" maxlength=“n2”
value="valor”>

Onde:
name: Nome atribuído ao campo.
size: Número de caracteres do campo.
maxlength: Número máximo de caracteres permitidos no campo.
value:Valor default do campo.

Objetos <input Definição de campo para digitação de senhas.


type=”password”> Ex.:
<input type=”password" name=”nome" size=”n1" maxlength=“n2”
value="valor”>
Templates para WEB 15

Onde:
name: Nome atribuído ao campo.
size: Número de caracteres do campo.
maxlength: Número máximo de caracteres permitidos no campo.
value:Valor default do campo.

Objetos <input Definição de campo oculto na página.


type=”hidden”> Ex.:
<input type=”hidden" name=”nome" value="valor”>
Onde:
name: Nome atribuído ao campo.
value: Valor default do campo.
Objetos <textarea> Definição de campo com múltiplas linhas de texto.
Ex.:
<textarea name="nome" rows="n1" cols="n2"
wrap="tipo"></textarea>

Onde:
name: Nome atribuído ao campo.
rows: Número de linhas do campo.
cols: Número de caracteres do campo.
wrap: Opção de quebra de linha do texto.
Opções:
- off: Desabilita.
- virtual: Habilita.
- physical: Habilita e envia caracteres de quebra de linha

Objetos <select> Cria uma lista de seleção.


Ex.:
<select name="nome" size="n" multiple></select>

Onde:
name: Nome atribuido ao campo.
size: Número de linhas visíveis.
multiple: Sua presença indica a possibilidade de selecionar múltiplas opções.
Objetos <input Criação de campos de seleção.
type=”checkbox”> Ex.:
<input type="checkbox" name="nome" value="valor" checked>

Onde:
name: Nome atribuído ao campo.
value: Valor que será enviado para o servidor se o campo estiver selecionado.
checked: Sua presença faz com que o campo apareça inicialmente selecionado.

Objetos <input Cria um botão radio.


type=”radio”> Ex.:
<input type="radio" name="nome" value="valor" checked>

Onde:
name: Nome atribuido ao radio.
value: Valor que será enviado para o servidor se o campo estiver selecionado.
checked: Sua presença faz o radio estar inicialmente selecionado.

Objetos <input Cria botão que limpa os campos do formulário.


type=”reset”> Ex.:
<input type=”reset" name="nome" value="valor">

Onde:
name: Nome atribuído ao botão.
value: Rótulo do botão.

Objetos <input Cria botão que envia o conteúdo dos campos.


type=”submit”> Ex.:
<input type="submit" name="nome" value="valor">

Onde:
Templates para WEB 17

name: Nome atribuido ao botão.


value: Rótulo do botão.

Objetos <input Cria botão cuja função deve ser programada.


type=”button”> Ex.:
<input type=”button" name="nome" value="valor">

Onde:
name: Nome atribuido ao botão.
value: Rótulo do botão.

Objetos Divide a página num conjunto de quadros.


<frameset>,<frame> Ex.:
<frameset cols=”N1,N2,..." rows=“N1,N2,...” border=”N3">
<frame src=”pg.htm" name=”nome” scrolling=“tipo”>
</frameset>

Onde:
cols: Divide a tela em quadros verticais.
rows: Divide a tela em quadros horizontais.
Obs: N define o tamanho de cada quadro. Pode ser expresso em pixel ou
porcentagem.
border: Tamanho da borda dos quadros.
src: Página que será exibida inicialmente no quadro.
name: Nome dado ao quadro. Pode ser usado no atributo target de links.
scrolling: Controla a exibição de barras de rolagem no quadro.
Opções:
- yes: Sempre visível.
- no: Não exibe a barra de rolagem.
- auto: Inclui a barra se o conteúdo do frame ultrapassar o tamanho do mesmo.
Utilizando scripts A tag <script> é usada para especificar uma linguagem de script usada na
<script></script> página.
Tudo que se encontrar entre <script> e </script> será passado para o “scripting
engine” apropriado pelo browser.
Ex.:
<html>
<head>
</head>
<script language=”JavaScript”>
alert(“Teste”);
</script>
<body background=“imagem” bgcolor=“Cor” text=“Cor”>
Conteúdo
</body>
</html>

Webspeed

O WebSpeed é um ambiente para desenvolvimento de aplicações voltadas para


Web. Permite criar páginas dinâmicas, interagindo com bancos de dados.

O WebSpeed é formado por três componentes:


- Messenger ;
- Transaction Broker ;
- Transaction Agent.

Webspeed Tem a função de interceptar as solicitações ao servidor Web, repassá-las ao


Messenger Transaction Agent, consultando Transaction Broker, receber o arquivo HTML
e entregá-lo ao servidor.
Deve rodar na mesma máquina onde se encontra o servidor Web.
Templates para WEB 19

Webspeed Gerencia o estado dos Transaction Agents.


Transaction Broker A pedido do Messenger, identifica um agente disponível para atender uma
solicitação.

Webspeed Recebe a solicitação do Messenger, faz o processamento e retorna o arquivo


Transaction Agent HTML.
É o componente que está conectado às bases de dados.

Arquitetura
Webspeed

Transações WEB Uma transação Web consiste de:


- Conexão ;
- Requisição ;
- Processamento ;
- Resposta ;
- Encerramento da conexão;

Webspeed Fornece um ambiente de auxílio ao desenvolvimento acessível via Web


Workshop Browser. Pricipais seções: Scripting Lab, Databases, ProPath e file tools.
Para utilizar o Workshop o serviço web deve estar configurado como
desenvolvimento.
No Workshop também possui sessões onde podemos verificar variáveis de
ambiente, programas persistentes e um editor para desenvolvimento de
programas.
No Workshop podemos também desenvolver programas progress, compilar
programas e rodar programas.

Script Lab O Workshop fornece um ambiente para desenvolver SpeedScript, SQL,


JavaScript, VBScript ou HTML, denominado Scripting Lab.

Database View Ferramenta do Workshop que permite verificar tabelas, nomes de campos e de
índices dos bancos de dados conectados.

Propath Permite que o Workshop verifique os caminhos configurados e possui um


utilitário de pesquisa que localiza arquivos da mesma maneira que o comando
“RUN” o faz.

SpeedScript É a liguagem de script usada no WebSpeed. SpeedScript é basicamente


formada por uma grande parte do Progress 4GL com extensões para suportar
interações com usuários baseadas na Web.
O SpeedScript não é reconhecido no browser (IE, Netscape) como o
JavaScript, somente pode ser utilizado em aplicações desenvolvidas em
WebSpeed.

Desenvolvimento de Aplicações em WebSpeed

Existem três maneiras de se desenvolver aplicações em webspeed:


 SpeedScript Embutido;
 Html Map;
Templates para WEB 21

 Cgi Wrapper;

SpeedScript Estilo de trabalhar com WebSpeed, aonde a informação vinda do banco de


Embutido dados é mesclada com arquivos HTML existentes.
Ex.:

<html><head><title> Página de agradecimento </title></head><body>


<p> Olá
<script language=“SpeedScript”>
def var temp-id as int.
assign temp-id = 50.
find costumer where cust-num = temp-id no-lock no-error.
if avail customer then {&OUT} customer.name.
else {&OUT} “ cliente não encontrado”. </script>
! Obrigado por visitar esta página! </p>
</body> </html>

O processo de compilação inicialmente gera um Web object (.w) a partir do


arquivo HTML e, em seguida, um código executável (.r).
Este arquivo .w nada mais é que um conjunto de instruções {&OUT} que
geram o mesmo HTML do arquivo original.
A seguir será apresentado como ficaria o Web object correspondente ao
exemplo anterior.
Ex.:

{&OUT} ‘<html><head><title> Página de agradecimento


</title></head><body>~n’.
{&OUT} ‘<p> Olá~n’.
/*<script language=“SpeedScript”>*/
def var temp-id as int.
assign temp-id = 50.
find costumer where cust-num = temp-id no-lock no-error.
if avail customer then {&OUT} customer.name.
else {&OUT} “ cliente não encontrado”.
/* </script>*/
{&OUT} ‘! Obrigado por visitar esta página! </p>~n’.
{&OUT} ‘</body> </html>~n’.
Html Map Estilo de utilização do WebSpeed aonde um Web object (arquivo .w) é gerado
a partir de um arquivo HTML existente contendo formulários.
Cada campo do formulário pode ser mapeado para um campo correspondente
em uma tabela de banco de dados.
Possibilita utilizar procedures padrões para controlar a execução do aplicativo.
Separa a interface HTML das procedures SpeedScript na aplicação WebSpeed.
É criado, também, um arquivo offset (.off) contendo informações sobre o
layout dos campos HTML do arquivo fonte.

Criação do Utiliza-se o AppBuilder para gerar um Web object a partir de um arquivo


Html Map HTML existente.

CGI Wrapper Forma de uso do WebSpeed aonde implementa-se um SpeedScript que gera
todo o código HTML da página.
Este tipo de aplicativo é construído usando-se o template CGI wrapper do
AppBuilder.
Uma de suas principais aplicações é na listagem dos registros de uma tabela
(Browser).
Com CGI Wrapper é gerado apenas um arquivo Web Object (.w) onde o
mesmo gera o Html
, de forma dinâmica.

Combinando É possível combinar num mesmo aplicativo as técnicas de HTML Mapping e


Html Map com de CGI Wrapper, aproveitando o que de melhor cada uma das duas tem a
oferecer.
CGI Wrapper
Por exemplo, pode-se criar uma página usando HTML Mapping para um
pedido e, ao final da process-web-request da mesma, chamar a lista de itens
construída com CGI Wrapper.

OBS: A Datasul desenvolve suas aplicações WEB utilizando HTML MAP e


CGI Wrapper.
Templates para WEB 23

JavaScript

Através do uso de JavaScript é possível adicionar funcionalidades à página que


não seriam possíveis apenas com HTML.
As tags <script language=“JavaScript”> e </script> permitem definir
sequências de comandos JavaScript que serão executadas pelo Browser na
exibição da página.
O JavaScript é case sensitive.

Operadores Os operadores JavaScript são parecidos com os da linguagem C.


JavaScript

Operadores Aritméticos:
 * (Multiplicação) X * Y ;
 / (Divisão) X / Y;
 + (Adição) X + Y;
 - (Subtração) X – Y;
 ++ (Incremento) X++;
 -- (Decremento) X--;

Operadores Relacionais e Lógicos:


 > (Maior que) X > Y;
 >= (Maior ou Igual) X >= Y;
 < (Menor que) X < Y;
 <= (Menor ou Igual) X <= Y;
 == (Igual a) X == Y;
 != (Diferente) X != Y;
 ! (Negação) !X;
 && (E / and) X && Y;
 || (Ou / or) X || Y;

Declarações For
JavaScript Cria um loop que consiste de três expressões opcionais, entre parênteses e
separados por “;”, seguido de um bloco de declarações executadas no loop.
Sintaxe:
For([Expressão inicial];[condição];[incremento])
{
...declarações...
}

Ex.:
For (var i=0; i < 15; i++)
{
total = total + 1;
}

While
Executa declarações definidas em um bloco enquanto a condição for
verdadeira.
Sintaxe:
while ([condição])
{
...Declarações...
}
Templates para WEB 25

Ex.:
i=0
while(i < 5)
{
i++;
}

If …else
Declaração condicional.
Sintaxe:
if (condição)
{
...Declarações...
}[else{
...Declarações....
}]

Ex.:
if (x < 1)
{
alert(“é menor que 1”);
}else
{
alert(“não é menor que 1”);
}
var
Declara variáveis e opcionalmente, define seus valores iniciais. O escopo da
variável é a função corrente ou, para variáveis declaradas fora da função, a
aplicação corrente.
Sintaxe:
var nomevar [=valor][...,nomevar[=valor]]
Ex.:
var num_hits = 0, cust_num = 0

Objetos e Window: Objeto que representa uma janela inteira do browser. Opener é uma
propriedades referência que pode ser usada por uma janela para aquela que a abriu.
JavaScript
Document: Objeto que contém informações sobre o documento ativo.

Form: Objeto que representa um formulário da página.

Forms[ ]: Propriedade do Document que contém um array com todos os


formulários da página.

Elements[ ]: Propriedade de Form que contém um array com todos os


elementos daquele formulário.

Text: Objeto que representa um elemento de formulário definido pela tag


<input type=“text”>.

Value: Propriedade do objeto Text que representa seu atributo value.

É possível acessar o conteúdo de campos de formulário partindo do objeto


Document usando seus nomes ou através dos arrays que os contém.

Ex: document.forms[0].elements[0].value = 10 ou
document.meuform.w_codigo.value = 10
Templates para WEB 27

Métodos JavaScript alert(“Mensagem”):


Abre uma caixa de diálogo apresentando um botão de OK e exibindo o texto
passado como parâmetro.

confirm(“Mensagem”):
Abre uma caixa de diálogo com os botões OK e Cancel e exibe o texto passado
como parâmetro. Retorna o valor True se o botão OK for pressionado e False
se for o botão Cancel.

open(URL, nome, opções):


Abre uma janela exibindo a página definida pelo parâmetro URL. O valor
definido para o parâmetro “nome” pode ser usado no atributo target da tag
<a>. O parâmetro “opções” é uma lista de atributos definidos para a janela
separados por vírgula.
Ex:
open(“state.p”, “estados”, “height=100,width=200,menubar=yes”);

close():
Fecha a janela do Browser.

Eventos Dependendo de seu tipo, o elemento de interface terá diferentes eventos


JavaScript associados a ele. É possível programar, então, respostas à ocorrência destes
eventos.
Botões de uma interface tem o evento OnClick associado a eles. É possível, na
definição da tag que o cria, definir um procedimento para ser executado
quando receberem um click.
Ex:
<input type="BUTTON" name="Button" value="zoom"
OnClick="window.open('info.htm')”>

Funções É possível criar funções para modularizar programas JavaScript.


JavaScript
A forma de definir funções é apresentada a seguir:

function nome(var1, var2) {


return var1 + var2;
}
Descrição

CAPÍTULO 2

Templates para WEB

Os templates para WEB podem ser gerados automaticamente usando a


ferramenta SWG. Após a geração inicial o programador passará então, a fazer
as implementações nos programas gerados.
Para construir os programas a partir do AppBuilder, é necessário selecionar o
template desejado e fazer as alterações conforme as necessidades do programa.

Como utilizar o SWG


Descrição

Templates para WEB 29

Para utilizar o SWG, devem ser seguidos os seguintes passos:


 definir o estilo de programa que vai ser construído: cadastro simples,
cadastro complexo, pai x filho, etc.;
 selecionar os campos que aparecerão no HTML;
 especificar as características dos campos selecionados;
 especificar os parâmetros do programa (nome externo, etc.);
 gerar o programa;
 fazer os ajustes necessários no programa (de acordo com o estilo).

Definição do Estilo do Programa


O programador deve definir junto ao analista qual o estilo do programa a ser
construído. De acordo com o estilo, será necessário fazer mais ou menos
coisas no SWG. Neste manual, estão os passos necessários para cada estilo.

Seleção dos campos para o HTML

Através da função de seleção devem ser definidos os campos que aparecerão


no HTML. Estes campos podem ser definidos diretamente no SWG ou através
da importação de um programa escrito com SmartObjects.
O SWG reconhece automaticamente os bancos conectados e então o
programador pode selecionar um banco para escolha das tabelas e campos.

Especificar as características dos campos selecionados


Para cada campo pode ser especificado alguma característica, tipo formato
(view-as) e alinhamento.

Especificação dos parâmetros do programa

Na parte de parâmetros o programador deve especificar qual o nome do


programa a ser gerado, qual o programa de pesquisa e ‘vá para’, etc.
Dependendo do estilo deverão ser informados, mais ou menos, os parâmetros.

Geração do Programa

Após selecionar os campos e informar os parâmetros, o SWG poderá gerar o


programa. Será mostrado o nome e diretório onde o programa foi gerado.
Templates para WEB 31

Construindo um Cadastro/Consulta Simples


Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Cadastro/Consulta Simples.
A seguir está um exemplo de um programa construído com este estilo:

Características A principal característica de um Cadastro Simples é que todos os campos são


visíveis na área de trabalho.
Observação: A diferença entre um cadastro e uma consulta está apenas nos
parâmetros passados para a função inicializa no HTML, onde na consulta não
são utilizadas as letras A, C, M, D e U, que correspondem às funções de
manipulação de registros.

Tarefas
A seguir é apresentada uma lista de tarefas para desenvolvimento do
programa.
Procedure Process-
Temp-Table
Preprocessors
de
Comunicação
web-request

Inicialmente devem ser definidos os valores dos preprocessors padrão do


programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
PreprocessorDescrição
ttTable1
nome da Tabela temporária
hDBOTable1 nome do DBO que será utilizada
DBOTable1 nome da Tabela que do DBO
TableName nome da Tabela que será utilizada
PROGZO nome do programa de Search que será chamado
TAMZOOM largura e altura (respectivamente) que a janela de
Search terá
PROGGO nome do programa de Go to / Vá para
TAMGO largura e altura (respectivamente) que a janela de Go to
terá
THISNAME nome deste programa

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE ttTable1 tt-customer


&GLOBAL-DEFINE hDBOTable1 bosp001
&GLOBAL-DEFINE DBOTable1 customer

&GLOBAL-DEFINE TableName customer

&GLOBAL-DEFINE PROGZO web/spp/wsp0001a.p


&GLOBAL-DEFINE TAMZOOM "500" "350"

&GLOBAL-DEFINE PROGGO web/spp/wgsp0001b.w


&GLOBAL-DEFINE TAMGO “300" "250"

&GLOBAL-DEFINE THISNAME web/spp/wsp0001.w

Criar a temp-table que é utilizada para realizar a comunicação com o DBO.


Para isto, deve-se utilizar a mesma include de definição da temp-table do
DBO.
{dbo\boXX999.i {&ttTable1}}

Nesta Procedure é criada a instância do DBO. Logo após deve-se definir as


restrições iniciais e a abertura da query, caso necessário.
Procedure
assignFields

Templates para WEB 33

A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o


DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

PROCEDURE process-web-request :
/*--------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/
RUN outputHeader.

RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

RUN openQueryStatic in {&hDBOTable1} (input "Main":u).

IF REQUEST_METHOD = "POST":U THEN DO WITH FRAME {&FRAME-NAME}:


{web/winclude/wi-metpost.i}
END.
ELSE DO WITH FRAME {&FRAME-NAME}:
{web/winclude/wi-metget.i}
END.

RUN displayError .

Delete Procedure {&hDBOTable1}.

END PROCEDURE.

Nesta procedure devem ser definidos os campos que serão validados com wi-
datatype.i e ainda, fazer a associação entre as variáveis de tela (HTML) com a
tabela temporária .
PROCEDURE assignFields :
/*---------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
----------------------------------------------------------------------*/
if request_method = "POST" then DO WITH FRAME {&FRAME-NAME} :

create {&ttTable1} .

{web/winclude/wi-datatype.i &dst="{&ttTable1}.cust-num"
&type="integer" &org="w_cust_num:screen-value"}

ASSIGN {&ttTable1}.name = w_name:screen-value


Arquivo HTML
Procedure
displayFields

{&ttTable1}.address = w_address:screen-value
{&ttTable1}.city = w_city:screen-value
{&ttTable1}.state = w_state:screen-value
{&ttTable1}.sales-rep = w_sales_rep:screen-value .

{web/winclude/wi-assign.i}
end.

RUN SUPER.
END PROCEDURE.

Nesta procedure são feitas as associações entre a tabela temporária e as


variáveis de tela.
PROCEDURE displayFields :
/*---------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
---------------------------------------------------------------------*/
FIND FIRST {&ttTable1} NO-LOCK NO-ERROR.
DO WITH FRAME {&FRAME-NAME}:
ASSIGN w_cust_num:screen-value = string({&ttTable1}.cust-num)
w_name:screen-value = {&ttTable1}.name
w_address:screen-value = {&ttTable1}.address
w_city:screen-value = {&ttTable1}.city
w_state:screen-value = {&ttTable1}.state
w_sales_rep:screen-value = {&ttTable1}.sales-rep
hid_chave:screen-value = string({&ttTable1}.rRowid)
.
END.
END PROCEDURE.

O arquivo HTML contem algumas tags necessárias para garantir o padrão de


layout e algumas características funcionais do produto.
A tag abaixo define o arquivo que contém as configurações padrões de cores,
bordas e links.

<link rel="StyleSheet" type="text/css" href="/ems20web/padrao.css">

As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
<meta http-equiv="Cache-Control" content="No-Cache">
<meta http-equiv="Pragma" content="No-Cache">
<meta http-equiv="Expires" content="0">

O título do documento e a definição dos botões do painel são definidos através


da função JavaScript “inicializa”.
Templates para WEB 35

<script language="JavaScript">
function inicializa() {
parent.document.title = 'Template de Cadastro Simples';
parent.panel("NGSACMDUROLHE","WSP0001 2.00.00.000");
}
</script>

De acordo com as necessidades do programa, devem ser mantidas as letras


correspondentes a cada funcionalidade desejada, conforme a tabela abaixo:

Letra Funcionalidade
N Botões de Navegação
G Go to / Vá Para
S Search / Pesquisa
A Add / Adicionar
C Copy / Copiar
M Modify / Modificar
D Delete / Deletar
U Undo / Desfazer
R Reset / Limpar
O OK (Submit/Submeter)
L Consultas Relacionadas
H Home
E Exit

Para o correto funcionamento dos cadastros e consultas, devem ser definidas


duas variáveis de controle. Estas variáveis devem ser do tipo “hidden” e
devem estar declaradas como os dois primeiros elementos do formulário.
<input type="hidden" name="hid_chave">
<input type="hidden" name="hid_oper">

No HTML devem ser usadas as tags <!—BXLS> e <!—EXLS> para marcar


as palavras ou frases que devem ser traduzidas para outros idiomas.
<td class="barratitulo">
<!--BXLS-->Template de Cadastro Simples<!--EXLS-->
</td>

Na definição de colunas de tabelas, o valor padrão para o width da tag <th> é


”40%” e para a tag <td> o valor do width é ”60%”. Caso necessário, estas
propriedades podem ser alteradas, lembrando que a tag <th> deve ter um valor
menor que a tag <td>.

<table align="center" border="0" cellpadding="0" cellspacing="1"


width="100%">
<tr>
<th align="right" class="linhaForm" nowrap width="40%"><!--BXLS--
>Código <!--EXLS-->:</th>
<td class="linhaForm" align="left" nowrap width="60%"><input
type="text" size="5" maxlength="5" name="w_cod"></td>
</tr>
</table>

Observação: Todos os campos chaves do programa devem ser definidos


dentro do mesmo fieldset. O nome dos elementos de formulários devem
começar com “w_”. Exemplo: (w_nomedocampo).
Definição

Templates para WEB 37

Construindo um Cadastro/Consulta Complexo


Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Cadastro/Consulta Complexo.
A seguir está um exemplo de um programa construído com este estilo:

Quando todos os campos necessários não ficarem visíveis na área de trabalho,


é necessária a criação de folders. Assim, as informações ficarão reunidas,
facilitando o preenchimento dos dados.
Observação.: A diferença entre um cadastro e uma consulta está apenas nos
parâmetros passados para a função inicializa no HTML, onde na consulta não
são utilizadas as letras A, C, M, D e U, que correspondem às funções de
manipulação de registros.
Preprocessors
Temp-Table de
Comunicação

Tarefas
A seguir é apresentada uma lista de tarefas para desenvolvimento do
programa.
Inicialmente devem ser definidos os valores dos preprocessors padrão do
programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
PreprocessorDescrição
ttTable1
nome da Tabela temporária
hDBOTable1 nome do DBO que será utilizada
DBOTable1 nome da Tabela que do DBO
TableName nome da Tabela que será utilizada
PROGZO nome do programa de Search que será chamado
TAMZOOM largura e altura (respectivamente) que a janela de
Search terá
PROGGO nome do programa de Go to / Vá para
TAMGO largura e altura (respectivamente) que a janela de Go to
terá
THISNAME nome deste programa

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE ttTable1 tt-customer


&GLOBAL-DEFINE hDBOTable1 bosp001
&GLOBAL-DEFINE DBOTable1 customer

&GLOBAL-DEFINE TableName customer

&GLOBAL-DEFINE PROGZO web/spp/wsp0001a.p


&GLOBAL-DEFINE TAMZOOM "500" "350"

&GLOBAL-DEFINE PROGGO web/spp/wsp0001b.w


&GLOBAL-DEFINE TAMGO “300" "250"

&GLOBAL-DEFINE THISNAME web/spp/wsp0002.w

Criar a temp-table que é utilizada para realizar a comunicação com o DBO.


Para isto, deve-se utilizar a mesma include de definição da temp-table do
DBO.
Procedure Process-
web-request
assignFields

Templates para WEB 39

{dbo\boXX999.i {&ttTable1}}

Nesta Procedure é criada a instância do DBO. Logo após deve-se definir as


restrições iniciais e a abertura da query, caso necessário.

A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o


DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

PROCEDURE process-web-request :
/*--------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/
RUN outputHeader.

RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

RUN openQueryStatic in {&hDBOTable1} (input "Main":u).

IF REQUEST_METHOD = "POST":U THEN DO WITH FRAME {&FRAME-NAME}:


{web/winclude/wi-metpost.i}
END.
ELSE DO WITH FRAME {&FRAME-NAME}:
{web/winclude/wi-metget.i}
END.

RUN displayError .

Delete Procedure {&hDBOTable1}.

END PROCEDURE.

Nesta procedure devem ser definidos os campos que serão validados com wi-
datatype.i e ainda, fazer a associação entre as variáveis de tela (HTML) com a
tabela temporária .
PROCEDURE assignFields :
/*--------------------------------------------------------------------
Purpose: Super Override
Parameter:
Notes:
---------------------------------------------------------------------*/
if request_method = "POST" then DO WITH FRAME {&FRAME-NAME} :
Arquivo HTML
Procedure
displayFields

create {&ttTable1} .

{web/winclude/wi-datatype.i &dst="{&ttTable1}.cust-num"
&type="integer" &org="w_cust_num:screen-value"}

ASSIGN {&ttTable1}.name = w_name:screen-value


{&ttTable1}.address = w_address:screen-value
{&ttTable1}.city = w_city:screen-value
{&ttTable1}.state = w_state:screen-value
{&ttTable1}.sales-rep = w_sales_rep:screen-value .

{web/winclude/wi-assign.i}

end.

RUN SUPER.
END PROCEDURE.

Nesta procedure são feitas as associações entre a tabela temporária e as


variáveis de tela.
PROCEDURE displayFields :
/*--------------------------------------------------------------------
Purpose: Super Override.
Parameters:
Notes:
---------------------------------------------------------------------*/
FIND FIRST {&ttTable1} NO-LOCK NO-ERROR.
DO WITH FRAME {&FRAME-NAME}:
ASSIGN w_cust_num:screen-value = string({&ttTable1}.cust-num)
w_name:screen-value = {&ttTable1}.name
w_address:screen-value = {&ttTable1}.address
w_city:screen-value = {&ttTable1}.city
w_state:screen-value = {&ttTable1}.state
w_sales_rep:screen-value = {&ttTable1}.sales-rep
hid_chave:screen-value = string({&ttTable1}.rRowid)
.
END.
END PROCEDURE.

O arquivo HTML contem algumas tags necessárias para garantir o padrão de


layout e algumas características funcionais do produto.

A tag abaixo define o arquivo que contém as configurações padrões de cores,


bordas e links.
<link rel="StyleSheet" type="text/css" href="/ems20web/padrao.css">

As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
Templates para WEB 41

<meta http-equiv="Cache-Control" content="No-Cache">


<meta http-equiv="Pragma" content="No-Cache">
<meta http-equiv="Expires" content="0">

O título do documento e a definição dos botões do painel são definidos através


da função JavaScript “inicializa”.
<script language="JavaScript">
function inicializa() {
parent.document.title = 'Template de Cadastro Simples';
parent.panel("NGSACMDUROLHE","WSP0002 2.00.00.000");
}
</script>

De acordo com as necessidades do programa, devem ser mantidas as letras


correspondentes a cada funcionalidade desejada, conforme a tabela abaixo:

Letra Funcionalidade
N Botões de Navegação
G Go to / Vá Para
S Search / Pesquisa
A Add / Adicionar
C Copy / Copiar
M Modify / Modificar
D Delete / Deletar
U Undo / Desfazer
R Reset / Limpar
O OK (Submit/Submeter)
L Consultas Relacionadas
H Home
E Exit

Para o correto funcionamento dos cadastros e consultas, devem ser definidas


duas variáveis de controle. Estas variáveis devem ser do tipo “hidden” e
devem estar declaradas como os dois primeiros elementos do formulário.
<input type="hidden" name="hid_chave">
<input type="hidden" name="hid_oper">

No HTML devem ser usadas as tags <!—BXLS> e <!—EXLS> para marcar


as palavras ou frases que devem ser traduzidas para outros idiomas.
<td class="barratitulo">
<!--BXLS-->Template de Cadastro Simples<!--EXLS-->
</td>

No cadastro complexo são criados folders através de links para a mesma


página, de forma a simular uma navegação semelhante aos programas GUI,
desta forma, o título do programa deverá aparecer em todos os folders. Além
disso, o folder selecionado não deverá conter o Link para ele mesmo.

Os labels dos campos devem ser definidos nas tags <th> e os elementos de
formulário devem estar nas tags <td>.

No final do arquivo html deve ser adicionada a tag <br> repetidas vezes, para
que o folder fique corretamente ajustado na tela, considerando que o padrão
para o desenvolvimento é 800 x 600.
Características

Templates para WEB 43

Construindo um Pai x Filho


Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Pai X Filho.
A seguir está um exemplo de um programa construído com este estilo:

O estilo Pai x Filho é composto por 2 programas. Um programa .w responsável


pela consulta Pai e outro programa .p responsável pela consulta Filho.
Preprocessors

Tarefas – Consulta Pai


A seguir é apresentada uma lista de tarefas para desenvolvimento do
programa.
Inicialmente devem ser definidos os valores dos preprocessors padrão do
programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
Preprocessor Descrição
ttTable1 Nome da tabela temporária
hDBOTable1 Nome do DBO que será utilizada
DBOTable1 Nome da tabela principal do DBO
TableName Nome da tabela que será utilizada
PROGZO Nome do programa de Search que será chamado
TAMZOOM Largura e altura (respectivamente) da janela de Search
PROGGO Nome do programa de Go to / Vá para
TAMGO Largura e altura (respectivamente) que a janela de Go to
terá
THISNAME Nome deste programa
CADFATHER Nome do programa de Cadastro Pai
CADFAWID Largura do programa de Cadastro Pai
CADFAHEI Altura do programa de Cadastro Pai
CADSON Nome do programa de Cadastro Filho

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE ttTable1 tt-customer


&GLOBAL-DEFINE hDBOTable1 bosp001
&GLOBAL-DEFINE DBOTable1 customer

&GLOBAL-DEFINE TableName customer

&GLOBAL-DEFINE PROGZO web/spp/wsp0001a.p


&GLOBAL-DEFINE TAMZOOM "500" "350"

&GLOBAL-DEFINE PROGGO web/spp/wsp0001b.w


&GLOBAL-DEFINE TAMGO “300" "250"

&GLOBAL-DEFINE THISNAME web/spp/wap0001.w

&GLOBAL-DEFINE CADFATHER web/spp/wap0004a.w


&GLOBAL-DEFINE CADFAWID 600
Temp-TableProcess-
Procedure de
Comunicação
DisplayFields
web-request

Templates para WEB 45

&GLOBAL-DEFINE CADFAHEI 160

&GLOBAL-DEFINE CADSON web/spp/wsp0004b.w

Criar a temp-table que é utilizada para realizar a comunicação com o DBO.


Para isto, deve-se utilizar a mesma include de definição da temp-table do
DBO.
{dbo\boXX999.i {&ttTable1}}

Nesta procedure são feitas as associações entre a tabela temporária e as


variáveis de tela.

PROCEDURE displayFields :
/*--------------------------------------------------------------------
Purpose: Super Override.
Parameters:
Notes:
---------------------------------------------------------------------*/
FIND FIRST {&ttTable1} NO-LOCK NO-ERROR.

DO WITH FRAME {&FRAME-NAME}:

ASSIGN w_cust_num:screen-value = string({&ttTable1}.cust-num)


w_name:screen-value = {&ttTable1}.name
hid_chave:screen-value = string({&ttTable1}.rRowid) .

END.
END PROCEDURE

Nesta Procedure é criação a instância do DBO. Logo após deve-se definir as


restrições iniciais e a abertura da query caso necessário.

A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o


DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.
Programa HTML

Nesta procedure também é executado o programa de Consulta Filho, passando


como parametro a tabela do pai, evitando com isso executar a DBO do pai
novamente.
PROCEDURE process-web-request :
/*--------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/

RUN outputHeader.

RUN dbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

RUN openQueryStatic in {&hDBOTable1} (input "Main":u).

{web/winclude/wi-getpai.i}

RUN displayError .

delete procedure {&hDBOTable1}.

RUN web/spp /wsp0004b.p (input table {&ttTable1}) .

END PROCEDURE.

No HTML do programa de Consulta Pai, não devem existir as tags de


finalização (</body> e </html> do HTML, pois a Consulta Pai irá chamar a
Consulta Filho e este finalizará o HTML com uma include de finalização .
O arquivo HTML deve conter duas linhas em branco no final do documento
para contornar um BUG do Webspeed.
Existe um formulario para a consulta filho e outro formulário para a Consulta
Pai . Sempre um (1) formulário é submetido de cada vez . E sempre com o
Botão de Submit que estiver em cada Formulário. Não é possível submeter 2
formulários HTML de uma só vez . Por isto deve ser mantida a tag </form> do
programa de consulta filho.
O arquivo HTML contem algumas tags necessárias para garantir o padrão de
layout e algumas características funcionais do produto.

A tag abaixo define o arquivo que contém as configurações padrões de cores,


bordas e links.
<link rel="StyleSheet" type="text/css" href="/ems20web/padrao.css">

As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
Templates para WEB 47

<meta http-equiv="Cache-Control" content="No-Cache">


<meta http-equiv="Pragma" content="No-Cache">
<meta http-equiv="Expires" content="0">

Os botões do painel são definidos através da função JavaScript “inicializa”.


<script language="JavaScript">
function inicializa() {
parent.panel("NGSACMDLHE","WCONPAI 2.00.00.000");
}
</script>

De acordo com as necessidades do programa, devem ser mantidas as letras


correspondentes a cada funcionalidade desejada, conforme a tabela abaixo:

Letra Funcionalidade
N Botões de Navegação
G Go to / Vá Para
S Search / Pesquisa
A Add / Adicionar
C Copy / Copiar
M Modify / Modificar
D Delete / Deletar
L Consultas Relacionadas
H Home
E Exit

Se houver os botões de Incluir, Modificar e Copiar para a tabela pai, este será
aberto em uma nova janela (Cadastro PAI).

Para o correto funcionamento dos cadastros e consultas, devem ser definidas


duas variáveis de controle. Estas variáveis devem ser do tipo “hidden” e
devem estar declaradas como os dois primeiros elementos do formulário.
<input type="hidden" name="hid_chave">
<input type="hidden" name="hid_oper">

No HTML devem ser usadas as tags <!—BXLS> e <!—EXLS> para marcar


as palavras ou frases que devem ser traduzidas para outros idiomas.
Preprocessors

<td class="barratitulo">
<!--BXLS-->Template de Consulta PAI x FILHO<!--EXLS-->
</td>

Tarefas – Consulta Filho


O Programa de Consulta Filho é um CGI-WRAPPER .

A seguir é apresentada uma lista de tarefas para desenvolvimento do


programa.
Inicialmente devem ser definidos os valores dos preprocessors padrão do
programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
Preprocessor
Descrição
THISNAMEDiretório e nome deste programa
FATHERNAME Nome do programa Pai
ttTableFather
Nome da tabela temporária do Pai
TableName
Nome da tabela do Pai
ttTableSon
Nome da tabela temporária do Filho
TableName
Nome da tabela do Filho
hDBOSon
Nome o DBO do Filho
sonNAME
Nome do programa de Cadastro Filho
sonWIDTH
Largura do programa de Cadastro Filho
sonHEIGHT
Altura do progra de Cadastro Filho
SONBUTTONS O valor YES define os botões de manutenção do filho:
Incluir, Modificar e Eliminar.
DBO2 O valor “YES” indica que utiliza DBO2
CONSON O valor “YES” indica que é um programa consulta filho

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE THISNAME web/spp/wsp0004b.p

&GLOBAL-DEFINE FATHERNAME wconpai.w


&GLOBAL-DEFINE ttTableFather tt-customer
Procedure Process-
Temp-Table de
Comunicação
web-request

Templates para WEB 49

&GLOBAL-DEFINE TableName customer

&GLOBAL-DEFINE ttTableSon tt-order


&GLOBAL-DEFINE TableName Order
&GLOBAL-DEFINE hDBOSon bosp005
&GLOBAL-DEFINE sonNAME wcadsonc.w
&GLOBAL-DEFINE sonWIDTH 500
&GLOBAL-DEFINE sonHEIGHT 215

&GLOBAL-DEFINE SONBUTTONS YES


&GLOBAL-DEFINE DBO2 YES
&GLOBAL-DEFINE CONSON YES

Criar a temp-table que é utilizada para realizar a comunicação com o DBO.


Para isto, deve-se utilizar a mesma include de definição da temp-table do
DBO.
{dbo\boXX999.i {&ttTable1}}

Nesta Procedure é criada a instância do DBO. Logo após deve-se definir as


restrições iniciais e a abertura da query, caso necessário.

A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o


DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

PROCEDURE process-web-request :
/*--------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/
RUN outputHeader.

RUN dbo/bosp003.p PERSISTENT SET {&hDBOSon}.

Find First {&ttTableFather} no-lock no-error .

RUN setConstraintCust-Num in {&hDBOSon} (input {&ttTableFather}.Cust-


Num) .
RUN openQueryStatic in {&hDBOSon} (input "Cust-Num":U).
Procedure addNav
addCol

{web/winclude/wi-sonnav.i &nrlinha=5}

RUN addCol .
RUN addNav .
RUN generateHeaderSon .
RUN generateBrowse in h-brwapi.
{&out} return-value .

delete procedure {&hDBOSon}.


{web/winclude/wi-endson.i}

END PROCEDURE.

Nesta procedure são definidos os campos que serão apresentados na Consulta


Filho .
Para isso, deve-se utilizar os métodos descritos no capítulo “API de
BROWSE”.
Caso o programa tenha os botões de Inclusão, Modificação e Exclusão do
filho, deve-se definir um elemento de Radio chamado xradio para que o
registro seja marcado para ser manipulado.
PROCEDURE addCol :
/*---------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------*/
RUN addInput in h-brwapi ("xradio":U , "R":U , "":U , "center":U , ?).

RUN AddField IN h-brwapi ("Order-num":U, "I":U, "Order-num",


"right":U, ?).

RUN AddField IN h-brwapi ("Cust-Num":U, "I":U, "Cust-Num",


"right":U, ?).

RUN AddField IN h-brwapi ("Order-Date":U, "D":U, "Ordered", "right":U,


?).

RUN AddField IN h-brwapi ("Sales-Rep":U, "C":U, "Sales-Rep",


"right":U, ?).

END PROCEDURE.

Nesta procedure deve-se definir se existirá ou não a navegação no browse.


Além de definir a espessura da borda do browse.
PROCEDURE addNav :
/*----------------------------------------------------------------------
Purpose:
Procedure
generateHeaderSon

Templates para WEB 51

Parameters: <none>
Notes:
----------------------------------------------------------------------*/
RUN setLinkNavigation in h-brwapi ("{&FATHERNAME}?
son=yes&chave_pai=":U + string({&ttTableFather}.r-Rowid)).

RUN setNavigation in h-brwapi (true).


RUN setBorder in h-brwapi (2).

END PROCEDURE.

Nesta procedure são definidas as informações do cabeçalho do programa de


consulta filho. Se houver mais botões além dos default (Incluir , Modificar e
Excluir), deve-se criar o botão conforme indicado abaixo.
def var auxFunction as char no-undo .
assign auxFunction = "marcar()" .
{web/winclude/wi-sonbut.i "Marcar" "btn_Marcar" auxFunction}

A função javascript marcar() deve ser declarada na procedure output-header ,


depois da include wi-header.i .
Os botões gerados são do tipo button , e estes não submetem o formulário do
filho. Para submeter o formulário do filho, deve-se utilizar uma função
javascript:
function SubmeterSon() {
document.form[1].submit() ;
}

PROCEDURE generateHeaderSon :
/*---------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------*/
def var titleSon as char no-undo .

{web/winclude/wi-sonhei.i}

/*Botões Incluir , Modificar e Eliminar */


{web/winclude/wi-sonbdef.i}

{web/winclude/wi-sonhef.i}

assign titleSon = "sp0004c".


{web/winclude/wi-sontitle.i titleSon}

END PROCEDURE.
Preprocessors
Definição

Construindo um Cadastro Pai Simples/Complexo


Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Cadastro Pai Simples/Complexo.
A seguir está um exemplo de um programa construído com este estilo:

Se todos os campos não ficarem visíveis na área de trabalho, é necessária a


criação de folders. Assim, as informações ficarão reunidas, facilitando o
preenchimento dos dados.

Tarefas
A seguir é apresentada uma lista de tarefas para desenvolvimento do
programa.
Inicialmente devem ser definidos os valores dos preprocessors padrão do
programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
Preprocessor Descrição
ttTable1 Nome da tabela temporária
hDBOTable1 Nome do DBO que será utilizada
DBOTable1 Nome da tabela principal do DBO
TableName Nome da tabela que será utilizada
THISNAME Nome deste programa
Procedure de
Temp-Table
Comunicação
assignFields

Templates para WEB 53

Preprocessor Descrição
NFACON Diretório e nome do programa de consulta pai
DBO2 O valor “YES” indica que utiliza DBO 2

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE ttTable1 tt-customer


&GLOBAL-DEFINE hDBOTable1 bosp001
&GLOBAL-DEFINE DBOTable1 customer

&GLOBAL-DEFINE TableName customer

&GLOBAL-DEFINE THISNAME web/app/wap0001.w

&GLOBAL-DEFINE NFACON web/app/wap0005.w

&GLOBAL-DEFINE DBO2 YES

Criar a temp-table que é utilizada para realizar a comunicação com o DBO.


Para isto, deve-se utilizar a mesma include de definição da temp-table do
DBO.
{dbo\boXX999.i {&ttTable1}}

Nesta procedure devem ser definidos os campos que serão validados com wi-
datatype.i e ainda, fazer a associação entre as variáveis de tela (HTML) com a
tabela temporária .

PROCEDURE assignFields :
/*----------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
----------------------------------------------------------------------*/
if request_method = "POST":U then DO WITH FRAME {&FRAME-NAME}:

create {&ttTable1}.

{web/winclude/wi-datatype.i &dst="{&ttTable1}.Cust-Num"
&type="integer" &org="w_Cust_Num:screen-value"}
ASSIGN
{&ttTable1}.Name = w_Name:screen-value
{&ttTable1}.Address = w_Address:screen-value
{&ttTable1}.Sales-rep = w_Sales-rep:screen-value.
{web/winclude/wi-assign.i}
Procedure process-
displayFields
web-request

end.
END PROCEDURE.

Nesta procedure são feitas as associações entre a tabela temporária e as


variáveis de tela.
PROCEDURE displayFields :
/*----------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
----------------------------------------------------------------------*/
FIND FIRST {&ttTable1} NO-LOCK NO-ERROR.
DO WITH FRAME {&FRAME-NAME}:

ASSIGN
hid_chave:screen-value = string({&ttTable1}.r-Rowid)
w_Cust_Num:screen-value = string({&ttTable1}.Cust-Num)
w_Name:screen-value = {&ttTable1}.Name
w_Address:screen-value = {&ttTable1}.Address
w_Sales_Rep:screen-value = {&ttTable1}.Sales-Rep .

{web/winclude/wi-disp.i}

END.
END PROCEDURE.

Nesta Procedure é criada a instância do DBO. Logo após deve-se definir as


restrições iniciais e a abertura da query, caso necessário.

A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o


DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

PROCEDURE process-web-request :
/*---------------------------------------------------------------------
Purpose: Process the web request.
Notes:
----------------------------------------------------------------------*/
RUN outputHeader.
Templates para WEB 55

/** Carrega BO persistente e retorna o handle para a vari vel ----*/


{web/winclude/wi-loadbo.i &program=bosports/bocustomer.p
&handle={&hDBOTable1}}
/*------------------------------------------------------------------*/
RUN openQueryStatic in {&hDBOTable1} (input "Main":u).
IF REQUEST_METHOD = "POST":U THEN DO WITH FRAME {&FRAME-NAME}:
{web/winclude/wi-metpost.i}
END.
ELSE DO WITH FRAME {&FRAME-NAME}:
{web/winclude/wi-metget.i}
END.
RUN displayError .
delete procedure {&hDBOTable1}.
END PROCEDURE.

Arquivo HTML O arquivo HTML contem algumas tags necessárias para garantir o padrão de
layout e algumas características funcionais do produto.

A tag abaixo define o arquivo que contém as configurações padrões de cores,


bordas e links.
<link rel="StyleSheet" type="text/css" href="/ems20web/padrao.css">

As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
<meta http-equiv="Cache-Control" content="No-Cache">
<meta http-equiv="Pragma" content="No-Cache">
<meta http-equiv="Expires" content="0">

Para o correto funcionamento dos cadastros e consultas, devem ser definidas


duas variáveis de controle. Estas variáveis devem ser do tipo “hidden” e
devem estar declaradas como os dois primeiros elementos do formulário.
<input type="hidden" name="hid_chave">
<input type="hidden" name="hid_oper">

No HTML devem ser usadas as tags <!—BXLS> e <!—EXLS> para marcar


as palavras ou frases que devem ser traduzidas para outros idiomas.
<td colspan="3" class="barratitulo">
<!--BXLS-->Template Cadastro PaixFilho Complexo<!--EXLS-->
</td>
O nome dos elementos de formulários devem começar com “w_”. Exemplo:
(w_nomedocampo).
No cadastro complexo são criados folders através de links para a mesma
página, de forma a simular uma navegação semelhante aos programas GUI.
O Título do programa deverá aparecer em todos os folders. Além disso, o
folder selecionado não deverá conter o Link para ele mesmo.
Os labels dos campos devem ser definidos nas tags <th> e os elementos de
formulário devem estar nas tags <td>.
No final do arquivo html deve ser adicionada a tag <br> repetidas vezes para
que o folder fique corretamente ajustado na tela, considerando que o padrão
para o desenvolvimento é 800 x 600.
Os dois botões devem ser elementos de formulários . Não devem ser utilizadas
as imagens de OK e Cancel do Menu .
Em caso de cadastros complexos, os botões devem ficar sempre no último
Folder.
Definição

Templates para WEB 57

Construindo um Cadastro Filho Simples/Complexo


Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Cadastro Filho Simples/Complexo.
A seguir está um exemplo de um programa construído com este estilo:

Se todos os campos não ficarem visíveis na área de trabalho, é necessária a


criação de folders. Assim, as informações ficarão reunidas, facilitando o
preenchimento dos dados.

Tarefas
Inicialmente devem ser definidos os valores dos preprocessors padrão do
programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
Preprocessor Descrição
ttTableFather Nome da tabela pai
hDBOTableFather Nome da variável que contém o handle do DBO da
tabela pai
DBOFather Nome do DBO da tabela pai
TableName Nome da tabela pai
ttTable1 Nome da tabela temporária
hDBOTable1 Nome da variável que contém o handle do DBO da
tabela principal do programa
Procedure de
Temp-Table
Comunicação
assignFields

Preprocessor Descrição
DBOTable1 Nome da tabela principal do DBO
TableName Nome da tabela principal do programa
THISNAME Nome deste programa
NFACON Diretório e nome do programa de consulta pai
DBO2 O valor “YES” indica que utiliza um DBO 2

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE ttTableFather tt-order


&GLOBAL-DEFINE hDBOTableFather hDBOsp003
&GLOBAL-DEFINE DBOFather order
&GLOBAL-DEFINE TableName order

&GLOBAL-DEFINE ttTable1 tt-customer


&GLOBAL-DEFINE hDBOTable1 hDBOsp001
&GLOBAL-DEFINE DBOTable1 customer

&GLOBAL-DEFINE TableName customer

&GLOBAL-DEFINE THISNAME web/app/wap0001.w


&GLOBAL-DEFINE NFACON web/app/wap0005.w

&GLOBAL-DEFINE DBO2 YES

Criar as temp-table utilizadas para realizar a comunicação com os DBO’s.


Para isto, deve-se utilizar as mesmas includes de definição das temp-table dos
DBO’s.
{dbo\boXX999.i {&ttTableFather}}
{dbo\boXX999.i {&ttTable1}}

Nesta procedure devem ser definidos os campos que serão validados com wi-
datatype.i e ainda, fazer a associação entre as variáveis de tela (HTML) com a
tabela temporária .

PROCEDURE assignFields :
/*---------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
----------------------------------------------------------------------*/
if request_method = "POST":U then DO WITH FRAME {&FRAME-NAME} :
/** Carrega BO persistente e retorna o handle para a vari vel -----*/
{web/winclude/wi-loadbo.i &program=bosp/spbo007.p
Procedure
displayFields

Templates para WEB 59

&handle={&hDBOTableFather}}
/*----------------------------------------------------------------*/
RUN openQueryStatic in {&hDBOTableFather} (input "Main":u).
RUN repositionRecord in {&hDBOTableFather} (input to-rowid(get-
value("chave_pai":U))).
RUN getRecord in {&hDBOTableFather} (output table {&ttTableFather}).
Find First {&ttTableFather} no-lock no-error .
Delete procedure {&hDBOTableFather}.
create {&ttTable1} .
{web/winclude/wi-datatype.i &dst="{&ttTable1}.Order-num"
&type="integer" &org="w_Order_num:screen-value"}
{web/winclude/wi-datatype.i &dst="{&ttTable1}.Line-num"
&type="integer" &org="w_Line_num:screen-value"}
{web/winclude/wi-datatype.i &dst="{&ttTable1}.Item-num"
&type="integer" &org="w_Item_num:screen-value"}
{web/winclude/wi-datatype.i &dst="{&ttTable1}.Qty" &type="integer"
&org="w_Qty:screen-value"}
{web/winclude/wi-assign.i}
end.
END PROCEDURE.

Nesta procedure são feitas as associações entre a tabela temporária e as


variáveis de tela.
PROCEDURE displayFields :
/*---------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
---------------------------------------------------------------------*/
DO WITH FRAME {&FRAME-NAME} :
assign chave_pai:screen-value = get-value("chave_pai":U) .
Find First {&ttTable1} no-lock no-error .
if avail {&ttTable1} then do :
ASSIGN
w_Order_num:screen-value = string({&ttTable1}.Order-num)
w_Line_num:screen-value = string({&ttTable1}.Line-num)
w_Item_num:screen-value = string({&ttTable1}.Item-num)
w_Qty:screen-value = string({&ttTable1}.Qty) .
end.
Procedure process-
web-request

end.
END PROCEDURE.

Nesta Procedure é criada a instância do DBO. Logo após deve-se definir as


restrições iniciais e a abertura da query, caso necessário.

A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o


DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

PROCEDURE process-web-request :
/*---------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/
RUN outputHeader.
/** Carrega BO persistente e retorna o handle para a vari vel ------*/
{web/winclude/wi-loadbo.i &program=bosports/boorderline.p
&handle={&hDBOTable1}}
/*-----------------------------------------------------------------*/
RUN openQueryStatic in {&hDBOTable1} (input "Main":u).

IF REQUEST_METHOD = "POST":U THEN DO WITH FRAME {&FRAME-NAME}:


{web/winclude/wi-metpost.i}
END.
ELSE DO WITH FRAME {&FRAME-NAME}:
{web/winclude/wi-metget.i}
END.
RUN displayError .
delete procedure {&hDBOTable1}.
END PROCEDURE.

Arquivo HTML O arquivo HTML contem algumas tags necessárias para garantir o padrão de
layout e algumas características funcionais do produto.

A tag abaixo define o arquivo que contém as configurações padrões de cores,


bordas e links.
Templates para WEB 61

<link rel="StyleSheet" type="text/css" href="/ems20web/padrao.css">

As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
<meta http-equiv="Cache-Control" content="No-Cache">
<meta http-equiv="Pragma" content="No-Cache">
<meta http-equiv="Expires" content="0">

Para o correto funcionamento dos cadastros e consultas, devem ser definidas


duas variáveis de controle. Estas variáveis devem ser do tipo “hidden” e
devem estar declaradas como os dois primeiros elementos do formulário.
<input type="hidden" name="hid_chave">
<input type="hidden" name="hid_oper">
<input type="hidden" name="chave_pai">

No HTML devem ser usadas as tags <!—BXLS> e <!—EXLS> para marcar


as palavras ou frases que devem ser traduzidas para outros idiomas.
<td colspan="3" class="barratitulo">
<!--BXLS-->Template Cadastro PaixFilho Complexo<!--EXLS-->
</td>

O nome dos elementos de formulários devem começar com “w_”. Exemplo:


(w_nomedocampo).

No cadastro complexo são criados folders através de links para a mesma


página, de forma a simular uma navegação semelhante aos programas GUI.

O Título do programa deverá aparecer em todos os folders. Além disso, o


folder selecionado não deverá conter o Link para ele mesmo.
Deve ser definida a tag <th> contendo o label e a tag <td> contendo um
elemento de formulário.
No final do arquivo html deve ser adicionada a tag <br> repetidas vezes para
que o folder fique corretamente ajustado na tela, considerando que o padrão
para o desenvolvimento é 800 x 600.

Os dois botões devem ser elementos de formulários . Não devem ser utilizadas
as imagens de OK e Cancel do Menu .
Em casos de cadastros complexos, os botões devem ficar sempre no último
Folder.
Construindo um Vá Para
Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Vá Para.
A seguir está um exemplo de um programa construído com este estilo:

Tarefas

Inicialmente devem ser definidos os valores dos preprocessors padrão do


programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
Temp-Table de
Procedure
Comunicação
displayFields
findRecords

Templates para WEB 63

Preprocessor Descrição
ttTable1 Nome da tabela temporária
hDBOTable1 Nome do DBO que será utilizada
DBOTable1 Nome da tabela principal do DBO
TableName Nome da tabela que será utilizada
DBO2 O valor “YES” indica que utiliza um DBO 2

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE ttTable1 tt-customer


&GLOBAL-DEFINE hDBOTable1 bosp001
&GLOBAL-DEFINE DBOTable1 customer

&GLOBAL-DEFINE TableName customer

&GLOBAL-DEFINE DBO2 YES

Criar as temp-table utilizadas para realizar a comunicação com os DBO’s.


Para isto, deve-se utilizar as mesmas includes de definição das temp-table dos
DBO’s.
{dbo\boXX999.i {&ttTable1}}

Nesta procedure são recuperados os valores digitados pelo usuário, caso ocorra
algum erro ao submeter o formulário.
PROCEDURE displayFields :
/*---------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
----------------------------------------------------------------------*/
IF request_method = "post" then do WITH FRAME {&FRAME-NAME} :
assign w_cod:screen-value = get-value("w_cod") .
end.
else do :
RUN SUPER .
end.
END PROCEDURE.

Nesta Procedure são criadas algumas variáveis utilizadas para fazer o


reposicionamento do registro no programa chamador. Também é necessário
recuperar o nome do programa chamador e criar a instância do DBO.
A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o
DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

Em seguida deve ser executada a procedure goToKey passando como


parâmetro o valor da variável HTML e chamar a include wi-retgoto.i que
contem a lógica para reabrir o programa chamador posicionado do registro
informado.

PROCEDURE findRecords :
/*---------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
----------------------------------------------------------------------*/
def var cod_num as integer no-undo .
def var wRowid as rowid no-undo .
def var c-nome-prog-requis as char no-undo .
assign c-nome-prog-requis = get-value("prog":U).
/** Carrega BO persistente e retorna o handle para a vari vel ------*/
{web/winclude/wi-loadbo.i &program=spbo\bosp001.p
&handle={&hDBOTable1}}
/*------------------------------------------------------------------*/
RUN openQueryStatic in {&hDBOTable1}(input "Main":U).
ASSIGN
ab_unmap.w_Cust_Num = get-value("w_Cust_Num":U).
RUN goToKey in {&hDBOTable1} (input w_Cust_Num).
{web/winclude/wi-retgoto.i "?"}
delete procedure {&hDBOTable1}.
END PROCEDURE.
Arquivo HTML

Templates para WEB 65

O arquivo HTML contem algumas tags necessárias para garantir o padrão de


layout e algumas características funcionais do produto.

A tag abaixo define o arquivo que contém as configurações padrões de cores,


bordas e links.
<link rel="StyleSheet" type="text/css" href="/ems20web/padrao.css">

As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
<meta http-equiv="Cache-Control" content="No-Cache">
<meta http-equiv="Pragma" content="No-Cache">
<meta http-equiv="Expires" content="0">

O título do programa deve ser informado na tag Title.

No HTML devem ser usadas as tags <!—BXLS> e <!—EXLS> para marcar


as palavras ou frases que devem ser traduzidas para outros idiomas.

<title>
<!--BXLS-->Template de Vá Para<!--EXLS-->
</title>

Deve-se deixar uma linha da tabela em branco e em seguida, definir os botões


de OK e Cancel.
<td class="linhaForm" nowrap align="center" colspan="2">
<input type="submit" name="button" value=" Ok
">&nbsp;
<input type="button" name="button" value=" Cancel "
onclick="self.close()">
</td>
Construindo um Pesquisa / Zoom
Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Pesquisa / Zoom.
A seguir está um exemplo de um programa construído com este estilo:

Tarefas

Inicialmente devem ser definidos os valores dos preprocessors padrão do


programa.
A seguir existe uma tabela que possui o nome dos preprocessors padrão e suas
descrições:
Temp-Table de
Comunicação

Templates para WEB 67

Preprocessor Descrição
hCntSes Handle do contexto de sessão
ttTableN Nome da temp-table N utilizada para comunicação com
o DBO N, onde N indica o número da página
HDBOTableN Nome da variable que contém o handle do DBO N, onde
N indica o número da página
DBOTableN Nome da tabela principal do DBO N, onde N indica o
número da página
DBOTableVrs Versão dos DBOs utilizados no programa
DBO2 O valor “YES” indica que utiliza um DBO 2

Exemplo de código com o preenchimento dos preprocessadores:

&GLOBAL-DEFINE hCntSes h-sessao


&GLOBAL-DEFINE ttTable1 tt-customer
&GLOBAL-DEFINE hDBOTable1 hDBOCustomer
&GLOBAL-DEFINE DBOTable1 customer
&GLOBAL-DEFINE DBOTable1Vrs 2
&GLOBAL-DEFINE ttTable2 tt-customer2
&GLOBAL-DEFINE hDBOTable2 bosp001-2
&GLOBAL-DEFINE DBOTable2 customer
&GLOBAL-DEFINE DBOTable2Vrs 2
&GLOBAL-DEFINE DBOSetConstr SetConstraint

Criar as temp-table utilizadas para realizar a comunicação com os DBO’s.


Para isto, deve-se utilizar as mesmas includes de definição das temp-table dos
DBO’s.
{dbo\boXX999.i {&ttTable1}}
{dbo\boXX999.i {&ttTable2}}

Definitions A sessão de definições deve conter os preprocessadores acima, além das


chamadas das includes de definições das temp-tables utilizadas pelo programa
e ainda, as definições das variáveis locais utilizadas pelo programa de
pesquisa.
/* *************************** Definitions **************************
*/
/* Preprocessors Definitions ---
*/

&GLOBAL-DEFINE hCntSes h-sessao

&GLOBAL-DEFINE ttTable1 tt-Customer


Procedure
displayFields

&GLOBAL-DEFINE hDBOTable1 hDBOCustomer


&GLOBAL-DEFINE DBOTable1 Customer
&GLOBAL-DEFINE DBOTable1Vrs 2

&GLOBAL-DEFINE DBOSetConstr Cust-Num

/* Local Variable Definitions --- */

DEFINE VARIABLE vCust_Numini AS CHARACTER NO-UNDO.


DEFINE VARIABLE vCust_Numfim AS CHARACTER NO-UNDO.
DEFINE VARIABLE c_fe AS CHARACTER NO-UNDO.
DEFINE VARIABLE nc_fe AS INTEGER NO-UNDO.
DEFINE VARIABLE xfield AS INTEGER NO-UNDO.

DEFINE VARIABLE aux-count AS INTEGER NO-UNDO.


DEFINE VARIABLE aux-count2 AS INTEGER NO-UNDO.
DEFINE VARIABLE c-return AS CHARACTER NO-UNDO.
DEFINE VARIABLE c-token AS CHARACTER NO-UNDO.

/** Faz a chamada … include da BO para defini‡Æo da temp-table ----*/


{spbo/bosp001.i {&ttTable1}}

&IF "{&DBOTable1Vrs}":U = "1.1":U OR "{&DBOTable1Vrs}":U = "":U &THEN


{include/boerrtab.i}
&ELSE
{method/dbotterr.i}
&ENDIF

/* Local Variable Definitions (DBOs Handles) --- */


DEFINE VARIABLE h-brwapi AS HANDLE NO-UNDO.
DEFINE VARIABLE {&hDBOTable1} AS HANDLE NO-UNDO.
DEFINE VARIABLE {&hCntSes} AS HANDLE NO-UNDO.

Nesta procedure são recuperados os valores digitados pelo usuário, caso ocorra
algum erro ao submeter o formulário.
PROCEDURE displayFields :
/*---------------------------------------------------------------------
Purpose: Super Override
Parameters:
Notes:
----------------------------------------------------------------------*/
IF request_method = "post" then do WITH FRAME {&FRAME-NAME} :
assign w_cod:screen-value = get-value("w_cod") .
end.
else do :
RUN SUPER .
end.
END PROCEDURE.
Procedure process-
web-request

Templates para WEB 69

Nesta Procedure deve ser executada a procedure setVariableRange para cria as


faixas de pesquisa. Em seguida é criada a instância do DBO. Logo após deve-
se definir as restrições iniciais e a abertura da query.

A instancia pode ser feita utilizando a include wi-loadbo.i a qual carrega o


DBO persistente e retorna o handle para a variável:
{web/winclude/wi-loadbo.i &program=spbo/bosp001.p &handle={&hDBOTable1}}

Ou diretamente rodando o DBO de forma persistente:


RUN spbo/bosp001.p PERSISTENT SET {&hDBOTable1}.

Ainda nesta procedure, são informadas as características do browse, as colunas


utilizadas e o campo retornado.

O Formulário HTML é criado através do próprio programa .p.

PROCEDURE process-web-request :
/*---------------------------------------------------------------------
Purpose: Process the web request.
Parameters: <none>
Notes:
--------------------------------------------------------------------*/
def var c-title as character no-undo.

RUN outputHeader.
RUN setVariablesRange.

/** Carrega BO persistente e retorna o handle para a vari vel -----*/


{web/winclude/wi-loadbo.i &program=spbo/bosp001.p
&handle={&hDBOTable1}}
/*-----------------------------------------------------------------*/

RUN setConstraint{&DBOSetConstr} IN {&hDBOTable1} (INPUT


integer(vCust_Numini), INPUT integer(vCust_Numfim) ) .

{web/zoom/i-boqry.i}

{web/winclude/wi-inibrz.i &bohandle={&hDBOTable1} &nrlinha=06}

/* campo que sera  o link */


{web/winclude/wi-rtnbrz.i &nome-campo="Cust-Num" &tipo="i"
&label="Cust-Num" &align="right"}

RUN AddField IN h-brwapi ("Name":U, "c":U, "Name", "right":U, ?).

{web/winclude/wi-likbrz.i &nomeprog="wsp0001a.p"}

RUN setNavigation IN h-brwapi (true).


Procedure
retornaJavaScript

RUN setBorder IN h-brwapi (2).

assign c-title = replace("{&FILE-NAME}":U, "\":U, "/":U)


c-title = entry(num-entries(c-title, "/":U), c-title, "/":U).

{&OUT}
'<html>':U SKIP
'<head>':U SKIP
'<title> ':U
c-title
' </title>':U SKIP
'<link rel="stylesheet" href="/ems20web/padrao.css">':U.

{web/winclude/wi-jscbrz.i &num_campos_browse=9}

{&OUT}
'</head>':U SKIP
'<body>':U SKIP
'<form method="post" action="wpesqcust.p?funcao=':U get-
value("funcao":U)
'&prog_requis=':U get-value("prog_requis":U) '&retorno=':U
get-value("retorno":U) '">':U
.

{web/zoom/i-bocur.i}

RUN generateRange.
RUN generateBrowse IN h-brwapi.
{&OUT} return-value.
/* Output your custom HTML to WEBSTREAM here (using {&OUT}).
*/

{&OUT}
'</form>':U SKIP
'</body>':U SKIP
'</html>':U SKIP
.

delete procedure h-brwapi.


delete procedure {&hDBOTable1}.

END PROCEDURE.

Nesta procedure são informados os campos que serão retornados pelo Zoom ao
programa chamador. Estes devem estar na mesma ordem que foram
relacionados na chamada ao programa.

PROCEDURE retornaJavaScript :
/*--------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
------------------------------------------------------------------*/
Procedure
genereateRange

Templates para WEB 71

DEFINE INPUT PARAMETER r-rowid AS ROWID NO-UNDO.


DEFINE OUTPUT PARAMETER c-char AS CHARACTER NO-UNDO.
DEFINE VARIABLE aux-nome AS CHARACTER EXTENT 2 INITIAL "":U NO-UNDO.
DEFINE VARIABLE aux-valor AS CHARACTER EXTENT 2 INITIAL "":U NO-UNDO.
DEFINE VARIABLE aux-campo AS CHARACTER EXTENT 2 INITIAL "":U NO-UNDO.
{web/zoom/i-bocur.i}
FIND FIRST {&ttTable1} no-lock no-error.
ASSIGN
aux-nome[1] = "tt-Customer.Cust-Num":U
aux-valor[1] = string({&ttTable1}.Cust-Num)
aux-nome[2] = "tt-Customer.Name":U
aux-valor[2] = string({&ttTable1}.Name)
.
{web/winclude/wi-shlbrz.i}
ASSIGN c-char = beginLink + string({&ttTable1}.Cust-Num,">>>>9":U) +
endLink.
END PROCEDURE.

Nesta procedure é gerado o HTML para a faixa , ordenação e para botões de


parâmetro
Na inclusão de novas faixas , a lógica para mostrar as outras faixas deve ser
feita manualmente, além de definir as variáveis chamadas LabelN e que devem
conter os labels das faixas , labels dos radios e labels dos botões.
PROCEDURE generateRange :
/*---------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------*/
DEFINE VARIABLE label1 AS CHARACTER NO-UNDO.

ASSIGN label1 = "Cust-Num".

{&OUT}
'<table border="1" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF"
width="80%" align="center">':U SKIP
' <tr><td align="center">':U SKIP
' <table cellpadding="0" cellspacing="1">':U SKIP
' <tr>':U SKIP
' <th align="center"><span class="linhabrowse">':U label1
':</span></th>':U SKIP
' <td align="center">':U SKIP
' <input type="text" name="vCust_Numini" size="6"
value="':U + vCust_Numini + '">':U SKIP
' <img name="Inicial" src="/ems20web/wimages/im-
fir.gif">':U SKIP
' <img name="Inicial" src="/ems20web/wimages/im-
las.gif">':U SKIP
Procedure
setVariablesRange

' <input type="text" name="vCust_Numfim" size="6"


value="':U + vCust_Numfim + '">':U SKIP
' </td>':U SKIP
' <td align="center">':U SKIP
' <input type="image" name="imagesearch"
src="/ems20web/wimages/ii-enter.gif" border="0" value="acao">':U SKIP
' </td>':U SKIP
' </tr>':U SKIP
.

{&OUT}
' </table>':U SKIP
' </td></tr>':U SKIP
'</table>':U SKIP
'<br><br>':U SKIP
.

END PROCEDURE.

Nesta procedure são gravados os valores das faixas no contexto de sessão.

PROCEDURE setVariablesRange :
/*---------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
---------------------------------------------------------------------*/
ASSIGN c-token = GET-COOKIE("SessionContextToken":U).
RUN web/wutp/wu-sessao.p PERSISTENT SET {&hCntSes}.
RUN setToken IN {&hCntSes} (c-token).
IF REQUEST_METHOD <> "POST":U THEN DO:
RUN getContext IN {&hCntSes} (INPUT "vCust_Numini":U, OUTPUT
vCust_Numini).
RUN getContext IN {&hCntSes} (INPUT "vCust_Numfim":U, OUTPUT
vCust_Numfim).
IF vCust_Numini = "":U THEN ASSIGN vCust_Numini = "0":U.
IF vCust_Numfim = " ":U THEN ASSIGN vCust_Numfim = "99999":U.
END.
ELSE DO:
ASSIGN vCust_Numini = GET-VALUE("vCust_Numini":U)
vCust_Numfim = GET-VALUE("vCust_Numfim":U)
.
RUN setContext IN {&hCntSes} (INPUT "vCust_Numini":U, INPUT
vCust_Numini).
RUN setContext IN {&hCntSes} (INPUT "vCust_Numfim":U, INPUT
vCust_Numfim).

END.
DELETE PROCEDURE {&hCntSes}.
END PROCEDURE.
Templates para WEB 73

ZOOM de Reposicionamento
Para as chamadas dos programas de zoom de reposicionamento é utilizada a
função JavaScript abreZoom().
Exemplo:

<input type="text" size="60" maxlength="256" name="w_c_arquivo">


<a href="javascript:abreZoom('web/spp/wsp0001b.p',530,600,'tt-
usuarios.grupo,w_c_grupo')">
<img src="/ems20web/wimages/ii-zoom.gif" align="absmiddle" border="0"
width="23" height="23">
</a>

Nas chamadas dos programas de zoom/pesquisa , é passado como parâmetro


uma variável chamada “primeira” e o valor é sempre “yes”. Assim , é possível
fazer um teste para saber se o programa está sendo executado pela primeira
vez .
Exemplo:
If get-value(“primeira”) = “yes” then do:
ValorInicial = “AAAAA”
ValorFinal = “ZZZZZ”
End.
Else do:
/* Recupera do contexto de sessão */
End.

Este procedimento é necessário para garantir que os valores iniciais para as


faixas sejam retornados toda vez que o usuário fechar e reabrir o programa na
mesma sessão.

Construindo um Relatório
Neste estão informações para que o desenvolvedor possa construir um
programa baseado no estilo Pesquisa / Zoom.
A seguir está um exemplo de um programa construído com este estilo:
Tarefas
Os programas de relatório na WEB não são executados de modo on-line, e sim
em batch. O usuário, após entrar com os parâmetros e seleções, deverá agendar
a execução do relatório via RPW. Isto significa que o programa que irá gerar o
relatório propriamente dito (rp.p), sera execuatdo pelo RPW.

Definitions Nesta sessão são definidas, além das variáveis locais do programa, as variáveis
para controle do RPW. Além disso, é necessário alterar a definição da temp-
table “tt_param”, para ficar de acordo com a temp-table utilizada no programa
RP.

CREATE WIDGET-POOL.
/* *********************** Definitions ************************** */
/* Preprocessor Definitions --- */
Templates para WEB 75

&SCOPED-DEFINE DBO2
&SCOPED-DEFINE THISNAME
&SCOPED-DEFINE SERVERPW h-boun135
&IF DEFINED(WIDT-VERIFICA) = 0 &THEN
DEFINE VARIABLE widt-datateste AS CHARACTER NO-UNDO.
DEFINE VARIABLE widt-count-aux AS INTEGER NO-UNDO.
DEFINE VARIABLE widt-hora AS INTEGER NO-UNDO.
DEFINE VARIABLE widt-minuto AS INTEGER NO-UNDO.
DEFINE VARIABLE widt-segundo AS INTEGER NO-UNDO.
DEFINE VARIABLE widt-data-valida AS LOGICAL NO-UNDO.
DEFINE VARIABLE widt-logica AS LOGICAL NO-UNDO.
DEFINE VARIABLE widt-cc-aux AS CHARACTER NO-UNDO.
&ENDIF
&GLOBAL-DEFINE WIDT-VERIFICA
/* Parameters Definitions --- */
/* Local Variable Definitions --- */
DEFINE VARIABLE c-param AS CHARACTER NO-UNDO.
DEFINE VARIABLE c-pref AS CHARACTER NO-UNDO.
DEFINE VARIABLE r-chave AS ROWID NO-UNDO.
DEFINE VARIABLE c-return AS CHARACTER NO-UNDO.
DEFINE VARIABLE v-cod-prog-i-rprun AS CHARACTER NO-UNDO.
DEFINE VARIABLE c-versao-mg97 AS CHARACTER FORMAT "x(8)":U NO-UNDO.
DEFINE VARIABLE c-programa-mg97 AS CHARACTER INITIAL "xxx9999":U NO-
UNDO.
DEFINE VARIABLE h-boun091 AS HANDLE NO-UNDO.
DEFINE VARIABLE h-boun136 AS HANDLE NO-UNDO.
DEFINE VARIABLE hid_oper AS CHARACTER NO-UNDO.
DEFINE VARIABLE h-api AS HANDLE NO-UNDO.
DEFINE VARIABLE i-seq AS INTEGER INITIAL 1 NO-UNDO.
DEFINE VARIABLE w_valida_hora AS CHARACTER FORMAT "99:99:99":U INITIAL
"00:00:00":U NO-UNDO.
DEFINE VARIABLE w_valida_hora2 AS CHARACTER NO-UNDO.
DEFINE VARIABLE {&SERVERPW} AS HANDLE NO-UNDO.
DEFINE VARIABLE i-seq-erro AS INTEGER NO-UNDO.
DEFINE VARIABLE log_servidor AS LOGICAL NO-UNDO.
DEFINE VARIABLE h-boun178 AS HANDLE NO-UNDO.
/* Temp-Tables Definitions --- */
{method/dbotterr.i}
{btb/btb912zc.i2}

DEFINE TEMP-TABLE tt-raw-digita


FIELD raw-digita AS RAW .

DEFINE TEMP-TABLE tt-param


FIELD destino AS INTEGER
FIELD arquivo AS CHARACTER
FIELD usuario AS CHARACTER
FIELD data-exec AS DATE
FIELD hora-exec AS INTEGER
FIELD parametro AS LOGICAL
FIELD formato AS INTEGER.
/* Transfer Definitions */
DEFINE VARIABLE raw-param AS RAW NO-UNDO.

Procedure pi- Nesta sessão devem ser feitas algumas alterações conforme segue:
executar - Associar os campos da temp-table tt_param aos campos de tela;
- Alterar o valor do campo tta_cod_modul_dtsul_corren da temp-table
tt_param_segur para o módulo a qual este programa pertence;
- Alterar o valor do campo tta_cod_prog_dtasul da temp-table tt_ped_exec
para o nome do programa original no EMS 2.0;
- Alterar o valor do campo tta_cod_prog_dtasul_rp da temp-table tt_ped_exec
para o nome do programa RP a ser executado pelo RPW;
- Alterar o valor do campo tta_cod_dwb_file da temp-table tt_ped_exec_param
para o nome do programa original no EMS 2.0.

PROCEDURE pi-executar :
/*-----------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
------------------------------------------------------------------*/
DEFINE VARIABLE i-num-ped-exec-pai AS INTEGER NO-UNDO.
DEFINE VARIABLE d-dat-ini-ped-exec AS DATE NO-UNDO.
DEFINE VARIABLE c-arq-aux AS CHARACTER NO-UNDO.
{web/winclude/wi-vglob.i}
if ab_unmap.w_rs_destino = "2" then do:
run utp/ut-vlarq.p (input w_c_arquivo).
if return-value = "NOK":U then do:
run utp/ut-msgs.p (input "msg":U,
input 73,
input "" ).
return return-value.
end.
end.
if ab_unmap.w_ped_depend = yes then do:
{web/winclude/wi-datatype.i &dst="i-num-ped-exec-pai"
&type="integer" &org="ab_unmap.w_ped_exec_pai" &lbl="Pedido Pai"}
end.
{web/winclude/wi-datatype.i &dst="d-dat-ini-ped-exec" &type="date"
&org="ab_unmap.w_dat_inic_exec_servid_exec" &lbl="Data Início Execução"}

FIND FIRST rowErrors NO-LOCK NO-ERROR.


IF AVAIL rowErrors THEN DO:
Templates para WEB 77

return "NOK":U.
END.
create tt-param.
assign tt-param.usuario = v_cod_usuar_corren
tt-param.destino = integer(w_rs_destino)
tt-param.data-exec = date(w_dat_inic_exec_servid_exec)
tt-param.hora-exec = integer(w_valida_hora)
tt-param.parametro = w_tb_parametro
tt-param.formato = integer(w_rs_formato)
tt-param.arquivo = w_c_arquivo.
{web/winclude/wi-rpex.i}
raw-transfer tt-param to raw-param.
create tt_param_segur.
assign tt_param_segur.tta_num_vers_integr_api = 3
tt_param_segur.tta_cod_aplicat_dtsul_corren =
"=cod_aplicat_dtsul_corren=":U
tt_param_segur.tta_cod_empres_usuar =
v_cod_empres_usuar
tt_param_segur.tta_cod_grp_usuar_lst =
v_cod_grp_usuar_lst
tt_param_segur.tta_cod_idiom_usuar =
v_cod_idiom_usuar
tt_param_segur.tta_cod_modul_dtsul_corren = "spp":U
tt_param_segur.tta_cod_pais_empres_usuar =
v_pais_impto_usuario
tt_param_segur.tta_cod_usuar_corren =
v_cod_usuar_corren
tt_param_segur.tta_cod_usuar_corren_criptog =
v_cod_usuar_corren_criptog.
create tt_ped_exec_aux_2.
assign tt_ped_exec_aux_2.tta_num_seq = 1
tt_ped_exec_aux_2.tta_cod_usuario =
v_cod_usuar_corren
tt_ped_exec_aux_2.tta_cod_prog_dtsul = "wsp0006":U
tt_ped_exec_aux_2.tta_cod_prog_dtsul_rp = "wsp0006rp.p":U
tt_ped_exec_aux_2.tta_cod_release_prog_dtsul = "2.00.00.000":U
tt_ped_exec_aux_2.tta_dat_exec_ped_exec =
date(w_dat_inic_exec_servid_exec)
tt_ped_exec_aux_2.tta_hra_exec_ped_exec = w_valida_hora
tt_ped_exec_aux_2.tta_cod_servid_exec =
w_cod_servid_exec
tt_ped_exec_aux_2.tta_cdn_estil_dwb = 97
tt_ped_exec_aux_2.tta_log_exec_prog_depend = w_ped_depend
tt_ped_exec_aux_2.tta_num_ped_exec_pai =
integer(w_ped_exec_pai:screen-value in frame {&frame-name})
tt_ped_exec_aux_2.ttv_log_envia_email = w_envia_email.
create tt_ped_exec_param.
assign tt_ped_exec_param.tta_num_seq = 1
tt_ped_exec_param.tta_cod_dwb_file = "":U
tt_ped_exec_param.tta_cod_dwb_output = (if
w_rs_destino="1" then "Impressora" else "Arquivo")
tt_ped_exec_param.tta_nom_dwb_printer = w_c_arquivo
tt_ped_exec_param.tta_cod_dwb_print_layout = w_c_arquivo.
raw-transfer tt-param to
tt_ped_exec_param.tta_raw_param_ped_exec.
run btb/btb912zd.p (input-output table tt_param_segur,
input-output table tt_ped_exec_aux_2,
input table tt_ped_exec_param,
input table tt_ped_exec_param_aux,
input table tt_ped_exec_sel,
output table tt_erros_envio_email,
input "=program=":U).
find first tt_erros_envio_email no-error.
if avail tt_erros_envio_email then do:
assign c-return = string(tt_erros_envio_email.ttv_cod_erro) + ":
" + tt_erros_envio_email.ttv_des_erro.
end.
else do:
if return-value = "OK":U then do:
find first tt_ped_exec_aux_2 no-lock.
run utp/ut-msgs.p (input "msg":U,
input 4169,
input
string(tt_ped_exec_aux_2.tta_num_ped_exec)).
assign c-return = return-value.
end.
else do:
find first tt_ped_exec_aux_2 no-lock.
if avail tt_ped_exec_aux_2 then
assign c-return = string(tt_ped_exec_aux_2.ttv_num_msg_erro)
+ ": " + tt_ped_exec_aux_2.ttv_cod_msg_parameters.
end.
end.
return c-return.
END PROCEDURE.

Arquivo HTML No arquivo HTML devem ser inseridos os campos necessários nos folder de
Seleção e Parâmetro, conforme especificação do programa. Caso necessário,
podem ser criados novos folders.

<table border="0" cellpadding="0" cellspacing="1" width="80%"


class="tableForm">
<tr>
<td align="center" colspan="4" class="barratitulo"><!--BXLS--
>Template de Relatorio<!--EXLS--></td>
</tr>
<tr>
<td align="center" nowrap class="linhaForm">
<table border="1" cellpadding="0" cellspacing="1"
width="100%" bgcolor="#C2C2C2">
<tr>
Templates para WEB 79

<td align="center" width="100%" nowrap


class="selectedFolderReport"><!--BXLS-->Sele‡Æo<!--EXLS--></td>
</tr>
</table>
</td>
<td align="center" bgcolor="#DCDCDC" nowrap
class="linhaForm"><a
href="#folder2"><!--BXLS-->Parƒmetros<!--EXLS--></a></td>
<td align="center" bgcolor="#DCDCDC" nowrap
class="linhaForm"><a
href="#folder3"><!--BXLS-->ImpressÆo<!--EXLS--></a></td>
</tr>
</table>
</center></div>
<table border="1" cellpadding="0" cellspacing="1" width="80%"
bgcolor="#C0C0C0" height="300" align="center">
<tr>
<td align="center" valign="top" colspan="5" width="100%" nowrap
class="linhaForm">
<table border="0" cellpadding="0" cellspacing="1">
<tr>
<th align="right" nowrap class="linhaForm"><!--BXLS--
>Name<!--EXLS-->:</th>
<td align="left">
<INPUT TYPE="TEXT" NAME="w_Name_ini" SIZE="20"
MAXLENGTH="20">
</td>
<td align="right">
<img src="/ems20web/wimages/im-fir.gif" width="20"
height="20">
</td>
<td align="left">
<img src="/ems20web/wimages/im-las.gif" width="20"
height="20">
</td>
<td align="left">
<INPUT TYPE="TEXT" NAME="w_Name_fim" SIZE="20"
MAXLENGTH="20">
</td>
</tr>
<tr>
<th align="right" nowrap class="linhaForm"><!--BXLS--
>Cust-Num<!--EXLS-->:</th>
<td align="left">
<INPUT TYPE="TEXT" NAME="w_Cust_Num_ini" SIZE="5"
MAXLENGTH="5">
</td>
<td align="right">
<img src="/ems20web/wimages/im-fir.gif" width="20"
height="20">
</td>
<td align="left">
<img src="/ems20web/wimages/im-las.gif" width="20"
height="20">
</td>
<td align="left">
<INPUT TYPE="TEXT" NAME="w_Cust_Num_fim" SIZE="5"
MAXLENGTH="5">
</td>
</tr>
<tr>
<th align="right" nowrap class="linhaForm"><!--BXLS--
>Address<!--EXLS-->:</th>
<td align="left">
<INPUT TYPE="TEXT" NAME="w_Address_ini" SIZE="20"
MAXLENGTH="20">
</td>
<td align="right">
<img src="/ems20web/wimages/im-fir.gif" width="20"
height="20">
</td>
<td align="left">
<img src="/ems20web/wimages/im-las.gif" width="20"
height="20">
</td>
<td align="left">
<INPUT TYPE="TEXT" NAME="w_Address_fim" SIZE="20"
MAXLENGTH="20">
</td>
</tr>
</table>
<p><br>
</p>
</td>
</tr>
</table>
Templates para WEB 81

CAPÍTULO 3

Includes

{dbo\boXX999.i tt-tabela}
Include que define o nome da tabela temporária na interface. No programa de
Consulta Filho é necessário utilizar esta include uma vez para definir a temp-
table Pai e outra vez para definir a temp-table Filho.

{method\dbotterr.i}
Include utilizada para a comunicação de erros da interface com o DBO .

{web/winclude/wi-datatype.i}
Includes para fazer a validação de tipo de dado .

{web/winclude/wi-assign.i}
Include que joga os valores da interface para o DBO e recebe , se houverem,
os erros .

{web/winclude/wi-error.i}
Verifica se houveram erros na temp-table de erros e se houver gera o código
Javascript necessário para montar a tela de erro.

{web/winclude/wi-enafied.i}
Habilita e desabilita os campos necessários para a navegação.
{web/winclude/wi-navega.i}
Include que controla a navegação. Chama os metodos corretos para a
navegação.

{web/winclude/wi-header.i}
Include que contem algumas regras para a navegação e controle de chamadas
de programas Filhos.

{web/winclude/wi-metpost.i}
Include que contem as chamadas para os metodos internos do Webspeed para
o metodo POST.

{web/winclude/wi-metget.i}
Include que contem as chamadas para os metodos internos do Webspeed para
o metodo GET.

{web/winclude/wi-getpai.i}
Include que contem as chamadas para os metodos internos do Webspeed para
o metodo GET.

{web/winclude/wi-sonhei.i}
Gera as tags iniciais de tabela e formulário para a geração do codigo do filho.

{web/winclude/wi-sonbdef.i}
Gera os botões (default) para inclusão, modificação e exclusão de registros.

{web/winclude/wi-sonbut.i}
Gera botões customizados . Onde deve-se definir o nome do botão e a
chamada javascript (É aconselhado utilizar uma função Javascript.)

{web/winclude/wi-sonhef.i}
Geras as tags finais para os botões .

{web/winclude/wi-sontitle.i}
Gera o título para o programa filho .
Templates para WEB 83

{web/winclude/wi-sonnav.i}
Posiciona o DBO no registro desejado . Por exemplo : Navegação e na
exclusão de registros.

{web/winclude/wi-endson.i}
Gera os códigos finais para o HTML e deleta a handle da procedure de API.
Funcionamento:
Definição:

85

CAPÍTULO 4

Utilitários

WU-GRAF
A API de Gráficos tem como função gerar gráficos para o ambiente WEB.
Para isto, ela utiliza um componente de terceiros, o KavaChart
(http://www.ve.com/kavachart/) da Visual Engineering Inc.. Este componente
foi construído na forma de um applet Java (programa Java que é executado por
navegadores Java-enabled) que de acordo com os parâmetros recebidos gera o
gráfico desejado.
1. Instancia-se a api em modo persistente.
Ex.: run web/wutp/wu-graf.p persistent set h-graf.
2. Cria-se as seqüências necessárias.
Ex.: run addSequence in h-graf(1, "seq1").
3. Adiciona-se os valores na quantidade necessária.
Ex.: run addValue in h-graf(1, 10.0).
4. Adiciona-se as labels.
Ex.: run addLabel in h-graf(1, "Label 1").
5. Adiciona-se parâmetros desejáveis (opcional).
Ex.: run addParam in h-graf("titleString", "Teste de Gráfico").
6. Executa-se a geração e exibe-se o gráfico.
7. Elimina-se a instância da API.
Métodos Internos:

86

 addSequence (integer seqüência, char descrição): adiciona uma nova


seqüência de valores;
 seqüência: número ordinal da seqüência;
 descrição: descrição a ser apresentada no gráfico.
 addValue(integer seqüência, decimal valor): adiciona um valor a uma
seqüência existente;
 seqüência: número de seqüência, na qual, será acrescentado o valor;
 valor: valor a ser acrescentado;
 addLabel(integer coluna, char label): adiciona uma label para a
coluna/valor;
 coluna: numero seqüência1 da coluna;
 label: nome da label da coluna correspondente;
 addParam(char param, char valor): adiciona um parâmetro qualquer ao
Applet KavaChart;
 param: nome do parâmetro a ser passado;
 valor: valor a ser setado no parâmetro;
 deleteAll(): limpa todos os dados do gráfico;
 generate(char tipo, integer width, integer height);
 tipo: tipo do gráfico (bar, column, hiLoBar, indBar, stackBar,
stackColumn, area, labelLine, disLine, pie, polar. (Obs.: este
parâmetro é case sensitivo.)
 width: largura utilizada pelo applet;
 height: altura utilizada pelo applet;
 return-value: possui a tag preparada para a geração do gráfico;
Exemplo:
run web/wutp/wu-graf.p persistent set h-graf.
RUN output-header.
{&OUT}
"<HTML>":U SKIP
"<HEAD>":U SKIP
"<TITLE> Teste de Graficos </TITLE>":U SKIP
Templates para WEB 87

"</HEAD>":U SKIP
"<BODY>":U SKIP
.
/* cria as seqüências */
run addSequence in h-graf (1, "seq1").
run addSequence in h-graf (2, "seq2").
/* adiciona os valores */
run addValue in h-graf (1, 10.0).
run addValue in h-graf (1, 7.0).
run addValue in h-graf (1, 2.0).
run addValue in h-graf (1, 15.0).
run addValue in h-graf (1, 10.0).
run addValue in h-graf (2, 11.0).
run addValue in h-graf (2, 2.0).
run addValue in h-graf (2, 6.0).
run addValue in h-graf (2, 2.0).
run addValue in h-graf (2, 12.0).
/* adiciona as labels */
run addLabel in h-graf (1, "11").
run addLabel in h-graf (2, "12").
run addLabel in h-graf (3, "13").
run addLabel in h-graf (4, "14").
run addLabel in h-graf (5, "15").
/* adiciona parâmetros */
run addParam in h-graf ("3D", "").
run addParam in h-graf ("titleString", "Teste de
Grafico").
run addParam in h-graf ("legendlly", "0").
run addParam in h-graf ("titleFont", "Times New
Roman,20,2").
run addParam in h-graf ("xAxisOptions", "gridOn").
run addParam in h-graf ("yaxisOptions", "gridOn").
/* gera a tag e apresenta a saída */
run generate in h-graf ("labelLine", 600, 400).
{&out} return-value.
{&out} "<br><br>".
{&OUT}
"</BODY>":U SKIP
"</HTML>":U SKIP
delete procedure h-graf.
Applet KavaChart:
Saída:

Principais parâmetros:

Parâmetro Tipo Efeito


TitleString String Título do gráfico
TitleFont Font nome, tamanho e estilo do fonte (default TimesRoman, plain, 12 pt)
TitleColor color cor do texto na legenda (default black)
LegendOn anything torna a legenda visível
LegendOff anything torna a legenda invisível (default)
legendColor color seta a cor de fundo da legenda
legendVertical anything ícones da legenda em lista vertical (default)
legendHorizontal anything ícones da legenda em lista horizontal
legendLabelFont font nome, tamanho e estilo da legenda (default TimesRoman, plain, 12 pt)
legendLabelColor color cor de texto na legenda (default black)
LegendllX double posição X do canto inferior esquerdo da legenda (default 0.2)
LegendllY double posição Y do canto inferior esquerdo da legenda (default 0.2)
IconWidth double largura do ícone da legenda (default 0.07)
iconHeight double altura do íconde da legenda (default 0.05)
IconGap double espaço entre o ícone e a próxima entrada da legenda (default 0.01)
Templates para WEB 89

plotAreaTop double topo da área plotável


plotAreaBottom double base da área plotável
plotAreaRight double lado direito da área plotável
plotAreaLeft double lado esquerdo da área plotável
plotAreaColor color cor de fundo da área plotável (default white)
backgroundColor color cor de fundo do gráfico (default white)
3D anything liga o efeito 3D no gráfico
2D anything liga o efeito 2D no gráfico (default)
XDepth integer número de pixels na direção X para efeitos 3D (default 15)
YDepth integer número de pixels na direção Y para efeitos 3D (default 15)
dwellLabelsOn false desabilita labels no popup (default habilitado)
dwellUseLabelString true Usa labels de dados no popup (default off)
dwellUseXValue false Usa valores X no popup (default on)
dwellUseYValue false Usa valores Y no popup (default on)
dwellXString String A string que contém o caracter "#", que será substituída pelo ponto X
(default: "X:#")
dwellYString String A string que contém o caracter "#", que será substituída pelo valor Y
(default: "Y:#")
dwellLabelPrecision integer Número máximo de dígitos significantes para exibir número não
inteiros. (default 2)
dwellLabelFormat 0,1,2 Tipo de formato numérico para as labels popup (0 - nenhum, 1 -
vírgula, 2 - formato europeu, default 1)
CAPÍTULO 5

Como usar uma BO

Para usarmos uma BO devemos:


1. Declarar a variável que irá conter o handle da BO.
2. Instanciar a BO, ou seja, rodar a BO deixando-a disponível na memória.
3. Chamar os métodos.
3.1. A abertura da query pode ser feita através da chamada do método
openQuery passando como parâmetro o número da query que deve ser
aberta. É importante atentarmos para o fato de que é necessário rodar
o método setConstraint correspondente, ou seja, ao abrirmos a query 2
devemos rodar o método setConstraint2 anteriormente.
3.2. Se não for aberta uma query a BO usará o comando find para realizar
pesquisas nos métodos padrões, usa-se esta característica em especial
para o método findRowid onde neste caso há ganhos de performance.
4. Eliminar a instância da BO.
Exemplo:
def var w-cd-banco as integer no-undo.
def var h-boad018 as handle no-undo. // passo 1
def var h-DataObject as handle no-undo.
RUN adbo/boad018.p persistent set h-boad018. // passo 2
RUN findRowid in h-boad018(input r_chave). // passo 3
RUN getIntField ind h-boad018(input “cod-banco”, output w-
cd-banco).
delete procedure h-boad018.
RUN adbo/boad002.p persistent set h-DataObject.
Observação:

Templates para WEB 91

RUN setConstraint2 in h-DataObject(input w-cd-banco). //


item 3.1
RUN openQuery in h-DataObject(2). // item 3.1

Os retornos de erro da BO são realizados via tt-bo-erro que não pode ser
customizada pelos desenvolvedores.
Métodos
Descrição

93

CAPÍTULO 6

Contexto de Sessão

O contexto de sessão (CS), tem por objetivo fornecer ao desenvolvedor WEB,


um mecanismo para guardar valores para uso posterior nos programas. Seria o
equivalente a variáveis globais no ambiente Cliente/Servidor.
Alguns destes valores podem ser utilizados: usuário corrente, idioma do
usuário, rowid de registros correntes, etc.
Através do CS, o programador vai poder trocar informações entre dois
programas, já que as informações vão ficar disponíveis para outros programas.
O uso do CS deve ser exclusivamente na parte de interface. Os BO´s não
devem acessar a API de contexto de sessão. O motivo é que o CS usa
mecanismos que são específicos da interface WEB (cookie) que não estão
disponíveis na parte do BO.
 método setContext para indicar que, quando o valor passado como
parâmetro para ser setado, não existir na tabela de contexto, este será
criado;
 método getcontext quando não encontra o registro que o usuário tenta
recuperar retorna branco. Para verificar se o registro está em branco na
base de dados ou não existe pode-se usar o método getContextStatus que
irá retornar false quando a informação não existir.

Funcionamento
O contexto de sessão se baseia no fato de que cada usuário conectado vai ter
um token que identifica a sessão do mesmo. Este token identifica os valores do
contexto da sessão do usuário.
94

Para usar o contexto de sessão, deve ser usado o programa WU-SESSAO.P. A


seguir estão descritos os processos disponíveis.

Gerando o token da sessão


O token da sessão é gerado pelo programa de login (web/btp/wbtb910.w).
Normalmente, o programador não vai gerar novos tokens. O que o
programador precisa é buscar o token da sessão, quando precisar salvar ou
recuperar valores.
O programa de login gera o token para a sessão e o deixa disponível em um
cookie (‘SessionContextToken”). Para obter o valor deste token use a função
get-cookie, conforme demonstrado a seguir.

Obtendo o token da sessão


Para obter o token gerado pelo programa de login, use a função get-cookie e
salve numa variável do tipo char. Depois o programador usará este token para
salvar e recuperar valores.
def var c-token as char no-undo.
assign c-token = get-cookie(“SessionContextToken”:u).

Armazenando um valor para uso futuro


De posse do token da sessão, o programador poderá guardar valores usando a
função createNewContext da api de contexto (wu-sessao.p). Por exemplo, o
programador quer guardar a empresa e idioma do usuário corrente.
def var h-prog as handle no-undo.
def var c-token as char no-undo.
assign c-token = get-cookie(“SessionContextToken”:u).
run web/wutp/wu-sessao.p persistent set h-prog.
run setToken in h-prog (c-token).
run createNewContext in h-prog (“meuprog-empresa”:u, “1”).
run createNewContext in h-prog (“meuprog-idioma”:u,
“portugues”:u ).
delete procedure h-prog.

Observação O desenvolvedor define os nomes de variáveis (no exemplo:


meuprog-empresa, meuprog-idioma) para os valores de contexto que desejar
guardar. O padrão para este nome de variável é o nome do programa, o
caracter “-“ e uma sequência de caracteres para identificar a variável. É
importante usar o nome do programa como parte do nome da variável para
Observações:

Templates para WEB 95

garantir que programas com nomes de variáveis idênticos não acabem


recuperando contextos trocados.

Recuperando um valor armazenado


Para obter um valor armazenado previamente use a função getContext da API.
def var h-prog as handle no-undo.
def var c-token as char no-undo.
Def var c-emp as char no-undo.
Def var c-idioma as char no-undo.
Assign c-token = get-cookie(“SessionContextToken”:U).
run web/wutp/wu-sessao.p persistent set h-prog.
Run setToken (c-token) in h-prog.
run getContext in h-prog (‘meuprog-empresa’:U, output c-
emp).
run getContext in h-prog (‘meuprog-idioma’:U, ouput c-
idioma).
Delete procedure h-prog.

 os valores para createNewContext e getContext são do tipo character. O


programador precisa fazer as conversões necessárias quando trabalhar com
variáveis inteiro, decimal, date, etc.;
 os nomes de variáveis são definidos pelo desenvolvedor dentro do padrão
estabelecido. É importante apenas colocar após o nome da variável o
identificador: U para evitar a tradução destes nomes;
 o login deixa disponível alguns valores padrões para a sessão. Verificar no
include “web/winclude/wi-vglob.i”;
 se não for executado o login, não haverá token definido para a sessão e o
contexto de sessão não funcionará;
 sempre que usar strings e for possível use a propriedade :u para as
informações;
 quando executamos o método createNewContext ele cria um novo
registro, caso o registro já exista e o programador deseje alterá-lo, basta
usar o método setContext que recebe dois input parameter que são
respectivamente o nome a ser alterado e o novo valor.
Descrição

97

CAPÍTULO 7

Contexto de Transação

O contexto de transação (CT), tem por objetivo fornecer ao desenvolvedor


WEB, um mecanismo para guardar grandes quantidades de valores para uso
posterior nos programas. Seria o equivalente a passar temp-tables como
parâmetros de um programa para outro em programas que trabalham por
etapas como wizards no ambiente Cliente/Servidor. Esta solução foi criada
para que pudéssemos permitir para Web Browsers manterem conjuntos
grandes de informações temporárias em processos que exijam várias etapas
para serem executadas. Precisamos de um mecanismo que permita o nosso
programa CGI (.w) receba dados de um web-browser e realize algum processo
sobre estes dados guardando-os para uso futuro e possa devolver uma resposta
ficando no aguardo por uma confirmação do usuário ou outro conjunto de
dados. No momento em que esta confirmação for feita, os dados que foram
guardados de forma temporária são transferidos para as devidas tabelas do
produto. Exemplo:
 desmembramento de bens (usa um wizard e pede um conjunto de dados
que só são gravados no banco de dados do produto quando todo o processo
está completo, ou seja, o usuário usa vários formulários HTML e só
confirma a gravação no último deles);
 entrada de lote e capa de lote, onde a capa de lote não pode existir sem os
itens do lote.
Normalmente, usado para guardar valores de temp-tables entre etapas de um
processo interativo.
O uso do CT deve ser exclusivamente na parte de interface. Os BO´s não
devem acessar a API de contexto de transação. O motivo é que o CT usa
Métodos

98

mecanismos que são específicos. O acesso a tabela de CT deve ser feito


exclusivamente pela API wu-transacao.
 o método setTransacao serve para indicar que quando o valor passado
como parâmetro para ser setado, não existir na tabela de transação, este
será criado;
 o método getTransacao quando não encontra o registro que o usuário tenta
recuperar retorna branco. Para verificar se o registro está em branco na
base de dados ou não existe pode-se usar o método getTransacaoStatus
que irá retornar false quando a informação não existir.

Funcionamento
Para possibilitar o processo de controle de transação e manter informações
persistentes, mesmo após o .w ter encerrado e devolvido dados para o cliente
(Web Browser) optou-se por manter do lado server uma tabela que mantém as
informações temporariamente.
Como as informações referentes a transação estão localizadas em tabelas do
banco de dados o programa .w precisa instanciar a API wu-contexttrn.p para
poder acessar os valores, evitamos desta forma que haja embutido no.w
acessos ao banco. Para que a API possa gravar informações de contexto é
necessário definir um TOKEN que irá indicar a transação e a qual tabela a
transação se refere. Observando que um token (transação) pode ser usado para
várias tabelas. O token da transação deve ser gravado no Contexto de Sessão.

Guardando uma transação para uso futuro


O programa .w que irá precisar que a transação seja persistente deve
armazenar no contexto um token que identifique a transação.
Quando o cliente vai usar ou criar dados de transação ele deve antes de mais
nada definir o token da transação chamando o método setToken e logo em
seguida definir a tabela/processo setNomTabela que irá ser usado.
Devemos observar no entanto que se o cliente .w ainda não possuir um token
para tratamento de transação ele deve requisitar um fazendo uma chamada a
getToken. Gravação de novas informações é feita através de chamadas ao
método createNewTransacao que recebe como parâmetro o campo a ser
gravado, um indicador de seqüência e um valor, notamos que o campo
seqüência é extremamente útil quando gravamos campos extent ou quando
Exemplo:

Templates para WEB 99

estamos gravando relacionamentos de uma tabela, por exemplo pedido e itens


do pedido, onde cada item do pedido possuiria sua própria seqüência.

Usando uma transação


O processo de busca a partir de um .w é extremamente simples, sendo
constituído apenas pelas tarefas de:
1. O .w recuperar o token.
2. É instanciada a API de transação.
3. O método setToken da API é chamado recebendo o token que foi
recuperado.
4. A tabela deve ser setada.
O método getTransacao da API é chamado.
Gravando a transação
RUN settoken IN h-transacao (input v-token).
RUN setNomtabela IN h-transacao (input “meuprog-bem”).
RUN createNewTransacao IN h-transacao (input “bm-codigo”,
input i-seq, input (W_bm_codigo: screen-value)).
RUN createNewTransacao IN h-transacao (input “bm-indice”,
input i-seq, input (w_bm_indice:screen-value)).
RUN createNewTransacao IN h-transacao (input “descricao”,
input i-seq, input (w_descricao:screen-value)).
RUN createNewTransacao IN h-transacao (input “gb-codigo”,
input i-seq, input (w_gb_codigo:screen-value)).
RUN createNewTransacao IN h-transacao (input “di-codigo”,
input i-seq, input (w_di_codigo:screen-value)).
RUN createNewTransacao IN h-transacao (input “sc-codigo”,
input i-seq, input (w_sc_codigo:screen-value)).

Recuperando a transação
RUN settoken IN h-transacao (input v-token).
RUN setNomtabela In h-transacao (input “meuprog-bem”).
DO i-cont-ini = 2 TO i-contador:
create tt-bem.
RUN gettransacao IN h-transacao (input “bm-codigo”,
i-cont-ini, c-retorno).
assign tt-bem.bm-codigo = dec(c-retorno).
RUN gettransacao IN h-transacao (input “bm-indice”,
i-cont-ini, c-retorno).
assign tt-bem.bm-indice = dec(c-retorno).
end.
delete procedure h-transacao.

Recuperando o número da última seqüência


Quando o programa por alguma razão precisar que seja retornardo o número
da última seqüência usada, ele deve fazer isto usando o procedimento de
contexto procedendo conforme especificado a seguir:
1. Criar o primeiro registro no contexto com o nome “lastSequence”.
2. Gravar neste registro o número 1 (um) indicando que um valor já foi
usado.
3. Para cada novo registro criado no contexto incrementar em um o valor de
“lastSequence”.
Sempre que o programador precisar saber qual foi a última seqüência usada ele
pode recuperar “lastSequence”.
Métodos Internos:
Funcionamento:
Definição:

101

CAPÍTULO 8

API de Browse – wu-browse.p

A API de Browse tem como função gerar tabelas no formato browse para o
ambiente WEB.
8. Instancia-se a api em modo persistente.
Ex.: run web/wutp/wu-browse.p persistent set h-browse.
9. Instancia-se a BO em modo persistente.
Ex.: run adbo/boad018.p persistent set h-boad018.
10. Informa-se a api qual a BO que irá fornecer os dados.
Ex.: run setDataset in h-browse (h-boad018).
11. Adiciona-se os campos a serem apresentados.
Ex.: run addField in h-browse ("nome-banco", "C", "Nome", "left", ?).
12. Configura-se a bo, posiciona-se o registro e define-se a query.
13. Executa-se a geração e exibe-se o browse.
Ex.: run generateBrowse in h-browse.
14. Elimina-se a instância da API.
 addEditableField (char chField, char chType, char chTitle, char chAlin, int
iTam) – insere um campo cujo valor pode ser editado.
 chField – nome do campo
 chType – tipo do campo (C – char, E – decimal, I – integer, D – date,
L – logical)
 chTitle – título da coluna
102

 chAlin – alinhamento do campo (Right, Left, Center)


 iTam – tamanho do campo de entrada a ser gerado
 addField (char chField, char chType, char chTitle, char chAlin, char
chLink) – insere um campo a ser apresentado
 chField – nome do campo
 chType – tipo do campo (C – char, E – decimal, I – integer, D – date,
L – logical)
 chTitle – título da coluna
 chAlin – alinhamento do campo (Right, Left, Center)
 chLink – link a ser gerado no campo. Utilizar a string &1 no local
onde será substituido pelo rowid do registro corrente.
 addFunction (handle hProg, char chFunction, char chTitle, char chAlin) –
insere uma chamada à uma procedure interna cuja assinatura é (input
rowid, output saida) e o resultado do parâmetro saida é inserido na tabela.
 hProg – handle do programa que possui a procedure interna
 chFunction – nome da procedure interna a ser executada
 chTitle – título da coluna
 chAlin – alinhamento do campo (Right, Left, Center)
 addFunctionTT (handle hProg, char chFunction, char chTitle, char chAlin,
table TEMP-TABLE)
 hProg – handle do programa que possui a procedure interna
 chFunction – nome da procedure interna a ser executada
 chTitle – título da coluna
 chAlin – alinhamento do campo (Right, Left, Center)
 Temp-Table – Tabela com os campos que vão ser trabalhados . (Segue
exemplo abaixo.
Exemplo :
Definir Temp-Table com os campos que serão utilizados (Campos chaves
da tabela temporária) .
Definitions :
Templates para WEB 103

def temp-table tt-nome-campos field nomecampo as char


field tipocampo as char .
def var contador as integer no-undo initial 1 .

Na Process-web-request :

run addFunction in h-brwapi


(this-procedure, "geraRow":U, "", "right":U).

create tt-nome-campos .
assign tt-nome-campos.nomecampo = "numero-ordem"
tt-nome-campos.tipocampo = "I" .

create tt-nome-campos.
assign tt-nome-campos.nomecampo = "it-codigo"
tt-nome-campos.tipocampo = "I" .

create tt-nome-campos.
assign tt-nome-campos.nomecampo = "seq-cotac"
tt-nome-campos.tipocampo = "I" .

create tt-nome-campos.
assign tt-nome-campos.nomecampo = "un"
tt-nome-campos.tipocampo = "C" .

run addFunctionTT in h-brwapi


(this-procedure , "geraCheck" , "" , "center", input table
tt-nome-campos ) .

...

PROCEDURE geraCheck:
define input parameter c-char2 as char no-undo.
define output parameter c-char as char no-undo.
assign c-char = '<input type="checkbox" name="cbchave' +
string(contador) + '" value="' + string(c-char2) + '">' .
assign contador = contador + 1 .

END PROCEDURE.

PROCEDURE geraRow:
define input parameter r-rowid as row no-undo.
define output parameter c-char as char no-undo.
assign c-char = '<input type="hidden" name="row' + string(contador) +
'" value="' + string(r-rowid) + '">' .
END PROCEDURE.

 addInput (char chField, char chType, char chTitle, char chAlin, int iTam)
– insere um campo editável para fins de digitação.
 chField – nome do campo, será concatenado com o rowid exceto no
radio
 chType – tipo do campo (T – text, C – checkbox, R – radio)
 chTitle – título da coluna
 chAlin – alinhamento do campo (Right, Left, Center)
 iTam – tamanho do campo de entrada a ser gerado
 generateBrowse – gera o browse e retorna-o via return-value.
 setBorder (int iBorder) – seta a espessura das bordas do browse. Default: 1
 iBorder – espessura da borda
 setDataset (handle hBO) – seta o handle da bo que será a fonte de dados.
 hBO – handle da bo instanciada
Templates para WEB 105

 setForm (logical lOp) – define se a api irá gerar um form ou não. Default:
false
 lOp – true ou false se deseja form
 setLines (int iLines) – define a quantidade de linhas geradas, 0 – gera
todas as linhas. Default: 10
 iLines – número de linhas geradas
 setLinkNavigation (char chLink) – define o link a ser utilizado caso haja
navegação
 chLink – link para a navegação
 setNavigation (logical lOp) – define se a api irá gerar os botões de
navegação. Default: false
 lOp – true ou false se deseja navegação

Exemplo:
run adbo/boad018.p persistent set h-boad018.
run web/brwapi/brwapi.p persistent set h-brwapi.
run setDataset in h-brwapi (h-boad018).
run findFirst in h-boad018.
run addField in h-brwapi ("cod-banco", "I", "Banco", "right",
"prog2?param=mod").
run addEditableField in h-brwapi ("cod-febraban", "I", "Febraban",
"right", 2).
run addEditableField in h-brwapi ("nome-abrev", "C", "Abrev",
"left", 10).
run addField in h-brwapi ("nome-banco", "C", "Nome", "left", ?).
run addInput in h-brwapi ("t", "T", "Entrada", "left", 5).
run addInput in h-brwapi ("c", "C", "Quais?", "center", ?).
run addInput in h-brwapi ("r", "R", "Qual?", "center", ?).
run addFunction in h-brwapi (this-procedure, "valorMethod",
"Calculado", "center").
run setNavigation in h-brwapi (true).
Saída:

run setLinkNavigation in h-brwapi ("teste.p?x=x").


run setBorder in h-brwapi (2).
RUN output-header.

{&OUT}
"<HTML>":U SKIP
"<HEAD>":U SKIP
"<TITLE> {&FILE-NAME} </TITLE>":U SKIP
'<link rel="stylesheet" href="/ems20web/padrao.css">'
"</HEAD>":U SKIP
"<BODY>":U SKIP
'<form><input type="submit">'
.

run generateBrowse in h-brwapi.

{&out} return-value.

{&OUT}
'</form>'
"</BODY>":U SKIP
"</HTML>":U SKIP
.

Calcula
Banco Febraban Abrev Nome Entrada Quais? Qual?
do
Banco de teste0x000
0
Teste 65845
Banco do teste0x001
1
Brasil 2ac01
Banco de teste0x001
2
Teste 09489
Templates para WEB 107

Banco da teste0x001
3
Gente 8ac63
Banco do teste0x000
4
Nordeste 13b23
Teste Banco teste0x000
5
Adriana 13b24
Teste do teste0x001
6
Ricardo 3ccc3

7 LCS Banks teste0x000


13c01
Banco
8 General teste0x001
Motors 32f00
10101010101 teste0x000
9
010101 84e85

Exemplo de Recuperação de Variáveis no BROWSE . (SEM O USO DE


JAVASCRIPT). Continuando o exemplo do AddFuntionTT .

No Método POST :
def var conta2 as integer no-undo.
def var conta as integer no-undo .
def var aux-row as char no-undo .
def var aux-un as char no-undo .

assign conta2 = integer(get-value("contador")) .


do conta = 1 to conta2 :
if get-value("cbchave" + string(conta)) <> "" then do :
aux-row = get-value("row" + string(conta)) .
aux-un = get-value("un" + aux-row) .
{&out} "<big><big>" get-value("cbchave" + string(conta))
"</big></big>" .
{&out} ",<big><big>" aux-un "</big></big>" .
aux-un = get-value("preco-fornec" + aux-row) .
{&out} ",<big><big>" aux-un "</big></big><br>" .
end.
end.
Templates para WEB 109

CAPÍTULO 9

Técnicas e Considerações Gerais

Includes do EMS 2 GUI

Sempre que possível usar includes do EMS 2 GUI no produto Web, isto é,
extremamente recomendável por gerar reaproveitamento, como pode haver
casos onde seja necessário verificar dentro do include se o produto rodando
está na sua versão Web ou não deve-se usar a função Proversion do Progress
conforme a seguir:
if INDEX(proversion, "WebSpeed") = 0 then
/* comandos gui */
else
/* comandos para web */

Como esta decisão é tomada em tempo de execução, o usuário deve atentar


para que dentro do bloco de lógica não existam comandos específicos do
WebSpeed.

Label dos Campos no HTML´s

O label dos campos deve estar sempre no formato:


LABEL:<ESPAÇO>CAMPO
Controles para a não utilização de cache

Para que os programas não utilizem o cache do browser, o que pode acarretar
inconsistência dos dados, deve ser verificado se nos .HTML, existem as
seguintes TAGS entre o <HEAD> e o </HEAD>:
<meta http-equiv="Cache-Control" content="No-Cache">
<meta http-equiv="Pragma" content="No-Cache">
<meta http-equiv="Expires" content="0">

Inclusão recursiva

Para implementar a inclusão recursiva nos programas WEB (somente para as


novas templates) deve-se incluir o seguinte pré-processador:
&GLOBAL-DEFINE RECURSIVE_ADD YES

Fechamento de janelas de inclusão de pai

Para que os programas que utilizam a template de cadastro de pai simples ou


complexo, fechem corretamente após a inclusão, deve-se atentar para os
seguintes pré-requisitos:
 Deve conter o pré-processador &ttTableFather;
 Deve conter o pré-processador &NFACON;
 Não deve conter o pré-propcessador &CADSON.

Validações em Geral

As validações em HTML se resumem a tipo de dado, tamanho de campo,


formato de data. Ou seja, validações simples que não dependam de regras de
negócio.
Templates para WEB 111

Validação de Inicial e Final

Estas validações devem seguir o mesmo padrão do ambiente cliente/servidor


que não valida isto. Caso o usuário informe o inicial maior que o final, o
desenvolvedor pode fazer esta validação na BO e retornar o erro, ou
simplesmente não fazer nada (é claro que, a faixa não vai encontrar registros).
Desta forma não é preciso fazer o controle na interface que fica mais simples.

Validações em Relatórios

Após solicitar os dados e antes de gerar o pedido RPW, se houver necessidade


deve-se fazer validações. Estas validações devem ser feitas no programa
Progress. Se forem validações específicas da tabela deve-se usar o BO.
A regra geral é não gravar erros no pedido de execução do RPW.
Lembrando que o recurso muito comum nos relatórios GUI de habilitar e
desabilitar campos na interface não deve ser usado, ou seja, devemos deixar
tudo habilitado e fazer a validação depois.

Desenvolvimento Específico/Customizações

Para o desenvolvimento de aplicações específicas e/ou customizações (AEC)


na WEB, deve-se procurar observar algumas regras para isto:
 deve-se colocar as tabelas AEC em um banco de dados separado ao
produto EMS;
 os programas do AEC devem ser criados em diretório separado do
produto;
 programas que referenciam somente tabelas AEC devem ficar no diretório
específico da customização;
 programas que existem no EMS e são necessários para a AEC, mas que
ainda não foram convertidos para WEB, devem ser convertidos e devem
ficar como parte do produto EMS. O motivo é que estes programas
Exemplo:

deverão ser convertidos futuramente para WEB. Fica a cargo das equipes
de desenvolvimento definir qual das duas equipes (EMS ou AEC) deve
fazer esta conversão;
 novos programas necessários para AEC que referenciam tabelas do
produto EMS devem ser criados e devem ficar no diretório do AEC, já que
os mesmos não serão utilizados no EMS.

Como fazer links para detalhe do registro

 os links devem ser criados logo abaixo do Título do Programa;


 a sintaxe do link é a seguinte:<a
href=”javascript:funcaoJavaScript()”>Nome do Detalhe</a>
A função JavaScript abrirá uma outra página com o detalhe do registro.
function funcaoJavaScript () {
window.open(“wcr0703b.p?chave=” +
Exemplo:
Sintaxe

Templates para WEB 113

document.forms[0] .elements[0].value, “NomedaFrame”,


“top=0,left=0,width=500,height=450,scrollbars=no,toolbar=no,loca
tion=no, directories=no,status=no,resizable=yes”);

Como habilitar/desabilitar campos nos HTML´s

Não deve ser habilitado e desabilitado campos 'on line'. Ou todo HTML está
habilitado ou está desabilitado. O objetivo disto é facilitar a programação.

Utilizar a área do label do radio-set e check-box para click do mouse

Para Radio-Sets:
<label for=”valor1”><input type=”radio” name=”campo”
value=”valor” id=”valor1”>
Descrição </label>

Para CheckBox:
<label for=”valor1”><input type=”checkbox” name=”campo”
value=”valor” id=”valor1”>
Descrição </label>
<html>
<body topmargin=”0” leftmargin=”0”>
<form method=”post”>
<center>
<label for=”opcao1”><input type=”radio” name=”campo0”
value=”1” id=”opcao1”> Valor1</label>
<label for=”opcao2”><input type=”radio” name=”campo0”
value=”2” id=”opcao2”> Valor2</label>
<br>
<label for=”opcao3”><input type=”checkbox” name=”campo1”
value=”ON” id=”opcao3”> CheckBox </label>
<label for=”opcao4”><input type=”checkbox” name=”campo2”
value”ON” id=”opcao4”> CheckBox </label>
</center>
Onde utilizar
Como utilizar

</form>
</body>
</html>

Botão de zoom para tabela estrangeira

O botão de zoom padrão deve ter a imagem wimages/ii-zoom.gif.

Como selecionar um Texto via JavaScript

Um exemplo clássico da utilização de seleção é a cópia de um registro.


Quando um registro é copiado, geralmente, é modificado algum valor. E para
facilitar ao usuário, deve-se implementar a seleção. Assim, o usuário não
precisa selecionar o texto e pressionar a tecla DEL. O texto já vem selecionado
e assim o usuário ganha mais agilidade no preenchimento do formulário.
Basta utilizar a função select(). Exemplo:
document.forms[0].nome.select().
Para maiores detalhes, observe o exemplo a seguir:
Templates para WEB 115

Exemplo em HTML:
<html>
<script>
function ChamaFunção() {
document.form[0].elements[0].select();
}
</script>
<body>
<form>

<input type=”text” name=”ricardo” value=”Seleção de Texto”


size=”20”>
<input type=”button” name=”acao” value=”Teste”
onClick=”javascript:ChamaFuncao()”>

</form>
</body>
</html>
Como definir nomes das FRAMES(Janelas):

A definição de uma regra para nomes de frames é necessária para que não
ocorra erros de JavaScript no IE (Internet Explorer). Por exemplo: Se um
usuário abrir uma consulta Pai X Filho e abre a tela de cadastro Pai e por
algum motivo, ele clica no menu principal (deixando a janela do cadastro
aberta). O usuário entra em outro programa Pai X Filho e clica no cadastro do
Pai. Acontecerá um erro de JavaScript no IE, pois o IE não consegue mudar o
tamanho da janela (pois, os nomes das Janelas são iguais). A solução para este
problema é criar frames com nomes diferentes.

Consulta Pai X Filho filho


Função ChamaInclusao - Nome do programa + i
Por exemplo: wap0005i
Função ChamaModificação - Nome do programa + m
Por exemplo: wap0005m

Consulta Pai X Filho pai


Quando o parâmetro for ADD, MOD, COP, a consulta abre outra janela.
É o nome desta janela (Frame) deve ser:
Nome do Programa + p
Por exemplo: wap0005p
Para outros casos deve-se utilizar assim:
Nome do Programa + N
Por exemplo: wap00051

Como mapear variáveis entre o HTML e o programa Progress


manualmente (sem utilizar o Appbuilder)
O primeiro passo, deve-se apagar o <arquivo>.off
Neste exemplo, estaremos acrescentando mais uma Variável (ou Campo) no
programa WebSpeed. O processo para eliminar alguma variável é semelhante
(deve-se trocar acrescentar por eliminar).
Templates para WEB 117

No arquivo HTML - Acrescentar um elemento do formulário.


Exemplo
...
<tr>
<th align=”right” class=”linhaForm” nowrap><!--label
name=”mgadm#banco#cod-banco#1” -->:</th>
<td class=”linhaForm” align=”left” nowrap>
<input type=”text” size=”3” name=”w_cod_banco”>
<!--label name=”mgadm#banco#nome-banco#1” -->
<input type=”text” size=”20” name=”w_nome_banco”>
</td>
</tr>
...

No arquivo .W
Exemplo
...
&Scoped-Define ENABLED-OBJECTS ~
w_cod_banco ~
ww_nome_banco ~
w_nome_banco
...
&Scoped_Define DISPLAYED-OBJECTS ~
w_cod_banco ~
ww_nome_banco ~
w_nome_banco
...

DEFINE VARIABLE w_cod_banco AS CHARACTER FORMAT “X(256)”


VIEW-AS FILL-IN
SIZE 3 BY 1 NO-UNDO.

DEFINE VARIABLE ww_nome_banco AS CHARACTER FORMAT “X(256)”


VIEW-AS FILL-IN
SIZE 20 BY 1 NO-UNDO.

DEFINE VARIABLE w_nome_banco AS CHARACTER FORMAT “X(256)”


VIEW-AS FILL-IN
SIZE 20 BY 1 NO-UNDO.

DEFINE FRAME Web-Frame


Atenção

w_cod_banco SKIP
ww_nome_banco SKIP
w_nome_banco SKIP
WITH NO-LABELS.

PROCEDURE htm-offsets:
...
RUN htm-associate IN THIS-PROCEDURE
(“w_cod_banco”:U,”w_cod_banco”:U,w_cod_banco:HANDLE
IN FRAME{&FRAME-NAME}).

RUN htm-associate IN THIS-PROCEDURE


(“mgadm#banco#nome-
banco#1”:U,”ww_nome_banco”:U,ww_nome_banco:HANDLE IN FRAME
{&FRAME-NAME}).

RUN htm-associate IN THIS-PROCEDURE


(“w_nome_banco”:U,”w_nome_banco”:U,
w_nome_banco:HANDLE IN FRAME{&FRAME-NAME}).
...
End Procedure.

Note na Procedure htm-offsets que o nome do campo (literal) deve ser sempre
associada com um ‘w’ a mais. No nosso exemplo, estamos mapeando o nome
do banco. Então, o nome da variável associada a literal deve ser
ww_nome_banco.
Literais, Títulos e Labels de Banco (<!--label name=”mgadm#banco#nome-
banco#1” -->,<!--literal name=”Teste_de_literal#*” e <!--
titulo name=”ap0000”-->) também, são mapeados. O não mapeamento
destas literais e Títulos implicará em erro do arquivo off.

Blocos de Assign e funções do Webspeed

Os "blocos de assign", utilizados para ganharmos performance, estão


apresentando problemas quando neles se econtram comandos "get-value" e
"get-cookie". Resumindo, cada "get-" deve ter seu único "assign", ex:

assign c-rep = repres:screen-value


c-cli = emitente.cod-emitente
Templates para WEB 119

c-nome = emitente.nome-abrev.
assign c-emp = get-value("c-empresa-ramo").
assign c-user = get-cookie("ck-usuario").

O exemplo acima representa o modo correto para programação dos assign,


caso contrário pode ocorrer o seguinte erro:

Compiling xxx0010e.w...
Attempt to reference an user defined function 'get-value' in an
ASSIGN
type statement after an assignment to key field
'tt-cotacao-item-cex.cod-emitente-desp'. (7955)

** Could not understand line 667. (196)

Lembramos o uso de cookie não faz parte da nossa metodologia de


desenvolvimento. Favor ler sobre a técnica de manutenção de contexto.
Como faço para retornar o nome do Banco, se a minha tabela é de Conta
corrente e só tenho o Código do Banco?
(para programas de Zoom, Pesquisa, Filho)
Definitions
/*
Criar função para retornar um String e passando como parâmetro o
código do Banco.
/*
&global-define conteudo2 fn-nome-banco(string(tt-cta-corrente.cod-
banco))
--------
FUNCTION fn-nome-banco RETURNS CHARACTER (INPUT p-cod-banco AS CHAR):
RUN adbo/boad018.p PERSISTENT SET h-boad018.
RUN FindNomeBanco in h-boad018(input p-cod-banco, output w-c-
nome-banco).
DELETE PROCEDURE h-boad018.
RETURN (w-c-nome-banco).
END FUNCTION.

Programa de filho chamando um outro programa de Pai x Filho


O único problema de um programa Filho chamar um outro programa
Pai x Filho é se o programa 1 passar um ROWID ou até mesmo algumas
chaves . Pois não é possível fazer isto através da passagem de parâmetros .
http://localhost/scripts/cgiip.exe/WService=ems20web/web/men/wrun.w?
program=web/XXp/wXX000.w?rowid=0x032445 (Isto Não é Válido)
Infelizmente não é possivel utilizar o exemplo acima . Pois a passagem
de parâmetro na WEB não é recursivo . O Browser entende tudo como um
único parâmetro .
Para isto , é necessário criar um terceiro programa . A estrutura de navegação
ficaria assim :
WXXFilho.w -> wXXgrava.p -> OutroPaixFilho.w .
O programa Filho deverá chamar um programa que irá gravar no
contexto as chaves e depois de feito chamará o outro programa de Pai x Filho .
Quando a nomeclatura do programa , deverá ser adicionado um
sufixo . Este sufixo deverá ser uma letra .
Segue exemplo do Programa que Grava o Contexto (Poderá ser utilizado este
código para fazer o programa. Lembrando apenas que o Programador deverá
fazer os ajustes necessário para a criação do contexto e declarar o nome do
programa que será chamado ) :

&ANALYZE-SUSPEND _VERSION-NUMBER WDT_v2r1 Web-Object


&ANALYZE-RESUME
&ANALYZE-SUSPEND _CODE-BLOCK _CUSTOM Definitions
/*------------------------------------------------------------------
Author :
Created :
---------------------------------------------------------------------*/
def var h-prog as handle.
def var c-token as char no-undo.
&ANALYZE-RESUME

&ANALYZE-SUSPEND _PREPROCESSOR-BLOCK
&Scoped-define PROCEDURE-TYPE Web-Object
&ANALYZE-RESUME
Templates para WEB 121

&ANALYZE-SUSPEND _PROCEDURE-SETTINGS
&ANALYZE-RESUME _END-PROCEDURE-SETTINGS

&ANALYZE-SUSPEND _INCLUDED-LIBRARIES
{src/web/method/wrap-cgi.i}
&ANALYZE-RESUME _END-INCLUDED-LIBRARIES

&ANALYZE-SUSPEND _CODE-BLOCK _CUSTOM "Main Code Block"


ON CLOSE OF THIS-PROCEDURE
RUN dispatch ('destroy':U).
RUN process-web-request.
IF NOT THIS-PROCEDURE:PERSISTENT THEN RUN dispatch ('destroy':U).
&ANALYZE-RESUME

&ANALYZE-SUSPEND _CODE-BLOCK _PROCEDURE output-header


PROCEDURE output-header :
output-content-type ("text/html":U).
END PROCEDURE.
&ANALYZE-RESUME

&ANALYZE-SUSPEND _CODE-BLOCK _PROCEDURE process-web-request


PROCEDURE process-web-request :
{web/winclude/wi-vglob.i}

RUN output-header.

def var h-prog as handle no-undo.


def var c-token as char no-undo.
assign c-token = get-cookie("SessionContextToken":u).
run web/wutp/wu-sessao.p persistent set h-prog.
run setToken in h-prog (c-token).
run createNewContext in h-prog ("empresa":u, get-value("empresa")
) .
run createNewContext in h-prog ("idioma":u, get-
value("idioma") ).

delete procedure h-prog.

assign irpara="wXX000.w" .

{&out}
'<HTML>':u SKIP
'<body>':u Skip
'<big><center>':u skip
'Salvando Contexto ...'
'</center></big>':u skip
'</body>':u skip
.

{&out}
'<script language=javascript>':u skip
' ~{':u skip
' window.open("' + appurl + '/web/wrun.w?program=' irpara ',
"prgWindow","top=0,left=0,width=" + lar + ",height=" + alt +
",scrollbars=no,toolbar=no,location=no,directories=no,status=no,resizabl
e=no")~; ':u skip
' ~}':u skip
'</script>':u skip
'</HTML>':U SKIP
{&end}

END PROCEDURE.
&ANALYZE-RESUME
Templates para WEB 123

Selecionar , Inverter e Desmarcar CHECKBOX via JavaScript

O exemplo abaixo é um documento HTML com código Javascript ,


feito para marcar , inverter e desmarcar qualquer checkbox do formulário
selecionado .
Inserir no seu programa a função javascript (Em Azul) . Esta
função é genérica .
A chamada da função JavaScript (Geralmente utiliza-se botões)
encontra-se neste exemplo nos botões (Em Vermelho) .
Analisando a função seleciona(formulário, opção) .
* Formulário (Valor Inteiro) – Corresponde ao número do
formulário que deve ser utilizado . Lembre-se : No
JavaScript o valor 0 (zero) significa o primeiro
formulário
* Opção (Valor Inteiro)
Opção = 1 – Seleciona Todos
Opção = 2 – Desmarca Todos
Opção = 3 – Inverte

<html>
<head>Exemplo - Selecionar CHECKBOX </head>
<script language="JavaScript">
function seleciona(formulario,numero) {
for (var i=0;i<document.forms[formulario].elements.length;i++) {
var e = document.forms[formulario].elements[i];
if (numero == 1) {
e.checked = true ;
}
if (numero == 2) {
e.checked = false ;
}
if (numero == 3) {
e.checked = !e.checked;
}
}
}
</script>
<body>
<form>
<input type="button" name="todos" onClick="seleciona(0,1)"
value="Todos">
<input type="button" name="nenhum" onClick="seleciona(0,2)"
value="Nenhum">
<input type="button" name="inverte" onClick="seleciona(0,3)"
value="Inverte">
<br><br>
<input type="checkbox" name="item1"> 1. Item <br>
<input type="checkbox" name="item2"> 2. Item <br>
<input type="checkbox" name="item3"> 3. Item <br>
<input type="checkbox" name="item4"> 4. Item <br>
<input type="checkbox" name="item5"> 5. Item <br>
<input type="checkbox" name="item6"> 6. Item <br>
<input type="checkbox" name="item7"> 7. Item <br>
<input type="checkbox" name="item8"> 8. Item <br>
<br>
</form>
</body>
</html>

Como trazer em relatórios o servidor default do usuário

Programas de relatório construídos com uma template mais antiga não


trazem automaticamente no campo Servidor de Execução o servidor default
para o usuário corrente. Para implementar esta funcionalidade basta seguir
estes passos:

 Definir um handle para a BO unbo/boun135.p se ele ainda não estiver sido


definido;
 Definir uma variável char que receberá o código do servidor de execução
padrão do usuário;
Templates para WEB 125

 Definir uma varável char que receberá a descrição do servidor de execução


padrão do usuário se esta informação for desejada;
 Rodar a BO unbo/boun135.p persistentemente se isto ainda não estiver
sido feito;
 Rodar dentro da procedure display-fields o método getServidUsuarDefault
na BO unbo/boun135.p e testar o retorno.
 Se o rotorno for igual a OK, rodar o método getCharField na BO passando
como parâmetro o valor “cod_servid_exec” e a variável que irá conter o
código do servidor de execução padrão do usuário. Em seguida, associar
ao campo de tela Servidor de Execução o valor que a variável recebeu no
método anterior.
 Sendo o retorno de getServidUsuarDefault igual OK, caso se deseje
também a descrição do servidor, rodar o método getCharField na BO
passando como parâmetro o valor “des_servid_exec” e a variável que irá
conter a descrição do servidor de execução padrão do usuário. Em seguida,
associar ao campo de tela relativo a descrição do servidor de execução o
valor que a variável recebeu no método anterior.
 Caso tenha-se incluído uma instância da BO unbo/boun135.p, removê-la.

Exemplo: def var h-boun135 as handle no-undo.


def var c-cod-servid-exec as char no-undo.
def var c-desc-servid-exec as char no-undo.
RUN unbo/boun135.p persistent set h-boun135.
RUN getServidUsuarDefault IN h-boun135.
if return-value = "OK" then do:
RUN getCharField IN h-boun135
("cod_servid_exec":U, output c-cod-servid-exec).
assign w_cod_servid_exec:screen-value
in frame {&frame-name} = c-cod-servid-exec.
RUN getCharField IN h-boun135
("des_servid_exec":U, output c-desc-servid-exec).
assign w_desc_servid_exec:screen-value
in frame {&frame-name} = c-desc-servid-exec.
end.
DELETE PROCEDURE h-boun135.

Como acrescentar um botão “Implantar” no Zoom

O Botão “Implantar” não existe por padrão nos programas Web. Isso
se deve principalmente ao fato de que não existem programas de cadastros
correspondentes para Web. Quando necessário o uso deste botão, os seguintes
passos devem ser seguidos:

 Alterar a procedure “process-web-request”, colocando a geração do botão


“Implantar”. O botão deverá executar o programa de manutenção
correspondente, em uma janela separada. O código deve estar logo depois
da chamada a procedure “generateBrowse”. Deve ser parecido com o
listado abaixo:
RUN generateBrowse IN h-brwapi.
{&OUT} return-value.

/* Início da codificação do botão Implantar */


{&OUT}
'<table align="center">':U SKIP
' <tr>':U SKIP
' <td align="center">':U SKIP
' <input type="button" name="implanta" value="Implantar"
OnClick="javascript:window.open(~'':U
HostURL + AppURL +
'/web/men/wrun.w?program=web/wCustomer01.w~', ~'_blank~')">':U
SKIP
' </td>':U SKIP
' </tr>':U SKIP
'</tabble>':U SKIP
'</form>':U SKIP
'</body>':U SKIP
'</html>':U SKIP
.
/* Fim da codificação do botão “Implantar” */
delete procedure h-brwapi.
Funcionamento
Descrição

Templates para WEB 127

Utilizando Help na WEB

Nos programas Web não se faz necessário definir qualquer código para fazer a
exibição de help. A tarefa de exibir o help nos programas Web é realizada pela
include wi-jscrp.i,que já faz parte do padrão de todos os templates.

Perfil do Usuário
A função de perfil do usuário, permite determinar se o usuário conectado ao
produto é interno ou externo. Em caso de usuários externos, podemos ainda
verificar se este é Cliente, Representante ou Fornecedor, e temos condições de
saber o seu número de cadastro dentro das tabelas do produto. Caso seja
necessário incluir mais um tipo é necessário que seja aberta FO para ADF.

Para possibilitar o processo de definição do perfil do usuário (interno /


externo) foi desenvolvido um programa cliente servidor para cadastro do perfil
do usuário, este programa é executado a partir do programa de cadastro do
usuário (sec000aa.w). O usuário pode ser indicado como sendo do tipo
“Nenhum, Cliente, Fornecedor, Representante”, estes itens correspondem aos
valores 1, 2, 3, 4 que, estão definidos no include uninc/i01un178.i que pode ser
usado conforme técnicas de desenvolvimento cliente servidor.

Uso do perfil em programas WEB


Para usarmos o perfil nos programas WEB temos disponível no include wi-
vglob as variáveis:
 v_ind_perfil_usuario - variavel char que contém um número informando o
número do perfil do usuário;
 v_cod_ext_perfil_usuario - contém o código que relaciona o usuário com a
entidade que ele representa.
Se o v_ind_perfil_usuario contém 2, o usuário é um cliente e o código deste na
tabela de cliente está gravado na variável (v_cod_ext_perfil_usuario).
Exemplo

Incluindo novos tipos no perfil


Novos tipos podem ser incluídos alterando-se o include uninc/i01un178.i esta
alteração deve ser feita pelo ADF, ou seja, é necessário abrir FO para o grupo
ADF.

Informações Gerais
Para verificar os valores já disponíveis e a que número eles estão associados
pode-se verificar o conteúdo do include uninc/i01un178.i.

Onde usar
Deve ser usado na interface e nunca nas BO´s que devem receber esta
informação como um parâmetro e processá-la conforme necessário,
normalmente, definindo restrições de navegação ou de operações que alterem
o conteúdo da base de dados.
Um exemplo de uso do perfil de usuários é a consulta de pedidos. Dentro da
empresa um usuário pode consultar todos os pedidos, mas um representante
(usuário externo), somente pode ver os pedidos que pertencem a ele. Neste
caso deveremos ter a seguinte situação:
 programa de interface apenas identifica se o usuário externo ou interno
(através das informações do perfil de usuário). Se for externo deve
identificar qual é o representante;
 BO de consulta pedidos deve estar preparado para navegar em todos
registros de pedidos (quando for usuário interno) ou navegar apenas numa
faixa de pedidos (quando for o representante). O BO deve receber de
parâmetro o código do representante para então fazer a seleção e abrir a
query específica.
Considerações
Definição
Descrição
Gerais

129

Consultas Relacionadas
Esta técnica descreve os procedimento para que os programas sempre
mantenham contexto nos registros acessados. Por exemplo: ao consultar uma
nota-fiscal, o usuário poderá ter necessidade de acessar a consulta de clientes.
Ao chamar a consulta relacionada, o programa de consulta de clientes já deve
se posicionar naquele registro de cliente da nota-fiscal que o usuário estava
consultando. Para tanto deve ser aplicada esta técnica descrita aqui.
Esta técnica deve ser usada em conjunto com a técnica de Contexto de Sessão.
Basicamente, teremos o ‘Programa Origem’ que define o contexto do registro
(rowid do registro corrente) e o ‘Programa Destino’ que, ao ser executado
procura um contexto de registro (rowid) e se posiciona neste registro. Um
programa deverá implementar estes dois comportamentos (origem e destino).
 não há uma dependência direta entre estes dois programas, os dois
funcionam de forma independente. Ou seja, o programa de consulta de
clientes, independentemente de que o chamou, sempre procura o rowid do
cliente para posicionar-se nele;
 o programa origem sempre grava no contexto de sessão, o rowid da tabela
principal do programa e outras que forem necessárias. Por exemplo: o
programa de consulta nota-fiscal grava no contexto de sessão o rowid da
nota-fiscal e do cliente (principal entidade ligada a nota-fiscal);
 o programa destino sempre procura no contexto de sessão o rowid de sua
tabela principal e posiciona-se no mesmo. Se algum programa
anteriormente gravou um contexto de sessão o mesmo estará sendo usado
neste momento;
 o padrão para o nome da variável de contexto de sessão contendo o rowid
da tabela é:
rg-<tabela>
Funcionamento
Descrição

131

Uso de páginas de código


Os sistemas da Datasul são desenvolvidos usando a página de códigos ibm850
para fluxos de saída (-cpstream), e também para os caracteres escritos nos
códigos fontes. Optou-se por este padrão por ser a página default do Progress
nas versões anteriores a 8 e a utilizada pelos ambientes em modo caracter. O
padrão adotado pelos navegadores da Web é página iso8859-1, para manter a
compatibilidade com os demais sistemas da Datasul a versão Web deverá estar
com o parâmetro –cpstream ibm850.
A solução encontrada foi a otimização do arquivo web-disp.p do Webspeed,
configurando a saída web para converter a página de códigos para iso8859-1.
OUTPUT {&WEBSTREAM} TO "WEB":U CONVERT TARGET "iso8859-1":U.

Para perfeito funcionamento da exibição de caracteres acentuados, deve-se


atentar as seguintes regras:
 literais em HTML, devem estar em ibm850, verificar via editor do
Progress se esta correto*, pois o FrontPage utiliza iso8859-1 ou UTF-8;
 todas as literais dentro de fontes, devem estar em ibm850.

* Desde de que a sessão progress tenha sido iniciada com o código de


página (-cpstream) igual a ibm850.

Observação : Problemas com código de Página no Combo-box


Na web a saída é iso8859-1 e os programas e includes estão em IBM-850.
Quando selecionar algum valor no combo e enviar para o servidor poderá
ocorrer algum erro . Em resumo , quando os valores forem jogados para a
WEB deverá ser convertido para iso8859-1 e quando forem dados enviados ao
servidor deverá ser convertido para IBM-850. Os dados que estão na base de
dados estão no formato IBM-850. Para que não ocorra o erro , é necessário
utilizar o codepage-convert .
Segue o código de exemplo :
Funcionamento
Descrição

132

procedure display-fields:
...
w_ind_tipo_desconto_01 = codepage-convert(string({diinc/i01di272.i 04 tt-
param-bonif.ind-tipo-desconto[01]}),"ibm850","iso8859-1")
...
procedure assign-fields:
...
tt-param-bonif.ind-tipo-desconto[01] = lookup(codepage-convert(get-
value("w_ind_tipo_desconto_01"),session:charset,"ibm850"),{diinc/i01di272.i
03})
...

BUG NO IE 5 :

Quando for feito um get-value de um combo-box , exemplo abaixo , e


aparecer um conjunto de caracteres , em vez de aparecer o ç ou qualquer
caracter especial , a solução é migrar para o IE 5.01 .
Por Exemplo :
{&out} '<script> alert("Teste : ' string(codepage-convert(get-
value("w_cb_tipo_nota"),session:charset,"ibm850")) '")</script>'.
Resultado : Diferen&#8225o de Pre&#8225o (Diferença de Preço)

Customização de arquivos WebSpeed


Com a utilização dos templates Web, surgiu a necessidade da criação e
alteração de utilitários customizados no webspeed.

ARQUIVO LOCALIZAÇÃO TECNOLOGIA CARACTERÍSTICAS


tagmap.dat raiz Webspeed Alterado para incluir as referências as tag
Templates para WEB 133

´s criadas pela Datasul (literal, label,


titulo).
web-disp.p web/objects Webspeed Alterado para suportar a conversão entre
as páginas de código imb850 para
iso8859-1
webedit.p web/support Webspeed Alterado para suportar a opção de
desabilitação do campo de acordo com a
especificação da versão 4.0 do HTML.
webinput.p web/support Webspeed Alterado para suportar a opção de
desabilitação do campo de acordo com a
versão 4.0 do HTML
weblist.p web/support Webspeed Alterado para suportar a opção de
desabilitação do campo de acordo com a
versão 4.0 do HTML.
webradio.p web/support Webspeed Alterado para suportar a opção de
desabilitação do campo de acordo com a
versão 4.0 do HTML.
webtog.p web/support Webspeed Alterado para suportar a opção de
desabilitação do campo de acordo com a
versão 4.0 do HTML.
weblabel.p web/support Datasul Criado para suportar tradução de label´s
de campos através da tag <!--Label -->
que utiliza o utilitário ut-liter.
webliter.p web/support Datasul Criado para suportar tradução de literais
através da tag <!--Literal -->que utiliza o
utilitário ut-liter.
webtitul.p web/support Datasul Criado para recuperar o título cadastrado
no sistema de menus através da tag <!--
Titulo -->.
webtitu2.p web/support Datasul Chamado pelo programa webtitul.p
135

Tratamento de Erros
A tt-bo-erro deve ser usada para passar toda e qualquer informação referente a
ocorrência de erros dentro de BOs ela possui como campos:
 i-sequen  seqüência em que o erro ocorreu;
 cd-erro  código do erro;
 mensagem  mensagem associada ao código;
 parâmetro  parâmetros que devem ser substituídos na mensagem (este
campo esta em branco quando a mensagem não possui parâmetros).
A criação de erros com parâmetro pode ser feita conforme o exemplo a seguir:
Exemplo (na BO):
{utp/ut-table.i mgadm {&TABLE-NAME} 1}
run utp/ut-msgs.p( input “msg”,
input 146,
input return-value).
create tt-bo-erro.
assign tt-bo-erro.i-sequen = i-seq-erro
tt-bo-erro.cd-erro = 146
tt-bo-erro.mensagem = return-value.
tt-bo-erro.parametro = rowObject.nome-banco.

Para passar mais de 1 parâmetro utilize assim;


tt-bo-erro.parametro = repres.cod-repres + “~~” +
regiao.cod-regiao + “~~” + string(regiao.val-minimo)).
137

Validações de Campos na WEB


Em geral, as validações de entrada de dados devem ser feitas no método
'validateFields' da BO. Desta forma, estas validações podem ser aproveitadas
pelo 'validateCreate' e 'validateUpdate' da BO, e também por outros programas
de interface. Observamos que as chamadas das validações devem ser feitas na
local-assign-fields da interface.
A seguir são relacionados os procedimentos para tratar as validações:

Validações de valores obrigatórios


Validações do tipo: campo não pode ser zero ou espaços, campo precisa ser
informado devem estar no validateFields do BO, pois são validações
independentes de interface, são regras de negócio.

Validações de campos mandatórios


Estas validações (campo <> ?) devem estar no validateFields nos DBO´s.
Também, são regras de negócio.

Validações de Faixa de Dados


Por exemplo: Campo deve estar entre 1 e 10, campo deve ser "A", "B" ou "C",
também devem estar no validateFields do BO. Em alguns casos implica na
leitura de tabelas do banco de dados.

Validações de Integridade Referencial


Validações do tipo can-find, ou seja, o campo deve estar em outra tabela,
devem ser feitas no validateFields dos DBO´s, por motivo claro da
necessidade de leitura de registros.

Validações de Tipo de Dado (wi-datatype.i)


Esta validação deve ser feita diretamente no programa da WEB, pois outras
interfaces (GUI, por exemplo) já fazem esta validação automaticamente. Isto
pode ser feito com o uso do ASSIGN NO-ERROR conforme exemplo abaixo:

assign i-val = integer(x:screen-value) no-error.


138

if error-status:error then
/* aconteceu algum erro na conversão do tipo de dado */

Isto evita mensagens de erro do Progress referente a tipo de dado inválido (por
exemplo: letras em campos inteiros e decimais, datas inválidas, estouro de
formato).
Para fazer este tipo de validação foi criado o include "wi-datatype.i".
Os tipos de Dados que serão validados são Inteiro, Data, Decimal e Character.
Para isto, deve-se utilizar a include wi-datatype.i. As Validações devem ser
feitas na local-assign-fields.
No wi-datatype.i também são feitas as validações de formato e tamanho do
campo. Se acontecer algum erro este é retornado na tt-bo-erro e ao campo
valido será atribuído o valor "?".
Se não houver erro o campo destino receberá o valor informado.
A seguir um código que demonstra o uso do wi-datatype.i.
Na Definitions:
def var i-seq-erro as integer no-undo.
PROCEDURE local-assign-fields :
IF REQUEST_METHOD="POST":U THEN DO:
DO TRANSACTION NO ERROR UNDO, LEAVE WITH FRAME {&FRAME-NAME}:
create tt-banco.
/* É preciso definir qual é a variável destino, o tipo de dado e
a Origem (variável HTML)
{web/winclude/wi-datatype.i &dst="temp-table.campo"
&type="integer" &org="w_variavel:screen-value"}
*/
{web/winclude/wi-datatype.i &dst="tt-banco.cod-banco"
&type="integer" &org="w_cod_banco:screen-value"}
{web/winclude/wi-datatype.i &dst="tt-banco.data-1" &type="date"
&org="w_data_1:screen-value"}
{web/winclude/wi-datatype.i &dst="tt-banco.dec-2"
&type="decimal" &org="w_dec_2:screen-value"}
assign
tt-banco.char-1 = w_char_1:screen-value
tt-banco.char-2 = w_char_2:screen-value
/** Fim do Assign **/
/* Se houver algum assign com dados incompatíveis, será criado
registros na tt-bo-erro */
find first tt-bo-erro no-error.
if not avail tt-bo-erro then
Observação:

Templates para WEB 139

case c-param:
when "add" or when "cop" then do:
run validateCreate in h-boad018 (input table tt-
banco, output table tt-bo-erro, output r-chave).
end.
when "mod" then do:
run validateUpdate in h-boad018 (input table tt-
banco, input r-chave, output table tt-bo-erro).
end.
end case.
find first tt-bo-erro
no-lock no-error.
if avail tt-bo-erro then do:
{web/winclude/wi-erapi.i "tt-bo-erro"}
assign hid_oper = c-param
hid_chave:screen-value = string(tt-banco.r-rowid).
RUN dispatch IN THIS-PROCEDURE ('enable-fields':U).
end.
else do:
RUN findRowid in h-boad018 (input r-chave).
RUN getCurrent in h-boad018 (output table tt-
banco).
end.
END./* DO TRANSACTION */
END.
ELSE DO:
END.
/*RUN dispatch IN THIS-PROCEDURE ( INPUT 'assign-fields':U )
*/.
END PROCEDURE.

É utilizada a validação (wi-datatype.i) em caracter. O maxlenght é usado


somente em caracter, pois os outros tipos a include consegue gerar o erro. E
com o Caracter, a include apenas "trunca" a string.
Em programa de Vá Para , o SWG só gera variáveis do tipo caracter
(Validações) . Por exemplo: c-teste (caracter) . Quando for outro tipo de dado
deverá ser declarada a variável . Seguindo este padrão : Dec-test –
decimal ,Dat-test – DATA, Int-test – Inteiros

Atenção : As validações devem ser feitas numa mesma


procedure. Pois as variaveis internas da include não são globais. E
depois de executado a primeira vez , a include não define as variáveis.
É aconselhado colocar todas as validações na assign-local-fields.
Utilização:
Definição:

Preferências do Usuário – wu-uspf.p


A definição de preferências do usuário consiste em salvar os valores das
opções que o usuário utilizou em determinado programa (normalmente
relatórios). Assim o usuário pode retornar a este mesmo programa e
recuperar estas informações sem precisar digitar tudo novamente (Folders
de Seleção, Parâmetros, Classificação, Digitação, etc. Disponível a partir
do EMS 2.02.
1. Inserir os botões de Salva, Carrega e Elimina as preferências do
usuário no HTML:
parent.panel("NGSACMDUROLHEPWX","WCADSIMP 2.00.00.000");

2. Inserir os campos uspf_pref e uspf_defualt no HTML:


<form method="post"><center>
<INPUT TYPE="HIDDEN" NAME="uspf_pref" VALUE="">
<INPUT TYPE="HIDDEN" NAME="uspf_default" VALUE="">

3. Definir variáveis utilizadas pelas preferências do usuário:


define variable i-pref as integer no-undo.
define variable c-defa as character no-undo.
define variable l-defa as logical no-undo.

4. No início da WEB-REQUEST, incluir a seguinte linha de comando:


run outputHeader.
run output-javascript.
{web/ winclude/wi-rpini.i}
{web/winclude/wi-jscrp.i '' '' '' '' '' '' {&THISNAME}}
assign c-pref = get-value("uspfseq":U).

5. No método POST, depois da inputFields e da assignFields, incluir a


seguinte lógica:

assign c-pref = get-value("uspf_pref":U).

IF c-pref <> "" THEN DO:


assign c-defa = get-value("uspf_default":U).
if c-defa = "true":U then assign l-defa = true.
run uspfSaveParameters.
assign ab_unmap.uspf_pref = ""
ab_unmap.uspf_default = "".

END.
ELSE DO:
/* Lógica padrão do método POST */
END.
Templates para WEB 141

6. Na WEB-REQUEST, antes da enableFields e da outputFields, incluir,


caso não exista, a seguinte lógica:
IF REQUEST_METHOD = "POST":U OR c-pref = "" THEN DO:
RUN displayFields.
END.

7. No método GET, após a displayFields, incluir a seguinte lógica:


RUN displayFields.

if c-pref <> "" then run uspfLoadParameters (false).


else run uspfLoadParameters (true).

8. Criar uma procedure interna com o nome de uspfLoadParameters com


o seguinte código:
{web/winclude/wi-uspfl.i <nome do programa>}

Ex.:
{web/winclude/wi-uspfl.i cd0101}

9. Criar uma procedure interna com o nome de uspfSaveParameters com


o seguinte código:
{web/winclude/wi-uspfs.i <nome do programa>}

Ex.:
{web/winclude/wi-uspfs.i cd0101}

É possível definir que também o conteúdo de um programa de


digitação seja salvo e recuperado a partir das preferências de usuário. Esta
implementação consiste em definir alguns pré-processadores. Existem hoje
duas tecnologias para construir programas que se comportem como BOs de
temp-table que são usados nos programas de digitação: Transbo e Virtual
DBO. Parte do procedimento que descreve como fazer para salvar a digitação
nas preferências do usuário se aplica apenas quando se usa Virtual DBO. Os
passos genéricos são os seguintes:
a) Definir no programa que implementa a técnica de preferência o pré-
processador RECUPERADIGITACAO: A este pré-processador deve
estar associado o nome da temp-table de comunicação com o
programa que implementa a BO de tabela temporária (Transbo ou
Virtual DBO). É possível indicar a própria temp-table que já está
sendo usada no programa para recuperar a digitação ( geralmente tt-
digita ), porém, para garantir que esta operação não vá interferir na
lógica do programa, pode-se definir uma outra temp-table igual a já
existente e indicar esta outra no pré-processador.
Ex:
DEFINE TEMP-TABLE tt-digita
/* Temp-table de comunicação */
FIELD it-codigo as CHARACTER
FIELD nrVias as INTEGER
FIELD r-Rowid as ROWID.
DEF TEMP-TABLE tt-digita-rec LIKE tt-digita.
&SCOPED-DEFINE RECUPERADIGITACAO tt-digita-rec
/* Usa outra tabela. Não interfere na lógica do programa */
ou
DEFINE TEMP-TABLE tt-digita
/* Temp-table de comunicação */
FIELD it-codigo as CHARACTER
FIELD nrVias as INTEGER
FIELD r-Rowid as ROWID.
&SCOPED-DEFINE RECUPERADIGITACAO tt-digita
/* Usa a mesma tabela. Pode interferir na lógica do programa */

b) Definir o pré-processador TABELADIGITACAO com um nome


para a tabela da BO de temp-table: Este pré-processador somente
precisa ser definido se não for utilizado o nome padrão para esta
temp-table que é tt-digita. Caso tenha sido usado um outro nome, aí
sim é necessário definir este pré-processador com este nome.
Ex:
run setTableName in h-handleboTT ("tt-digita":U).
/* Usado nome padrão. Não precisa do pré-processador. */
ou
&SCOPED-DEFINE TABELADIGITACAO tt-mydigita
run setTableName in h-handleboTT ("tt-mydigita":U).
/* Não usado nome padrão. Pré-processador é necessário. */

Caso se esteja utilizando Virtual DBO no programa de digitação, além


dos passos acima, os seguintes itens também devem ser observados:
 Definir o pré-processador DIGITACAOVDBO: A definição deste
pré-processador indica que o programa de digitação trabalha com
a tecnologia de Virtual DBO. Se ele não for definido, se assumirá
que a tecnologia utilizada foi Transbo.
Ex:
&SCOPED-DEFINE DIGITACAOVDBO
Onde utilizar
Como utilizar

Templates para WEB 143

 Definir os pré-processadores DIGITACAOVDBOINDTIPO,


DIGITACAOVDBOINDCOMP e
DIGITACAOVDBOINDHAND: Estes pré-processadores servem
para indicar como foi definido o comportamento da Virtual DBO
com relação a índices no programa de digitação. Em
DIGITACAOVDBOINDTIPO deve ser indicado o tipo de índice,
em DIGITACAOVDBOINDCOMP o complemento e em
DIGITACAOVDBOINDHAND o handle ou o valor nulo (?).
Estes pré-processadores apenas precisam ser definidos se no
programa de digitação se usou o comando setIndexType.
Ex:
run setIndexType in h-data (input 1,input "nrVias",input ?).
&SCOPED-DEFINE DIGITACAOVDBOINDTIPO 1
&SCOPED-DEFINE DIGITACAOVDBOINDCOMP "nrVias"
&SCOPED-DEFINE DIGITACAOVDBOINDHAND ?

 Definir o pré-processador DIGITACAOVDBOORDEM: Este pré-


processador deve ser definido se no programa de digitação foi
informada uma ordem para a recuperação dos registros. Seu valor
deve ser o mesmo utilizado no método setQuerySort.
Ex:
run setQuerySort in h-data (input 2).
&SCOPED-DEFINE DIGITACAOVDBOORDEM 2

A documentação sobre o uso de Virtual DBO pode ser encontrda em X:\


ferramentas\ddk2000\Manual\ManualUsoDBO.doc

Como posicionar o cursor em um campo via JavaScript

Esta técnica pode ser utilizada para posicionar o cursor no primeiro campo
habilitado no form do programa. Esta ação acontecerá no momento da
abertura do programa. A técnica funcionará para campos dos tipos text,
textarea, Radio-button e check-box.

Basta incluir no HTML do programa o código Javascript abaixo:


Implementação
Objetivo

<script language="JavaScript">
for (var i=0;i<document.forms[0].elements.length;i++) {
var e = document.forms[0].elements[i];
if ((e.type == "text" || e.type == "textarea" || e.type
== "radio" || e.type == "checkbox") && e.disabled == false) {
e.focus();
i = document.forms[0].elements.length;
}
}
</script>

Como migrar relatórios antigos para RTF


Esta técnica permite gerar a saída do relatório em um arquivo RTF nos
programas que foram criados antes da alteração que incluiu esta funcionalidae
no template. Os programas criados após a alteração já terão essa
funcionalidade implementada.
 Arquivo HTM: Deverão ser incluídos os campos responsáveis pela
opção de impressão em RTF.
Deve-se inserir uma nova coluna no final da página de impressão a fim
de incluir os campos destinados à seleção de impressão em RTF. Se
necessário, deve-se manutenir o programa para que todos os campos
da tela fiquem armazenados dentro de uma tabela.
Segue um exemplo da implementação da nova coluna da tabela:

<td class="linhaForm">
<fieldset>
<legend><!--BXLS-->Rich Text Format(RTF)<!--
EXLS-->:</legend>
<table border="0" width="100%">
<tr>
<td class="linhaForm">
Templates para WEB 145

<label for="C3">
<input type="checkbox"
name="w_tb_rtf" id="C3"><!--BXLS-->RTF<!--EXLS-->
</label>
</td>
</tr>
<tr>
<td class="linhaForm">
<!--BXLS-->Modelo<!--EXLS-->:
<input type="text" size="50" maxlength="256"
name="w_c_modelo_rtf">
</td>
</tr>
</table>
</fieldset><p></p>
</td>

Tela antiga sem a opção de impressão em RTF:


Tela com opção de impressão em RTF:

 Arquivo .w:
 Antes da definição da temp-table ab_unmap devemos acrescentar
a definição do preprocessador que irá indicar se o RTF será
utilizado ou não:
&GLOBAL-DEFINE RTF YES

 Definir os campos abaixo na temp-table ab_unmap:


&IF "{&RTF}":U = "YES":U &THEN
FIELD w_c_modelo_rtf AS CHARACTER FORMAT "X(256)":U
FIELD w_tb_rtf AS LOGICAL INITIAL no
&ENDIF

 Definir os campos abaixo na temp-table tt-param:


&IF "{&RTF}":U = "YES":U &THEN
FIELD modelo-rtf AS CHAR FORMAT "x(35)"
FIELD l-habilitaRtf AS LOG
Templates para WEB 147

&ENDIF

 Inserir os campos "ab_unmap.w_tb_rtf" e


"ab_unmap.w_c_modelo_rtf" na definição do préprocessadore
ENABLED-OBJECTS..
&IF "{&RTF}":U = "YES":U &THEN ab_unmap.w_tb_rtf
ab_unmap.w_c_modelo_rtf &ENDIF~

 Inserir os campos "ab_unmap.w_tb_rtf" e


"ab_unmap.w_c_modelo_rtf" na definição do préprocessadore
DISPLAYED-OBJECTS.
&IF "{&RTF}":U = "YES":U &THEN ab_unmap.w_tb_rtf
ab_unmap.w_c_modelo_rtf &ENDIF~

 Inserir a definição dos campos abaixo na frame WEB-FRAME:


&IF "{&RTF}":U = "YES":U &THEN
ab_unmap.w_tb_rtf AT ROW 1 COL 1
VIEW-AS TOGGLE-BOX
SIZE 20 BY 1
ab_unmap.w_c_modelo_rtf AT ROW 1 COL 1 NO-LABEL
VIEW-AS FILL-IN
SIZE 20 BY 1
&ENDIF

 Inserir as linhas de comando abaixo na procedure htmOffsets:


&IF "{&RTF}":U = "YES":U &THEN
RUN htmAssociate
("w_c_modelo_rtf":U,"ab_unmap.w_c_modelo_rtf":U,ab_unmap.w
_c_modelo_rtf:HANDLE IN FRAME {&FRAME-NAME}).
RUN htmAssociate
("w_tb_rtf":U,"ab_unmap.w_tb_rtf":U,ab_unmap.w_tb_rtf:HAND
LE IN FRAME {&FRAME-NAME}).
&ENDIF
 Na procedure pi-executar alterar o comando assign da temp-table
tt-param, inserindo os comandos abaixo para que os valores
referentes ao RTF sejam gravados na temp-table:
&IF "{&RTF}":U = "YES":U &THEN
tt-param.modelo-rtf = w_c_modelo_rtf
tt-param.l-habilitaRtf = w_tb_rtf
&ENDIF

 Na procedure process-web-request o trecho de código deve ser


alterado de:
IF get-value("w_rs_destino":U) = "1" THEN DO :
IF get-value("w_c_arquivo":U) = "" THEN DO :
RUN utp/ut-msgs.p (INPUT "msg":U, INPUT 4306,
INPUT "" ).
ASSIGN c-return = RETURN-VALUE.
END.
ELSE DO:
run pi-executar.
END.
END.
IF get-value("w_rs_destino":U) = "2" THEN DO:
IF get-value("w_c_arquivo") = "" THEN DO :
RUN utp/ut-msgs.p (INPUT "msg":U, INPUT 17910,
INPUT "" ).
ASSIGN c-return = RETURN-VALUE.
END.
ELSE DO:
RUN pi-executar.
END.
END.

Para:
IF get-value("w_rs_destino":U) = "1" THEN DO :
IF get-value("w_c_arquivo":U) = "" THEN DO :
Templates para WEB 149

RUN utp/ut-msgs.p (INPUT "msg":U, INPUT 4306,


INPUT "" ).
ASSIGN c-return = RETURN-VALUE.
END.
ELSE DO:
&IF "{&RTF}":U = "YES":U &THEN
IF get-value("w_tb_rtf":U) = "ON":U AND get-
value("w_c_modelo_rtf":U) = "":U THEN DO:
RUN utp/ut-msgs.p (INPUT "msg":U, INPUT 16624,
INPUT "Modelo RTF" ).
ASSIGN c-return = RETURN-VALUE.
END.
ELSE DO:
&ENDIF
run pi-executar.
&IF "{&RTF}":U = "YES":U &THEN
END.
&ENDIF
END.
END.
IF get-value("w_rs_destino":U) = "2" THEN DO:
IF get-value("w_c_arquivo") = "" THEN DO :
RUN utp/ut-msgs.p (INPUT "msg":U, INPUT 17910,
INPUT "" ).
ASSIGN c-return = RETURN-VALUE.
END.
ELSE DO:
&IF "{&RTF}":U = "YES":U &THEN
IF get-value("w_tb_rtf":U) = "ON":U AND get-
value("w_c_modelo_rtf":U) = "":U THEN DO:
RUN utp/ut-msgs.p (INPUT "msg":U, INPUT 16624,
INPUT "Modelo RTF" ).
ASSIGN c-return = RETURN-VALUE.
END.
Implementação

ELSE DO:
&ENDIF
run pi-executar.
&IF "{&RTF}":U = "YES":U &THEN
END.
&ENDIF
END.
END.

 Arquivo RP.P:
 Os passos para migrar o programa RP.P estão listados no Manual
de Padrões.

Retirar opção de impressão em RTF


Objetivo Esta técnica permite retirar a opção de saída do relatório em formato RTF.
 Arquivo HTM: Deverão ser retirados os campos responsáveis pela
opção de impressão em RTF.
Se necessário, deve-se manutenir o programa para que todos os
campos da tela fiquem armazenados dentro de uma tabela.
Deve-se eliminar a linha da tabela que contém os campos utilizados
para a impressão em RTF. Segue abaixo um exemplo da linha a ser
eliminada:

<td class="linhaForm">
<fieldset>
<legend><!--BXLS-->Rich Text Format(RTF)<!--
EXLS-->:</legend>
<table border="0" width="100%">
<tr>
<td class="linhaForm">
<label for="C3">
Templates para WEB 151

<input type="checkbox"
name="w_tb_rtf" id="C3"><!--BXLS-->RTF<!--EXLS-->
</label>
</td>
</tr>
<tr>
<td class="linhaForm">
<!--BXLS-->Modelo<!--EXLS-->:
<input type="text" size="50" maxlength="256"
name="w_c_modelo_rtf">
</td>
</tr>
</table>
</fieldset><p></p>
</td>

 Arquivo .w:
 Antes da definição da temp-table ab_unmap, alterar a definição do
preprocessador RTF para NO:
&GLOBAL-DEFINE RTF NO

Você também pode gostar