a biblia do advpl

Upload: mmmatrix

Post on 07-Jul-2015

557 views

Category:

Documents


7 download

TRANSCRIPT

----------------------- Page 1----------------------A Tecnologia Protheus O Advanced Protheus uma nova tecnologia desenvolvida sobre o sistema A dvanced, que teve toda a inteligncia dividida em duas camadas: Servidor de Aplicao (Protheus Server) e Interface (Remote). Ou seja, uma aplicao 32 bits que se encarrega do gerenciamento das conexes, da e xecuo do cdigo AdvPl e do acesso aos recursos de banco de dados (ADS, Btrieve, CTree ou TopC onnect), e uma aplicao thin-client que efetua apenas a interface com o usurio. Caractersticas da Tecnologia Protheus As principais caractersticas da tecnologia Protheus so: Possibilidade de grande variao de topologias de rede e processamento distr ibudo Baixo trfego de rede entre o AP5 Server e o AP5 Remote ltneas e Utilizao de configuraes, possibilitando o uso de conexes atravs de protocolos diferentes e o acesso a diferentes repositrios de APO's diretrios (o que permite o uso de diferentes idiomas, verses, etc, acessando a mesma base de dados) impresso de relatrios. No Advance

sim

d

Diferentes possibilidades de Protheus pode-se imprimir os relatrios de trs formas: 1.Em disco 2.Via Windows 3.Direto na Porta

As impresses efetuadas via Windows ou diretamente na porta podem ser impress as no servidor (o que evitar o trfego de rede do relatrio impresso) ou na estao. As impresses efetuadas em isco tambm evitam o trfego de rede. Os relatrios em disco so sempre mantidos no ser vidor e somente as pginas requisitadas so enviadas estao.

Os arquivos de banco de dados so sempre abertos no servidor. Entretanto, arquivos texto podem ser abertos na estao com a funo FOpen. A referncia a paths que no con iverem uma letra de drive (por exemplo, "\DADOS\ARQ.TXT"), so consideradas a parti r do servidor no diretrio informado na seo "RootPath" do arquivo de configuraes do Protheus Server No existe o conceito de "mdulos" de sistema. Existe o conceito de programa inicial, de onde a execuo do Remote ser iniciada (e os outros APO's utilizados sero carregado s e descarregados

dinamicamente de acordo com sua chamada a partir deste). Isso permite que rotinas que eram de "mdulos" diferentes sejam executadas diretamente de um mesmo menu de us urio As Camadas do Advanced Protheus O Advanced Protheus dividido em quatro camadas para a operao so elas: ----------------------- Page 2----------------------Servidor de Aplicao Terminal Thin-Client Dados Repositrio de APOs Servidor de Aplicao

O Protheus Server a aplicao encarregada da compilao e da execuo do cdigo em AdvPl, ual o sistema Siga Advanced est escrito a partir da verso 5.07. Na linguagem AdvPl, as r otinas so mantidas em APO's (Advanced Protheus Objects) individuais em repositrios. Is so permite que as rotinas sejam carregadas/descarregadas dinamicamente da memria da mquina onde o Protheus Server est sendo executado, ou seja, de acordo com a necessidade de execuo dos Terminais conectados, e facilita a atualizao aps correes de no-conformidades ou criao de melhorias, pois apenas os APO dificados necessitam ser atualizados. Desse modo, a performance alta e no requer muit os recursos da mquina para a execuo do servidor. Terminal Thin-Client O Remote a aplicao encarregada da interface com o usurio. No existe proces samento local, por isso o trfego de rede entre o Terminal e o Servidor d e Aplicao baixo, tratando-se apenas de comandos para o desenho das telas e do tratamento do teclado e mouse. Dados O acesso aos dados efetuado pelo Servidor de Aplicao utilizando as segui ntes bases de dados: ADS, BTrieve, CTree e TopConnect (para padro SQL). Para bases de dados SQL, existe total suporte a Stored Procedures. No Protheus, todas as bases de dados tm suporte a controle de transao. Repositrio de Apos

E no repositrio que se encontram os programas escritos em AdvPl que sero carregados para a execuo de determinada tarefa. atravs do repositrio de Apos que pode-se incluir novas customizaes

no sistema. Estruturao A estrutura de diretrios do Advanced Protheus A estrutura de diretrios do Advanced Protheus depende ada. Verso AP5 \ap5\ Diretrio inicial do Protheus. a partir deste diretrio q ue o sistema ir localizar os caminhos informados em parmetros, customizaes, etc. \ap5\apo\ de APOs. \ap5\bin\ ncleo do Protheus: Diretrio onde sero localizados os arquivos de repositrio Diretrio onde so localizados os arquivos do executveis, bibliotecas de carga dinmica (DLLs) e arquivos de confi da verso instal

gurao do sistema. \ap5\sigaadv\ Similar ao \SIGAADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se encontram os arquivos de configurao do sistema ERP Adva nced, arquivos de menus, etc. tambm o diretrio inicial de execuo no Remote. ----------------------- Page 3----------------------\ap5\dadosadv\ ed 2.0x/4.0x. SQL. \ap5\relato\ x/4.0x. Diretrio \ap5\cprova\ x/4.0x. Diretrio \ap5\ixbpad\ lo escritos para Similar ao \RELATO\ das verses gravao de arquivos de impresso em disco. Similar ao \CPROVA\ das gravao de arquivos de contabilizao. verses Advanced 2.0 Similar ao \DADOSADV\ das verses Advanc o diretrio onde se localizam os arquivos de base de dados para verses no

Advanced

2.0

para

em

AdvPl,

Diretrio de localizao de programas nos padres definidos pela Microsiga Software S.A.

de

exemp

\ap5\include\ extenso .CH) \ap5\util\ Verso AP6

Diretrio de arquivos de incluso necessrios para a compilao de programas escritos em AdvPl.

padro

