You are on page 1of 46

Programação em ADVPL

/

SQL / ASP com

AP5

Programação ADVPL /SQL / ASP

Com Protheus 5.08

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
1.3.
Conhecendo a estrutura de Armazenamento dos dados
1.3.1. LOG do Banco de dados
1.3.1.1.
Controle Transacional

Programação em ADVPL / SQL / ASP com AP5
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.
2.10. Performance
2.10.1. Otimizando seu código

Programação em ADVPL / SQL / ASP com AP5
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
4. AP5 WEB - CONECTIVIDADE
5. RPC ENTRE O AP5

E

OUTRAS APLICAÇÕES

5.1 A API de comunicação com o AP5
5.2 O Controle ActiveX
6. RPC ATRAVÉS

DA INTERNET

6.1 O AP5 Server como um servidor Web
6.1.1 Serviços de FTP
6.1.1 Serviços de HTTP
6.2 Criando funções APL
6.2.1 Exemplo de função APL
6.3 O ADVPL ASP
6.3.1 Características do ADVPL ASP
7.
8.

Introdução
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()

1. Introdução ao ambiente Relacional
1.1.
Objetivos
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.
Todos os tópicos mencionados poderão servir como base de consulta, para escrita de programas e
resolução de problemas.

Programação em ADVPL /
1.2.

SQL / ASP com

AP5

Conceitos Básicos de Banco de Dados
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.

Este fato é garantido pela definição no seu banco de dados de uma transação implícita. backups e segurança. 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.1. . Se você faz uma inclusão no banco de dados de uma simples linha o mesmo garante a inclusão completa da linha (inserção de todas as colunas). Agora vamos supor que você tenha uma operação que necessite que várias inclusões.1.3. Conhecendo a estrutura de Armazenamento dos dados 1. alteração ou exclusão de registro é armazenada primeiramente na área de LOG. configuração.1. quanto a otimização. 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. alterações e exclusões realizadas só sejam efetuadas quando todas as operações tenham sido efetuadas com sucesso. Controle Transacional Toda e qualquer operação de inclusão.3. caso contrário todas as operações devem ser canceladas. 1. LOG do Banco de dados 1.Programação em ADVPL / SQL / ASP com AP5 Devido ao controle exercido sobre os dados a performance do banco acaba sendo prejudicada. Sabemos que na prática isto só funciona para empresas grandes.3. 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.

etc. Devemos tomar cuidado com query’s que necessitem área de trabalho.3. Em clientes com base de dados pequenas. Este tramite de transferência é chamado de CheckPoint . mas somente utilizamos até o terceiro nível.Programação em ADVPL / SQL / ASP com AP5 Para definição de transação pelo usuário. este ponto é configurável de acordo o SGDB utilizado.3.1. Produto . A área de LOG do Banco de dados é normalmente definida com 25% do tamanho da área de dados. normalmente operações que exigem um determinada ordenação no resultado e não existe nenhum índice correspondente.3. 1.2. que no momento da implementação serão percebidos. definir a estrutura de entidades e seus atributos eliminando vários problemas de definição de armazenamento dos dados. mudando o intervalo de linhas. precisamos tomar cuidado sempre com o intervalo de registros.3. percebemos que quanto menor for o número de operações de inserção. Ex. Banco de dados que possuem grandes transações ocasionam problemas de deadlock. a mesma é utilizada em situações que o SGDB precisa gerar arquivo temporários para resolver as query’s que estamos solicitando.1. mas o seu excesso gera problemas na programação. para definir início e fim de uma transação respectivamente. normalmente se utilizam os comandos BEGIN e COMMIT .2. . alteração e exclusão realizados dentro de uma transação melhor será a performance. Área temporária do Banco de Dados Esta área é de utilidade exclusiva do Banco de Dados. 1. O LOG também é utilizado para fazer o backup de grande bancos de dados. o processo de check point só é realizado após o Backup da área de LOG.: Entidade = Pedido Atributos = Data Emissão. se for o caso devemos executar várias vezes o mesmo blocos de comandos. Quantidade . Realização de grandes updates na base de dados sem informar a clausula Where delimitando um intervalo de linhas a serem modificados. Existe casos que a desnormalização é uma das melhores soluções. não utilizamos este tipo de recurso. Para o cancelamento de um transação sem sucesso normalmente chamamos de ROLLBACK. não indica que a mesma estará sendo transferida para a área real dos dados. 1. Normalização de Base de Dados A normalização de Base de dados tem como objetivo. Existe até cinco níveis de normalização . Para bancos de dados de maior escala. atualmente não existe equipamento capaz de administrar um Banco de dados normalizado totalmente. mas este fator depende muito do número de usuários e a quantidade de transações realizadas em um determinado intervalo de tempo. para facilitar o desenvolvimento da aplicação ou para ganharmos performance. Construindo Query’s evitando problemas com estouro da Área de LOG Conhecendo melhor o processo de gravação do banco de dados.4. portanto temos sempre que fazer o máximo de normalização mas devemos estar consciente de quanto conseguiremos de vantagem com isto. 1. guardando somente as alterações efetuados em um determinado intervalo de tempo. Com a pratica vamos perceber que a normalização é muito boa. Na alteração e exclusão de linhas. e destes atributos devemos definir um atributo chave de relação. Segurança e Backup Depois que uma transação é concluída com sucesso. por que elas estarão perdendo mais tempo com i/o de disco. A primeira forma normal diz que devemos definir a entidade e seus atributos. deste forma nunca teremos problemas com a área de LOG.

e os pontos de integração são replicados em cada MER do correspondente módulo. Além de apresentar todo o fluxo do dado dentro de um Banco de Dados.: 1. o servidor destes arquivos é apenas um mero repositório de dados. A terceira forma normal diz que devemos eliminar colunas que são concebidas por calculo de outras colunas de mesma entidade. vários regras de programação e definição como apresentamos acima. nestes casos o modelo é feito por módulo. MER (Modelo Entidade Relacionamento) A partir da normalização podemos definir as relações estrangeiras de cada tabela. No caso do SigaPROTHEUS / AP5 você ter em mãos toda a estrutura do sistema é quase impossível. atendendo a primeira forma normal).(Este tipo de campo gera vários problemas na programação SQL) A segunda forma normal diz que devemos subdividir os atributos que ocorrem mais de que uma vez. em uma outra entidade.6. garantindo sua integridade como um todo. 2.. etc. SQL – Trabalha de forma relacional (Teoria dos conjuntos) e o acesso é de forma centralizada Agora quando trabalhamos com Base de Dados Relacional. 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.6. Quantidade. criaremos o Código. 1. Entidade = Itens do Pedido Atributos = Número. etc. Quantidade Total. o SGDB precisa utilizar processamento do Servidor para recuperar um dado solicitado pela aplicação. 1. Diferenças cruciais entre ambientes DBF e SQL 1. Este ambiente utiliza o modo Shared de controle de arquivos do sistema operacional.5.: Entidade = Pedido Atributos = Número do Pedido (Chave).1. TopConnect . Ex. a programação feita na aplicação deve ser bem otimizada para evitar requisições desnecessárias. a estrutura é totalmente diferente. O Banco de Dados suporta grande capacidade de armazenamento de dados. nada é processado no Server. A desvantagem de utilizar estes arquivos normalmente é taxada pelo problemas gerados com erro em arquivos de índices e o nível de segurança muito baixo. Devemos atender várias exigências como controle de acesso ao dado que é muito mais restrito. não precisam ser cumpridas. DBF – Trabalha de forma posicional com acesso compartilhado Quando trabalhamos em um ambiente posicional. E mesmo assim os processos são rápidos e de fácil manuseio. ou seja. A desvantagem do Banco de Dados é a necessidade de equipamentos potentes para atender a demanda. Data de Emissão. item (Número+item = chave).Programação em ADVPL / SQL / ASP com AP5 Neste caso criaremos um campo código que define a sua chave principal de relacionamento. Nunca utilize mais de um coluna agregada com campo chave. o MER é uma modelo gráfico que facilita a visualização do desenvolvimento de aplicativo.6.(Esta entidade deve ter um campo chave.2. Entidade = Atributos = Pedido Total do Pedido. etc. Ex.

3.são armazenados em variáveis do tipo CHAR (0 ou 1) .0 Oracle 7.são armazenados em variáveis do tipo FLOAT . 2. etc.5 e 8i IBM Universal Database 5.0 DB2/400 Sybase Anywhere Sybase SQL-Server Informix ( MSSQL / MSSQL7 ) ( ORACLE ) ( DB2 ) ( AS/400 ) ( ANYWHERE / ANYSYB ) ( SYBASE ) ( INFORMIX ) O TOPConnect é composto por um biblioteca replaceble database driver(RDD) e componentes de comunicação.2.1. 8.) porem para existir uma unicidade no código do Topconnect alguns dados são armazenados de forma diferente da definida na tabela SX3.4. SQL / ASP com AP5 Informações gerais O TOPConnect foi desenvolvido em linguagem ‘C’ pela Microsiga e é utilizado hoje pelo SigaPROTHEUS / AP5 através da linguagem ADVPL (PROTHEUS Protheus Language). sendo estes bibliotecas para aplicativos DOS e DLL's para aplicativos Windows.5 e 7. Controle de tipo de dados ( Tabela TOP_FIELD ) Em um banco existem vários tipos de dados (CHAR. 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.Programação em ADVPL / 2. FLOAT. NUMBER. Ele também pode ser utilizado por aplicações XBASE que queiram trocar a base de dados de DBF para SQL. VARCHAR. que são apresentados logo em seguida. porem a aplicação recebe o dado da forma como definido.0. Os tipos de dados que são tratados atualmente são o seguintes:   Campos numéricos Campos Lógicos . Os gerenciadores de banco de dados hoje suportados são:        MS-SQL Server 6. Estas bibliotecas devem ser linkeditadas com sua aplicação ADVPL para acessar o TOPConnect Server.

