Vous êtes sur la page 1sur 26

Programao Advpl para WEB

Este tpico engloba todo o conhecimento e informaes necessrias para usufruirmos da tecnologia implementada na ferramenta Protheus e de sua Infra-Estrutura, para o desenvolvimento de aplicaes orientadas
Internet.
ob!etivo desta se"o # centrali$ar as informaes pertinentes ao desenvolvimento de pro!etos %E&, em uma ferramenta 'ue permita o acesso e atuali$aes destes dados de maneira rpida 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
tpicos deste grupo se!am lidos e assimilados, pois nos mesmos encontram-se as informaes '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 funes 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'uisies 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 prpria Intranet num ambiente de rede local, ou
publicar o endereo IP da m'uina com o servidor Protheus na Internet e e:ecutar funes atrav#s de @P7 ou simplesmente criar o seu prprio %eb 0ite com pginas <6,3 estticas ou din(micas.
Servio 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 pginas formatadas em padres
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 informaes
para o servidor. ,as adiante, ser mais fcil 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 pginas <6,3 enviadas de um diretrio
configurado no servidor. /dicionalmente ao envio e recebimento de pginas estticas formatadas, pode-se utili$ar a linguagem /dvpl do Protheus para processar pginas mistas, 'ue cont#m cdigo /dvpl e comandos
<6,3 de formata"o. 6ais pginas 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 funes compiladas no repositrio do Protheus, atrav#s de um re'uest <66P *por e:emplo, atrav#s de um P06 em um formulrio 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..
Pginas Dinmicas e Advpl ASP
2uando # utili$ado o servidor Protheus para desenvolvimento de aplicaes %eb, # poss)vel lanar m"o do recurso de cria"o de pginas 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 usurio uma pgina <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 instrues
/dvpl 'ue ser"o processadas no momento em 'ue a pgina for solicitada ao servidor Protheus, sendo poss)vel de forma prtica KmesclarK um conteJdo gerado por este processamento uma pgina <tml para
ser retornado o %eb &roBser.
Los tpicos abai:o relacionados, ser visto em mais detalhes as configuraes necessrias para atender estas re'uisies, as caracter)sticas particulares de cada uma delas, e as funes de infra-estrutura criadas para
au:iliar o desenvolvimento de aplicaes %eb.
/l#m da cria"o de ar'uivos, foi disponibili$ado no repositrio padr"o do Protheus as funes de infra-estrutura /p%ebE:, desenvolvidas para permitir um melhor aproveitamento dos recursos disponibili$ados pela
ferramenta Protheus para o desenvolvimento de solues %eb. Estas funcionalidades s"o e:ploradas no tpico Infra-Estrutura /p%ebE:.
0. E!ecuta"do #u"$es Advpl via HTTP
Princpio 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 pgina, 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 Funes
Para o retorno de pginas estticas, 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:tenses de 3in9 para permitir a e:ecu"o de funes /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 .
Caractersticas comuns do processamento de funes 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'uisies, 'ue seguem abai:o E
/ fun"o, se!a /dvpl ou uma fun"o compilada no @epositrio, 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 funes /dvpl 'ue foram escritas e:clusivamente para esta interface,
como por e:emplo as funes ,sg0top, /lert, e demais funes 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 aps a leitura dos tpicos sobre desenvolvimento de
funes .apl e desenvolvimento de funes .apB
Hma pgina /0P */ctive 0erver Pages. # uma pgina <6,3 contendo cdigo interpretvel 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 pginas /0P, do mesmo modo 'ue o Protheus utili$a o /+NP3. Hma pgina /0P # uma combina"o de script <6,3 e cdigo interpretvel. Lo /+NP3 /0P esse cdigo # padr"o :&ase, portanto a preocupa"o
maior da'ueles 'ue ! conhecem e trabalham com o Protheus e dese!am desenvolver pginas ativas para aplicaes %eb utili$ando essa facilidade # conhecer <6,3.
Caractersticas 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. / diferena # '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 funes /P3 simples, como e:plicado anteriormente no Item K+esenvolvendo >unes ./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 cdigo foi processado. Hm /r'uivo /P< gera no repositrio 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 clusula >HL76IL para criar outras funes dentro de um ar'uivo /P<. 7aso e:ista essa necessidade, tais funes 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 # obrigatria. 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 Hsurio ., 'ue possui o mesmo tratamento de Parser do aru'ivo /P< , gerando uma fun"o prefi:ada com 3O . / diferena # '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 Hsurio, e'uivalente uma Hser >unction .
/ssim como outros /0PQs, a diferencia"o entre script <6,3 e cdigo # efetuada atrav#s dos caracteres RS para indica"o de abertura de cdigo e ST para indica"o do encerramento de cdigo. Por e:emplo, o
<6,3 abai:o cont#m um pedao de cdigo /+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 cdigo entre os delimitadores ser e:ecutado, por#m o script colocado ao redor do cdigo 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 funes /P3 simples, decorre do fato de 'ue nas funes /P3 simples o desenvolvedor deve se preocupar em retornar todo o <6,3
necessrio para a correta e:ibi"o no %eb &roBser.
E tamb#m, como o /+NP3 /0P mistura o script <6,3 com o cdigo interpretvel, pode-se criar um ar'uivo /P< utili$ando o editor dese!ado *como o ,icrosoft >rontPage, por e:emplo. e inserir nele os cdigos
/dvpl necessrios entre as 6ags. utro detalhe importante # 'ue pode-se utili$ar as estruturas de flu:o da linguagem /+NP3 para repetir comandos do prprio 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 cdigo interpretvel separados pelos delimitadores, dentro de um mesmo ar'uivo.
6"o importante 'uanto mesclar cdigo interpretvel 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 variveis, 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 cdigo interpretvel, 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 cdigo /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 vrias 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
Princpio 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 pgina, 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 Funes
Para o retorno de pginas estticas, 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:tenses de 3in9 para permitir a e:ecu"o de funes /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 .
Caractersticas comuns do processamento de funes 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'uisies, 'ue seguem abai:o E
/ fun"o, se!a /dvpl ou uma fun"o compilada no @epositrio, 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 funes /dvpl 'ue foram escritas e:clusivamente para esta interface,
como por e:emplo as funes ,sg0top, /lert, e demais funes 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 aps a leitura dos tpicos sobre desenvolvimento de
funes .apl e desenvolvimento de funes .apB
5X. Pginas 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 pgina /0P */ctive 0erver Pages. # uma pgina <6,3 contendo cdigo interpretvel 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 pginas /0P, do mesmo modo 'ue o Protheus utili$a o /+NP3. Hma pgina /0P # uma combina"o de script <6,3 e cdigo interpretvel. Lo /+NP3 /0P esse cdigo # padr"o :&ase, portanto a preocupa"o
maior da'ueles 'ue ! conhecem e trabalham com o Protheus e dese!am desenvolver pginas ativas para aplicaes %eb utili$ando essa facilidade # conhecer <6,3.
Caractersticas 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. / diferena # '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 funes /P3 simples, como e:plicado anteriormente no Item K+esenvolvendo >unes ./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 cdigo foi processado. Hm /r'uivo /P< gera no repositrio 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 clusula >HL76IL para criar outras funes dentro de um ar'uivo /P<. 7aso e:ista essa necessidade, tais funes 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 # obrigatria. 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 Hsurio ., 'ue possui o mesmo tratamento de Parser do aru'ivo /P< , gerando uma fun"o prefi:ada com 3O . / diferena # '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 Hsurio, 'euivalente uma Hser >unction .
/ssim como outros /0PQs, a diferencia"o entre script <6,3 e cdigo # efetuada atrav#s dos caracteres RS para indica"o de abertura de cdigo e ST para indica"o do encerramento de cdigo. Por e:emplo, o
<6,3 abai:o cont#m um pedao de cdigo /+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 cdigo entre os delimitadores ser e:ecutado, por#m o script colocado ao redor do cdigo 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 funes /P3 simples, decorre do fato de 'ue nas funes /P3 simples o desenvolvedor deve se preocupar em retornar todo o <6,3
necessrio para a correta e:ibi"o no %eb &roBser.
E tamb#m, como o /+NP3 /0P mistura o script <6,3 com o cdigo interpretvel, pode-se criar um ar'uivo /P< utili$ando o editor dese!ado *como o ,icrosoft >rontPage, por e:emplo. e inserir nele os cdigos
/dvpl necessrios entre as 6ags. utro detalhe importante # 'ue pode-se utili$ar as estruturas de flu:o da linguagem /+NP3 para repetir comandos do prprio 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 cdigo interpretvel separados pelos delimitadores, dentro de um mesmo ar'uivo.
6"o importante 'uanto mesclar cdigo interpretvel 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 variveis, 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 cdigo interpretvel, 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 cdigo /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 vrias 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 pr01compilao . 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 funes contidas no repositrio 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 funes 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 funes devem 0E,P@E retornar uma string de caracteres. /ps o processamento da fun"o, essa string de retorno ser enviada
diretamente ao client <66P e este ser o responsvel 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 funes chamadas. Isso significa 'ue ao criar funes para serem utili$adas em resposta s re'uisies <66P, deve-se criar o cabealho da fun"o
com estes par(metros. L"o # obrigatrio utili$ar os mesmos nomes de par(metros sugeridos abai:o 'uando criar diretamente estas funes. Por#m, como s"o esses os nomes utili$ados no /+NP3 /0P e:plicado mas a
frente, # aconselhvel 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
validaes 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 formulrio <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 formulrio 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 informaes. 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 formulrio <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 tpico /+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 pgina, 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 cabealho 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 pgina <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 cdigo abai:o e salve o ar'uivo como %E&+E,.P@%. /ps compilar o programa, basta chamar em um %eb &roBser uma H@3 comoE
httpE==localhost=uOBebdemo.apl`codW55555UadescW+E07@I7/ + P@+H6a'tdW4
7digo 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 parmetro informado na linha de URL.'
Else
For i := 1 To Len(__aProcParms)
cHTML += '<p>Parmetro: ' + __aProcParms[i,1] + ' - Valor: ' +
__aProcParms[i,2] + '</p>'
Next i
Endif
Return(cHTML)

5mporta"te
Para crias as funes '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 funes no /P1E utili$ando o /P1 I+E para a
edi"o e para a compila"o.
Lote 'ue no caso de funes do usurio *Hser >unction. o nome chamado na H@3 do &roBser tamb#m dever conter o HO no comeo da fun"o, por e:emploE
httpE==servidor=uO%eb+emo.apl
)o"#igurao 67"ima
Em tpico parte # e:plicada toda a configura"o referente se"o http do Protheus 0erver. / configura"o abai:o # a m)nima necessria 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 horrio 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 responsvel por abrir o ambiente necessrio o processamento, conectar com o &anco de
+ados caso necessrio, reali$ar o processamento e retornar a 0tring <tml ao %eb &roBser.
Este ambiente criado # fechado imediatamente aps o t#rmino do processamento, o 'ue e:ige muito do 0ervidor da aplica"o em se tratando de uma aplica"o Beb com vrios usurios efetuando acessos simult(neos.
Para atender com mais eficiIncia s re'uisies de processamento de um pro!eto Beb, foi implementada no Protheus a tecnologia de K%or9ing 6hreadsK, e:plicada em mais detalhes no tpico K+esenvolvimento de
>unes .apBK.
0.. +ese"volvime"to de 3u"$es .APW
Diferena de Funcionamento entre links .APL e .AP
7omo visto em tpicos anteriores, ao desenvolver uma fun"o para ser e:ecutada via lin9 .apl, a fun"o deve ser responsvel pela abertura do ambiente e iniciali$aes necessrias para um processamento 'ual'uer, e
aps ser finali$ado este processamento, o ambiente montado e utili$ado # fechado automaticamente, de modo 'ue cada re'uisi"o de processamento de usurio 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 aplicaes %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 memria do servidor em modo de espera *stand-bA., de modo 'ue, um usurio, 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, aps 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 usurio navegando no site = aplica"o %eb.
/ utili$a"o de %or9ing 6hreads e:ige a defini"o m)nima de duas funes /dvpl, 'ue ser"o e:ecutadas em dois momentos distintos E / primeira fun"o # responsvel pela iniciali$a"o do ambiente comum de
e:ecu"o de re'uisies, devendo estabelecer cone:"o com a &ase de +ados utili$ada, abrir as tabelas utili$adas no 0ite e preparar as variveis comuns de utili$a"o da aplica"o. / segunda fun"o ser responsvel
por encapsular a re'uisi"o do usurio 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 vrios usurios '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 configurveis 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 diferenas, 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 configuraes de %or9ing 6hreads, %E& e %E&E;.
orkin! T"reads #$
Para nos utili$armos das %or9ing 6hreasd %E&, devemos criar as funes responsveis 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'uisies, 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 memria aps 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 prprio 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 funes responsveis 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 memria aps 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 verses 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 # responsvel 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 informaes do <eader <66P de retorno de processamento de uma re'uisi"o e
utili$a"o de variveis tipo 0E00IL por usurio %eb. Estes recursos s"o detalhados nos tpicos %E&E; - +etalhamento de pera"o e posteriores.
& Futuro das aplicaes #$ no Prot"eus
/ps o desenvolvimento de aplicaes em ambiente %E&E;, e dados os timos resultados obtidos, recomenda-se fortemente 'ue as aplicaes 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 repositrio padr"o do ,icrosiga Protheus Y , as funes 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 tpicos Infra-Estrutura /P%E&E; e posteriores , englobando comandos , funes , e:emplos e dicas de utili$a"o destes recursos.
09. )o"#igura"do o Server Protheus para HTTP
/s configuraes de http do 0erver Protheus permitem a configura"o de sites estticos 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 configuraes <66P do 0erver Protheus. /s sees abai:o devem ser inseridas no ar'uivo de configuraes do
servidor Protheus * mpYsrv.ini .
Confi!ura'o (nima
>http?
,nable%1
Path%"$@ApAData@http
bserva"oE Nale lembrar 'ue , aps 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 pginas estticas , com o <66P na porta padr"o *Y5., e utili$ando o diretorio em cEf/pOdataf<ttp como diretrio rai$ de
publicaes %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*uisies .apl
/gora, vamos habilitar este host para atender re'uisies de funes, atrav#s de lin9 .apl. Para tal , precisamos apenas do nome de um Environment *ambiente. configurado no .ILI . Podemos usar o prprio ambinete
do E@P . &asta acrescentarmos na se"o http a chave EnvironmentWRnomeOdoOambienteT , para 'ue este ambiente passe a atender o processamento de funes /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 funes , 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
horrio atual no servidor no formato <<E,,E00
Atendendo ) re*uisies .ap+
/ configura"o para atendimento de re'uisies 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 funes responsveis 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'uisies .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 funes 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'uisies .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 mdulo espec)fico, e n"o
estamos utili$ando um mdulo %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'uisies .]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'uisies via .apl e via .apB s"o independentes , # poss)vel configurar a se"o http para 'ue Environments diferentes respondam re'uisies .apl e .apB , ou 'ue n"o se!am atendidas re'uisies .apl ,
apenas .apB .
Confi!urando a se'o "ttp para multi,"ost
6odas as configuraes 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 diretrios 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 configuraes 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'uisies .apl ser"o atendidas pelo /mbiente Env6PZU5 .
Htili$ando este tipo de configura"o, podemos subir vrios sites diferentes na mesma aplica"o servidor Protheus, cada 'ual com o seu diretrio rai$ de publicaes , seus ambientes independentes, atendendo ou n(o
re'uisies .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 diretrio virtual, criando desse modo um endereo de acesso composto por um host e um
diretrio, 'ue pode se comportar como um outro site, com os ar'uivos publicados em um path espec)fico, 'ue poder atender re'uisies de lin9s .apl e=ou .apB sob um outro ambiente e configura"o distinta.
Htili$ando diretrios virtuais, # poss)vel, dentro do mesmo host, instalar vrias aplicaes Beb independentes, todas acess)veis sob o mesmo endere base, alterando apenas o diretrio de acesso. Por e:emplo,
utili$ando como host principal o nome do e'uipamento , gservertstg, podemos instalar o mdulo %eb gPortal Protheusg sob o host gservertst=portalg, o mdulo 67> sob o host gservertst=rhonlineg, e no host gservertstg
podemos configurar um site esttico em <tml , com uma apresenta"o institucional e lin9s para os demais mdulos.
&.servaes Importantes
/o configurarmos um <ost, ele herda as configuraes de atendimento de re'uisies .apl e .apB especificados na se"o <66P d +e modo 'ue o host do e:emplo continuar a atender re'uisies .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 configuraes 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 disponivel na Beb , utili$ando tamb#m o host httpE==srvteste . Por#m , o host srvteste ! aponta para o diretrio 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 diretrio 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 endereo 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 configuraes 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'uisies de uma aplica"o Beb, foram desenvolvidas funes de apoio, miscel(nea
e infra-estrutura, compiladas no repositrio 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 funes , demos o nome de g3ib de
Infra-Estrutura /P%E&E;g, 'ue engloba atualmente os tratamentos comuns s funes de iniciali$a"o de ambiente e cone:"o * atendimento de re'uisies http via lin9 .apB ., com seus respectivos pontos de
entrada, comandos e funes de miscel(nea comuns os pro!etos de solues Beb integradas com o E@P.
Como utili/ar este recurso no desenvolvimento de solues 0
/s funes pertinentes Infra-Estrutura /P%E&E; ! est"o implementadas no repositrio 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 aplicaes 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 tpicos pertencentes este grupo s"o direcionados o desenvolvimento de solues Beb utili$ando as funes 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 funes publicados, e:emplos de cdigos /dvpl utili$ando estes recursos, configura"o da ferramenta e mensagens de
ocorrIncias de erro das funes e comandos, com poss)veis causas e solues.
C fortemente recomendado 'ue os documentos constantes neste grupo fossem apreciados, antes de aprofundar-se nas informaes dos pr:imos tpicos.
01. *ecepo 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 informaes
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 cdigo-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'uisies 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 informaes recebidas atrav#s do <eader do pacote <66P, foi criado o alias virtual <ttp<eadIn, 'ue al#m de consultar as informaes constantes no <eader <66P proveinente da
re'uisi"o do usurio, permite tamb#m acesso propriedades da cone:"o atual do usurio, como o IP do usurio 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 variveis KsessionK por usurio do site, com controle de identifica"o nativa da ferramenta atrav#s de um coo9ie de identifica"o , chamado
0E00ILI+. Lo tpico K/lias Nirtual <ttp0essionK # e:plicado em detalhes o funcionamento deste mecanismo.
Este recurso nos permite criar , atricuir conteJdo e consultar conteJdo de uma varivel relacionada o usurio 'ue est reali$ando uma re'uisi"o http. Podemos arma$enar em uma varivel de 0ession os seguintes
tipos de variveis E / *arraA. , 7 *character. , + *data., 3 *lgica. e L *num#rica. . L"o s"o suportados *b!etos. e=ou & *7ode &loc9s..
Limitaes 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 formulrio <6,3, para serem recuperados com sucesso pelos alias virtuais correspondentes.
/ nomenclatura de campos do formulrio deve obedecer regra de cria"o de variveis em /dvpl E campo do formulrio 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 espas, 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
recupervel 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 varivel 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 prtico restrito aplicaes onde ha!a a necessidade impl)cita de termos uma informa"o relacionada o broBser utili$ado pelo usurio atual, 'ue devam ser interpretadas
independente do usurio estar logado ou n"o * isto # , independam diretamente de sessions ..
Hm e:emplo prtico disto # o desenvolvimento de um site onde o conteJdo din(mico # retornado ao usurio em mais de um idioma. La entrada do site, apresentamos um formulrio ao usurio onde o mesmo ir
escolher o idioma de sua preferIncia. ,esmo 'ue a session de login deste usurio e:pire no servidor, o coo9ie com o idioma selecionado ainda est no &roBser, de modo 'ue a pr:ima re'uisi"o do usurio pode ser
codificada para direcion-lo para a pgina 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 Jsurio, e um coo9ie de usurio criado para identificar no &roBse 'ual # o idioma utili$ado pelo usurio atual.
cHserId EW <ttp7oo9ies-TH0E@I+ == @etorna o 7oo9ie identificador do usurio 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 formulrio 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@servao 5mporta"te A
2ual'uer par(metro no <eader <66P 'ue contenha um ou mais caracteres invlidos para a nomenclatura de variveis /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 variveis do tipo KsessionK, relacionadas o usurio 'ue reali$ou a re'uisi"o atrav#s do &roBser.
Para diferenciar os usurios 'ue est"o navegando num site, o Protheus busca por um coo9ie identificador de usurio, 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 usurio.
2uando um usurio 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 varivel de session, ela pode ser acessada nas pr:imas re'uisies provenientes deste mesmo usurio. 7aso uma varivel 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 usurio 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 varivel 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 Hsurio n"o est logado.
conout*KHsuario n"o est logadoK.
Else
== 0ession ! criada, o usurio 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 usurio chamou esta fun"o espec)fica. +amos o nome da session de ,A7ounter, 'ue ir conter um nJmero. Lo primeiro acesso do usurio, a
session n"o e:iste * W LI3 ., e # criada com o valor num#rico U *um.. / partir das pr:imas re'uisies reali$adas ao Protheus atrav#s desta pgina * 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 usurio.
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
/ps 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 , pea 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'uisies simult(neas de lin9s ./P% em paralelo , desde 'ue este!am dispon)veis o numero de %or9ing 6hreads necessrio 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'uisies de .apB para o Protheus 0erver , e caso e:tistam X Bor9ing threads dispon)veis na'uele momento , as trIs re'uisies s"o
atendidas em paralelo.
Por outro lado , se em duas destas trIs re'uisies fa$-se necessria a atuali$a"o e=ou consulta a uma varivel 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 solicitaes de Processamento 0e'uencial * 7ritical 0essions . , foi montado um es'uema de 3oc9 de 0ession de Hsurio automtico, com
libera"o automtica aps 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 prtica e funcionamento deste conceito , partimos de um ambiente hipot#tico utili$ando X frames , onde um usurio reali$a uma re'uisi"o fun"o 'ue retornar o source <6,3 da pgina
de frames, e a mesma ao chegar no &roBser, fa$ o mesmo reali$ar as trIs re'uisies simultaneamente, todas elas referentes ao mesmo usurio. Por#m , o primeiro e o segundo frames reali$am uma opera"o 'ual'uer
com uma ou mais variveis da 0ession do usurio , e o terceiro frame reali$a um outro processamento 'ue n"o depende da consulta de nenhuma varivel da 0ession E /s trIs re'uisies 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
varivel de 0ession da'uele usurio , 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 usurio 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 vivel para o usurio 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 varivel 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'uisies de pginas /0P por usurio, de modo 'ue , caso o mesmo usurio solicite trIs frames .asp , as re'uisies
de processamento chegar"o ao 0ervidor /0P simultaneamente , mas a bandeira de processamento # unica por pgina .asp , sendo liberada apenas apos o t#rmino do processamento da pgina , de modo 'ue , mesmo 'ue
nenhuma das pginas faa uso de sessions , todas as pginas deste usurio ser"o processadas em se'uIncia.
0C. E"vio simult;"eo de HT64 ao BroDser
/s aplicaes 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 pgina /dvpl-/0P * ./P< e=ou ./<H . .
Este recurso # habilitado atrav#s do Protheus I+E, nas opes 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 varivel
/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 funes 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 prpria rotina de tratamento de erro pode ser configurada para enviar um e-mail o /dministrador do sistema. Para tal, # necessrio inserir as chaves abai:o na se"o
do ambiente em uso para o site E
Error0,6PW *endereo do servidor 0,6P a ser usado para o envio do e-mail .
Error,ailW * um ou mais endereos de e-mail a receber op e-mail de erro, separados por virgula .
Error>romW * um e apenas um endereo 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 necessrio .
ErrorPassBordW * senha do usuario de login no servidor de 0,6P, caso necessrio .
e.Admin , Lo!in alternativo
/ infra-estrutura /P%E&E; e:ige um usurio e senha para entrar no mdulo de administra"o %eb/dmin. Para validar o login, # utili$ado o ar'uivo de senhas do E@P. usurio deve ser o K/dministradorK ou
pertencer ao grupo de administradores para ter acesso o %eb/dmin. 7aso n"o se!a vivel 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 usurio 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 repositrio de ob!etos em uso no site, sem 'ue se!a necessrio parar o servidor para isso. Por default , a pasta de upload chama-se
Kf0Bap@PfK, e deve e:istir na estrutura de diretrio do ambiente utili$ado, a partir do diretrio 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 solues, 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 .
3anando m"o da e:periIncia em desenvolvimento de aplicaes Beb ad'uiridas nos Jltimos anos, nos tpicos abai:o est"o relacionadas algumas medidas tomadas no desenvolvimento de aplicaes 'ue nos s"o muito
Jteis no decorrer de um pro!eto.
9omenclatura de Funes
Para o desenvolvimento de aplicaes Beb, foi criado o K0tatementK %E& >HL76IL para a declara"o de funes referentes pro!etos Beb. Este comando , na prtica , 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 , pginas /P< = /<H, recomenda-se separar o processamento da Interface, do seguinte modo E 7riar uma %eb >unction para a chamdada de umna pgina 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 cdigo-fonte escrito na %eb >unction se!a responsvel para gerar as informaes a serem
disponibili$adas para o usurio , e o ./P< contenha apenas a KmscaraK destas informaes e o m)nimo de instrues /dvpl poss)vel para a montagem da pgina. Este processo facilita a manuten"o de amobos
os cdigos, pois o %eb +esigner 'ue ir reali$ar um a!uste no /P< n"o ter 'ue KdesviarK do fonte /dvpl inserido na pgina , e o /nalista = Programador 'ue far a manuten"o no cdigo /dvpl preocupar-se- apenas
com o cdigo responsvel para a gera"o dos dados 'ue ser"o mascarados.
3tili/a'o das Funes de Infra,#strutura
/trav#s dos comandos e funes disponibili$adas na Infra-Estrutura /P%E&E;, n"o tImos a necessidade de recriar partes comuns de cdigo 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 prtica 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 bsicas 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 horrio 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 conexo com o TOP'
Endif
// Verifica se as tabelas principais esto abertas ....
If select('SA1')=0
Return 'Tabela SA1 no est aberta !!!'
Endif
If select('SC5')=0
Return 'Tabela SC5 no 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 clusola 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 varivel 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 cdigo. / 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 varivel 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 cdigo. / 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 funes 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 clusula 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 varivel c<tml , e o processamento do programa ser desviado para a linha do cdigo-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 prtico abai:o , utili$amos em um cdigo 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 padro para proOetos -ue utiliPam APWEBE: a criao do ar-uivo QE"v,ser.aplQ/ especi#icame"te para a de#i"io 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 preparao 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 inicializao de cada Working Thread ( ONSTART )
a responsvel por preparar o ambiente para atender s requisies WEB de links .apw
No recebe parmetro algum da lib , e deve retornar .T. caso tenha inicialziado com sucesso
ou .F. em caso de falha de inicializao .
---------------------------------------------------------------------------- */
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 requisio de um link .APW
Recebe como parmetro o nome da funo 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 funo originalmente solicitada executada pela lib.
Caso contrrio, a funo original no 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 ""
Funo chamada imediatamente Apos a execuo de uma requisio .APW
Recebe como parmetro o nome da funo executada, e permite tambm 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()
Funo chamada no fechamendo do ambiente de uma working Thread. Apos a execuo deste ,
a Thread utilizada eliminada da memria .
------------------------------------------------------------------------------- */
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 usurio ser
eliminada da memria 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 memria...")
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 crtico (tratamento
de erro ) , esta funo deve ser o mais suscinta e simples possvel , no 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 pgina. O Administrador do sistema ser notificado desta '
cCustomHtml += 'ocorrncia . 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" ,
prprio 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 configuraes 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 dimenses , 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","---Informao 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) // ---Informao 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) // ---Informao 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 visualizao 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 formulrio <tml.
Local cHtml := ""
Local cInput := ""
// Conteudo do campo com tags HTML intepretveis
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 situaes espec)ficas.
/*
Em uma determinada funo , caso um parmetro no seja passado , o usurio dever retornar a uma outra tela
*/
...
If empty(httpget->meuparam)
// Parmetro no 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 situaes espec)ficas.
/*
Em uma determinada funo , caso um parmetro no seja passado , o usurio dever retornar a uma outra tela
*/
...
If empty(httpget->meuparam)
// Parmetro no 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 := 'acentuao'
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 converses especficas para cada tipo de contedo seria o equivalemte ao cdigo 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 informaes do retorno da chamada de duas funes bsicas 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"tuao ApWe@E:
Lo e:emplo abai:o, vemos a diferena de comportamento entre as funes bsicas da 3inguagem /dvpl Hpper*. e 3oBer*. , e a fun"o de Infra-estrutura 7apital*., em rela"o s funes da Infra-estrutura
/P%E&E; Hpper/ce*. , 3oBer/ce*. e 7/pital/ce*. , 'uando utili$amos caracteres acentuados.
cRetorno := ""
cFrase := "no h EXPLICAES considerando excesses PARA O inexplicvel."
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 varivel cRetorno dever conter :
Original .......... no h EXPLICAES considerando excesses PARA O inexplicvel.
Upper() ........... NO H EXPLICAES CONSIDERANDO EXCESSES PARA O INEXPLICVEL.
Lower() ........... no h explicaes considerando excesses para o inexplicvel.
Capital() ......... No H Explicaes Considerando Excesses Para O Inexplicvel.
UPPERACE() ........ NO H EXPLICAES CONSIDERANDO EXCESSES PARA O INEXPLICVEL.
LOWERACE() ........ no h explicaes considerando excesses para o inexplicvel.
CAPITALACE() ...... No H Explicaes Considerando Excesses Para O Inexplicvel.
*/
5"#ra1Estrutura APWEBE: 1 E!emplos das #u"$es HTO) e )TOH
Lo e:emplo abai:o , utili$amos as funes cton e ntoc para reali$ar converses de nJmeros em base decimal para outras bases num#ricas e vice-versa.
nNum1 := CTON('01101001',2) // Converte binrio 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 binrio 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
3gico Esta fun"o sempre retorna .6.
+escri"o
/trav#s da fun"o /p%E:/ddErr*., podemos acrescentar uma string de informaes adicionais em um buffer em memria, 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 informaes.
UX
AT#9:;& E Esta fun"o deve ser apenas utili$ada em casos de necessidade de obten"o de informaes espec)ficas acerca de uma ocorrIncia de erro n"o reprodu$ida em ambiente de testes e=ou n"o depurvel, pois
seu uso desnecessrio 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 vlidos 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 - binrio - 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 converses 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 converses, 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 pgina /P< = /<H.
+escri"o
/trav#s da fun"o E:ecInPage*., e:ecutamos uma pgina /P< passada como par(metro. / fun"o dever retornar a 0tring <6,3 correspondente pgina processada.
Por#m a fun"o E:ecInPage*. reali$a tratamentos adicionais padr"o relacionaodo o comportamento dos Pro!etos %E& referentes customi$aes, da segunte maneira E
U. Primeiro # verificado se e:iste uma pgina /<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 necessria a e:ecu"o de uma pgina /P< ou /<H e o n"o-envio da mesma para o &roBse] por e:emplo para a gera"o de um cdigo <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 aps 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
3gico @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 configuraes 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 funes de Infra-Estrutura /P%E&E;.
O@servao A A data i"#ormada pela verso "o correspo"de 8 ultima compilao do *PO de um determi"ado ProOeto WEB/ mas sim 8 data de release da 45B de 5"#ra1Estrutura APWEBE:.
Tabela A
Sim@olo +escrio
// /no de gera"o da 3ib
,, ,Is da gera"o da 3ib
++ +ia da gera"o da 3ib
<< <orrio da gera"o da 3ib
mm ,inutos do <orrio 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 memria, 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 interpretveis.
@etorno
6ipo +escri"o
7aracter 0tring original com os caracteres interpretveis <tml R T a g convertidos para caracteres n"o-interpretveis.
+escri"o
/ >un"o <6,3L6/D0 converte as 6ags interpretveis de uma 0tring <6,3 para 6/D0 n"o interpretveis. 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
3gico / 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 funes 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 endereo de e-mail.
@etorno
6ipo +escri"o
7aracter @etorna .6. caso a sring recebida como par(metro atenda s definies de nomenclatura vlidos para um endereo 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 formto vlido respeitando a regra para nomenclatura de
endereos de e-mail.
*egra A Hm e-mail # considerado vlido 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 binria 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@servao 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 pgina=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 clusula %<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:presses 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.
bservaes 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 comparaes 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 clusula >@, , 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 clusula %<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:presses de filtro de dados para considerar o campo +OEO3OEO6O da*s. tabela*s. passada*s. como par(metro.
&.servaes <
/ ordem de compara"o de campos na clusula %<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 clusula %<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 clusula >@, , 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 clusula %<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:presses 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@servao 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 clusula >@, , 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 informaes.
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 anlise 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 rpida 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@servao A Ape"as sero 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 varivel /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 varivel para anlise. Internamente , apenas # utili$ado para prefi:ar o retorno das informaes da NarInfo.
:Nar *2ual'uer. Narivel de 'ual'uer tipo a ser e:aminada
n,argem Lum#rico 7orresponde margem es'uerda inicial de espaos da 0tring de retorno , multiplicado por 1. +efault W 5
l<tml 3gico Identifica se a 0tring de retorno ser montada em formato <tml *.6. = +efault . ou /07II *.>..
lEcho 3gico +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 anlise da varivel. 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 informaes sobre o conteJdo de uma varivel de memria /dvpl ,
de 5ual5ue tipo 9
7ada tipo de varivel 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 varivel /dvpl 'ue deve e:istir no escopo de variveis. 7aso a varivel n"o e:ista, o processamento # abortado com a ocorrIncia de erro gNariable does not
e:istg . Para saber se uma determinada varivel e:iste no escopo da e:ecu"o da fun"o atual, deve ser utili$ada a fun"o /dvpl 6iPE*., onde passamos a varivel 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 informaes 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'uisies de %eb0Ervices . , e ther7ontent * caso o conteJdo postado n"o se!a um te:t=html .
Esta fun"o retorna uma pgina <tml com todas estas informaes, e # utili$ada no desenvolvimento de pro!etos. 'uando temos a necessidade prtica de recuperarmos todas as informales provenientes de uma
re'uisi"o <66P. /dicionalmente , a fun"o %ebInfo
Por e:emplo, com o Protheus configurado para atender re'uisies 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
+escrio Y )ausa A La Infra-Estrutura /p%ebE:, de acordo com o mdulo %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
Soluo A Nerifi'ue o fonte do ponto de entrada e assegure-se 'ue o mesmo est retornando um valor /dvpl do tipo K3K 3gico.
VAPWE:E**W0001X 5H<A45+ APWE: )A44
+escrio 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 funes espec)ficas da linguagem 'ue
n"o podem ser e:ecutadas diretamente neste tipo de ambiente, por tratarem-se de funes e:clusivas para processamentos iniciados atrav#s de um @emote, e funes 'ue n"o permitem chamada direta via lin9. 7aso
alguma destas funes 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
+escrio 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 mdulo Beb utili$ado, pode ser chamada uma fun"o
intermediria bic, antes do processamento da fun"o chamada no lin9 ou depois do processamento conclu)do.
/ lib e:ige 'ue estas funes internedirias 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 varivel retornado #
mostrado em b;c e a %or9ing 6hread # finali$ada com esta ocorrIncia de erro.
Soluo A Nerif'ue o cdigo-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
+escrio 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 invlido retornado
Soluo 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.
+escrio 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 funes 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 funes 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.
Soluo 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
+escrio 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 clusula 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.
Soluo 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
+escrio Y causa A /o utili$armos a fun"o E!ec5"PageLM/ no desenvolvimento de aplicaes utili$ando as funes de infra-estrutura /p%ebe:, a mesma possui tratamento automtico para buscar primeiramente por
uma pgina /<H compilada no repositrio de ob!etos do ambiente. 7aso n"o se!a encontrado uma pgina .ahu, a fun"o procura por uma pgina .aph. 0e nenhuma pgina com o nome especificado n"o for encontrada,
o processamento # abortado com esta ocorrIncia de erro.
Soluo 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 pgina chamada est realmente presente e=ou foi compilada no repositrio 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
+escrio 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\
Soluo 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
+escrio 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.
Soluo 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+
+escrio Y causa A 2uando e:ecutamos uma fun"o em uma =o6in: thead iniciali$ada com as funes de infra-estrutura /p%ebE:, a fun"o #i"alLM, utili$ada internamente pelas funes 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.
Soluo 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 funes da infra-estrutura E@P, no caso de uma ocorrIncia fatal 'ue impea
um determinado processamento, e ganhou esta prote"o na 3ib /p%ebE: para permitir o desenvolvimento de aplicaes 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.
+escrio 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
Soluo 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 cdigo-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(:
+escrio 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
Soluo 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 cdigo-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.
+escrio 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
Soluo 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 cdigo-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(:
+escrio 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
Soluo 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 cdigo-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
+escrio Y causa A Esta ocorrIncia de erro indica 'ue as configuraes do Mob b;;;c, de =o6in: theads para utili$a"o no ambiente /p%ebE:, est identificado com um 6iPE b;;;c invlido.
+urante a iniciali$a"o de uma =o6in: thead, # verificado o tipo do Mob configurado no ar'uivo de configura"o. /penas s"o vlidos os valores %E& e=ou %E&E;, de acordo com o mdulo Beb em uso. 7aso a
configura"o especifi'ue um 6iPE diferente de %E& ou %E&E;, a configura"o n"o # vlida, e a =o6in: thead # abortada antes de estar dispon)vel para atender re'uisies de lin9s .apB, gerando uma ocorrIncia
de erro no console do servidor Protheus, tamb#m gravada no ar'uivo E@@@.3D
Soluo 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 mdulo em
uso.
VAPWE:E**W001X ,HAB4E TO ?ET TOB HA6E
VAPWE:E**W001X ,HAB4E TO ?ET TOB HA6E
+escrio 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.
Soluo 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 mdulo 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.
+escrio Y causa A Esta ocorrIncia de erro # reprodu$ida 'uando, ao configurar um mdulo Beb bic, a fun"o b;c de iniciali$a"o ou cone:"o referente ao mdulo n"o foi encontrada no repositrio de ob!etos do
ambiente em uso pela aplica"o Beb.
0olu"o E 7ertifi'ue-se 'ue o repositrio em uso atualmente possui as funes 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
+escrio Y causa A /o utili$ar as funes 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 ps-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.
Soluo A 7ertifi'ue-se 'ue no cdiugo 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 padro 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.
+escrio Y causa A Esta ocorrIncia de erro # reprodu$ida 'uando, ao configurar um mdulo Beb bic, a fun"o b;c de iniciali$a"o, cone:"o ou finali$a"o, referente ao mdulo, n"o foi encontrada no repositrio de
ob!etos do ambiente em uso pela aplica"o Beb.
Soluo A 7ertifi'ue-se 'ue o repositrio em uso atualmente possui as funes 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
+escrio Y causa A 2uando da configura"o de um mdulo Beb para os tratamentos internos das funes de infra-estrutura /p%ebE:, devemos especificar uma sigla de um mdulo %eb vlido e tratado pela lib de
infra-esturtura. s mdulos 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 vlida 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.
Soluo A Nerifi'ue a chave de configura"o 0ID/%E& e preencha-a com uma sigla de mdulo vlida para a vers"o de repositrio = 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..
+escrio Y causa A 2uando utili$amos a interface de testes de Beb services client da ferramenta %eb/dmin, caso ocorra uma falha estrutural no servio 7lient ou uma impossibilidade de recuperar todos os dados
postados no fomulrio 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
+escrio 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.
Soluo 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#$#%
+escrio Y causa A Esta ocorrIncia de erro informa 'ue a configura"o de =o6in: theads utili$ada para este mdulo 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&.
Soluo A Nerifi'ue a configura"o das Bor9ing threads deste mdulo 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#$
+escrio Y causa A Esta ocorrIncia de erro informa 'ue a configura"o de =o6in: theads utili$ada para este mdulo 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;.
Soluo A Nerifi'ue a configura"o das Bor9ing threads deste mdulo 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#
+escrio Y causa A Esta ocorrIncia de erro, indica 'ue n"o h mais licenas 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 cdigo de erro do <ard3oc9 utili$ado para controle de licenas.
Soluo 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
+escrio 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 licenas Beb * Protheus i . da aplica"o e:pirem. nJmero de dias 'ue restam para as licenas vencerem # especificado adicionalmente em bLLc.
Soluo A Providencie a atuali$a"o das licenas 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 mdulo K,/eK * ,a9ira ., s"o disponibili$ados os pontos de entrada relacionados neste tpico, para permitir customi$ar e interceptar os eventos
de Iniciali$a"o da 6hread * HO0tart%ebE: ., atendimento a re'uisies de lin9s .apB antes de processar a fun"o principal * HO7onnect%ebE: ., atendimento a re'uisies de lin9s .apB aps processada a fun"o
principal * HO@eset%ebE: ., finali$a"o da 6hread * HO>inish%ebE: ., finali$a"o de session de usurio 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 mdulo do padr"o, estes pontos de entrada n"o tem efeito. >ica a crit#rio de cada mdulo a disponibili$a"o de pontos de entrada para interceptar estes eventos.
Para saber 'uais pontos foram implementados para um mdulo Beb do padr"o, deve ser consultada a documenta"o do mdulo 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
3gico
l0ucess corresponde o status de montagem de ambiente. 7aso o ambiente tenha sido montado com sucesso , o ponto de entrada deve retornar .6. , caso contrrio .>. . Hma ve$
retornado .>. , o Protheus ir eliminar esta %or9ing 6hread da memria.
+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 necessrio o atendimento das re'uisies de processamento via &roBser , atrav#sde lin9s .apB, tais como a abertura de dicionrios e cone:"o com o &anco de +ados.
4U
Drupos @elacionados
Principal / A Tecnologia Protheus / Programao 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 contrrio , 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 aps o processamento de uma re'uisi"o de processamento /dvpl atrav#s de um %eb &roBser utili$ando as configuraes e 3ib /P%E&E;.
Ele permite 'ue se!a e:ecutado um processamento adicional aps 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 usurio.
@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 usurio 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 usurio. 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 memria as sessions do usurio 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 usurio 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 usurio.
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 instrues ao usurio.
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"aliPao da Thread L ,W35H5SHWEBE: M e "a #i"aliPao 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 espaos
@evis"oE UU=U4=455X
2uando passamos par(metros de uma pgina para outra , via 'uerA string *H@3. , devemos ter o cuidado de n"o dei:ar espao*s. em branco entre par(metros na montagem da H@3. 2uando utili$amos o Internet
E:plorer os espaos em branco s"o convertidos *n. automativamente para a se'uIncia 0tring S45, por#m 'uando utili$amos o Letscape, 'uando colocamos um espao em branco em um par(metro , o Let0cape
IDL@/ tudo o 'ue vem aps o primeiro espao 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 espaos 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 espaos 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@servao 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 formulrio <6,3 com um K7ombo &o:K * tag R0E3E76T do <6,3., de sele"o Jnica , e 'ueremos saber 'ual o valor 'ue o usurio 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 cdigo 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 cdigo 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 pgina no IE, cu!o destino ser o frame atual ou pgina 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.
Soluo A Htili$e a instru"o Mava0cript Di"doD.locatio" para atuali$ar o endereo 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
Nerses /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 necessrio uma pgina 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 pgina 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
Nerses /nteriores
Para visuali$ar o conteJdo de um campo ,E, em uma pgina <6,3 , devemos reali$ar algumas converses 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-espaada , considerando os cdigos 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 cdigos 7@3> pela tag KRbrTK , para apenas reali$ar um pulo de
linha no fim do pargrafo. /penas para te:tos de E:emplos de 7digo /+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 interpretveis 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
Nerses /nteriores
Em <tml, para setar um refresh automatico da pgina 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 funes 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 cdigo abaixo representa o arquivo ms01.APH, que contm 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 cdigo abaixo representa o arquivo ms02.APH, que contm a parte do ormu!"rio
<html>
<head>
<title>ADVPL ASP</title>
</head>
<script language="javascript">
//Codigo JavaScript no qual no permite que o formulrio 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 Formulrio" );
return;
}
oFrm.action = "w_ms03.apw";
oFrm.submit();
}
48
</script>
<body>
<h2 align="center"> Formulrio</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>Endereo : <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 cdigo abaixo representa o arquivo ms0#.APH, que contm 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>Endereo;</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 cdigo abaixo representa o arquivo ms01.PRW, que contm as funes escritas em ADVPL ASP
#INCLUDE "PROTHEUS.CH"
#DEFINE ID "Admin"
#DEFINE SENHA "123"
web function ms01()
//A funo executada quando chamada atravs do browser.
return h_ms01()
web function ms02()
//Verifica se a primeira vez q usurio 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 no informados!!"
endif
//Verifica usurio e senha.
if HttpPost->txt_Nome != ID
return "Usurio Invlido!!"
endif
if HttpPost->txt_Senha != SENHA
return "Senha Invlida!!"
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 cdigo abaixo representa o arquivo &ms01.APH&, que contm 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 cdigo abaixo representa o arquivo &up!oad.APH&, que contm um ormu!"rio para exibir a!guns dados do aquivo enviado.
A parte mais importante desse cdigo, 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 cdigo abaixo representa o arquivo &up!oad.P./&, que contm 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-proprietria, 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 informaes. 6rata-se de um protocolo gen#rico, 'ue pode ser utili$ado para muitas outras aplicaes al#m de transferIncia de hAperte:to, como
nomear servidores e trocas de informaes entre sistemas integrados, utili$ando-se suas e:tenses, cdigos de erro, m#todos de re'uisi"o e cabealhos *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 comeo, 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 comeo, 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 prprio conte:to de e:ecu"o, aloca"o de memria e controle de pilha de e:ecu"o *0tac9.. cdigo em e:ecu"o em uma
6hread trabalha dentro de seu conte:to espec)fico, de modo 'ue vrias outras documentaes 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 disponiveis. 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[