Escolar Documentos
Profissional Documentos
Cultura Documentos
Windows NT Server , Windows Workstation, Windows 95/98 e SQL Server são marcas registradas da Microsoft
Corporation.
Banco de Dados Oracle é a marca registrada da Oracle Corporation.
Banco de Dados Informix é a marca registrada da Informix Corporation.
Banco de Dados Sybase é a marca registrada da Sybase Corporation.
Banco de Dados UDB é a marca registrada da IBM.
Este material é de efeito didático/suporte e não pode ser reproduzido sem autorização da MicroSiga.
CopyRight © 2001 Microsiga Software S.A.
Índice
1. Introdução ao ambiente Relacional
1.1. Objetivos
1.2. Conceitos Básicos de Banco de Dados
Programação em ADVPL / SQL / ASP com AP5
1.3. Conhecendo a estrutura de Armazenamento dos dados
1.3.1. LOG do Banco de dados
1.3.1.1. Controle Transacional
1.3.1.2. Segurança e Backup
1.3.1.3. Construindo Query’s evitando problemas com estouro da Área de LOG
1.3.2. Área temporária do Banco de Dados
1.4. Normalização de Base de Dados
1.5. MER (Modelo Entidade Relacionamento)
1.6. Diferenças cruciais entre ambientes DBF e SQL
1.6.1. DBF – Trabalha de forma posicional com acesso compartilhado
1.6.2. SQL – Trabalha de forma relacional (Teoria dos conjuntos) e o acesso é de forma
centralizada
2. TopConnect
2.1. Informações gerais
2.2. Controle de tipo de dados ( Tabela TOP_FIELD )
2.3. Opções de Visualizar os Eventos (Mensagens de Erros)
2.4. Sistema de controle de Registros
2.4.1. Portabilidade
2.4.2. Função da coluna R_E_C_N_O_
2.4.2.1. Limite de registros
2.4.2.2. Renumeração da coluna RECNO
2.4.3. Controle dos registros deletados (Coluna D_E_L_E_T_)
2.5. Constraints do Banco de dados que são criados automaticamente
2.5.1. Criação da Estrutura de tabelas
2.5.2. Índices
2.5.3. Defaults
2.5.4. Problemas com conteúdo Nulo
2.6. Manutenção do Banco de dados
2.6.1. Aumentando a performance executando a operação de PACK
2.7. DBFNTX x TopConnect
2.7.1. Índices de produção
2.7.2. Funções em chaves de índices
2.7.3. Índices condicionais
2.7.4. Chaves numéricas compostas
2.7.5. Expressões de filtro com funções e variáveis
2.8. Comandos
2.8.1. APPEND FROM
2.8.2. COPY TO
2.8.3. USE
2.8.4. BEGIN, COMMIT, ROLLBACK TRANSACTION
2.9. Funções
2.9.1. TCCANOPEN
2.9.2. TCCONTYPE
2.9.3. TCDELFILE
2.9.4. TCGETDB
2.9.5. TCLINK
2.9.6. TCQUERY
2.9.7. TCQUIT
2.9.8. TCSETCONN
2.9.9. TCSETFIELD
2.9.10. TCSPEXEC
2.9.11. TCSPEXIST
2.9.12. TCSQLERROR
2.9.13. TCSQLEXEC
2.9.14. TCSRVTYPE
2.9.15. TCUNLINK
2.9.16. TCCHKOBJ*
2.9.17. TCEXEERROR*
2.9.18. TCPGMEXE*
2.9.19. TCSYSEXE*
( * )Funções apenas para o TOPConnect rodando em servidores AS/400.
Programação em ADVPL / SQL / ASP com AP5
2.10. Performance
2.10.1. Otimizando seu código
2.10.2. Leitura Seqüencial
2.10.3. O uso de filtros
2.10.4. Stored Procedures
2.11. Integração com outros aplicativos
2.11.1. Incluindo registros nas tabelas do SigaProtheus / AP5
2.11.2. Excluindo registros (Sempre Marcar )
2.11.3. Vantagens e Desvantagens
3. Utilitário importante
3.1. INSTALADOR DE STORED PROCEDURES NO BANCO DE DADOS
7. Introdução
8. Funções em ADVPL para o Protheus 5.07 / 5.08
8.1. FIELDGET()
8.2. FILEDPUT()
8.3. ALIQICMS()
8.4. ASCAN()
8.5. SALVAMENTO DE AREAS
8.6. SETPRINT()
8.7. CRIATRAB()
8.8. GETADVFAL()
8.9. PROCREGUA()
8.10. ACTIVATE DIALOG()
8.11. MBROWSE()
8.12. NCPROC()
Este curso tem como objetivo treinar e aperfeiçoar nossos analistas e parceiros quanto à confecção de
programas específicos, em ambiente de trabalho com Base de Dados SQL desta forma pretendemos
aumentar a facilidade de manuseio dos componentes envolvidos tanto na análise e detecção de erros, e
quais possíveis ações para saná-los, antes de recorrer ao suporte interno. Demonstraremos também
como otimizar programas através da linguagem SQL em seus RDMAKES e futuras implementações para
as próximas versões.
Programação em ADVPL / SQL / ASP com AP5
Todos os tópicos mencionados poderão servir como base de consulta, para escrita de programas e
resolução de problemas.
Os conceitos básicos dos Bancos de Dados relacionais são bem diferenciados dos conhecidos DBF
´s. Estes conceitos básicos são úteis principalmente para saber responder eventuais perguntas que
nossos clientes poderão efetuar sobre nosso sistema.
SQL quer dizer : Structured Query Language , que foi desenvolvido inicialmente pela IBM
Corporation.
Um banco de dados não trabalha em função de registros, ou Arquivos como nós estamos
acostumados a ver e fazer em linguagem de programação Clipper. o SQL utiliza a teoria de
conjuntos conhecida pôr todos, que tem o objetivo de resolver os problemas dos usuários com
comandos simples, chamados de query´s ( Requisição e Alteração de dados ), que utilizam
basicamente 4 comandos : SELECT, INSERT, UPDATE, DELETE.
A primeira diferença entre o ambiente SQL e o DBF é o fato de criarmos uma área no disco
(DATABASE) que o próprio banco se encarregara de administrar, no sentido de criar tabelas, índices,
e todos os objetos envolvidos no sistema. A nomenclatura muda um pouco: ao invés de CAMPOS
temos COLUNAS e ao invés de REGISTROS temos LINHAS.
Os índices trabalham de forma semelhante ao DBF, e são utilizados com duas finalidades : a de
termos uma chave de acesso extremamente rápida, e de garantirmos uma chave única em uma
tabela. A partir do momento que indicamos uma chave única em uma tabela, o próprio banco de
dados passa a garantir que não existirá dados duplicados, sem a necessidade de programação para
tal.
Também estarão ligados à uma tabela específica os Triggers, e as Foreign Keys ( Chaves
Estrangeiras ). Em cada DataBase também estarão armazenadas as Stored Procedures, que são
programas ou funções escritas como qualquer linguagem conhecida ( Clipper, Pascal etc.), só que no
padrão ANSI / SQL.
Uma Trigger funciona como um gatilho, só que este é disparado não a cada campo alterado, e sim a
cada Inclusão, Alteração ou Exclusão de uma linha da tabela. Os Triggers também são escritos como
as Stored Procedures, ou seja, como um programa qualquer, que pode efetuar qualquer tipo de
validação, atualização em outras tabelas, etc...
Hoje não utilizamos no Siga PROTHEUS nenhuma Trigger. Em alguns casos específicos em
clientes, as mesmas poderão ser utilizadas.
Uma Foreign Key ( Chave Estrangeira ) é uma ligação entre tabelas que são criadas nas mesmas.
São estas que garantem que nunca o Cliente “X” será excluído se o mesmo tiver movimentos
( Pedidos, Notas , Duplicatas Etc. ), também será garantido que nunca será incluído um Pedido de
Vendas do Cliente “Y”, se o mesmo não existir.
Este tratamento é feito diretamente pelo Banco de Dados, não necessitando qualquer codificação
para isto.
O Siga PROTHEUS/AP5 não trabalha hoje com o conceito de chaves estrangeiras no banco de
dados.
O uso de um Banco de Dados SQL se faz necessário pela segurança dos dados e pela fácil
recuperação dos mesmos por vários aplicativos como Siga PROTHEUS / AP5 (TopConnect), Crystal
Reports (ODBC), SigaEIS (BDE), Excel, etc.
Programação em ADVPL / SQL / ASP com AP5
Devido ao controle exercido sobre os dados a performance do banco acaba sendo prejudicada. Nos
próximos tópicos estaremos demonstrando como melhorar e otimizar o SGDB (Sistema Gerenciador
de Banco de Dados) para o melhor aproveitamento do sistema.
Para empresas que fazem uma grande utilização de banco de dados normalmente encontramos um
profissional chamado DBA (Data Base Administrator), que tem a função de administrar o banco de
dados, quanto a otimização, configuração, backups e segurança. Sabemos que na prática isto só
funciona para empresas grandes, portanto temos que saber o mínimo possível de cada banco de
dados para podermos identificar problemas e soluções que se adequam melhor à instalação do
cliente.
A área de LOG do Banco de dados é normalmente definida com 25% do tamanho da área de
dados, mas este fator depende muito do número de usuários e a quantidade de transações
realizadas em um determinado intervalo de tempo.
Depois que uma transação é concluída com sucesso, não indica que a mesma estará sendo
transferida para a área real dos dados. Este tramite de transferência é chamado de
CheckPoint , este ponto é configurável de acordo o SGDB utilizado. Para bancos de dados de
maior escala, o processo de check point só é realizado após o Backup da área de LOG.
O LOG também é utilizado para fazer o backup de grande bancos de dados, guardando
somente as alterações efetuados em um determinado intervalo de tempo. Em clientes com
base de dados pequenas, não utilizamos este tipo de recurso.
Esta área é de utilidade exclusiva do Banco de Dados, a mesma é utilizada em situações que o
SGDB precisa gerar arquivo temporários para resolver as query’s que estamos solicitando,
normalmente operações que exigem um determinada ordenação no resultado e não existe
nenhum índice correspondente. Devemos tomar cuidado com query’s que necessitem área de
trabalho, por que elas estarão perdendo mais tempo com i/o de disco.
A normalização de Base de dados tem como objetivo, definir a estrutura de entidades e seus atributos
eliminando vários problemas de definição de armazenamento dos dados, que no momento da
implementação serão percebidos. Existe até cinco níveis de normalização , mas somente utilizamos
até o terceiro nível, atualmente não existe equipamento capaz de administrar um Banco de dados
normalizado totalmente.
Com a pratica vamos perceber que a normalização é muito boa, mas o seu excesso gera problemas na
programação, portanto temos sempre que fazer o máximo de normalização mas devemos estar
consciente de quanto conseguiremos de vantagem com isto.
Existe casos que a desnormalização é uma das melhores soluções, para facilitar o desenvolvimento da
aplicação ou para ganharmos performance.
A primeira forma normal diz que devemos definir a entidade e seus atributos, e destes atributos
devemos definir um atributo chave de relação.
A segunda forma normal diz que devemos subdividir os atributos que ocorrem mais de que uma vez,
em uma outra entidade.(Esta entidade deve ter um campo chave, atendendo a primeira forma normal).
A terceira forma normal diz que devemos eliminar colunas que são concebidas por calculo de outras
colunas de mesma entidade.
A partir da normalização podemos definir as relações estrangeiras de cada tabela, o MER é uma
modelo gráfico que facilita a visualização do desenvolvimento de aplicativo. Além de apresentar todo o
fluxo do dado dentro de um Banco de Dados. No caso do SigaPROTHEUS / AP5 você ter em mãos
toda a estrutura do sistema é quase impossível, nestes casos o modelo é feito por módulo, e os pontos
de integração são replicados em cada MER do correspondente módulo.
Sempre que possível ao desenvolver processos específicos no sistema procure desenhar o MER para
detectar os problemas antes de sair desenvolvendo o produto.
1.6.2. SQL – Trabalha de forma relacional (Teoria dos conjuntos) e o acesso é de forma
centralizada
Agora quando trabalhamos com Base de Dados Relacional, a estrutura é totalmente diferente.
Devemos atender várias exigências como controle de acesso ao dado que é muito mais restrito, a
programação feita na aplicação deve ser bem otimizada para evitar requisições desnecessárias, o
SGDB precisa utilizar processamento do Servidor para recuperar um dado solicitado pela
aplicação. O Banco de Dados suporta grande capacidade de armazenamento de dados, garantindo
sua integridade como um todo. A desvantagem do Banco de Dados é a necessidade de
equipamentos potentes para atender a demanda.
2. TopConnect
Programação em ADVPL / SQL / ASP com AP5
O TOPConnect foi desenvolvido em linguagem ‘C’ pela Microsiga e é utilizado hoje pelo
SigaPROTHEUS / AP5 através da linguagem ADVPL (PROTHEUS Protheus Language). Ele
também pode ser utilizado por aplicações XBASE que queiram trocar a base de dados de DBF para
SQL.
Os gerenciadores de banco de dados hoje suportados são:
Alguns comandos e funções avançadas são disponibilizadas para que seu aplicativo possa usufruir
de todos os benefícios da plataforma cliente servidor, que são apresentados logo em seguida.
Em um banco existem vários tipos de dados (CHAR, VARCHAR, FLOAT, NUMBER, etc.) porem para
existir uma unicidade no código do Topconnect alguns dados são armazenados de forma diferente da
definida na tabela SX3, porem a aplicação recebe o dado da forma como definido.
A1_FILIAL C 2
A1_COD C 6
A1_LOJA C 2
A1_DESC C 1
A1_EMISSAO C 8
A1_VEND1 C 6
...
Ex.: Tabela TOP_FIELD
Alerta! : Se você for utilizar diretamente o Banco de dados você precisa estar ciente que
um campo numérico é armazenado como um tipo float(MSSQL Server), Number(Oracle), etc.
Por exemplo o valor 40,40 no banco pode estar armazenado como 40,39999999. Quando
formos utilizar query’s você deve utilizar a função TCSETFIELD para resolver esta situação.
(Veja função TCSETFIELD).
Importante também salientar que qualquer modificação efetuada em arquivo SX3 diretamente,
ou seja, sem utilizar o configurador, você pode Ter problemas com inconsistência de estrutura
da tabela do Banco de Dados e TOP_FIELD contra o dicionário de dados. Para resolver este
problema você deverá remover os dados da Tabela do Banco de dados, eliminar a tabela e
deixa-la criar novamente e depois importar os dados via APPEND(Utilize SDU/CFG-AP5), ou
você pode ajustar o dicionário de dados manualmente conforme estrutura no Banco de Dados.
2.3. Opções de Visualizar os Eventos (Mensagens de Erros)
A parte mais importante do Topconnect Manager é o gerenciamento das mensagens de erros, estas
mensagens não são do TopConnect mas sim, de cada Banco de Dados, ou seja, se você obtiver um
erro de Logon o erro que você receberá neste reporte, é exatamente a mesma mensagem que o Banco
de Dados estaria informando se você utilizar um utilitário do próprio Banco para fazer o Acesso.
Na maioria dos problemas este logo de erros é o ponto principal para descobrir o que esta
acontecendo, entre o Topconnect e o Banco de dados. Você só estará recebendo mensagens se o link
entre o Banco de dados e o Topconnect estiver funcionando.
Programação em ADVPL / SQL / ASP com AP5
Acreditamos que muitos já perguntarão por que da existência da coluna R_E_C_N_O_ no Banco
de dados, mesmo os que não conhecem esta coluna tem como objetivo manter a portabilidade de
uma Base DBF e Banco ADS para um Banco de Dados qualquer e também entre Banco de dados.
Se você possui sua aplicação trabalhando em DBF , você pode porta-la independente de
modificações para uma Base SQL, e se você já esta em uma base SQL do tipo MSSQL SQL
Server e gostaria de porta-la para ORACLE, você pode fazer isto sem nenhum problema.
Alerta! : Se você possui programas específicos desenvolvidos (RDMAKES), você precisa que os
mesmos estejam desenvolvidos nos padrões de compatibilidade exigidos pela Microsiga. Você
verá mais adiante exemplos de programas e uma apresentação mais completa deste assunto.
A Coluna R_E_C_N_O_, tem por objetivo principal guardar um número seqüencial de controle de
registro, mais conhecido como ID (identificador). Este identificador é utilizado pela aplicação na
pesquisa e posicionamento de registro.
Esta coluna não possui repetição, ela é sempre preenchida com o valor máximo da coluna
R_E_C_N_O_ + 1 nas próximas inserções. Esta operação é feita pelo TopConnect , se você utiliza
outros produtos que fazem inserção na Base de Dados do SigaPROTHEUS / AP5 você deve seguir
as orientações do Capítulo Integrações com outros aplicativos.
Quando os registros são deletados pelo sistema, os mesmos são apenas marcados,
para exclusão física acontece em quando executamos a operação que conhecemos com
Pack de registros. Após esta operação a coluna R_E_C_N_O_ não é renumerada. Não
existe a necessidade de fazer a renumeração desta coluna, a não ser que você esteja
perto de estourar o maior número possível nesta coluna. Neste caso você precisar
extrair os dados do Banco de Dados para uma Base DBF e logo em seguida subir a
Programação em ADVPL / SQL / ASP com AP5
Base novamente para o Banco de Dados, automaticamente a coluna R_E_C_N_O_ será
ajustada.
Alerta! : Quando você utiliza o comando Set Delet on/off, o TopConnect estará tratando o dado
para você, mas se você utiliza query’s para recuperação de dados você deverá tratar este coluna
(Mais informações sobre o tratamento da coluna D_E_L_E_T_ será apresentado em exemplos de
query’s em RDMAKES.
Neste momento a tabela TOP_FIELD estará sendo alimentada com todos os campos numéricos,
datas e Lógicos.
Alerta! : Após o primeiro usuário fazer a conexão com o TopConnect e a parte de verificação de
tabelas já foi executada, as referências de cada tabela selecionado no .mnu para abertura
estarão em memória no TopConnect, portanto se por acaso alguma tabela for removida
diretamente por um utilitário do Banco de Dados o TopConnect terá uma informação não
coerente, você deve reiniciar o serviço do Topconnect (Parando / iniciando o Serviço).
2.5.2. Índices
Os índices são criados imediatamente após a criação da estrutura das tabelas. Os índices
criados partem do arquivo de índices do SigaPROTHEUS / AP5, que é o arquivo SINDEX.
Existe um índice que é criado apenas uma vez no momento em que a tabela é criada, este índice
tem como formação do nome = <nome da tabela> + _RECNO , este índice e sempre composto
da coluna R_E_C_N_O_ e não permite duplicidade.
Alerta!: Nunca remova os índices das tabelas, principalmente o índice RECNO que não será
criado pelo TopConnect quando a tabela já existe. Se você criou um índice pelo SINDEX e
depois percebeu que montou errado ou precisa elimina-lo, você precisa eliminá-lo do SINDEX e
também do Banco de Dados.
2.5.3. Defaults
São constraints de validação de campos que não são informados, nos comandos de inserção e
alteração, ou seja, se você não possui os defaults criados o Banco de Dados estará deixando
estes campos com valor nulo. Os defaults são criados no momento da criação das tabelas.
Alerta!: Se você fizer qualquer operação de transferência via Banco de Dados que não transfira
os Defaults, e logo em seguida você utilizar o sistema , estará correndo risco de inserir nulos na
Base de Dados. Se isto acontecer você poderá Ter problemas com o TopConnect Server, ele
poderá travar ou derrubar conexões com dados indevidos. A solução neste caso é utilizar o
utilitário DEFAULT que esta disponível no site da Microsiga.
Programação em ADVPL / SQL / ASP com AP5
Este é um exemplo de script para MSSQL Server que o TopConnect estará
disparando para o Banco de Dados quando a tabela SA1990 não existir no Banco.
Os Bancos de dados possuem o conteúdo nulo para todos os tipo de campos, mas o nosso
sistema não os utiliza, se por ventura qualquer tabela tenha algumas linhas com alguma coluna
com o valor nulo, isto pode provocar problemas que aparentam ser erro de índice, como ex. Você
tem a tabela de pedidos que com os pedidos 000001,000002 e sua tabela por qualquer motivo
não tem os contraints de defaults na coluna filial, agora você faz a inserção do pedido 0000003 o
sistema irá apresentar um Browse ordenado por pedido da seguinte forma:
Filial Pedido
--------- ------------
Null 000003
000001
000002
Neste exemplo você percebe que o pedido 000003 aparece em primeira ordem, sendo o índice
filial+pedido, ou seja, o valor nulo na tabela ASCII(Binary Order) aparece antes do caracter
espaço em branco.
Programação em ADVPL / SQL / ASP com AP5
Este problema muitas vezes causa a impressão que o índice esta com problemas, por que a
tela de Browse do SigaPROTHEUS / AP5 não apresenta a coluna filial.
Alerta!: Tabelas com conteúdo nulo, geram vários problemas no sistema, provavelmente deve
gerar erros no TopConnect que o mesmo estará derrubando as conexões quando elas fizerem
acesso a este tipo de conteúdo (nulo). Existe um utilitário que ajusta este problema se você o
tiver, o mesmo esta disponível no site da Microsiga, com o nome de DEFAULT.exe
Esporadicamente você deve fazer uma manutenção no Banco de dados, quanto as registros
excluídos logicamente, os mesmo devem ser excluídos fisicamente, por que a sua existência em
grande quantidade e de forma seqüencial gera um grave problema de performance no acesso aos
dados.
Alerta!: Se você tiver este problema, utilize a operação de Pack do utilitário SDU na tabela que
possui registros excluídos , ou utilize o programa fonte PACK para fazer esta operação em todas as
tabelas.
Segue abaixo exemplo de fonte em RDMAKE, para fazer um pack em qualquer Banco de dados.
Exemplo de fonte em ADVPL para executar um Pack no Banco de Dados , esta rotina já prevê
problema de estouro da área de LOG/RollBack de um Back de Dados
/*
Função ³PACK ³ Autor ³ Emerson/Vicente ³ Data ³ 16.12.99
Descrição ³Rotina RDMAKE para eliminar os registros deletados do banco
Uso ³RDMake <Programa.Ext> -w
Exemplo ³RDMake Pack.prw
*/
@ 96,42 TO 323,505 DIALOG oDlg5 TITLE "Rotina de Pack"
@ 8,10 TO 84,222
@ 91,168 BMPBUTTON TYPE 1 ACTION Execute(OkProc)
@ 91,196 BMPBUTTON TYPE 2 ACTION Close(oDlg5)
@ 23,14 SAY "Este programa ira fazer um pack em todos arquivos abertos pelo PROTHEUS."
ACTIVATE DIALOG oDlg5
Return nil
Function OkProc
Close(oDlg5)
Processa( {|| Execute(RunProc) } )
Return
/*
Funcao ³RunProc
Descrição ³Executa o Processamento
*/
Function RunProc
DbSelectArea("SX2")
NrecnoSX2 := SX2->(Recno())
DbGoTop()
ProcRegua(reccount())
While !Eof()
If Select(SX2->X2_CHAVE) > 0
cQuery := 'SELECT MAX(R_E_C_N_O_) RECNO FROM ' + SX2->X2_ARQUIVO
dbUseArea(.T., "TOPCONN", TCGenQry(,,cQuery), 'CONT', .F., .T.)
nCont := 1
While nCont <= CONT->RECNO
cQuery := "DELETE FROM "+SX2->X2_ARQUIVO
cQuery := cQuery + " WHERE D_E_L_E_T_ = '*'"
cQuery := cQuery + " AND R_E_C_N_O_ between "+Str(nCont)+" AND +Str(nCont+1024)
nCont := nCont + 1024
TCSQLEXEC(cQuery)
Enddo
DbSelectArea("CONT")
DbCloseArea()
Endif
DbSelectArea("SX2")
dbSkip()
incproc()
Enddo
Programação em ADVPL / SQL / ASP com AP5
return
Todos os SGDB's utilizam o conceito de índices de produção portando uma aplicação que utilize o
TOPConnect não necessita ter todos os índices abertos para que os mesmos sejam atualizados.
Devido ao fato de os SGDB's não suportarem o uso de funções nos índices o TOPConnect não tem
como suportar este tipo de implementação.
Para a criação de índices que contenham campos caracter e numéricos na chave apenas uma
regra deve ser obedecida. A função STR deve obrigatoriamente receber como parâmetros valores
idênticos a definição da tabela.
Exemplo:
Em um arquivo com a seguinte estrutura:
Para se criar um índice que ordene o arquivo por CAMPO1 + CAMPO2 deverá o seguinte comando
ser utilizado:
Nos gerenciadores de banco de dados não existe a figura dos índices condicionais.
Para se obter resultados semelhantes aos índices condicionais o TOPConnect agregou nova
funcionalidade ao filtro do SigaPROTHEUS / AP5.
SET FILTER TO ESTADO = "SP" .AND. SALDO > 10000 .AND. ORDERBY(CODIGO,NOME)
dbSetOrder(0)
O TOPConnect permite o uso da função OrderBy nos filtros o que reproduz o mesmo efeito de um
índice filtrado.
Os SGDB's não suportam índices que contenham expressões ADVPL onde dois campos numéricos
são somados na chave.
Exemplo:
INDEX ON CPOVAL1 + CPOVAL2 TO ARQIND
Programação em ADVPL / SQL / ASP com AP5
Uma vez que o TOPConnect utiliza a arquitetura Cliente/Servidor o servidor não tem como avaliar o
conteúdo de uma variável de memória ou o retorno de uma função do cliente.
O TOPConnect permite a utilização de variáveis e funções nos filtros porém é necessário ter em
mente que a avaliação deste filtro ocorrerá no cliente e não no servidor o que poderá resultar em
problemas de performance.
Este filtro contem apenas campos e constantes o que permite que sua avaliação seja feita no
servidor e que apenas os registros que obedeçam ao filtro venha para o cliente.
Agora este:
SET FILTER TO CODIGO > RetornaCodigo()
Considerando que RetornaCodigo é uma função ADVPL da aplicação todas as linhas deste arquivo
serão avaliadas no cliente.
Pôr exemplo:
SET FILTER TO ESTADO = 'SP' .AND. SALDO > 10000 .AND. CODIGO > RetornaCodigo()
Nesta expressão somente virão para o cliente os registros onde os campos ESTADO e SALDO
obedeçam ao filtro e então o campo CODIGO será avaliado no cliente.
2.8. Comandos
Neste capítulo mencionaremos apenas os comandos da linguagem ADVPL que tem a sua funcionalidade
alterada ou complementada e os novos comandos implementados pelo TOPConnect via RDD.
#INCLUDE "TOPCONN.CH"
Em uma aplicação ADVPL o comando APPEND FROM é utilizado para se inserir registros na
Work Area corrente com registros vindos de outro arquivo DBF.
No TOPConnect o comando APPEND FROM importara registros de um arquivo DBF para uma
tabela do banco de dados.
No ADVPL opcionalmente poderá ser especificado o parâmetro VIA "TOPCONN" o que fará com
que registros de uma tabela sejam inseridos na Work Area corrente.
Exemplo
SELECT CLIENTES
//Importa registros de um DBF
APPEND FROM c:\temp\newcli.dbf
Ou
SELECT CLIENTES
//Importa registros da tabela NEWCLI
APPEND FROM NEWCLI VIA "TOPCONN"
2.8.2. COPY TO
Programação em ADVPL / SQL / ASP com AP5
Em uma aplicação ADVPL o comando COPY TO é utilizado para se copiar a estrutura e os
registros da Work Area corrente para um arquivo DBF.
Assim como no comando APPEND FROM no ADVPL o parâmetro opcional VIA também pode ser
especificado.
2.8.3. USE
USE [<xcTable>
Exemplo
//Abre a tabela de Clientes em uma nova Work Area
USE clientes SHARED NEW VIA "TOPCONN"
SELECT PEDIDOS
APPEND BLANK
SELECT ITEMS
APPEND BLANK
.....
APPEND BLANK
.....
COMMIT TRANSACTION
2.9. Funções
2.9.1. TCCANOPEN
Exemplo
//Testa a existência da tabela customer
IF !TCCanOpen("CUSTOMER")
dbCreate("CUSTOMER", aStru, "TOPCONN")
ENDIF
USE CUSTOMER SHARED NEW VIA "TOPCONN"
//Testa a existência do índice
IF !TCCanOpen("CUSTOMER","CUSTCOD")
INDEX ON CODIGO TO CUSTCOD
ELSE
SET INDEX TO CUSTCOD
ENDIF
...
2.9.2. TCCONTYPE
TCConType(<cType>)
2.9.3. TCDELFILE
TCDelFile(<cTable>)
2.9.4. TCGETDB
cDataBase := TCGETDB()
2.9.5. TCLINK
nCon := TCLink(<cConectString>,<cServer>)
Esta é a lista de Bancos de Dados hoje suportados e seus respectivos nomes compor a string de
conexão com o TOPConnect NT:
Exemplo
nCon := TCLink("MSSQL/SIGAADV","TOPSRV")
if nCon < 0 //Conexões com retorno < 0 significam erro
Alert("Falha de conexão com o TOPConnect")
endif
//Protocolo TCP/IP
TCConType("TCPIP")
//Conecta-se ao Oracle – no ambiente TESTES
nCon := TCLink("ORACLE/TESTES",172.16.1.2)
//Protocolo APPC
//Conecta-se ao AS/400 no ambiente PRODUCAO
nCon := TCLink("PRODUCAO","TOP400")
Programação em ADVPL / SQL / ASP com AP5
2.9.6. TCQUERY
TCQUERY [<cSQLExpr>
[ALIAS <xcAlias>]
[NEW]
VIA "TOPCONN"
Obs: Ao executar uma Query que retorne um ou mais valores calculados, o nome dos campos da
WorkArea serão COLUMN1, COLUMN2... COLUMNn.
Exemplo
2.9.7. TCQUIT
2.9.8. TCSETCONN
Sintaxe
TCSETCONN(<nConn>)
Onde <nConn> é o número da conexão.
Exemplo
Programação em ADVPL / SQL / ASP com AP5
// Abre conexão com o ambiente de Produção
nCon1 := TCLink("MSSQL/PRODUCAO")
if nCon1 < 0
Alert("Falha conectando ambiente de Produção")
QUIT
endif
TCSetConn(nCon1)
TCSetConn(nCon2)
2.9.9. TCSETFIELD
Esta função serve como apoio ao comando TCQUERY, na recuperação de campos tipo
NUMERIC, DATE e LOGICAL, pois os mesmos são gravados fisicamente no Banco de Dados
como caracteres, e no caso dos numéricos como float.
Sintaxe
TCSetField(<cAlias>, <cField> ,<cType>, [<Prec.Inteira>,<Prec.Decimal>] )
Exemplo
TCQUERY "SELECT NOME, DATA, MARRIED, VALOR FROM CUSTOMER" ALIAS QUERY
VIA "TOPCONN"
TCSetField("QUERY","DATA","D")
TCSetField("QUERY","VALOR","N",12,2)
Dentro de um programa ADVPL já podemos considerar como um campo data não mais um
campo caracter como é o seu armazenamento.
O campo Data só é retornado como um campo caracter por que estamos utilizando a função
TCQUERY, se não o tratamento é automático.
2.9.10. TCSPEXEC
Devido a uma limitação em alguns dos Bancos de Dados suportados na obtenção dos tipos de
parâmetros (se são de INPUT e/ou OUTPUT) todos as Stored Procedures a serem executadas
através do TOPConnect deverão obedecer o seguinte padrão de nomenclatura de seus
parâmetros :
Após a execução de uma Stored Procedure o TOPConnect retornará ao ADVPL um array com 'n'
elementos, onde n é o número de parâmetros de OUTPUT da Stored Procedure.
Sintaxe
<aRet> := TCSPExec(<cSPName>,[<xParam1>,<xParam2>...<xParamN>])
Exemplo
//Verifica se a Stored Procedure Teste existe no Servidor
If TCSPExist("TESTE")
//Executa a Stored Procedure Teste
aRet := TCSPExec("TESTE","JOSE",1000)
if aRet <> nil
2.9.11. TCSPEXIST
Onde <lExist> indica se a Stored Procedure existe ou não e <cSPName> é o nome da Stored
Procedure procurada.
Exemplo
If SPExist("CALCCUSTO")
TCSPExec("CALCCUSTO")
Endif
2.9.12. TCSQLERROR
Retorna o último erro registrado pelo TOPConnect durante a execução de uma Query.
Sintaxe
<cError> := TCSQLError()
OBS: Esta é a mesma mensagem que esta registrada no log de eventos do TopConnect
Manager.
2.9.13. TCSQLEXEC
Programação em ADVPL / SQL / ASP com AP5
Executa comandos SQL no servidor.
Sintaxe
<nRet> := TCSQLExec(<cCommand>)
Onde <nRet> retorna um valor negativo em caso de erros e <cCommand> e o comando SQL a
ser executado.
Exemplo
TCSQLExec("UPDATE CUSTOMER SET VALUE=0)
2.9.14. TCSRVTYPE
<cType> := TCSrvType()
Onde <cType> é o tipo do servidor podendo Ter seu conteúdo igual a "WinNT" ou "AS/400".
Exemplo
TCLink("MSSQL/TESTE","TOPSRV")
?TCSrvtype()
2.9.15. TCUNLINK
TCUnlink(<nConn>)
2.9.16. TCCHKOBJ*
<nError> := TCChkObj(<cObj>,<cLibrary>,<cType>)
Onde:
<nError> é 0 quando o objeto existe ou o número do erro no AS/400.
<cLibrary> é o nome da biblioteca que deve conter o objeto.
<cType> é o tipo de objeto AS/400. Ex: *FILE, *PGM, etc.
Exemplo
nError := TCChkObj("CALCCUST","PRODUCAO","*PGM")
ESTA FUNÇÃO SE APLICA APENAS PARA O TOPCONNECT AS/400
2.9.17. TCEXEERROR*
Retorna uma string com a mensagem de erro retornada pela execução das funções
TCPGMEXE() e TCSYSEXE().
Sintaxe
<cError> := TCExeError()
2.9.18. TCPGMEXE*
2.9.19. TCSYSEXE*
TCSysExe( cCommand )
2.10. Performance
2.10.1. Otimizando seu código
O código acima fará com que todas as linhas(registros) da tabela venham para o Client, o que irá
gerar um número de Queries no servidor igual ao número de linhas da tabela e cada uma delas
irá recuperar apenas uma linha, subtilizando a capacidade de processamento do servidor.
O mesmo não ocorre utilizando o TOPConnect, pois o filtro é avaliado pelo próprio servidor vindo
para a estação apenas os registros que respeitem a condição do filtro.
Para que um filtro tenha uma boa performance é necessário que a expressão do filtro
corresponda a um índice no servidor, caso contrário, para poder avaliar o filtro o servidor SQL
terá que ler linha a linha da tabela.
O uso de Stored Procedures é a maneira mais eficiente de uma aplicação se utilizar dos
benefícios da arquitetura Cliente/Servidor.
As tabelas criadas no Banco de dados pode receber inserções de outros aplicativos, esta
inserção deve ser feita contemplando as seguintes operações :
Antes de inserir o registro você deve obter o número máximo da coluna R_E_C_N_O_
existente na tabela
Deste número você deve somar 1
Logo em seguida fazer a inserção propriamente dita do registro
Se o registro não for inserido com sucesso você deve voltar ao primeiro passo.
Quando houver necessidade de exclusão de registro por outros aplicativos você deve apenas
fazer uma operação de alteração do registro, colocando o símbolo de ‘*’ na coluna D_E_L_E_T_,
principalmente se esta operação for concorrente com o SigaPROTHEUS / AP5.
As desvantagens deste processo, são que você deve estar ciente de todas atualizações que são
feitas na base de dados no sistema, já que o sistema esta desta forma vulnerável a problemas
inesperados.
3. Ferramenta importante
3.1. Instalador de Stored Procedures no Banco de Dados
Programação em ADVPL / SQL / ASP com AP5
Alguns clientes utilizam rotinas como Stored Procedures para agilizar alguns processos críticos do
sistema, para instalação destas Storeds Procedures você devem possuir o arquivo com o nome de
SIGAXXX.SPS, onde o XXX é o tipo de Banco de Dados que o Cliente estará utilizando ex: SIGASQ7
(MSSQL 7.0), SIGAIFX (INFORMIX), SIGAORA (ORACLE)
Após a confirmação desta operação todas as Procedures que estiverem disponíveis neste arquivo serão
compiladas para a empresa em questão, se o cliente tiver mais do que uma empresa e ele deseja
instalar as procedures em todas as empresas ele precisa entrar em cada empresa.
O AP5 Server é o centro de funcionamento do Advanced Protheus. É o encarregado pelo processamento das aplicações,
gerenciamento das conexões e compilação de programas. E uma de suas principais características é a alta conectividade. Ou
seja, o AP5 pode ser integrado a diferentes soluções ou sistemas, através da utilização de uma API de acesso (contida em uma
DLL) ou um controle ActiveX, ou mesmo diretamente através da Web (via protocolo HTTP ou FTP). Isso permite outras
aplicações a terem acesso a execução de funções (jobs) no AP5, utilizando o conceito de RPC.
RPC (Remote Procedure Call) significa Chamada Remota de Procedimentos, ou seja, através de uma aplicação externa (ou
através da Internet) é possível executar no AP5 rotinas criadas em ADVPL. Tais rotinas poderão realizar todo o tipo de tarefa
desejada, como por exemplo cadastrar um pedido, um cliente, ou emitir um relatório em formato HTML, retornando
informações à aplicação externa.
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.
São duas as opções para realizar RPC entre uma aplicação externa e o AP5:
Uma API de acesso, utilizando a DLL (Dinamic Link Library) chamada AP5DCONN.DLL;
Um controle ActiveX , utilizado através do arquivo AP5CONNXCONTROL.OCX.
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.
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âmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função. É através
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âmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função.
s:
Retorno: Sem retorno.
Sintaxe: AP5Disconnect(nAP5)
AddNullParam,
AddNumericParam,
AddStringParam,
AddLogicalParam,
AddDateParamAsDouble,
AddDateParamAsString,
AddArrayParam
Descrição: Estas funções são utilizadas para a execução de processos em um servidor AP5. Podem ser
utilizadas somente após uma conexão ser ativada. Um processo executado em um servidor AP5
pode necessitar de parâmetros, que deverão ser enviados ao servidor antes da execução do
processo através da utilização destas funções. Os tipos de dados que podem ser enviados são:
Numérico (int), Caracter (char *), Lógico (bool), Data (enviado como caracter – char * - ou
como numérico - int) e Array (variant).
Parâmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função. É através
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.
Programação em ADVPL / SQL / ASP com AP5
Sintaxe: lOk = AddNumericParam(nAP5,5)
ou
lOk = AddStringParam(nAP5,“TEXTO”)
ou
lOk = AddLogicalParam(nAP5,true)
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âmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função.
s: 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.
AP5BuildNumber
Descrição: Função utilizada para obter o número do build de compilação da API de conexão ao AP5.
Parâmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função;
s: 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âmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função;
s: 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”).
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.
Parâmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função;
s: cEnv: char * - Ambiente que será utilizado para a execução do processo;
cFunc: char * - Nome do processo ou função que será executado no AP5 Server;
lWait: bool - Verdadeiro ou Falso indicando se a aplicação externa deverá ou não aguardar pelo
término da execução do processo.
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âmetro nObjectID: int - Handle da instância que será utilizada para a execução desta função;
s: 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”)
Programação em ADVPL / SQL / ASP com AP5
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
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).
O RPC através da Internet é realizado diretamente com o AP5 Server utilizando o protocolo HTTP. Isto significa que é
possível criar páginas HTML que executem processos no AP5 Server, ou mesmo utilizar recursos de conectividade Wireless,
como por exemplo um Palm, para acessar e executar processos diretamente no AP5 Server através do protocolo HTTP. Neste
último caso é possível também utilizar uma conexão direta TCP/IP (via socket).
Para realizar o RPC utilizando o protocolo HTTP diretamente com o AP5 Server, não é necessário a utilização de um servidor
Web de terceiros, pois o AP5 Server também é um servidor Web.
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 protocolo HTTP (HyperText Transmission Protocol) é o protocolo utilizado na comunicação entre um servidor e
um Web Browser. É o protocolo utilizado para o envio e recebimento de páginas formatadas em padrões SGML
(HTML,XML, etc). Este protocolo se baseia principalmente em dois comandos: GET e POST. O comando GET é utilizado
para obter alguma informação do servidor HTTP e o POST para “postar” informações para o servidor. Mais adiante, será
mais fácil compreender onde tais comandos são utilizados no AP5 Server.
Para habilitar o serviço de HTTP no AP5 Server, os seguintes grupos devem ser criados no arquivo de configurações
(AP5SRV.INI):
HTTP]
Enable=1
Path=C:\AP5\HTTP
RPCServer=SERVERKEY
RPCEnv=ENVIRONMENT
RpcTimeOut=40
Port=1234
GetProc=<função>
PostProc=<função>
[SERVERKEY]
TYPE=TCPIP
Server=172.16.1.1
Port=5024
- GetProc e PostProc são parâmetros opcionais que podem ser utilizados para interceptar os comandos GET e POST
que caem no AP5 Server. Quando um comando desses é requisitado ao servidor e uma destas chaves está em uso, a
função informada é executada e receberá um parâmetro com o nome da página, arquivo ou função, originalmente
requisitado.
Grupo <SERVIDOR> (no exemplo, SERVERKEY)
- TYPE indica o tipo de conexão que será efetuada entre o servidor atual (que é o AP5 Server encarregado de
responder os requests HTTP) e o servidor de RPC (que é o encarregado de executar as rotinas em Advpl);
- Server indica o nome ou endereço IP do servidor encarregado da execução das rotinas em Advpl (RPC). Note que
estes servidor não precisa necessariamente ser um servidor diferente do utilizado para responder aos requests HTTP
(aquele que trabalha como Web Server);
- Port é a porta utilizada para conexão ao Servidor RPC.
Programação em ADVPL / SQL / ASP com AP5
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”);
Programação em ADVPL / SQL / ASP com AP5
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.
- __aPostParms: Este parâmetro recebe um array bidimensional com os campos contidos em um formulário
HTML recebido através de um comando POST. Cada item deste array contém um array com o nome do campo
e o valor informado. Por exemplo, para um formulário com dois campos para digitação (um chamado nome e o
outro chamado endereco), que enviam os dados para a função cadastro.apl através de um POST, a função
receberá o array __aPostParms da seguinte forma:
{
{“nome”, “NOME DIGITADO NA PAGINA HTML”},
{“endereco”, “ENDERECO DIGITADO NA PAGINA HTML”}
}
A função pode tratar os dados recebidos neste array para realizar um processamento específico com tais
informações. Para campos onde não é possível a entrada de dados e sim a escolha de uma informação pré-
definida (como por exemplo um checkbox), o item somente existirá no array caso o campo tenha sido
selecionado no formulário HTML (por exemplo, se o checkbox for marcado).
- __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”}
}
A função pode tratar estes dados recebidos para realizar processamentos específicos. É muito útil também para
criar links de execução diretamente através de um Web Browser.
- __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.
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>
Programação em ADVPL / SQL / ASP com AP5
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.
A grande vantagem de se criar arquivos ADVPL ASP em relação a criar funções APL simples, decorre do fato de que não é
necessário conhecer tão profundamente HTML e que nas funções APL simples o desenvolvedor deve se preocupar em
retornar todo o HTML necessário para a correta exibição no Web Browser. E também, como o ADVPL ASP mistura o script
HTML com o código interpretável, pode-se criar um arquivo APH utilizando o editor desejado (como o Microsoft
FrontPage por exemplo) e inserir o código necessário entre o script. Outro detalhe importante é que pode-se utilizar as
estruturas de fluxo da linguagem ADVPL para repetir comandos do próprio script HTML (por exemplo, colocar um
comando de script HTML dentro de um comando While em ADVPL):
Note que também pode existir diferentes blocos de código interpretável separados pelos delimitadores, dentro de um mesmo
arquivo.
Tão importante quanto mesclar código interpretável com script de formatação HTML, é utilizar os comandos ADVPL para
alterar o script de formatação. Ou seja, colocar o conteúdo de variáveis, campos, etc, diretamente no HTML que será
enviado à aplicação client (ao Browser por exemplo). Isso pode ser realizado através dos delimitadores de avaliação. Os
delimitadores de avaliação são <%= para abertura e %> para encerramento. Diferentemente dos delimitadores de código
interpretável, estes devem sempre estar na mesma linha. Com eles pode-se criar uma linha de script HTML, cujo conteúdo
contém uma expressão que será avaliada em tempo de execução:
<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
Local i
For i := 1 To Len(__aProcParms)
%>
Programação em ADVPL / SQL / ASP com AP5
<tr>
<td width="181" height="24" bgcolor="#FFFFCC"><%= __aProcParms[i,1] %></td>
<td width="327" height="24" bgcolor="#FFFFCC"><%= __aProcParms[i,2] %></td>
</tr>
</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>
</html>
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
7. Conceito do ADVPL
Objetivo : Este curso tem como objetivo treinar e aperfeiçoar nossos clientes com algumas funções que a
microsiga desenvolveu no Siga PROTHEUS.
Programação em ADVPL / SQL / ASP com AP5
Todos os tópicos mencionados poderão servir como base consulta, considerando-se como “ideal” o
ambiente apresentado nas versões, pacths, e build´s .
8. Função
8.1. Função FIELDGET()
Esta função tem a finalidade de criar / duplicar o registro dentro do arquivo corrente oude um outro arquivo ,
entretanto este comando necessita ser utilizado com um outro comando primo .
Alem de que os arquivos tanto de origem como o de destino devem Ter sua estrutura identica, mesmos
campos / tamanhos / tipos.
Primicia basica voce necessita estar posicionado na arquivo e registro que voce deseja ser duplicado ou
copiado.
Sintaxe :
Exemplo :
DbSelectArea("SC7")
_aCamposSC7 := {}
For _nI := to Fcount()
AADD ( aCamposSC7,FieldGet(_nI))
Next
8.2. FIELDPUT()
Esta função tem a finalidade de incluir ou seja pegar o conteudo do resultado da função acima e duplica o
registro dentro do arquivo corrente ou de um outro arquivo, entretanto este comando necessita ser utilizado
por um comando primo .
Alem de que os arquivos tanto de origem como o de destino devem Ter sua estrutura identica, mesmos
campos / tamanhos / tipos.
Primicia basica voce devera travar o registro no arquivo sempre com o comando RECLOCK() com a opção
de verdade .
Sintaxe :
FIELDPUT(_NCONTADOR,ARRAY[_Contador])
Exemplo :
DbSelectArea("SC7")
RecLock("SC7",.T.)
For _nI := to Len( aCamposSC7)
FIELDPUT(_Ni,_aCamposSC7[_nI])
Next
8.3. GETADVFVAL
Programação em ADVPL / SQL / ASP com AP5
Tipo: Processamento
Esta função permite executar uma pesquisa em um arquivo, pela chave especificada
e na ordem especificada, retornando o conteúdo de um ou mais campos.
Sintaxe
GetAdvFVal(cAlias,uCpo,uChave,nOrder,uDef)
Parâmetros
cAlias – Alias do arquivo.
uCpo – Nome de um campo ou array contendo os nomes dos campos desejados.
uChave – Chave para a pesquisa.
nOrder – Ordem do indice para a pesquisa.
uDef – Valor ou array “default” para ser retornado caso a chave não seja encontrada.
Retorna
uRet – Retorna o conteúdo de um campo ou array com o conteúdo de vários campos.
Exemplo
// Exemplo de uso da funcao GetAdvFVal:
// Obtendo apenas de um campo:
cChave := SD2->D2_COD+SD2->D2_LOCAL
cDesc := GetAdvFVal(“SB1”,B1_DESC,cChave,1,SC6->C6_DESCRI)
cChave := SD2->D2_COD+SD2->D2_LOCAL
aCpos := {B1_DESC+2B1_PRV1,B1_UM}
aDados := GetAdvFVal(“SB1”,aCpos,cChave,1,{SC6->C6_DESCRI,SC6->C6_PRCVEN,SC6->C6_UM})
refere-se aos Itens do Pedido de Venda) e, após pesquisar no SB1 (Cadastro de Produtos), sugerir a
quantidade vendida a partir de um campo específico:
// Colunas...
cCodigo := aCols[n,nPosCod]
// Pesquisa
dbSelectArea(“SB1”)
dbSetOrder(1)
dbSeek(xFilial(“SB1”)+cCod)
8.4 - SETDEFAULT
Tipo: Processamento
Programação em ADVPL / SQL / ASP com AP5
Sintaxe
SetDefault (aArray, cAlias)
Parâmetros
aArray – Array aReturn, preenchido pelo SetPrint
[1] Reservado para Formulário
[2] Reservado para Nº de Vias
[3] Destinatário
[4] Formato => 1-Comprimido 2-Normal
[5] Mídia => 1-Disco 2-Impressora
[6] Porta ou Arquivo 1-LPT1... 4-COM1...
[7] Expressão do Filtro
[8] Ordem a ser selecionada
[9]..[10]..[n] Campos a Processar (se houver)
cAlias – Alias do arquivo a ser impresso.
Retorna
Nil
Comentários
Esta função habilita os padrões de relatório alterados pela função SetPrint.
Exemplo
// Define Variáveis
cString:= “SB1”
NomeRel:= MATR290lR
cPerg := MTR290lr
titulo := RELAÇÃO PARA ANÁLISE DOS ESTOQUESlL
cDesc1 := “Este relatório demonstra a situação de cada item em “
cDesc2 := “relação ao seu saldo , seu empenho , suas entradas previstas”
cDesc3 := “e sua classe ABC”
aOrd := { Por Codigo io,lg Por Tipo }
Tamanho := G
8.5 - CRIATRAB
Tipo: Processamento
Cria arquivo de trabalho.
Sintaxe
CriaTrab(aArray,lDbf)
Parâmetros
Programação em ADVPL / SQL / ASP com AP5
Retorna
ExpC1 – Nome do Arquivo gerado pela função.
Comentários
Esta função retorna o nome de um arquivo de trabalho que ainda não exista.
Caso lDbf = .T., a função criará um arquivo DBF com este nome e a estrutura definida em aArray.
Caso lDbf = .F., a função não criará arquivo de nenhum tipo, apenas fornecerá um nome válido.
Exemplos
// Com lDbf = .F.
cArq := CriaTrab(NIL, .F.)
cIndice := C9_AGREG+IndexKey()
Index on &cIndice To &cArq
aStru := {}
AADD(aStru,{ MARK , “C”, 1, 0})
AADD(aStru,{ AGLUT , “C”, 10, 0})
AADD(aStru,{ NUMOPl, “C”, 10, 0})
AADD(aStru,{ PRODUTO, “C”, 15, 0})
AADD(aStru,{ QUANT , “N”, 16, 4})
AADD(aStru,{ ENTREGA,” D”, 8, 0})
AADD(aStru,{ ENTRAJ, “D”, 8, 0})
AADD(aStru,{ ORDEM , “D”, 4, 0})
AADD(aStru,{ GERADO , “C”, 1, 0})
cArqTrab := CriaTrab(aStru, .T.)
USE &cArqTrab ALIAS TRB NEW
8.6 - PROCREGUA
Sintaxe
ProcRegua(nRegs,nLinha,nColuna)
Parâmetros
nRegs – Número de registros que serão processados.
nLinha – Número da Linha da régua
nColuna – Número da Coluna da régua
Retorna
Nil
Exemplo
ProcRegua(1000)
For i:= 1 to 1000
IncProc()
Next
Return
No RdMake Windows a ProcRegua só utiliza o primeiro parâmetro. No RdMake
DOS são utilizados os três parâmetros.
8.7 - INCPROC
Sintaxe
IncProc()
Parâmetros
Nil
Retorno
Nil
Exemplo
ProcRegua(1000)
For i:= 1 to 1000
IncProc()
Next
Return
Tipo: Tela
Desenha um box 3d.
Sintaxe
@ nLInha1,nColuna1 TO nLinha2,nColuna2 <TITLE> cTítulo
Parâmetros
nLinha1 – Número da linha superior
nColuna1 – Número da coluna superior
nLinha2 – Número da linha inferior
nColuna2 – Número da coluna inferior
cTítulo – Titulo apresentado na linha superior (opcional)
Comentários
A cláusula TITLE é opcional. Se for omitida, o box não terá título.
Exemplo
@ 000, 000 TO 430, 500 DIALOG oDlg TITLE (“Tela de browse”)
@ 060, 005 TO 185, 245 TITLE ‚Exemplos
@ 070, 010 BUTTON U_Objetos SIZE 70,20 ACTION Execute(BasicObj)
@ 070, 090 BUTTON U_Browses SIZE 70,20 ACTION Execute(Browse)
@ 130, 170 BUTTON U_Dlg c/Refresh SIZE 70,20 ACTION Execute(DlgDinam)
@ 160, 090 BUTTON U_SQL SIZE 70,20 ACTION Execute(SqlDemo)
@ 192,218 BMPBUTTON TYPE 1 ACTION Close(oDlg)
ACTIVATE DIALOG oDlg CENTERED
8.9 - MBROWSE
Tipo: Processamento
Programação em ADVPL / SQL / ASP com AP5
Sintaxe
mBrowse(nLinha1, nColuna1, nLinha2, nColuna2, cAlias, aFixe, cCpo, nPar, cCor, n Opc)
Parâmetros
nLinha1 – Número da linha inicial
nColuna1 – Número da coluna inicial
nLinha2 – Número da linha final
nColuna2 – Número da coluna final
cAlias – Alias do arquivo
aFixe – Array contendo os campos fixos (a serem mostrados em primeiro
lugar no browse)
cCpo – Campo a ser tratado. Quando vazio, muda a cor da linha
nPar – Parâmetro obsoleto
cCor – Função que retorna um valor lógico, muda a cor da linha
nOpc – Define qual opção do aRotina que será utilizada no double click
Exemplo
cCadastro := “Cadastro de Orcamentos”
aRotina := {{“Pesquisar” ,AxPesquil ,0,1};
{“Incluir “ ,ExecBlock(“DEMOA”,.F.),0,3};
{“Altera “ ,ExecBlock(“DEMOB”)l.,0,4};
{“Exclui “ ,ExecBlock(“DEMOC”,.F.),0,5}}
8.10 - MARKBROWSE
Tipo: Processamento
Monta um browse padrão do sistema, permitindo marcar e desmacar linhas.
Sintaxe
MarkBrowse(cAlias,cCampo,cCpo,aCampos,lMarc,cMarca,cCtrlM,lBotoes,cTopFun,cBotFun,aCoord)
Parâmetros
cAlias – Álias do arquivo
cCampo – Campo que estabelece relação com a culuna de marca
cCpo – Campo que se estiver vazio muda a cor da linha
aCampos – Array com os campos para montar o browse
lMarc – Flag para inicializar marcado ou não
cMarca – Marca obtida com a função Getmark
cCtrlM – Função para ser executada no Alt_M
lBotoes – Parâmetro obsoleto
cTopFun – Função filtro para estabelecer o primeiro registro
cTopFun – Função filtro para estabelecer o último registro
aCoord – Array com as coordenadas da MarkBrowse.
Exemplo
cMarca := GetMark()
cCadastro := “Escolher Clientes”
aRotina := { { “Pesquisa”,.AxPesqui,0,1}, ;
{“Visualizar”,.AxVisual,0,2}}