ou você pode ajustar o dicionário de dados manualmente conforme estrutura no Banco de Dados.são armazenados em variáveis do tipo CHAR com 8 bytes.SA1010 A1_LC P 14 2 dbo. eliminar a tabela e deixa-la criar novamente e depois importar os dados via APPEND(Utilize SDU/CFG-AP5). Opções de Visualizar os Eventos (Mensagens de Erros) A parte mais importante do Topconnect Manager é o gerenciamento das mensagens de erros. .SA1010 A1_DESC P 2 0 dbo.SA1010 @@HAS_DFT_VAL@@ X 0 0 . Por exemplo o valor 40..: Tabela SA1010 A1_FILIAL C A1_COD C A1_LOJA C A1_DESC C A1_EMISSAO C A1_VEND1 C . Ex. ou seja. Quando formos utilizar query’s você deve utilizar a função TCSETFIELD para resolver esta situação. SQL / ASP com AP5 . Importante também salientar que qualquer modificação efetuada em arquivo SX3 diretamente. Você só estará recebendo mensagens se o link entre o Banco de dados e o Topconnect estiver funcionando.. no formato Os campo caracter não recebem nenhum tratamento. é 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.39999999.. você pode Ter problemas com inconsistência de estrutura da tabela do Banco de Dados e TOP_FIELD contra o dicionário de dados.SA1010 A1_EMISSAO D 8 0 dbo. de cada Banco de Dados. etc. A tabela TOP_FIELD contem a descrição de todos os campos NAO-CARACTER. 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).: Tabela TOP_FIELD 2 6 2 1 8 6 FIELD_TABLE FIELD_NAME FIELD_TYPE FIELD_PREC FIELD_DEC -----------------------------------------------------.---------------dbo.-------------------------------. sem utilizar o configurador. Para resolver este problema você deverá remover os dados da Tabela do Banco de dados. Ela é “alimentada” na criação de uma tabela. ou seja. data e Lógico (no caso não existe nenhum usado pelo arquivo). estas mensagens não são do TopConnect mas sim. para que o TopConnect faca a conversão dos dados quando da leitura dos mesmos.Programação em ADVPL /  Campos Data YYYYMMDD. Number(Oracle).-----------------.-----------------. Neste exemplo vocês perceberão que na tabela TOP_FIELD só existe os campo numéricos. Ex. 2. Na maioria dos problemas este logo de erros é o ponto principal para descobrir o que esta acontecendo.SA1010 A1_MCOMPRA P 17 2 dbo.3. entre o Topconnect e o Banco de dados.SA1010 A1_METR P 7 2 dbo.SA1010 A1_COMIS P 5 2 dbo.40 no banco pode estar armazenado como 40.. (Veja função TCSETFIELD). se você obtiver um erro de Logon o erro que você receberá neste reporte.

Se você possui sua aplicação trabalhando em DBF . 2.1.4.483.4.Programação em ADVPL / 2. 2. Esta coluna não possui repetição.4.147. 2.2. Este identificador é utilizado pela aplicação na pesquisa e posicionamento de registro. os mesmos são apenas marcados. SQL / ASP com AP5 Sistema de controle de Registros 2.4. Esta operação é feita pelo TopConnect . tem por objetivo principal guardar um número seqüencial de controle de registro. e se você já esta em uma base SQL do tipo MSSQL SQL Server e gostaria de porta-la para ORACLE. Você verá mais adiante exemplos de programas e uma apresentação mais completa deste assunto. Limite de registros O limite de registros em uma tabela é de 2. Renumeração da coluna RECNO Quando os registros são deletados pelo sistema.2. 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.2.1. você pode porta-la independente de modificações para uma Base SQL. Alerta! : Se você possui programas específicos desenvolvidos (RDMAKES). Não existe a necessidade de fazer a renumeração desta coluna.648 . você pode fazer isto sem nenhum problema. mais conhecido como ID (identificador). Portabilidade Acreditamos que muitos já perguntarão por que da existência da coluna R_E_C_N_O_ no Banco de dados. a não ser que você esteja perto de estourar o maior número possível nesta coluna. ela é sempre preenchida com o valor máximo da coluna R_E_C_N_O_ + 1 nas próximas inserções. este número normalmente deve ser levado em consideração para as tabelas que recebem muita inserção de registro seguidas de muitas exclusões física do registro. Neste caso você precisar extrair os dados do Banco de Dados para uma Base DBF e logo em seguida subir a . você precisa que os mesmos estejam desenvolvidos nos padrões de compatibilidade exigidos pela Microsiga. 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. para exclusão física acontece em quando executamos a operação que conhecemos com Pack de registros. Função da coluna R_E_C_N_O_ A Coluna R_E_C_N_O_.4.2. Após esta operação a coluna R_E_C_N_O_ não é renumerada.

este índice e sempre composto da coluna R_E_C_N_O_ e não permite duplicidade. Se você criou um índice pelo SINDEX e depois percebeu que montou errado ou precisa elimina-lo. tendo em vista a não existência da mesma no Banco de Dados. você deve reiniciar o serviço do Topconnect (Parando / iniciando o Serviço). Controle dos registros deletados (Coluna D_E_L_E_T_) Toda exclusão de registro feita no Banco de Dados ou em qualquer plataforma do SigaPROTHEUS / AP5.mnu para abertura estarão em memória no TopConnect. e esta marca é feita utilizando o campo chamado D_E_L_E_T_ . A solução neste caso é utilizar o utilitário DEFAULT que esta disponível no site da Microsiga.2. 2. você precisa eliminá-lo do SINDEX e também do Banco de Dados. estará correndo risco de inserir nulos na Base de Dados.3. Alerta!: Se você fizer qualquer operação de transferência via Banco de Dados que não transfira os Defaults. 2. 2. automaticamente a coluna R_E_C_N_O_ será ajustada. de preferência a permissão de DBA. ou seja. .1. Alerta! : Quando você utiliza o comando Set Delet on/off. ou seja. as referências de cada tabela selecionado no . e logo em seguida você utilizar o sistema . o registro é marcado como excluído (delete). Alerta!: Nunca remova os índices das tabelas. 2. este índice tem como formação do nome = <nome da tabela> + _RECNO . Para isto o usuário criado para o TopConnect acessar o banco de dados precisa Ter permissão de criação de tabelas.3. principalmente o índice RECNO que não será criado pelo TopConnect quando a tabela já existe. ele poderá travar ou derrubar conexões com dados indevidos. 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. Se isto acontecer você poderá Ter problemas com o TopConnect Server. Criação da Estrutura de tabelas A estrutura de cada tabela do SigaAdvacend é criada automaticamente. Índices Os índices são criados imediatamente após a criação da estrutura das tabelas. 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. a mesma é preenchida com (*) Asterisco.5. 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. Os índices criados partem do arquivo de índices do SigaPROTHEUS / AP5. datas e Lógicos. Neste momento a tabela TOP_FIELD estará sendo alimentada com todos os campos numéricos. nos comandos de inserção e alteração.5. Constraints do Banco de dados que são criados automaticamente 2.4.5. Defaults São constraints de validação de campos que não são informados. Existe um índice que é criado apenas uma vez no momento em que a tabela é criada. se você não possui os defaults criados o Banco de Dados estará deixando estes campos com valor nulo. só é feita logicamente.5. o TopConnect estará tratando o dado para você.Programação em ADVPL / SQL / ASP com AP5 Base novamente para o Banco de Dados. que é o arquivo SINDEX. Os defaults são criados no momento da criação das tabelas. caso contrário a coluna permanece com o conteúdo em branco.

