Escolar Documentos
Profissional Documentos
Cultura Documentos
AP5 Web - Conectividade e AdvPL ASP
AP5 Web - Conectividade e AdvPL ASP
SUMÁRIO.....................................................................................................................................................................2
A utilização da API de acesso e do controle ActiveX é mais indicada para aplicações desenvolvidas em outras
linguagens e que necessitem interagir com o AP5. Já com o acesso via Internet, é possível criar toda uma aplicação
Web que alie o poder de processamento do AP5 com a facilidade de formatação de interface do HTML.
Geralmente a utilização de uma dessas opções será indicada para aplicações que necessitem executar processos
dentro do AP5, como por exemplo, colocar um pedido de venda diretamente na base de dados do sistema,
Importante: Para utilizar a API ou o controle ActiveX, é necessário a DLL de comunicação do AP5
chamada AP5CONN.DLL. Por isso, sempre que for necessário utilizar uma dessas opções, a DLL de
comunicação deve estar em um path localizável pelo Windows e deve estar atualizada em relação ao
AP5 Server em que a aplicação externa tentará se conectar.
Para utilizar a API de comunicação do AP5, é necessário conhecer a linguagem em que a aplicação externa está
escrita, a ponto de poder utilizar o conceito de DLL´s do Windows. Qualquer linguagem de programação que
suportar a utilização de DLL´s poderá utilizar a API de comunicação.
Diferentemente do controle ActiveX, a DLL de comunicação não pode ser tratada como um objeto, porém podem
existir várias instâncias de comunicação, o que permite a comunicação com diferentes servidores do AP5
simultâneamente. O processo de utilização resume-se em:
AP5CreateConnControl
Descrição: Criação de uma instância de comunicação com o AP5 Server. Pode-se criar diferentes instâncias de
comunicação, acessando um ou mais servidores do AP5.
Retorno: int - Retorna o Handle da instância criada. Este Handle retornado deverá ser informado em todas as
demais funções de comunicação, para identificação da instância que será utilizada.
AP5DestroyConnControl
Descrição: Destruição de uma instância de comunicação com o AP5 Server. Após a utilização da API, e antes de
encerrar a execução da aplicação externa, é necessário destruir o Handle criado com a função anterior
para a liberação de memória.
AP5Connect
Descrição: Conexão a um AP5 Server. Esta função não deve ser confundida com a função
AP5CreateConnControl. Esta função irá realizar a conexão com o AP5 Server indicado durante a
criação da instância informada como parâmetro.
Parâmetros: nObjectID: int - Handle da instância que será utilizada para a execução desta função. É através do
Handle que é definido em qual servidor, porta e ambiente os processos serão executados.
Retorno: bool - Retorna verdadeiro ou falso, indicando se a conexão foi efetuada com sucesso.
Sintaxe: lOk = AP5Connect(nAP5)
AP5Disconnect
Descrição: Desconexão de um AP5 Server. Esta função não deve ser confundida com a função
AP5DestroyConnControl. Esta função irá encerrar a conexão ativa com um AP5 Server, da instância
informada como parâmetro.
Parâmetros: nObjectID: int - Handle da instância que será utilizada para a execução desta função.
Retorno: Sem retorno.
Sintaxe: AP5Disconnect(nAP5)
Parâmetros: nObjectID: int - Handle da instância que será utilizada para a execução desta função. É através do
Handle que é definido para qual servidor o parâmetro será enviado;
xParametro: indefinido - O tipo de dado do parâmetro dependerá da função utilizada, segundo os
tipos de dados permitidos explicados acima.
Retorno: bool - Retorna verdadeiro ou falso, indicando se o parâmetro pôde ser enviado ao AP5 Server com
sucesso.
ResultAsNumeric,
ResultAsString,
ResultAsLogical,
ResultAsDate,
ResultAsDateString,
ResultAsArray
Descrição: Estas funções são utilizadas para obter o retorno do AP5 Server após a execução de um processo.
Parâmetros: nObjectID: int - Handle da instância que será utilizada para a execução desta função.
Apenas para as funções ResultAsString e ResultAsDateString:
cBuffer: char * - Buffer de caracteres alocado para receber o retorno em formato caracter;
nSize: int - Tamanho do buffer passado no parâmetro anterior.
Retorno: O tipo de dado do retorno dependerá da função utilizada, segundo os tipos de dados definidos
anteriormente. Para as funções ResultAsString e ResultAsDateString o retorno será o tamanho do
buffer preenchido.
Parâmetros: nObjectID: int - Handle da instância que será utilizada para a execução desta função;
cBuild: char * - Buffer de caracteres para receber o número do build;
nSize: int - Tamanho do buffer passado no segundo parâmetro.
PrepareEnv
Descrição: Função utilizada para preparar o ambiente do sistema, ou seja, abrir arquivos, criar variáveis, e tornar
o ambiente de execução da aplicação externa em relação ao AP5 Server, o mais parecido possível
com o que é realizado pelos módulos do sistema.
Parâmetros: nObjectID: int - Handle da instância que será utilizada para a execução desta função;
cEnv: char * - Ambiente que será utilizado para a abertura dos arquivos;
cEmp: char * - Código da empresa do sistema (dois dígitos) que deverá ser aberta;
cFil: char * - Código da filial que será utilizada (dois dígitos);
aTables: variant – Este parâmetro deve ser um array variant (para detalhes, consulte a documentação
da linguagem utilizada) contendo as siglas das tables que deverão ser abertas (por exemplo “SB1”).
StartJob
Descrição: Esta função permite a execução de um processo (job) em um AP5 Server. O processo executado pode
ser qualquer um dos existentes no repositório definido pelo ambiente informado, incluindo as funções
criadas pelo usuário (User Function). Pode também receber parâmetros, bem como retornar um valor
para a aplicação externa, sempre utilizando-se das funções descritas anteriormente. A execução de um
processo resume-se em:
A)
1. Enviar os parâmetros (se existirem);
2. Executar o processo e aguardar sua finalização;
3. Obter o resultado (se existir).
B)
1. Enviar os parâmetros (se existirem);
2. Executar o processo sem aguardar sua finalização;
Os processos são executados em threads de execução separadas. Isso permite à aplicação externa que
esteja utilizando a API, optar por executar o processo e continuar trabalhando enquanto o mesmo está
em execução. Porém, somente poderá obter um retorno quando esperar até que o processo termine de
ser executado.
Obs.: Como estes processos são executados sem que uma instância do AP5 Remote esteja ativa,
devem ser criados sem nenhum comando de interface (criação de janelas, comandos de alerta, help,
etc). Se um comando de interface for utilizado no código ADVPL de um processo, a execução deste
através da API gerará um erro de execução.
Retorno: bool - Retorna verdadeiro ou falso, indicando se o processo foi iniciado com sucesso.
Sintaxe: StartJob(nAP5,“ENVIRONMENMT”,“MESEXTENSO”,true)
CallProc
Descrição: Esta função tem o mesmo objetivo que a anterior, porém sempre aguardará o término do processo
para que o controle volte à aplicação externa, e tem algumas diferenças conceituais:
A) Não se pode escolher o ambiente no qual o processo será executado. Os processos
executados pela CallProc serão sempre executados no ambiente indicado na criação da
instância com a função AP5CreateConnControl;
B) Um processo executado através da função StartJob, começará de um ambiente
totalmente novo. Porém, os processos executados pela função CallProc mantêm o ambiente
da última execução. Assim, o valor de variáveis criadas, os arquivos abertos, etc, são
mantidos na próxima execução.
Parâmetros: nObjectID: int - Handle da instância que será utilizada para a execução desta função;
cFunc: char * - Nome do processo ou função que será executado no AP5 Server.
Retorno: Bool - Retorna verdadeiro ou falso, indicando se o processo foi finalizado com sucesso.
Sintaxe: CallProc(nAP5,“CALCEST”)
Com a utilização da API, pode-se criar toda uma aplicação, em Visual Basic por exemplo, que executará funções do
sistema Advanced como o usuário faria através do AP5 Remote:
If AP5Connect(nAP5) Then
AddNumericParam(nAP5,5)
lOk = CallProc(nAP5,“MESEXTENSO”)
If lOk Then
ResultAsString(nAP5,cRes)
Else
CRes = “Não foi possível obter o mês por extenso”
End if
AP5Disconnect(nAP5)
End if
AP5DestroyConnControl(nAP5)
Importante: A notação dos tipos de dados e da sintaxe mencionados na descrição das funções
segue o padrão de linguagens como a linguagem C. Deve-se considerar os exemplos de sintaxe
conforme a linguagem utilizada.
Todas as funções de caracter como ResultAsString ou AP5BuildNumber, trabalham com buffer
de caracteres. Isto significa que o buffer que receberá o retorno deve ser alocado na linguagem
utilizada e que o tamanho alocado deverá ser passado como parâmetro para a função chamada.
A aplicação externa também será responsável por liberar a memória do buffer alocado.
O controle ActiveX tem as mesmas funcionalidades da API. Porém o formato de utilização é diferenciado. O
controle ActiveX é um objeto que deve ser registrado no computador onde será utilizado e durante a execução da
aplicação externa, deverá ser criado, utilizado e destruido ao final. Para maiores detalhes, consulte a documentação
da linguagem utilizada ou a documentação do conceito ActiveX na página da Microsoft
(http://www.microsoft.com).
Serviços de FTP
O protocolo FTP (File Transfer Protocol) permite a transferência de arquivos entre um servidor e uma
aplicação client de FTP (com um Web Browser como o Internet Explorer, por exemplo). Utilizando o AP5 Server
como um servidor FTP, os usuários poderão remotamente baixar arquivos disponibilizados em um diretório
configurável no servidor. Pode-se também habilitar um recurso de auto-atualização para o AP5 Remote, que irá
automaticamente baixar arquivos compactados para se auto atualizar quando necessário.
[FTP]
Enable=1
Path=C:\AP5\FTP
Port=21
O recurso de auto-atualização encontrado no AP5 Remote funciona através da detecção de diferenças na versão das
DLL´s locais (ou seja, que se encontram juntamente com o executável do AP5 Remote). Quando isto ocorre, o
usuário é questionado sobre a execução da auto-atualização. Se tudo estiver corretamente configurado no arquivo de
configuração do AP5 Remote (AP5RMT.INI – para maiores detalhes, consulte a documentação do AP5 Remote), ao
escolher que deseja tentar uma auto-atualização, o AP5 Remote irá abrir uma conexão FTP com o Server
configurado e baixar os arquivos compactados (com a extensão .CAB) contendo as DLL´s e executáveis mais
atualizados. Os arquivos serão então descompactados localmente para a atualização.
Para habilitar o serviço de HTTP no AP5 Server, os seguintes grupos devem ser criados no arquivo de configurações
(AP5SRV.INI):
Quando uma URL é requisitada através de um Web Browser (seja através de um comando POST, um link ou
diretamente através do campo de URL do Browser), essa requisição é recebida pelo AP5 Server que a tratará do
seguinte modo:
• Uma função executada no momento do recebimento de uma requisição HTTP é executada como um JOB,
ou seja, não contem interface. Por isso, tais funções não podem conter comandos de interface, como criação
de janelas ou exibição de helps e mensagens de alerta;
• A única interface possível é a utilizada no client HTTP. Por isso, tais funções devem SEMPRE retornar
uma string de caracteres. Após o processamento da função, essa string de retorno será enviada diretamente
ao client HTTP e este será o responsável por sua interpretação. Por exemplo, utilizando um Web Browser
como client pode-se retornar a string de comandos HTML diretamente. O HTML então será propriamente
exibido no Web Browser;
• Qualquer retorno diferente de uma string de caracteres gerará um erro que será enviado à aplicação client
HTTP (o erro gerado é “Invalid Proc Return”);
• O AP5 Server passa alguns parâmetros para as funções chamadas. Isso significa que ao criar funções para
serem utilizadas em resposta às requisições HTTP, deve-se criar o cabeçalho da função com estes
parâmetros. Não é obrigatório utilizar os mesmos nomes de parâmetros sugeridos abaixo quando criar
diretamente estas funções. Porém, como são esses os nomes utilizados no ADVPL ASP explicado mas a
frente, é aconselhável utilizá-los por motivo de padronização:
- __aCookies: Este parâmetro recebe um array bidimensional com os Cookies criados na aplicação client
HTTP (por exemplo, no Internet Explorer 5). Pode-se utilizá-lo para checar validações mantidas nas
máquinas client por exemplo. Para maiores detalhes, consulte a documentação do HTML ou do Web
Browser utilizado.
- __nProcID: Contém o Handle da Thread de execução daquela função. A utilização deste parâmetro
será explicada juntamente com o tópico ADVPL ASP posteriormente;
- __aProcParms: Este parâmetro recebe um array bidimensional com os parâmetros enviados na linha
de URL do Web Browser. Por exemplo, na execução de uma função via linha de URL do Web
Browser como:
http://servidor/vende.apl?cod=000001&nome=PRODUTO DE TESTE&quant=20
a função chamada vende receberá o array __aProcParms da seguinte forma:
{
{“cod”, “000001”},
{“nome”, “PRODUTO DE TESTE”},
{“quant”, “20”}
- __cHTTPPage: Esse parâmetro recebe o nome da página, arquivo ou função originalmente requisitada
para o AP5 Server. É utilizado quando as chaves GETPROC e POSTPROC (explicadas anteriormente)
são habilitadas no arquivo de configurações do AP5 Server. A função configurada irá receber nesse
parâmetro o nome original requisitado e poderá executar algum processamento específico para
continuar o processo (retornando a própria função original) ou desviar para outra página, por exemplo.
A função a seguir é um bom exemplo para ser executado através de um Web Browser como o Internet Explorer ou o
Netscape Navigator. Ela retorna uma string contendo a página HTML onde está escrita a mensagem “Hello World”
e a lista de parâmetros passados na linha de URL. Para testá-la, crie um arquivo novo no AP5 IDE, cole o código
abaixo e salve o arquivo como WEBDEMO.PRW. Após compilar o programa, basta chamar em um Web Browser
uma URL como:
http://localhost/u_webdemo.apl?cod=000001&desc=DESCRICAO DO PRODUTO&qtd=2
Código da função:
#include "rwmake.ch"
If Len(__aProcParms) = 0
cHTML += '<p>Nenhum parâmetro informado na linha de URL.'
Else
For i := 1 To Len(__aProcParms)
Next i
Endif
Return(cHTML)
Para crias as funções que serão utilizadas em chamadas via um Web Browser, ou seja, em
qualquer request HTTP, deve-se seguir o procedimento normal de criação de funções no
AP5: utilizando o AP5 IDE para a edição e para a compilação.
Note que no caso de funções do usuário (User Function) o nome chamado na URL do
Browser também deverá conter o U_ no começo da função, por exemplo:
http://servidor/u_webrelato.apl
E deve-se sempre indicar a extensão .APL para que o AP5 Server identifique que é uma função a ser
executada.
Advanced Protheus - AP5 – Conectividade e Advpl ASP
14 CopyRight © 2000 Release A – Microsiga Software S.A.
Advanced Protheus - AP5 – Conectividade e Advpl ASP
15 CopyRight © 2000 Release A – Microsiga Software S.A.
O ADVPL ASP
Uma página ASP (Active Server Pages) é uma página HTML contendo código interpretável em uma linguagem
compreensível ao servidor HTTP em uso. Por exemplo, o IIS da Microsoft utiliza o VBScript para criar suas páginas
ASP, do mesmo modo que o AP5 utiliza o ADVPL. Uma página ASP é uma combinação de script HTML e código
interpretável. No ADVPL ASP esse código é padrão xBase, portanto a preocupação maior daqueles que já
conhecem e trabalham com o AP5 e desejam desenvolver páginas ativas para aplicações Web utilizando essa
facilidade é conhecer HTML.
Os arquivos ADVPL ASP têm a extensão padrão .APH. São arquivos texto e devem ser adicionados a um projeto no
AP5 IDE e compilados da mesma maneira que os programas tradicionais. A diferença é que o AP5 Server
identificará que se trata de um ADVPL ASP e executará uma espécie de tradutor (parser) antes que a compilação
seja executada. Este parser irá transformar todo o arquivo em uma função única, que receberá os mesmos parâmetros
das funções APL simples, como explicado anteriormente, e retornará uma string. O desenvolvedor não precisa se
preocupar em retornar HTML algum, pois o APH também é um arquivo HTML. A função que foi gerada na
compilação irá se encarregar de retornar o HTML contido no arquivo, depois que o código foi processado.
Por se tornar uma função no momento da compilação, não é possível utilizar a cláusula
FUNCTION para criar outras funções dentro de um arquivo APH. Caso exista essa
necessidade, tais funções devem ser criadas em um arquivo PRW tradicional e chamadas
de dentro do APH.
Do mesmo modo que as demais funções, o arquivo APH também deve ser executado
(através da URL do Browser, por exemplo) com a extensão .APL.
A extensão APH para o nome dos arquivos é obrigatória. Qualquer outra extensão usada no nome do
arquivo não será reconhecida e o parser não será executado antes da compilação.
Assim como outros ASP´s, a diferenciação entre script HTML e código é efetuada através dos caracteres <% para
indicação de abertura de código e %> para indicação do encerramento de código.
Por exemplo, o HTML abaixo contém um pedaço de código ADVPL separado pelos delimitadores:
<html>
<head>
<title>ADVPL ASP Demo</title>
</head>
<body>
<p>Bem vindo ao mundo do ADVPL ASP!</p>
<%
// Soma os 100 primeiros números
Local i, nSoma := 0
For i := 1 To 100
NSoma += i
Next i
%>
</body>
</html>
Quando este arquivo for requisitado ao AP5 Server (através de uma chamada em URL por exemplo) o código entre
os delimitadores será executado, porém o script colocado ao redor do código será mantido exatamente como se
encontra.
Note que também pode existir diferentes blocos de código interpretável separados pelos delimitadores, dentro de um
mesmo arquivo.
Tão importante quanto mesclar código interpretável com script de formatação HTML, é utilizar os comandos
ADVPL para alterar o script de formatação. Ou seja, colocar o conteúdo de variáveis, campos, etc, diretamente no
HTML que será enviado à aplicação client (ao Browser por exemplo). Isso pode ser realizado através dos
delimitadores de avaliação. Os delimitadores de avaliação são <%= para abertura e %> para encerramento.
Diferentemente dos delimitadores de código interpretável, estes devem sempre estar na mesma linha. Com eles
pode-se criar uma linha de script HTML, cujo conteúdo contém uma expressão que será avaliada em tempo de
execução:
<b>Esta linha é HTML, mas a data exibida aqui: <%= Time() %> foi obtida em
tempo de execução.</b>
No exemplo acima, a linha HTML será retornada para o Browser com o resultado da função time (ou seja, a hora
atual no servidor) inserido no texto.
Utilizando todos esses conceitos, pode-se criar toda uma apliação Web baseada no AP5. Ou seja, o processamento e
acesso aos dados fica por conta do AP5 Server, e a interface fica por conta do Browser (utilizando o HTML).
Abaixo um exemplo de um relatório de clientes criado utilizando o ADVPL ASP. Para testá-lo basta copiar o
código, salvá-lo como WEBREL.APH e compilar o arquivo através do AP5 IDE:
<html>
<head>
<%
#define FIELD_CODDE "FROM_CODE"
#define FIELD_CODATE "TO_CODE"
#define FIELD_LOCDE "FROM_LOCAL"
#define FIELD_LOCATE "TO_LOCAL"
Local cCodDe,cCodAte,cLocDe,cLocAte
Local nPos
<%
// "Impressão" dos parâmetros
</table>
</center>
</div>
<p align="left"> </p>
<%
// Abertura dos arquivos e posicionamento do ponteiro
If Select("SB2") == 0 .Or. Select("SB1") == 0
RpcSetEnv ( "99", "01", "", "","","", {"SB1","SB2"} )
Endif
dbSelectArea("SB1")
dbSetOrder(1)
dbSeek(xFilial("SB1")+cCodDe+cLocDe,.T.)
%>
<%
While !EOF() .And. xFilial("SB1") == SB1->B1_FILIAL .And. SB1->B1_COD <= cCodAte;
.And. SB1->B1_LOCPAD <= cLocAte
SB2->(dbSetOrder(1))
SB2->(dbSeek(xFilial("SB2")+SB1->B1_COD+SB1->B1_LOCPAD,.F.))
%>
<tr>
<td width="12%" bgcolor="#FFFFCC"><%= HTMLAllTrim(SB1->B1_COD) %></td>
<td width="50%" bgcolor="#FFFFCC"><%= HTMLAllTrim(SB1->B1_DESC) %></td>
<td width="7%" bgcolor="#FFFFCC"><%= HTMLAllTrim(SB2->B2_LOCAL) %></td>
<td width="17%" bgcolor="#FFFFCC"><%= SB2->B2_QATU %></td>
<td width="14%" bgcolor="#FFFFCC"><%= "R$" + Str(SB2->B2_CM1,8,2) %></td>
</tr>
<%
dbSkip()
EndDo
%>
</table>
</body>
Após ter o código compilado, pode-se visualizar o resultado acessando através de um Web Browser como o Internet
Explorer a seguinte URL:
http://servidor/h_webrel.apl