Escolar Documentos
Profissional Documentos
Cultura Documentos
Interface para WEB: Manual de Técnicas
Interface para WEB: Manual de Técnicas
Í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
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>
Aculturação WEB
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.
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).
TAGS HTML
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>
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
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>
Onde:
size: Tamanho da fonte (1a7).
color: Exibe o texto na cor especificada.
face: Exibe o texto utilizando a fonte escolhida.
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
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.
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.
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.
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.
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
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.
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.
Onde:
name: Nome atribuído ao botão.
value: Rótulo do botão.
Onde:
Templates para WEB 17
Onde:
name: Nome atribuido ao botão.
value: Rótulo do botão.
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
Arquitetura
Webspeed
Database View Ferramenta do Workshop que permite verificar tabelas, nomes de campos e de
índices dos bancos de dados conectados.
Cgi Wrapper;
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.
JavaScript
Operadores Aritméticos:
* (Multiplicação) X * Y ;
/ (Divisão) X / Y;
+ (Adição) X + Y;
- (Subtração) X – Y;
++ (Incremento) X++;
-- (Decremento) X--;
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.
Ex: document.forms[0].elements[0].value = 10 ou
document.meuform.w_codigo.value = 10
Templates para WEB 27
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.
close():
Fecha a janela do Browser.
CAPÍTULO 2
Geração do Programa
Tarefas
A seguir é apresentada uma lista de tarefas para desenvolvimento do
programa.
Procedure Process-
Temp-Table
Preprocessors
de
Comunicação
web-request
PROCEDURE process-web-request :
/*--------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/
RUN outputHeader.
RUN displayError .
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"}
{&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.
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">
<script language="JavaScript">
function inicializa() {
parent.document.title = 'Template de Cadastro Simples';
parent.panel("NGSACMDUROLHE","WSP0001 2.00.00.000");
}
</script>
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
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
{dbo\boXX999.i {&ttTable1}}
PROCEDURE process-web-request :
/*--------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/
RUN outputHeader.
RUN displayError .
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"}
{web/winclude/wi-assign.i}
end.
RUN SUPER.
END PROCEDURE.
As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
Templates para WEB 41
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
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
PROCEDURE displayFields :
/*--------------------------------------------------------------------
Purpose: Super Override.
Parameters:
Notes:
---------------------------------------------------------------------*/
FIND FIRST {&ttTable1} NO-LOCK NO-ERROR.
END.
END PROCEDURE
RUN outputHeader.
{web/winclude/wi-getpai.i}
RUN displayError .
END PROCEDURE.
As três Meta Tags a seguir definem que o navegador não irá utilizar cache.
Templates para WEB 47
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).
<td class="barratitulo">
<!--BXLS-->Template de Consulta PAI x FILHO<!--EXLS-->
</td>
PROCEDURE process-web-request :
/*--------------------------------------------------------------------
Purpose: Process the web request.
Notes:
---------------------------------------------------------------------*/
RUN outputHeader.
{web/winclude/wi-sonnav.i &nrlinha=5}
RUN addCol .
RUN addNav .
RUN generateHeaderSon .
RUN generateBrowse in h-brwapi.
{&out} return-value .
END PROCEDURE.
END PROCEDURE.
Parameters: <none>
Notes:
----------------------------------------------------------------------*/
RUN setLinkNavigation in h-brwapi ("{&FATHERNAME}?
son=yes&chave_pai=":U + string({&ttTableFather}.r-Rowid)).
END PROCEDURE.
PROCEDURE generateHeaderSon :
/*---------------------------------------------------------------------
Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------*/
def var titleSon as char no-undo .
{web/winclude/wi-sonhei.i}
{web/winclude/wi-sonhef.i}
END PROCEDURE.
Preprocessors
Definiçã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:
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
Preprocessor Descrição
NFACON Diretório e nome do programa de consulta pai
DBO2 O valor “YES” indica que utiliza DBO 2
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.
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.
PROCEDURE process-web-request :
/*---------------------------------------------------------------------
Purpose: Process the web request.
Notes:
----------------------------------------------------------------------*/
RUN outputHeader.
Templates para WEB 55
Arquivo HTML O arquivo HTML contem algumas tags necessárias para garantir o padrão de
layout e algumas características funcionais do produto.
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">
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
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
&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.
end.
END PROCEDURE.
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).
Arquivo HTML O arquivo HTML contem algumas tags necessárias para garantir o padrão de
layout e algumas características funcionais do produto.
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">
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
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
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 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
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">
<title>
<!--BXLS-->Template de Vá Para<!--EXLS-->
</title>
Tarefas
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
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
PROCEDURE process-web-request :
/*---------------------------------------------------------------------
Purpose: Process the web request.
Parameters: <none>
Notes:
--------------------------------------------------------------------*/
def var c-title as character no-undo.
RUN outputHeader.
RUN setVariablesRange.
{web/zoom/i-boqry.i}
{web/winclude/wi-likbrz.i &nomeprog="wsp0001a.p"}
{&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
.
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
{&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
{&OUT}
' </table>':U SKIP
' </td></tr>':U SKIP
'</table>':U SKIP
'<br><br>':U SKIP
.
END PROCEDURE.
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:
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}
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"}
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.
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
"</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:
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
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
97
CAPÍTULO 7
Contexto de Transação
98
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.
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.
101
CAPÍTULO 8
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
Na Process-web-request :
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" .
...
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:
{&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">'
.
{&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
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 .
CAPÍTULO 9
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 */
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
Validações em Geral
Validações em Relatórios
Desenvolvimento Específico/Customizações
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.
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.
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>
Exemplo em HTML:
<html>
<script>
function ChamaFunção() {
document.form[0].elements[0].select();
}
</script>
<body>
<form>
</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.
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
...
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}).
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.
c-nome = emitente.nome-abrev.
assign c-emp = get-value("c-empresa-ramo").
assign c-user = get-cookie("ck-usuario").
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)
&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
RUN output-header.
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
<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>
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:
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.
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
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 :
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.
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:
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.
END.
ELSE DO:
/* Lógica padrão do método POST */
END.
Templates para WEB 141
Ex.:
{web/winclude/wi-uspfl.i cd0101}
Ex.:
{web/winclude/wi-uspfs.i cd0101}
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.
<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>
<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>
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
&ENDIF
Para:
IF get-value("w_rs_destino":U) = "1" THEN DO :
IF get-value("w_c_arquivo":U) = "" THEN DO :
Templates para WEB 149
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.
<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