4. .(Filiial=Branco) Filial Pedido --------. CONSTRAINT [DF__SA1990__R_E_C_N___6F4C17CF] DEFAULT (0) FOR [R_E_C_N_O_] GO CREATE INDEX [SA19901] ON [dbo]. [R_E_C_N_O_]) ON [PRIMARY] GO CREATE INDEX [SA19903] ON [dbo].. CONSTRAINT [DF__SA1990__A1_NOME__0940F3FC] DEFAULT (' ') FOR [A1_NOME]. isto pode provocar problemas que aparentam ser erro de índice. CONSTRAINT [DF__SA1990__A1_TIPO__0B293C6E] DEFAULT (' ') FOR [A1_TIPO]. [D_E_L_E_T_] [varchar] (1) NULL .000002 e sua tabela por qualquer motivo não tem os contraints de defaults na coluna filial.-----------Null 000003 000001 000002 Neste exemplo você percebe que o pedido 000003 aparece em primeira ordem. CONSTRAINT [DF__SA1990__A1_NREDU__0A351835] DEFAULT (' ') FOR [A1_NREDUZ]. [A1_COD] [varchar] (6) NULL .[SA1990]([A1_FILIAL].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. Você tem a tabela de pedidos que com os pedidos 000001. [A1_LOJA]. sendo o índice filial+pedido. [A1_LOJA] [varchar] (2) NULL . se por ventura qualquer tabela tenha algumas linhas com alguma coluna com o valor nulo. [R_E_C_N_O_]) ON [PRIMARY] GO 2. [A1_LOJA]. o valor nulo na tabela ASCII(Binary Order) aparece antes do caracter espaço em branco. [R_E_C_N_O_] [int] NULL ) GO CREATE UNIQUE CLUSTERED INDEX [SA1990_RECNO] ON [dbo]..[SA1990]([A1_FILIAL]. CONSTRAINT [DF__SA1990__A1_LOJA__084CCFC3] DEFAULT (' ') FOR [A1_LOJA].[SA1990]([A1_FILIAL]. como ex.[SA1990] ( [A1_FILIAL] [varchar] (2) NULL . ou seja. [A1_TEL].[SA1990]([R_E_C_N_O_]) ON [PRIMARY] GO ALTER TABLE [dbo]. . [A1_CGC]. [A1_NREDUZ] [varchar] (20) NULL . . [R_E_C_N_O_]) ON [PRIMARY] GO CREATE INDEX [SA19902] ON [dbo]. CONSTRAINT [DF__SA1990__A1_COD__0758AB8A] DEFAULT (' ') FOR [A1_COD]. [A1_TIPO] [varchar] (1) NULL .5.. [A1_COD]. mas o nosso sistema não os utiliza.[SA1990]([A1_FILIAL].. [A1_NOME] [varchar] (40) NULL . [A1_NOME]. agora você faz a inserção do pedido 0000003 o sistema irá apresentar um Browse ordenado por pedido da seguinte forma: Considere a filial do arquivo de pedido de forma compartilhada. CREATE TABLE [dbo]. [R_E_C_N_O_]) ON [PRIMARY] GO CREATE INDEX [SA19904] ON [dbo]. CONSTRAINT [DF__SA1990__D_E_L_E___6E57F396] DEFAULT (' ') FOR [D_E_L_E_T_].[SA1990] WITH NOCHECK ADD CONSTRAINT [DF__SA1990__A1_FILIA__06648751] DEFAULT (' ') FOR [A1_FILIAL]. Problemas com conteúdo Nulo Os Bancos de dados possuem o conteúdo nulo para todos os tipo de campos.

Manutenção do Banco de dados 2.Ext> -w Exemplo ³RDMake Pack.T. ou utilize o programa fonte PACK para fazer esta operação em todas as tabelas.99 Descrição ³Rotina RDMAKE para eliminar os registros deletados do banco Uso ³RDMake <Programa. o mesmo esta disponível no site da Microsiga.T. .cQuery).168 BMPBUTTON TYPE 1 ACTION Execute(OkProc) @ 91. 'CONT'. Exemplo de fonte em ADVPL para executar um Pack no Banco de Dados . Alerta!: Se você tiver este problema. "TOPCONN". os mesmo devem ser excluídos fisicamente.) 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 .1.6.505 DIALOG oDlg5 TITLE "Rotina de Pack" @ 8.. Segue abaixo exemplo de fonte em RDMAKE. . Alerta!: Tabelas com conteúdo nulo.14 SAY "Este programa ira fazer um pack em todos arquivos abertos pelo PROTHEUS. com o nome de DEFAULT.12. geram vários problemas no sistema.196 BMPBUTTON TYPE 2 ACTION Close(oDlg5) @ 23.. TCGenQry(.222 @ 91. por que a tela de Browse do SigaPROTHEUS / AP5 não apresenta a coluna filial.exe 2. quanto as registros excluídos logicamente.Programação em ADVPL / SQL / ASP com AP5 Este problema muitas vezes causa a impressão que o índice esta com problemas. Existe um utilitário que ajusta este problema se você o tiver. 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).42 TO 323.prw */ @ 96. por que a sua existência em grande quantidade e de forma seqüencial gera um grave problema de performance no acesso aos dados. utilize a operação de Pack do utilitário SDU na tabela que possui registros excluídos .10 TO 84." 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(. para fazer um pack em qualquer Banco de dados..6. 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. Aumentando a performance executando a operação de PACK Esporadicamente você deve fazer uma manutenção no Banco de dados.F.

Índices condicionais Nos gerenciadores de banco de dados não existe a figura dos índices condicionais. Índices de produção 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.2) TO ARQIND No caso do SigaPROTHEUS você deve colocar o índice na tabela SINDEX.7. 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. O TOPConnect disponibiliza os dados na ordem solicitada pela cláusula OrderBy na Ordem 0 do arquivo.2.7. Considere uma aplicação que crie o seguinte índice: INDEX ON 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.Programação em ADVPL / SQL / ASP com AP5 return 2.AND.7.14.7.AND. CAMPO2 – Numérico de 14 Posições com 2 decimais.4. 2. 2. não interferindo assim com os índices do arquivo.3. Exemplo: INDEX ON CPOVAL1 + CPOVAL2 TO ARQIND . Funções em chaves de índices 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. SALDO > 10000 . Para se criar um índice que ordene o arquivo por CAMPO1 + CAMPO2 deverá o seguinte comando ser utilizado: INDEX ON CAMPO1+STR(CAMPO2. Para se obter resultados semelhantes aos índices condicionais o TOPConnect agregou nova funcionalidade ao filtro do SigaPROTHEUS / AP5.7.1. DBFNTX x TopConnect 2. Exemplo: Em um arquivo com a seguinte estrutura: CAMPO1 – Caracter de 10 posições.NOME FOR ESTADO = "SP" AND SALDO > 10000 Com o TOPConnect este índice seria o mesmo que: SET FILTER TO ESTADO = "SP" . 2. ORDERBY(CODIGO. As únicas funções suportadas são STR e DTOS. Chaves numéricas compostas Os SGDB's não suportam índices que contenham expressões ADVPL onde dois campos numéricos são somados na chave.

Analisando o seguinte filtro : SET FILTER TO CODIGO > "01000" . 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. 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.8.8. No TOPConnect o comando APPEND FROM importara registros de um arquivo DBF para uma tabela do banco de dados.AND. APPEND FROM 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.AND. CODIGO < "02000" 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. 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. Para a utilização destes comandos o programa deverá conter a seguinte instrução: #INCLUDE "TOPCONN.2.CH" 2. SQL / ASP com AP5 Expressões de filtro com funções e variáveis 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. COPY TO .Programação em ADVPL / 2.7.8.AND.dbf Ou SELECT CLIENTES //Importa registros da tabela NEWCLI APPEND FROM NEWCLI VIA "TOPCONN" 2. Exemplo SELECT CLIENTES //Importa registros de um DBF APPEND FROM c:\temp\newcli.5. 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. 2. SALDO > 10000 . Visando minimizar os problemas de performance o TOPConnect conta com um sistema chamado SFE (Smart Filter Engine) o que faz com que o máximo possível de uma expressão seja avaliada no servidor.1. Pôr exemplo: SET FILTER TO ESTADO = 'SP' . 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.

USE Abre uma tabela no banco de dados. Se nenhum parâmetro for especificado a tabela aberta na Work Area corrente será fechada. INDEX <cIndex List> Especifica o nome de 1 a 15 índices a serem abertos na Work Area corrente. Exemplo //Abre a tabela de Clientes em uma nova Work Area USE clientes SHARED NEW VIA "TOPCONN" 2. BEGIN. Desde o ponto em que uma aplicação executa um BEGIN TRANSACTION cada APPEND ou REPLACE encontrado até um COMMIT TRANSACTION ou ROLLBACK TRANSACTION serão considerados uma única transação. No TOPConnect o comando COPY TO é utilizado para exportar a estrutura e os registros de uma tabela do banco de dados para um arquivo DBF. Sintaxe: USE [<xcTable> [INDEX <xcIndex list>] [ALIAS <xcAlias>] [EXCLUSIVE | SHARED] [NEW] [READONLY] VIA "TOPCONN" <cTable> O nome da tabela a ser aberta. ALIAS < cAlias> Especifica um nome para a Work Area onde a tabela será aberta EXCLUSIVE Especifica que apenas este usuário terá acesso a esta tabela. READONLY Abre <cTable> apenas para leitura.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. 2.CH" SELECT CLIENTES if !Rlock() Alert("Registro em uso!") Return . Todas as outras tentativas de colocar esta mesma tabela em uso falharão. ROLLBACK TRANSACTION Marca o início de uma transação no banco de dados.f. Endif BEGIN TRANSACTION //Atualiza saldo no cadastro de clientes REPLACE SALDO WITH SALDO – nValor .8.4. Os demais usuários somente terão acesso aos novos registros ou às modificações após um COMMIT TRANSACTION Exemplo #INCLUDE "TOPCONN. SHARED Especifica que a tabela será aberta em modo compartilhado. NEW Abre a tabela <cTable> na próxima Work Area disponível. Se esta clausula não for especificada. VIA "TOPCONN" Este parâmetro indica ao ADVPL que esta Work Area será gerenciada pelo TOPconnect.3. COMMIT. <xcTable> será na Work Area corrente.8. Assim como no comando APPEND FROM no ADVPL o parâmetro opcional VIA também pode ser especificado.

TCCANOPEN Verifica a existência de tabelas e índices no servidor.2.. NPIPE Utiliza o protocolo Named Pipes. COMMIT TRANSACTION 2. 2.9.9.. APPEND BLANK REPLACE NUM WITH cNumero REPLACE QUANT WITH nQuant ..Programação em ADVPL / SQL / ASP com //Adiciona um pedido AP5 SELECT PEDIDOS APPEND BLANK REPLACE NUM WITH cNumero REPLACE VALOR WITH nValor SELECT ITEMS APPEND BLANK REPLACE NUM WITH cNumero REPLACE QUANT WITH nQuant . "TOPCONN") ENDIF USE CUSTOMER SHARED NEW VIA "TOPCONN" //Testa a existência do índice IF !TCCanOpen("CUSTOMER"...9. cIndice]) =>lógico Exemplo //Testa a existência da tabela customer IF !TCCanOpen("CUSTOMER") dbCreate("CUSTOMER".. . APPC Utiliza o protocolo APPC. TCCONTYPE Especifica o protocolo de comunicação a ser utilizado pelo TOPConnect. aStru. Sintaxe TCConType(<cType>) Onde <cType> pode ser: TCPIP Utiliza o protocolo TCP/IP."CUSTCOD") INDEX ON CODIGO TO CUSTCOD ELSE SET INDEX TO CUSTCOD ENDIF . Funções 2..1.... Sintaxe TCCanOpen(cTable [.

3.<cServer>) Onde o parâmetro <cConnectString> é composto por: Para TOPConnect NT : Nome do Banco de Dados / Nome do Ambiente Para TOPConnect/400: Nome do Ambiente O parâmetro <cServer> contém: Para conexões NamedPipe.9.5 Microsoft SQL-Server 7.4. . TCGETDB Retorna o Tipo de Banco de Dados corrente cDataBase := TCGETDB() Onde os valores de retorno são : MSSQL MSSQL7 ORACLE DB2 SYBASE ANYWHERE ANYSYBASE INFORMIX 2. TCDELFILE Exclui uma tabela no servidor.Programação em ADVPL / SQL / ASP com AP5 BRIDGE Utiliza o utilitário TOPBrigde para comunicação de estações DOS NPIPE com servidor AS/400 utilizando TCP/IP. Exemplo TCDelFile("CUSTOMER") 2. Para o TOPConnect NT acessando os demais SGDB's um ambiente é um System DSN criado através do ODBC Data Source Administrator. um ambiente é o nome do Alias criado com o utilitário SQL-Net. APPC e Brigde : O nome do servidor TOPConnect Para conexões TCP/IP : O endereço IP do servidor TOPConnect Para o TOPConnect NT acessando Oracle.CH" //Especifica conexão TCP/IP TCConType("TCPIP") //Conecta-se ao ambiente SIGAADV no Microsoft SQL-Server TCLink("MSSQL/SIGAADV") 2.0 Oracle IBM Universal Database Sybase SQL-Server Sybase SQL Anywhere Sybase SQL Anywhere (Emulando Sybase SQL-Server) Informix TCLINK Abre uma conexão com o Servidor TOPConnect.9. Microsoft SQL-Server 6.9. Exemplo #INCLUDE "TOPCONN. Sintaxe nCon := TCLink(<cConectString>. Sintaxe TCDelFile(<cTable>) Onde <cTable> é o nome da tabela a ser excluída.5.

Esta é a lista de Bancos de Dados hoje suportados e seus respectivos nomes compor a string de conexão com o TOPConnect NT: Microsoft SQL-Server 6."TOP400") .16.172. Exemplo //Conecta-se ao Microsoft SQL-Server no ambiente SIGAADV //Protocolo Named Pipes TCConType("NPIPE") nCon := TCLink("MSSQL/SIGAADV".1.0 MSSQL7 Oracle ORACLE IBM Universal Database DB2 Sybase SQL-Server SYBASE Sybase SQL Anywhere ANYWHERE Sybase SQL Anywhere (Emulando Sybase SQL-Server) ANYSYBASE Informix INFORMIX A função TCLink retorna ou o número da conexão ou um valor negativo contendo o código do erro."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".5 MSSQL Microsoft SQL-Server 7.2) //Protocolo APPC //Conecta-se ao AS/400 no ambiente PRODUCAO nCon := TCLink("PRODUCAO".Programação em ADVPL / SQL / ASP com AP5 Para o TOPConnect AS/400 um ambiente é uma Library criada através do comando CRTTOPENV do TOPConnect. Para informações sobre a criação de ambientes consulte o manual de instalação do TOPConnect.

