Académique Documents
Professionnel Documents
Culture Documents
ndice
ndice
Prefcio
OBJETIVO................................................................................................................................... V
TIPOGRAFIA................................................................................................................................ V
OBSERVAES EM SINTAXES ..................................................................................................... VI
REFERNCIAS BIBLIOGRFICAS ................................................................................................ VIII
1. Introduo
2. Ferramentas do WebSpeed
9
10
3.2.
4.2.
4.3.
4.4.
4.5.
5.2.
5.3.
5.4.
30
5. SpeedScript
5.1.
25
41
ndice
5.5.
5.6.
5.7.
5.8.
5.9.
6. CGI Wrapper
6.1.
6.2.
6.3.
7. HTML Mapping
7.1.
8.2.
9.2.
9.3.
9.4.
9.5.
9.6.
9.7.
124
102
85
131
ndice
9.8.
151
10.1.
10.2.
10.3.
10.4.
161
Prefcio
Prefcio
OBJETIVO
Introduz o aluno ao ambiente web, passando nosso conhecimento de como utilizar as
ferramentas inclusas no AppBuilder do WebSpeed, bem como os trs mtodos de criao de
pginas HTML, fornecidos pelo WebSpeed. Incluir tambm as tcnicas normalmente
utilizadas para aperfeioar seu aplicativo em relao migrao para o cdigo de reutilizao
dos aplicativos j existentes.
TIPOGRAFIA
Fontes em negrito
Comando ou caracter que o usurio edita
nfase em uma palavra ou expresso especfica
Fonte Itlica
Argumentos de programao
Comentrios no cdigo fonte
Novos termos
Ttulos das publicaes
Fonte Couriew
Exemplos de Cdigos
Nome de arquivos e pastas especficas
Combinaes De Teclas
Quando utilizado duas ou mais teclas simultaneamente, isto , quando ser preciso
pressionar uma tecla, manter esta tecla pressionada e pressionar a outra.
Exemplo: CLTR-X
Duas teclas usadas uma em seguida da outra.
Exemplo: ESCAPE H
Prefcio
OBSERVAES EM SINTAXES
As sintaxes desta apostila seguem a seguinte conveno:
As palavras-chaves estaro escritas em letras maisculas e opes ou argumentos
estaro em itlico:
SINTAXE
ACCUM aggregate expression
No exemplo acima, a palavra ACCUM uma palavra-chave. As palavras aggregate e
expression so as opes definidas para a funo ACCUM no PROGRESS Language
Reference.
Colchetes em volta de um item indicam que so opcionais:
SINTAXE
DISPLAY
STREAM stream
] [ unless-hidden ] [ no-error ]
, constant
BY expression
[ DESCENDING ] }
No exemplo, EACH, FIRST e LAST so opes e voc poder escolher entre uma delas. J no
exemplo abaixo, voc dever escolher um dos itens logical-name ou alias
SINTAXE
Prefcio
CONNECTED (
{ logical-name | alias } )
...
Reticncias (
) indicam que voc pode atribuir um ou mais itens alm dos
apresentados. Se um grupo de itens est entre chaves e seguido de reticncia, voc
dever escolher um ou mais dos itens. Se um grupo de itens est entre colchetes e
seguidos por reticncias, voc pode opcionalmente escolher um ou mais itens:
SINTAXE
MAXIMUM ( expression , expression
[,
expression
])
No exemplo acima, voc dever incluir duas expresses, mas pode opcionalmente incluir mais.
Note que cada expresso subseqente deve estar precedida de vrgula.
SINTAXE
MESSAGE
No exemplo, as opes esto em linhas diferentes, mas se referem mesma funo WITH.
Prefcio
REFERNCIAS BIBLIOGRFICAS
Princpios Bsicos
PROGRESS Database Administration Guide and Reference
PROGRESS Installation Notes Version 9
PROGRESS Update Bulletin
PROGRESS /400 DataServer Installation Notes
PROGRESS Application Development Environment Getting Started
PROGRESS Language Tutorial
PROGRESS Master Glossary
Welcome to PROGRESS
Ferramentas de Desenvolvimento
PROGRESS AppBuilder Developers Guide
PROGRESS Basic Database Tools
PROGRESS Basic Development Tools
PROGRESS Debugger Guide
PROGRESS Help Development Guide
PROGRESS Translation Manager Guide
PROGRESS Visual Translator Guide
Ferramentas de Relatrios
PROGRESS Report Builder Deployment Guide
PROGRESS Report Builder Tutorial
PROGRESS Report Builder Users Guide
PROGRESS RESULTS Users Guide
4GL
Building Distributed Applications Using the PROGRESS AppServer
PROGRESS External Program Interfaces
PROGRESS Internationalization Guide
PROGRESS Language Reference
PROGRESS Programming Handbook
PROGRESS Database Administration Guide and Reference
DataServers
PROGRESS DataServer Guides
System Administration
PROGRESS System Administration Guide
PROGRESS System Administration Reference
SQL/Open Access
PROGRESS Embedded SQL Guide and Reference
PROGRESS Open Client Developers Guide
PROGRESS SQL Guide and Reference
SQL-92
PROGRESS Embedded SQL-92 Guide and Reference
PROGRESS JDBC Driver Guide
PROGRESS ODBC Driver Guide
PROGRESS SQL-92 Guide and Reference
Deployment
PROGRESS Developers Toolkit
PROGRESS Portability Guide
Reference
Pocket
PROGRESS
INTRODUO
1. Introduo
Especificamente, este curso descreve:
A criao de uma pgina na Web com texto e imagens.
Organizao de dados com tabelas do HTML.
Organizao de pginas na web com HTML frames.
Transferncia de dados de uma pgina para outra utilizando a URL.
Manipulao de eventos.
Como Interagir com o usurio atravs de janelas alert, prompt e confirm.
Descrever e instalar a arquitetura e a configurao do WebSpeed.
Criar pginas de HTML utilizando os trs mtodos fornecidos pelo WebSpeed.
Embedded SpeedScript;
CGI-Wrapper
HTML Mapping.
FERRAMENTAS DO WEBSPEED
2. Ferramentas do WebSpeed
O ambiente de desenvolvimento do WebSpeed possui diversos recursos, ferramentas e
componentes para a construo de pginas WEB dinamicamente, permitindo assim que a
criao dos aplicativos para WEB seja feitos de forma produtiva.
2.1. APPBUILDER
O AppBuilder o ambiente de desenvolvimento para ambientes caracter, Client/Server e para
HTML-based (ambiente WEB). Em uma mesma ferramenta possvel desenvolver os
aplicativos para qualquer que seja o ambiente desejado.
Esta ferramenta pode ser encontrada nas licenas Progress para:
WebSpeed: Criar, testar e desenvolver objetos WEB
Provision: Criar, testar e desenvolver aplicativos Client/Server multi-camadas
Provision Plus: Criar, testar e desenvolver aplicativos tanto em ambientes Client/Server
como em ambientes WEB, alm de integrao com outros aplicativos no Progress como
Java e ActiveX.
2.1.2. SmartDataObjects
O WebSpeed compatvel com o SmartObject SmartDataObject, sendo este escrito para
gerenciar as regras de negcio e acesso ao banco de dados como leituras, cadastros e
validaes. Portanto, esse objeto no foi desenvolvido para permitir interface com o usurio,
mas para ser o objeto de dados, criando a interface entre a pgina WEB e o banco de dados.
FERRAMENTAS DO WEBSPEED
FERRAMENTAS DO WEBSPEED
FERRAMENTAS DO WEBSPEED
port: Identifica o nmero da porta do Web Server. Pode ser opcional caso o Web Server use a
porta padro que a 80.
scripts_dir: Identifica o diretrio de Scripts do Web Server para os Messengers CGI ou ISAPI.
Caso o Messenger NSAPI estiver sendo usado, essa opo pode ser omitida.
messenger: Identifica o nome do Messenger. No caso do Messenger CGI, necessrio
colocar o nome do executvel. No caso do Messenger ISAPI ou NSAPI deve ser informado o
arquivo DLL.
Broker: Identifica o nome do Broker.
O boto Test ir verificar se a conexo com o Broker est correta.
FERRAMENTAS DO WEBSPEED
Modo Local
Modo Remoto
Caso exista algum problema que impea o acesso remoto do WebSpeed Server, possvel
salvar os programas localmente. Entretanto no ambiente local no possvel compilar fontes
que possuam SpeedScript.
FERRAMENTAS DO WEBSPEED
Esta pgina do WebTools possui um frame de detalhe com todos os links para
desenvolvimento e ajuda e um frame de trabalho.
Cada link do frame de detalhes permite o acesso a uma atividade ou informao:
Application Manager
Possui informaes do gerenciador da aplicao como quem so os servios disponveis e os
diretrios de trabalho do WebSpeed Server.
FERRAMENTAS DO WEBSPEED
Data Browser
Mostra as informaes como nome, servio e localizao dos bancos de dados conectados no
WebSpeed Server.
Editor
O editor do WorkShop funciona basicamente como o Procedure Editor do 4GL. Possui opes
para trabalhar com os arquivos e ainda checar sintaxe, criar Rcode e executar os programas.
FERRAMENTAS DO WEBSPEED
File Tools
Esta opo possibilita a pesquisa de programas e arquivos utilizando filtros. Alm de possibilitar
executar, compilar, gerar offset e eliminar arquivos.
FERRAMENTAS DO WEBSPEED
OS Command
Esta opo possibilita a informar comandos do sistema operacional.
Scripting Lab
Esta opo possibilita a realizar pequenas testes e possui pequenos cdigos exemplos. A
maior vantagem que os programas no precisam ser gerados, compilados e depois
executados.
FERRAMENTAS DO WEBSPEED
Agent Variables
Mostra as variveis correntes do ambiente atual.
FERRAMENTAS DO WEBSPEED
Database
Possui informaes sobre todos os bancos de dados conectados ao agente do WebSpeed.
Messages
Possibilita pesquisar as mensagens de erro ocasionadas no Progress e buscar por
detalhamentos. O boto Query Knowledge Base for Error permite o acesso pgina da
Progress que possui maiores informaes de erro.
FERRAMENTAS DO WEBSPEED
Object State
Mostra uma lista de todos os objetos WEB ativos com informaes como tipo do objeto e ainda
sua atual situao neste ambiente WEB.
FERRAMENTAS DO WEBSPEED
Propath
Mostra a lista de todos os diretrios usados pelo ambiente do WebSpeed.
FERRAMENTAS DO WEBSPEED
FERRAMENTAS DO WEBSPEED
ARQUITETURA DO WEBSPEED
3. Arquitetura do WebSpeed
3.1. COMPONENTES DO WEBSPEED
Agente WebSpeed Processo que executa o objeto WEB, realiza transaes e
dinamicamente combina dados com o formato HTML. Basicamente um Progress 4GL
Character executado em Batch.
WebSpeed Broker Este processo pode ser dividido em:
- Registrar o servio WebSpeed fornecido para um NameServer para ser
acessado por um ou mais cliente HTML. O cliente HTML executado por um
browser.
- Gerencia conexes entre clientes e um conjunto de Agentes WebSpeed.
- Mantm o status de cada Agente neste conjunto e dinamicamente escala o
nmero de Agentes de acordo com a variao da demanda.
WebSpeed Messenger Processo que gerencia a transferncia de dados entre o
WEB Server e o Agente WebSpeed durante uma simples transao WEB. O
Messenger um programa CGI ou um processo ISAPI ou NSAPI, dependendo do
WEB Server e como planejado o desenvolvimento da aplicao.
NameServer Processo que mantm uma lista de WebSpeed Transaction Servers. O
Transaction Servers registra os servios da aplicao providas com o NameServer. O
NameServer pode diretamente requisitar a conexo de um cliente para um WebSpeed
Broker que suporta um servio de uma aplicao requisitada. Isto d uma maior
escalabilidade e transparncia da localizao da aplicao.
Quando o Enterprise Transaction Server instalado, o NameServer tambm realiza o
Load Balancing, permitindo balancear a carga do cliente entre mltiplos Brokers que
suportam um mesmo servio da aplicao, isto , o mesmo conjunto de procedures e
recursos.
WorkShop Ferramenta para desenvolver e testar as aplicaes WebSpeed.
Mquina 2
Web Server
Messenger
Mquina 3
NameServer
Mquina 4
Broker
Agente
Mquina 5
DB SERVER
Ainda possvel adicionar o Progress AppServer em qualquer mquina que possa suporta-lo
na rede. O AppServer pode esecutar procedures Progress no lugar do Agente, como um
Progress Client.
ARQUITETURA DO WEBSPEED
Nmero de Agentes
2
5 ou 25
50 ou 250
Load Balancing
No
No
Sim
ARQUITETURA DO WEBSPEED
ARQUITETURA DO WEBSPEED
ARQUITETURA DO WEBSPEED
8 O Agente passa o HTML gerado para o Messenger que envia para o Browser atravs do
WEB Server:
Um objeto WEB state-aware, apesar de no ter uma execuo prolongada, mantm o contexto
persistente para execues futuras do Agente.
Aps completar a execuo, o Agente disconecta do Messenger e atualiza seu estado como
disponvel para o Broker. O WEB Server desconecta do Browser depois de enviar a pgina
WEB HTML.
</script>
A compilao do objeto WEB Embedded SpeedScript tambm gera um arquivo .W temporrio
e a partir dele um Rcode criado. Ao gerar o HTML a ser usado pelo browser, o HTML original
montado e as informaes geradas pelo SpeedScript so criadas nesse HTML.
Tanto a template Detail Wizard como a Report Wizard criam um Rcode usando o Embedded
SpeedScript em um arquivo HTML. Alm da existncia da template Blank que um arquivo
HTML com as tags para Embedded SpeedScript prontas.
de negcio existe na compilao. O HTML Mapeado converge para HTML puro no momento da
execuo.
Em tempo de compilao, existe uma melhoria de performance, pois todo cdigo fica contido
em um nico arquivo, inclusive expresses SpeedScripts (strings). Entretanto, fica a limitao
de 60KB como tamanho mximo dos programas gerados. Em compensao, em tempo de
execuo dos HTML Mapeados existe uma separao entre HTML e SpeedScript,
automatizando entrada e sada de dados no HTML. Mas as geraes das pginas WEB so
mais complexas devido s interaes necessrias.
A outra tag utilizada so os caracteres de crase ( `...` ). Esta tag inclui o valor corrente de cada
elemento de dados separados pelas crases, diretamente no HTML.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<META NAME="SQLWorks" CONTENT="Treinamento WebSpeed">
<TITLE>Listagem de Customer</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<h1>Listagem de Customer</h1>
<table border>
<tr>
<th>Cliente</th>
<th>Nome</th>
<th>Telefone</th>
</tr>
<SCRIPT LANGUAGE="SpeedScript">
FOR EACH customer NO-LOCK:
</SCRIPT>
<tr>
<td align=left>`customer.custnum`</td>
<td align=left>`customer.name`</td>
<td align=left>`customer.phone`</td>
</tr>
<SCRIPT LANGUAGE="SpeedScript">
END.
</SCRIPT>
</table>
</BODY>
</HTML>
Exemplo localizado em: exemplo/capitulo4/exemplo01.html
Este programa gera uma pgina WEB com uma tabela de trs colunas. Cada linha tem 1
registro da tabela de Customer impresso com os campos CUSTNUM, NAME e PHONE.
<TD>Nome:</TD>
<TD><INPUT NAME="name" SIZE="20" VALUE="`customer.name`"></TD>
<TD>Telefone:</TD>
<TD><INPUT NAME="phone" SIZE="20" VALUE="`customer.phone`"></TD>
</TR>
<TR>
<TD>Primeiro Endereo:</TD>
<TD COLSPAN="3"><INPUT NAME="address" SIZE="20"
VALUE="`customer.address`"></TD>
</TR>
<TR>
<TD>Segundo Endereo:</TD>
<TD COLSPAN="3"><INPUT NAME="address2" SIZE="20"
VALUE="`customer.address2`"></TD>
</TR>
<TR>
<TD>Cidade:</TD>
<TD><INPUT NAME="city" SIZE="20" VALUE="`customer.city`"></TD>
<TD>CEP:</TD>
<TD><INPUT NAME="postalcode" SIZE="20" VALUE="`customer.postalcode`"></TD>
</TR>
<TR>
<TD>UF:</TD>
<TD COLSPAN="3"><INPUT NAME="state" SIZE="20"
VALUE="`customer.state`"></TD>
</TR>
<TR>
<TD>Comentrios:</TD>
<TD><TEXTAREA NAME="comments"
ROWS="5" COLS="30">`customer.comments`</TEXTAREA></TD>
</TR>
<!--WSS END. -->
</FORM>
</TABLE>
</BODY>
</HTML>
Exemplo localizado em: exemplo/capitulo4/exemplo02.html
Neste exemplo, a procedure PROCESS-WEB-REQUEST cria toda pgina WEB que satisfaz a
requisio, incluindo todo HTML e dados associados. Primeiramente a procedure OUTPUTHEADER executada para gerar o cabealho HTTP da pgina. Aps isto, uma tabela
montada apresentando o cdigo, nome e telefone de cada registro de CUSTOMER. A
construo dessa tabela feita pelo comando FOR EACH. O resultado final mostrado em
forma de uma tabela, semelhante ao exemplo do SpeedScript.
Para a criao de um objeto WEB CGI Wrapper, existe uma template prpria para isso com o
mesmo nome, CGI Wrapper.
O preprocessador {&OUT} uma sintaxe do WebSpeed que inicia a sada para uma pgina
WEB. Este preprocessador identifica o STREAM de sada, indicando ser uma sada apontada
como WEB.
</p>
</FORM>
</BODY>
</HTML>
Exemplo localizado em: exemplo/capitulo4/exemplo04.html
SPEEDSCRIPT
5. SpeedScript
5.1. SIMILARIDADE - SPEEDSCRIPT E 4GL PROGRESS
O SpeedScript utilizado para desenvolver aplicaes em ambiente WEB, sendo este uma
implementao do Progress 4GL. O conceito bsico do Progress 4GL deve ser obedecido no
uso do SpeedScript.
5.1.1. Similaridade
Regras de escopo e estrutura de blocos.
Eventos do banco de dados como CREATE e DELETE de registros.
Regras de LOCK de registros e transaes.
Uso das SmartDataObjects como fontes de dados.
Uso do AppServer para requisitar processos.
Pode ser desenvolvido usando o AppBuilder.
5.1.2. Diferenas
Programas escritos em 4GL so normalmente STATE-AWARE, enquanto aplicaes
em SpeedScript so STATELESS (sem estado), onde:
- STATE-AWARE: Mantm o contexto enquanto houver conexo do Client com o
agente. Como uma extenso do Progress Client, mantendo o escopo das variveis
e Locks de registros e transaes.
- STATELESS: Cada acesso ao Agent cria uma nova sesso Client do Progress.
Com isso todos os escopos de variveis e registros so novos.
Eventos de objetos grficos (GUI) no usados no SpeedScript, pois so gerenciados
pelo HTML.
O preprocessador {&OUT} usado para indicar a sada de dados para uma pgina
HTML.
O bloco do processo de I/O para WEB semelhante ao 4GL, mas comandos como
UPDATE e PROMPT-FOR, alm de MESSAGE (VIEW-AS ALERT-BOX) e PAUSE no
podem ser usados ou so simplesmente ignorados.
So poucos os eventos que podem ser disparados em ambientes WEB. As triggers de
bancos de dados funcionam sem problemas, e o evento essencial no SpeedScript o
WEB-NOTIFY. Entretanto, normalmente usado apenas pelo programa de controle de
agentes (WEB-DISP.P). Sendo assim, o comando WAIT-FOR no pode ser usado.
Algumas procedures esto disponveis em arquivos Includes e so acessados pelo
boto Insert Call no Section Editor, sendo apropriados apenas em aplicaes
WebSpeed:
-
getWebState
getWebTimeRemaining
hidden-field-list
set-cookie
get-cookie
SPEEDSCRIPT
Este exemplo possui apenas o {&OUT} para realizar a sada da informao na pgina WEB,
identificada como linguagem SpeedScript.
Ainda possvel visualizar esse cdigo pelo WorkShop. Para isto, basta acessar WebTools na
opo Tools do menu. No WorkShop aberto, acessar Scripting Lab. Na rea aberta para
edio, colocar o cdigo do {&OUT} com o texto a ser mostrado.
SPEEDSCRIPT
Comentrios
Dentro da rea do SpeedScripts, possvel colocar comentrios. Seu uso idntico ao uso no
4GL, iniciando com /* e finalizando com */.
Blocos
Como no 4GL, para o SpeedScript o bloco uma seqncia de um ou mais linhas de
comandos, incluindo outros blocos. O funcionamento do bloco, incluindo o escopo de registros
e variveis so os mesmos do 4GL. A procedure externa o bloco mais bsico para o
SpeedScript, pois pode conter uma ou mais linhas de comandos e a menor unidade que pode
ser compilada separadamente. Objetos WEB so sempre procedures externas. Outra
caracterstica que a procedure externa o nico bloco que necessita de uma sintaxe especial
para ser executada, enquanto os demais blocos continuam usando sua prpria terminologia
para abrir os blocos e o comando END para encerr-los.
A diferena bsica est na maneira de construir um aplicativo no SpeedScript. A interao
entre o Progress e o HTML acontece com o uso de TAGS especficas. Ao abrir e fechar as
TAGS do SCRIPT, os blocos no necessitam ser abertos e fechados dentro de uma mesma
TAG SpeedScript. A abertura do bloco pode acontecer em um momento, separada por
informaes da montagem do HTML e depois as TAGS SpeedScript para encerrar o bloco.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<META NAME="SQLWorks" CONTENT="Treinamento WebSpeed">
<TITLE>WebSpeed Script</TITLE>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="SpeedScript">
SPEEDSCRIPT
/*-----------------------------------------------------------------File:
Description:
Created:
-------------------------------------------------------------------*/
REPEAT WHILE TRUE: /* Inicia bloco de interao */
RUN maxCustomers.
END. /* finaliza bloco de interao */
PROCEDURE maxCustomer: /* Inicia bloco de procedure interna */
FOR EACH customer USE-INDEX NAME NO-LOCK: /* Inicia bloco de interao */
IF customer.balance > 30000 THEN DO: /* Inicia bloco */
{&DISPLAY} customer.NAME customer.balance.
END. /* Finaliza bloco */
END. /* Finaliza bloco de interao */
END PROCEDURE. /* Finaliza o bloco de procedure interna */
</SCRIPT>
</BODY>
</HTML>
Exemplo localizado em: exemplo/capitulo5/exemplo06.html
SPEEDSCRIPT
todo e qualquer tipo de conjunto de linhas de comandos. Ainda para as procedures, seja
interna ou externa, a passagem de parmetros a mesma aplicada no 4GL.
Procedures Persistentes
Quando uma procedure externa executada de modo persistente, permanece em memria
com todo seu contexto de variveis e procedures internas mesmo depois do cdigo principal
(MAIN BLOCK) ter sido executado e finalizado. Isto nos permite a facilidade de instanciar
objetos WEB, no caso SpeedScripts. Isto possvel porque na execuo da procedure, o
endereo (HANDLE) do mesmo pode ser armazenado em variveis, possibilitando seu acesso,
mesmo depois do fim do MAIN BLOCK da procedure externa. Com o HANDLE da procedure
executada persistentemente, possvel acessar suas procedures e funes internas. Mas para
isso necessrio utilizar a opo IN com a varivel que contm o endereo da procedure.
Procedures prprias do WebSpeed
O WebSpeed possui um conjunto de procedures chamadas Conventions. A primeira delas o
mtodo run-web-object, onde tem como finalidade executar um objeto WEB de uma outra
procedure. Outra procedure bsica a web-disp.p que executada por objetos WEB,
respondendo requisies WEB. O mtodo run-web-object segue um padro garantindo a
integridade do objeto WEB, seja STATELESS ou STATE-AWARE, permitindo ao WebSpeed
gerenciar os objetos WEB. Este mtodo encontrado no objeto instalaoprogress/src/web/objects/web-util.p.
A outra conveno sobre o disparo dos mtodos. Ao executar a procedure, diversos mtodos
podem ser sobrescritos, mas sem alterar o mtodo original. Assim a customizao feita
executada antes e/ou depois da execuo do mtodo original. Os mtodos esto definidos na
include instalao-progress/src/web/method/admweb.i.
SPEEDSCRIPT
uma tabela. O escopo de cada registro lido idntico ao contexto do bloco FOR, pois o escopo
eliminado no fim do bloco.
Recursos Dinmicos
Tudo que dinmico significa que pode ser criado e eliminado em tempo de execuo, seja de
forma implcita ou explcita. Por exemplo, o buffer de um registro do comando FOR que foi
definido implicitamente so buffers dinmicos. O WebSpeed cria esses buffers quando o bloco
FOR executado e os elimina quando a execuo finalizada. O escopo de um frame no
SpeedScript para o bloco FOR funcionam da mesma maneira. Todo o contexto da procedure
dinmico. WebSpeed cria recursos de dados locais quando uma procedure executada e
elimina esses recursos quando feito o retorno da procedure executada, seno voltaria fora do
escopo. Entretanto, o WebSpeed permite criar e eliminar alguns recursos dinmicos
explicitamente. Para o WebSpeed, isto aplicado para o contexto de procedures externas
(procedures persistentes) dos objetos WEB.
Normalmente, o escopo do ltimo recurso dinmico do momento da criao at o momento de
sua eliminao, ou no fim da sesso do Agente do WebSpeed, independente de qual ocorrer
primeiro. Quando o bloco da procedure completado e seu contexto fica fora do escopo, isto
no afeta o escopo de qualquer recurso dinmico que tenha sido criado no contexto. Completar
as procedures pode somente afetar se o recurso ainda est acessvel no contexto
remanescente.
O WebSpeed permite definir gerenciamentos na maioria dos recursos dinmicos. Esses
gerenciadores so variveis que apontam para o recurso criado. necessrio assegurar que
os gerenciamentos desses recursos, esto sempre disponveis aplicao at o recurso ser
eliminado. Se o contexto for criado para uma procedure persistente e no for eliminado
explicitamente, o contexto permanece no escopo enquanto durar a sesso do Agente, no
importando possveis acessos feitos por um Client. Caso o endereo original do contexto da
procedure seja perdido, no ser mais possvel acess-lo novamente, ficando em memria
sem a possibilidade de ser eliminado explicitamente.
SPEEDSCRIPT
Tipo Retorno
Descrio
Lgico
Retorna TRUE se existe qualquer mensagem na fila
para um grupo especfico ou para todos os grupos.
get-messages
Caracter
Retorna qualquer mensagem da fila para um grupo
especfico ou todos os grupos. Opcionalmente pode
eliminar uma mensagem da fila.
get-message-groups Caracter
Retorna a lista de mensagens da fila separadas por
vrgula.
SPEEDSCRIPT
output-messages
Inteiro
queue-message
Inteiro
Tipo Retorno
Caracter
(Desconhecido ou ?)
Caracter
set-cookie
Caracter
Descrio
Elimina um Cookie especfico pelo seu nome, URL,
caminho e domnio na internet.
D um nome ao Cookie, retornando um ou mais valores
combinados, delimitados pelo valor da varivel global
WebSpeed SelDelim, separado por vrgula. Se o nome
do Cookie um valor desconhecido (?), retorna a lista
de todos os nomes de Cookies.
Retorna um cabealho Set-Cookie HTTP com opes
especficas e retorna o valor do Cookie especfico.
SPEEDSCRIPT
no comando de sada da TAG. Para gerao dos objetos WEB SpeedScript e HTML-Mapping,
o WebSpeed possui uma definio da procedure output-header padro que pode ser
modificada no editor do WebSpeed.
Query String na URL
Estes so usados para passar faixas de informaes, da requisio do CGI para valores
explcitos colocados nos links dinmicos. Existem diversas funes das APIs para facilitar a
construo e leitura das URLs.
Funes de APIs para URL
Funo
url-decode
Tipo Retorno
Descrio
Caracter
Decodifica o formato de entrada da URL de mtodos de
requisio GET e CGI POST ou valores de Cookies codificados e
retorna um texto decodificado.
url-encode Caracter
Codifica caracteres na URL por RFC 1738 sesso 2.2, disponvel
em:
URL:http://ds.internic.net/rfc/rfc1738.txt,
adicionando
caracteres ASCII entre 0 e 31 e entre 127 e 255. Opes podem
modificar a codificao para o Query Strings do endereo URL,
Cookies persistentes, ou um texto especfico de caracteres,
retornando o texto codificado.
url-field-list Caracter
Codifica uma lista de pares de Nomes/Valores de uma lista de
nomes cujos valores so recuperados de uma requisio corrente
de uma funo GET-VALUE. Parmetros incluem o nome da lista
e o delimitador. Retorna uma lista codificada de pares de
Nomes/Valores.
url-field
Caracter
Codifica pares de Nomes/Valores para usar como argumentos de
campos no URL. Parmetros incluem nomes, valores e
delimitadores para cada par. Retorna o par Nome/Valor
codificado.
url-format Caracter
Formata uma URL de uma URL base, lista de nomes e
delimitadores (A lista de nomes est codificada usando a url-fieldlist). Retorna a URL codificada.
As definies dessas funes esto em instalao-progress/src/web/method/cgiutils.i.
Para mais aplicaes, a funo url-format est na funo principal da API para construir URLs.
Esta funo chama as funes da tabela anterior. Para construir Query Strings na URL, devese tambm chamar a funo set-user-field para montar o par nome/valor para o Query Strings.
Para ler uma string de texto na URL, a funo mais comum e fcil para usar o get-value, que
pesquisa diversos fontes para o valor associado com o nome.
Query Strings da URL so limitados pela quantidade de informaes por URLs. Para uma
maior lista de dados que podem ser acumulados na aplicao, deve-se usar campos
escondidos.
Campos Escondidos no Form
Campos escondidos permitem passagens de parmetros praticamente inesgotvel nas
requisies WEB. Baseado na entrada de dados de um FORM possvel retornar valores de
campos como campos escondidos para uma prxima requisio WEB, isto mantm um registro
corrente de dados entre objetos WEB para objetos WEB e de Agentes para Agentes.
Funes para Campos Escondidos
Funo
Tipo Retorno
Descrio
SPEEDSCRIPT
hidden-field
Caracter
hidden-field-list Caracter
set-user-field
Tipo Retorno
Descrio
Caracter
Retorna o valor associado de um campo de usurio especfico
que foi setado com a funo set-user-field. Se um nome de
campo de usurio definido como desconhecido (?), a lista
inteira de campos de usurios retornada.
Caracter
Seta os valores associados para um campo de usurio
especfico. Os parmetros incluem os nomes e valores dos
campos. Se o nmero de campos menor ou igual a 255, a
funo retorna TRUE, seno retorna FALSE.
SPEEDSCRIPT
Funo
get-cgi
Tipo Retorno
Descrio
Caracter
Retorna o valor de uma varivel CGI especificada, ou retorna a
lista de todas as variveis CGI se o nome da varivel
especificada for um valor desconhecido (?). Retorna em branco
( ) se o nome invlido.
get-field
Caracter
Retorna um valor associado para um campo do form
especificado ou um Query Strings, ou retorna a lista de todos os
campos da form na requisio corrente se o nome do campo
especificado tem o valor desconhecido (?). Retorna branco ( ),
se o nome invlido.
get-value
Caracter
Retorno o primeiro valor disponvel associado com o nome de
um campo de usurio, um campo do form, um Query Strings ou
um cookie.Se o nome especificado tem o valor desconhecido (?),
retorna a lista de todos os campos do usurio e cookies. Retorna
branco ( ) se o nome invlido. Esta a funo mais usada.
html-encode Caracter
Converte vrios caracteres ASCII de uma string para uma
representao HTML. Retorna uma string HTML codificada. Esta
funo normalmente usada para construir uma sada HTML de
um programa SpeedScript. Entretanto, no se deve repetir a
execuo de uma string para evitar a corrupo de uma
codificao.
As definies dessas funes esto no instalao-progress/src/web/method/cgiutils.i.
Descrio
Seta e retorna o cabealho MIME Content-Type
seguido de uma linha em branco. Se o cabealho j
foi retornado, nenhuma ao tomada. Se o tipo do
contedo especificado branco, nenhum cabealho
SPEEDSCRIPT
output-http-header
get-config
Tipo Retorno
Descrio
Lgico
Retorna TRUE se o Agente do WebSpeed est sendo
executado em modo Development, Production ou
Evaluation. Caso contrrio, retorna FALSE.
Caracter
Retorna a configurao do valor especificado do
WebSpeed Transaction Server.
SPEEDSCRIPT
</HTML>
Exemplo localizado em: exemplo/capitulo5/exemplo07.html
<SERVER>
<%
<!--WSS
Comentrios
Suportado pela maioria das ferramentas.
SPEEDSCRIPT
SPEEDSCRIPT
<BODY>
<!--WSS FOR EACH customer
<TR>
<TD> `customer.custnum`
<TD> `customer.name`
<TD> `customer.phone`
</TR>
<!--WSS END. -->
</BODY>
</HTML>
Exemplo localizado em: exemplo/capitulo5/exemplo09.html
SPEEDSCRIPT
</SCRIPT>
</TABLE>
</CENTER>
</BODY>
</HTML>
Exemplo localizado em: exemplo/capitulo5/exemplo10.html
SPEEDSCRIPT
SPEEDSCRIPT
Nesta parte do exemplo, definido o ambiente local do objeto WEB, como as definies dos
preprocessadores. As execues da funo GET-FIELD retornam a entrada do usurio para
cada requisio.
No caso da linha com a funo GET-FIELD(NoJumpForm:U), a sua execuo retorna o valor
da Query String da URL.
Esta primeira sesso SpeedScript termina testando o valor de JumpFor para determinar o
formato de sada da prxima requisio. Como o SpeedScript termina em um bloco DO,
necessrio outra seqncia com outro bloco SpeedScript para finalizao desse bloco DO.
Definindo Forms
Aps o SpeedScript, um form HTML permite ao usurio especificar um nome de Customer, ou
ento o padro em ordem alfabtica.
SPEEDSCRIPT
A palavra SelfURL uma varivel global WebSpeed que fica em instalaoprogress/src/web/method/cgidefs.i que contm o URL do objeto WEB, apontando para o
diretrio ROOT do server. A varivel WEB local {&Filter-Field}-key, definida anteriormente,
especifica o filtro da QUERY do banco de dados. O preprocessador do Embedded SpeedScript
troca & por &, fazendo a referncia do preprocessador {&Filter-Field} aparecer no
cdigo fonte do objeto WEB. Para finalizar, a palavra jumpto-value o mais recente nome da
tabela de Customer especificada pelo usurio para iniciar a QUERY.
importante verificar que os preprocessadores usados na sesso HTML foram definidas no
SpeedScript anterior e so usados com a TAG de escape representada pela CRASE.
O FORM Jumpto inclui campos escondidos, inclusive repo-to com um valor diferente de zero
(0) para indicar que o FORM foi mostrado e o usurio o est submetendo para o retorno de
uma QUERY. Este bloco DO inicia com HTMLs definidos nos preprocessadores do
SpeedScript para iniciar uma tabela HTML centralizada que gerenciar a sada da QUERY em
10 itens (Result-Rows) por vez.
Alm do fechamento do bloco DO.
Gerenciamento de Blocos, Execues Condicionais e Tratamento de Registros na Query
SPEEDSCRIPT
Esta sesso SpeedScript inclui o cdigo atual para resolver, reposicionar e extrair os registros
da QUERY, baseados na entrada fornecida pelo usurio. Para simplificar a interao do
Embedded SpeedScript com o HTML, este cdigo do SpeedScript tambm inclui o HTML
necessrio para especificar cada registro na tabela do HTML para a query. A linha da tabela
mostrada pela referncia {&DISPLAY-FIELDS} localizada na parte mais de baixo do cdigo.
A parte do cdigo representada a seguir, mostra como interagir o cdigo do HTML e o cdigo
Embedded SpeedScript, concluindo a QUERY em um bloco DO:
SPEEDSCRIPT
Esta sesso inicia outro bloco DO que comea setando o contedo inicial da query String para
qualquer requisio para o painel de navegao, que ainda ir ser mostrada.
Construindo uma Query String e Encerrando a Pgina WEB
Para finalizar, o exemplo seguinte mostra a parte referente criao do painel de navegao e
o fim da pgina WEB:
SPEEDSCRIPT
SPEEDSCRIPT
SPEEDSCRIPT
Este HTML desenhar um formulrio Com opes de pesquisa e com as reas onde os dados
sero colocados aps a pesquisa.
SPEEDSCRIPT
SPEEDSCRIPT
SPEEDSCRIPT
SPEEDSCRIPT
Para verificar os valores das variveis atualizadas, possvel colocar no final do programa,
antes da tag </body> a impresso do contedo dessas variveis. Isso auxiliar a analisar os
valores indicados.
SPEEDSCRIPT
`
`
`
`
cTipoPesquisa `
cPesquisaPor `
cClassificado `
cPesquisa `
<br>
<br>
<br>
<br>
</body>
</html>
SPEEDSCRIPT
cPesquisa
</script>
= GET-VALUE("SubmitSearch").
SPEEDSCRIPT
cTipoPesquisa
cPesquisaPor
cClassificado
cPesquisa
`
`
`
`
cTipoPesquisa `
cPesquisaPor `
cClassificado `
cPesquisa `
<br>
<br>
<br>
<br>
</body>
</html>
Exemplo localizado em: exemplo/capitulo5/exemplo13-03.html
SPEEDSCRIPT
SPEEDSCRIPT
<TD ALIGN="RIGHT">*Quantidade</TH>
</TR>
<TR>
<TD> </TD>
<TD COLSPAN=3>
*Descritivo do item deve ser colocado aqui
</TD>
</TR>
</TABLE>
<!-- End of Results List -->
cTipoPesquisa
cPesquisaPor
cClassificado
cPesquisa
cWhere
cSort
`
`
`
`
`
`
cTipoPesquisa `
cPesquisaPor `
cClassificado `
cPesquisa `
cWhere `
cSort `
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
Exemplo localizado em: exemplo/capitulo5/exemplo13-04.html
6 Adicionando a query dinmica de item para o HTML. Para este item, ser adicionada uma
linha com a criao da query usando a varivel HANDLE hQueryItem j definida.
Aps os comandos CASES adicionados para especificar a clusula WHERE e SORT, deve ser
adicionado a lgica para setar o BUFFER da query e preparar a mesma para ser aberta,
obedecendo as variveis cWhere e cSort.
Neste tpico, ainda deve ser adicionado um novo bloco SpeedScript para comandar a abertura
da query. Isto deve ser feito antes do cdigo HTML mostrar os registros.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta name="SQLWorks " content="Treinamento WebSpeed">
<title>Itens Existentes</title>
</head>
<!-- Insert code for the ouput-headers sub-procedure here */ -->
<body>
<script language="SpeedScript">
/*-----------------------------------------------------------------Arquivo: item.htm
Descritivo: Pesquisar os registros da tabela Item
-------------------------------------------------------------------*/
DEFINE VARIABLE cTipoPesquisa AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPesquisaPor AS CHARACTER NO-UNDO.
DEFINE VARIABLE cClassificado AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPesquisa
AS CHARACTER NO-UNDO.
DEFINE VARIABLE iItem
AS INTEGER
NO-UNDO.
DEFINE VARIABLE hQueryItem
AS HANDLE
NO-UNDO.
DEFINE VARIABLE cWhere
AS CHARACTER NO-UNDO.
DEFINE VARIABLE cSort
AS CHARACTER NO-UNDO.
DEFINE VARIABLE lPesquisa
AS LOGICAL
NO-UNDO.
CREATE QUERY hQueryItem.
/*
Atualizao das variveis para armazenar os campos de entrada do
formulrio. A funo GET-VALUE busca os valores dos campos no
formulrio ou que podem ter sido armazenados para um cookie em
SPEEDSCRIPT
SPEEDSCRIPT
<TD>
<INPUT TYPE="Submit" NAME="SubmitSearch" Value="Pesquisa">
</TD>
</TR>
</TABLE>
</FORM>
<!-- End of Search Form -->
<script language="SpeedScript">
hQueryItem:QUERY-OPEN.
</script>
<!-- Results List -->
<TABLE WIDTH="90%" ALIGN="Center" BORDER="1">
<TR>
<TH WIDTH="20%">Numero do Item</TH>
<TH WIDTH="40%">Nome do Item</TH>
<TH WIDTH="20%">Valor</TH>
<TH WIDTH="20%">Quantidade</TH>
</TR>
<TR>
<TD><B>*Numero do Item</B></TD>
<TD>*Nome do Item</TD>
<TD ALIGN="Right">Valor</TD>
<TD ALIGN="RIGHT">*Quantidade</TD>
</TR>
<TR>
<TD> </TD>
<TD COLSPAN=3>
*Descritivo do item deve ser colocado aqui
</TD>
</TR>
</TABLE>
<!-- End of Results List -->
cTipoPesquisa
cPesquisaPor
cClassificado
cPesquisa
cWhere
cSort
`
`
`
`
`
`
cTipoPesquisa `
cPesquisaPor `
cClassificado `
cPesquisa `
cWhere `
cSort `
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
Exemplo localizado em: exemplo/capitulo5/exemplo13-05.html
7 Criar um processo de repetio para mostrar todos os registros lidos pela query e adicionar
propriedades dinamicamente do item. Para essa repetio sero necessrios dois novos blocos
SpeedScript. O primeiro iniciando o bloco e o segundo fechando o mesmo.
Para concluir esse passo, substituir os textos que esto representando os campos pelos
prprios campos da tabela item usando o escape crase. Esta lgica deve ser adicionada aps
a abertura da QUERY.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta name="SQLWorks " content="Treinamento WebSpeed">
<title>Itens Existentes</title>
</head>
<!-- Insert code for the ouput-headers sub-procedure here */ -->
SPEEDSCRIPT
<body>
<script language="SpeedScript">
/*-----------------------------------------------------------------Arquivo: item.htm
Descritivo: Pesquisar os registros da tabela Item
-------------------------------------------------------------------*/
DEFINE VARIABLE cTipoPesquisa AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPesquisaPor AS CHARACTER NO-UNDO.
DEFINE VARIABLE cClassificado AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPesquisa
AS CHARACTER NO-UNDO.
DEFINE VARIABLE iItem
AS INTEGER
NO-UNDO.
DEFINE VARIABLE hQueryItem
AS HANDLE
NO-UNDO.
DEFINE VARIABLE cWhere
AS CHARACTER NO-UNDO.
DEFINE VARIABLE cSort
AS CHARACTER NO-UNDO.
DEFINE VARIABLE lPesquisa
AS LOGICAL
NO-UNDO.
CREATE QUERY hQueryItem.
/*
Atualizao das variveis para armazenar os campos de entrada do
formulrio. A funo GET-VALUE busca os valores dos campos no
formulrio ou que podem ter sido armazenados para um cookie em
uma primeira execuo.
*/
ASSIGN cTipoPesquisa = GET-VALUE("SearchType")
cPesquisaPor = GET-VALUE("SearchFor")
cClassificado = GET-VALUE("SortBy")
cPesquisa
= GET-VALUE("SubmitSearch").
CASE cClassificado:
WHEN "ItemNum" THEN
ASSIGN cSort = " BY Item.ItemNum".
WHEN "ItemName" THEN
ASSIGN cSort = " BY Item.ItemName".
OTHERWISE DO:
END.
END CASE. /* Classificao */
CASE cTipoPesquisa:
WHEN "ItemNum" THEN
ASSIGN cWhere = "WHERE Itemnum = " + cPesquisaPor.
WHEN "ItemName" THEN
ASSIGN cWhere = "WHERE ItemName CONTAINS '" + cPesquisaPor + "'".
WHEN "CatDescription" THEN
ASSIGN cWhere = "WHERE CatDescription CONTAINS '" +
cPesquisaPor + "'".
OTHERWISE DO:
END.
END CASE. /* cTipoPesquisa */
hQueryItem:SET-BUFFERS(BUFFER Item:Handle).
hQueryItem:QUERY-PREPARE("PRESELECT EACH ITEM " + cWhere + cSort).
</script>
<!-- Search Form -->
<FORM NAME="PesquisaItem" METHOD="Post">
<TABLE ALIGN="Center" BORDER="1">
<TR ALIGN="CENTER">
<TD COLSPAN="8">Pesquisa de Itens</TD>
</TR>
<TR>
<TD>Tipo de Pesquisa</TD>
<TD>
<SELECT NAME="SearchType">
SPEEDSCRIPT
SPEEDSCRIPT
cTipoPesquisa
cPesquisaPor
cClassificado
cPesquisa
cWhere
cSort
`
`
`
`
`
`
cTipoPesquisa `
cPesquisaPor `
cClassificado `
cPesquisa `
cWhere `
cSort `
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
Exemplo localizado em: exemplo/capitulo5/exemplo13-06.html
8 importante adicionar verificaes para garantir que a entrada de dados feita pelo usurio
no possua erros para criar as clusulas de pesquisa. Existem basicamente 3 tipos de
verificaes que sero feitas nesse exemplo:
Se a QUERY possue dados aps sua abertura(Cdigo colocado aps a abertura da
query).
Se o campo Pesquisado Por possui um valor diferente de nulo.
Se a pesquisa for feita pelo nmero do item, este deve ser numrico.
O mtodo que trata mensagens deve ser usado para retornar mensagens de erro e avisos para
os eventos acima relacionados. Em caso de erro, uma varivel lgica dever ser atualizada
para determinar qual a sada deve ser mostrada.
Existe ainda uma lgica verificando o atributo NUM-RESULTS igual a ZERO (0) para o
evento de POST. Isto evitar que o programa inicia pesquisando todos os registros, pois como
a condio da QUERY ainda no foi criada, todos os registros sero lidos, podendo causar
lentido, dependendo da quantidade de registros no Banco de Dados. Como na primeira
execuo do programa um evento GET, a condio tambm no aceita, evitando a leitura
desnecessria de registros.
As mensagens foram criadas atravs dos mtodos QUEUE-MESSAGES, AVAILABLEMESSAGES e GET-MESSAGES.
No final do HTML deve existir outro bloco SpeedScript para finalizar os blocos de validaes
abertos.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta name="SQLWorks " content="Treinamento WebSpeed">
<title>Itens Existentes</title>
</head>
<!-- Insert code for the ouput-headers sub-procedure here */ -->
<body>
<script language="SpeedScript">
/*-----------------------------------------------------------------Arquivo: item.htm
Descritivo: Pesquisar os registros da tabela Item
-------------------------------------------------------------------*/
DEFINE VARIABLE cTipoPesquisa AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPesquisaPor AS CHARACTER NO-UNDO.
DEFINE VARIABLE cClassificado AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPesquisa
AS CHARACTER NO-UNDO.
DEFINE VARIABLE iItem
AS INTEGER
NO-UNDO.
DEFINE VARIABLE hQueryItem
AS HANDLE
NO-UNDO.
DEFINE VARIABLE cWhere
AS CHARACTER NO-UNDO.
DEFINE VARIABLE cSort
AS CHARACTER NO-UNDO.
DEFINE VARIABLE lPesquisa
AS LOGICAL
NO-UNDO.
SPEEDSCRIPT
SPEEDSCRIPT
<TR>
<TD>Tipo de Pesquisa</TD>
<TD>
<SELECT NAME="SearchType">
<OPTION Value="ItemNum" ` IF cTipoPesquisa = "ItemNum"
THEN "SELECTED" ELSE "" `>Item</OPTION>
<OPTION Value="ItemName" ` IF cTipoPesquisa = "ItemName"
THEN "SELECTED" ELSE "" `>Nome</OPTION>
<OPTION Value="CatDescription" ` IF cTipoPesquisa = "CatDescription"
THEN "SELECTED" ELSE "" `>Descritivo do Item</OPTION>
</SELECT>
</TD>
<TD>Pesquisado por</TD>
<TD>
<INPUT TYPE="TEXT" Name="SearchFor"
LENGTH="30" VALUE="` cPesquisaPor `">
</TD>
<TD>Classificado por</TD>
<TD>
<SELECT NAME="SortBy">
<OPTION VALUE="ItemNum" ` IF cClassificado = "ItemNum"
THEN "SELECTED" ELSE "" `>Item</OPTION>
<OPTION VALUE="ItemName" ` IF cClassificado = "ItemName"
THEN "SELECTED" ELSE "" `>Nome</OPTION>
</SELECT>
</TD>
<TD>
<INPUT TYPE="Submit" NAME="SubmitSearch" Value="Pesquisa">
</TD>
</TR>
</TABLE>
</FORM>
<!-- End of Search Form -->
<script language="SpeedScript">
IF lPesquisa THEN DO:
hQueryItem:QUERY-OPEN.
IF hQueryItem:NUM-RESULTS = 0 AND REQUEST_METHOD = "POST" THEN
queue-message("Pesquisa","No existe dados para essa pesquisa.<br>").
/* Mostrar resultado se existir */
IF hQueryItem:NUM-RESULTS > 0 THEN DO:
</script>
<!-- Results List -->
<TABLE WIDTH="90%" ALIGN="Center" BORDER="1">
<TR>
<TH WIDTH="20%">Numero do Item</TH>
<TH WIDTH="40%">Nome do Item</TH>
<TH WIDTH="20%">Valor</TH>
<TH WIDTH="20%">Quantidade</TH>
</TR>
<script language="SpeedScript">
REPEAT:
hQueryItem:GET-NEXT.
IF (hQueryItem:QUERY-OFF-END) THEN LEAVE.
</script>
<TR>
<TD><B>` Item.ItemNum `</B></TD>
<TD>` Item.ItemName `</TD>
<TD ALIGN="Right">` Item.Price `</TD>
<TD ALIGN="RIGHT">` Item.OnHand `</TD>
</TR>
<TR>
<TD> </TD>
<TD COLSPAN=3>
SPEEDSCRIPT
` Item.CatDescription `
</TD>
</TR>
<script language="SpeedScript">
END. /* REPEAT */
</script>
</TABLE>
<!-- End of Results List -->
<script language="SpeedScript">
END. /* If hQueryItem:Num-Results > 0 */
END. /* IF lPesquisa */
IF available-messages("ItemSearch") THEN DO:
{&OUT} '<CENTER><B><FONT COLOR="RED">' get-messages("ItemSearch", TRUE)
'</FONT></B></CENTER>'.
END. /* if available-messages */
</script>
cTipoPesquisa
cPesquisaPor
cClassificado
cPesquisa
cWhere
cSort
`
`
`
`
`
`
cTipoPesquisa `
cPesquisaPor `
cClassificado `
cPesquisa `
cWhere `
cSort `
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
Exemplo localizado em: exemplo/capitulo5/exemplo13-07.html
9 Uma procedure interna ser criada para setar cookies. Esses cookies armazenaram os
valores dos campos do HTML. Para isso um bloco de SpeedScript deve ser criado no incio do
HTML, antes da tag de BODY. Esses cookies iro manter salvas as ltimas entradas nos
campos de pesquisa e classificao.
Para que a QUERY no seja aberta na reexecuo do browser, deve ser feito o tratamento da
requisio. Assim, ao reexecutar o browser, apenas os campos aparecem com valores, mas
para abrir a query, necessrio clicar no boto de pesquisa.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta name="SQLWorks" content="Treinamento WebSpeed">
<title>Itens Existentes</title>
</head>
<!-- Insert code for the ouput-headers sub-procedure here */ -->
<script language="SpeedScript">
PROCEDURE output-headers:
set-cookie("SearchType", GET-VALUE("SearchType"), TODAY + 365,?,?,?,?).
set-cookie("SearchFor", GET-VALUE("SearchFor"), TODAY + 365,?,?,?,?).
set-cookie("SortBy", GET-VALUE("SortBy"), TODAY + 365,?,?,?,?).
END PROCEDURE.
</script>
<body>
<script language="SpeedScript">
/*-----------------------------------------------------------------Arquivo: item.htm
Descritivo: Pesquisar os registros da tabela Item
-------------------------------------------------------------------*/
DEFINE VARIABLE cTipoPesquisa AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPesquisaPor AS CHARACTER NO-UNDO.
DEFINE VARIABLE cClassificado AS CHARACTER NO-UNDO.
SPEEDSCRIPT
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
cPesquisa
iItem
hQueryItem
hBufferItem
cWhere
cSort
lPesquisa
AS
AS
AS
AS
AS
AS
AS
CHARACTER
INTEGER
HANDLE
HANDLE
CHARACTER
CHARACTER
LOGICAL
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
SPEEDSCRIPT
SPEEDSCRIPT
</TR>
<TR>
<TD> </TD>
<TD COLSPAN=3>
` Item.CatDescription `
</TD>
</TR>
<script language="SpeedScript">
END. /* REPEAT */
</script>
</TABLE>
<!-- End of Results List -->
<script language="SpeedScript">
END. /* If hQueryItem:Num-Results > 0 */
END. /* IF lPesquisa */
IF available-messages("ItemSearch") THEN DO:
{&OUT} '<CENTER><B><FONT COLOR="RED">' get-messages("ItemSearch", TRUE)
'</FONT></B></CENTER>'.
END. /* if available-messages */
</script>
cTipoPesquisa
cPesquisaPor
cClassificado
cPesquisa
cWhere
cSort
`
`
`
`
`
`
cTipoPesquisa `
cPesquisaPor `
cClassificado `
cPesquisa `
cWhere `
cSort `
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>
Exemplo localizado em: exemplo/capitulo5/exemplo13-08.html
CGI WRAPPER
6. CGI Wrapper
6.1. CONHECENDO O CGI WRAPPER
O cdigo fonte do objeto WEB CGI Wrapper um arquivo (.w) SpeedScript, sem estar
associado a nenhum cdigo fonte HTML. O Rcode criado pela compilao do programa fonte
(.w) executado pelo agente do WebSpeed. Quando o objeto WEB CGI Wrapper executado,
um arquivo HTML criado dinamicamente com as informaes corretas para serem mostradas
em um browser.
O CGI Wrapper utiliza o preprocessador {&OUT} na procedure interna process-web-request
para gerar uma pgina WEB (HTML) vlida. Este HTML final possui um cabealho gerado pelo
prprio CGI Wrapper.
Para usar o CGI Wrapper, existe uma template no AppBuilder prpria para isso. Esta template
possui o corpo do SpeedScript para gerar e criar um arquivo HTML para o browser.
Neste exemplo, o comando SKIP no causa quebra de linha no browser. Isso feito pelas tags
<BR> dos textos montados.
CGI WRAPPER
Definitions
Nesta rea devem ser adicionadas todas as definies de variveis, parmetros e objetos que
devero ser usados pelo programa.
Main Block
O Main Block inicializa variveis e executa procedures e funes que devem ser disparadas
logo na execuo do programa, como o caso da procedure interna Process-Web-Request.
No Main Block, pode-se colocar todo o cdigo que deve ser executado antes ou depois da
execuo da procedure Process-Web-Request. Basicamente, isso faz com que parte do cdigo
seja colocada antes da sada do HTML e parte depois.
Procedure OutputHeader
Esta procedure interna semelhante procedure interna Output-Header usada no
SpeedScript. Nesta procedure interna possvel setar alguns cookies e outros estados de uma
requisio WEB. Esta procedure interna executada dentro de outra procedure interna; a
Process-Web-Request.
A principal diferena dessa procedure interna em relao a existente no modelo SpeedScript,
que essa procedure interna j vem includa automaticamente no template CGI Wrapper.
Procedure Process-Web-Request
Esta a principal procedure interna do CGI Wrapper, pois ela que inicia a gerao da sada
HTML para a pgina WEB. Nesta procedure esto as tags que iniciam uma pgina (<HTML>,
<HEAD> e <BODY>) assim como as respectivas tags que encerram a pgina (</BODY>,
</HEAD> e </HTML>). No intervalo entre essas tags deve ser colocado todo o texto referente
montagem da pgina WEB.
nesta procedure interna que a lgica referente leitura dos dados deve ser feita, e a sada
dessas informaes deve ser feita direcionada para WEB, com o uso do {&OUT} por exemplo.
CGI WRAPPER
4. OutputHeader
5. Process-Web-Request (Aps a execuo da procedure interna OutputHeader)
6. Main Block (Aps a execuo da procedure interna Process-Web-Request).
1 Seleo da template CGI Wrapper. Como uma template padro para auxiliar o
desenvolvimento dos programas, selecion-la no AppBuilder. Para isto, acessar o boto NEW
ou as opes FILE e NEW do menu.
Ao abrir a janela de opes, selecionar o CGI Wrapper. Esta opo trar uma template com
definies iniciais.
CGI WRAPPER
2 Para este programa, algumas variveis devem ser criadas. Essas variveis devem ser
usadas para utilizao de cookies e atribuio de valores para os totais.
Seo DEFINITIONS
/*-----------------------------------------------------------------------Arquivo : compras.p
Descrio: Carrinho de Compras em CGI Wrapper
Autor
: SQLWorks Consultoria Ltda.
------------------------------------------------------------------------*/
/*
This .W file was created with the Progress AppBuilder.
*/
/*----------------------------------------------------------------------*/
/* Create an unnamed pool to store all the widgets created
by this procedure. This is a good default which assures
that this procedure's triggers and internal procedures
will execute in this procedure's storage, and that proper
cleanup will occur on deletion of the procedure. */
CREATE WIDGET-POOL.
/* *************************** Definitions
/* Parameters Definitions --/* Local Variable Definitions --DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
VARIABLE
cStatusCorrente
iOrdemCorrente
iClienteCorrente
iItemCorrente
iQtdeCorrente
dePrecoTotal
iOrderLine
AS
AS
AS
AS
AS
AS
AS
************************** */
*/
*/
CHARACTER
INTEGER
INTEGER
INTEGER
INTEGER
DECIMAL
INTEGER
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
NO-UNDO.
A varivel cStatusCorrente possui valores que representam o que foi processado. Como a cada
processo, todo o programa executado novamente, importante identificar qual ao se
deseja realizar. Essa varivel possui um desses 4 valores.
Valor Armazenado
Descrio
SelecionandoCliente Nmero do cliente entrado
AdicionandoLinha
Selecionando um nmero de item para adicionar
CGI WRAPPER
EditandoLinha
Confirmando
=
=
=
=
=
GET-VALUE("StatusCorrente")
INT(GET-VALUE("ClienteCorrente"))
INT(GET-VALUE("OrdemCorrente")).
INT(GET-VALUE("ItemCorrente")) NO-ERROR.
INT(GET-VALUE("Qtde")) NO-ERROR.
CGI WRAPPER
AdicionandoLinha
EditandoLinha
CGI WRAPPER
CGI WRAPPER
{&OUT} cStatusCorrente.
{&OUT}
"</BODY>":U SKIP
"</HTML>":U SKIP.
END PROCEDURE.
Exemplo localizado em: exemplo/capitulo6/exemplo14-02.p
CGI WRAPPER
CGI WRAPPER
'<HR>'
SKIP.
END PROCEDURE.
Exemplo localizado em: exemplo/capitulo6/exemplo14-05.p
Com a criao da procedure OrderHeader, este erro de execuo est solucionado. Entretanto,
outro erro apresentado na execuo do programa, pois a procedure piSelecionandoCliente
no foi criada.
8 Criar a procedure interna OutputErrors. Esta procedure ir mostrar as mensagens enfileiras
pela funo get-messages().
A execuo dessa procedure colocada na procedure Process-Web-Request, logo aps o
comando CASE e antes da sada do OrderLines.
/*---------------------------------------------------------------------------Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------------*/
IF available-messages("OrdemEntrada") THEN DO:
{&OUT} '<CENTER><B><FONT COLOR="RED">'
get-messages("OrdemEntrada", TRUE)
'</FONT></B></CENTER>'.
END. /* if available-messages */
END PROCEDURE.
Exemplo localizado em: exemplo/capitulo6/exemplo14-06.p
CGI WRAPPER
Esta procedure tambm possui a criao do boto de confirmao chamado getItem com o
valor Add.
/*---------------------------------------------------------------------------Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------------*/
{&OUT} '<TABLE BORDER="1">'
SKIP
'<TR>'
SKIP
'<TD>Item Number:</TD>'
SKIP
'<TD><INPUT TYPE="TEXT" NAME="ItemCorrente"></TD>'
SKIP
'<TD><INPUT TYPE="SUBMIT" NAME="GetItem" VALUE="Add"></TD>' SKIP
'</TR>'
SKIP
'</TABLE>'
SKIP.
END PROCEDURE.
Exemplo localizado em: exemplo/capitulo6/exemplo14-08.p
CGI WRAPPER
12 Criar a procedure interna piOrderLines. Esta procedure interna para criar uma tabela com
linhas para cada order-line que foi adicionada ordem corrente. Nesta procedure tambm ser
criado um boto de delete para eliminar o item existente.
Como para cada linha existe um boto de delete, necessrio ter um campo HTML escondido
contendo o nmero da linha a ser eliminada. Como existe um boto para cada linha, somente a
linha onde est o boto ser eliminada.
Est lgica ainda possui algumas caractersticas:
As linhas do cabealho e do rodap, que possui um totalizador, ficam fora do escopo
do loop da leitura dos Order-Line.
Para cada linha criado um campo escondido no formulrio para armazenar o nmero
da linha.
O acumulado dos preos mostrado na ltima linha da tabela.
O item encontrado para cada linha da ordem, tem sua descrio impressa.
/*---------------------------------------------------------------------------Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------------*/
IF CAN-FIND(FIRST OrderLine WHERE
OrderLine.OrderNum = iOrdemCorrente) THEN DO:
{&OUT} '<HR>'
SKIP
'<TABLE WIDTH="100%" BORDER="1">' SKIP
'<TR>'
SKIP
'<TH WIDTH="15%"> </TH>'
SKIP
'<TH WIDTH="15%">Linha</TH>'
SKIP
'<TH WIDTH="15%">Item</TH>'
SKIP
'<TH WIDTH="20%">Preo</TH>'
SKIP
'<TH WIDTH="15%">Qtde</TH>'
SKIP
'<TH WIDTH="20%">Extendido</TH>' SKIP
'</TR>'
SKIP.
FOR EACH OrderLine WHERE OrderLine.OrderNum = iOrdemCorrente NO-LOCK:
ASSIGN dePrecoTotal = dePrecoTotal + OrderLine.ExtendedPrice.
FIND Item WHERE Item.ItemNum = OrderLine.ItemNum NO-LOCK NO-ERROR.
{&OUT} '<TR>'
SKIP
'<FORM METHOD="POST">'
SKIP
'<TD ALIGN="CENTER">'
SKIP
'<INPUT TYPE="Submit"
Name="LineAction"
Value="Delete">'
SKIP
'<INPUT Type=Hidden
Name="LineNum"
Value="' OrderLine.LineNum '">'
SKIP
'</TD>'
SKIP
'<TD ALIGN="CENTER">' OrderLine.LineNum '</TD>'
SKIP
'<TD ALIGN="CENTER">' OrderLine.ItemNum '</TD>'
SKIP
'<TD ALIGN="RIGHT">'
STRING(OrderLine.Price, "$>>>>>9.99")
'</TD>'
SKIP
'<TD ALIGN="CENTER">' OrderLine.Qty '</TD>'
SKIP
'<TD ALIGN="RIGHT">'
STRING(OrderLine.ExtendedPrice, "$>>>>>>9.99")
'</TD>'
SKIP
'</TR>'
SKIP
'<TR>'
SKIP
'<TD COLSPAN="2"> </TD>'
SKIP
'<TD COLSPAN="4">' Item.CatDescription '</TD>'
SKIP
'</FORM></TR>'
SKIP.
END.
CGI WRAPPER
{&OUT} '<TR>'
'<TD COLSPAN="4"> </TD>'
'<TD ALIGN="Right"><B>Total</B></TD>'
'<TD ALIGN="Center"><B>'
String(dePrecoTotal, "$>>>>>>9.99")
'</B></TD>'
'</TR>'
SKIP
SKIP
SKIP
SKIP
SKIP.
13 Quando o boto de delete for disparado, dois pares de nomes e valores so submetidos
com o formulrio para o item. O primeiro nomeado como LineAction e tem o valor de Delete
e o segundo tem o nome de LineNum e tem o valor do nmero da linha, que um campo
escondido.
Para realizar o delete, a funo get-value() deve ser usado para identificar quando o boto de
delete foi clicado. O cdigo MAIN BLOCK deve ser alterado depois do comando de atualizao
para receber o cdigo de delete do registro e deve alterar a varivel cStatusCorrente para
ItemEliminado.
/* ************************ Main Code Block *********************** */
/* Atualizao de variveis de cookies ou campos */
ASSIGN cStatusCorrente
iClienteCorrente
iOrdemCorrente
ASSIGN iItemCorrente
ASSIGN iQtdeCorrente
=
=
=
=
=
GET-VALUE("StatusCorrente")
INT(GET-VALUE("ClienteCorrente"))
INT(GET-VALUE("OrdemCorrente")).
INT(GET-VALUE("ItemCorrente")) NO-ERROR.
INT(GET-VALUE("Qtde")) NO-ERROR.
/* Delete Action */
IF GET-VALUE("LineAction") = "DELETE" THEN DO TRANS:
FIND OrderLine WHERE OrderLine.OrderNum = iOrdemCorrente AND
OrderLine.LineNum = INT(GET-VALUE("LineNum"))
EXCLUSIVE-LOCK NO-ERROR.
IF AVAILABLE OrderLine THEN
DELETE OrderLine.
queue-message("OrdemEntrada","A OrderLine foi eliminado").
ASSIGN cStatusCorrente = "ItemEliminado".
END.
/* Altera o cStatusCorrente da ltima requisio para um novo Status e
monta as mensagens e erros para serem mostrados */
CASE cStatusCorrente:
WHEN "" THEN DO:
/* Set to Select Customer */
ASSIGN cStatusCorrente = "SelecionandoCliente".
END. /* When "" */
WHEN
/*
IF
/*
CGI WRAPPER
ASSIGN iClienteCorrente = ?.
END. /* IF ERROR-STATUS:ERROR */
END. /* IF GET-VALUE("ClienteCorrente") */
/* Se o cliente est disponvel, criar uma nova ordem para o ele */
IF iClienteCorrente <> ? THEN DO:
IF CAN-FIND(Customer WHERE CustNum = iClienteCorrente) THEN DO:
CREATE ORDER.
ASSIGN ORDER.CustNum
= iClienteCorrente
IOrdemCorrente = Order.OrderNum
cStatusCorrente = "AdicionandoLinha".
END. /* IF CAN-FIND(Customer) */
ELSE
queue-message("EntradaOrdem", "Cliente no existe.").
END. /* IF iClienteCorrente <> ? */
END. /* WHEN "SelectingCustomer */
WHEN "AdicionandoLinha" THEN DO:
/* Pegar o nmero do item corrente da entrada de dados */
ASSIGN iItemCorrente = INT(GET-VALUE("ItemCorrente")) NO-ERROR.
IF iItemCorrente > 0
AND
CAN-FIND(Item WHERE Item.ItemNum = iItemCorrente) THEN
ASSIGN cStatusCorrente = "EditandoLinha".
ELSE DO:
IF GET-VALUE("AcaoCorrente") = "" OR
GET-FIELD("ItemCorrente") > "" THEN
queue-message("EntradaOrdem","Item no encontrado.").
END. /* ELSE DO: */
END. /* WHEN "AdicionandoLinha" */
WHEN "EditandoLinha" THEN DO:
/* Pega a quantidade do campo de entrada e o item de um campo escondido */
IF iQtdeCorrente > 0 THEN DO:
/* Se a quantidade apropriada, cria uma nova linha para a ordem */
CREATE OrderLine.
FIND Item WHERE Item.ItemNum = INT(GET-VALUE("ItemCorrente"))
NO-LOCK NO-ERROR.
ASSIGN iOrderLine
= proximaOrderLine(iOrdemCorrente)
OrderLine.ItemNum
= Item.ItemNum
OrderLine.ExtendedPrice = iQtdeCorrente * Item.Price
OrderLine.LineNum
= iOrderLine
OrderLine.OrderNum
= iOrdemCorrente
OrderLine.Price
= Item.Price
OrderLine.Qty
= iQtdeCorrente
cStatusCorrente
= "AdicionandoLinha".
END. /* IF iQtdeCorrente > 0 */
ELSE
queue-message("OrdemEntrada","Entrar com uma quantidade vlida.").
END. /* WHEN "EditandoLinha" */
WHEN "EliminandoItem" THEN DO:
ASSIGN cStatusCorrente = "AdicionandoLinha".
END. /* WHEN "EliminandoItem" */
OTHERWISE DO:
END. /* OTHERWISE DO */
END CASE.
/* Localizar registro corrente para Customer e Order */
IF iClienteCorrente <> ? THEN
FIND Customer WHERE Customer.CustNum = iClienteCorrente NO-LOCK NO-ERROR.
IF iOrdemCorrente <> ? THEN
FIND ORDER WHERE Order.OrderNum = iOrdemCorrente NO-LOCK NO-ERROR.
/* Process the latest Web event. */
RUN process-web-request.
Exemplo localizado em: exemplo/capitulo6/exemplo14-11.p
CGI WRAPPER
=
=
=
=
=
GET-VALUE("StatusCorrente")
INT(GET-VALUE("ClienteCorrente"))
INT(GET-VALUE("OrdemCorrente")).
INT(GET-VALUE("ItemCorrente")) NO-ERROR.
INT(GET-VALUE("Qtde")) NO-ERROR.
CGI WRAPPER
Como o cookie ClienteCorrente alterado e depois recuperado com a funo GETVALUE(ClienteCorrente), o Customer existente usado para criar outra ordem e a varivel
cStatusCorrente alterada para AdicionandoLinha.
15 Criar a procedure interna piConfirmado. Essa procedure dever mostrar informaes das
ordens e atualizar as datas das mesmas.
CGI WRAPPER
/*---------------------------------------------------------------------------Purpose:
Parameters: <none>
Notes:
----------------------------------------------------------------------------*/
FIND Order WHERE Order.Order-Num = iOrdemCorrente EXCLUSIVE-LOCK NO-ERROR.
ASSIGN Order.Order-Date = TODAY.
FOR EACH Order-Line WHERE Order-Line.Order-Num = iOrdemCorrente NO-LOCK:
ASSIGN dePrecoTotal = dePrecoTotal + Order-Line.Extended-Price.
END.
{&OUT} '<TABLE ALIGN="Center" BORDER="1">'
SKIP
'<TR>'
SKIP
'<TD>Nmero do Cliente</TD>'
SKIP
'<TD>' Order.Cust-Num '</TD>'
SKIP
'</TR>'
SKIP
'<TR>'
SKIP
'<TD>Order Number</TD>'
SKIP
'<TD>' Order.Order-Num '</TD>'
SKIP
'</TR>'
SKIP
'<TR>'
SKIP
'<TD>Order Date</TD>'
SKIP
'<TD>' Order.Order-Date '</TD>'
SKIP
'</TR>'
SKIP
'<TR>'
SKIP
'<TD>Order Total</TD>'
SKIP
'<TD>' STRING(dePrecoTotal, "$>>>>>>9.99") '</TD>' SKIP
'</TR>'
SKIP
'<TR>'
SKIP
'<TD COLSPAN="2">'
'<INPUT TYPE=SUBMIT
NAME="NovaOrdem"
VALUE="Entrar com outra Ordem">'
SKIP
'</TD>'
SKIP
'</TR>'
SKIP
'</TABLE>'
SKIP.
END PROCEDURE.
Exemplo localizado em: exemplo/capitulo6/exemplo14-13.p
HTML MAPPING
7. HTML Mapping
7.1. HTML MAPPING
O HTML Mapping possibilita o mapeamento de um layout de um arquivo HTML com os campos
de tabelas de um banco de dados. O SpeedScript gerado processa o gerenciamento da
entrada e sada de dados entre o layout do HTML e os campos do banco de dados. O HTML
Mapping separa a interface de design do HTML da procedure do SpeedScript que interage com
os dados.
HTML MAPPING
O passo seguinte solicita o nome do HTML que dever ter o FORM a ser usado. Este nome
pode ser digitado, estando atento ao PROPATH, ou pesquisado pelo boto BROWSE.
Aps indicar o HTML de interface, deve-se selecionar onde os dados devero ser pesquisados.
Esta seleo pode ser de um SmartDataObject ou selecionando diretamente a tabela do banco
de dados. No exemplo proposto, ser selecionada uma tabela do banco de dados. Neste caso,
a opo DATABASE e o boto DEFINE QUERY devem ser selecionados. Ao clicar no boto, a
janela QUERY BUILDER ser aberta para auxiliar na escolha da tabela e suas condies para
montar a QUERY desejada.
HTML MAPPING
O prximo passo auxilia no processo de mapear os campos. Isso pode ser feito
automaticamente, clicando no boto AUTOMAP FIELDS, onde a template tentar
automaticamente relacionar os campos do form do HTML com os campos da tabela
correspondente no banco de dados. Isto possvel caso os nomes dos campos usados no
HTML sejam iguais aos campos das tabelas.
HTML MAPPING
Para os campos que devem ser selecionados manualmente, basta selecionar o campo
desejado e clicar no boto MAP FIELD. Por exemplo, caso o campo CUSTNUM estiver
selecionado, ao clicar nessa opo, a janela FIELD SELECTOR aparece escolher qual campo
de qual tabela e de qual banco de dados ser feito o mapeamento.
Por fim o programa deve ser salvo e compilado para poder ser executado.
HTML MAPPING
Aps salvar o programa, o arquivo OFF criado automaticamente, onde gravado o tipo do
campo e a localizao de cada objeto no HTML. O arquivo .OFF criado com o mesmo nome
do arquivo salvo pelo HTML e WebSpeed.
Ao ser executado, o HTML mapeado usa o arquivo offset para determinar onde devem ser
inseridos os valores dos dados no HTML que gerado. Os nmeros no final de cada linha
indicam onde o campo inicia e termina do form. Entretanto, qualquer alterao no layout do
HTML, ocasionar a necessidade de criar novamente o arquivo de OFFSET. Isto pode ser feito
alterando o prprio arquivo .OFF ou criando novamente o arquivo pelo HTML Mapping Wizard
ou ainda, abrindo o arquivo no AppBuilder.
HTML MAPPING
No programa criado pelo HTML Mapping, existe uma procedure chamada htmOffSets. Esta
procedure responsvel por criar a associao entre os campos do form do HTML e os
campos do banco de dados.
Procedure PROCESS-WEB-REQUEST
Apenas associar o HTML aos campos do banco de dados no suficiente. importante
identificar o ponto onde o comando FIND usado para localizar os registros a serem
pesquisados. Porm, ao usar o HTML Mapping Wizard, a query criada adicionada como uma
OVERRIDE para a procedure findRecords.
A procedure PROCESS-WEB-REQUEST executa diversas procedures para controlar o fluxo de
informaes entre o Client e o objeto WEB e entre o objeto WEB e o fonte dos dados, seja esse
o banco de dados ou uma SmartDataObjects. As procedures ASSIGNFIELDS,
DISPLAYFIELDS e outras podem ser sobrepostas (OVERRIDE) por locais, podendo
customizar o comportamento padro destas procedures. O agente do WebSpeed primeiro
verificar pelas procedures locais e somente depois, se executado, pesquisar pelas Super
Procedures. Alm disso, as seqncias dos processos dependem do form do HTML, isto ,
dependem dos mtodos GET e POST. Quando a requisio vem do cliente pelo GET,
adicionada a URL do objeto WEB. Inicialmente o GET faz uma requisio e retorna um form em
branco. O POST envia os dados para o objeto WEB, onde normalmente usado aps um GET.
Para localizar os registros escritos no campo de CustNum e selecionados pelo boto Localizar,
necessrio colocar o comando FIND na procedure PROCESS-WEB-REQUEST. Entretanto,
se torna necessrio comentar a execuo da procedure findRecords.
HTML MAPPING
HTML MAPPING
Outra maneira de escrever o comando FIND utilizando a funo GET-VALUE que retorna o
valor da pgina WEB. Para o uso desta funo, no necessrio referenciar ao Buffer.
HTML MAPPING
Visualmente, o programa adicionar alguns botes para que os registros sejam navegados e
alterados.
HTML MAPPING
HTML MAPPING
HTML MAPPING
HTML MAPPING
Alterao de Registros
O processo para salvar o registro alterado no form da pgina WEB, depender da releitura do
registro usando o LOCK adequado (EXCLUSIVE-LOCK), verificar se existe algum usurio
travando esse registro, usando a funo LOCKED e por fim, verificando se o usurio est ou
no disponvel.
HTML MAPPING
HTML MAPPING
Aps a criao do HTML e da SDO, a template a ser usada a HTML Mapping. Esta template
solicitar o nome do arquivo HTML que ser usado. Este HTML ter os campos que sero
mapeados.
HTML MAPPING
Aps selecionar o HTML a ser usado, importante referenciar qual a SDO a ser usada.
importante ressaltar que a SDO deve ter sido criada anteriormente.
Aps selecionar o nome da SDO a ser usada, ser mostrada na janela do HTML Mapping
Wizard os campos existentes no HTML que podem ser mapeados nos campos existentes na
SDO.
HTML MAPPING
Entretanto, bom ressaltar que nem todos os campos do HTML so obrigados a existir na
SDO e nem todos os campos da SDO so obrigados a existir no HTML. Apenas os campos
que so coincidentes sero mapeados.
No exemplo proposto, apenas 8 campos, os que foram definidos no HTML, sero mapeados
com a SDO ao clicar no boto Automap Fields.
HTML MAPPING
Aps acompanhar o Wizard desta template, o programa final criado com os mapeamentos j
desenvolvidos.
HTML MAPPING
HTML MAPPING
HTML MAPPING
HTML MAPPING
Outra forma de abrir uma stream no nomeada padro direcionando para a WEB:
de sada para a WEB, podendo ser organizada como stream multi-frames de pginas. Stream
de pginas no so pginas WEB, mas sesses lgicas da pgina WEB contendo um ou mais
frames SpeedScript.
Os frames SpeedScript e as pginas com multi-frame Stream so estruturas que o WebSpeed
usa para formar uma nica pgina WEB para uma nica requisio. As frames SpeedScript no
retornam simplesmente sucessivas pginas WEB individuais, tais como aparecerem muitos
conjuntos de resultados na pesquisa WEB, elas provem um meio de dividir e estruturar uma
nica pgina WEB usando o comando DISPLAY e outros comandos SpeedScript.
O conceito de Stream aplicado tanto para o comando DISPLAY como para o comando PUT
para indicar a sada dos dados. Entretanto, apenas o comando DISPLAY realiza o tratamento
de frame no SpeedScripts.
possvel formatar o comando de sada DISPLAY usando dois meios:
Opes de pginas do comando OUTPUT TO WEB para gerar pginas com mltiplas
frames.
Atributos HTML no contexto WEB especificando o HTML para suportar ou modificar o
formato das frames no SpeedScript e nas pginas.
Opes de Pginas no Comando OUTPUT TO WEB
PAGED: Gera uma pgina de sada WEB com 56 linhas no Stream.
PAGE-SIZE <Nmero de Linhas>: Gera uma pgina de sada com o nmero de linhas
especificado no comando para o frame.
Para abrir uma Stream de sada no nomeada com 25 linhas, necessrio fazer:
OUTPUT TO WEB PAGE-SIZE 25.
Cada Stream contm a seguinte sada ordenada e organizada em uma das trs sesses, mas
todas com um nmero de linhas especificadas para a Stream:
1 Qualquer contedo de um frame PAGE-TOP no SpeedScript ativada por um Stream de
OUTPUT corrente. Caso contrrio, o Stream comea com a segunda sesso.
2 Qualquer outro comando de sada, tipo DISPLAY ou PUT para o Stream de sada corrente.
Se a sada de DISPLAY para o frame do tipo DOWN do SpeedScript, os cabealhos com as
colunas podem ser impressos nos seguintes casos:
No incio da interao do bloco.
No incio do Stream da pgina ou imediatamente depois de qualquer sada do frame
PAGE-TOP.
Se a sada do DISPLAY para o frame do SpeedScript for diferente de um DOWN frame, todo o
contedo de um frame especfico mostrado para cada comando DISPLAY.
Toda sada na segunda parte do Stream continua at que o nmero de linha indicada inicie
qualquer outra frame PAGE-BOTTOM ativa ou depois da ltima linha do Stream. O que vier
primeiro. Se o atributo PAGE-BUTTOM do frame de sada estiver ativado, o Stream continua
at a terceira sesso. Caso contrrio, a Stream est completa.
3 Qualquer contedo de um frame do SpeedScript ativa com atributo PAGE-BOTTOM para o
Stream de sada corrente at que a pgina esteja completa.
O uso do comando DISPLAY ativa as frames SpeedScript com PAGE-TOP e PAGE-BOTTOM,
mas no mostram de imediato a frame, mas a deixa preparada para as sadas no ponto
HTML-FRAME-BEGIN
(Antes do Frame
SpeedScript)
do
HTML-FRAME-END
(Depois do Frame
SpeedScript)
do
HTML-HEADER-BEGIN
(Antes do cabealho de
colunas do frame do
SpeedScript )
HTML-HEADER-END
(Depois do cabealho de
colunas do frame do
SeepScript)
HTML-TITLE-BEGIN
(Antes do ttulo do frame
do SpeedScript)
HTML-TITLE-END
(Depois do ttulo do frame
do SpeedScript)
HTML-END-OF-PAGE
(Entre as Streams)
Descrio
Os caracteres padres para indicar uma nova linha so ~n ou
/n. Ainda possvel setar uma nova linha usando a tag <BR>.
Uma nova linha pode ser inserida a cada interao dos registros
em um frame do tipo DOWN.
O padro a tag <PRE>, mas se for alterado para outro, o
mesmo deve ser feito no HTML-FRAME-END.
Deve ser colocado apenas antes dos registros da interao
corrente do frame (DOWN) e no no cabealho das colunas. Pode
ser aplicado para qualquer SIDE-LABELS mostrada no frame,
sendo ou no um frame do tipo DOWN.
O padro a tag </PRE>, mas se o HTML-FRAME-BEGIN for
alterado, este tambm deve ser alterado para o mesmo.
Deve ser colocado no final da interao corrente dos registros do
frame do tipo DOWN.
O padro a tag <PRE>, mas se for alterado para outro, o
mesmo deve ser feito no HTML-HEADER-END.
Deve ser colocado no incio da sesso de cabealhos das colunas
do frame do tipo DOWN.
O padro a tag </PRE>, mas se o HTML-HEADER-BEGIN for
alterado, este tambm deve ser alterado para o mesmo.
Deve ser colocado no fim da sesso de cabealhos das colunas
do frame do tipo DOWN.
O padro estar sem texto de ttulo. Se este valor for alterado,
deve-se alterar o valor de HTML-TITLE-END.
Deve ser colocada antes do valor do ttulo do frame. Pode-se
setar atributos como cor e espessura para melhorar a leitura.
O padro estar sem texto, mas se o HTML-TITLE-BEGIN for
alterado, este tambm deve ser alterado para o mesmo.
Deve ser colocada aps o texto do ttulo do frame.
O padro <HR>. Deve ser colocada entre as Streams para
visualizar a quebra das sesses causadas pelas opes PAGED e
PAGE-SIZE to comando OUTPUT TO WEB. No afetando o
contador de linhas de cada Stream.
Apesar de opcional, permite que a definio do atributo seja feita na linha seguinte sem
considerar que seja uma nova linha, auxiliando na leitura do arquivo.
Definio do HTML
A definio inicia com o primeiro caracter depois do segundo delimitador de um mesmo atributo
HTML, a menos que seja iniciado com #. Caso existe o comentrio, a definio inicia com o
primeiro caracter da prxima linha. A definio pode continuar tantas linhas quantas desejadas,
at o terceiro delimitador que o indicativo da finalizao da definio do atributo. Caso
nenhum caracter seja colocado entre o segundo e o terceiro delimitador, a definio um valor
nulo.
Por exemplo:
# Exemplo usando comentrios no segundo delimitador
:HTML-FRAME-BEGIN:#
<FONT COLOR=BLUE>
<PRE>:
# Na prxima definio, o delimitador ser alterado de : para +
+HTML-FRAME-END+#
</PRE>
</FONT>+
Observe como os atributos HTML-FRAME-BEGIN e HTML-FRAME-END trocam a ordem das
tags de incio e fim seu perfeito funcionamento na pgina WEB.
No caso de uma definio de caracter nulo, fica:
:HTML-END-OF-LINE::
importante ressaltar que aps alterar ou criar o arquivo DISPLAY.DAT, necessrio reiniciar
o WebSpeed Transaction Server para que este arquivo tenha efeito.
cliente WEB que est no contexto da transao pode fazer outras requisies WEB,
incluindo requisies que usam outros Agentes. Entretanto, o tempo na transao
continua contando enquanto o browser est realizando outras requisies. O tempo
pode terminar caso o usurio no continue na transao que estava realizando as
alteraes.
Enquanto o Agente estiver atendendo as requisies para uma transao WebSpeed,
requisies feitas para a mesma URL, por outros clientes WEB, no podem ser servidos por
este Agente at a transao corrente terminar. O Agente preso continua servindo ambos
requisies state-aware e stateless da transao do cliente.
primrio que gerencia todas as requisies e inicializa as chamadas para todos os outros
objetos WEB secundrios na transao.
No possvel usar Embedded SpeedScript como objetos WEB primrios, porque no podem
explicitamente tornar-se state-aware. Entretanto, podem ser aplicaes state-persistent como
objetos WEB secundrios. Sendo assim, os objetos WEB primrios devem ser CGI Wrapper ou
HTML-Mapping.
1 O browser (WEB Client) executa diretamente somente o objeto WEB primrio (Web Object
A). O cliente WEB pode fazer chamadas repetitivas para o objeto WEB primrio, at o fim da
transao.
2 O objeto WEB A pode:
as requisies WEB. Este framework possui um mecanismo padro para mover os dados entre
as pginas mapeadas e o objeto WEB. Em ambos os casos, possvel modificar as verses do
process-web-request para a aplicao.
A lista de campos do usurio define um conjunto de pares de Nome/Valor para serem usados
na aplicao. A lista de campos do usurio fica disponvel para todos os objetos que esto
sendo executados no Agente.
A funcionalidade dos campos de usurios totalmente dependente da necessidade da
aplicao, como, por exemplo, passar parmetros entre objetos WEB que esto sendo
executados no mesmo Agente para uma mesma requisio WEB (ou transao WebSpeed, se
o Agente estiver locado).
Para criar e acessar explicitamente os campos de usurios, o WebSpeed possui as funes
set-user-field e get-user-field.
alterar o mtodo de requisio do objeto WEB chamado para GET e ainda permitir o objeto
recuperar qualquer dado vindo de um POST anterior.
Ao alterar o mtodo de requisio de POST para GET para um objeto WEB chamado, o
desenvolvedor deve alterar o mtodo de requisio de volta para um POST quando o objeto
WEB retornar para o chamador.
Tambm possvel recuperar os dados independentemente do mtodo de requisio. Para isto
deve-se usar a funo get-value( ). Esta funo retorna o valor de qualquer item nomeado, se
veio de uma QUERY STRING ou entrada padro.
Como os objetos WEB no cuidam de onde suas entradas vm, necessrio construir a
aplicao WebSpeed baseando-se em lgicas de requisio nos valores retornados pela
funo get-value( ) e ignorar o mtodo inputFields inteiramente ou sobrescreve-lo.
A menos que seja desejado resetar o REQUEST_METHOD, ou se o objeto WEB secundrio
state-aware, possvel executar diretamente o objeto WEB secundrio.
Cada item gravado no Record Buffer de acordo com o tipo de dado do SpeedScript que
definido por uma varivel correspondente ou campo de tabela.
Movimentao de Dados para o inputFields
Para os dados colocados nos campos do formulrio, no momento de uma requisio, o
inputField recupera os valores de todos os campos existentes no arquivo tagmap.dat, os
colocando nos seus campos correspondentes do Frame Buffer. O inputFields faz isso
executando o web.input padro definido para cada tipo do elemento do formulrio. Lembrando
ainda que o web.input pode ser customizado usando o Section Editor do AppBuilder.
Movimentao de Dados para o assignFields
Cada campo no Frame Buffer corresponde pelo nome a um elemento no HTML. Cada campo
tambm correspondente para o nome de varivel ou campo de tabela no Record Buffer. A
movimentao dos valores do Frame Buffer para o Record Buffer obedecendo o tipo de dados.
Se um campo de tabela no for selecionado, o AppBuilder pode definir uma varivel com um
nome similar ao nome do elemento correspondente no formulrio ou definido pelo prprio
desenvolvedor e setar o campo fonte no AppBuilder para o usurio.
importante ressaltar que o assignFields move apenas dados de campos do objeto que
possuem a propriedade ENABLE setada como YES, que o padro. Esta propriedade pode
ser alterada pelo AppBuilder.
Transaes Atualizadas
Em qualquer ponto que o Agente Transacional ou o objeto WEB atualiza a transao corrente
do banco de dados (ou subtransao), qualquer registro do banco de dados alterado durante a
transao ser gravado no banco de dados, incluindo registros alterados pelo assignFields ou
pelo SpeedScript diretamente.
Localizando Registros
Para uma requisio WEB, o retorno tpico de uma query do banco de dados de 1 registro (ou
um registro por tabela no JOIN) com os valores mapeados nos campos do objeto. Geralmente,
o comando FIND usado para executar a leitura do registro. Entretanto, pode ser necessrio
requerer outro arquivo de I/O ou clculos para fornecer os valores das variveis locais ou
campos dos usurios no objeto que tambm so mapeados para a requisio. Ainda possvel
recuperar registros de qualquer lugar, customizando as procedures locais ou sobrescrevendo
as ADM-Events.
Movimentao de Dados para o displayFields
O displayFields move os valores de variveis e campos do Record Buffer para o Frame Buffer,
convertendo todos os valores para caracter. possvel ainda trocar a opo de FORMAT do
banco de dados usando as janelas de propriedades no AppBuilder. O displayFields movimenta
somente dados para os campos que possuem a propriedade de DISPLAY como YES, que o
padro. Este atributo pode ser alterado nas janelas de propriedades do AppBuilder.
Efeitos do enableFields
O enableFields modifica o atributo SENSITIVE dos campos no Frame Buffer. Se esta
propriedade for setada como NO, os campos ficam visveis como TEXT e ficam incapacitados
de receber qualquer interao de entrada de dados por ao do web.output.
O enableFields somente habilita campos para entrada de dados que foram setado o ENABLE
como YES. Este atributo pode ser alterado nas janelas de propriedades do AppBuilder.
Definitions
************************** */
*/
*/
************************* */
A include hmapmain.i contm um cdigo padro que executado a cada momento que um
objeto WEB stateless executado e a primeira vez que um objeto state-aware executado:
/* The CLOSE event can be used from inside or outside the procedure to */
/* terminate it. */
ON CLOSE OF THIS-PROCEDURE
RUN destroy.
/* Now enable the interface and wait for the exit condition. */
/* (NOTE: handle ERROR and END-KEY so cleanup code will always fire. */
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK,
LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON STOP UNDO MAIN-BLOCK,
LEAVE MAIN-BLOCK:
/* Load the HTM handles etc. */
RUN initialize.
/* Process the current web event. */
RUN process-web-request.
END.
/* Run the local/adm-destroy procedures, if the procedure is ending. */
IF NOT THIS-PROCEDURE:PERSISTENT THEN RUN destroy.
Este cdigo primeiramente registra uma chamada para a procedure DESTROY como uma
trigger de SpeedScript. (ON CLOSE do objeto WEB).
Cdigos iniciais para o fonte, podem ser melhores aproveitados em uma procedure de
INITIALIZE local do que no prprio MAIN BLOCK.
A procedure DESTROY original remove todos os traos do objeto WEB da memria.
Entretanto, possvel sobrescrever essa procedure para realizar qualquer outra atividade de
limpeza necessria antes do objeto WEB ser fechado definitivamente. Em aplicaes statepersistent isto mais comum para gerenciar uma finalizao mais recente de transaes de
banco de dados com mltiplas pginas.
A procedure de inicializao realiza um nmero de atualizao de dados que so necessrios
antes do objeto WEB ser executado. possvel sobrescrever este evento para adicionar
qualquer tarefa que deva ser executado apenas uma nica vez antes de executar o processweb-request.
Caso o cdigo seja inserido diretamente no MAIN BLOCK, antes ou depois da inicializao
ocorrer e executar o process-web-request bom lembrar que este cdigo executa apenas uma
nica vez para objetos WEB state-aware. Cada tempo adicional que o Agente Transacional ou
outro objeto WEB executa usando a procedure run-web-object, somente o process-web-request
executado por um objeto WEB at o time-out. Quando o time-out ocorrer, a procedure
DESTROY ser executada.
O arquivo tagmap.dat contm campos HTML definidos que especificam o tipo do elemento
HTML no formulrio e tags customizados usados por todos os objetos WEB em uma aplicao.
O WebSpeed possui um arquivo tagmap.dat padro que suporta elementos HTML no
formulrio comuns. possvel adicionar ou modificar estas definies de campos. A definio
padro inclui o elemento HTML no formulrio especificando com as tags <INPUT>,<SELECT>
e <TEXTAREA>.
Cada campo HTML possui uma definio por linha no arquivo tagmap.dat como mostrado na
sintaxe a seguir:
tag-name,[tag-encerramento],[tipo-atributo],tipo-objeto,[caminho-utilitrio]
Onde:
tag-name
Nome que identifica a tag HTML, onde em um formulrio INPUT, SELECT ou TEXTAREA.
Para uma tag customizada, geralmente um nome no formulrio de um HTML comentado, tipo
!-- MinhaTag. Usando comentrios para definir tags customizados minimiza a chance de
conflitos em verses futuras do HTML. Alm disso, as tags customizadas, diferente dos
elementos do formulrio, podem aparecer em qualquer lugar do HTML.
tag-encerramento
Nome da tag para fechar tags no HTML onde necessrio, tipo /TEXTAREA
tipo-atributo
O atributo TYPE para as tags <INPUT> e qualquer tag customizada ou futuras tags HTML que
necessitam um atributo TYPE como o TEXT ou HIDDEN.
tipo-objeto
O tipo do campo no SpeedScript que est no HTML ou tipo do tag customizado mapeado. Os
campos SpeedScript suportados so EDITOR, FILL-IN, RADIO-SET, TOGGLE-BOX e
SELECTION-LIST. No padro, estes tipos correspondem aos elementos HTML no formulrio o
Quando o utilitrio TagExtract gera o arquivo de offset para esta pgina WEB, usando o
arquivo tagmap.dat padro, o seguinte offset gerado:
/* HTML offsets */
htm-file= /working-directory-path/ncust-wo.htm
version= AB_v19r1
field[1]= "cust-prompt,INPUT,text,fill-in,11,1,11,45"
field[2]= "matching-cust-names,SELECT,,selection-list,21,1,21,53"
field[3]= "Name,INPUT,text,fill-in,26,10,26,47"
field[4]= "Phone,INPUT,text,fill-in,27,8,27,46"
field[5]= "Comments,TEXTAREA,,editor,28,11,28,63"
field[6]= "Country,INPUT,radio,radio-set,31,5,31,43"
field[7]= "Country,INPUT,radio,radio-set,32,7,32,45"
field[8]= "HasOrders,INPUT,checkbox,toggle-box,33,13,33,50"
O arquivo de offset registra cada tag mapeado (campo) na ordem de ocorrncias no arquivo
HTML. Para cada tag (field[6]), registrado o nome do atributo (COUNTRY), TYPE (INPUT),
visualizao no HTML (RADIO), o tipo do campo correspondente no SpeedScript (RADIO-SET)
do tagmap.dat e 4 inteiros que registram a linha inicial, caracter inicial, linha final e caracter final
da especificao da tag no arquivo HTML (31,5,31,43).
Para muitas aplicaes, o tagmap funciona perfeitamente usando as tags padres. Entretanto,
possvel recolocar o web.input e web.output padro para qualquer tag usando o template
como mostrado a seguir:
web.input
/*-----------------------------------------------------------------------Purpose: Assigns form field data value to frame screen value.
Parameters: p-field-value
Notes:
------------------------------------------------------------------------*/
DEFINE INPUT PARAMETER p-field-value AS CHARACTER NO-UNDO.
DO WITH FRAME {&FRAME-NAME}:
END.
END PROCEDURE.
web.output
/*-----------------------------------------------------------------------Purpose: Output the value of the field to the WEB stream
in place of the HTML field definition.
Parameters: p-field-defn
Notes:
------------------------------------------------------------------------*/
DEFINE INPUT PARAMETER p-field-defn AS CHARACTER NO-UNDO.
DO WITH FRAME {&FRAME-NAME}:
END.
END PROCEDURE.
Cada template passa os mesmo parmetros para toda tag. Para o web.input, isto o valor de
entrada corrente associado com a tag, expressado como caracter. Este valor atualmente a
sada da funo get-field() para o campo NAME HTML.
Para o web.output o parmetro o tag HTML completo especificado para o campo do arquivo
fonte HTML. Para um valor de sada, deve-se acessar o atributo SCREEN-VALUE do
SpeedScript do campo associado com a tag. possvel referenciar o atributo usando o nome
completo do campo do objeto. O nome do campo sempre tem o mesmo nome como o atributo
NAME para o tag associado (recolocando os espaos com underlines e removendo qualquer
caracter SpeedScript ilegal). Deste modo, para o campo NAME do HTML, possvel acessar o
valor do Frame Buffer usando NAME:SCREEN-VALUE.
Se o campo SpeedScript um RADIO-SET, o web.output executa uma vez para cada item do
objeto. Um segundo parmetro (o nmero do item) tambm passado dentro do control
handler.
Colocando os cdigos dentro do bloco DO padro garante que o objeto propriamente
referenciado no frame do SpeedScript. importante notar que, se o campo mapeado para um
campo de tabela, o nome do objeto pode ser prefixado pelo banco de dados e nomes de
tabelas separados por ponto (por exemplo, sports.customer.name), dependendo da
configurao do AppBuilder.
Finalmente, quando estiver criando tags customizadas, possvel criar seu prprio utilitrio
tagmap, como webinput.p. Entretanto, muito comum contar com o web.input e web.output no
objeto WEB, ao invs de definir um utilitrio em separado para a tag. Isto funciona quando o
tag customizado mapeia para campos padres do SpeedScript objetos como FILL-IN.
Em geral, quando o usurio submete uma requisio de uma pgina retornada por um objeto
alterado para timed-out, a requisio contm no HTML incluso o cookie WSEU. O Transaction
Server retorna a seguinte mensagem:
The Web object to which you were attached has timed out. Please start again.
Neste exemplo, a aplicao seta o campo do usurio Application-State para No-MoreChanges quando estiver pronto para proceder time-out. Caso contrrio, quando qualquer timeout neste objeto WEB ocorrer, o perodo renovado para mais 60 minutos.
preciso ateno na lgica para verificar o cdigo usado para executar a procedure timingOut
padro. Caso essa procedure no seja executada nunca, o Agente que est executando o
objeto WEB state-aware permanecer locado porque o perodo ser sempre resetado.
possvel forar o time-out executando o setWebState na procedure outputHeader com o valor
igual a zero para o time-out.
Neste exemplo, para cada interao do bloco FOR EACH, uma transao ser iniciada no
bloco da procedure piExemplo, pois alm de ter o comando EXCLUSIVE-LOCK, existem
comandos para manipular registros para alterar seus valores no banco de dados.
Porm se o comando FOR EACH usar o EXCLUSIVE-LOCK, a transao ser iniciada no FOR
EACH. A procedure estar dentro desta transao. Neste exemplo, apenas no final da
interao do FOR EACH que a transao ser encerrada e os dados gravados.
FOR EACH customer EXCLUSIVE-LOCK:
RUN piExemplo(customer.state).
END.
PROCEDURE piExemplo:
DEFINE INPUT PARAMETER pState AS CHARACTER NO-UNDO.
FIND state WHERE state.state = pState EXCLUSIVE-LOCK NO-ERROR.
IF NOT AVAILABLE state THEN DO:
CREATE state.
ASSIGN state.state = pState.
UPDATE state.state-name
state.region.
END.
END PROCEDURE.
10.2. SUB-TRANSAES
Uma sub-transao iniciada quando uma transao para um bloco j est ativa. importante
ressaltar que uma sub-transao um bloco dentro do outro bloco que tem uma transao. Se
um erro ocorre na sub-transao, toda alterao feita neste bloco desfeita, mas no
necessariamente a transao principal tenha o mesmo tratamento. Entretanto, para as
informaes alteradas da sub-transao serem gravadas, dependem da finalizao correta da
transao principal.
Podem existir diversos nveis transacionais dentro de um programa:
Bloco de uma procedure que executada a partir de um bloco transacional.
Cada interao de um FOR EACH que altere registros dentro de uma transao.
Cada interao de um REPEAT que altere registros dentro de uma transao.
Cada interao de um DO TRANSACTION, DO ON ERROR ou DO ON ENDKEY que
altere registros dentro de uma transao.
criar esse bloco transacional, necessrio usar o comando TRANSACTION nos blocos DO,
FOR EACH e REPEAT:
DO TRANSACTION:
FOR EACH TRANSACTION:
REPEAT TRANSACTION:
Caso j exista uma transao ativa, uma nova transao no ser aberta.
10.4.1. Sub-Procedures
Se uma transao for iniciada no programa principal, esta transao permanece ativa mesmo
quando esta procedure principal executar outras procedures, at mesmo outras procedures
externas.
FOR EACH customer EXCLUSIVE-LOCK:
RUN piExemplo(customer.state).
END.
PROCEDURE piExemplo:
DEFINE INPUT PARAMETER pState AS CHARACTER NO-UNDO.
FIND state WHERE state.state = pState EXCLUSIVE-LOCK NO-ERROR.
IF NOT AVAILABLE state THEN DO:
CREATE state.
ASSIGN state.state = pState.
UPDATE state.state-name
state.region.
END.
END PROCEDURE.
A transao foi iniciada no bloco FOR EACH e termina no comando END. Como a execuo da
procedure interna est dentro da transao, toda lgica existente na procedure est dentro da
transao. As alteraes realizadas na procedure executada sero gravadas apenas se a
interao do FOR EACH for encerrado corretamente. Caso contrrio, mesmo que a procedure
interna tenha realizada sua funcionalidade com exatido, caso o bloco FOR EACH seja
finalizado com erro, as informaes alteradas na procedure interna sero canceladas.
Criar uma nica transao e fazer que todo o processo de gravao do arquivo texto
esteja nessa transao, ao invs de uma transao para cada linha lida do arquivo.
Entretanto, a transao pode ficar extremamente longa afetando a concorrncia e o
tamanho do arquivo Before Image (BI).
Por meio de programao, determinar se o registro a ser gravado j foi lido ou no,
mantendo assim uma transao por linha lida do arquivo, mas a lgica de programao
pode ser tornar mais complexa.
AND
THEN
transaction block */
web-utilities-hdl("Incapaz de realizar a transao").
Deve-se conectar todos os bancos de dados afetados pela transao prioritariamente antes de
iniciar uma transao. Como uma regra geral, no se deve conectar um banco de dados dentro
de uma transao. A conexo do banco de dados pode travar registros em outros bancos de
dados afetados pela transao por um tempo consideravelmente longo. Alm do que uma
conexo de banco de dados pode falhar tambm causando um erro na transao. O
WebSpeed retarda o comando DISCONNECT em uma transao at que a transao esteja
completada ou desfeita.
O WebSpeed possui uma gerao de um objeto WEB HTML que permite iniciar e finalizar
transaes de mltiplas pginas.
Existe um exemplo no diretrio WebSpeed do Progress chamado tran-tst.w. Este programa
permite os campos CUST-NUM e NAME da tabela CUSTOMER. Existem botes para alterar o
objeto entre State-Aware e Stateless. Alm de botes para setar o estado da transao para
START, UNDO, RETRY e COMMIT.
2 Pressionar Start duas vezes (o segundo acesso ocorre quando o estado da transao est
ACTIVE).
3 Pressionar UNDO, RETRY ou COMMIT quando no tiver nenhuma transao ativa.
Este cdigo mostra um novo nome para Customer. Entretanto, a alterao ser
desfeita com o fim da transao.
Lembrar de considerar o caso do time-out do Agente. Isto tambm forar um UNDO
da transao em mltiplas pginas.
A imagem a seguir ilustra um modelo simplificado do fluxo da transao de mltiplas pginas
do WebSpeed:
EXECUTANDO APLICAES
EXECUTANDO APLICAES
Como descrito anteriormente, alguns arquivos HTML e imagens usadas podem nunca ser
processadas pelo WebSpeed. Estes arquivos so estticos se mantendo fixos do incio ao fim
da aplicao. possvel colocar estes arquivos no servidor WEB para que este possa ser
servido diretamente para o usurio. Entretanto, se o HTML gerado dinamicamente, estes
HTMLs devem ficar visveis para o Broker e os Agentes. O mais simples seria colocar estes
arquivos no diretrio de trabalho ou em algum diretrio do PROPATH.
Arquivos de Classes do Java
Os arquivos de classe do Java podem ser colocados em sub-diretrios do diretrio raiz do
servidor WEB, podendo ser referenciados no atributo CODEBASE da tag APPLET e o arquivo
de classe Java no atributo CODE da tag APPLET. Por exemplo, no arquivo de classe do Java,
sqlworks.class est no sub-diretrio java_classes do diretrio raiz do servidor WEB. Neste
caso, a tag ficaria:
<APPLET CODE=sqlworks.class CODEBASE=/java_classes></APPLET>
Arquivos JavaScripts
Estes arquivos JavaScripts (.js) devem ser colocados em um sub-diretrio do diretrio raiz do
servidor WEB, devendo referenciar o caminho relativo no atributo SRC da tag SCRIPT. Por
exemplo, no arquivo JavaScript sqlworks.js est no sub-diretrio javascript do diretrio raiz do
servidor WEB, ficando:
<SCRIPT LANGUAGE=JavaScript SRC=/javascript/sqlworks.js></SCRIPT>
TAGMAP.DAT
Se o arquivo padro alterado, a cpia modificada do tagmap.dat deve ser colocada no
diretrio de trabalho. Mas apenas se houver alterao do arquivo.
Arquivos de OFFSET
O arquivo de OFFSET (.off) criado quando o AppBuilder mapeia o arquivo HTML para um
objeto WEB. Os agentes usam as informaes deste arquivo para gerar dinamicamente uma
pgina HTML. Seu propsito dar a localizao dos campos de form do HTML para o arquivo
HTML. Para garantir que os Agentes localizem o arquivo de OFFSET, eles devem ser
colocados no diretrio onde o objeto WEB (r-code) est sendo executado. Se o arquivo de
OFFSET no o arquivo corrente de mapeamento para o objeto WEB HTML-Mapping, o
Agente cria um novo OFFSETa partir do arquivo HTML mapeado e do tagmap.dat disponvel.
EXECUTANDO APLICAES
EXECUTANDO APLICAES
EXECUTANDO APLICAES
Se o browser utlizado no suportar Persistent State Cookies, o valor do WSDebug Cookie ser
branco.
Outras opes so:
ON = Habilita todos os debugs.
OFF = Desabilita todos os debugs.
ALL = ON.
Tambm possvel especificar mltiplas opes para debugar na URL. Qualquer das opes
listadas acima podem ser combinadas. Por exemplo, para testar caracterstica State-Aware,
deve-se:
http://webserver/cgi-bin/webapp.cgi/webapp.w?debug=agent,cookies,http
Isto retorna a sada do arquivo webapp.w seguido por sesses de debugger. Caso seja
desejado o form Debugging e Administration, a opo Admin deve ser especificada
explicitamente a menos que as opes genricas, on e all sejam usadas. Tambm
possvel especificar esta lista no campo de opes Current Debug das opes do Form
Debugging e Administrative.
Desligar o debug similar a ligar. Basta clicar no link da opo do Debugging e Administrative
ou especificar debug=off como argumento na URL. Basta ento recarregar o browser.
Informao Especfica do Agente
Esta sesso contm informaes especficas para o processo Agente que gerencia as
requisies.
Persistent State Cookies
Esta sesso contm uma lista de todos os nomes de cookies recebidos pelo browser e o valor
de cada um.
Cabealhos de HTTP Enviados
Esta sesso lista todos os cabealhos HTTP enviados para o browser (Por exemplo, SetCookie: e Content-Type:). Esta sesso deve mostrar somente se a opo HTTP especificada
na URL ou na Form Administration.
Variveis Diversas (Micelneas)
Esta sesso contm variveis usadas internamente pelo WebSpeed Transaction Server, que
pode tambm ser usado na aplicao WebSpeed. A varivel SelfURL sempre a URL da
pgina corrente (exceto os argumentos), e a varivel AppURL a URL da sua aplicao. Essas
variveis so derivadas das variveis de ambiente SCRIPT_NAME e PATH_INFO.
Variveis de Ambiente
Esta sesso contm todas as variveis de ambiente passadas para o processo do Messenger
do WEB Server. Muitas dessas variveis so herdadas pelo WEB Server onde foi iniciada.
Outras variveis so alteradas de requisio para requisio.
Form Fields
Esta sesso contm campos listados na forma pura que so retornadas pela funo get-field().
Esta sesso contm somente valores se a requisio o resultado do form de entrada ou se
qualquer argumento especificado seguindo o ? na URL.
EXECUTANDO APLICAES