(

Diretrio de ferramentas adicionais do Protheus.

\ap6\ Diretrio inicial do Protheus. a partir deste diretri o que o sistema ir localizar os caminhos informados em parmetros, customizaes, etc.

\ap6\apo\ trio de APOs. s \ap6\bin\server\ do ncleo do

Diretrio onde sero localizados os arquivos de reposi Diretrio onde so localizados os arquivo Protheus Server: executveis, bibliotecas de carga dinmica (DLLs) e arq Diretrio onde (Remote, IDE, Monitor, etc): e arquivos de configurao. so localizados os arquivos de

uivos de configurao. \ap6\bin\remote\ das aplicaes carga dinmica clientes (DLLs)

executveis,

bibliotecas

\ap6\sigaadv\ ed 2.0x/4.0x. sistema te. \ap6\dadosadv\ 2.0x/4.0x. no SQL. o ERP

Similar ao o diretrio onde encontram Advanced, arquivos menus, etc.

\SIGAADV\ das verses Advanc se os arquivos de configurao do de tambm o diretrio inicial de execuo no Remo

Similar ao \DADOSADV\ das verses Advanced diretrio onde se localizam os arquivos de base de dados para verses Similar ao \RELATO\ das verses Advanced gravao de arquivos de impresso em disco. Similar ao \CPROVA\ das verses Advanced gravao de arquivos de contabilizao. 2.0x/

\ap6\relato\ 4.0x. Diretrio para \ap6\cprova\ 4.0x. Diretrio

2.0x/

para

\ap6\ixbpad\ lo escritos em AdvPl, \ap6\include\ (extenso .CH)

Diretrio de localizao de programas de nos padres definidos pela Microsiga Software S.A.

exemp

Diretrio de arquivos de incluso necessrios para a compilao de programas escritos em AdvPl.

padro

Estas so as estruturas para uma instalao padro do Protheus de acordo com a verso utilizada.

Porm a localizao de instalao pode variar de acordo com o local de instala Aplicativos do Advanced Protheus O Advanced Protheus possui, basicamente, quatro aplicativos utilizados com diferentes finalidades. So eles: Protheus Server Trata-se do servidor de aplicao do Advanced Protheus est a a parte do sistema que ser executada no Servidor e ser responsvel pela comunicao entre o Cliente, a Base de Dad os e o Repositrio

de Apos. O nome do executvel depende da verso e sistema operacional uti lizados, por exemplo: AP5SRV.EXE ou AP6SRVWIN.EXE. Remote ----------------------- Page 4---------------------- o Remote que utilizamos para interagir com todo o si stema, ele poder ser instalado de duas maneiras, no servidor ou na prpria estao de trabalho. O nome do executvel depende da verso utilizada, por exemplo: AP5RMT.EXE ou AP6RMT.EXE. IDE

Trata-se do ambiente de desenvolvimento integrado do Advanced Protheus. atravs deste aplicativo que todos os acessos aos repositrios de Apos (compilao de cust omizaes, visualizao de funes existentes etc.) so efetuados, e tambm a ferramenta para d esenvolvimento e depurao de aplicaes/customizaes. O nome do executvel depende da verso utilizada, por exemplo: AP IDE.EXE ou AP6IDE.EXE. Monitor Esta ferramenta permite a interao com os usurios conectados ao sistema: A nalisar os programas em uso, derrubar conexes pendentes, enviar mensagens ao usurios etc. O nome do exe cutvel depende da verso utilizada, por exemplo: AP5MONIT.EXE ou AP6MONIT.EXE a e com Alem destas aplicaes, o outros utilitrios diversos, Dump Siga Advanced comparao Protheus de conta aind

como o Diff (utilizado para (utilizado para edio de arquivos binrios).

arquivos

texto)

Nomenclaturas Utilizadas Estas so as principais nomeclaturas utilizadas no Advanced Protheus: Build: Verso completa do sistema com seus executveis, Dlls e RPO completo. O bui ld do sistema pode ser identificado atravs da opo Miscelneas Sobre dentro dos mdulos do sistema. RPO: o arquivo binrio de repositrio de APOs, com o cdigo AdvPl. Patch: Arquivo binrio semelhante ao repositrio contendo apenas atualiz aes de APOs, correes disponibilizadas pela Microsiga Software S.A., que ser aplicado no repositrio a travs do IDE.

Verso Master : Mesma definio de build porm neste caso a verso ser utilizada como eferncia para a gerao de atualizaes do sistema (patchs). Quando gerada, a verso en

inhada a todos os envolvidos em processos de implantao/utilizao do sistema via correio ou disponibi lizada no site de FTP do Protheus. A definio dos nomes dos arquivos dos repositrios de APO s e Patchs seguem o mesmo padro =RPO) e (diferenciando-se apenas na efetuada da seguinte maneira AP12345.RPO: 1 (D)bf, (T)op, (A)ds, (B)trieve, (C)Tree; 2 (P)ortuguese, (E)nglish, (S)panish; 3 Verso; 4 Verso; 5 Verso; ra base Por exemplo, APBP609.RPO ser de dados BTrieve, idioma Portugus e verso 609. um repositrio de APO s extenso Patch=.PAT e repositrio

----------------------- Page 5----------------------Devido sua diviso em camadas, a tecnologia Protheus permite montar o ambi ente de execuo com diferentes topologias, priorizando a execuo, o trfego de rede ou os recursos individuais das mquinas existentes, o que torna o processamento distribudo. Essa uma das grandes vantagens da tecnologia Protheus. Caractersticas e Possibilidades de Topologias de Rede Pode-se manter um ou mais servidores de aplicao do Protheus (Protheus Server ). Um Protheus Server pode estar na mesma mquina que o gerenciador de banco de dados. Mquinas melhores ou com mais recursos podem ter um Protheus Server sendo executado localmente (na estao) visando priorizar o processamento local. Porm h um aum ento do trfego de rede entre o gerenciador de banco de dados e o Protheus Server local. Do mesmo modo, pode-se executar servidores remotamente priorizando o proce ssamento de uma ou mais estaes. Utilizao do protocolo pode-se utilizar tambm o protocolo NAMED PIPES. TCP-IP para as conexes. Na verso AP5

pa

Pode-se disponibilizar conexes via Internet atravs da montagem de um Web Ser ver na empresa ou atravs de provedores de acesso (como a UOL e o ZAZ). Neste caso, o Pro theus Server pode ser executado no provedor ou na empresa utilizando uma LP para a conexo ao pr ovedor de acesso. seja, A Internet utilizada apenas como o meio de comunicao, ou a conexo TCP-IP entre o Remote e o Protheus Server. Alm da segurana oferecida pelo sistema Advanced, a segurana dever ser oferecida pela conexo. Por isso, aconselhvel que a mquina onde o servidor Web esteja sendo executado no seja o mesmo do servidor da banco de dados.

O Protheus Server tambm pode ser executado como um servidor Internet, HTTP e/ou FTP. Pode-se manter uma pgina para o download do Remote, de modo que os usurio re motos possam efetuar o download para conectar-se e utilizar o sistema . Na verso AP6 pode-se configurar o Remote para se atualizar automaticamente a partir do Protheus Server sen do executado como um servidor FTP. ----------------------- Page 6----------------------rtante

A definio da melhor topologia para execuo um passo imp da implementao da tecnologia Protheus, pois influenciar totalmente na performa nce. O maior trfego de rede est localizado entre o Protheus Server e o Banco de Dados, j que o trfego e ntre o Protheus Server e o Remote limita-se s informaes para montagem de telas e controle de tecla do e mouse. Desta forma, dependendo do tipo e da velocidade da conexo, pode se tornar invivel manter um Protheus Server em uma cidade conectado ao banco de dados em outra. Por outro lado, caso existam muitas conexes nesta outra cidade, ou caso estas conexes executem processamentos pesados, priorizar o processamento disponibilizando um Protheus Server para ser executado localmente nesta cidade pode ser uma boa soluo. Balanceamento de Carga entre Servidores (LoadBalance) Introduo Quando existe uma grande quantidade de usurios que utilizam o sistema e o servidor no possui uma configurao ideal para comportar todos, mas h mais de um servidor disponvel, pode-se configurar um esquema Server de balanceamento de carga para que nenhum servidor fique sobrecarregado e comprometa assim o desempenho 2 da rede e do servidor. R

MASTE

Para que isto seja possvel, nomeamos um servidor intitulado de servidor Master que ser o responsvel por administrar o balanceamento, alm de comportar conexes tambm.

(Server1 )

Server O balanceamento feito por proporo, ou seja, se tivermos 60 usurios e definirmos que o servidor Master 3 ter 10 conexes, o servidor Server2 20 e o servidor Server3 30, a proporo aqui de 1:2:3, ou seja, a cada 1 usurio pendu rado no servidor Master, 2 entraro no Server2 e 3 no Server3. Ficaria assim: # 01 02 03 04 05 06 07 Usurio Joo Karla Paulo Mrio Karina Daniel Rosana Servidor Master Server2 Server2 Server3 Server3 Server3 Master

Configurando o Servidor Master O nico ap5srv.ini que ser alterado com as configuraes abaixo o do servidor master, s ele quem administrar o balanceamento de carga. Todos os usurios se conecta ro inicialmente ao servidor Master, e este quem efetuar o balanceamento de carga para os outros servidores. N os inis dos outros servidores ser alterado apenas o parmetro rootpath, para que eles peguem a mesma bas e de dados do servidor master. As sees que devem ser alteradas so estas abaixo: [ServerNetwork] Servers=Master,Server2,Server3 aqui deve ser informado o nome das sees para cada servidor, que sero configurada s abaixo. [Master] TYPE=TCPIP Server=SIGAMASTER o nome indicado no parmetro Server nesta seo o nome do servidor. Pode-se indicar tambm o endereo IP do mesmo. Connections=10 ----------------------- Page 7----------------------[Server2] TYPE=TCPIP Server=SIGASERVER2 Connections=20 [Server3] TYPE=TCPIP

Server=SIGASERVER3 Connections=30 Configurao dos outros Servidores Como j foi citado acima, nos demais servidores a nica coisa que ser alterada o parme tro rootpath do arquivo ap5srv.ini. Para isso, o diretrio-raz AP5 do servidor Master dever ser compar tilhado com direitos apenas para um usurio que ser usado por todos os servios. Assim, os outros usurios no conseguiro acesso a este diretrio. Isto necessrio para que todos os servidores enxerguem a me sma base de dados. Supondo que a base de dados esteja no servidor Master, os inis ficariam assim: [Environment] SourcePath=C:\AP5\APO RootPath=\\SIGAMASTER\AP5 veja que o raiz est sendo apontado para o servidor Master. StartPath=\SIGAADV\ (demais configuraes continuam iguais) Observaes Cada servidor dever ter o seu build e repositrio, sendo que a base de dado s fica centralizada no servidor Master ou no servidor de banco de dados. Quando for feita qualquer atualizao de build e repositrio no servidor Maste r, a mesma alterao dever ser feita nos outros servidores. Um mesmo usurio Windows dever ter direitos na pasta compartilhada (rootpat h) e dever ser um usurio Administrador, para que possa ser associado ao servio de cada servidor. Para checar onde os usurios esto conectados, basta utilizar o aplicativo A p5Monitor em cada servidor. IDE - Integrated Development Environment

O IDE (Integrated Development Environment) uma ferramenta de edio, compilao e d epurao de erros. atravs do IDE que o sistema ERP Siga Advanced desenvolvido. Tambm atravs do IDE que os analistas da Microsiga e os usurios do Protheus podem criar e manter suas rotinas especficas. O IDE o nico modo de compilar os arquivos de programas escritos em AdvPl para a g erao dos APO s no repositrio. Como ferramenta de edio e depurao, engloba todos os recursos disponveis nas melhor es ferramentas de desenvolvimento do mercado. Caractersticas do IDE

Para a execuo do IDE no necessrio conectar-se ao Protheus Server, exceto na operaes de

atualizao ou consulta de um repositrio (compilao, obteno do Mapa de Objeto aplicao de patchs, etc) e durante o processo de depurao. No aconselhvel executar o IDE remotamente (via Internet ou via modem), poi s a conexo do Remote ao Protheus, quando efetuada atravs do IDE, mais lenta. Os passos para o desenvolvimento de programas em AdvPl utilizando o IDE so: 1.Criao do cdigo atravs do editor. Na linguagem AdvPl, os analistas e os usur ios do Protheus tm todos os recursos disponveis para o desenvolvimento de suas rotinas . E diferentemente do ----------------------- Page 8----------------------sso, a antigo RDMAKE, no mais uma linguagem interpretada. performance das rotinas especficas dez vezes maior do que era nos RDMAKEs antigos. Por i

2.Montagem do Grupo de Projetos. O Grupo de Projetos um gerenciador existente dentro do IDE, onde o usurio pode manter os arquivos de cdigo separados por projet os e pastas. Com um grupo de projetos os arquivos podem ser organizados de uma forma lg ica, em projetos e pastas. 3.Compilao. Durante a compilao, os arquivos so enviados rotheus Server. Toda a compilao e a gravao no repositrio so efetuadas no servidor. ao P

4.Depurao. O IDE permite aos usurios depurar as rotinas criadas, executando-as linha a linha ou em modo de animao. Permite visualizar informaes como variveis em diferentes escopos, pilha de chamadas, lista de break points, etc. Exatamen te como as melhores ferramentas de desenvolvimento existentes no mercado. No IDE pode-s e depurar pontos de entrada simplesmente colocando-se um ponto de parada (break point) em uma linh a qualquer do cdigo do ponto de entrada; Monitor O Monitor utilizado para monitorar as conexes de terminais ao Protheus Server. At ravs dele pode-se: Verificar as conexes ativas. Enviar mensagens para uma ou mais conexes. Desabilitar novas conexes. Isto til quando se precisa efetuar alguma manuteno se precisa evitar que outros usurios se conectem.

Informaes Bsicas das Conexes Usurio. o nome do usurio na rede local. Para conexes remotas este nome est em ranco. Computador. Nome da mquina onde o Remote est sendo executado. Conexo. Indica a data e hora de incio da conexo do Remote. Tempo de Uso. Indica o tempo em horas, minutos e segundos desde que o Remot e se conectou. Programa Inicial. o nome do programa inicial (APO) com o qual o Remote inic iou a execuo. Environment. Nome do ambiente sendo utilizado pelo terminal. Btrieve Informaes Bsicas Para manipulao de tabelas Btrieve o driver utilizado "BTVCDX"; Para programar algo especfico para o Btrieve pode-se utilizar o teste "#ifde f BTV"; A extenso padro das tabelas ".dat"; Os ndices so criados no mesmo arquivo de dados (".dat"); ----------------------- Page 9----------------------APSdu", As manipulaes e visualizaes de pois as antigas ferramentas so incompatveis; dados devem ser feitas atravs do

O Btrieve verso 6.15 no precisa ser instalado, pois as DLLs necessrias so disp onibilizadas junto com o Protheus. Os arquivos necessrios ficam no diretri o "BIN" (wbtrv32.dll, w32mkrc.dll, wbtrvres.dll e w32mkde.exe). O funcionamento praticamente igual ao Btrie ve Server, portanto pode-se executar os testes na verso 6.15 normalmente;

O w32mkde continua um perodo em execuo aps o trmino do Protheus, pois se o Pro heus for executado novamente no necessrio seu reincio. Quando o usurio desejar renome ar o diretrio "BIN", o mesmo no ser permitido por esse motivo, deve-se portanto finalizar a execuo do mesmo; As informaes das tabelas, ado abaixo do "RootPath", atravs dos tv, Iinfo.btv e Index.btv). arquivos forem apagados s dados sero PERDIDOS. No pode copiar uma tabela