CLIDATA b .DbGoTop() GO BOTTOM . A Work Area criada com o comando TCQUERY é READ-ONLY.9.8. portanto não é permitido o uso de APPEND's ou REPLACE's. COLUMNn. COLUMN2.7. Sintaxe: TCQUERY [<cSQLExpr> [ALIAS <xcAlias>] [NEW] VIA "TOPCONN" <cSQLExpr> Expressão SQL a ser enviada ao servidor..9. Sintaxe TCSETCONN(<nConn>) Onde <nConn> é o número da conexão. Se esta clausula não for especificada.NOME" TCQUERY cQuery ALIAS CLIENTES NEW VIA "TOPCONN" dbGoTop() While !Eof() ? CODIGO.6. TCSETCONN Seleciona conexão ativa.CODIGO = b.CODIGO ORDER BY CODIGO. SQL / ASP com AP5 TCQUERY Executa uma Query no servidor e coloca seu retorno em uma WorkArea. Exemplo . <xcTable> será na Work Area corrente. ALIAS < cAlias> Especifica um nome para a Work Area a ser aberta NEW Abre a tabela <cTable> na próxima Work Area disponível. TCQUIT Encerra todas as conexões com o TOPConnect Sintaxe TCQuit() 2. b. Exemplo //Abre a tabela de Clientes em uma nova Work Area cQuery := "SELECT a.nome FROM CLIENTES a. WHERE a. VIA "TOPCONN" Este parâmetro indica ao ADVPL que esta Work Area será gerenciada pelo TOPconnect.codigo.. O TOPConnect tem apenas um cursor para a Query executada portando apenas os seguintes comandos são suportados em uma Work Area criada com TCQUERY: GO TOP . o nome dos campos da WorkArea serão COLUMN1.9.DbSkip() Eof() Bof() Obs: Ao executar uma Query que retorne um ou mais valores calculados.Programação em ADVPL / 2.NOME dbSkip() end USE cQuery := 'SELECT SUM(VALOR).SUM(SALDO) FROM CUSTOMER' TCQUERY cQuery NEW VIA "TOPCONN" ?COLUMN1 //Somatoria dos valores ?COLUMN2 //Somatoria dos saldos 2.DbGoBottom() SKIP .

"N".10.2) Dentro de um programa ADVPL já podemos considerar como um campo data não mais um campo caracter como é o seu armazenamento.9. DATA. pois os mesmos são gravados fisicamente no Banco de Dados como caracteres.. OUT_CODIGO . O campo Data só é retornado como um campo caracter por que estamos utilizando a função TCQUERY.. TCSPEXEC Executa uma Stored Procedure no Banco de Dados.Inteira>."D") TCSetField("QUERY".9. Exemplo TCQUERY "SELECT NOME.."VALOR". Ex. se não o tratamento é automático.. 2.. [<Prec. IN_VALOR. Parâmetros de OUTPUT devem começar com OUT_. VALOR FROM CUSTOMER" ALIAS QUERY VIA "TOPCONN" TCSetField("QUERY"."DATA".9. DATE e LOGICAL. <cField> é o nome do campo e <cType> é o tipo desejado para o campo. TCSETFIELD Esta função serve como apoio ao comando TCQUERY. 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 : Parâmetros de INPUT devem começar com IN_.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 // Abre conexão com o ambiente de Testes nCon2 := TCLink("MSSQL/TESTES") if nCon2 < 0 then Alert("falha conectando ambiente de Testes") QUIT endif TCSetConn(nCon1) //Abre tabela de Clientes no ambiente de produção USE CUSTOMER ALIAS PROD SHARED NEW VIA "TOPCONN" TCSetConn(nCon2) //Abre tabela de Clientes no ambiente de testes USE CUSTOMER ALIAS TEST SHARED NEW VIA "TOPCONN" . Ex.<cType>. e no caso dos numéricos como float. <cField> .12. 2. Sintaxe TCSetField(<cAlias>. na recuperação de campos tipo NUMERIC..Decimal>] ) Onde <cAlias> é o alias da WorkArea. MARRIED.<Prec.

9. onde n é o número de parâmetros de OUTPUT da Stored Procedure.<xParam2>. Exemplo If TCSQLExec("UPDATE CUSTOMER SET VALUE=0") < 0 then ?TCSQLError() Endif OBS: Esta é a mesma mensagem que esta registrada no log de eventos do TopConnect Manager. Sintaxe <cError> := TCSQLError() Onde <cError> é a mensagem de erro. Exemplo //Verifica se a Stored Procedure Teste existe no Servidor If TCSPExist("TESTE") //Executa a Stored Procedure Teste aRet := TCSPExec("TESTE".11.13.<xParamN>]) Onde <aRet> é um array com os parâmetros de retorno da Stored Procedure e <cSPName> é o nome da Stored Procedure a ser executada e os demais parâmetros variam conforme a definição da Stored Procedure. Sintaxe <aRet> := TCSPExec(<cSPName>."JOSE". Sintaxe <lExist> := TCSPExist(<cSPName>) Onde <lExist> indica se a Stored Procedure existe ou não e <cSPName> é o nome da Stored Procedure procurada.9.12. TCSQLEXEC .. TCSPEXIST Verifica a existência de uma determinada Stored Procedure no servidor. TCSQLERROR Retorna o último erro registrado pelo TOPConnect durante a execução de uma Query. Exemplo If SPExist("CALCCUSTO") TCSPExec("CALCCUSTO") Endif 2.Programação em ADVPL / SQL / ASP com AP5 Após a execução de uma Stored Procedure o TOPConnect retornará ao ADVPL um array com 'n' elementos..[<xParam1>.9. 2.1000) if aRet <> nil For i:= 1 to Len(aRet) //Mostra os valores de retorno ?aRet[i] Next Else ?"Erro executando Stored Procedure" ?"Mensagem: "+TCSQLError() Endif EndIf 2.

TCCHKOBJ* Verifica a existência de um objeto no servidor AS/400 Sintaxe <nError> := TCChkObj(<cObj>. etc. Exemplo TCLink("MSSQL/TESTE".16."PRODUCAO". Sintaxe <cType> := TCSrvType() Onde <cType> é o tipo do servidor podendo Ter seu conteúdo igual a "WinNT" ou "AS/400".Programação em ADVPL / SQL / ASP com AP5 Executa comandos SQL no servidor. Exemplo nError := TCChkObj("CALCCUST".15. Exemplo . <cType> é o tipo de objeto AS/400. Sintaxe <cError> := TCExeError() Onde <cError> é a string com a mensagem de erro. Sintaxe <nRet> := TCSQLExec(<cCommand>) Onde <nRet> retorna um valor negativo em caso de erros e <cCommand> e o comando SQL a ser executado. 2. Ex: *FILE.17. Sintaxe TCUnlink(<nConn>) Onde <nConn> é o número da conexão retornado pela função TCLink() Exemplo TCConType("NPIPE") nConn := TCLink("MSSQL/TOPCONN"."TOPSRV") TCUnLink(nConn) 2. TCSRVTYPE Retorna o Tipo do Servidor onde esta sendo executado o TOPConnect.<cLibrary>.9.14."TOPSRV") ?TCSrvtype() 2. <cLibrary> é o nome da biblioteca que deve conter o objeto.9. Exemplo TCSQLExec("UPDATE CUSTOMER SET VALUE=0) 2. TCEXEERROR* Retorna uma string com a mensagem de erro retornada pela execução das funções TCPGMEXE() e TCSYSEXE()."*PGM") ESTA FUNÇÃO SE APLICA APENAS PARA O TOPCONNECT AS/400 ( * )Funções apenas para o TOPConnect rodando em servidores AS/400.<cType>) Onde: <nError> é 0 quando o objeto existe ou o número do erro no AS/400. TCUNLINK Encerra uma conexão com o TOPConnect.9.9. *PGM.

FROM CLIENTES . Vamos analisar o seguinte código: dbSelectArea("CLIENTES") nValor := 0 Do While !Eof() If ESTADO = "SP" nValor += SALDO Endif DbSkip() End O código acima fará com que todas as linhas(registros) da tabela venham para o Client.18. 2. Otimizando seu código A linguagem ADVPL tem um enfoque posicional. Devido a esta diferença conceitual. enquanto aos Bancos de Dados SQL recuperam os dados por blocos de dados. TCSYSEXE* cCommand := "CRTCBLMOD MODULE("+cTDataBase+"/"+ cCommand += "SRCFILE("+cTDataBase+"/QSPSRC) " cCommand += "SRCMBR("+cName+"F"+cCrrEmp+") " cCommand += "REPLACE(*YES)" cName+"F"+cCrrEmp+") " TCSysExe( cCommand ) ( * )Funções apenas para o TOPConnect rodando em servidores AS/400. Leitura Sequencial Operações de leitura seqüencial de uma tabela podem levar a problemas de performance.10.3. O uso de filtros . vários pontos devem ser levados em consideração para que se possa obter uma boa performance e utilizar os recursos de uma aplicação Client/Server. 2.9.10.9.2. subtilizando a capacidade de processamento do servidor. O código acima poderia ser substituído por: TCQUERY "SELECT SUM(SALDO) . recuperando os dados utilizando orientação a registros.10.1.Programação em ADVPL / SQL / ASP com ?TCExeError() AP5 ( * )Funções apenas para o TOPConnect rodando em servidores AS/400.10. 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.19. TCPGMEXE* Executa um programa no servidor AS/400 TCPGMEXE( program name ) ( * )Funções apenas para o TOPConnect rodando em servidores AS/400. 2. WHERE ESTADO = 'SP'" NEW nValor := COLUMN1 Com a utilização do comando TCQUERY todo a somatória é feita no servidor retornando assim para a aplicação apenas uma linha com o resultado desejado. Performance 2. 2. 2.

Excluindo registros ( Sempre Marcar ) Quando houver necessidade de exclusão de registro por outros aplicativos você deve apenas fazer uma operação de alteração do registro. O TOPConnect suporta o uso de Stored Procedures conforme documentado na função TCSPExec() 2. já que o sistema esta desta forma vulnerável a problemas inesperados. Instalador de Stored Procedures no Banco de Dados . de tempos em tempos você deve limpar o Log do TopConnect. Stored Procedures O uso de Stored Procedures é a maneira mais eficiente de uma aplicação se utilizar dos benefícios da arquitetura Cliente/Servidor. Alerta!: Em alguns Bancos de Dados o Topconnect estará registrando no log de eventos do Topconnect Manager.1.3.11. para depois fazermos a integração. um mensagem de alerta dizendo que existe duplicidade de registro. pois o filtro é avaliado pelo próprio servidor vindo para a estação apenas os registros que respeitem a condição do filtro. colocando o símbolo de ‘*’ na coluna D_E_L_E_T_. Vantagens e Desvantagens As vantagens deste processo é a agilidade na integração entre os sistemas. caso contrário. As desvantagens deste processo.4. ou até em alguma mudança de estrutura que o configurador faça. Incluindo registros nas tabelas do SigaPROTHEUS / AP5 As tabelas criadas no Banco de dados pode receber inserções de outros aplicativos. são que você deve estar ciente de todas atualizações que são feitas na base de dados no sistema. principalmente se esta operação for concorrente com o SigaPROTHEUS / AP5.11. desta forma vamos evitar problemas na atualização de versão. 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. não existe a necessidade de gerar arquivos textos.11. Ferramenta importante 3. 3.1. 2. O mesmo não ocorre utilizando o TOPConnect.11.2. para poder avaliar o filtro o servidor SQL terá que ler linha a linha da tabela. utilizar o recurso do Banco é uma das melhores saídas. (Desconsiderar esta mensagem.10. Isto se deve ao fato de que todos os registros são avaliados pela estação. Normalmente aconselhamos a sempre fazer a atualização em tabelas específicas e depois criar rotinas pelo sistema o qual repassarão os dados destas tabelas para as tabelas definitivas. 2.(Você estará perdendo os triggers desta tabela). 2.Programação em ADVPL / SQL / ASP com AP5 O uso de filtros em aplicações ADVPL são conhecidos como fonte de problemas de performance. Para que um filtro tenha uma boa performance é necessário que a expressão do filtro corresponda a um índice no servidor. Integração com outros aplicativos 2. Principalmente em situações on-line .

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. SIGAIFX (INFORMIX).Programação em ADVPL / SQL / ASP com AP5 Alguns clientes utilizam rotinas como Stored Procedures para agilizar alguns processos críticos do sistema. Podem assim permanecer executando no AP5 Server enquanto a aplicação externa realiza outras tarefas. através de uma aplicação externa (ou através da Internet) é possível executar no AP5 rotinas criadas em ADVPL. utilizado através do arquivo AP5CONNXCONTROL. envio de mensagens. 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.LOG no diretório \SIGAADV\. sempre farão com que a aplicação externa aguarde o retorno do AP5. como obtenção de lista de usuários conectados. RPC Entre o AP5 e Outras Aplicações São duas as opções para realizar RPC entre uma aplicação externa e o AP5:  Uma API de acesso. como por exemplo cadastrar um pedido. Já com o acesso via Internet. Isso permite outras aplicações a terem acesso a execução de funções (jobs) no AP5. É o encarregado pelo processamento das aplicações.  Um controle ActiveX . através da utilização de uma API de acesso (contida em uma DLL) ou um controle ActiveX. retornando informações à aplicação externa. Os jobs podem ser executados no AP5 sem que necessariamente a aplicação externa aguarde pelo retorno.DLL. ou mesmo executa outros jobs. Tais rotinas poderão realizar todo o tipo de tarefa desejada. o AP5 pode ser integrado a diferentes soluções ou sistemas. E também será apresentado o erro no Log do TopConnect. ou seja.SPS. . Ou seja. utilizando a DLL (Dinamic Link Library) chamada AP5DCONN. utilizando o conceito de RPC. Ambas opções têm as mesmas funcionalidades:  Conexão a um ou mais servidores AP5. E uma de suas principais características é a alta conectividade. gerenciamento das conexões e compilação de programas. 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. ou emitir um relatório em formato HTML. ou mesmo diretamente através da Web (via protocolo HTTP ou FTP).OCX.  Acesso a algumas funções gerenciais. para instalação destas Storeds Procedures você devem possuir o arquivo com o nome de SIGAXXX. AP5 Web . e gerenciamento das conexões.Conectividade O AP5 Server é o centro de funcionamento do Advanced Protheus.  Execução de jobs e procs. um cliente. Se houver qualquer problema na instalação das Stores Procedures será gerado um arquivo de log chamado SPBuild. onde o XXX é o tipo de Banco de Dados que o Cliente estará utilizando ex: SIGASQ7 (MSSQL 7. Os procs entretanto. RPC (Remote Procedure Call) significa Chamada Remota de Procedimentos.0). é 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.

“”) . porém podem existir várias instâncias de comunicação. enviar parâmetros e receber o retorno destas funções. numérico. O acesso ao AP5 Server somente será efetuado se a correta senha e usuário forem informados. existem as seguintes funções disponibilizadas na DLL de comunicação: AP5CreateConnControl Descrição: Criação de uma instância de comunicação com o AP5 Server. 4. Parâmetro s: cServer: char * . Diferentemente do controle ActiveX. acessando um ou mais servidores do AP5. Desconexão.Retorna o Handle da instância criada. Este Handle retornado deverá ser informado em todas as demais funções de comunicação. 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. a DLL de comunicação não pode ser tratada como um objeto. Sintaxe: nAP5 = AP5CreateConnControl(“APSERVER”.Senha do usuário informado. é necessário a DLL de comunicação do AP5 chamada AP5CONN.Nome ou endereço IP do servidor para a conexão. nPort: int .Programação em ADVPL / SQL / ASP com AP5  Os jobs ou procs são funções contidas no repositório do AP5 (incluindo as funções criadas por usuários – User Function).Porta do socket TCP/IP utilizada para a conexão. O usuário informado deve ser o Administrador do sistema ou pertencer ao grupo Administradores. A checagem dessa senha é efetuada pelo Advanced. “ENVIRONMENT”. 3. para identificação da instância que será utilizada. e deve ser mantida através do SIGACFG. Destruição da instância de comunicação. 2. cPassWord: char * . é necessário conhecer a linguagem em que a aplicação externa está escrita. lógico. sempre através da DLL ou da OCX. para validação da conexão. cEnvironment: char * . O processo de utilização resume-se em: 1. cUser: char * . A API de comunicação com o AP5 Para utilizar a API de comunicação do AP5. Importante: Para utilizar a API ou o controle ActiveX. Geralmente a utilização de uma dessas opções será indicada para aplicações que necessitem executar processos dentro do AP5. Criação de uma instância de comunicação. 5.  A conexão ao AP5 é sempre efetuada através do protocolo TCP/IP. Retorno: int . o que permite a comunicação com diferentes servidores do AP5 simultâneamente. sempre que for necessário utilizar uma dessas opções. obtenção do retorno. Para tal. Conexão ao AP5 Server. a ponto de poder utilizar o conceito de DLL´s do Windows. O usuário informado deve pertencer ao grupo Administradores do sistema.DLL. data e array. A aplicação externa pode. Qualquer linguagem de programação que suportar a utilização de DLL´s poderá utilizar a API de comunicação. 1024. colocar um pedido de venda diretamente na base de dados do sistema. etc. Utilização efetiva: Execução de rotinas. como por exemplo.Usuário do sistema para validação da conexão. “Administrador”.Ambiente utilizado para a execução de processos. Por isso. Pode-se criar diferentes instâncias de comunicação. segundo os tipos de dados válidos: Caracter.

Lógico (bool).Handle da instância que será utilizada para a execução desta função.Retorna verdadeiro ou falso. Retorno: bool . porta e ambiente os processos serão executados. indicando se a conexão foi efetuada com sucesso.Programação em ADVPL / SQL / ASP com AP5 AP5DestroyConnControl Descrição: Destruição de uma instância de comunicação com o AP5 Server. Parâmetro s: Retorno: nObjectID: int .int) e Array (variant). Sintaxe: lOk = AP5Connect(nAP5) AP5Disconnect Descrição: Desconexão de um AP5 Server. Esta função irá encerrar a conexão ativa com um AP5 Server. Esta função irá realizar a conexão com o AP5 Server indicado durante a criação da instância informada como parâmetro. É através do Handle que é definido em qual servidor. Retorno: bool . AddLogicalParam. Um processo executado em um servidor AP5 pode necessitar de parâmetros.O tipo de dado do parâmetro dependerá da função utilizada. . AP5Connect Descrição: Conexão a um AP5 Server. e antes de encerrar a execução da aplicação externa. AddDateParamAsDouble. É através do Handle que é definido para qual servidor o parâmetro será enviado. indicando se o parâmetro pôde ser enviado ao AP5 Server com sucesso. AddDateParamAsString.ou como numérico . Esta função não deve ser confundida com a função AP5DestroyConnControl. Podem ser utilizadas somente após uma conexão ser ativada. que deverão ser enviados ao servidor antes da execução do processo através da utilização destas funções. Após a utilização da API.Handle da instância criada com a função anterior. Parâmetro s: nObjectID: int .Retorna verdadeiro ou falso. segundo os tipos de dados permitidos explicados acima.Retorna verdadeiro ou falso. Sintaxe: lOk = AP5DestroyConnControl(nAP5) bool . AddStringParam. da instância informada como parâmetro. AddNullParam. xParametro: indefinido . Data (enviado como caracter – char * . AddNumericParam.Handle da instância que será utilizada para a execução desta função.Handle da instância que será utilizada para a execução desta função. Os tipos de dados que podem ser enviados são: Numérico (int). indicando a execução com sucesso da função. Parâmetro s: nObjectID: int . é necessário destruir o Handle criado com a função anterior para a liberação de memória. Sintaxe: AP5Disconnect(nAP5) Sem retorno. AddArrayParam Descrição: Estas funções são utilizadas para a execução de processos em um servidor AP5. Esta função não deve ser confundida com a função AP5CreateConnControl. Parâmetro s: Retorno: nObjectID: int . Caracter (char *).

Programação em ADVPL / SQL / ASP com lOk = AddNumericParam(nAP5. ResultAsDate. Sintaxe: PrepareEnv(nAP5. cFil: char * . abrir arquivos. aTables: variant – Este parâmetro deve ser um array variant (para detalhes.Código da filial que será utilizada (dois dígitos).Tamanho do buffer passado no segundo parâmetro. consulte a documentação da linguagem utilizada) contendo as siglas das tables que deverão ser abertas (por exemplo “SB1”).5) Sintaxe: AP5 ou lOk = AddStringParam(nAP5.nSize) PrepareEnv Descrição: Função utilizada para preparar o ambiente do sistema. Retorno: int .aTables) . Apenas para as funções ResultAsString e ResultAsDateString: cBuffer: char * . Parâmetro s: nObjectID: int .Código da empresa do sistema (dois dígitos) que deverá ser aberta.Tamanho do buffer passado no parâmetro anterior. cEmp: char * .Buffer de caracteres alocado para receber o retorno em formato caracter. Para as funções ResultAsString e ResultAsDateString o retorno será o tamanho do buffer preenchido. Sintaxe: nRet = ResultAsNumeric(nAP5) ou lRet = ResultAsLogical(nAP5) ou ResultAsString(nAP5. Retorno: O tipo de dado do retorno dependerá da função utilizada.“01”.Retorna o tamanho do buffer contendo o número do build. criar variáveis.Retorna verdadeiro ou falso. cEnv: char * . nSize: int .“TEXTO”) ou lOk = AddLogicalParam(nAP5. indicando o sucesso da execução da função.Handle da instância que será utilizada para a execução desta função. e tornar o ambiente de execução da aplicação externa em relação ao AP5 Server.“ENVIRONMENMT”.cBuffer. Parâmetro s: nObjectID: int . nSize: int .Handle da instância que será utilizada para a execução desta função. segundo os tipos de dados definidos anteriormente. Sintaxe: AP5BuildNumber(nAP5. Retorno: bool . o mais parecido possível com o que é realizado pelos módulos do sistema. ResultAsArray Descrição: Parâmetro s: Estas funções são utilizadas para obter o retorno do AP5 Server após a execução de um processo.cBuffer.nSize) AP5BuildNumber Descrição: Função utilizada para obter o número do build de compilação da API de conexão ao AP5. cBuild: char * .Buffer de caracteres para receber o número do build.Ambiente que será utilizado para a abertura dos arquivos. ResultAsLogical. nObjectID: int .Handle da instância que será utilizada para a execução desta função. ou seja. ResultAsString.“99”. ResultAsDateString.true) ResultAsNumeric.

indicando se o processo foi finalizado com sucesso. “”) If AP5Connect(nAP5) Then AddNumericParam(nAP5. Porém. help.Handle da instância que será utilizada para a execução desta função. que executará funções do sistema Advanced como o usuário faria através do AP5 Remote: Dim nAP5 As Integer Dim cRes As String nAP5 = AP5CreateConnControl(“APSERVER”. Sintaxe: StartJob(nAP5. começará de um ambiente totalmente novo.Handle da instância que será utilizada para a execução desta função.Nome do processo ou função que será executado no AP5 Server. Sintaxe: CallProc(nAP5. Parâmetro s: nObjectID: int . e tem algumas diferenças conceituais: A) Não se pode escolher o ambiente no qual o processo será executado. pode-se criar toda uma aplicação. A execução de um processo resume-se em: A) 1. etc. Obter o resultado (se existir). Assim.Programação em ADVPL / SQL / ASP com AP5 StartJob Descrição: Esta função permite a execução de um processo (job) em um AP5 Server.5) lOk = CallProc(nAP5. cFunc: char * . O processo executado pode ser qualquer um dos existentes no repositório definido pelo ambiente informado.true) CallProc Descrição: Esta função tem o mesmo objetivo que a anterior. comandos de alerta. bem como retornar um valor para a aplicação externa. incluindo as funções criadas pelo usuário (User Function). o valor de variáveis criadas. devem ser criados sem nenhum comando de interface (criação de janelas. cFunc: char * .Ambiente que será utilizado para a execução do processo.Verdadeiro ou Falso indicando se a aplicação externa deverá ou não aguardar pelo término da execução do processo. Executar o processo sem aguardar sua finalização.“ENVIRONMENMT”. Os processos são executados em threads de execução separadas. “ENVIRONMENT”. etc). sempre utilizando-se das funções descritas anteriormente.Nome do processo ou função que será executado no AP5 Server.Retorna verdadeiro ou falso.“MESEXTENSO”) . Parâmetro s: Obs. a execução deste através da API gerará um erro de execução. os processos executados pela função CallProc mantêm o ambiente da última execução. 1024. são mantidos na próxima execução. “Administrador”. 2. Isso permite à aplicação externa que esteja utilizando a API. Executar o processo e aguardar sua finalização. Pode também receber parâmetros. optar por executar o processo e continuar trabalhando enquanto o mesmo está em execução. Retorno: Bool . Se um comando de interface for utilizado no código ADVPL de um processo.“MESEXTENSO”. os arquivos abertos. B) Um processo executado através da função StartJob.: Como estes processos são executados sem que uma instância do AP5 Remote esteja ativa. nObjectID: int . 3. porém sempre aguardará o término do processo para que o controle volte à aplicação externa. 2. Enviar os parâmetros (se existirem). Os processos executados pela CallProc serão sempre executados no ambiente indicado na criação da instância com a função AP5CreateConnControl. somente poderá obter um retorno quando esperar até que o processo termine de ser executado.“CALCEST”) Com a utilização da API. lWait: bool . cEnv: char * .Retorna verdadeiro ou falso. Enviar os parâmetros (se existirem). B) 1. indicando se o processo foi iniciado com sucesso. Retorno: bool . Porém. em Visual Basic por exemplo.

consulte a documentação da linguagem utilizada ou a documentação do conceito ActiveX na página da Microsoft (http://www. por exemplo). basta ter o AP5 para poder criar sua própria Intranet num ambiente de rede local. que irá automaticamente baixar arquivos compactados para se auto atualizar quando necessário. como por exemplo um Palm. os usuários poderão remotamente baixar arquivos disponibilizados em um diretório configurável no servidor. Deve-se considerar os exemplos de sintaxe conforme a linguagem utilizada. o seguinte grupo deve ser criado no arquivo de configurações (AP5SRV. Para realizar o RPC utilizando o protocolo HTTP diretamente com o AP5 Server.microsoft. O controle ActiveX é um objeto que deve ser registrado no computador onde será utilizado e durante a execução da aplicação externa. ou publicar o endereço IP da máquina com o AP5 Server na Internet e executar funções através de RPC ou simplesmente criar o seu próprio Web Site com páginas HTML estáticas e/ou dinâmicas. ou mesmo utilizar recursos de conectividade Wireless. Neste último caso é possível também utilizar uma conexão direta TCP/IP (via socket). Isto significa que é possível criar páginas HTML que executem processos no AP5 Server.com). Para habilitar o serviço de FTP no AP5 Server. RPC através da Internet O RPC através da Internet é realizado diretamente com o AP5 Server utilizando o protocolo HTTP. Isso significa trabalhar como um servidor de requisições dos protocolos HTTP e/ou FTP. Pode-se também habilitar um recurso de auto-atualização para o AP5 Remote. 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ém o formato de utilização é diferenciado. Para maiores detalhes. 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. Assim.INI): [FTP] Enable=1 Path=C:\AP5\FTP Port=21 Onde as chaves são: . para acessar e executar processos diretamente no AP5 Server através do protocolo HTTP. trabalham com buffer de caracteres. Todas as funções de caracter como ResultAsString ou AP5BuildNumber. não é necessário a utilização de um servidor Web de terceiros. do mesmo modo que outros servidores conhecidos no mercado (por exemplo. Utilizando o AP5 Server como um servidor FTP. deverá ser criado. A aplicação externa também será responsável por liberar a memória do buffer alocado. pois o AP5 Server também é um servidor Web.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. O Controle ActiveX O controle ActiveX tem as mesmas funcionalidades da API. utilizado e destruido ao final.Programação em ADVPL / SQL / ASP com AP5 If lOk Then ResultAsString(nAP5. o IIS – Internet Information Server. O AP5 Server como um servidor Web O AP5 Server pode ser configurado para trabalhar como um servidor Web. da Microsoft ou o Apache para Linux).

16.INI – para maiores detalhes. Adicionalmente ao envio e recebimento de páginas estáticas formatadas. 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. Para habilitar o serviço de HTTP no AP5 Server. Tais páginas serão processadas no AP5 Server.1. que se encontram juntamente com o executável do AP5 Remote).Port é a porta usada para conexão das aplicação client. através de um request HTTP (por exemplo.1 Port=5024 . Figura 2 . . É o protocolo utilizado para o envio e recebimento de páginas formatadas em padrões SGML (HTML. O mesmo vale para qualquer outra aplicação que seja capaz de efetuar comandos GET ou POST utilizando o protocolo HTTP). consulte a documentação do AP5 Remote). que contém código Advpl e comandos HTML de formatação. que receberá as páginas HTML enviadas de um diretório configurado no servidor.Programação em ADVPL / SQL / ASP com AP5 Enable indica se habilita ou desabilita este serviço. podese utilizar a linguagem Advpl do AP5 para processar páginas mistas. Também é possível executar diretamente funções compiladas no repositório do AP5. etc). o usuário é questionado sobre a execução da auto-atualização. ao escolher que deseja tentar uma autoatualização. Serviços de HTTP O protocolo HTTP (HyperText Transmission Protocol) é o protocolo utilizado na comunicação entre um servidor e um Web Browser. Figura 1 . o mesmo poderá ser acessado através de um Web Browser como o Internet Explorer por exemplo. que irá formatá-las de acordo com os comandos HTML contidos.Internet Explorer 5 acessando a área de FTP do AP5 Server - 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. Mais adiante. será mais fácil compreender onde tais comandos são utilizados no AP5 Server. Quando isto ocorre. ou mesmo diretamente na linha de URL do Web Browser. Este protocolo se baseia principalmente em dois comandos: GET e POST. Os arquivos serão então descompactados localmente para a atualização. ou de um link. O comando GET é utilizado para obter alguma informação do servidor HTTP e o POST para “postar” informações para o servidor. através de um POST em um formulário em HTML. Se tudo estiver corretamente configurado no arquivo de configuração do AP5 Remote (AP5RMT. e então enviadar para o Web Browser.XML.CAB) contendo as DLL´s e executáveis mais atualizados. o AP5 Remote irá abrir uma conexão FTP com o Server configurado e baixar os arquivos compactados (com a extensão .Internet Explorer 5 acessando o AP5 Server como um servidor HTTP Utilizando o AP5 Server como um servidor HTTP. Path indica o diretório onde o AP5 Server localizará os arquivos para disponibilizar no FTP.

. 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.RPCServer indica o nome do grupo que contem as configurações do AP5 Server onde serão executadas as chamadas de funções Advpl através de RPC (por requests HTTP). originalmente requisitado.RPCEnv indica o nome do grupo que contém as configurações de ambiente para a execução das funções requisitadas em RPC.GetProc e PostProc são parâmetros opcionais que podem ser utilizados para interceptar os comandos GET e POST que caem no AP5 Server.Programação em ADVPL / SQL / ASP com AP5 Onde as chaves são:  Grupo HTTP . . . arquivo ou função. . .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).Port é a porta utilizada para conexão ao Servidor RPC.Enable indica se habilita/desabilita o serviço.  Grupo <SERVIDOR> (no exemplo.Server indica o nome ou endereço IP do servidor encarregado da execução das rotinas em Advpl (RPC). . Port é a porta utilizada para a conexão dos Web Browsers. .Path indica o diretório onde o AP5 Server localizará os arquivos HTML e demais arquivos que forem requeridos por um Web Browser. SERVERKEY) .RPCTimeOut indica o tempo em segundos que a thread de execução RPC permanecerá no ar (e conseqüentemente com todo o ambiente preparado para ser utilizado em uma próxima execução de RPC via HTTP). 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).

