Professional Documents
Culture Documents
Revisão: 27/04/2004
Abrangência
Versão 8.11
A Infra-Estrutura APWEBEX
Abrangência
Em um ambiente montado para atender à requisições via link .apw utilizando Working
Threads WEBEX , podemos nos utilizar dos seguintes alias virtuais :
HttpCookies
HttpGet
HttpPost
HttpHeadIn
HttpHeadOut
HttpSession
HttpCookies
HttpGet
HttpPost
HttpHeadIn
HttpHeadOut
Através deste alias virtual de retorno, podemos alterar ou criar um parâmetro no Header
de retorno HTTP do Protheus , a ser devolvido ào Browser solicitante de uma requisição
de processamento.
HttpSession
O alias virtual HttpSession foi criado para possibilitar a criação de variáveis 'session'
por usuário do site, com controle de identificação nativa da ferramenta através de um
cookie de identificação , chamado SESSIONID. No tópico 'Alias Virtual HttpSession' é
explicado em detalhes o funcionamento deste mecanismo.
Este recurso nos permite criar , atricuir conteúdo e consultar conteúdo de uma variável
relacionada ào usuário que está realizando uma requisição http. Podemos armazenar em
uma variável de Session os seguintes tipos de variáveis : A (array) , C (character) , D
(data), L (lógica) e N (numérica) . Não são suportados O (Objetos) e/ou B (Code
Blocks).
Abrangência
Utilização de Cookies
aInfo := HttpCookies->aCookies
For nI := 1 to len(aInfo)
// Mostra no console do Server todos os cookies recebidos.
conout('Cookie '+str(nI,3)+' = ' + aInfo[nI])
Next
Criando um Cookie
HttpCookies->MeuCookie := 'TESTE'
Abrangência
Consultando um Parâmetro
O retorno da consulta de um parâmetro pode ter dois tipos : NIL , caso o parâmetro não
tenha sido enviado , ou String , contendo o conteúdo do parâmetro. Por exemplo, vamos
realizar uma requisição a um link .apw , passando pela URL o parâmetro IMAGEM ,
com o contéúdo TESTE :
http://localhost/u_TesteGet.apw?imagem=teste&cor=azul
cImagem := HttpGet->imagem
cCor := HttpGet->cor
Podemos inserir também um tratamento default : Caso algum parâmetro não seja
enviado ( resulte NIL ) , assumimos um valor para o mesmo
Existe também uma propriedade do alias virtual HttpGet chamada aGets , onde
podemos recuperar um array de strings , contendo a lista com os nomes dos parâmetros
enviados pelo browser solicitante . Por exemplo :
aInfo := HttpGet->aGets
For nI := 1 to len(aInfo)
conout('GET '+str(nI,3)+' = '+aInfo[nI])
Next
04. Alias virtual HttpPost
Revisão: 08/12/2003
Abrangência
Consultando um Parâmetro
O retorno da consulta de um parâmetro pode ter dois tipos : NIL , caso o parâmetro não
tenha sido enviado , ou String , contendo o conteúdo do parâmetro. Por exemplo, vamos
realizar uma requisição a um link .apw , através de um formulário html com método
POST, partindo do Html abaixo :
<html><body>
<form method='POST' action='http://localhost/u_TstPost.apw'>
Teste : <input type='text' name='CODIGO' size='10'>
<hr>
<input type='submit'>
</form>
</body></html>
cCodigo := HttpPOST->Codigo
Existe também uma propriedade do alias virtual chamada aPost , onde podemos
recuperar um array de strings , contendo a lista com os nomes dos parâmetros enviados
pelo browser solicitante . Por exemplo :
aInfo := HttpPost->aPost
For nI := 1 to len(aInfo)
conout('POST '+str(nI,3)+' = '+aInfo[nI])
Next
05. Alias virtual HttpHeadIn
Revisão: 08/12/2003
Abrangência
Consultando um Parâmetro
O retorno da consulta de um parâmetro pode ter dois tipos : NIL , caso o parâmetro não
tenha sido enviado , ou String , contendo o conteúdo do parâmetro. Por exemplo, vamos
consultar o header http User-Agent , enviado pelo Browser solicitante contendo uma
String identiificando o modelo de Browser utilizado :
cUserAgent := Httpheadin->User_Agent
Devemos obter como retorno uma string parecida com a mostra abaixo :
Observação Importante :
Propriedades especiais
HttpHeadIn->aHeaders
HttpHeadIn->main
Retorna o nome da função chamda através da URL , sem a extensão e sem o host. Por
exemplo , ao chamar o link http://localhost/u_tstHEader.apw , o conteúdo de
HttpHeadin->main será 'u_tstHEader'
HttpHeadIn->REMOTE_ADDR
httpHeadIn->REMOTE_PORT
Abrangência
Através deste alias virtual de retorno, podemos alterar ou criar um parâmetro no Header
de retorno HTTP do Protheus , a ser devolvido ào Browser solicitante de uma requisição
de processamento.
A criação de uma linha no Header HTTP merece uma atenção especial, pois para que a
operação realizada com sucesso , o header deve ser criado antes de haver qualquer
processamento de APH / AHU, pois neste caso o Header de Retorno HTTP já teria sido
enviado ào browser solicitante.
07. Alias virtual HttpSession
Revisão: 08/12/2003
Abrangência
Para diferenciar os usuários que estão navegando num site, o Protheus busca por um
cookie identificador de usuário, retornado para o browser a cada requisição de link .
APW, chamado SESSIONID. Caso o Protheus receba este cookie, ele identifica quais
sessions pertencem a este usuário.
Quando criamos uma variável de session, ela pode ser acessada nas próximas
requisições provenientes deste mesmo usuário. Caso uma variável de session consultada
não exista, ela retorna o valor NIL (nulo). Vejamos os exemplos abaixo :
HttpSession->UserId := '123'
HttpSession->UserName := U_GetUserName()
Nas linhas acima , criamos uma session para o usuário atual , chamada UserId , com o
conteúdo do tipo String, e criamos outra session chamada UserName , com o retorno da
função U_GetUserName()
Ao consultar uma variável 'session', sempre devemos prever que a mesma não pode ter
sido criada, de modo que a consulta pode retornar NIL, ou caso a session já exista ,
retornará o valor do tipo que foi atribuído `a mesma.
If HttpSession->UserId = NIL
// Session ainda não foi criada ! Usuário não está logado.
conout('Usuario não está logado')
Else
// Session já criada, o usuário está logado
conout('Usuario está logado : ID = ' + HttpSession->UserId )
Endif
No exemplo abaixo, criamos uma session para identificar quantas vezes o usuário
chamou esta função específica. Damos o nome da session de MyCounter, que irá conter
um número. No primeiro acesso do usuário, a session não existe ( = NIL ), e é criada
com o valor numérico 1 (um). A partir das próximas requisições realizadas ao Protheus
através desta página ( através do botão 'Refresh' do Browser, por exemplo ) , a session
já existe, sendo somado o valor 1 ào conteúdo já existente, e devolvido ào browser
solicitante um Html informando quantas chamadas já foram realizadas por este usuário.
#include 'rwmake.ch'
#include 'apwebex.ch'
If httpSession->mycounter = NIL
cEcho := 'Inicializando contador'
Conout(cEcho)
cHtml += cEcho
httpSession->mycounter := 1
Else
httpSession->mycounter++
cEcho := 'contador em '+str(httpSession->mycounter,3)
conout(cEcho)
Endif
Return cHtml
Após compilado o fonte acima e o Server Protheus configurado e iniciado com HTTP
habilitado e as working Threads configuradas, abra um Web Browser e solicite a url
http://localhost/u_tstsession.apw . Será mostrado no Browse a mensagem 'Inicializando
Contador'. Agora , peça um 'Refresh' desta tela ao Browser : Será devolvida a
mensagem 'Contador em 2' ... e a cada refresh deste Browser , o contador será
incrementado.
Por outro lado , se em duas destas três requisições faz-se necessária a atualização e/ou
consulta a uma variável de Session ( httpsession ) , este processamento em paralelo ,
caso não fosse tratado , poderia gerar perdas no conteúdo da session caso a mesma
session fosse atualizada simultaneamente.
Para resolver esta questão, de maneira a não sobrecarregar o Servidor com solicitações
de Processamento Sequencial ( Critical Sessions ) , foi montado um esquema de Lock
de Session de Usuário automático, com liberação automática após o processamento do
APW, ou liberação manual através da chamada da função HttpLeaveSession() antes do
processamento ser terminado.
Quando utilizamos ASP ( Microsoft Active Server Pages ) , o mesmo realiza uma
serialização de requisições de páginas ASP por usuário, de modo que , caso o mesmo
usuário solicite três frames .asp , as requisições de processamento chegarão ao Servidor
ASP simultaneamente , mas a bandeira de processamento é unica por página .asp ,
sendo liberada apenas apos o término do processamento da página , de modo que ,
mesmo que nenhuma das páginas faça uso de sessions , todas as páginas deste usuário
serão processadas em sequência.
Abrangência
Abrangência
Em caso de erro fatal na aplicação Web, a própria rotina de tratamento de erro pode ser
configurada para enviar um e-mail ào Administrador do sistema. Para tal, é necessário
inserir as chaves abaixo na seção do ambiente em uso para o site :
Abrangência
Nomenclatura de Funções
Abrangência
LIB WEBEX
Vejamos o exemplo abaixo, escrito para um site cujas bases de dados estão num SQL ,
acessadas via TopConnect. Neste exemplo , a função chamada será
http://servidor/U_SiteMonitor.apw , e caso esteja tudo certo , ela retornará a string
'(SITE OK)' , seguido da data e horário da execução da rotina. Qualquer retorno
diferente disto poderá indicar uma anomalia no funcionamento do site.
#include "protheus.ch"
#include "apwebex.ch"
If !TCIsConnected()
Return 'Working Thread perdeu a conexão com o TOP'
Endif
If select('SA1')=0
Return 'Tabela SA1 não está aberta !!!'
Endif
If select('SC5')=0
Return 'Tabela SC5 não está aberta !!!'
Endif
If nQtdRec=0
Return 'Falha na Contagem de registros / Query SA1'
Endif
Abrangência
Sintaxe
Parâmetros
Descrição
ATENÇÃO : Uma query aberta pelo comando OPEN QUERY deve ser fechada
pelo comando CLOSE QUERY . Poderíamos fechar o alias aberto através de uma
Query simplesmente com a função DbCloseArea(), porém isto deixaria em aberto
elementos internos de controle criados pelo comando OPEN QUERY.
OPEN QUERY
Revisão: 08/12/2003
Abrangência
Sintaxe
Parâmetros
Descrição
OBSERVAÇÕES IMPORTANTES
Abrangência
Sintaxe
Parâmetros
Descrição
Devemos utilizar este comando para fechar uma seção aberta pelo comando WEB
EXTENDED INIT . Para cada ocorrência do comando WEB EXTENDED INIT , deve-
se ter um fechamento da mesma através do comando WEB EXTENDED END ,
devendo haver apenas uma ocorrência desta estrutura por função.
Abrangência
Sintaxe
Parâmetros
Descrição
Devemos utilizar este comando , juntamente com o comando WEB EXTENDED END
quando montamos uma funcão ( Web Function ) que foi construída para ser chamada a
partir de um Web Browser , quando nos utilizamos das funções de Infra-Estrutura
APWEBEX.
Através dele , é realizada uma pré-validação que certifica que a execução da função
somente será realizada caso a thread atual seja realmente uma Thread montada no
ambiente WEBEX, além de podermos inserir uma pré-validação (START) de execução
específica para esta função.
Caso seja especificada uma função na cláusula START, a mesma deverá retornar uma
String. Retornando uma String em branco , o processamento da função original será
efetuado normalmente . Caso a função retorne uma string não-vazia , esta string será
retornada para a variável cHtml , e o processamento do programa será desviado para a
linha do código-fonte imediatamente posterior ào comando WEB EXTENDED END .
Para cada ocorrência do comando WEB EXTENDED INIT , deve-se ter um fechamento
da mesma através do comando WEB EXTENDED END , devendo haver apenas uma
ocorrência desta estrutura por função.
Abrangência
Devemos adotar como padrão para projetos que utilizam APWEBEX a criação do
arquivo "EnvUser.apl", especificamente para a definição dos pontos de entrada
utilizados pela Infra-Estrutura APWEBEX; e devemos apenas compilar os fontes
dos pontos de entrada realmente necessários ào projeto.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "APWEBEX.CH"
/*
======================================================================
==============
Exemplo de Arquivo de Lib de Projeto APWEBEX , utilizando os pontos de
entrada
da lib para preparação de ambiente , reset de ambiente e tratamento de
erro
utilizando APWEBEX em conjunto com o ERP Microsiga
======================================================================
============== */
/* -------------------------------------------------------------------
---------
Ponto de Entrada StartWebEx( NIL ) => .T. ou .F.
PREPARE ENVIRONMENT ;
EMPRESA '01' ;
FILIAL '01' ;
TABLES "ZX1","ZX2","ZX3","ZX4","ZZ1","ZZ2","ZZ3","ZZ4","ZZ5"
Return .T.
/* -------------------------------------------------------------------
------------
Ponto de Entrada ConnectWebEx(cFnName) => cHtml ou ""
Ponto de entrada executado imediatamente antes do processamento de uma
requisição de um link .APW
Recebe como parâmetro o nome da função a ser executada, passada no
link.
Deve retornar uma String, que será retornada ao ao Browser
solicitante. Caso retorne uma string
em branco (vazia) , a função originalmente solicitada é executada pela
lib.
Caso contrário, a função original não é executada , e a string
retornada é enviada ao Browser.
----------------------------------------------------------------------
--------- */
USER Function ConnectWebEx(cFnName)
Local cHtmlConn := ''
conout('Vou executar '+cFnName)
Return cHtmlConn
/* -------------------------------------------------------------------
------------
Ponto de Entrada ResetWebEx(cFnName) => cHtml ou ""
Função chamada imediatamente Apos a execução de uma requisição .APW
Recebe como parâmetro o nome da função executada, e permite também que
seja acrescentado
algo a mais no Html a ser retornado ao Browser.
----------------------------------------------------------------------
--------- */
USER Function ResetWebEx(cFnName)
Local cHtmlConn := ''
conout('Terminei de executar '+cFnName)
Return cHtmlConn
/* -------------------------------------------------------------------
------------
Ponto de Entrada FINISHWEBEX()
Função chamada no fechamendo do ambiente de uma working Thread. Apos a
execução deste ,
a Thread utilizada é eliminada da memória .
----------------------------------------------------------------------
--------- */
USER Function FINISHWEBEX()
conout('Finalizando a Working Thread.')
Return
/* -------------------------------------------------------------------
------------
Ponto de Entrada ENDSESSION(cSessionId) => NIL
Ponto de entrada chamado em uma working Thread quando a session de um
usuário será
eliminada da memória por time-out. Recebe como parametro o Id de
sessions de usuario
que está sendo finalizado.
----------------------------------------------------------------------
--------- */
USER Function ENDSESSION(cSessionId)
Conout("Sesssion "+cSessionId+" limpa da memória...")
Return
/* -------------------------------------------------------------------
---------
Ponto de Entrada WebExError(e,cErrorLog,cHtml) => cCustomHtml ou ""
'
cCustomHtml += '
'
cCustomHtml += '
'
cCustomHtml += '
'
cCustomHtml += ''
cCustomHtml += ''
Return cCustomHtml
Abrangência
Nos exemplo abaixo, utilizamos a função escape() para formatar parâmetros para inserir
em uma URL.
cUrl := 'http://localhost/webinfo.apw'
Exemplo da função
GETJOBPROFSTRING
Revisão: 08/12/2003
Abrangência
cJobType := GetJobProfString('type','(empty)' )
cInstances := GetJobProfString('Instances','(empty)' )
cInacTime := GetJobProfString(InactiveTimeout','(default)' )
cExpTime := GetJobProfString('ExpirationTime','(default)' )
Exemplo da função GETPARVALUE
Revisão: 08/12/2003
Abrangência
Local aTeste1 := {}
Local aTeste2 := {}
Aadd(aTeste1,{"Alias","TMP1"})
Aadd(aTeste1,{"Relacao","2x3"})
Aadd(aTeste2,{"Alias","TMP2"})
Aadd(aTeste2,{"Info","---Informação adicional---"})
conout(cAlias) // TMP1
conout(cRelacao) // 2x3
conout(cInfo) // (nao encontrado)
conout(cAlias) // TMP1
conout(cRelacao) // 2x3
conout(cInfo) // ---Informação Adicional---
Exemplo da função HEXSTRDUMP
Revisão: 15/12/2003
Abrangência
#include "protheus.ch"
#include "apwebex.ch"
// Le o arquivo
cTTXFile := memoread('\Web\Default.htm')
Return cHtml
/*
*/
Abrangência
/*
Em uma determinada função , caso um parâmetro não seja passado , o
usuário deverá retornar a uma outra tela
*/
...
If empty(httpget->meuparam)
// Parâmetro não informado , volta pro login
cHtml := RedirPage('/W_Login.apw')
Else
// Parametro Ok , executa o APH formteste
cHtml := ExecInpage('FormTeste')
Endif
...
...
cHtml += '
...mensagem de download...
'
// Devolve script de redirecionamento apontando para o arquivo
// com o target _blank , para ser aberto em uma nova janela.
cHtml += RedirPage('/downloads/arquivo.zip','_blank')
...
Abrangência
No exemplo abaixo , utilizamos a função RetSqlAce para montar uma query de busca
por título de uma determinada informação , considerando todas as possibilidades de
acentuação , independentemente de como o banco foi alimentado e/ou a string de busca
foi digitada.
cFind := 'acentuação'
cQuery := "SELECT * FROM " + RetSqlTab('ZZ1')
cQuery += "WHERE LOWER(ZZ1_TITULO) LIKE '%"+RetSqlAce(cFind)+"%' "
Exemplo da função VALTOSQL
Revisão: 08/12/2003
Abrangência
Abrangência
Abrangência
cRetorno := ""
cFrase := "não há EXPLICAÇÕES considerando excessões PARA O
inexplicável."
/*
*/
Exemplos das funções NTOC e CTON
Revisão: 16/12/2003
Abrangência
/* -------------------------------------------------------------------
------
Ao final do programa , cNum1 será "01101010" e cNum2 será "00DA25FF"
----------------------------------------------------------------------
--- */
APWEXADDERR
Revisão: 13/04/2004
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Lógico Esta função sempre retorna .T.
Descrição
Caso a função seja chamada sem nenhum parâmetro, a última ocorrência acrescentada
pela função é eliminada da pilha interna de informações.
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
String resultante convertida para munúsculo , com as primeiras letras das
Caracter
palavras significantes em maiúsculo.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Numérico Número recebido como parâmetro em notação decimal ( Base 10 )
Descrição
Observação Importante :
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
cEscaped corresponde à string original , com os caracteres reservados
Caracter
utilizando a notação %HH .
Descrição
A função Escape() deve ser utilizada para realizar conversões de caracteres especiais e
reservados quando da necessidade de passagem de parâmetros via URL .
(link)?param=conteudo¶m2=conteudo2&...
Quando passamos parâmetros via url , devemos tomar o cuidado de não utilizar
caracteres reservados e especiais nos nomes e conteúdos de parâmetros. Para realizar
estas conversões, utilizamos a função Escape()
EXECINPAGE
Revisão: 12/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Caracter cHtmlPage corresponde à string HTML gerada pela página APH / AHU.
Descrição
Caso seja necessária a execução de uma página APH ou AHU e o não-envio da mesma
para o Browse; por exemplo para a geração de um código HTML a ser enviado via e-
mail; revemos utilizar a função HttpSetPart(), realizando uma chamada da mesma antes
da ExecInPage() , passando o parâmetro .F. para desabilitar temporariamente o envio de
HTML simultâneo ao Browser, e após a execução da ExecInPage(), devemos re-
habilitar o envio simultâneo através da chamada da função HttpSetPart() com o
parâmetro .T.
EXISTPAGE
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Retorna um valor booleano indicando se o arquivo APH especificado está
Caracter
compilado no RPO do ambiente atual.
Descrição
Exemplo :
If ExistPage('teste')
conout('teste.aph compilado neste RPO')
Else
conout('teste.aph NAO compilado neste RPO')
Endif
EXISTUSRPAGE
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Retorna um valor booleano indicando se o arquivo APH especificado está
Lógico
compilado no RPO do ambiente atual.
Descrição
Exemplo :
If ExistUSRPage('teste')
conout('teste.ahu compilado neste RPO')
Else
conout('teste.ahu NAO compilado neste RPO')
Endif
GETJOBPROFSTRING
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Conteudo da Chave solicitada . Caso a chave não seja encontrada , é
Caracter retornado o conteudo de cDefault . Caso esta função não seja executada a
partir de uma Working Thread , ela retornará uma string em branco ("")
Descrição
Abrangência
Sintaxe
Retorno
Tipo Descrição
Corresponde à String Identificadora da versão , no formato <LIB>
Caracter
V.AAMMDDHHmm . Vide Tabela A
Descrição
Tabela A
Simbolo Descrição
AA Ano de geração da Lib
MM Mês da geração da Lib
DD Dia da geração da Lib
HH Horário da geração da Lib
mm Minutos do Horário de Geração da Lib
Indica que a versão foi compilada com a configuracão de envio progressivo de
(HTTP) HTML simultâneo para o Browse . Esta opção é imprescindível para projetos
que se utilizam desta LIB.
Por exemplo :
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
O retorno da função corresponde à uma string Advpl , formatadas em 16
bytes em hexadecimal por linha , mais o separador pipe (|) , mais os 16
Caracter
caracteres em Ansi. Os caracteres de controle ( codigo ascii menor que 32
) são convertidos para visualização para o caractere underline (_)
Descrição
Observação :
Não devemos pasar para a função HexStrDump uma string maior que 240 Kb , pois a
geração da String de dump é realizada em memória, sendo a string final gerada em
média 4,2 vezes maior que a string passada como parâmetro. Caso a string passada
como parâmetro seja maior que 240 Kb , a execução será abortada com a ocorrência de
erro fatal "string size overflow"
HTMLNOTAGS
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
String original com os caracteres interpretáveis Html < > & " convertidos
Caracter
para caracteres não-interpretáveis.
Descrição
Sintaxe
Retorno
Tipo Descrição
A função retornará .T. caso o ambiente de execução atual seja uma
Lógico Working Thread WEBEX , inicializada pela função de infra-estrutura
STARTWEBEX.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Retorna .T. caso a sring recebida como parâmetro atenda às definições de
Caracter
nomenclatura válidos para um endereço de e-mail.
Descrição
Utilizada para validar e-mails em Advpl , a função ISEMAIL recebe como parâmetro
uma string contendo um e-mail , retornando .T. caso a string esteja em um formáto
válido respeitando a regra para nomenclatura de endereços de e-mail.
Regra : Um e-mail é considerado válido caso seja iniciado por um caracter , apenas
contenha caracteres asc de a a z e 0 a 9 , e os caracteres @ (arroba) , . (ponto) , - ( hífen)
ou _ (underline) ; e deve conter uma e apenas uma arroba , e no minimo um ponto apos
a arroba, intercalado por um caracter.
LOWERACE
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Caracter String original em letras minúsculas.
Descrição
Abrangência
Sintaxe
NTOC ( < nNumero > , < nBase > , < nTamStr > ) --> cString
Parâmetros
Retorno
Tipo Descrição
cString corresponde ao numero convertido para a base numérica
Caracter
especificada como parâmetro.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Script Html / JavaScript que , ao ser executado no Browser (client) ,
Caracter
chama a página/objeto chamado no Link.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
cStrQuery corresponde à string de busca a ser utilizada na query,
Caracter
utilizando caracteres em minúsculo.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Corresponde à expressão SQL para filtrar os dados através da cláusula
Caracter
WHERE
Descrição
A função retorna , a partir dos aliases passados como parâmetro , as expressões de filtro
de dados para considerar a filial atual ( xFilial ) de acordo com o modo do arquivo (
X2_MODO ) , e para sempre desconsiderar registros deletados.
Observações :
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Corresponde à expressão SQL para filtrar os dados através da cláusula
Caracter WHERE
Descrição
A função retorna , a partir dos aliases passados como parâmetro , as expressões de filtro
de dados para considerar o campo D_E_L_E_T_ da(s) tabela(s) passada(s) como
parâmetro.
Observações :
RETSQLFIL
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Corresponde à expressão SQL para filtrar os dados através da cláusula
Caracter WHERE
Descrição
Observação :
RETSQLTAB
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
String contendo nomes fisicos e alias identificadores dos aliases recebidos
Caracter
como parâmetro.
Descrição
SEPARA
Revisão: 15/12/2003
Abrangência
Sintaxe
SEPARA ( < cString > , < cToken > , < lEmpty > ) --> aTokens
Parâmetros
Retorno
Tipo Descrição
Array de uma dimensão contendo os elementos parseados pela rotina
Caracter
levando-se em conta o separador passado como parametro.
Descrição
Exemplo :
Para realizar a análise de uma string, cujo delimitador tenha apenas 1 byte, e as
ocorrências de dois separadores juntos sejam ignoradas na geração do array, a função
separa() utiliza a função StrTokArr(), função escrita em C no Protheus Server, mais
rápida para este processamento. Apenas existe a necessidade de utilizarmos a função
Separa() caso as ocorrências de dois separadores juntas devam ser consideradas no array
de resultado e/ou a string utilizada como separador possua mais que 1 byte de tamanho.
UNESCAPE
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
cUnescaped corresponde à string recebida como parâmwetro , com os
Caracter caracteres originalmente em notação escape ( %HH ) convertidos para
ASCII
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Retorna a string original com todas as letras mauisculas , inclusive as
Caracter
letras acentuadas.
Descrição
UPSTRTRAN
Revisão: 15/12/2003
Abrangência
Sintaxe
UPSTRTRAN ( < cString > , < cSearch > , [ cReplace ] , [ nStart ] , [ nCount ] ) -->
cNewString
Parâmetros
Retorno
Tipo Descrição
A função UPSTRTRAN retorna uma nova string, com as ocorrências
Caracter especificadas de cSearch trocadas para cReplace, conforme
parâmetrização.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Caracter Expressão a ser acrescentada na Query.
Descrição
Podemos passar como parâmetro uma Expressão do tipo “C” Caracter , “D” Data ou
“N” Numérica.
Abrangência
Sintaxe
VARINFO ( < cId > , < xVar > , [ nMargem ] , [ lHtml ] , [ lEcho ] ) --> cVarInfo
Parâmetros
Retorno
Tipo Descrição
String contendo o "Dump" da análise da variável. Caso lHtml seja .T. ,
Caracter retorna String em formato HTML . , senão retorna string ASCII com
quebras CRLF.
Descrição
A Função VARINFO() gera um texto ASCII e/ou Html , com possibilidade de ECHO
para o Console do Protheus Server ( caso habilitado ) , com as informações sobre o
conteúdo de uma variável de memória Advpl , de qualquer tipo .
Observação : O segundo parâmetro ( xVar ) deve ser uma variável Advpl que deve
existir no escopo de variáveis. Caso a variável não exista, o processamento é abortado
com a ocorrência de erro "Variablçe does not exist" . Para saber se uma determinada
variável existe no escopo da execução da função atual, deve ser utilizada a função
Advpl TYPE(), onde passamos a variável a ter seu tipo determinado como string ( entre
aspas ) .
WEBINFO
Revisão: 12/12/2003
Abrangência
Sintaxe
Retorno
Tipo Descrição
cHTMLInfo corresponde à string HTML contendo as informações da
Caracter
requisição HTTP.
Descrição
A função WebInfo() foi desenvolvida para ser chamada através de uma requisição http ,
via link .apl ou .apw , e ela identifica todos os parâmetros recebidos via uma requisição
http: Parâmetros via get , post , o header HTTP, os Cookies, o content-type , Legth ,
Content-disposition , SoapRaction (ação SOAP para requisições de WebSErvices ) , e
OtherContent ( caso o conteúdo postado não seja um text/html )
Esta função retorna uma página Html com todas estas informações, e é utilizada no
desenvolvimento de projetos. quando temos a necessidade prática de
recuperarmos todas as informalções provenientes de uma requisição HTTP.
Adicionalmente , a função WebInfo
Por exemplo, com o Protheus configurado para atender requisições de links .apl via
HTTP , chame a função WebInfo.apl através do link :
http://localhost/webinfo.apl?param1=teste¶m2=outroteste
__httpPage -> C ( 0) []
HttpRCtType() -> C ( 0) []
HttpRCtDisp() -> C ( 0) []
SoapRAction() -> C ( 0) []
HttpOtherContent() -> C ( 0) []
Caso a mesma requisição seja realizada através de link .apw , utilizando-se a tecnologia
WEBEX , deverá ser exibida uma tela semelhante à tela abaixo :
HttpRCtType() -> C ( 0) []
HttpRCtDisp() -> C ( 0) []
SoapRAction() -> C ( 0) []
HttpOtherContent() -> C ( 0) []
[APWEXERR_0000] INVALID PROC
RETURN TYPE [X] ...
Revisão: 13/04/2004
Abrangência
Abrangência
Abrangência
Descrição / causa : Quando uma working thread do ambiente ApWebEx, recebe uma
solicitação de processamento através de um link .apw, de acordo com o módulo web
utilizado, pode ser chamada uma função intermediária [Y], antes do processamento da
função chamada no link ou depois do processamento concluído.
A lib exige que estas funções internediárias retornem um conteúdo Advpl do tipo
"STRING". Caso a função [Y] chamada pela lib retorne um conteúdo Advpl diferente
de "STRING", o tipo de variável retornado é mostrado em [X] e a Working Thread é
finalizada com esta ocorrência de erro.
Solução : Verifque o código-fonte da função [Y], para certificar-se que seu retorno
sempre será um conteúdo Advpl do tipo "STRING"
[APWEXERR_0004] INVALID PROC
RETURN TYPE [X] ...
Revisão: 13/04/2004
Abrangência
Abrangência
Se uma função [XXX], escrita para ser chamada exclusivamente neste tipo de ambinete,
seja chamada diretamente via Protheus Remote, ou outro tipo de processamento que não
seja uma working thread inicializada pelas funções de infra-estrutura ApWebEx, a
função é abortada com esta ocorrência de erro. Isto também consistem em uma
proteção, para que uma função projetada para ser executada em um tipo de ambiente (
working threads ApWebEx ) não seja erroneamente executada em outro ambiente.
Abrangência
Abrangência
Abrangência
Descrição / causa : Ao utilizarmos o comando OPEN QUERY, caso não exista uma
conexão ativa com o TOPConnect, o processamento em execução é abortado com esta
ocorrência de erro.
Solução : Certifique-se de que a chamada deste comando está sendo realizada através
de uma working thread que possua uma conexão ativa com o TOPConnect.
[APWEXERR_0009] RetSqlCond failed
to read X2_MODO
Revisão: 13/04/2004
Abrangência
Solução : A função final() não deve ser utilizada como um recurso de finalização de
aplicação WEB, porém ela é utilizada internamente por funções da infra-estrutura ERP,
no caso de uma ocorrência fatal que impeça um determinado processamento, e ganhou
esta proteção na Lib ApWebEx para permitir o desenvolvimento de aplicações
integradas WEB / ERP.
Caso reproduzida uma ocorrência de erro desta natureza, verifique nos detalhes do erro
qual função que estava em execução e qual o motivo da finalização da working thread.
Este motivo está especificado no campo "Erp Message", mostrado nos detalhes da
ocorrência de erro.
[APWEXERR_0011] Argument #0 Error
: Parameter ...
Revisão: 13/04/2004
Abrangência
Solução : Esta ocorrência de erro informa que o parâmetro cTitle não foi especificado
ou está vazio, porém o parâmetro cInfo foi especificado. Verifique o código-fonte e
corriga a chamada da função.
[APWEXERR_0012] Argument #0 Error
: Expected C->X
Revisão: 13/04/2004
Abrangência
Solução : Esta ocorrência de erro informa que o parâmetro cTitle foi especificado com
um tipo [X], que não é "STRING". Verifique o código-fonte e corrija o parâmetro
passado para a função.
[APWEXERR_0013] Argument #1 Error
: Parameter ...
Revisão: 13/04/2004
Abrangência
Solução : Esta ocorrência de erro informa que o parâmetro cInfo não foi especificado
ou está vazio, porém o parâmetro cTitle foi informado. Verifique o código-fonte e
corrija a chamada desta função.
[APWEXERR_0014] Argument #1 Error
: Expected C->X
Revisão: 13/04/2004
Solução : Esta ocorrência de erro informa que o parâmetro cInfo foi especificado com
um tipo de dado [X] que não é "STRING". Verifique o código-fonte e corrija a chamada
desta função.
[APWEXERR_0020] INVALID JOB
[XXX] TYPE [YYY]
Revisão: 13/04/2004
Abrangência
Descrição / causa : Esta ocorrência de erro indica que as configurações do Job [XXX],
de working threads para utilização no ambiente ApWebEx, está identificado com um
TYPE [XXX] inválido.
Solução : Para solucionar esta ocorrência, basta verificar a configuração do Job [XXX]
utilizado para inicializar as working threads e especificar um tipo adequado ( WEB ou
WEBEX ), de acordo com o módulo em uso.
[APWEXERR_0021] UNABLE TO GET
JOB NAME
Revisão: 13/04/2004
Abrangência
Descrição / causa : Esta ocorrência de erro indica que o processo atual em execução
não foi originado pela configuração de um processo WEB ou WEBEX , ou a função de
inicialização de ambiente STARTWEBEX não foi chamada através de um evento
ONSTART de JOB, como por exemplo um AP Remote.
Abrangência
Abrangência
Caso o comando BREAK seja chamado em algum destes pontos, a execução é abortada
, e na rotina de tratamento de execução, não há o registro de controle de erro, de modo
que a working thread é abortada com esta ocorrência de erro.
Solução : Certifique-se que no códiugo fonte da aplicação não seja utilizado o comando
BREAK.
Abrangência
[APWEXERR_0024] <Start / Connect / Finish > Function [X] of Module [Y] not
found in Rpo.
Abrangência
DW - Data WareHouse
BSC - Balanced ScoreCard
MAK - Modulo WEBEX Makira
GE - Gestão Educacional
GPR - Gestão de Pesquisa e Resultado
TCF - Terminal do Funcionario ( RH ONLINE )
PP - Portal PRotheus ( WebServices )
SAV - Sala de Aprendizagem Virtual
GAC - Gestão de Acervos
WPS - WebPrint & WebSpool
Caso não seja fornecida uma sigla válida na chave SIGAWEB, na seção de
configuração das working threads, as mesmas não entrarão no ar, e serão abortadas com
esta ocorrência de erro.
Abrangência
Abrangência
Solução : Verifique a chamada da função ntoc() no fonte e certifique-se que está sendo
informado um número entre 2 e 36.
[APWEXERR_0028] MODULE [Y]
REQUIRES JOB TYPE=WEBEX
Revisão: 13/04/2004
Abrangência
Solução : Verifique a configuração das working threads deste módulo web e certifique-
se que a configuração TYPE está setada para WEBEX.
[APWEXERR_0029] MODULE [Y]
REQUIRES JOB TYPE=WEB
Revisão: 13/04/2004
Abrangência
Solução : Verifique a configuração das working threads deste módulo web e certifique-
se que a configuração TYPE está setada para WEB.
[APWEXERR_0030] NO WEB
LICENCES AVAILABLE (...
Revisão: 13/04/2004
Abrangência
Descrição / causa : Esta ocorrência de erro, indica que não há mais licenças Protheus i
disponíveis para a utilização da aplicação Web. Adicionalmente à esta ocorrência, é
informado adicionalmente a informação "WEB LICENSE STATUS [NNNN]", onde
nnnn indica o código de erro do HardLock utilizado para controle de licenças.
Abrangência
Abrangência
Versão 8.11
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
lSucess corresponde ào status de montagem de ambiente. Caso o ambiente
tenha sido montado com sucesso , o ponto de entrada deve retornar .T. ,
Lógico
caso contrário .F. . Uma vez retornado .F. , o Protheus irá eliminar esta
Working Thread da memória.
Descrição
Grupos Relacionados
Principal / A Tecnologia Protheus / Programação Advpl para WEB / Infra-Estrutura
APWEBEX / Pontos de Entrada
02. CONNECTWEBEX
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Caso retornada uma string em branco , a execução da função
originalmente chamada no link .apw prossegue normalmente. Caso
Caracter
contrário , a string retornada é devolvida ao Browser solicitante , e a
função chamada através do link não é executada.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
Este ponto de entrada DEVE retornar uma string , podendo ser inclusive
Caracter uma string vazia. A String retornada será acrescentada ao Codigo Html a
ser retornado ao Browser
Descrição
Vale a pena lembrar que este ponto não será executado em caso de erro fatal no ponto
de entrada U_CONNECTWEBEX ou na execução da função principal chamada através
do Link.
04. FINISHWEBEX
Revisão: 10/12/2003
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
(NULO) O Retorno deste ponto de entrada não é utilizado.
Descrição
Abrangência
Sintaxe
Parâmetros
Retorno
Tipo Descrição
(NULO) O retorno deste ponto de entrada deve ser nulo
Descrição
Através deste ponto de entrada , podemos executar uma rotina Advpl quando da
finalização das sessions de um usuário por time-out de inatividade. O Retorno deste
ponto de entrada não é utilizado, devendo ser nulo (NIL).
Apenas devemos compilar este ponto de entrada no Projeto caso realmente exista a
necessidade de ser executado um processamento específico relacionado à finalização
das sessions de um usuário. Vale a pena ressaltar também que este ponto de entrada
apenas é chamado na finalização das sessions por tempo de inatividade. Caso seja
utilizada a função httpfreesession() para limpar da memória as sessions do usuário atual
em uma Working Thread, este ponto de entrada não será chamado.
06. WEBEXERROR
Revisão: 16/12/2003
Abrangência
LIB WEBEX
Sintaxe
06. WEBEXERROR ( < oErrorObj > , < cErrorLog > , < cErrorHtml > ) --> cMsgHtml
Parâmetros
Retorno
Tipo Descrição
Retorno opcional. Caso retornado NIL ou string vazia , será retornado ao
usuario o html de erro gerado pela rotina de tratamento standard. Caso o
Caracter
ponto de entrada retorne uma String HTML , ela será mostrada ao usuário
no ligar do Html gerado pela rotina de tratamento de erro.
Descrição
Este ponto de entrada será chamado no caso de uma ocorrência de erro fatal Advpl
durante a execução de uma Working Thread em ambiente / Lib APWEBEX, permitindo
a montagem de uma mensagem de erro HTML customizada a ser devolvida ào usuário.
Este ponto de entrada recebe como parâmetros o objeto do erro , a descrição ASCII
completa do erro gravada no error.log , e o HTML default montado pela da rotina de
tratamento de erro que será devolvido ao usuario. Através da utilização deste ponto de
entrada , é possível gerar um Html diferenciado conforme a necessidade, para mostrar a
ocorrência de erro e/ou maiores instruções ao usuário.
OBSERVAÇÕES
Caso seja reproduzida alguma ocorrência de erro neste ponto de entrada, isto
fará a aplicação ( Protheus Server ) enviar ao Browser um Html gerado pela
rotina de tratamento de erro default do Protheus.
A HREF - Âncoras e espaços
Revisão: 11/12/2003
Quando passamos parâmetros de uma página para outra , via query string (URL) ,
devemos ter o cuidado de não deixar espaço(s) em branco entre parâmetros na
montagem da URL. Quando utilizamos o Internet Explorer os espaços em branco são
convertidos (*) automativamente para a sequência String %20, porém quando
utilizamos o Netscape, quando colocamos um espaço em branco em um parâmetro , o
NetScape IGNORA tudo o que vem após o primeiro espaço em branco , perdendo assim
os demais parâmetros.
No Internet Explorer não haverá problemas (*) , pois os espaços serão convertidos. No
Netscape , o parâmetro par2 não será colocado na URL... A forma correta deve ser
<a href='/webinfo.apw?par1=123%20%20%20&par2=345'>Link</a>
<a href='webinfo.apw?par1=<%=Escape(cCodigo)%>&par2=345'>Link</a>
Observação : Vale a pena lembrar que a função escape() deve ser aplicada apenas àos
conteúdos da stringlist, pois se por exemplo for convertido pela escape() o caracter
separador de parâmetros & ( e Comercial ), este caractere será interpretado como
DADO e não como separador, comprometendo o funcionamento do link.
Combo / Select em Html : Recuperando
valores
Revisão: 11/12/2003
<HTML><BODY>
</form>
</BODY></HTML>
<SCRIPT LANGUAGE='JavaScript'>
function muda()
{
// Mostra qual o usuario selecionou
alert(document.exemplo.teste.value);
}
</SCRIPT>
Para que seja recuperado o valor do elemento selecionado , utilizamos o código abaixo ,
compatível com ambos os Browsers.
document.exemplo.teste.options[document.exemplo.teste.selectedIndex].value
Note que utilizamos o array options do controle teste para obter o valor correto ,
utilizando o índice que está selecionado. A função muda poderia ficar assim:
<SCRIPT LANGUAGE='JavaScript'>
function muda()
{
var val_combo =
document.exemplo.teste.options[document.exemplo.teste.selectedIndex].value;
// Mostra qual o usuario selecionou
alert(val_combo);
}
</SCRIPT>
Ocorrencia : Para chamar uma nova página no IE, cujo destino será o frame atual ou
página atual do Browser, podemos usar a função javascript : window.open( 'xxx.apw',
'_self' ) . No IE (Interbet Explorer) o link chamado é aberto no mesmo frame de onde a
instrução é chamada, mas no Konqueror esta instrução abre uma nova janela com o
nome '_self'.
Abrangência
Versões Anteriores
<HTML>
<frameset framespacing='0' border='0' cols='100,100' frameborder='0'>
<frame name='fr_not' scrolling='no' border='0' marginwidth=8 marginheight=0
src='w_winf067.apl'>
<frame Name='fr_Area' src='' Marginwidth='0' Marginheight='0' Framespacing='0'
Border='0' Frameborder='0' scrolling='auto'>
<noframes>Seu browser não suporta frames</noframes>
</frameset>
</HTML>
Dicas úteis
A tag <body> não é suportada. na declaração dos frames. Jamais usem esta tag
em uma estrutura de frames.
Abrangência
Versões Anteriores
1) Default -> Interpretação HTML , os Caractetes CRLF ( chr(13) / chr(10) ) não são
considerados como pulo de linha , de modo que as quebras de linha são de acordo com
o design aplicado e/ou o tamanho disponível no browse para a visualização do dado.
A solução mais comum para a visualização de campos Memo ( inclusive foi a solucão
adotada aki no Banco de Conhecimento - DEM ) , é a de trocar os códigos CRLF pela
tag '<br>' , para apenas realizar um pulo de linha no fim do parágrafo. Apenas para
textos de Exemplos de Código ADVPL são utilizadas as tag <pre> .. </pre>, para que a
quebra de linha seja unica e exclusivamente realizada no CRLF , mesmo que o tamanho
da tela não permita mostrar esta quebra ( caso este no qual a tela ou frame ganha uma
barra de scroll no Web Browser ) .
Caso tenhamos tags interpretáveis dentro do memo , que não devam ser interpretadas
pelo browse , mas sim constar como conteúdo do campo , devemos utilizar a funcao
HtmlNoTags , dentro da expressão anteriormente montada :
Abrangência
Versões Anteriores
Em Html, para setar um refresh automatico da página em <n> segundos, utiliza-se uma
etiqueta meta , na seguinte sintaxe :
Função setTimeout(<cFunc>,<nTime>)
Ambiente JavaScript
Parametros :
<cFunc> = Nome da funcao em Java a executar
<nTime> = intervalo de execucao (milisegundos)
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versão 8.11
de um usuario
<html>
</html>
<html>
<head>
<title>ADVPL ASP</title>
</head>
<script language="javascript">
//Codigo JavaScript no qual não permite que o formulário seja enviado
sem
//que seus campos tenham sido preechidos.
function envia()
{
var oFrm = document.forms[0];
oFrm.action = "w_ms03.apw";
oFrm.submit();
}
</script>
<body>
<h2 align="center"> Formulário</h2>
<hr>
<p>Bem Vindo <%=HttpSession->Usuario%></p>
<HTML>
<P>
<input name="Reset" type="reset" value="Voltar"
onClick="window.location = 'w_ms02.apw'">
</P>
</HTML>
#INCLUDE "PROTHEUS.CH"
#DEFINE ID "Admin"
#DEFINE SENHA "123"
return h_ms01()
if empty( HttpSession->Usuario )
//Verifica se os campos foram preenchidos.
if empty( HttpPost->txt_Nome ) .And. empty( HttpPost-
>txt_Senha)
return "Nome e Senha não informados!!"
endif
return h_ms02()
Abrangência
Este exemplo de ADVPL ASP mostra como realizar o upload de um arquivo via HTTP.
<html>
<head>
<title>Exemplo Upload</title>
</head>
<body>
<table width="500" border="1" align="center" cellpadding="0"
cellspacing="0">
<tr>
<td width="28%" align="right">Path do arquivo : </td>
<td width="2%"> </td>
<td width="70%"><%=httpPost->txtFile%></td>
</tr>
<tr>
<td align="right">Tamanho : </td>
<td> </td>
<td><%=LengthFile%></td>
</tr>
</table>
</body>
</html>
<html>
<head>
<title>Exemplo Upload</title>
<script>
function jUpFile()
{
if( document.form.txtFile.value == "" )
{
alert( "Informe o nome do arquivo clicando em
Browse..." );
return;
}
document.form.action = "w_upFile.apw";
document.form.submit();
}
</script>
</head>
<body>
<form name="form" action="" enctype="multipart/form-data"
method="post">
<p align="center">
<font face="Arial, Helvetica, sans-serif" size="3"><b>Exemplo de
upload de arquivos em ADVPL ASP</b></font><br>
<br>
<input name="txtFile" type="file" id="txtFile" size="50">
<br>
<br>
<input name="btnSub" type="button" id="btnSub" value="Subir
arquivo" onClick="jUpFile()">
</p>
</form>
</body>
</html>
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FILEIO.CH"
Private LengthFile := 0
Return h_RespUpFile()
HTML
Revisão: 13/04/2004
Basicamente, o HTML utiliza-se dos marcadores < e > para estruturar e formatar texto.
Por exemplo:
HTTP
Revisão: 13/04/2004
Uma Thread é semelhante ào programa descrito acima, tendo um começo, meio e fim.
Porém, uma Thread em si não é um programa, pois ela não se executa : ela roda (com) o
programa !
De tal modo que, por estarem realizando tatefas independenres, cada thread possui o seu
próprio contexto de execução, alocação de memória e controle de pilha de execução
(Stack). O código em execução em uma Thread trabalha dentro de seu contexto
específico, de modo que várias outras documentações referem-se ao 'contexto de
execução' como sendo um sinônimo de Thread.
Working threads
Damos o nome de 'working thread' quando são iniciadas mais de uma thread
independente na aplicação, e todas as threads iniciadas são colocadas em 'modo de
espera' (idle), aguardando uma solicitação de processamento da aplicação. Mais de uma
solicitação pode ser realizada, e o núcleo da aplicação encarrega-se de distribuir os
processamentos entre as threads disponçiveis. Terminado o processamento de uma
thread, a mesma retorna ao 'modo de espera', estando pronta novamente para atender à
uma nova solicitação. Este recurso possibilita um ganho significativo de performance,
por não haver a necessidade de criar e finalizar uma nova thread para cada solicitação
de processamento.