Академический Документы
Профессиональный Документы
Культура Документы
Revisão: 27/04/2004
Abrangência
Para se ter uma idéia superficial do poder do Protheus como servidor http, esta
aplicação ( DEM - Documentação Eletrônica Microsiga ) foi escrita em Advpl-ASP,
utilizando uma compilação do Server Protheus ISAPI , integrado com o IIS 5, utilizando
um Banco de Dados SQL Server 2000 através do TopConnect 4, utilizando se de
Working Threads Extended (WEBEX) e das funções de Infra-Estrutura da lib
APWEBEX.
01. O Servidor Protheus como um
servidor HTTP
Revisão: 27/04/2004
Abrangência
Serviço de HTTP
Utilizando o servidor Protheus como um servidor HTTP, o mesmo poderá ser acessado
através de um Web Browser como o Internet Explorer por exemplo, que receberá as
páginas HTML enviadas de um diretório configurado no servidor. Adicionalmente ao
envio e recebimento de páginas estáticas formatadas, pode-se utilizar a linguagem
Advpl do Protheus para processar páginas mistas, que contém código Advpl e
comandos HTML de formatação. Tais páginas serão processadas no servidor Protheus,
e então enviadar para o Web Browser, que irá formatá-las de acordo com os comandos
HTML contidos. Também é possível executar diretamente funções compiladas no
repositório do Protheus, através de um request HTTP (por exemplo, através de um
POST em um formulário em HTML, ou de um link, ou mesmo diretamente na linha de
URL do Web Browser. O mesmo vale para qualquer outra aplicação que seja capaz de
efetuar comandos GET ou POST utilizando o protocolo HTTP).
Para viabilizar o desenvolvimento deste tipo de função, foi criado um tipo de arquivo
especial no Protheus IDE, com a extensão .APH, onde é inserido um conteúdo Html a
ser enviado ao Web Browser, e instruções Advpl que serão processadas no momento em
que a página for solicitada ao servidor Protheus, sendo possível de forma
prática 'mesclar' um conteúdo gerado por este processamento à uma página Html para
ser retornado ào Web Browser.
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versão 8.11
A utilização do protocolo HTTP não envolve o uso de uma conexão persistente entre o
Web Browser e o Servidor HTTP : Isto significa que, ao ser solicitada uma página,
imagem ou até o processamento de uma função, o Web Browser abre uma conexão com
o Server HTTP, realiza a solicitação e fica com a conexão aberta, aguardando pelo
retorno do Server. Quando o server já houver enviado os dados solicitados, a conexão é
fechada .
Processamento de Funções
Para o retorno de páginas estáticas, imagens e demais arquivos via HTTP, o servidor
identifica o que está sendo solicitado pelo Web Browser através da extensão do Link.
Por exemplo, ao receber uma soilicitação da URL http://oservidor/htmls/imagem.gif, o
Server HTTP sabe que deve procurar um arquivo chamado imagem.gif, dentro da pasta
htmls a partir da pasta local no servidor configurada para armazenar os arquivos para o
acesso HTTP.
O que irá diferenciar uma função executada via link .apl e .apw será as etapas de
execução das mesmas. Esta característica de funcionamento será melhor esclarecida
após a leitura dos tópicos sobre desenvolvimento de funções .apl e desenvolvimento
de funções .apw
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versão 8.11
Uma página ASP (Active Server Pages) é uma página HTML contendo código
interpretável em uma linguagem compreensível ao servidor HTTP em uso. Por
exemplo, o IIS da Microsoft utiliza o VBScript para criar suas páginas ASP, do mesmo
modo que o Protheus utiliza o ADVPL. Uma página ASP é uma combinação de script
HTML e código interpretável. No ADVPL ASP esse código é padrão xBase, portanto a
preocupação maior daqueles que já conhecem e trabalham com o Protheus e desejam
desenvolver páginas ativas para aplicações Web utilizando essa facilidade é conhecer
HTML.
Os arquivos ADVPL ASP têm a extensão padrão .APH. São arquivos texto e devem ser
adicionados a um projeto no Protheus IDE e compilados da mesma maneira que os
programas tradicionais. A diferença é que o Protheus Server identificará que se trata de
um ADVPL ASP e executará uma espécie de tradutor (parser) antes que a compilação
seja executada. Este parser irá transformar todo o arquivo em uma função única, que
receberá os mesmos parâmetros das funções APL simples, como explicado
anteriormente no Item 'Desenvolvendo Funções .APL', e retornará uma string.
Por se tornar uma função no momento da compilação, não é possível utilizar a cláusula
FUNCTION para criar outras funções dentro de um arquivo APH. Caso exista essa
necessidade, tais funções devem ser criadas em um arquivo PRW tradicional e
chamadas de dentro do APH.
A extensão APH para o nome dos arquivos é obrigatória. Qualquer outra extensão usada
no nome do arquivo não será reconhecida e o parser do IDE não será executado durante
a compilação. Foi criada também a extensão de arquivos .AHU ( Aph de Usuário ), que
possui o mesmo tratamento de Parser do aruqivo APH , gerando uma função prefixada
com L_ . A diferença é que a função gerada pelo AHU pode ser gerada sem a
necessiade de autorização de compilação com permissão para substituir fontes
microsiga , por tratar-se de um Aph de Usuário, qeuivalente à uma User Function .
Assim como outros ASP´s, a diferenciação entre script HTML e código é efetuada
através dos caracteres <% para indicação de abertura de código e %> para indicação do
encerramento de código. Por exemplo, o HTML abaixo contém um pedaço de código
ADVPL separado pelos delimitadores:
Quando este arquivo for requisitado ao Protheus Server (através de uma chamada em
URL por exemplo) o código entre os delimitadores será executado, porém o script
colocado ao redor do código será mantido exatamente como se encontra. Por exemplo :
http://localhost/H_WEBDEMO.APL
A grande vantagem de se utilizar dos arquivos ADVPL ASP em relação a criar funções
APL simples, decorre do fato de que nas funções APL simples o desenvolvedor deve se
preocupar em retornar todo o HTML necessário para a correta exibição no Web
Browser.
E também, como o ADVPL ASP mistura o script HTML com o código interpretável,
pode-se criar um arquivo APH utilizando o editor desejado (como o Microsoft
FrontPage, por exemplo) e inserir nele os códigos Advpl necessários entre as Tags.
Outro detalhe importante é que pode-se utilizar as estruturas de fluxo da linguagem
ADVPL para repetir comandos do próprio script HTML (por exemplo, colocar um
comando de script HTML dentro de um comando While em ADVPL):
Note que também pode existir diferentes blocos de código interpretável separados pelos
delimitadores, dentro de um mesmo arquivo.
Tão importante quanto mesclar código interpretável com script de formatação HTML, é
utilizar os comandos ADVPL para alterar o script de formatação. Ou seja, colocar o
conteúdo de variáveis, campos, etc, diretamente no HTML que será enviado à aplicação
client (ao Browser por exemplo). Isso pode ser realizado através dos delimitadores de
avaliação. Os delimitadores de avaliação são <%= para abertura e %> para
encerramento. Diferentemente dos delimitadores de código interpretável, estes devem
sempre estar na mesma linha. Com eles pode-se criar uma linha de script HTML, cujo
conteúdo contém uma expressão que será avaliada em tempo de execução, e seu
resultado inserido como parte do Html retornado ào Browse :
<b>Esta linha é HTML, mas o horário exibido aqui: <%= Time() %> foi obtido em
tempo de execução no Servidor.</b>
No exemplo acima, a linha HTML será retornada para o Browser com o resultado da
função time (ou seja, a hora atual no servidor) inserido no texto.
Utilizando todos esses conceitos, pode-se criar toda uma aplicação Web baseada no
Protheus. Ou seja, o processamento e acesso aos dados fica por conta do Protheus
Server, e a interface fica por conta do Browser (utilizando o HTML) .
Importante
1. A Abertura e fechamendo dos delimitadores de execução <% ... %> devem estar
isoladas em suas respectivas linhas, não devendo ter qualquer conteudo adicional, nem
duas aberturas e fechamentos na mesma linha. Partindo dessa premissa, veja abaixo
alguns exemplos de como inserir o código Advpl abaixo dentro de um APH:
IF !lOk
nErro++
Endif
CERTO
<%
IF !lOk
nErro++
Endif
%>
CERTO
CERTO
ERRADO
2. Quantò àos delimitadores de avaliação <%= ... %> , podemos ter várias aberturas e
fechamentos na mesma lionha , porém não podemos ter uma abertura e seu respectivo
fechamento em linhas diferentes.
3. Uma linha qualquer em um arquivo .APH nao deve conter mais do que 150
Caracteres, pois o Parser insere caracteres de controle em cada linha do mesmo durante
a pré-compilação . e a linha final resultante não pode ultrapassar 254 caracteres, pois
neste caso isto impossibilita a compilação do APH.
02. Executando funções Advpl via HTTP
Revisão: 28/04/2004
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versão 8.11
A utilização do protocolo HTTP não envolve o uso de uma conexão persistente entre o
Web Browser e o Servidor HTTP : Isto significa que, ao ser solicitada uma página,
imagem ou até o processamento de uma função, o Web Browser abre uma conexão com
o Server HTTP, realiza a solicitação e fica com a conexão aberta, aguardando pelo
retorno do Server. Quando o server já houver enviado os dados solicitados, a conexão é
fechada .
Processamento de Funções
Para o retorno de páginas estáticas, imagens e demais arquivos via HTTP, o servidor
identifica o que está sendo solicitado pelo Web Browser através da extensão do Link.
Por exemplo, ao receber uma soilicitação da URL http://oservidor/htmls/imagem.gif, o
Server HTTP sabe que deve procurar um arquivo chamado imagem.gif, dentro da pasta
htmls a partir da pasta local no servidor configurada para armazenar os arquivos para o
acesso HTTP.
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versão 8.11
Uma página ASP (Active Server Pages) é uma página HTML contendo código
interpretável em uma linguagem compreensível ao servidor HTTP em uso. Por
exemplo, o IIS da Microsoft utiliza o VBScript para criar suas páginas ASP, do mesmo
modo que o Protheus utiliza o ADVPL. Uma página ASP é uma combinação de script
HTML e código interpretável. No ADVPL ASP esse código é padrão xBase, portanto a
preocupação maior daqueles que já conhecem e trabalham com o Protheus e desejam
desenvolver páginas ativas para aplicações Web utilizando essa facilidade é conhecer
HTML.
Os arquivos ADVPL ASP têm a extensão padrão .APH. São arquivos texto e devem ser
adicionados a um projeto no Protheus IDE e compilados da mesma maneira que os
programas tradicionais. A diferença é que o Protheus Server identificará que se trata de
um ADVPL ASP e executará uma espécie de tradutor (parser) antes que a compilação
seja executada. Este parser irá transformar todo o arquivo em uma função única, que
receberá os mesmos parâmetros das funções APL simples, como explicado
anteriormente no Item 'Desenvolvendo Funções .APL', e retornará uma string.
Por se tornar uma função no momento da compilação, não é possível utilizar a cláusula
FUNCTION para criar outras funções dentro de um arquivo APH. Caso exista essa
necessidade, tais funções devem ser criadas em um arquivo PRW tradicional e
chamadas de dentro do APH.
A extensão APH para o nome dos arquivos é obrigatória. Qualquer outra extensão usada
no nome do arquivo não será reconhecida e o parser do IDE não será executado durante
a compilação. Foi criada também a extensão de arquivos .AHU ( Aph de Usuário ), que
possui o mesmo tratamento de Parser do aruqivo APH , gerando uma função prefixada
com L_ . A diferença é que a função gerada pelo AHU pode ser gerada sem a
necessiade de autorização de compilação com permissão para substituir fontes
microsiga , por tratar-se de um Aph de Usuário, qeuivalente à uma User Function .
Assim como outros ASP´s, a diferenciação entre script HTML e código é efetuada
através dos caracteres <% para indicação de abertura de código e %> para indicação do
encerramento de código. Por exemplo, o HTML abaixo contém um pedaço de código
ADVPL separado pelos delimitadores:
Quando este arquivo for requisitado ao Protheus Server (através de uma chamada em
URL por exemplo) o código entre os delimitadores será executado, porém o script
colocado ao redor do código será mantido exatamente como se encontra. Por exemplo :
http://localhost/H_WEBDEMO.APL
A grande vantagem de se utilizar dos arquivos ADVPL ASP em relação a criar funções
APL simples, decorre do fato de que nas funções APL simples o desenvolvedor deve se
preocupar em retornar todo o HTML necessário para a correta exibição no Web
Browser.
E também, como o ADVPL ASP mistura o script HTML com o código interpretável,
pode-se criar um arquivo APH utilizando o editor desejado (como o Microsoft
FrontPage, por exemplo) e inserir nele os códigos Advpl necessários entre as Tags.
Outro detalhe importante é que pode-se utilizar as estruturas de fluxo da linguagem
ADVPL para repetir comandos do próprio script HTML (por exemplo, colocar um
comando de script HTML dentro de um comando While em ADVPL):
Note que também pode existir diferentes blocos de código interpretável separados pelos
delimitadores, dentro de um mesmo arquivo.
Tão importante quanto mesclar código interpretável com script de formatação HTML, é
utilizar os comandos ADVPL para alterar o script de formatação. Ou seja, colocar o
conteúdo de variáveis, campos, etc, diretamente no HTML que será enviado à aplicação
client (ao Browser por exemplo). Isso pode ser realizado através dos delimitadores de
avaliação. Os delimitadores de avaliação são <%= para abertura e %> para
encerramento. Diferentemente dos delimitadores de código interpretável, estes devem
sempre estar na mesma linha. Com eles pode-se criar uma linha de script HTML, cujo
conteúdo contém uma expressão que será avaliada em tempo de execução, e seu
resultado inserido como parte do Html retornado ào Browse :
<b>Esta linha é HTML, mas o horário exibido aqui: <%= Time() %> foi obtido em
tempo de execução no Servidor.</b>
No exemplo acima, a linha HTML será retornada para o Browser com o resultado da
função time (ou seja, a hora atual no servidor) inserido no texto.
Utilizando todos esses conceitos, pode-se criar toda uma aplicação Web baseada no
Protheus. Ou seja, o processamento e acesso aos dados fica por conta do Protheus
Server, e a interface fica por conta do Browser (utilizando o HTML) .
Importante
1. A Abertura e fechamendo dos delimitadores de execução <% ... %> devem estar
isoladas em suas respectivas linhas, não devendo ter qualquer conteudo adicional, nem
duas aberturas e fechamentos na mesma linha. Partindo dessa premissa, veja abaixo
alguns exemplos de como inserir o código Advpl abaixo dentro de um APH:
IF !lOk
nErro++
Endif
CERTO
<%
IF !lOk
nErro++
Endif
%>
CERTO
CERTO
ERRADO
2. Quantò àos delimitadores de avaliação <%= ... %> , podemos ter várias aberturas e
fechamentos na mesma lionha , porém não podemos ter uma abertura e seu respectivo
fechamento em linhas diferentes.
3. Uma linha qualquer em um arquivo .APH nao deve conter mais do que 150
Caracteres, pois o Parser insere caracteres de controle em cada linha do mesmo durante
a pré-compilação . e a linha final resultante não pode ultrapassar 254 caracteres, pois
neste caso isto impossibilita a compilação do APH.
04. Desenvolvimento de Funções .APL
Revisão: 27/04/2004
Abrangência
Versão 5.07 Versão 5.08 Versão 6.09 Versão 7.10 Versão 8.11
{ {“cod”, “000001”},
{“nome”, “PRODUTO DE TESTE”},
{“quant”, “20”} }
A função a seguir é um bom exemplo para ser executado através de um Web Browser.
Ela retorna uma string contendo a página HTML onde está escrita a mensagem “Hello
World” e a lista de parâmetros passados na linha de URL. Para testá-la, crie um arquivo
novo no Protheus IDE, cole o código abaixo e salve o arquivo como WEBDEMO.PRW.
Após compilar o programa, basta chamar em um Web Browser uma URL como:
http://localhost/u_webdemo.apl?cod=000001&desc=DESCRICAO DO
PRODUTO&qtd=2
Código da função:
#include 'rwmake.ch'
User Function
WebDemo(__aCookies,__aPostParms,__nProcID,__aProcParms,__cHTTPPage)
Local cHTML := ''
Local i
If Len(__aProcParms) = 0
cHTML += '<p>Nenhum parâmetro informado na linha de URL.'
Else
For i := 1 To Len(__aProcParms)
Next i
Endif
Return(cHTML)
Importante
Para crias as funções que serão utilizadas em chamadas via um Web Browser, ou seja,
em qualquer request HTTP, deve-se seguir o procedimento normal de criação de
funções no AP5: utilizando o AP5 IDE para a edição e para a compilação.
Note que no caso de funções do usuário (User Function) o nome chamado na URL do
Browser também deverá conter o U_ no começo da função, por exemplo:
http://servidor/u_WebDemo.apl
Configuração Mínima
[http]
Port=80
Path=(caminho absoluto de disco para arquivos publicados no servidor )
Environment=(nome do environment do Serber que será utilizado para o
processamento)
Para testar sua configuração, reinicie o server Protheus e chame via WebBrowser a url :
http://localhost/time.apl
Deverá ser mostrada no Browse o horário atual, no formato hh:mm:ss, no Servidor, pois
este é o resultado da função Advpl TIME() .
Abrangência
Como visto em tópicos anteriores, ao desenvolver uma função para ser executada via
link .apl, a função deve ser responsável pela abertura do ambiente e inicializações
necessárias para um processamento qualquer, e após ser finalizado este processamento,
o ambiente montado e utilizado é fechado automaticamente, de modo que cada
requisição de processamento de usuário através de link .apl irá iniciar uma nova Thread,
onde o ambiente deverá ser preparado novamente. A programação neste tipo de
ambiente exige muito do servidor Protheus.
A utilização de Working Threads exige a definição mínima de duas funções Advpl, que
serão executadas em dois momentos distintos : A primeira função é responsável pela
inicialização do ambiente comum de execução de requisições, devendo estabelecer
conexão com a Base de Dados utilizada, abrir as tabelas utilizadas no Site e preparar as
variáveis comuns de utilização da aplicação. A segunda função será responsável por
encapsular a requisição do usuário realizada a partir do Web Browse : Ela receberá
como parâmetro o nome do link digitado e macro-executar a função correspondente,
realizando o tratamento de erro e retorno.
Deste modo, um ambiente uma vez inicializado não é fechado, e pode ser utilizado por
vários usuários que estão navegando no Site, o que viabiliza um grande ganho em
perfoemance e carga do Servidor.
Para nos utilizarmos das Working Threasd WEB, devemos criar as funções
responsáveis pela inicialização de ambiente e a função de conexão.
A função de conexão recebe os mesmos seis parâmetros de uma função chamada via
link .apl, e um sétimo parametro, String, que contém apenas o nome da função chamada
no link . Por exemplo, a chamada de um link http://localhost/u_teste.apw, no sétimo
parâmetro da função de conexão a string 'u_teste'. A função de conexão deve ter
tratamento de erro próprio e diferenciado, e sempre deverá retornar um conteúdo do tipo
String.
Para nos utilizarmos das Working Threasd WEBEX, devemos também criar as funções
responsáveis pela inicialização de ambiente e a função de conexão.
A função de conexão não recebe diretamente parâmetro algum ! Isso mesmo : Todos os
parâmetros recebidos em versões anteriores através de Arrays, são recebidos agora por
Alias Virtuais de alta velocidade :
HttpGet
HttpPost
HttpCookies
HttpHeadIn
Abrangência
Configuração Mínima
[http]
Enable=1
Path=c:\Ap_Data\http
Observação: Vale lembrar que , após ter inserido a configuração do [http] no INI do
Protheus, é importante baixar o Server e subir novamente.
<hr>
Ola Mundo HTTP
<hr>
[http]
Enable=1
Path=c:\Ap_Data\http
Environment=EnvADS710
Para testar a execução de funções , abra um Web Browse na estação servidora, e acesse
o link http://localhost/time.apl . ISto´irá executar a função Advpl TIME() , que retornará
ao Browse uma string contendo o horário atual no servidor no formato HH:MM:SS
[ERP_APWEBEX]
type=WEBEX
onstart=STARTWEBEX
onconnect=CONNECTWEBEX
Environment=EnvADS710
Instances=1,3
SigaWeb=MAK
Agora , para que esta seção de Jobs seja utilizada para o atendimento efetivo de
requisições .;apw , devemos estecificá-la na seção http , através da chave REsponseJob.
No caso , inserimos a chave ResponseJob=ERP_APWEBEX , fincando a seção HTTP
conforme abaixo:
[http]
Enable=1
Path=c:\Ap_Data\http
Environment=EnvADS710
ResponseJob=ERP_APWEBEX
Como as requisições via .apl e via .apw são independentes , é possível configurar a
seção http para que Environments diferentes respondam à requisições .apl e .apw , ou
que não sejam atendidas requisições .apl , apenas .apw .
Todas as configurações acima vistas pertencem à seção default do HTTP . De modo que
, tanto faz acessarmos o servidor pelo nome como pelo IP, que o resultado serrá o
mesmo. Porém, para a utilização de demais recursos, como diretórios virtuais e mais de
um site no mesmo servidor , precisamos configurar um host de acesso.
Por exemplo, vamos criar uma configuração de HOST para que o servidor , caso seja
acessado pelo NOME da maquia via HTTP , seja visualizado um outro site , e apenas
sejam atendidos à links .apl : Para isso , devemos criar uma nova seção no .INI , cujo
nome deve ser exatamente o host que será acessado ( como o exemplo vamos supor que
o servidor de testes chama-se srvteste ) , logo devemos criar uma seção com este nome .
Nesta seção do INI , devemos no mínimo especificar um Path de acesso àos arquivos, e
as demais configurações vistas até agora da seção http são opcionais. A configuração
PORT do HTTP em um host não é suportada: Não é possível subir um server protheus
em mais de uma porta HTTP.
[srvteste]
Path=c:\Ap_Data\Testes
Environment=EnvTOP710
Deste modo, caso o servidor seja acessado via http através de LOCALHOST ou do IP
do Server , será permitido o acesso às funcionalidades configuradas na seção HTTP.
Caso seja acessado via nome do servidor ( http://srvteste ) , serão acessados os arquivos
de outra pasta , e as requisições .apl serão atendidas pelo Ambiente EnvTOP710 .
Utilizando este tipo de configuração, podemos subir vários sites diferentes na mesma
aplicação servidor Protheus, cada qual com o seu diretório raiz de publicações , seus
ambientes independentes, atendendo ou nâo à requisições .apl e/ou .apw.
Observações Importantes
Visto desta forma, recomendamos fortemente que a seção [http] possua apenas
especificado um Path em disco que esteja vazio, e seja criada uma ou mais
configurações de host com as suas devidas propriedades especificas.
Todas as demais chaves relacionadas à configuração HTTP e aos Jobs WEB e WEBEX
são opcionais, para atender à necessiades específicas. Estas chaves estão explicadas em
maiores detalhes no DEM , na seção XXX
Da mesma forma que a criação de hosts, podemos criar um novo host utilizando a barra
de divisão '/' para especiicar uma 'pasta virtual' , quue permite a flexibilidade de termos
uma pasta dentro de um mesmo host que se comporte como um outro host : Ainda
baseando-se no .INI montado nestes exemplos para o servidor de testes, vamos supor
que exista uma pasta no disco ( por exemplo , c:\Ap_data\Docs ) , que contenha
arquivos HTML de uma documentação que deve estar disponçivel na web , utilizando
também o host http://srvteste . Porém , o host srvteste já aponta para o diretório
c:\Ap_data\Testes.
Com o recurso de criação de diretorio virtual no HTTP , criamos apenas uma nova
entrada do mesmo host , colocando no nome do mesmo uma barra de divisão'/' , seguido
do nome de uma pasta a ser acessada via HTTP ( que não precisa necessariamente
existir no disco) , e dentro desta seção acrescentar a chave path , apontando para o
diretório desejado , da mesma maneira utilizada para configurar um host.
No exemplo abaixo , criamos a pasta virtual info, dentro do host srvteste, apontando
para o path do disco c:\Ap_Data\Docs. De modo que , ao ser acessado via url o
endereço http://srvteste/info , a partir dele serão acessados os arquivos da pasta
c:\Ap_Data\Docs
[srvteste/info]
Path=c:\Ap_Data\Docs
Vejamos agora como ficou o nosso arquivo .INI, com todas as configurações acima
exemplificadas :
;; Configuração da pasta virtual info , no host srvteste , para apontar para um path no
disco com documentos
[srvteste/info]
Path=c:\Ap_Data\Docs
Infra-Estrutura APWEBEX
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
// Executa uma query de contagem de registros de uma tabela do sistema
cQuery := 'SELECT count(*) as QTDREC from SA1010'
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.
Comandos - OPEN QUERY
Revisão: 08/12/2003
Abrangência
Sintaxe
Parâmetros
Descrição
Caso a Query nao possa ser aberta, por erro de sintaxe , devido à thread atual não estar
conectada com o TopConnect , ou outro erro , será gerado um log de erro , informando
o Alias , o Stack ( Pilha de Chamadas ) de execucão , e o conteúdo da Query para
Debug.
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
Infra-Estrutura APWEBEX - Exemplo da
função ESCAPE
Revisão: 10/12/2003
Abrangência
Nos exemplo abaixo, utilizamos a função escape() para formatar parâmetros para inserir
em uma URL.
cUrl := 'http://localhost/webinfo.apw'
Abrangência
cJobType := GetJobProfString('type','(empty)' )
cInstances := GetJobProfString('Instances','(empty)' )
cInacTime := GetJobProfString(InactiveTimeout','(default)' )
cExpTime := GetJobProfString('ExpirationTime','(default)' )
Infra-Estrutura APWEBEX - 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---"})
Abrangência
#include "protheus.ch"
#include "apwebex.ch"
// Le o arquivo
cTTXFile := memoread('\Web\Default.htm')
Return cHtml
/*
*/
Infra-Estrutura APWEBEX - Exemplo da
função HTMLNOTAGS
Revisão: 08/12/2003
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')
...
Infra-Estrutura APWEBEX - Exemplo da
função REDIRPAGE
Revisão: 10/12/2003
/*
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')
...
Infra-Estrutura APWEBEX - Exemplo da
função RETSQLACE
Revisão: 10/12/2003
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)+"%' "
Infra-Estrutura APWEBEX - 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."
/*
*/
Infra-Estrutura APWEBEX - 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.