gif http://servidor/acerto. alguns detalhes devem ser considerados:  Uma função executada no momento do recebimento de uma requisição HTTP é executada como um JOB. ou seja. .htm ou http://servidor/imagem. o AP5 Server transforma essa página em uma função interna que será executada da mesma maneira que aquelas chamadas .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. A página HTML. . O HTML então será propriamente exibido no Web Browser. essa requisição é recebida pelo AP5 Server que a tratará do seguinte modo: Extensão do arquivo Descrição O que acontece Exemplo Nenhuma Um endereço http único. tais funções devem SEMPRE retornar uma string de caracteres. http://servidor/cadastro . como criação de janelas ou exibição de helps e mensagens de alerta. apl http://servidor/activepa ge. sem um nome de arquivo definido. etc. Uma página Advpl ASP é uma página HTML contendo código interpretável no servidor. as páginas em Advpl ASP devem ser chamadas do Web Browser com a extensão . Como também são funções. Durante a compilação.apl ou http://servidor/cadastro . Ao chamar um endereço URL sem informar um nome de arquivo.APL exatamente como explicado anteriormente. será simplesmente enviado ao Web Browser.HTML ou outra extensão qualquer. Devem ser compiladas através do AP5 IDE. vídeo. Quando o AP5 Server receber um request deste tipo. um link ou diretamente através do campo de URL do Browser).apl Criando funções APL A princípio.APL Páginas HTML. que será enviada para o Web Browser. .apl. Tais páginas são criadas utilizando qualquer editor de texto ou editor HTML. http://servidor/ . som. ou qualquer que seja o arquivo. utilizando um Web Browser como client pode-se retornar a string de comandos HTML diretamente. Por isso. sendo que este é o responsável pela sua tradução/interpretação. arquivos texto. todas as funções contidas no repositório podem ser executadas diretamente através de uma requisição HTTP ao AP5 Server.. HTM. a função chamada (no exemplo func. o AP5 Server irá procurar o arquivo chamado DEFAULT. Por exemplo. O que deverá ser retornado pela função é uma string. não contem interface.  A única interface possível é a utilizada no client HTTP. e devem ter SEMPRE a extensão . arquivos de imagem.APL explicadas anteriormente. Após o processamento da função.APH É uma chamada para uma página ativa (uma página em ADVPL ASP). a função chamada é func. sem a extensão) será executada no AP5 Server configurado na chave RPCSERVER no ambiente definido pela chave RPCENV. É uma chamada direta a uma função do repositório do AP5.APH.HTM para enviar ao Web Browser que efetuou o request. Por isso.  Qualquer retorno diferente de uma string de caracteres gerará um erro que será enviado à aplicação client HTTP (o erro gerado é “Invalid Proc Return”). Porém. tais funções não podem conter comandos de interface. essa string de retorno será enviada diretamente ao client HTTP e este será o responsável por sua interpretação.a pl ou http://servidor/runprog.