campos e ndices so armazenados no diretrio "DDF", cr arquivos (Field.btv, File.btv, Finfo.b Se estes as tabelas sero recriadas e todos o se com estrutura diferente para este

diretrio, pois seus dados devem ser atualizados nos arquivos do DDF tambm. Como os dad os e o diretrio DDF devem estar "sincronisados" os arquivos do DDF devem ser includos no esquema de "back up" dos dados; As tabelas s podem ter "um" campo do tipo memo e este campo deve ser o ltimo , por isso na hora da criao da tabela o Protheus automaticamente desloca o campo memo para o final e mostra uma mensagem de aviso; Para apagar os ndices, entrar em APSdu, abrir a tabela e escolher Index/erase all. Ele apagar todos os ndices da tabela e tambm a sua definio no DDF. Para fazer via progr ama, selecione a tabela e chame a funo BTVDropIdxs(). Portanto aco nselha-se utilizar o ndice do tipo permanente somente se o mesmo for utilizado posteriormente (outras ab erturas da tabela) caso contrrio deve-se utilizar os ndices temporrios; Para gerar os arquivos DFFs compatveis com outras ferramentas que manipulam arquivos btrieve, inclusive Crystal Reports, existem duas funes para criar os arquivos neces srios: BTVTables e BTVCreateDDFs; Configurao do Btrieve/PervasiveSQL2000: Para configurar o Btrieve Server deve-se executar os seguintes passos: 1.Terminar a execuo do Protheus e parar o servio w32mkde; 2.Deletar os arquivos binrios us\Bin" (wbtrv32.dll, w32mkrc.dll, wbtrvres.dll e w32mkde.exe); do Btrieve do diretrio "Prothe

3.Instalar o PervasiveSQL200 com os respectivos "Services Packs"; 4.Entrar no Pervasive Control Center (menu Iniciar - Pervasive - Pervasive Control Center); de 5.Visualizar os nomes dos servidores Linux, Novell e Solaris deve-se acrescentar um servidor); 6.Atravs de um duplo click sobre utilizar entrar em "configurao" (configuration); disponveis (no caso

o servidor

que

se desej

a

7.Para Windows NT e 2000 deve-se acertar os valores de alguns parmetros: Pasta Access: Accept Remote Request : ON Active Clients :10000 Logical File Handles :100000

----------------------- Page 10----------------------MaxDatabases: 10 Maximum Open Files: 10000 Number of Sessions: 20 Pasta Communication Buffer Size: Communication Buffer Size : 63 MKDE Communication Buffer Size: 63 Read Buffer Size: 4 Pasta Data Integrity: 10. Initiation Time Limit: 100000 11. Operation Bundle Limit: 10000 Pasta Memory usage: Allocate Resource at Startup: On Back to Minimal State if Inactive: On Extended Operation Buffer Size: 16 System Cache: On Pasta Performance Tunning: Cache Allocation Size: +- 131072 (mnimo de 12000) Communications Threads : 64 Index Balancing: Off Largest Compressed Record Size: 0 Log Buffer Size: 64 Number of Input/ Output Threads : 64 Number of Worker Threads: 64 Transaction Log Size: 512 idor para A erem *Obs: O Cache Allocation Size aloca memria do serv uso do banco de dados. Quanto mais memria, mais rpidas so executadas as operaes. possui mesmo uma limitao: Se dois servidores NT4 estiv

verso 6.15 acessando o

arquivo, ocorrer lentido na rede. Isso acontece se for utilizado o mesmo RPO (que um arquivo

btrieve) para dois servidores no AP5. A soluo sempre replicar os repositrios e m cada servidor ou adquirir (deve ser comprado) a verso a partir da PervasiveSQL2000. Em mq uinas Win2000, no nem mesmo possvel abrir um arquivo btrieve de dois s ervidores. Este problema de conhecimento da Pervasive, mas no ser alterado porque esta verso foi descontin uada por volta de agosto de 2001. ----------------------- Page 11----------------------CTree Informaes Bsicas Para manipulao de tabelas Ctree o driver utilizado CTREECDX; Para programar algo especfico para o Ctree pode-se utilizar o teste #ifdef CTREE;

A extenso padro das tabelas .dtc. Quando o LocalFile estiver utilizando o b nco Ctree os SXs continuam tendo como padro a extenso .dbf, mas as tabela s criadas (SX1990.DBF, SX2990.DBF, etc) so Ctree. Portanto recomenda-se que se configure outra extenso padro para arquivos locais do tipo Ctree atravs da chave LocalDbExtension n o arquivo ap6srv.ini como .dtc;

As manipulaes e visualizaes de dados devem ser feitas atravs do du, pois as antigas ferramentas so incompatveis; O Ctree no precisa ser instalado, pois sua biblioteca gerada junto com o Protheus; Os campos do tipo memo devem ser os ltimos da tabela, isso na hora da sua criao o Protheus automaticamente desloca-os para o final e mostra uma mensagem de aviso; por As tabelas geradas pelo Ctree so totalmente compatveis entre as plataforma s Windows e Linux, pode-se inclusive copiar uma tabela gerada no Linux e abr-la no Windows e vice-e-versa. ndices - O ndice interno do Ctree (ordem do recno) criado em outro arquivo com e xtenso .int. Uma pasta (ctreeint) criada abaixo da pasta com a tabela. Nesta pasta sero ar mazenados todos os ndices internos daquele diretrio. Caso no exista o arquivo de ndice intern o o mesmo gerado

automaticamente pelo Protheus mostrando um aviso de que reconstruiu o ndice no servidor na hora da abertura da tabela. Para apag-lo pode ser utilizada uma funo C TREEDELINT; - Os arquivos de ndices permanentes so criados fora do arquivo da tabela c om extenso padro como nos outros RDDs (.cdx), mas suas informaes so armazenadas no arquivo da tabela (.dtc). Portanto para se criar ou excluir ndices permanentes a tabela dev e estar aberta em modo exclusivo. Na hora da abertura da tabela, todos os arquivos de ndices p ermanentes relacionados em sua estrutura so abertos tambm, por isso no se pode deletar o arquivo de ndice permanente com a respectiva tabela aberta. Caso no exista um ou mais arquivos de ndices da tabela na hora de sua abertura, o Protheus ir recri-los automaticamente de forma semelhante ao ndice interno. O diretrio do arquivo de ndice tambm armazenado na estrutur a da tabela, mas quando a tabela aberta e constatado que a tabela est em outro diretrio o Protheus automaticamente atualiza esta informao. Para se deletar os ndices de uma tabela Ctree pode-se utilizar a funo CTREEDELIDXS ou utilizar a opo Index/erase all no APSdu. Portanto aconselha-se utilizar o ndice do tipo permanente somente se o mesmo for utilizado posteriormente (outras aberturas da tabela) caso contrrio deve-se utilizar os ndices te mporrios;

- O ndice temporrio criados dentro de um subdiretrio com o nome do arquivo especificado na hora de sua criao, por exemplo ind1.idx contendo os arquivos ind1 .ind, ind1c.ind e ind1r.ind. Este tipo de ndice no possui definio armazenada no arq ivo da tabela, por ser temporrio. Sistemas (verso posteriores) Operacionais AP6 e e Plataformas

Sistemas Operacionais e Plataformas ----------------------- Page 12----------------------O Protheus Server foi desenvolvido em ANSI C++ e, portanto, independe de API s e specificas para funcionar. Graas a isso, o ncleo do Protheus pode ser recompilado em todos os sistemas operac ionais e plataformas que suportem ANSI C++. Outra preocupao durante o desenvolvimento do Protheus foi garantir total compatibi lidade dos repositrios de objetos do Protheus (RPO s) e das correes dos repositrios (Patch s) entre os sis temas operacionais e plataformas.

Plataformas e SO s suportados Windows e Linux Intel, Windows IA64, Sun Solaris ( RISC ), HP UX ( RISC ), Compaq True64 ( RISC ), IBM AIX ( Power PC e RS/6000 ) Novos SO s a serem suportados PalmOS ( em fase Beta ) PocketPC A Linguagem AdvPl A Linguagem AdvPl teve seu incio em 1994, sendo na verdade uma evoluo na utilizao de linguagens no padro xBase pela Microsiga Software S.A. (Clipper, Visual Objects e depois FiveWin). Com a criao da tecnologia Protheus, era necessrio criar uma linguagem que suportasse o padro xBas e para a manuteno de todo o cdigo existente do sistema de ERP Siga Advanced. Foi ento criada a linguagem chamada Advanced Protheus Language . O AdvPl uma extenso do padro xBase de comandos e funes, operadores, estruturas de controle de fluxo e palavras reservadas, contando tambm com funes e comandos disponibilizados p ela Microsiga que a torna uma linguagem completa para a criao de aplicaes ERP prontas para a Internet. Tambm uma linguagem orientada a objetos e eventos, permitindo ao programador desenvolver a plicaes visuais e criar suas prprias classes de objetos.

Quando compilados, todos os arquivos de cdigo tornam-se unidades de inteligncia bsicas, chamados APO s (de Advanced Protheus Objects) . Tais APO s so mantidos em um repositrio e carregados dinamicamente pelo AP6 Server para a execuo. Como no existe a linkedio, ou unio fs do cdigo compilado a um determinado mdulo ou aplicao, funes criadas em AdvPl podem ser executadas em qualquer ponto do ambiente Advanced Protheus. O compilador e o interpretador da linguagem ervidor AP6 (AP6 Server), e existe um ambiente visual para desenvolvimento integrado cdigo pode ser criado, compilado e depurado. AdvPl (AP6 IDE) o prprio onde o s

Os programas em AdvPl podem conter comandos ou funes de interface com o usurio. De

acordo com tal caracterstica, tais programas so subdivididos nas seguintes categorias: Programao Com Interface Prpria com o Usurio Nesta categoria entram os programas desenvolvidos para serem executados atravs do terminal remoto do Protheus, o AP6 Remote. O AP6 Remote a aplicao encarregada a interface e da interao com o ----------------------- Page 13----------------------usurio, sendo que todo o processamento do cdigo em AdvPl, o acesso ao banco de dados e o gerenciamento de conexes efetuado no AP6 Server. O AP6 Remote o principal meio de acesso a execuo de rotinas escritas em AdvPl no AP6 Server, e por isso permite executar qua lquer tipo de cdigo, tenha ele interface com o usurio ou no. Porm nesta categoria so considerados apenas os programas que realizem algum tipo de interface remota utilizando o protocolo de comunicao do Pro theus. Pode-se criar rotinas para a customizao do sistema ERP Advanced Protheus, desd e processos adicionais at mesmo relatrios. A grande vantagem aproveitar todo o ambiente montado pelos mdulos do ERP Advanced Protheus. Porm, com o AdvPl possvel at mesmo criar tod a uma aplicao, ou mdulo, do comeo. Todo o cdigo do sistema ERP Advanced Protheus escrito em AdvPl. Programao Sem Interface Prpria com o Usurio

d

As rotinas criadas sem interface so consideradas nesta categoria por que geralmente tm uma utilizao mais especfica do que um processo adicional ou um relatrio novo. Tais rotinas no tm interface com o usurio atravs do AP6 Remote, e qualquer tentativa nesse sentido (como a criao de uma janela padro) ocasionar uma exceo em tempo de execuo. Estas rotinas so apenas processos, ou Jobs, e ecutados no AP6 Server. Algumas vezes, a interface destas rotinas fica a cargo de aplicaes externas, desenvolvidas em outras linguagens, que so responsveis por iniciar os processos no servidor AP6 atravs dos meios disponveis de integrao e conectividade no Protheus. De acordo com a utilizao e com o ado, estas rotinas so subcategorizadas assim: Programao por Processos Rotinas escritas em AdvPl podem ser iniciadas como processos individuais (se m interface) no AP6 Server atravs de duas maneiras: Iniciadas por outra rotina AdvPl atravs da chamada de funes como StartJob ou CallProc ou iniciadas automaticamente na inicializao do AP6 Server (quando prop meio de conectividade utiliz

riamente configurado). Programao de RPC

Atravs de uma biblioteca de funes disponvel no Protheus (uma API de comunicao), podee executar rotinas escritas em AdvPl diretamente no AP6 Server, atravs de aplicaes externas escritas em outras linguagens. Isto o que se chama de RPC (de Remote Procedure Call, ou Chamada de Procedimentos Remota). O servidor Protheus tambm pode executar rotinas em AdvPl em o utros servidores Protheus atravs de conexo TCP/IP direta utilizando o conceito de RPC. Do mesmo modo, aplicaes externas podem requisitar a execuo de rotinas escritas em AdvPl atravs de conexo TCP/IP direta. Programao Web O AP6 Server pode tambm ser executado como um servidor Web, resp ondendo a requisies HTTP. No momento destas requisies, pode executar rotinas escritas em AdvPl como processos i ndividuais, enviando o resultado das funes como retorno das requisies para o cliente HTTP (como por exemp lo um Browser de Internet). Qualquer rotina escrita em AdvPl que no contenha comandos de interf ace pode ser executada atravs de requisies HTTP. O Protheus permite a compilao de arquivos HTML contendo cdigo AdvPl embutido. So os chamados arquivos AdvPl ASP, para a criao de pginas dinmicas. Programao TelNet TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador re moto atravs de uma aplicao cliente deste protocolo. O AP6 Server pode emular um terminal TelNet, atravs da execuo de rotinas escritas em AdvPl. Ou seja, pode-se escrever rotinas AdvPl cuja inter face final ser um terminal TelNet ou um coletor de dados mvel. ----------------------- Page 14----------------------Criao d e um Programa Um programa de computador nada mais do que um grupo de coman dos logicamente dispostos com o objetivo de executar determinada tarefa. Esses comandos so grav ados em um arquivo texto que transformado em uma linguagem executvel por um computador atravs de um processo chamado compilao. A compilao substitui os comandos de alto nvel (que os humanos compreendem) por instrues de baixo nvel (compreendida pelo sistema operacional em execuo no computador ). No caso do AdvPl, no o sistema operacional de um computador que ir executar o cdigo compilado, mas sim o AP6 Server.

Dentro de um programa, os comandos e funes utilizados devem seguir regras de s intaxe da linguagem utilizada, pois caso contrrio o programa ser interrompido por erros. Os erros pode m ser de compilao ou de execuo. Erros de compilao so aqueles encontrados na que o arquivo de cdigo do programa seja compilado. Podem ser comandos orma errnea, utilizao invlida de operadores, etc. sintaxe que no de f permitem

especificados

Erros de execuo so aqueles que acontecem depois da compilao, quan do o programa est sendo executado. Podem ocorrer por inmeras razes, mas geralmente se referem a funes no existentes, ou variveis no criadas ou inicializadas, etc. Linhas de Programa As linhas existentes dentro de um arquivo texto de cdigo de programa podem ser li nhas de comando, linhas de comentrio ou linhas mistas. Linhas de Comando Linhas de comando possuem os comandos ou instrues que sero executadas. Por exemp lo: Local nCnt Local nSoma := 0 For nCnt := 1 To 10 nSoma += nCnt Next nCnt Linhas de Comentrio Linhas de comentrio possuem um texto qualquer, mas no so exe cutadas. Servem apenas para documentao e para tornar mais fcil o entendimento do programa. Existem trs formas de se comentar linhas de texto. A primeira delas utilizar o sinal de * (asterisco) no comeo da l inha: * Programa para clculo do total * Autor: Microsiga Software S.A. * Data: 2 de outubro de 2001 Todas as linhas iniciadas com um sinal de asterisco so consideradas como come ntrio. Pode-se utilizar a palavra NOTE ou dois smbolos da letra "e" comercial (&&) para re alizar a funo do sinal de asterisco. Porm todas estas formas de comentrio de linhas so obsoletas e existem apen as para compatibilizao com o padro xBase. A melhor maneira de comentar linhas em AdvPl utilizar duas bar ras transversais: // Programa para clculo do total

// Autor: Microsiga Software S.A. // Data: 2 de outubro de 2001 Outra forma de documentar textos utilizar as barras transversais juntamente com o asterisco, podendo-se comentar todo um bloco de texto sem precisar comentar linha a linha: ----------------------- Page 15----------------------/* Programa para clculo do total Autor: Microsiga Software S.A. Data: 2 de outubro de 2001 */ Todo o texto encontrado entre a abertura eres /*) e o fechamento (indicada pelos caracteres */) considerado como comentrio. Linhas Mistas O AdvPl tambm permite que existam linhas de comando com comentrio. Isto possvel inc lundo-se as duas barras transversais (//) ao final da linha de comando e adicionando-se o te xto do comentrio: Local nCnt Local nSoma := 0 // Inicializa a varivel com zero para a soma For nCnt := 1 To 10 nSoma += nCnt Next nCnt Tamanho da Linha Assim como a linha fsica, delimitada pela quantidade de caracte res que pode ser digitado no editor de textos utilizado, existe uma linha considerada linha lgica. A l inha lgica, aquela considerada para a compilao como uma nica linha de comando.

(indicada

pelos

caract

A princpio, cada linha digitada no arquivo texto diferenciada aps o pressionamento da tecla . Ou seja, a linha lgica, a linha fsica no arquivo. Porm algumas vezes, por limitao fsic o editor de texto ou por esttica, pode-se "quebrar" a linha lgica em mais de u ma linha fsica no arquivo texto. Isto efetuado utilizando-se o sinal de ponto-e-vrgula (;). If !Empty(cNome) .And. !Empty(cEnd) .And. ; !Empty(cTel) .And. !Empty(cFax) .And. ; !Empty(cEmail) GravaDados(cNome,cEnd,cTel,cFax,cEmail) Endif Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas . Como a linha torna-

se muito grande, pode-se divid-la em mais de uma linha fsica utilizando o sinal de ponto-e-vrgula. Se um sinal de ponto-e-vrgula for esquecido nas duas primeiras linhas, durante a execuo d o programa ocorrer um erro, pois a segunda linha fsica ser considerada como uma segunda linha de coma ndo na compilao. E durante a execuo esta linha no ter sentido. Estrutura d e um Programa Apesar de no ser uma linguagem de padres rgidos com relao estrutura do programa, ortante identificar algumas de suas partes. Considere o programa de exemplo abaixo: /* +===========================================+ Programa: Clculo do Fatorial Autor : Microsiga Software S.A. Data : 02 de outubro de 2001 +===========================================+ */ Local nCnt ----------------------- Page 16----------------------Local nResultado := 1 // Resultado do fatorial Local nFator := 5 // Nmero para o clculo // Clculo do fatorial For nCnt := nFator To 1 Step -1 nResultado *= nCnt Next nCnt // Exibe o resultado na tela, atravs da funo alert Alert("O fatorial de " + cValToChar(nFator) + ; " " + cValToChar(nResultado)) // Termina o programa Return Pode-se classificar um programa em AdvPl em quatro partes bsicas: 1.rea de Identificao 2.rea de Ajustes Iniciais 3.Corpo do Programa 4.rea de Encerramento A rea de Identificao Esta uma rea que no obrigatria e dedicada a documentao programa. Quando existente, contm apenas comentrios explicando a sua finalidade, data de criao, autor, etc, e ap arece no comeo do programa, antes de qualquer linha de comando.

O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao desej ada e escolher a formatao apropriada. /* +==========================================+ Programa: Clculo do Fatorial Autor : Microsiga Software S.A. Data : 02 de outubro de 2001 +==========================================+ */ Opcionalmente pode-se incluir definies de constantes utilizadas no programa ncluso de arquivos de cabealho nesta rea. A rea de Ajustes Iniciais

ou i

Nesta rea geralmente se fazem os ajustes iniciais, importantes para o correto fun cionamento do programa. Entre os ajustes se encontram declaraes de variveis, inicializaes, abertura de arquiv os, etc. Apesar do AdvPl no ser uma linguagem rgida e as variveis poderem ser declaradas em qualquer l ugar do programa, aconselhvel faz-lo nesta rea visando tornar o cdigo mais legvel e facilitar a identi icao de variveis no utilizadas. Local nCnt Local nResultado := 0 // Resultado do fatorial Local nFator := 10 // Nmero para o clculo O Corpo do Programa nesta rea que se encontram as linhas de cdigo do programa. onde se realiza a tarefa necessria atravs da organizao lgica destas linhas de comando. Espera-se que as linhas de comando estejam organizadas de tal modo que no final desta rea o resultado esperado seja obtido, seja ele armazenado em ----------------------- Page 17----------------------um arquivo ou em variveis de memria, pronto para ser exibido ao usurio atravs de um relatrio ou na tela. // Clculo do fatorial For nCnt := nFator To 1 Step -1 nResultado *= nCnt Next nCnt A rea de Encerramento

nesta rea onde as finalizaes so efetuadas. onde os arquivos abertos so fechados, e resultado da execuo do programa utilizado. Pode-se exibir o resultado armazena do em uma varivel ou em um arquivo ou simplesmente finalizar, caso a tarefa j tenha sido toda comple

tada no corpo do programa. nesta rea que se encontra o encerramento do programa. Todo programa em AdvPl deve sempre terminar com a palavra chave return. // Exibe o resultado na tela, atravs da funo alert Alert("O fatorial de " + cValToChar(nFator) + ; " " + cValToChar(nResultado)) // Termina o programa Return Tipos de Dados O AdvPl no uma linguagem de tipos rgidos (strongly typed), o que significa que va riveis de memria podem receber diferentes tipos de dados durante a execuo do programa. Variveis pode m tambm conter objetos, mas os tipos primrios da linguagem so: Numrico O AdvPl no diferencia valores inteiros de valores com ponto f lutuante, portanto pode-se criar variveis numricas com qualquer valor dentro do intervalo permitido. Os seguintes elementos so do tipo de dado numrico: 2 43.53 0.5 0.00001 1000000 Uma varivel do tipo de dado numrico pode conter um nmero de dezoito dgitos incluindo o ponto flutuante, no intervalo de 2.2250738585072014 E308 at 1.7976931348623158 E+308. Lgico Valores lgicos em AdvPl so identificados atravs de .T. ou .Y. para verdadeiro e .F. ou .N. para falso (independentemente se os caracteres estiverem em maisculo ou minsculo). Caracter Strings ou cadeias de caracteres so identificadas em AdvPl por blocos de texto en tre aspas duplas (") ou aspas simples ( ): "Ol mundo!" Esta uma string "Esta outra string" ----------------------- Page 18----------------------Uma varivel do tipo caracter pode conter strings com no mximo 1 Mb, ou seja, 10485 76 caracteres.

Data O AdvPl tem um tipo de dados especfico para as variveis deste tipo de dado so armazenadas como um nmero correspondente a data Juliana. datas. Internamente

Variveis do tipo de dados Data no podem ser declaradas diretam ente, e sim atravs da utilizao de funes especficas como por exemplo ctod que converte uma string para data. Matriz (Array) Matrizes so um tipo de dado especial. a disposio de outros elementos em colunas e linhas. O AdvPl suporta matrizes uni ou multidimensionais. Os elementos de uma matriz so acessado s atravs de ndices numricos iniciados em 1, identificando a linha e coluna para quantas dimenes exist irem. Uma matriz pode conter no mximo 100000 elementos, independentemente do nmero de di menses. Matrizes devem ser utilizadas com cautela, grandes podem exaurir a memria do servidor. Bloco de Cdigo O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues escrit as em AdvPl que podero ser executadas posteriormente. Criao e Atribuio de Variveis Criao e Atribuio de Varive is Variveis de memria so um dos recursos mais importantes de uma ling uagem. So reas de memria criadas para armazenar informaes utilizadas por um programa para a execuo de tarefas . Por exemplo, quando o usurio digita uma informao qualquer, como o nome de um produto, em uma tela de um programa esta informao armazenada em uma varivel de memria para posteriormente ser g ravada ou impressa. A partir do momento que uma varivel criada, no necessrio mais se referenciar ao seu contedo, e sim ao seu nome. O nome de uma varivel um identificador nico que segue duas regras reg ras: Mximo de 10 caracteres. O AdvPl no impede a criao de uma varivel de memria cujo nome ontenha mais de 10 caracteres, porm apenas os 10 primeiros sero consi derados para a localizao do contedo armazenado. Portanto se forem criadas duas variveis cujos 10 primeiros car acteres forem iguais, como nTotalGeralAnual e nTotalGeralMensal, as referncias a qualquer uma delas no pois se forem muito

programa resultaro o mesmo. Ou seja, sero a mesma varivel: nTotalGeralMensal := 100 nTotalGeralAnual := 300 Alert("Valor mensal: " + cValToChar(nTotalGeralMensal)) Quando o contedo da varivel nTotalGeralMensal exibido, o seu valor ser de 300. Isso acontece porque no momento que esse valor foi atribuido varivel nTotalGeralAnual , o AdvPl considerou apenas os 10 primeiros caracteres (assim como o faz quando deve exibir o valor da varivel nTot alGeralMensal), ou seja, considerou-as como a mesma varivel. Assim o valor original de 100 foi substituido pelo de 300. ----------------------- Page 19----------------------Limitao de caracteres no nome. Os nomes das variveis devem sempre comear por uma let ra ou o caracter de sublinhado ( _ ). No restante, pode conter letras, nmeros e o caracte r de sublinhado. Qualquer outro caracter, incluindo espaos em branco, no so permitidos. O AdvPl permite a criao ilimitada de variveis, dependendo apenas da memria disponvel. A seguir esto alguns nomes vlidos para variveis: TOT01 cNumero VAR_QUALQUER M_CARGO A11 E alguns invlidos: 1CODIGO (Inicia por um nmero) M CARGO (contm um espao em branco) LOCAL (palavra reservada do AdvPl)

O AdvPl no uma linguagem de tipos rgidos para variveis, ou seja, no necessrio info r o tipo de dados que determinada varivel ir conter no momento de sua decl arao, e o seu valor pode mudar durante a execuo do programa. Tambm no h necessidade de decla rar variveis em uma seo especfica do seu cdigo fonte, embora seja aconselhvel declarar todas as variveis nec essrias no comeo, tornando a manuteno mais fcil e evitando a declarao de variveis desnecessrias. Para declarar uma varivel deve-se utilizar um identificador de escopo, seguido de uma lista de variveis separadas por vrgula (,). Um identificador de escopo uma palavra chave que in dica a que contexto do programa a varivel declarada pertence. O contexto de variveis pode ser local (visu alizadas apenas dentro do programa atual), pblico (visualizadas por qualquer outro programa), entre outr os. Os diferentes tipos de contexto de variveis so explicados na documentao sobre escopo de variveis. Considere as linhas de cdigo de exemplo:

nResultado := 250 * (1 + (nPercentual / 100)) Se esta linha for executada em um programa AdvPl, ocorrer um erro de execuo com a mensagem "variable does not exist: nPercentual", pois esta varivel est sendo utilizada em u ma expresso de clculo sem ter sido declarada. Para solucionar este erro, deve-se declarar a varivel pre viamente: Local nPercentual, nResultado nResultado := 250 * (1 + (nPercentual / 100)) Neste exemplo, as variveis so declaradas previamente utilizando o identificador de escopo local. Quando a linha de clculo for executada, o erro de varivel no existente, no mais ocorrer. Porm variveis no inicializadas tm sempre o valor default nulo (Nil) e este valor no pode ser util izado em um clculo pois tambm gerar erros de execuo (nulo no pode ser dividido por 100) . A resoluo deste problema efetuada inicializando-se a varivel atravs de uma das formas: Local nPercentual,nResultado Store 10 To nPercentual nResultado := 250 * (1 + (nPercentual / 100)) ou Local nPercentual, nResultado nPercentual := 10 nResultado := 250 * (1 + (nPercentual / 100)) ou Local nPercentual := 10, nResultado nResultado := 250 * (1 + (nPercentual / 100)) A diferena entre o ltimo exemplo e os dois anteriores que a varivel inicializada no momento da declarao. Nos dois primeiros exemplos, a varivel primeiro declarada e ento inicializ ada em uma outra ----------------------- Page 20----------------------linha de cdigo. O comando store existe apenas por compatibilidade com verses anteriores e outras linguagens xBase, mas obsoleto. Deve-se utilizar o operador de atribuio (:= ou somente =). aconselhvel optar pelo operador de atribuio composto de dois pontos e sinal de igua l, pois o operador de atribuio utilizando somente o sinal de igual pode ser facilmente confundido com o operador relacional (para comparao) durante a criao do programa.

Uma vez que um valor lhe seja atribudo, o tipo de dado de uma varivel igual ao tip o de dado do valor atribudo. Ou seja, uma varivel passa a ser numrica se um nmero lhe atribudo, passa a ser caracter se uma string de texto lhe for atribuda, etc. Porm mesmo que uma varivel seja de deter

minado tipo de dado, pode-se mudar o tipo da varivel atribuindo outro tipo a ela: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 Local xVariavel // Declara a varivel inicialmente com valor nulo xVariavel := "Agora a varivel caracter..." Alert("Valor do Texto: " + xVariavel) xVariavel := 22 // Agora a varivel numrica Alert(cValToChar(xVariavel)) xVariavel := .T. // Agora a varivel lgica If xVariavel Alert("A varivel tem valor verdadeiro...") Else Alert("A varivel tem valor falso...") Endif xVariavel := Date() // Agora a varivel data Alert("Hoje : " + DtoC(xVariavel)) xVariavel := nil // Nulo novamente Alert("Valor nulo: " + xVariavel) Return

No programa de exemplo anterior, a varivel xVariavel utilizada para armazenar div ersos tipos de dados. A letra "x" em minsculo no comeo do nome utilizada para indicar uma varivel que pode conter diversos tipos de dados, segundo a Notao Hngara (consulte documentao espe cfica para detalhes). Este programa troca os valores da varivel e exibe seu contedo para o usurio atravs da funo alert. Essa funo recebe um parmetro que deve ser do tipo string de caracter, por isso dependend o do tipo de dado da varivel xVariavel necessrio fazer uma converso antes. Apesar dessa flexibilidade de utilizao de variveis, deve-se tomar cuidados na passa gem de parmetros para funes ou comandos, e na concatenao (ou soma) de valores. Note a linha 20 do programa de exemplo. Quando esta linha executada, a varivel xVariavel contem o valor nulo. A tentativa de soma de tipos de dados diferentes gera erro de execuo do programa. Nesta linha do exem plo, ocorrer um erro com a mensagem "type mismatch on +". Excetuando-se o caso do valor nulo, para os demais deve-se sempre utilizar funes de converso quando necessita-se concatenar tipos de dados diferentes (por exemplo, nas linhas 07 e 17. Note tambm que quando uma varivel do tipo de dado lgico, ela pode ser utilizada dir etamente para checagem (linha 10): If xVariavel o mesmo que

If xVariavel = .T. A declarao de variveis para os demais tipos de dados, matrizes e blocos de cdigo, ex atamente igual ao descrito at agora. Apenas existem algumas diferenas quanto a inicializao, que podem ser consultadas na documentao de inicializao de matrizes e blocos de cdigo. Escopo de Variveis Operadores da Linguagem ----------------------- Page 21----------------------Estruturas de Controle Matrizes Matrizes, ou arrays, so colees de valores. Ou, de uma maneira mais fcil de entender, uma lista. Uma matriz pode ser criada atravs de diferentes maneiras. Consulte a documentao sobre Inicializao de Matrizes para maiores detalhes. Cada item em uma matriz referenciado pela indicao de sua posio numrica na lista, iniciando pelo nmero 1. O exemplo a seguir declara uma varivel, atribui uma matriz de trs elem entos a ela, e ento exibe um dos elementos e o tamanho da matriz: Local aLetras // Declarao da varivel

aLetras := {"A", "B", "C"} // Atribuio da matriz varivel Alert(aLetras[2]) // Exibe o segundo elemento da matriz // Exibe o tamanho da matriz

Alert(cValToChar(Len(aLetras))) O

AdvPl permite a manipulao de matrizes facilmente. Enquanto que em outras linguagens como C ou Pascal necessrio alocar memria para cada elemento de uma matri z (o que tornaria a utilizao de "pointeiros" necessria), o AdvPl se encarrega de gerenciar a memria e torna simple s adicionar elementos a uma matriz, utilizando a funo aAdd: aAdd(aLetras,"D") // Adiciona o quarto elemento ao final da matriz Alert(aLetras[4]) Alert(aLetras[5]) // Exibe o quarto elemento // Erro! No h um quinto elemento na matriz

Matrizes como Estruturas Uma caracterstica interessante do AdvPl que uma matriz pode co nter qualquer coisa: nmeros, datas, lgicos, caracteres, objetos, etc. E ao mesmo tempo. Em outras palavras, os elemen tos de uma matriz no precisam ser necessariamente do mesmo tipo de dado, em contras

te com Pascal.

outras

linguagens

como C

e

aFunct1 := {"Pedro",32,.T.} Esta matriz contem uma string, um nmero e um valor lgico. Em outras linguagens com o C ou Pascal, este "pacote" de informaes pode ser chamado como um "struct" (estrutura em C, por exemp lo) ou um "record" (registro em Pascal, por exemplo). Como se fosse na verdade um registro de um ba nco de dados, um pacote de informaes construdo com diversos campos. Cada campo tendo um pedao diferente de d ado. Suponha que no exemplo anterior, o array aFunct1 contenha informaes sobre o nome d e uma pessoa, sua idade e sua situao matrimonial. Os seguintes #defines podem ser criados para ind icar cada posio dos valores dentro da matriz: #define FUNCT_NOME #define FUNCT_IDADE #define FUNCT_CASADO 3 E considere mais algumas matrizes para representar mais pessoas: aFunct2 := {"Maria" , 22, .T.} 1 2

aFunct3 := {"Antnio", 42, .F.} Os nomes podem ser impressos assim: ----------------------- Page 22----------------------Alert(aFunct1[FUNCT_NOME]) Alert(aFunct2[FUNCT_NOME]) Alert(aFunct3[FUNCT_NOME]) Agora, ao invs de trabalhar com variveis individuais, pode-se agrup-las em uma outr a matriz, do mesmo modo que muitos registros so agrupados em uma tabela de banco de dados: aFuncts := {aFunct1, aFunct2, aFunct3} Que equivalente a isso: aFuncts := { {"Pedro" {"Maria" , 32, .T.}, ; , 22, .T.}, ;

{"Antnio", 42, .F.} } aFuncts uma matriz com 3 linhas por 3 colunas. Uma vez que as variveis separadas foram combinadas em uma matriz, os nomes podem ser exibidos assim:

Local nCount For nCount := 1 To Len(aFuncts) Alert(aFuncts[nCount,FUNCT_NOME]) // O acesso a elementos de uma matriz multidimensional // pode ser realizado tambm desta forma: // aFuncts[nCount][FUNCT_NOME] Next nCount A varivel nCount seleciona que funcionrio (ou que linha) de interesse. Ento a con stante FUNCT_NOME seleciona a primeira coluna daquela linha. Cuidados com Matrizes

Matrizes so listas de elementos, portanto memria necessria para armazenar estas inf ormaes. Como as matrizes podem ser multidimensionais, a memria necessria ser a multiplicao do nmer de itens em cada dimenso da matriz, considerando-se o tamanho do contedo d e cada elemento contido nesta. Portanto o tamanho de uma matriz pode variar muito.

A facilidade da utilizao de matrizes, mesmo que para armazenar informaes em pacotes como descrito anteriormente, no compensada pela utilizao em memria quando o nmero de itens em um a ray for muito grande. Quando o nmero de elementos for muito grande deve-se procurar outra s solues, como a utilizao de um arquivo de banco de dados temporrio. No h limitao para o nmero de dimenses que uma mas o nmero de elementos mximo (independentes das dimenses onde se encontram) de 100000. Criao e Atribuio de Variveis Inicializando Matrizes Blocos de Cdigo I nicializando Matrizes ----------------------- Page 23----------------------Algumas vezes o tamanho da matriz conhecido previamente. Outras vezes o tamanho da matriz s ser conhecido em tempo de execuo. Se o tamanho da matriz conhecido Se o tamanho da matriz conhecido no escrito, h diversas maneiras de implementar o cdigo. momento que o programa matriz pode

ter

01 Local nCnt 02 Local aX[10] 03 Local aY := Array(10) 04 Local aZ := {0,0,0,0,0,0,0,0,0,0} 05 06 For nCnt := 1 To 10 07 aX[nCnt] := nCnt * nCnt

08 Next nCnt Este cdigo preenche a matriz com uma tabela de quadrados. Os valores sero 1, 4, 9, 16 ... 81, 100. Note que a linha 07 se refere varivel aX, mas poderia tambm trabal har com aY ou aZ. O objetivo deste exemplo demonstrar trs modos de criar uma matriz de tamanho conhecido no mome nto da criao do cdigo. Na linha 02 a matriz criada usando aX[10]. Isto indica ao AdvPl para alocar espao para 10 elementos na matriz. Os colchetes [ e ] so utilizados para indicar o tamanho necessrio. Na linha 03 utilizada a funo array com o parmetro 10 para criar a matriz, e o reto rno desta funo atribudo varivel aY. Na linha 03 efetuado o que se chama "desenhar a imagen da matriz". Como pode-se notar, existem dez 0s na lista encerrada entre chaves ({}). Claramente, este mtodo no o utilizado para criar uma matriz de 1000 elementos. O terceiro mtodo difere dos anteriores porqu e inicializa a matriz com os valores definitivos. Nos dois primeiros mtodos, cada posio da matriz contm um valor nulo (Nil) e deve ser inicializado posteriormente. A linha 07 demonstra como um valor ma posio existente em uma matriz especificando o ndice entre colchetes. Se o tamanho da matriz no conhecido pode ser atribudo para u

Se o tamanho da matriz no conhecido at o momento da execuo do programa, h algumas ma eiras de criar uma matriz e adicionar elementos a ela. O exemplo a seguir ilustra a idia d e criao de uma matriz vazia (sem nenhum elemento) e adio de elementos dinamicamente. 01 Local nCnt 02 Local aX[0] 03 Local aY := Array(0)

04 Local aZ := {} 05 06 For nCnt := 1 To nSize 07 aAdd(aX,nCnt*nCnt)

----------------------- Page 24----------------------08 Next nCnt A linha 02 utiliza os colchetes para criar uma matriz vazia. Apesar de no ter nen hum elemento, seu tipo de dado matriz. Na linha 03 a chamada da funo array cria uma matriz sem nenhum elemento. Na linha 04 est declarada a representao de uma matriz vazia e m AdvPl. Mais uma vez, esto sendo utilizadas as chaves para indicar que o tipo de dados da varivel matriz. Note que {} uma matriz vazia (tem o tamanho 0), enquanto {Nil} uma matriz com um nico elemento nulo (tem taman ho 1). Porque cada uma destas matrizes no contem elementos, a linha 07 utiliza a funo aadd para adicionar elementos sucessivamente at o tamanho necessrio (especificado por exemplo na varive l nSize). Blocos de Cdigo Blocos de cdigo so um conceito existente h muito tempo em lin guagens xBase. No como algo que apareceu da noite para o dia, e sim uma evoluo progressiva utilizando a combinao de muitos conceitos da linguagem para a sua implementao. Um Primeiro Lembrete

O AdvPl uma linguagem baseada em funes. Funes tm um valor de retorno. Assim como o o erador de atribuio :=. Assim, ao invs de escrever: x := 10 // Atribui o valor 10 varivel chamada X Alert("Valor de x: " + cValToChar(x)) Posde-se escrever: // Atribui e ento exibe o valor da varivel X Alert("Valor de x: " + cValtoChar(X := 10)) A expresso x:=10 avaliada primeiro, e ento seu resultado (o valor de X, que agora 10) passada para

a funo cvaltochar para a converso para caracter, e em seguida para a funo alert para a exibio. Por causa desta regra de precedncia possvel atribuir um valor a mais de uma varavel ao mesmo tempo: Z := Y := X := 0 Por causa dessa regra, essa expresso avaliada como se fosse escrita assim: Z := ( Y := (X := 0) ) Apesar do AdvPl avaliar expresses da esquerda para a direita, n o caso de atribuies isso acontece ao contrrio, da direita para a esquerda. O valor atribudo varivel X, que retorna o val or para ser atribudo varivel Y e assim sucessivamente. Pode-se dizer que o zero foi "propagado atravs d a expresso". Outro Lembrete Em AdvPl pode-se juntar diversas linhas de cdigo em uma nica linha fscia do ivo. Por exemplo, o cdigo: If lAchou Alert("Cliente encontrado!") Endif ----------------------- Page 25----------------------pode ser escrito assim: If lAchou ; Alert("Cliente encontrado!") ; Endif O ponto-e-vrgula indica ao AdvPl que a nova linha de cdigo e st para comear. Pode-se ento colocar diversas linhas lgicas de cdigo na mesma linha fsica atravs do editor de texto utili zado. Apesar da possibilidade de se escrever todo o programa assim, em uma nic a linha fsica, isto no recomendado pois dificulta a legibilidade do programa e, conseqentemen te, a manuteno. Lista de Expresses arqu

A evoluo dos blocos de cdigo comea com as listas de expresses. Nos exemplos a segu ir, o smbolo ==> indicar o retorno da expresso aps sua avaliao (seja para atribuir em uma varivel, exibir para o usurio ou imprimir em um relatrio), que ser impresso em um relatrio por exemplo. Duas Linhas de Cdigo @00,00 PSAY x := 10 ==> 10

@00,00 PSAY y := 20

==>

20

Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento impresso. Duas Linha de Cdigo em Uma , Utilizando Ponto-e-Vrgula Este o mesmo cdigo que o anterior, apenas escrito em uma nica linha: Alert( cValToChar( x := 10 ; y := 20 ) ) ==> 10 linha fsica, existem

Apesar desse cdigo se encontrar em uma nica duas linhas lgicas separadas pelo ponto e vrgula. Ou seja, esse cdigo equivalente a: Alert( cValToChar( x := 10 ) ) y := 20

Portanto apenas o valor 10 da varivel x ser passado para as funes cvaltochar e alert para ser exibido. E o valor 20 apenas ser atribudo varivel y. Convertendo para uma Lista de Expresses Quando parnteses so colocados ao redor do cdigo ponto-e-vrgula substitudo por uma vrgula apenas, o cdigo torna-se uma lista de expresses: Alert( cValToChar ( ( X := 10 , Y := 20 ) ) ) O ==> 20 e o sinal de

valor de retorno resultante de uma lista de expresses o valor resultante da ltima expresso ou elemento da lista. Funciona como se fosse um pequeno programa ou funo, que retorna o resultado de sua ltima avaliao (efetuadas da esquerda para a direita). Neste exemplo, a expresso x := 10 avaliada, e ento a expresso y := 20, cujo valor resultante passado para a funo alert e cvaltochar, e ento exibido. Depois que essa linha de cdi go executada, o valor de X igual a 10 e o de y igual a 20, e 20 ser exibido. Teoricamente, no h limitao para o nmero de expresses que podem ser combinadas em uma ista de expresses. Na prtica, o nmero mximo por volta de 500 smbolos. ----------------------- Page 26-----------------------

Debugar listas de expresses difcil porque as expresses no esto divididas em linhas d cdigo fonte, o que torna todas as expresses associadas a uma mesma linha de cdigo. Isto pode tornar muito difcil determinar onde um erro ocorreu. Onde Pode-se Utilizar uma Lista de Expresses? O propsito principal de uma lista de expresses agrup-las em uma nica unidade. Em qua lquer lugar do cdigo AdvPl que uma expresso simples pode ser utilizada, pode-se

utilizar uma lista de expresses. E ainda, pode-se fazer com que vrias coisas aconteam onde normalmente apenas uma aco nteceria. X := 10 ; Y := 20 If X > Y Alert("X") Z := 1 Else Alert("Y") Z := -1 Endif Aqui temos o mesmo conceito, escrito utilizando listas de expresses na funo iif: X := 10 ; Y := 20 iif( X > Y , ; ( Alert("X"), Z := 1 ) , ; )

( Alert("Y"), Z := -1 )

De Listas de Expresses para Blocos de Cdigo Considere a seguinte lista de expresses: Alert( cValToChar( ( x := 10, y := 20 ) ) ) ==> 20

O AdvPl permite criar funes, que so pequenos pedaos de cdigo, como se fosse um pequen o programa, utilizados para diminuir partes de tarefas mais complexas e reaproveitar cdigo em mais de um lugar num programa. Para maiores detalhes consulte a documentao sobre a criao de funes em AdvPl Porm, a idia neste momento que a lista de expresses utilizada na lin ha anterior pode ser criada como uma funo: Function Lista() X := 10 Y := 20 Return Y E a linha de exemplo com a lista de expresses pode ser substituda, tendo o mesmo r esultado, por: Alert( cValToChar( Lista() ) ) ==> 20

Como mencionado anteriormente, uma lista de expresses como um pequeno programa ou

funo. Com poucas mudanas, uma lista de expresses pode se tornar um bloco de cdigo: ----------------------- Page 27----------------------( X := 10 , Y := 20 ) { // Lista de Expresses

X := 10 , Y := 20 } // Bloco de Cdigo

Note as chaves {} utilizadas no bloco de cdigo. Ou seja, um bloco de cdigo uma matriz. Porm na verdade, no uma lista de dados, e sim uma lista de comandos, uma lista de cdigo. // Isto uma matriz de dados A := {10, 20, 30} // Isto um bloco de cdigo, porm funciona como // se fosse uma matriz de comandos B := { x := 10, y := 20}

Executando um Bloco de Cdigo Diferentemente de uma matriz, no se pode acessar elementos de um bloco de cdigo at ravs de um ndice numrico. Porm blocos de cdigo so semelhantes a uma lista de expresses, e a uma pequen a funo. Ou seja, podem ser executados. Para a execuo, ou avaliao, de um bloco de cdigo, deve-se utilizar a funo Eval: nRes := Eval(B) ==> 20

Essa funo recebe como parmero um bloco de cdigo e avalias todas as expresses contidas neste bloco de cdigo, retornando o resultado da ltima expresso avaliada. Passando Parmetros

J que blocos de cdigo so como pequenas funes, tambm possvel a passagem de parmet a um bloco de cdigo. Os parmetros devem ser informados entre as barras verticais ( ) separados por vrgulas, assim como em uma funo. B := { N X := 10, Y := 20 + N}

Porm deve-se notar que j que o bloco de cdigo recebe um parmetro, um valor deve ser passado quando o bloco de cdigo for avaliado. C := Eval(B, 1) ==> 21

Utilizando Blocos de Cdigo Blocos de cdigo podem ser utilizados em diversas situaes. Geralme nte so utilizados para executar tarefas quando eventos de objetos so acionados ou para modificar o comport

amento padro de funes.

algumas

Por exemplo, considere a matriz abaixo: A := {"GARY HALL", "FRED SMITH", "TIM JONES"} Esta matriz pode ser ordenada pelo primeiro nome, utilizando-se a chamada da funo asort(A), resultado na matriz com os elementos ordenados dessa forma: {"FRED SMITH", "GARY HALL", "TIM JONES"} A ordem padro para a funo asort ascendente. Este comportamento ode ser modificado atravs da informao de um bloco de cdigo que ordena a matriz de forma descendente: B := { X, Y X > Y } ----------------------- Page 28----------------------aSort(A, B) O bloco de cdigo (de acordo com a documentao da funo asort) de ve ser escrito para aceitar dois parmetros que so os dois elementos da matriz para comparao. Note que o bloco de cdigo no conhece que elementos est comparando - a funo asort seleciona os elementos (talvez utilizando o algortmo QuickSort) e passa-os para o bloco de cdigo. O bloco de cdigo compara-os e retorna verdadeiro (.T.) se encontram na ordem correta, ou falso (.F.) se no. Se o valor de retorno for falso , a funo asort ir ento trocar os valores de lugar e seguir comparando o prximo par de valores. Ento, no bloco de cdigo anterior, a comparao X > Y se os elementos esto em ordem descendente, o que significa que o primeiro valor maior que o segundo. verdadeira p

Para ordenar a mesma matriz pelo ltimo nome, tambm em orden descendente, pode-se u tilizar o seguinte bloco de cdigo: B := { X, Y Substr(X,At(" ",X)+1) > Substr(Y,At(" ",Y)+1) } Note que este bloco de cdigo procura e compara as partes dos caracteres imedia tamente seguinte a um espao em branco. Depois de utilizar esse bloco de cdigo para a funo asort, a matriz conter: {"GARY HALL", "TIM JONES", "FRED SMITH"} Finalmente, para ordenar um sub-elemento (coluna) de uma matriz por exemplo, pod e-se utilizar o seguinte bloco de cdigo: B := { X, Y X[1] > Y[1] } Criao e Atribuio de Variveis

Matrizes O Contexto de Variveis dentro de um Programa As variveis declaradas em um programa ou funo, so visveis de a cordo com o escopo onde so definidas. Como tambm do escopo depende o tempo de existncia das variveis. A definio do escopo de uma varivel efetuada no momento de sua declarao. Local nNumero := 10 Esta linha de cdigo declara uma varivel chamada nNumero indicando que pertence seu escopo local. Os identifadores de escopo so: LOCAL STATIC PRIVATE PUBLIC

O AdvPl no rgido em relao declarao de variveis no comeo rograma. A incluso de um identificador de escopo no necessrio para a declarao de uma varivel, contanto que um valor lhe seja atribudo. nNumero2 := 15

Quando um valor atribudo uma varivel em um programa ou funo, o AdvPl criar a vari aso ela no tenha sido declarada anteriormente. A varivel ento criada co mo se tivesse sido declarada como Private. a varivel Devido a essa declarada caracterstica, quando pretende-se fazer uma atribuio a um

previamente mas escreve-se o nome da varivel de forma incorreta, o Adv Pl no gerar nenhum ----------------------- Page 29----------------------da erro de compilao ou varivel escrito de forma de execuo. Pois compreender o nome

incorreta como se fosse a criao de uma nova varivel. Isto alterar a lgica do programa, e um erro muitas vezes difcil de identificar. Variveis Locais Variveis locais so pertencentes onde foram declaradas. Devem apenas ser ao escopo da funo

explicitamente declaradas com o identificador LOCAL, como no exemplo: Function Pai() Local nVar := 10, aMatriz := {0,1,2,3} . . Filha() . . Return(.T.) Neste exemplo, a varivel nVar foi declarada como local e atribuda com o valor 10. Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Quando a execuo da funo Pai terminar, a varivel nVar destruda. Qualquer varivel com o mesmo nome no programa que chamou a f uno Pai no afetada. Variveis locais so criadas automaticamente cada vez que a funo onde forem declaradas for ativada. Elas continuam a existir e mantm seu valor at o fim da ativao da funo (ou seja, at que a retorne o controle para o cdigo que a executou). Se uma funo chamada recursivamente (por exem plo, chama a si mesma), cada chamada em recurso cria um novo conjunto de variveis locais. A visibilidade de variveis locais idntica ao escopo de sua declarao. Ou seja, a varivel visvel em qualquer lugar do cdigo fonte em que foi declarada. Se uma funo chamada recursivame nte, apenas as variveis locais criadas na mais recente ativao so visveis. Variveis Estticas Variveis estticas funcionam basicamente como as variveis locais, ma s mantm seu valor atravs da execuo. Variveis estticas devem ser declaradas explicitamente no cdigo com o identifi cador STATIC. O escopo das variveis estticas depende de onde so declaradas. Se forem declaradas d entro do corpo de uma funo ou procedimento, seu escopo ser limitado quela rotina. Se forem declaradas fora do corpo de qualquer rotina, seu escopo todo o arquivo de programa. Neste exemplo, a varivel nVar declarada como esttica e inicializada com o valor 10 : Function Pai() Static nVar := 10

. . Filha() . ----------------------- Page 30----------------------. Return(.T.)

Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Dife rente de variveis declaras como LOCAL ou PRIVATE, nVar continua a existir e mantem seu valor atual quando a execuo da funo Pai termina. Entretanto, somente pode ser acessada por execues subseqntes da fun ai. Variveis Privadas A declarao opcional declaradas explicitamente identificador PRIVATE. para variveis com o privadas. Mas podem ser

Adicionalmente, a atribuio de valor a uma varivel no criada ante riormente automaticamente cria a varivel como privada. Uma vez criada, uma varivel privada continua a existir e man tem seu valor at que o programa ou funo onde foi criada termine (ou seja, at que a funo onde foi criada retorne para o cdigo que a executou). Neste momento, automaticamente destruda. possvel criar uma nova varivel privada com o mesmo nome de uma varivel j existente. Entretanto, a nova (duplicada) varivel pode apenas ser criada em um nvel de ativao inferior ao nvel onde a varivel foi declarada pela primeira vez (ou seja, apenas em uma funo chamada pela funo o nde a varivel j havia sido criada). A nova varivel privada ir esconder qualquer outra varivel priva da ou pblica (veja a documentao sobre variveis pblicas) com o mesmo nome enquanto existir. Uma vez criada, uma varivel privada visvel em todo o pr ograma enquanto no for destruda automaticamente quando a rotina que a criou terminar ou uma outra varivel privada com o mesmo nome for criada em uma subfuno chamada (neste caso, a varivel existente torna-se inacessv el at que a nova varivel privada seja destruda). Em termos mais simples, uma varivel privada visvel dentro da fu no de criao e todas as funes chamadas por esta, a menos que uma funo chamada crie sua prpri a varivel privada com o mesmo nome.

Por exemplo: Function Pai() Private nVar := 10 . . Filha() . . Return(.T.) Neste exemplo, a varivel nVar criada como privada e inicializada com o valor 10. Quando a funo Filha executada, nVar ainda existe e, diferente de uma varivel local, pode ser acessada pela funo Filha. Quando a funo Pai terminar, nVar ser destruda e qualquer declarao nVar anterior se tornar acessvel novamente. Variveis Pblicas Pode-se criar variveis pblicas dinamicamente no cdigo com o identificador PUBLIC. A s variveis pblicas continuam a existir e mantm seu valor at o fim da execuo. ----------------------- Page 31---------------------- possvel criar uma varivel privada com o mesmo nome de uma varivel pblica existente. Entretanto, no permitido criar uma varivel pblica com o mesmo nome de uma varivel privada existent e. Uma vez criada, uma varivel pblica visvel em todo o programa onde foi declarada at que seja escondida por uma varivel privada criada com o mesmo nome. A nova varivel privada criada esconde a varivel pblica existente, e esta se tornar inacessvel at que a nova varivel privada eja destruda. Por exemplo: Function Pai() Public nVar := 10 . . Filha() .

d

. Return(.T.) Neste exemplo, nVar criada como pblica e o valor 10. Quando a funo Filha executada, nVar ainda existe e pode ser acessada. variveis locais ou privadas, nVar ainda existe aps o trmino da a execuo da funo Pai. o l). Diferenciao entre variveis e nomes de campos Muitas vezes uma de um arquivo momento. Neste caso, e identifique tanto uma varivel como um varivel pode ter o mesmo nome que um campo ou tabela aberto no o AdvPl privilegiar o campo. Assim uma referncia a um nome qu campo, resultar no contedo do campo. uma inicializada com Diferente de

Diferentemente dos outros identificadores de escopo, quand varivel declarada como pblica sem ser inicializada, o valor assumido falso (.F.) e no nulo (ni

Para especificar qual deve ser o elemento referenciado, deve-se utilizar o operador de identificao de apelido (->) e um dos dois identificadores de referncia, MEMVAR ou FIELD. cRes := MEMVAR->NOME Esta linha de comando identifica que o cRes deve ser o valor da varivel de memria chamada NOME. cRes := FIELD->NOME Neste caso, o valor atribudo varivel o arquivo ou tabela aberto na rea atual. cRes ser o valor do campo NOME existente n valor atribudo varivel

O identificador FIELD pode ser substitudo pelo apelido de um arquivo ou tabela aberto, para evitar a necessidade de selecionar a rea antes de acessar o contedo de terminado campo. cRes := CLIENTES->NOME Para maiores detalhes sobre abertura de arquivos com atribuio apelidos, consulte a documentao sobre acesso a banco de dados ou a documentao da funo dbUseArea. Operadores Comuns ----------------------- Page 32----------------------de

Na documentao sobre variveis h uma breve demonstrao de como atribuir valores a uma va ivel da forma mais simples. O AdvPl amplia significativamente a utilizao de variveis atravs do uso de expresses e funes. Uma expresso um conjunto de operadores e operandos cujo resu

ltado pode ser atribudo a uma varivel ou ento analisado para a tomada de decises. Por exemplo: Local nSalario := 1000, nDesconto := 0.10 Local nAumento, nSalLiquido nAumento := nSalario * 1.20 nSalLiquido := nAumento * (1-nDesconto) Neste exemplo so utilizadas algumas expresses para lrio lquido aps um aumento. Os operandos de uma expresso podem ser uma varivel, um campo de arquivo ou uma funo. Operadores Matemticos Os operadores utilizados em AdvPl para clculos matemticos so: + * / ** ou ^ % Operadores de String Os operadores utilizados em AdvPl para tratamento de caracteres so: + $ Concatenao de strings (unio) Concatenao de strings com eliminao dos brancos finais das strings intermedirias Comparao de Substrings (contido em) Operadores Relacionais Os operadores utilizados em AdvPl para operaes e avaliaes relacionais so: < > = == es) = Comparao Menor ou Igual Comparao Maior ou Igual Comparao Menor Comparao Maior Comparao Igual Comparao Exatamente Igual (para caracter Adio Subtrao Multiplicao Diviso Exponenciao Mdulo (Resto da Diviso) calcular uma o sa

constante,

ou # ou != Operadores Lgicos

Comparao Diferente

Os operadores utilizados em AdvPl para operaes e avaliaes lgicas so: ----------------------- Page 33----------------------.And. .Or. .Not. ou ! Variveis de Memria Estruturas de Controle Operadores de Atribuio Os operadores utilizados em AdvPl para atribuio de valores a variveis de memria so : = := += -= *= /= **= ou ^= %= Linha Atribuio Simples O sinal de igualdade utilizado para atribuir valor a uma varivel de memria. nVariavel = 10 Atribuio em Linha Atribuio Simples Atribuio em Linha Adio e Atribuio em Linha Subtrao e Atribuio em Linha Multiplicao e Atribuio em Linha Diviso e Atribuio em Linha Exponenciao e Atribuio em Linha Mdulo (resto da diviso) e Atribuio em E lgico OU lgico NO lgico

O operador de atribuio em linha caracterizado por dois pontos e o sinal de igualdade. Tem a mesma funo do sinal de igualdade sozinho, porm aplica a atribuio s variveis. Com ele podeatribuir mais de uma varivel ao mesmo tempo. nVar1 := nVar2 := nVar3 := 0 Quando diversas variveis so inicializadas em uma mesma linha, a tribuio comea da direita para a esquerda, ou seja, nVar3 recebe o valor zero inicialmente, nVar2 a

recebe o contedo de nVar3 e nVar1 recebe o contedo de nVar2 por final. Com o operador de atribuio em linha, pode-se substituir as inicializaes individuais de cada varivel por uma inicializao apenas: Local nVar1 := 0, nVar2 := 0, nVar3 := 0 por Local nVar1 := nVar2 := nVar3 := 0 O operador de atribuio em linha stituir valores de campos em um banco de dados. Atribuio Composta ----------------------- Page 34----------------------Os operadores de atribuio composta so uma facilidade da linguagem AdvPl para expres ses de clculo e atribuio. Com eles pode-se economizar digitao: Operador valente a += = X + Y -= = X - Y *= = X * Y /= = X / Y **= ou ^= X ** Y %= X % Y Variveis de Memria Estruturas de Controle Operadores de Incremento/Decremento A linguagem AdvPl possui operadores para realizar incremento ou decremento de va riveis. Entende -se por incremento aumentar o valor de uma varivel numrica em 1 e entende-se por decrement o diminuir o valor da varivel em 1. Os operadores so: ++ Incremento Ps ou Pr-fixado X %= Y X = X **= Y X = X /= Y X X *= Y X X -= Y X X += Y X Exemplo Equi tambm pode ser utilizado para sub

--

Decremento Ps ou Pr-fixado

Os operadores de decremento/incremento podem ser colocados tanto antes (pr-fixado ) como depois (psfixado) do nome da varivel. Dentro de uma expresso, a ordem do operador muito impo rtante, podendo alterar o resultado da expresso. Os operadores incrementais so execu tados da esquerda para a direita dentro de uma expresso. Local nA := 10 Local nB := nA++ + nA

O valor da varivel nB resulta em 21, pois a primeira referncia a nA (antes do ++) continha o valor 10 que foi considerado e imediatamente aumentado em 1. Na segunda referncia a nA, este j possua o valor 11. O que foi efetuado foi a soma de 10 mais 11, igual a 21. O resultado final aps a ex ecuo destas duas linhas a varivel nB contendo 21 e a varivel nA contendo 11. No entanto: Local nA := 10 Local nB := ++nA + nA aumentou o valor da

Resulta em 22, pois o operador incremental primeira nA antes que seu valor fosse considerado. Variveis de Memria Estruturas de Controle Operadores Especiais Alm dos operadores comuns, o AdvPl possui adores. Estas so suas finalidades:

alguns outros operadores ou identific

----------------------- Page 35----------------------() [] {} -> & @ Agrupamento ou Funo Elemento de Matriz Definio de Matriz, Constante ou Bloco de Cdigo Identificador de Apelido Macrosubstituio Passagem de parmetro por referncia Passagem de parmetro por valor Os parnteses so utilizados para agrupar elementos em uma expresso mudando a ordem d

e precedncia da avaliao da expresso (segundo as regras matemticas por exemplo). Tambm servem para envolver os argumentos de uma funo. Veja a documentao sobre precedncia de operadores para maiores detalhes. Os colchetes so utilizados para especificar um elemento uma matriz. Por exemplo, A[3,2], refere-se ao elemento da matriz A na linha 3, coluna 2. especfico de

As chaves so utilizadas para a especificao de matrizes ou blocos de cdigo. Por exemplo, A:={10,20,30} cria uma matriz chamada A com trs elementos.

literais

O smbolo -> identifica um campo de um arquivo diferenciando-o d e uma varivel. Por exemplo, FUNC>nome refere-se ao campo nome do arquivo FUNC. Mesmo que exista uma varivel chamada nome, o campo nome que ser acessado.

O smbolo & identifica uma avaliao de expresso atravs de macro e visto em detalhes na documentao sobre macrossubstituio. O smbolo @ utilizado para indicar que durante a uma varivel para uma funo ou procedimento ela seja tomada como uma referncia e no como valor. O smbolo utilizado para indicar que durante a uma varivel para uma funo ou procedimento ela seja tomada como um e valor no como referncia. Variveis de Memria Estruturas de Controle Ordem de Precedncia dos Operadores Dependendo do tipo de operador, existe uma ordem de precedncia para a avaliao dos operandos. Em princpio, todas as operaes com os operadores, so realizadas da esquerda para a direi ta se eles tiverem o mesmo nvel de prioridade. A ordem de precedncia, ou nvel de prioridade de execuo, dos operadores em AdvPl : 1.Operadores de Incremento/Decremento pr-fixado 2.Operadores de String 3.Operadores Matemticos 4.Operadores Relacionais 5.Operadores Lgicos 6.Operadores de Atribuio 7.Operadores de Incremento/Decremento ps-fixado passagem de

passagem

de

----------------------- Page 36----------------------Em expresses complexas com diferentes tipos de operadores, a avaliao seguir essa seqncia. Caso exista mais de um operador do mesmo tipo (ou seja, de mesmo nvel), a avaliao se d da esquerda para direita. Para os operadores matemticos entretanto, h uma precedncia a seguir: 1.Exponenciao 2.Multiplicao e Diviso 3.Adio e Subtrao Considere o exemplo: Local nResultado := 2+10/2+5*3+2^3 O resultado desta expresso 30, pois primeiramente calculada a exponenciao 2^3(=8), ento so calculadas as multiplicaes e divises 10/2(=5) e 5*3(=15), e finalm ente as adies resultando em 2+5+15+8(=30). Alterao da Precedncia A utilizao de parnteses dentro de uma expresso altera a ordem de precedncia dos operadores. Operandos entre parnteses so analisados antes dos que se encontram fora dos parntes es. Se existirem mais de um conjunto de parnteses no-aninhados, o grupo mais a esquerda ser avaliado primeiro e assim sucessivamente. Local nResultado := (2+10)/(2+5)*3+2^3 No exemplo acima primeiro ser calculada a exponenciao 2^3(=8). Em seguida 2+10(=12) ser calculado, 2+5(=7) calculado, e finalmente a diviso e a multiplicao sero efetuadas, o que resulta em 12/7*3+8(=13.14). Se existirem vrios parnteses aninhados, ou seja, colocados um dentro do outro, a a valiao ocorrer do parnteses mais intero em direo ao mais externo. Variveis de Memria Estruturas de Controle Macro Substituio O operador de macro substituio, simbolizado pelo "e" comercial ( &), utilizado para a avaliao de expresses em tempo de execuo. Funciona como se uma expresso arma zenada fosse compilada em tempo de execuo, antes de ser de fato executada. Considere o exemplo:

01 X := 10 02 Y := "X + 1" 03 B := &Y // O contedo de B ser 11 A varivel X atribuda com o valor 10, ribuda com a string de caracteres contendo "X + 1". enquanto a varivel Y at

A terceira linha utiliza o operador de macro. Esta linha faz com que o nmero 11 s eja atribudo varivel B. Pode-se perceber que esse o valor resultante da expresso em formato de caractere contida na varivel Y. Utilizando-se uma tcnica matemtica elementar, a substituio, temos que na segunda lin ha, Y definido como "X + 1", ento pode-se substituir Y na terceira linha: 03 B := &"X + 1" O operador de macro cancela as aspas: ----------------------- Page 37----------------------03 B := X + 1 Pode-se perceber que o operador de macro remove as aspas, o que deixa um ped ao de cdigo para ser executado. Deve-se ter em mente que tudo isso acontece em tempo de execuo, o que t orna tudo muito dinmico. Uma utilizao interessante criar um tipo de calculadora, ou avaliador de frmulas, que determina o resultado de algo que o usurio digita. O operador de macro tem uma limitao: variveis referenciadas dentro da stri ng de caracteres (X nos exemplos anteriores) no podem ser locais. Variveis de Memria Estruturas de Controle Controlando o Fluxo

O AdvPl suporta vrias estruturas de controle que permitem mudar a seqncia de fluxo de execuo de um programa. Estas estruturas permitem a execuo de cdigo baseado em condies lgica e a re etio da execuo de pedaos de cdigo qualquer nmero de vezes. Em AdvPl, todas as estruturas de controle podem ser "aninhadas" dentro de todas as demais estruturas contanto que estejam aninhadas propriamente. Estruturas de controle tm um identif icador de incio e um de fim, e qualquer estrutura aninhada deve se encontrar entre estes identificado res.

Tambm existem estruturas de controle para determinar que elementos, comandos, etc em um programa sero compilados. Estas so as diretivas do pr-processador #ifdef...#endif e #ifnd ef...#endif. Consulte a documentao sobre o pr-processador para maiores detalhes. As estruturas de controle em AdvPl esto divididas em Estruturas de Repetio e Estrut uras de Deciso. Variveis de Memria Operadores da Linguagem Repetio de Comandos Estruturas de repetio so deseginadas para executar uma seo de cdigo mais de uma vez. or exemplo, imagiando-se a existncia de uma funo para imprimir um relatrio, p ode-se desejar imprimi-lo quatro vezes. Claro, pode-se simplesmente chamar a funo de impresso quatro vezes em seqncia, mas isto se tornaria pouco profissional e no resolveria o problema se o nmero de relatrios foss e varivel. Em AdvPl existem dois comandos O comando FOR...NEXT e o comando WHILE...ENDDO. ando FOR...NEXT A estrutura de controle , repete uma seo de nmero determinado de vezes. Sintaxe FOR Variavel := nValorInicial TO nValorFinal [STEP nIncremento] Comandos... [EXIT] [LOOP] ----------------------- Page 38----------------------NEXT Parmetros Variavel Especifica uma varivel ou um elemento de uma matriz para a tuar como um contador. A varivel ou o elemento da matriz no precisa ter sido declar ado antes da execuo do comando FOR...NEXT. Se a varivel no existir, ser criada como uma varivel privada. nValorInicial nValorInicial o valor inicial para o contador; nValorFina FOR...NEXT, cdigo em ou um simplesmente o loop FOR para a repetio de sees de cdigo.

O Com

l o valor final para o contador. TO nValorFinal Pode-se utilizar valores numricos eis ou expresses, contanto que o resultado seja do tipo de dado numrico.

literais,

variv

STEP nIncremento a quandidade que ser incrementada ou decrement ada no contador aps nIncremento cada execuo da seo de comandos. Se o valor de nIncremento for negativo, o contador ser decrementado. Se a clusula STEP for omitida, o contador ser incrementado em 1. Pode-se utilizar valores numricos liter ais, variveis ou expresses, contanto que o resultado seja do tipo de dado numrico. Comandos cutadas. Especifica um ou mais instrues de comando AdvPl que sero exe

EXIT Transfere o controle de dentro do comando FOR...NEXT p ara o comando imediatamente seguinte ao NEXT, ou seja, finaliza a repetio da seo de comandos imediatamente. Pode-se colocar o comando EXIT em qualquer lugar entre o FOR e o NEXT. LOOP FOR sem executar Retorna o controle diretamente para a clusula o restante dos comandos entre o LOOP e o NEXT. O contador ou decrementado normalmente, como se o NEXT tivesse sido alcanado. Pode-se em qualquer lugar entre o FOR e o NEXT. Comentrios Uma varivel ou um elemento de uma matriz utilizado como um contador para especifi car quantas vezes os comandos AdvPl dentro da estrutura FOR...NEXT so executados. Os comandos AdvPl depois do FOR so executados at que o NEXT seja alcanado. O contador (Variavel) ento incrementado ou decremantado com o valor em nIncremento (se a clusula STEP for omitida, o contador incrementad o em 1). Ento, o contador comparado com o valor em nValorFinal. Se for menor ou igual ao valor em nValorFinal, os comandos seguintes ao FOR so executados novamente. Se o valor for maior que o con tido em nValorFinal, a estrutura FOR...NEXT terminada e o programa continua a execuo no primeiro comand o aps o NEXT. Os valores de nValorInicial, nValorFinal e n