Você está na página 1de 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.

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

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

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

porem a aplicação recebe o dado da forma como definido.são armazenados em variáveis do tipo CHAR (0 ou 1) . NUMBER.0.2. Os tipos de dados que são tratados atualmente são o seguintes:   Campos numéricos Campos Lógicos . Estas bibliotecas devem ser linkeditadas com sua aplicação ADVPL para acessar o TOPConnect Server.0 Oracle 7. Os gerenciadores de banco de dados hoje suportados são:        MS-SQL Server 6.4. Controle de tipo de dados ( Tabela TOP_FIELD ) Em um banco existem vários tipos de dados (CHAR.5 e 8i IBM Universal Database 5.Programação em ADVPL / 2. VARCHAR. sendo estes bibliotecas para aplicativos DOS e DLL's para aplicativos Windows. 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.são armazenados em variáveis do tipo FLOAT .) porem para existir uma unicidade no código do Topconnect alguns dados são armazenados de forma diferente da definida na tabela SX3. 8. 2. que são apresentados logo em seguida.3.1.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.5 e 7. 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). Ele também pode ser utilizado por aplicações XBASE que queiram trocar a base de dados de DBF para SQL. etc. FLOAT.

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

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

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

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

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

NOME) dbSetOrder(0) O TOPConnect permite o uso da função OrderBy nos filtros o que reproduz o mesmo efeito de um índice filtrado.2) TO ARQIND No caso do SigaPROTHEUS você deve colocar o índice na tabela SINDEX. 2. ORDERBY(CODIGO. As únicas funções suportadas são STR e DTOS.7. Í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. A função STR deve obrigatoriamente receber como parâmetros valores idênticos a definição da tabela. 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.1. Exemplo: Em um arquivo com a seguinte estrutura: CAMPO1 – Caracter de 10 posições.7. não interferindo assim com os índices do arquivo.7. Para se criar um índice que ordene o arquivo por CAMPO1 + CAMPO2 deverá o seguinte comando ser utilizado: INDEX ON CAMPO1+STR(CAMPO2.4.AND. 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. Índices condicionais Nos gerenciadores de banco de dados não existe a figura dos índices condicionais. SALDO > 10000 .14.7. Exemplo: INDEX ON CPOVAL1 + CPOVAL2 TO ARQIND . 2.AND. 2.3. Para a criação de índices que contenham campos caracter e numéricos na chave apenas uma regra deve ser obedecida.NOME FOR ESTADO = "SP" AND SALDO > 10000 Com o TOPConnect este índice seria o mesmo que: SET FILTER TO ESTADO = "SP" .Programação em ADVPL / SQL / ASP com AP5 return 2. CAMPO2 – Numérico de 14 Posições com 2 decimais. O TOPConnect disponibiliza os dados na ordem solicitada pela cláusula OrderBy na Ordem 0 do arquivo. Para se obter resultados semelhantes aos índices condicionais o TOPConnect agregou nova funcionalidade ao filtro do SigaPROTHEUS / AP5. Considere uma aplicação que crie o seguinte índice: INDEX ON CODIGO.7. DBFNTX x TopConnect 2.2.

AND. 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.AND. Exemplo SELECT CLIENTES //Importa registros de um DBF APPEND FROM c:\temp\newcli.Programação em ADVPL / 2.8.dbf Ou SELECT CLIENTES //Importa registros da tabela NEWCLI APPEND FROM NEWCLI VIA "TOPCONN" 2. Pôr exemplo: SET FILTER TO ESTADO = 'SP' . Para a utilização destes comandos o programa deverá conter a seguinte instrução: #INCLUDE "TOPCONN. 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. 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. 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. Analisando o seguinte filtro : SET FILTER TO CODIGO > "01000" . No TOPConnect o comando APPEND FROM importara registros de um arquivo DBF para uma tabela do banco de dados.5. CODIGO > RetornaCodigo() Nesta expressão somente virão para o cliente os registros onde os campos ESTADO e SALDO obedeçam ao filtro e então o campo CODIGO será avaliado no cliente. 2.1.8.AND.7. 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.CH" 2.8. 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. 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. SALDO > 10000 . COPY TO . 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.2.

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

TCCONTYPE Especifica o protocolo de comunicação a ser utilizado pelo TOPConnect.."CUSTCOD") INDEX ON CODIGO TO CUSTCOD ELSE SET INDEX TO CUSTCOD ENDIF . cIndice]) =>lógico Exemplo //Testa a existência da tabela customer IF !TCCanOpen("CUSTOMER") dbCreate("CUSTOMER"..9. Sintaxe TCConType(<cType>) Onde <cType> pode ser: TCPIP Utiliza o protocolo TCP/IP. APPEND BLANK REPLACE NUM WITH cNumero REPLACE QUANT WITH nQuant . NPIPE Utiliza o protocolo Named Pipes. COMMIT TRANSACTION 2..9...9... Funções 2. TCCANOPEN Verifica a existência de tabelas e índices no servidor. Sintaxe TCCanOpen(cTable [. 2. APPC Utiliza o protocolo APPC. "TOPCONN") ENDIF USE CUSTOMER SHARED NEW VIA "TOPCONN" //Testa a existência do índice IF !TCCanOpen("CUSTOMER". aStru...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 .. .2.1.