na execução de uma função via linha de URL do Web Browser como: http://servidor/vende. que enviam os dados para a função cadastro. Por exemplo. se o checkbox for marcado). “PRODUTO DE TESTE”}. 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).apl?cod=000001&desc=DESCRICAO DO PRODUTO&qtd=2 Código da função: #include "rwmake. por exemplo. no Internet Explorer 5). - __nProcID: Contém o Handle da Thread de execução daquela função. - __aProcParms: Este parâmetro recebe um array bidimensional com os parâmetros enviados na linha de URL do Web Browser. {“nome”. “20”} } A função pode tratar estes dados recebidos para realizar processamentos específicos. {“endereco”.__aProcParms. Pode-se utilizá-lo para checar validações mantidas nas máquinas client por exemplo. 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.__nProcID. como são esses os nomes utilizados no ADVPL ASP explicado mas a frente. arquivo ou função originalmente requisitada para o AP5 Server. Porém. Para maiores detalhes.Programação em ADVPL / SQL / ASP com AP5  O AP5 Server passa alguns parâmetros para as funções chamadas.PRW. - __aPostParms: Este parâmetro recebe um array bidimensional com os campos contidos em um formulário HTML recebido através de um comando POST. Por exemplo. Isso significa que ao criar funções para serem utilizadas em resposta às requisições HTTP.__aCookies: Este parâmetro recebe um array bidimensional com os Cookies criados na aplicação client HTTP (por exemplo. Após compilar o programa. deve-se criar o cabeçalho da função com estes parâmetros.apl?cod=000001&nome=PRODUTO DE TESTE&quant=20 a função chamada vende receberá o array __aProcParms da seguinte forma: { {“cod”. Não é obrigatório utilizar os mesmos nomes de parâmetros sugeridos abaixo quando criar diretamente estas funções. É utilizado quando as chaves GETPROC e POSTPROC (explicadas anteriormente) são habilitadas no arquivo de configurações do AP5 Server. o item somente existirá no array caso o campo tenha sido selecionado no formulário HTML (por exemplo. a função receberá o array __aPostParms da seguinte forma: { {“nome”. - __cHTTPPage: Esse parâmetro recebe o nome da página. é aconselhável utilizá-los por motivo de padronização: .__cHTTPPage) Local cHTML := "" Local i . 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. cole o código abaixo e salve o arquivo como WEBDEMO. “NOME DIGITADO NA PAGINA HTML”}. “000001”}. consulte a documentação do HTML ou do Web Browser utilizado.ch" User Function WebDemo(__aCookies. “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. Exemplo de função APL 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. A utilização deste parâmetro será explicada juntamente com o tópico ADVPL ASP posteriormente. É muito útil também para criar links de execução diretamente através de um Web Browser. Para testá-la.apl através de um POST. crie um arquivo novo no AP5 IDE. para um formulário com dois campos para digitação (um chamado nome e o outro chamado endereco). Cada item deste array contém um array com o nome do campo e o valor informado. {“quant”. basta chamar em um Web Browser uma URL como: http://localhost/u_webdemo.__aPostParms.

