Programação Advpl para WEB

Este tópico engloba todo o conhecimento e informações necessárias para usufruirmos da tecnologia implementada na ferramenta Protheus e de sua Infra-Estrutura, para o desenvolvimento de aplicações orientadas à
Internet.
ob!etivo desta seç"o # centrali$ar as informações pertinentes ao desenvolvimento de pro!etos %E&, em uma ferramenta 'ue permita o acesso e atuali$ações destes dados de maneira rápida e din(mica, al#m de
mostrar uma boa parte do 'ue # poss)vel fa$er utili$ando-se dos recursos dispon)veis na ferramenta Protheus.
Para 'ue se!a poss)vel compreender as funcionalidades e tecnologias envolvidas no processo de desenvolvimento de uma aplicaç"o %E&, utili$ando-se da ferramenta Protheus, # de fundamental import(ncia 'ue os
tópicos deste grupo se!am lidos e assimilados, pois nos mesmos encontram-se as informações 'ue servem de base para a compreens"o e conse'uente melhor aproveitamento dos recursos dispon)veis.
Para se ter uma id#ia superficial do poder do Protheus como servidor http, esta aplicaç"o * +E, - +ocumentaç"o Eletr-nica ,icrosiga . foi escrita em /dvpl-/0P, utili$ando uma compilaç"o do 0erver Protheus
I0/PI, integrado com o II0 1, utili$ando um &anco de +ados 023 0erver 4555 atrav#s do 6op7onnect 8, utili$ando se de %or9ing 6hreads E:tended *%E&E;. e das funções de Infra-Estrutura da lib /P%E&E;.
01. O Servidor Protheus como um servidor HTTP
O Servidor Protheus como um servidor HTTP
servidor Protheus pode ser configurado para trabalhar como um servidor %E&. Isso significa trabalhar como um servidor de re'uisições dos protocolos <66P e=ou >6P, do mesmo modo 'ue outros servidores
conhecidos no mercado *por e:emplo, o II0 ? Internet Information 0erver, da ,icrosoft *@. ou o /pache para 3inu:.. /ssim, basta ter o Protheus para poder criar sua própria Intranet num ambiente de rede local, ou
publicar o endereço IP da má'uina com o servidor Protheus na Internet e e:ecutar funções atrav#s de @P7 ou simplesmente criar o seu próprio %eb 0ite com páginas <6,3 estáticas ou din(micas.
Serviço de HTTP
protocolo <66P *<Aper 6e:t 6ransfer Protocol. # o protocolo utili$ado na comunicaç"o entre um servidor e um %eb &roBser. C o protocolo utili$ado para o envio e recebimento de páginas formatadas em padrões
0D,3 *<6,3,;,3, etc.. Este protocolo se baseia principalmente em dois comandosE DE6 e P06. comando DE6 # utili$ado para obter alguma informaç"o do servidor <66P e o P06 para FpostarG informações
para o servidor. ,as adiante, será mais fácil compreender onde tais comandos s"o utili$ados no servidor Protheus.
Htili$ando o servidor Protheus como um servidor <66P, o mesmo poderá ser acessado atrav#s de um %eb &roBser como o Internet E:plorer por e:emplo, 'ue receberá as páginas <6,3 enviadas de um diretório
configurado no servidor. /dicionalmente ao envio e recebimento de páginas estáticas formatadas, pode-se utili$ar a linguagem /dvpl do Protheus para processar páginas mistas, 'ue cont#m código /dvpl e comandos
<6,3 de formataç"o. 6ais páginas ser"o processadas no servidor Protheus, e ent"o enviadar para o %eb &roBser, 'ue irá formatá-las de acordo com os comandos <6,3 contidos. 6amb#m # poss)vel e:ecutar
diretamente funções compiladas no repositório do Protheus, atrav#s de um re'uest <66P *por e:emplo, atrav#s de um P06 em um formulário em <6,3, ou de um lin9, ou mesmo diretamente na linha de H@3 do
%eb &roBser. mesmo vale para 'ual'uer outra aplicaç"o 'ue se!a capa$ de efetuar comandos DE6 ou P06 utili$ando o protocolo <66P..
Páginas Dinâmicas e Advpl ASP
2uando # utili$ado o servidor Protheus para desenvolvimento de aplicações %eb, # poss)vel lançar m"o do recurso de criaç"o de páginas din(micas, isto #, uma re'uisiç"o <66P reali$ada ào 0erver
Protheus, devidamente configurado para atendI-la, dispara o processamento de uma funç"o no 0ervidor, e esta funç"o encarrega-se de devolver ào usuário uma página <6,3 com o resultado do processamento.
Para viabili$ar o desenvolvimento deste tipo de funç"o, foi criado um tipo de ar'uivo especial no Protheus I+E, com a e:tens"o ./P<, onde # inserido um conteJdo <tml a ser enviado ao %eb &roBser, e instruções
/dvpl 'ue ser"o processadas no momento em 'ue a página for solicitada ao servidor Protheus, sendo poss)vel de forma prática KmesclarK um conteJdo gerado por este processamento à uma página <tml para
ser retornado ào %eb &roBser.
Los tópicos abai:o relacionados, será visto em mais detalhes as configurações necessárias para atender à estas re'uisições, as caracter)sticas particulares de cada uma delas, e as funções de infra-estrutura criadas para
au:iliar o desenvolvimento de aplicações %eb.
/l#m da criaç"o de ar'uivos, foi disponibili$ado no repositório padr"o do Protheus as funções de infra-estrutura /p%ebE:, desenvolvidas para permitir um melhor aproveitamento dos recursos disponibili$ados pela
ferramenta Protheus para o desenvolvimento de soluções %eb. Estas funcionalidades s"o e:ploradas no tópico Infra-Estrutura /p%ebE:.
0. E!ecuta"do #u"ç$es Advpl via HTTP
Princípio de Funcionamento do HTTP
/ utili$aç"o do protocolo <66P n"o envolve o uso de uma cone:"o persistente entre o %eb &roBser e o 0ervidor <66P E Isto significa 'ue, ao ser solicitada uma página, imagem ou at# o processamento de uma
funç"o, o %eb &roBser abre uma cone:"o com o 0erver <66P, reali$a a solicitaç"o e fica com a cone:"o aberta, aguardando pelo retorno do 0erver. 2uando o server !á houver enviado os dados solicitados, a cone:"o
# fechada .
Processamento de Funções
Para o retorno de páginas estáticas, imagens e demais ar'uivos via <66P, o servidor identifica o 'ue está sendo solicitado pelo %eb &roBser atrav#s da e:tens"o do 3in9. Por e:emplo, ao receber uma soilicitaç"o da
H@3 httpE==oservidor=htmls=imagem.gif, o 0erver <66P sabe 'ue deve procurar um ar'uivo chamado imagem.gif, dentro da pasta htmls a partir da pasta local no servidor configurada para arma$enar os ar'uivos para o
acesso <66P.
Lo servidor Protheus, foram implementadas duas e:tensões de 3in9 para permitir a e:ecuç"o de funções /dvpl atrav#s de uma re'uisiç"o <66P E / e:tens"o ./P3 e a e:trens"o ./P% . 2uando o servidor recebe uma
re'uisiç"o via <66P, por e:emplo da url httpE==oservidor=time.apl, e está corretamente configurado para atender à esta re'uisiç"o, o Protheus 0erver reali$a o processamento, e informa para o %eb &roBser solicitante
'ue a string 'ue será retornada deve ser interpretada pelo %eb &roBser como sendo um 0cript <6,3 .
Características comuns do processamento de funções Advpl via HTTP
Independente da e:tens"o de lin9 utili$ada, e:istem caracter)sticas e pr#-re'uisitos comuns ao funcionamento de ambas as re'uisições, 'ue seguem abai:o E
• / funç"o, se!a /dvpl ou uma funç"o compilada no @epositório, deve obrigatoriamente ter um retorno do tipo 0tring, pois o %eb &roBser solicitante será informado pelo 0erver Protheus 'ue a string
retornada deverá ser interpretada e mostrada pelo &roBser como um <6,3.
• +evido à origem da re'uisiç"o n"o ter relaç"o alguma com a interface @emote do Protheus, n"o # poss)vel utili$ar determinadas funções /dvpl 'ue foram escritas e:clusivamente para esta interface,
como por e:emplo as funções ,sg0top, /lert, e demais funções e ob!etos de Interface de Manelas.
'ue irá diferenciar uma funç"o e:ecutada via lin9 .apl e .apB será as etapas de e:ecuç"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 .apB
Hma página /0P */ctive 0erver Pages. # uma página <6,3 contendo código interpretável em uma linguagem compreens)vel ao servidor <66P em uso. Por e:emplo, o II0 da ,icrosoft utili$a o N&0cript para criar
suas páginas /0P, do mesmo modo 'ue o Protheus utili$a o /+NP3. Hma página /0P # uma combinaç"o de script <6,3 e código interpretável. Lo /+NP3 /0P esse código # padr"o :&ase, portanto a preocupaç"o
maior da'ueles 'ue !á conhecem e trabalham com o Protheus e dese!am desenvolver páginas ativas para aplicações %eb utili$ando essa facilidade # conhecer <6,3.
Características do ADVPL ASP - Arqivos !APH
s ar'uivos /+NP3 /0P tIm a e:tens"o padr"o ./P<. 0"o ar'uivos te:to e devem ser adicionados a um pro!eto no Protheus I+E e compilados da mesma maneira 'ue os programas tradicionais. / diferença # 'ue o
Protheus 0erver identificará 'ue se trata de um /+NP3 /0P e e:ecutará uma esp#cie de tradutor *parser. antes 'ue a compilaç"o se!a e:ecutada. Este parser irá transformar todo o ar'uivo em uma funç"o Jnica, 'ue
receberá os mesmos par(metros das funções /P3 simples, como e:plicado anteriormente no Item K+esenvolvendo >unções ./P3K, e retornará uma string.
desenvolvedor n"o precisa se preocupar em retornar <,63 algum, pois o /P< tamb#m # um ar'uivo <6,3. / funç"o 'ue foi gerada na compilaç"o irá se encarregar de retornar o <6,3 contigo no ar'uivo,
depois 'ue o código foi processado. Hm /r'uivo /P< gera no repositório de b!etos do Protheus uma funç"o com o mesmo nome do ar'uivo , por#m prefi:ada com <O P nomeOdoOar'uivoOaph
Por se tornar uma funç"o no momento da compilaç"o, n"o # poss)vel utili$ar a cláusula >HL76IL para criar outras funções dentro de um ar'uivo /P<. 7aso e:ista essa necessidade, tais funções devem ser criadas
em um ar'uivo P@% tradicional e chamadas de dentro do /P<.
/ e:tens"o /P< para o nome dos ar'uivos # obrigatória. 2ual'uer outra e:tens"o usada no nome do ar'uivo n"o será reconhecida e o parser do I+E n"o será e:ecutado durante a compilaç"o. >oi criada tamb#m a
e:tens"o de ar'uivos ./<H * /ph de Hsuário ., 'ue possui o mesmo tratamento de Parser do aru'ivo /P< , gerando uma funç"o prefi:ada com 3O . / diferença # 'ue a funç"o gerada pelo /<H pode ser gerada sem a
necessiade de autori$aç"o de compilaç"o com permiss"o para substituir fontes microsiga , por tratar-se de um /ph de Hsuário, e'uivalente à uma Hser >unction .
/ssim como outros /0PQs, a diferenciaç"o entre script <6,3 e código # efetuada atrav#s dos caracteres RS para indicaç"o de abertura de código e ST para indicaç"o do encerramento de código. Por e:emplo, o
<6,3 abai:o cont#m um pedaço de código /+NP3 separado pelos delimitadoresE
<html><head><title>ADVPL ASP Demo</title></head>
<body>
<p>Bem vindo ao mundo do ADVPL ASP!</p>
<%
// Soma os 100 pimeios n!meos
Lo"al i# nSoma $% 0
&o i $% 1 'o 100
(Soma )% i
(e*t i
%>
</body>
</html>
2uando este ar'uivo for re'uisitado ao Protheus 0erver *atrav#s de uma chamada em H@3 por e:emplo. o código entre os delimitadores será e:ecutado, por#m o script colocado ao redor do código será mantido
e:atamente como se encontra. Por e:emplo E
httpE==localhost=<O%E&+E,./P3
/ grande vantagem de se utili$ar dos ar'uivos /+NP3 /0P em relaç"o a criar funções /P3 simples, decorre do fato de 'ue nas funções /P3 simples o desenvolvedor deve se preocupar em retornar todo o <6,3
necessário para a correta e:ibiç"o no %eb &roBser.
E tamb#m, como o /+NP3 /0P mistura o script <6,3 com o código interpretável, pode-se criar um ar'uivo /P< utili$ando o editor dese!ado *como o ,icrosoft >rontPage, por e:emplo. e inserir nele os códigos
/dvpl necessários entre as 6ags. utro detalhe importante # 'ue pode-se utili$ar as estruturas de flu:o da linguagem /+NP3 para repetir comandos do próprio script <6,3 *por e:emplo, colocar um comando de
script <6,3 dentro de um comando %hile em /+NP3.E
<% +hile !,-&./ %>
<B> ,sta linha se0 epetida no 1'2L at3 o"oe o 4im de a5uivo </B>
<%
dbS6ip./
U
,ndDo
%>
Lote 'ue tamb#m pode e:istir diferentes blocos de código interpretável separados pelos delimitadores, dentro de um mesmo ar'uivo.
6"o importante 'uanto mesclar código interpretável com script de formataç"o <6,3, # utili$ar os comandos /+NP3 para alterar o script de formataç"o. u se!a, colocar o conteJdo de variáveis, campos, etc,
diretamente no <6,3 'ue será enviado à aplicaç"o client *ao &roBser por e:emplo.. Isso pode ser reali$ado atrav#s dos delimitadores de avaliaç"o. s delimitadores de avaliaç"o s"o %&' para abertura e &( para
encerramento. +iferentemente dos delimitadores de código interpretável, estes devem sempre estar na mesma linha. 7om eles pode-se criar uma linha de script <6,3, cu!o conteJdo cont#m uma e:press"o 'ue será
avaliada em tempo de e:ecuç"o, e seu resultado inserido como parte do <tml retornado ào &roBse E
<b>,sta linha 3 1'2L# mas o ho0io e*ibido a5ui$ <%% 'ime./ %> 4oi obtido em tempo de e*e"u78o no Sevido9</b>
Lo e:emplo acima, a linha <6,3 será retornada para o &roBser com o resultado da funç"o time *ou se!a, a hora atual no servidor. inserido no te:to.
Htili$ando todos esses conceitos, pode-se criar toda uma aplicaç"o %eb baseada no Protheus. u se!a, o processamento e acesso aos dados fica por conta do Protheus 0erver, e a interface fica por conta do &roBser
*utili$ando o <6,3. .
Importante
/o codigicar um ar'uivo ./P< e=ou ./<H , devemos estar atentos às regras de utili$aç"o dos delimitadores de e:ecuç"o e avaliaç"o /dvpl E
U. / /bertura e fechamendo dos delimitadores de e:ecuç"o RS ... ST devem estar isoladas em suas respectivas linhas, n"o devendo ter 'ual'uer conteudo adicional, nem duas aberturas e fechamentos na mesma linha.
Partindo dessa premissa, ve!a abai:o alguns e:emplos de como inserir o código /dvpl abai:o dentro de um /P<E
IF !lOk
nErro++
Endif
)E*TO
<%
IF !lOk
nErro++
Endif
%>
)E*TO
<% IF !lOk %>
<% nErro++ %>
<% Endif %>
)E*TO
<% IF !lOk ; nErro++ ; Endif %>
E**A+O
<% IF !lOk %><% nErro++ %> -- 2 aberturas e fechamentos na mesma linha
<% Endif %>
4. 2uantV àos delimitadores de avaliaç"o RSW ... ST , 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.
X. Hma linha 'ual'uer em um ar'uivo ./P< nao deve conter mais do 'ue U15 7aracteres, 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 418 caracteres, pois neste caso isto impossibilita a compilaç"o do /P<.
0. E!ecuta"do #u"ç$es Advpl via HTTP
@evis"oE 4Y=58=4558
/brangIncia
Ners"o 1.5Z Ners"o 1.5Y Ners"o [.5\ Ners"o Z.U5 Ners"o Y.UU
Princípio de Funcionamento do HTTP
/ utili$aç"o do protocolo <66P n"o envolve o uso de uma cone:"o persistente entre o %eb &roBser e o 0ervidor <66P E Isto significa 'ue, ao ser solicitada uma página, imagem ou at# o processamento de uma
funç"o, o %eb &roBser abre uma cone:"o com o 0erver <66P, reali$a a solicitaç"o e fica com a cone:"o aberta, aguardando pelo retorno do 0erver. 2uando o server !á houver enviado os dados solicitados, a cone:"o
# fechada .
Processamento de Funções
Para o retorno de páginas estáticas, imagens e demais ar'uivos via <66P, o servidor identifica o 'ue está sendo solicitado pelo %eb &roBser atrav#s da e:tens"o do 3in9. Por e:emplo, ao receber uma soilicitaç"o da
H@3 httpE==oservidor=htmls=imagem.gif, o 0erver <66P sabe 'ue deve procurar um ar'uivo chamado imagem.gif, dentro da pasta htmls a partir da pasta local no servidor configurada para arma$enar os ar'uivos para o
acesso <66P.
Lo servidor Protheus, foram implementadas duas e:tensões de 3in9 para permitir a e:ecuç"o de funções /dvpl atrav#s de uma re'uisiç"o <66P E / e:tens"o ./P3 e a e:trens"o ./P% . 2uando o servidor recebe uma
re'uisiç"o via <66P, por e:emplo da url httpE==oservidor=time.apl, e está corretamente configurado para atender à esta re'uisiç"o, o Protheus 0erver reali$a o processamento, e informa para o %eb &roBser solicitante
'ue a string 'ue será retornada deve ser interpretada pelo %eb &roBser como sendo um 0cript <6,3 .
Características comuns do processamento de funções Advpl via HTTP
Independente da e:tens"o de lin9 utili$ada, e:istem caracter)sticas e pr#-re'uisitos comuns ao funcionamento de ambas as re'uisições, 'ue seguem abai:o E
• / funç"o, se!a /dvpl ou uma funç"o compilada no @epositório, deve obrigatoriamente ter um retorno do tipo 0tring, pois o %eb &roBser solicitante será informado pelo 0erver Protheus 'ue a string
retornada deverá ser interpretada e mostrada pelo &roBser como um <6,3.
• +evido à origem da re'uisiç"o n"o ter relaç"o alguma com a interface @emote do Protheus, n"o # poss)vel utili$ar determinadas funções /dvpl 'ue foram escritas e:clusivamente para esta interface,
como por e:emplo as funções ,sg0top, /lert, e demais funções e ob!etos de Interface de Manelas.
'ue irá diferenciar uma funç"o e:ecutada via lin9 .apl e .apB será as etapas de e:ecuç"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 .apB
5X. Páginas din(micas - /dvpl /0P
@evis"oE 4[=58=4558
/brangIncia
Ners"o 1.5Z Ners"o 1.5Y Ners"o [.5\ Ners"o Z.U5 Ners"o Y.UU
Hma página /0P */ctive 0erver Pages. # uma página <6,3 contendo código interpretável em uma linguagem compreens)vel ao servidor <66P em uso. Por e:emplo, o II0 da ,icrosoft utili$a o N&0cript para criar
suas páginas /0P, do mesmo modo 'ue o Protheus utili$a o /+NP3. Hma página /0P # uma combinaç"o de script <6,3 e código interpretável. Lo /+NP3 /0P esse código # padr"o :&ase, portanto a preocupaç"o
maior da'ueles 'ue !á conhecem e trabalham com o Protheus e dese!am desenvolver páginas ativas para aplicações %eb utili$ando essa facilidade # conhecer <6,3.
Características do ADVPL ASP - Arqivos !APH
s ar'uivos /+NP3 /0P tIm a e:tens"o padr"o ./P<. 0"o ar'uivos te:to e devem ser adicionados a um pro!eto no Protheus I+E e compilados da mesma maneira 'ue os programas tradicionais. / diferença # 'ue o
Protheus 0erver identificará 'ue se trata de um /+NP3 /0P e e:ecutará uma esp#cie de tradutor *parser. antes 'ue a compilaç"o se!a e:ecutada. Este parser irá transformar todo o ar'uivo em uma funç"o Jnica, 'ue
receberá os mesmos par(metros das funções /P3 simples, como e:plicado anteriormente no Item K+esenvolvendo >unções ./P3K, e retornará uma string.
desenvolvedor n"o precisa se preocupar em retornar <,63 algum, pois o /P< tamb#m # um ar'uivo <6,3. / funç"o 'ue foi gerada na compilaç"o irá se encarregar de retornar o <6,3 contigo no ar'uivo,
depois 'ue o código foi processado. Hm /r'uivo /P< gera no repositório de b!etos do Protheus uma funç"o com o mesmo nome do ar'uivo , por#m prefi:ada com <O P nomeOdoOar'uivoOaph
Por se tornar uma funç"o no momento da compilaç"o, n"o # poss)vel utili$ar a cláusula >HL76IL para criar outras funções dentro de um ar'uivo /P<. 7aso e:ista essa necessidade, tais funções devem ser criadas
em um ar'uivo P@% tradicional e chamadas de dentro do /P<.
/ e:tens"o /P< para o nome dos ar'uivos # obrigatória. 2ual'uer outra e:tens"o usada no nome do ar'uivo n"o será reconhecida e o parser do I+E n"o será e:ecutado durante a compilaç"o. >oi criada tamb#m a
e:tens"o de ar'uivos ./<H * /ph de Hsuário ., 'ue possui o mesmo tratamento de Parser do aru'ivo /P< , gerando uma funç"o prefi:ada com 3O . / diferença # 'ue a funç"o gerada pelo /<H pode ser gerada sem a
necessiade de autori$aç"o de compilaç"o com permiss"o para substituir fontes microsiga , por tratar-se de um /ph de Hsuário, 'euivalente à uma Hser >unction .
/ssim como outros /0PQs, a diferenciaç"o entre script <6,3 e código # efetuada atrav#s dos caracteres RS para indicaç"o de abertura de código e ST para indicaç"o do encerramento de código. Por e:emplo, o
<6,3 abai:o cont#m um pedaço de código /+NP3 separado pelos delimitadoresE
<html><head><title>ADVPL ASP Demo</title></head>
<body>
<p>Bem vindo ao mundo do ADVPL ASP!</p>
<%
// Soma os 100 pimeios n!meos
Lo"al i# nSoma $% 0
&o i $% 1 'o 100
4
(Soma )% i
(e*t i
%>
</body>
</html>
2uando este ar'uivo for re'uisitado ao Protheus 0erver *atrav#s de uma chamada em H@3 por e:emplo. o código entre os delimitadores será e:ecutado, por#m o script colocado ao redor do código será mantido
e:atamente como se encontra. Por e:emplo E
httpE==localhost=<O%E&+E,./P3
/ grande vantagem de se utili$ar dos ar'uivos /+NP3 /0P em relaç"o a criar funções /P3 simples, decorre do fato de 'ue nas funções /P3 simples o desenvolvedor deve se preocupar em retornar todo o <6,3
necessário para a correta e:ibiç"o no %eb &roBser.
E tamb#m, como o /+NP3 /0P mistura o script <6,3 com o código interpretável, pode-se criar um ar'uivo /P< utili$ando o editor dese!ado *como o ,icrosoft >rontPage, por e:emplo. e inserir nele os códigos
/dvpl necessários entre as 6ags. utro detalhe importante # 'ue pode-se utili$ar as estruturas de flu:o da linguagem /+NP3 para repetir comandos do próprio script <6,3 *por e:emplo, colocar um comando de
script <6,3 dentro de um comando %hile em /+NP3.E
<% +hile !,-&./ %>
<B> ,sta linha se0 epetida no 1'2L at3 o"oe o 4im de a5uivo </B>
<%
dbS6ip./
,ndDo
%>
Lote 'ue tamb#m pode e:istir diferentes blocos de código interpretável separados pelos delimitadores, dentro de um mesmo ar'uivo.
6"o importante 'uanto mesclar código interpretável com script de formataç"o <6,3, # utili$ar os comandos /+NP3 para alterar o script de formataç"o. u se!a, colocar o conteJdo de variáveis, campos, etc,
diretamente no <6,3 'ue será enviado à aplicaç"o client *ao &roBser por e:emplo.. Isso pode ser reali$ado atrav#s dos delimitadores de avaliaç"o. s delimitadores de avaliaç"o s"o %&' para abertura e &( para
encerramento. +iferentemente dos delimitadores de código interpretável, estes devem sempre estar na mesma linha. 7om eles pode-se criar uma linha de script <6,3, cu!o conteJdo cont#m uma e:press"o 'ue será
avaliada em tempo de e:ecuç"o, e seu resultado inserido como parte do <tml retornado ào &roBse E
<b>,sta linha 3 1'2L# mas o ho0io e*ibido a5ui$ <%% 'ime./ %> 4oi obtido em tempo de e*e"u78o no Sevido9</b>
Lo e:emplo acima, a linha <6,3 será retornada para o &roBser com o resultado da funç"o time *ou se!a, a hora atual no servidor. inserido no te:to.
Htili$ando todos esses conceitos, pode-se criar toda uma aplicaç"o %eb baseada no Protheus. u se!a, o processamento e acesso aos dados fica por conta do Protheus 0erver, e a interface fica por conta do &roBser
*utili$ando o <6,3. .
Importante
/o codificar um ar'uivo ./P< e=ou ./<H , devemos estar atentos às regras de utili$aç"o dos delimitadores de e:ecuç"o e avaliaç"o /dvpl E
U. / /bertura e fechamendo dos delimitadores de e:ecuç"o RS ... ST devem estar isoladas em suas respectivas linhas, n"o devendo ter 'ual'uer conteudo adicional, nem duas aberturas e fechamentos na mesma linha.
Partindo dessa premissa, ve!a abai:o alguns e:emplos de como inserir o código /dvpl abai:o dentro de um /P<E
IF !lOk
nErro++
Endif
)E*TO
<%
IF !lOk
nErro++
Endif
%>
)E*TO
<% IF !lOk %>
<% nErro++ %>
<% Endif %>
)E*TO
<% IF !lOk ; nErro++ ; Endif %>
E**A+O
<% IF !lOk %><% nErro++ %> -- 2 aberturas e fechamentos na mesma linha
<% Endif %>
4. 2uantV àos delimitadores de avaliaç"o RSW ... ST , podemos ter várias aberturas e fechamentos na mesma linha , por#m n"o podemos ter uma abertura e seu respectivo fechamento em linhas diferentes.
X. ,ma li"ha -ual-uer em um ar-uivo .APH "ao deve co"ter mais do -ue 1.0 )aracteres/ pois o Parser i"sere caracteres de co"trole em cada li"ha do mesmo dura"te a pr01compilação . e a li"ha #i"al
resulta"te "ão pode ultrapassar .2 caracteres, pois neste caso isto impossibilita a compilaç"o do /P<.
02. +ese"volvime"to de 3u"ç$es .AP4
/ princ)pio, todas as funções contidas no repositório podem ser e:ecutadas diretamente atrav#s de uma re'uisiç"o <66P, via lin9 com e:tens"o .apl, ao Protheus 0erver. Por#m, alguns detalhes devem ser
consideradosE
• Hma funç"o e:ecutada no momento do recebimento de uma re'uisiç"o <66P # e:ecutada como um M&, ou se!a, n"o contem interface. Por isso, tais funções n"o podem conter comandos de interface,
como criaç"o de !anelas ou e:ibiç"o de helps e mensagens de alerta]
• / Jnica interface poss)vel # a utili$ada no client <66P. Por isso, tais funções devem 0E,P@E retornar uma string de caracteres. /pós o processamento da funç"o, essa string de retorno será enviada
diretamente ao client <66P e este será o responsável por sua interpretaç"o. Por e:emplo, utili$ando um %eb &roBser como client pode-se retornar a string de comandos <6,3 diretamente. <6,3 ent"o será
propriamente e:ibido no %eb &roBser]
• 2ual'uer retorno diferente de uma string de caracteres gerará um erro 'ue será enviado à aplicaç"o client <66P *o erro gerado # FInvalid Proc @eturnG.]
• servidor Protheus passa alguns par(metros para as funções chamadas. Isso significa 'ue ao criar funções para serem utili$adas em resposta às re'uisições <66P, deve-se criar o cabeçalho da funç"o
com estes par(metros. L"o # obrigatório utili$ar os mesmos nomes de par(metros sugeridos abai:o 'uando criar diretamente estas funções. Por#m, como s"o esses os nomes utili$ados no /+NP3 /0P e:plicado mas a
frente, # aconselhável utili$á-los por motivo de padroni$aç"oE
o OOa7oo9iesE Este par(metro recebe um arraA bidimensional com os 7oo9ies criados na aplicaç"o client <66P *por e:emplo, no Internet E:plorer 1.. Pode-se utili$á-lo para checar
validações mantidas nas má'uinas client por e:emplo. Para maiores detalhes, consulte a documentaç"o do <6,3 ou do %eb &roBser utili$ado.
o OOaPostParmsE Este par(metro recebe um arraA bidimensional com os campos contidos em um formulário <6,3 recebido atrav#s de um comando P06. 7ada item deste arraA cont#m
um arraA com o nome do campo e o valor informado. Por e:emplo, para um formulário com dois campos para digitaç"o *um chamado nome e o outro chamado endereco., 'ue enviam os dados para a funç"o
cadastro.apl atrav#s de um P06, a funç"o receberá o arraA OOaPostParms da seguinte formaE
^ ^FnomeG, FL,E +IDI6/+ L/ P/DIL/ <6,3G_,
^FenderecoG, FEL+E@E7 +IDI6/+ L/ P/DIL/ <6,3G_ _
/ funç"o pode tratar os dados recebidos neste arraA para reali$ar um processamento espec)fico com tais informações. Para campos onde n"o # poss)vel a entrada de dados e sim a escolha de uma informaç"o pr#-
definida *como por e:emplo um chec9bo:., o item somente e:istirá no arraA caso o campo tenha sido selecionado no formulário <6,3 *por e:emplo, se o chec9bo: for marcado..
o OOnProcI+E 7ont#m o <andle da 6hread de e:ecuç"o da'uela funç"o. / utili$aç"o deste par(metro será e:plicada !untamente com o tópico /+NP3 /0P posteriormente]
o OOaProcParmsE Este par(metro recebe um arraA bidimensional com os par(metros enviados na linha de H@3 do %eb &roBser. Por e:emplo, na e:ecuç"o de uma funç"o via linha de H@3
do %eb &roBser comoE
httpE==servidor=vende.apl`codW55555UanomeWP@+H6 +E 6E06Ea'uantW45
a funç"o chamada vende receberá o arraA OOaProcParms da seguinte formaE
^ ^FcodG, F55555UG_,
X
^FnomeG, FP@+H6 +E 6E06EG_,
^F'uantG, F45G_ _
/ funç"o pode tratar estes dados recebidos para reali$ar processamentos espec)ficos. C muito Jtil tamb#m para criar lin9s de e:ecuç"o diretamente atrav#s de um %eb &roBser.
o OOc<66PPageE Esse par(metro foi criado originbalmente para recebe o nome da página, ar'uivo ou funç"o originalmente re'uisitada para o Protheus 0erver, por#m n"o foi utili$ado e
permaneceu por compatibilidade.7aso consultado, ele retorna uma string em branco.
o OOa<66P<eadE Esse par(metro recebe um arraA com os <eaders do cabeçalho da re'uisiç"o <66P enviados pelo %eb &roBser.
"#emplo de $nç%o APL
/ funç"o a seguir # um bom e:emplo para ser e:ecutado atrav#s de um %eb &roBser. Ela retorna uma string contendo a página <6,3 onde está escrita a mensagem F<ello %orldG e a lista de par(metros passados na
linha de H@3. Para testá-la, crie um ar'uivo novo no Protheus I+E, cole o código abai:o e salve o ar'uivo como %E&+E,.P@%. /pós compilar o programa, basta chamar em um %eb &roBser uma H@3 comoE
httpE==localhost=uOBebdemo.apl`codW55555UadescW+E07@I7/ + P@+H6a'tdW4
7ódigo da funç"oE
#include 'rwmake.ch'
User Function WebDemo(__aCookies,__aPostParms,__nProcID,__aProcParms,__cHTTPPage)
Local cHTML := ''
Local i
// Coloca uma mensagem em HTML
cHTML += '<p><h1 align='center'>Hello World!!!</h1></p>'

// Coloca um separador de linha em HTML
cHTML += '<hr>'

If Len(__aProcParms) = 0
cHTML += '<p>Nenhum parâmetro informado na linha de URL.'
Else
For i := 1 To Len(__aProcParms)
cHTML += '<p>Parâmetro: ' + __aProcParms[i,1] + ' - Valor: ' +
__aProcParms[i,2] + '</p>'
Next i
Endif
Return(cHTML)

5mporta"te
Para crias as funções 'ue ser"o utili$adas em chamadas via um %eb &roBser, ou se!a, em 'ual'uer re'uest <66P, deve-se seguir o procedimento normal de criaç"o de funções no /P1E utili$ando o /P1 I+E para a
ediç"o e para a compilaç"o.
Lote 'ue no caso de funções do usuário *Hser >unction. o nome chamado na H@3 do &roBser tamb#m deverá conter o HO no começo da funç"o, por e:emploE
httpE==servidor=uO%eb+emo.apl
)o"#iguração 67"ima
Em tópico à parte # e:plicada toda a configuraç"o referente à seç"o http do Protheus 0erver. / configuraç"o abai:o # a m)nima necessária para e:ecutar o e:emplo acima
bhttpc
PortWY5
PathW*caminho absoluto de disco para ar'uivos publicados no servidor .
EnvironmentW*nome do environment do 0erber 'ue será utili$ado para o processamento.
Para testar sua configuraç"o, reinicie o server Protheus e chame via %eb&roBser a url E
httpE==localhost=time.apl
+everá ser mostrada no &roBse o horário atual, no formato hhEmmEss, no 0ervidor, pois este # o resultado da funç"o /dvpl 6I,E*. .
O Protheus ate"de"do 8 re-uisiç$es .apl
2uando solicitado atrav#s de um %eb &roBser um processamento de uma funç"o via lin9 .apl, a funç"o solicitada deve ser responsável por abrir o ambiente necessário ào processamento, conectar com o &anco de
+ados caso necessário, reali$ar o processamento e retornar a 0tring <tml ao %eb &roBser.
Este ambiente criado # fechado imediatamente após o t#rmino do processamento, o 'ue e:ige muito do 0ervidor da aplicaç"o em se tratando de uma aplicaç"o Beb com vários usuários efetuando acessos simult(neos.
Para atender com mais eficiIncia às re'uisições de processamento de um pro!eto Beb, foi implementada no Protheus a tecnologia de K%or9ing 6hreadsK, e:plicada em mais detalhes no tópico K+esenvolvimento de
>unções .apBK.
0.. +ese"volvime"to de 3u"ç$es .APW
Diferença de Funcionamento entre links .APL e .AP
7omo visto em tópicos anteriores, ao desenvolver uma funç"o para ser e:ecutada via lin9 .apl, a funç"o deve ser responsável pela abertura do ambiente e iniciali$ações necessárias para um processamento 'ual'uer, e
após ser finali$ado este processamento, o ambiente montado e utili$ado # fechado automaticamente, de modo 'ue cada re'uisiç"o de processamento de usuário atrav#s de lin9 .apl irá iniciar uma nova 'head, onde o
ambiente deverá ser preparado novamente. / programaç"o neste tipo de ambiente e:ige muito do servidor Protheus.
Nisando dar perfornance às aplicações %E& desenvolvidas utili$ando-se o Protheus, foi criado lin9 ./P%, 'ue utili$a um recurso do servidor Protheus conhecido como KBo6in: theads;. Hma Bot6in: thead # uma
configuraç"o especial de <ob# 'ue permite configurar umQnJmero pr#-definido de 'heads no 0ervidor, as 'uais ter"o o ambiente de e:ecuç"o preparado e iniciali$ado atrav#s de uma funç"o /dvpl, onde cada =o6in:
thead # dei:ada na memória do servidor em modo de espera *stand-bA., de modo 'ue, um usuário, ao acessar um lin9 .apB, o servidor Protheus irá direcionar a re'uisiç"o de processamento à uma =o6in: thead 'ue
estiver em stand-bA, e, após o processamento ser efetuado e o <6,3 ser retornado ao &roBser, a =o6in: thead retorna novamente ao estado de stand-bA, voltando a estar dispon)vel para atender à uma nova
re'uisiç"o, do mesmo ou de outro usuário navegando no site = aplicaç"o %eb.
/ utili$aç"o de %or9ing 6hreads e:ige a definiç"o m)nima de duas funções /dvpl, 'ue ser"o e:ecutadas em dois momentos distintos E / primeira funç"o # responsável pela iniciali$aç"o do ambiente comum de
e:ecuç"o de re'uisições, devendo estabelecer cone:"o com a &ase de +ados utili$ada, abrir as tabelas utili$adas no 0ite e preparar as variáveis comuns de utili$aç"o da aplicaç"o. / segunda funç"o será responsável
por encapsular a re'uisiç"o do usuário reali$ada a partir do %eb &roBse E Ela receberá como par(metro o nome do lin9 digitado e macro-e:ecutar a funç"o correspondente, reali$ando o tratamento de erro e retorno.
+este modo, um ambiente uma ve$ iniciali$ado n"o # fechado, e pode ser utili$ado por vários usuários 'ue est"o navegando no 0ite, o 'ue viabili$a um grande ganho em perfoemance e carga do 0ervidor.
Tipos de orkin! T"reads
E:istem dois tipos de %or9ing 6hreads configuráveis no Protheus E a %or9ing 6hread %E&, e a %or9ing 6hread %E&E; * abreviaç"o de %E& E;tended .. /mbas possuem basicamente o mesmo princ)pio de
funcionamento, por#m o 'ue muda entre ambas # a recepç"o de par(metros e a utili$aç"o de 0essions nativas do 0erver Protheus. Para visuali$armos melhor estas diferenças, ve!amos com um detalhe um pouco maior
os modelos de funç"o de iniciali$aç"o de ambiente e cone:"o para ambas as configurações de %or9ing 6hreads, %E& e %E&E;.
orkin! T"reads #$
Para nos utili$armos das %or9ing 6hreasd %E&, devemos criar as funções responsáveis pela iniciali$aç"o de ambiente e a funç"o de cone:"o.
/ funç"o de iniciali$aç"o de ambiente n"o recebe par(metro algum, reali$ar a preparaç"o do ambiente comum de e:ecuç"o de re'uisições, e deve retornar um valor booleano *.6.. verdadeiro caso o ambiente tenha sido
iniciali$ado com sucesso, ou *.>.. falso no caso de alguma condiç"o ou erro 'ue torne o ambiente montado por esta thread n"o operacional, caso este em 'ue a 6hread # removida da memória após a iniciali$aç"o.
/ funç"o de cone:"o recebe os mesmos seis par(metros de uma funç"o chamada via lin9 .apl, e um s#timo parametro, 0tring, 'ue cont#m apenas o nome da funç"o chamada no lin9 . Por e:emplo, a chamada de um
lin9 httpE==localhost=uOteste.apB, no s#timo par(metro da funç"o de cone:"o a string KuOtesteK. / funç"o de cone:"o deve ter tratamento de erro próprio e diferenciado, e sempre deverá retornar um conteJdo do tipo
0tring.
orkin! T"reads #$#%
Para nos utili$armos das %or9ing 6hreasd %E&E;, devemos tamb#m criar as funções responsáveis pela iniciali$aç"o de ambiente e a funç"o de cone:"o.
/ funç"o de iniciali$aç"o comporta-se de maneira idIntica a de iniciali$aç"o %E&, n"o recebendo par(metro algum, e devendo retornar um valor booleano *.6.. verdadeiro caso o ambiente tenha sido iniciali$ado com
sucesso , ou *.>.. falso no caso de alguma condiç"o ou erro 'ue torne o ambiente montado por esta thread n"o operacional, caso este em 'ue a 6hread # removida da memória após a iniciali$aç"o.
/ funç"o de cone:"o n"o recebe diretamente par(metro algum d Isso mesmo E 6odos os par(metros recebidos em versões anteriores atrav#s de /rraAs, s"o recebidos agora por /lias Nirtuais de alta velocidade E
• <ttpDet
• <ttpPost
• <ttp7oo9ies
• <ttp<eadIn
7ada um destes alias virtuais # responsável respectivamente pela recepç"o de par(metros via DE6 , P06 , 7eIE0 e <eader <66P da re'uisiç"o.
6amb#m foram implementados os /lias virtuais <ttp<eadut e <ttp0ession , para respecrivamente permitir alterar ou adicionar informações do <eader <66P de retorno de processamento de uma re'uisiç"o e
utili$aç"o de variáveis tipo 0E00IL por usuário %eb. Estes recursos s"o detalhados nos tópicos %E&E; - +etalhamento de peraç"o e posteriores.
& Futuro das aplicações #$ no Prot"eus
/pós o desenvolvimento de aplicações em ambiente %E&E;, e dados os ótimos resultados obtidos, recomenda-se fortemente 'ue as aplicações Beb desenvolvidas utili$ando-se o Protheus 0erver, se!am escritas em
conformidade para a utili$aç"o dos recursos %E&E;.
8
Para facilitar tal desenvolvimento, em paralelo à tecnologia disponibili$ada na aplicaç"o, !á está integrada com a Infra-Estrutura dispon)vel no repositório padr"o do ,icrosiga Protheus Y , as funções da Infra-Estrutura
/p%ebE:, escritas e publicadas para melhor atender às necessidades comuns verificadas no decorrer do desenvolvimento de uma aplicaç"o %eb.
s recursos dispon)veis nesta lib est"o documentados nos tópicos Infra-Estrutura /P%E&E; e posteriores , englobando comandos , funções , e:emplos e dicas de utili$aç"o destes recursos.
09. )o"#igura"do o Server Protheus para HTTP
/s configurações de http do 0erver Protheus permitem a configuraç"o de sites estáticos e din(micos , com a criaç"o de um ou mais hosts de acesso, criaç"o de pastas virtuais, e dites din(micos com resposta para
lin9s .apl e .apB simultaneamente. Leste documento abrangeremos um resumo e:emplificado das configurações <66P do 0erver Protheus. /s seções abai:o devem ser inseridas no ar'uivo de configurações do
servidor Protheus * mpYsrv.ini .
Confi!uraç'o (ínima
>http?
,nable%1
Path%"$@ApAData@http
bservaç"oE Nale lembrar 'ue , após ter inserido a configuraç"o do bhttpc no ILI do Protheus, # importante bai:ar o 0erver e subir novamente.
7om esta configuraç"o, habilitamos o 0erver Protheus como um servidor de ar'uivos e páginas estáticas , com o <66P na porta padr"o *Y5., e utili$ando o diretorio em cEf/pOdataf<ttp como diretório rai$ de
publicações %E&. 7omo n"o há configuraç"o de host espec)fica, um ar'uivo nesta pasta poserá ser acessado atrav#s dos hosts httpE==localhost * desde 'ue o broBse se!a aberto na estaç"o servidora . ,
httpE==nnn.nnn.nnn.nnn * IP da estaç"o servidora . ou httpE==:::::::::: * nome da estaç"o servidora . . Por e:emplo E +entro da pasta configurada na chave P/6< do <66P, crie um ar'uivo chamado default.htm ,
com o seguinte conteJdo * pode ser criado inclusove com o notepad .. .
<h>
-la 2undo 1''P
<h>
/gora , abra um %eb &roBser no mesmo e'uipamento, e digite na url E httpE==localhost E /o acessar esta url , deverá ser mostrado na tela do &roBse huas barras hori$ontais e o te:to Kla ,undo <66PK entre elas .
Atendendo ) re*uisições .apl
/gora, vamos habilitar este host para atender à re'uisições de funções, atrav#s de lin9 .apl. Para tal , precisamos apenas do nome de um Environment *ambiente. configurado no .ILI . Podemos usar o próprio ambinete
do E@P . &asta acrescentarmos na seç"o http a chave EnvironmentWRnomeOdoOambienteT , para 'ue este ambiente passe a atender ào processamento de funções /dvpl atrav#s de lin9s .apl. Por e:emlo , caso o
ambiente configurado para o E@P chame-se Env/+0ZU5 , basta acrescentar na seç"o http a chave EnvironmentWEnv/+0ZU5 . .ILI ficaria conforme abai:o E
>http?
,nable%1
Path%"$@ApAData@http
,nvionment%,nvADSB10
Para testar a e:ecuç"o de funções , abra um %eb &roBse na estaç"o servidora, e acesse o lin9 httpE==localhost=time.apl . I0toQirá e:ecutar a funç"o /dvpl 6I,E*. , 'ue retornará ao &roBse uma string contendo o
horário atual no servidor no formato <<E,,E00
Atendendo ) re*uisições .ap+
/ configuraç"o para atendimento de re'uisições de processamento http atrav#s de lin9s .apB envolve a criaç"o de uma nova seç"o no .ILI , com um nome n"o-espec)fico, para configurar o tipo de !ob 'ue irá e:ecutar o
processamento * %E& ou %E&E; . , !untamente com as funções responsáveis pela iniciali$aç"o e cone:"o das 6hreads /dvpl , e na seç"o http configuramos uma chave chamada @esponseMob , apontando para a
seç"o de configuraç"o do M&.
Por e:emplo , para configurarmos o atendimento de re'uisições .apB em um ambiente E@P , utili$ando a infra-estrutura /P%E&E; , vamos criar uma seç"o chamada E@PO/P%E&E;, apontando para as funções da
Infra-Estrutura /P%E&E; correspondentes E
>,CPAAP+,B,D?
type%+,B,D
onstat%S'AC'+,B,D
on"onne"t%E-((,E'+,B,D
,nvionment%,nvADSB10
Fnstan"es%1#G
Si:a+eb%2AH
/trav#s desta configuraç"o, especificamos um Mob do tipo %E&E; , onde a funç"o de iniciali$aç"o utili$ada será a 06/@6%E&E; , a funç"o de cone:"o será a 7LLE76%E&E; * ambas da Infra-estrutura
/P%E&E; . , 'ue utili$ar"o o ambiente /nv/+0ZU5 para processamento, e ser"o colocadas no ar apenas uma %or9ing 6hread para atendimento de processamento, at# o má:imo de X 6hreads. /s threads colocadas
no ar acima do nJmero m)nimo * no e:emplo, apenas U . , s"o colocadas Kon-demandK caso se!am reali$adas re'uisições .apB ao 0ervidor e n"o ha!am %or9ing 6hreads dispov)veis no momento e o nJmero de %or9ing
6hreads no ar ainda n"o tenha atingido o má:imo definido. /trav#s da configuraç"o 0iga%ebW,/e, informamos ao sistema, 'ue a mesma está sendo utili$ada para o desenvolvimento de um módulo espec)fico, e n"o
estamos utili$ando um módulo %eb da ferramenta Protheus Y. 7aso a configuraç"o 0iga%eb n"o se!a informada, o valor K,/eK # assumido como default.
/gora , para 'ue esta seç"o de Mobs se!a utili$ada para o atendimento efetivo de re'uisições .]apB , devemos estecificá-la na seç"o http , atrav#s da chave @EsponseMob. Lo caso , inserimos a chave
@esponseMobWE@PO/P%E&E; , fincando a seç"o <66P conforme abai:oE
>http?
,nable%1
Path%"$@ApAData@http
,nvionment%,nvADSB10
CesponseIob%,CPAAP+,B,D
7omo as re'uisições via .apl e via .apB s"o independentes , # poss)vel configurar a seç"o http para 'ue Environments diferentes respondam à re'uisições .apl e .apB , ou 'ue n"o se!am atendidas re'uisições .apl ,
apenas .apB .
Confi!urando a seç'o "ttp para multi,"ost
6odas as configurações acima vistas pertencem à seç"o default do <66P . +e modo 'ue , tanto fa$ acessarmos o servidor pelo nome como pelo IP, 'ue o resultado serrá o mesmo. Por#m, para a utili$aç"o de demais
recursos, como diretórios virtuais e mais de um site no mesmo servidor , precisamos configurar um host de acesso.
Por e:emplo, vamos criar uma configuraç"o de <06 para 'ue o servidor , caso se!a acessado pelo L,E da ma'uia via <66P , se!a visuali$ado um outro site , e apenas se!am atendidos à lin9s .apl E Para isso ,
devemos criar uma nova seç"o no .ILI , cu!o nome deve ser e:atamente o host 'ue será acessado * como o e:emplo vamos supor 'ue o servidor de testes chama-se srvteste . , logo devemos criar uma seç"o com este
nome .
Lesta seç"o do ILI , devemos no m)nimo especificar um Path de acesso àos ar'uivos, e as demais configurações vistas at# agora da seç"o http s"o opcionais. / configuraç"o P@6 do <66P em um host n"o #
suportadaE L"o # poss)vel subir um server protheus em mais de uma porta <66P.
>svteste?
Path%"$@ApAData@'estes
,nvionment%,nv'-PB10
+este modo, caso o servidor se!a acessado via http atrav#s de 37/3<06 ou do IP do 0erver , será permitido o acesso às funcionalidades configuradas na seç"o <66P. 7aso se!a acessado via nome do servidor *
httpE==srvteste . , ser"o acessados os ar'uivos de outra pasta , e as re'uisições .apl ser"o atendidas pelo /mbiente Env6PZU5 .
Htili$ando este tipo de configuraç"o, podemos subir vários sites diferentes na mesma aplicaç"o servidor Protheus, cada 'ual com o seu diretório rai$ de publicações , seus ambientes independentes, atendendo ou n(o à
re'uisições .apl e=ou .apB.
Confi!urando diret-rios virtuais
/o configurar um host espec)fico, podemos acrescentar ao mesmo uma barra g=g, seguido de um nome para acesso à um diretório virtual, criando desse modo um endereço de acesso composto por um host e um
diretório, 'ue pode se comportar como um outro site, com os ar'uivos publicados em um path espec)fico, 'ue poderá atender re'uisições de lin9s .apl e=ou .apB sob um outro ambiente e configuraç"o distinta.
Htili$ando diretórios virtuais, # poss)vel, dentro do mesmo host, instalar várias aplicações Beb independentes, todas acess)veis sob o mesmo endereçõ base, alterando apenas o diretório de acesso. Por e:emplo,
utili$ando como host principal o nome do e'uipamento , gservertstg, podemos instalar o módulo %eb gPortal Protheusg sob o host gservertst=portalg, o módulo 67> sob o host gservertst=rhonlineg, e no host gservertstg
podemos configurar um site estático em <tml , com uma apresentaç"o institucional e lin9s para os demais módulos.
&.servações Importantes
/o configurarmos um <ost, ele herda as configurações de atendimento de re'uisições .apl e .apB especificados na seç"o <66P d +e modo 'ue o host do e:emplo continuará a atender re'uisições .apB , por#m no
ambiente Env/+0ZU5.
Nisto desta forma, recomendamos fortemente 'ue a seç"o bhttpc possua apenas especificado um Path em disco 'ue este!a va$io, e se!a criada uma ou mais configurações de host com as suas devidas propriedades
especificas.
6odas as demais chaves relacionadas à configuraç"o <66P e aos Mobs %E& e %E&E; s"o opcionais, para atender à necessiades espec)ficas. Estas chaves est"o e:plicadas em maiores detalhes no +E, , na seç"o
;;;
Confi!urando diret-rios virtuais
+a mesma forma 'ue a criaç"o de hosts, podemos criar um novo host utili$ando a barra de divis"o K=K para especiicar uma Kpasta virtualK , 'uue permite a fle:ibilidade de termos uma pasta dentro de um mesmo host 'ue
se comporte como um outro host E /inda baseando-se no .ILI montado nestes e:emplos para o servidor de testes, vamos supor 'ue e:ista uma pasta no disco * por e:emplo , cEf/pOdataf+ocs . , 'ue contenha ar'uivos
<6,3 de uma documentaç"o 'ue deve estar disponçivel na Beb , utili$ando tamb#m o host httpE==srvteste . Por#m , o host srvteste !á aponta para o diretório cEf/pOdataf6estes.
7om o recurso de criaç"o de diretorio virtual no <66P , criamos apenas uma nova entrada do mesmo host , colocando no nome do mesmo uma barra de divis"oK=K , seguido do nome de uma pasta a ser acessada via
<66P * 'ue n"o precisa necessariamente e:istir no disco. , e dentro desta seç"o acrescentar a chave path , apontando para o diretório dese!ado , da mesma maneira utili$ada para configurar um host.
Lo e:emplo abai:o , criamos a pasta virtual info, dentro do host srvteste, apontando para o path do disco cEf/pO+ataf+ocs. +e modo 'ue , ao ser acessado via url o endereço httpE==srvteste=info , a partir dele ser"o
acessados os ar'uivos da pasta cEf/pO+ataf+ocs
>svteste/in4o?
Path%"$@ApAData@Do"s
Ne!amos agora como ficou o nosso ar'uivo .ILI, com todas as configurações acima e:emplificadas E
JJ Eon4i:uia"ao de +o6in: 'heads usando a in4aKestutua AP+,B,D
>,CPAAP+,B,D?
type%+,B,D
onstat%S'AC'+,B,D
on"onne"t%E-((,E'+,B,D
,nvionment%,nvADSB10
Fnstan"es%1#G
JJ Eon4i:ua78o da se78o httpo de4ault paa atende L e5uisi7Mes de 9apl e 9ap=
>http?
1
,nable%1
Path%"$@ApAData@http
,nvionment%,nvADSB10
CesponseIob%,CPAAP+,B,D
Si:a+eb%2AH
JJ Eon4i:ua78o do host svteste paa atende e5uisi7Mes via 9apl atav3s do envionment ,nv'-PB10
>svteste?
Path%"$@ApAData@'estes
,nvionment%,nv'-PB10
JJ Eon4i:ua78o da pasta vitual in4o # no host svteste # paa aponta paa um path no dis"o "om do"umentos
>svteste/in4o?
Path%"$@ApAData@Do"s
5"#ra1Estrutura APWEBE:
A Infra,#strutura AP#$#%
Nisando o melhor aproveitamento da tecnologia de Bo6in: theads, implementada no servidor Protheus para o processamento de re'uisições de uma aplicaç"o Beb, foram desenvolvidas funções de apoio, miscel(nea
e infra-estrutura, compiladas no repositório padr"o de Infra-Estrutura do E@P ,icrosiga, visando simplificar e au:iliar o desenvolvimento de uma soluç"o Beb. / este con!unto de funções , demos o nome de g3ib de
Infra-Estrutura /P%E&E;g, 'ue engloba atualmente os tratamentos comuns às funções de iniciali$aç"o de ambiente e cone:"o * atendimento de re'uisições http via lin9 .apB ., com seus respectivos pontos de
entrada, comandos e funções de miscel(nea comuns àos pro!etos de soluções Beb integradas com o E@P.
Como utili/ar este recurso no desenvolvimento de soluções 0
/s funções pertinentes à Infra-Estrutura /P%E&E; !á est"o implementadas no repositório padr"o da ferramenta Protheus Y, e os comandos espec)ficos 'ue envolvem este recurso encontram-se no ar'uivo header
KapBebe:.chK, disponibili$ado tamb#m !onto com a ferramenta Protheus Y.
/ utili$aç"o destes recursos para integraç"o de aplicações envolve a leitura desta documentaç"o, onde será visto com maiores detalhes as possibilidades de uso da ferramenta, como a integraç"o de uma aplicaç"o %eb
com um ambiente e funcionalidades do E@P ,icrosiga.
Como usufruir desta documentaç'o 0
6odos os tópicos pertencentes à este grupo s"o direcionados ào desenvolvimento de soluções Beb utili$ando as funções de Infra-Estrutura /P%E&E;, al#m de ser e:plicado com detalhes o funcionamento da
tecnologia %E&E; do Protheus, e dos recursos nativos da ferramenta, englobando os comandos e funções publicados, e:emplos de códigos /dvpl utili$ando estes recursos, configuraç"o da ferramenta e mensagens de
ocorrIncias de erro das funções e comandos, com poss)veis causas e soluções.
C fortemente recomendado 'ue os documentos constantes neste grupo fossem apreciados, antes de aprofundar-se nas informações dos pró:imos tópicos.
01. *ecepção de par;metros por Alias <irtuais
@evis"oE X5=58=4558
/brangIncia
Ners"o Z.U5 Ners"o Y.UU
/ recepç"o de par(metros vindos do %eb &roBser, 'uando utili$amos %or9ing 6hreads do tipo %E&E;, atrav#s de lin9s .apB, # reali$ada atrav#s de /lias Nirtuais espec)ficos, ao inv#s de receber as informações
DE6 , P06 e <E/+E@ em arraA, 'uando e:ecutamos a chamada atrav#s de lin9 .apl. / nomenclatura de K/lias NirtualK foi adotada, pois a sinta:e do código-fonte # e:atamente a mesma utili$ada 'uando dese!amos
acessar um campo de uma tabela aberta, atrav#s de um alias.
Em um ambiente montado para atender à re'uisições via lin9 .apB utili$ando %or9ing 6hreads %E&E; , podemos nos utili$ar dos seguintes alias virtuais E
• <ttp7oo9ies
• <ttpDet
• <ttpPost
• <ttp<eadIn
• <ttp<eadut
• <ttp0ession
HttpCookies
/trav#s do alias virtual <ttp7oo9ies, # poss)vel consultar os 7oo9ies do <eader <ttp enviados pelo &roBser, e criar ou alterar o conteJdo de um coo9ie a ser devolvido ào &roBser. Hm coo9ie, visto de forma geral, #
um par(metro ao 'ual atribu)mos um nome, 'ue uma ve$ devolvido ào &roBse solicitante, # re-enviado ao Protheus a partir da pró:ima re'uisiç"o reali$ada pelo &roBser.
Http1et
Para receber os par(metros enviados atrav#s da H@3 *m#todo DE6 do <66P. , !á devidamente convertidos e tratados, utili$amos o alias virtual <ttpDet, onde acessamos pelo nome a propriedade dese!ada, e caso a
mesma tenha sido enviada pelo &roBser, a mesma # retornada como uma 0tring.
HttpPost
Para receber os par(metros submetidos *enviados. pelo &roBser atrav#s do m#todo P06, !á devidamente convertidos e tratados, utili$amos o alias virtual <ttpPost, onde acessamos pelo nome a propriedade dese!ada,
e caso a mesma tenha sido enviada pelo &roBser, a mesma # retornada como uma 0tring.
HttpHeadIn
Para a recepç"o e tratamento das informações recebidas atrav#s do <eader do pacote <66P, foi criado o alias virtual <ttp<eadIn, 'ue al#m de consultar as informações constantes no <eader <66P proveinente da
re'uisiç"o do usuário, permite tamb#m acesso à propriedades da cone:"o atual do usuário, como o IP do usuário solicitante, por e:emplo.
HttpHead&ut
/trav#s deste alias virtual de retorno, podemos alterar ou criar um par(metro no <eader de retorno <66P do Protheus , a ser devolvido ào &roBser solicitante de uma re'uisiç"o de processamento.
Http2ession
alias virtual <ttp0ession foi criado para possibilitar a criaç"o de variáveis KsessionK por usuário do site, com controle de identificaç"o nativa da ferramenta atrav#s de um coo9ie de identificaç"o , chamado
0E00ILI+. Lo tópico K/lias Nirtual <ttp0essionK # e:plicado em detalhes o funcionamento deste mecanismo.
Este recurso nos permite criar , atricuir conteJdo e consultar conteJdo de uma variável relacionada ào usuário 'ue está reali$ando uma re'uisiç"o http. Podemos arma$enar em uma variável de 0ession os seguintes
tipos de variáveis E / *arraA. , 7 *character. , + *data., 3 *lógica. e L *num#rica. . L"o s"o suportados *b!etos. e=ou & *7ode &loc9s..
Limitações de uso dos alias virtuais para rece.imento de par'metros
+adas as caracter)sticas operacionais e de acesso àos alias virtuais, devemos estar atentos à nomenclatura de campos de um formulário <6,3, para serem recuperados com sucesso pelos alias virtuais correspondentes.
/ nomenclatura de campos do formulário deve obedecer à regra de criaç"o de variáveis em /dvpl E campo do formulário deve sempre ser iniciado com um caracter alfab#tico, pode conter letras ou algarismos no
nome, e o caracter gOg * underline .. L"o s"o permititos espaçõs, h)fen ou caracteres acentuados como nome de um campo. 7aso utili$ado um nome de campo fora do padr"o suportado, o conteJdo do mesmo n"o será
recuperável em /dvpl.
0. Alias virtual Http)oo=ies
@evis"oE 5Y=U4=455X
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
/trav#s do alias virtual <ttp7oo9ies, # poss)vel consultar os 7oo9ies do <eader <ttp enviados pelo &roBser, e criar ou alterar o conteJdo de um coo9ie a ser devolvido ào &roBser. Hma variável de 7oo9ie retorna um
tipo /dvpl 0tring , e apenas aceita uma atruibuiç"o de 0tring. Nale lembrar tamb#m 'ue um coo9ie # um recurso do &roBser 'ue está reali$ando a re'uisiç"o, e e:iste um limite de tamanho para o total de 7oo9ies
utili$ados. Este limite costuma ser pró:imo a U548 &Ates .
6rata-se portanto de uma propriedade de leitura e gravaç"o, dispn)vel apenas 'uando a funç"o /dvpl # e:ecutada atrav#s de uma re'uisiç"o http via lin9 .apB utili$ando a configuraç"o de %or9ing 6hreads %E&E;.
3tili/aç'o de Cookies
/ utili$aç"o de 7oo9ies tIm ob!etivo prático restrito à aplicações onde ha!a a necessidade impl)cita de termos uma informaç"o relacionada ào broBser utili$ado pelo usuário atual, 'ue devam ser interpretadas
independente do usuário estar logado ou n"o * isto # , independam diretamente de sessions ..
Hm e:emplo prático disto # o desenvolvimento de um site onde o conteJdo din(mico # retornado ao usuário em mais de um idioma. La entrada do site, apresentamos um formulário ao usuário onde o mesmo irá
escolher o idioma de sua preferIncia. ,esmo 'ue a session de login deste usuário e:pire no servidor, o coo9ie com o idioma selecionado ainda está no &roBser, de modo 'ue a pró:ima re'uisiç"o do usuário pode ser
codificada para direcioná-lo para a página de login do site com as mensagens no idioma 'ue o mesmo !á estava navegando.
Lendo o valor de um Cookie
/trav#s dos e:emplos abai:o , lemos o valor do 7oo9ie de identificaç"o do Jsuário, e um coo9ie de usuário criado para identificar no &roBse 'ual # o idioma utili$ado pelo usuário atual.
cHserId EW <ttp7oo9ies-TH0E@I+ == @etorna o 7oo9ie identificador do usuário do Protheus
cIdioma EW <ttp7oo9ies-T0ite3ang == @etorna o conteJdo do coo9ie 0ite3ang , criado
Lendo todos os Cookies rece.idos
alias virtual <ttp7oo9ie possui uma propriedade chamada a7oo9ies, criada apenas para consulta *read-onlA., 'ue retorna um /rraA /dvpl de 0trings , contendo os nomes dos 7oo9ies enviados pelo &roBser ào
Protheus . Por e:emplo E
aFn4o $% 1ttpEoo6iesK>aEoo6ies
&o nF $% 1 to len.aFn4o/
// 2osta no "onsole do Seve todos os "oo6ies e"ebidos9
"onout.;Eoo6ie ;)st.nF#G/); % ; ) aFn4o>nF?/
(e*t
Criando um Cookie
/ criaç"o de um 7oo9ie # reali$ada atrav#s da atrubuiç"o de um valor diretamente ào coo9ie dese!ado. Por e:emplo E
1ttpEoo6iesK>2euEoo6ie $% ;',S',;
[
/ criaç"o de um 7oo9ie merece uma atenç"o especial, pois um 7oo9ie # retornado ào broBser atrav#s do <eader de @etorno <66P. +e modo 'ue, para 'ue a criaç"o de um coo9ie se!a reali$ada com sucesso , o
mesmo deve ser criado antes de haver 'ual'uer processamento de /P< = /<H, caso este 'ue n"o seria mais poss)vel a criaç"o do 7oo9ie, pois o <eader de @etorno <66P !á teria sido enviado ào broBser solicitante.
0>. Alias virtual Http?et
/trav#s do alias virtual <ttpDet, podemos consultar se uma determinada propriedade nos foi enviada atrav#s da H@3 * m#todo DE6 ..
6rata-se portanto de uma propriedade de leitura *read-onlA., dispon)vel apenas 'uando a funç"o /dvpl # e:ecutada atrav#s de uma re'uisiç"o http via lin9 .apB utili$ando a configuraç"o de %or9ing 6hreads %E&E;.
Consultando um Par4metro
retorno da consulta de um par(metro pode ter dois tipos E LI3 , caso o par(metro n"o tenha sido enviado , ou 0tring , contendo o conteJdo do par(metro. Por e:emplo, vamos reali$ar uma re'uisiç"o a um lin9 .apB ,
passando pela H@3 o par(metro I,/DE, , com o cont#Jdo 6E06E E
httpE==localhost=uO6esteDet.apB`imagemWtesteacorWa$ul
Para recuperarmos em /dvpl o conteJdo dos par(metros ima:em e "o , utili$amosE
"Fma:em $% 1ttpNetK>ima:em
"Eo $% 1ttpNetK>"o
Podemos inserir tamb#m um tratamento default E 7aso algum par(metro n"o se!a enviado * resulte LI3 . , assumimos um valor para o mesmo
D,&AOL' "Fma:em $% ;Lo:oApP;
D,&AOL' "Eo $% ;amaelo;
E:iste tamb#m uma propriedade do alias virtual <ttpDet chamada aDets , onde podemos recuperar um arraA de strings , contendo a lista com os nomes dos par(metros enviados pelo broBser solicitante . Por e:emplo E
aFn4o $% 1ttpNetK>aNets
&o nF $% 1 to len.aFn4o/
"onout.;N,' ;)st.nF#G/); % ;)aFn4o>nF?/
(e*t
02. Alias virtual HttpPost
/trav#s do alias virtual <ttpPost, podemos consultar os campos submetidos ào servidor atrav#s do m#todo P06.
6rata-se portanto de uma propriedade de leitura *read-onlA., dispon)vel apenas 'uando a funç"o /dvpl # e:ecutada atrav#s de uma re'uisiç"o http via lin9 .apB utili$ando a configuraç"o de %or9ing 6hreads %E&E;.
Consultando um Par4metro
retorno da consulta de um par(metro pode ter dois tipos E LI3 , caso o par(metro n"o tenha sido enviado , ou 0tring , contendo o conteJdo do par(metro. Por e:emplo, vamos reali$ar uma re'uisiç"o a um lin9 .apB ,
atrav#s de um formulário html com m#todo P06, partindo do <tml abai:o E
<html><body>
<4om method%;P-S'; a"tion%;http$//lo"alhost/uA'stPost9ap=;>
'este $ <input type%;te*t; name%;E-DFN-; siQe%;10;>
<h>
<input type%;submit;>
</4om>
</body></html>
Para recuperarmos em /dvpl o conteJdo do campo E-DFN-, utili$amosE
"Eodi:o $% 1ttpP-S'K>Eodi:o
E:iste tamb#m uma propriedade do alias virtual chamada aPost , onde podemos recuperar um arraA de strings , contendo a lista com os nomes dos par(metros enviados pelo broBser solicitante . Por e:emplo E
aFn4o $% 1ttpPostK>aPost
&o nF $% 1 to len.aFn4o/
"onout.;P-S' ;)st.nF#G/); % ;)aFn4o>nF?/
(e*t
0.. Alias virtual HttpHead5"
/trav#s do alias virtual <ttp<eadIn, podemos consultar os par(metros enviados pelo &roBser solicitante enviados atrav#s do <eader <66P ao reali$ar uma re'uisiç"o ao Protheus 0erver.
6rata-se portanto de uma propriedade de leitura *read-onlA., dispon)vel apenas 'uando a funç"o /dvpl # e:ecutada atrav#s de uma re'uisiç"o http via lin9 .apB utili$ando a configuraç"o de %or9ing 6hreads %E&E;.
Consultando um Par4metro
retorno da consulta de um par(metro pode ter dois tipos E LI3 , caso o par(metro n"o tenha sido enviado , ou 0tring , contendo o conteJdo do par(metro. Por e:emplo, vamos consultar o header http Hser-/gent ,
enviado pelo &roBser solicitante contendo uma 0tring identiificando o modelo de &roBser utili$ado E
"OseA:ent $% 1ttpheadinK>OseAA:ent
+evemos obter como retorno uma string parecida com a mostra abai:o E
2oQilla/R90 ."ompatibleJ 2SF, S90J +indo=s (' T91J 9(,' ELC 1909GB0T/
O@servação 5mporta"te A
2ual'uer par(metro no <eader <66P 'ue contenha um ou mais caracteres inválidos para a nomenclatura de variáveis /dvpl , * como por e:emplo o Hser-/gent , 'ue cont#m um h)fen ., s"o trocados pelo caractere KOK
underline , para ser poss)vel a leitura da propriedade.
Propriedades especiais
1ttp1eadFnK>a1eades
@etorna um /rraA de 0trings , contendo todas as linhas do <eader <66P da re'uisiç"o.
1ttp1eadFnK>main
@etorna o nome da funç"o chamda atrav#s da H@3 , sem a e:tens"o e sem o host. Por e:emplo , ao chamar o lin9 httpE==localhost=uOtst<Eader.apB , o conteJdo de <ttp<eadin-Tmain será KuOtst<EaderK
1ttp1eadFnK>C,2-',AADDC
@etorna uma string , no formato nnn.nnn.nnn.nnn , o IP da estaç"o 'ue reali$ou a re'uisiç"o.
http1eadFnK>C,2-',AP-C'
@etorna um valor /dvpl num#rico , informando a porta utili$ada para reali$ar a re'uisiç"o.
09. Alias virtual HttpHeadOut
@evis"oE 5Y=U4=455X
/brangIncia
Ners"o Z.U5 3I& %E&E;
/trav#s deste alias virtual de retorno, podemos alterar ou criar um par(metro no <eader de retorno <66P do Protheus , a ser devolvido ào &roBser solicitante de uma re'uisiç"o de processamento.
6rata-se portanto de uma propriedade de retorno, dispon)vel apenas 'uando a funç"o /dvpl # e:ecutada atrav#s de uma re'uisiç"o http via lin9 .apB utili$ando a configuraç"o de %or9ing 6hreads %E&E;.
/ criaç"o de uma linha no <eader <66P merece uma atenç"o especial, pois para 'ue a operaç"o reali$ada com sucesso , o header deve ser criado antes de haver 'ual'uer processamento de /P< = /<H, pois neste caso
o <eader de @etorno <66P !á teria sido enviado ào broBser solicitante.
0B. Alias virtual HttpSessio"
/trav#s do alias virtual http0ession, podemos criar e consultar variáveis do tipo KsessionK, relacionadas ào usuário 'ue reali$ou a re'uisiç"o atrav#s do &roBser.
Para diferenciar os usuários 'ue est"o navegando num site, o Protheus busca por um coo9ie identificador de usuário, retornado para o broBser a cada re'uisiç"o de lin9 . /P%, chamado 0E00ILI+. 7aso o Protheus
receba este coo9ie, ele identifica 'uais sessions pertencem a este usuário.
2uando um usuário reali$a a primeira re'uisiç"o http ao Protheus, o Protheus n"o recebe o coo9ie identificador , e automaticamente iniciali$a um identificador de sessions para o mesmo, retornando o identificador ao
&roBser via <eader <66P. Este identificador pode ser recuperado em uma funç"o advpl atrav#s de http0ession-T0E00ILI+.
2uando criamos uma variável de session, ela pode ser acessada nas pró:imas re'uisições provenientes deste mesmo usuário. 7aso uma variável de session consultada n"o e:ista, ela retorna o valor LI3 *nulo..
Ne!amos os e:emplos abai:o E
Criando vari5veis 2ession
<ttp0ession-THserId EW KU4XK
<ttp0ession-THserLame EW HODetHserLame*.
Las linhas acima , criamos uma session para o usuário atual , chamada HserId , com o conteJdo do tipo 0tring, e criamos outra session chamada HserLame , com o retorno da funç"o HODetHserLame*.
Consultando vari5veis 2ession
/o consultar uma variável KsessionK, sempre devemos prever 'ue a mesma n"o pode ter sido criada, de modo 'ue a consulta pode retornar LI3, ou caso a session !á e:ista , retornará o valor do tipo 'ue foi atribu)do ha
mesma.
If <ttp0ession-THserId W LI3
== 0ession ainda n"o foi criada d Hsuário n"o está logado.
conout*KHsuario n"o está logadoK.
Else
== 0ession !á criada, o usuário está logado
conout*KHsuario está logado E I+ W K P <ttp0ession-THserId .
Endif
#6emplo de Funcionamento de 2ession
Lo e:emplo abai:o, criamos uma session para identificar 'uantas ve$es o usuário chamou esta funç"o espec)fica. +amos o nome da session de ,A7ounter, 'ue irá conter um nJmero. Lo primeiro acesso do usuário, a
session n"o e:iste * W LI3 ., e # criada com o valor num#rico U *um.. / partir das pró:imas re'uisições reali$adas ao Protheus atrav#s desta página * atrav#s do bot"o K@efreshK do &roBser, por e:emplo . , a session !á
e:iste, sendo somado o valor U ào conteJdo !á e:istente, e devolvido ào broBser solicitante um <tml informando 'uantas chamadas !á foram reali$adas por este usuário.
Uin"lude ;=ma6e9"h;
Uin"lude ;ap=ebe*9"h;
Ose &un"tion 'stSession./
Z
Lo"al "1tml $% ;; # ","ho $% ;;
+,B ,D',(D,D F(F' "1tml
F4 httpSessionK>my"ounte % (FL
","ho $% ;Fni"ialiQando "ontado;
Eonout.","ho/
"1tml )% ","ho
httpSessionK>my"ounte $% 1
,lse
httpSessionK>my"ounte))
","ho $% ;"ontado em ;)st.httpSessionK>my"ounte#G/
"onout.","ho/
,ndi4
"1tml )% ","ho ) ;<h>;
+,B ,D',(D,D ,(D
Cetun "1tml
/pós compilado o fonte acima e o 0erver Protheus configurado e iniciado com <66P habilitado e as Bor9ing 6hreads configuradas, abra um %eb &roBser e solicite a url httpE==localhost=uOtstsession.apB . 0erá
mostrado no &roBse a mensagem KIniciali$ando 7ontadorK. /gora , peça um K@efreshK desta tela ao &roBser E 0erá devolvida a mensagem K7ontador em 4K ... e a cada refresh deste &roBser , o contador será
incrementado.
3so de 2essions e Paralelismo , Comportamento do Prot"eus 2erver
Protheus 0erver trata às re'uisições simult(neas de lin9s ./P% em paralelo , desde 'ue este!am dispon)veis o numero de %or9ing 6hreads necessário para tal. Por e:emplo , em uma estrutura de >rames , onde cada
um deles aponta o 0@7 *source. para um lin9 .apB , o &roBser envia as trIs re'uisições de .apB para o Protheus 0erver , e caso e:tistam X Bor9ing threads dispon)veis na'uele momento , as trIs re'uisições s"o
atendidas em paralelo.
Por outro lado , se em duas destas trIs re'uisições fa$-se necessária a atuali$aç"o e=ou consulta a uma variável de 0ession * httpsession . , este processamento em paralelo , caso n"o fosse tratado , poderia gerar perdas
no conteJdo da session caso a mesma session fosse atuali$ada simultaneamente.
Para resolver esta 'uest"o, de maneira a n"o sobrecarregar o 0ervidor com solicitações de Processamento 0e'uencial * 7ritical 0essions . , foi montado um es'uema de 3oc9 de 0ession de Hsuário automático, com
liberaç"o automática após o processamento do /P%, ou liberaç"o manual atrav#s da chamada da funç"o <ttp3eave0ession*. antes do processamento ser terminado.
E:emplificando a aplicaç"o prática e funcionamento deste conceito , partimos de um ambiente hipot#tico utili$ando X frames , onde um usuário reali$a uma re'uisiç"o à funç"o 'ue retornará o source <6,3 da página
de frames, e a mesma ao chegar no &roBser, fa$ o mesmo reali$ar as trIs re'uisições simultaneamente, todas elas referentes ao mesmo usuário. Por#m , o primeiro e o segundo frames reali$am uma operaç"o 'ual'uer
com uma ou mais variáveis da 0ession do usuário , e o terceiro frame reali$a um outro processamento 'ue n"o depende da consulta de nenhuma variável da 0ession E /s trIs re'uisições referente a este usu]ario ser"o
processadas simultaneamente por Bor9ing 6hreads diferentes * vamos supor 'ue na'uele momento haviam trIs %or9ing 6hreads dispon)veis. ] por#m 'uando uma das duas Bor9ing 6hreads 'ue tentarem acesso à uma
variável de 0ession da'uele usuário , o 0ervidor verifica se alguma outra 6hread está com o flag de acesso às sessions deste usuario E 0e nenhuma outra thread em uso por este usuário está com a bandeira , ent"o a
thread atual pega a bandeira para ela] sen"o o processamento da 6hread # congelado no aguardo da liberaç"o da bandeira.
/ liberaç"o da bandeira ocorre automaticamente no retorno da %or9ing 6hread para o &roBser , antes da chamada do ponto de entrada para @eset do /mbiente, atrav#s da chamada na elibE: da funç"o
<ttp3eave0ession*.. 7aso se!a viável para o usuário liberar as sessions antes do retorno da funç"o , ele pode utili$ar-se da funç"o http3eave0ession*. no seu fonte , sem necessariamente aguardar pelo encerramento
efetivo e reset de ambiente da %or9ing 6hread.
3ogo , retornando ao e:emplo acima , os >rames U e 4 ir"o concorrer pela banceira de atuali$aç"o de conteJdo de sessions, onde o primeiro frame 'ue a ser e:ecutado pegará a bandeira para ele e atuali$ará a session , e
o segundo frame irá esperar o primeiro liberar a bandeira para continuar a ser processado] e o terceiro frame , como n"o utili$a nenhuma variável da session , será processado sem depender de nenhum dos outros dois
frames anteriores.
2uando utili$amos /0P * ,icrosoft /ctive 0erver Pages . , o mesmo reali$a uma seriali$aç"o de re'uisições de páginas /0P por usuário, de modo 'ue , caso o mesmo usuário solicite trIs frames .asp , as re'uisições
de processamento chegar"o ao 0ervidor /0P 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 'ue , mesmo 'ue
nenhuma das páginas faça uso de sessions , todas as páginas deste usuário ser"o processadas em se'uIncia.
0C. E"vio simult;"eo de HT64 ao BroDser
/s aplicações Beb desenhadas para utili$ar a Infra-Estrutura /P%E&E; contam com o recurso de gEnvio simult(neo de <tml ao &roBserg durante o processamento de uma página /dvpl-/0P * ./P< e=ou ./<H . .
Este recurso # habilitado atrav#s do Protheus I+E, nas opções de configuraç"o de compilaç"o do ambiente em 'uest"o] mais especificamente habilitado atrav#s do 7hec9&o: gb c E:ibir conteJdo do /dvpl /0P
progressivamente no &roBserg.
/o habilitamos esta configuraç"o, todos os ar'uivos /P< e /<H s"o parseados fa$endo internamente o uso da funç"o <ttp0end*., de modo 'ue mesmo antes do processamento estar conclu)do , o <tml gerado !á está
sendo enviado ào &roBser 'oe o solicitou.
/ utili$aç"o deste recurso provI um ganho de performance subtancial na aplicaç"o final. 6odos os pro!etos desenvolvidos com esta tecnologia * Infra-Estrutura /P%E&E; . devem ter esta configuraç"o de compilaç"o
habilitada no I+E. Nale lembrar 'ue, caso este recurso n"o este!a habilitado] ao habilitá-lo, os ar'uivos .aph e .ahu do pro!eto necessitam ser recompilados para 'ue esta configuraç"o tenha o efeito dese!ado.
Pode e:istir a necessidade de um processamento de um /P< ou /<H n"o enviar o script <tml gerado diretamente ao &roBser. Para tal situaç"o, podemos desabilitar temporariamente este recurso de envio de html
progressivo em tempo de e:ecuç"o, permitindo assim, por e:emplo, uma funç"o chamar em se'uIncia dois ar'uivos /P< , um para gerar um conteJdo <tml a ser enviado via e-mail , arma$enado em uma variável
/dvpl , e outro /P< para a montagem de uma tela de status, 'ue será enviada ào &roBser solicitante.
Para habilitar e=ou desabilitar o envio simult(neo do 0cript <6,3 ào broBser em tempo de e:ecuç"o, utili$e a funç"o <ttp0etPart*.
0E. )o"#iguraç$es espec7#icas APWEBE:
/o utili$armos as funções de Infra-estrutura /P%E&E;, e:istem recursos da lib 'ue e:igem uma configuraç"o adicional para serem utili$ados.
#nvio de e,mail autom5tico atrav7s da 8otina de Tratamento de #rro do 2ite
Em caso de erro fatal na aplicaç"o %eb, a própria rotina de tratamento de erro pode ser configurada para enviar um e-mail ào /dministrador do sistema. Para tal, # necessário inserir as chaves abai:o na seç"o
do ambiente em uso para o site E
Error0,6PW *endereço do servidor 0,6P a ser usado para o envio do e-mail .
Error,ailW * um ou mais endereços de e-mail a receber op e-mail de erro, separados por virgula .
Error>romW * um e apenas um endereço de e-mail a ser usado como remetente do aviso de erro .
Error3ogin W * nome de usuario de login no servidor de 0,6P, caso necessário .
ErrorPassBordW * senha do usuario de login no servidor de 0,6P, caso necessário .
e.Admin , Lo!in alternativo
/ infra-estrutura /P%E&E; e:ige um usuário e senha para entrar no módulo de administraç"o %eb/dmin. Para validar o login, # utili$ado o ar'uivo de senhas do E@P. usuário deve ser o K/dministradorK ou
pertencer ao grupo de administradores para ter acesso ào %eb/dmin. 7aso n"o se!a viável usar este ar'uivo de senhas para validar o login, podemos inserir uma chave adicional * /dm3ogin . no Environment em uso
pela aplicaç"o %eb, e configurar nela a senha do usuário K/dministradorK para login no %eb/dmin. 7aso esta chave se!a configurada, o ar'uivo de senhas do E@P n"o será utili$ado para validar o login no %eb/dmin.
/dm3oginW * senha do /dministrador para logar no %eb/dmin .
Pasta alternativa para upload de 8po via e.Admin
Lo %eb/dmin , # poss)vel utili$ar uma configuraç"o espec)fica para a troca do repositório de ob!etos em uso no site, sem 'ue se!a necessário parar o servidor para isso. Por default , a pasta de upload chama-se
Kf0Bap@PfK, e deve e:istir na estrutura de diretório do ambiente utili$ado, a partir do diretório rai$ do ambiente * CootPath ..
@poHploadW * pasta de upload alternativa, a partir do @ootPath do ambiente .
10. *ecome"daç$es #i"ais
Para todo o desenvolvimento de soluções, temos em m"os uma diversidade de recursos, desenhados para melhor atender às necessidades e ade'uar-se às caracteristicas da aplicaç"o. +ada a fle:ibilidade dos recursos,
recomenda-se aos desenvolvedores adotarem um padr"o de desenvolvimento e ter em foco a eficiIncia da aplicaç"o final, tanto no aspecto funcional como na codificaç"o .
3ançando m"o da e:periIncia em desenvolvimento de aplicações Beb ad'uiridas nos Jltimos anos, nos tópicos abai:o est"o relacionadas algumas medidas tomadas no desenvolvimento de aplicações 'ue nos s"o muito
Jteis no decorrer de um pro!eto.
9omenclatura de Funções
Para o desenvolvimento de aplicações Beb, foi criado o K0tatementK %E& >HL76IL para a declaraç"o de funções referentes à pro!etos Beb. Este comando , na prática , apenas prefi:a a declaraç"o da funç"o com
%O , por#m a sua utili$aç"o identifica 'ue a funç"o em 'uest"o foi constru)da Jnica e e:clusivamente para ser chamada a partir de uma re'uisiç"o <66P . Em adendo à este, devemos utili$ar os comandos %E&
E;6EL+E+ ILI6 ... EL+ , disponivels no Include KapBebe:.chK , para proteger a funç"o de ser chamada em um ambiente 'ue n"o o /P%E&E;.
2eparando a Interface do Processamento
/o desenvolver utili$ando /dvpl /0P , páginas /P< = /<H, recomenda-se separar o processamento da Interface, do seguinte modo E 7riar uma %eb >unction para a chamdada de umna página com conteJdo
din(mico via lin9 .apB , e um ar'uivo ./P< ou ./<H de mesmo nome , 'ue será chamado internamente , de modo 'ue o código-fonte escrito na %eb >unction se!a responsável para gerar as informações a serem
disponibili$adas para o usuário , e o ./P< contenha apenas a KmáscaraK destas informações e o m)nimo de instruções /dvpl poss)vel para a montagem da página. Este processo facilita a manutenç"o de amobos
os códigos, pois o %eb +esigner 'ue irá reali$ar um a!uste no /P< n"o terá 'ue KdesviarK do fonte /dvpl inserido na página , e o /nalista = Programador 'ue fará a manutenç"o no código /dvpl preocupar-se-á apenas
com o código responsável para a geraç"o dos dados 'ue ser"o mascarados.
3tili/aç'o das Funções de Infra,#strutura
/trav#s dos comandos e funções disponibili$adas na Infra-Estrutura /P%E&E;, n"o tImos a necessidade de recriar partes comuns de código para todos os pro!etos 'ue se utili$em desta tecnologia, al#m de permitir
atrav#s de pontos de entrada estrategicamente colocados na ferramenta um n)vel alt)ssimo de customi$aç"o para os pro!etos desenvolvidos com esta tecnologia, de maneira prática e ob!etiva.
Y
11. 6o"itorame"to de Sites em WEBE:
b!etivo de uma funç"o de ,onitoramento de 0ites # testar as funcionalidades básicas de um site, retornando uma mensagem <6,3 pr#-definida , indicando 'ue está tudo certo , e em caso de erro , uma
mensagem 'ue procure identificar o 'ue está de errado.
Para sites desenvolvidos em Protheus , utili$ando a tecnologia %E&E; , devemos criar uma funç"o espec)fica para o site , 'ue irá determinar se o mesmo está operacional . Esta funç"o será chamada atrav#s de
lin9 .apB
Ne!amos o e:emplo abai:o, escrito para um site cu!as bases de dados est"o num 023 , acessadas via 6op7onnect. Leste e:emplo , a funç"o chamada será httpE==servidor=HO0ite,onitor.apB , e caso este!a tudo certo ,
ela retornará a string K*0I6E e.K , seguido da data e horário da e:ecuç"o da rotina. 2ual'uer retorno diferente disto poderá indicar uma anomalia no funcionamento do site.
2uando hospedado um site utili$ando esta tecnologia no +ata7enter da ,a9ira , esta informaç"o gerada pela rotina deve ser passada ào depto de infra-estrutura, 'ue configurará um softBare K,onitor de 0itesK, 'ue irá
reali$ar a cada um minuto uma re'uisiç"o à url especificada , e irá emitir um alerta ao +epartamento para 'ue se!a verificado o site caso ha!a alguma falha na resposta.
#include "protheus.ch"
#include "apwebex.ch"
User Function SiteMonitor()
Local cQuery , nQtdRec

// Verifica se a working Thread está conectada com o TOP ...
If !TCIsConnected()
Return 'Working Thread perdeu a conexão com o TOP'
Endif
// Verifica se as tabelas principais estão abertas ....
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'
OPEN QUERY cQuery ALIAS 'TMPCOUNT'
nQtdRec := TMPCOUNT->QTDREC
CLOSE QUERY 'TMPCOUNT'
If nQtdRec=0
Return 'Falha na Contagem de registros / Query SA1'
Endif
// Se está tudo certo , retorna um HTML informando que está tudo OK
Return '(SITE OK) '+dtos(date())+' '+time()
)oma"dos 1 )4OSE F,E*G
0inta:e
730E 2HE@i c/lias
Par(metros
/rgumento 6ipo +escriç"o
c/lias 7aracter
/lias sob o 'ual o cursor da 2uerA foi aberto. 7aso o alias passado como par(metro n"o se encontre aberto , a funç"o n"o gera nenhuma ocorrIncia de
erro.
+escriç"o
/trav#s do comando 7lose 2uerA , reali$amos o fechamento de uma 'uerA aberta atrav#s do comando PEL 2HE@i.
ATEHIJO A ,ma -uerK a@erta pelo coma"do OPEH F,E*G deve ser #echada pelo coma"do )4OSE F,E*G . Poder7amos #echar o alias a@erto atrav0s de uma FuerK simplesme"te com a #u"ção
+@)loseAreaLM/ por0m isto dei!aria em a@erto eleme"tos i"ter"os de co"trole criados pelo coma"do OPEH F,E*G.
)oma"dos 1 OPEH F,E*G
0inta:e
PEL 2HE@i Rc2uerAT /3I/0 Rc/liasT b bL7</LDEc c
Par(metros
/rgumento 6ipo +escriç"o
Rc2uerAT 7aracter c2uerA corresponde à 0tring contendo a 2uerA a ser e:ecutada no banco de dados
/3I/0 Rc/liasT 7aracter
c/lias corresponde ao nome do alias sob o 'ual o cursor de retorno dos dados pes'uisados será aberto no ambiente /dvpl. L"o pode ser especificado
um nome de alias !á em uso, sen"o a aplicaç"o será finali$ada com a ocorrIncia de erro g/lias alreadA in Hseg
bL7</LDEc 7aracter 7aso especificada a cláusola L7</LDE na abertura da 'uerA , a string em c2uerA n"o será submetida à funç"o 7hange2uerA*.
+escriç"o
/trav#s do comando PEL 2HE@i , reali$amos a abertura de uma 2uerA de busca no &anco de +ados atrav#s do @++ 6P7LL , retornando os dados consultados atrav#s de um K/3I/0K /dvpl.
7aso a 2uerA nao possa ser aberta, por erro de sinta:e , devido à thread atual n"o estar conectada com o 6op7onnect , ou outro erro , será gerado um log de erro , informando o /lias , o 0tac9 * Pilha de 7hamadas . de
e:ecuc"o , e o conteJdo da 2uerA para +ebug.
OBSE*<AINES 56PO*TAHTES
• La montagem da string da 2uerA , devemos especificar os comandos 023 , alias e nomes de campos em letras maiJsculas.
• 2uando utili$amos o comando PEL 2HE@i , n"o precisamos passar a e:press"o da 2uerA atrav#s da funç"o 7hange2uerA*.. Este proceduimento !á # reali$ado internamente pelo comando PEL
2HE@i. Para 'ue a 'uerA n"o se!a submetida à funç"o 7hange2uerA*., devemos utili$ar o par(metro L7</LDE.
• / utili$aç"o deste comando # impl)cita à 3I& /P%E&E; , e necessita da utili$aç"o do jinclude K/pBebe:.chK
)oma"dos 1 WEB E:TEH+E+ EH+
0inta:e
%E& E;6EL+E+ EL+ Rc<tmlT b 06/@6 Rc>n0tartT c
Par(metros
/rgumento 6ipo +escriç"o
Rc<tmlT 7aracter
c<tml corresponde à variavel 'ue será utili$ada para arma$enar a 0tring <tml 'ue será retornada ao &roBser solicitante do processamento. +eve ser
especificada uma variável 0tring , com conteJdo va$io. *gg.
06/@6 Rc>n0tartT 7aracter
c>n0tart corresponde ào nome de uma funç"o /dvpl 'ue será e:ecutada para pr#-validar a e:ecuç"o do resto do código. / funç"o deve ser passada
0E, parInteses *. .
+escriç"o
+evemos utili$ar este comando para fechar uma seç"o aberta pelo comando %E& E;6EL+E+ ILI6 . Para cada ocorrIncia do comando %E& E;6EL+E+ ILI6 , deve-se ter um fechamento da mesma atrav#s do
comando %E& E;6EL+E+ EL+ , devendo haver apenas uma ocorrIncia desta estrutura por funç"o.
/ utili$aç"o deste comando # implicita à %or9ing 6hreads iniciali$adas pela 3ib /P%E&E; , e a definiç"o do mesmo está no ar'uivo jinclude KapBebe:.chK , 'ue deve ser declarado no in)cio do ar'uivo fonte /dvpl.
\
)oma"dos 1 WEB E:TEH+E+ 5H5T
0inta:e
%E& E;6EL+E+ ILI6 Rc<tmlT b 06/@6 Rc>n0tartT c
Par(metros
/rgumento 6ipo +escriç"o
Rc<tmlT 7aracter
c<tml corresponde à variavel 'ue será utili$ada para arma$enar a 0tring <tml 'ue será retornada ao &roBser solicitante do processamento. +eve ser
especificada uma variável 0tring , com conteJdo va$io. *gg.
06/@6 Rc>n0tartT 7aracter
c>n0tart corresponde ào nome de uma funç"o /dvpl 'ue será e:ecutada para pr#-validar a e:ecuç"o do resto do código. / funç"o deve ser passada
0E, parInteses *. .
+escriç"o
+evemos utili$ar este comando , !untamente com o comando %E& E;6EL+E+ EL+ 'uando montamos uma func"o * %eb >unction . 'ue foi constru)da para ser chamada a partir de um %eb &roBser , 'uando nos
utili$amos das funções de Infra-Estrutura /P%E&E;.
/trav#s dele , # reali$ada uma pr#-validaç"o 'ue certifica 'ue a e:ecuç"o da funç"o somente será reali$ada caso a thread atual se!a realmente uma 6hread montada no ambiente %E&E;, al#m de podermos inserir uma
pr#-validaç"o *06/@6. de e:ecuç"o espec)fica para esta funç"o.
7aso se!a especificada uma funç"o na cláusula 06/@6, a mesma deverá retornar uma 0tring. @etornando uma 0tring em branco , o processamento da funç"o original será efetuado normalmente . 7aso a funç"o retorne
uma string n"o-va$ia , esta string será retornada para a variável c<tml , e o processamento do programa será desviado para a linha do código-fonte imediatamente posterior ào comando %E& E;6EL+E+ EL+ .
Para cada ocorrIncia do comando %E& E;6EL+E+ ILI6 , deve-se ter um fechamento da mesma atrav#s do comando %E& E;6EL+E+ EL+ , devendo haver apenas uma ocorrIncia desta estrutura por funç"o.
/ utili$aç"o deste comando # implicita à %or9ing 6hreads iniciali$adas pela 3ib /P%E&E; , e a definiç"o do mesmo está no ar'uivo jinclude KapBebe:.chK , 'ue deve ser declarado no in)cio do ar'uivo fonte /dvpl.
5"#ra1Estrutura APWEBE: - E"v,ser.AP4 1 E!emplo de ,so com E*P
/trav#s do e:emplo prático abai:o , utili$amos em um código fonte /dvpl os pontos de entrada disponibili$ados na Infra-Estrutura /P%E&E; para reali$ar a preparaç"o de um ambiente E@P , @eset de /mbiente ,
finali$aç"o de 6hread, finali$aç"o de sessions por time-out e customi$aç"o de mensagem de erro para o desenvolvimento de um pro!eto de %eb 0ite integrado com o E@P ,icrosiga.
+evemos adotar como padrão para proOetos -ue utiliPam APWEBE: a criação do ar-uivo QE"v,ser.aplQ/ especi#icame"te para a de#i"ição dos po"tos de e"trada utiliPados pela 5"#ra1Estrutura
APWEBE:R e devemos ape"as compilar os #o"tes dos po"tos de e"trada realme"te "ecessSrios 8o proOeto.
#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.
Ponto de entrada executado na inicialização de cada Working Thread ( ONSTART )
É a responsável por preparar o ambiente para atender às requisições WEB de links .apw
Não recebe parâmetro algum da lib , e deve retornar .T. caso tenha inicialziado com sucesso
ou .F. em caso de falha de inicialização .
---------------------------------------------------------------------------- */
USER Function StartWebEx()
// Prepara o Ambiente ERP
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 ""
Esta funcao é chamada pela rotina de tratamento de erro WEBEX , quando ocorre um erro fatal ,
e permite que seja retornado um Html de tratamento de erro diferenciado. Ela recebe como
U5
parametro o objeto do erro , a mensagem ASCII que foi acrescentada ao arquivo error.log ,
e o Html original montado pela rotina de tratamento de erro default .
IMPORTANTE : Por sem um ponto de entrada executado em um momento crítico (tratamento
de erro ) , esta função deve ser o mais suscinta e simples possível , não utilizando
sessions, banco de dados , etc....
---------------------------------------------------------------------------- */
USER Function WebExError(oError,cErrorLog,cHtml)
Local cCustomHtml := ''
// Monta mensagem de erro mais amigavel ...
cCustomHtml += ''
cCustomHtml += ''
cCustomHtml += ''
cCustomHtml += ''
cCustomHtml += ''
cCustomHtml += '
'
cCustomHtml += '
Ocorreu um erro inesperado no '
cCustomHtml += 'processamento desta página. O Administrador do sistema será notificado desta '
cCustomHtml += 'ocorrência . Recomendamos fortemente que esta janela do navegador seja '
cCustomHtml += 'fecada! e uma nova janela seja a"erta para retornar # navega$%o do site.
'
cCustomHtml += '
'
cCustomHtml += '
'
cCustomHtml += ''
cCustomHtml += ''
Return cCustomHtml
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção ES)APE
Los e:emplo abai:o, utili$amos a funç"o escape*. para formatar par(metros para inserir em uma H@3.
cUrl := 'http://localhost/webinfo.apw'
cPAram1 := 'Teste de Parametro 01-02'
cPAram2 := '#reserva#'
cPAram3 := '1+2+3'
cUrl += '?Par01=' + escape(cPAram1) + '&PAr02=' + escape(cPAram2) + '&Par03=' + escape(cPAram3)
// O conteudo de cUrl deverá ser "http://localhost/webinfo.apw?Par01=Teste%20de%20Parametro%2001-02&PAr02=%23reserva%23&Par03=1%2B2%2B3" ,
próprio para a monyahem de um link .
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção ?ETTOBP*O3ST*5H?
e:emplo abai:o , e:ecutado em uma thread iniciada a partir de um M& %E&E;, recupera algumas configurações atuais em uso para este M&.
cJobType := GetJobProfString('type','(empty)' )
cInstances := GetJobProfString('Instances','(empty)' )
cInacTime := GetJobProfString(InactiveTimeout','(default)' )
cExpTime := GetJobProfString('ExpirationTime','(default)' )
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção ?ETPA*<A4,E
Lo e:emplo abai:o , s"o montados dois arraAs multi-dimensionais , com 4 dimensões , e s"o reali$adas buscas nos mesmos e:plorando todas as possibilidades de uso da funç"o DetParNalue*.
Local aTeste1 := {}
Local aTeste2 := {}
Aadd(aTeste1,{"Alias","TMP1"})
Aadd(aTeste1,{"Relacao","2x3"})
Aadd(aTeste2,{"Alias","TMP2"})
Aadd(aTeste2,{"Info","---Informação adicional---"})
// Busca apenas no array ateste1
cAlias := GetParValue("ALIAS",aTeste1)
cRelacao := GetParValue("RELACAO",aTeste1)
cInfo := GetParValue("INFO",aTeste1)
DEFAULT cAlias := "(nao encontrado)"
DEFAULT cRelacao := "(nao encontrado)"
DEFAULT cInfo := "(nao encontrado)"
conout(cAlias) // TMP1
conout(cRelacao) // 2x3
conout(cInfo) // (nao encontrado)
// Busca apenas no array ateste2
cAlias := GetParValue("ALIAS",aTeste2)
cRelacao := GetParValue("RELACAO",aTeste2)
cInfo := GetParValue("INFO",aTeste2)
DEFAULT cAlias := "(nao encontrado)"
DEFAULT cRelacao := "(nao encontrado)"
DEFAULT cInfo := "(nao encontrado)"
conout(cAlias) // TMP2
conout(cRelacao) // (nao encontrado)
conout(cInfo) // ---Informação Adicional---
// Busca em ambos os Arrays
// Primeiro no aTeste1 e depois no aTeste2
cAlias := GetParValue("ALIAS",aTeste1,aTeste2)
cRelacao := GetParValue("RELACAO",aTeste1,aTeste2)
cInfo := GetParValue("INFO",aTeste1,aTeste2)
conout(cAlias) // TMP1
conout(cRelacao) // 2x3
conout(cInfo) // ---Informação Adicional---
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção HE:ST*+,6P
/trav#s do e:emplo abai:o, geramos a string com o +H,P de um ar'uivo <6,3, salvo na pasta %E& a partir do @ootPath do Environment. +ump do ar'uivo será mostrado no 7onsole do servidor e no %eb
&roBser 'ue solicitou a funç"o HO+ump6est.apB .

#include "protheus.ch"
#include "apwebex.ch"
User Function DumpTest()
Local cHtml := ''
Local cTXTFile := ''
Local cDump := ''
UU
WEB EXTENDED INIT cHtml
// Le o arquivo
cTTXFile := memoread('\Web\Default.htm')
// Gera a string com o Dump do arquivo
cDump := HExStrDump(cTTXFile)
// Mostra o Dump no console
conout(cDump)
// Gera HTML para a visualização do DUMP
cHtml := VarInfo('DUMP',Htmlnotags(cDump),,.t.,.f.)
WEB EXTENDED END
Return cHtml
/*
Exemplo do Texto mostrado no Console
HexSTRDump ( String 237 / Start 1 / Length 237 )
-------------------------------------------------------------------------------
3C 48 54 4D 4C 3E 3C 48 45 41 44 3E 0D 0A 3C 4D | <HTML><HEAD>__<M
45 54 41 20 48 54 54 50 2D 45 51 55 49 56 3D 22 | ETA HTTP-EQUIV="
43 6F 6E 74 65 6E 74 2D 54 79 70 65 22 20 63 6F | Content-Type" co
6E 74 65 6E 74 3D 22 74 65 78 74 2F 68 74 6D 6C | ntent="text/html
22 0D 0A 3C 4D 45 54 41 20 48 54 54 50 2D 45 51 | "__<META HTTP-EQ
55 49 56 3D 22 70 72 61 67 6D 61 22 20 63 6F 6E | UIV="pragma" con
74 65 6E 74 3D 22 6E 6F 2D 63 61 63 68 65 22 3E | tent="no-cache">
0D 0A 3C 4D 45 54 41 20 48 54 54 50 2D 45 51 55 | __<META HTTP-EQU
49 56 3D 22 45 78 70 69 72 65 73 22 20 63 6F 6E | IV="Expires" con
74 65 6E 74 3D 22 2D 31 22 3E 0D 0A 3C 4D 45 54 | tent="-1">__<MET
41 20 48 54 54 50 2D 45 51 55 49 56 3D 22 52 65 | A HTTP-EQUIV="Re
66 72 65 73 68 22 20 63 6F 6E 74 65 6E 74 3D 22 | fresh" content="
30 3B 20 75 72 6C 3D 2F 77 5F 77 45 78 30 30 30 | 0; url=/w_wEx000
2E 61 70 77 22 3E 3C 2F 48 45 41 44 3E 0D 0A 3C | .apw"></HEAD>__<
2F 48 45 41 44 3E 3C 2F 48 54 4D 4C 3E | /HEAD></HTML>
-------------------------------------------------------------------------------
*/
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção HT64HOTA?S
Lo e:emplo abai:o , a funç"o <tmlLo6ags # utili$ada para permitir a utili$aç"o de caracteres especiais no conteJdo de um input para um formulário <tml.
Local cHtml := ""
Local cInput := ""
// Conteudo do campo com tags HTML intepretáveis
cInput := ''
// Ao montar o Input , aplicar a HtmlNoTags() ao conteudo do mesmo.
cHtml += '
'+HtmlNoTags(cIn
'
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção *E+5*PA?E
Los e:emplos abai:o, a funç"o redirpage # utili$ada para gerar o script de redirecionamento em duas situações espec)ficas.
/*
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
...
/* Ao chamar uma tela de download , mostrar uma mensahem e iniciar um download automaticamente */
...
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')
...
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção *E+5*PA?E
Los e:emplos abai:o, a funç"o redirpage # utili$ada para gerar o script de redirecionamento em duas situações espec)ficas.
/*
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
...
/* Ao chamar uma tela de download , mostrar uma mensahem e iniciar um download automaticamente */
...
cHtml += '
U4
...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')
...
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção *ETSF4A)E
Lo e:emplo abai:o , utili$amos a funç"o @et0'l/ce para montar uma 'uerA 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.
56PO*TAHTE A La e:press"o da 2uerA , o campo da tabela deve ser passado pela funç"o 3%E@ do &/nco , pois a funç"o rets'lace monta a string para busca com letras minJsculas.
cFind := 'acentuação'
cQuery := "SELECT * FROM " + RetSqlTab('ZZ1')
cQuery += "WHERE LOWER(ZZ1_TITULO) LIKE '%"+RetSqlAce(cFind)+"%' "
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção <A4TOSF4
cQuery := "SELECT * FROM FA2010 "
cQuery += "WHERE FA2_FILIAL = " + ValToSql('02')
cQuery += "AND FA2_DTINC <= " + ValToSql(date())
O exemplo acima , caso escrito de forma a realizar as conversões específicas para cada tipo de conteúdo seria o equivalemte ao código abaixo :
cQuery := "SELECT * FROM FA2010 "
cQuery += "WHERE FA2_FILIAL = '02' "
cQuery += "AND FA2_DTINC <= " + DTOS( date() )
5"#ra1Estrutura APWEBE: 1 E!emplo da #u"ção <A*5H3O
Lo e:emplo abai:o , # gerada uma string <6,3 com as informações do retorno da chamada de duas funções básicas da 3inguagem /dvpl.
User Function InfoTeste()
Local cHtml := ''
cHtml += VarInfo(`Date',date())
cHtml += VarInfo(`Time`,time())
Return cHtml
/* Deve ser gerado um echo no Console do Servidor parecido com este abaixo
Date -> D ( 10) [08/12/2003]
Time -> C ( 8) [20:17:48]
*/
5"#ra1Estrutura APWEBE: 1 E!emplo das #u"ç$es de ace"tuação ApWe@E:
Lo e:emplo abai:o, vemos a diferença de comportamento entre as funções básicas da 3inguagem /dvpl Hpper*. e 3oBer*. , e a funç"o de Infra-estrutura 7apital*., em relaç"o às funções da Infra-estrutura
/P%E&E; Hpper/ce*. , 3oBer/ce*. e 7/pital/ce*. , 'uando utili$amos caracteres acentuados.
cRetorno := ""
cFrase := "não há EXPLICAÇÕES considerando excessões PARA O inexplicável."
cRetorno += "Original .......... " + cFrase + CRLF
cRetorno += "Upper() ........... " + upper(cFrase) + CRLF
cRetorno += "Lower() ........... " + lower(cFrase) + CRLF
cRetorno += "Capital() ......... " + capital(cFrase) + CRLF
cRetorno += "UPPERACE() ........ " + UPPERACE(cFrase) + CRLF
cRetorno += "LOWERACE() ........ " + LOWERACE(cFrase) + CRLF
cRetorno += "CAPITALACE() ...... " + CAPITALACE(cFrase) + CRLF
/*
Neste ponto , a variável cRetorno deverá conter :
Original .......... não há EXPLICAÇÕES considerando excessões PARA O inexplicável.
Upper() ........... NãO Há EXPLICAÇÕES CONSIDERANDO EXCESSõES PARA O INEXPLICáVEL.
Lower() ........... não há explicaÇÕes considerando excessões para o inexplicável.
Capital() ......... Não Há ExplicaÇÕes Considerando Excessões Para O Inexplicável.
UPPERACE() ........ NÃO HÁ EXPLICAÇÕES CONSIDERANDO EXCESSÕES PARA O INEXPLICÁVEL.
LOWERACE() ........ não há explicações considerando excessões para o inexplicável.
CAPITALACE() ...... Não Há Explicações Considerando Excessões Para O Inexplicável.
*/
5"#ra1Estrutura APWEBE: 1 E!emplos das #u"ç$es HTO) e )TOH
Lo e:emplo abai:o , utili$amos as funções cton e ntoc para reali$ar conversões de nJmeros em base decimal para outras bases num#ricas e vice-versa.
nNum1 := CTON('01101001',2) // Converte binário para decimal
nNum2 := CTON('00DA25FE',16) // Converte Hexadecimal para decimal
nNum1++ // Soma 1 ao numero em nNum1
nNum2++ // Soma 1 ao numero em nNum2
cNum1 := NtoC(nNum1,2,8) // Converte para binário novamente
cNum2 := NtoC(nNum2,16,8) // Converte para Hexa novamente
/* -------------------------------------------------------------------------
Ao final do programa , cNum1 será "01101010" e cNum2 será "00DA25FF"
------------------------------------------------------------------------- */
APWE:A++E**
0inta:e
/P%E;/++E@@ * b c6itulo c , b cInfo c . --T .6.
Par(metros
/rgumento 6ipo +escriç"o
c6itulo 7aracter
c6itulo corresponde a um t)tulo identificador da informaç"o. +eve ter no má:imo 45 caracteres. s caracteres acima da vig#sima posiç"o ser"o
ignorados.
cInfo 7aracter cInfo corresponde à Informaç"o a ser acrescentada ao E@@@.3D em caso de erro.
@etorno
6ipo +escriç"o
3ógico Esta funç"o sempre retorna .6.
+escriç"o
/trav#s da funç"o /p%E:/ddErr*., podemos acrescentar uma string de informações adicionais em um buffer em memória, descarregado na geraç"o do E@@@.3D no caso de uma ocorrIncia de erro fatal na
=o6in: thead atual.
7aso a funç"o se!a chamada sem nenhum par(metro, a Jltima ocorrIncia acrescentada pela funç"o # eliminada da pilha interna de informações.
UX
AT#9:;& E Esta funç"o deve ser apenas utili$ada em casos de necessidade de obtenç"o de informações espec)ficas acerca de uma ocorrIncia de erro n"o reprodu$ida em ambiente de testes e=ou n"o depurável, pois
seu uso desnecessário pre!udica a performance da aplicaç"o final.

)AP5TA4A)E
0inta:e
7/PI6/3/7E * R c0tring T . --T c0tr7apital
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter 0tring a ser convertida.
@etorno
6ipo +escriç"o
7aracter 0tring resultante convertida para munJsculo , com as primeiras letras das palavras significantes em maiJsculo.
+escriç"o
0emelhante à funç"o de Infra-estrutura 7apital*. , por#m converte tamb#m caracteres acentuados.
/ funç"o 7apital/ce*. converte todos os caracteres de uma 0tring para KminJsculoK , e a primeira letra das palavras significantes para maiJsculo, semelhante à funç"o 7apital*. , por#m considera e converte tamb#m
caracteres acentuados em E, e=ou /L0I.
)TOH
0inta:e
76L * R c0tring T , R n&ase T . --T nLumero
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter c0tring corresponde à representaç"o de um nJmero em outra base num#rica, compreendida entre 4 e X[.
n&ase Lum#rico n&ase corresponde à base num#rica utili$ada pelo numero representado em c0tring.
@etorno
6ipo +escriç"o
Lum#rico LJmero recebido como par(metro em notaç"o decimal * &ase U5 .
+escriç"o
7onverte um nJmero representado em 0tring , de base 4 a X[ , para um nJmero em base decimal *U5..
&.servaç'o Importante <
0"o considerados caracteres válidos para compor um nJmero de base X[ os U5 algarismos num#ricos de 5 a \ e os 4[ caracteres alfab#ticos maiUsculos compreendidos entre / e k. 2uais'uer caractetes presentes na
0tring de par(metro fora desta fai:a de dados e=ou fora da base * por e:emplo , uma convers"o de string base 4 - binário - da string K5U55U545K . retornará -U * menos um . .
ES)APE
0inta:e
E07/PE * R c0tring T . --T cEscaped
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter c0tring # uma se'uIncia de caracteres a ser processada.
@etorno
6ipo +escriç"o
7aracter cEscaped corresponde à string original , com os caracteres reservados utili$ando a notaç"o S<< .
+escriç"o
/ funç"o Escape*. deve ser utili$ada para reali$ar conversões de caracteres especiais e reservados 'uando da necessidade de passagem de par(metros via H@3 .
/ sinta:e de uma re'uisiç"o via H@3 para a passagem de par(metros #E
.lin6/Vpaam%"onteudoWpaamX%"onteudoXW999
2uando passamos par(metros via url , devemos tomar o cuidado de n"o utili$ar caracteres reservados e especiais nos nomes e conteJdos de par(metros. Para reali$ar estas conversões, utili$amos a funç"o Escape*.
E:E)5HPA?E
0inta:e
E;E7ILP/DE * R c/P<Page T . --T c<6,3Page
Par(metros
/rgumento 6ipo +escriç"o
c/P<Page 7aracter 7orresponde ào nome do /P< 'ue deve ser e:ecutado, sem a e:tens"o.
@etorno
6ipo +escriç"o
7aracter c<tmlPage corresponde à string <6,3 gerada pela página /P< = /<H.
+escriç"o
/trav#s da funç"o E:ecInPage*., e:ecutamos uma página /P< passada como par(metro. / funç"o deverá retornar a 0tring <6,3 correspondente à página processada.
Por#m a funç"o E:ecInPage*. reali$a tratamentos adicionais padr"o relacionaodo ào comportamento dos Pro!etos %E& referentes à customi$ações, da segunte maneira E
U. Primeiro # verificado se e:iste uma página /<H compilada com o nome c/P<Page. 7aso e:ista , a mesma será e:ecutada pela e:ecinpage.
4. 7aso n"o e:ista /<H com este nome , # procurado pelo /P<. 7aso o /P< e:ista , o mesmo será e:ecutado pela E:ecInPage.
X. 7aso n"o e:istam no @P atual o /P< nem o /<H com o nome especificado no par(metro c/P<>ile, o processamento # abortado com a ocorrIncia de erro =AP#%#88>???@A APH pa!e
=BcAPHPa!eCA not found in .8P&
8. /ntes de e:ecutar o /P< ou /<H identificado nos passos anteriores, # verificado se e:iste um ponto de entrada * Hser >unction . compilado com o mesmo nome do /P<. 7aso e:ista , o ponto de
entrada # e:ecutado . Ele deverá retornar uma 0tring <6,3. 0e for retornada alguma string , a funç"o retorna a tring retornada e n"o processa o /P< = /<H. &.servaç'o < A 4un78o ,*e"FnPa:e n8o i0 e*e"uta este
tatamento da Ose &un"tion "om o nome de "AP1Pa:e "aso a 4un78o ,*e"FnPa:e./ este<a sendo e*e"utada atav3s de uma OS,C &O(E'F-( .
&.servaç'o Importante , #nvio parcial de HT(L )o $ro+ser.
/ funç"o E:ecInpage*., !untamente com o /P< compilado, ao serem processados ir"o tentar enviar o conteJdo <6,3 para o &roBser solicitante durante o processamento, de modo 'ue a funç"o normalmente irá
retornar uma 0tring va$ia.
7aso se!a necessária a e:ecuç"o de uma página /P< ou /<H e o n"o-envio da mesma para o &roBse] por e:emplo para a geraç"o de um código <6,3 a ser enviado via e-mail] revemos utili$ar a funç"o
<ttp0etPart*., reali$ando uma chamada da mesma antes da E:ecInPage*. , passando o par(metro .>. para desabilitar temporariamente o envio de <6,3 simult(neo ao &roBser, e após a e:ecuç"o da E:ecInPage*.,
devemos re-habilitar o envio simult(neo atrav#s da chamada da funç"o <ttp0etPart*. com o par(metro .6.
E:5STPA?E
0inta:e
E;I06P/DE * R c/ph>ile T . --T l>ound
Par(metros
/rgumento 6ipo +escriç"o
c/ph>ile 7aracter Lome do ar'uivo /P<, sem e:tens"o e sem path , a ser verificado.
@etorno
6ipo +escriç"o
7aracter @etorna um valor booleano indicando se o ar'uivo /P< especificado está compilado no @P do ambiente atual.
+escriç"o
Htili$amos a funç"o E:istPage*. para identificarmos no ambiente atual se um determinado ar'uivo ./P< encontra-se compilado atualmente no @P em uso.
E:emplo E
If ExistPage('teste')
conout('teste.aph compilado neste RPO')
Else
conout('teste.aph NAO compilado neste RPO')
Endif
E:5ST,S*PA?E
U8
0inta:e
E;I06H0@P/DE * R c/hu>ile T . --T lE:ist
Par(metros
/rgumento 6ipo +escriç"o
c/hu>ile 7aracter Lome do ar'uivo /<H, sem e:tens"o e sem path , a ser verificado
@etorno
6ipo +escriç"o
3ógico @etorna um valor booleano indicando se o ar'uivo /P< especificado está compilado no @P do ambiente atual.
+escriç"o
Htili$amos a funç"o E:istH0@Page*. para identificarmos no ambiente atual se um determinado ar'uivo ./<H encontra-se compilado atualmente no @P em uso.
E:emplo E
If ExistUSRPage('teste')
conout('teste.ahu compilado neste RPO')
Else
conout('teste.ahu NAO compilado neste RPO')
Endif
?ETTOBP*O3ST*5H?
@evis"oE U5=U4=455X
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
0inta:e
DE6M&P@>06@ILD * R ceeA T , R c+efault T . --T ceeANalue
Par(metros
/rgumento 6ipo +escriç"o
ceeA 7aracter ceeA corresponde à chave da seç"o de configuraç"o da %or9ing 6hread atual a ser retornada.
c+efault 7aracter Nalor default *string. a ser retornado pela funç"o caso a chave especificada n"o seh!a encontrada no .ILI
@etorno
6ipo +escriç"o
7aracter
7onteudo da 7have solicitada . 7aso a chave n"o se!a encontrada , # retornado o conteudo de c+efault . 7aso esta funç"o n"o se!a e:ecutada a partir de uma %or9ing 6hread , ela
retornará uma string em branco *gg.
+escriç"o
/trav#s desta funç"o , podemos recuperar as configurações do Mob da %or9ing 6hread atual.
?ETWE:<E*S5OH
0inta:e
DE6%E;NE@0IL * . --T c&uildId
@etorno
6ipo +escriç"o
7aracter 7orresponde à 0tring Identificadora da vers"o , no formato R3I&T N.//,,++<<mm . Nide 6abela /
+escriç"o
Esta funç"o n"o re'uer argumentos , e retorna o Identificador do build = vers"o de @elease das funções de Infra-Estrutura /P%E&E;.
O@servação A A data i"#ormada pela versão "ão correspo"de 8 ultima compilação do *PO de um determi"ado ProOeto WEB/ mas sim 8 data de release da 45B de 5"#ra1Estrutura APWEBE:.
Tabela A
Sim@olo +escrição
// /no de geraç"o da 3ib
,, ,Is da geraç"o da 3ib
++ +ia da geraç"o da 3ib
<< <orário da geraç"o da 3ib
mm ,inutos do <orário de Deraç"o da 3ib
*<66P. Indica 'ue a vers"o foi compilada com a configurac"o de envio progressivo de <6,3 simult(neo para o &roBse . Esta opç"o # imprescind)vel para pro!etos 'ue se utili$am desta 3I&.
Por e:emplo E
/P%E&E; Nersion X.5XU454U\55 *<66P.
HE:ST*+,6P
0inta:e
<E;06@+H,P * R c0tring T , b n0tart c , b n3ength c . --T c<E:+ump
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter 0tring a ser lida para a geraç"o do +ump
n0tart Lum#rico
7orresponde à posiç"o inicial de c0tring a ser considerada para a geraç"o do +ump, a partir da posiç"o U. 7aso este par(metro n"o se!a informado , o
+efault # a posiç"o U da string.
n3ength Lum#rico
n3ength corresponde ào tamanho a ser considerado para a geraç"o do +H,P a partir da posiç"o inicial recebida em n0tart. 7aso este par(metro n"o
se!a informado, # considerado o tamanho at# o final da 0tring.
@etorno
6ipo +escriç"o
7aracter
retorno da funç"o corresponde à uma string /dvpl , formatadas em U[ bAtes em he:adecimal por linha , mais o separador pipe *l. , mais os U[ caracteres em /nsi. s caracteres de
controle * codigo ascii menor 'ue X4 . s"o convertidos para visuali$aç"o para o caractere underline *O.
+escriç"o
/trav#s da funç"o 1e*StDump./, podemos gerar uma string em /dvpl em formato de +ump <e:adecimal a partir da string informada como par(metro, a partir de uma determinada posiç"o da string, considerando um
nJmero de bAtes informado.
7aso os par(metros nPosIni e n6am0tring n"o se!am informados, o dump gerado corresponde a string recebida como par(metro em sua totalidade.
&.servaç'o <
L"o devemos pasar para a funç"o <e:0tr+ump uma string maior 'ue 485 eb , pois a geraç"o da 0tring de dump # reali$ada em memória, sendo a string final gerada em m#dia 8,4 ve$es maior 'ue a string passada
como par(metro. 7aso a string passada como par(metro se!a maior 'ue 485 eb , a e:ecuç"o será abortada com a ocorrIncia de erro fatal gstin: siQe ove4lo=g
HT64HOTA?S
0inta:e
<6,3L6/D0 * R c0tr<tml T . --T c0trLo6ags
Par(metros
/rgumento 6ipo +escriç"o
c0tr<tml 7aracter c0tr<tml corresponde a uma 0tring 'ue n"o pode conter caracteres <tml interpretáveis.
@etorno
6ipo +escriç"o
7aracter 0tring original com os caracteres interpretáveis <tml R T a g convertidos para caracteres n"o-interpretáveis.
+escriç"o
/ >unç"o <6,3L6/D0 converte as 6ags interpretáveis de uma 0tring <6,3 para 6/D0 n"o interpretáveis. Este recurso # normalmente utili$ado 'uando precisamos montar um input <tml com um conteudo 'ue
nao pode ser interpretado pelo broBser como uma 6ag . Esta funç"o apenas converte os caracteres R * menor 'ue . , T * maior 'ue . , a * e comercial . e F * aspas duplas . .
*ecome"da1se #orteme"te -ue/ "a mo"tagem do value de um i"put html / o co"teUdo do mesmo seOa colocado e"tre aspas duplas/ pois caso o co"teUdo do value i"icial do campo co"te"ha aspas simples
L "ão co"vertidas pela #u"ção HtmlHoTagsM / isto poderS ocasio"ar perda de dados e erro de si"ta!e "o #ormulSrio Html.
HTTP5SWEBE:
@evis"oE U4=U4=455X
U1
0inta:e
<66PI0%E&E; * . --T lIs/p%E&E;
@etorno
6ipo +escriç"o
3ógico / funç"o retornará .6. caso o ambiente de e:ecuç"o atual se!a uma %or9ing 6hread %E&E; , iniciali$ada pela funç"o de infra-estrutura 06/@6%E&E;.
+escriç"o
/trav#s da funç"o <ttpIs%ebE:*. # poss)vel identificarmos se o programa atual está sendo e:ecutado atrav#s de uma %or9ing 6hread iniciali$ada utili$ando-se as funções de Infra-Estrutura /P%E&E;
5SE6A54
0inta:e
I0E,/I3 * R cE,ail T . --T lEmail9
Par(metros
/rgumento 6ipo +escriç"o
cE,ail 7aracter cEmail corresponde a string a ser anali$ada , contendo um e apenas um endereço de e-mail.
@etorno
6ipo +escriç"o
7aracter @etorna .6. caso a sring recebida como par(metro atenda às definições de nomenclatura válidos para um endereço de e-mail.
+escriç"o
Htili$ada para validar e-mails em /dvpl , a funç"o I0E,/I3 recebe como par(metro uma string contendo um e-mail , retornando .6. caso a string este!a em um formáto válido respeitando a regra para nomenclatura de
endereços de e-mail.
*egra A Hm e-mail # considerado válido caso se!a iniciado por um caracter , apenas contenha caracteres asc de a a $ e 5 a \ , e os caracteres m *arroba. , . *ponto. , - * h)fen. ou O *underline. ] e deve conter uma e
apenas uma arroba , e no minimo um ponto apos a arroba, intercalado por um caracter.
4OWE*A)E
0inta:e
3%E@/7E * R c0tring T . --T c0tr3oBer
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter c0tring # a se'uIncia de caracteres a ser convertida para letras minJsculas.
@etorno
6ipo +escriç"o
7aracter 0tring original em letras minJsculas.
+escriç"o
/ >unç"o 3%E@/7E converte todos os caracteres de uma 0tring para FminusculoG , semelhante à funç"o 3%E@*. , por#m considera e converte tamb#m caracteres acentuados em /L0I.
HTO)
0inta:e
L67 * R nLumero T , R n&ase T , R n6am0tr T . --T c0tring
Par(metros
/rgumento 6ipo +escriç"o
nLumero Lum#rico nLumero # o valor num#rico , em base devimal , a ser convertido.
n&ase Lum#rico n&ase corresponde à base binária a ser utili$ada para converter nLumero.
n6am0tr Lum#rico n6am0tr corresponde ao tamanho da string representando o numero na base dese!ada .
@etorno
6ipo +escriç"o
7aracter c0tring corresponde ao numero convertido para a base num#rica especificada como par(metro.
+escriç"o
/ >unç"o L67 converte um nJmero em notaç"o decimal para um nJmero representado por 0tring utili$ando uma base num#rica entre 4 e X[ , preenchendo-o com F5G *$eros. à es'uerda do tamanho especificado.
O@servação A Par(metro n&ase deve ser especificado com um nJmero entre 4 e X[ . 7aso se!a passado como par(metro um nJmero base fora desta fai:a, o processamento # abortado com a ocorrIncia de erro
>AP+,D,CCA00XX? F(VALFD ('-E BAS, >D? , onde R;T foi a base passada como argumento.
*E+5*PA?E
0inta:e
@E+I@P/DE * R cHrl T , b c6arget c , b n6ime c . --T c0cript
Par(metros
/rgumento 6ipo +escriç"o
cHrl 7aracter 3in9 para onde o script deve apontar o redirecionamento
c6arget 7aracter +estino do redirecionamento. 7aso n"o especificado , o default # Oself.
n6ime Lum#rico 6empo *em segundos. de delaA antes do redirecionamento ser e:ecutado.
@etorno
6ipo +escriç"o
7aracter 0cript <tml = Mava0cript 'ue , ao ser e:ecutado no &roBser *client. , chama a página=ob!eto chamado no 3in9.
+escriç"o
/ funç"o @edirPage # utili$ada 'uando dese!amos devolver ao &roBser um script 'ue , ao ser e:ecutado , redirecionará o &roBser à abertura de um lin9 passado como par(metro.
*ETSF4A)E
0inta:e
@E6023/7E * R c0tr>ind T . --T c0tr2uerA
Par(metros
/rgumento 6ipo +escriç"o
c0tr>ind 7aracter c0tr>ind corresponde à se'uIncia de caracteres a ser procurada , podendo conter caracteres maiJsculos e minJsculos , com ou sem acentuaç"o.
@etorno
6ipo +escriç"o
7aracter c0tr2uerA corresponde à string de busca a ser utili$ada na 'uerA, utili$ando caracteres em minJsculo.
+escriç"o
/ funç"o @et0'l/ce # utili$ada para au:iliar de montagem de 'uerAs de busca de caracteres acentuados em bases de dados . / funç"o automaticamente trata a string original , removendo os acentos , convertendo todos
os caracteres para minJsculas , e trocando todas as vogais e cedilhas da string original por uma se'uIncia de caracteres acentuados em munJscilas para busca posicional .
*ETSF4)OH+
0inta:e
@E60237L+ * R c/liases T . --T c0'l%here
Par(metros
/rgumento 6ipo +escriç"o
c/liases 7aracter 3ista contendo um ou mais aliases , separados por v)rgula , a serem considerados para a montagem da e:press"o de validaç"o.
@etorno
6ipo +escriç"o
7aracter 7orresponde à e:press"o 023 para filtrar os dados atrav#s da cláusula %<E@E
+escriç"o
Htili$amos a funç"o @et0'l7ond*. como au:iliar na montagem de 'uerAs para busca de dados em tabelas em conformidade com o padr"o adotado pelo E@P ,icrosiga e o ,a9ira <Apersite , utili$ando aliases de X
caracteres.
U[
/ funç"o retorna , a partir dos aliases passados como par(metro , as e:pressões de filtro de dados para considerar a filial atual * :>ilial . de acordo com o modo do ar'uivo * ;4O,+ . , e para sempre desconsiderar
registros deletados.
bservações E
• Esta funç"o foi mantida apenas por compati.ilidadeD pois a ordem de comparaç'o de campos na cl5usula H#8# de uma *uerE deve procurar se!uir a ordem dos campos dos inde6adores do
.anco para efeitos de performance . Para ganharmos performance nas 2uerAs , devemos ao inv#s de utili$ar a funç"o @et0'l7ond*. , utili$ar como primeira claJsula %<E@E o retorno da funç"o @et0'l>il*.
* comparaç"o dos campos O>I3I/3 , os primeiros do*s. )ndice*s. do E@P . , 'ue retorna apenas as comparações de >ilial , e por Jltimo a funç"o @et0'l+el, 'ue retorna o script para verificaç"o dos campos deletados
* 'ue # o Jltimo campo das chaves de )ndice do E@P , utili$ando 6op7onnect ..
• +evemos tamb#m atentar ao fato 'ue a funç"o @et0'l7ond*. retorna os campos para a comparaç"o utili$ando o prefi:o da e:press"o 023 com o /lias redu$ido *X letras. das tabelas informadas, de
modo 'ue estes alias devem ser especificados na cláusula >@, , na abertura da 2uerA, 'uando utili$amos a funç"o @et0'lLame para retornar o nome f)sico das 6abelas no &anco de +ados. / funç"o @'t0'l6ab*. !á
retorna os nomes f)sicos das tabelas !untamente com os alias para este fim .
*ETSF4+E4
0inta:e
@E6023+E3 * R c/liases T . --T c0'l%here
Par(metros
/rgumento 6ipo +escriç"o
c/liases 7aracter 3ista contendo um ou mais aliases , separados por v)rgula , a serem considerados para a montagem da e:press"o de validaç"o.
@etorno
6ipo +escriç"o
7aracter 7orresponde à e:press"o 023 para filtrar os dados atrav#s da cláusula %<E@E
+escriç"o
Htili$amos a funç"o @et0'l+el*. como au:iliar na montagem de 'uerAs para busca de dados em tabelas em conformidade com o padr"o adotado pelo E@P ,icrosiga, utili$ando aliases de X caracteres.
/ funç"o retorna , a partir dos aliases passados como par(metro , as e:pressões de filtro de dados para considerar o campo +OEO3OEO6O da*s. tabela*s. passada*s. como par(metro.
&.servações <
• / ordem de comparaç"o de campos na cláusula %<E@E de uma 'uerA deve procurar seguir a ordem dos campos dos inde:adores do banco para efeitos de performance . Para ganharmos performance
nas 2uerAs , devemos utili$ar a funç"o @et0'l+El*. na montagem das ultimas consistIncias da cláusula %<E@E de uma 2uerA.
• +evemos tamb#m atentar ao fato 'ue a funç"o @et0'l+el*. retorna os campos para a comparaç"o utili$ando o prefi:o da e:press"o 023 com o /lias redu$ido *X letras. das tabelas informadas, de modo
'ue estes alias devem ser especificados na cláusula >@, , na abertura da 2uerA, 'uando utili$amos a funç"o @et0'lLame para retornar o nome f)sico das 6abelas no &anco de +ados. / funç"o @'t0'l6ab*. !á retorna
os nomes f)sicos das tabelas !untamente com os alias para este fim .
*ETSF4354
0inta:e
@E6023>I3 * R c/liases T , b c7omp>il c . --T c02l%here
Par(metros
/rgumento 6ipo +escriç"o
c/liases 7aracter 3ista contendo um ou mais aliases , separados por v)rgula , a serem considerados para a montagem da e:press"o de validaç"o.
c7omp>il 7aracter
/trav#s de c7omp>il # poss)vel especificar uma >ilial >I;/ a ser comparada com os campos >I3I/3 do*s. alias*es. passados no par(metro c/liases.
7aso n"o informado, os campos O>I3I/3 da*s. tabela*s. passadas como par(metro em c/liases ser"o comparados com o retorno da funç"o :>ilial*. de
cada alias, respectivamente.
@etorno
6ipo +escriç"o
7aracter 7orresponde à e:press"o 023 para filtrar os dados atrav#s da cláusula %<E@E
+escriç"o
Htili$amos a funç"o @et0'l>il*. como au:iliar na montagem de 'uerAs para busca de dados em tabelas em conformidade com o padr"o adotado pelo E@P ,icrosiga, utili$ando aliases de X caracteres.
/ funç"o retorna , a partir dos aliases passados como par(metro , as e:pressões de filtro de dados para considerar o campo filial atual * :>ilial . de acordo com o modo de abertura do ar'uivo no E@P * ;4O,+ . .
O@servação A
• +evemos atentar ao fato 'ue a funç"o @et0'l>il*. retorna os campos para a comparaç"o utili$ando o prefi:o da e:press"o 023 com o /lias redu$ido *X letras. das tabelas informadas, de modo 'ue estes
alias devem ser especificados na cláusula >@, , na abertura da 2uerA, 'uando utili$amos a funç"o @et0'lLame para retornar o nome f)sico das 6abelas no &anco de +ados. / funç"o @'t0'l6ab*. !á retorna os
nomes f)sicos das tabelas !untamente com os alias para este fim .
*ETSF4TAB
0inta:e
@E60236/& * R c/lias3ist T . --T c0tr2uerA
Par(metros
/rgumento 6ipo +escriç"o
c/lias3ist 7aracter 0tring contendo um ou mais alias , separados por virgula , a terem seus nomes f)sicos determinados.
@etorno
6ipo +escriç"o
7aracter 0tring contendo nomes fisicos e alias identificadores dos aliases recebidos como par(metro.
+escriç"o
Htili$amos a funç"o @et0'l6ab*. como au:iliar na montagem de 'uerAKs 'uando trabalhamos com o padr"o de 6abelas E@P ,icrosiga, 'ue utili$am nomenclarura de alias com X 7aracteres.
/ funç"o recebe como par(metro um ou mais alias, separados por v)rgula, de tabelas 'ue dese!am ser utili$adas na 'uerA, e retorna os nomes fisicos das tabelas e seus respectivos alias para serem inseridos na 'uerA.
SEPA*A
0inta:e
0EP/@/ * R c0tring T , R c6o9en T , R lEmptA T . --T a6o9ens
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter 0tring com a se'uIncia de caracteres a ser gparseadag
c6o9en 7aracter c6o9en corresponde à string a ser utili$ada como separador para delimitar as informações.
lEmptA 7aracter lEmptA identifica se caso um intervalo va$io entre to9ens deve ser retornado como um elemento do arraA. 7aso n"o especificado , o +efault # .6.
@etorno
6ipo +escriç"o
7aracter /rraA de uma dimens"o contendo os elementos parseados pela rotina levando-se em conta o separador passado como parametro.
+escriç"o
/trav#s da func"o 0EP/@/*., pode-se parsear uma string de elementos a partir de um determinado separador , sendo retornado um /rraA com os elementos identificados na 0tring.
#6emplo <
aInfo := Separa('1,2,,4',',',.f.) // Resulta {'1','2','4'}
aInfo := Separa('1,2,,4',',',.t.) // Resulta {'1','2','','4'}
&.servaç'o <
Para reali$ar a análise de uma string, cu!o delimitador tenha apenas U bAte, e as ocorrIncias de dois separadores !untos se!am ignoradas na geraç"o do arraA, a funç"o separa*. utili$a a funç"o 0tr6o9/rr*., funç"o escrita
em 7 no Protheus 0erver, mais rápida para este processamento. /penas e:iste a necessidade de utili$armos a funç"o 0epara*. caso as ocorrIncias de dois separadores !untas devam ser consideradas no arraA de
resultado e=ou a string utili$ada como separador possua mais 'ue U bAte de tamanho.
,HES)APE
0inta:e
HLE07/PE * R c0tring T . --T cHnEscaped
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter c0tring # a string a ter os caracteres em formato escape convertidos.
UZ
@etorno
6ipo +escriç"o
7aracter cHnescaped corresponde à string recebida como par(mBetro , com os caracteres originalmente em notaç"o escape * S<< . convertidos para /07II
+escriç"o
@eali$a a operaç"o inversa à funç"o Escape*. , convertendo os caracteres especiais em notaç"o S<< em caracteres /07II.
O@servação A Ape"as serão co"vertidos os caracteres origi"alme"te tratados pela #u"ção EscapeLM
,PPE*A)E
0inta:e
HPPE@/7E * R c0tring T . --T c0trHpper
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter 0tring a ser convertida. Pode conter tamb#m acentos .
@etorno
6ipo +escriç"o
7aracter @etorna a string original com todas as letras mauisculas , inclusive as letras acentuadas.
+escriç"o
/ >unç"o HPPE@/7E converte todos os caracteres de uma 0tring para FmaifusculoG , semelhante à funç"o HPPE@*. , por#m considera e converte tamb#m caracteres acentuados em E, e /L0I
,PST*T*AH
0inta:e
HP06@6@/L * R c0tring T , R c0earch T , b c@eplace c , b n0tart c , b n7ount c . --T cLeB0tring
Par(metros
/rgumento 6ipo +escriç"o
c0tring 7aracter c0tring corresponde à se'uIncia de caracteres ou campo memo a ser pes'uisado.
c0earch 7aracter 7orresponde à se'uIncia de caracteres a ser procurada em c0tring
c@eplace 7aracter
c@eplace corresponde à se'uIncia de caracteres 'ue deve substituir a string c0earch. 7aso n"o se!a especificado, as ocorrIncias de c0earch em c0tring
ser"o substitu)das por uma string nula *gg.
n0tart Lum#rico
n0tart corresponde ào nJimero se'uencial da primeira ocorrIncia de c0Earch em c0tring a ser substitu)da por c@eplace. 0e este argumento for omitodo ,
o default # U * um . . 7aso se!a passado um numero menor 'ue U, a funç"o retornará uma string em branco *gg.
n7ount Lum#rico
n7ount corresponde ào nJmero má:imo de trocas 'ue deverá ser reali$ada pela funç"o . 7aso este argumento n"o se!a especificado , o default #
substituir todas as coorIncias encontradas.
@etorno
6ipo +escriç"o
7aracter / funç"o HP06@6@/L retorna uma nova string, com as ocorrIncias especificadas de c0earch trocadas para c@eplace, conforme par(metri$aç"o.
+escriç"o
0imilar à funç"o 0trtran*., por#m reali$a a busca da ocorrIncia da string considerando letras maiJsculas e minJsculas. / funç"o 0trtran*. # case-sensitive, e a funç"o Hp0trtran*. n"o.
<A4TOSF4
0inta:e
N/36023 * R :E:pressao T . --T c2rAE:pr
Par(metros
/rgumento 6ipo +escriç"o
:E:pressao *2ual'uer. Nalor /dvpl a ser convertido para utili$aç"o em 2uerA. Pode ser dos tipos g7g 7aracter , gLg Lum#rico e g+g +ata.
@etorno
6ipo +escriç"o
7aracter E:press"o a ser acrescentada na 2uerA.
+escriç"o
/ >unç"o N/36023*. # utili$ada como au:iliar na montagem de 2uerAKs , convertendo um conteJdo variável /dvpl para a string correspondente a ser acrescentada na 2uerA.
Podemos passar como par(metro uma E:press"o do tipo F7G 7aracter , F+G +ata ou FLG Lum#rica.
• / e:press"o 7atacter será colocada entre aspas simples, sendo removidas as aspas simples contidas na mesma , caso e:istam .
• Hma e:press"o num#rica será simplesmente convertida para caracter , com apro:imaç"o de 4 casas decimais.
• Hma e:press"o +ata será convertida para formato /L0I * ////,,++ . , entre aspas simples.
<A*5H3O
0inta:e
N/@IL> * R cId T , R :Nar T , b n,argem c , b l<tml c , b lEcho c . --T cNarInfo
Par(metros
/rgumento 6ipo +escriç"o
cId 7aracter cId corresponde a um nome atribu)do à variável para análise. Internamente , apenas # utili$ado para prefi:ar o retorno das informações da NarInfo.
:Nar *2ual'uer. Nariável de 'ual'uer tipo a ser e:aminada
n,argem Lum#rico 7orresponde à margem es'uerda inicial de espaços da 0tring de retorno , multiplicado por 1. +efault W 5
l<tml 3ógico Identifica se a 0tring de retorno será montada em formato <tml *.6. = +efault . ou /07II *.>..
lEcho 3ógico +efine se o Echo do retorno deve ser enviado ao console do Protheus 0erver , caso habilitado. * +efault W .6. .
@etorno
6ipo +escriç"o
7aracter 0tring contendo o g+umpg da análise da variável. 7aso l<tml se!a .6. , retorna 0tring em formato <6,3 . , sen"o retorna string /07II com 'uebras 7@3>.
+escriç"o
/ >unç"o N/@IL>*. gera um te:to /07II e=ou <tml , com possibilidade de E7< para o 7onsole do Protheus 0erver * caso habilitado . , com as informações sobre o conteJdo de uma variável de memória /dvpl ,
de 5ual5ue tipo 9
7ada tipo de variável possui um tratamento para convers"o em 0tring E
• EodeBlo"6 E C e:ibido apenas o tipo da mesma *&.
• Aay E 6odos os n)veis e elementos do mesmo s"o e:plorados recursivamente.
• -b<eto E Lo caso de um b!eto de ;,3 e=ou %eb 0ervices, s"o e:ploradas todas as suas propriedades recursivamente.
• *demais tipos. E 0"o convertidos para 0tring atrav#s da funç"o /ll6o7har
&.servaç'o < segundo par(metro * :Nar . deve ser uma variável /dvpl 'ue deve e:istir no escopo de variáveis. 7aso a variável n"o e:ista, o processamento # abortado com a ocorrIncia de erro gNariablçe does not
e:istg . Para saber se uma determinada variável e:iste no escopo da e:ecuç"o da funç"o atual, deve ser utili$ada a funç"o /dvpl 6iPE*., onde passamos a variável a ter seu tipo determinado como string * entre
aspas . .
WEB5H3O
0inta:e
%E&IL> * . --T c<tmlInfo
@etorno
6ipo +escriç"o
7aracter c<6,3Info corresponde à string <6,3 contendo as informações da re'uisiç"o <66P.
+escriç"o
UY
/ funç"o %ebInfo*. foi desenvolvida para ser chamada atrav#s de uma re'uisiç"o http , via lin9 .apl ou .apB , e ela identifica todos os par(metros recebidos via uma re'uisiç"o httpE Par(metros via get , post , o header
<66P, os 7oo9ies, o content-tApe , 3egth , 7ontent-disposition , 0oap@action *aç"o 0/P para re'uisições de %eb0Ervices . , e ther7ontent * caso o conteJdo postado n"o se!a um te:t=html .
Esta funç"o retorna uma página <tml com todas estas informações, e # utili$ada no desenvolvimento de pro!etos. 'uando temos a necessidade prática de recuperarmos todas as informalções provenientes de uma
re'uisiç"o <66P. /dicionalmente , a funç"o %ebInfo
Por e:emplo, com o Protheus configurado para atender re'uisições de lin9s .apl via <66P , chame a funç"o %ebInfo.apl atrav#s do lin9 E
httpE==localhost=Bebinfo.apl`paramUWtesteaparam4Woutroteste
0erá e:ibido no %eb &roBser uma tela semelhante à tela abai:o E
AAaEoo6ies K> ACCAY . 0/ >999?
AAaPostPams K> ACCAY . 0/ >999?
AAnPo"Fd K> ( . 10/ >11SZTGZG1R?
AAaPo"Pams K> ACCAY . 0/ >999?
AAhttpPa:e K> E . 0/ >?
AA1ttp1eade K> ACCAY . P/ >999?
AA1ttp1eade>1? K> E . XT/ >N,' /=ebin4o9apl 1''P/191?
AA1ttp1eade>X? K> E . 1BX/ >A""ept$ ima:e/:i4# ima:e/*K*bitmap# ima:e/<pe:# ima:e/p<pe:# appli"ation/*Ksho"6=aveK4lash# appli"ation/vnd9msKe*"el# appli"ation/vnd9msKpo=epoint# appli"ation/ms=od# [/[?
AA1ttp1eade>G? K> E . XX/ >A""eptKLan:ua:e$ ptKb?
AA1ttp1eade>R? K> E . G0/ >A""eptK,n"odin:$ :Qip# de4late?
AA1ttp1eade>T? K> E . S1/ >F4K2odi4iedKSin"e$ +ed# 10 De" X00G 1X$XR$XZ N2'J len:th%100G?
AA1ttp1eade>S? K> E . P1/ >OseKA:ent$ 2oQilla/R90 ."ompatibleJ 2SF, S90J +indo=s (' T91J 9(,' ELC 1909GB0T/?
AA1ttp1eade>B? K> E . 1G/ >1ost$ automan?
AA1ttp1eade>P? K> E . XX/ >Eonne"tion$ HeepKAlive?
1ttpCEt'ype./ K> E . 0/ >?
1ttpCEtLen./ K> ( . 10/ > K1?
1ttpCEtDisp./ K> E . 0/ >?
SoapCA"tion./ K> E . 0/ >?
1ttp-theEontent./ K> E . 0/ >?
7aso a mesma re'uisiç"o se!a reali$ada atrav#s de lin9 .apB , utili$ando-se a tecnologia %E&E; , deverá ser e:ibida uma tela semelhante à tela abai:o E
a1eades K> ACCAY . Z/ >999?
a1eades>1? K> E . XT/ >N,' /=ebin4o9ap= 1''P/191?
a1eades>X? K> E . 1BX/ >A""ept$ ima:e/:i4# ima:e/*K*bitmap# ima:e/<pe:# ima:e/p<pe:# appli"ation/*Ksho"6=aveK4lash# appli"ation/vnd9msKe*"el# appli"ation/vnd9msKpo=epoint# appli"ation/ms=od# [/[?
a1eades>G? K> E . XX/ >A""eptKLan:ua:e$ ptKb?
a1eades>R? K> E . G0/ >A""eptK,n"odin:$ :Qip# de4late?
a1eades>T? K> E . S1/ >F4K2odi4iedKSin"e$ 'ue# 0Z De" X00G X1$XG$0G N2'J len:th%1RP0?
a1eades>S? K> E . P1/ >OseKA:ent$ 2oQilla/R90 ."ompatibleJ 2SF, S90J +indo=s (' T91J 9(,' ELC 1909GB0T/?
a1eades>B? K> E . X1/ >1ost$ ap=ebe*9automan?
a1eades>P? K> E . XX/ >Eonne"tion$ HeepKAlive?
a1eades>Z? K> E . R1/ >Eoo6ie$ S,SSF-(FD%10B11TGGB1J APTPC-EFD%0?
httpEoo6ies K> ACCAY . X/ >999?
httpEoo6ies>1? K> E . Z/ >S,SSF-(FD?
httpEoo6ies>X? K> E . Z/ >APTPC-EFD?
S,SSF-(FD K> E . 10/ >10B11TGGB1?
APTPC-EFD K> E . 1/ >0?
httpPost K> ACCAY . 0/ >999?
httpNet K> ACCAY . 0/ >999?
1ttpCEt'ype./ K> E . 0/ >?
1ttpCEtLen./ K> ( . 10/ > K1?
1ttpCEtDisp./ K> E . 0/ >?
SoapCA"tion./ K> E . 0/ >?
1ttp-theEontent./ K> E . 0/ >?
VAPWE:E**W0000X 5H<A45+ P*O) *ET,*H TGPE V:X ...
VAPWE:E**W0000X 5H<A45+ P*O) *ET,*H TGPE V:X #rom VGX
+escrição Y )ausa A La Infra-Estrutura /p%ebE:, de acordo com o módulo %E& em uso, # chamada durante a iniciali$aç"o da %or9ing 6hread no ambiernte %E&E; uma funç"o espec)fica bic para iniciali$aç"o
adicional de ambiente, e a lib e:ige um retorno do tipo &ooleano * .6. ou .>. . , indicando se a iniciali$aç"o adicional foi e:ecutada com sucesso ou n"o. 7aso este ponto de entrada retorne um valor cu!o tipo n"o se!a
booleano, esta mensagem de erro # apresentada no console do 0erver e acrescentada ào ar'uivo E@@@.3D
Solução A Nerifi'ue o fonte do ponto de entrada e assegure-se 'ue o mesmo está retornando um valor /dvpl do tipo K3K 3ógico.
VAPWE:E**W0001X 5H<A45+ APWE: )A44
+escrição Y causa A /o solicitarmos ao servidor Protheus o processamento de uma funç"o /dvpl atrav#s de um lin9 .apB, utili$ando a infra-estrutura /p%ebe:, e:istem funções espec)ficas da linguagem 'ue
n"o podem ser e:ecutadas diretamente neste tipo de ambiente, por tratarem-se de funções e:clusivas para processamentos iniciados atrav#s de um @emote, e funções 'ue n"o permitem chamada direta via lin9. 7aso
alguma destas funções se!a chamada diretamente via H@3, esta ocorrIncia de erro # reprodu$ida.
VAPWE:E**W000>X 5H<A45+ P*O) *ET,*H TGPE V:X ...
VAPWE:E**W000>X 5H<A45+ P*O) *ET,*H TGPE V:X #rom VGX
+escrição Y causa A 2uando uma Bor9ing thread do ambiente /p%ebE:, recebe uma solicitaç"o de processamento atrav#s de um lin9 .apB, de acordo com o módulo Beb utili$ado, pode ser chamada uma funç"o
intermediária bic, antes do processamento da funç"o chamada no lin9 ou depois do processamento conclu)do.
/ lib e:ige 'ue estas funções internediárias retornem um conteJdo /dvpl do tipo g06@ILDg. 7aso a funç"o bic chamada pela lib retorne um conteJdo /dvpl diferente de g06@ILDg, o tipo de variável retornado #
mostrado em b;c e a %or9ing 6hread # finali$ada com esta ocorrIncia de erro.
Solução A Nerif'ue o código-fonte da funç"o bic, para certificar-se 'ue seu retorno sempre será um conteJdo /dvpl do tipo g06@ILDg
VAPWE:E**W0002X 5H<A45+ P*O) *ET,*H TGPE V:X ...
VAPWE:E**W0002X 5H<A45+ P*O) *ET,*H TGPE V:X 3,H)T5OH VGGGX
+escrição Y causa E 2uando solicitado ào servidor Protheus o processamento de uma funç"o atrav#s de um lin9 .apB, a funç"o e:ecutada sempre deverá retornar um conteJdo /dvpl do tipo g06@ILDg. 7aso o
conteJdo retornado pelo processamento da funç"o biiic retorne um tipo b;c, diferente de g06@ILDg, a =o6in: thead # finali$ada com esta ocorrIncia de erro, onde biiic indica a funç"o chamada atrav#s do
lin9 .apB e b;c indica o tipo de conteJdo inválido retornado
Solução A Nerifi'ue o fonte da funç"o biiic e certifi'ue-se 'ue a funç"o sempre retorne um conteJdo do tipo g06@ILDg

VAPWE:E**W000.X 3u"ctio" ::: re-uires APWEBE: ...
VAPWE:E**W000.X 3u"ctio" ::: re-uires APWEBE: *outi"es.
+escrição Y causa A /o desenvolvermos uma aplicaç"o para util$iar a infra-estrutura /p%ebE:, utili$ando o jinclude KapBebe:.chK e os comandos %E& E;6EL+E+ ILI6 ... EL+, devemos nos assegurar de estarmos
e:ecutando esta funç"o em um ambiente de =o6in: theads, configurados com o tipo %E&E;, utili$ando as funções da infra-estrutura /p%ebE: * 0tart%ebe: , 7onnect%ebE: ... . para iniciali$aç"o e
processamento da re'uisiç"o via lin9 .apB .
0e uma funç"o b;;;c, escrita para ser chamada e:clusivamente neste tipo de ambinete, se!a chamada diretamente via Protheus @emote, ou outro tipo de processamento 'ue n"o se!a uma =o6in: thead iniciali$ada
pelas funções de infra-estrutura /p%ebE:, a funç"o # abortada com esta ocorrIncia de erro. Isto tamb#m consistem em uma proteç"o, para 'ue uma funç"o pro!etada para ser e:ecutada em um tipo de ambiente *
=o6in: theads /p%ebE: . n"o se!a erroneamente e:ecutada em outro ambiente.
Solução A Nerifi'ue se a funç"o chamada realmente está sendo e:ecutada no ambiente apropriado.
VAPWE:E**W0009X STA*T 3u"ctio" ::: 5"valid *et ...
VAPWE:E**W0009X STA*T 3u"ctio" ::: 5"valid *etur" TKpe VGX
+escrição Y causa A 2uando # utili$ado o comando %E& E;6EL+E+ ILI6, especificando uma funç"o b;;;c de pr#-validaç"o de e:ecuç"o, atrav#s da cláusula 06/@6, a funç"o especificada deverá retornar um
conteJdo do tipo g06@ILDg. 7aso a funç"o b;;;c retorne um conteJdo n"o va$io, de tipo bic, diferente de g06@ILDg, o processamento da =o6in: thead # abortado com esta ocorrIncia de erro.
Solução A Nerifi'ue o fonte da funç"o b;;;c e assegure-se 'ue a e:ecuç"o desta retorne um conteJdo do tipo g06@ILDg
VAPWE:E**W000BX APH page V:::X "ot #ou"d i" .*PO
VAPWE:E**W000BX APH page V:::X "ot #ou"d i" .*PO
+escrição Y causa A /o utili$armos a funç"o E!ec5"PageLM/ no desenvolvimento de aplicações utili$ando as funções de infra-estrutura /p%ebe:, a mesma possui tratamento automático para buscar primeiramente por
uma página /<H compilada no repositório de ob!etos do ambiente. 7aso n"o se!a encontrado uma página .ahu, a funç"o procura por uma página .aph. 0e nenhuma página com o nome especificado n"o for encontrada,
o processamento # abortado com esta ocorrIncia de erro.
Solução A Nerifi'ue se a funç"o 'ue originou a chamada da E!ec5"PageLM passou o nome do /P< = /<H de forma correta, e se a página chamada está realmente presente e=ou foi compilada no repositório do pro!eto
em 'uest"o.
VAPWE:E**W000CX OPEH F,E*G E**O* A HO )OHHE)T5OH
VAPWE:E**W000CX OPEH F,E*G E**O* A HO )OHHE)T5OH
+escrição Y causa A /o utili$armos o comando PEL 2HE@i, caso n"o e:ista uma cone:"o ativa com o 6P7onnect, o processamento em e:ecuç"o # abortado com esta ocorrIncia de erro.
U\
Solução A 7ertifi'ue-se de 'ue a chamada deste comando está sendo reali$ada atrav#s de uma =o6in: thead 'ue possua uma cone:"o ativa com o 6P7onnect.
VAPWE:E**W000EX *etS-l)o"d #ailed to read :W6O+O
VAPWE:E**W000EX 3ailed to read :W6O+O Alias V:::X
+escrição Y causa A 2uando # utili$ada a funç"o *etS-l3ilLM como au:iliar na montagem de 'uerAs, a mesma tenta determinar se o*s. alia*s. utili$ado*s. na 2uerA est"o configurados no ambiente E@P atual no 0;4 em
modo Z)Z 7ompartilhado ou ZEZ E:clusivo. 7aso o alias b;;;c n"o se!a encontrado na tabela 0;4, ou a tabela 0;4 n"o este!a aberta no momento da e:ecuç"o desta, n"o # poss)vel identificar o modo de acesso do alias
especificado, e a e:ecuç"o # encerrada com esta ocorrIncia de erro.
Solução A Nerifi'ue se a funç"o *etS-l3ilLM e=ou *etS-l)o"dLM está recebendo o*s. alia*s. corretos, todos em letras maiJsculas] caso especificados mais de um alias, todos este!am separados por v)rgulas, e 'ue a
tabela 0;4 do E@P este!a aberta para a correta identificaç"o dos tratamentos de >I3I/3 para a montagem da condiç"o para 2uerA.
VAPWE:E**W0010X E*P 35HA4 *O,T5HE )A44E+
@evis"oE UX=58=4558
VAPWE:E**W0010X E*P 35HA4 *O,T5HE )A44E+
+escrição Y causa A 2uando e:ecutamos uma funç"o em uma =o6in: thead iniciali$ada com as funções de infra-estrutura /p%ebE:, a funç"o #i"alLM, utili$ada internamente pelas funções de infra-estrutura do E@P
,icrosiga, possui neste ambiente um tratamento diferenciado. 7aso ela se!a e:ecutada , a =o6in: thead # finali$ada com esta ocorrIncia de erro.
Solução A / funç"o #i"alLM n"o deve ser utili$ada como um recurso de finali$aç"o de aplicaç"o %E&, por#m ela # utili$ada internamente por funções da infra-estrutura E@P, no caso de uma ocorrIncia fatal 'ue impeça
um determinado processamento, e ganhou esta proteç"o na 3ib /p%ebE: para permitir o desenvolvimento de aplicações integradas %E& = E@P.
7aso reprodu$ida uma ocorrIncia de erro desta nature$a, verifi'ue nos detalhes do erro 'ual funç"o 'ue estava em e:ecuç"o e 'ual o motivo da finali$aç"o da =o6in: thead. Este motivo está especificado no campo
gErp ,essageg, mostrado nos detalhes da ocorrIncia de erro.
VAPWE:E**W0011X Argume"t [0 Error A Parameter ...
VAPWE:E**W0011X Argume"t [0 Error A Parameter re-uired.
+escrição Y causa A 2uando # utili$ada a funç"o /p%E:/ddErr*c6itle,cInfo., para informar à rotina de tratamento de erro da infra-estrutura /p%ebE:, uma informaç"o adicional a ser acrescentada no 3D de erro,
os par(metros c6itle e cInfo,'uando especificados, devem ser ser ambos preenchidos, e devem ser do tipo g06@ILDg
Solução A Esta ocorrIncia de erro informa 'ue o par(metro c6itle n"o foi especificado ou está va$io, por#m o par(metro cInfo foi especificado. Nerifi'ue o código-fonte e corriga a chamada da funç"o.
VAPWE:E**W001X Argume"t [0 Error A E!pected )1(:
VAPWE:E**W001X Argume"t [0 Error A E!pected )1(:
+escrição Y causa A 2uando # utili$ada a funç"o /p%E:/ddErr*c6itle,cInfo., para informar à rotina de tratamento de erro da infra-estrutura /p%ebE:, uma informaç"o adicional a ser acrescentada no 3D de erro,
os par(metros c6itle e cInfo,'uando especificados, devem ser ser ambos preenchidos, e devem ser do tipo g06@ILDg
Solução A Esta ocorrIncia de erro informa 'ue o par(metro c6itle foi especificado com um tipo b;c, 'ue n"o # g06@ILDg. Nerifi'ue o código-fonte e corri!a o par(metro passado para a funç"o.
VAPWE:E**W001>X Argume"t [1 Error A Parameter ...
VAPWE:E**W001>X Argume"t [1 Error A Parameter re-uired.
+escrição Y causa A 2uando # utili$ada a funç"o /p%E:/ddErr*c6itle,cInfo., para informar à rotina de tratamento de erro da infra-estrutura /p%ebE:, uma informaç"o adicional a ser acrescentada no 3D de erro,
os par(metros c6itle e cInfo,'uando especificados, devem ser ser ambos preenchidos, e devem ser do tipo g06@ILDg
Solução A Esta ocorrIncia de erro informa 'ue o par(metro cInfo n"o foi especificado ou está va$io, por#m o par(metro c6itle foi informado. Nerifi'ue o código-fonte e corri!a a chamada desta funç"o.
VAPWE:E**W0012X Argume"t [1 Error A E!pected )1(:
@evis"oE UX=58=4558
VAPWE:E**W0012X Argume"t [1 Error A E!pected )1(:
+escrição Y causa A 2uando # utili$ada a funç"o /p%E:/ddErr*c6itle,cInfo., para informar à rotina de tratamento de erro da infra-estrutura /p%ebE:, uma informaç"o adicional a ser acrescentada no 3D de erro,
os par(metros c6itle e cInfo,'uando especificados, devem ser ser ambos preenchidos, e devem ser do tipo g06@ILDg
Solução A Esta ocorrIncia de erro informa 'ue o par(metro cInfo foi especificado com um tipo de dado b;c 'ue n"o # g06@ILDg. Nerifi'ue o código-fonte e corri!a a chamada desta funç"o.
VAPWE:E**W000X 5H<A45+ TOB V:::X TGPE VGGGX
VAPWE:E**W000X 5H<A45+ TOB V:::X TGPE VGGGX
+escrição Y causa A Esta ocorrIncia de erro indica 'ue as configurações do Mob b;;;c, de =o6in: theads para utili$aç"o no ambiente /p%ebE:, está identificado com um 6iPE b;;;c inválido.
+urante a iniciali$aç"o de uma =o6in: thead, # verificado o tipo do Mob configurado no ar'uivo de configuraç"o. /penas s"o válidos os valores %E& e=ou %E&E;, de acordo com o módulo Beb em uso. 7aso a
configuraç"o especifi'ue um 6iPE diferente de %E& ou %E&E;, a configuraç"o n"o # válida, e a =o6in: thead # abortada antes de estar dispon)vel para atender à re'uisições de lin9s .apB, gerando uma ocorrIncia
de erro no console do servidor Protheus, tamb#m gravada no ar'uivo E@@@.3D
Solução A Para solucionar esta ocorrIncia, basta verificar a configuraç"o do Mob b;;;c utili$ado para iniciali$ar as =o6in: theads e especificar um tipo ade'uado * %E& ou %E&E; ., de acordo com o módulo em
uso.
VAPWE:E**W001X ,HAB4E TO ?ET TOB HA6E
VAPWE:E**W001X ,HAB4E TO ?ET TOB HA6E
+escrição Y causa A Esta ocorrIncia de erro indica 'ue o processo atual em e:ecuç"o n"o foi originado pela configuraç"o de um processo %E& ou %E&E; , ou a funç"o de iniciali$aç"o de ambiente 06/@6%E&E;
n"o foi chamada atrav#s de um evento L06/@6 de M&, como por e:emplo um /P @emote.
Solução A 7aso esta ocorrIncia se!a reprodu$ida, cerifi'ue-se 'ue a funç"o de iniciali$aç"o das =o6in: theads * 06/@6%E&E; . este!a sendo chamada atrav#s de um processo configurado com 6iPEW%E& ou
%E&E;, de acordo com o módulo Beb em uso.
VAPWE:E**W00X %T( 3u"ctio" V:X o# 6odule VGX ...
=AP#%#88>??FFA B2tart G ConnectC Function =%A of (odule =HA not found in 8po.
+escrição Y causa A Esta ocorrIncia de erro # reprodu$ida 'uando, ao configurar um módulo Beb bic, a funç"o b;c de iniciali$aç"o ou cone:"o referente ao módulo n"o foi encontrada no repositório de ob!etos do
ambiente em uso pela aplicaç"o Beb.
0oluç"o E 7ertifi'ue-se 'ue o repositório em uso atualmente possui as funções pertinentes ào modulo configurado.
VAPWE:E**W00>X ,HS,PPO*TE+ B*EA\ )OHT*O4
VAPWE:E**W00>X ,HS,PPO*TE+ B*EA\ )OHT*O4
+escrição Y causa A /o utili$ar as funções de Infra-Estrutura /P%E&E;, 'uando da chamada de uma funç"o atrav# de 3in9 .apB , desde a chamada original at# a passagem pelos pontos de pr# e pós-validaç"o de
processamento, a rotina de tratamento de erro habilitada # de controle interno e e:clusivo da Infra-Estrutura /p%ebE:.
7aso o comando &@E/e se!a chamado em algum destes pontos, a e:ecuç"o # abortada , e na rotina de tratamento de e:ecuç"o, n"o há o registro de controle de erro, de modo 'ue a =o6in: thead # abortada com esta
ocorrIncia de erro.
Solução A 7ertifi'ue-se 'ue no códiugo fonte da aplicaç"o n"o se!a utili$ado o comando &@E/e.
OBSE*<AIJO A )omo esta ocorr]"cia 0 tratada em um po"to de retor"o i"ter"o/ o po"to de e"trada WEBE:E**O* "ão 0 e!ecutado/ se"do retor"ada ao usuSrio a me"sagem padrão de Erro.
VAPWE:E**W002X %T( 3u"ctio" V:X o# 6odule VGX ...
UX=58=4558
/brangIncia
Ners"o Y.UU 3I& %E&E;
=AP#%#88>??FIA B2tart G Connect G Finis" C Function =%A of (odule =HA not found in 8po.
+escrição Y causa A Esta ocorrIncia de erro # reprodu$ida 'uando, ao configurar um módulo Beb bic, a funç"o b;c de iniciali$aç"o, cone:"o ou finali$aç"o, referente ao módulo, n"o foi encontrada no repositório de
ob!etos do ambiente em uso pela aplicaç"o Beb.
Solução A 7ertifi'ue-se 'ue o repositório em uso atualmente possui as funções pertinentes ào modulo configurado.
VAPWE:E**W00.X ,"="oD S5?AWEB 6odule VGX
@evis"oE UX=58=4558
/brangIncia
Ners"o Z.U5 Ners"o Y.UU
=AP#%#88>??FJA 3nkno+ 2I1A#$ (odule =HA
+escrição Y causa A 2uando da configuraç"o de um módulo Beb para os tratamentos internos das funções de infra-estrutura /p%ebE:, devemos especificar uma sigla de um módulo %eb válido e tratado pela lib de
infra-esturtura. s módulos atualmente implementados na lib s"o E
• +% - +ata %are<ouse
• &07 - &alanced 0core7ard
• ,/e - ,odulo %E&E; ,a9ira
• DE - Dest"o Educacional
• DP@ - Dest"o de Pes'uisa e @esultado
45
• 67> - 6erminal do >uncionario * @< L3ILE .
• PP - Portal P@otheus * %eb0ervices .
• 0/N - 0ala de /prendi$agem Nirtual
• D/7 - Dest"o de /cervos
• %P0 - %ebPrint a %eb0pool
7aso n"o se!a fornecida uma sigla válida na chave 0ID/%E&, na seç"o de configuraç"o das Bor9ing threads, as mesmas n"o entrar"o no ar, e ser"o abortadas com esta ocorrIncia de erro.
Solução A Nerifi'ue a chave de configuraç"o 0ID/%E& e preencha-a com uma sigla de módulo válida para a vers"o de repositório = ambiente em uso.
VAPWE:E**W009X We@ Services Test POST E**O*.
@evis"oE UX=58=4558
/brangIncia
Ners"o Z.U5 Ners"o Y.UU
=AP#%#88>??FKA e. 2ervices Test P&2T #88&8..
+escrição Y causa A 2uando utili$amos a interface de testes de Beb services client da ferramenta %eb/dmin, caso ocorra uma falha estrutural no serviço 7lient ou uma impossibilidade de recuperar todos os dados
postados no fomulário de testes, o processamento # interrompido com esta ocorrIncia de erro.
VAPWE:E**W00BX 5H<A45+ HTO) BASE VHHHX
@evis"oE UX=58=4558
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
VAPWE:E**W00BX 5H<A45+ HTO) BASE VHHHX
+escrição Y causa A /o utili$ar a funç"o "tocLM, deve-se atentar ao limite de base num#rica para convers"o, 'ue pode ser um nJmero entre 4 e X[. 7aso a base passada como par(metro para a funç"o "tocLM este!a fora
destes limites, o processamento # abortado com a ocorrIncia acima , informando em LLL a base utili$ada.
Solução A Nerifi'ue a chamada da funç"o ntoc*. no fonte e certifi'ue-se 'ue está sendo informado um nJmero entre 4 e X[.
VAPWE:E**W00CX 6O+,4E VGX *EF,5*ES TOB TGPE'WEBE:
@evis"oE UX=58=4558
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
=AP#%#88>??FLA (&D3L# =HA 8#M3I8#2 N&$ THP#O#$#%
+escrição Y causa A Esta ocorrIncia de erro informa 'ue a configuraç"o de =o6in: theads utili$ada para este módulo Beb n"o possui o tipo ade'uado configurado. ,ódulo bic utili$ado re'uer um !ob para =o6in:
theads configurado com 6iPEW%E&E;, por#m esta configuraç"o está atualmente configurada como %E&.
Solução A Nerifi'ue a configuraç"o das Bor9ing threads deste módulo Beb e certifi'ue-se 'ue a configuraç"o 6iPE está setada para %E&E;.
VAPWE:E**W00EX 6O+,4E VGX *EF,5*ES TOB TGPE'WEB
@evis"oE UX=58=4558
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
=AP#%#88>??FPA (&D3L# =HA 8#M3I8#2 N&$ THP#O#$
+escrição Y causa A Esta ocorrIncia de erro informa 'ue a configuraç"o de =o6in: theads utili$ada para este módulo Beb n"o possui o tipo ade'uado configurado. ,ódulo bic utili$ado re'uer um !ob para =o6in:
theads configurado com 6iPEW%E&, por#m esta configuraç"o está atualmente configurada como %E&E;.
Solução A Nerifi'ue a configuraç"o das Bor9ing threads deste módulo Beb e certifi'ue-se 'ue a configuraç"o 6iPE está setada para %E&.
VAPWE:E**W00>0X HO WEB 45)EH)ES A<A54AB4E L...
@evis"oE UX=58=4558
/brangIncia
Ners"o Y.UU 3I& %E&E;
=AP#%#88>??Q?A 9& #$ LIC#9C#2 ARAILA$L#
+escrição Y causa A Esta ocorrIncia de erro, indica 'ue n"o há mais licenças Protheus i dispon)veis para a utili$aç"o da aplicaç"o %eb. /dicionalmente à esta ocorrIncia, # informado adicionalmente a informaç"o
g%E& 3I7EL0E 06/6H0 bLLLLcg, onde nnnn indica o código de erro do <ard3oc9 utili$ado para controle de licenças.
Solução A Nerifi'ue na lista completa de status de retorno do <ar93oc9 , dispon)vel em *pendente., para certificar-se da origem desta ocorrIncia e ent"o tomar uma aç"o corretiva.
VAPWE:E**W00>1X WA*H5H? A WEB 45)EHSES W544 E:P...
@evis"oE UX=58=4558
/brangIncia
Ners"o Y.UU 3I& %E&E;
=AP#%#88>??QSA A89I91 < #$ LIC#92#2 ILL #%PI8#2
e. Licenses +ill e6pires in 99 daETsU
+escrição Y causa A Esta ocorrIncia consiste em uma advertIncia, registrada no ar'uivo error.log do ambiente em uso pela aplicaç"o %eb, registrada uma ve$ ao dia, a partir do instante 'ue faltam apenas U5 dias ou
menos para 'ue as licenças Beb * Protheus i . da aplicaç"o e:pirem. nJmero de dias 'ue restam para as licenças vencerem # especificado adicionalmente em bLLc.
Solução A Providencie a atuali$aç"o das licenças Protheus i da aplicaç"o Beb !unto à ,icrosiga.
Po"tos de E"trada 1 APWEBE:
@evis"oE X5=58=4558
/brangIncia
Ners"o Y.UU
2uando da utili$aç"o da infra-estrutura /P%E&E;, especificamente o módulo K,/eK * ,a9ira ., s"o disponibili$ados os pontos de entrada relacionados neste tópico, para permitir customi$ar e interceptar os eventos
de Iniciali$aç"o da 6hread * HO0tart%ebE: ., atendimento a re'uisições de lin9s .apB antes de processar a funç"o principal * HO7onnect%ebE: ., atendimento a re'uisições de lin9s .apB após processada a funç"o
principal * HO@eset%ebE: ., finali$aç"o da 6hread * HO>inish%ebE: ., finali$aç"o de session de usuário por 6ime-out * HOEnd0ession ., e customi$aç"o da mensagem de erro <6,3, 'uando da ocorrIncia de algum
erro fatal na aplicaç"o * HO%E&E;E@@@ ..
2uando utili$ada a infra-estrutura /P%E&E; para um módulo do padr"o, estes pontos de entrada n"o tem efeito. >ica a crit#rio de cada módulo a disponibili$aç"o de pontos de entrada para interceptar estes eventos.
Para saber 'uais pontos foram implementados para um módulo Beb do padr"o, deve ser consultada a documentaç"o do módulo correspondente.
01. STA*TWEBE:
@evis"oE U5=U4=455X
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
0inta:e
5U. 06/@6%E&E; * b LI3 c . --T l0ucess
Par(metros
/rgumento 6ipo +escriç"o
LI3 *LH3. Este ponto de entrada n"o recebe par(metros.
@etorno
6ipo +escriç"o
3ógico
l0ucess corresponde ào status de montagem de ambiente. 7aso o ambiente tenha sido montado com sucesso , o ponto de entrada deve retornar .6. , caso contrário .>. . Hma ve$
retornado .>. , o Protheus irá eliminar esta %or9ing 6hread da memória.
+escriç"o
Este ponto de entrada # e:ecutado na iniciali$aç"o de cada %or9ing 6hread, 'uando utili$ada a configuraç"o para a 3ib /P%E&E;.
/trav#s dele, devemos iniciar o ambiente necessário ào atendimento das re'uisições de processamento via &roBser , atrav#sde lin9s .apB, tais como a abertura de dicionários e cone:"o com o &anco de +ados.
4U
Drupos @elacionados
Principal / A Tecnologia Protheus / Programação Advpl para W! / In"ra#strutura APW!$ / Pontos de ntrada
0. )OHHE)TWEBE:
@evis"oE U5=U4=455X
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
0inta:e
54. 7LLE76%E&E; * R c>n3in9 T . --T c<tmlNld
Par(metros
/rgumento 6ipo +escriç"o
c>n3in9 7aracter
>unç"o chamada atrav#s do 3in9 . Por e:emplo , um lin9 no broBse chamando httpE==localhost=BOteste.apB`pcW5X , seria recebido neste par(metro a
string g%O6E06Eg
@etorno
6ipo +escriç"o
7aracter
7aso retornada uma string em branco , a e:ecuç"o da funç"o originalmente chamada no lin9 .apB prossegue normalmente. 7aso contrário , a string retornada # devolvida ao &roBser
solicitante , e a funç"o chamada atrav#s do lin9 n"o # e:ecutada.
+escriç"o
Este ponto de entrada # e:ecutado imediatamente antes do processamento de uma re'uisiç"o reali$ada atrav#s de um broBser para processamento de uma funç"o /dvpl , atrav#s de um lin9 .apB , permitindo reali$ar
uma pr#-validaç"o antes de cada processamento solicitado atrav#s do &roBser.
0>. *ESETWEBE:
@evis"oE U5=U4=455X
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
0inta:e
5X. @E0E6%E&E; * R c>n3ic9 T . --T c<tml/dd
Par(metros
/rgumento 6ipo +escriç"o
c>n3ic9 7aracter c>n3in9 corresponde à funç"o /dvpl 'ue foi chamada e processada imediatamente antes da chamada deste ponto de entrada.
@etorno
6ipo +escriç"o
7aracter Este ponto de entrada +ENE retornar uma string , podendo ser inclusive uma string va$ia. / 0tring retornada será acrescentada ao 7odigo <tml a ser retornado ao &roBser
+escriç"o
Este ponto de entrada # e:ecutado imediatamente após o processamento de uma re'uisiç"o de processamento /dvpl atrav#s de um %eb &roBser utili$ando as configurações e 3ib /P%E&E;.
Ele permite 'ue se!a e:ecutado um processamento adicional após o processamento de cada re'uisiç"o .apB , e aida permite um retorno de html adicional ao broBser.
Nale a pena lembrar 'ue este ponto n"o será e:ecutado em caso de erro fatal no ponto de entrada HO7LLE76%E&E; ou na e:ecuç"o da funç"o principal chamada atrav#s do 3in9.
02. 35H5SHWEBE:
@evis"oE U5=U4=455X
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
0inta:e
58. >ILI0<%E&E; * . --T LI3
Par(metros
/rgumento 6ipo +escriç"o
@etorno
6ipo +escriç"o
*LH3. @etorno deste ponto de entrada n"o # utili$ado.
+escriç"o
Este ponto de entrada # e:ecutado 'uando da finali$aç"o * >echamento . de uma %or9ing 6hread /P%E&E;. L"o recebe par(metros , e n"o re'uer retorno. Ele permite 'ue se!a e:ecutado um procedimento 'ual'uer
no momento da sa)da de uma %or9ing 6hread, se!a por time-out ou por tempo total de permanIncia no ar.
0.. EH+SESS5OH
@evis"oE U5=U4=455X
/brangIncia
Ners"o Z.U5 Ners"o Y.UU 3I& %E&E;
0inta:e
51. EL+0E00IL * R c0essionId T . --T LI3
Par(metros
/rgumento 6ipo +escriç"o
c0essionId 7aracter c0essionId corresponde à string identificadora das sessions deste usuário.
@etorno
6ipo +escriç"o
*LH3. retorno deste ponto de entrada deve ser nulo
+escriç"o
/trav#s deste ponto de entrada , podemos e:ecutar uma rotina /dvpl 'uando da finali$aç"o das sessions de um usuário por time-out de inatividade. @etorno deste ponto de entrada n"o # utili$ado, devendo ser nulo
*LI3..
/penas devemos compilar este ponto de entrada no Pro!eto caso realmente e:ista a necessidade de ser e:ecutado um processamento espec)fico relacionado à finali$aç"o das sessions de um usuário. Nale a pena
ressaltar tamb#m 'ue este ponto de entrada apenas # chamado na finali$aç"o das sessions por tempo de inatividade. 7aso se!a utili$ada a funç"o httpfreesession*. para limpar da memória as sessions do usuário atual em
uma %or9ing 6hread, este ponto de entrada n"o será chamado.
09. WEBE:E**O*
@evis"oE U[=U4=455X
/brangIncia
3I& %E&E;
0inta:e
5[. %E&E;E@@@ * R oErrorb! T , R cError3og T , R cError<tml T . --T c,sg<tml
Par(metros
/rgumento 6ipo +escriç"o
oErrorb! b!eto b!eto do Erro /dvpl.
cError3og 7aracter ,ensagem /07II 'ue será gravada no ar'uivo error.log
cError<tml 7aracter ,ensagem <tml original da rotina de tratamento de Erro
@etorno
6ipo +escriç"o
7aracter
@etorno opcional. 7aso retornado LI3 ou string va$ia , será retornado ao usuario o html de erro gerado pela rotina de tratamento standard. 7aso o ponto de entrada retorne uma 0tring
<6,3 , ela será mostrada ao usuário no ligar do <tml gerado pela rotina de tratamento de erro.
+escriç"o
Este ponto de entrada será chamado no caso de uma ocorrIncia de erro fatal /dvpl durante a e:ecuç"o de uma %or9ing 6hread em ambiente = 3ib /P%E&E;, permitindo a montagem de uma mensagem de erro
<6,3 customi$ada a ser devolvida ào usuário.
Este ponto de entrada recebe como par(metros o ob!eto do erro , a descriç"o /07II completa do erro gravada no error.log , e o <6,3 default montado pela da rotina de tratamento de erro 'ue será devolvido ao
usuario. /trav#s da utili$aç"o deste ponto de entrada , # poss)vel gerar um <tml diferenciado conforme a necessidade, para mostrar a ocorrIncia de erro e=ou maiores instruções ao usuário.
OBSE*<AINES
44
• 5"depe"de"teme"te do retor"o deste po"to de e"trada / a Wor=i"g Thread -ue aprese"tou ocorre"cia de erro serS derru@ada apos o retor"o do Html para o BroDser / e o ar-uivo error.log
serS gerado "ormalme"te . )aso este po"to de e"trada retor"e uma stri"g em @ra"co / serS mostrado ao usuSrio a me"sagem de erro Html de#ault gerada pela roti"a de tratame"to de erro.
• Este po"to de e"trada serS chamado ape"as caso a ocorr]"cia de erro esteOa relacio"ada com uma chamada de #u"ção via li"= .apD/ aplica"do1se ape"as 8 #u"ção .apD chamada e 8os po"tos
de e"trada ,W)OHHE)TWEBE: e ,W*ESETWEBE:. Em caso de ocorr]"cias de erro "o start da Thread L,WSTA*TWEBE:M/ "a #i"aliPação da Thread L ,W35H5SHWEBE: M e "a #i"aliPação de
sessio"s de usuSrio por time1out L ,WEH+SESS5OH M/ o po"to de e"trada ,WWEBE:E**O* "ão serS chamado .
Ce"omendaKse 4otemente 5ue # na monta:em da 4un78o deste ponto de entada # n8o se<a utiliQado nenhum e"uso Advpl 5ue dependa de ambiente # dis"o # base de dados ou Session # limitandoKse apenas L
"ustomiQa uma mensa:em de o"o\n"ia de eo ao usu0io 9
Easo se<a epoduQida al:uma o"o\n"ia de eo neste ponto de entada# isto 4a0 a apli"a78o . Potheus Seve / envia ao Bo=se um 1tml :eado pela otina de tatamento de eo de4ault do Potheus9
A H*E3 1 ^"coras e espaços
@evis"oE UU=U4=455X
2uando passamos par(metros de uma página para outra , via 'uerA string *H@3. , devemos ter o cuidado de n"o dei:ar espaço*s. em branco entre par(metros na montagem da H@3. 2uando utili$amos o Internet
E:plorer os espaços em branco s"o convertidos *n. automativamente para a se'uIncia 0tring S45, por#m 'uando utili$amos o Letscape, 'uando colocamos um espaço em branco em um par(metro , o Let0cape
IDL@/ tudo o 'ue vem após o primeiro espaço em branco , perdendo assim os demais par(metros.
7onsideremos o e:emplo abai:o E
<a he4%;/=ebin4o9ap=Vpa1%1XG WpaX%GRT;>Lin6</a>
Lo Internet E:plorer n"o haverá problemas *n. , pois os espaços ser"o convertidos. Lo Letscape , o par(metro par4 n"o será colocado na H@3... / forma correta deve ser
<a he4%;/=ebin4o9ap=Vpa1%1XG%X0%X0%X0WpaX%GRT;>Lin6</a>
2uando a chamada # gerada dinamicamente , devemos utili$ar a funç"o escape*. , para converter caracteres reservados e espaços da stringlist para a notaç"o <e:adecimal *S<<. para serem enviados corretamente pela
H@3
<a he4%;=ebin4o9ap=Vpa1%<%%,s"ape."Eodi:o/%>WpaX%GRT;>Lin6</a>
O@servação E Nale a pena lembrar 'ue a funç"o escape*. deve ser aplicada apenas àos conteJdos da stringlist, pois se por e:emplo for convertido pela escape*. o caracter separador de par(metros a * e 7omercial .,
este caractere será interpretado como +/+ e n"o como separador, comprometendo o funcionamento do lin9.
)om@o Y Select em Html A *ecupera"do valores
@evis"oE UU=U4=455X
E:aminemos o e:emplo abai:o , onde criamos um formulário <6,3 com um K7ombo &o:K * tag R0E3E76T do <6,3., de seleç"o Jnica , e 'ueremos saber 'ual o valor 'ue o usuário selecionou para , por e:emplo ,
validar uma escolha no &roBse * 7lient . E
<1'2L><B-DY>
<4om name%;e*emplo; method%;post; a"tion%;=A=***9apl;>
<S,L,E' (A2,%;teste; onEhan:e%;<avas"ipt$muda./;>
<-P'F-( VALO,%;1;>Valo 1
<-P'F-( VALO,%;X;>Valo X
<-P'F-( VALO,%;G;>Valo G
<-P'F-( VALO,%;R;>Valo R
<-P'F-( VALO,%;T;>Valo T
</S,L,E'>
</4om>
</B-DY></1'2L>
<SECFP' LA(NOAN,%;IavaS"ipt;>
4un"tion muda./
]
// 2osta 5ual o usuaio sele"ionou
alet.do"ument9e*emplo9teste9value/J
^
</SECFP'>
Lo Internet E:plorer , este código funciona perfeitamente . Por#m , o Let0cape mosstrará o conteJdo como null, pois ele n"o atribui uma propriedade value a um combo partindo de uma seleç"o.
Para 'ue se!a recuperado o valor do elemento selecionado , utili$amos o código abai:o , compat)vel com ambos os &roBsers.
document.e6emplo.teste.options=document.e6emplo.teste.selectedInde6A.value
Lote 'ue utili$amos o arraA options do controle teste para obter o valor correto , utili$ando o )ndice 'ue está selecionado. / funç"o muda poderia ficar assimE
<SECFP' LA(NOAN,%;IavaS"ipt;>
4un"tion muda./
]
va valA"ombo % do"ument9e*emplo9teste9options>do"ument9e*emplo9teste9sele"tedFnde*?9valueJ
// 2osta 5ual o usuaio sele"ionou
alet.valA"ombo/J
^
</SECFP'>
+i#ere"ças e"tre os Havegadores 5E e \o"-ueror
@evis"oE UX=58=4558
U. /tuali$aç"o de frames com BindoB.open
Ocorre"cia A Para chamar uma nova página no IE, cu!o destino será o frame atual ou página atual do &roBser, podemos usar a funç"o !avascript E Di"doD.ope"L Z!!!.apDZ/ ZWsel#Z M . Lo IE *Interbet E:plorer. o lin9
chamado # aberto no mesmo frame de onde a instruç"o # chamada, mas no eon'ueror esta instruç"o abre uma nova !anela com o nome KOselfK.
Solução A Htili$e a instruç"o Mava0cript Di"doD.locatio" para atuali$ar o endereço da !anela atual ou frame especificado. Por e:emplo , Di"doD.locatio"'Z!!!.apDZ
Estrutura de 3rames em HT64
@evis"oE U1=U4=455X
/brangIncia
Nersões /nteriores
/nalisemos a estrutura de frames abai:o E
<1'2L>
<4ameset 4amespa"in:%;0; bode%;0; "ols%;100#100; 4amebode%;0;>
<4ame name%;4Anot; s"ollin:%;no; bode%;0; ma:in=idth%P ma:inhei:ht%0 s"%;=A=in40SB9apl;>
<4ame (ame%;4AAea; s"%;; 2a:in=idth%;0; 2a:inhei:ht%;0; &amespa"in:%;0; Bode%;0; &amebode%;0; s"ollin:%;auto;>
<no4ames>Seu bo=se n8o supota 4ames</no4ames>
</4ameset>
</1'2L>
Dicas Vteis
• Procurem sempre utili$ar a 6/D RnoframesT para mostrar uma mensagem de erro no &roBse se o mesmo n"o possuir o recurso de interpretaç"o de frames * caso este de navegadores do I.E. X.5 ou
inferiores e netscape X.5 ou inferiores..
• 0empre especifi'ue 6+0 os sources *src. de cada frame. 7aso se!a necessário uma página em branco como um dos frames , para criaç"o din(mica ou algo parecido , utili$e o source about$blan6
4X
• 7aso um frame da estrutura n"o tenha a tag srcWK...K preenchida , o Letscape mostrará uma !anela com a seguinte mensagem 'uando se entra na página de framesE
;'he do"ument "ontained no data9
'y a:ain late # o "onta"t the seve;s administato9;
• / tag RbodAT n"o # suportada. na declaraç"o dos frames. Mamais usem esta tag em uma estrutura de frames.
6ostra"do campos 6E6O em Html
@evis"oE U1=U4=455X
/brangIncia
Nersões /nteriores
Para visuali$ar o conteJdo de um campo ,E, em uma página <6,3 , devemos reali$ar algumas conversões de caracteres para o efeito dese!ado. Em <6,3 , temos dois modos de interpretaç"o E
U. +efault -T Interpretaç"o <6,3 , os 7aractetes 7@3> * chr*UX. = chr*U5. . n"o s"o considerados como pulo de linha , de modo 'ue as 'uebras de linha s"o de acordo com o design aplicado e=ou o tamanho dispon)vel
no broBse para a visuali$aç"o do dado.
4. Pr#-formatado -T Interpretaç"o semelhante à um ar'uivo /07II , utili$a um tipo de letra K@egular 6ApeK , mono-espaçada , considerando os códigos 7@3> como 'uebra de linha , independente do design aplicado.
+efinimos uma area a ser interpretada como te:to pr#-formatado atrav#s das tags RpreT ... R=preT
/ soluç"o mais comum para a visuali$aç"o de campos ,emo * inclusive foi a soluc"o adotada a9i no &anco de 7onhecimento - +E, . , # a de trocar os códigos 7@3> pela tag KRbrTK , para apenas reali$ar um pulo de
linha no fim do parágrafo. /penas para te:tos de E:emplos de 7ódigo /+NP3 s"o utili$adas as tag RpreT .. R=preT, para 'ue a 'uebra de linha se!a unica e e:clusivamente reali$ada no 7@3> , mesmo 'ue o tamanho
da tela n"o permita mostrar esta 'uebra * caso este no 'ual a tela ou frame ganha uma barra de scroll no %eb &roBser . .
E:emplo * em ar'uivo .aph .
<%%sttan. DDDK>DDDA2,2- # "h.1G/)"h.10/ # ;<b>; /%>
7aso tenhamos tags interpretáveis dentro do memo , 'ue n"o devam ser interpretadas pelo broBse , mas sim constar como conteJdo do campo , devemos utili$ar a funcao <tmlLo6ags , dentro da e:press"o
anteriormente montada E
<%%sttan. 1tml(o'a:s.DDDK>DDDA2,2-/ # "h.1G/)"h.10/ # ;<b>; /%>
0e a funç"o <tmlLo6ags receber como parametro o retorno da 0tr6ran , ser"o mostrados na tela as tags KRbrTK , 'ue originalmente devem ser interpretadas pelo broBse como 'uebras de linha.
*e#resh em Html Y TavaScript
@evis"oE U1=U4=455X
/brangIncia
Nersões /nteriores
Em <tml, para setar um refresh automatico da página em RnT segundos, utili$a-se uma eti'ueta meta , na seguinte sinta:e E
<meta 1''PK,_OFV%;C,&C,S1; "ontent%;<n> >J OCL%<ul>;?>
RnT 6empo em segundos
bRurlTc Endereco a ser carregado. *opcional.
Em Mavascript, para setar a e:ecuç"o de uma funç"o automaticamente em um intervalo de tempo, podemos utili$ar a funç"o set6imeut*.
>unç"o set6imeout*Rc>uncT,Rn6imeT.
/mbiente Mava0cript
Parametros E
Rc>uncT W Lome da funcao em Mava a e:ecutar
Rn6imeT W intervalo de e:ecucao *milisegundos.
&.servaç'o E Las funções de Infra-Estrutura /P%E&E;, foi criada a funç"o /dvpl @edirPage*., 'ue monta o script de redirecionamento conforme os par(metros recebidos, podendo ser especificado o tempo de
espera para o redirecionamento e um 6/@DE6 diferenciado para o redirecionamento.
3u"ç$es com A+<P4 ASP
@evis"oE 4[=5Z=4558
/brangIncia
Ners"o 1.5Z Ners"o 1.5Y Ners"o [.5\ Ners"o Z.U5 Ners"o Y.UU

O código abaixo representa o arquivo ms01.APH, que contém a parte para Login
de um usuario
<html>
<h2 align="center"> Login </h2>
<hr>
<form name="form1" method="post" action="w_ms02.apw">
<p>Nome : <input name="txt_Nome" type="text" id="txt_Nome" size="25"></p>
<p>Senha : <input name="txt_Senha" type="password" id="txt_Senha" size="3" maxlength="3"></p>
<hr>
<p><input type="submit" value="Ok"></p>
</form>
</html>
O código abaixo representa o arquivo ms02.APH, que contém a parte do ormu!"rio
<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];

if ( oFrm.txt_Nome.value == "" || oFrm.txt_Pre.value == "" ||
oFrm.txt_Fone.value == "" || oFrm.txt_End.value == "" )
{
alert( "Preencha Todos Os Dados Do Formulário" );
return;
}
oFrm.action = "w_ms03.apw";
oFrm.submit();
}
48
</script>
<body>
<h2 align="center"> Formulário</h2>
<hr>
<p>Bem Vindo <%=HttpSession->Usuario%></p>
<form name="form" method="post" action="">
<p>Nome : <input name="txt_Nome" type="text" id="txt_Nome" size="25" value=""></p>
<p>Telefone : <input name="txt_Pre" type="text" id="txt_Pre" size="3"> -
<input name="txt_Fone" type="text" id="txt_Fone" size="10"></p>
<p>Endereço : <input name="txt_End" type="text" id="txt_End" size="25"></p>
<p><input type="button" value="Enviar" onClick="envia()"></p>
</form>
<hr>
</body>
</html>
O código abaixo representa o arquivo ms0#.APH, que contém uma tabe!a que exibe os dados
preenc$idos no ormu!"rio, mais um contador do tota! de ve%es que oi rea!i%ado esse ormu!"rio
<HTML>
<table width="200" border="1">
<tr>
<td width="95">Nome</td>
<td colspan="2"><%=HttpPost->txt_Nome%></td>
</tr>
<tr>
<td width="95">Telefone</td>
<td width="75"><%=HttpPost->txt_Pre %></td>
<td width="75"><%=HttpPost->txt_Fone%></td>
</tr>
<tr>
<td>Endereço;</td>
<td colspan="2"><%=HttpPost->txt_End%></td>
</tr>
<tr>
<td width="95">Contador</td>
<td colspan="2"><%=HttpSession->Contador%></td>
</tr>
</table>
<P>
<input name="Reset" type="reset" value="Voltar" onClick="window.location = 'w_ms02.apw'">
</P>
</HTML>
O código abaixo representa o arquivo ms01.PRW, que contém as funções escritas em ADVPL ASP
#INCLUDE "PROTHEUS.CH"
#DEFINE ID "Admin"
#DEFINE SENHA "123"
web function ms01()
//A função é executada quando é chamada através do browser.
return h_ms01()
web function ms02()
//Verifica se é a primeira vez q usuário faz login.
conout( ID, SENHA )
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
//Verifica usuário e senha.
if HttpPost->txt_Nome != ID
return "Usuário Inválido!!"
endif
if HttpPost->txt_Senha != SENHA
return "Senha Inválida!!"
endif
//Seta o nome do usuario.
HttpSession->Usuario := HttpPost->txt_Nome
endif
return h_ms02()
web function ms03()
//Verifica se a Sesssion já foi iniciada.
if empty( HttpSession->Contador )
HttpSession->Contador := 1
//caso tenha sido, incrementa o contador.
else
HttpSession->Contador++
endif
return h_ms03()
,pload de ar-uivo via HTTP
@evis"oE 51=U5=4558
/brangIncia
Ners"o Z.U5 Ners"o Y.UU
Este e:emplo de /+NP3 /0P mostra como reali$ar o upload de um ar'uivo via <66P.
O código abaixo representa o arquivo &ms01.APH&, que contém um ormu!"rio para indicar o !oca! do aquivo para up!oad.
<html>
<head>
<title>Exemplo Upload</title>
</head>
41
<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>
O código abaixo representa o arquivo &up!oad.APH&, que contém um ormu!"rio para exibir a!guns dados do aquivo enviado.
A parte mais importante desse código, se reere a propriedade 'enct(pe)&mu!tipart*orm+data&, dentro da tag
, essa propriedade garante que o arquivo se-a enviado corretamente.
<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>
O código abaixo representa o arquivo &up!oad.P./&, que contém as un01es escritas em A23PL A4P.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FILEIO.CH"
Web Function upFile()
Local nH := FOpen( httpPost->txtFile, 0 + 64 )
Private LengthFile := 0
LengthFile := fSeek( nH, 0, FS_END )
Return h_RespUpFile()
HT64
@evis"oE UX=58=4558
<6,3, abreviaç"o para ;1ype'e*t 2a6up Lan:ua:e;, 'ue significa K3inguagem de >ormataç"o de <Aper6e:toK
<6,3 # a formataç"o padr"o adotada para a publicaç"o de <Aper6e:to na Internet *+old +ide +eb.. <6,3 consiste em uma formataç"o n"o-proprietária, baseada no 0D,3 * Standad NenealiQed 2a6up
Lan:ua:e ., e pode ser criada e processada por um grande nJmero de ferramentas, desde editores de te:to-plano * como o LotePad, por e:emplo., at# sofisticados KsoftBares de autoriaK %i0I%iD *%hat iou 0ee Is
%hat iou Det. .
&asicamente, o <6,3 utili$a-se dos marcadores R e T para estruturar e formatar te:to. Por e:emploE
3etra normal, RbTnegritoR=bT e RuTsublinhado R=uT
/ linha de te:to acima, representada em um %eb &roBser, seria mostrada assim E
3etra normal, "egrito e sublinhado
HTTP
@evis"oE UX=58=4558
<66P # a abreviaç"o de ;1ype 'e*t 'ans4e Poto"ol;, 'ue significa KProtocolo de 6ransferIncia de <Aper-6e:toK.
<66P # um protocolo em n)vel de aplicaç"o para distribuiç"o de informações. 6rata-se de um protocolo gen#rico, 'ue pode ser utili$ado para muitas outras aplicações al#m de transferIncia de hAperte:to, como
nomear servidores e trocas de informações entre sistemas integrados, utili$ando-se suas e:tensões, códigos de erro, m#todos de re'uisiç"o e cabeçalhos *1eades.. Hma caracter)stica importante do <66P # a tipagem e
normali$aç"o da representaç"o da informaç"o, permitindo a construç"o de sistemas independente do modo pelo 'ual os dados est"o sendo transferidos.
Threads e Dor=i"g threads
@evis"oE UX=58=4558
& *ue 7 uma T"read0
/ maioria dos programadores está familiari$ada com programas de e:ecuç"o se'uIncial. NocI provavelmente !á deve ter escrito um programa 'ue mostra Klá ,undoK ou ordena uma lista de nomes, ou calcula uma
lista de nJmeros primos. Estes programas s"o se'uenciais, e cada um deles tIm um começo, uma se'uIncia de e:ecuç"o e um final . Em 'ual'uer momento da e:ecuç"o do programa, temos apenas um ponto de
e:ecuç"o.
Hma 6hread # semelhante ào programa descrito acima, tendo um começo, meio e fim. Por#m, uma 6hread em si n"o # um programa, pois ela n"o se e:ecuta E ela roda *com. o programa d
Por definiç"o E 3ma T"read 7 o flu6o se*Wencial de controle Vnico dentro de um pro!rama.
L"o há nada de novo ou especial sobre programas se'uenciais e:ecutados em uma simples thread. / grande sacada consiste no uso de ,Jltiplas 6hreasds dentro de uma aplicaç"o, todas em e:ecuç"o simult(nea,
por#m cada uma reali$ando tarefas diferentes.
+e tal modo 'ue, por estarem reali$ando tatefas independenres, cada thread possui o seu próprio conte:to de e:ecuç"o, alocaç"o de memória e controle de pilha de e:ecuç"o *0tac9.. código em e:ecuç"o em uma
6hread trabalha dentro de seu conte:to espec)fico, de modo 'ue várias outras documentações referem-se ao Kconte:to de e:ecuç"oK como sendo um sin-nimo de 6hread.
orkin! t"reads
+amos o nome de K=o6in: theadK 'uando s"o iniciadas mais de uma thread independente na aplicaç"o, e todas as threads iniciadas s"o colocadas em Kmodo de esperaK *idle., aguardando uma solicitaç"o de
processamento da aplicaç"o. ,ais de uma solicitaç"o pode ser reali$ada, e o nJcleo da aplicaç"o encarrega-se de distribuir os processamentos entre as threads disponçiveis. 6erminado o processamento de uma thread,
a mesma retorna ao Kmodo de esperaK, 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 finali$ar
uma nova thread para cada solicitaç"o de processamento.
4[

Sign up to vote on this title
UsefulNot useful