Microsoft SQL-Server 6. TCDELFILE Exclui uma tabela no servidor.9. Sintaxe nCon := TCLink(<cConectString>.5.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.3.5 Microsoft SQL-Server 7. Exemplo #INCLUDE "TOPCONN.9. 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.CH" //Especifica conexão TCP/IP TCConType("TCPIP") //Conecta-se ao ambiente SIGAADV no Microsoft SQL-Server TCLink("MSSQL/SIGAADV") 2. Exemplo TCDelFile("CUSTOMER") 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. Sintaxe TCDelFile(<cTable>) Onde <cTable> é o nome da tabela a ser excluída. .<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.4. 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.9. um ambiente é o nome do Alias criado com o utilitário SQL-Net. Para o TOPConnect NT acessando os demais SGDB's um ambiente é um System DSN criado através do ODBC Data Source Administrator.

Para informações sobre a criação de ambientes consulte o manual de instalação do TOPConnect. Exemplo //Conecta-se ao Microsoft SQL-Server no ambiente SIGAADV //Protocolo Named Pipes TCConType("NPIPE") nCon := TCLink("MSSQL/SIGAADV"."TOPSRV") if nCon < 0 //Conexões com retorno < 0 significam erro Alert("Falha de conexão com o TOPConnect") endif //Protocolo TCP/IP TCConType("TCPIP") //Conecta-se ao Oracle – no ambiente TESTES nCon := TCLink("ORACLE/TESTES".2) //Protocolo APPC //Conecta-se ao AS/400 no ambiente PRODUCAO nCon := TCLink("PRODUCAO".1.5 MSSQL Microsoft SQL-Server 7.16.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.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. 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.172."TOP400") .

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

9. VALOR FROM CUSTOMER" ALIAS QUERY VIA "TOPCONN" TCSetField("QUERY".Decimal>] ) Onde <cAlias> é o alias da WorkArea... DATA.. Ex."DATA".. se não o tratamento é automático. [<Prec. Exemplo TCQUERY "SELECT NOME. IN_VALOR. e no caso dos numéricos como float.<Prec.10. DATE e LOGICAL. Sintaxe TCSetField(<cAlias>.9.<cType>. MARRIED. na recuperação de campos tipo NUMERIC. <cField> . OUT_CODIGO . 2."D") TCSetField("QUERY".12. 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_.2) Dentro de um programa ADVPL já podemos considerar como um campo data não mais um campo caracter como é o seu armazenamento."VALOR".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" ..Inteira>. Parâmetros de OUTPUT devem começar com OUT_.9.. pois os mesmos são gravados fisicamente no Banco de Dados como caracteres. TCSPEXEC Executa uma Stored Procedure no Banco de Dados. Ex."N". <cField> é o nome do campo e <cType> é o tipo desejado para o campo. 2. TCSETFIELD Esta função serve como apoio ao comando TCQUERY. O campo Data só é retornado como um campo caracter por que estamos utilizando a função TCQUERY.

9.9.11.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.. Exemplo //Verifica se a Stored Procedure Teste existe no Servidor If TCSPExist("TESTE") //Executa a Stored Procedure Teste aRet := TCSPExec("TESTE". Exemplo If SPExist("CALCCUSTO") TCSPExec("CALCCUSTO") Endif 2.. onde n é o número de parâmetros de OUTPUT da Stored Procedure. Sintaxe <cError> := TCSQLError() Onde <cError> é a mensagem de erro."JOSE". Sintaxe <lExist> := TCSPExist(<cSPName>) Onde <lExist> indica se a Stored Procedure existe ou não e <cSPName> é o nome da Stored Procedure procurada.<xParam2>.[<xParam1>. TCSPEXIST Verifica a existência de uma determinada Stored Procedure no servidor.9. TCSQLERROR Retorna o último erro registrado pelo TOPConnect durante a execução de uma Query. 2. 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. TCSQLEXEC .13.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. Sintaxe <aRet> := TCSPExec(<cSPName>.12.<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.

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

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.3. 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. FROM CLIENTES . Otimizando seu código A linguagem ADVPL tem um enfoque posicional. enquanto aos Bancos de Dados SQL recuperam os dados por blocos de dados.10. 2. 2.10.9.2. Leitura Sequencial Operações de leitura seqüencial de uma tabela podem levar a problemas de performance. Devido a esta diferença conceitual.18.1. subtilizando a capacidade de processamento do servidor.Programação em ADVPL / SQL / ASP com ?TCExeError() AP5 ( * )Funções apenas para o TOPConnect rodando em servidores AS/400.9. Performance 2. 2. TCPGMEXE* Executa um programa no servidor AS/400 TCPGMEXE( program name ) ( * )Funções apenas para o TOPConnect rodando em servidores AS/400. O uso de filtros .19. 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. 2. recuperando os dados utilizando orientação a registros. 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. O código acima poderia ser substituído por: TCQUERY "SELECT SUM(SALDO) .10.10. 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.

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

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

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

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

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

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

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

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

. arquivo ou função.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). .Path indica o diretório onde o AP5 Server localizará os arquivos HTML e demais arquivos que forem requeridos por um Web Browser. 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). originalmente requisitado. . Quando um comando desses é requisitado ao servidor e uma destas chaves está em uso.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).Port é a porta utilizada para conexão ao Servidor RPC.TYPE indica o tipo de conexão que será efetuada entre o servidor atual (que é o AP5 Server encarregado de responder os requests HTTP) e o servidor de RPC (que é o encarregado de executar as rotinas em Advpl).Server indica o nome ou endereço IP do servidor encarregado da execução das rotinas em Advpl (RPC). SERVERKEY) .Enable indica se habilita/desabilita o serviço. . .Programação em ADVPL / SQL / ASP com AP5 Onde as chaves são:  Grupo HTTP .GetProc e PostProc são parâmetros opcionais que podem ser utilizados para interceptar os comandos GET e POST que caem no AP5 Server.  Grupo <SERVIDOR> (no exemplo. Port é a porta utilizada para a conexão dos Web Browsers. a função informada é executada e receberá um parâmetro com o nome da página.RPCEnv indica o nome do grupo que contém as configurações de ambiente para a execução das funções requisitadas em RPC. . . .

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

o item somente existirá no array caso o campo tenha sido selecionado no formulário HTML (por exemplo. Para maiores detalhes.__nProcID. Porém.Programação em ADVPL / SQL / ASP com AP5  O AP5 Server passa alguns parâmetros para as funções chamadas. - __aProcParms: Este parâmetro recebe um array bidimensional com os parâmetros enviados na linha de URL do Web Browser.__cHTTPPage) Local cHTML := "" Local i . Para testá-la. Por exemplo.PRW. {“endereco”. É utilizado quando as chaves GETPROC e POSTPROC (explicadas anteriormente) são habilitadas no arquivo de configurações do AP5 Server. “NOME DIGITADO NA PAGINA HTML”}. Após compilar o programa. deve-se criar o cabeçalho da função com estes parâmetros. Pode-se utilizá-lo para checar validações mantidas nas máquinas client por exemplo. {“quant”. “000001”}. 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. {“nome”.apl?cod=000001&desc=DESCRICAO DO PRODUTO&qtd=2 Código da função: #include "rwmake.ch" User Function WebDemo(__aCookies. 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. que enviam os dados para a função cadastro. 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). É muito útil também para criar links de execução diretamente através de um Web Browser. é aconselhável utilizá-los por motivo de padronização: .__aCookies: Este parâmetro recebe um array bidimensional com os Cookies criados na aplicação client HTTP (por exemplo. 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. Por exemplo. A utilização deste parâmetro será explicada juntamente com o tópico ADVPL ASP posteriormente. consulte a documentação do HTML ou do Web Browser utilizado. Não é obrigatório utilizar os mesmos nomes de parâmetros sugeridos abaixo quando criar diretamente estas funções. a função receberá o array __aPostParms da seguinte forma: { {“nome”. basta chamar em um Web Browser uma URL como: http://localhost/u_webdemo.apl?cod=000001&nome=PRODUTO DE TESTE&quant=20 a função chamada vende receberá o array __aProcParms da seguinte forma: { {“cod”. crie um arquivo novo no AP5 IDE. no Internet Explorer 5). Cada item deste array contém um array com o nome do campo e o valor informado. - __cHTTPPage: Esse parâmetro recebe o nome da página. para um formulário com dois campos para digitação (um chamado nome e o outro chamado endereco). “PRODUTO DE TESTE”}. cole o código abaixo e salve o arquivo como WEBDEMO. como são esses os nomes utilizados no ADVPL ASP explicado mas a frente.__aProcParms.__aPostParms. “20”} } A função pode tratar estes dados recebidos para realizar processamentos específicos. na execução de uma função via linha de URL do Web Browser como: http://servidor/vende. - __aPostParms: Este parâmetro recebe um array bidimensional com os campos contidos em um formulário HTML recebido através de um comando POST.apl através de um POST. “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. Isso significa que ao criar funções para serem utilizadas em resposta às requisições HTTP. se o checkbox for marcado). - __nProcID: Contém o Handle da Thread de execução daquela função. arquivo ou função originalmente requisitada para o AP5 Server. 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. que receberá os mesmos parâmetros das funções APL simples. No ADVPL ASP esse código é padrão xBase. ou seja. pois o APH também é um arquivo HTML.1] + ' __aProcParms[i. A função que foi gerada na compilação irá se encarregar de retornar o HTML contido no arquivo. 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> . São arquivos texto e devem ser adicionados a um projeto no AP5 IDE e compilados da mesma maneira que os programas tradicionais. 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. Caso exista essa necessidade. depois que o código foi processado.' Else For i := 1 To Len(__aProcParms) cHTML += '<p>Parâmetro: ' + __aProcParms[i. Do mesmo modo que as demais funções. O desenvolvedor não precisa se preocupar em retornar HTML algum. e retornará uma string. em qualquer request HTTP.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.apl E deve-se sempre indicar a extensão . A extensão APH para o nome dos arquivos é obrigatória.APH. Este parser irá transformar todo o arquivo em uma função única. não é possível utilizar a cláusula FUNCTION para criar outras funções dentro de um arquivo APH. por exemplo: http://servidor/u_webrelato.APL para que o AP5 Server identifique que é uma função a ser executada. Assim como outros ASP´s. tais funções devem ser criadas em um arquivo PRW tradicional e chamadas de dentro do APH. 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. Por exemplo. Qualquer outra extensão usada no nome do arquivo não será reconhecida e o parser não será executado antes da compilaçã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. por exemplo) com a extensão . como explicado anteriormente.2] + '</p>' - Valor: ' + Next i Endif Return(cHTML) Para crias as funções que serão utilizadas em chamadas via um Web Browser. o IIS da Microsoft utiliza o VBScript para criar suas páginas ASP. Por exemplo. Uma página ASP é uma combinação de script HTML e código interpretável. Características do ADVPL ASP Os arquivos ADVPL ASP têm a extensão padrão . 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. do mesmo modo que o AP5 utiliza o ADVPL. o arquivo APH também deve ser executado (através da URL do Browser. 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. Por se tornar uma função no momento da compilação.

</b> No exemplo acima. 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. 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. e a interface fica por conta do Browser (utilizando o HTML). pode-se criar toda uma apliação Web baseada no AP5. A grande vantagem de se criar arquivos ADVPL ASP em relação a criar funções APL simples. cujo conteúdo contém uma expressão que será avaliada em tempo de execução: <b>Esta linha é HTML.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 .Programação em ADVPL / SQL / ASP com AP5 <% // Soma os 100 primeiros números Local i. a linha HTML será retornada para o Browser com o resultado da função time (ou seja. Abaixo um exemplo de um relatório de clientes criado utilizando o ADVPL ASP. Com eles pode-se criar uma linha de script HTML. dentro de um mesmo arquivo. Ou seja. Utilizando todos esses conceitos. estes devem sempre estar na mesma linha. campos. 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. a hora atual no servidor) inserido no texto. etc. porém o script colocado ao redor do código será mantido exatamente como se encontra. Outro detalhe importante é que pode-se utilizar as estruturas de fluxo da linguagem ADVPL para repetir comandos do próprio script HTML (por exemplo. Ou seja. Isso pode ser realizado através dos delimitadores de avaliação. E também. 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. Diferentemente dos delimitadores de código interpretável. colocar o conteúdo de variáveis. mas a data exibida aqui: <%= Time() %> foi obtida em tempo de execução. Para testá-lo basta copiar o código. salvá-lo como WEBREL. é utilizar os comandos ADVPL para alterar o script de formatação. Tão importante quanto mesclar código interpretável com script de formatação HTML. 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. o processamento e acesso aos dados fica por conta do AP5 Server.

cLocAte Local nPos nPos := aScan(__aProcParms.2] Else cLocDe := "" Endif nPos := aScan(__aProcParms.{|x| Upper(AllTrim(x[1])) == FIELD_CODDE }) If nPos != 0 cCodDe := __aProcParms[nPos.cLocDe.2] Else cCodDe := "" Endif nPos := aScan(__aProcParms.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 .{|x| Upper(AllTrim(x[1])) == FIELD_LOCATE }) If nPos != 0 cLocAte := __aProcParms[nPos.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 cCodAte := "ZZZZZZ" Endif nPos := aScan(__aProcParms.cCodAte.Programação em ADVPL / SQL / ASP com AP5 Local cCodDe.{|x| Upper(AllTrim(x[1])) == FIELD_CODATE }) If nPos != 0 cCodAte := __aProcParms[nPos.{|x| Upper(AllTrim(x[1])) == FIELD_LOCDE }) If nPos != 0 cLocDe := __aProcParms[nPos.

Or.Programação em ADVPL / SQL / ASP com AP5 <td width="181" height="24" bgcolor="#FFFFCC"><%= __aProcParms[i."SB2"} ) Endif dbSelectArea("SB1") dbSetOrder(1) dbSeek(xFilial("SB1")+cCodDe+cLocDe. "01". 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_COD <= cCodAte.And. 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.</b> <% Endif %> </center> </div> <p align="left">&nbsp.</p> <% // Abertura dos arquivos e posicionamento do ponteiro If Select("SB2") == 0 .. . SB1->B1_LOCPAD <= cLocAte SB2->(dbSetOrder(1)) SB2->(dbSeek(xFilial("SB2")+SB1->B1_COD+SB1->B1_LOCPAD.) %> <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() .""."". Select("SB1") == 0 RpcSetEnv ( "99".8. xFilial("SB1") == SB1->B1_FILIAL .)) %> <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.2) %></td> %></td> %></td> %></td> %></td> </tr> <% dbSkip() EndDo %> </table> </body> </html> Após ter o código compilado.1] %></td> <td width="327" height="24" bgcolor="#FFFFCC"><%= __aProcParms[i.F.2] %></td> </tr> <% Next i %> </table> <% Else %> <b>Nenhum parâmetro informado.T. {"SB1". .apl 7. "".And.And. ""..

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

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

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

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

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

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

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