que receberá os mesmos parâmetros das funções APL simples. pois o APH também é um arquivo HTML. A extensão APH para o nome dos arquivos é obrigatória. ou seja. do mesmo modo que o AP5 utiliza o ADVPL. 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.APL para que o AP5 Server identifique que é uma função a ser executada. 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. o arquivo APH também deve ser executado (através da URL do Browser. 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. O desenvolvedor não precisa se preocupar em retornar HTML algum. Qualquer outra extensão usada no nome do arquivo não será reconhecida e o parser não será executado antes da compilação. Por exemplo. 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.1] + ' __aProcParms[i.Programação em ADVPL / SQL / ASP com AP5 // Coloca uma mensagem em HTML cHTML += '<p><h1 align="center">Hello World!!!</h1></p>' // Coloca um separador de linha em HTML cHTML += '<hr>' If Len(__aProcParms) = 0 cHTML += '<p>Nenhum parâmetro informado na linha de URL. em qualquer request HTTP. o IIS da Microsoft utiliza o VBScript para criar suas páginas ASP. por exemplo: http://servidor/u_webrelato. Do mesmo modo que as demais funções. por exemplo) com a extensão . e retornará uma string. Por se tornar uma função no momento da compilação. depois que o código foi processado. como explicado anteriormente. 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. 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> . Uma página ASP é uma combinação de script HTML e código interpretável.' Else For i := 1 To Len(__aProcParms) cHTML += '<p>Parâmetro: ' + __aProcParms[i.apl E deve-se sempre indicar a extensão . Este parser irá transformar todo o arquivo em uma função única. Por exemplo.APL. A função que foi gerada na compilação irá se encarregar de retornar o HTML contido no arquivo. No ADVPL ASP esse código é padrão xBase. Caso exista essa necessidade. São arquivos texto e devem ser adicionados a um projeto no AP5 IDE e compilados da mesma maneira que os programas tradicionais.2] + '</p>' - Valor: ' + Next i Endif Return(cHTML) Para crias as funções que serão utilizadas em chamadas via um Web Browser. tais funções devem ser criadas em um arquivo PRW tradicional e chamadas de dentro do APH.APH. não é possível utilizar a cláusula FUNCTION para criar outras funções dentro de um arquivo APH. Características do ADVPL ASP Os arquivos ADVPL ASP têm a extensão padrão . 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. Assim como outros ASP´s.

colocar um comando de script HTML dentro de um comando While em ADVPL): <% While !EOF() %> <B> Esta linha será repetida no HTML até ocorrer o fim de arquivo </B> <% dbSkip() EndDo %> Note que também pode existir diferentes blocos de código interpretável separados pelos delimitadores. cujo conteúdo contém uma expressão que será avaliada em tempo de execução: <b>Esta linha é HTML. porém o script colocado ao redor do código será mantido exatamente como se encontra. Ou seja. Para testá-lo basta copiar o código. 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. campos. mas a data exibida aqui: <%= Time() %> foi obtida em tempo de execução. pode-se criar toda uma apliação Web baseada no AP5.</b> No exemplo acima. a hora atual no servidor) inserido no texto. dentro de um mesmo arquivo. estes devem sempre estar na mesma linha. 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. a linha HTML será retornada para o Browser com o resultado da função time (ou seja. o processamento e acesso aos dados fica por conta do AP5 Server. Utilizando todos esses conceitos. E também. salvá-lo como WEBREL. é utilizar os comandos ADVPL para alterar o script de formatação. e a interface fica por conta do Browser (utilizando o HTML). Com eles pode-se criar uma linha de script HTML. Isso pode ser realizado através dos delimitadores de avaliação. Ou seja. Tão importante quanto mesclar código interpretável com script de formatação HTML.Programação em ADVPL / SQL / ASP com AP5 <% // Soma os 100 primeiros números Local i.APH e compilar o arquivo através do AP5 IDE: <html> <head> <% //Função para manutenção do ambiente %> <%= HTMLProcID(__nProcID) %> <title>ADVPL ASP DEMO</title> </head> <% #define #define #define #define FIELD_CODDE FIELD_CODATE FIELD_LOCDE FIELD_LOCATE "FROM_CODE" "TO_CODE" "FROM_LOCAL" "TO_LOCAL" // Criação das variáveis com os parâmetros recebidos através do array __aProcParms . Outro detalhe importante é que pode-se utilizar as estruturas de fluxo da linguagem ADVPL para repetir comandos do próprio script HTML (por exemplo. etc. A grande vantagem de se criar arquivos ADVPL ASP em relação a criar funções APL simples. colocar o conteúdo de variáveis. Abaixo um exemplo de um relatório de clientes criado utilizando o ADVPL ASP. diretamente no HTML que será enviado à aplicação client (ao Browser por exemplo). como o ADVPL ASP mistura o script HTML com o código interpretável. Os delimitadores de avaliação são <%= para abertura e %> para encerramento. 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. Diferentemente dos delimitadores de código interpretável.

2] Else cCodDe := "" Endif nPos := aScan(__aProcParms.{|x| Upper(AllTrim(x[1])) == FIELD_CODDE }) If nPos != 0 cCodDe := __aProcParms[nPos.cCodAte.2] Else cCodAte := "ZZZZZZ" Endif nPos := aScan(__aProcParms.cLocDe.{|x| Upper(AllTrim(x[1])) == FIELD_CODATE }) If nPos != 0 cCodAte := __aProcParms[nPos.2] Else cLocDe := "" Endif nPos := aScan(__aProcParms.Demo</h1> </td> </tr> <tr> <td> <hr size="5"> </td> </tr> <tr> <td> <h3 align="left"><u>Relatório de Produtos</u></h3> </td> </tr> <tr> <td> <p align="left"><b>Data de geração</b>: <%=Day(Date())%> %=Year(Date())%></td> </tr> <tr> <td> <hr> </td> </tr> </table> <div align="center"> <center> de <%=MesExtenso(Date())%> <% If Len(__aProcParms) > 0 %> <table border="1" cellpadding="0" cellspacing="0" width="508" height="24"> <tr> <th width="181" height="24" bgcolor="#008080" color="#FFFFFF"><b>Parâmetro</b></font></th> <th width="327" height="24" bgcolor="#008080" color="#FFFFFF"><b>Valor</b></font></th> </tr> <% // "Impressão" dos parâmetros Local i For i := 1 To Len(__aProcParms) %> <tr> de < align="left"><font align="left"><font .2] Else cLocAte := "ZZ" Endif %> <body topmargin="0" leftmargin="0"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td> <h1 align="left">ADVPL ASP .cLocAte Local nPos nPos := aScan(__aProcParms.{|x| Upper(AllTrim(x[1])) == FIELD_LOCATE }) If nPos != 0 cLocAte := __aProcParms[nPos.Programação em ADVPL / SQL / ASP com AP5 Local cCodDe.{|x| Upper(AllTrim(x[1])) == FIELD_LOCDE }) If nPos != 0 cLocDe := __aProcParms[nPos.

Select("SB1") == 0 RpcSetEnv ( "99".Or."". 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. xFilial("SB1") == SB1->B1_FILIAL .8. "01".And.)) %> <tr> <td <td <td <td <td width="12%" width="50%" width="7%" width="17%" width="14%" bgcolor="#FFFFCC"><%= bgcolor="#FFFFCC"><%= bgcolor="#FFFFCC"><%= bgcolor="#FFFFCC"><%= bgcolor="#FFFFCC"><%= HTMLAllTrim(SB1->B1_COD) HTMLAllTrim(SB1->B1_DESC) HTMLAllTrim(SB2->B2_LOCAL) SB2->B2_QATU "R$" + Str(SB2->B2_CM1. "".F... pode-se visualizar o resultado acessando através de um Web Browser como o Internet Explorer a seguinte URL: http://servidor/h_webrel. SB1->B1_LOCPAD <= cLocAte SB2->(dbSetOrder(1)) SB2->(dbSeek(xFilial("SB2")+SB1->B1_COD+SB1->B1_LOCPAD.T.apl 7.And. ""."SB2"} ) Endif dbSelectArea("SB1") dbSetOrder(1) dbSeek(xFilial("SB1")+cCodDe+cLocDe.</p> <% // Abertura dos arquivos e posicionamento do ponteiro If Select("SB2") == 0 .) %> <table border="1" cellpadding="0" width="100%" cellspacing="0"> <tr> <th width="12%" align="left" bgcolor="#336699"><font color="#FFFFFF"><b>Código</b></font></th> <th width="50%" align="left" bgcolor="#336699"><font color="#FFFFFF"><b>Descrição</b></font></th> <th width="7%" align="left" bgcolor="#336699"><font color="#FFFFFF"><b>Local</b></font></th> <th width="17%" align="left" bgcolor="#336699"><font color="#FFFFFF"><b>Quantidade em Estoque</b></font></th> <th width="14%" align="left" bgcolor="#336699"><font color="#FFFFFF"><b>Custo Médio</b></font></th> </tr> <% While !EOF() .1] %></td> <td width="327" height="24" bgcolor="#FFFFCC"><%= __aProcParms[i.And.2] %></td> </tr> <% Next i %> </table> <% Else %> <b>Nenhum parâmetro informado.</b> <% Endif %> </center> </div> <p align="left">&nbsp.Programação em ADVPL / SQL / ASP com AP5 <td width="181" height="24" bgcolor="#FFFFCC"><%= __aProcParms[i."". .2) %></td> %></td> %></td> %></td> %></td> </tr> <% dbSkip() EndDo %> </table> </body> </html> Após ter o código compilado. SB1->B1_COD <= cCodAte. . {"SB1".

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. “ideal” o 8.) For _nI := to Len( aCamposSC7) FIELDPUT(_Ni. Função FIELDGET() Esta função tem a finalidade de criar / duplicar o registro dentro do arquivo corrente oude um outro arquivo .1. mesmos campos / tamanhos / tipos. Alem de que os arquivos tanto de origem como o de destino devem Ter sua estrutura identica.DBF._aCamposSC7[_nI]) Next Ambas as funções não checam as ordens do Dicionario da dados da Siga SX3010.FieldGet(_nI)) Next 8. e build´s . entretanto este comando necessita ser utilizado com um outro comando primo . GETADVFVAL .T. mesmos campos / tamanhos / tipos.ARRAY[_Contador]) Exemplo : DbSelectArea("SC7") RecLock("SC7".. pacths.3.2. 8. 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. Sintaxe : FIELDPUT(_NCONTADOR.Programação em ADVPL / SQL / ASP com AP5 Todos os tópicos mencionados poderão servir como base consulta. considerando-se como ambiente apresentado nas versões. Função 8. Primicia basica voce devera travar o registro no arquivo sempre com o comando RECLOCK() com a opção de verdade . FIELDGET(_NCONTADOR) Exemplo : DbSelectArea("SC7") _aCamposSC7 := {} For _nI := to Fcount() AADD ( aCamposSC7. Sintaxe : AADD( Array . Primicia basica voce necessita estar posicionado na arquivo e registro que voce deseja ser duplicado ou copiado.

pela chave especificada e na ordem especificada. Exemplo // Exemplo de uso da funcao GetAdvFVal: // Obtendo apenas de um campo: cChave := SD2->D2_COD+SD2->D2_LOCAL cDesc := GetAdvFVal(“SB1”.uCpo.SC6->C6_PRCVEN.PRX e/ou RDMOD3. você pode analisar os programas RDMOD2.{ |x| Upper(AllTrim(x[2])) == C6_QTDVENlm }) // Obtém o código do produto cCodigo := aCols[n. uCpo – Nome de um campo ou array contendo os nomes dos campos desejados.nOrder. sugerir a quantidade vendida a partir de um campo específico: // Colunas. nPosCod := aScan(aHeader.aCpos.B1_UM} aDados := GetAdvFVal(“SB1”.cChave.{SC6->C6_DESCRI. uDef – Valor ou array “default” para ser retornado caso a chave não seja encontrada.nPosCod] // Pesquisa dbSelectArea(“SB1”) dbSetOrder(1) dbSeek(xFilial(“SB1”)+cCod) // Altera a quantidade no grid aCols[n.{ |x| Upper(AllTrim(x[2])) == C6_PRODUTO }) nPosQtd := aScan(aHeader.Programação em ADVPL / SQL / ASP com AP5 Tipo: Processamento Esta função permite executar uma pesquisa em um arquivo. Sintaxe GetAdvFVal(cAlias. 8.B1_DESC.SC6->C6_UM}) refere-se aos Itens do Pedido de Venda) e.SETDEFAULT Tipo: Processamento .4 .1.SC6->C6_DESCRI) // Obtendo o conteudo de mais de um campo: cChave := SD2->D2_COD+SD2->D2_LOCAL aCpos := {B1_DESC+2B1_PRV1.nPosQtd] := SB1->B1_QTSUGER // Campo específico com a quantidade padrão __Return(SB1->B1_QTSUGER) Para uma melhor compreensão.. uChave – Chave para a pesquisa. Retorna uRet – Retorna o conteúdo de um campo ou array com o conteúdo de vários campos. Eles estão no diretório principal do sistema (geralmente \SIGAADV\) e demonstram rotinas usadas para cadastros semelhantes ao Pedido de Vendas e que trabalham com os arrays mencionados. retornando o conteúdo de um ou mais campos.uChave. após pesquisar no SB1 (Cadastro de Produtos). nOrder – Ordem do indice para a pesquisa.1.cChave..uDef) Parâmetros cAlias – Alias do arquivo.PRX que acompanham o SIGA PROTHEUS.

aOrd. 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. cDesc3.[n] Campos a Processar (se houver) cAlias – Alias do arquivo a ser impresso.lDbf) Parâmetros . nLastKey = 27 Return Endif SetDefault(aReturn.. nLastKey = 27 Return Endif 8. .. 4-COM1.F..[10].cAlias) If LastKey() = 27 . cDesc1.F. .lg Por Tipo } Tamanho := G // Envia controle para a função SETPRINT NomeRel:= SetPrint( cString. Sintaxe SetDefault (aArray. cPerg..5 . [7] Expressão do Filtro [8] Ordem a ser selecionada [9]...Programação em ADVPL / SQL / ASP com AP5 Habilita os padrões definidos pela função SetPrint. Retorna Nil Comentários Esta função habilita os padrões de relatório alterados pela função SetPrint. cDesc2. @titulo.or. Tamanho) If LastKey() = 27 .. cAlias) Parâmetros aArray – Array aReturn. . suas entradas previstas” cDesc3 := “e sua classe ABC” aOrd := { Por Codigo io..OR. NomeRel. 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 .CRIATRAB Tipo: Processamento Cria arquivo de trabalho. Sintaxe CriaTrab(aArray. seu empenho .

Comentários Esta função retorna o nome de um arquivo de trabalho que ainda não exista.F.{ PRODUTO. Caso lDbf = .{ ORDEM .F. 16. a função não criará arquivo de nenhum tipo.{ MARK .F.{ ENTREGA. “C”. . 10. “C”.F. ) Retorna ExpC1 – Nome do Arquivo gerado pela função. 0}) AADD(aStru.T.Programação em ADVPL / SQL / ASP com AP5 aArray – Array multidimensional contendo os campos a criar {Nome. 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. 0}) AADD(aStru. “D”.{ ENTRAJ.T. apenas fornecerá um nome válido. “D”.) USE &cArqTrab ALIAS TRB NEW 8. a função criará um arquivo DBF com este nome e a estrutura definida em aArray. Sintaxe ProcRegua(nRegs. 15. 0}) AADD(aStru.{ GERADO . 0}) cArqTrab := CriaTrab(aStru. “N”.) cIndice := C9_AGREG+IndexKey() Index on &cIndice To &cArq // Com lDbf = . 0}) AADD(aStru.nColuna) Parâmetros nRegs – Número de registros que serão processados.. “C”. 0}) AADD(aStru. cArq := CriaTrab(NIL.T. Exemplos // Com lDbf = . 0}) AADD(aStru.. = Ver também IncProc() .{ NUMOPl.6 . . Decimal} lDbf – Determina se o arquivo de trabalho deve ser criado ( .T. 10. 4}) AADD(aStru.” D”.{ AGLUT .nLinha.) ou não (. “C”. “C”. 4.Tamanho. aStru := {} AADD(aStru. 8. 1. 0}) AADD(aStru. Caso lDbf = . 1.{ QUANT . 8. No RdMake DOS são utilizados os três parâmetros.PROCREGUA Tipo: Tela DOS/Windows Inicializa régua padrão de processamento. Tipo.

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. 170 BUTTON U_Dlg c/Refresh SIZE 70.20 ACTION Execute(Browse) @ 130.ACTIVATE DIALOG Tipo: Tela Desenha um box 3d.MBROWSE Tipo: Processamento . Sintaxe @ nLInha1.20 ACTION Execute(BasicObj) @ 070.Programação em ADVPL / SQL / ASP com AP5 8.nColuna1 TO nLinha2. Se for omitida. 090 BUTTON U_Browses SIZE 70.INCPROC Tipo: Tela DOS/Windows Incrementa régua padrão de processamento. 245 TITLE ‚Exemplos @ 070.218 BMPBUTTON TYPE 1 ACTION Close(oDlg) ACTIVATE DIALOG oDlg CENTERED 8.8 .7 .20 ACTION Execute(SqlDemo) @ 192. 000 TO 430.20 ACTION Execute(DlgDinam) @ 160. 090 BUTTON U_SQL SIZE 70. Exemplo @ 000. Sintaxe IncProc() Parâmetros Nil Retorno Nil Exemplo ProcRegua(1000) For i:= 1 to 1000 IncProc() Next Return 2. 010 BUTTON U_Objetos SIZE 70. o box não terá título. 005 TO 185.9 . 500 DIALOG oDlg TITLE (“Tela de browse”) @ 060.

ExecBlock(“DEMOB”)l.3}. “SA1”) 8.2}} MarkBrowse(“SA1” ..0. cCor.0. cMarca) .F. . 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” .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. Sintaxe mBrowse(nLinha1. Exemplo cMarca := GetMark() cCadastro := “Escolher Clientes” aRotina := { { “Pesquisa”.0.cCampo.AxPesqui.ExecBlock(“DEMOA”.aCampos.). nLinha2. {“Altera “ . .cCpo. {“Exclui “ . 1.. SA1->A1_OK .MARKBROWSE Tipo: Processamento Monta um browse padrão do sistema. . nColuna2.F.cTopFun.cMarca. muda a cor da linha nPar – Parâmetro obsoleto cCor – Função que retorna um valor lógico.).1}. conforme os parâmetros. 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.10 .AxPesquil .AxVisual. cAlias. Sintaxe MarkBrowse(cAlias.0.0.. Quando vazio.. {“Incluir “ . nPar. permitindo marcar e desmacar linhas.cBotFun. nColuna1.0. 22.1}. aFixe. {“Visualizar”.. A1_OK .4}.ExecBlock(“DEMOC”.lMarc. 75.5}} MBrowse(6.Programação em ADVPL / SQL / ASP com AP5 Monta um browse padrão do sistema.lBotoes.cCtrlM. cCpo.

Programação em ADVPL / SQL / ASP com AP5 .