Vous êtes sur la page 1sur 416

----------------------- Page 1----------------------A Tecnologia Protheus O Advanced Protheus uma nova tecnologia desenvolvida sobre o sistema A dvanced, que

e 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

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

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

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 <Enter>. 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. ; <enter> !Empty(cTel) .And. !Empty(cFax) .And. ; <enter> !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

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} . <comandos> . Filha() . <mais comandos> . 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

. <comandos> . Filha() . <mais comandos> ----------------------- 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 . <comandos> . Filha() . <mais comandos> . 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 . <comandos> . Filha() .

<mais comandos> . 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 nIncremento so derados inicialmente. Entretanto, mudar o valor da varivel utilizada nmero de vezes que a apenas consi

incrementadou

colocar o comando LOOP

como contador dentro da estrutura afetar o

repetio ser executada. Se o valor de nIncremento negativo e o valor de nValorInicia l maior que o de nValorFinal, o contador ser decrementado a cada repetio.

Exemplo Local nCnt Local nSomaPar := 0 For nCnt := 0 To 100 Step 2 nSomaPar += nCnt Next Alert( "A soma dos 100 primeiros nmeros pares : " + ; cValToChar(nSomaPar) ) Return ----------------------- Page 39----------------------Este exemplo imprime a soma dos 100 primerios nmeros pares. A soma obitida atravs da repetio do clculo utilizando a prpria varivel de contador. Como a clusula STEP est sendo utiliza da, a varivel nCnt ser sempre incrementada em 2. E como o contador comea com 0, seu valor sempre ser u m nmero par. WHILE...ENDDO IF...ENDIF DO CASE...ENDCASE O Comando WHILE ...ENDDO A estrutura de controle WHILE...ENDDO, ou simplesmente WHILE, repete uma seo de cdigo enquanto uma determinada expresso resultar em verdadeiro (.T.). Sintaxe WHILE lExpressao Comandos... [EXIT] [LOOP] ENDDO Parmetros lExpressao Especifica uma expresso lgica cujo valor determina quando os coman dos entre o WHILE e o ENDDO so executados. Enquanto o resultado de lExpressa o for avaliado como verdadeiro (.T.), o conjunto de comandos so executados. o loop

Comandos e sero

Especifica um ou mais instrues de comando executadas enquanto lExpressao for avaliado como verdadeiro (.T.).

AdvPl

qu

EXIT Transfere o controle de dentro do comando WHILE...ENDDO para o comando imediatamente seguinte ao ENDDO, ou seja, finaliza a repetio da seo de comandos imediatamente. Pode-se colocar o comando EXIT em qualquer lugar entre o WHILE e o ENDO. LOOP Retorna o controle diretamente para a clusula WHILE sem executar o restante dos comandos entre o LOOP e o ENDDO. A expresso em lExpressao reavaliada para a deciso se os comandos continuaro sendo executados. Comentrios Os comandos entre o WHILE e o ENDDO so executados enquanto o resultado da avaliao d a expresso em lExpressao permanecer verdadeiro (.T.). Cada palavra chave WHILE deve ter uma palavra chave ENDDO correspondente. Exemplo Local nNumber := nAux := 350 nAux := Int(nAux / 2) While nAux > 0 nSomaPar += nCnt Next Alert( "A soma dos 100 primeiros nmeros pares : " + ; ----------------------- Page 40----------------------cValToChar(nSomaPar) ) Return FOR...NEXT IF...ENDIF DO CASE...ENDCASE Desvia ndo a Execuo Estruturas de desvio so deseginadas para executar uma seo de cdigo se determinada condio lgica resultar em verdadeiro (.T.). Em AdvPl existem dois comandos par a execuo de sees de cdigo de acordo com avaliaes lgicas. O comando IF...ENDIF e o comando DO CASE...ENDCASE.

O Coman do IF...ENDIF Executa um conjunto de comandos baseado no valor de uma expresso lgica. Sintaxe IF lExpressao Comandos [ELSE Comandos...] ENDIF Parmetros lExpressao Especifica uma expresso lgica que avaliada. Se lExpressao result ar em verdadeiro (.T.), qualquer comando seguinte ao IF e antecedente ao ELSE ou ENDIF (o que ocorrer primeiro) ser executado. Se lExpressao resultar em falso (.F.) e a clusula ELSE for defi nida, qualquer comando aps essa clusula e anterior ao ENDIF ser executada. S e a clusula ELSE no for definida, todos os comandos entre o IF e o ENDIF so i gnorados. Neste caso, a execuo do programa continua com o primeiro comando seguinte ao ENDIF. Comandos Conjunto de comandos AdvPl que sero executados dependendo da av aliao da expresso lgica em lExpressao. Comentrios Pode-se aninhar um bloco de comando IF...ENDIF dentro de outro bloco de comando IF...ENDIF. Porm, para a avaliao de mais de uma expresso lgica, deve-se utilizar o comando DO CASE...E NDCASE. Exemplo Local dVencto := CTOD("31/12/01") If Date() > dVencto Alert("Vencimento ultrapassado!") Endif Return WHILE...ENDDO FOR...NEXT DO CASE...ENDCASE O Comando DO CASE...ENDC ASE ----------------------- Page 41----------------------Executa o primeiro conjunto de comandos cuja expresso condicional resulta em verd

adeiro (.T.). Sintaxe DO CASE CASE lExpressao1 Commandos [CASE lExpressao2 Commandos ... CASE lExpressaoN Commandos] [OTHERWISE Commandos] ENDCASE Parmetros CASE Quando a primeira expresso CASE resultante em verdadeiro (. T.) for encontrada, o lExpressao1 conjunto de comandos seguinte executado. A execuo do conjunt o de comandos Comandos... continua at que a prxima clusula CASE, OTHERWIS E ou ENDCASE seja encontrada. Ao terminar de executar esse conjunt o de comandos, a execuo continua com o primeiro comando seguinte ao ENDCASE. Se uma expresso CASE resultar em falso (.F.), o conjunto de comandos seguinte a esta at a prxima clusula ignorado. Apenas um conjunto de comandos executado. Estes so os pr imeiros comandos cuja expresso CASE avaliada como verdadeiro (.T.). Aps a e xecuo, qualquer outra expresso CASE posterior ignorada (mesmo que sua avali ao resultasse em verdadeiro). OTHERWISE Se todas as expresses CASE forem avaliadas co falso (.F.), a clusula Commandos OTHERWISE determina se um conjunto adicional de comandos d eve ser executado. Se essa clusula for incluida, os comandos segui ntes sero executados e ento o programa continuar com o primeiro comando seguinte ao ENDCA SE. Se a clusula OTHERWISE for omitida, a execuo continuar normal mente aps a clusula ENDCASE. mo Comentrios O Comando DO CASE...ENDCASE utilizado no lugar do comando IF...ENDIF quando um nm ero maior do que uma expresso deve ser avaliada, substituindo a necessidade de mais de um comando IF...ENDIF aninhados. Exemplo

Local nMes := Month(Date()) Local cPeriodo := "" DO CASE CASE nMes <= 3 cPeriodo := "Primeiro Trimestre" CASE nMes >= 4 .And. nMes <= 6 cPeriodo := "Segundo Trimestre" CASE nMes >= 7 .And. nMes <= 9 cPeriodo := "Terceiro Trimestre" OTHERWISE cPeriodo := "Quarto Trimestre" ENDCASE Return WHILE...ENDDO ----------------------- Page 42----------------------FOR...NEXT IF...ENDIF Lista de Palavras Res ervadas AADD VAL ABS VALTYPE ASC WHILE AT WORD BOF YEAR BREAK CDOW CHR CMONTH COL CTOD DATE DAY DELETED ENDDO ENDIF EOF EXP FCOUNT FIELDNAME FILE FLOCK FOUND LOG LOWER LTRIM MAX MIN MONTH PCOL PCOUNT PROCEDURE SECONDS SELECT SETPOS SPACE SQRT STR SUBSTR TIME TRANSFORM ENDCASE LOCK RTRIM EMPTY LEN ROW ELSEIF LASTREC ROUND ELSE INT RLOCK DTOS INKEY REPLICATE

DEVPOS DOW DTOC Notas:

FUNCTION IF IIF

PROW RECCOUNT RECNO

TRIM TYPE UPPER

Palavras reservadas no podem ser utilizadas para variveis, procedimentos, o u funes. Funes reservadas so pertencentes ao compilador e portanto no podem ser redefi nidas por uma aplicao.

Abreviaes de quatro letras de palavras reservadas e funes tambm so reservadas Todos os identificadores que comearem com um ou mais caracteres de sublinhado (_) so utilizados como identificadores internos e, portanto so tambm reservado s. FUNO AADD (<matriz>,<expr>) Adiciona dinamicamente um novo elemento, com o valor da expr no fim da matriz. aArray := {} AADD(aArray, 5) AADD(aArray, 10) AADD(aArray, { 12, 10 } FUNO ABS (<exprN>) Retorna o valor absoluto (valor numrico no negativo) de exprN FUNO ASC (<exprC>) Retorna o codigo ASCII do primeiro caractere da expreC ----------------------- Page 43----------------------FUNO AT (<exprC1>,<exprC2>) Retorna a posio inicial de exprC1 em exprC2. Se no encontrar, retorna o valor 0. FUNO BOF () Retorna .T. se o inicio do banco de dados ativo for atingido com um camando SKIP n. FUNO BREAK (<expr>) Sai fora da sequencia corrente, exatamente com a declarao BREAK. FUNO CDOW (<expr>) Retorna l nome do dia da semana (Sanday-Saturday). FUNO CHR (<expr>) // Result: aArray is an empty array // Result: aArray is { 5 } // Result: aArray is { 5, 10 } // Result: aArray is { 5, 10, { 12, 10 } }

Retorna o caractere ASCII equivalente ao cdigo exprN. FUNO CMONTH (<exprD>) Retorna o nome do ms (janeiro-dezembro) da expresso tipo data. FUNO COL () Retorna o nmero da coluna do vdeo onde o curso est posicionado. FUNO CTOD (<exprC>) Retorna a exprC convertida para o formato tipo data. FUNO DATE (<expr>) Retorna a data mantida pelo Sistema Operacional. FUNO DAY (<expr>) Retorna o nmero do dia (1-31) da expreo tipo data exprD. FUNO DBGOTOP () Posiciona o indicador de registro no primeiro registo do banco de dados ativo. FUNO DBSEEK (<expr>,<exprL>) Posiciona no primeiro registro cuja chave da indice satisfaa a expresso. FUNO DBSELECTAREA (<narea>,<alias>) Seleciona a rea de trabalho especificada. FUNO DBSETFILTER (<bloco>,[exprC]) Define um filtro. Bloco Bloco de codigo que expressa a condio de filtro na executad a, experC Valor que expresa a condio de filtro na forma textual. FUNO DBSETORDER (<exprN>) Designa como indice mestre o exprN-simo indice da lista de indices do banco de da dos ativo. Tcnicas de Programao Eficiente em AdvPl ----------------------- Page 44----------------------Para o desenvolvimento de sistemas e a programao de rotinas, sempre esperado que q ualquer cdigo escrito seja: de correto funcionamento eficiente legvel reutilizvel

extensvel portvel Aps anos de experincia na utilizao de linguagens padro xBase e do desenvolvimento da linguagem AdvPl, algumas tcnicas para uma programao otimizada e eficiente foram reconhecidas. A utilizao das tcnicas a seguir, visa buscar o mximo aproveitamento dos recursos da linguagem com o objetivo de criar programas com estas caractersticas. Criao de Funes Segundo a Necessidade Observe o cdigo de exemplo: User Function GetAnswer(lDefault) Local lOk lOk := GetOk(lDefault) If lOk Return .T. Else Return .F. Endif Return nil

Utilizando-se apenas o critrio "a funo funciona corretamente?", a funo GetAnswer perfeita. Recebe um parmetro lgico com a resposta padro e retorna um valor lgico dependente da opo esc lhida pelo usurio em uma funo de dilogo "sim/no" designada para isso. Po de entretanto ser melhorada, particularmente se eficincia for considerada como um critrio para um cdigo melhor. Eficincia tipicamente involve a utilizao de poucos recursos de mquina, poucos chamadas de funes ou tornar m ais rpido um processo. Segundo esse raciocnio, poderia se produzir o seguinte cdigo: User Function GetAnswer(lDefault) Return If( GetOk(lDefault), .T., .F.) Ou melhor: User Function GetAnswer(lDefault) Return GetOk(lDefault)

Com a otimizao do cdigo da funo GetAnswer, pode facilmente verificar que a mesma no r

aliza nada adicional chamada de GetOk, mada direta desta, continuando funcionar corretamente. Codificao Auto-Documentvel

podendo a

ser

substituda

por

uma

cha

Nenhum comentrio substitui um cdigo claramente um um acidente. Considere o exemplo: ----------------------- Page 45----------------------cVar := " " // 11 espaos

escrito,

este

no

O tamanho da varivel cVar no evidente por si s e no facilmente verificado. Estes me mos 10 espaos estariam mais bvios e ainda assim garantidos se a instruo fosse escrita como: cVar := Space(10) O mesmo princpio pode ser aplicado para qualquer string longa de caracteres repet idos. A funo Replicate pode ser utilizada como a seguir: cVar := Replicate( "*", 80 ) Este tipo de programao deixa o cdigo fcil de digitar, fcil de ler e mais flexvel. Utilizao de Solues Simples

Simplicidade na criao de instrues torna a programao e at mesmo a execuo mais rpid ere a linha de cdigo: If nVar > 0 .Or. nVar < 0

Se o valor da varivel nVar for igual a zero (0) no momento da execuo desta linha de cdigo, ambas as comparaes separadas pelo operador lgico .Or. sero efetuadas: Aps ser avaliada, a primeria comparao ir falhar. A segunda comparao ser ento avaliada e falha tambm. Como resultado, o cdigo existente dentro da estrutura de fluxo If no ser executado. Tal cdigo somente ser executado quando o valor desta varivel for maior OU menor do que zero. Ou seja, sempre que for DIFERENTE de zero, o que torna a linha a seguir mais eficiente: If nVar != 0 Este tipo de alterao torna o cdigo mais legvel e o processamento mais rpido, evitando a avaliao de instrues desnecessariamente. Existem outras situaes onde a simplificao pode ser utilizada. A expresso de avaliao eguir: If cVar == "A" .Or. cVar == "B" .Or ;

cVar == "C" .Or. cVar == "D" Pode ser substitudo pelo operador de conteno: If cVar $ "ABCD" Opo por Flexibilidade A melhor soluo uturo. Considere exemplo: aquela que envolve o problema imediato e previne problemas no f o

@nRow,nCol PSAY cVar Picture "!!!!!!!!!!!!!!!!!!!!" Exceto contando-se os caracteres, no existe maneira de saber se o nmero de caracte res de exclamao o esperado. Enquanto isto um problema, existem algo mais grave. A expresso de pic ture esttica. Se no futuro for necessrio ajustar o tamanho da varivel cVar, ser nece ssrio localizar todos os lugares no cdigo onde esta mscara de picture est sendo utilizada para ajuste manual. Existe um a opo dsoluo de de auto-ajuste disponvel que fcil de digitar e tem a garantia de executar a tarefa igualmente (tornar todos os caracteres maisculos): @nRow,nCol PSAY cVar Picture "@!" Opo da Praticidade ao Drama ----------------------- Page 46----------------------Se a soluo parece complexa, provavelmente porque o caminho escolhido est levando a isso. Deve-se sempre se perguntar porque algum desenvolveria uma linguagem que requisite tantos comandos complicados para fazer algo simples. Na grande maioria dos caso s, existe uma soluo mais simples. O exemplo abaixo deixa isso bem claro: @ 10,25 Say Substr(cCep,1,5) + "-" + Substr(cCep,6,3) Picture "!!!!!!!!!" Que pode ficar mais simples assim: @ 10,25 Say cCep Picture "@R 99999-999" Utilizao de Operadores de Incremento/Decremento Utilizados devidamente, os operadores de incremento e decremento to rnam o cdigo mais fcil de ler e possivelmente um pouco mais rpidos. Ao contrrio de escrever adies simples como: nVar := nVar + 1 nVar := nVar -1 Pode-se escrev-las assim: ++nVar

--nVar

Deve-se apenas tomar cuidado com a precedncia destes operadores, pois o "++" ou o "--" podem aparecer antes ou depois de uma varivel, e em alguns casos quando a varivel for utilizada dentro de uma expresso, a prefixao ou sufixao destes operadores afetar o resultado. Para maiores de alhes, consulte a documentao de operadores da linguagem AdvPl. Evitar Passos Desnecessrios Existe uma diferena entre um bom hbito e perda de tempo. Algumas vezes estes conce itos podem estar muito prximos, mas um modo de diferenci-los balancear os benefcios de realizar algu ma ao contra o problema que resultaria se no fosse executada. Observe o exemplo: Local nCnt := 0 For nCnt := 1 To 10 <cdigo> Next nCnt

Inicializar a varivel no momento da declarao no um problema. Se o 0 fosse necessrio no exemplo, teria sido til a inicializao na declarao. Mas neste caso a estrutura de repetio For Next atribui o seu valor imediatamente com 1, portanto no houve ganho em atribuir a varivel com 0 no comeo.

Neste exemplo no h nenhum ponto negativo e nada errado ocorrer se a varivel no for inicializada, portanto aconselhvel evitar este tipo de inicializao, pois no torna o cdigo mais seg ro e tambm no expressa a inteno do cdigo mais claramente. Porm note este exemplo, onde a varivel no inicializada: Local nCnt While ( nCnt++ < 10 ) <cdigo> EndDo

Em AdvPl, variveis no inicializadas sempre tem seu valor contendo nulo (nil) a pri ncpio, o que far com que uma exceo em tempo de execuo acontea quando a instruo de repetio while for exe ----------------------- Page 47----------------------Diferentemente do primeiro exemplo, onde a inicializao da varivel no fazia diferena alguma, neste segundo exemplo a inicializao absolutamente necessria. Deve-s e procurar inicializar variveis

numricas com zero (0) e variveis caracter com string nula ("") apenas quando realm ente necessrio. Utilizao de Alternativas Quando se est trabalhando em uma simples rotina, deve-se tomar algum tempo para e xplorar duas ou trs diferentes abordagens. Quando se est trabalhando em algo mais comp lexo, deve-se planejar prototipar algumas a mais. Considere o seguinte cdigo: If cHair = "A" Replace hair With "Loira" Else If cHair = "B" Replace hair With "Morena" Else If cHair = "C" Replace hair With "Ruiva" Else If cHair = "D" Replace hair With "Grisalho" Else Replace hair With "Preto" Endif Endif Endif Endif Um cdigo de uma nica letra, (A at E), foi informado para indicar a cor de cabelo. E ste cdigo foi ento convertido e armazenado como uma string. Pode-se notar que a cor "Preto" ser atri buda se nenhuma outra opo for verdadeira. Uma alternativa que reduz o nvel de identao torna o cdigo mais fcil de ler enquanto r eduz o nmero de comandos replace: Do Case Case cHair == "A" cColor := "Loira"

Case cHair == "B" cColor := "Morena" Case cHair == "C" cColor := "Ruiva" Case cHair == "D" cColor := "Grisalho" OtherWise cColor := "Preto" EndCase Replace hair With cColor ----------------------- Page 48----------------------Utilizao de Arquivos de Cabealho Quando Necessrio Se um arquivo de cdigo criado se referencia a comandos para interpretao e tratament o de arquivos XML, este deve se incluir o arquivo de cabealho prprio para tais comandos (XMLXFUN.CH n o exemplo). Porm no deve-se incluir arquivos de cabealho apenas por segurana. Se no se est referencian do nenhuma das constantes ou utilizando nenhum dos comandos contidos em um destes arquivos, a i ncluso apenas tornar a compilao mais demorada. Constantes em Maisculo Isto uma conveno que faz sentido. Em AdvPl, como em C por exemplo, a regra utilizar todos os caracteres de uma constante em maisculo, a fim de que possam ser claramente reconhecidos como constantes no cdigo, e que no seja necessrios lembrar onde foram declarados. Utilizao de Identao Este um hbito que todo programador deve desenvolver. No consome muito esforo para m anter o cdigo alinhado durante o trabalho, porm quando necessrio pode-se utiliza r AP6 IDE para a reidentao de cdigo. Considere o exemplo: While !SB1->(Eof()) If mv_par01 = SB1->B1_COD dbSkip() Loop

Endif Do Case Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02" TrataLocal(SB1->B1_COD,SB1->B1_LOCAL) Case SB1->B1_LOCAL == "03" TrataDefeito(SB1->B1_COD) OtherWise TrataCompra(SB1->B1_COD,SB1->B1_LOCAL) EndCase dbSkip() EndDo A utilizao da identao seguindo le, if, case, etc) torna a compreenso do cdigo muito mais fcil: While !SB1->(Eof()) If mv_par01 = SB1->B1_COD dbSkip() Loop Endif Do Case Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02" TrataLocal(SB1->B1_COD,SB1->B1_LOCAL) Case SB1->B1_LOCAL == "03" TrataDefeito(SB1->B1_COD) ----------------------- Page 49----------------------OtherWise TrataCompra(SB1->B1_COD,SB1->B1_LOCAL) EndCase dbSkip() EndDo Utilizao de Espaos em Branco as estruturas de controle de fluxo (whi

Espaos em branco extras tornam o cdigo mais fcil para a leitura. No necessrio imensas reas em branco, mas agrupar pedaos de cdigo atravs da utilizao de espaos em branco funcio a muito bem. Costuma-se separar parmetros com espaos em branco. Quebra de Linhas Muito Longas Com o objetivo de tornar o cdigo mais fcil de ler e imprimir, as linhas do cdigo no devem estender o limite da tela ou do papel. Podem ser "quebradas" em mais de uma linha de texto utilizando o ponto-evrgula (;). Capitulao de Palavras-Chave Uma conveno aves, funes, utilizando uma facilitar a fonte. O cdigo a local ncnt while ( ncnt++ < 10 ) ntotal += ncnt * 2 enddo Ficaria melhor com as palavras chaves e variveis capituladas: Local nCnt While ( nCnt++ < 10 ) nTotal += nCnt * 2 EndDo Utilizao da Notao Hngara amplamente utilizada a de capitular variveis e campos combinao de caracteres em maisculo e leitura do cdigo seguir: as palavras ch visando

minsculo,

A Notao Hngara muito comum entre programadores xBase e de outras linguagens. A docu mentao do AdvPl utiliza esta notao para a descrio das funes e comandos e aconselhvel sua utilizao na criao de rotinas, pois ajuda a evitar pequenos erros e facilita a leitura do cdigo. Para maiores detalhes, consulte a documentao sobre a Notao Hngara disponvel na documentao da linguagem Adv Utilizao de Nomes Significantes para Variveis

A principal vantagem da liberdade na criao dos nomes de variveis a facilidade de id entificao da sua utilidade. Portanto deve-se utilizar essa facilidade o mximo possvel. Nomes sem se ntido apenas tornaro difcil a identificao da utilidade de uma determinada varivel, assim como nomes ext remamente curtos. Nem sempre a utilizao de uma varivel chamada i a melhor sada. Claro, no convm criar

a varivel com um nome muito longo que ser utilizada como um contador, e referenciada muitas vezes no cdigo. O bom senso deve ser utilizado. ----------------------- Page 50-----------------------

Criar variveis como nNumero ou dData tambm no ajudam na identificao. A Notao Hngar t sendo utilizada para isso e o objetivo do nome da varivel deveria ser identificar sua utilizao, no o tipo de dado utilizado. Deve-se procurar substituir tais variveis por algo como nTotal ou dCompra. O mesmo vlido para nomes de funes, que ouco sobre o que a funo faz. Novamente nomes extremamente curtos no so aconselhveis. Utilizao de Comentrios Comentrios so muito teis na documentao de programas a facilitar a identificao de processos importantes no futuro. Devem sempre ser utilizados. criados e par devem descrever um p

Sempre que possvel, funes criadas devem ter uma breve descrio do seu objetivo, parmet os e retorno. Alm de servir como documentao, os comentrios embelezam o cdigo ao separar as funes u das outras. Os comentrios devem ser utilizados com bom senso, pois reescrever a sintaxe AdvPl em portugus torna-se apenas perda de tempo: If nLastKey == 27 // Se o nLastKey for igual a 27 Criao de Mensagens Sistmicas Significantes e Consistentes Seja oferecendo assistncia, exibindo mensagens de aviso ou mantendo o usurio infor mado do estado de algum processo, as mensagens devem refletir o tom geral e a importncia da aplicao. Em termos gerais, deve-se evitar ser muito informal e ao mesmo tempo muito tcnico. "Aguarde. Reindexando (B1_FILIAL+B1_COD+B1_LOCAL) do arquivo: \DADOSADV\SB199 0.DBF" Esse tipo de mensagem pode dar informaes demais para o usurio e deix-lo sentindo-se desconfortvel se no souber o que significa "reindexando", etc. E de fato, o usurio no devia ser i ncomodado com tais detalhes. Apenas a frase "Aguarde, indexando." funcionaria c orretamente, assim como palavras "processando" ou "reorganizando". Outra boa idia evitar a referencia a um item corrente de uma tabela como um "regi stro": "Deletar este registro?"

Se a operao estiver sendo efetuada em um arquivo de clientes, o usurio deve ser que stionado sobre a remoo do cliente corrente, se possvel informando valores de identificao como o cdigo u o nome. Evitar Abreviao de Comandos em 4 letras Apesar do AdvPl suportar a abreviao de comandos em quatro letra s (por exemplo, repl no lugar de replace) no h necessidade de utilizar tal funcionalidade. Isto apenas torna o cdigo mais difcil de ler e no torna a compilao mais rpida ou simples. Evitar "Disfarces" no Cdigo No deve-se criar constantes para expresses complexas. Isto tornar o cdigo muito difci l de compreender e poder causar erros primrios, pois pode-se imaginar que uma a tribuio efetuada a uma varivel quando na verdade h toda uma expresso disfarada: #define NUMLINES aPrintDefs[1] #define NUMPAGES aPrintDefs[2] #define ISDISK If ISDISK == 1 ----------------------- Page 51----------------------NUMLINES := 55 Endif NUMPAGES += 1 A impresso que se tem aps uma leitura deste cdigo de que valores esto sendo atribuid os s variveis ou que constantes esto sendo utilizadas. Se o objetivo flexibilidade, o cdigo ante rior deve ser substitudo por: #define NUMLINES 1 #define NUMPAGES 2 #define ISDISK 5 aReturn[5]

If aReturn[ISDISK] == 1 aPrintDefs[ NUMLINES ] := 55 Endif aPrintDefs[ NUMPAGES ] += 1 Evitar Cdigo de Segurana Desnecessrio Dada sua natureza binria, tudo pode ou no acontecer dentro de um computador. Adic

ionar pedaos de cdigo apenas para "garantir a segurana" freqentemente utilizado omo uma desculpa para evitar corrigir o problema real. Isto pode incluir a checagem para validar intervalos d e datas ou para tipos de dados corretos, o que comumente utilizando em funes: Static Function RaizQuadrada( nVal ) If ValType( nVal ) != "N" nVal := 0 Endif Return ( nVal * nVal )

O ganho irrisrio na checagem do tipo de dado do parmetro j que nenhum programa corretamente escrito em execuo poderia enviar uma string ou uma data para a funo. De fato, este t ipo de "captura" o que torna a depurao difcil, j que o retorno ser sempre um v alor vlido (mesmo que o parmetro recebido seja de tipo de dado incorreto). Se esta captura no tiver sido efe tuada quando um possvel erro de tipo de dado invlido ocorrer, o cdigo pode ser corrigido para que este erro no m ais acontea. Isolamento de Strings de Texto No caso de mensagens e strings de texto, a centralizao um bom negcio. Pode-se coloc ar mensagens, caminhos para arquivos, e mesmo outros valores em um local e specfico. Isto os torna acessveis de qualquer lugar no programa e fceis de gerenciar.

Por exemplo, se existe uma mensagem comum como "Imprimindo, por favor aguarde... " em muitas partes do cdigo, corre-se o risco de no seguir um padro para uma das mensagens em algum lu gar do cdigo. E mant-las em um nico lugar, como um arquivo de cabealho, torna fcil a produo de docume tao e a internacionalizao em outros idiomas. Tabela de Pictures de Fo rmatao Comando SAY/PSAY ----------------------- Page 52----------------------Funes C E R X Exibe CR depois de nmeros positivos Exibe numricos com o ponto e a vrgula invertidos (formato Europeu) Insere caracteres diferentes dos caracteres de template Exibe DB depois de nmeros negativos

Z ( !

Exibe zeros como brancos Envolve nmeros negativos entre parnteses Converte todos os carecteres alfabticos para maisculo Templates

X 9 # ! * . , Comando GET Funes A C E R late na

Exibe dgitos para qualquer tipo de dado Exibe dgitos para qualquer tipo de dado Exibe dgitos para qualquer tipo de dado Converte caracteres alfabticos para maisculo Exibe asterisco no lugar de espaos em branco inicias em nmeros Exibe a posio do ponto decimal Exibe a posio do milhar

Permite apenas caracteres alfabticos Exibe CR depois de nmeros positivos Exibe numricos com o ponto e vrgula invertidos (formato Europeu) Insere caracteres diferentes exibio mas no insere-os na varivel do GET dos caracteres de temp

S<n> Permite rolamento horizontal do texto dentro do GET, <n> um nmer o inteiro que identifica o tamanho da regio X Z ( ciais ) ciais ! Exibe DB depois de nmeros negativos Exibe zeros como brancos Exibe nmeros negativos entre parnteses com os espaos em branco ini Exibe nmeros negativos entre parnteses sem os espaos em branco ini Converte caracteres alfabticos para maisculo Prefcio Existe um ditado chins que diz: O Homem no tropea em montanhas, tropea em pedregulho s, areia, pequenos buracos, mas nunca em uma montanha.

Isso nos remete a pensar que onde erramos exatamente no simples, naquele detalhe quase imperceptvel e que tem um valor muito grande para o todo. Avaliemos do ponto de vista humano; ser to difcil cumprimentar a todos, sermos mais amigos, mais serenos nas decises e companheir os uns dos outros e trabalharmos em equipe? Por que muitas vezes no o fazemos? Por que insistimos no individualismo e no mal-humor? No seria mais fcil, at mesmo bvio, estarmos mais bem-humorados e disposto s a trabalhar ----------------------- Page 53----------------------em equipe, trocarmos conhecimento nsarmos mais no todo porm se importando com as partes que o compe? e discernimento nas decises, pe

Seria mais interessante se ao caminharmos por um parque, prestssemo s mais ateno nas rvores, no caminho, nas flores, no canto dos passarinhos sem se esquecer do objetivo do pas seio, sem perder a noo de tempo e distncia, mas curtindo muito a paisagem, o detalhe. Agora vamos traar um paralelo com o ria melhor ao reservarmos um fonte, verificarmos com mais ateno: nosso dia a dia. No se

As condicionais? Afinal muitas vezes no testamos um ELSE. Os filtros? Geralmente esquecemos de tentar otimizar a performance no SQL. As mensagens? Afinal to comum nos depararmos com textos completamente sem sentido . Os helps? Damos pouca ateno a eles e nos esquecemos que a primeira coisa que o usur io tenta. Imaginem algumas ligaes menos por causa de uma simples documentao a mais! Aquele ponto de entrada que criamos e no pensamos nos supostos parmetros que nosso pessoal em camp o pode querer, ou mesmo no retorno mais adequado para aquela funo. Lembrem-se tambm da documentao do novo campo; Ela realmente necessria? Se a chave de ndice imprescindvel, por que no crio uma query? Ao responder um BOPS, no seria melhor que fosse sua ltima argumentao para o problema? Se isto ficar claro e bem resolvido no teremos mais aqu ela ocorrncia ou dvida. Se tivermos que explicar um processo para algum, que o faamos de tal forma a no gerarmos incgnitas. Por que ao invs de focarmos nossos esforos para matarmos o BOPS, no aval iamos o fonte para evitarmos NOVOS BOPS? Ao resolver uma ocorrncia lembre-se de todos os ponto s de implicao da sua atividade. O que isso ir impactar no servio do outro? Sem falar em documentar no Q uark!

Vamos trazer o comportamento do parque para o nosso trabalho tambm. Ao programar vamos nos ater aos detalhes, sermos mais crticos, pensarmos que aquela instruo a mais, significa muito para o sistema e que l na frente, se tratado com descuido, pode causar problemas. Tenha convico que, se agirmos de maneira mais focada aos nossos propsitos, o passeio ou melhor a programao, ser muito mais entusiasmada, produtiva e com uma margem de erro bem meno r. Com esse comportamento quem ganha somos ns; Microsiga!. S assim teremos mais tempo de irmos ao parque no final de semana. Lembre-se que no adianta decidirmos passear no parque do Ibirapuera no domingo, e no estarmos com a cabea voltada para o passeio, ao invs disso pensarmos no trabalho, na DLLl que no c omunica, no BOPS que no foi baixado, pois se assim for, estaremos to voltados para outros fins que no curtiremos o passeio. Pense que para passear, ou melhor, programar, a regra tambm valida, no adianta nem ao menos tentarmos se no estivermos concentrados para isso. Enfim, quer uma prova de trabalho hes; este manual, que foi constitudo em apenas 2 dias, seus objetivos, se atentando cada um com o seu tema. to para nos ajudar a sermos melhores e no errarmos no em equipe com um alto nvel de qualidade e detal com a colaborao de mais de 20 pessoas, focadas em O resultado? Um trabalho excelente, um documen fcil!

O Que Fazer um Programa com Inteligncia Precisamos entender, antes de mais nada, o que inteligncia. Segundo o dicionrio de entender, pensar, interpretar; Michaelis, inteligncia raciocinar e significa: faculdade

Compreenso, conhecimento profundo. De acordo com essa definio, se pretendemos utilizar nosso bem mais precioso em nos so trabalho, vamos precisar desenvolver alguns hbitos: ----------------------- Page 54----------------------Devemos estudar o programa antes de comear a desenvolver. Imagine prestar um conc urso ou fazer uma prova sem estudar. Vai ganhar um zero na certa! No programa no ser diferente! Fazer um levantamento dos programas que sofrero as conseqncias s alteraes realizadas. Todos esses programas devero ser testados juntamente com o programa alterado. Antes de criar uma funo, consulte o Help Microsiga ou os colegas de trabalho, pois esta funo j pode ter sido criada. da

Ao criar uma funo, certifique-se de que no cabealho conste algumas informaes bsicas c mo: descrio da funo, sintaxe, definio dos parmetros e autor. comum ao desenvolv r uma funo, utilizarmos outra j pronta como exemplo, e neste momento o copiar/colar nos faz esq uecer de alterar estas informaes. Imagine se algum desenvolver uma funo inconsistente e esquecer de trocar o seu nome no cabealho. Devemos assumir a responsabilidade de nossos atos.

Ao fazer a documentao das alteraes realizadas, certifique-se de que as informaes est laras, no s para o seu entendimento mas para que os colegas no percam tempo tentando entender -las. Ao realizar os testes, defina critrios. Antes de comear defina onde quer chegar. No basta consistir suas alteraes. O fato de suas alteraes estarem funcionando como previstas no garante a no xistncia de erros. No limite-se a testar sua alterao na base que voc utilizou durante o desenvolvimento , pois voc criou o ambiente perfeito para que o programa funcione. Pode parecer um pouco trabalhoso passar por estes processos no decorrer do desen volvimento do sistema, mas se medidas como estas no forem tomadas, o que era extremamente simples se tor nar extremamente trabalhoso. Programando Simples, mas Certo Qual profissional da rea de informtica ainda no se deparou com um cdigo fonte que pa recia estar escrito em outro dialeto mesmo com todo conhecimento adquirido naquela linguagem, este f ato geralmente ocorre pela m utilizao de sintaxes complexas que nem sempre significam um bom funcionament o do sistema.

Um profissional da rea de informtica no possui nenhum modelo pa dro para desenvolver os seus algoritmos, porm necessria a aplicao da tica profissional para que se possa desenvol er algoritmos de maneira simples e correta, este conceito se baseia nos seguintes aspectos : Entender qual o objetivo do processo em questo Analisar a melhor forma de desenvolver um algoritmo que seja de fcil manuteno. Utilizar comandos e sintaxes que utilizem o mximo de simplicidade e clareza possve l. Erros que Podem ser Evitados Existem alguns erros que com um pouco de ateno, podem ser evitados, tais como: Verifique se a varivel est declarada antes do uso;

Ao declarar uma varivel, verifique qual a necessidade de ter essa varivel e qual o tipo e a sua classe; Classifiquem as funes e os procedimentos conforme a necessidade, como por exemplo, na declarao de um array, defina o seu tamanho e no uso verifique se o elemento existe; Salve a ordem e a rea e o registro do arquivo que ser utilizadopara que no final d o processo se recupere estes valores; Evite retornar da funo antes do seu final, ou seja, crie preferencialmente um nico retorno; ----------------------- Page 55----------------------Valide sempre o retorno do ponto de entrada; Quando for gravar um arquivo que utiliza campos de outros arquivos, posicione to dos os arquivos e registros antes de iniciar a gravao, e descreva o alias do campo; Utilize de arquivo CH nas strings para localizao; Quando possvel utilize a linguagem SQL, pois minimiza o tempo de execuo em muitos p rocessos. A Importncia de Programas Documentados Todos sabemos o quanto difcil elaborar e manter uma documentao tcnica atualizada, ai nda mais aqui na Microsiga, cuja dinmica dos acontecimentos muitas vezes imp ede que isso seja viabilizado. Diante desse cenrio, o que nos resta? Obviamente que pelo menos os programas sejam documentados, bem documentados.

Documentar bem, no significa que tenhamos que escrever dezenas de linhas de comen trios a cada linha de cdigo. Significa que os comentrios tm passar alguma informao r elevante. Vemos comentrios assim: compara A com B e s. Isso bvio, a leitura do cdigo j nos diz isso. A documen eve se ater a conceitos, por exemplo: Se A for maior que B, o arquivo de saldos ser atual izado, caso contrrio o registro ser rejeitado para que o saldo no fique negativo.. Isto sim transmite algu ma informao. Tambm se pode utilizar desse recurso para fazer lembretes a fatos importantes que , se forem deixados de lado, podem comprometer o funcionamento das rotinas. Por exemplo: Ao acionar esta funo, o arquivo XXX DEVE estar posicionado no ndice 1. E os cabealhos? Quantos programas so aproveitados e nem sequer o nome do autor trocado? Se o analista X tivesse escrito todos programas que aparece como autor ele deveria te r comeado na poca do Charles Babage. O cabealho das funes de conter o nome na dita

cuja, autor, data de criao, uma descrio sumria de sua funcionalidade, a sintaxe e por ltimo, mas no menos importante, a descrio dos argumentos de entrada e sada. A respeito desse ltimo item deve-se ter especial ate no nas manutenes, pois novos argumentos so criados e nem sempre so declarados nessa seo da documentao do cabealho, isso muito grave. No IDE do PROTHEUS existem opes bastante interessantes para nos auxiliar nessa tar efa. Experimente as opes Inserir, Documentao de cabealho e Inserir, Documentao de Explicao.

Existe ainda um tipo de documentao que nem sempre observada, aquela inerente ao prp rio cdigo. Programas cujas variveis so declaradas como nX, cVAR1, dAUX, nNUM, etc., so extrema mente difceis de entender e pior, manter. conveniente que os nomes das varivei s retratem seu uso ou destino. Por exemplo: dDataDeS ou dDataDeE. Segundo as convenes da Microsiga, variveis do tipo D ATA devem ser iniciadas pela letra d. Assim Data, no acrescenta nada ao entendimento do que a variv l representa. Nos sobrou o dES e o dEE para informar para que diados serve a bendita varivel. Ser s a, soluo, saldo? Entrada, Estorno, Estoque? Que tal isso: dSeguro e dEntrega?

Enfim, como foi dito, no preciso escrever um livro a cada programa, basta ser obj etivo e se colocar na posio de quem no conhece o programa to pouco o assunto. Algum dia voc mesmo poder est r nessa posio. Cabealho de Programa / Funo O cabealho do programa utilizado para identificar informaes gerais sobre a rotina, seu autor, data, entre outras informaes. importante que esteja preenchida de forma correta e atuali zada. Lembre-se de que nada adianta um cabealho que no informe nada ou pior ainda, com informaes errneas . Lembre-se que um bom livro comea com um bom prefcio, e um bom programa comea com um cabealho til e legvel. A manuteno/atualizao do cabealho de responsabilidade que alterou o fonte. O cabealho de programa padro da Microsiga contm: rotina, a do desenvolvimento, comentrio sinttico e sintaxe. ----------------------- Page 56----------------------Criao de Variveis Na criao de uma varivel deve-se ter em mente alguns pontos fundamentais: A declarao da ltima dat

pes

autor,

O tipo de varivel A funo CRIAVAR() A inicializao Padronizao de variveis A Declarao Deve ser feita sempre no incio da rotina que for utiliz-la, como no exemplo: Function a910VerCod() Local cCod910 := 001 Return O Tipo de Varivel O tipo de varivel serve para identificar a utilizao que a mesma ter no decorrer da r otina. Toda varivel deve estar tipada durante sua criao. Quando programamos nativamente em C, isto se to rna obrigatrio. Devemos fazer o mesmo no AP5, pois isto demonstra que a varivel foi conscientemen te declarada. Tipos Existentes

PUBLIC: Esta varivel ser inicializada em um valor lgico falso (. F.) at que seja atribudo um valor especfico a ela. Esta varivel permanece definida por toda a durao da aplicao e pode s r vista (assim como usada, alterada e avaliada) por qualquer funo. Esta varivel gera um token (ind icao) na tabela de smbolos, isto significa que o mdulo principal conter smbolos para esta classe de var ivel, o que, por sua vez, ocupa mais espao de memria. Deve-se evitar a utilizao deste tipo, a no ser em ca sos extremos. PRIVATE: Esta varivel ser inicializada em valor nulo (NIL) e u ma vez declarada, permanecer assim durante toda a durao do fluxo da funo, at que este volte ao procedimento inicial que a chamou. Em essncia, uma varivel de memria PRIVATE inicializada logo no incio do Protheus, agir c omo um varivel PUBLIC. Esta varivel pode ser vista por uma sub-rotina da funo e modificada de mane ira correspondente. Esta varivel tambm gera um token na tabela de smbolos comentada acima.

LOCAL: Esta varivel de memria ser inicializada com valor nulo (NIL) e s visvel dentr da funo que a inicializa, mesmo que esta ltima, contenha funes incorporadas a seu contedo. Este tipo de varivel o mais adequado a ser utilizado em funes, pois no gera smbolos na tabela de smbolos, po r conseqncia ocupa pouco espao de memria e, o compilador avalia as variveis LOCAL e STATIC mais rapidamente que os outros tipos (PUBLIC e PRIVATE). Cuidado para no sucumbir teoria de que se pod

e obter economia de memria, mudando qualquer referncia PRIVATE para uma referncia LOCAL. Se voc fizer is so, as funes podem no funcionar corretamente, embora funcionassem na verso anterior s alteraes.

STATIC: A varivel STATIC idntica classe de armazenamento LOCAL, com uma exceo. Uma arivel STATIC retida dentro de sua sub-rotina, mesmo depois que o f luxo da funo a tenha deixado. Isto particularmente til para funes independentes tipo caixa-preta, que contm seu prprio conjunto de variveis exclusivas e devem manter esses valores de interao em interao. Inicializao ----------------------- Page 57----------------------Quando no atribumos nenhum valor a uma varivel no momento de sua declarao, corremos o risco de utiliz-la com valor NIL e causar erros fatais. Por isso, a inicializao de uma varivel de extrema importncia. Padronizao de Variveis importante que ao lermos o nome de uma varivel, possamos saber se o seu tipo numri co, caracter, data ou lgico. O nome da varivel de get no deve coincidir com uma varivel de outro p rograma, pois toda varivel de get possui um help especfico. Exemplo: a varivel DBaixa (get da baixa no programa de Ttulos a Receber), j possui um texto help que indica seu conteudo e no dever ser criada outra varivel para outra finalidade com e ste mesmo nome. Para tanto, definimos a seguinte padronizao : N -> Numricas L -> Lgicas D -> Data C -> Caracter A -> Array (matriz) O -> Objeto U -> Sem definio Criando uma Varivel Utilizando a Funo CRIAVAR() Esta funo cria uma varivel, retornando o valor do campo, de acordo com o dicionrio d e dados. Avalia o inicializador padro e retorna o contedo de acordo com o tipo de dado definido no d icionrio. Sintaxe

uRet := CriaVar(cCampo,lIniPad,cLado) Onde : Uret -> tipo de retorno de acordo com o dicionrio de dados, considerando inici alizador padro. cCampo -> Nome do campo LiniPad -> Indica se considera (.T.) ou no (.F.) o inicializador padrao (X3_RE LACAO) Clado -> Lado para inicializao padro Variveis de Relatrios Na criao de um relatrio algumas variveis e seus tipos so convencionados para a utiliz ao da biblioteca de funes de relatrio. Varivel wnRel cbCont Cabec1 Cabec2 Cabec3 Tipo Local Local Local Local Local Contedo Nome default do relatrio em disco Contador 1

2 linha do cabealho do relatrio 3 linha do cabealho do relatrio Tamanho do Relatrio (P = Pequeno 80 colunas, M = Md

io 132 colunas, G = Tamanho Local Grande, 220 colunas) cDesc1 cDesc2 Local Local 1 linha da descrio do relatrio 2 linha da descrio do relatrio

----------------------- Page 58----------------------cDesc3 Limite Titulo AReturn e impresso Nomeprog CString o de filtro Local Local Local Private Private Private 3 linha da descrio do relatrio Quantidade de colunas no relatrio (80,132,220) Ttulo do Relatrio Matriz com as informaes para a tela de configurao d Nome do programa do relatrio Alias do arquivo principal do relatrio para o us Controle das linhas de impresso. Seu valor inici al a quantidade mxima de

linha do cabealho do relatrio

Li m_pg

Private linhas por pgina utilizada no relatrio Private Controle do nmero de pginas do relatrio Matriz contendo as ordens de layout para a impr

esso. Caso no existam vrias Ex.: aOrd aOrd := {"Cdigo", Private ordens esta matriz "Descrio", deve estar vazia.

"Telefone"} -> O layout do relatrio vai depender da ordem selecionada na tela de configurao de impresso nLastKey Private esso do relatrio cPerg aLinha ios cadastrais Private Private Utilizado para controlar o cancelamento da impr Nome da pergunta a ser exibida para o usurio Matriz que contem informaes para impresso de relatr Cuidados com o Posicionamento de Registros O posicionamento correto de registros fundamental ncionalidade completa dos programas. Algumas dicas para posicionamento de registros so : para a fu

Evitar DBGOTOP(), usar DBSEEK(XFILIAL()) para os arquivos de dados do sistema. O comando DBGOTOP() somente ser utilizado quando da real necessidade de se efetuar uma leitura desde o incio do arquivo independente do tratamento de filial. Como no mesmo arquivo de dados, poderemos ter registros de vrias filiais, desta f orma ficar garantido o posicionamento no primeiro registro da filial corrente. Ao executar um DBSEEK(), verificar se localizou o registro, exemplo: If ! SB1->(dbSeek(xFilial("SB1"))) // No achei o registro Endif Mesmo que seja bvio a existncia do registro, faa o teste pois o programa deve prever que a base de dados no to confivel como deveria, e um alerta ajuda a identificar estes casos. Em casos de relatrios, atentar-se para imprimir a mensagem de forma consciente. Se for executada a funo RECLOCK(cAlias, .F.), para alterao do registro atual, em um arquivo no estado de EOF() (caso falhe um DBSEEK() ) ser abortado o programa e gravado um arquivo texto de nome MSRLOCK.EOF que poder ser usado para averiguaes. O comando SOFTSEEK determina se ser usada uma busca relativa durante um procura e m um banco de

dados. Se este comando estiver em ON, e for utilizada uma funo DBSEEK(), e nenhuma correspondncia for encontrada, o ponteiro de registro ficar no prximo registro do ndice que possua um valor mais alto que a expresso utilizada nesta funo. Este comando dever ser utilizado com a mxima ate no, pois caso esteja ligado, poder localizar um registro errado. Quanto ao comando DO WHILE no esquecer de incluir a condio referente filial, quando esta leitura for de registros de uma filial). Exemplo : dbSelectArea("SB1") dbSeek(xFilial("SB1")) Do While ! Eof() .And. B1_FILIAL == xFilial("SB1") ----------------------- Page 59----------------------// Processamento dbSkip() Enddo Ao criar uma funo que ir desposicionar registros, use a funo GETAREA() e (), para voltar tudo posio original. Exemplo: Dbselectarea("SD1") aAreasd1 := Getarea() // Armazena o ambiente do arquivo SD1 SD1->(dbsetorder(3)) SD1->(dbseek(xfilial("SD1") + DTOS("01/03/01"), .T.)) Do While ! Eof() .And. D1_FILIAL == xfilial("SD1") .And. DTOS(D1_EMISSAO) <= DTOS(mv_par02) // Processamento Dbskip() Enddo Restarea(aAreasd1) // Restaura o ambiente do arquivo SD1 Funo Posicione Podemos tambm buscar uma informao em determinado campo usando apenas uma funo. Sintaxe: Posicione(cAlias, nOrdem, cChave, cCampo) Exemplo: Posicione("SB1", 1, xFilial("SB1") + cCodigo, "B1_DESC") RESTAREA

Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave da busca xFilial("S B1") + cCodigo e ser retornado o contedo do campo "B1_DESC". Note que esta funo, no restaura a posio original do arquivo alvo (no caso SB1). necessrio colocar a FILIAL do arquivo na a exista na chave do indice. Funo Existcpo Retorna se determinada chave existe ou no no arquivo. Sintaxe : ExistCpo(cAlias,cChave,nOrdem) Exemplo : ExistCpo("SB1", 1, cCodigo, "B1_DESC") Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave cChave. E ser retorn ado se a chave foi encontrada ou no (.T. ou ,F,). Neste caso no necessrio passar a filial. Ela ser inserida automaticamente na chave de pesquisa pela funo. Restaurando ndice e limpando filtros ----------------------- Page 60----------------------Nos relatrios devemos analisar que a funo SetPrint, possibilita efetuar filtros , escolha da ordem e gerao em disco ou impressora , no final dos programas de relatrio devemos restaurar a ordem original do arquivos e limpar o filtro e desativar a impressora. //Trmino do relatorio dbSelectArea("SRA") Set Filter to dbSetOrder(1) Set Device To Screen If aReturn[5] = 1 Set Printer To Commit ourspool(wnrel) Endif MS_FLUSH() chave passada como parmetro, caso el

Outros Cuidados Um dos cuidados que devemos ter quando da criao de relatrios contendo valores a utilizao dos subtotais e totais, a fim de evitar erros que podem ser desastrosos durante uma tomada de deciso errada devido a valores errados. A utilizao de somatrias deve ser bastante cometermos o erro de misturarmos unidades de medidas diferentes no mesmo clculo. Confrontando relatrios e consultas Quando elaboramos um sistema, existem geram dados para outros relatrios e consultas. muitos relatrios que criteriosa a fim de no

Devemos tomar cuidado para que no aconteam divergncias de informaes de um para o outr o, como por exemplo, no caso de valores. Um bom exemplo disso, a rotina de impresso de folha de pagamento. Este relatrio ex ibe informaes que so utilizadas em outros relatrios, tais como, valores para o FGTS, guia de rec olhimento de impostos. Uma soluo para que no se ocorra uma divergncia de valores, seria utilizar uma nica fu no ou rotina de processamento. Isto evitaria que ao se alterar o sistema , por motivo de lei ou outro qualquer, o programador alterasse por exemplo s rotinas de relatrio de folha de pagamento e guia de impostos e esquecesse de alterar por exemplo rotina de relatrio de FGTS. Exemplos como Saldos Bancrios, Quantidades de Estoques, Valores de Faturamento, e ntre outros, devem ser confrontados entre relatrios e consultas para no gerarem informaes errneas ao cli ente. Normalmente estes problemas ocorrem em funes de critrios de filtragens diferenciado s entre eles. Para evitar este tipo de problema fundamental que o analista ao efetuar alguma manuteno em algum relatrio ou consulta atente-se ao fato de assegurar que esta alterao no influencie o utras situaes. Este um tipo de no conformidade simples de ser evitada e que pode causar p roblemas srios para os usurios alm de ser de dificil argumentao quando nos questionado, pois evidencia falta de ateno ou critrio na manuteo ou falta de conhecimento sobre o funcionamento do sistema. ----------------------- Page 61----------------------Problemas com Looping de Programas O Protheus utiliza a tecnologia Cliente/Servidor. que o aplicativo no mais executado Isto significa

individualmente em cada mquina, ele ser executado no servidor do aplicativo. At a verso 4.07 um programa travado significava que apenas a estao estava comprometida (o exe cutvel estava na memria da estao). Com o Protheus, todo o processamento est no Server e quando o programa e st em looping estaremos gradativamente usando todo a CPU do Server e consequen temente parando todo o processamento. Se ao desenvolvermos uma rotina e a mesma entrar em looping (tiver apenas uma en trada e no tiver uma sada do processamento), este processamento utilizar todos os r ecursos do servidor comprometendo (reduzindo drasticamente a performance do aplicativo), ou at impedindo, o uso do aplicativo por todos os demais usurios. Se isso acontecer em uma empresa onde existem apenas 5 usurios , o administrador da rede poder reiniciar o servidor, porm onde existe um nmero considervel de usurios poder haver um prejuzo para a empresa que utiliza nosso sistema. Exemplo: dbSeek(xFilial(SE1)+DTOS(dDtIni)) Do While SE1->(!Eof()) <---------- Falta um DbSkip() Enddo No exemplo acima, a rotina ficar em looping (pois falta um comando de sada da roti na, um DbSkip() seria o mais apropriado), utilizando todos os recursos de processamento do servidor, f azendo com que o mesmo pare de funcionar. Outro exemplo: aCampos := {} Do while .T. Aadd(aCampos, Teste) Enddo No exemplo acima o caso ainda mais crtico, pois alm utilizar todo o recurso de processamento do servidor, em dado momento haver uma queda do aplicativo, devido a limitao da varivel tipo Array, criada acima. E quando este limite for ultrapassado, o sistema ser interrompido a bruptamente e todos os demais usurios ficaro impossibilitados de utilizarem o sistema.

Manipulao de Arquivos Externos ao Protheus A manipulao de arquivos considerados externos ao Protheus dever ter um tratamento diferenciado. O arquivos a serem manipulados (alterados/consultados) devero ser copiados do Clien t para o Server e viceversa utilizando uma conexo (TPC-IP,IPX,etc). Para copiar os arqu ivos, foram criadas duas funes que sero executadas via conexo, a CPYS2T() encarregada de copiar do Server para o Client/Terminal e a CPYT2S() encarregada de copiar do Client/Terminal para o Server. O editor de texto Word da Microsoft, os arquivos de imagens (BMP,JPEG,etc) exige m um lugar fsico para abertura dos documentos/imagens, navegando pela Internet por exempl o so copiados via conexo para um diretrio temporrio no computador para serem visualizados. O AP5 trabalha da mesma forma, atravs dessas consideraes e utilizando a arquitetura Client/Server via conexo os arquivos sero copiados. Em alguns Mdulos do Protheus so encontradas rotinas de Impor tao/Exportao de lanamentos, exigindo serem utilizadas as funes CPYT2S() e CPYS2T() para manipul ao dos arquivos. Por exemplo, uma importao de lanamentos da Folha de Pagamento poder ser feita diretamente do Client sem precisar copiar para o Server mas se outro usurio precisar vis ualizar os lanamentos de origem da importao no ter acesso, agora se for realizado a cpia do Client para o Server todos p odero visualizar ----------------------- Page 62----------------------(aconselhvel). Isso acontece no Mdulo de Controle de Documentos , quando todos os arquivos (documentos) so copiados entre o Client e o Server para que todos visualizem e ma nipulem. Um exemplo que no h necessidade de cpia so os arquivos gerados para contabi lizao (CPROVA), pois estes so gerados no prprio Server no havendo necessidade de cpia. Os arquivos que podero ser copiados devero estar necessariamente embaixo do RootPa th na configurao do Server, isto , o diretrio DOCS do exemplo abaixo dever ser sub-diretrio do RootPa th. Exemplo de cpia do Server para o Client: CPYS2T("\DOCS\EXEMPLO.DOC,"C:\WINDOWS\TEMP",.T.) Onde os parmetros so: 1o. o <Nome do Arquivo> a ser copiado para o Client 2o. o <Nome do Diretrio> do Client e/ou local fsico onde ser copiado o arquivo. 3o. se deseja compactar o arquivo (recomendvel)

Exemplo de cpia do Client para o Server: CPYT2S("C:\WINDOWS\TEMP\EXEMPLO.DOC,"\DOCS",.T.) Onde os parmetros so: 1o. o <Nome do Arquivo> a ser copiado para o Server 2o. o <Nome do Diretrio> do Server 3o. se deseja compactar o arquivo (recomendvel) As funes possuem um retorno True(.T.) ou False(.F.) indicando se zada com sucesso ou no. Desenvolvendo Telas A aparncia e objetividade das telas num sistema base fundamental da interface Sis tema x Usurio. O AP5 j cria, automaticamente, a grande parte das telas de um mdulo, tais como a B rowse, a GetDados e Enchoice. a cpia foi reali

Algumas outras telas necessitam de construo manual, ou seja, com a utilizao de comand s, tais como SAY , GET e LABEL, na Dialog. Procure sempre colocar em tela as informaes que mais se objetivam com o assunto a bordado. Sempre que possvel, d preferncia aos campos obrigatrios primeiro. Isso facilita a di gitao do usurio, que no precisar passar de campo em campo (no caso de estar utilizando a tecla <TAB >) at chegar ao campo desejado. A ordem dos campos tambm importante para a fcil localizao das inform aes. Quando o volume de informaes muito grande, divida os campos em folders, ou seja, p astas, agrupando os campos em assuntos. Isso ir deixar a tela menos poluda e evitar que o usurio navegue por uma tela s. Para fazer essa facilidade, preencha o campo X3_FOLDER, no SX3, com um nmero, a grupando-os de acordo com a tipo de informao e no SXA, com o ALIAS do arquivo em pauta, a ordem, que equivale ao numero informado no X3_FOLDER e a descrio nos trs idiomas. Essa descrio que ser a nformao contida na pasta do folder. Exemplo: Os campos SZ1_ENDER, SZ1_NUM e SZ1_BAIR RO devem estar com o campo X3_FOLDER preenchido com o contedo 1. No SXA, o XA_ALIAS dever ser SZ1, o XA_ ORDEM = 1 (mesmo valor preenchido no X3_FOLDER), no XA_DESCRIC, Endereo Residencial e, nos demais, o mesmo texto em outros idiomas. O Folder, alm de agrupar e facilitar a procura pelos campos, evita a rolagem vert ical da tela, facilitando a visualizao das informaes.

----------------------- Page 63----------------------Evite tela com muitos botes. Isso poder confundir o usurio e induzi-lo ao erro. Uti lize telas sequenciais, conhecidas como Wizard (semelhante aos de instalao de um software). Dessa forma, o usurio ficar mais atento aos fatos, dificultando o erro. Mas cuidado: no faa disso uma incansvel sequn cia de telas, pois isso acabar desmotivando o usurio a utilizar o sistema. Enfim, as telas devem ser limpas e objetivas, de tal forma que impea o usurio de s air de seu objetivo final. Todo curioso ir apertar todos os botes da tela ou preencher todos os campos com qualquer tipo de informao. Portanto, esteja atento a tamanho dos labels, para que os mesmos no exced am o tamanho da caixa de dilogo definida. Isso, alm de no ser esttico, prejudica o entendimento da i nformao. Salvando Arrays padres Quando temos Janelas que necessitem apresentar mais de uma getdados , devemos salvar os elementos, acols, aheader e n, da tela anterior para apresentar uma nova janela. As principais variveis so: Acols = Array contendo as linhas usada que sero apresentadas na Getdados AHeader = Array contendo o cabeo das colunas da Getdados N a = Varivel publica que indica Linha que est sendo editada na a posio do atual no acols (

Getdados) Para salva-las podemos: aColsAnt := aClone(Acols) aHeaderAnt := aClone(aHeader) nElemAnt := n E para restaura-las: aCols := aClone(aColsAnt) aHeader := aClone(aHeaderAnt) n := nElemAnt Pontos de Entrada Dentro dos processos operacionais dos programas possvel criar s que possibilitam a execuo de processos distintos a partir de uma rotina do sistema. abertura

Objetivo dos Pontos de Entrada Deixar o sistema flexivl , pois isso permite uma grande vari edade de desenvolvimento pelos nossos analistas de suporte de acordo com a necessidade de cada tipo de cliente/implant ao. Permitir que o sistema seja o mais abrangente possvel de acordo com cada tipo de segmento de negcio. Quando criar um Ponto de Entrada O ponto de entrada tem resultado quando permite que um processo possa ser modifi cado, desde que ele no seja crtico para o sistema. ----------------------- Page 64----------------------Exemplo: Montagem das parcelas de pagamento de um pedido Ele til em processos que podem ser diferentes de acordo cada empresa ou estratgia adotada. Ex: Relatrio de Pedido, Cadastro de Clientes Sintaxe para criar um Ponto de Entrada: Function TMKA010() Local lRetorno := .F. com o tipo de negcio de

Local LTMKMCL := Existblock("TMKMCl") // O Existblock detecta se existe uma funo no repositrio do AP5 com esse PE. If lTMKMCL lRetorno := Execblock(TMKMCI,.F.,F.,{aValor}) // aValor um array que seria recebido pelo usuario em PARAMIXB Endif Return( lRetorno ) Procedimentos para sua criao Avaliar com critrio a criao do Ponto de Entrada, pois importante localiza-lo num ponto que seja til, no redudante e que realmente d condies de atender ao solicitante. O Ponto de entrada no uma ferramenta de correo de eventuais falha do sistema e s im para ajudar no desenvolvimento de negcios especficos. Documentar no QUARK com nome,momento no qual o momento em que ele disparado, parametros que ele envia,retorno esperado (se houver) e o que ele executa com o retorno.

Contabilizando A contabilizao de registros em um sistema ERP necessrio toda vez que houverem operaoes envolvendo valores na empresa, como por exemplo, a emisso de uma nota fisc al, um recebimento de dinheiro, um pagamento na folha, entre outros. Para quem est programando fundamental que este conceito esteja bastante sidime ntado. Para se definir a contabilizao em qualquer rotina deve-se : Definir os lanamentos padronizados que sero utilizados para a rotina (cada mdulo ou famlia de mdulo possui uma sequencia lgica) Preparar o programa para efetuar as atualizaes e a contabili zao. Este detalhe muito importante pois o lanamento padro uma frmula e o posic ionamento dos registros fundamental. Exemplo : Na rotina de exclusao de nota fiscal deve-se executar a contabilizao antes do comando dbDelete(). A chamada do tratgicamente correto, teoricamente a ar a contabilizao e depois efetuar lanamento contbil deve estar em um lugar es pois ltima coisa a ser feita na rotina. No aconselhvel execut outros comandos. para que seja criado um ar

Existem trs funes que devero ser utilizadas, quivo texto, contendo as informaes a serem contabilizadas. ----------------------- Page 65-----------------------

Como temos 2 sistemas contbeis (SIGACON e SIGACTB) com procedimentos diferenciados programamos de forma identica para ambos porm internamente as rotinas efetuam comandos diferentes. Os comandos para a contabilizao so : A Funo HeadProva Este funo da para os mdulos SIGACON e SIGACTB. Sintaxe: nHdlPrv := HeadProva(cLoteAtf, cNomProg, Substr(cUsuario,7,6), @arquivo, .T.) Onde: NHdlPrv -> Varivel que conter o num. (Handle) do arquivo (.LAN) criado. cLoteAtf -> Cdigo do lote do mdulo (Ex.: Ativo Fixo: 8866) cria o cabealho da

contabilizao. tratada de forma diferenci

cNomProg -> Nome do Programa (Ex.: ATFA060) cUsuario -> Usurio arquivo: nome do arquivo (Ex.: cArquivo := ) A funo DetProva() Em primeiro lugar, deve-se estar posicionado no registro, que contm o valo r ser contabilizado Sintaxe: ExpN1 := DetProva(ExpN2,ExpC1,ExpC2,ExpC3) ExpN1 ExpN2 ExpC1 ExpC2 ExpC3 -> Valor Total da Contabilizao -> Handle retornado da funo anterior -> Cdigo do Lanamento Padro -> Nome da rotina Geradora -> Lanamento Padro

A funo RodaProva() Esta funo ir cria a finalizao da contabilizao. Sintaxe: RodaProva(ExpN1, ExpN2) ExpN1 -> Handle retornado da funo anterior ExpN2 -> Valor Total da contabililizao

No Final, ou seja, aps todos registros serem processados utilizar a funo CA100INCL(), cujo objetivo ler o arquivo gerado (.LAN), e gerar os lanamentos no arquivo SI2 (Laname ntos contbeis). Exemplo: CA100Incl( cArquivo, nHdlPrv, nOpcx, cLoteContabil, lDigita, lAglut, cOnLine, dD ata) Onde: ----------------------- Page 66----------------------cArquivo -> Nome do arquivo nHdlPrv -> Numero do Header nOpcx -> Numero da Opcao escolhida cLoteContabil -> Numero do Lote lDigita -> Se Mostra ou nao lAglut -> Se Aglutina ou no

cOnLine -> Determina se sera On Line ou pelo cProva Atuali zando SX (ATUSX) O ATUSX uma ferramenta muito importante utilizada na manuteno dos arquivos customizadores internos: os arquivos SXs . nos arquivos SX que esto armazenadas todas as informaes padres necessrias para a criao de bases das empresas e efetuar possveis customizaes. Em uma atualizao de verso, o sistema ir fazer uma compati bilizao de dados com os arquivos j existentes e os atualizar com base nos SXs. Ao desenvolver uma rotina que exige um novo campo, por exemplo, este dever ser criado no ATUSX, caso con trrio gerar uma no conformidade comprometendo todo o trabalho da atualizao e o bom andamento do trabalho. Todo os campos, perguntas, ndices, parmetros novos devero estar no ATUSX , pois estes so os padres do Protheus. aqui tambm que cadastramos os HELPs de campo e de programas, c riamos os menus do sistema e onde disponibilizamos informaes para serem traduzidas para outros pases. Exemplo de atualizao no SX: Criao de ndice no Cadastro de Funcionrios- Suponhamos que s eja necessrio um ndice por Data de Admisso. Neste caso utilizaremos o SINDEX , onde devero ser al imentados basicamente o Alias (SRA), a ordem , a chave de indexao (RA_ADMISSA) e sua descr io em Portugus. As descries referentes s outras lnguas devero ficar a cargo do departamento de tradues. Numa at ualizao de verso, o sistema enxergar a existncia deste ndice pelo SINDEX e o disponibilizar para utilizao. Ao final da manuteno dos arquivos SXs, abre-se uma janela onde deve ser docu mentado todas as alteraes efetuadas da forma mais clara e precisa possvel. Esta documentao de extrema importncia para que se tenha um controle dos arquivos customizadores padres e garantem um perfeito funcionamento do Protheus. SX1 - Parmetros Genricos Esta tabela contm as perguntas, a ltima resposta utilizada para processamento, impresso de relatrios , etc. os valores armazenados e

Todos os processamentos ou relatrios que tenham a opo de parametrizao, devero tilizar a funo Pergunte para carregar os valores dos parmetros e/ou apr esentar na tela as perguntas relacionadas.

Como o usurio pode no utilizar a opo de parametrizao, devemos sempre carregar s variveis MV_PARXX com os valores default ou com as ltimas respostas aplicadas, para evitar erros de comparao de variveis. SX2 - Mapeamento dos arquivos Armazena os Paths dos arquivos possibilitando que estes possam ser distri budos em diversos drives ou diretrios. ----------------------- Page 67----------------------SX3 - Dicionrio de Dados Armazena informaes referentes s definies de todos os campos tem no Protheus. SX5 - Tabelas Genricas Armazena tabelas genricas utilizadas em todo sistema. SX6 - Parmetros Elemento chave para a ermina diferentes resultados dependendo do seu contedo. SX7 Gatilhos Rotina ou operao que disparada a partir de um evento get. SXE/SXF - Seqncia. de documentos Armazena sequencias alfanumricas que devero ser controladas por um semforo. Um exemplo clssico seria a numerao de pedidos de venda, em que vrios usuri os poderiam estar utilizando o mesmo nmero de pedido. SINDEX- Arquivo de ndices Armazena todos os ndices padres. Comandos Definidos pelo Usurio (UDCs) Este recurso cria novas e infinitas possibilidades para modificar a manei ra pela qual escrevemos o cdigo de uma funo e a maneira pela qual podemos resolver problemas comple xos. Ele ajuda a facilitar a manuteno do cdigo, e a implementao de normas. Estes comandos so traduzidos, analisados e modificados antes que o compilador comece a trabalhar para gerar um arquivo objeto. O responsvel por esta traduo o pr-processado r que um tradutor inteligente que atua antes da gerao do cdigo objeto. Em sua maioria, isto se resume a encontrar os comandos execuo de um processamento, que det que exis

no cdigo fonte e traduzi-los para instrues e funes equivalentes que se acham no corpo da funo ou contedo de arquivos .CH (arquivos de cabealho). Este tipo de arquivo (.CH), contm diversos comandos que se ro utilizados por todas as funes que contenham a instruo include em seu cdigo. Estes mesmos comandos poderiam estar embutidos na funo, mas para facilitar a manuteno, um nico arquivo .CH, pode ser includo (comando include) em vrias funes ao mesmo t empo. No h a necessidade de colocar o comando include em cada funo. Uma nica meno ao .CH no arquiv o .PR?, servir ao propsito de todas as funes nele embutidas. Estes comandos so diretivas do pr-processador e comeam sempre com o caracter # diretamente sua frente e devem estar escritos em caracteres tipo caixa alta. Os mais utilizados no Protheus so: #DEFINE #IFDEF, ou #IFNDEF #ELSE ----------------------- Page 68----------------------#ENDIF #INCLUDE Cada um destes comandos pode ser colocado em qualquer parte do arqui vo fonte, que ser lido pelo pr-processador. No entanto, para facilitar a visualizao da exi stncia destes comandos e manuteno da funo, estes comandos devem ser colocados no incio do fonte. O pr-processador substituir, cada ocorrncia da constante no fonte, ser substituda pela expresso ou valor, que estiver contida diretamente frente da mesma. A exemplo de sintaxe e cdigo fonte para este comando : #DEFINE #DEFINE _TESC _LESC 27 lastkey()

if _nLastkey == _TESC RETURN Endif if _LESC == _TESC RETURN Endif

Esta diretiva muito til quando temos um valor constante vrias vezes repetid o dentro do cdigo fonte, que poder ser alterado com freqncia no decorrer da vida til da funo. #IFDEF ou #IFNDEF <instrues> #ELSE <outras instrues> #ENDIF <CONSTANTE>

Esta diretiva do pr-processador permite que voc prepare aplicaes para compilao condicional, ou em outras palavras, se a <constante>, definida anteriormente via diretiva DEFINE ou pelo Protheus foi definida (IFDEF), as <instrues> sero incorporadas ao cdigo objeto e as <outras instr ues>, sero desprezadas. Mas se a <constante> no foi definida <IFNDEF> as <instrues> sero incorp oradas e as <outras instrues> sero desprezadas. #INCLUDE <ARQUIVO> Uma instruo INCLUDE diz ao pr-processador para inserir o contedo de outro arquivo em um local determinado dentro da funo. Este arquivo especificado, deve focalizar outra s instrues do prprocessador que possam ser comuns a diversos mdulos da rotina. Uso de Strings Para que o sistema possa ser utilizado em outros pases com lnguas diferentes ao invs de inserirmos diretamente os textos no fonte do relatrio utilizamos o recurso de str ings, onde atravs de um include acessaremos o texto em trs lnguas diferentes (Portugus, Espanho l e Ingls) dependendo da forma da compilao. convencionado que o nome do include do fonte do relatrio para que a manuteno deste relatrio seja o mais simples possvel. Exemplo: ----------------------- Page 69----------------------Relatrio -> FABR001.PRW Include -> FABR001.CH ndices a A utilizao de ndices para a fim de evitar lentido ou pesquisa deve ser bem analisada seja o mesmo nome

processamentos redundantes nos relatrios. Os ndices ajudam a otimizar as essamentos, por isto no devem ser subtilizados ou utilizados de forma errnea. pesquisas e laos de proc

Caso a necessidade do relatrio exija uma otimizao que no possvel obter com os ndices padres do sistema possvel criar ndices temporrios atravs da funo Indregua torn assim os relatrios mais geis e bem estruturados. Criando e Deletando Arquivos de trabalho (Temporrios) Quando criamos um arquivo de trabalho ou um ndice de trabalho (utilizando a funo Indregua) no final do programa devemos apaga-los. Para criao de um ndice cArqNtx de Trabalho (Temporrio) com Indregua:

:= CriaTrab( NIL, .F. ) //Criando Arquivo

IndRegua( "SRA", cArqNtx, cIndCond, , cFor, STR0039 ) //Selec.registros..." Para deletar este ndice de trabalho no final do processamento: DbSelectArea( SRA ) //Selecionando a area DbSetOrder( 1 ) //Posicionando na ordem de origem fErase( cArqNtx + OrdBagExt() ) //Deletando arquivo de trabalho Caso o programa que crie um arquivo de trabalho e no o apague no final de seu processamento, este ficar ocupando espao em disco no ambiente de trabalho. Isto poder gerar proble mas futuros para o cliente. Por isto, fundamental, que aps sua utilizao o mesmo seja descartado. Utilizando Querys no Protheus Podemos utilizar querys no Protheus quando acessamos bancos de dados via TopConnect. As querys, quando bem construdas, melhoram enormemente a eficincia ( velocidade ) das consultas aos dados e reduzem a sobrecarga no servidor de aplicao, TopConnect e Ba nco de Dados. Normalmente uma query utilizada em substituio a um Loop ( While ) na base de dados de programao convencional. Querys mais complexas utilizando joins poder ser construdas com a mesma funo de vrios loops. Dicas Importantes - DBF versus SQL

A princpio no existem diferenas na programao para a verso SQL, j que pelo pr fato de ser uma linguagem interpretada, o sistema quem se encarrega de executar os comandos e funes

adequadamente no ambiente em que trabalha. Mas importante manter algumas informaes em mente ao programar para o ambiente SQL. Deve-se lembrar que estamos trabalhando com um banco de da dos relacional, que se utiliza de tabelas ao invs de arquivos, e onde o sistema no tem acesso aos dados de forma nat iva e sim atravs do Top Connect. Essa forma de acesso adiciona ao sistema algu mas das caractersticas e vantagens ----------------------- Page 70----------------------oferecidas pelo SGBD em uso (por exemplo, o Oracle, MSSQL Se rver ou o DB2) como por exemplo segurana e integridade referencial, e as imensas facilidades da linguagem SQL, ma s por outro lado temse tambm as implicaes da converso dos comandos no padro xBase para a perfeita compree nso no ambiente SQL.

Imagine a montagem de uma expresso de filtro para um n dice condicional. Tome a seguinte expresso como exemplo: "DTOS(E1_VENCTO) >= DTOS(mv_par01)". Em um ambiente padro xBase, como o NTX ou o ADS, pode-se utilizar variveis sem qualquer problema em uma expre sso de filtro pois a mesma ser avaliada registro a registro durante a montagem do ndice. Mas no ambie nte SQL, o filtro nada mais do que uma tabela temporria, onde esto selecionados apenas os registros conforme a condio indicada. A seleo de dados em tabelas pelo SQL mais rpida, mas em compensao BD no tem como reconhecer a varivel informada na expresso. Ela ex iste apenas no sistema ou, mais especificamente, no seu programa. Por isso, deve-se substituir a expresso anterio rmente exemplificada pela seguinte (que tambm funcionaria perfeitamente em um ambiente xBase): "DTOS( E1_VENCTO) >= "+DTOS(mv_par01)+"". Esta expresso melhor que anterior simplesmente po rque no se utilizada varivel e sim do contedo da mesma, o que pode ser compreendido em qualquer ambient e. Toda essas explicaes so vlidas, da mesma maneira, a filtros criados atravs do comando SET FILTER . Ainda existem outros detalhes a se considerar quando se trab alha com ndices em um ambiente SQL. que na verdade no existem ndices condicionais nesse ambiente. O filtro criado independente do ndice. Ento, voc pode criar um INDREGUA com um filtro e mudar a ordem, mas o filtro permanecer ativo, em qualquer ordem. Do mesmo modo, no se pode manter, dois ndices, com filtr os diferentes, pois um filtro sobrescreveria o outro. Outro ponto de ateno deve ser a funo xBase chamada DBSET INDEX. Podem ocorrer alguns erros ao tentar-se utilizar essa funo para abrir um ndice de trabalho criado. Por e sses motivos e pelo

fato de tornar o processamento mais lento o uso de ndices de trabalho no ambiente SQL.

deve-se

evitar ao

mximo

Da mesma maneira que a funco DBSETINDEX, os comandos COPY TO e APPEND FRO M tambm devem ter uma ateno especial. No ambiente SQL esses comandos so executados entre um a tabela e um arquivo DBF (e vice-versa) ou entre dois arquivos DBF. Por exemplo, o comand o COPY TO pode ser usado para copiar os dados da tabela ativa para um DBF local e o comando APPEND FROM pode ser usado para importar os dados de um arquivo local para a tabela ativa. Os dois po dem ser usados entre dois arquivos, mas nunca pode-se usar, por exemplo, o comando APPEND FROM para importar os dados de uma tabela para outra. Conceito de Filial e Compartilhamento de Arquivos O Sistema permite a criao de vrias Filiais para uma mesma empresa cadastrad a, de modo que Filiais da mesma empresa compartilhem ou no as mesmas informaes como Cadastro de Produtos, Clientes, etc. Este tratamento feito internamente atravs dos campo XX_FILIAL obedecendo a seguinte regra: Arquivos Compartilhados Quando o arquivo est configurado para trabalhar no modo compartilhado (X2 _MODO = C), este campo ser gravado com ( espaos ). Deste modo o registro ficara disponvel para todas as Filiais. Arquivos Exclusivos Quando o arquivo esta configurado para trabalhar no modo exclus ivo ( X2_MODO= E ), esta campo ser gravado com o cdigo da Filial Atual. Deste modo o registro focara disponivel apenas para a Filial que o gravo u. ----------------------- Page 71----------------------Para que o registro realmente fique disponvel ou no para suas respectivas Filiais , TODAS as rotinas que manilpulam registros diretamente na base de dados dever verificar a Filial atravs da Funo xFilial() , alem disto a maioria dos ndices possuem o campo FILIAL na chave : Sintaxe : XFILIAL(EXPC1) onde, tornar ExpC1 = Alias do arquivo

A funo xFilial() verifica se o arquivo exclusivo ou compartilhado e ira re se o arquivo

for Compartilhado e o cdigo da Filial se o arquivo for exclusivo . Por exemplo : Para executar um dbSeek no arquivo de clientes : DbSelectArea(SA1) DbSeek(xFilial(SA1)+cCodCli+cLoja) ndice do SA1 : A1_FILIAL+A1_COD+A1_LOJA Ou um processamento no arquivo : Do while !EOF() .AND. XX_FILIAL xFilial(01)

Sendo o campo FILIAL parte da chave de Todos os ndices do sistema, este p rocedimento garante que a utilizao dos registros ser exclusiva da Filial que criou os mesmos no caso do arquivo ser Exclusivo, ou disponvel para todas as Filiais quando o mesmo estiver configurado como Compartilhado. Jamais use um campo filial de uma tabela para executar um dbSeek() em ou tra tabela. Pois uma tabela poder ser compartillhada (campo filial em branco), enquanto que a outra poder ser compartilhada (campo filial preenchido). A do, e empresa a varivel cFilAnt contm a filial varivel cEmpant contm a e a filial que o usurio est operan

Tcnicas para Filtragem

Nos sistemas Microsiga, a filtragem dos dados em ambien te Code Base os DBFs feita de maneira geral pela Funo INDREGUA(Params,) , o que de forma geral no impede o uso de instrues como SET FILTER TO, DBSETFILTER(), DBFILTER() ou qualquer outro comando de sintaxe xBase. A INDREGUA() uma funo interna que rene vrios atrativos e facilidades para o seu uso, entre elas a possibilidade de se indexar e filtrar os registros atravs dos parmetros fornecidos, ela tambm preferencialmente usada para que o cdigo fique mais limpo e de fcil interpretao pois dentro de sua estrutura rene uma srie de comandos de indexao e filtragem que agiliza o processo de criao de ndices e filtros em arquivos de trabalho com menos linhas de cdigo, vejamos o Exem plo : Chaves Primrias Sua funo garantir unicidade. Em toda relao, por definio, em-se uma ou mais chaves candidatas. Dessas chaves, uma ser primria e se houver mais de uma na relao, essas o utras sero

definidas como chave alternada. Chaves Estrangeiras um atributo cuja funo permitir relacionamento. Em uma tabela na qual o atributo chave externa ou estrangeira, em outra, o atributo deve ser chave primria, e os valores dos campos so necessrios. ----------------------- Page 72----------------------Integridade Referencial Todos os valores da chave estrangeira tem, obrigatoriament e, que ter valor correspondente na chave primria que se relaciona; mas nem todos os valores encontrados na chave pri mria, precisam ter seus correspondentes na chave estrangeira que se relaciona. Por exemplo, na tabe la de clientes, o campo A1_COD (cdigo do cliente), vai estar relacionado com outra tabela que indica q uais so os pedidos de venda colocados. Desta forma, nem todos os clientes precisam ter pedidos de venda colocados; mas, necessariamente, todos os pedidos de venda precisam de um cliente. Como o PROTHEUS foi projetado para o ambiente SQL, onde a integridade re ferencial das tabelas definida no prprio banco de dados atravs de regras internas, devemos tomar algumas precaues com esse tpico: Verificar a integridade da coluna em todas as tabelas relacionadas: no po de-se alterar o tamanho do cdigo do cliente em apenas uma tabela, caso esse cdigo seja alterado deve-se ve rificar as tabelas de cabecalho e itens das notas fiscais, de titulos a pagar e receber, etc. O sistem a conta com o recurso de grupos de tabelas relacionadas, que permite alterar o tamanho de diversas colunas de uma vez s , garantindo a integridade das colunas Verificar a integridade dos cadastros com todas as tabel as relacionadas: no pode -se excluir o cdigo do cliente se existe um pedido de vendas em aberto para esse cliente, devese verificar todas as tabelas relacionadas antes de atualizar a base de dados.Alm disso na incluso de cadastros devemos utilizar as funes existchav e existcpo para garantir que as informaes de chave no sej am repetidas e que o acesso a tabelas externas seja validado de maneira consistente. Verificar a atualizao da informao em todas as tabelas rela cionadas: a integridade no se resume a validaes de cadastros e tamanho de colunas, deve-se garantir no ato do de senvolvimento que TODOS os pontos relacionados ao tpico envolvido sejam analisados e se necessrio atualizados. Por exemplo, se ser atualizado o saldo em estoque de determinado produto NO DEVE-SE at ualizar somente

arquivo de saldos em estoque, deve-se avaliar se o produto utiliza rastreabilidade para nesse caso atualizar o arquivo de saldos por lote, deve-se avaliar se o produto utiliza controle de localizao fisica para nesse caso atualizar o arquivo de saldos por localizao, etc. Deve-se fazer um estudo antes de qualquer alterao em atualizao de base de dados. Utilizando Rotinas Automticas A cada dia estamos criando rotinas com interface automtica para melhorar a entrada de dados via outros equipamentos, tais como coletores de dados, interface de outros softwares , etc. Porm, para nossa prpria portabilidade e utilizao de rotinas padronizadas, temos adotado o prprio prog rama standard, contudo sem interferencia do usurio (digitador). Para tal, cria mos um mecanismo onde todos os programas que necessitem desta regra devem ser capazes de inserir dados de forma a utomtica. Abaixo mostraremos como proceder : Tome como exemplo o MATA250.PRX . O vetor aRotAuto passado para o progra ma citado. Se este vetor contiver elementos, significa que ser utilizada a Rotina Automti ca. Este vetor deve, quando da utilizao das rotinas automticas, conter os dados mnimos necessrios para a atualizao arquivos. Veja a estrutura do vetor a ser enviado para a rotina automtica. ARotAuto := { cCampo, Contedo, Validao} Onde CCampo -> o campo a ser atualizado, Contedo -> o contedo que cCampo vai receber Validao -> a validao que cCampo vai receber.

Observao: A Validao pode ser uma funo ou um valor NIL. Se for NIL, as val em utilizadas para o respectivo campo sero as existentes no SX3. Se as validaes no fo rem as do SX3, elas devem ser passadas numa funo. ----------------------- Page 73----------------------Exemplo, ARotAuto := { { "D3_TM" ,"001" ,NIL } , ; { "D3_COD" ,padr("10100",15) ,NIL } , ; { "D3_UM" ,"UN" ,NIL } , ; { "D3_QUANT" ,1 ,NIL } , ;

{ "D3_OP" ,"00000401001" ,NIL } , ; { "D3_LOCAL" ,"01" ,NIL } , ; { "D3_EMISSAO" ,dDataBase ,NIL } }

Para o processo de incluso simples, sem getdados, a varivel padro a ser util izada nos programas chama-se aRotAuto, e para processo de incluso com cabealho e itens, as variveis a s erem utilizadas so: aAutoCab para o cabealho, e aAutoItens para os itens da getdados. Para uma incluso simples, tomar como . Para uma incluso com cabealho e tem, tomar como exemplo o CONA050.PRX. (TTS) O que Tratando-se de Banco de Dados, toda e qualquer operao de incluso, alterao o u excluso de registro armazenada primeiramente na rea de LOG, garantindo assim que ao fazer a incluso de uma linha (registro) seja garantida a incluso completa de todas as colunas (campos). Caso no seja possvel a incluso da linha completa ele executa um procedimento chamado de ROLLBACK, ou sej a, ignora todo o registro. Quando usar Quando temos uma operao em Banco de Dados que necessite que vrias incluses, a lteraes ou excluses s sejam efetuadas quando todas as operaes tenham sido realizadas com sucess o, garantindo com isso que no seja atualizada parcialmente uma tabela ou que atualize uma tabel a e no atualize outra tabela relacionada. Como usar Para definir uma transao, deve-se utilizar os comandos BEG IN TRANSACTION e END TRANSACTION para definir inicio e fim de uma transao respectivamente. Todas inform aes serem gravadas no Banco devem estar dentro de uma nica transao sejam elas provenientes de uma ou vrias tabelas. Deve-ser evitar utilizar laos (WHILE, FOR) dentro de uma transao, pois a rea de LOG do banco limitada, e se o volume de informaes ultrapassarem este limite, ocasionar o travame nto do banco de dados. O tamanho da transao deve-ser ser conhecido pelo programdor. Em suma, pa ra exemplificar, devemos controlar a transao de uma nota e no de um conjunto ilimitado de notas. Onde no usar exemplo o MATA250.PRX

Controle de Transao

O controle de transao jamais dever ser utilizado durante processo que envolv am interface (telas com entrada de dados). O controle deve-se resumir apenas ao processo de gravao. En tre um incio de transao (Begin Transaction) e um final (End Transaction) Todos os registros a s erem gravados ficam locados at o final da transao. Caso tenhamos uma tela aps o BEGIN e antes do END depe deremos ----------------------- Page 74----------------------do usurio para efetuar a aria enormes problemas para usurio. liberao o da transao, fato este que caus

Outro lugar que no deve-se ter o controle de transao refere-se a rotinas de reprocessamentos ou reclculos, onde as informaes podem ser regerados durante este processo ou onde p ossamos ter um grande nmero de locks. BEGIN TRANSACTION ExpN1 :=FuncGrava() END TRANSACTION Caso exista uma transao dentro de uma outra a segunda er automaticamente ignorada, fechando-se a transao principal quando da chamada do comando END TRANSACTION. Co ntrole de Semforo O controle de Semaforo permite que o sistema controle a Numerao Automtica de Docume ntos On Line. Temos basicamente 3 funes que gerenciam o controle do mesmo. So elas : GETSXENUM( EXPC1) -> Obtem o nmero sequencial do alias especificado no parmetro. ROLLBACKSXE -> Descarta o nmero quando o usurio cancela a operao (o numero no aproveitado). pendente do semforo. usado s

CONFIRMSXE -> Confirma o nmero sugerido. Esta funo deve ser chamada quando da confi rmao da gravao do registro. MAYIUSE -> Checa fisicamente se um determinado arquivo poder conter o nmero sequencial. Obs : A funo GETX8NUM executa a prpria GETSXENUM. Atualizao do SourceSafe arquivo existe. O

A atualizao do Source Safe a ltima, e mais crtica, etap a do processo de alterao dos programas. Para que ela seja feita com a mxima segurana algumas etapas devem ser observadas. A seguir:

Aps as alteraes ser necessria uma anlise meticulosa de tudo o que foi alterado para avaliar qual o impacto que estas podero causar no programa em que foram executadas e nos programas correlacionados; Devero ser efetuados o maior nmero de testes onde devero ser previstos o maior nmero de situaes possveis e provveis. Os testes devero ser simulados em ba se equivalente instalada no cliente e para as novas verses, em uma nova base que poder ser gerada atravs do ATU SX; Feita a anlise, os testes e antes de atualizar definitivamente o Source Sa fe o programa alterado dever ser comparado com o constante no Source Safe para verificar se as alteraes fo ram realmente feitas no programa que foi reservado e, s ento o programa poder ser Baixado. Aps a Baixa, e para garantir que o atualizao do Source Safe foi f eita corretamente, o programa atualizado dever ser novamente comparado. E claro que se todas as etapas anteriores, principalmente a 1 e 2 , foram cumpridas essa no passar de uma medida de segurana. Procedimentos de Loc alizaes ----------------------- Page 75----------------------A Microsiga atua hoje em 13 pases e isto faz com que praticamente todas as alteraes executadas no sistema reflitam em todos os pases (exceto quando no for necessrio tal procedime nto). Procedimentos a serem cumpridos em alterao / desenvolvimento de programas : A fim de evitar os inconvenientes citados no ponto anterior, existem proc edimentos que devem ser adotados no nosso dia a dia e repassado para aqueles funcionrios que se acoplam a nossa equipe. Estes so (entre parntesis os problemas que seriam reduzidos usando os procedimentos) : Quando includo um novo STR em um CH, ou criado um novo CH, ou modificado um STR em um CH j existente, este deve ser replicado em PORTUGUS para os demais idiomas e automaticamente deve ser encaminha um e-mail para traducoes@microsiga. com.br indicando a verso, o STR e o CH que foi alterado. um Quando criado um campo novo, j existente, os campos que ou modificado o contedo de

devem refletir esta alterao nos demais idiomas devem ser deixados em bra nco, assim como o pessoal de tradues identifica os campos que devem ser traduzidos. Isto valido para todos os arquivos do dicionrio de dados. Quando criado ou alterado um novo HELP (de campo ou de programa) deve ser informado de imediato para tradues para proceder a traduo para os outros idiomas. Para PUTMV, atualizar um parmetro deve ser sempre usada a funo NUNCA DEVE SER PREENCHIDO NEM POSICIONADO POR FORA. Esta funo atualiza nos trs idiomas.

Quando criado um campo novo similar a outros j existentes no sistema, deve se analisar se este deve ser replicado com caractersticas diferentes para tod os os paises localizados, ou se as caractersticas devem ser igual independentemente da localizao. Na falta de critrio ou informao, deve ser informado ao setor de localizaes. Quando criado um campo novo de uso exclusivo de Brasil (E1_INSS por exemplo) deve ser informada a equipe de localizaes para configurar este campo (uso, brows e, etc.) de acordo com os demais paises. Quando for modificada a caracterstica de um campo do sistem este estiver replicado para o resto dos pases, as alteraes devem ser replicadas em t odos os paises. Na dvida da aplicabilidade da alterao nos outros paises, deve ser informada a equipe de localizaes. a e

Os novos campos tipo COMBO, devem ser criados com numerao e no com siglas (1 p ara sim e 2 para no, ao invs de S para sim e N para no). Esta alterao o incluso de e ser informada de imediato para a equipe de tradues. Quando for criado um novo parmetro, ou modificado o contedo default de um j ex istente, esta modificao deve ser aplicada nas 3 lnguas. Quando houve a possibilidade de pegar um STR do dicionrio (funo RETTITLE() ), este deve ser pego, o que evita ter que criar vrios STR e tratar mos com a varivel cPaisLoc dentro do programa. Exemplo CGC, NOTA FISCAL, CEP, etc. No deve ser usada a acentuao Quando criadas novas perguntas no SX1, ou modificadas as existentes, e o X1 _GSC for igual a C, deve ser informado de imediato para tradues, pois os campos das opes do co mbo, quando vazias, geram erro fatal na execuo.

Programando com Schedule de Relatrios Como o sistema permite que a emisso de relatrios possa ser programada (schedule) fundamental que se utilize as rotinas padres para a emisso dos mesmo. O controle do schedule feito ----------------------- Page 76----------------------pela funo SetPrint. Sendo assim, no suportado interface com dat a entry durante o processo de relatrio, visto que isto inviabilizar a utilizao do mesmo. A no ser em relatrios especficos e que sejam inviveis a utilizao de shedule (ex. Impresso de Cheques) est e procedimento dever ser adotado corretamente. Caso exista alguma entrada de dados que assumida qualquer valor apenas no schedule deve-se adotar o seguinte procedimento : Usar a (Verdadeiro) schedule. varivel __cInternet, que estamos no processo de se seja possvel ser

estiver

com

valor

.T.

Modelo 1 Este modelo de programa exibe um Browse vertical de campos presentes no d icionrio de dados. Genericamente as validaes so herdadas do prprio dicionrio de dados. /*/ +--------------------------------------------------------------------------+ + Funcao FINA010 Autor Wagner Xavier Data 28/04/92 +-----------+----------+-------+-----------------------+-----+-------------+ Descricao Programa de atualizacao de Naturezas +-----------+--------------------------------------------------------------+ Sintaxe FINA010() +-----------+--------------------------------------------------------------+ Uso Generico +--------------------------------------------------------------------------+ ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL +-----------+--------+------+----------------------------------------------+ Programador Data ------------------+ BOPS Motivo da Alteracao

+-----------+--------+------+-----------------------------

+-----------+--------+------+----------------------------------------------+ ----------------------- Page 77----------------------/*/ #INCLUDE "FINA010.CH" #INCLUDE "PROTHEUS.CH" FUNCTION FINA010 /*/ +----------------------------------------------------------------+ Define Array contendo as Rotinas a executar do programa + ----------- Elementos contidos por dimensao -----------+ 1. Nome a aparecer no cabecalho + 2. Nome da Rotina associada + 3. Usado pela rotina + 4. Tipo de Transacao a ser efetuada + 1 - Pesquisa e Posiciona em um Banco de Dados + 2 - Simplesmente Mostra os Campos + 3 - Inclui registros no Bancos de Dados + 4 - Altera o registro corrente + 5 - Remove o registro corrente do Banco de Dados + +----------------------------------------------------------------+ /*/ PRIVATE aRotina := { { OemToAnsi(STR0001) ,"AxPesqui", 0 , 1},; //"Pesquisa r" { OemToAnsi(STR0002) ,"AxVisual", 0 , 2},; //"Visualiz ar" { OemToAnsi(STR0003) ,"AxInclui", 0 , 3},; //"Incluir" { OemToAnsi(STR0004) ,"AxAltera", 0 , 4},; //"Alterar"

{ OemToAnsi(STR0005) ,"FA010Del", 0 , 5, 3} } //"Excluir" +----------------------------------------------------------------+ Define o cabecalho da tela de atualizacoes +----------------------------------------------------------------+ PRIVATE cCadastro := OemToAnsi(STR0006) //"Atualizacao de Naturezas" +----------------------------------------------------------------+ Endereca funcao Mbrowse +----------------------------------------------------------------+ mBrowse( 6, 1,22,75,"SED") Return /*/ +------------+---------+-------+-----------------------+------+----------+ Funcao FA010DEL Autor Wagner Xavier Data 8/04/92 +------------+---------+-------+-----------------------+------+----------+ Descricao Programa de exclusao de Naturezas +------------+-----------------------------------------------------------+ Sintaxe A010Deleta(ExpC1,ExpN1,ExpN2) +------------+-----------------------------------------------------------+ Parametros ExpC1 = Alias do arquivo ExpN1 = Numero do registro ExpN2 = Numero da opcao selecionada +------------+-----------------------------------------------------------+ Uso FINA010 +------------+-----------------------------------------------------------+ /*/ FUNCTION FA010DEL(cAlias,nReg,nOpc) Local aAC := { OemToAnsi(STR0007),OemToAnsi(STR0008) } //"Abandona"###"Confirma

" Local bCampo Local lDeleta := .T. Local oDlg Local nCont Local nOpca +----------------------------------------------------------------+ Monta a entrada de dados do arquivo +----------------------------------------------------------------+ Private aTELA[0][0],aGETS[0] +----------------------------------------------------------------+ Verifica se o arquivo esta realmente vazio ou se esta posicionado em outra filial +----------------------------------------------------------------+ If EOF() .or. SED->ED_FILIAL != xFilial("SED") HELP(" " , 1 , "ARQVAZIO") Return Nil ----------------------- Page 78----------------------Endif While .T. +----------------------------------------------------------------+ Envia para processamento dos Gets +----------------------------------------------------------------+ dbSelectArea( cAlias ) bCampo := { nCPO Field(nCPO) } FOR nCont := 1 TO FCount() M->&(EVAL(bCampo,nCont)) := FieldGet(nCont) NEXT nCont nOpca := 1 DEFINE MSDIALOG oDlg TITLE cCadastro FROM 9,0 TO 28,80 OF oMainWnd EnChoice( cAlias, nReg, nOpc, ,"AC",OemToAnsi(STR0009) ) //"Quanto a exclu sao?" ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg, { nOpca := 2,oDlg:End() },; { nOpca := 1,oDlg:End()}) DbSelectArea(cAlias) dbSelectArea(cAlias) IF nOpcA == 2 +----------------------------------------------------------------+ Antes de deletar, verificar se existe movimentacao +----------------------------------------------------------------+ dbSelectArea("SE1") dbSetOrder(3) IF (dbSeek(cFilial+SED->ED_CODIGO)) Help(" ",1,"A010NAODEL") lDeleta := .F. MsUnlock() Else dbSelectArea("SE2") dbSetOrder(2) IF (dbSeek(cFilial+SED->ED_CODIGO)) Help(" ",1,"A010NAODEL") lDeleta := .F. MsUnlock( ) Else dbSelectArea("SE5")

dbSetOrder(4) IF (dbSeek(cFilial+SED->ED_CODIGO)) Help(" ",1,"A010NAODEL") lDeleta := .F. MsUnlock( ) Endif Endif Endif If lDeleta +---------------------------------------------------------------+ Inicio da Protecao via TTS +---------------------------------------------------------------+ BEGIN TRANSACTION dbSelectArea(cAlias) RecLock(cAlias,.F.,.T.) dbDelete() END TRANSACTION +---------------------------------------------------------------+ Final da protecao via TTS +---------------------------------------------------------------+ Endif Else MsUnlock( ) Endif Exit Enddo dbSelectArea("SE1") dbSetOrder(1) dbSelectArea("SE2") ----------------------- Page 79----------------------dbSetOrder(1) dbSelectArea("SE5") dbSetOrder(1) dbSelectArea(cAlias) RETURN Modelo 2 Este modelo de programa exibe um cabealho com informaes pr-determinadas, um Browse h orizontal central (dependente do dicionrio de dados) e um rodap com variveis de memria que so a tualizadas de acordo com os valores preenchidos no Browse horizontal. As validaes do cabealho so pr-determinadas no programa-fonte. daes do browse horizontal so genericamente herdadas do dicionrio de dados. /*/ +---------------------------------------------------------------------------+ + Funcao CTBA120 Autor Pilar S. Albaladejo Data 24/

J as val

07/00 +-----------+----------+-------+-----------------------+------+-------------+ Descricao Cadastro de Criterios de Rateio Externo +-----------+---------------------------------------------------------------+ ----------------------- Page 80----------------------Sintaxe CTBA120() +-----------+---------------------------------------------------------------+ Uso Generico +---------------------------------------------------------------------------+ ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL +-----------+--------+------+-----------------------------------------------+ Programador Data BOPS Motivo da Alteracao +-----------+--------+------+-----------------------------------------------+ +-----------+--------+------+-----------------------------------------------+ /*/ #INCLUDE "CTBA120.CH" #INCLUDE "PROTHEUS.CH" #INCLUDE "FONT.CH" FUNCTION CTBA120() /*/ +----------------------------------------------------------------+ Define Array contendo as Rotinas a executar do programa + ----------- Elementos contidos por dimensao -----------+ 1. Nome a aparecer no cabecalho + 2. Nome da Rotina associada + 3. Usado pela rotina + 4. Tipo de Transacao a ser efetuada + 1 - Pesquisa e Posiciona em um Banco de Dados + 2 - Simplesmente Mostra os Campos + 3 - Inclui registros no Bancos de Dados + 4 - Altera o registro corrente + 5 - Remove o registro corrente do Banco de Dados + +----------------------------------------------------------------+ /*/ PRIVATE aRotina := { { OemToAnsi(STR0001),"AxPesqui", 0 , 1},; //"Pesquisar" { OemToAnsi(STR0002),"Ctb120Cad", 0 , 2},; //"Visualizar " { OemToAnsi(STR0003),"Ctb120Cad", 0 , 3},; //"Incluir" { OemToAnsi(STR0004),"Ctb120Cad", 0 , 4},; //"Alterar" { OemToAnsi(STR0005),"Ctb120Cad", 0 , 5} } //"Excluir" +----------------------------------------------------------------+ Define o cabecalho da tela de atualizacoes +----------------------------------------------------------------+ Private cCadastro := OemToAnsi(STR0006) //"Criterios de Rateio +----------------------------------------------------------------+ Endereca funcao Mbrowse +----------------------------------------------------------------+ mBrowse( 6, 1,22,75,"CTJ" ) Return /*/ +------------+---------+-------+-----------------------+------+----------+ Funcao CTB120CAD Autor Pilar S. Albaladejo Data 24/07/00 +------------+---------+-------+-----------------------+------+----------+ Descricao Cadastro de Rateio Externo +------------+-----------------------------------------------------------+ Sintaxe Ctb120Cad(ExpC1,ExpN1,ExpN2)

+------------+-----------------------------------------------------------+ Parametros ExpC1 = Alias do arquivo ExpN1 = Numero do registro ExpN2 = Numero da opcao selecionada +------------+-----------------------------------------------------------+ Uso CTBA120 +------------+-----------------------------------------------------------+ /*/ Function Ctb120Cad(cAlias,nReg,nOpc) Local aSaveArea := GetArea() Local aCampos := {} Local aAltera := {} Local aTpSald := CTBCBOX("CTJ_TPSALD") Local cArq Local cRateio ----------------------- Page 81----------------------Local cDescRat lOCAL cMoedaLc Local cTpSald Local nOpca := 0 Local oGetDb Local oDlg Local oFnt Local oTpSald Private aTela := {} Private aGets := {} Private aHeader := {} Private nTotalD := 0 Private nTotalC := 0 +----------------------------------------------------------------+ Monta aHeader para uso com MSGETDB +----------------------------------------------------------------+ aCampos := Ctb120Head(@aAltera) +----------------------------------------------------------------+ Cria arquivo Temporario para uso com MSGETDB +----------------------------------------------------------------+ Ctb120Cri(aCampos,@cArq) +----------------------------------------------------------------+ Carrega dados para MSGETDB +----------------------------------------------------------------+ Ctb120Carr(nOpc) If nOpc == 3 // Inclusao cRateio := CriaVar("CTJ_RATEIO") // Numero do Rateio cDescRat := CriaVar("CTJ_DESC") // Descricao do Rateio cMoedaLC := CriaVar("CTJ_MOEDLC") // Moeda do Lancamento cTpSald := CriaVar("CTJ_TPSALD") // Tipo do Saldo Else // Visualizacao / Alteracao / Exclusao cRateio := CTJ->CTJ_RATEIO cDescRat := CTJ->CTJ_DESC cMoedaLC := CTJ->CTJ_MOEDLC cTpSald := CTJ->CTJ_TPSALD EndIf +----------------------------------------------------------------+ Monta Tela Modelo 2 +----------------------------------------------------------------+ DEFINE MSDIALOG oDlg TITLE OemToAnsi(STR0006) From 9,0 To 32,80 OF oMainWnd //" Rateios Externos"

DEFINE FONT oFnt NAME "Arial" Size 10,15 @ 18, 007 SAY OemToAnsi(STR0007) PIXEL //"Rateio: " @ 18, 037 MSGET cRateio Picture "9999" SIZE 020,08 When (nOpc == 3); Valid Ctb120Rat(cRateio) OF oDlg PIXEL @ 18, 090 Say OemToAnsi(STR0008) PIXEL //"Descricao: " @ 18, 120 MSGET cDescRat Picture "@!" SIZE 140,08 When (nOpc == 3 .Or. ; nOpc == 4) Valid !Empty(cDescRat) OF oDlg PIXEL @ 33, 007 Say OemToAnsi(STR0009) PIXEL // "Moeda:" @ 32, 037 MSGET cMoedaLc Picture "@!" F3 "CTO" SIZE 020,08 When (nOpc == 3 .Or.; nOpc == 4) Valid Ct120Moed(cMoedaLC) Of oDlg PIXEL @ 33, 090 SAY OemToAnsi(STR0010) PIXEL // "Saldo:" @ 32, 120 MSCOMBOBOX oTpSald VAR cTpSald ITEMS aTpSald When (nOpc == 3 .Or. ; nOpc == 4) SIZE 45,08 OF oDlg PIXEL Valid (!Empty(cTpSald) .And.; CtbTpSald(@cTpSald,aTpSald)) +----------------------------------------------------------------+ Chamada da MSGETDB +----------------------------------------------------------------+ oGetDB := MSGetDB():New(044, 005, 120, 315, Iif(nOpc==3,4,nOpc),"CTB120LOK",; "CTB120TOk", "+CTJ_SEQUEN",.t.,aAltera,,.t.,,"TMP") +----------------------------------------------------------------+ Validacao da janela +----------------------------------------------------------------+ ----------------------- Page 82----------------------ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,; { nOpca:=1,if(Ctb120TOK(),oDlg:End(),nOpca := 0)},; { nOpca:=2,oDlg:End()}) VALID nOpca != 0 IF nOpcA == 1 // Aceita operacao e grava dados Begin Transaction Ctb120Gra(cRateio,cDescRat,nOpc,cMoedaLC,cTpSald) End Transaction ENDIF dbSelectArea(cAlias) +----------------------------------------------------------------+ Apaga arquivo temporario gerado para MSGETDB +----------------------------------------------------------------+ DbSelectArea( "TMP" ) DbCloseArea() If Select("cArq") = 0 FErase(cArq+GetDBExtension()) EndIf dbSelectArea("CTJ") dbSetOrder(1) Return nOpca /*/ +------------+---------+-------+-----------------------+------+----------+ Funcao CTB120RAT Autor Pilar S. Albaladejo Data 24/07/00 +------------+---------+-------+-----------------------+------+----------+ Descricao Verifica existencia do Rateio +------------+-----------------------------------------------------------+ Sintaxe Ctb120Rat(ExpC1) +------------+-----------------------------------------------------------+ Parametros ExpC1 = Numero do Rateio +------------+-----------------------------------------------------------+ Retorno .T./.F.

+------------+-----------------------------------------------------------+ Uso CTBA120 +------------+-----------------------------------------------------------+ /*/ Function Ctb120Rat(cRateio) Local aSaveArea:= GetArea() Local lRet := .T. Local nReg If Empty(cRateio) lRet := .F. Else dbSelectArea("CTJ") dbSetOrder(1) nReg := Recno() If dbSeek(xFilial()+cRateio) Help(" ",1,"CTJNRATEIO") lRet := .F. EndIf dbGoto(nReg) EndIf RestArea(aSaveArea) Return lRet /*/ +------------+---------+-------+-----------------------+------+----------+ Funcao CTB120GRA Autor Pilar S. Albaladejo Data 24/07/00 +------------+---------+-------+-----------------------+------+----------+ Descricao Grava resgistro digitados +------------+-----------------------------------------------------------+ Sintaxe Ctb120Gra(ExpC1,ExpC2,ExpN1,cExpC3,cExpC4) +------------+-----------------------------------------------------------+ Parametros ExpC1 = Numero do Rateio ExpC2 = Descricao do Rateio ExpN1 = Opcao do Menu (Inclusao / Alteracao etc) ExpC3 = Moeda do Rateio ----------------------- Page 83----------------------ExpC4 = Tipo de Saldo +------------+-----------------------------------------------------------+ Retorno Nenhum +------------+-----------------------------------------------------------+ Uso CTBA120 +------------+-----------------------------------------------------------+ Function Ctb120Gra(cRateio,cDescRat,nOpc,cMoedaLC,cTpSald) Local aSaveArea := GetArea() dbSelectArea("TMP") dbgotop() While !Eof() If !TMP->CTJ_FLAG // Item nao deletado na MSGETDB If nOpc == 3 .Or. nOpc == 4 dbSelectArea("CTJ") dbSetOrder(1) If !(dbSeek(xFilial()+cRateio+TMP->CTJ_SEQUEN)) RecLock( "CTJ", .t. ) CTJ->CTJ_FILIAL := xFilial() CTJ->CTJ_RATEIO := cRateio CTJ->CTJ_DESC := cDescRat CTJ->CTJ_MOEDLC := cMoedaLC CTJ->CTJ_TPSALD := cTpSald

Else RecLock( "CTJ", .f. ) CTJ->CTJ_DESC := cDescRat CTJ->CTJ_MOEDLC := cMoedaLC CTJ->CTJ_TPSALD := cTpSald Endif For nCont := 1 To Len(aHeader) If (aHeader[nCont][10] != "V" ) FieldPut(FieldPos(aHeader[nCont][2]),; TMP->(FieldGet(FieldPos(aHeader[nCont][2])))) EndIf Next nCont MsUnLock() Elseif nOpc == 5 // Se for exclusao dbSelectArea("CTJ") dbSetOrder(1) If dbSeek(xFilial()+cRateio+TMP->CTJ_SEQUEN) RecLock("CTJ",.F.,.T.) dbDelete() MsUnlOCK() EndIf EndIf Else // Item deletado na MSGETDB dbSelectArea("CTJ") dbSetOrder(1) If dbSeek(xFilial()+cRateio+TMP->CTJ_SEQUEN) RecLock( "CTJ", .f., .t. ) DbDelete() MsUnlock() Endif EndIf dbSelectArea("TMP") dbSkip() Enddo RestArea(aSaveArea) Return /*/ +------------+---------+-------+-----------------------+------+----------+ Funcao CTB120TOK Autor Pilar S. Albaladejo Data 24/07/00 +------------+---------+-------+-----------------------+------+----------+ Descricao Valida MSGETDB -> Tudo OK +------------+-----------------------------------------------------------+ Sintaxe Ctb120TOK(ExpC1) ----------------------- Page 84----------------------+------------+-----------------------------------------------------------+ Parametros Nenhum +------------+-----------------------------------------------------------+ Retorno Nenhum +------------+-----------------------------------------------------------+ Uso CTBA120 +------------+-----------------------------------------------------------+ /*/ Function Ctb120TOk() Local aSaveArea := GetArea() Local lRet := .T. Local nTotalD := 0 Local nTotalC := 0

dbSelectArea("TMP") dbGotop() While !Eof() If !TMP->CTJ_FLAG If !Ctb120LOK() lRet := .F. Exit EndiF If !Empty(TMP->CTJ_DEBITO) nTotalD += TMP->CTJ_PERCEN EndIf If !Empty(TMP->CTJ_CREDITO) nTotalC += TMP->CTJ_PERCEN EndIf EndIf dbSkip() EndDo nTotalD := Round(nTotalD,2) nTotalC := Round(nTotalC,2) If lRet IF (nTotalD > 0 .And. nTotalD != 100 ).Or. (nTotalC > 0 .And. nTotalC != 1 00) Help(" ",1,"CTJ100%") lRet := .F. EndIF EndIf RestArea(aSaveArea) Return lRet /*/ +------------+---------+-------+-----------------------+------+----------+ Funcao CTB120LOK Autor Pilar S. Albaladejo Data 24/07/00 +------------+---------+-------+-----------------------+------+----------+ Descricao Valida MSGETDB -> LinhaOK +------------+-----------------------------------------------------------+ Sintaxe Ctb120LOK(ExpC1) +------------+-----------------------------------------------------------+ Parametros Nenhum +------------+-----------------------------------------------------------+ Retorno Nenhum +------------+-----------------------------------------------------------+ Uso CTBA120 +------------+-----------------------------------------------------------+ /*/ Function CTB120LOK() Local lRet := .T. Local nCont If !TMP->CTJ_FLAG If Empty(TMP->CTJ_PERCEN) Help(" ",1,"CTJVLZERO") lRet := .F. EndIf If lRet ValidaConta(TMP->CTJ_DEBITO,"1",,,.t.) EndIf ----------------------- Page 85----------------------If lRet ValidaConta(TMP->CTJ_CREDITO,"2",,,.T.) EndIf

EndIf Return lRet /*/ +------------+---------+-------+-----------------------+------+----------+ Funcao CTB120Cri Autor Pilar S. Albaladejo Data 24/07/00 +------------+---------+-------+-----------------------+------+----------+ Descricao Cria Arquivo Temporario para MSGETDB +------------+-----------------------------------------------------------+ Sintaxe Ctb120Cri(ExpA1,ExpC1) +------------+-----------------------------------------------------------+ Parametros ExpA1 = Matriz com campos a serem criados ExpC1 = Nome do arquivo temporario +------------+-----------------------------------------------------------+ Retorno Nenhum +------------+-----------------------------------------------------------+ Uso CTBA120 +------------+-----------------------------------------------------------+ /*/ Function Ctb120Cria(aCampos,cArq) Local cChave Local aSaveArea := GetArea() cChave := "CTJ_SEQUEN" cArq := CriaTrab(aCampos,.t.) dbUseArea(.t.,,cArq,"TMP",.f.,.f.) RestArea(aSaveArea) Return /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao CTB120Head Autor Pilar S. Albaladejo Data 24/07/00 +------------+----------+-------+-----------------------+------+----------+ Descricao Montar aHeader para arquivo temporario da MSGETDB +------------+------------------------------------------------------------+ Sintaxe Ctb120Head(ExpA1) +------------+------------------------------------------------------------+ Parametros ExpA1 = Matriz com campos que podem ser alterados +------------+------------------------------------------------------------+ Retorno ExpA1 = Matriz com campos a serem criados no arq temporario +------------+------------------------------------------------------------+ Uso CTBA120 +------------+------------------------------------------------------------+ /*/ Function Ctb120Head(aAltera) Local aSaveArea:= GetArea() Local aFora := {"CTJ_RATEIO","CTJ_DESC","CTJ_MOEDLC","CTJ_TPSALD","CTJ_VALOR"} Local aCampos := {} Local nCriter := 0 PRIVATE nUsado := 0 // Montagem da matriz aHeader dbSelectArea("SX3") dbSetOrder(1) dbSeek("CTJ") While !EOF() .And. (x3_arquivo == "CTJ") If Alltrim(x3_campo) == "CTJ_SEQUEN" .Or. ; x3Uso(x3_usado) .and. cNivel >= x3_nivel If Ascan(aFora,Trim(X3_CAMPO)) <= 0 nUsado++ AADD(aHeader,{ TRIM(X3Titulo()), x3_campo, x3_picture,; x3_tamanho, x3_decimal, x3_valid,; x3_usado, x3_tipo, "TMP", x3_context } ) If Alltrim(x3_campo) <> "CTJ_SEQUEN"

Aadd(aAltera,Trim(X3_CAMPO)) EndIf EndIF ----------------------- Page 86----------------------EndIF aAdd( aCampos, { SX3->X3_CAMPO, SX3->X3_TIPO, SX3->X3_TAMANHO,; SX3->X3_DECIMAL } ) dbSkip() EndDO Aadd(aCampos,{"CTJ_FLAG","L",1,0}) RestArea(aSaveArea) Return aCampos /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao CTB120Carr Autor Pilar S. Albaladejo Data 24/07/00 +------------+----------+-------+-----------------------+------+----------+ Descricao Carrega dados para MSGETDB +------------+------------------------------------------------------------+ Sintaxe Ctb120Carr(ExpN1) +------------+------------------------------------------------------------+ Parametros ExpN1 = Opcao do Menu -> Inclusao / Alteracao etc +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso CTBA120 +------------+------------------------------------------------------------+ /*/ Function CTB120Carr(nOpc) Local aSaveArea:= GetArea() Local cAlias := "CTJ" Local nPos If nOpc != 3 // Visualizacao / Alteracao / Exclusao cRateio := CTJ->CTJ_RATEIO dbSelectArea("CTJ") dbSetOrder(1) If dbSeek(xFilial()+cRateio) While !Eof() .And. CTJ->CTJ_FILIAL == xFilial() .And.; CTJ->CTJ_RATEIO == cRateio dbSelectArea("TMP") dbAppend() For nCont := 1 To Len(aHeader) nPos := FieldPos(aHeader[nCont][2]) If (aHeader[nCont][08] <> "M" .And. aHeader[nCont][10] <> "V" ) FieldPut(nPos,(cAlias)>(FieldGet(FieldPos(aHeader[nCont][2])))) EndIf Next nCont TMP->CTJ_FLAG := .F. dbSelectArea("CTJ") dbSkip() EndDo EndIf Else dbSelectArea("TMP") dbAppend() For nCont := 1 To Len(aHeader) If (aHeader[nCont][08] <> "M" .And. aHeader[nCont][10] <> "V" )

nPos := FieldPos(aHeader[nCont][2]) FieldPut(nPos,CriaVar(aHeader[nCont][2],.T.)) EndIf Next nCont TMP->CTJ_FLAG := .F. TMP->CTJ_SEQUEN:= "001" EndIf dbSelectArea("TMP") dbGoTop() RestArea(aSaveArea) Return /*/ +------------+---------+-------+-----------------------+------+----------+ ----------------------- Page 87----------------------Funcao 7/00 ---------+ Descricao ---------+ Sintaxe ---------+ Parametros ---------+ Retorno ---------+ Uso CT120Moed Autor Pilar S. Albaladejo Data 24/0

+------------+---------+-------+-----------------------+------+Valida Moeda do Lancamento +------------+-------------------------------------------------Ctb120Moed(ExpC1) +------------+-------------------------------------------------ExpC1 = Moeda a ser validada +------------+-------------------------------------------------.T./.F. +------------+-------------------------------------------------CTBA120

+------------+----------------------------------------------------------+ /*/ Function Ct120MoedLC(cMoeda) Local aCtbMoeda:= {} Local lRet := .T. aCtbMoeda := CtbMoeda(cMoeda) If Empty(aCtbMoeda[1]) Help(" ",1,"NOMOEDA") lRet := .F. Endif Return lRet Modelo 3 Este modelo de programa a juno dos Modelos 1 e 2. Nele exibido um Browse vertical e um Browse horizontal (ambos dependentes do dicionrio de dados). As validaes so genericamente herdadas do dicionrio de dados.

----------------------- Page 88----------------------/*/ +---------------------------------------------------------------------------+ + Funcao FATA010 Autor Eduardo Riera Data 11/01/00 +-----------+----------+-------+-----------------------+------+-------------+ Descricao Cadastro de Processo de Vendas +-----------+---------------------------------------------------------------+ Sintaxe FATA010() +-----------+---------------------------------------------------------------+ Uso Generico +---------------------------------------------------------------------------+ ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL +-----------+--------+------+-----------------------------------------------+ Programador Data BOPS Motivo da Alteracao +-----------+--------+------+-----------------------------------------------+ +-----------+--------+------+-----------------------------------------------+ /*/ #INCLUDE "FATA010.CH" #INCLUDE "FIVEWIN.CH" #DEFINE APOS { 15, 1, 70, 315 } Function Fata010() /*/ +----------------------------------------------------------------+ Define Array contendo as Rotinas a executar do programa + ----------- Elementos contidos por dimensao -----------+ ----------------------- Page 89----------------------Nome a aparecer no cabecalho + Nome da Rotina associada + Usado pela rotina + Tipo de Transacao a ser efetuada + 1 - Pesquisa e Posiciona em um Banco de Dados + 2 - Simplesmente Mostra os Campos + 3 - Inclui registros no Bancos de Dados + 4 - Altera o registro corrente + 5 - Remove o registro corrente do Banco de Dados + +----------------------------------------------------------------+ /*/ PRIVATE cCadastro := OemToAnsi(STR0001) //"Processo de Venda" PRIVATE aRotina := { { OemToAnsi(STR0002),"AxPesqui" ,0,1},; //"Pesquisar" { OemToAnsi(STR0003),"Ft010Visua",0,2},; //"Visual" { OemToAnsi(STR0004),"Ft010Inclu",0,3},; //"Incluir" { OemToAnsi(STR0005),"Ft010Alter",0,4},; //"Alterar" { OemToAnsi(STR0006),"Ft010Exclu",0,5} } //"Exclus ao" If !Empty( Select( "AC9" ) ) AAdd( aRotina, { STR0013,"MsDocument",0,4} ) EndIf mBrowse( 6, 1,22,75,"AC1") Return(.T.) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010Visua Autor Eduardo Riera Data 13.01.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de Tratamento da Visualizacao 1. 2. 3. 4.

+------------+------------------------------------------------------------+ Sintaxe Ft010Visua(ExpC1,ExpN2,ExpN3) +------------+------------------------------------------------------------+ Parametros ExpC1: Alias do arquivo ExpN2: Registro do Arquivo ExpN3: Opcao da MBrowse +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Function Ft010Visua(cAlias,nReg,nOpcx) Local aArea := GetArea() Local oGetDad Local oDlg Local nUsado := 0 Local nCntFor := 0 Local nOpcA := 0 Local lContinua := .T. Local lQuery := .F. Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda" Local cQuery := "" Local cTrab := "AC2" Local bWhile := { .T. } Local aObjects := {} Local aPosObj := {} Local aSizeAut := MsAdvSize() PRIVATE aHEADER := {} PRIVATE aCOLS := {} PRIVATE aGETS := {} PRIVATE aTELA := {} +----------------------------------------------------------------+ Montagem de Variaveis de Memoria +----------------------------------------------------------------+ dbSelectArea("AC1") dbSetOrder(1) ----------------------- Page 90----------------------For nCntFor := 1 To FCount() M->&(FieldName(nCntFor)) := FieldGet(nCntFor) Next nCntFor +----------------------------------------------------------------+ Montagem do aHeader +----------------------------------------------------------------+ dbSelectArea("SX3") dbSetOrder(1) dbSeek("AC2") While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" ) If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL ) nUsado++ Aadd(aHeader,{ TRIM(X3Titulo()),; TRIM(SX3->X3_CAMPO),; SX3->X3_PICTURE,; SX3->X3_TAMANHO,; SX3->X3_DECIMAL,; SX3->X3_VALID,; SX3->X3_USADO,; SX3->X3_TIPO,;

SX3->X3_ARQUIVO,; SX3->X3_CONTEXT } ) EndIf dbSelectArea("SX3") dbSkip() EndDo +----------------------------------------------------------------+ Montagem do aCols +----------------------------------------------------------------+ dbSelectArea("AC2") dbSetOrder(1) #IFDEF TOP If ( TcSrvType()!="AS/400" ) lQuery := .T. cQuery := "SELECT *,R_E_C_N_O_ AC2RECNO " cQuery += "FROM "+RetSqlName("AC2")+" AC2 " cQuery += "WHERE AC2.AC2_FILIAL= "+xFilial("AC2")+" AND " cQuery += "AC2.AC2_PROVEN= "+AC1->AC1_PROVEN+" AND " cQuery += "AC2.D_E_L_E_T_<> * " cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey())) cQuery := ChangeQuery(cQuery) cTrab := "FT010VIS" dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cTrab,.T.,.T.) For nCntFor := 1 To Len(aHeader) TcSetField(cTrab,AllTrim(aHeader[nCntFor][2]),aHeader[nCntFor,8],aH eader[nCnt For,4],aHeader[nCntFor,5]) Next nCntFor Else #ENDIF AC2->(dbSeek(xFilial("AC2")+AC1->AC1_PROVEN)) bWhile := { xFilial("AC2") == AC2->AC2_FILIAL .And.; AC1->AC1_PROVEN == AC2->AC2_PROVEN } #IFDEF TOP EndIf #ENDIF While ( !Eof() .And. Eval(bWhile) ) aadd(aCOLS,Array(nUsado+1)) For nCntFor := 1 To nUsado If ( aHeader[nCntFor][10] != "V" ) aCols[Len(aCols)][nCntFor] := FieldGet(FieldPos(aHeader[nCntF or][2])) Else If ( lQuery ) AC2->(dbGoto((cTrab)->AC2RECNO)) EndIf ----------------------- Page 91----------------------aCols[Len(aCols)][nCntFor] := CriaVar(aHeader[nCntFor][2]) EndIf Next nCntFor aCOLS[Len(aCols)][Len(aHeader)+1] := .F. dbSelectArea(cTrab) dbSkip() EndDo If ( lQuery ) dbSelectArea(cTrab)

dbCloseArea() dbSelectArea(cAlias) EndIf aObjects := {} AAdd( aObjects, { 315, 50, .T., .T. } ) AAdd( aObjects, { 100, 100, .T., .T. } ) aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 } aPosObj := MsObjSize( aInfo, aObjects, .T. ) DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To aSizeAut[6],aSizeAut [5] OF oMainWnd PIXEL EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 ) oGetDad := MSGetDados():New (aPosObj[2,1], aPosObj[2,2], aPosObj[2,3], aPosObj[2 ,4], nOpcx, "Ft010LinOk" ,"AllwaysTrue","",.F.) ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{ oDlg:End()},{ oDlg:End()}) RestArea(aArea) Return(.T.) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010Inclu Autor Eduardo Riera Data 13.01.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de Tratamento da Inclusao +------------+------------------------------------------------------------+ Sintaxe Ft010Inclu(ExpC1,ExpN2,ExpN3) +------------+------------------------------------------------------------+ Parametros ExpC1: Alias do arquivo ExpN2: Registro do Arquivo ExpN3: Opcao da MBrowse +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Function Ft010Inclu(cAlias,nReg,nOpcx) Local aArea := GetArea() Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda" Local oGetDad Local oDlg Local nUsado := 0 Local nCntFor := 0 Local nOpcA := 0 Local aObjects := {} Local aPosObj := {} Local aSizeAut := MsAdvSize() PRIVATE aHEADER := {} PRIVATE aCOLS := {} PRIVATE aGETS := {} PRIVATE aTELA := {} +----------------------------------------------------------------+ Montagem das Variaveis de Memoria +----------------------------------------------------------------+ dbSelectArea("AC1") dbSetOrder(1) For nCntFor := 1 To FCount() M->&(FieldName(nCntFor)) := CriaVar(FieldName(nCntFor)) Next nCntFor +----------------------------------------------------------------+

----------------------- Page 92----------------------Montagem da aHeader +----------------------------------------------------------------+ dbSelectArea("SX3") dbSetOrder(1) dbSeek("AC2") While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" ) If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL ) nUsado++ Aadd(aHeader,{ TRIM(X3Titulo()),; TRIM(SX3->X3_CAMPO),; SX3->X3_PICTURE,; SX3->X3_TAMANHO,; SX3->X3_DECIMAL,; SX3->X3_VALID,; SX3->X3_USADO,; SX3->X3_TIPO,; SX3->X3_ARQUIVO,; SX3->X3_CONTEXT } ) EndIf dbSelectArea("SX3") dbSkip() EndDo +----------------------------------------------------------------+ Montagem da Acols +----------------------------------------------------------------+ aadd(aCOLS,Array(nUsado+1)) For nCntFor := 1 To nUsado aCols[1][nCntFor] := CriaVar(aHeader[nCntFor][2]) Next nCntFor aCOLS[1][Len(aHeader)+1] := .F. aObjects := {} AAdd( aObjects, { 315, 50, .T., .T. } ) AAdd( aObjects, { 100, 100, .T., .T. } ) aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 } aPosObj := MsObjSize( aInfo, aObjects, .T. ) DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To aSizeAut[6],aSizeAut [5] OF oMainWnd PIXEL EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 ) oGetDad := MSGetDados():New(aPosObj[2,1], aPosObj[2,2], aPosObj[2,3], aPosObj[2, 4], nOpcx, "Ft010LinOk", "Ft010TudOk","",.T.) ACTIVATE MSDIALOG oDlg ; ON INIT EnchoiceBar(oDlg, { nOpcA:=If(oGetDad:TudoOk() .And. Obrigatorio(aGets, aTela), 1,0),If(nOpcA==1,oDlg:End(),Nil)},{ oDlg:End()}) If ( nOpcA == 1 ) Begin Transaction Ft010Grv(1) If ( __lSX8 ) ConfirmSX8() EndIf EvalTrigger() End Transaction Else If ( __lSX8 ) RollBackSX8() EndIf

EndIf RestArea(aArea) Return(.T.) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010Alter Autor Eduardo Riera Data 13.01.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de Tratamento da Alteracao +------------+------------------------------------------------------------+ Sintaxe Ft010Alter(ExpC1,ExpN2,ExpN3) +------------+------------------------------------------------------------+ ----------------------- Page 93----------------------ExpC1: Alias do arquivo ExpN2: Registro do Arquivo ExpN3: Opcao da MBrowse +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Function Ft010Alter(cAlias,nReg,nOpcx) Local aArea := GetArea() Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda" Local oGetDad Local oDlg Local nUsado := 0 Local nCntFor := 0 Local nOpcA := 0 Local lContinua := .T. Local cQuery := "" Local cTrab := "AC2" Local bWhile := { .T. } Local aObjects := {} Local aPosObj := {} Local aSizeAut := MsAdvSize() PRIVATE aHEADER := {} PRIVATE aCOLS := {} PRIVATE aGETS := {} PRIVATE aTELA := {} +----------------------------------------------------------------+ Montagem das Variaveis de Memoria +----------------------------------------------------------------+ dbSelectArea("AC1") dbSetOrder(1) lContinua := SoftLock("AC1") If ( lContinua ) For nCntFor := 1 To FCount() M->&(FieldName(nCntFor)) := FieldGet(nCntFor) Next nCntFor +----------------------------------------------------------------+ Montagem da aHeader +----------------------------------------------------------------+ dbSelectArea("SX3") dbSetOrder(1) dbSeek("AC2") While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" ) If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL ) Parametros

nUsado++ Aadd(aHeader,{ TRIM(X3Titulo()),; TRIM(SX3->X3_CAMPO),; SX3->X3_PICTURE,; SX3->X3_TAMANHO,; SX3->X3_DECIMAL,; SX3->X3_VALID,; SX3->X3_USADO,; SX3->X3_TIPO,; SX3->X3_ARQUIVO,; SX3->X3_CONTEXT } ) EndIf dbSelectArea("SX3") dbSkip() EndDo +----------------------------------------------------------------+ Montagem da aCols +----------------------------------------------------------------+ dbSelectArea("AC2") dbSetOrder(1) ----------------------- Page 94----------------------#IFDEF TOP If ( TcSrvType()!="AS/400" ) lQuery := .T. cQuery := "SELECT *,R_E_C_N_O_ AC2RECNO " cQuery += "FROM "+RetSqlName("AC2")+" AC2 " cQuery += "WHERE AC2.AC2_FILIAL= "+xFilial("AC2")+" AND " cQuery += "AC2.AC2_PROVEN= "+AC1->AC1_PROVEN+" AND " cQuery += "AC2.D_E_L_E_T_<> * " cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey())) cQuery := ChangeQuery(cQuery) cTrab := "FT010VIS" dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cTrab,.T.,.T.) For nCntFor := 1 To Len(aHeader) TcSetField(cTrab,AllTrim(aHeader[nCntFor][2]),aHeader[nCntFor ,8],; Header[nCntFor,4],aHeader[nCntFor,5]) Next nCntFor Else #ENDIF AC2->(dbSeek(xFilial("AC2")+AC1->AC1_PROVEN)) bWhile := { xFilial("AC2") == AC2->AC2_FILIAL .And.; AC1->AC1_PROVEN == AC2->AC2_PROVEN } #IFDEF TOP EndIf #ENDIF While ( !Eof() .And. Eval(bWhile) ) aadd(aCOLS,Array(nUsado+1)) For nCntFor := 1 To nUsado If ( aHeader[nCntFor][10] != "V" ) aCols[Len(aCols)][nCntFor] := FieldGet(FieldPos(aHeader[nCntFor][2])) Else If ( lQuery ) AC2->(dbGoto((cTrab)->AC2RECNO)) EndIf aCols[Len(aCols)][nCntFor] := CriaVar(aHeader[nCntFor][

2]) EndIf Next nCntFor aCOLS[Len(aCols)][Len(aHeader)+1] := .F. dbSelectArea(cTrab) dbSkip() EndDo If ( lQuery ) dbSelectArea(cTrab) dbCloseArea() dbSelectArea(cAlias) EndIf EndIf If ( lContinua ) aObjects := {} AAdd( aObjects, { 315, 50, .T., .T. } ) AAdd( aObjects, { 100, 100, .T., .T. } ) aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 } aPosObj := MsObjSize( aInfo, aObjects, .T. ) DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To aSizeAut[6],aS izeAut[5] ; OF MainWnd PIXEL EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 ) oGetDad := MSGetDados():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],nOpcx ,; "Ft010LinOk","Ft010TudOk","",.T.) ACTIVATE MSDIALOG oDlg ; ON INIT EnchoiceBar(oDlg,{ nOpca:=If(oGetDad:TudoOk().And.Obrigatorio(aGets,aTela ),1,0),; If(nOpcA==1,oDlg:End(),Nil)},{ oDlg:End()}) If ( nOpcA == 1 ) ----------------------- Page 95----------------------Begin Transaction Ft010Grv(2) If ( __lSX8 ) ConfirmSX8() EndIf EvalTrigger() End Transaction Else If ( __lSX8 ) RollBackSX8() EndIf EndIf EndIf Endif RestArea(aArea) Return(.T.) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010Exclu Autor Eduardo Riera Data 13.01.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de Tratamento da Exclusao +------------+------------------------------------------------------------+

Sintaxe Ft010Exclu(ExpC1,ExpN2,ExpN3) +------------+------------------------------------------------------------+ Parametros ExpC1: Alias do arquivo ExpN2: Registro do Arquivo ExpN3: Opcao da MBrowse +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Function Ft010Exclu(cAlias,nReg,nOpcx) Local aArea := GetArea() Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda" Local oGetDad Local oDlg Local nUsado := 0 Local nCntFor := 0 Local nOpcA := 0 Local lContinua := .T. Local cQuery := "" Local cTrab := "AC2" Local bWhile := { .T. } Local aObjects := {} Local aPosObj := {} Local aSizeAut := MsAdvSize() PRIVATE aHEADER := {} PRIVATE aCOLS := {} PRIVATE aGETS := {} PRIVATE aTELA := {} +----------------------------------------------------------------+ Montagem das Variaveis de Memoria +----------------------------------------------------------------+ dbSelectArea("AC1") dbSetOrder(1) lContinua := SoftLock("AC1") If ( lContinua ) For nCntFor := 1 To FCount() M->&(FieldName(nCntFor)) := FieldGet(nCntFor) Next nCntFor +----------------------------------------------------------------+ Montagem da aHeader +----------------------------------------------------------------+ dbSelectArea("SX3") ----------------------- Page 96----------------------dbSetOrder(1) dbSeek("AC2") While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" ) If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL ) nUsado++ Aadd(aHeader,{ TRIM(X3Titulo()),; TRIM(SX3->X3_CAMPO),; SX3->X3_PICTURE,; SX3->X3_TAMANHO,; SX3->X3_DECIMAL,; SX3->X3_VALID,; SX3->X3_USADO,; SX3->X3_TIPO,;

SX3->X3_ARQUIVO,; SX3->X3_CONTEXT } ) EndIf dbSelectArea("SX3") dbSkip() EndDo +----------------------------------------------------------------+ Montagek da aCols +----------------------------------------------------------------+ dbSelectArea("AC2") dbSetOrder(1) #IFDEF TOP If ( TcSrvType()!="AS/400" ) lQuery := .T. cQuery := "SELECT *,R_E_C_N_O_ AC2RECNO " cQuery += "FROM "+RetSqlName("AC2")+" AC2 " cQuery += "WHERE AC2.AC2_FILIAL= "+xFilial("AC2")+" AND " cQuery += "AC2.AC2_PROVEN= "+AC1->AC1_PROVEN+" AND " cQuery += "AC2.D_E_L_E_T_<> * " cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey())) cQuery := ChangeQuery(cQuery) cTrab := "FT010VIS" dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cTrab,.T.,.T.) For nCntFor := 1 To Len(aHeader) TcSetField(cTrab,AllTrim(aHeader[nCntFor][2]),aHeader[nCntFor,8],; aHeader[nCntFor,4],aHeader[nCntFor,5]) Next nCntFor Else #ENDIF AC2->(dbSeek(xFilial("AC2")+AC1->AC1_PROVEN)) bWhile := { xFilial("AC2") == AC2->AC2_FILIAL .And.; AC1->AC1_PROVEN == AC2->AC2_PROVEN } #IFDEF TOP EndIf #ENDIF While ( !Eof() .And. Eval(bWhile) ) aadd(aCOLS,Array(nUsado+1)) For nCntFor := 1 To nUsado If ( aHeader[nCntFor][10] != "V" ) aCols[Len(aCols)][nCntFor] := FieldGet(FieldPos(aHeader[nCntFor][2])) Else If ( lQuery ) AC2->(dbGoto((cTrab)->AC2RECNO)) EndIf aCols[Len(aCols)][nCntFor] := CriaVar(aHeader[nCntFor][2]) EndIf Next nCntFor aCOLS[Len(aCols)][Len(aHeader)+1] := .F. dbSelectArea(cTrab) dbSkip() EndDo ----------------------- Page 97----------------------If ( lQuery ) dbSelectArea(cTrab) dbCloseArea() dbSelectArea(cAlias)

EndIf EndIf If ( lContinua ) aObjects := {} AAdd( aObjects, { 315, 50, .T., .T. } ) AAdd( aObjects, { 100, 100, .T., .T. } ) aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 } aPosObj := MsObjSize( aInfo, aObjects, .T. ) DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To ; aSizeAut[6],aSizeAut[5] OF oMainWnd PIXEL EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 ) oGetDad := MSGetDados():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],nOpcx ,; "Ft010LinOk","Ft010TudOk","",.F.) ACTIVATE MSDIALOG oDlg ; ON INIT EnchoiceBar(oDlg,{ nOpca:=If(oGetDad:TudoOk(),1,0),If(nOpcA==1,oDlg:End() ,Nil)},; { oDlg:End()}) If ( nOpcA == 1 ) Begin Transaction If Ft010DelOk() Ft010Grv(3) EvalTrigger() EndIf End Transaction EndIf EndIf RestArea(aArea) Return(.T.) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010LinOK Autor Eduardo Riera Data 13.01.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de Validacao da linha OK +------------+------------------------------------------------------------+ Sintaxe Ft010LinOk() +------------+------------------------------------------------------------+ Parametros Nennhum +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Function Ft010LinOk() Local lRetorno:= .T. Local nPStage := aScan(aHeader,{ x AllTrim(x[2])=="AC2_STAGE"}) Local nPDescri:= aScan(aHeader,{ x AllTrim(x[2])=="AC2_DESCRI"}) Local nCntFor := 0 Local nUsado := Len(aHeader) If ( !aCols[n][nUsado+1] ) +----------------------------------------------------------------+ Verifica os campos obrigatorios +----------------------------------------------------------------+

If ( nPStage == 0 .Or. nPDescri == 0 ) Help(" ",1,"OBRIGAT") lRetorno := .F. EndIf If ( lRetorno .And. (Empty(aCols[n][nPStage]) .Or. Empty(aCols[n][nPDescri ]))) ----------------------- Page 98----------------------Help(" ",1,"OBRIGAT") lRetorno := .F. EndIf +----------------------------------------------------------------+ Verifica se no h estagios repetidos +----------------------------------------------------------------+ If ( nPStage != 0 .And. lRetorno ) For nCntFor := 1 To Len(aCols) If ( nCntFor != n .And. !aCols[nCntFor][nUsado+1]) If ( aCols[n][nPStage] == aCols[nCntFor][nPStage] ) Help(" ",1,"FT010LOK01") lRetorno := .F. EndIf EndIf Next nCntFor EndIf EndIf Return(lRetorno) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010Grv Autor Eduardo Riera Data 13.01.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de Gravacao do Processe de Venda +------------+------------------------------------------------------------+ Sintaxe Ft010Grv(ExpN1) +------------+------------------------------------------------------------+ Parametros ExpN1: Opcao do Menu (Inclusao / Alteracao / Exclusao) +------------+------------------------------------------------------------+ Retorno .T. +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Static Function Ft010Grv(nOpc) Local aArea := GetArea() Local aUsrMemo := If( ExistBlock( "FT010MEM" ), ExecBlock( "FT010MEM", .F.,.F. ), {} ) Local aMemoAC1 := {} Local aMemoAC2 := {} Local aRegistro := {} Local cQuery := "" Local lGravou := .F. Local nCntFor := 0 Local nCntFor2 := 0 Local nUsado := Len(aHeader) Local nPStage := aScan(aHeader,{ x AllTrim(x[2])=="AC2_STAGE"}) Local nPMEMO := aScan(aHeader,{ x AllTrim(x[2])=="AC2_MEMO"}) If ValType( aUsrMemo ) == "A" .And. Len( aUsrMemo ) > 0 For nLoop := 1 to Len( aUsrMemo ) If aUsrMemo[ nLoop, 1 ] == "AC1"

AAdd( aMemoAC1, { aUsrMemo[ nLoop, 2 ], aUsrMemo[ nLoop, 3 ] } ) ElseIf aUsrMemo[ nLoop, 1 ] == "AC2" AAdd( aMemoAC2, { aUsrMemo[ nLoop, 2 ], aUsrMemo[ nLoop, 3 ] } ) EndIf Next nLoop EndIf +----------------------------------------------------------------+ Guarda os registros em um array para atualizacao +----------------------------------------------------------------+ dbSelectArea("AC2") dbSetOrder(1) #IFDEF TOP If ( TcSrvType()!="AS/400" ) cQuery := "SELECT AC2.R_E_C_N_O_ AC2RECNO " ----------------------- Page 99-----------------------

cQuery := ChangeQuery(cQuery) dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),"FT010GRV",.T.,.T.) dbSelectArea("FT010GRV") While ( !Eof() ) aadd(aRegistro,AC2RECNO) dbSelectArea("FT010GRV") dbSkip() EndDo dbSelectArea("FT010GRV") dbCloseArea() dbSelectArea("AC2") Else #ENDIF dbSeek(xFilial("AC2")+M->AC1_PROVEN) While ( !Eof() .And. xFilial("AC2") == AC2->AC2_FILIAL .And.; M->AC1_PROVEN == AC2->AC2_PROVEN ) aadd(aRegistro,AC2->(RecNo())) dbSelectArea("AC2") dbSkip() EndDo #IFDEF TOP EndIf #ENDIF Do Case +----------------------------------------------------------------+ Inclusao / Alteracao +----------------------------------------------------------------+ Case nOpc != 3 For nCntFor := 1 To Len(aCols) If ( nCntFor > Len(aRegistro) ) If ( !aCols[nCntFor][nUsado+1] ) RecLock("AC2",.T.) EndIf

cQuery cQuery cQuery cQuery cQuery

+= "FROM "+RetSqlName("AC2")+" AC2 " += "WHERE AC2.AC2_FILIAL= "+xFilial("AC2")+" AND " += "AC2.AC2_PROVEN= "+M->AC1_PROVEN+" AND " += "AC2.D_E_L_E_T_<> * " += "ORDER BY "+SqlOrder(AC2->(IndexKey()))

Else AC2->(dbGoto(aRegistro[nCntFor])) RecLock("AC2") EndIf If ( !aCols[nCntFor][nUsado+1] ) lGravou := .T. For nCntFor2 := 1 To nUsado If ( aHeader[nCntFor2][10] != "V" ) FieldPut(FieldPos(aHeader[nCntFor2][2]),aCols[nC ntFor][nCn tFor2]) EndIf Next nCntFor2 +---------------------------------------------------------------+ Grava os campos obrigatorios +---------------------------------------------------------------+ AC2->AC2_FILIAL := xFilial("AC2") AC2->AC2_PROVEN := M->AC1_PROVEN If ( nPMemo != 0 .And. !Empty(aCols[nCntFor][nPMemo])) MSMM(AC2>AC2_CODMEM,,,aCols[nCntFor][nPMemo],1,,,"AC2","AC2_COD MEM") EndIf +---------------------------------------------------------------+ Grava os campos memo de usuario +---------------------------------------------------------------+ For nLoop := 1 To Len( aMemoAC2 ) MSMM(AC2->(FieldGet(aMemoAC2[nLoop,1])),,, ; ----------------------- Page 100----------------------DFieldGet( aMemoAC2[nLoop,2], nCntFor ),1,,,"AC2",aMemoAC2[nLoop,1]) Next nLoop Else If ( nCntFor <= Len(aRegistro) ) dbDelete() MSMM(AC2->AC2_CODMEM,,,,2) +--------------------------------------------------------------+ Exclui os campos memo de usuario +--------------------------------------------------------------+ For nLoop := 1 To Len( aMemoAC2 ) MSMM(aMemoAC2[nLoop,1],,,,2) Next nLoop EndIf EndIf MsUnLock()

Next nCntFor +----------------------------------------------------------------+ Exclusao +----------------------------------------------------------------+ OtherWise For nCntFor := 1 To Len(aRegistro) AC2->(dbGoto(aRegistro[nCntFor])) RecLock("AC2") dbDelete() MsUnLock() MSMM(AC2->AC2_CODMEM,,,,2) Next nCntFor If !Empty( Select( "AC9" ) ) +----------------------------------------------------------------+ Exclui a amarracao de conhecimento +----------------------------------------------------------------+ MsDocument( "AC1", AC1->( Recno() ), 2, , 3 ) EndIf EndCase +----------------------------------------------------------------+ Atualizacao do cabecalho +----------------------------------------------------------------+ dbSelectArea("AC1") dbSetOrder(1) If ( MsSeek(xFilial("AC1")+M->AC1_PROVEN) ) RecLock("AC1") Else If ( lGravou ) RecLock("AC1",.T.) EndIf EndIf If ( !lGravou ) dbDelete() MSMM(AC1->AC1_CODMEM,,,,2) +----------------------------------------------------------------+ Exclui os campos memo de usuario +----------------------------------------------------------------+ For nLoop := 1 To Len( aMemoAC1 ) MSMM( AC1->( FieldGet( aMemoAC1[ nLoop, 1 ] ) ),,,,2) Next nLoop Else For nCntFor := 1 To AC1->(FCount()) ----------------------- Page 101----------------------If ( FieldName(nCntFor)!="AC1_FILIAL" ) FieldPut(nCntFor,M->&(FieldName(nCntFor))) Else AC1->AC1_FILIAL := xFilial("AC1") EndIf Next nCntFor MSMM(AC1->AC1_CODMEM,,,M->AC1_MEMO,1,,,"AC1","AC1_CODMEM") +----------------------------------------------------------------+ Grava os campos memo de usuario +----------------------------------------------------------------+ For nLoop := 1 To Len( aMemoAC1 )

MSMM( AC1->( FieldGet( aMemoAC1[nLoop,1] ) ),,,; M->&( aMemoAC1[nLoop,2] ),1,,,"AC1",aMemoAC1[nLoop,1]) Next nLoop EndIf MsUnLock() +----------------------------------------------------------------+ Restaura integridade da rotina +----------------------------------------------------------------+ RestArea(aArea) Return( .T. ) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010TudOK Autor Eduardo Riera Data 13.01.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao TudoOK +------------+------------------------------------------------------------+ Sintaxe Ft010TudOK() +------------+------------------------------------------------------------+ Parametros Nenhum +------------+------------------------------------------------------------+ Retorno .T./.F. +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Function Ft010TudOk() Local lRet := .T. Local nPosRelev := GDFieldPos( "AC2_RELEVA" ) Local nPosStage := GDFieldPos( "AC2_STAGE" ) Local nLoop := 0 Local nTotal := 0 Local nPosDel := Len( aHeader ) + 1 If !Empty( AScan( aCols, { x x[nPosRelev] > 0 } ) ) For nLoop := 1 To Len( aCols ) If !aCols[ nLoop, nPosDel ] nTotal += aCols[ nLoop, nPosRelev ] Else +---------------------------------------------------------------+ Permite excluir apenas se no estiver em uso por oportunidade +---------------------------------------------------------------+ AD1->( dbSetOrder( 5 ) ) If AD1->( dbSeek( xFilial( "AD1" ) + M->AC1_PROVEN + aCols[nLoop,nPosStage] ) ) Aviso( STR0007, STR0011 + AllTrim( aCols[nLoop,nPosStag e] ) + ; STR0012, { STR0009 }, 2 ) ; // Atencao // "A etapa " // " nao pode ser excluida po is esta em uso por uma ou mais // oportunidades !" lRet := .F. Exit EndIf EndIf Next nLoop

----------------------- Page 102----------------------If lRet If nTotal <> 100 Aviso( STR0007, STR0008, ; { STR0009 }, 2 ) //"Atencao !"###"A soma dos valores de relevancia deve ser igual a 100% //!"###"Fechar" lRet := .F. EndIf EndIf EndIf Return( lRet ) /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Ft010DelOk Autor Sergio Silveira Data 18.0 1.2001 ------------+----------+-------+-----------------------+------+----------+ Descricao Validacao da Exclusao +------------+------------------------------------------------------------+ Sintaxe Ft010DelOk() +------------+------------------------------------------------------------+ Parametros Nenhum +------------+------------------------------------------------------------+ Retorno .T./.F. +------------+------------------------------------------------------------+ Uso FATA010 +------------+------------------------------------------------------------+ /*/ Static Function Ft010DelOk() LOCAL lRet := .T. AD1->( dbSetOrder( 5 ) ) If AD1->( dbSeek( xFilial( "AD1" ) + M->AC1_PROVEN ) ) lRet := .F. Aviso( STR0007, STR0010, { STR0009 }, 2 ) // "Atencao" // "Este processo de venda nao pode ser excluido pois esta sendo utiliza do em uma ou mais // oportunidades !", "Fechar" EndIf Return( lRet ) Modelos de Relatrios Existem vrias formas de orma de se elaborar o programa no varia muito. tiliza as funes bsicas gerao de um relatrio. se gerar um relatrio no Abaixo na mostramos um sistema, no entanto a f modelo-padro, que u

/*/ +---------------------------------------------------------------------------+ + Funcao MATR425 Autor Rodrigo de Sartorio Data 11/0 5/95

+-----------+----------+-------+-----------------------+------+-------------+ Descricao Relatorio de Estoque por Lote +-----------+---------------------------------------------------------------+ Sintaxe MATR425() +-----------+---------------------------------------------------------------+ Uso Generico +---------------------------------------------------------------------------+ ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL +-----------+--------+------+-----------------------------------------------+ Programador Data BOPS Motivo da Alteracao +-----------+--------+------+-----------------------------------------------+ +-----------+--------+------+-----------------------------------------------+ ----------------------- Page 103----------------------/*/ #include MATR425.CH #include FIVEWIN.CH Function MATR425() +----------------------------------------------------------------+ Define Variaveis +----------------------------------------------------------------+ Local cDesc1 := STR0001 //"Este programa emitira uma relacao com a posio de " Local cDesc2 := STR0002 //"estoque por Lote/Sub-Lote." Local cDesc3 := Local cString := SB8 Local Titulo := STR0003 //"Posicao de Estoque por Lote/Sub-Lote" Local Tamanho := M Local wnRel := MATR425 +----------------------------------------------------------------+ Variaveis Tipo Private padrao de todos os relatorios +----------------------------------------------------------------+ Private aOrd := {STR0004,STR0005} //" Por Produto"###" Por Lote/Sub-Lote" Private aReturn := {STR0006,1,STR0007, 1, 2, 1, ,1 } //"Zebrado"###"Admini stracao" Private cPerg := MR425A Private nLastKey := 0 Private nTipo := 0 +----------------------------------------------------------------+ Verifica as perguntas selecionadas +----------------------------------------------------------------+ Pergunte( MR425A , .F.) +----------------------------------------------------------------+ Variaveis utilizadas para parametros mv_par01 // Do Produto mv_par02 // Ate Produto mv_par03 // De Lote mv_par04 // Ate Lote mv_par05 // De Sub-Lote mv_par06 // Ate Sub-Lote mv_par07 // De Local

mv_par08 // Ate Local mv_par09 // Lista Saldo Zerado ? Lista/Nao Lista mv_par10 // Do Tipo mv_par11 // Ate o Tipo mv_par12 // Do Grupo mv_par13 // Ate o Grupo +----------------------------------------------------------------+ +----------------------------------------------------------------+ Envia controle para SETPRINT +----------------------------------------------------------------+ wnRel := SetPrint(cString,wnRel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,.F.,aOrd,,Tam anho) nTipo := If(aReturn[4]==1,GetMv( MV_COMP ),GetMv( MV_NORM )) If nLastKey == 27 dbClearFilter() Return Nil Endif SetDefault(aReturn,cString) If nLastKey == 27 dbClearFilter() Return Nil Endif RptStatus({ lEnd C425Imp(@lEnd,wnRel,Tamanho,Titulo)},Titulo) Return Nil /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao C425Imp Autor Rodrigo Sartorio Data 14/11/95 ------------+----------+-------+-----------------------+------+----------+ Descricao Chamada do Relatorio +------------+------------------------------------------------------------+ Uso MATR425 +------------+------------------------------------------------------------+ ----------------------- Page 104----------------------/*/ Static Function C425Imp(lEnd, wnRel, Tamanho, Titulo) +----------------------------------------------------------------+ Variaveis especificas dos relatorios +----------------------------------------------------------------+ Local cIndex := Local cCond := Local cLoteAnt := Local cProdAnt := Local cDescAnt := Local cSLotAnt := Local cAlmoAnt := Local cSeekSB8 := Local cCondSB8 := Local cNomArq := Local cPicSld := PesqPict( SB8 , B8_SALDO , 12) Local cPicEmp := PesqPict( SB8 , B8_EMPENHO , 12) Local dDataAnt := CtoD( / / ) Local dValiAnt := CtoD( / / ) Local nSaldo := 0 Local nEmpenho := 0 Local nSaldoT := 0 Local nEmpenhoT := 0 Local nCntImpr := 0 Local nIndSB8 := 0

Local lSubLote := .F. +----------------------------------------------------------------+ Variaveis utilizadas para Impressao do Cabecalho e Rodape +----------------------------------------------------------------+ Private aLinha := {} Private Cabec1 := Private Cabec2 := Private cBTxt := Space(10) Private cBCont := 0 Private Li := 80 Private M_PAG := 01 //-- Condicao de Filtragem da IndRegua cCond := B8_FILIAL==" +xFilial( SB8 )+ ".And. cCond += B8_PRODUTO>=" +mv_par01+ ".And.B8_PRODUTO<=" +mv_par02+ ".And. cCond += B8_LOTECTL>=" +mv_par03+ ".And.B8_LOTECTL<=" +mv_par04+ ".And. cCond += B8_NUMLOTE>=" +mv_par05+ ".And.B8_NUMLOTE<=" +mv_par06+ ".And. cCond += B8_LOCAL>=" +mv_par07+ ".And.B8_LOCAL<=" +mv_par08+ " If aReturn[8]==1 cIndex := B8_FILIAL+B8_PRODUTO+B8_LOCAL+B8_LOTECTL+B8_NUMLOTE Titulo := STR0008 //"POSICAO DE ESTOQUE POR LOTE/SUBLOTE (POR PRODUTO)" Cabec1 := STR0009 //"PRODUTO DESCRICAO SUB-LOTE LOTE AL SALDO EMPENHO DATA DATA " Cabec2 := STR0014 //" VALIDADE " ElseIf aReturn[8] == 2 cIndex := B8_FILIAL+B8_LOTECTL+B8_NUMLOTE+B8_PRODUTO+B8_LOCAL Titulo := STR0010 //"POSICAO DE ESTOQUE POR LOTE/SUB-LOTE (POR LOTE)" Cabec1 := STR0011 //"SUB-LOTE LOTE PRODUTO DESCRICAO AL SALDO EMPENHO DATA DATA " Cabec2 := STR0014 //" VALIDADE " EndIf +----------------------------------------------------------------+ Pega o nome do arquivo de indice de trabalho +----------------------------------------------------------------+ cNomArq := CriaTrab( , .F.) //-- Seta a Ordem Correta no Arquivo SB1 dbSelectArea( SB1 ) dbSetOrder(1) +----------------------------------------------------------------+ ----------------------- Page 105----------------------Cria Indice de Trabalho +----------------------------------------------------------------+ dbSelectArea( SB8 ) IndRegua( SB8 , cNomArq, cIndex,, cCond, STR0017) //"Selecionando Registros..." #IFNDEF TOP dbSetIndex(cNomArq+OrdBagExt()) #ENDIF dbGoTop() SetRegua(LastRec()) +----------------------------------------------------------------+ Processa o Laco de impressao +----------------------------------------------------------------+ Do While !Eof() +----------------------------------------------------------------+

Cancela a impressao +----------------------------------------------------------------+ If lEnd @ PRow()+1, 001 PSay STR0012 //"CANCELADO PELO OPERADOR" Exit EndIf lSubLote := Rastro(B8_PRODUTO, S ) //-- Define a Quebra por Produto ou Lote If aReturn[8] == 1 cSeekSB8 := B8_FILIAL+B8_PRODUTO+B8_LOCAL cCondSB8 := B8_FILIAL+B8_PRODUTO+B8_LOCAL Else cSeekSB8 := B8_FILIAL+B8_LOTECTL+If(lSubLote,B8_NUMLOTE, )+B8_PRODUTO+B8_LOCAL cCondSB8 := B8_FILIAL+B8_LOTECTL+ +If(lSubLote, B8_NUMLOTE+ , )+ B8_PRODUTO+B := 0 := 0 := 0 := 0

8_LOCAL EndIf nSaldo nEmpenho nSaldoT nEmpenhoT

//-- Processa o Laco da Quebra Do While !Eof() .And. cSeekSB8 == &(cCondSB8) //-- Atualiza a Regua de Impressao IncRegua() +----------------------------------------------------------------+ Cancela a Impressao +----------------------------------------------------------------+ If lEnd @ PRow()+1, 001 PSay STR0012 //"CANCELADO PELO OPERADOR" Exit EndIf //-- Saldo do Lote ou Lote/Sublote nSaldo += B8_SALDO nEmpenho += B8_EMPENHO //-- Saldo Total da Quebra nSaldoT += B8_SALDO nEmpenhoT += B8_EMPENHO //-- Posiciona-se na Descricao Correta do SB1 If !(cProdAnt==B8_PRODUTO) SB1->(dbSeek(xFilial( SB1 )+SB8->B8_PRODUTO, .F.)) EndIf If SB1->B1_TIPO < mv_par10 .Or. SB1->B1_TIPO > mv_par11 dbSkip() Loop ----------------------- Page 106----------------------EndIf

If SB1->B1_GRUPO < mv_par12 .Or. SB1->B1_GRUPO > mv_par13 dbSkip() Loop EndIf //-- Salva Dados do Registro Atual / Passa para o Proximo Registro cProdAnt := B8_PRODUTO cDescAnt := SubS(SB1->B1_DESC,1,30) cSLotAnt := If(lSubLote,B8_NUMLOTE,Space(Len(B8_NUMLOTE))) cLoteAnt := B8_LOTECTL cAlmoAnt := B8_LOCAL dDataAnt := B8_DATA dValiAnt := B8_DTVALID dbSkip() //-- Imprime Saldo do Lote ou Lote/Sublote If !(cSeekSB8==&(cCondSB8)) .Or. lSubLote .Or. !(cLoteAnt==B8_LOTEC TL) //-- Verifica se Lista Saldo Zerado If mv_par09==2 .And. QtdComp(nSaldo)==QtdComp(0) Loop EndIf If Li > 58 Cabec(Titulo,Cabec1,Cabec2,wnRel,Tamanho,nTipo) EndIf nCntImpr ++ If aReturn[8] == 1 @ Li, 000 PSay cProdAnt @ Li, 016 PSay cDescAnt @ Li, 047 PSay cSLotAnt @ Li, 054 PSay cLoteAnt ElseIf aReturn[8] == 2 @ Li, 000 PSay cSLotAnt @ Li, 007 PSay cLoteAnt @ Li, 018 PSay cProdAnt @ Li, 034 PSay cDescAnt EndIf @ Li, 065 PSay cAlmoAnt @ Li, 068 PSay nSaldo Picture cPicSld @ Li, 081 PSay nEmpenho Picture cPicEmp @ Li, 094 Psay dDataAnt @ Li, 105 Psay dValiAnt Li ++ nSaldo := 0 nEmpenho := 0 EndIf EndDo //-- Imprime Saldo Total da Quebra If nCntImpr > 0 If Li > 58 Cabec(Titulo,Cabec1,Cabec2,wnRel,Tamanho,nTipo) EndIf @ Li, 000 PSay If(aReturn[8]==1,STR0013,If(lSubLote,STR0016,STR0015 )) //"Total do Produto ld @ Li, 081 PSay nEmpenhoT Picture cPicEmp Li++ @ Li, 000 PSay __PrtThinLine() @ Li, 068 PSay nSaldoT Picture cPicS

Li++ nCntImpr := 0 nSaldoT := 0 nEmpenhoT := 0 EndIf EndDo If !(Li==80) ----------------------- Page 107----------------------Roda(cBCont,cBTxt,Tamanho) EndIf //-- Restaura a Integridade do SB8 dbSelectArea( SB8 ) RetIndex( SB8 ) dbClearFilter() If File(cNomArq+OrdBagExt()) fErase(cNomArq+OrdBagExt()) Endif If aReturn[5] == 1 Set Printer To dbCommitAll() OurSpool(wnRel) Endif MS_Flush() Return Nil de Clculos Existem diversas formas de se gerar uma rotina de clculo no sistema, no entanto o modelo bsico sempre se mantm. Abaixo mostramos um modelo-padro que utiliza as funes bsicas para ta l. /*/ +---------------------------------------------------------------------------+ + Funcao FINA210 Autor Wagner Xavier Data 01/12 /92 +-----------+----------+-------+-----------------------+------+-------------+ Descricao Recalcula saldos bancarios dentro de um determinado periodo +-----------+---------------------------------------------------------------+ Sintaxe FINA210() +-----------+---------------------------------------------------------------+ Uso Generico +---------------------------------------------------------------------------+ ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL +-----------+--------+------+-----------------------------------------------+ Programador Data BOPS Motivo da Alteracao +-----------+--------+------+-----------------------------------------------+ +-----------+--------+------+-----------------------------------------------+ #INCLUDE "FINA210.CH" #INCLUDE "PROTHEUS.CH"

Modelos

Function FinA210() LOCAL nOpca :=0 +----------------------------------------------------------------+ Define Variaveis +----------------------------------------------------------------+ LOCAL oDlg, aSays:={}, aButtons:={} Private cCadastro := OemToAnsi(STR0004) //"Reconciliacao de Saldos Banc arios" Pergunte("FIN210",.F.) AADD (aSays,; OemToAnsi(STR0005))//"Este programa tem como objetivo recalcular e analisar os s aldos" AADD (aSays,; OemToAnsi(STR0006)) //"Bancarios dia a dia de um determinado periodo ate a data base do " AADD (aSays,; OemToAnsi(STR0007)) //"sistema. Utilizando no caso de haver necessidade de retroagir a " AADD (aSays,; OemToAnsi(STR0008)) //"movimentacao bancaria. Use como referencia a data em que o saldo " AADD (aSays,; OemToAnsi(STR0009)) //"ficou defasado. " AADD(aButtons, { 1,.T.,{ o nOpca:= 1,o:oWnd:End()}} ) AADD(aButtons, { 2,.T.,{ o o:oWnd:End() }} ) AADD(aButtons, { 5,.T.,{ Pergunte("FIN210",.T. ) } } ) ----------------------- Page 108----------------------FormBatch( cCadastro, aSays, aButtons ) If nOpcA == 1 #IFDEF TOP If TcSrvType() == AS/400 Processa({ lEnd FA210Proc()}) // Chamada da funcao de reconciliac ao Else Processa({ lEnd FA211Proc()}) // Chamada da funcao de reconciliac ao Endif #ELSE Processa({ lEnd FA210Proc()}) // Chamada da funcao de reconciliacao #ENDIF Endif Return /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Fa210Proc Autor Wagner Xavier Data 01.12.1992 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de recalculo dos saldos bancarios CODEBASE +------------+------------------------------------------------------------+ Sintaxe Fa210Proc () +------------+------------------------------------------------------------+ Parametros Nenhum +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso FINA210

+------------+------------------------------------------------------------+ /*/ Function FA210Processa() LOCAL nSaldoIni LOCAL nEntradas LOCAL nSaidas, nData, cCond LOCAL dDataMovto LOCAL cFil :="" LOCAL lAllFil :=.F. LOCAL cChave LOCAL cIndex := "" LOCAL lSaida :=.F. +----------------------------------------------------------+ Variaveis utilizadas para parametros mv_par01 // Do Banco mv_par02 // Ate o Banco mv_par03 // Da Agencia mv_par04 // Ate a Agencia mv_par05 // Da Conta mv_par06 // Ate a Conta mv_par07 // A partir da Data +----------------------------------------------------------+ dbSelectArea( "SA6" ) dbSeek( cFilial+mv_par01 , .T.) ProcRegua(RecCount()) If Empty(xFilial( "SA6")) .AND. !Empty(xFilial("SE5")) +----------------------------------------------------------------+ Filtra o arquivo pro tipo e vencimento +----------------------------------------------------------------+ dbSelectArea("SE5") cIndex := CriaTrab(nil,.f.) cChave := "E5_BANCO+E5_AGENCIA+E5_CONTA+DTOS(E5_DTDISPO)" cCond := dtos(E5_DTDISPO)>=" +dtos(mv_par07)+ " IndRegua("SE5",cIndex,cChave,,cCond,OemToAnsi(STR0015)) //"Selecionando Registros..." nIndexSE5 := RetIndex("SE5") #IFNDEF TOP dbSetIndex(cIndex+OrdBagExt()) #ENDIF dbSetOrder(nIndexSE5+1) ----------------------- Page 109----------------------lSaida := .T. dbGoTop() lAllFil:= .T. Else dbSelectArea("SE5") cIndex := CriaTrab(nil,.f.) cChave := "E5_FILIAL+E5_BANCO+E5_AGENCIA+E5_CONTA+DTOS(E5_DTDISPO)" cCond := dtos(E5_DTDISPO)>=" +dtos(mv_par07)+ " .and. E5_FILIAL == " +xFilial("SE5")+ " IndRegua("SE5",cIndex,cChave,,cCond,OemToAnsi(STR0015)) //"Selecionando Registros..." nIndexSE5 := RetIndex("SE5") #IFNDEF TOP dbSetIndex(cIndex+OrdBagExt()) #ENDIF dbSetOrder(nIndexSE5+1) dbGoTop()

Endif +----------------------------------------------------------------+ Inicia recalculo dos saldos atraves da movimentacao bancaria +----------------------------------------------------------------+ dbSelectArea( "SA6" ) dbSeek( cFilial+mv_par01 , .T.) While !Eof() .and. A6_FILIAL == cFilial .and. A6_COD <= mv_par02 IncProc() // Alteracao para nao recalcular o saldo dos caixas do Loja, pois // estes devem ser recalculados atraves da opcao "Recalculo de Caixa" - Ad riano dbSelectArea("SX5") If (dbSeek(xFilial("SX5")+"23"+SA6->A6_COD)) .or. (SA6->A6_Cod == "CL1") dbSelectArea("SA6") dbSkip() Loop Endif dbSelectArea("SA6") cBanco := A6_COD cAgencia := A6_AGENCIA cConta := A6_NUMCON nSaldoIni:= 0 nEntradas:= 0 nSaidas := 0 If cAgencia < mv_par03 .or. cAgencia > mv_par04 .or. cConta < mv_par05 .or . cConta > mv_par06 dbSkip( ) Loop Endif +---------------------------------------------------------+ Localiza Saldo de Partida. Observe que o programa retorna um registro no banco de dados, portanto a data de referencia a data em que o saldo ficou errado, nao a data correta do saldo. +---------------------------------------------------------+ dbSelectArea( "SE8" ) dbSeek( cFilial+cBanco+cAgencia+cConta+Dtos(mv_par07),.T. ) dbSkip( -1 ) If E8_BANCO != cBanco .or. E8_AGENCIA != cAgencia .or. E8_CONTA != cConta .or. BOF() .or. EOF() nSaldoIni := 0 Else nSaldoIni := E8_SALATUA End +----------------------------------------------------------------+ Localiza movimentacao bancaria +----------------------------------------------------------------+ dbSelectArea( "SE5" ) dbSetOrder(nIndexSE5+1) cFil := Iif(lAllFil,"",xFilial("SE5")) ----------------------- Page 110----------------------dbSeek(cFil+cBanco+cAgencia+cConta+Dtos(mv_par07),.T.) While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA == cBanco+cAgencia+cConta IF !lAllFil .and. E5_FILIAL != xFilial("SE5") Exit Endif

dDataMovto := E5_DTDISPO While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA+dtos(E5_DTDISPO)== ; cBanco+cAgencia+cConta+dtos(dDataMovto) IF !lAllFil .and. E5_FILIAL != xFilial("SE5") Exit Endif IF E5_TIPODOC $ "DC/JR/MT/CM/D2/J2/M2/C2/V2/CP/TL" //Valores de B aixas dbSkip() Loop Endif If E5_VENCTO > E5_DATA // Ignora pre datados - gerou titulo dbSkip() Loop Endif If E5_SITUACA = "C" //Cancelado dbSkip() Loop Endif If SE5->E5_MOEDA $ "C1/C2/C3/C4/C5" .and. Empty(SE5->E5_NUMCHEQ) dbSkip() Loop Endif +---------------------------------------------------------------+ Na transferencia somente considera nestes numerarios No Fina100 tratado desta forma. As transferencias TR de titulos p/ Desconto/Cauo (FINA060) no sofrem mesmo tratamento dos TR bancarias do FINA100 Aclaracao : Foi incluido o tipo $ para os movimentos en di-nheiro em QUALQUER moeda, pois o R$ nao e representativo fora do BRASIL. +---------------------------------------------------------------+ If SE5->E5_TIPODOC $ "TR/TE" .and. Empty(SE5->E5_NUMERO) If !(E5_MOEDA $ " $ /R$/DO/TB/TC/CH"+IIf(cPaisLoc=="BRA",""," /$ ")) dbSkip() Loop Endif Endif If E5_TIPODOC $ "TR/TE" .and. (Substr(E5_NUMCHEQ,1,1)=="*" ; .or. Substr(E5_DOCUMEN,1,1) == "*" ) dbSkip() Loop Endif If SE5->E5_MOEDA == "CH" .and. IsCaixaLoja(SE5->E5_BANCO) //Sangria dbSkip() Loop Endif If SubStr(E5_NUMCHEQ,1,1)=="*" dbSkip() Loop Endif If !Empty(SE5->E5_MOTBX) If !MovBcoBx(SE5->E5_MOTBX) dbSkip() Loop Endif Endif //cheque para juntar (PA)

+----------------------------------------------------------------+ Baixa automatica +----------------------------------------------------------------+ IF E5_TIPODOC = "BA" ----------------------- Page 111----------------------dbSkip() Loop Endif dbSelectArea("SE5") IF E5_RECPAG = "R" nEntradas += E5_VALOR Else nSaidas += E5_VALOR Endif dbSkip() End // Quebra da data dbSelectArea("SE8") dbSeek(cFilial + cBanco+cAgencia+cConta+Dtos(dDataMovto)) IF Eof() RecLock("SE8",.t.) Else RecLock("SE8",.f.) Endif Replace E8_FILIAL With cFilial,; E8_BANCO With cBanco,; E8_AGENCIA With cAgencia,; E8_CONTA With cConta,; E8_DTSALATU With dDataMovto Replace E8_SALATUA With nSaldoIni+nEntradas-nSaidas MsUnlock() dbSelectArea("SE5") IF !(SE5->(Eof())) .and. E5_BANCO+E5_AGENCIA+E5_CONTA == cBanco+cAgencia+cConta IF !lAllFil .and. E5_FILIAL != xFIlial("SE5") Exit Endif For nData := dDataMovto+1 to ((SE5->E5_DTDISPO) - 1) dbSelectArea("SE8") If dbSeek(cFilial + cBanco+cAgencia+cConta+dtos(nData)) RecLock("SE8",.F.,.T.) dbDelete() MsUnlock() SX2->(MsUnlock()) EndIf dbSelectArea("SE5") Next Endif IF SE5->(Eof()) .or. E5_BANCO+E5_AGENCIA+E5_CONTA != cBanco+cAgenci a+cConta dbSelectArea("SE8") dbSeek(cFilial + cBanco+cAgencia+cConta+dtos(dDataMovto+1),.t .) While !Eof() .and. cFilial + cBanco+cAgencia+cConta == ; E8_FILIAL+E8_BANCO+E8_AGENCIA+E8_CONTA RecLock("SE8",.F.,.T.) dbDelete()

MsUnlock() SX2->(MsUnlock()) dbselectArea("SE8") dbSkip() End Endif dbSelectArea("SE5") End // Fecha Primeiro Loop do SE5 dbSelectArea("SA6") RecLock("SA6") Replace A6_SALATU With nSaldoIni+nEntradas-nSaidas MsUnLock() dbSkip() End dbSelectArea("SE5") RetIndex( "SE5") Set Filter To ----------------------- Page 112----------------------If !Empty(cIndex) ferase( cIndex+OrdBagExt()) EndIf Return NIL /*/ +------------+----------+-------+-----------------------+------+----------+ Funcao Fa211Proc Autor Wagner Xavier Data 09.03.2000 ------------+----------+-------+-----------------------+------+----------+ Descricao Funcao de recalculo dos saldos bancarios TOP CONNECT +------------+------------------------------------------------------------+ Sintaxe Fa211Proc () +------------+------------------------------------------------------------+ Parametros Nenhum +------------+------------------------------------------------------------+ Retorno Nenhum +------------+------------------------------------------------------------+ Uso FINA210 +------------+------------------------------------------------------------+ /*/ #IFDEF TOP Function FA211Proc() LOCAL nSaldoIni, nEntradas LOCAL nSaidas, nData LOCAL cQuery LOCAL dDataMovto +----------------------------------------------------------+ Variaveis utilizadas para parametros mv_par01 // Do Banco mv_par02 // Ate o Banco mv_par03 // Da Agencia mv_par04 // Ate a Agencia mv_par05 // Da Conta mv_par06 // Ate a Conta mv_par07 // A partir da Data +----------------------------------------------------------+ +----------------------------------------------------------------+ Inicia recalculo de saldos atraves da movimentacao bancaria +----------------------------------------------------------------+ cQuery := "SELECT SA6.R_E_C_N_O_ A6_RECNO," cQuery += " E5_BANCO, E5_AGENCIA, E5_CONTA, E5_DTDISPO, E5_TIPODOC, E5_MOEDA,"

cQuery += " E5_NUMCHEQ, E5_MOTBX, E5_NUMERO, E5_RECPAG, E5_VALOR, E5_DOCUMEN" cQuery += " FROM " + RetSqlName("SA6") + " SA6, " + RetSqlName("SE5") + " SE5" cQuery += " WHERE A6_FILIAL = " + xFilial("SA6") + " " cQuery += " AND A6_COD between " + mv_par01 + " AND " + mv_par02 + " " cQuery += " AND A6_AGENCIA between " + mv_par03 + " AND " + mv_par04 + " " cQuery += " AND A6_NUMCON between " + mv_par05 + " AND " + mv_par06 + " " cQuery += " AND SA6.D_E_L_E_T_ <> * " cQuery += " AND E5_VENCTO <= E5_DATA" cQuery += " AND A6_COD = E5_BANCO" cQuery += " AND A6_AGENCIA = E5_AGENCIA" cQuery += " AND A6_NUMCON = E5_CONTA" cQuery += " AND E5_SITUACA <> C " cQuery += " AND E5_TIPODOC <> BA " cQuery += " AND SE5.D_E_L_E_T_ <> * " If Empty(xFilial( "SA6")) .AND. !Empty(xFilial("SE5")) cQuery += " AND E5_DTDISPO >= " + dtos(mv_par07) + " " //O filtro de filial entre e ZZ foi adicionado para o SQL utilizar i ndice cQuery += " AND E5_FILIAL between AND ZZ " Else cQuery += " AND E5_DTDISPO >= " + dtos(mv_par07) + " AND E5_FILIAL = " + xFilial("SE5") + " " Endif cQuery += " ORDER BY E5_BANCO, E5_AGENCIA, E5_CONTA, E5_DTDISPO" cQuery := ChangeQuery(cQuery) dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery), TRB210 ,.T.,.T.) ----------------------- Page 113----------------------TcSetField("TRB210", "E5_DTDISPO", "D") While !Eof() dbSelectArea("TRB210") cBanco := E5_BANCO cAgencia := E5_AGENCIA cConta := E5_CONTA nSaldoIni:= 0 nEntradas:= 0 nSaidas := 0 +---------------------------------------------------------+ Localiza Saldo de Partida. Observe que o programa retorna um registro no banco de dados, portanto a data de referencia a data em que o saldo ficou errado, nao a data correta do saldo. +---------------------------------------------------------+ dbSelectArea( "SE8" ) dbSeek( cFilial+cBanco+cAgencia+cConta+Dtos(mv_par07),.T. ) dbSkip( -1 ) If E8_BANCO != cBanco .or. E8_AGENCIA != cAgencia .or. E8_CONTA != cConta .or. BOF() .or. EOF() nSaldoIni := 0 Else nSaldoIni := E8_SALATUA Endif +----------------------------------------------------------------+ Localiza movimentacao bancaria +----------------------------------------------------------------+ dbSelectArea("TRB210")

While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA == cBanco+cAgencia+cConta dDataMovto := E5_DTDISPO While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA+DTOS(E5_DTDISPO) == ; cBanco+cAgencia+cConta+dtos(dDataMovto) IF E5_TIPODOC $ "DC/JR/MT/CM/D2/J2/M2/C2/V2/CP/TL" s de Baixas dbSkip() Loop Endif If E5_MOEDA $ "C1/C2/C3/C4/C5" .and. Empty(E5_NUMCHEQ) dbSkip() Loop Endif +--------------------------------------------------------------+ Na transferencia somente considera nestes numerarios No Fina100 tratado desta forma. As transferencias TR de titulos p/ Desconto/Cauo (FINA060) no sofrem mesmo tratamento dos TR bancarias do FINA100 +--------------------------------------------------------------+ If E5_TIPODOC $ "TR/TE" .and. Empty(E5_NUMERO) If !(E5_MOEDA $ "R$/DO/TB/TC/CH") dbSkip() Loop Endif Endif If E5_TIPODOC $ "TR/TE" .and. (Substr(E5_NUMCHEQ,1,1)=="*" ; .or. Substr(E5_DOCUMEN,1,1) == "*" ) dbSkip() Loop Endif If E5_MOEDA == "CH" .and. IsCaixaLoja(E5_BANCO) //Sangria dbSkip() Loop Endif If SubStr(E5_NUMCHEQ,1,1)=="*" //cheque para juntar (PA ) dbSkip() Loop Endif If !Empty(E5_MOTBX) ----------------------- Page 114----------------------If !MovBcoBx(E5_MOTBX) dbSkip() Loop Endif Endif If E5_RECPAG = "R" nEntradas += E5_VALOR Else nSaidas += E5_VALOR Endif //Valore

dbSkip() End // Quebra da data dbSelectArea("SE8") dbSeek(cFilial+cBanco+cAgencia+cConta+Dtos(dDataMovto)) IF Eof() RecLock("SE8",.t.) Else RecLock("SE8",.f.) Endif Replace E8_FILIAL With cFilial,; E8_BANCO With cBanco,; E8_AGENCIA With cAgencia,; E8_CONTA With cConta,; E8_DTSALATU With dDataMovto Replace E8_SALATUA With nSaldoIni+nEntradas-nSaidas MsUnlock() dbSelectArea("TRB210") IF !(TRB210->(Eof())) .and. E5_BANCO+E5_AGENCIA+E5_CONTA == cBanco+cAgencia+cConta For nData := dDataMovto+1 to ((E5_DTDISPO) - 1) dbSelectArea("SE8") If dbSeek(cFilial + cBanco+cAgencia+cConta+dtos(nData)) RecLock("SE8",.F.,.T.) dbDelete() MsUnlock() SX2->(MsUnlock()) EndIf dbSelectArea("TRB210") Next Endif If TRB210->(Eof()) .or. E5_BANCO+E5_AGENCIA+E5_CONTA != cBanco+cAgencia+cConta dbSelectArea("SE8") dbSeek(cFilial+cBanco+cAgencia+cConta+dtos(dDataMovto+1),.t.) While !Eof() .and. cFilial+cBanco+cAgencia+cConta == ; E8_FILIAL+E8_BANCO+E8_AGENCIA+E8_CONTA RecLock("SE8",.F.,.T.) dbDelete() MsUnlock() SX2->(MsUnlock()) dbselectArea("SE8") dbSkip() Enddo Endif dbSelectArea("TRB210") Enddo // Fecha Primeiro Loop do SE5 dbSelectArea("SA6") If dbSeek( xFilial("SA6")+cBanco+cAgencia+cConta) RecLock("SA6") Replace A6_SALATU With nSaldoIni+nEntradas-nSaidas MsUnLock() EndIf dbSelectArea("TRB210") dbSkip() Enddo dbSelectArea("TRB210") ----------------------- Page 115-----------------------

dbCloseArea() Return NIL #ENDIF AbreExcl Tipo: Processamento Fecha o arquivo e reabre exclusivo. Esta funo fecha o arquivo cujo alias est expresso em <cAlias> e o reabre em modo exclusivo para proceder operaes em que isto necessrio, como por exemplo, PACK. Entretanto, prefervel utilizar o depurador do sistema para procede r estas operaes. Se outra estao estiver usando o arquivo, o retorno ser .F.. Sintaxe AbreExcl(cAlias) Parmetros cAlias Nome do Alias do Arquivo. Deve ter obrigatriamente sua estrutura definida no SX3. Exemplo // IF AbreExcl(inSI2li) Pack ENDIF AbreExcl( ) dbGoTop( ) MANUAL RDMAKE - SIGA ADVANCED 4.07 - 31 Activate Dialog Tipo: Tela Windows Ativa uma janela previamente definida na funo Dialog e executa os GETs, botes e out ros objetos. Sintaxe ACTIVATE DIALOG cVar <CENTERED> [On Init cFuncInit] [Valid cFuncValid] Parmetros cVar Varivel utilizada na funo Dialog para definio da janela. cFuncInit Funo executada automaticamente na abertura do dilogo na tela (Opcional). cFuncValid Funo executada para validar dilogo. Deve retornar um valor lgico (.T. ou .F.) (Opcional) Comentrios A clusula <CENTERED> opcional, se omitida assume as coordenadas definidas na criao da janela. Exemplo o fechamento da janela de

Ver exemplo no programa RDDEMO apresentado no final deste Manual. Ver tambm Funo Dialog ACopy Copia os elementos de uma array para outra. Sintaxe ACOPY( aOrigem, aDestino , [ nInicio ], [ nQtde ], [ nPosDestino ]) --> a Destino Argumento io ----------------------- Page 116----------------------aOrigem m copiados. aDestino os. indica eiro elemento nInicio de aOrigem que No ser N copiado. Se no for especificado, o va lor assumido ser 01. indica ntos a serem copiados a partir do array aOrigem. contagem a partir da posio nQtde No N ficado, todos os elementos do iciando-se a partir da posio nInicio. nPosDestino Destino que receber os N elementos de aOrigem. Se no especific ado, ser assumido 01. Retorno ACOPY() tino. Descrio ACOPY() uma funo de array que copia elementos do array aOrigem para array aDestino. O array destino aDestino j deve ter sido declarado e grande o bastante para conter os elementos que sero Descrio retorna uma referncia ao array aDes a posio do elemento inicial no array a nInicio. iniciando-se for a especi in Se nQtde no a quantidade de eleme qual o ndice do prim Sim Sim A A o array que contm os elementos a sere o array que receber a cpia dos element Obrigat. Tipo Descr

array aOrigem sero

copiados,

copiados. Se o array aOrigem contiver mais elementos, alguns dos elementos no sero copiados. ACOPY() copia os valores de todos os dados, incluindo valores nulos (NIL) e cdigos de blo co. Se um elemento for um subarray, o elemento correspondente no array aDesti no, conter o mesmo subarray. Portanto, ACOPY() no produzir uma cpia completa de array multidimensionais, Para fazer isso, uso a funo aClone(). Exemplos Este exemplo cria dois arrays, com um contedo cada. Os dois primeiros elementos d o array fonte so ento copiados no array destino: LOCAL nCount := 2, nStart := 1, aOne, aTwo aOne := { 1, 1, 1 } aTwo := { 2, 2, 2 } ACOPY(aOne, aTwo, nStart, nCount) // Result: aTwo is now { 1, 1, 2 } ACLONE() ADEL() AEVAL() AFILL() AINS() ASORT() ADel Exclui um elemento de um array. ----------------------- Page 117----------------------Sintaxe ADEL( aOrigem, nPos) --> aOrigem Argumento aOrigem nPos m elemento io ADEL() aOrigem. Retorna uma referncia ao Obrigat. Sim Sim Retorno Tipo A A Descrio o array de onde ser excludo um item a posio a partir da 1, do qual ser excludo u Descr

Descrio ADEL() uma funo de manipulao que elimina uma posio do array, deslocando posies posteriores. A ltima posio do array passa a ter o contedo NIL. Caso a posio a ser eliminada seja um array, este ser eliminado. Exemplos LOCAL aArray aArray := { 1, 2, 3 } // Resultado: { 1, 2, 3 } ADEL(aArray, 2) // Resultado: { 1, 3, NIL } AFILL() AINS() ADir Preenche vrios arrays com informaes de arquivos e diretrios. Sintaxe ADIR([ cArqEspec ], [ aNomeArq ], [ aTamanho ], [ aData ], [ aHora ], [ aAt ributo ]) --> Numrico Argumento ncludos na Obrigat. busca de Tipo Descrio

Caminho dos arquivos a serem i informaes. Segue o padro para especificao de arquivos, ? C so servidor Protheus e no Cliente. aceitos normalmente. Caso seja omitido, sero acei diretrio default ( *.* ). Array de Caracteres. o array

aceitando arquivos no cArqEspec No Caracteres como * e tos todos os arquivos do

com os nomes aNomeArq do array apagado.

dos No

arquivos A encontrados na busca. O contedo anterior

aTamanho No ncontrados na busca.

Array Numrico. So os tamanhos dos arquivos e

----------------------- Page 118----------------------aData modificao No dos A arquivos A arquivos Array de Datas. So as datas de

encontrados na busca. aHora No de modificao dos formato: hh:mm:ss. Array de Caracteres. So os horrios

encontrados. Cada elemento contm horrio no

Array de dos arquivos, aAtributos includos os caso esse array No A arquivos com Retorno > = 0 Descrio seja

Caracteres. So como

os atributos sero

passado

parmetros,

atributos de Sistema, Ocultos. Descrio Quantidade de arquivos encontrados

ADir() preenche os arrays passados com os dados dos arquivos encontrado s, atravs da mscara informada. Tanto arquivos locais (Remote) como do servidor podem ser informados. ADir uma funo obsoleta, utilize sempre Directory(). Exemplos LOCAL aFiles[ADIR("*.TXT")] ADIR("*.TXT", aFiles) AEVAL(aFiles, { element QOUT(element) }) AEVAL() ASCAN() DIRECTORY() AEval Executa um code block para cada elemento de um array. Sintaxe AEVAL( aArray, bBloco, [ nInicio ], [ nQtde]) --> aArray Argumento rio aArray o bloco bBlock tado para cada Obrigat. Sim Sim elemento Tipo A Bloco de do cdigo N Desc o array que ser atravessado pel o bloco que ser execu

Array. a posio inicial. Se no for especifi partir do 1.

nInicio No cada o inicio ser a nQtde ser processados a No

o numero de elementos que devem partir de nInicio. O Valor pad

ro so todos os elementos ----------------------- Page 119-----------------------

do nInicio at o final. Retorno AEVAL() Descrio AEVAL() executa um code block para array, passando cada um como o parmetro do bloco. muito semelhante ao DBEVAL(). cada elemento de um Descrio Retorna uma referncia de aArray.

AEVAL() passa cada elemento de um array para o code block sem se preocupar com o tipo. Exemplos // Exemplo 1 #include "Directry.ch" // LOCAL aFiles := DIRECTORY("*.dbf"), nTotal := 0 AEVAL (aFiles,{ aDbfFile QOUT(PADR(aDbfFile[F_NAME], 10), aDbfFile[F_SIZE]), ; nTotal += aDbfFile[F_SIZE]); } ) // ? ? "Total Bytes:", nTotal // Exemplo 2 #include "Directry.ch" // LOCAL aFiles := DIRECTORY("*.dbf"), aNames := {} AEVAL (aFiles, { file AADD(aNames, file[F_NAME]) } ) //Exemplo 3 LOCAL aArray[6] AFILL(aArray,"old") AEVAL (aArray,; { cValue,nIndex IF(cValue == "old",; aArray[nIndex] := "new",)}) EVAL() DBEVAL() AFill Preenche um array com um determinado valor. Sintaxe AFILL( aDestino , expValor, [ nInicio ], [ nQuantidade ]) --> aDestino Argumento Descrio aDestino Obrigat. Sim Tipo A o onde os dados sero preenchidos.

----------------------- Page 120-----------------------

o dado que ser preenchido em todas as po sies informadas, expValor Sim Todos no permitida a utilizao de arrays. a posio inicial de preenchidos, [nInicio] o valor No N padro 1. Quantidade tir de [nInicio] que sero [nCount] No N seja informado o valor do array. Retorno AFILL() Descrio AFILL() funo de manipulao de arrays, que preenche os elementos do array com q ualquer tipo de dado. Incluindo code block. Afill() no deve ser usado para preencher um array com outro array. Exemplos LOCAL aLogic[3] // Resultado: aLogic AFILL (aLogic, .F.) // Resultado: aLogic AFILL (aLogic, .T., 2, // Resultado: aLogic AEVAL() DBSTRUCT() DIRECTORY() AIns Insere um elemento com contedo NIL em um array. Sintaxe AINS( aOrigem, nPos ) --> aIns Argumento AOrigem NPos um elemento Obrigat. Sim Sim Tipo A A Descrio o array de onde ser inserido um item. a posio a partir da 1, do qual ser inserido { NIL, NIL, NIL } { .F., .F., .F. } 2) { .F., .T., .T. } Descrio Retorna uma referncia para aDestino. preenchidos de elementos a par caso no onde os dados sero

com <expValor>,

ser a quantidade de elementos at o final

----------------------- Page 121----------------------Retorno AINS() aOrigem. Descrio ada por nPos. O novo elemento possui contedo igual a NIL. Aps a insero, o ltimo elemento s er excludo. Para alterar o tamanho de um array, utilize aSize(). Exemplos LOCAL aArray aArray := { 1, 2, 3 } // Resultado: { 1, 2, 3 } AINS (aArray, 2) // Resultado: { 1, NIL, 2 } ACLONE() ADEL() AEVAL() AFILL() ASIZE() Aleatorio Tipo: Processamento Gera um nmero aleatrio de acordo com a semente passada. Esta fu no retorna um nmero aleatrio menor ou igual ao primeiro parmetro informado, usando como semen te o segundo parmetro. recomendado que esta semente seja sempre o ltimo nmero aleatrio gerado por esta funo. Sintaxe Aleatorio(nMax,nSeed) Parmetros nMax Nmero mximo para a gerao do nmero aleatrio nSeed Semente para a gerao do nmero aleatrio Retorna nRet Nmero aleatrio retornado Exemplo Descrio Retorna uma referncia ao

AINS() um funo de manipulao de array que insere um elemento na posio deter

// Exemplo do uso da funo Aleatorio: nSeed := 0 For i := 1 to 100 nSeed := Aleatorio(100,nSeed) ? Str(i,3)+le numero aleatorio gerado: i.+Str(nSeed,3) Next i inkey(0) RETURN Alias ----------------------- Page 122----------------------Verifica qual o Alias. Sintaxe ALIAS([ nAreaTrab ]) --> Caracter Argumento scrio nAreaTrab a ser verificada. Retorno "" cAlias ulo). Descrio Verifica qual o Alias de determinada rea de trabalho; se ela no foi especif icada, ser verificado qual o Alias da rea de trabalho corrente. O Alias definido quando a tabela aberta atravs do parmetro correspondente (DBUSEAREA()). Esta funo o inverso da funo SELECT(), pois nesta retornado o nmero da rea abalho do Alias correspondente. Exemplo // Este exemplo mostra como o Alias corrente pode ser apresentado para o usurio. dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) MessageBox("O Alias corrente : " + Alias(), "Alias", 0) / / Resultado: "O Alias corrente : SSS". DBUSEAREA( ) SELECT( ) Append From Obrigat. No N Tipo De Nmero da rea de trabalho Descrio No existe tabela em uso na rea de trabalho verificada. String contendo o Alias da rea de trabalho verificada (em maisc

Importa registros de outra tabela ou arquivo texto. Sintaxe APPEND FROM Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] [VIA RDD] [SDF DELIMITED [WITH BLANK cDelimitador] ] Argumento sero Arquivo . Lista dos campos a serem copiados, se o mitido sero copiados Campos No todos os campos. ----------------------- Page 123----------------------CondFor para que o No registro seja Expresso em ADVPL copiado. Expresso em ADVPL que determina quan do a cpia deve parar CondWhile No (quando a expresso retornar .F.). No nRecs s. nRecno do. RDD e aspas simples ou DD corrente. Especifica qual caracter foi utiliz ado como delimitador para cDelimitador No Descrio Este comando utilizado para copiar alguns registros do arquivo especif icado por "FROM cArquivo" utilizando-se o driver especificado por "VIA RDD" se especificado. Se forem especificados os campos de interesse atravs de "FIELDS Campos", apenas eles sero copiados, caso contrrio todos campos o sero. Se no forem especificadas as condies par a que o registro C gerar o arquivo do tipo texto. No Nome do RDD utilizado na importao (entr dupla), se omitido ser utilizado o R No N Nmero do recno do registro a ser copia N Quantos registros devem ser copiado a ser resolvida Obrigat. importados, Sim pode Tipo ser apenas o nome ou na forma de uma string Descrio Nome do arquivo cujos registros

seja copiado, copia toda a tabela como se estivesse especificada a opo "ALL". Pode-se especificar um escopo para que os registros jam copiados atravs das opes "FOR CondFor" e "WHILE CondWhile". Pode-se tambm limitar o nmero de registros a opiados atravs da opo "NEXT nRecs" e determinar que a cpia dos registros deve-se iniciar a registro atual com "REST", mas caso contrrio o comando executa um DBGOTOP() antes de ar a cpia. Se desejado copiar apenas determinado registro pode-se defini-lo atravs da ecificao do recno com "RECORD nRecno". se serem c partir do inici esp

Alm de copiar registros de uma tabela normal, pode-se copiar registros de um arquivo texto que contenha os dados desejados. Existem duas formas de gerar est es arquivos textos com COPY TO, utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preen chendo com espaos) ou atravs de um delimitador que separa os campos",". Deve-se especificar na cpi a qual o tipo do arquivo texto atravs das opes "SDF" ou "DELIMITED". Pode-se ainda especificar qual o delimitador utilizado nas strings da segui nte forma: "DELIMITED WITH BLANK" - as strings no possuem delimitador; "DELIMITED WITH cDelimitador" - as strings so delimitadas com o caracter especificado; Caso seja omitido o delimitador ser considerado o delimitador padro (" "). Exemplo // Este exemplo demonstra como utilizar o comando APPEND FROM para acrescenta r alguns campos de registros (apenas 10 registros) de outra tabela pertencentes a um e scopo definido a partir do registro atual para a tabela corrente: USE Cliente VIA "CTREECDX" NEW APPEND FROM Amigos FIELDS Nome,Nascimento,End,Tel FOR Idade>20 WHILE Nome<"VV V" NEXT 10 REST // Este exemplo demonstra como se pode utilizar o comando <@>COPY TO para gra var os dados de uma tabela em um arquivo do tipo texto (DELIMITED) e inclu-los a outra tabe la com o comando APPEND FROM: USE Amigos NEW COPY TO temp DELIMITED // Registro: "Jose",19751108,69411233,12.00 COPY TO temp1 DELIMITED WITH BLANK // Registro: Jose 19751108 69 411233 12.00 ----------------------- Page 124----------------------COPY TO temp2 DELIMITED WITH "@" 2.00 USE Cliente NEW // Registro: @Jose@,19751108,69411233,1

APPEND FROM temp DELIMITED USE Cliente1 NEW APPEND FROM temp1 DELIMITED WITH BLANK USE Cliente2 NEW APPEND FROM temp2 DELIMITED WITH "@" // Este exemplo demonstra como se pode utilizar o comando <@>COPY TO para gravar os dados de uma tabela em um arquivo do tipo texto (SDF) e inclu-los a outra tabela com o comando APPEND FROM: USE Amigos NEW COPY TO temp3 SDF // Registro: Jose 1975110869411233 12.00 USE Cliente3 NEW APPEND FROM temp3 SDF COPY TO Array Cria um array com dados no inicializados. Sintaxe ARRAY( nQtdElementos1 , [ nQtdElementosn ]...) --> aArray Argumento nQtdElementos1 do array. demais dimenses [nQtdElementosN] Retorno ARRAY() Descrio Array() uma funo que retorna um array no inicializado com mltiplas dimenses. Se mais de um argumento for especificado, ser retornado um array multidimensional A vantagem de utilizar ARRAY(), ao invs de outras opes, a possibilidade de us-la em code blocks e expresses. Exemplo // Exemplo 1 - Dois mtodos idnticos. aArray := ARRAY(5) aArray := { NIL, NIL, NIL, NIL, NIL } // Mtodos equivalentes. aArray := ARRAY(3, 2) aArray := { {NIL, NIL}, {NIL, NIL}, {NIL, NIL} } do No N array. Descrio Retorna um array com as dimenses especificadas. Obrigat. Sim Tipo N Descrio Quantidade de Elementos da 1 Quantidade de Elementos

dimenso das

aArray := { ARRAY(2), ARRAY(2), ARRAY(2) } ----------------------- Page 125----------------------AADD() ACLONE() ACOPY() ADEL() AEVAL() AFILL() AScan Busca em um array at que o bloco retorne verdadeiro .T. Sintaxe ASCAN( aOrigem, expSearch, [ nStart ], [ nCount ]) --> nStoppedAt Argumento aOrigem resso. Obrigat. Sim Tipo A Todos Descrio o array onde ser executada a exp a posio a partir da 1, do qual se

<expSearch> Sim r inserido um elemento Argumento Descrio

<aOrigem> Obrigatrio, Array. o array onde ser executada a expresso. <expSearch> Obrigatrio, Qualquer Tipo. Casis either a simple value to scan for , or a code block. If <expSearch> is a simple value it can be character, date, logical, or numeric type. <nStart> is the starting element of the scan. If this argument is not specified, the default starting position is one. <nCount> is the number of elements to scan from the starting position. If this argument is not specified, all elements from the starting element to the end of the array are scanned. Returns ASCAN() returns a numeric value representing the array osition of thelast element scanned. If <expSearch> is a simple value, ASCAN() returnsthe position of he first matching element, or zero if a p t

match is notfound. If <expSearch> is a code block, ASCAN() returns the position ofthe element where the block returned true (.T.). Description ASCAN() is an array function that scans an array for a specified value and operates like SEEK when searching for a simple value. The<expSearch> value is compared to the target array element beginning withthe leftmost character in the target element and proceeding until therea re no more characters left in <expSearch>. If there is no match,ASCAN() proceeds to the next element in the ar ray.Since ASCAN() uses the equal operator (=) for comparisons, it issensitive to the status of EX ACT. If EXACT is ON, the target arrayelement must be exactly equal to the result of <expSearch> to match.If the <expSearch> argument is a code block, ASCAN() scans the <aTarget&gtarray executing the block for each el ement accessed. As each element isencountered, ASCAN() passes the element s value as an argument to thecode block, and then ----------------------- Page 126----------------------performs an EVAL() on the block. The scanningoperation stops when the lock returns true (.T.), or ASCAN()reaches the last element in the array. Examples This example demonstrates scanning a three-element array using simple values and a code block as search criteria. The code block criteria shows how to perform a case-insensitive search: aArray := { "Tom", "Mary", "Sue" } ? ASCAN(aArray, "Mary") // Result: 2 ? ASCAN(aArray, "mary") // Result: 0 // ? ASCAN(aArray, { x UPPER(x) ; == "MARY" }) // Result: 2 This example demonstrates scanning for multiple instances of a search argument after a match is found: LOCAL aArray := { "Tom", "Mary", "Sue",; "Mary" }, nStart := 1 // // Get last array element position code b

nAtEnd := LEN(aArray) DO WHILE (nPos := ASCAN(aArray, "Mary", ; nStart)) > 0 ? nPos, aArray[nPos] // // Get new starting position and test // boundary condition IF (nStart := ++nPos) > nAtEnd EXIT ENDIF ENDDO This example scans a two-dimensional array using a code block. Note that the parameter aVal in the code block is an array: LOCAL aArr:={} CLS ----------------------- Page 127----------------------AADD(aArr,{"one","two"}) AADD(aArr,{"three","four"}) AADD(aArr,{"five","six"}) ? ASCAN(aArr, { aVal aVal[2] == "four"}) // Returns 2 See Also AEVAL() EVAL() ASort Ordena um array. Sintaxe ASORT( aOrigem, [ nInicio ], [ nQtde ], [ bOrdem ]) --> aOrigem Argumento scrio aOrigem Obrigat. Sim Tipo A De o array que ser classificado

. nInicio ordenao. Caso o array. Quantidade de elementos que sero ordenados a partir nQtde No sero considerados todos . um bloco de cdigo ( code blo ck ) opcional que Bloco de elementos. Caso ele no bOrder No cdigo ssificado em ordem crescente desde que no seja m ultidimensional. Retorno ASORT() Descrio ASORT() uma funo de manipulao de array que classifica todo ou parcialmente um array de tipo simples. Os tipos que podem ser classificados automaticamente so: caracter, data, lgico e numrico. Caso bOrder seja especificado, o code block ser usado para ordernar o a rray, neste caso, pode-se usar dados de qualquer tipo. Cada vez que o bloco for avaliado, sero passados d ois elementos do array, caso eles estejam em ordem, deve-se retornar .T. Exemplos // Exemplo 1 ----------------------- Page 128----------------------aArray := { 3, 5, 1, 2, 4 } ASORT (aArray) // Resultado: { 1, 2, 3, 4, 5 } ASORT (aArray,,, { x, y x > y }) // Resultado: { 5, 4, 3, 2, 1 } //Exemplo 2 aArray := { "Fred", Kate", "ALVIN", "friend" } ASORT (aArray,,, { x, y UPPER(x) < UPPER(y) }) //Exemplo 3 aKids := { {"Mary", 14}, {"Joe", 23}, {"Art", 16} } aSortKids := ASORT(aKids,,, { x, y x[2] < y[2] }) Resultado: { {"Mary", 14}, {"Art", 16}, {"Joe", 23} } Descrio Retorna uma referncia ao array aOrigem. seja informado, o array ser cla indicar a ordem correta dos N do nInicio. Caso seja omitido, elementos at o final do Array No seja omitido, ser considerado o 1 elemento d N Onde ser o inicio da

ASCAN() EVAL() ATail Retorna o ltimo elemento de um array Sintaxe ATAIL( aArray ) --> Element Argumento aArray nto. Obrigat. Sim Retorno ATAIL() de um array. Descrio. ATAIL() uma funo de manipulao de array que retorna o ltimo elemento de um array. la deve ser usada em substituio da seguinte construo: aArray [LEN( aArray )] Exemplos aArray := {"a", "b", "c", "d"} ? ATAIL (aArray) // Resultado: d LEN() Avalimp Tipo: Relatrios A Tipo Descrio o array de onde ser retornado o ltimo eleme Descrio Retorna o ltimo elemento

Configura a impressora atravs dos parmetros. Esta funo usada em relatrios especfico ue no se utilizam da funo Cabec. Imprimindo o retorno desta funo na impressora, ela se encarregar de ----------------------- Page 129----------------------configurar a impressora de acordo com o arquivo de driver escolhido, e com as co nfiguraes escolhidas pelo usurio definidas no array aReturn. Sintaxe AvalImp(nLimit) Parmetros nLimit Tamanho do relatrio em colunas. Pode ser 80, 132 ou 220 (respec-tivamente

para relatrios de tamanho P,M e G). Retorna cControl String com caracteres de das pelo usurio e do arquivo de driver especificado. Exemplo // Exemplo de uso da funo AvalImp: #IFNDEF WINDOWS #DEFINE PSAY SAY #ENDIF cCbTxt:= cCbCont:= nOrdem:= 0 nAlfa:= 0 nZ:= 0 nM:= 0 cTamanho:= G cLimite:= 220 cTitulo:= PADC(ioNota FiscallA,74) cDesc1:= PADC(Este programa ir emitir a Nota Fiscal de Entrada/Sada,74) cDesc2:= cDesc3:= PADC(da Feeder Industrial Ltda.,74) cNatureza:= aReturn:= {Especial, 1, Administrao, 1, 2, 2, ,1} cNomeProg:= NFEEDER cPerg:= ENTSAI nLastKey:= 0 lContinua:= .T. nLi:= 0 wnrel:= NFEEDER nTamNf:=72 // Apenas Informativo Pergunte(cPerg,.F.) // Pergunta no SX1 cString:=luSF2" wnrel:= SetPrint(cString,wnrel,cPerg,cTitulo,cDesc1,cDesc2,cDesc3,.T.) SetDefault(aReturn,cString) If nLastKey == 27 Return Endif #IFDEF WINDOWS RptStatus({ Execute(Relato)}) Return #ENDIF Function Relato SetPrc(0,0) // Aqui est a chamada da funo AvalImp. Configura a // impressora de acordo com as definies em aReturn // escolhidas pelo usurio na funo SetPrint @ 00,00 PSAY AvalImp(220) dbSelectArea(SF2) dbSeek(xFilial()+mv_par01+mv_par03,.T.) // O programa segue normalmente... Return Aviso controle, dependente das configuraes escolhi

Tipo: Tela DOS/Windows ----------------------- Page 130----------------------Monta uma janela exibindo o texto desejado e, opcionalmente, disponibilizando opes de escolha para o usurio. Sintaxe Aviso(cTitulo,cMensagem,aOpcoes) Parmetros cTitulo Titulo da janela. cMensagem Mensagem para ser exibida no interior da janela. O tamanho mximo de 90 caracteres. AOpcoes Array de caracteres com as opes para a montagem de menu (na verso DOS) ou dos botes (na verso Windows). Retorna nResp Retorno. Retorna o nmero da opo escolhida pelo usurio. Exemplo // Exemplo de uso da funo Aviso: While .T. GravaArq() // Funo qualquer (apenas p/exemplo) If !File(ifTESTE.TXTle) aOp:= {i.SimlO,l=NaolJ,l.Cancelal.} cTit:= i.Atencao!l= cMsg:= iMO arquivo TESTE.TXT nao foi gravado!lT cMsg:= cMsg + iM Tenta novamente?l= nOp:= Aviso(cTit,cMsg,aOp) If nOp == 1 // Sim Loop ElseIf nOp == 3 // Cancela Return Else // Nao ou <ESC> Exit Endif Endif Exit EndDo // Faz o processamento... Return AxCadastro Tipo: Processamento

Gerao de modelo 1. Rotina para criao e manuteno de cadastros no padro do SIGA Advanced, contendo as opes padronizadas: PESQUISA, INCLU-SO, ALTERAO, VISUALIZAO e EXCLUSO. Disponibiliza o Browse e todas as funes de cadastramento padro.

Sintaxe AxCadastro(cAlias,cTitulo,cDel,cOk) Parmetros cAlias Alias do arquivo. Deve obrigatoriamente ter sua estrutura definida no SX3. cTitulo Ttulo da Janela. cDel Funo para validar a excluso. cOk Funo para validar a Incluso/Alterao. Comentrios Deve ser utilizada para editar arquivos endo semelhante aos cadastros de Clientes, Fornecedores e etc... Exemplo // Exemplo de uso de cadastro de arquivo especifico: ----------------------- Page 131----------------------AxCadastro(SZ1,Cadastro de Descontos,.T.",.T.) Return @ n1 ,n2 BmpButton Tipo: Tela Windows Cria um boto de bitmap padro do SigaAdv Win. Sintaxe @ nLinha,nColuna BMPBUTTON TYPE nBotao ACTION cFuncao OBJECT oBtn Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior nBotao Nmero do boto padronizado cFuncao Funo que ser executada oBtn Objeto associado ao boto Comentrios Para executar funes definidas em um mesmo Execute(Nome da funo) ou ExecBlock(Nome do Arquivo) para chamar outro .PR?. Exemplo Ver exemplo no programa RDDEMO. @... Bitmap... Size .PR? utilizar a funo especficos (Famlia SZ?), s

Tipo: Tela Windows Define a rea em que ser mostrado um BITMAP na janela. Sintaxe @ nLinha,nColuna BITMAP SIZE nAltura,nLargura FILE cArq Parmetros nLinha nColuna nAltura nLargura cArq Exemplo Ver exemplo no programa RDDEMO . @...Button Tipo: Tela Windows Cria um boto com texto. Sintaxe @ nLinha,nColuna BUTTON cTexto SIZE nAltura,nLargura ACTION cFuno Object oBtn Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior ----------------------- Page 132----------------------cTexto Texto que ser apresentado no boto. Deve incluir um _ antes da letra que ut ilizada como Hot Key. Ex.: ( _Salvar,Edi_Tar) nAltura Altura do boto nLargura Largura do boto cFuno Funo que ser executada Object oBtn Objeto associado ao boto. Comentrios Para executar funes definidas em um mesmo .PR? utilizar a funo Execute(Nom e da funo) ou ExecBlock(Nome do Arquivo) para chamar outro .PR?. Exemplo Ver exemplo no programa RDDEMO. BTVCanOpen Verifica se a tabela BTrieve pode ser aberta. Nmero da Linha superior Nmero da Coluna superior Altura de apresentao do BITMAP Largura de apresentao do BITMAP Nome do arquivo BITMAP

Sintaxe BTVCanOpen( cNome , [ cIndice ])->Lgico Argumento cNome er testada. Obrigat. Sim Tipo C C Descrio Nome da tabela a s Nome do arquivo de nd Descrio

cIndice No ice da tabela a ser testada. Retorno

No possvel abrir a tabela testada. Principais motivos: No existe o arquivo da tabela ou .F. do ndice fisicamente, ou as definies da tabela ou ndi ce em questo no foram encontradas. .T. Descrio Esta funo verifica se a tabela definida pelo parmetro cN ome pode ser aberta e, se existir, o parmetro cIndice verifica, tambm, se o ndice pode ser aberto. Par a tanto, testado se os arquivos envolvidos existem fisicamente, caso afirmativo, verificado se as definies envolvidas so encontradas nos arquivos do DDF s. Exemplo // Este exemplo demonstra o uso tpico de BTVCanOpen(). Se no falhar, a tabela e o ndice testados sero abertos. Se falhar, uma mensagem apresentada. IF !BTVCanOpen("\dadosadv\aa1990.dat", "\dadosadv\ind1.ind") Messagebox("No possvel abrir a tabela testada","Erro", 0) BREAK ELSE Use "\dadosadv\aa1990.dat" SHARED NEW OrdListAdd("\dadosadv\ind1.ind") ENDIF ----------------------- Page 133----------------------BTVCreateDDFs Gera os arquivos de definies (DDFs) rramentas que manipulam arquivos Btrieve (Crystal Reports). Sintaxe BTVCreateDDFs ( aTabelas , [ cDiretorio ])->Lgico Argumento Obrigat. Tipo Descrio compatveis com outras fe A tabela testada pode ser aberta.

aTabelas Sim trios (opcional).

Nomes das tabelas e os respectivos dire Nome DDF s. do diretrio (abaixo do root)

Retorno

Descrio

No conseguiu gerar os novos arquivos de definio. Principais erros: RDD no Btrieve; .F. diretrio no est dentro do Protheus; no pode carregar as informaes de efinio ou no pode gravar os novos arquivos de definio. .T. Descrio Esta funo transforma as informaes armazenadas nos arquivos DDF s para o padro utilizado por outras ferramentas, principalmente para gerao de relatrios. Sendo que podem ser selecionadas apenas as tabelas de interesse atravs do parmetro aTabelas. Ex: aTabelas := {{"AA3990", "C:\DADOS"},{"AA4990", "C:\DADOS1"},{"AA5990"}} Se o diretrio no for especificado, ser utilizado o diretrio definido no arqu ivo FILE.BTV. Os novos arquivos de definio, FILE.DDF, FIELD.DDF e INDEX.DDF, so gerados no diretrio especificado pelo parmetro cDiretrio, se ele for omitido, sero gerados no mes mo diretrio dos SXs. Exemplo // Este exemplo demonstra o uso tpico de BTVCreateDDFs(). Se no falhar, sero ger ados os novos arquivos de definio. Se falhar, uma mensagem apresentada. b:= {{"AA3990"}, {"SA1990", "c:\protheus507\dadosadv"}} IF !BTVCreateDDFs(b, "\temp") // Ser concatenado com o RootPath Messagebox("No foi possvel montar o array com os nomes das tabelas","Erro", 0 ) BREAK ENDIF BTVTables BTVDropIdxs Apaga os ndices da tabela corrente. Sintaxe BTVDropIdxs ()->Lgico ----------------------- Page 134----------------------Transformao de definies ocorrida com sucesso.

cDiretorio No C onde sero criados os novos

Retorno

Descrio

No conseguiu apagar os ndices. Principais erros: RDD no Btrieve, no ach ou as definies .F. no DDF, o arquivo no est exclusivo .T. Descrio Deleo de ndices ocorrida com sucesso

A funo BTVDropIdxs apaga os ndices da tabela corrente, com exceo do ndice int rno, apenas se o mesmo for Btrieve e estiver aberto exclusivo. Para tanto ela executa o s seguintes passos: 1. 2. Fecha todos os ndices; Apaga as definies dos ndices nos arquivos do diretrio DDF;

3. Apaga os ndices do arquivo da tabela corrente. Todos os ndices criados de forma permanente ficam guardados na estrutura da tabela. Quando a tabela for aberta, todos os ndices criados de forma permanente e o ndice interno sero abertos tambm. Por isso, recomendada a c riao de ndices de forma temporria. Exemplo // Este exemplo demonstra o uso tpico de BTVDropIdxs(). Se no falhar, os ndices so apagados e o processo continua. Se falhar, uma mensagem apresentada. USE Clientes SHARED NEW IF !BTVDropIdxs() Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0) BREAK ENDIF CTREEDELIDXS() DBCLEARINDEX() BTVTables Retorna array composto por nomes das tabelas definidas no DDF do Protheus (FI LE.BTV). Sintaxe BTVTables ()-->Array Retorno NIL D s. no Descrio

No conseguiu montar o array. Principais erros: RD Btrieve ou no conseguiu recuperar as informaes corretamente do arquivo FILE.BTV do DDF

Array Descrio

Lista com os nomes das tabelas extradas do DDF.

Verifica todos os nomes das tabelas armazenados no arquivo FILE.BTV do DDF e retorna um array com todos eles. Toda tabela criada possui o nome acrescentado neste arquivo de de finies. Exemplo ----------------------- Page 135----------------------// Este exemplo demonstra o uso tpico de BTVTables(). Se no falhar, montado um arr ay com os nomes das tabelas e esses nomes so mostrados no servidor. Se falhar, uma m ensagem apresentada. a:= BTVTables() IF a=Nil Messagebox("No foi possvel montar o array com os nomes das tabelas","Erro", 0) BREAK ELSE FOR i:= 1 to LEN(a) ConOut(a[i]) NEXT ENDIF BTVCREATEDDFS CDow Converte uma data para uma cadeia de caracteres contendo o dia da semana. Sintaxe CDOW( dExp ) --> Caracter Argumento dExp Retorno de Caracter caracteres. "" Descrio CDOW() uma funo que converte uma data para uma cadeia de caracteres. Exemplos dData := DATE() // Resultado: 09/01/90 cDiaDaSemana := CDOW(DATE()) // Resultado: Friday A Obrigat. Sim Tipo D Descrio Nome do dia da semana como primeira letra maiscula e as demais minsculas. uma cadeia Descrio a data a converter.

Caso a data seja invlida ou nula

cDiaDaSemana := CDOW(DATE() + 7) // Resultado: Friday cDiaDaSemana := CDOW(CTOD("06/12/90")) // Resultado: Tuesday CTOD() DATE() DAY() DOW() CMonth Converte uma data para uma cadeia de caracteres contento o nome do ms. Sintaxe ----------------------- Page 136----------------------CMONTH( dData ) --> Caracter Argumento dData Retorno Obrigat. S Descrio de caracter Tipo D Descrio a data a converter.

Caracter Retorna o nome do ms em uma cadeia es. A primeira letra do retorno em maiscula e o restante do nome, em minsculas. "" Descrio

Caso a data seja invlida ou nula.

CMONTH() uma funo de converso de datas que retorna uma cadeia de caracteres com o nome do ms em ingls. Exemplos Estes exemplos ilustram CMONTH(): cMes cMes cMes cMes := := := := CMONTH(DATE()) // Resultado: September CMONTH(DATE() + 45) // Resultado: October CMONTH(CTOD("12/01/94")) // Resultado: December SUBSTR(CMONTH(DATE()), 1, 3) + STR(DAY(DATE())) // Resultado: Sep 1

CDOW() DATE() DAY() MONTH() Commit

Salva em disco as modificaes de todas as tabelas. Sintaxe COMMIT Descrio Este comando salva em disco todas as atualizaes pendentes em todas as reas de traba lho. Exemplo // Este exemplo demonstra como se pode utilizar o COMMIT para salvar todas as al teraes realizadas nas reas de trabalho abertas no momento. USE Clientes NEW ----------------------- Page 137----------------------DBGOTO(100) Nome := "Jose" USE Fornecedores NEW DBGOTO(168) Nome := "Joao" COMMIT// Salva em disco as alteraes realizadas nas tabelas Clientes e Fornecedores DBCOMMIT DBCOMMITALL Copy File Copia Arquivos. Sintaxe CopyFile( cOrigem, cDestino) --> NIL Argumento Obrigat. Tipo Nomes os, aceita tanto arquivos cOrigem Sim C que esto no Servidor. locais dos arquivos Descrio a serem copiad arquivos

( Cliente ), como

WildCards so aceitos normalmente. Diretrio com o destino dos arquivos a serem copiados, podendo cDestino Sim ocal ). Retorno escrio NIL em retorno. S D C tambm ser no servidor ou no cliente ( estao l

Descrio Copia um arquivo, da origem para o destino, os caracteres * e ?, so aceitos norma lmente. Caso a origem esteja no cliente e o destino arquivos so copiados para o servidor, o contrrio tambm valido. Exemplo __CopyFile( "C:\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos do cliente para o Servidor __CopyFile( "\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos no servidor CPYT2S( ) CPYS2T( ) Copy Structure Copia a estrutura da tabela corrente para uma nova tabela. Sintaxe COPY STRUCTURE [FIELDS Campos] TO Arquivo ----------------------- Page 138----------------------Argumento udos na Campos Arquivo iada. Descrio Este comando utilizado para criar nova tabela copiando a estrutur a da tabela atual, sendo que pode-se selecionar apenas os campos de interesse atravs da opo "FIELD Campos" que s e omitida, deixa que o comando copie toda a estrutura. Semelhante ao funcionamento da funo DBCREATE com a passagem de parmetro DB STRUCT. Exemplo // Este exemplo demonstra como utilizar o comando COPY STRUCTURE no seu modo mais usual: USE Cliente NEW COPY STRUCTURE FIELDS Nome,Idade TO NovoCliente // Este exemplo demonstra como o comando COPY STRUCTURE pode substituir o DBC nova Obrigat. tabela, No Sim se Tipo Descrio dos campos a serem incl no servidor os

Lista omitido

sero includos todos os campos. C Nome do arquivo da nova tabela a ser cr

REATE: USE Cliente NEW COPY STRUCTURE TO NovoCliente // *** semelhante a *** USE Cliente NEW DBCREATE("NovoCliente",DBSTRUCT()) DBCREATE( ) DBSTRUCT( ) AFIELDS( ) Copy To Copia registros da tabela corrente para uma nova tabela. Sintaxe COPY TO Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] [VIA RDD] [SDF DELIMITED [WITH BLANK cDelimitador] ] Argumento Obrigat. ser apenas o nome ou na forma de uma stri ng Lista piados, se Campos CondFor para omitido sero No No registro copiados todos os campos. Expresso seja copiado. Expresso em ADVPL que determina quando a cpia deve parar CondWhile No (quando a expresso retornar .F.). nRecs nRecno . ----------------------- Page 139----------------------Nome do RDD utilizado na importao (ent re aspas simples ou RDD No dupla), se omitido ser utilizado o RD D corrente. Especifica qual caracter foi utiliza No No N N Quando registros devem ser copiados. Nmero do recno do registro a ser copiado em ADVPL a ser resolv ida que o dos campos a serem co Tipo Descrio Nome s sero exportados, pode Arquivo Sim do arquivo cujos registro

do como delimitador para gerar cDelimitador No Descrio

C o arquivo do tipo texto.

Este comando utilizado para copiar alguns registros da tabela corrente para o arquivo especificado por "TO cArquivo" utilizando-se o driver especificado por "VIA RDD" se especific ado. Se forem especificados os campos de interesse atravs de "FIELDS Campos" apenas eles s ero copiados, caso contrrio todos campos o sero. Se no forem especificadas as condies para que o registro a copiado, copia toda a tabela como se estivesse especificada a opo "ALL". Pode-se especificar um escopo para que os registros se jam copiados atravs das opes "FOR CondFor" e "WHILE CondWhile". Pode-se tambm limitar o nmero de registros a serem c opiados atravs da opo "NEXT nRecs" e determinar que a cpia dos registros deve-se iniciar a partir do registro atual com "REST", mas caso contrrio o comando executa um DBGOTOP() antes de inici ar a cpia. Se desejado copiar apenas determinado registro pode-se defini-lo atravs da es pecificao do recno com "RECORD nRecno".

sej

Alm de copiar registros para uma tabela normal, pode-se copiar registros para um arquivo texto que contenha os dados desejados. Existem duas formas de gerar est es arquivos textos com COPY TO, utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preen chendo com espaos) ou atravs de um delimitador que separa os campos",". Deve-se especificar na cpi a qual o tipo do arquivo texto atravs das opes "SDF" ou "DELIMITED". Pode-se ainda especificar qual o delimi tador utilizado nas strings da seguinte forma: "DELIMITED WITH BLANK" - as strings no possuem delimitador; "DELIMITED WITH cDelimitador" - as strings so delimitadas com o caracter especificado; Caso seja omitido, o delimitador ser considerado o delimitador padro (" "). Exemplo // Este exemplo demonstra como utilizar o comando COPY TO criar nova tabela c om alguns campos escolhidos e alguns registros (apenas 10) da tabela atual pertencentes a um escopo definido a partir do registro atual para determinada tabela: USE Cliente VIA "CTREECDX" NEW COPY TO Amigos FIELDS Nome,Nascimento,End,Tel FOR Idade>20 WHILE Nome<"VVV" N EXT 10 REST // Este exemplo demonstra como se pode utilizar o comando COPY TO para gravar os dados de

uma tabela em um arquivo do tipo texto (DELIMITED) e inclu-los a outra tabela com o comando APPEND FROM: USE Amigos NEW COPY TO temp DELIMITED // Registro: "Jose",19751108,69411233,12.00 COPY TO temp1 DELIMITED WITH BLANK // Registro: Jose 19751108 6941 1233 12.00 COPY TO temp2 DELIMITED WITH "@" // Registro: @Jose@,19751108,69411 233,12.00 USE Cliente NEW APPEND FROM temp DELIMITED USE Cliente1 NEW APPEND FROM temp1 DELIMITED WITH BLANK USE Cliente2 NEW APPEND FROM temp2 DELIMITED WITH "@" // Este exemplo demonstra como se pode utilizar o comando <@>COPY TO para gra var os dados de uma tabela em um arquivo do tipo texto (SDF) e inclu-los a outra tabela com o comando APPEND FROM: USE Amigos NEW COPY TO temp3 SDF // Registro: Jose 1975110869411233 12.00 USE Cliente3 NEW APPEND FROM temp3 SDF APPEND FROM ----------------------- Page 140----------------------CPYS2T Copia arquivos do servidor para o cliente ( Remote ). Sintaxe CpyS2T( cOrigem, cDestino, [lCompacta]) --> NIL Argumento dos, aceita cOrigem nte. cDestino ote (Cliente). Sim C L Descrio Arquivo foi copiado para o cliente com sucesso Erro na cpia do Arquivo. Diretrio com o destino dos arquivos no rem Indica se a cpia deve ser feita compactando Obrigat. Tipo Descrio Nomes dos apenas arquivos Sim C no servidor, WildCards so aceitos normalme arquivos a serem copia

lCompacta No o arquivo antes. Retorno .T. .F. Descrio

Copia um arquivo, do servidor para o cliente ( Remote ), os caracteres * e ?, so aceitos normalmente. Caso a compactao seja habilitada ( lCompacta ), os dados sero transmitidos de manei ra compactada e descompactados antes do uso. Exemplo CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .T. ) // Copia arquivos do servidor para o remote local, compactando antes de transmitir CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .F. ) // Copia arquivos do servidor para o remote local, sem compactar antes de transmitir CPYT2S() CPYT2S Copia Arquivos entre o Cliente ( Terminal ) para o servidor. Sintaxe CpyT2S( cOrigem, cDestino, [ lCompacta ]) --> NIL Argumento Obrigat. Tipo Descrio Nomes dos, aceita apenas COrigem Sim ormalmente. cDestino Sim ote ( Cliente ). lCompacta No o arquivo antes. Retorno .T. .F. C L Descrio Arquivo foi copiado para o cliente com sucesso. Erro na cpia do Arquivo. Diretrio com o destino dos arquivos no rem Indica se a cpia deve ser feita compactando arquivos C locais ( Cliente ), WildCards so aceitos n dos arquivos a serem copia

----------------------- Page 141----------------------Descrio Copia um arquivo, do cliente ( Remote os caracteres * e ?, so aceitos normalmente. ) para o servidor,

Caso a compactao seja habilitada ( lCompacta ero transmitidos de maneira compacta e descompactados antes do uso.

), os dados

Exemplo CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP", .T. ) // Copia arquivos do cliente( rem ote ) para o Servidor compactando antes de transmitir CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP" ) // Copia arquivos do cliente( remote ) para o Servidor sem compactar. CPYS2T() CTreeDellnt Deleta ndice interno da tabela CTree. Sintaxe CTreeDelInt( cNome )->Lgico Argumento Obrigat. Tipo C Descrio Especifica o nome da tabela cujo ndi

cNome Sim ce interno deve ser deletado. Retorno Descrio

No conseguiu deletar o ndice interno. Principais erros: tabela no e st dentro do diretrio .F. do Protheus; no abriu a tabela ou no deletou o arquivo de ndice int erno. .T. Descrio A funo CtreeDelInt apaga o ndice interno de tabela Ctree, estando a mesma f echada. Para tanto, so executados os seguintes procedimentos: 1. 2. 3. Abre a tabela especificada pelo parmetro cNome; Verifica o nome do arquivo do ndice interno na tabela; Fecha a tabela; Deleo do ndice interno ocorrida com sucesso.

4. Deleta fisicamente o arquivo do ndice interno. A tabela deve ser apagada aps a chamada desta funo, pois a tabela CTree no pode s er aberta sem ndice interno. Exemplo // Este exemplo demonstra o uso tpico de CtreeDelInt(). Sendo que a tabela "\DADOSADV\SA1990.DTC" deve estar fechada. Se no falhar, o ndice interno apagad o e o processo continua. Se falhar, uma mensagem apresentada. IF !CtreeDelInt("\dadosadv\sa1990.dtc") Messagebox("No foi possvel deletar o ndice da tabela","Erro", 0)

BREAK ENDIF fErase("\dadosadv\sa1990.dtc") CTREEDELIDXS() ----------------------- Page 142----------------------DBCLEARINDEX() UPDATEINTNAME() CTreeDelIdxs Deleta os ndices da tabela corrente. Sintaxe CTreeDelIdxs()->Lgico Retorno Descrio

.F. No conseguiu deletar os ndices. Principais erros: RDD no Ctre; no f echou a tabela; no apagou o arquivo de ndice; no atualizou as in formaes da tabela; no abriu a tabela novamente. .T. Descrio Deleo de ndices ocorrida com sucesso.

A funo CtreeDelIdxs apaga os ndices da tabela corrente, com exceo do ndice in erno, apenas se o mesmo for CTree e estiver exclusiva. Para tanto, ela executa os seguin tes passos: 1. 2. 3. 4. 5. Fecha os ndices abertos; Fecha a tabela; Deleta os arquivos de ndice fisicamente; Atualiza as informaes da tabela, removendo os ndices de sua estrutura; Abre novamente a tabela.

Todos os ndices criados de forma permanente ficam guardados na estrutur a da tabela. Portanto, no adianta deletar os arquivos de ndices, pois quando a tabela f or aberta, todos os ndices criados de forma permanente e o ndice interno sero recriados fisicamente (se no existirem); ca so contrrio, a tabela no ser aberta. Por isso, recomendada a criao de ndices de forma temporria. Exemplo // Este exemplo demonstra o uso tpico de dices so apagados e o CtreeDelIdxs(). Se no falhar, os n

processo continua. Se falhar, uma mensagem apresentada. USE Clientes SHARED NEW IF !CtreeDelIdxs() Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0) BREAK ENDIF CTREEDELINT( ) DBCLEARINDEX( ) BTVDROPIDXS( ) CurDir Retorna o diretrio corrente. ----------------------- Page 143----------------------Sintaxe CURDIR([ cNovoDir ]) --> cDirAtual Argumento cNovoDir mo corrente. Obrigat. No Retorno cDirAtual Descrio Retorna o diretrio corrente do servidor, caso seja passado um caminho como parmetr o, esse diretrio passar a ser o default. Exemplo ? CURDIR("C:\TEMP") FILE() DIRCHANGE() MAKEDIR() DIRREMOVE() Date Retorna a data do sistema. Sintaxe DATE() --> Data Tipo C Descrio Caminho com o novo diretrio que ser ajustado co Descrio bDiretrio corrente, sem a ltima barra.

Retorno Data Descrio

Descrio Data do sistema.

DATE() a funo que retorna a data do atual sistema. O formato de sada controlado pel o comando SET DATE. O formato padro mm/dd/yy. Exemplos Estes exemplos mostram como usar a funo DATE(): dData := DATE() // Resultado: 09/01/01 dData := DATE() + 30 // Resultado: 10/01/01 dData := DATE() - 30 // Resultado: 08/02/90 dData := DATE() cMes := CMONTH(dData) // Resultado: September CTOD() DTOC() ----------------------- Page 144----------------------DTOS() Day Retorna o dia do ms como valor numrico. Sintaxe DAY( dData ) -->Numrico Argumento dData Retorno >=0 e <=31 so considerados. no for bissexto, ou 0 se o argumento dData for vazio. Descrio DAY() uma funo de converso er o valor data em um nmero inteiro que representa o dia do ms. de datas usada para convert Obrigat. Sim Descrio Se o ms do argumento dData for fevereiro, anos bissextos Se a data do argumento dData for 29 de fevereiro e o ano Tipo D Descrio a data a converter.

Esta funo pode ser usada em conjunto com CMONTH() e YEAR() para formatar datas. Pode ser

usada tambm em diversos clculos envolvendo datas. Exemplos Estes exemplos mostram a funo DAY() de diversas maneiras: dData := DATE() // Resultado: 09/01/01 nDia := DAY(DATE()) // Resultado: 1 nDia := DAY(DATE()) + 1 // Resultado: 2 nDia := DAY(CTOD("12/01/94")) // Resultado: 1 Este exemplo mostra a funo DAY() usada em conjunto com CMONTH() e YEAR() para formatar o valor da data: dData := Date() cData := CMONTH(dData) + STR(DAY(dData)) + "," + STR(YEAR(dData)) // Resultado : June 15, 2001 CDOW() CMONTH() DOW() MONTH() YEAR() DBAppend Acrescenta um novo registro na tabela corrente. Sintaxe ----------------------- Page 145----------------------DBAppend ([ lLiberaBloqueios ]) ->Nil Argumento Obrigat. Tipo L Descrio Libera todos os registros bloqueado

lLiberaBloqueios No s (locks), valor padro .T. Descrio

Esta funo acrescenta mais um registro em branco no final da tabela corrente, sempre acrescentado e bloqueado. Se o parmetro estiver com valor .T., todos os bloqueios de registros anteriores so liberados para que o novo registro seja acrescentado, caso contrrio, se for .F., todos os bloqueios anteriores so mantidos. Se este parmetro no for especificado, o valor padro .T.. Exemplo // Este exemplo demonstra como se pode utilizar o dbappend liberando e manten do bloqueios anteriores.

USE Clientes NEW FOR i:=1 to 5 DBAPPEND(.F.) NOME := "XXX" END : "YYY" NEXT // Os 5 registros includos permanecem bloqueados DBAPPEND() // Todos os bloqueios anteriores so liberados RLOCK( ) DBRLOCK( ) DBClearAllFilter Limpa a condio de filtro de todas as ordem as ordens da lista. Sintaxe DBClearAllFilter() ->Nil Retorno NIL Descrio Esta funo salva as atualizaes realizadas e pendentes de todas as tabelas e depois limpa as condies de filtro de todas as ordens inclusas na lista. Seu funcionamento oposto ao comando SET FILTER. Exemplo // Este exemplo demonstra como se pode utilizar DBCLEARALLFILTER para limpar a expresso de filtro. USE Clientes NEW DBSETFILTER( { Idade < 40}, "Idade < 40" ) // Seta a expresso de filtro ... DBCLEARALLFILTER() // Limpa a expresso de filtro de todas as ordens ----------------------- Page 146----------------------DBFILTER DBSETFILTER DBCLEARFILTER DBClearIndex Fecha todos os arquivos de ndice da rea de trabalho. Sintaxe Nenhum Descrio

DBClearIndex () ->Nil Retorno NIL Descrio Esta funo salva as atualizaes pendentes na tabela corrente e fecha todos os ar quivos de ndice da rea de trabalho, por conseqncia limpa todas as ordens da lista. Seu funcionamento oposto ao comando <@>SET INDEX. Exemplo // Este exemplo demonstra como se pode utilizar a funo DBCLEARINDEX para fechar os ndices. USE Clientes NEW DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome" ... DBCLEARINDEX() // Fecha todos os arquivos de ndices DBREINDEX DBSETINDEX DBSETORDER DBClearIndex Fecha todos os arquivos de ndice da rea de trabalho. Sintaxe DBClearIndex () ->Nil Retorno NIL Descrio Esta funo salva as atualizaes pendentes na tabela corrente e fecha todos os ar quivos de ndice da rea de trabalho, por conseqncia limpa todas as ordens da lista. Seu funcionamento oposto ao comando <@>SET INDEX. ----------------------- Page 147----------------------Exemplo // Este exemplo demonstra como se pode utilizar a funo DBCLEARINDEX para fechar os ndices. USE Clientes NEW DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome" Descrio Nenhum Nenhum Descrio

... DBCLEARINDEX() // Fecha todos os arquivos de ndices DBREINDEX DBSETINDEX DBSETORDER DBCloseArea Fecha a rea de trabalho. Sintaxe DBCloseArea () ->Nil Retorno NIL Descrio Esta funo salva as atualizaes pendentes na tabela corrente, libera todos os registros bloqueados e fecha a tabela corrente (rea de trabalho). Seu funcionamento semelhante ao comando CLOSE e oposto funo DBUSEAREA e ao comando USE. Exemplo // Este exemplo demonstra como se pode utilizar o DBCLOSEAREA para fechar a re a de trabalho atual. USE Clientes NEW DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome" ... DBCLOSEAREA() // Fecha a rea de trabalho atual, todos os indices e ordens DBCOMMIT DBUSEAREA DBCommit Salva em disco todas as modificaes da tabela corrente. Sintaxe DBCommit() ->Nil Retorno NIL Descrio ----------------------- Page 148----------------------Descrio Nenhum Nenhum Descrio

Esta funo salva em disco todas as atualizaes pendentes na rea de trabalho corrente. Exemplo // Este exemplo demonstra como se pode utilizar o DBCOMMIT para salvar todas as alteraes realizadas na rea de trabalho atual. USE Clientes NEW DBGOTO(100) Nome := "Jose" USE Fornecedores NEW DBGOTO(168) Nome := "Joao" DBCOMMIT() // Salva em disco apenas as alteraes realizadas na tabela Fornecedores DBCOMMITALL DBUNLOCK DBCommitAll Salva em disco todas as modificaes. Sintaxe DBCommitAll () ->Nil Retorno NIL Descrio Esta funo salva em disco todas as atualizaes pendentes em todas as reas de trabalho. Exemplo // Este exemplo demonstra como se pode utilizar o DBCOMMITALL para salvar todas as alteraes realizadas nas reas de trabalho abertas no momento. USE Clientes NEW DBGOTO(100) Nome := "Jose" USE Fornecedores NEW DBGOTO(168) Nome := "Joao" DBCOMMITALL() // Salva em disco as alteraes realizadas nas tabelas Clientes e Fornecedores DBCOMMIT DBUNLOCK DBCreate Cria nova tabela. Sintaxe Descrio Nenhum

DBCREATE( cNome , aEstrutura , [ cDriver ]) --> Nil ----------------------- Page 149----------------------Argumento Obrigat. Tipo C Array Descrio Nome do arquivo da tabela a ser criad Lista com as informaes dos campos para Nome do RDD a ser utilizado para a cr iao da tabela. Se for omitido cDriver N C ser criada com o corrente. Retorno NIL Descrio Esta funo utilizada para criar um novo arquivo de tabela cujo nome est esp ecificado atravs do primeiro parmetro (cNome) e estrutura atravs do segundo (aEstrutura). A estrutura especificada atravs de um array com todos os campos, onde ca da campo expresso atravs de um array contendo {Nome, Tipo, Tamanho, Decimais}, como visto no exempl o a seguir. Exemplo // Este exemplo mostra como se pode criar novo arquivo de tabela atravs da funo DBCREATE: LOCAL aEstrutura := {{Cod,N,3,0},{Nome,C,10,0},{Idade,N,3,0},{Nasc,D,8,0},{Pa gto, N,7,2}} DBCREATE("\teste\amigos.xxx",aEstrutura) // Cria a tabela com o RDD corrente USE "\teste\amigos.xxx" VIA "DBFCDX" NEW DBUSEAREA DBSTRUCT( ) DBCreateIndex Cria um arquivo de ndice. Sintaxe DBCREATEINDEX( cNome , cExpChave , [ bExpChave ], [ lUnico ]) --> Nil Argumento cNome ser criado. Obrigat. S Tipo C Descrio Nome do arquivo de ndice a Descrio Nenhum

cNome S a (abaixo do "RootPath"). aEstrutura ser criada a tabela. S

Expresso o ndice a cExpChave ser criado S na forma C de string. Bloco de do ndice a ser criado na forma bExpChave N Cdigo lUnico (o padro .F.). Retorno N Descrio L executvel. Expresso

das

chaves

das

chaves

Cria ndice como nico

No h tabela corrente ou a posio do campo especificado est invlida. Nil Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for tamanho ou casas decimais, tipo caracter se for nome ou tip o). Descrio ----------------------- Page 150----------------------Esta funo utilizada para criar um novo arquivo de ndice com o nome especificado atr avs do primeiro parmetro, sendo que se o mesmo existir deletado e criado o novo. Para tanto so executados os passos a seguir: 1. 2. 3. 4. 5. Salva fisicamente as alteraes ocorridas na tabela corrente; Fecha todos os arquivos de ndice abertos; Cria o novo ndice; Seta o novo ndice como a ordem corrente; Posiciona a tabela corrente no primeiro registro do ndice.

Com exceo do RDD Ctree, a tabela corrente no precisa estar aberta em modo exclusivo para a criao de ndice, pois na criao de ndices no Ctree alterada a estrutur a da tabela, precisando para isto a tabela estar aberta em modo exclusivo. Exemplo // Este exemplo mostra como se pode criar novo arquivo de ndice criando a ordem s obre os campos Nome e End e no aceitar duplicao: USE Cliente VIA "DBFCDX" NEW DBCREATEINDEX ("\teste\ind2.cdx","Nome+End",{ Nome+End },.T.) DBREINDEX( ) DBSETINDEX( ) DBSETORDER( )

DBCreateIndex Cria um arquivo de ndice. Sintaxe DBCREATEINDEX( cNome , cExpChave , [ bExpChave ], [ lUnico ]) --> Nil Argumento cNome er criado. ndice cExpChave a ser S Obrigat. S Tipo C Descrio Nome do arquivo de ndice a s Expresso criado na forma C de string. do ndice a ser criado bExpChave N lUnico .F.). Retorno N Descrio Bloco de na forma Cdigo L Expresso executvel. Cria ndice como nico (o padro das chaves das chaves do

No h tabela corrente ou a posio do campo especificado est invlida. Nil Informao do campo Informao requisitada pelo usurio (pode ser de ti po numrico se for tamanho ou casas decimais, tipo caracter se for nome ou tipo) . Descrio ----------------------- Page 151----------------------Esta funo utilizada para criar um novo arquivo de ndice com o nome especificado atravs do primeiro parmetro, sendo que se o mesmo existir deletado e criado o novo. Para ta nto so executados os passos a seguir: 1. 2. 3. 4. 5. Salva fisicamente as alteraes ocorridas na tabela corrente; Fecha todos os arquivos de ndice abertos; Cria o novo ndice; Seta o novo ndice como a ordem corrente; Posiciona a tabela corrente no primeiro registro do ndice.

Com exceo do RDD Ctree, a tabela corrente no precisa estar aberta em modo exclusivo para a criao de ndice, pois na criao de ndices no Ctree alterada a estrutura da tabela, pr sando para isto a

tabela estar aberta em modo exclusivo. Exemplo // Este exemplo mostra como se pode criar novo arquivo de ndice criando a orde m sobre os campos Nome e End e no aceitar duplicao: USE Cliente VIA "DBFCDX" NEW DBCREATEINDEX ("\teste\ind2.cdx","Nome+End",{ Nome+End },.T.) DBREINDEX( ) DBSETINDEX( ) DBSETORDER( ) Deleted Verifica se o registro foi deletado. Sintaxe DELETED() --> Lgico Retorno .F. .T. Descrio Quando o registro deletado, permanece fisicamente na tabela, mas fica m arcado como "deletado". Esta funo verifica este estado. Quando executada a funo DBPACK todos os registros ma rcados como deletados so apagados fisicamente enquanto a funo DBRECALL marca todos os registros deletados como no-deletados. Exemplo // Este exemplo verifica se determinado registro est deletado, caso positivo, mostra uma mensagem: USE "\DADOSADV\AA1990.DBF" SHARED NEW DBGOTO(100) IF DELETED() ----------------------- Page 152----------------------Messagebox("O registro atual foi deletado","Erro", 0) BREAK ENDIF DBPACK( ) DBRECALL( ) Descrio O registro no foi deletado O registro foi deletado

DBEval Executa uma expresso para os registros dentro das condies especificadas. Sintaxe DBEVAL( bBloco, [ bForCond ], [ bWhileCond ], [ nProxRegs ], [ nRecno ], [ lRestante ]) --> Nil Argumento Obrigat. Tipo Bloco r resolvida para cada registro bBloco S Cdigo Bloco r resolvida para verificar se o bForCond N Cdigo scopo definido. Bloco r resolvida para verificar at bWhileCond N Cdigo bloco retornar .F.). Nmero r processado nProxRegs a partir do registro N N corrente. Identificao de determinado regis tro a ser resolvida a expresso nRecno N lRestante ro. Descrio Esta funo utilizada para executar uma expresso definida pelo bloco de cdigo do primeiro parmetro para cada registro que est dentro do escopo definido atravs dos blocos de condio de "for" e "while". O nmero de registros a ser executado ser definido com o parmetro nProxRegs ou se setado o parmetro lRestante sero executados todos os registros a partir do registro corren te at o final da tabela corrente. Se for especificado o parmetro nRecno apenas o registro com o recno especificado ser processado. Se forem omitidos os blocos de "for" siderados .T. como padro, e "while", os mesmos sero con N N (recno). L Processa o restante dos regist de registros a se qual registro ser processado (at o de Expresso na forma executvel a se registro em questo est dentro do e de processado. Expresso na forma executvel a se de Descrio Expresso na forma executvel a se

esto assim todos os registros dentro do escopo. Se o parmetro lRestante for omitido a tabela inicia o processamento dos registros a partir do topo da tabela, caso contrrio sero processados os registros a partir do posicionamento corrente da tabela. Exemplo // Este exemplo mostra como se pode usar o DBEVAL para contar quantos registr os esto dentro do escopo especificado em toda a tabela, pois como o parmetro lRestante foi omitido a tabela ir para o topo antes de iniciar a processar os registros. Sup ondo que a tabela est sobre um ndice no campo idade, sero processados registros com o Nome cuja ordem alfabtica maior que "FFFFF" e at encontrar algum registro de idade igual a 40: USE Cliente VIA "DBFCDX" NEW LOCAL nCount := 0; DBGOTO(100) DBEVAL( { nCount++}, { Nome > "FFFFF"}, { Idade < 40}) // Este exemplo mostra como se pode usar o DBEVAL para contar quantos registr os esto dentro do escopo especificado (como o exemplo anterior) a partir do registro atual (100): USE Cliente VIA "DBFCDX" NEW LOCAL nCount := 0; DBGOTO(100) ----------------------- Page 153----------------------DBEVAL( { nCount++}, { Nome > "FFFFF"}, { Idade < 40},,,.T.) // Este exemplo mostra como se pode usar o DBEVAL para colocar numa varivel um nome inicial que est definido em um registro de recno definido (100): USE Cliente VIA "DBFCDX" NEW LOCAL cNomeIni := ""; DBEVAL( { cNomeIni := Nome},,,,100) // Este exemplo mostra como se pode usar o DBEVAL para verificar qual o recno do dcimo registro a partir do corrente dentro do escopo definido: USE Cliente VIA "DBFCDX" NEW LOCAL nRecno := 0; DBGOTO(100) DBEVAL( { nRecno := RECNO()}, { Nome > "FFFFF"}, { Idade < 40},10,,.T.) AEVAL( ) EVAL DBF Verifica qual o Alias corrente. Sintaxe DBF() --> Caracter

Retorno "" o. cAlias corrente. Descrio Verifica qual o Alias da rea de trabalho corrente. quando a tabela aberta atravs do parmetro correspondente (DBUSEAREA()).

Descrio No existe tabela em us String contendo o Alias

O Alias definido

Esta funo o inverso da funo SELECT(), pois nesta retornado o nmero da re trabalho do Alias correspondente. Exemplo // Este exemplo mostra como o DBF corrente pode ser mostrado para o usurio. dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) MessageBox("O Alias corrente : " + DBF(), "Alias", 0) // Res ultado: "O Alias corrente : SSS" DBUSEAREA SELECT( ) ALIAS( ) DBFieldInfo Verifica informaes sobre um campo. Sintaxe DBFieldInfo ( nInfoTipo , nCampo ) -> Informao do Campo Argumento Obrigat. Tipo Descrio

----------------------- Page 154----------------------nInfoTipo verificada. nCampo erificado. Retorno Nil ser Descrio No h tabela corrente ou a posio do campo especificado est invlida. Informao do campo Informao requisitada pelo usurio (pode tipo numrico se for tamanho ou casas decimais, tipo caracter se for nome ou tipo). S S N N Tipo de informao a ser Posio do campo a ser v

de

Descrio

Esta funo utilizada para obter informaes sobre determinado campo da tabela c orrente. O tipo de informao (primeiro argumento) escolhido de acordo com as constantes aba ixo: DBS_DEC DBS_LEN DBS_TYPE Nmero de casas decimais (tipo numrico) Tamanho (tipo numrico) Tipo (tipo caracter)

A posio do campo no leva em considerao os campos internos do Protheus (recno e delete d). Exemplo // Este exemplo demonstra como se pode utilizar o DBFIELDINFO para obter as i nformaes do primeiro campo da tabela Clientes. USE Clientes NEW DBFIELDINFO(DBS_NAME, 1) // Retorno: Nome DBFIELDINFO(DBS_TYPE, 1) // Retorno: C DBFIELDINFO(DBS_LEN, 1) // Retorno: 10 DBFIELDINFO(DBS_DEC, 1) // Retorno: 0 DBINFO( ) DBORDINFO( ) FIELDNAME DBFilter Verifica a expresso de filtro corrente. Sintaxe DBFilter () --> Caracter Retorno "" cExpFiltro Descrio Esta funo utilizada para verificar a expresso de filtro ativo na rea de trabalho corrente. Exemplo ----------------------- Page 155----------------------// Este exemplo demonstra como se pode utilizar o DBFILTER para verificar a expr esso do filtro corrente. USE Cliente INDEX Ind1 NEW SET FILTER TO Nome > "Jose" DBFILTER() // retorna: Nome > "Jose" Descrio No existe filtro ativo na rea de trabalho atual. Expresso do filtro ativo na rea de trabalho atual.

SET FILTER TO Num < 1000 DBFILTER() // retorna: Num < 1000 DBRELATION DBRSELECT DBGoBottom Posiciona no ltimo registro lgico. Sintaxe DBGoBottom() -> Nil Retorno NIL Descrio Esta funo utilizada para posicionar a tabela corrente no ltimo registro lgico. A seqncia lgica depende da ordem e do filtro ativo sobre a tabela corrente, portanto o ltimo regi stro lgico pode no ser o ltimo registro fsico. Exemplo // Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no l timo registro fsico. USE Cliente DBGOBOTTOM() // Posiciona no ltimo registro fsico, pois no h ordem ativa // Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no l timo registro lgico. USE Cliente INDEX Ind1 NEW DBGOBOTTOM() // Posiciona no ltimo registro lgico (ltimo registro na seqncia gerada pelo ndice) DBGOTO( ) DBGOTOP( ) DBSEEK( ) DBSKIP( ) DBEOF( ) DBBOF( ) DBGoTo ----------------------- Page 156----------------------Posiciona em determinado registro. Descrio Nenhum

Sintaxe DBGoTo( nRegistro ) -> Nil Argumento nRegistro cionado. Descrio Esta funo utilizada para posicionar a tabela corrente em determinado registro, seg undo a ordem fsica (seqncia sobre o recno). Exemplo // Este exemplo demonstra como se pode utilizar o DBGOTO para posicionar a tabel a corrente em determinado registro. USE Cliente INDEX Ind1 NEW DBGOTO(100) // Posiciona no registro de recno 100 DBGOBOTTOM DBGOTOP DBSEEK DBSKIP DBEOF DBBOF DBGoTop Posiciona no primeiro registro lgico. Sintaxe DBGoTop() -> Nil bRetorno NIL Descrio Esta funo utilizada para posicionar a tabela corrente no primeiro registro lgico. A seqncia lgica depende da ordem e do filtro ativo sobre a tabela corrente, portanto o primeiro registro lgico pode no ser o primeiro registro fsico. ----------------------- Page 157----------------------Exemplo Descrio Nenhum Obrigat. S Tipo N Descrio bbbNmero do registro a ser posi

// Este exemplo demonstra como se pode utilizar o DBGOBOTOP para posicionar no p rimeiro registro fsico. USE Cliente DBGOTOP() // Posiciona no primeiro registro fsico, pois no h ordem ativa // Este exemplo demonstra como se pode utilizar o DBGOTOP para posicionar no pri meiro registro lgico. USE Cliente INDEX Ind1 NEW DBGOTOP() // Posiciona no primeiro registro lgico (primeiro registro na segncia ger ada pelo ndice) DBGOTO DBGOBOTTOM DBSEEK DBSKIP DBEOF DBBOF DBInfo Verifica informaes sobre a tabela corrente. Sintaxe DBInfo ( nInfoTipo ) -> Informao da Tabela Argumento nInfoTipo cada. Retorno Nil da informao requisitada). Descrio Esta funo utilizada para obter informaes sobre a tabela nformao (primeiro argumento) escolhido de acordo com as constantes abaixo: DBI_GETRECSIZE ipo numrico) DBI_TABLEEXT DBI_FULLPATH acter) corrente. O tipo de i Descrio No h tabela corrente. Informao da Tabela Informao requisitada pelo usurio (o tipo depende Obrigat. S Tipo N Descrio Tipo de informao a ser verifi

Tamanho do registro em nmero de bytes similar a RECSIZE (t Extenso do arquivo da tabela corrente (tipo caracter) Nome da tabela corrente com caminho completo (tipo car

DBI_BOF F (tipo lgico) DBI_EOF OF (tipo lgico)

Verifica se est posicionada no incio da tabela similar a BO Verifica se est posicionada no final da tabela similar a E

DBI_FOUND Verifica se a tabela est posicionada aps uma pesquisa simil ar a FOUND (tipo lgico) ----------------------- Page 158----------------------DBI_FCOUNT Nmero de campos na estrutura da tabela corrente similar a FCOUNT (tipo numrico) DBI_ALIAS (tipo caracter) DBI_LASTUPDATE ata) Exemplo // Este exemplo demonstra como se pode utilizar o DBINFO para obter as informaes d a tabela corrente (Clientes). USE Clientes NEW DBINFO(DBI_FULLPATH) // Retorno: C:\Teste\Clientes.dbf DBINFO(DBI_FCOUNT) // Retorno: 12 DBGOTOP() DBINFO(DBI_BOF) // Retorno: .F. DBSKIP(-1) DBINFO(DBI_BOF) // Retorno: .T. DBORDINFO( ) DBFIELDINFO( ) DBRLockList Retorna uma lista com todos os registros locados na tabela corrente. Sintaxe DBRLOCKLIST() --> Array Retorno Nil ListaLock Descrio Esta funo utilizada para verificar quais registros na tabela corrente. Para tanto, retornada uma tabela unidimensional com os nmeros dos registros. Exemplo esto locados Descrio No existe tabela corrente ou no existe nenhum registro locado. Lista com os recnos dos registros locados na tabela corrente. Nome do Alias da rea de trabalho corrente similar a ALIAS Verifica a data da ltima modificao similar a LUPDATE (tipo d

// Este exemplo mostra como utilizada a funo DBRLOCKLIST para verificar quais registros esto bloqueados na tabela corrente DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTOP() DBRLOCK() // Bloqueia o primeiro registro DBRLOCK(110) // Bloqueia o registro de nmero 110 DBRLOCK(100) // Bloqueia o registro de nmero 100 DBRLOCKLIST() // Retorna: {1,100,110} FLOCK( ) RLOCK( ) DBUNLOCK( ) ----------------------- Page 159----------------------DBRUNLOCK( ) DBRLOCK( ) DBOrderInfo Verifica informaes sobre uma ordem. Sintaxe DBOrderInfo ( nInfoTipo , [ cIndice ], [ cOrdem ao da Ordem Argumento nInfoTipo cOrdem nPosio ativas. Retorno Obrigat. S N N Descrio C N Tipo N nPosicao ]) -> Inform Descrio Nome do arquivo de ndice. Nome da ordem. Posio da ordem na lista de ordens

No h ordem corrente ou a posio da ordem especificada est invlida. Nil Informao da Ordem Informao requisitada pelo usurio (pode ser de tip o numrico se for nmero de ordens no ndice, tipo caracter se for nome do arquivo d e ndice). Descrio Esta funo utilizada para obter informaes sobre determinada ordem. A especificao da em pode ser realizada atravs de seu nome ou sua posio dentro da lista d e ordens, mas se ela no for especificada sero obtidas informaes da ordem corrente. O tipo de informao (primeiro argumento) escolhido de acordo com as constantes abai xo:

DBOI_BAGNAME caracter). ) ao qual DBOI_FULLPATH DBOI_ORDERCOUNT ado Exemplo a ordem

Nome do arquivo de ndice ao qual a ordem pertence (tipo Nome do arquivo pertence (tipo caracter) Nmero de ordens existentes no arquivo de ndice especific de ndice (com seu diretrio

// Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter informaes sobre o nome do arquivo de ndice da ordem corrente. DBORDERINFO(DBOI_BAGNAME) // retorna: Ind DBORDERINFO(DBOI_FULLPATH) // retorna: C:\AP6\Teste\Ind.cdx // Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter informaes sobre o nome do arquivo de ndice de uma ordem especificada. DBORDERINFO(DBOI_BAGNAME,,3) // retorna: Ind2 DBORDERINFO(DBOI_FULLPATH,,"Nome") // retorna: C:\AP6\Teste\Ind2.cdx // Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter o nmero de ordens de determinado arquivo de ndice. DBORDERINFO(DBOI_ ORDERCOUNT,"\Teste\Ind2.cdx") // retorna: 3 DBINFO( ) DBFIELDINFO( ) DBRecordInfo( ) ----------------------- Page 160----------------------DBOr derNickName Torna ativa a ordem com o determinado apelido. Sintaxe DBOrderNickName( cApelido ) -> Lgico Argumento rio cApelido dem a ser setada. Retorno .F. Principais erros: No existe tabela ativa ou no foi encontrada a orde m com o apelido. .T. A ordem foi setada com sucesso. Obrigat. S Descrio No conseguiu tornar a ordem ativa. Tipo C Desc Nome do apelido da or

Descrio Esta funo utilizada para selecionar a ordem ativa atravs de seu apelido. Esta ordem a responsvel seqncia lgica dos registros da tabela corrente. Exemplo //Este exemplo demonstra como se pode utilizar o DBORDERNICKNAME para setar nova ordem. USE Cliente NEW SET INDEX TO Nome, Idade IF !DBORDERNICKNAME ("IndNome") Messagebox("Registro no encontrado","Erro", 0) BREAK ENDIF DBSETORDER( ) DBSETNICKNAME( ) DBRecall Altera o estado deletado do registro atual. Sintaxe DBRecall() -> Nil Retorno NIL Descrio ----------------------- Page 161----------------------Descrio Nenhum

Esta funo utilizada para retirar a marca de registro deletado do registro atual. P ara ser executada o registro atual deve estar bloqueado ou a tabela deve estar aberta em modo exclus ivo. Se o registro atual no estiver deletado, esta funo no faz nada. Ela o oposto da funo DBDELETE que marca registro atual como deletado. Exemplo // Este exemplo demonstra como se pode utilizar o DBRECALL para retornar o estad o do registro atual para normal. USE Cliente DBGOTO(100) DBDELETE() DELETED() // Retorna: .T. DBRECALL() DELETED() // Retorna: .F. // Este exemplo demonstra como se pode utilizar o DBRECALL para desfazer todas a s delees da tabela corrente.

USE Cliente DBGOTOP() WHILE !EOF() DBRECALL() DBSKIP() ENDDO DBDELETE( ) DBRecordInfo Verifica informaes sobre um registro. Sintaxe DBRecordInfo ( nInfoTipo ,[ nRegistro ]) -> Informao do Registro Argumento crio nInfoTipo r verificada. nRegistro erificado. Retorno Nil tipo Descrio Esta funo utilizada para obter informaes sobre o registro especi ficado pelo segundo argumento (recno) da tabela corrente, se esta informao for omitida ser verificado o registro corrente. O tipo de informao (primeiro argumento) escolhido de acordo com as constantes abaixo: DBRI_DELETED Estado de deletado. Similar a DELETED (tipo lgico) Obrigat. S Opcional Descrio No h tabela corrente ou registro invlido. Informao do Registro. Informao requisitada depende da informao requisitada). pelo usurio (o Tipo N N Des Tipo de informao a se Nmero do registro a ser v

----------------------- Page 162----------------------DBRI_RECSIZE Tamanho do registro. Similar a RECSIZE (tipo numrico)

Verifica se o registro foi alterado e ainda no foi atual izado fisicamente. Similar a DBRI_UPDATED UPDATED (tipo lgico). Exemplo // Este exemplo demonstra como se pode utilizar o DBRECORDINFO para se obter as informaes sobre registros da tabela corrente. USE Clientes NEW DBGOTO(100) DBRECORDINFO(DBRI_DELETED) // Retorno: .F.

DBDELETE() DBRECORDINFO(DBRI_DELETED) // Retorno: .F. DBRECALL() DBRECORDINFO(DBRI_RECSIZE) // Retorno: 230 NOME := "JOAO" DBGOTO(200) DBRECORDINFO(DBRI_UPDATED) // Retorno: .F. DBRECORDINFO(DBRI_UPDATED,100) // Retorno: .T. DBORDERINFO( ) DBFIELDINFO( ) DBReindex Reconstri todos os ndices da rea de trabalho. Sintaxe DBReindex() -> Nil Retorno NIL Descrio Reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no pri meiro registro lgico. Exemplo // Este exemplo demonstra como se pode utilizar o DBREINDEX para reconstruir os n dices depois que um novo ndice foi gerado. USE Clientes NEW DBSETINDEX("IndNome") DBREINDEX() DBSETINDEX( ) DBSETORDER( ) ----------------------- Page 163----------------------DBRLock Bloqueia determinado registro. Sintaxe DBRLOCK([ nRegistro ]) --> Lgico Argumento nRegistro r bloqueado. Obrigat. Opcional Tipo N Descrio Nmero do registro a se Nenhum Descrio

Retorno .F.

Descrio No conseguiu bloquear o registro. Principal motivo: o registro j foi bloqueado por outro usurio.

.T. Descrio

O registro foi bloqueado com sucesso

Esta funo utilizada quando se tem uma tabela aberta e compar tilhada e se deseja bloquear um registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a funo no altera seu estado. O usurio pode escolher o registro a ser bloqueado atravs do parmetro (recno), mas s e este for omitido ser bloqueado o registro corrente como na funo RLOCK(). Esta funo o oposto DBRUNLOCK, que libera registros bloqueados. Exemplo // Este exemplo mostra duas variaes do uso de DBRLOCK. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBRLOCK() // Bloqueia o registro atual (100) DBRLOCK(110) // Bloqueia o registro de nmero 110 FLOCK RLOCK( ) DBUNLOCK( ) DBRUNLOCK( ) DBRLOCKLIST( ) ----------------------- Page 164----------------------DBRunLock Desbloqueia determinado registro. Sintaxe DBRUNLOCK([ nRegistro ]) --> Nil Argumento nRegistro bloqueado. Retorno NIL Obrigat. No Descrio Sem retorno. Tipo N Descrio Nmero do registro a ser des

Descrio Esta funo utilizada para liberar determinado registro bloqueado. O usurio pode escolher o registro a ser desbloqueado atravs do armetro (recno), mas se este for omitido ser desbloqueado o registro corrente como na funo DBUNLOCK(). Esta funo o oposto DBRLOCK, que bloquea os registros. Exemplo // Este exemplo mostra duas variaes do uso de DBRUNLOCK. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBRUNLOCK() // Desbloqueia o registro atual (100) DBRUNLOCK(110) // Desbloqueia o registro de nmero 110 FLOCK RLOCK( ) DBUNLOCK( ) DBRLOCK( ) DBRLOCKLIST( ) ----------------------- Page 165----------------------DbSeek Encontra um registro com determinado valor da chave do ndice. Sintaxe DBSeek ( cExp Argumento po nExp, [ lSoftSeek ], [ lUltimo ]) --> Lgico Tipo Descrio Valor de chave caracter (todos os tipos de cExp Sim C as um campo do a ser encontrado do ti p

Obrigat.

expresso de ndice com exceo do ndice com apen tipo numrico). Valor de chave a ser encontrado do tipo

numrico (apenas quando a nExp Sim do tipo numrico).

N expresso do ndice possui apenas uma campo Posiciona no primeiro registro com e

xpresso de chave maior que lSoftSeek No lUltimo . O padro .F. No

o L valor procurado. O padro .F. L Procura a ltima ocorrncia do valor procurado

Retorno .F. .T. Descrio

Descrio No foi encontrado nenhum registro com o valor especificado Foi encontrado um registro com o valor especificado

Esta funo utilizada para valor da expresso de chave ndice.

encontrar de

um

registro

com

determinado

Antes da chamada do DBSEEK deve-se a ordem ativa no momento com os campos que se deseja pesquisar o valor.

certificar de

que

existe

um

Se a expresso possuir apenas uma campo numrico, o primeiro parmetro deve ser do tip o numrico, mas nos demais casos deve-se utilizar um valor do tipo caracter para este parmetr o (mesmo se forem apenas dois campos numricos ou do tipo data). Quando o segundo parmetro for especificado como .T. (softseek), mesmo que a exp resso pesquisada no encontrar nenhum registro com este valor, a tabela ser posicionada no prximo val or maior que o especificado no primeiro parmetro, mas mesmo posicionando no prximo valor esta funo retornar .F. (pois no encontrou). Quando no for especificado este valor ou estiver .F. valor de pesquisa, a tabela ser posicionada em LASTREC + 1 e ser setada a flag de EOF. e falhar o

Se o terceiro parmetro for especificado com valor .T. a funo posiciona a tabela no l timo registro com o valor procurado, caso no seja especificado ou for .F., ser posicionada na primei ra ocorrncia. Exemplo // Este exemplo demonstra como se pode utilizar o DBSEEK para busca de valores n umricos. USE Clientes NEW ORDLISTADD ("/teste/ind1.cdx") // Expresso Num (campo numrico) DBSEEK(100) // Retorna: .F. EOF() // Retorna: .T. DBSEEK(100,.T.) // Retorna: .F. EOF() // Retorna: .F. (pois o softseek posicionou no prximo registro) ----------------------- Page 166----------------------// Este exemplo demonstra como se pode utilizar o DBSEEK para percorrer todos os registros de Clientes com o nome joao e vencimentos a partir de janeiro de 2001. USE Clientes NEW ORDLISTADD ("/teste/ind2.cdx") // Expresso Nome+Venc (campo caracter + data)

DBSEEK("joao200101",.T.) // Procura a primeira ocorrncia de Nome "joao" e vencime nto maior que Janeiro de 2001 WHILE !EOF() .AND. Nome == " joao" DBSKIP() ENDDO FOUND( ) EOF( ) DBSKIP( ) DBGOTOP( ) DBGoBottom( ) DBSetDriver Modifica ou verifica o RDD padro. Sintaxe DBSetDriver ([ cNovoRddPadro ]) --> Caracter Argumento cNovoRddPadro nido como padro. Obrigat. No Retorno cAntigoRddPadro Descrio Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for omitido seu parmetro. Ela tambm pode ser utilizada para adro, especificando-o atravs do parmetro. Exemplo // Este exemplo demonstra como se pode utilizar o DBSETDRIVER para alterar o val or do RDD padro. DBSETDRIVER("CTREECDX") // Retorna: DBFCDX DBSETDRIVER() // Retorna: CTREECDX RDDSETDEFAULT( ) ----------------------- Page 167----------------------RDDNAME( ) RDDLIST( ) especificar outro RDD como p Tipo C Descrio Novo nome do RDD a ser defi Descrio Nome do RDD padro corrente

DBSetFilter Seta uma condio de filtro. Sintaxe DBSetFilter( bCondio, cCondio ) --> Nil Argumento bCondio utvel. cCondio string. Obrigat. Sim Sim Retorno NIL Descrio Esta funo utilizada para setar um filtro nos registros da tabela corrente especifi cado atravs do bloco de cdigo no primeiro parmetro. Quando um registro no est dentro do filtro setado ele continua exist indo fisicamente, mas no logicamente (nas funes de manipulao de banco de dados como DBGOTOP, DBSEEK, DBSKIP, etc). Exemplo // Este exemplo demonstra como se pode utilizar o DBSETFILTER para filtrar todos os clientes com menos de 40 anos. USE Cliente NEW DBSETFILTER( { Idade < 40}, "Idade < 40" ) DBGOTOP() DBFILTER( ) ----------------------- Page 168----------------------DBSetIndex Acrescenta todas as ordens de determinado ndice lista. Sintaxe DBSetIndex( cArqIndice ) --> Nil Argumento cArqIndice e extenso. Obrigat. Sim Tipo C Descrio Nome do arquivo de ndice, com ou sem diretrio Tipo Bloco de Cdigo C Descrio Expresso do filtro na forma exec Expresso do filtro na forma de Descrio Sem retorno.

Retorno NIL Descrio

Descrio Sem retorno.

Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na li sta de ordens ativas da rea de trabalho. Quando o arquivo de ndice possui apenas uma ordem, a mesma acrescentada lista e t orna-se ativa. Quando o ndice possui mais de uma ordem, todas so acrescentadas lista e a primeira torna-se ativa. Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no p rimeiro parmetro, mas caso contrrio deve ser especificado. Exemplo // Este exemplo demonstra como se pode utilizar o DBSETINDEX para acrescentar no vos ndices lista de ordens. USE Cliente NEW DBSETINDEX("Ind1") DBSETINDEX("\teste\Ind2.cdx") ORDLISTADD( ) D BSetNickName Seta um apelido para determinada ordem ou verifica qual o apelido corrente. ----------------------- Page 169----------------------Sintaxe DBSetNickName( cOrdem,[ cApelido ]) --> Caracter Argumento cIndice cApelido Retorno guiu "" setar No o Obrigat. Sim No Tipo C C Descrio Nome da ordem que deve receber o apelido. Nome do apelido da ordem a ser setada. Descrio conseguiu encontrar apelido ou no havia apelido corrente Apelido corrente a ordem especificada, no conse

cApelido Descrio Esta funo

utilizada para colocar um apelido em

determinada

ordem

especificada pelo primeiro parmetro. Caso seja omitido o nome do apelido a ser dado, a funo apenas verifica o apelido c orrente. Exemplo // Este exemplo demonstra como se pode utilizar o DBSETNICKNAME para setar um no vo apelido e verificar qual o apelido atual. USE Cliente NEW DBSETNICKNAME("IndNome") // retorna: "" DBSETNICKNAME("IndNome","NOME") // retorna: "" DBSETNICKNAME("IndNome") // retorna: "NOME" DBORDERNICKNAME( ) DBSetOrder Seleciona a ordem ativa da rea de trabalho. Sintaxe DBSetOrder( nPosio ) --> Nil Argumento nPosio vas Retorno ----------------------- Page 170----------------------NIL Descrio Esta funo utilizada para selecionar a ordem ativa da rea de trabalho. Esta ordem a responsvel seqncia lgica dos registros da tabela corrente. Exemplo // Este exemplo demonstra como se pode utilizar o DBSETORDER para selecionar a o rdem corrente. USE Cliente NEW SET INDEX TO Nome, Idade DBSETORDER(2) ORDLISTADD( ) DBREINDEX( ) DBSETINDEX( ) Sem retorno Descrio Obrigat. Sim Tipo N Descrio Posio da ordem na lista de ordens ati

DBSkip Desloca para outro registro na tabela corrente. Sintaxe DBSkip([ nRegistros ]) --> Nil Argumento nRegistros slocado. Retorno NIL Descrio Esta funo utilizada para deslocar para outro registro a partir do registro atual. O parmetro especifica quantos registros lgicos devem ser deslocados a partir do co rrente, se for positivo desloca em direo ao final da tabela, se for negativo ao incio da tabela e caso seja omitido ir para o prximo registro (o padro 1). Caso passe do incio da tabela, posiciona no primeiro registro e seta BOF, caso pa sse do final da tabela, posiciona no registro LASTREC + 1 e seta EOF. Exemplo // Este exemplo mostra como o DBSKIP pode passar do final da tabela e do incio da tabela ----------------------- Page 171----------------------DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOBOTTOM() EOF() // retorna .F. DBSKIP() EOF() // retorna .T. DBGOTOP() BOF() // retorna .F. DBSKIP(-1) BOF() // retorna .T. // Este exemplo mostra como o DBSKIP pode deslocar 10 registro em relao ao registr o corrente DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBSKIP(10) RECNO() // retorna 110 DBSKIP(-10) RECNO() // retorna 100 BOF( ) Obrigat. No Descrio Sem retorno. Tipo N Descrio Nmero de registros a ser de

EOF( ) DBGOTOP( ) DBGOBOTTOM( ) DBSEEK( ) DBStruct Retorna a estrutura da tabela corrente. Sintaxe DBStruct() --> Array Retorno {} aEstrutura um subarray Descrio Esta funo utilizada para verificar a estrutura da tabela corrente da mesma forma q ue utilizada para criar a tabela com a funo DBCREATE. Para isto ela cria um array para gravar as informaes e as retorna. Exemplo ----------------------- Page 172----------------------// Este exemplo demonstra como se pode utilizar o DBSTRUCT para recuperar a estr utura da tabela corrente. USE Cliente NEW DBSTRUCT() //Retorna:{{Cod,N,3,0},{Nome,C,10,0},{Idade,N,3,0},{Nasc,D,8,0},{Pagto,N,7,2}} DBCREATE( ) AFIELDS( ) DBUnlock Desbloqueia todos os registros da tabela corrente. Sintaxe DBUNLOCK() --> Nil Retorno NIL Descrio Sem retorno. Descrio No existe tabela corrente. Array com todos os contendo Nome, Tipo, Tamanho e Decimais. campos, onde cada elemento

Descrio Esta funo utilizada para liberar todos os registros bloqueados e equivalente a exe cutar DBRUNLOCK para todos os registros da lista DBRLOCKLIST. Exemplo // Este exemplo mostra como liberar todos os registros bloqueados da tabela corr ente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBUNLOCK() FLOCK( ) RLOCK( ) DBUNLOCKALL( ) DBRLOCK( ) DBRLOCKLIST( ) DBUnlockAll ----------------------- Page 173----------------------Desbloqueia todos os registros de todas as tabelas abertas. Sintaxe DBUNLOCKALL() --> Nil Retorno NIL Descrio Esta funo utilizada para liberar todos os registros bloqueados e equivalente a exe cutar DBUNLOCK para todos os registros da lista DBRLOCKLIST de todas as reas de trabalho. Exemplo // Este exemplo mostra como liberar todos os registros bloqueados da tabela corr ente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBUNLOCKALL() FLOCK( ) RLOCK( ) DBUNLOCK( ) DBRLOCK( ) Descrio Sem retorno.

DBRLOCKLIST( ) DBUnlockAll Desbloqueia todos os registros de todas as tabelas abertas. Sintaxe DBUNLOCKALL() --> Nil Retorno NIL Descrio Esta funo utilizada para liberar todos os registros bloqueados e equivalente a exe cutar DBUNLOCK para todos os registros da lista DBRLOCKLIST de todas as reas de trabalho. ----------------------- Page 174----------------------Exemplo // Este exemplo mostra como liberar todos os registros bloqueados da tabela c orrente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBUNLOCKALL() FLOCK( ) RLOCK( ) DBUNLOCK( ) DBRLOCK( ) DBRLOCKLIST( ) Delete Marca registros como deletados. Sintaxe DELETE [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST ] [ALL] Argumento Obrigat. Tipo Descrio Expresso em ADVPL a ser resolvida para q ue o registro seja marcado CondFor No como deletado. CondWhile No "deleo" deve parar Expresso em ADVPL que determina quando a (quando a expresso retornar .F. Descrio Sem retorno.

nRecs deletados. nRecno

No No

N N Retorno NIL

Quando registros devem ser marcados como Nmero do recno do registro a ser deletado. Descrio Sem retorno.

Descrio Este comando utilizado para marcar alguns registros da tabela corrente como d eletados. Se no forem especificadas as condies para que o registro seja marcado como delet ado, marca toda a tabela como se estivesse especificada a opo "ALL". Pode-se especificar um escopo para que os registros sejam marcados atravs das opes "FOR CondFor" e "WHILE CondWhile". Pode-se tambm limitar o nmero de registros a serem marcados atravs da opo "NEXT nRecs" e determinar que a "deleo" dos registros deve-se iniciar a partir do registro atu al com "REST", mas caso contrrio o comando executa um DBGOTOP() antes de iniciar a "deleo". ----------------------- Page 175----------------------Se desejado marcar apenas determinado registro pode-se defini-lo atravs da espec ificao do recno com "RECORD nRecno". Exemplo // Este exemplo demonstra como utilizar o comando DELETE para marcar alguns regi stros dentro de determinado escopo como deletado. Este escopo definido por Idade > 20, at que o nome seja maior ou igual a "VVV", comea a deleo a partir do registro atual e marca apenas 10 registros: USE Cliente VIA "CTREECDX" NEW DELETE FOR Idade>20 WHILE Nome<"VVV" NEXT 10 REST RECALL REPLACE SET DELETED ON PACK ZAP DevOutPict

Imprime o contedo na posio corrente formatando a sada. Sintaxe DEVOUTPICT ( xVal, cPicture ) --> NIL Argumento xVal cPicture Obrigat. Sim Sim Retorno NIL Descrio DEVOUTPICT( ) imprime contedo ), aplicando a mscara cPicture. Exemplo nVal:= 100.89 DevPos( 10,10 ) // configura linha 0, coluna 0 para impresso ----------------------- Page 176----------------------//@ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() ) DevOutPict ( nVal, "@E 999,999.99" ) // imprime 100,89 DEVPOS( ) DEVOUT( ) DevPos Posiciona linha e coluna de impresso. Sintaxe DEVPOS( nLin, nCol ) --> NIL Argumento nLin nCol Obrigat. Sim Sim Tipo N N Retorno NIL Descrio DEVPOS( ) modifica a linha e coluna corrente de impresso. Modifica os retornos de PROW() e PCOL( ). Nenhum Descrio Informar nova linha de impresso. Informar nova coluna de impresso. Descrio na posio corrente de PROW( ) e PCOL( Nenhum Tipo C, N ou D C Descrio Informar valor a ser impresso. Informar a mscara de formatao do dado. Descrio

Exemplo DevPos( 10,10 ) // configura linha 0, coluna 0 para impressao @ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() ) DEVOUT( ) Directory Cria um array com dados dos diretrios e dos arquivos. ----------------------- Page 177----------------------Sintaxe DIRECTORY( cDirSpec , [ cAtributos ]) -->Array Argumento de onde cDirSpec as Obrigat. informaes Sim Tipo sero C buscadas. O Caminho pode estar no serv idor ou no local (Remote). Especifica de rmaes. normal arquivos/diretrios que Abaixo sempre esto os devem ser atributos aceitos. Note que o desde que no seja informado. Atributo cAtributos (Hidden) S ema. Incluir diretrios D V (label) Retorno Array ormaes sobre um rectry.ch: F_NAME me do arquivo Caracter, No Descrio Retorna um array de subarrays onde cada subarray contm inf arquivo ou diretrio que correspondem a cDirSpec. Os subarrays possuem a seguinte estrutura, definida em di Procurar o nome do disco Incluir arquivos de sist No C H Incluir arquivos ocultos Descrio atributo considerado, includos na busca por info os atributos especiais Descrio Identifica o drive, o caminho

F_SIZE ho do arquivo F_DATE ficao do arquivo F_TIME odificao do arquivo F_ATTR Descrio

Numrico, Taman Data, Data de modi Caracter, Hora de m Caracter, Atributos do arquivo.

DIRECTORY() funo que retorna informaes de arquivos/diretrios que correspondam a uma cara especifica. Tanto arquivos no servidor como no cliente (Remote) so aceitos. Os atributos so se mpre aditivos. Utilize Directory() ao invs de ADIR(). ----------------------- Page 178----------------------Exemplos #include "Directry.ch" // aDirectory := DIRECTORY("*.*", "D") AEVAL( aDirectory, { aFile QOUT(aFile[F_NAME])} ) CURDIR() ADIR() DirRemove Elimina um diretrio. Sintaxe DIRREMOVE( cDirNome ) --> lSuccesso Argumento , opcionalmente cDirNome Obrigat. incluindo Sim Tipo o C caminho. O diretrio ser removido no serv idor. Retorno .T. .F. Descrio O diretrio foi eliminado. No foi possivel eliminar o diretrio. Descrio Nome do diretrio a ser removido

Descrio DIRREMOVE() elimina um diretrio especifico. Note que necessrio ter direitos suficientes para remover um diretrio, e o diretr io para ser eliminado precisa estar vazio, sem subdiretrios e arquivos. Exemplo DIRREMOVE("c:\teste\um\dois") // Eliminando um diretrio, sem testar o retorno bResult := DIRREMOVE("c:\teste\um") // Elimina e testa o retorno ----------------------- Page 179----------------------IF bResult ? "Impossivel excluir o diretrio" ENDIF DIRMAKE() DIRCHANGE() Dow Converte uma data para o valor numrico do dia da semana. Sintaxe DOW( dData ) --> Numrico Argumento dData . Retorno Descrio Obrigat. Sim Tipo D Descrio o valor da data a converter

>=0 e <=7 Retorna um nmero entre zero e sete, representando o dia da se mana. O primeiro dia da semana 1 (Domingo) e o ltimo 7 (Sbado). Se a data for vazia ou invlida, DOW() retorna zero. Descrio DOW() uma funo que converte uma data para o valor numrico que representa o dia da s emana. til quando se deseja fazer clculos semanais. DOW() similar a CDOW(), que retorna o di a da semana como uma cadeia de caracteres. Exemplos Estes exemplos mostram como usar CDOW() e o seu relacionamento com DOW(): dData := DATE() // Resultado: 09/01/01 nDiaDaSemana := DOW(DATE()) // Resultado: 3 cDiaDaSemana := CDOW(DATE()) // Resultado: Tuesday

nDiaDaSemana := DOW(DATE() - 2) // Resultado: 1 cDiaDaSemana := CDOW(DATE() - 2) // Resultado: Sunday Esta funo de usurio utiliza DOW() para calcular a data da ltima segunda-feira da dat a informada. FUNCTION LastMonday(dData) RETURN (dData - DOW(dData) + 2) CDOW() ----------------------- Page 180----------------------DATE() DAY() Dtoc Converte uma data para cadeia de caracteres. Sintaxe DTOC( dData ) --> Caracter Argumento dData Retorno Caracter da data. O Obrigat. Sim Descrio Tipo D Descrio o valor a converter.

uma cadeia de caracteres representando o valor retorno formatado utilizando-se o formato corrente definido pelo comando SET DA TE FORMAT. O formato padro mm/dd/yy. Para uma data nula ou invlida, o retorno ser uma cadeia de caracteres com espaos e tamanho igual ao formato atual. Descrio DTOC() converte uma data para uma cadeia de caracteres formatada segundo o padro corrente, definido pelo comando SET DATE. Se for necessria a utilizao de formatao ecial, use a funo TRANSFORM() <a>. Em expresses de ndices de arquivo, use DTOS() no lugar de DTOC() para converter da tas para cadeia de caracteres. Exemplos cData := DATE() // Resultado: 09/01/90 cData := DTOC(DATE()) // Resultado: 09/01/90 cData := "Today is " + DTOC(DATE()) // Resultado: Today is 09/01/90 CTOD()

esp

DATE() DTOS() ----------------------- Page 181----------------------Dtos Converte uma data para uma cadeia de caracteres no formato yyyymmdd. Sintaxe DTOS( dData ) --> Caracter Argumento io dData Sim a data a converter. Retorno Caracter byte de tamanho no Obrigat. D Descrio Retorna uma cadeia de caracteres com oito formato yyyymmdd. Quando dData nulo ou invalido, DTOS( caracteres com oito espaos. O valor retornado no afeta do pela formato da data corrente. Descrio DTOS() uma funo de converso de data que pode ser usada criar expresses de ndice. O resultado estruturado visando manter a ordem correta do ndice (ano, ms, dia). Exemplos cData := DATE() // Resultado: 09/01/90 cData := DTOS(DATE()) // Resultado: 19900901 nLen := LEN(DTOS(CTOD(""))) // Resultado: 8 Este exemplo mostra como criado um ndice composto usando DTOS(): USE Vendas NEW INDEX ON DTOS(Data) + Vendedor TO DataNome CTOD() DATE() DTOC() Eject Fora a impresso de nova pgina no relatrio. ----------------------- Page 182----------------------para Tipo Descr o valor d

) retorna uma cadeia de

Sintaxe EJECT( )--> NIL Retorno NIL Descrio EJECT( ) efetua o salto de pgina na impresso de relatrio configurando o PROW( ) par a 0. Exemplo SETPRC(0,0) // inicia impressao na linha 0 coluna 0 PCOL( 10 ) //muda para coluna 10 @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PRNFLUSH( ) // Forca impressao antes do termino da pagina. PROW( PROW( )+2 ) // Pula 2 linhas PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) //PROW( 0 ) // Salta a pagina EJECT( ) // Salta de pagina FECHAREL( ) // Fecha impressao INITPRINT( ) PREPAREPRINT( ) ISPRINTER( ) PROW( ) PCOL( ) SETPRC( ) PRNFLUSH( ) GETIMPWINDOWS( ) GETPORTACTIVE( ) ElapTime Retorna o tempo decorrido entre duas horas. Sintaxe ElapTime( cHoraInicial , cHoraFinal ) --> Caracter ----------------------- Page 183----------------------Argumento Obrigat. hh Tipo C a Descrio Informe a hora inicial no Descrio Sem retorno

cHoraInicial Sim formato hh:mm:ss, onde

hora ( 1 a 24 ), mm os minutos e ss os segundos cHoraFinal Sim mm:ss, onde hh a hora egundos. Retorno Descrio onde hh a hora C Informe a hora final no formato hh: ( 1 a 24 ), mm os minutos e ss os s

Caracter A diferena de tempo no formato hh:mm:ss, ( 1 a 24 ), mm os minutos e ss os segundos Descrio

ElapTime() retorna uma cadeia de caracteres contendo a diferena de tempo no forma to hh:mm:ss, onde hh a hora ( 1 a 24 ), mm os minutos e ss os segundos. Exemplos Este exemplo compara ELAPTIME(): cHoraInicio := TIME() // Resultado: 10:00:00 . . <instrucoes> . cElapsed := ELAPTIME(TIME(), cHoraInicio) TIME() FClose Fecha um arquivo binrio e grava os buffers no disco. Sintaxe FCLOSE( nHandle ) --> Lgico Argumento nHandle Retorno Obrigat. Sim Descrio Tipo N Descrio Handle a ser fechado

.F. nHandle informado no corresponde a um arquivo aberto previamente, ou erro na gravao dos buffers pendentes, verifique atravs de FERROR() maiores detalhes sob re o erro. .T. Arquivo foi fechado com sucesso.

----------------------- Page 184----------------------Descrio Fecha um manipulador ( handle ) de um arquivo binrio. Este manipulador deve ter s ido aberto atravs

das funes FOPEN(), FOPENPORT(), FCREATE(). Exemplo O exemplo abaixo utiliza o CLOSE para fechar um arquivo. #include "Fileio.ch" // nHandle := FCREATE("Testfile", FC_NORMAL) IF !FCLOSE(nHandle) conout ("Erro fechando arquivo:" + Str(FError( 0 ) ENDIF FERROR() FOPEN() FCLOSE() FREAD() FWRITE() FOPENPORT() FCreate Cria um arquivo, ou elimina o contedo de um arquivo. Sintaxe FCREATE( cArq, [ nAtributo ]) --> nHandle Argumento Obrigat. Tipo Descrio Nome do arquivo a ser criado, o caminho pode ser includo. So vlidos cArq S C caminhos no local (remote) e no servidor. nAtributo er criado. Retorno >0 uivo. -1 Erro na criao do arquivo, verifique FERROR() para obter maiores de talhes do erro. ----------------------- Page 185----------------------Descrio FCREATE() uma funo de dos arquivos textos como binrios. baixo-nvel que permite a manipulao direta Opcional N Descrio Numrico. O Handle do arquivo para ser usado nas demais funes de arq Atributos no qual o arquivo s

Ao ser executada FCREATE() cria um arquivo ou elimina o seu contedo, e retorna o handle (Manipulador) do arquivo, para ser usado nas demais funes. O Arquivo deve ser fechado atravs da funo FCLOSE(). Os Atributos para criao do arquivo esto abaixo, e esto definidos no header fileio.ch . FC_NORMAL FC_READONLY FC_HIDDEN FC_SYSTEM Criao normal do Arquivo (default/padro). Cria o arquivo protegido para gravao. Cria o arquivo como oculto. Cria o arquivo como sistema.

Note que se o arquivo existir, o contedo ser truncado para zero bytes. Exemplo #include "Fileio.ch" IF (nHandle := FCREATE("Testfile", FC_NORMAL)) == -1 ? "Arquivo no pode ser criado", FERROR() BREAK ELSE FWRITE(nHandle, "ola!!!") FCLOSE(nHandle) ENDIF FCLOSE() FERROR() FOPEN() FWRITE() FREAD() ----------------------- Page 186----------------------FErase Apaga um arquivo do disco. Sintaxe FERASE( cArq ) --> nSucesso Argumento caminhos cArg Retorno Obrigat. Tipo Apaga locais (Remote), ou S C caminhos no servidor Advanced Protheus. Descrio um Descrio arquivo do disco, aceita

Arquivo foi apagado com sucesso. -1 detalhes. Descrio Elimina um arquivo. O Arquivo pode estar no servidor ou no local (Remote). O Arquivo para ser apagado deve estar a utilizao de caracteres coringa (wildcards). Exemplos // Este exemplo apaga todos os arquivos .BAK do diretrio corrente. #include "Directry.ch" AEVAL(DIRECTORY("*.BAK"), { aFile FERASE(aFile[F_NAME]) }) /// Este exemplo apaga um arquivo no cliente ( Remote ) e imprime uma mensagem c aso // ele apresente erro. IF FERASE("AFile.txt") == -1 ? "File erase error:", FERROR() BREAK ENDIF FRENAME() FError Verifica se houve erros aps uma operao com arquivos binrios. Sintaxe ----------------------- Page 187----------------------FERROR() --> Numrico Retorno 0 2 3 4 5 6 8 15 19 Descrio Operao realizada com sucesso. Sem erros Arquivo no encontrado Caminho no encontrado Muitos arquivos abertos Acessso negado Manipulador Invalido ( Handle ) Memria Insuficiente Drive invlido especificado Tentativa de gravar em disco protegido contra-gravao fechado. No permitido O Arquivo no foi apagado, verifique FERROR() para obter maiores

21 23 29 30 32 33 Descrio

Drive No esta pronto Dados com erro de CRC Erro de gravao Erro de leitura Violao de compartilhamento Erro de Lock

FERROR() a funo que retorna o cdigo de erro mais aps a execuo de funes com arquivos binrios, tais como: FOPEN(), FCLOSE(), FWRITE(), FREAD(). Se FERROR() retornar zero, indica sucesso na ltima operao. FERROR() sempre retorna o estado da ultima operao. Exemplo #include "Fileio.ch" // nHandle := FCREATE("Temp.txt", FC_NORMAL) IF FERROR() != 0 conout ("Erro ao criar o arquivo, Erro:" Str(FError()) ENDIF FCLOSE() FCREATE() ----------------------- Page 188----------------------FERASE() FOPEN() FieldBlock Retorna um bloco de cdigo para um campo determinado da tabela corrente. Sintaxe FIELDBLOCK( cCampo ) --> Bloco de Cdigo Argumento cCampo o de cdigo. Retorno bBloco bela corrente. Obrigat. S Descrio Tipo C Descrio

especfico,

Nome do campo a ser retornado o bloc

Bloco de cdigo. Bloco de cdigo para o campo especificado na ta

Descrio Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especifica do. Sendo que quando o bloco resultante executado sem valor recupera o valor armazenado no cam po, mas quando executado com um valor, seta este valor no determinado campo. Portanto, o bloco retornado similar a: &("{ Valor IF(Valor==NIL, Campo, Campo:= Valor)}") Sendo: Campo = parmetro da funo FIELDBLOCK() Valor = valor executado no bloco de cdigo Exemplo // Este exemplo mostra como se pode usar o FIELDBLOCK para criar o bloco de cdigo para o campo Nome da tabela corrente na varivel bBloco: USE Cliente VIA "DBFCDX" NEW bBloco := FIELDBLOCK("Nome") FIELDWBLOCK( ) FieldWbl Retorna um bloco de cdigo para um campo determinado especificando a rea de trabalh o. Sintaxe ----------------------- Page 189----------------------FIELDWBLOCK(<cCampo>,<nArea>) --> Bloco de Cdigo Argumento CCampo co de cdigo. Obrigat. S Tipo C N Descrio Nome do campo a ser retornado o blo Nmero da rea de trabalho a ser criado Descrio

CArea S o bloco de cdigo. Retorno

bWBloco Bloco de cdigo. Bloco de cdigo para o campo especificado na rea de tr abalho determinada. Descrio Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especificado em determinada rea de trabalho. Sendo que quando o bloco resultante executado sem valor recupera o valor armazenado no campo, mas quando executado com um valo r seta esta valor no determinado campo.

Portanto o bloco retornado similar a: &("{ Valor IF(Valor==NIL, nArea->Campo, nArea->Campo:=Valor)}") Sendo: Campo = parmetro da funo FIELDBLOCK() nArea = nmero da rea de trabalho especificada no funo FIELDWBLOCK() Valor = valor executado no bloco de cdigo Exemplo // Este exemplo mostra como se pode usar o FIELDWBLOCK para criar o bloco de cdigo para o campo Nome da rea de trabalho 3 na varivel bBloco: USE Cliente VIA "DBFCDX" NEW bBloco := FIELDBLOCK("Nome",3) FIELDBLOCK File Verifica se um arquivo ou mscara de arquivos existem. Sintaxe FILE( cArquivo ) --> lExiste Argumento os. Obrigat. Tipo Descrio Nome do arquivo podendo incluir caminh Caminhos locais (Remote) CArquivo S C ou caminhos de servidor so aceitos. ----------------------- Page 190----------------------Retorno .F. .T. Descrio Verifica se existe um arquivo ou um padro de arquivos, no diretrio. Os caracteres * e ?. so aceitos. Caminhos de servidor e locais so aceitos. Exemplos FILE("teste.dbf") // Verifica no diretrio corrente se existe o arquivo teste.dbf FILE("\SIGAADV\TESTE.dbf") // // Verifica no diretrio Sigaadv do servidor se corr ente e se existe o arquivo teste.dbf FILE("C:\TEMP\TESTE.dbf") // // Verifica no diretrio Temp do cliente (Remote) se existe Descrio O Arquivo ou padro de busca existem. O Arquivo ou padro no existem.

o arquivo teste.dbf DIRECTORY() ADIR() FOpen Abre um arquivo binrio. Sintaxe FOPEN( cArq , nModo ]) --> Numrico Argumento cArq nrio. Obrigat. Sim Tipo C Descrio Nome do Arquivo a ser aberto em modo bi Modo como o arquivo dever O Modo de abertura nModo No de acesso e modo abertura eitura. Retorno -1 hes do erro >0 Descrio Erro na abertura do arquivo. Verifique FERROR() para maiores detal Handle do arquivo, a ser usado com as demais funes de arquivo zero, o N de compartilhamento. que indica sem compartilhamento e somente l O modo padro de um modo composto ser aberto. entre modo

----------------------- Page 191----------------------Descrio FOPEN() abre um arquivo de modo avao atrves das funes FREAD(), FWRITE(). binrio, permitindo a leitura ou gr

Todo arquivo aberto atravs da FOPEN(), deve ser fechado atravs da FCLOSE(). O modo de abertura composto de esses modos esto descritos em fileio.ch. Modos de Acesso FO_READ FO_WRITE FO_READWRITE Modos de Compartilhamento Apenas Leitura Apenas Gravao Leitura e Gravao modo de acesso e modo de compartilhamento,

FO_COMPAT FO_EXCLUSIVE FO_DENYWRITE vao FO_DENYREAD tura FO_DENYNONE FO_SHARED

Modo de compatibilidade ( Padro ) Exclusivo No permite que outros abram o arquivo para gra No permite que outros abram o arquivo para lei permite leitura e gravao Igual ao FO_DENYNONE

O modo de acesso em combinao ( + ) com o modo de compartilhamento determina a mane ira como o arquivo ser aberto e sua acessibilidade em um ambiente de rede. Sero aceitos tantos caminhos baseados no servidor, como caminhos locais ( remote ). Exemplo Este exemplo usa o FOPEN() para abrir um arquivo para avao de maneira compartilhada e mostra uma mensagem de erro caso a abertura falhe: #include "Fileio.ch" // nHandle := FOPEN("Temp.txt", FO_READWRITE + FO_SHARED) IF FERROR() != 0 ? "Impossivel abrir o arquivo, Erro : ", FERROR() BREAK ENDIF FCREATE() FERROR() FREAD() FWRITE() ----------------------- Page 192----------------------FCLOSE() FOpenPort Abre uma porta paralela ou serial. Sintaxe FOPENPORT( cPorta , [ cParm ], [ nModo ] ) --> Numrico Argumento cArq Obrigat. Sim Tipo C C Descrio Nome do Dispositivo a ser usado. Caractersticas do dispositivo, apen Os parmetros so: Velocidade leitura/gr

cParm Sim as vlido para portas seriais.

(BPS), ional ).

Paridade,

DataBits, StopBits, Timeout de leitura ( Opc

nModo No rto. O Modo de abertura modo ro de de acesso abertura e modo zero, de

Modo como o dispositivo dever ser abe um modo composto O modo entre pad

compartilhamento. o que nte leitura. Retorno -1 talhes do erro >0 . Descrio FOPENPORT() ao atrves FWRITE(). (). O modo de abertura composto de compartilhamento, esses modos esto descritos em fileio.ch. Modos de Acesso FO_READ FO_WRITE FO_READWRITE Modos de Compartilhamento FO_COMPAT FO_EXCLUSIVE FO_DENYWRITE FO_DENYREAD Apenas Leitura Apenas Gravao Leitura e Gravao modo de acesso abre um dispositivo, das funes FREAD(), permitindo a Descrio

indica sem compartilhamento e some

Erro na abertura do arquivo. Verifique FERROR() para maiores de Handle do dispositivo, a ser usado com as demais funes de arquivo

leitura

ou

grav

Todo arquivo aberto atravs da FOPENPORT(), deve ser fechado atravs da funo FCLOSE e modo de

Modo de compatibilidade ( Padro ) Exclusivo No permite que outros abram o arquivo para gravao No permite que outros abram o arquivo

----------------------- Page 193----------------------para leitura FO_DENYNONE FO_SHARED permite leitura e gravao. Igual ao FO_DENYNONE

O modo de acesso em combinao ( + ) com o modo de compartilhamento determina a mane ira como o arquivo ser aberto e sua acessibilidade em um ambiente de rede. O dispositivo ser aberto no diretrio corrente, ou seja, caso o diretrio esteja posi cionado no cliente, o dispositivo ser aberto no cliente ( Remote ), caso contrrio ser aberto no servidor. Os parmetros das portas seriais servem para configurar a comunicao serial e podem s er os seguintes: Velocidade (BaudRate) Paridade DataBits StopBits Timeout de leitura egundos de espera Exemplo Este exemplo usa o FOPENPORT() para sso para gravao e mostra uma mensagem de erro caso a abertura falhe: abrir uma porta de impre 9600 ( Default ),19200,38400,57600,115200. N ( Default, Sem Paridade ), E ( Par ), O ( Impar ). 6,7 ou 8 ( Default ) Bits. 1 ( default ) ou 2 Bits. 1000 ( Default ), Valores acima de zero. Tempo em milis por dados a serem lidos.

#include "Fileio.ch" // nHandle := FOPENPORT("LPT1:", "", FO_WRITE) IF FERROR() != 0 ? "Impossivel abrir a impressora LPT1, Erro : ", FERROR() BREAK ENDIF Este exemplo abre uma porta serial e espera para obter uma leitura da porta. #include "Fileio.ch" // CURDIR( "C:\TEMP" ) // Posicionando no diretrio cliente ( Remote ) nHandle := FOPENPORT("COM1:", "9600,N,8,1,10000", FO_WRITE) IF FERROR() != 0 ? "Impossivel abrir a impressora LPT1, Erro : ", FERROR() BREAK ENDIF FREAD( FCREATE() FERROR() FREAD() FWRITE() FCLOSE()

----------------------- Page 194----------------------FRead L caracteres binrios de um arquivo. Sintaxe FREAD( nHandle , Argumento nHandle FOPEN(), Obrigat. Sim FCREATE(), C @cBuffer , nQtdBytes ) --> Numrico Tipo N Descrio o manipulador retornado pelas funes

FOPENPORT() cBufferVar Sim vero ser armazenados. aior ou igual ao tamanho informado em nQtdBytes. Esta varivel deve s er sempre passada por referncia. ( @ antes do nome da varivel ) nQtdBytes Retorno Sim N Descrio Nmero mximo de bytes que devem ser lidos. o nome de um buffer onde os dados lidos de O tamanho desta varivel deve ser m

Numrico Quantidades de bytes lidos. Caso a quantidade seja menor que a sol icitada, indicar erro ou final de arquivo. Verifique FERROR() para obter maiores detal hes Descrio FREAD() l a partir um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados e armazena no buffer informado. FREAD() l normalmente caracteres de controle (ASC 1 28, ASC 0, etc.). FREAD() ler at o nmero de bytes informado em nQtdBytes; caso acontea algum erro ou o arquivo chegue ao final, FREAD() retornar um nmero menor que o nQtdBytes. O buffer passado para leitura deve ser sempre pr-alocado e passado como referncia. Caso contrrio, os dados no podero ser retornados. FREAD() l a partir da posio atual do ponteiro, que pode ser ajustado pelo FSEEK() o u por FWRITE(), FREADSTR(). Exemplos Este exemplo l 128 bytes em um buffer. #define F_BLOCK 128 //

cBuffer := SPACE(F_BLOCK) nHandle := FOPEN("Temp.txt") // IF FERROR() != 0 ? "Abertura de arquivos com erro: ", FERROR() ELSE IF FREAD(nHandle, @cBuffer, F_BLOCK) <> F_BLOCK ? "Erro lendo arquivo" ENDIF FCLOSE(nHandle) ENDIF ----------------------- Page 195----------------------BIN2I() BIN2L() BIN2W() FCLOSE() FCREATE() FWRITE() FERROR() FREADSTR FReadStr L caracteres de um arquivo binrio. Sintaxe FREADSTR( nHandle , nQtdBytes ) --> Caracter Argumento NHandle FOPEN(), NQtdBytes Retorno Retorno varivel Descrio FREADSTR() l de um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(). FREAD() ler at o so acontea algum erro ou string menor colocar o erro em nmero de bytes informado em nQtdBytes ou at encontrar um CHR(0). Ca o arquivo chegue ao do que nQdBytes e FERROR(). final, FREAD() retornar uma Obrigat. Sim FCREATE(), Sim Tipo N Descrio o manipulador retornado pelas funes

FOPENPORT(). N Nmero mximo de bytes que devem ser lidos. Descrio Retorna uma string contendo os caracteres lidos.

FREADSTR() l a partir da posio atual do ponteiro, que pode ser ajustado pelo FSEEK( ) ou por FWRITE( ), FREAD(). Exemplos Este exemplo l os 16 caracteres de um arquivo e imprime o seu contedo. #include "Fileio.ch" // nHandle := FOPEN("New.txt", FC_NORMAL) ----------------------- Page 196----------------------IF FERROR() != 0 ? "Erro abrindo o arquivo", FERROR() ELSE cString := FREADSTR(nHandle, 16) ? cString FCLOSE(nHandle) ENDIF BIN2I() BIN2L() BIN2W() FERROR() FOPEN() FREAD() FCREATE() FCLOSE() Frename Muda o nome de um arquivo. Sintaxe FRENAME(cNomeAntigo, cNovoNome) --> nSucesso Argumento ta caminhos cOldFile Obrigat. Tipo Descrio Nome do servidor e S C caminhos do cliente. Novo nome do arquivo, aceita tambm caminho d o servidor, e caminho cNewFile S C do cliente. do arquivo ser renomeado, acei

Retorno

Descrio A mudana foi executada com sucesso.

os -1

dois

Ocorreu algum erro na mudana caminhos esto no mesmo

de

nome,

verifique

se

ambiente. (Local/Local, Servidor/Servidor). Verifique FERROR() para detalhes do erro. Descrio FRENAME() renomeia um arquivo para outro nome, tanto no servidor como na estao. Ao renomear um arquivo no esquea que esta arquivo dever estar fechado. Exemplos // Renomeando arquivos no cliente. IF FRENAME("C:\TEMP\ArqAntigo.txt", "C:\TEMP\ArqNovo.txt") == -1 ? "Erro ao renomear ", FERROR() ENDIF // Renomeando arquivos no Servidor. IF FRENAME("\SIGAADV\ArqAntigo.txt", "\SIGAADV\ArqNovo.txt") == -1 ----------------------- Page 197----------------------? "Erro ao renomear ", FERROR() ENDIF @FERROR() @FILE() FSeek Posiciona o arquivo binrio. Sintaxe FSEEK( nHandle , nOffset , [ nOrigem ]) --> Numrico Argumento NHandle CREATE. Obrigat. Sim Tipo N N positivo Descrio Manipulador obtido atravs das funes FOPEN, F Nmero de bytes que o ponteiro do arquivo d da origem informada em nOrigem. ou negativo. O destino no precisa existir no Indica a partir de qual posio do arquivo, o n

NOffset Sim eve ser movido a partir O nmero pode ser

arquivo. NOrigem No Offset ser considerado. Retorno N Descrio

Numrico Descrio

A nova posio do arquivo.

FSEEK() posiciona o ponteiro do arquivo para as prximas operaes de leitura ou gravao. As movimentaes de ponteiros so relativas nOrigem que pode ter os s eguintes valores definidos em fileio.ch: FS_SET FS_RELATIVE FS_END Exemplo // Exemplo calcula o tamanho do arquivo. #include "Fileio.ch" // // Abre o arquivo apenas para leitura IF (nHandle := FOPEN("Temp.txt")) >= 0 // // Pega o tamanho do arquivo nLength := FSEEK(nHandle, 0, FS_END) // FCLOSE(nHandle) ELSE ? "Erro na abertura do arquivo", FERROR() ENDIF ----------------------- Page 198----------------------FCREATE() FERROR() FOPEN() FREAD() FWRITE() FCLOSE() FWrite Grava em um arquivo binrio. Sintaxe FWRITE( nHandle , cBuffer , [ nQtdBytes ]) --> Numrico Argumento NHandle FOPEN(), Obrigat. Sim FCREATE(), Tipo N Descrio o manipulador retornado pelas funes Ajusta a partir do inicio do arquivo. Ajuste relativo a posio atual do arquivo. Ajuste a partir do final do arquivo

FOPENPORT().

CBuffer Sim ravados. O tamanho igual ao tamanho

C informado em

o nome de um buffer de onde os dados sero g desta varivel deve ser maior ou

nQtdBytes (caso seja informado o tamanho). nQtdBytes Retorno No N Descrio Quantidade de bytes a serem gravados.

Numrico Quantidade de bytes efetivamente gravados. Se o retorno for me nor que o nQtdBytes, houve um erro na gravao. Verifique FERROR() para mais detalhes . Descrio FWRITE() grava em um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados do buffer informado. FWRITE() grava normalmente caracteres de controle ( ASC 128, A SC 0, etc. ). FWRITE() gravar at o nmero de bytes informado em nQtdBytes; caso acontea algum erro, retornar um nmero menor que o nQtdBytes. FWRITE() grava a partir da ser ajustado pelo FSEEK() ou FREAD(), FREADSTR(). Exemplos Este exemplo copia um arquivo para outro. #include "Fileio.ch" #define F_BLOCK 512 // cBuffer := SPACE(F_BLOCK) ----------------------- Page 199----------------------nInfile := FOPEN("Temp.txt", FO_READ) nOutfile := FCREATE("Newfile.txt", FC_NORMAL) lDone := .F. // DO WHILE !lDone nBytesRead := FREAD(nInfile, @cBuffer, F_BLOCK) IF FWRITE(nOutfile, cBuffer, nBytesRead) < ; nBytesRead ? "Erro gravando: ", FERROR() lDone := .T. ELSE lDone := (nBytesRead == 0) ENDIF ENDDO // FCLOSE(nInfile) FCLOSE(nOutfile) posio por atual do ponteiro, que pode

FCLOSE() FCREATE() FERROR() FOPEN() I2BIN() GetClientDir Retorna o diretrio onde est instalado o Remote. Sintaxe GetClientDir( ) --> cDir Retorno cDir lado o remote. Descrio Retorna o diretrio onde o Remote est instalado. Exemplo ? GetClientDir() // Imprime o diretrio onde est instalado o remote // Exemplo de sada // c:\ap6\bin\remote CURDIR( ) GetI mpWindows Retorna lista de impressoras disponveis para impresso. ----------------------- Page 200----------------------Sintaxe GETIMPWINDOWS( lServer ) --> Array Argumento Obrigat. Tipo Descrio Informar .T. se desejar lista de impressoras lista de impressoras do Remote. Retorno Array Descrio Descrio Array com nome das impressoras disponveis. Descrio Caracter, diretrio aonde est insta

lServer Sim L do Server e .F. se desejar

GETIMPWINDOWS( ) retorna uma lista de impressoras disponveis no spool do Server ou Remote. Se o Server est em ambiente Unix, a GETIMPWINDOWS( ) retornar a lista com os nom es de impressoras cadastradas na chave PRINTERSNAME do AP6SRV.INI (ver PREPAREPRINT( )). Exemplo aImpressoras:= GetImpWindows(.F.) // retorna lista de impressoras do Windows do remote. INITPRINT( ) PREPAREPRINT( ) ISPRINTER( ) PROW( ) PCOL( ) SETPRC( ) FECHAREL( ) PRNFLUSH( ) EJECT( ) GETPORTACTIVE( ) GetPortActive Retorna lista de portas de impresso disponveis. Sintaxe GETPORTACTIVE ( lServer ) --> Array Argumento Obrigat. Tipo Descrio Informar .T. se desejar lista de impressora

lServer Sim L s do Server e .F. se desejar

----------------------- Page 201----------------------lista de impressoras do Remote. Retorno Array Descrio GETPORTACTIVE( ) retorna uma lista is do Server ou Remote. Se o Server est em ambiente Unix, a ista com os nomes de devices possveis para impresso. de portas de ) impresso retornar disponve uma l Descrio Array com nome das impressoras disponveis

GETPORTACTIVE(

Exemplo aPortas:= GetPortActive(.F.) // retorna lista de portas de impressao do remote. INITPRINT( ) PREPAREPRINT( ) ISPRINTER( ) PROW( ) PCOL( ) SETPRC( ) FECHAREL( ) PRNFLUSH( ) EJECT( ) GETIMPWINDOWS( ) Header Verifica o tamanho do cabealho da tabela corrente. Sintaxe HEADER() --> Numrico Retorno 0 NBytes Descrio Esta funo pode ser utilizada em conjunto com as funes RecSize e RecCount para calcul ar o tamanho ocupado no disco pela tabela corrente. Pois, o tamanho ser Header+RecSize*RecCoun t. ----------------------- Page 202----------------------Exemplo // Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmer o de bytes): USE "\DADOSADV\AA1990.DBF" SHARED NEW nCabecalho := HEADER() nDados := RecSize() * RecCount() nTamanhoTotal := nCabecalho + nDados Descrio No h tabela corrente Tamanho do cabealho da tabela corrente em nmero de bytes

RECSIZE RECCOUNT IndexKey Verifica qual a expresso de chave de um ndice. Sintaxe INDEXKEY( nOrdem ) --> Caracter Argumento nOrdem ista. Retorno "" cExpOrdem os. Descrio Obrigat. S Descrio No existe ndice para o parmetro nOrdem corrente. Expresso de chave da ordem ativa ou especificada pelos parmetr Tipo N Descrio Posio do ndice na l

Esta funo utilizada para verificar qual a expresso de chave de determinado ndice, e pecificado pela posio do ndice na lista pelo primeiro parmetro. Se for passado parmetro igual a 0, ser retornada a expresso de chave do ndice atual . Exemplo // Este exemplo mostra como o INDEXKEY() pode recuperar a expresso do ndice atual: USE Cliente NEW INDEX ON Nome+Cod TO Ind1 FOR Nome+Cod > "AZZZZZZZ" INDEX ON Nome TO Ind2 FOR Nome > "CCCCCCC" INDEXKEY(1) // Retorna: Nome+Cod INDEXKEY(2) // Retorna: Nome INDEXKEY(0) // Retorna: Nome expresso corrente ORDFOR( ) ORDNAME( ) ORDNUMBER( ) ORDKEY( ) ----------------------- Page 203----------------------IndexOrd Verifica a posio do ndice corrente.

Sintaxe INDEXORD() --> Numrico Retorno 0 nOrd Descrio Esta funo retorna a posio ocupada pelo ndice corrente dentro da lista de ndices. Exemplo // Este exemplo verifica qual a posio do ndice corrente dentro da lista USE Cliente NEW SET INDEX TO Nome, End, Cep INDEXORD() // Returns: 1 - o primeiro ndice da lista ORDBAGEXT ORDCREATE( ) ORDBAGNAME ORDNAME InitPrint Inicializa parmetros de impresso de relatrio. Sintaxe INITPRINT([ nOutPut ], [ cNameRel ], [ cType ] ,[ lPort ],[ cPathAtu ]) --> NIL Argumento Obrigat. Tipo N Descrio Direcionamento da sada de impresso. 1=via Clie Server cNameRel mpresso cType , "132L"= No C Nome do relatrio que ser exibido no spool de i Tipo do relatrio. "220" = 220 colunas Descrio No existe ndice ou tabela corrente Posio do ndice corrente na lista

NOutPut No nt (padro) e 2=via

No C 132 colunas

landscape (Padro), "132P"= 132 colunas port rait, "080" = 80 colunas portrait lPort No L No utilizado

----------------------- Page 204----------------------cPathAtu No L No utilizado

Retorno NIL Descrio

Descrio Sem retorno

INITPRINT() inicializa parmetros de impresso de relatrio. Define onde ser a sada de i mpresso e qual vai ser a formatao de sada. Exemplo /* Inicializa relatrio para imprimir via Client "Meu relatrio" em formulrio de 132 colunas em Landscape */ InitPrint( 1,"Meu relatrio", "132L" ) PREPAREPRINT( ) ISPRINTER( ) PROW( ) PCOL( ) SETPRC( ) FECHAREL( ) PRNFLUSH( ) EJECT( ) GETIMPWINDOWS( ) GETPORTACTIVE( ) IsCisaSyncOn Verifica se o uso do CisaSync est habilitado. Sintaxe IsCisaSyncON() -> Lgico Retorno .F. .T. Descrio No est habilitado. Est habilitado.

----------------------- Page 205----------------------Descrio Esta funo utilizada para verificar se o uso do CisaSync est habilitado ou no. Exemplo

// Este exemplo demonstra como se pode utilizar IsCisaSyncOn verificar se o Cisa Sync est habilitado. USE Cliente NEW IF (ISCISASYNCON()) QOUT("CisaSync habilitado") ELSE QOUT("CisaSync desabilitado") ENDIF IsPrinter Verifica se impressora est disponvel. Sintaxe ISPRINTER( [ xPorta ], [ lSeta ], [ nWhere ], [ @nErrorCode ] ) --> Lgico Argumento Obrigat. Tipo ou Descrio Informar a porta que desejamos

xPorta No C verificar "LPT1" (padro), N PT2. lSeta nWhere (default), nErrorCode ora Retorno .T. .F. Descrio 2= No No testa No Descrio Impressora ativa Impressora inativa L

"LPT2" , "COM1", "COM2" ou 1=LPT1, 2=L No utilizado 1= testa impressora no Remote

N impressora N

no Server. Retorna o cdigo de erro da impress

ISPRINTER( ) testa a disponibilidade de impressoras conectadas fisicamente mquina onde est sendo executado o Server ou Remote Protheus. Dependendo do sistema o peracional, o teste pode ser um Assembler em Windows 95 ou 98, ou a criao de um arquivo em Windows NT,2000 e Unix. Nos casos onde o teste efetuado por criao de arquivo, o nErrorCode no ser informado. Exemplo If !isPrinter(1,,1,@nErr) // testa se impressora esta conectada na lpt1 no Remot e. MsgBox("Impressora no conectada! Erro: "+Str(nErr)) endif

INITPRINT( ) ----------------------- Page 206----------------------PREPAREPRINT( ) PROW( ) PCOL( ) SETPRC( ) FECHAREL( ) PRNFLUSH( ) EJECT( ) GETIMPWINDOWS( ) GETPORTACTIVE( ) MakeDir Cria um diretrio. Sintaxe MAKEDIR( cNovoDir ) --> Numrico Argumento Obrigat. Tipo C Descrio Nome do diretrio a ser criado, incluindo opc

CNovoDir Sim ionalmente o caminho. Retorno 0 - 1 Descrio Descrio

Diretrio foi criado com sucesso Erro na criao do diretrio

Cria um diretrio na estao ou no servidor Advanced Protheus. Exemplo MAKEDIR ("c:\teste\um") // Cria um diretrio na estacao nResult := MAKEDIR ("\teste\um") // Cria o diretorio no servidor Advanced prothe us IF nResult != 0 conout("Impossivel criar o diretrio no servidor Protheus" + Str(nResult)) ENDIF MAKEDIR ( "teste" ) // Exemplo tambm vlido ( Criando o diretrio no servidor) DIRMAKE() ----------------------- Page 207-----------------------

DIRCHANGE() DIRREMOVE() MemoLine Extrai uma linha de uma string ou de um campo memo. Sintaxe MEMOLINE( cString, [ nLineLength ], [ nLineNumber ], [ nTabSize ], [ lWrap ]) --> Caracter Argumento cString nha. Obrigat. Sim Tipo C N N N Descrio a string original de onde ser extrada a li Nmero de caracteres por linha. Caso no espec Nmero da linha a ser retornada. Caso no espe Define o nmero de caracteres para o Tab. Ca assume 4. lWrap No as palavras. Caso no Retorno Descrio L Habilita a quebra de linhas de acordo com especificada, fica habilitado.

nLineLength No ificado, assume 79. nLineNumber No cificado, assume 1. nTabSize No so no especificado,

Caracter Caracter. Retorna a linha solicitada, caso no exista o nmero de linhas, retorna uma string em branco. Descrio MemoLine() uma funo que retorna uma linha especfica. Caso no exista a linha especifi cada, retorna um string em branco. Caso a quebra de linhas esteja habilitada (lWrap igual .T.) e a palavra esteja n o meio da quebra de linha, esta ser colocada na prxima linha. MemoLine() usada em conjunto com MLCOUNT() para extrair todas as linhas de um te xto. Exemplos LOCAL nLineLength := 40, nTabSize := 3, lWrap := .T. LOCAL nLines, nCurrentLine // LOCAL cTexto := MEMOREAD( "Texto.TXT" ) nLines := MLCOUNT(cTexto, nLineLength, nTabSize, lWrap)

// FOR nCurrentLine := 1 TO nLines conout (MEMOLINE (CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap) ) NEXT MLCOUNT( ) MEMOREAD( ) ----------------------- Page 208----------------------MEMOWRITE( ) MemoRead L um arquivo texto e retorna uma string. Sintaxe MEMOREAD( cFile ) --> Caracter Argumento CFile ser lido. Obrigat. Sim Caminhos Tipo C podem ser includos. Retorno varivel ytes do arquivo Descrio MemoRead() l um arquivo texto e armazena o contedo em uma varivel string. O arquivo pode conter no mximo 65.535 bytes. MemoRead() tentar abrir o arquivo compartilhado e somente para leitura. Caso o arquivo no possa ser aberto, MemoRead retornar uma string vazia ( "" ). Exemplos cString = MEMOREAD ("Temp.txt") if empty( cString ) conout("Erro lendo arquivo") endif MEMOWRITE() MemoWrite Grava uma string para um arquivo em disco. Sintaxe Descrio Caracter. MEMOREAD() retorna uma string com no mximo 65.535 b informado. Descrio Nome do arquivo texto que dever

----------------------- Page 209----------------------MEMOWRITE( cArquivo , cString ) -->Lgico Argumento Obrigat. Tipo C extenso C Descrio O Arquivo foi gravado com sucesso criao e gravao do arquivo, verifique FERROR() par e Descrio o nome o caminho. do arquivo onde ser g

cArquivo Sim ravado, incluindo a CString Retorno .T. Sim

a string que ser gravada no arquivo.

.F. Houve falha na a obter detalhes o erro. Descrio

MEMOWRITE() uma funo que grava o contedo de uma string em um arquivo em disco. Podem ser usados caminhos tanto no local ( Remote ) como no servidor. Exemplos LOCAL cString := "Teste de gravao" IF MEMOWRITE ("teste.txt", cString) conout("Erro gravando teste.txt") ENDIF MEMOREAD() MLCount Conta o nmero de linhas de uma String. Sintaxe MLCOUNT( cString , [ nLineLength ], [ nTabSize ], [ lWrap ]) --> Numrico Argumento cString inha. Obrigat. Sim Tipo C N N Descrio a string original de onde ser extrada a l Nmero de caracteres por linha. Caso no espe Define o nmero de caracteres para assume 4. lWrap No L acordo com as palavras. Se no Habilita a quebra de linhas de o Tab.

NLineLength No cificado, assume 79. nTabSize No Caso no especificado,

especificado, fica habilitado.

Retorno >=0 Descrio

Descrio Numrico. Nmero de linhas que a string possui.

----------------------- Page 210----------------------MLCOUNT() retorna o nmero de linhas de uma string baseado nos parmetros informados . Exemplos LOCAL nLineLength := 40, nTabSize := 3, lWrap := .T. LOCAL nLines, nCurrentLine // LOCAL cTexto := MEMOREAD( "Texto.TXT" ) nLines := MLCOUNT (cTexto, nLineLength, nTabSize, lWrap) // FOR nCurrentLine := 1 TO nLines conout(MEMOLINE(CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap)) NEXT MEMOLINE() MEMOREAD() MEMOWRITE() Month Converte o valor da data para o nmero do ms. Sintaxe MONTH( dData ) --> Numrico Argumento dData Retorno >=0 e <=12 0 Descrio MONTH() uma funo de converso que extrai da data o valor numrico do ms. CMONTH() uma funo semelhante que retorna o nome do ms a partir do valor de dData. Exemplos Estes exemplos retornam o ms da data do sistema: dData := DATE() // Resultado: 09/01/01 Obrigat. Sim Descrio Para uma data vlida. Se a data for nula ou invlida Tipo D Descrio o valor da data a ser convertido

nMes := MONTH(DATE()) // Resultado: 9 nMes := MONTH(DATE()) + 1 // Resultado: 10 ----------------------- Page 211----------------------CMONTH() DAY() YEAR() DOW() MsCompress Compacta um ou vrios arquivos em um nico arquivo com extenso .MZP. Sintaxe MSCOMPRESS( cArq, [ cDestino ], [ cSenha ] ) --> lSucesso Ou MSCOMPRESS( aArquivos, [ cDestino ], [ cSenha ] ) --> lSucesso Argumento CArq aArquivos a extenso o assumir cDestino Obrigat. Sim Sim seja omitida o mesmo No Tipo C A ser assumido nome C Array aArquivos. No Descrio A compactao foi executada com sucesso. Erro na compactao, verifique o espao disponvel para compactao. C Senha a ser utilizada para criptografar o a do cArq com extenso .MZP ou o nome .MZP, se no for informad Descrio Nome do Arquivo a ser compactado. Nomes dos arquivos a serem compactados. Nome do Arquivo destino, caso

do 1 . Arquivo no cSenha rquivo. Retorno .T. .F. Descrio

MSCOMPRESS() compacta os arquivos informados em um nico arquivo fault .MZP. O formato proprietrio e multiplataforma.

Caso a senha seja informada apenas com a senha poderemos descompactar os arquivo s. A funo para descompactao a MSDECOMP().

com extenso

de

Tanto arquivos no local ( Remote ) como no Servidor so aceitos. ----------------------- Page 212----------------------Exemplos // Exemplo 1 Compacta apenas um arquivo lRes := MSCOMPRESS ( "AP6SRV.EXE", "AP6SRV.MZP" ) // Exemplo 2 Compacta um diretrio com senha aNome := {} ADIR( "*.DBF", aNome ) lRes := MSCOMPRESS ( aNome, "ArqComp.MZP", "SENHA" ) MSDECOMP() MsCRC32 Calcula um CRC de uma string. Sintaxe MSCRC32( cString ) --> nCRC Argumento CRC32, Obrigat. garantido que no C sempre diferentes. Retorno nCRC Descrio MSCRC32() calcula um CRC de uma string informada e retorna um nmero com esse clcul o. Note que strings iguais retornam trings diferentes retornam CRC diferentes. Exemplo cString := MEMOREAD( "ARQ.TXT" ) ? MSCRC32 ( cString ) MSCRC32STR() MsCRC32Str ----------------------- Page 213----------------------CRC iguais, porm, nem sempre s Descrio Um nmero indicando o CRC da string informada. Tipo para garantido , os nmeros sejam que para strings diferentes Descrio String de onde ser calculado um a mesma string sempre se obter um

mesmo nmero, porm, CString Sim

Calcula um CRC de uma string, retornando em formato String. Sintaxe MSCRC32STR( cString ) --> cCRC. Argumento CRC32, mesmo cString tes os Retorno nCRC Descrio MSCRC32STR() calcula um CRC de uma string informada e retornando uma string com esse clculo. Note que strings iguais retornam rings diferentes retornam CRC diferentes. Exemplo cString := MEMOREAD( "ARQ.TXT" ) ? MSCRC32STR ( cString ) MSCRC32() MsDecomp Descompacta arquivos no formato .MZP (Microsiga Zip). Sintaxe MSDECOMP( cArqZip, cPathDestino, [ cSenha ] ) --> lSucesso. Argumento cArq Obrigat. Sim Tipo C Descrio Nome do Arquivo a ser descompactado. Diretrio onde escompactados. Note que cPathDestino No como caminhos locais ( C os arquivos devero ser d CRC iguais, porm nem sempre st Obrigat. garantido que mas Sim nmeros sejam no C Tipo para garantido sempre diferentes Descrio Uma string com o CRC da string informada que para strings diferen Descrio String a mesma de onde ser calculado obter um um

string sempre

nmero,

podem ser includos caminhos do servidor Remote ).

----------------------- Page 214----------------------cSenha No C Senha a ser utilizada para descriptogra

far o arquivo. Retorno .T. .F. Descrio MSDECOMP() descompacta o arquivo informado em um diretrio. Formato proprietrio, e multiplataforma, suporta apenas arquivos compactados pela funo MSCOMPRESS(). O Descrio A descompactao foi executada com sucesso.

Erro na compactao, verifique o espao disponvel para descompactao.

Caso o arquivo seja protegido por senha, apenas com a senha poderemos descomp act-lo. A funo para compactao a MSCOMPRESS(). Tanto arquivos no local ( Remote ) como no Servidor so aceitos. Exemplo // Exemplo 1 Descompacta no servidor lRes := MSDECOMP ( "AP6SRV.MZP", "TEMP" ) // Exemplo 2 Descompacta no local ( Remote ) lRes := MSCOMPRESS( "c:\ArqComp.MZP", "SENHA" ) MSCOMPRESS() MsgBox Tipo: Tela Windows Abre uma caixa de dialogo padronizada para informar o usurio de um Erro deciso a s er tomada ou apenas uma informao (Registro Gravado com sucesso). Sintaxe MSGBOX(cMensagem,cTtulo,cTpCaixa) Parmetros cMensagem Define a mensagem apresentada no interior da janela cTtulo Titulo da janela cTpCaixa Tipo da caixa padronizada Retorno Retorna Nil ou um valor lgico (.T. ou .F.) conforme o tipo de caixa. Comentrios As caixas assumem o tamanho de <cMensagem>. Tipos de caixas: ----------------------- Page 215----------------------STOP, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil.

INFO, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. ALERT, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. YESNO, utiliza um bitmap para advertncia e tem dois botes Sim e No, retorna .T. ou .F. RETRYCANCEL, utiliza um bitmap para advertncia e tem dois botes Repetir e Cancelar, rna .T. ou .F. OrdCondSet Seta a condio e o escopo para a ordem corrente. Sintaxe ORDCONDSET([ cForCond ],,,,[ bEval ],,,,,, [ lDescendente ],,,,) --> Lgic o Argumento er resolvida para cForCond ro do escopo definido Bloco Expresso na forma executvel a se r resolvida para cada bEval No de registro processado. Este bloc o deve retornar tipo lgico Cdigo lDescendente No rescente ou decrescente Retorno .F. .T. Descrio Esta funo utilizada para setar uma ordem de registro que es teja dentro de um escopo e de uma condio especificada. Se todos os parmetros forem omitidos sero aceitos todos os r egistros da ordem. Atravs do primeiro parmetro (cForCond) possvel especificar o es copo ao qual o registro deve pertencer para estar dentro do filtro. Atravs do parmetro bEval, pode-se defini r um bloco de cdigo que deve retornar .T. para que o registro pertena ao filtro a ser setado. Se te, o parmetro lDescendente for omitido, a ordem mas se tiver valor .T. ser decrescente. estar crescen L Descrio No conseguiu setar o filtro Filtro setado com sucesso Especifica se a ordem deve ser c Obrigat. verificar No Tipo Descrio Expresso na forma textual C se o registro em questo est dent a s

Exemplo // Este exemplo mostra como se pode usar o ORDCONDSET para executar um filtro com idade entre 20 e 30 anos e nome Joao: USE Cliente VIA "DBFCDX" NEW ORDCONDSET("Idade>20 .AND. Idade<30",,,,{ Nome = "Joao"}) ORDNAME( ) ----------------------- Page 216----------------------ORDNUMBER( ) ORDSCOPE( ) DBEVAL( ) OrdCreate Cria uma ordem em determinado arquivo de ndice. Sintaxe ORDCREATE([ cIndice ],[ cOrdem ], cExpChave, [ bExpChave ], [ lUnico ]) --> Nil Argumento cIndice criada a ordem. cOrdem Obrigat. No * No * Tipo C C Descrio Nome do arquivo de ndice a ser Nome da ordem a ser criada. Expresso das chaves da em a ser criada na forma de cExpChave Sim C string. ordem a ser criada bExpChave No na Bloco de forma Cdigo L lUnico ). *Obs: Os dois primeiros parmetros so opcionais, mas pelo menos um deles tem que es tar especificado. Retorno NIL Descrio Esta funo arquivo de utilizada para criar ndice com o nome uma nova ordem em determinado Descrio Sem retorno No Cria ndice como nico (o padro .F. Expresso executvel. das chaves da ord

especificado atravs do primeiro parmetro, existir, apenas acrescentada a ordem, mas, caso contrrio, criado o arquivo. Para tanto, so executados os passos a seguir:

sendo

que, se

mesmo

1- Salva fisicamente as alteraes ocorridas na tabela corrente; 2- Fecha todos os arquivos de ndice abertos; 3- Cria o novo arquivo de ndice se no existir; ----------------------- Page 217----------------------4- Cria a nova ordem; 5- Seta a nova ordem como a ordem corrente; 6- Posiciona a tabela corrente no primeiro registro do ndice. Com exceo do RDD Ctree, a tabela corrente no precisa estar aberta em modo exclusivo para a criao da ordem, pois na criao de ndices no Ctree alterada a estrutura da tabela, sendo ne cessrio que a tabela esteja aberta em modo exclusivo. Exemplo // Este exemplo mostra como se pode criar novo arquivo de ndice criando a ordem s obre os campos Nome e End e no aceitar duplicao: USE Cliente VIA "DBFCDX" NEW ORDCREATE ("\teste\ind2.cdx",,"Nome+End",{ Nome+End },.T.) // Este exemplo mostra como se pode criar nova ordem (Tag2) sobre o campo End qu e aceitar duplicao e no arquivo de ndice j existente: USE Cliente VIA "DBFCDX" NEW ORDCREATE ("\teste\ind2.cdx","Tag2","End",{ End }) DBREINDEX( ) DBSETINDEX( ) DBSETORDER( ) DBCREATEINDEX( ) OrdDescend Verifica ou altera a condio (crescente/decrescente) de uma ordem. Sintaxe ORDDESCEND([ cOrdem Argumento cOrdem Obrigat. No nPosicao ],[ cArqIndice ], [ lDecrescente ]) --> Lgico Tipo C Descrio Nome da ordem a ser alterada

nPosicao cArqIndice lDecrescente

No No No

N C L

Posio da ordem na lista a ser alterada Nome do arquivo de ndice Determina se a ordem ser decrescente (.T.

) ou crescente (.F.) Retorno Descrio

----------------------- Page 218----------------------.F. .T. Descrio Esta funo pode ser utilizada para apenas verificar o estado da ordem atual, se no f or especificado o parmetro lDecrescente. Quando especificado o parmetro lDescend, odificado, sendo que a funo retorna ao estado anterior da ordem em questo. o estado da ordem m A ordem do parmetro est na forma crescente A ordem do parmetro est na forma decrescente

Para evitar conflito, no caso de haver mais om o mesmo nome, pode-se passar o parmetro com o nome do ndice ao qual a ordem pertence.

de

uma

ordem

A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na l ista de ordens ativas (atravs do ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automati camente se o parmetro numrico ou caracter. Exemplo // Este exemplo mostra como o ORDBAGNAME pode encontrar o nome de diferentes ndic es atravs da posio da ordem na lista: USE Cliente VIA "DBFCDX" NEW ORDLISTADD ("\teste\ind1.cdx","NOME") // A ordem criada na forma crescente ORDDESCEND() // Retorna: .F. ORDDESCEND(,,.T.) // Retorna: .F., mas seta a ordem atual (NOME) como decrescent e ORDDESCEND() // Retorna: .T. ORDLISTADD ("\teste\ind2.cdx","NOME") ORDDESCEND("NOME","ind1",.F.) // Retorna: .T. ORDDESCEND("NOME","ind1",) // Retorna: .F. ORDBAGNAME( ) ORDNAME( ) ORDCREATE( ) OrdKey

Verifica qual a expresso de chave da ordem. Sintaxe ORDKEY([ cOrdem Argumento cOrdem nPosicao nPosicao ],[ cArqIndice ]) --> Caracter Tipo C N Descrio Nome da ordem a ser alterada Posio da ordem na lista

Obrigat. No No

----------------------- Page 219----------------------cArqIndice Retorno "" cExpOrdem ros. Descrio Esta funo utilizada para verificar qual a expresso de chave de determinada ordem. Caso no sejam especificados os parmetros de identificao da ordem, verificada a ordem corrente. Para evitar conflito, no caso de haver mais om o mesmo nome, pode-se passar o parmetro com o nome do ndice ao qual a ordem pertence. de uma ordem c No C Descrio No existe ordem corrente. Expresso de chave da ordem ativa ou especificada pelos parmet Nome do ndice

A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na li sta de ordens ativas (atravs do ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automati camente se o parmetro numrico ou caracter. Exemplo // Este exemplo mostra como o ORDKEY() pode recuperar a expresso da ordem atual: USE Cliente NEW INDEX ON Nome+Cod TO Ind1 FOR Nome+Cod > "AZZZZZZZ" ORDKEY("Ind1") // Retorna: Nome+Cod ORDFOR( ) ORDNAME( ) ORDNUMBER( ) INDEXKEY( ) OrdListAdd Acrescenta uma ou mais ordens lista.

Sintaxe ORDLISTADD( cArqIndice, [ cOrdem ]) --> Nil Argumento Obrigat. Tipo C Descrio Nome do ndice a ser acrescentado, com ou se

cArqIndice Sim m diretrio e extenso

----------------------- Page 220----------------------cOrdem Retorno NIL Descrio Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na li sta de ordens ativas da rea de trabalho. Quando so especificados os dois argumentos (ndice e ordem), acresce ntada apenas a ordem especificada nos parmetros lista e a mesma torna-se ativa. Quando especificado apenas o primeiro parmetro, so acrescentadas todas as ordens contidas no arquivo de ndice especificado neste parmetro lista, e a primeira ordem torna-se at iva. Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no p rimeiro parmetro, mas, caso contrrio, deve ser especificado. Exemplo // Este exemplo mostra como se pode acrescentar uma ordem especfica ou todas as o rdens de determinado arquivo de ndice lista: USE Cliente VIA "DBFCDX" NEW OrdListAdd ("\teste\ind1.cdx","NOME") // Acrescenta apenas a ordem NO ME OrdListAdd ("\teste\ind2.cdx") // Acrescenta todas as ordens do arquivo ind2.cd x ORDFOR( ) ORDNAME( ) ORDNUMBER( ) ORDLISTCLEAR( ) Pack Remove todos os registros deletados da tabela. Sem retorno No C Nome da ordem a ser acrescentada Descrio

Sintaxe PACK Descrio Este comando apaga (fisicamente) todos os registros deletados da tabela corrente . ----------------------- Page 221----------------------Exemplo // Este exemplo demonstra como se pode utilizar a funo DBDELETE() para marcar algu ns registros como deletados e o comando PACK para delet-los fisicamente. USE Clientes NEW DBGOTO(100) DBDELETE() DBGOTO(105) DBDELETE() DBGOTO(110) DBDELETE() PACK ZAP DBRECALL( ) PCol Informa ou muda a coluna corrente de impresso. Sintaxe PCOL( [ nNewCol ] ) --> Numrico Argumento nNewCol esso. Retorno N Descrio PCOL( ) pode ser utilizado para informar a coluna corrente de impresso ou para modific-la. Se for informada uma coluna menor que a corrente, sero impressos carac teres de BACKSPACE chr(8) para forar o retorno do carro de impresso em impressoras matriciais. Exemplo PCOL( 10 ) @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( PROW( )+2 ) // Pula 2 linhas Obrigat. No Descrio Nmero da coluna corrente de impresso. Tipo N Descrio Informar a nova coluna de impr

PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina INITPRINT( ) ----------------------- Page 222----------------------PREPAREPRINT( ) ISPRINTER( ) PROW( ) SETPRC( ) FECHAREL( ) PRNFLUSH( ) EJECT( ) GETIMPWINDOWS( ) GETPORTACTIVE( ) PreparePrint Prepara o relatrio para o inicio da impresso. Sintaxe PREPAREPRINT( lWindows, cPrinterName, lDisco, cFile, l_Lpd, nLeftMargin ) -> NIL Argumento Obrigat. Tipo L Descrio Define se a impresso ser via spool do W

lWindows Sim indows ou diretamente cPrinterName a que ser nome da Sim acionada.

em porta de impresso. C Se lWindows=.T., impressora impresso "LPT1","LPT2". lDisco Sim a gravao em arquivo. ame, no tero efeito L ento deve-se informar o nome do arquivo de s ada em cFile. cFile se lDisco=.T.. Sim C Informa o nome de arquivo que ser gerado Informa se a impresso ser direcionada par Se lDisco=.T., lWindows e cPrinterN Windows. Se lWindow=.F., deve-se informar o nome da porta de deve-se informar o Informa o nome da impressor

l_lpd ambiente Unix. ra disco e logo em

No

Aplicvel somente para Server executando em Informa que a impresso ser direcionada pa seguida direcionada para o LPD (daemon

de impresso do Unix). nLeftMargin ra encadernao em Retorno NIL No N Margem esquerda do relatrio para ajuste pa cm. Descrio Sem retorno.

----------------------- Page 223----------------------Descrio PREPAREPRINT( ) ajusta a impresso do relatrio propriamente dita, define se utilizar o spool do Windows ou se o relatrio ser direcionado para arquivo. Pode-se ajustar a margem es querda do relatrio para encadernaes. Quando estamos utilizando um servidor em ambiente Unix, pode-se configurar a sada do relatrio para utilizar o LPD (Line Printer Daemon) do Unix. Ative o parmetro l_lpd p ara .T., e no arquivo de configurao do Server (AP6SRV.INI), crie a entrada abaixo: [SERVERPRINTERS] PRINTERSNAME=lp1,lp2[...,lp3] Onde PRINTERSNAME uma lista com os nomes das impressoras cadastradas no \etc\pri ntcap. Para mais informaes veja manual do Unix para configurao de impressoras. Lemb rando que o Unix casesensitive quando trata nomes e arquivos. Exemplo // Envia a impressao para a impressora "LaserJet4.." e configura a margem esquer da para 1 cm para direita PreparePrint( .T., "LaserJet4 in //advpr1",.F.,"",.F.,1 ) INITPRINT( ) ISPRINTER( ) PROW( ) PCOL( ) SETPRC( ) FECHAREL( )

PRNFLUSH( ) EJECT( ) GETIMPWINDOWS( ) GETPORTACTIVE( ) PrnFlush Fora envio do buffer de impresso para a impressora. Sintaxe PRNFLUSH( Retorno ) --> NIL Descrio

----------------------- Page 224----------------------NIL Descrio Nas impresses, o Protheus bufferiza a impresso em pginas para nviar todo o contedo para a impressora de forma otimizada. PRNFLUSH( ) fora o envio do buffer de dados para a impressora antes do previsto pela otimizao de impresso. Exemplo SETPRC(0,0) // inicia impresso na linha 0 coluna 0 PCOL( 10 ) //muda para coluna 10 @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PRNFLUSH( ) // Forca impresso antes do termino da pagina. PROW( PROW( )+2 ) // Pula 2 linhas PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina FECHAREL( ) // Fecha impresso INITPRINT( ) PREPAREPRINT( ) ISPRINTER( ) PROW( ) PCOL( ) SETPRC( ) FECHAREL( ) EJECT( ) GETIMPWINDOWS( ) e Sem retorno

GETPORTACTIVE( ) PRow Informa ou muda a linha corrente de impresso. Sintaxe PROW( [ nNewLine ] ) --> Numrico Argumento nNewLine de impresso. Obrigat. No Retorno N Tipo N Descrio Informar a nova linha Descrio Nmero da linha corrente de impresso

----------------------- Page 225----------------------Descrio PROW( ) pode ser utilizado para informar a linha corrente de impresso ou para mod ific-la. Se a nova linha informada for menor que a corrente, isto provocar um salto de pgina na impre sso. Exemplo @ PROW( ), 10 PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( PROW( )+2 ) // Pula 2 linhas @ PROW( ), 10 PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina INITPRINT( ) PREPAREPRINT( ) ISPRINTER( ) PCOL( ) SETPRC( ) FECHAREL( ) PRNFLUSH( ) EJECT( ) GETIMPWINDOWS( ) GETPORTACTIVE( ) RDDSetDefault

Modifica ou verifica o RDD padro. Sintaxe RDDSetDefault ([ cNovoRddPadro ]) --> Caracter Argumento cNovoRddPadro mo padro. Retorno cAntigoRddPadro Descrio Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for omitido seu parmetro. ----------------------- Page 226----------------------Ela tambm pode ser padro, especificando-o parmetro. Exemplo // Este exemplo demonstra como se pode utilizar o RDDSETDEFAULT para alterar o v alor do RDD padro. RDDSETDEFAULT ("CTREECDX") // Retorna: DBFCDX RDDSETDEFAULT() // Retorna: CTREECDX DBSETDRIVER( ) RDDNAME( ) RDDLIST( ) RealRDD Retorna qual o driver que realmente est sendo utilizado para abertura dos arquivo s locais. Sintaxe REALRDD() --> Caracter Retorno crio "ADS" Server "ADSSERVER" Server Advantage Database Advantage Local Des utilizada para atravs do especificar outro RDD como Obrigat. No Tipo C Descrio Novo nome do RDD a ser definido co Descrio Nome do RDD padro corrente

"CTREE" com "CODEBASE" Descrio

Ctree - Fair Codebase

O driver "DBFCDX" pode ser utilizado para a abertura de arquivos Codebase, Advan tage Database Server, Advantage Local Server ou Ctree. Depende do que est especificado na chave LOCALFI LES do ambiente utilizado, no arquivo de inicializao do servidor. REALRDD() retorna o nome do driver que izado para abertura dos arquivos locais. Exemplo if RealRdd()="CODEBASE" conout("Mudar abertura dos arquivos para ADS.") endif Recall Altera o estado deletado de alguns registros. Sintaxe RECALL [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] ----------------------- Page 227----------------------Argumento Obrigat. Tipo Descrio Expresso em ADVPL a ser resolvida para o regi Expresso do a busca deve parar CondWhile No (quando a expresso retornar .F.. nRecs nRecno No No N N Retorno NIL Descrio Este comando utilizado para retirar a marca de registro deletado de alguns regis tros. Para ser executado, os registros em questo devem estar bloqueados ou a tabela dev e estar aberta em Quando registros devem ser verificados. Nmero do recno do registro a ser verificado. Descrio Sem retorno em ADVPL que determina quan realmente est sendo util

CondFor Sim stro ser aceito.

modo exclusivo. Se o registro no estiver deletado, este comando no faz nada. Ele o oposto da funo DBDELETE, que marca o registro atual como deletado. A seleo dos registros a serem alterados feita da seguinte forma: se todas as opes forem omitidas ele executado apenas para o registro atual; se for especificada uma condio de "FOR", o escopo abrange todos os arquivos ( "ALL"); o escopo vai at quando a condio de "WHILE" retorna .F.; o parmetro "NEXT nRecs" determina quantos registros devem ser alterados; o parmetro "RECORD nRecno" especifica qual recno do registro deve ser alterad o; a opo "REST" determina que sero processados os registros a partir do registro a tual. Caso seja omitida, o comando comea a processar a partir do primeiro registro. Exemplo // Este exemplo demonstra como se pode utilizar o do registro atual para normal. USE Cliente DBGOTO(100) DBDELETE() DELETED() // Retorna: .T. RECALL DELETED() // Retorna: .F. // Este exemplo demonstra como se pode utilizar o de todos os registros que apresentam idade>30. USE Cliente RECALL FOR Idade>30 // Este exemplo demonstra como se pode utilizar o de todos os registros com idade maior que 30 e Nome = Joao USE Cliente RECALL FOR Idade>30 WHILE Nome="Joao" REST RECALL para retornar o estado

RECALL para retornar o estado

RECALL para retornar o estado a partir do registro atual.

----------------------- Page 228----------------------PACK DELETE RecSize Verifica o tamanho do registro da tabela corrente. Sintaxe RECSIZE() --> Numrico Retorno Descrio

nBytes 0 Descrio

Tamanho do registro da tabela corrente em nmero de bytes. No h tabela corrente.

Esta funo calcula o tamanho do registro da tabela corrente somando os tamanhos de cada campo mais um byte da flag de registro deletado mais quatro bytes do campo recno. Ela pode ser utilizada em conjunto com as funes Header e RecCount para calcular o tamanho ocupado no disco pela tabela corrente, pois o tamanho ser Header+RecSize*RecCount. Exemplo // Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmer o de bytes): USE "\DADOSADV\AA1990.DBF" SHARED NEW nCabecalho := HEADER() nDados := RECSIZE() * RECCOUNT() nTamanhoTotal := nCabecalho + nDados HEADER( ) RecCount( ) ReIndex Reconstri todos os ndices abertos da rea de trabalho corrente. Sintaxe REINDEX Descrio Este comando reconstri todos os ndices da rea de trabalho corrente e posiciona as t abelas no primeiro registro lgico. ----------------------- Page 229----------------------Exemplo // Este exemplo demonstra como se pode utilizar o DBREINDEX para reconstruir os ndices depois que um novo ndice foi gerado. USE Clientes NEW DBSETINDEX("IndNome") REINDEX DBSETINDEX( ) DBSETORDER( )

Replace Modifica o valor de alguns campos e registros da tabela corrente. Sintaxe REPLACE Campo WITH Exp [, Campo2 WITH Exp2 ] [FOR CondFor] ILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] Argumento Campo lor Obrigat. Sim no campo especificado CondFor olvida para CondWhile quando a No que o registro seja alterado na F.) nRecs nRecno rado Descrio Este comando utilizado para alterar o valor de determinado campo em al guns registros da tabela corrente, onde o campo escolhido recebe o valor da expresso para os registros den tro do escopo definido. Se no forem especificadas as condies para que o registro seja alterado, mo difica toda a tabela, como se estivesse especificada a opo "ALL". Pode-se especificar um escopo para am alterados atravs das opes "FOR CondFor" e "WHILE CondWhile". que os registros sej No No N N Quando registros devem ser alterados Nmero do recno do registro a ser alte No alterao Expresso deve parar (quando a expresso retornar . em ADVPL que determi Expresso em ADVPL a ser res Tipo Descrio Nome do campo a ser alterado Expresso a ser colocado Exp Sim em ADVPL com va [WH

Pode-se tambm limitar o nmero de registros a serem alterados atravs da opo "NEXT nRecs" e determinar que a alterao dos registros deve-se iniciar a partir do registro at ual com "REST", mas, caso contrrio, o comando executa um DBGOTOP() antes de iniciar a alterao. Se desejado alterar apenas determinado defini-lo atravs da especificao do recno com "RECORD nRecno". Exemplo registro pode-se

----------------------- Page 230----------------------// Este exemplo demonstra como utilizar o comando REPLACE alterar todos os re gistros dentro do escopo, onde o campo "Valor" receber "Valor1+Valor2-Valor3*0.1" e o campo "DiaTran" receber a data atual. Este escopo definido por Idade > 20, at que o n ome seja maior ou igual a "VVV", comea a deleo a partir do registro atual e marca ap enas 10 registros: USE Cliente VIA "CTREECDX" NEW REPLACE Valor WITH Valor1+Valor2-Valor3*0.1, DiaTran WITH Date() FOR Idade>20 WHILE Nome<"VVV" NEXT 10 REST RECALL REPLACE RLock Bloqueia o registro corrente da tabela ativa. Sintaxe RLOCK() --> Lgico Retorno Descrio

.F. No conseguiu bloquear o registro. Principal motivo: o registr o j est bloqueado por outro usurio. .T. Descrio Esta funo utilizada quando se tem uma tabela aberta e compartilhada, e se deseja bloquear um registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a funo no altera seu estado. Exemplo //Este exemplo utiliza a funo RLOCK() para deletar o registro com o nome "Joao" da tabela de Clientes indexada por Nome: USE Clientes INDEX Nome SHARED NEW SEEK "Joao" IF FOUND() IF RLOCK() DELETE Messagebox("Joao deletado","OK", 0) ELSE Messagebox("Registro utilizado por outro usurio","Erro", 0) O registro foi bloqueado com sucesso.

ENDIF ELSE Messagebox("Registro no encontrado","Erro", 0) ENDIF CLOSE //Este exemplo mostra como se pode bloquear um registro sem que ele esteja na tabela corrente USE VENDAS NEW USE CLIENTES NEW ----------------------- Page 231----------------------// IF !VENDAS->(RLOCK()) Messagebox("Registro utilizado por outro usurio","Erro", 0) BREAK ENDIF FLOCK( ) USED( ) Seconds Retorna o nmero de segundos decorridos desde a meia-noite. Sintaxe SECONDS() --> Numrico Retorno >=0 e <=86399 epresenta o nmero de o de 24 horas e varia de 0 a 86399. Descrio Esta funo retorna o nmero de segundos decorridos desde a meia-noite, segundo a hora do sistema. Est relacionada funo TIME() que retorna a hora do sistema como uma cadeia de caracteres no formato hh:mm:ss. Exemplos Este exemplo compara TIME() e SECONDS(): cHora := TIME() // Resultado: 10:00:00 cSegundos := SECONDS() // Resultado: 36000.00 Este exemplo usa a funo SECONDS() para cronometrar o tempo decorrido: LOCAL nStart, nElapsed nStart:= SECONDS() . . <statements> . Descrio Retorna a hora do sistema em segundos. O valor numrico r segundos decorridos desde a meia-noite, baseado no relgi

nElapsed:= SECONDS() - nStart cElapsed := LTRIM(STR(nElapsed)) + " seconds" TIME() Seek ----------------------- Page 232----------------------Encontra um registro com determinado valor da chave do ndice. Sintaxe SEEK Exp [SOFTSEEK] Argumento Obrigat. Tipo Descrio Expresso em ADVPL a ser resolvida para Retorno NIL Descrio Este comando utilizado para encontrar um registro com determinado valor da expresso de chave de ndice. Antes da chamada do SEEK deve-se certificar de que existe uma ordem ati va no momento com os campos que se deseja pesquisar o valor. Caso a expresso possua apenas um campo numrico, o prime parmetro deve ser do tipo numrico, mas nos demais casos deve-se utilizar um valor do tipo caracter para este parmetro (mesmo se forem apenas dois campos numricos ou do tipo data). iro Quando for especificada a opo "SOFTSEEK", mesmo que a expresso pesquisada encontrar nenhum registro com este valor, a tabela ser posicionada no prximo valor maior que o especificado no primeiro parmetro, mas mesmo posicionando no prximo valor, esta funo retornar .F. (pois no encontrou). no Quando no for especificado este valor ou estiver .F. e falhar o valor de pesquisa, a tabela ser posicionada em LASTREC + 1 e ser setada a flag de EOF. Exemplo // Este exemplo demonstra como se pode utilizar o SEEK para busca de valores numricos. USE Clientes NEW ORDLISTADD ("/teste/ind1.cdx") // Expresso Num (campo numrico) SEEK 100 // Retorna: .F. Descrio Sem retorno

Exp Sim o registro ser encontrado

EOF() // Retorna: .T. SEEK 100 SOFTSEEK // Retorna: .F. EOF() // Retorna: .F. (pois o softseek posicionou no prximo registro) // Este exemplo demonstra como se pode utilizar o SEEK para percorrer todos o s registros de Clientes com o nome joao e vencimentos a partir de janeiro de 2001. USE Clientes NEW ORDLISTADD ("/teste/ind2.cdx") // Expresso Nome+Venc (campo caracter + data) SEEK " joao200101" SOFTSEEK // Procura a primeira ocorrncia de Nome "jo ao" e vencimento maior que Janeiro de 2001 WHILE !EOF() .AND. Nome == " joao" DBSKIP() ENDDO FOUND( ) EOF( ) DBSKIP( ) ----------------------- Page 233----------------------DBGOTOP( ) DBGOBOTTOM( ) DBSEEK( ) Select Seleciona nova rea de trabalho. Sintaxe SELECT nArea Alias Argumento nArea Obrigat. Sim Tipo N Descrio Nmero da rea de trabalho a ser selecionada. Nome da identificao da rea de trabalho a ser

Alias Sim selecionada (Alias). Descrio

Este comando utilizado para selecionar uma nova rea de trabalho para deix-la ativa . Exemplo // Este exemplo demonstra como se pode utilizar o SELECT alterar a rea corrent e. USE Clientes ALIAS a1 USE Clientes2 ALIAS a2 SELECT a1 // ou SELECT 1 DBUSEAREA( )

ALIAS( ) Set Filter Seta ou cancela uma condio de filtro. Sintaxe SET FILTER TO [ Condio ] Argumento Condio rdem corrente Obrigat. No Tipo Descrio Expresso em ADVPL a ser setada como filtro na o Retorno NIL no Descrio Este comando utilizado para setar um filtro nos registros da tabela cor rente especificado atravs da condio especificada. ----------------------- Page 234----------------------Quando um registro no est dentro do filtro setado ele continua exist indo fisicamente, mas no logicamente (nas funes de manipulao de banco de dados como DBGOTOP, DBSEEK, DBSKI P, etc). Se o comando chamado com condio em vazio, ser cancelado o filtro existente . Exemplo // Este exemplo demonstra como utilizar o comando SET FILTER para setar novas expresses de filtro e retir-las: USE Cliente VIA "CTREECDX" NEW SET ORDER TO 2 // Seta a ordem de nome Nome do ndice Ind1 SET FILTER TO Idade>30 // Filtra os registros com Idade menor que 30 SET FILTER TO DBSETFILTER Set Index Acrescenta todas as ordens de um ou mais arquivos de ndice lista. Sintaxe SET INDEX TO [ ArqIndices ] [ ADDITIVE ] Argumento Obrigat. Tipo Descrio Descrio Sem retor

ArqIndices No entados lista de ordens.

Nome dos arquivos de ndice a serem acresc Retorno NIL Descrio Sem r

etorno Descrio Este comando utilizado para acrescentar uma ou mais ordens de determinado ndic e na lista de ordens ativas da rea de trabalho quando se especifica "ADDITIVE". Quando o mesmo omitido, a lista de ordens scentada s ordens dos ndices. esvaziada para depois ser acre

Quando o arquivo de ndice possui apenas uma ordem, a mesma acrescentada lista e torna-se ativa. Quando o ndice possui mais de uma ordem, todas so acrescentadas lista e a prime ira torna-se ativa. Quando mais de um arquivo de ndice selecionado, a ordem que torna-se ativa a p rimeira ordem do primeiro arquivo. Quando o comando utilizado sem nenhum parmetro, todas as ordens da lista so apa gadas. Exemplo // Este exemplo demonstra como utilizar o comando SET INDEX para acrescentar novas ordens a lista e retir-las depois: USE Cliente VIA "CTREECDX" NEW SET INDEX TO ind1 // Inicializa a lista com as ordens do arquivo de ndice "ind 1" ----------------------- Page 235----------------------SET INDEX TO ind2 ADDITIVE // Acrescenta as ordens do arquivo de ndice "ind2" na lista SET INDEX TO ind3 // Limpa a lista e inicializa com as ordens do arquivo "ind 3" SET INDEX TO // Limpa a lista de ordens SET ORDER DBSETORDER( ) DBSETINDEX( ) CLEAR Set Order Seleciona uma ordem ativa da rea de trabalho.

Sintaxe SET ORDER TO [ nPosio Argumento nPosio cOrdem Obrigat. No No [ TAG cOrdem ] [ IN cIndice ]] Tipo N Descrio Posio da ordem na lista de ordens ativas Nome da ordem a ser setada Nome do arquivo de ndice a ser ao qual per Retorno NIL o Descrio Este comando pode ser utilizado apenas para retornar a tabela corrente ordem original (recno), se no for especificado nenhum parmetro. Tambm pode ser utilizado para para a tabela corrente atravs da posio da ordem na lista de ordens tro ou atravs do nome da ordem especificado "TAG cOrdem". selecionar ativas com uma o nova ordem parme Descrio Sem retorn

cIndice No tence a ordem a ser setada

primeiro

Para evitar nomes de ordens duplicados, pode-se especificar a qual arqu ivo de ndice pertence com "IN cIndice". Exemplo // Este exemplo demonstra como utilizar o comando SET ORDER para setar novas ordens e retir-las: USE Cliente VIA "CTREECDX" NEW SET ORDER TO TAG Nome IN Ind1 // Seta a ordem de nome Nome do ndice Ind1 SET ORDER TO 3 // Seta a terceira ordem da lista SET ORDER TO // Retira as ordens, setando a ordem natural da tabela DBORDLISTADD( ) DBSETORDER( ) ----------------------- Page 236----------------------SetPrc Configura a linha e coluna correntes de impresso. Sintaxe SETPRC( nLin, nCol ) --> NIL

Argumento nLin nCol

Obrigat. Sim Sim

Tipo N N

Descrio Informar a nova linha de impresso Informar a nova coluna de impresso Retorno NIL Descrio Sem retorno.

Descrio m SETPRC( ) modifica como PCOL( ) e separadamente. a linha PROW( ) e coluna chamados atuais de impresso assi

Exemplo SETPRC(0,0) // inicia impresso na linha 0 coluna 0 PCOL( 10 ) //muda para coluna 10 @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( PROW( )+2 ) // Pula 2 linhas PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina INITPRINT( ) PREPAREPRINT( ) ISPRINTER( ) PROW( ) PCOL( ) FECHAREL( ) PRNFLUSH( ) EJECT( ) GETIMPWINDOWS( ) GETPORTACTIVE( ) SetPrint ----------------------- Page 237----------------------Interface onde so configuradas as opes de impresso. Sintaxe SETPRINT( cAlias, cPrograma, [ cPerg ], [ cTitulo ], [ cDesc1 ], [ cDes c2 ], [ cDesc3 ], [ lDic ], [ aOrd ], [ lCompres ], [ cTam ], [ uPar1 ], lFiltro, [ lCrystal ], [ cNomeDrv ], [ uPar2 ], [ lServidor ], [ cPortaImpr ] ) -> caracter

Argumento cAlias cPrograma cPerg X1. cTitulo cDesc1 cDesc2 cDesc3

Obrigat. Sim Sim No No No No No

Tipo C C C C C C C L

Descrio Alias do arquivo a ser impresso. Nome do arquivo a ser gerado em disco Grupo de perguntas cadastrado no dicionrio S Ttulo do relatrio Descrio do relatrio. Continuao da descrio do relatrio. Continuao da descrio do relatrio. Para impresso de cadastro genrico permite a e serem impressos.

lDic No scolha dos campos a aOrd No

A L C U L L C U L C

Ordem(s) de impresso. Se verdadeiro (.T.) habilita escolha o form Tamanho do relatrio "P","M" ou "G". Parmetro reservado Se verdadeiro (.T.) permite a utilizao do ass Se verdadeiro (.T.) permite integrao com Crys Nome de um driver de impresso. Parmetro reservado. Se verdadeiro (.T.) fora impresso no servidor Define uma porta de impresso padro.

lCompres No ato da impresso. cTam uPar1 No No

lFiltro No istente de filtro. lCrystal tal Report. cNomeDrv uPar2 lServidor . cPortaImpr Descrio No No No No No

A funo SetPrint() cria a interface (dilogo) onde as opes de resso de um relatrio podem ser configuradas. Basicamente duas variveis m_pag (*) e aReturn (**) precisam ser dec laradas como privadas (private) antes de executar a SetPrint(). Aps confirmada, os dados so armazenados no vetor aReturn que ser passado como parmetro para funo SetDefault(). (*) controla o nmero de pginas.

imp

(**) vetor contendo as opes de impresso, sua estrutura composta de 8 (oito) element os: 1 - caracter,

tipo do formulrio; 2 - numrico, opo de margem; 3 caracter, destinatrio; numrico, formato da impresso; 5 - numrico, dispositivo de impresso; 6 - reservado; 7 - reservado; 8 - nu o, ordem. Exemplo ----------------------- Page 238----------------------User Function <nome-da-funo>( ) Local cProgram := Exemplo // nome do relatrio Local cAlias := XXX // alias do arquivo Local cPerg := XXXXXX // grupo de perguntas Local cTitulo := Titulo do relatrio Local cDesc1 := Descrio Local cDesc2 := continuao da descrio Local cDesc3 := continuao da descrio Local lDic := .F. // no utiliza dicionrio Local aOrd := { 1 Ordem , 2 ordem , 3 ordem } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 } Private wrel Pergunte ( cPerg, .F. ) wrel := SETPRINT( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDi c, aOrd , lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf SetDefault ( aReturn, cAlias ) If nLastKey == 27 Set Filter To Return EndIf RptStatus ( { lFim Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTi tulo ) Return // rotina de impresso Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho ) Local nLin := 80 Local cCabec1 := Cabecalho 1 Local cCabec2 := Cabecalho 2 dbSelectArea( cAlias ) SetRegua ( RecCount() ) While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58 Cabec ( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealh

o nLin := 8 EndIf @ nLin,000 PSAY __PrtFatLine() @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin,000 PSAY __PrtThinLine() IncRegua () dbSkip() End IF nLin != 80 nLin++ If nLin > 60 Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) ho Endif @ nLin,000 PSAY __PrtThinLine() Roda ( 0, cTitulo, cTamanho ) // Rodap EndIf If aReturn[5] = 1 Set Printer TO ----------------------- Page 239----------------------dbCommitAll() OurSpool ( wrel ) Endif MS_FLUSH () Return Cabec IncRegua Roda RptStatus SetDefault SetRegua Skip Desloca a tabela para outro registro. Sintaxe SKIP [nRegistros] [nArea Argumento nRegistros nArea Alias Obrigat. No No No Retorno Tipo N N ALIASAlias] Descrio Nmero de registros a ser deslocados Nmero da rea de trabalho Nome da identificao da rea de trabalho Descrio

// cabeal

NIL Descrio

Sem retorno

Este comando utilizado para deslocar para outro registro a partir do re gistro atual. O parmetro especifica quantos registros lgicos devem ser deslocados a par tir do corrente. Se for positivo desloca em direo ao final da tabela, se for negativo ao incio da tabela e, caso seja omitido, ir para o prximo registro (o padro 1). Caso passe do incio da tabela, posiciona no pri meiro registro e seta BOF, caso passe do final da tabela, posiciona no registro LASTREC + 1 e seta EOF . O padro ser utilizado para a tabela corrente, mas pode ser especificada outra rea de trabalho para execut-lo atravs do nmero "nArea" ou nome "ALIAS Alias". Exemplo // Este exemplo mostra como o SKIP pode passar do final da tabela e do incio d a tabela DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOBOTTOM() EOF() // retorna .F. SKIP EOF() // retorna .T. DBGOTOP() BOF() // retorna .F. ----------------------- Page 240----------------------SKIP -1 BOF() // retorna .T. // Este exemplo mostra como o SKIP pode deslocar 10 registro em relao ao registro corrente DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) SKIP 10 RECNO() // retorna 110 SKIP -10 RECNO() // retorna 100 // Este exemplo mostra como o SKIP pode ser executado em outra area de trabalho. DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1110.dbf","XXX", .T., .F. ) SKIP 10 ALIAS "SSS" SSS->RECNO() // retorna 110 SKIP -10 ALIAS "SSS" SSS->RECNO() // retorna 100 BOF EOF DBGOTOP( )

DBGOBOTTOM( ) DBSEEK( ) SplitPath Quebra em diversas partes um arquivo. Sintaxe SPLITPATH( cArq, @[cDrive], @[cCaminho], @[cNome], @[cExt] ) --> NIL Argumento Obrigat. Tipo incluir C caminho e drive. Nome do Drive. Exemplo ( C: ). Caso o Arqui vo informado no possua cDrive No orno ser uma string em C drive ou o caminho refira-se ao servidor, ret branco. Nome informado cCaminho no No possua caminho, C ser uma string em branco. Nome do Arquivo sem a extenso, caso em cArq no seja especificado cNome No branco. cExt No seja especificado m branco Retorno NIL Descrio Sem retorno C Nome do Arquivo sem a extenso, caso em cArq no um Arquivo com extenso retornar uma string e C um nome do Arquivo retornar uma string em do Caminho. Caso o Arquivo Descrio Nome Opcionalmente, pode cArq Sim do Arquivo a ser quebrado.

----------------------- Page 241----------------------Descrio SplitPath() divide um caminho completo em todas as suas subpartes; cArq no necess ita conter todas as partes. Tanto arquivos locais ( Remote ) quanto arquivos no servidor, podem ser informad os. O caminho, caso informado, incluir uma barra como ltimo caracter.

A extenso inclui sempre o ponto ( . ) antes da extenso. Todos os parmetros quando passados devem ser por referncia. Exemplo Local cArq := "C:\TEMP\TESTE.EXE" Local cDrive, cDir, cNome, cExt SplitPath( cArq, @cDrive, @cDir, @cNome, @cExt ) ? cDrive // Resultado : C: ? cDir // Resultado : \TEMP\ ? cNome // Resultado : TESTE ? cExt // Resultado: .EXE TCConType Define o tipo de conexo que ser utilizada entre o Protheus e o TopConnect. Sintaxe TCCONTYPE ( cTipo ) --> NIL Argumento cTipo Obrigat. Sim Retorno NIL Descrio Determina o tipo de conexo que ser utilizada entre o Protheus e o TopConnect. O va lor guardado e utilizado nas chamadas seguintes de TCLink. Exemplo TCConType("NPIPE") _nCon := TCLink("MSSQL7/TOPSQL", "TOPSERVER1") If (_nCon < 0) CONOUT("Falha Conexao TOPCONN - Erro: "+ str(nCon, 10, 0)) EndIf ----------------------- Page 242----------------------TCLINK( ) TCDelFile Apaga um arquivo de um banco de dados. Sintaxe TCDELFILE ( cTabela ) --> Lgico Argumento Obrigat. Tipo Descrio Sem retorno Tipo C Descrio Tipo da conexo. Pode ser: "TCPIP" ou "NPIPE" Descrio

cTabela a. Retorno .T. .F. so. Descrio

Sim

C Descrio

Nome da tabela que deve ser apagad

Tabela foi excluda com sucesso Erro. Geralmente porque a tabela est sendo utilizada por outro proces

Apaga um arquivo de um banco de dados relacional via TopConnect. Exemplo If TcCanOpen("TRB"+SM0->M0_CODIGO+"0") TcDelFile("TRB"+SM0->M0_CODIGO+"0") Endif TCCANOPEN( ) TCGenQry Define a execuo de uma Query. Sintaxe TCGENQRY ([ xPar1, xPar2, ], cQuery) --> caracter Argumento xPar1, No tem Obrigat. No Tipo Qualquer Descrio Parmetros apenas para compatibilizao.

----------------------- Page 243----------------------xPar2 cQuery seja executar. Retorno "" Descrio Esta funo determina que a prxima ura de uma Query e no de tabela. Exemplo cQuery := SELECT X2_CHAVE CHAVE, R_E_C_N_O_ RECNO from SX2990 dbUseArea(.T., TOPCONN , TCGenQry(,,cQuery), TRB , .F., .T.) while !Eof() // Processa chamada DBUseArea ser a abert Sim C Descrio Sempre retorna uma string vazia. funo. Contm a expresso da query que se de

conout(TRB->CHAVE) dbSkip() enddo dbCloseArea() DBUSEAREA( ) TCIsvLock Verifica se o servidor possui sistema de locks virtuais. Sintaxe TCISVLOCK () --> Lgico Retorno .T. .F. Descrio Atravs de locks virtuais, possvel bloquear TCISVLOCK verifica se o servidor TopConnect possui tratamento para locks virtuais. Exemplo #ifdef TOP If TCIsVLock() TCVUnLock() EndIf #endif ----------------------- Page 244----------------------TCVLOCK( ) TCVUNLOCK( ) TCRefresh Faz refresh em uma tabela. Sintaxe TCREFRESH ( cTabela ) --> NIL Argumento cTabela ito refresh. Retorno NIL Obrigat. Sim Descrio No existe retorno. Tipo Lgico Descrio Indica nome da tabela que deve ser fe uma string. A funo Descrio O servidor possui sistemas de locks virtuais. O servidor no possui locks virtuais.

Descrio Faz o refresh de uma tabela, atravs de uma leitura forada da tabela no banco de da dos. til aps alteraes diretas no banco (delete, insert). Exemplo cTabela:= "SA1990" cComando := "Delete "+ cTabela +" Where R_E_C_N_O_ > 50000 " TCSqlExec(cComando) TCRefresh(cTabela) TCSetBuff Esta funo foi mantida apenas para compatilizao, no sendo utilizada no AP6. TCSetConn Altera a conexo corrente. ----------------------- Page 245----------------------Sintaxe TCSETCONN( nConexaoCorrente ) --> Lgico Argumento Obrigat. Tipo Descrio Indica que deve se tornar a nConexaoCorrente Sim nada pela funo TCLINK. Retorno .T. .F. Descrio Altera a conexo corrente. Novas tabelas abertas ou criadas izaro esta conexo para realizar a operao. til quando se tem mais de uma conexo com o TopConnect. Exemplo _nCon1 := TCLink("MSSQL7/TOPSQL1", "TOPSERVER1") If (_nCon1 < 0) CONOUT("Falha Conexao TOPCONN 1 - Erro: "+ str(_nCon1, 10, 0)) return .F. EndIf _nCon2 := TCLink("MSSQL7/TOPSQL2", "TOPSERVER2") If (_nCon2 < 0) CONOUT("Falha Conexao TOPCONN 2 - Erro: "+ str(_nCon2, 10, 0)) return .F. util Descrio Conexo corrente trocada com sucesso Conexo no encontrada Numrico corrente. Este nmero foi retor o nmero da conexo

EndIf USE CLIENTES VIA "TOPCONN" NEW // Tabela de clientes ser aberto em _nCon2 TCSETCONN(_nCon1) USE PEDIDOS VIA "TOPCONN" NEW // Tabela de pedidos ser aberto em _nCon2 . . . TCQUIT() RETURN .T. TCLINK( ) TCSetDummy Altera o status do modo "dummy" Sintaxe TCSETDUMMY ([ lStatus ]) --> Lgico Argumento Obrigat. Tipo Lgico Descrio Indica se deve ligar (.T.) ou desligar (.F

lStatus Sim .) o modo "dummy" .

----------------------- Page 246----------------------Retorno .T. .F. Descrio No modo "dummy", o TopConnect faz apenas a abertura dos arquivos, sem executar n enhuma funo de posicionamento. utilizado para fazer uma abertura mais rpida dos arquivos. assando .T., entra em modo "Dummy", .F. volta ao normal. Exemplo TCSetDummy(.t.) For ni:= 1 to NroTabelas cTabela:= "TABELA"+TRIM(STR(NI, 10, 0)) dbUseArea( .T.,"TOPCONN", cTabela, cTabela, .T., .F. ) next TCSetDummy(.F.) dbselectarea("TABELA1") DBGOTOP() ....... TCSpExec Executa uma Stored Procedure. Descrio Operao com sucesso Erro na operao.

Sintaxe TCSPEXEC ( cSProc [, xParam1,...,xParamN])--> [array] Argumento cSProc xParamX Retorno NIL array Descrio Executa uma Stored Procedure, no banco de dados, com nmero varivel de parmetros. Exemplo A Stored Procedure abaixo retorna "Teste" e o parmetro numrico +3: ----------------------- Page 247----------------------Create Procedure teste1( @IN_VALUE int, @OUT_STR char(255), @OUT_VALUE int) WITH RECOMPILE As Begin Select @OUT_STR = "Teste", @OUT_VALUE = @IN_VALUE + 3 End GO Para executar: aResult := TCSPEXEC(xProcedures ( teste1 ), 100 ) IF Len(aResult) = 0 conout("Erro na execuo da Stored Procedure.") Endif Else conout(aResult[1] + str(aResult[2])) Endif TCSpExist Verifica se uma Stored Procedure existe. Sintaxe TCSPEXIST ( cStoredProc ) --> Lgico Argumento cStoredProc Retorno Obrigat. Sim Tipo C Descrio Descrio Nome da Stored Procedure. Obrigat. Sim No Descrio Nenhum valor retornado pela Stored Procedure ou ocorreu um erro. Array contendo os valores de retorno da Stored Procedure. Tipo C Qualquer Descrio Nome da Stored Procedure. Parmetro(s) da Stored Procedure

.T. .F. Descrio

Stored Procedure existe. Stored Procedure no existe.

Verifica a existncia de uma Stored Procedure no Banco de dados atual. Exemplo if TCSPExist("SP000001") cStr := "DROP PROCEDURE "+ "SP000001 " TCSqlExec(cStr) endif ----------------------- Page 248----------------------TCSqlError Retorna o ltimo erro produzido em comandos SQL. Sintaxe TCSQLERROR ( )-> Caracter Retorno Caracter to vazio. Descrio Descrio Texto com descrio do erro. Se no houve erro, retorna tex

Esta funo obtm as mensagens de erros em ordem inversa. Portanto, s vezes necessri fazer vrias chamadas a esta funo para obter todos os erros, caso eles sejam mltiplos. Exemplo nRet = TCSQLEXEC("INSERT INTO SALES/CUSTOMER(NAME) VALUES( JOHN DOE )") If nRet == 0 conout("Insero executada") Else conout( "Insero com erro (s) : ") cRet = TCSQLERROR() Do While !Empty(cRet) conout(cRet) cRet = TCSQLERROR() EndDo EndIf TCSrvType Retorna o tipo de servidor. Sintaxe TCSRVTYPE () --> Caracter

Retorno ""

Descrio String vazia se o driver TopConnect no estiver inicializado.

<> "" String contendo o tipo do servidor. Pode ser: "AS/400", "WinNT" , "AIX", "HPUX","Linux" Descrio ----------------------- Page 249----------------------Retorna o tipo de servidor onde est o banco de dados. Exemplo // utilizado para testar se o ambiente AS/400, pois alguns comandos so diferentes nesta plataforma. Ex: Chamada da funcao de reconciliao If TcSrvType() == AS/400 Processa({ lEnd FA210Processa()}) Else Processa({ lEnd FA211Processa()}) Endif TCSysExe Executa um comando do sistema operacional no servidor TopConnect. Sintaxe TCSYSEXE ( cComando ) --> Numrico Argumento cComando nal. Retorno 0 <>0 Exemplo // Copia arquivo no AS400 cAntigo:= "ANTIGO" cNovo:= "NOVO" cExpres := "CPYF FROMFILE("+AllTrim(cAntigo)+") TOFILE(" cExpres += AllTrim(cNovo)+") MBROPT(*ADD) FMTOPT(*MAP *DROP)" if TCSysExe(cExpres) <> 0 conout("Erro na execuo do comando") endif ----------------------- Page 250----------------------TCSysExe Descrio Comando executado com sucesso. Erro na execuo do comando. Obrigat. Sim Tipo C Descrio Comando do Sistema Operacio

Executa um comando do sistema operacional no servidor TopConnect. Sintaxe TCSYSEXE ( cComando ) --> Numrico Argumento cComando ional. Retorno 0 <>0 Exemplo // Copia arquivo no AS400 cAntigo:= "ANTIGO" cNovo:= "NOVO" cExpres := "CPYF FROMFILE("+AllTrim(cAntigo)+") TOFILE(" cExpres += AllTrim(cNovo)+") MBROPT(*ADD) FMTOPT(*MAP *DROP)" if TCSysExe(cExpres) <> 0 conout("Erro na execuo do comando") endif TCVUnLock Libera o bloqueio virtual de uma string. Sintaxe TCVUNLOCK ([ cPalavra ]) --> Lgico Argumento Obrigat. Tipo C Descrio String que deve ser liberada. Se no for pass virtuais desta conexo so liberados. ----------------------- Page 251----------------------Retorno .T. Descrio A palavra foi bloqueada. Obrigat. Sim Descrio Comando executado com sucesso. Erro na execuo do comando. Tipo C Descrio Comando do Sistema Operac

cPalavra No ada, TODOS os locks

.F. No foi possvel desbloquear a palavra, provavelmente porque ela no esta va bloqueada. Descrio Retira o bloqueio virtual de uma string ou de todas da conexo. Exemplo #ifdef TOP

If TCIsVLock() if !TCVLock("Processo1") messagebox("Nao foi possivel bloquear o processo1", "", 0) return endif ...... // Processa TCVUnlock("Processo1") EndIf #endif TCISVLOCK( ) TCVLOCK( ) Time Retorna a hora do sistema Sintaxe TIME() --> cHora Retorno Descrio

A hora do sistema como uma cadeia de caracteres no formato h h:mm:ss onde hh a cHora hora ( 1 a 24 ), mm os minutos e ss os segundos. Descrio TIME() uma funo que retorna a hora do sistema como uma cad eia de caracteres. TIME() est relacionada com SECONDS() que retorna o valor inteiro representando o nmero de se gundos desde a meia-noite. SECONDS() geralmente usada no lugar de TIME() para clculos. ----------------------- Page 252----------------------Exemplos Estes exemplos mostram a funo TIME() utilizada em conjunto xtrair a hora, os minutos e os segundos: cTime := TIME() // Resultado: 10:37:17 cHora := SUBSTR(cTime, 1, 2) // Resultado: 10 cMinutos := SUBSTR(cTime, 4, 2) // Resultado: 37 cSegundos := SUBSTR(cTime, 7, 2) // Resultado: 17 SECONDS() SUBSTR() com SUBSTR() para e

UnLock Desbloqueia os registros da tabela corrente. Sintaxe UnLock [ALL] Descrio Este comando utilizado para liberar registros da tabela corrente. Se for passada a opo "ALL" todos os registros da tabela corrente so liberados. Caso contrrio, s liberado o registro cor rente. Exemplo // Este exemplo mostra como liberar todos os registros bloqueados ente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., UNLOCK ALL // Este exemplo mostra uma variao do uso de UNLOCK para liberar corrente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., DBGOTO(100) UNLOCK // Desbloqueia o registro atual (100) FLOCK( ) RLOCK( ) DBUNLOCKALL( ) DBRLOCK( ) DBRLOCKLIST( ) DBUNLOCK( ) Up dateIntName Atualiza o nome do ndice interno da tabela CTree. ----------------------- Page 253----------------------Sintaxe UpdateIntName ( cNome )->Lgico Argumento jo ndice cNome Retorno Obrigat. interno deve No Descrio No conseguiu atualizar o nome do ndice interno. O arquivo no pode ser Tipo ter C o Especifica nome atualizado. Descrio o nome da tabela cu da tabela corr .F. ) apenas o registro .F. )

aberto em modo .F. exclusivo. .T. Descrio A funo UpdateIntName muda o nome do arquivo de uma tabela Ctree, estando a mesma fechada. Para tanto ela executa os seguintes passos: 1- Abre a tabela; 2- Verifica as informaes da tabela; 3- Fecha a tabela; 4- Recalcula o nome do ndice interno; 5- Grava o novo nome do ndice interno na tabela; O nome do ndice interno, que la equivalente, calculado da seguinte forma: armazenado no diretrio "\CTREEINT\" acima da tabe de ndice interno Atualizao do nome de ndice interno ocorrida com sucesso

xxxxxxxxeeeYYYYMMDDhhmmss.int, sendo: xxxxxxxx - nome do arquivo da tabela

eee - extenso da tabela YYYYMMDD - data atual hhmmss - horrio corrente Na prxima vez em que a tabela aberta, o arquivo deste novo ndice ser criado a utomaticamente. Exemplo // Este exemplo demonstra o uso tpico de UpdateIntName(). Se no falhar, o nome do ndice interno ser atualizado e o processo continua quando ao abrir a tabela o novo arquivo de ndice interno criado. Se falhar, uma mensagem apresentada. IF !UpdateIntName("\dadosadv\sa1990.dtc") Messagebox("No foi possvel atualizar o nome do ndice interno da tabela","Erro", 0) BREAK ENDIF USE "\dadosadv\sa1990.dtc" SHARED NEW ----------------------- Page 254----------------------CTREEDELINT( ) Use Abre uma tabela na rea de trabalho atual e os arquivos relacionados a ela.

Sintaxe USE Tabela [INDEX Indices] [ALIAS Alias] [EXCLUSIVE LY] [VIA Driver]] Argumento Tabela Indices a tabela Alias Driver a tabela Retorno NIL Descrio Este comando associa uma tabela especificada pelo primeiro parmetro (Tabela) rea d e trabalho atual atravs de um driver especificado atravs do parmetro Driver. Tambm pode abrir os arquivos de ndices relacionados com a tabela. No caso do Ctree os arquivos de ndices permanentes j so abertos automaticamente, ma s nos demais RDDs deve especificar os arquivos de ndices que se deseja abrir atravs do parmetro Indices. O Alias pode ser especificado atravs do parmetro Alias. Pode-se especificar se a t abela ser aberta em modo exclusivo ou compartilhado (atravs das opes "EXCLUSIV" e "SHARED"). O usurio pode optar por abrir a tabela em modo somente leitura atravs da opo "READO NLY", onde nenhuma alterao ser efetivada na tabela. A opo "NEW" determina qu e a tabela especificada ser aberta na prxima rea de trabalho disponvel e ser setada como a rea de trabalho corren te. Exemplo // Este exemplo demonstra como utilizar o comando USE para associar uma tabela ( do tipo Ctree) a prxima rea de trabalho disponvel e torn-la ativa em modo compartilhado e somente leitura: USE Cliente VIA "CTREECDX" NEW SHARED READONLY CLOSEAREA DBUSEAREA ----------------------- Page 255----------------------Obrigat. Tipo Descrio Nome do arquivo da tabela a ser aberta Nomes dos ndices a serem abertos junto com Alias da tabela a ser aberta Nome do RDD a ser utilizado na abertura d Descrio Sem retorno SHARED] [NEW] [READON

Used Verifica se existe uma tabela corrente Sintaxe Used() --> Lgico Retorno .F. .T. Descrio Esta funo utilizada para verificar se existe alguma tabela aberta no momento. Exemplo //Este exemplo utiliza a funo USED()para verificar quando a tabela est ativa: USE Clientes NEW Result := USED() // Result: .T. CLOSE Result := USED() // Result: .F. Year Converte o valor da data no valor numrico do ano. Sintaxe YEAR( dData ) --> nAno Argumento dData . Retorno Descrio Obrigat. Sim Tipo D Descrio o valor da data a ser convertido Descrio No existe tabela corrente Existe tabela corrente

Valor numrico do ano da data especificada em dData in cluindo os dgitos do sculo. O nAno valor retornado no afetado pelos valores especificados pelos comando s SET DATE ou SET CENTURY. 0 Para uma data invlida ou nula.

----------------------- Page 256----------------------Descrio

YEAR() uma funo de converso de data que extrai o valor numrico do ano. YEAR() membr de um grupo de funes que retornam valores numricos de uma data. O grupo inclui DAY() e MONTH() que retornam o dia e o ms como valores numricos.

Exemplos Estes exemplos mostram YEAR() usando a data do sistema: dData := DATE() // Resultado: 09/20/01 dAno := YEAR(dData) // Resultado: 2001 dAno := YEAR(dData) + 11 // Resultado: 2012 Este exemplo cria uma funo de usurio que usa a funo YEAR() para formatar o valor da d ata: cData := Mdy(DATE()) // Result: September 20, 1990 FUNCTION Mdy( dDate ) RETURN CMONTH(dDate) + " " + LTRIM(STR(DAY(dDate))) + "," + STR(YEAR(dDate) ) CDOW() CMONTH() DOW() MONTH() DAY() ZAP Remove todos os registros da tabela. Sintaxe ZAP Descrio Este comando apaga (fisicamente) todos os registro da tabela corrente. Exemplo // Este exemplo mostra como o ZAP pode se utilizado. dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) ZAP PACK ----------------------- Page 257----------------------tSrvObject Classe me de todas as classes de interface. Caractersticas Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser instanciada diretamente.

Propriedades nLeft nTop nWidth nHeight cCaption cTooltip lShowHint bjeto. Numrico. Coordenada horizontal em pixels. Numrico. Coordenada vertical em pixels. Numrico. Largura em pixels. Numrico. Altura em pixels. Caractere. Ttulo ou contedo do objeto. Caractere. Mensagem exibida quando objeto exibe seu tooltip. Lgico. Flag que ativa .T. ou desativa .F. a exibio do tooltip do o

Caractere. Mensagem exibida na barra de status da janela princi pal quando o objeto ganha cMsg foco. nClrText nClrPane bWhen Se retornar .T. o objeto continua habilitado, se retornar .F. o objeto ser desabilitado. Bloco de cdigo. Executado quando o contedo do objeto modificado e dever ser validado. bValid Deve retornar .T. se o contedo vlido e .F. se contedo invlido. Bloco de cdigo. Executado boto esquerdo do mouse sobre o blClicked objeto. quando acionado click do Numrico. Cor do texto do objeto. Numrico. Cor do fundo do objeto. Bloco de cdigo. Executado quando h movimentao de foco na janela.

brClicked Bloco de cdigo. Executado quando acionado click do boto direito d o mouse sobre o objeto. Bloco de cdigo. Executado quando acionado duplo click do boto esq uerdo do mouse sobre o blDblClick objeto. oWnd lVisible Cargo bLostFocus bGotFocus Mtodos Objeto. Janela onde o objeto foi criado. Booleano. Se .T. o objeto visvel, se .F. o objeto invisvel. Objeto ou varivel. Contedo associado ao objeto. Bloco de cdigo. Executado quando objeto perde foco. Bloco de cdigo. Executado quando objeto ganha foco.

bSetFocus Sintaxe SetFocus( ) Descrio Fora o foco de entrada de dados mudar para o objeto. ----------------------- Page 258----------------------Retorno NIL Hide Sintaxe Hide( ) Descrio Torna objeto invisvel. Retorno NIL Show Sintaxe Show( ) Descrio Torna objeto visvel. Retorno NIL Enable Sintaxe Enable( ) Descrio Habilita o objeto. Retorno NIL Disable

Sintaxe Disable( ) Descrio ----------------------- Page 259----------------------Desabilita o objeto. Retorno NIL Refresh Sintaxe Refresh( ) Descrio Fora atualizao (sincronia) de propriedades entre o programa e o Protheus Remote. tComboBox Classe de combobox. Hierarquia tSrvObject ->tControl -> tComboBox Descrio Utilize a classe tComboBox para cria uma entrada de dados com mltipla escolha com item definido em uma lista vertical, acionada por F4 ou pelo boto esquerdo loc alizado na parte direita do controle. A varivel associada ao controle ter o valor de um dos itens se lecionados ou no caso de uma lista indexada, o valor de seu ndice. Propriedades Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes formatos: a) AItems Seqencial, exemplo: {item1,item2,...,itemN} ou b) exemplo: {a=item1,b=item2, ..., n=itemN}. nAt Mtodos New Descrio Numrico. Posio do item selecionado.

Indexad

Construtor da classe. Sintaxe ----------------------- Page 260----------------------New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [aoWnd], [nPar8], [abChange], [abValid], [anClrText], [anClrBack], [alPixel], [aoFont], r16], [abWhen], [lPar18], [aPar19], [bPar20], [cPar21], [acReadVar]) Parmetros anRow . anCol es. Numrico, opcional. Coordenada horizontal em pixels ou caracter Numrico, opcional. Coordenada vertical em pixels ou caracteres [anHeight], [cPar15], [lPa

Bloco de cdigo, opcional. Bloco de cdigo no formato { u if( Pc ount( )>0, <var>:= u, <var> ) } que o controle utiliza para atualizar a varivel <var >. <var> deve ser tipo abSetGet caracter. Se a lista for seqencial, o controle atualizar <var> c om o contedo do item selecionado, se a lista for indexada, <var> ser atualizada com o valor do ndice do item selecionado. rem exibidos. anItems Indexada, anWidth anHeight aoWnd . nPar8 Reservado. Array, opcional. Lista de items, caracteres, a se Pode ter os seguintes formatos: a) Seqencial, exemplo: {item1,item2,...,itemN} ou exemplo: {a=item1,b=item2, ..., n=itemN}. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Objeto, opcional. Janela ou controle onde o controle ser criado

abChange Bloco de cdigo, opcional. Executado quando o controle modifica o item selecionado. Bloco de cdigo, opcional. Executado quando o contedo do control e deve ser validado, abValid deve retornar .T. se o contedo for vlido e .F. quando o contedo f or invlido. anClrBack anClrText so em Numrico, opcional. Cor de fundo do controle. Numrico, opcional. Cor do texto do controle. Lgico, opcional. Se pixels, se .F. so em .T. as coordenadas informadas

alPixel caracteres. definir aoFont cPar15 lPar16 as Objeto, opcional. Objeto caractersticas da fonte tipo tFont utilizado para

utilizada para exibir o contedo do controle. Reservado. Reservado.

Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados abWhen est sendo efetuada na janela onde o controle foi criado. O bloc o deve retornar .T. se o controle deve permanecer habilitado ou .F. se no. lPar18 aPar19 bPar20 cPar21 Reservado. Reservado. Reservado. Reservado.

Caractere, opcional. Nome da varivel que o controle dever manipu lar, dever ser a acReadVar mesma varivel informada no parmetro abSetGet, e ser o retorno da funo ReadVar( ). Retorno O objeto criado. Select Descrio Muda o item selecionado no combobox. Sintaxe ----------------------- Page 261----------------------Select( [anItem] ) Parmetros anItem Retorno NIL Exemplo #include protheus.ch Numrico, opcional. Posio do item a ser selecionado.

User Function TesteGet() Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3} cCombo:= aItems[2] DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo oCombo:= tComboBox():New(10,10,{ u if(PCount()>0,cCombo:=u,cCombo)},; aItems,100,20,oDlg,,{ MsgStop(Mudou item)},; ,,,.T.,,,,,,,,,cCombo) // Boto para fechar a janela @ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End() ACTIVATE MSDIALOG oDlg CENTERED MsgStop( O valor +cCombo ) Return nil tComboBox Classe de combobox. Hierarquia tSrvObject ->tControl -> tComboBox Descrio Utilize a classe tComboBox para cria uma entrada de dados com mltipla escolha com item definido em uma lista vertical, acionada por F4 ou pelo boto esquerdo loc alizado na parte direita do controle. A varivel associada ao controle ter o valor de um dos itens se lecionados ou no caso de uma lista indexada, o valor de seu ndice. Propriedades Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes formatos: a) aItems Seqencial, exemplo: {item1,item2,...,itemN} ou b) exemplo: {a=item1,b=item2, ..., n=itemN}. ----------------------- Page 262----------------------nAt Mtodos New Descrio Construtor da classe. Sintaxe New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd], [nPar8], [abChange], [abValid], [anClrText], [anClrBack], [alPixel], [aoFont], [cPar15], [lPar 16], [abWhen], [lPar18], [aPar19], Numrico. Posio do item selecionado.

Indexad

[bPar20], [cPar21], [acReadVar]) Parmetros anRow anCol s. Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caractere

Bloco de cdigo, opcional. Bloco de cdigo no formato { u if( Pco unt( )>0, <var>:= u, <var> ) } que o controle utiliza para atualizar a varivel <var> . <var> deve ser tipo abSetGet caracter. Se a lista for seqencial, o controle atualizar <var> c om o contedo do item selecionado, se a lista for indexada, <var> ser atualizada com o valor do ndice do item selecionado. rem exibidos. anItems Indexada, anWidth anHeight aoWnd . nPar8 Reservado. Array, opcional. Lista de items, caracteres, a se Pode ter os seguintes formatos: a) Seqencial, exemplo: {item1,item2,...,itemN} ou exemplo: {a=item1,b=item2, ..., n=itemN}. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Objeto, opcional. Janela ou controle onde o controle ser criado

abChange Bloco de cdigo, opcional. Executado quando o controle modifica o item selecionado. Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado, abValid deve retornar .T. se o contedo for vlido e .F. quando o contedo f or invlido. anClrBack anClrText so em alPixel Numrico, opcional. Cor de fundo do controle. Numrico, opcional. Cor do texto do controle. Lgico, opcional. Se pixels, se .F. so em caracteres. definir aoFont cPar15 lPar16 as Objeto, opcional. Objeto caractersticas da fonte tipo tFont utilizado para .T. as coordenadas informadas

utilizada para exibir o contedo do controle. Reservado. Reservado.

----------------------- Page 263----------------------Bloco de cdigo, opcional. Executado quando mudana de foco de ent rada de dados abWhen est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o controle deve permanecer habilitado ou .F. se no. lPar18 aPar19 Reservado. bPar20 cPar21 Reservado. Reservado. Reservado.

Caractere, opcional. Nome da varivel que o controle dever manipula r, dever ser a acReadVar mesma varivel informada no parmetro abSetGet, e ser o retorno da funo ReadVar( ). Retorno O objeto criado. Select Descrio Muda o item selecionado no combobox. Sintaxe Select( [anItem] ) Parmetros anItem Retorno NIL Exemplo #include protheus.ch User Function TesteGet() Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3} cCombo:= aItems[2] DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo oCombo:= tComboBox():New(10,10,{ u if(PCount()>0,cCombo:=u,cCombo)},; aItems,100,20,oDlg,,{ MsgStop(Mudou item)},; ,,,.T.,,,,,,,,,cCombo) // Boto para fechar a janela @ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End() Numrico, opcional. Posio do item a ser selecionado.

ACTIVATE MSDIALOG oDlg CENTERED MsgStop( O valor +cCombo ) Return nil ----------------------- Page 264----------------------tGroup Classe de painel de grupo de controles. Hierarquia tSrvObject ->tControl -> tGroup Descrio Utilize a classe tGroup para criar um painel onde controles visuais podem ser ag rupados ou classificados. criada uma borda com ttulo em volta dos controles agrupados. Mtodos New Descrio Construtor da classe. Sintaxe New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [aoWnd], [anClrText], [anClrPane], [alPixel], [lPar10]) Parmetros AnTop acteres. AnLeft aracteres. anBottom acteres. anRight racteres. acCaption aoWnd anClrText anClrPane Numrico, opcional. Coordenada vertical superior em pixels ou car Numrico, opcional. Coordenada horizontal esquerda em pixels ou c Numrico, opcional. Coordenada vertical inferior em pixels ou car Numrico, opcional. Coordenada horizontal direita em pixels ou ca Caractere, opcional. Ttulo do grupo. Objeto, opcional. Janela ou controle onde o controle ser criado. Numrico, opcional. Cor do texto. Numrico, opcional. Cor do fundo. Lgico, opcional. Se .T. as coordenadas informadas

so em alPixel lPar10

pixels,

se

.F.

so

em

caracteres. Reservado.

----------------------- Page 265----------------------Retorno O objeto criado. Exemplo #include protheus.ch User function teste() Local oDlg, oGroup, oGet1, oGet2, cGet1:=Space(10),; cGet2:= Space(10) DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE My test PIXEL oGroup:= tGroup():New(10,10,200,200,grupo de gets,oDlg,,,.T.) @ 10,10 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oGroup PIXEL @ 30,10 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oGroup PIXEL ACTIVATE MSDIALOG oDlg CENTERED Return nil tListbox Classe de lista de items. Hierarquia tSrvObject ->tControl -> tListbox Descrio Utilize a classe tListbox para criar uma janela com itens selecionveis e barra de rolagem. Ao selecionar um item, uma varivel atualizada com o contedo do item selecionado. Parmetros Nat AItems . Mtodos New Descrio Contrutor da classe Sintaxe New([anRow], [anCol], [abSetGet], [aaItems], [anWidth], [anHeigth], Numrico. Indica ou modifica o item selecionado. Array de items caracteres. Lista do itens selecionveis

[abChange], [aoWnd], [abValid], [anClrFore], [anClrBack], [alPixel], [lPar13], [abLDBLClick], [aoFont], [ cPar16], [lPar17], [abWhen], [aPar19], [bPar20], [lPar21], [lPar22], [abRightClick] ) ----------------------- Page 266----------------------Parmetros AnRow es. AnCol eres. Numrico, opcional. Coordenada vertical em pixels ou caracter Numrico, opcional. Coordenada horizontal em pixels ou caract

Bloco de cdigo, opcional. Bloco de cdigo no formato { u if( Pcount( )>0, <var>:= AbSetGet u, <var> )} que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo caracter ou numrica. AaItems nveis. AnWidth anHeight abChange o alterado. aoWnd ado. contedo abValid vlido e Array de items caracteres, opcional. Lista de items selecio Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Bloco de cdigo, opcional. Executado quando o item selecionad Objeto, opcional. Janela ou controle onde o controle ser cri Bloco de cdigo, opcional. Executado quando o do controle deve ser validado, deve retornar .T. se o contedo for .F. quando o contedo for invlido. Numrico, opcional. Cor de fundo do controle. anClrFore anClrBack so em alPixel lPar13 ick do boto esquerdo abLDBLClick do mouse sobre o controle. Objeto, opcional. r as caractersticas da fonte aoFont Objeto tipo tFont utilizado para defini pixels, Numrico, opcional. Cor do texto do controle. Lgico, opcional. Se se .F. so em caracteres. Reservado. Bloco de cdigo, opcional. Executado quando acionado duplo cl .T. as coordenadas informadas

utilizada para exibir o contedo do controle. cPar16 lPar17 Reservado. Reservado.

Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados abWhen est sendo efetuada na janela onde o controle foi criado. O b loco deve retornar .T. se o controle deve permanecer habilitado ou .F. se no. aPar19 Reservado. bPar20 lPar21 lPar22 ado click do abRightClick Select Descrio Fora a seleo de um item. ----------------------- Page 267----------------------Sintaxe Select( [nItem] ) Parmetros NItem Retorno NIL Add Descrio Insere ou adiciona novo item. Sintaxe Add( cText, nPos ) Parmetros cText Caractere, obrigatrio. Texto do item. Numrico, opcional. Item a ser selecionado. Reservado. Reservado. Reservado. Bloco de cdigo, boto direito do mouse sobre o controle. opcional. Executado quando acion

Numrico, obrigatrio. Se 0 ou maior que o nmero de itens, insere o item n o final da lista. nPos Se valor entre 1 e nmero de itens, insere o item na posio informada, emp urrando o item anterior para baixo. Retorno NIL Modify Descrio Modifica o texto de um item. Sintaxe Modify( cText, nPos ) Parmetros cText or ou igual nPos que o nmero de itens. Retorno ----------------------- Page 268----------------------NIL Del Descrio Apaga um item. Sintaxe Del( nPos ) Parmetros Numrico, obrigatrio. Posio a ser excluida, deve ser maior que 0 e menor ou igual que o nPos nmero de itens. Retorno NIL Len Descrio Caractere, obrigatrio. Texto novo. Numrico, obrigatrio. Posio a ser modificada deve ser maior que 0 e men

Retorna o nmero de itens. Sintaxe Len( ) Retorno Numrico. Nmero de itens. Reset Descrio Apaga todos os itens. Sintaxe Reset( ) Retorno NIL Exemplo #include protheus.ch ----------------------- Page 269----------------------User Funcion Teste() Local oDlg, oList, nList:= 1, aItems:={} Aadd(aItems,Item 1) Aadd(aItems,Item 2) Aadd(aItems,Item 3) Aadd(aItems,Item 4) DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE Teste oList:= tListBox():New(10,10,{ u if(Pcount()>0,nList:=u,nList)}; ,aItems,100,100,,oDlg,,,,.T.) ACTIVATE MSDIALOG oDlg CENTERED Return nil tMeter Classe de rgua de processamento. Hierarquia tSrvObject ->tControl -> tMeter Descrio Utilize a classe tMeter para criar um controle que exibe uma rgua (g auge) de processamento, descrevendo o andamento de um processo atraves da exibio de uma barra horizontal. Parmetros

NTotal esso. lPercentage nClrBar Mtodos New Descrio

Numrico. Nmero total de passos at o preenchimento da rgua de proc Lgico. Se .T. considera o passo de movimentao em porcentagem. Numrico. Cor da barra de andamento.

Contrutor da classe. Sintaxe New([anRow], [anCol], [abSetGet], [anTotal], [aoWnd], [anWidth], [an Height], [lPar8], [alPixel], [oPar10], [cPar11], [alNoPerc], [anClrPane], [nPar14], [anClrBar], [nPar16], [lP ar17]) Parmetros anRow anCol Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres.

abSetGet Bloco de cdigo, opcional. Bloco de cdigo no formato { u if( Pcoun t( )>0, <var>:= u, ----------------------- Page 270----------------------<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo numrico. nchimento anTotal aoWnd o. anWidth anHeight lPar8 so em alPixel oPar10 cPar11 da Numrico, rgua de processo. Objeto, opcional. Janela ou controle onde o controle sera criad Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Reservado. Lgico, opcional. Se pixels, se .F. so em caracteres. Reservado. Reservado. .T. as coordenadas informadas opcional. Numero total de passos at o pree

Lgico, opcional. Se os de atualizao em alNoPerc porcentagem. anClrPane nPar14 anClrBar nPar16 lPar17 Retorno O objeto construdo. Set Descrio

.T. (padro) no

considera

os pass

Numrico, opcional. Cor de fundo do controle. Reservado. Numrico, opcional. Cor da barra de andamento. Reservado. Reservado.

Atualiza a posio da rgua de processamento. Sintaxe Set( [nVal] ) Parmetros nVal Retorno NIL Exemplo #include protheus.ch Static lRunning:=.F., lStop:=.F. User Function Teste() Local oDlg, oMeter, nMeter:=0, oBtn1, oBtn2 DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE Teste ----------------------- Page 271----------------------// cria a rgua oMeter:= tMeter():New(10,10,{ u if(Pcount()>0,nMeter:=u,nMeter)}; ,100,oDlg,100,20,,.T.) // boto para ativar andamento da rgua @ 30,10 BUTTON oBtn1 PROMPT Run OF oDlg PIXEL ACTION RunMeter(oMeter) @ 50,10 BUTTON oBtn2 PROMPT Stop OF oDlg PIXEL ACTION lStop:=.T. ACTIVATE MSDIALOG oDlg CENTERED Return nil Numrico, opcional. Novo valor da posio da rgua de processamento.

Static Function RunMeter(oMeter) If lRunning Return Endif lRunning:= .T. // inicia a rgua oMeter:Set(0) While .T. .and. !lStop // pra 1 segundo Sleep(1000) // atualiza a pintura da janela, processa mensagens do windows ProcessMessages() // pega valor corrente da rgua nCurrent:= Eval(oMeter:bSetGet) nCurrent+=10 // atualiza rgua oMeter:Set(nCurrent) if nCurrent==oMeter:nTotal Return endif Enddo lRunning:= .F. lStop:= .F. Return tMultiget Classe de campo Memo de edio. Hierarquia tSrvObject ->tControl -> tMultiGet Descrio Utilize a classe tMultiget para criar controle de edio de texto de mltiplas linhas. Propriedades ----------------------- Page 272----------------------lWordWrap nhas. Mtodos New Descrio Construtor da classe. Sintaxe New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [a Lgico. Se .T., faz quebra automtica de li

oFont], [alHScroll], [anClrFore], [anClrBack], [oPar11], [alPixel], [cPar13], [lPar14], [lPar16], [lPar17], [alReadOnly], [abValid], [bPar20], [lPar21], [alNoBorder], [alNoVScroll]) Parmetros anRow . AnCol res.

[abWhen],

Numrico, opcional. Coordenada vertical em pixels ou caracteres Numrico, opcional. Coordenada horizontal em pixels ou caracte

Bloco de cdigo, opcional. Bloco de cdigo no formato { u if( P count( )>0, <var>:= AbSetGet u, <var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo caracter. aoWnd o. anWidth anHeight a definir as aoFont alHScroll . anClrFore anClrBack oPar11 so em alPixel cPar13 lPar14 Numrico, opcional. Cor de fundo do controle. Numrico, opcional. Cor do texto do controle. Reservado. Lgico, opcional. Se pixels, se .F. so em caracteres. Reservado. Reservado. .T. as coordenadas informadas Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Objeto, opcional. Objeto caractersticas da fonte tipo tFont utilizado par Objeto, opcional. Janela ou controle onde o controle ser criad

utilizada para exibir o contedo do controle. Lgico, opcional. Se .T., habilita barra de rolagem horizontal

Bloco de cdigo, opcional. Executado quando mudana de foco de e ntrada de dados abWhen est sendo efetuada na janela onde o controle foi criado. O blo co deve retornar .T. se o controle deve permanecer habilitado ou .F. se no. lPar16 lPar17 alReadOnly Reservado. Reservado. Lgico, opcional. Se .T. o controle so permitira leitura.

ontedo do abValid ido e .F. bPar20 lPar21 alNoBorder alNoVScroll Retorno

Bloco de cdigo, opcional. controle deve ser validado, deve retornar .T. quando o contedo for invlido. Reservado. Reservado.

Executado se o

quando contedo for

o c vl

Lgico, opcional. Se .T. cria controle sem borda. Lgico, opcional. Se .T., habilita barra de rolagem vertical.

----------------------- Page 273----------------------O objeto construdo. EnableVScroll Descrio Habilita a barra de rolagem vertical. Sintaxe EnableVScroll( lEnable ) Parmetros lEnable e rolagem. Retorno NIL EnableHScroll Descrio Habilita a barra de rolagem horizontal. Sintaxe EnableHScroll( lEnable ) Parmetros lEnable lagem. Retorno NIL Exemplo Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra de ro Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra d

#include protheus.ch User Function Teste() Local oDlg, oMemo, cMemo:= space(50) DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE My test oMemo:= tMultiget():New(10,10,{ u if(Pcount()>0,cMemo:=u,cMemo)}; ,oDlg,100,100,,,,,,.T.) @ 200,10 BUTTON oBtn PROMPT Fecha OF oDlg PIXEL ACTION oDlg:End() ACTIVATE MSDIALOG oDlg CENTERED MsgStop(cMemo) Return Nil ----------------------- Page 274----------------------tPanel Classe de painel esttico. Hierarquia tSrvObject ->tControl -> tPanel Descrio Utilize a classe tPanel quando desejar criar um painel esttico, onde podem ser cr iados outros controles com o objetivo de organizar ou agrupar componentes visuais. Mtodos New Descrio Construtor da classe. Sintaxe New([anRow], [anCol], [acText], [aoWnd], [aoFont], r6], [anClrText], [anClrBack], [anWidth], [anHeight], [alLowered], [alRaised]) Parmetros anRow anCol acText aoWnd alCentered ole. lPar6 Numrico, opcional. Coordenada vertical em pixels. Numrico, opcional. Coordenada horizontal em pixels. Caractere, opcional. Texto a ser exibido ao fundo. Objeto, opcional. Janela ou controle onde ser criado o objeto. Lgico, opcional. Se .T. exibe o texto de ttulo ao centro do contr Reservado. [alCentered], [lPa

anClrText anClrBack anWidth anHeight alLowered ole de fundo.

Numrico, opcional. Cor do texto do controle. Numrico, opcional. Cor do fundo do controle. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Lgico, opcional. Se .T. exibe o painel rebaixado em relao ao contr

Lgico, opcional. Se .T. exibe a borda do controle rebaixada em r elao ao controle de alRaised fundo. Retorno O objeto construdo. Exemplo #include protheus.ch ----------------------- Page 275----------------------User Function Teste() Local oDlg, oPanel, oBtn1, oBtn2 DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE My test // cria o painel oPanel:= tPanel():New(10,10,,oDlg,,,,,CLR_BLUE,100,100) // cria boto sobre o painel @ 10,10 BUTTON oBtn1 PROMPT hide OF oPanel ACTION oPanel:Hide() // cria boto fora o painel @ 200,10 BUTTON oBtn2 PROMPT show OF oDlg ACTION oPanel:Show() ACTIVATE MSDIALOG oDlg CENTERED Return tRadMenu Classe de radio group. Hierarquia tSrvObject ->tControl -> tRadMenu Descrio Utilize a classe tRadMenu para criar um controle que possibilita escolha de item atravs de uma lista. Propriedades nOption aItems Numrico. Item selecionado. Array de caracteres. Lista de items selecionveis.

Mtodos New Descrio Construtor do objeto. Sintaxe New([anRow], [anCol], [aacItems], [abSetGet], [aoWnd], [aPar6], [abChange], [anC lrText], [anClrPan], [cPar10], [lPar11], [abWhen], [anWidth], [anHeight], [abValid], [lPar16], [lPar1 7], [alPixel]) Parmetros anRow anCol aacItems Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. Array de caracteres, opcional. Lista de opes.

abSetGet Bloco de cdigo, opcional. Bloco de cdigo no formato { u if( Pcoun t( )>0, <var>:= ----------------------- Page 276----------------------u, <var> ) } que o el <var>. <var> deve ser tipo numrico. aoWnd aPar6 abChange terado. anClrText anClrPan cPar10 lPar11 controle utiliza para atualizar a variv

Objeto, opcional. Janela ou controle onde o controle ser criado. Reservado. Bloco de cdigo, opcional. Executado quando o item selecionado al Numrico, opcional. Cor do texto do controle Numrico, opcional. Cor de fundo do controle. Reservado. Reservado.

Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados abWhen est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. para que o controle permanea habilitado, ou .F. se no. anWidth anHeight Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Bloco de cdigo, opcional. Executado quando o contedo do controle

deva ser validado, abValid retornando .T. se o contedo for vlido, e .F. quando invlido. lPar16 Lpar17 Reservado. Reservado. .T. as coordenadas informadas

Lgico, opcional. Se so em pixels, se .F. so em alPixel caracteres. Retorno O objeto construdo. EnableItem Descrio Habilita ou desabilita item. Sintaxe EnableItem( [nItem], [lEnable]) Parmetros NItem LEnable a o item. Retorno NIL Exemplo #include protheus.ch

Numrico, opcional. Item selecionado. Lgico, opcional. Se .T. habilita o item se .F. desabilit

User Function Teste() Local oDlg, oButton, oRadio, nRadio:=1,; aOptions:={escolha1,escolha2} DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Get oRadio:= tRadMenu():New(10,10,aOptions,; ----------------------- Page 277----------------------{ u if(PCount()>0,nRadio:=u,nRadio)},; oDlg,,,,,,,,100,20,,,,.T.) @ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End() ACTIVATE MSDIALOG oDlg CENTERED MsgStop(Escolheu +aOptions[nRadio] ) Return nil tSay

Classe de label. Hierarquia tSrvObject ->tControl -> tSay Descrio O objeto tipo tSay exibe o contedo de texto esttico sobre uma janela ou controle. Parmetros Lgico. Se .T. quebra o texto em vrias linhas de maneira a enqua drar o contedo lWordWrap na rea determinada para o controle, sendo o padro .F. Lgico. Se .T. a cor de fundo do controle ignorada assumindo o contedo ou cor do lTransparent controle ou janela ao fundo, sendo o padro .T. Mtodos New Descrio Mtodo construtor do controle. Sintaxe New([anRow], [anCol], [abText], [aoWnd], [acPicture], [aoFont], [lPar 7], [lPar8], [lPar9], [alPixels], [anClrText], [anClrBack], [anWidth], [anHeight], [lPar15], [lPar16], [lPar17], [ lPar18], [lPar19]) Parmetros AnRow AnCol Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres.

Codeblock, opcional. Quando executado deve retornar uma cadeia d e caracteres a ser AbText exibida. AoWnd acPicture Objeto, opcional. Janela ou dilogo onde o controle ser criado. Caractere, opcional. Picture de formatao do contedo a ser exibido.

AoFont Objeto, opcional. Objeto tipo tFont para configurao do ti po de fonte que ser ----------------------- Page 278----------------------utilizado para exibir o contedo.

lPar7 lPar8 lPar9 as em pixels AlPixels anClrText anClrBack anWidth anHeight lPar15 lPar16 lPar17 lPar18 lPar19 Retorno

Reservado. Reservado. Reservado. Lgico, opcional. Se se .F., padro, .T. considera coordenadas passad

considera as coordenadas passadas em caracteres. Numrico, opcional. Cor do contedo do controle. Numrico, opcional. Cor do fundo do controle. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Reservado. Reservado. Reservado. Reservado. Reservado.

O controle criado. SetText Descrio Modifica o contedo a ser exibido pelo controle. Sintaxe SetText( [xVal] ) Parmetros xVal Retorno NIL Exemplo #include protheus.ch User Function Teste() Local oDlg, oSay DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE My dialog PIXEL Caracter / Numrico / Data, Opcional. Valor a ser exibido.

oSay:= tSay():New(10,10,{ para exibir},oDlg,,,,; ,,.T.,CLR_WHITE,CLR_RED,100,20) ACTIVATE MSDIALOG oDlg CENTERED Return ----------------------- Page 279----------------------tScrollbox Classe de rea de scroll. Hierarquia tSrvObject ->tControl -> tScrollbox Descrio Utilize a classe tScrollbox para criar um painel com scroll deslizantes nas late rais do controle. Mtodos New Descro Construtor da classe Sintaxe New([aoWnd], [anTop], [anLeft], [anHeight], [anWidth], [alVertical], [alHorizont al], [alBorder]) Parmetros aoWnd iado. AnTop AnLeft anHeight anWidth alVertical alHorizontal alBorder Retorno O objeto criado. Exemplo Objeto, opcional. Janela ou controle onde o controle ser cr Numrico, opcional. Coordenada vertical em pixels. Numrico, opcional. Coordenada horizontal em pixels. Numrico, opcional. Altura do controle em pixels. Numrico, opcional. Largura do controle em pixels. Lgico, opcional. Se .T. exibe a barra de scroll vertical. Lgico, opcional. Se .T. exibe a barra de scroll horizontal. Lgico, opcional. Se .T. exibe a borda do controle.

#include protheus.ch User Function Teste() Local oDlg, oScr, oGet1, oGet2, oGet3 Local cGet1, cGet2, cGet3 cGet1:= Space(10) cGet2:= Space(10) ----------------------- Page 280----------------------cGet3:= Space(10) DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL My test oScr:= TScrollBox():New(oDlg,10,10,200,200,.T.,.T.,.T.) // cria controles dentro do scrollbox @ 10,10 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oScr PIXEL @ 50,10 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oScr PIXEL @ 150,100 MSGET oGet3 VAR cGet3 SIZE 100,10 OF oScr PIXEL ACTIVATE MSDIALOG oDlg CENTERED Return nil AllGroups Retorna vetor contendo informaes dos grupos de usurios. Sintaxe ALLGROUPS() -> array Descrio A funo AllGroups() retorna um vetor principal onde cada elemento refere-se a u m grupo de usurios do sistema, estes elementos so compostos de um vetor multidim ensional subdividindo as informaes dos grupos. Sua estrutura composta de: Elemento Qtd. 1 1 6 2 20 3 4 8 5 4 6 Autorizado a alterar a senha L Quantas vezes para expirar N Vetor com horrios de acesso Data de validade A D Nome C ID C Descrio Tipo

1 7 1 8 100 9 10 512 11 12 8 ----------------------- Page 281----------------------13 1 14 1 15 1 16 1 17 1 2 1 Exemplo Local aGrupos:= {} aGrupos:= ALLGROUPS() PswAdmin PswID PswSeek PswRet PswName PswOrder AllUsers AllUsers Retorna vetor contendo informaes dos usurios do sistema. Sintaxe ALLUSERS() -> array Mdulo+nvel+menu C Acesso a outros Dir de impresso L Opo de impresso L Ambiente N Formato N Tipo de impresso N Vetor com empresas Data da ltima alterao D A Impressora Acessos C C Diretrio C Idioma N

Descrio A funo AllUsers() retorna um vetor principal onde cada elemento refere-se a um usurio do sistema, estes elementos so compostos de um vetor multidimensional subdivi dindo as informaes dos usurios. Sua estrutura composta de: Elemento 1 1 2 3 4 5 6 7 8 9 10 ID Nome Senha Nome Completo Vetor com n ltimas senhas Data de validade Quantas vezes para expirar Autorizado a alterar a senha Alterar a senha no prximo logon Vetor com os grupos A C C C C A D N L L 6 15 6 30 -8 4 1 1 -Descrio Tipo Qtd.

----------------------- Page 282----------------------11 12 13 14 15 16 17 18 19 20 2 1 2 Vetor com horrios de acesso Idioma A N -1 ID do superior Departamento Cargo E-Mail Nmero de acessos simultneos Data da ltima alterao Usurio bloqueado Nmero de dgitos para o ano Listner de ligaes Ramal C C C C N D L N L C 6 30 30 130 4 8 1 1 1 4

3 4 5 6 7 8 9 10 11 12 13 3 1 Exemplo Local aUsuario:= {} aUsuario:= ALLUSERS() PswAdmin PswID PswSeek PswRet PswName PswOrder AllGroups APMsgAlert

Diretrio Impressora Acessos Vetor com empresas Ponto de entrada Tipo de impresso Formato Ambiente Prioridade p/ config. do grupo Opo de impresso Acesso a outros dir de impresso

C C C A C N N N L C L

100 -512 -10 1 1 1 1 50 1

Mdulo+nvel+menu

Exibe uma mensagem em um dilogo Sintaxe ----------------------- Page 283----------------------APMSGALERT( cMsg, [ cTitulo ] ) -> nil Argumento cMsg cTitulo Descrio Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para conf Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo.

irmar e um cone de mensagem de aviso. Exemplo APMSGALERT(Ateno) APMsgInfo APMsgStop APMsgYesNo APMsgNoYes APMsgInfo Exibe uma mensagem em um dilogo Sintaxe APMSGINFO( cMsg, [ cTitulo ] ) -> nil Argumento cMsg cTitulo Descrio Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para conf irmar e um cone de mensagem de aviso. Exemplo APMSGINFO(Ateno) APMsgInfo APMsgStop APMsgYesNo APMsgNoYes APMsgNoYes ----------------------- Page 284----------------------Exibe uma mensagem em um dilogo Sintaxe APMSGNOYES( cMsg, [ cTitulo ] ) -> lgico Argumento CMsg CTitulo Descrio Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo. Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo.

Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para cancelar. Caso cancele a funo retornar verdadeiro, seno retornar falso. Exemplo If !APMSGNOYES(Abandonar?) Return EndIf APMsgAlert APMsgStop APMsgInfo APMsgYesNo APMsgStop Exibe uma mensagem em um dilogo Sintaxe APMSGSTOP( cMsg , [ cTitulo ] ) -> nil Argumento cMsg cTitulo Descrio Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para co nfirmar e um cone de mensagem crtica. Exemplo ----------------------- Page 285----------------------APMSGSTOP(Ateno) APMsgInfo APMsgAlert APMsgYesNo APMsgNoYes APMsgYesNo Exibe uma mensagem em um dilogo Sintaxe APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico Argumento CMsg Obrigat. Sim Tipo C Descrio Mensagem a ser exibida Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo.

cTitulo Descrio

No

Ttulo do dilogo.

Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso. Exemplo If APMSGYESNO(Abandonar ?) Return EndIf APMsgAlert APMsgStop APMsgInfo APMsgNoYes APMsgYesNo Exibe uma mensagem em um dilogo Sintaxe APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico Argumento Obrigat. Tipo Descrio

----------------------- Page 286----------------------CMsg CTitulo Descrio Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso. Exemplo If APMSGYESNO(Abandonar ?) Return EndIf APMsgAlert APMsgStop APMsgInfo APMsgNoYes Cabec Imprime cabealho personalizado nos relatrios. Sintaxe Sim No C C Mensagem a ser exibida Ttulo do dilogo.

CABEC( cTitulo, cCabec1, cCabec2, cPrograma, cTamanho, [ nFormato ], [ uP ar ], [ lPerg ] ) -> nil Argumento CTitulo cCabec1 cCabec2 cPrograma cTamanho nFormato uPar Obrigat. Sim Sim Sim Sim Sim No No Tipo C C C C C N U L Descrio Ttulo do relatrio. Primeira linha do cabealho. Segunda linha do cabealho.

Nome do relatrio. Tamanho da pgina P,M,G. Para imprimir comprimido informe 15 Reservado Se verdadeiro, (.T.) imprime as perguntas n

lPerg No o incio do relatrio. Descrio

----------------------- Page 287-----------------------

A funo Cabec() imprime o cabealho personalizado de acordo com o contedo dos parmetros cCabec1 e cCabec2. O logo impresso no cabealho uma imagem de extenso .bmp, cujo nome est ass ciado com o empresa corrente. Ex: LGRL01.BMP, 01 a empresa. Exemplo User Function <nome-da-funo>( ) Local cProgram := Exemplo Local cAlias := XXX

// alias do arquivo

Local cPerg := XXXXXX

Local cTitulo := Titulo do relatrio Local cDesc1 := Descrio

Local cDesc2 := continuao da descrio Local cDesc3 := continuao da descrio Local lDic := .F. Local aOrd := { 1

// no utiliza dicionrio Ordem , 2 ordem , 3 ordem }

Local lCompres :=.F. Local cTam := "G" Private m_pag := 1

// nome do relatrio

// grupo de perguntas

Private aReturn := { "Zebrado", 1,"Administrao", 1, 2, 1, "",1 } Private wrel Pergunte( cPerg, .F. ) wrel := SetPrint ( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lD ic, aOrd , lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf SetDefault ( aReturn, cAlias ) If nLastKey == 27 Set Filter To Return EndIf RptStatus ( { lFim Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTi tulo ) Return // rotina de impresso Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho ) Local nLin := 80 Cabecalho 1 Cabecalho 2

Local cCabec1 := Local cCabec2 :=

dbSelectArea( cAlias ) SetRegua ( RecCount() ) While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit ----------------------- Page 288----------------------EndIf

If nLin > 58 CABEC( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho nLin := 8 EndIf @ nLin,000 PSAY __PrtFatLine() @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin,000 PSAY __PrtThinLine() IncRegua() dbSkip() End IF nLin != 80 nLin++ If nLin > 60 CABEC( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho Endif @ nLin,000 PSAY __PrtThinLine() Roda(,, cTamanho ) // Rodap EndIf If aReturn[5] = 1 Set Printer TO dbCommitAll() OurSpool ( wrel ) Endif MS_FLUSH () Return SetPrint RptStatus SetRegua IncRegua

OurSpool Ms_Flush Roda Capital Corrige maisculas e minsculas de uma frase. Sintaxe CAPITAL( cTexto ) -> caracter ----------------------- Page 289----------------------Argumento io cTexto er corrigido. Descrio Esta funo coloca a primeira letra de cada palavra em maiscula e o restante em mins cula em toda a frase. Exemplo APMsgInfo ( CAPITAL(FrAsE InCoRrEtA) ) CloseBrowse Fecha a MBrowse ou a MarkBrow. Sintaxe CLOSEBROWSE() -> lgico Descrio Esta funo fecha a MBrowse ou MarkBrow dependendo de qual estiver ativa. MBrowse MarkBrow Conpad1 Exibe a tela de consulta padro. Sintaxe CONPAD1( [ uPar1 ], [ uPar2 ], [ uPar3 ], cAlias, [ cCampoRet ], [ uPar4 ], [ lVisual ] ) -> lgico Argumento UPar Obrigat. No Tipo U Descrio Parmetro reservado. Sim Obrigat. C Tipo Descr Texto a s

uPar2 uPar3 io de Dados CAlias

No No (SXB) Sim

U U a ser C

Parmetro reservado. Parmetro reservado. Consulta utilizada. padro cadastrada no Dicionr

cCampoRet No da consulta padro. uPar4 LVisual No No

C U L

Nome da varivel ou campo que receber o retorno Parmetro Reservado. Indica se ser somente para visualizao.

----------------------- Page 290----------------------Descrio Esta funo exibe a tela de consulta padro baseada no Dicionrio de Dados (SXB). Exemplo CONPAD1(,,,SA1,,,.F.) Enchoicebar Cria barra de botes padro na janela Sintaxe ENCHOICEBAR( oDlg, bOk, bCancelar, [ lMensApag ] , [ aBotoes ] ) -> nil Argumento ODlg BOk bCancelar Obrigat. Sim Sim Sim Tipo O B B Descrio Janela onde a barra ser criada. Bloco executado quando clicado boto Ok. Bloco executado quando clicado. Indica se ao clicar no boto Ok aparecer uma t ela de confirmao de lMensApag No L excluso. Valor padro falso Vetor com informaes para criao de botes adiciona is na barra no aBotoes No Descrio Esta funo cria uma barra com botes padro e outros passados como parmetro na janela tambem passada por parmetro. A EnchoiceBar dever ser chamada antes do ACTIVATE da janela . A formato {bitmap, bloco de cdigo, mensagem}.

Exemplo User Function <nome-do-programa>() Local oDlg DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 300,400 PIXEL ACTIVATE MSDIALOG oDlg CENTERED ON INIT,; ENCHOICEBAR(oDlg,{ APMsgInfo (Ok)}, { APMsgInfo(Teste)},Teste}}) Return FileNoExt Retorna o nome de um arquivo sem a extenso. Sintaxe FILENOEXT( cTexto ) -> caracter Argumento CTexto ndo o nome do arquivo Obrigat. Sim Tipo C Descrio Texto conte ApMsgInfo(Cancelar)}, , {{BMPINCLUIR,{

----------------------- Page 291----------------------Descrio A funo FileNoExt() retorna o nome de um arquivo contido em uma string, ignorando a extenso. Exemplo Local cString := \SIGAADV\ARQZZZ.DBF cString := FileNoExt( cString ) // retorno \SIGAADV\ARQZZZ RetFileName Final Utilizada para finalizar o sistema. Sintaxe FINAL( [ cMensagem1 ], [ cMensagem2 ] ) -> lgico Argumento rio cMensagem1 agem. cMensagem2 nsagem. Descrio Obrigat. No No Tipo C C Desc Primeira mens Segunda me

Esta funo executa operaes bsicas que garantem a integridade dos dados ao finalizar o sistema desmontando as transaes (se houver), desbloqueando os semforos e fechando as t abelas abertas. Exemplo User Function <nome-do-programa>( cUsuario, cSenha ) Local cMensag1 := Usurio invlido! Local cMensag2 := Opo disponvel para usurios Administradores! If !PswAdmin ( cUsuario, cSenha ) FINAL( cMensag1, cMensag2 ) EndIf Return FTPConnect Cria conexo com servidor FTP. Sintaxe FTPCONNECT( cServidor, nPorta, cUsuario, cSenha ) -> lgico Descrio A funo FTPConnect() retorna verdadeiro se a operao for realizada so. Se existir uma conexo ativa e for solicitada uma nova, retornar falso. ----------------------- Page 292----------------------Argumento cServidor onectar no nPorta Obrigat. Sim servidor, No Tipo C por default N utiliza a porta padro de FTP. Nome nectar no cUsuario servidor. Por default No C utiliza o usurio "Anonymous". Senha do usurios utilizado para conectar no servidor. Por default cSenha No Exemplo Local cServidor Local cCurDir cServidor := ftp.caminhodoservidor.com.br If !FTPCONNECT( cServidor ) C utiliza o usurio "Anonymous". do usurio utilizado para co Descrio Endereo do servidor Nmero da porta utilizada para c com suces

APMsgInfo ( Falha na conexo! EndIf FTPDirChange FTPDirectory FTPDisconnect FTPDownload FTPErase FTPGetCurDir FTPRenameFile FTPUpload FTPDirChange Altera o diretrio corrente do FTP. Sintaxe

FTPDIRCHANGE( cDiretorio ) -> lgico Argumento cDiretorio Descrio A funo FTPDirChange () retornar verdadeiro (.T.) se a operao for realizada com suces so. Exemplo Local cServidor Local aArqs Local aDirs cServidor := ftp.caminhodoserivor.com.br FTPDisconnect () If !FTPConnect( cServidor ) ----------------------- Page 293----------------------APMsgInfo ( Falha na conexo! ) EndIf If FTPDirChange( diretorio ) aDirs := FTPDirectory ( *.* , D ) aArqs := FTPDirectory( *.* ) EndIf FTPConnect FTPDisconnect FTPDirectory FTPDownload FTPErase FTPGetCurDir FTPUpload FTPRenameFile Obrigat. Sim Tipo C Descrio Nome do diretrio.

FTPDirectory Cria um vetor com informaes de diretrios e arquivos do FTP. Sintaxe FTPDIRECTORY( cMascara, [ cAtributo ] Argumento cMascara Obrigat. Sim Tipo C Descrio Mscara dos arquivos a serem pesquisados. ) -> array

Se for informado D a funo retornar somente diretr os, se no for cAtributo No Descrio A funo FTPDirectory() retorna um vetor contendo informaes dos diretrios e arquivos co ntidos no FTP. Exemplo Local cServidor Local aArqs Local aDirs cServidor := ftp.caminhodoserivor.com.br FTPDisconnect () If !FTPConnect( cServidor ) APMsgInfo ( Falha na conexo! ) EndIf If FTPDirChange ( diretorio ) aDirs := FTPDIRECTORY( *.* , D ) aArqs := FTPDIRECTORY( *.* ) EndIf FTPConnect FTPDirChange FTPDisconnect FTPDownload FTPErase ----------------------- Page 294----------------------FTPGetCurDir FTPUpload FTPRenameFile FTPDownload Copia um arquivo no servidor FTP para o servidor local. Sintaxe FTPDOWNLOAD( cArqDest, cArqOrig ) -> lgico C informado retornar somente arquivos.

Argumento cArqDest uina. cArqOrig Descrio A

Obrigat. Sim Sim

Tipo C C

Descrio Caminho e nome do arquivo a ser gravado na mq Arquivo no servidor a ser copiado.

funo FTPDownload() copia um arquivo no servidor mquina local em um diretrio (informado no parmetro cArqDest) abaixo do RootPath do Protheus. Exemplo

FTP

para

uma

FTPDisconnect () If !FTPConnect( cServidor ) APMsgInfo ( Falha na conexo! ) EndIf If FTPDirChange ( diretorio ) If !FTPDOWNLOAD( \DIRETORIO\ARQ00001.ARQ , ARQ00001.ARQ ) APMsgInfo ( EndIf EndIf FTPConnect FTPDirChange FTPDirectory FTPDisconnect FTPErase FTPGetCurDir FTPUpload FTPRenameFile FTPGetCurDir Retorna o diretrio corrente no FTP. Sintaxe FTPGETCURDIR() -> caracter ----------------------- Page 295----------------------Exemplo Local cServidor Local cCurDir cServidor := ftp.caminhodoserivor.com.br FTPDisconnect () If !FTPConnect( cServidor ) APMsgInfo ( Falha na conexo! ) Problemas ao copiar arquivo! )

Local cServidor cServidor := ftp.caminhodoserivor.com.br

EndIf cCurDir := FTPGETCURDIR() FTPConnect FTPDirChange FTPDirectory FTPDisconnect FTPDownload FTPErase FTPUpload FTPRenameFile FTPRenameFile Renomeia arquivo no servidor FTP. Sintaxe FTPRENAMEFILE( cArqAtual, cArqNovo ) -> lgico Argumento cArqAtual cArqDest Descrio A funo FTPRenameFile() renomeia um arquivo no diretrio corrente do servidor FTP. Se a operao for realizada com sucesso a funo retornar verdadeiro (.T.). Exemplo Obrigat. Sim Sim Tipo C C Descrio Nome do arquivo a ser renomeado. Novo nome do arquivo.

FTPDisconnect () If !FTPConnect( cServidor ) APMsgInfo ( Falha na conexo! ) EndIf If FTPDirChange ( diretorio ) If !FTPRENAMEFILE( ARQ00001.ARQ , ARQ00002.ARQ ) APMsgInfo( Problemas ao renomear arquivo! ) EndIf EndIf FTPDisconnect FTPDirectory ----------------------- Page 296----------------------FTPGetCurDir FTPDownload FTPUpload FTPUpload

Local cServidor cServidor := ftp.caminhodoserivor.com.br

Copia um arquivo na mquina local para o servidor FTP. Sintaxe FTPUPLOAD( cArqOrig, cArqDest Argumento Obrigat. Tipo ) -> lgico Descrio Caminho e nome do arquivo na mquina a ser cop iado para o servidor cArqOri Sim cArqDest TP. Descrio A funo FTPUpload() copia um arquivo na mquina local para o dire trio corrente no servidor FTP. O arquivo a ser copiado deve estar abaixo do RootPath do Proth eus. Se a operao for realizada com sucesso a funo retornar verdadeiro (.T.). Exemplo Local cServidor cServidor := ftp.caminhodoserivor.com.br FTPDisconnect() If !FTPConnect( cServidor ) APMsgInfo( Falha na conexo! ) EndIf If FTPDirChange( diretorio ) If !FTPUPLOAD( \DIRETORIO\ARQ00001.ARQ , ARQ00001.ARQ ) APMsgInfo( Problemas ao copiar arquivo! ) EndIf EndIf FTPDisconnect FTPDirectory FTPGetCurDir FTPDirChange FTPDownload FTPUpload FTPErase FTPRenameFile FunDesc Retorna descrio de uma opo do menu. Sintaxe FUNDESC() -> caracter ----------------------- Page 297----------------------Descrio Sim C FTP. C Nome do arquivo a ser gravado no servidor F

A funo FunName() retornar a descrio de uma opo selecionada no menu do Siga. Exemplo Local cDescr cDescr := FUNDESC() FunName FunName Retorna nome de uma funo do menu. Sintaxe FUNNAME() -> caracter Descrio A funo FunName() retornar o nome de uma funo executada a partir de um menu do Siga Exemplo Local cFunction cFunction := FUNNAME() FunDesc G etCountryList Retorna vetor contendo informaes dos pases localizados. Sintaxe GETCOUNTRYLIST() -> array Descrio O vetor retornado possui trs dimenses, a primeira refere-se a sigla dos pases, o se gundo ao nome do pas e o terceiro a identificao do pas com dois dgitos. Exemplo Local aArray := GETCOUNTRYLIST() Local cSigla := GetMv ( MV_PAISLOC ) Local nPos nPos := Ascan( aArray, { d d[1] == Upper(cSigla) } ) If nPos > 0 APMsgInfo ( Pas de localizao + aArray[nPos,2] ) EndIf ----------------------- Page 298-----------------------

GetMark Retorna string de caracteres aleatrios. Sintaxe GETMARK( [ lMaiusc ] ) -> caracter Argumento Obrigat. Tipo L Descrio Se verdadeiro (.T.) retorna somente caracter

lMaiusc No es em maisculos. Descrio A GetMark() utilizada junto caracteres para controle de marcas. Exemplo

a funo MarkBrow() onde

so utilizados combinaes de

Function <nome-da-funo>( ) Local aCampos := {{ CB_OK ,, },; { CB_USERLIB ,, Usurio },; { CB_TABHORA ,, Hora },; { CB_DTTAB ,, Data }} Private cMarca := GETMARK() Private cCadastro := Cadastro de Contrato Private aRotina := { { Pesquisar , AxPesqui , 0, 1 }} MarkBrow ( SCB , CB_OK , !CB_USERLIB ,aCampos,, cMarca, MarkAll() ,,,, Mark() ) Return MarkBrow GetMv Retorna o contedo de um parmetro cadastrado no SX6. Sintaxe GETMV( cPar01, [ lPar02 ], [ uPar03 ] ) -> varivel Argumento cPar1 Obrigat. Sim Tipo C Descrio Nome do parmetro a ser pesquisado Define se a GetMv deve retornar o contedo do parmetro, .F. ( Falso lPar02 No L ste, .T. ( Verdadeiro ). Valor ) ou apenas verificar se o parmetro default .F. ( Falso ). Valor default que deve ser retornado pela GetMv quando os parmetro uPar03 No U parmetro pode ser caracter, solicitado no existir. O valor desse exi

numrico, lgico ou data.

Descrio O retorno da funo depende do tipo e da configurao dos argumentos lPar02 e uPar03. informado na cadastro do parmetro

----------------------- Page 299----------------------Se lPar02 for passado como .T. ( Verdadeiro ), o retorno da funo ser um valor lgico indicando se o parmetro existe. Quando uPar03 for informado, caso o parmetro informado em cPar01 no exista, o retorno da funo ser o valor informado em uPar03 caso contrrio retorna o contedo do parmetro. Se uPar03 for informado o contedo de lPar02 ser desconsiderado. Exemplo Local cValor := "" // Retorna o contedo do parmetro cValor := GETMV( "MV_ESTADO" ) // Verifica se o parmetro existe If ( GETMV( "MV_ESTADO", .T. ) ) ApMsgInfo ( "O Parmetro MV_ESTADO existe !" ) Else ApMsgStop( "O Parmetro MV_ESTADO no existe !" ) EndIf // Retorna o contedo do parmetro // se no encontrar retorna o valor default passado cValor := GETMV( "MV_ESTADO", , "SP" ) IncProc Incrementa rgua de progresso. Sintaxe INCPROC() -> nil Descrio Para incrementar a rgua criada pela funo Processa(), utilizamos a funo IncProc() Exemplo User Function <nome-da-funo>( ) Local bAcao := { lFim Exemplo(@lFim) } Local cTitulo := Local cMsg := Processando Local lAborta := .T. Processa ( bAcao, cTitulo, cMsg, lAborta ) Return Static Function Exemplo(lFim)

Local nI ProcRegua (10000) For nI := 1 To 10000 If lFim Exit EndIf INCPROC() Next nI Return Processa ProcRegua ----------------------- Page 300----------------------IncRegua Incrementa valores na rgua de progresso criada pela funo RptStatus(). Sintaxe INCREGUA() -> nil Descrio Aps executar as valores na rgua funo IncRegua(). Exemplo User Function <nome-da-funo>( ) Local cProgram := Exemplo // nome do relatrio Local cAlias := XXX // alias do arquivo Local cPerg := XXXXXX // grupo de perguntas Local cTitulo := Titulo do relatrio Local cDesc1 := Descrio Local cDesc2 := continuao da descrio Local cDesc3 := continuao da descrio Local lDic := .F. // no utiliza dicionrio Local aOrd := { 1 Ordem , 2 ordem , 3 ordem } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administrao", 1, 2, 1, "",1 } Private wrel Pergunte ( cPerg, .F. ) wrel := SetPrint ( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lD ic, aOrd , lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf SetDefault ( aReturn, cAlias ) If nLastKey == 27 funes RptStatus() utilizamos a e SetRegua(), para incrementar

Set Filter To Return EndIf RptStatus ( { lFim Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTi tulo ) Return // rotina de impresso Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho ) Local nLin := 80 Local cCabec1 := Cabecalho 1 Local cCabec2 := Cabecalho 2 dbSelectArea( cAlias ) SetRegua ( RecCount() ) While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58 Cabec ( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // c abealho ----------------------- Page 301----------------------nLin := 8 EndIf @ nLin,000 PSAY __PrtFatLine() @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin,000 PSAY __PrtThinLine() INCREGUA() dbSkip() End IF nLin != 80 nLin++ If nLin > 60 Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho Endif @ nLin,000 PSAY __PrtThinLine() Roda ( 0, cTitulo, cTamanho ) // Rodap EndIf If aReturn[5] = 1 Set Printer TO dbCommitAll() OurSpool ( wrel ) Endif MS_FLUSH () Return RptStatus

SetRegua IndRegua Cria ndice temporrio com expresso de filtro. Sintaxe INDREGUA( cAlias, cIndice, cExpress, [ xOrdem] , [ cFor ], [ cMens ], [ lEx ibir ] ) -> nil Argumento cAlias cIndece cExpress xOrdem . lExibir cFor cMens Descrio Esta funo cria um ndice temporrio para o alias especificado podendo ou no ter um filt ro e tambem podendo ser decrescente se o parmetro xOrdem for especificado como D. Durante a cri ao do ndice um dilogo com uma barra de progresso ser criada podendo esta ser omitida. Exemplo User Function Exemplo() ----------------------- Page 302----------------------Local cArquivo Local cChave Local cFor Local nIndex DbSelectArea("SA1") cArquivo := CriaTrab(,.F.) cChave := "A1_NOME" cFor := "!Empty(A1_NOME)" INDREGUA("SA1",cArquivo,cChave,,cFor) DbSelectArea("SA1") nIndex := RetIndex("SA1") #IFNDEF TOP DbSetIndex(cArquivo+OrdBagExt()) #ENDIF DbSetOrder(nIndex+1) . . Obrigat. No Sim Sim No No No No Tipo C C C C L C C Descrio Alias da tabela que o ndice ser criado. Nome do arquivo para criao do ndice. Expresso do ndice. Indica se a ordem ser crescente ou decrescente Indica se exibir o dilogo de progresso. Expresso de filtro. Mensagem do dilogo de progresso.

. DbSelectArea("SA1") RetIndex("SA1") FErase(cArquivo+OrdBagExt()) Return CriaTrab RetIndex MarkBRefresh Atualiza a MarkBrow. Sintaxe MARKBREFRESH() -> nil Descrio Esta funo atualiza o browse da MarkBrow. MarkBrow GetMark MarkBrow Monta um Browse onde as linhas podem ser marcadas ou desmarcadas. Sintaxe MARKBROW( cAlias, cCampo, [ cCpo ], [ aCampos ], [ lInverte ], cMarca, [ cCtrlM ], [ uPar ], [ cExpIni ], [ cExpFim ], [ cAval ] ) -> nil Argumento cAlias Obrigat. Sim Tipo C C Descrio Alias do arquivo a ser exibido no browse. Campo do arquivo onde ser feito o controle ( Campo marcao e exibio do cCpo No C bitmap de status. ----------------------- Page 303----------------------aCampos lInvert cMarca o para marcao. cCtrlM elementos. No No Sim No A L C C Colunas a serem exibidas. Inverte a marcao. String a ser gravada no campo especificad Funo a ser executada caso deseje marcar todos onde ser feita a validao para

cCampo Sim gravao) da marca.

uPar

No

Parmetro reservado. Funo que retorna o contedo inicial do filtro

baseada na chave de cExpIni No aseada na chave de cExpFim No cAval No emento no browse. Descrio

ndice selecionada. Funo que retorna o contedo final do filtro b

C ndice selecionada. C Funo a ser executada no duplo clique em um el

A funo MarkBrow() permite que os elementos de um browse sejam marcados ou desmarca dos. As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da chamada da funo. O vetor informado no parmetro aCampos deve conter as seguintes dimenses: 1 nome do campo; 2 - Nada (Nil); 3 - Ttulo do campo; 4 - Mscara (picture).

(*) vetor com as rotinas que sero executadas, nele ser definido o tipo de operao a ser executada (incluso, alterao, excluso, visualizao, pesquisa, ...) sua estrutura co sta de 5 (cinco) dimenses: 1 - Ttulo; 2 Rotina; 3 Reservado; 4 Operao (1 - pesquisa; 2 - visu incluso; 4 - alterao; 5 - excluso); 5 Acesso relacionado a rotina, se esta posio n informada nenhum acesso ser validado. Exemplo Function <nome-da-funo>( ) Local aCampos := { { CB_OK ,, },; { CB_USERLIB ,, Usurio },; { CB_TABHORA ,, Hora },; { CB_DTTAB ,, Data }} Private cMarca := GetMark() Private cCadastro := Cadastro de Contrato Private aRotina := { { Pesquisar , AxPesqui , 0, 1 }} MARKBROW( SCB , CB_OK , !CB_USERLIB ,aCampos,, cMarca, MarkAll() ,,,, Mark() ) Return // Grava marca no campo Function Mark() If IsMark( CB_OK , cMarca ) RecLock( SCB , .F. ) Replace CB_OK With Space(2) MsUnLock () RecLock( SCB , .F. ) Replace CB_OK With cMarca MsUnLock() Else

EndIf Return // Grava marca em todos os registros validos Function MarkAll() Local nRecno := Recno() dbSelectArea( SCB ) dbGotop() While !Eof() Mark() dbSkip() ----------------------- Page 304----------------------End dbGoto( nRecno ) Return MarkBRefresh GetMark MBrowse MBrowse Monta um Browse com menu de opes. Sintaxe MBROWSE( [ uPar1 ], [ uPar2 ], [ uPar3 ], [ uPar4 ], cAlias, [ aFixos ], [ cCpo ], [ uPar5 ], [ cFun ], [ nPadrao ], [ aCores ], [ cExpIni ], [ cExpFim ], [ nCongela ] ) -> nil Argumento uPar1 uPar2 uPar3 uPar4 cAlias zado no browse. Obrigat. No No No No Sim Tipo N N N N C Descrio Parmetro reservado. Parmetro reservado. Parmetro reservado. Parmetro reservado. Alias do arquivo a ser visuali Contendo os nomes dos campos fixos pr-definidos pelo aFixos No io de uma ou mais colunas. Campo a ser validado se est va zio ou no para exibio do bitmap cCpo No uPar5 No C de status. N Parmetro reservado. A programador, obrigando a exib

Funo que retornar um valor lgico

para exibio do bitmap de cFun No

C status. Nmero da rotina a executada qu

ando for efetuado um duplo nPadrao No e. Caso no seja informado o pesquisa.

clique em um registros do brows padro ser executada visualizao ou Este vetor possui duas dimense

s, a primeira a funo de aCores No tus, e a segunda o bitmap

validao para exibio do bitmap de sta a ser exibido. Funo que retorna o contedo inici

al do filtro baseada na chave cExpIni No do filtro baseada na chave de cExpFim No nCongela e. Descrio No

de ndice selecionada. Funo que retorna o contedo final

C N

ndice selecionada. Coluna a ser congelado no brows

As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da chamada da funo. Apenas um dos parmetros ( cCpo, cFun, aColors ) deve ser informado.

(*) vetor com as rotinas que sero executadas, nele ser definido o tipo de operao a ser executada (incluso, alterao, excluso, visualizao, pesquisa, ...) sua estrutura posta de 5 (cinco) dimenses: 1 - Ttulo; 2 Rotina; 3 Reservado; 4 Operao (1 - pesquisa; 2 - visu incluso; 4 - alterao; 5 - excluso); 5 Acesso relacionado a rotina, se esta posio n informada no validar os acessos. ----------------------- Page 305----------------------Exemplo

Ms_Flush Descarrega spool de impresso.

Private cCadastro := Cadastro de Clientes Private aRotina := { { Pesquisar , AxPesqui { Visualizar , AxVisual { Incluir , AxInclui , { Alterar , AxAltera , { Excluir , AxExcluir , MBROWSE( ,,,, SA1 ,, !A1_COD ,,, 4 )

, 0, 1 },; , 0, 2 },; 0, 3 },; 0, 4 },; 0, 5 }}

Sintaxe MS_FLUSH() -> nil Descrio Aps os comandos de impresso as informaes ficam armazenadas no spool e so descarrega e m seus destinos atravs da funo Ms_Flush(). Exemplo User Function <nome-da-funo>( ) Local cProgram := Exemplo // nome do relatrio Local cAlias := XXX // alias do arquivo Local cPerg := XXXXXX // grupo de perguntas Local cTitulo := Titulo do relatrio Local cDesc1 := Descrio Local cDesc2 := continuao da descrio Local cDesc3 := continuao da descrio Local lDic := .F. // no utiliza dicionrio Local aOrd := { 1 Ordem , 2 ordem , 3 ordem } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 } Private wrel Pergunte ( cPerg, .F. ) wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDi c, aOrd , lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf SetDefault( aReturn, cAlias ) If nLastKey == 27 Set Filter To Return EndIf RptStatus ( { lFim Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTi tulo ) Return // rotina de impresso Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho ) Local nLin := 80 Local cCabec1 := Cabecalho 1 ----------------------- Page 306----------------------Local cCabec2 := Cabecalho 2 dbSelectArea( cAlias )

SetRegua ( RecCount() ) While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )

If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58 Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho nLin := 8 EndIf @ nLin,000 PSAY __PrtFatLine() @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin,000 PSAY __PrtThinLine() IncRegua () dbSkip() End IF nLin != 80 nLin++ If nLin > 60 Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho Endif @ nLin,000 PSAY __PrtThinLine() Roda ( 0, cTitulo, cTamanho ) // Rodap EndIf If aReturn[5] = 1 Set Printer TO dbCommitAll() OurSpool ( wrel ) Endif MS_FLUSH () Return SetPrint SetDefault RptStatus IncRegua OurSpool SetRegua MsAppend Adiciona registros de um arquivo para outro. Sintaxe MSAPPEND( [ cArqDest ], cArqOrig ) -> lgico Argumento Obrigat. Tipo Descrio Se o RDD corrente for DBFCDX os registros se ro adicionados na rea cArqDest No C

selecionada, caso contrrio o arquivo destino ter que ser informado. cArqOrig No serem adicionados. C Nome do arquivo origem contendo os registros a

----------------------- Page 307----------------------Descrio A funo MsAppend() adiciona registros de um arquivo para outro, respeitando a est rutura das tabelas. Se a operao for realizada com sucesso o funo retornar verdadeiro (.T.). Exemplo dbSelectArea(XXX) MSAPPEND(,ARQ00001) MsCopyTo MsCopyFile MsFile MsErase MsCreate MsRename MsCopyFile Executa copia binria de um arquivo. Sintaxe MSCOPYFILE( cArqOrig, cArqDest ) -> lgico Argumento cArqOrig cArqDest Descrio Se a copia for realizada com sucesso a funo retornar verdadeiro (.T.). Exemplo Local cArqOrig := ARQ00001.DBF Local cArqDest := ARQ00002.XXX If MSCOPYFILE ( cArqOrig, cArqDest ) APMsgInfo ( Copia realizada com sucesso! ) EndIf MsAppend MsCopyTo MsCreate MsErase MsFile MsRename Obrigat. Sim Sim Tipo C C Descrio Nome do arquivo origem e a extenso. Nome do arquivo destino e a extenso.

MsCopyTo Realiza copia de um arquivo de dados. ----------------------- Page 308----------------------Sintaxe MSCOPYTO( [ cArqOrig ], cArqDest ) -> lgico Argumento Obrigat. Tipo for Top o C parmetro passar a ser obrigatrio. cArqDest Descrio A funo MsCopyTo() copia os registros de uma base de dados para outra, criando o arquivo destino de acordo com a estrutura da base de dados origem. Se a operao for realizada com sucesso o funo retornar verdadeiro (.T.) Exemplo Local cArqDest := SX2ZZZ.DBF DbSelectArea( SX2 ) If MSCOPYTO( , cArqDest ) Else EndIf MsAppend MsCopyFile MsCreate MsErase MsFile MsRename MsCreate Cria arquivo de dados. Sintaxe MSCREATE( cArquivo, aEstrut ,[ cDriver ] ) -> lgico Argumento cArquivo Obrigat. No Tipo C Descrio Nome do arquivo. Sim C Nome do arquivo destino e a extenso. Descrio Nome so se o ambiente cArqOrig No do arquivo origem e a exten

APMsgInfo ( Copia realizada com sucesso! ) APMsgInfo( Problemas ao copiar o arquivo SX2! )

aEstrut cDriver Descrio

Sim No

A C

Estrutura do arquivo. RDD do arquivo.

A funo MsCreate() cria um arquivo (tabela) de acordo com a estrutura informada n o parmetro aStrut (*). Se o parmetro cDriver no for informado o RDD corrente ser assumido como padro . Para criao de tabelas no TopConnect necessrio estar conectado ao banco e o environment do Protheus ser TOP. Se o arquivo for criado com sucesso a funo retornar verdadeiro (.T.). ----------------------- Page 309----------------------(*) vetor contendo a estrutura da tabela: 1 - caracter, nome do campo; 2 - carac ter, tipo do campo; 3 - numrico, tamanho do campo; 4 - numrico, decimais. Exemplo Local cTarget := \sigaadv\ Local aStrut aStrut := { { Campo , C , 40, 0 } } If MSCREATE( cTarget+ ARQ1001 , aStrut ) APMsgInfo ( Criado com sucesso! ) APMsgInfo( Problemas ao criar o arquivo! ) EndIf MsAppend MsCopyTo MsCopyFile MsErase MsFile MsRename MsErase Deleta arquivo. Sintaxe MSERASE( cArquivo, [ cIndice ], [ cDriver ] ) -> lgico Argumento cArquivo cIndice Obrigat. Sim No Tipo C C Descrio Nome do arquivo e a extenso. Nome do arquivo de ndice e a extenso. RDD do arquivo, se no for informado assumir o RDD corrente como cDriver No C padro. Else

Descrio A funo MsErase() retornar verdadeiro (.T.) se a operao for realizada com sucesso. Exemplo Local cArquivo := SX2ZZZ.DBF Local cIndice := SX2ZZZ + OrdBagExt() If MSERASE ( cArquivo, cIndice ) APMsgInfo ( Arquivo deletado com sucesso! ) APMsgInfo( Problemas ao deletar arquivo! EndIf MsAppend MsCopyFile MsCopyTo MsCreate MsFile MsRename ----------------------- Page 310----------------------MsExecAu to Objetivo Fazer manuteno automtica (incluso, alterao e excluso) s de manipulao de dados do sistema, automatizando o processo de entrada de dados sem a necessidade de desenvolver rotinas especificas. Aplicao Esta tecnica aplicada em todas porm esta documentao baseou-se na verses superiores a Vantagens 1) Interface : Os dados de entrada so enviados a e campos e conteudos (array) e desta forma no necessario enhuma inteface ao usurio. rotina a em forma d de n as verses AP6.09. Protheus, das Else

2) Segurana : A utilizao de rotinas automticas aumenta considerave lmente a segurana do sistema, uma vez que utiliza as validaes padres e diminui os problemas causados por atualizao de verso ou incluso de customizaes nas rotinas padres do sistema. 3) Agilidade no processo : Aumenta consideravemente o tempo de desenvolvimento das customizaes que necessitam de entrada de dados. Exemplo: Importao de pedido de venda.

rot

apresentao

Procedimentos Existem duas maneiras de utilizar a rotina automatica, sendo elas: 1. Sem Interface 2. Com Interface Para a utilizacao da rotina automatica sem interface deve-se, configurar o ambie nte utilizando-se o comando PREPARE ENVIRONMENT e chamar diretamente o nome da funo. Exemplo: User Function IncProd() Local aRotAuto := {} Local nOpc := 3 // inclusao Private lMsHelpAuto := .t. // se .t. direciona as mensagens de help para o arq. de log Private lMsErroAuto := .f. //necessario a criacao, pois sera //atualizado quando houver //alguma incosistencia nos parametros ----------------------- Page 311----------------------PREPARE ENVIRONMENT EMPRESA 99 FILIAL 01 MODULO Begin Transaction aRotAuto:= {{ B1_COD , 1010 ,Nil},; { B1_DESC , Produto teste ,Nil},; { B1_TIPO , PA ,Nil},; { B1_UM , UN ,Nil},; { B1_LOCPAD , 01 ,Nil},; { B1_PICM ,0 ,Nil},; { B1_IPI ,0 ,Nil},; { B1_PRV1 ,100 ,Nil},; { B1_LOCALIZ , N ,Nil},; { B1_CODBAR , 789888800001 ,Nil}} MSExecAuto({ x,y mata010(x,y)},aProduto,nOpc) If lMsErroAuto DisarmTransaction() break EndIf End Transaction If lMsErroAuto /* Se estiver em uma aplicao normal e ocorrer alguma incosistencia nos parametros passados,mostrar na tela o log informando qual coluna teve a incosistencia. */ Mostraerro() Return .f. EndIf Return .t. Ja para rotinas que possuem interface, devemos usar a MSExecAuto, pois a mesma tem a funo de guardar o ambiente , executar a funo automatica e retornar de onde parou. FAT

Exemplo: User Function IncProd() Local aRotAuto := {} Local nOpc := 3 // inclusao Private lMsHelpAuto := .t. // se .t. direciona as mensagens de help para o arq. de log Private lMsErroAuto := .f. //necessario a criacao, pois sera //atualizado quando houver //alguma incosistencia nos parametros Begin Transaction aRotAuto:= {{ B1_COD , 1010 ,Nil},; { B1_DESC , Produto teste ,Nil},; { B1_TIPO , PA ,Nil},; { B1_UM , UN ,Nil},; { B1_LOCPAD , 01 ,Nil},; { B1_PICM ,0 ,Nil},; { B1_IPI ,0 ,Nil},; { B1_PRV1 ,100 ,Nil},; { B1_LOCALIZ , N ,Nil},; { B1_CODBAR , 789888800001 ,Nil}} ----------------------- Page 312----------------------MSExecAuto({ x,y mata010(x,y)},aProduto,nOpc) If lMsErroAuto DisarmTransaction() break EndIf End Transaction If lMsErroAuto /* Se estiver em uma aplicao normal e ocorrer alguma incosistencia nos parametros passados,mostrar na tela o log informando qual coluna teve a incosistencia. */ Mostraerro() Return .f. EndIf Return .t. MsFile Verifica existncia de um arquivo. Sintaxe MSFILE( cArquivo, [ cIndice ], [ cDriver ] ) -> lgico Argumento cArquivo cIndice Obrigat. Sim No Tipo C C Descrio Nome do arquivo origem e a extenso. Nome do arquivo de ndice e a extenso. RDD do arquivo, se no for informado assumir o RDD corrente como cDriver No C

padro. Descrio A funo MsFile() retornar verdadeiro (.T.) se a operao for realizada com sucesso. Exemplo Local cArquivo := SX2ZZZ.DBF Local cIndice := SX2ZZZ + OrdBagExt() If !MSFILE ( cArquivo, cIndice ) APMsgInfo ( EndIf MsAppend MsCopyFile MsCopyTo MsCreate MsErase MsRename ----------------------- Page 313----------------------MsRename Renomeia arquivo de acordo com RDD corrente. Sintaxe MSRENAME( cArqOrig, cArqDest ) -> lgico Argumento cArqOrig cArqDest Descrio A funo MsRename() retornar verdadeiro (.T.) se efetuar a operao com sucesso. Exemplo Local cTarget := \sigaadv\ Local cArqOrig := ARQ00001.DBF Local cArqDest := ARQ00002.DBF If MSRENAME( cTarget + cArqOrig, cTarget + cArqDest ) APMsgInfo ( Arquivo renomeado com sucesso! ) APMsgInfo( Problemas ao renomear o arquivo EndIf MsAppend MsCopyFile MsCopyTo MsCreate MsFile + cArqOrig + ! ) Else Obrigat. Sim Sim Tipo C C Descrio Nome do arquivo origem e a extenso. Nome do arquivo destino e a extenso. Arquivo no encontrado! )

MsErase MsUnlock Libera lock de registro. Sintaxe MSUNLOCK() -> nil Descrio A funo MsUnlock() libera os registros bloqueados pela funo RecLock(). No retorna valores. Exemplo

----------------------- Page 314----------------------MSUNLOCK() RecLock OurSpool Gerenciador de impresso. Sintaxe OURSPOOL( [ cArquivo ] ) -> nil Argumento cArquivo co Descrio A funo OurSpool() executa o gerenciador de impresso do Siga, carregando os rela trios gerados no diretrio configurado atravs parmetro MV_RELT no dicionrio SX6. Caso quiser visualiza r um relatrio especfico, informe o nome no parmetro cArquivo. Exemplo User Function <nome-da-funo>( ) Local cProgram := Exemplo // nome do relatrio Local cAlias := XXX // alias do arquivo Local cPerg := XXXXXX // grupo de perguntas Local cTitulo := Titulo do relatrio Local cDesc1 := Descrio Local cDesc2 := continuao da descrio Local cDesc3 := continuao da descrio Obrigat. Sim Tipo C Descrio Relatrio gerado em dis

RecLock( XXX ,.F. ) Replace Campo With 000001

Local lDic := .F. // no utiliza dicionrio Local aOrd := { 1 Ordem , 2 ordem , 3 ordem } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 } Private wrel Pergunte ( cPerg, .F. ) wrel := SetPrint ( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lD ic, aOrd , lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf SetDefault ( aReturn, cAlias ) If nLastKey == 27 Set Filter To Return EndIf RptStatus ( { lFim Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTi tulo ) Return // rotina de impresso Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho ) Local nLin := 80 Local cCabec1 := Cabecalho 1 Local cCabec2 := Cabecalho 2 dbSelectArea( cAlias ) SetRegua ( RecCount() ) While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) ----------------------- Page 315----------------------If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58 Cabec ( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho nLin := 8 EndIf @ nLin,000 PSAY __PrtFatLine() @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin,000 PSAY __PrtThinLine() IncRegua() dbSkip() End IF nLin != 80 nLin++ If nLin > 60

Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho Endif @ nLin,000 PSAY __PrtThinLine() Roda ( 0, cTitulo, cTamanho ) // Rodap EndIf If aReturn[5] = 1 Set Printer To dbCommitAll() OURSPOOL ( wrel ) Endif MS_FLUSH () Return SetPrint SetDefault RptStatus IncRegua Ms_Flush SetRegua Pergunte Inicializa as variveis de pergunta (mv_par??). Sintaxe PERGUNTE( cPergunta , [ lPerg ] , [ cTitulo ] ) -> lgico Argumento Obrigat. Tipo C L C Descrio Pergunta cadastrada no dicionrio de dados ( Indica se exibir a tela para edio. Ttulo do dilogo.

cPergunta Sim SX1) a ser utilizada. lPerg cTitulo Descrio No No

Esta funo inicializa as variveis de pergunta (mv_par01,...) baseado na p ergunta cadastrado no Dicionrio de Dados (SX1). Se o parmetro lAsk no for especificado ou for verdadeiro ser exibida a tela ----------------------- Page 316----------------------para edio da pergunta e se ualizadas e a pergunta no SX1 tambm ser atualizada. Exemplo PERGUNTE(CON010) o usurio confirmar as variveis sero at

Processa Cria dilogo com uma rgua de progresso. Sintaxe PROCESSA( bAcao, [ cTitulo ] , [ cMsg ], [ lAborta] ) -> nil Argumento bAcao cMsg resso cTitulo lAborta Descrio Obrigat. Sim No No No Tipo C C C L Descrio Funo a ser executada. Mensagem a ser exibida a baixo da rgua de prog Ttulo de janela Habilita boto cancelar.

A funo Processa() cria um dilogo onde a execuo de um determinada funo pode ser acomp ada atravs de uma rgua de progresso. Para atribuir o valor total da rgua utilizamos a fu no ProcRegua() e para incrementar a rgua utilizamos a funo IncProc(). Exemplo User Function <nome-da-funo>( ) Local bAcao := { lFim Exemplo(@lFim) } Local cTitulo := Local cMsg := Processando Local lAborta := .T. PROCESSA( bAcao, cTitulo, cMsg, lAborta ) Return Static Function Exemplo(lFim) Local nI ProcRegua (10000) For nI := 1 To 10000 If lFim Exit EndIf IncProc () Next nI Return ProcRegua IncProc ProcRegua ----------------------- Page 317----------------------Atribui o valor total da rgua de progresso cria pela pela funo Processa().

Sintaxe PROCREGUA( nTotal ) -> nil Argumento nTotal rgua. Descrio Aps atribuir o valor total da rgua, para incrementar utilizamos a funo IncProc(). Exemplo User Function <nome-da-funo>( ) Local bAcao := { lFim Exemplo(@lFim) } Local cTitulo := Local cMsg := Processando Local lAborta := .T. Processa( bAcao, cTitulo, cMsg, lAborta ) Return Static Function Exemplo(lFim) Local nI PROCREGUA(10000) For nI := 1 To 10000 If lFim Exit EndIf IncProc() Next nI Return IncProc Processa PswAdmin Verifica se um usurio pertence ao grupo de administradores. Sintaxe PSWADMIN( cUsuario, cSenha ) -> numrico Argumento cUsuario cSenha Descrio A funo PswAdmin() retorna 0 (zero) se o usurio for do grupo de administradores, 1 ( um) para usurio no administrador e 2 (dois) se for senha invlida. ----------------------- Page 318----------------------Obrigat. Sim Sim Tipo C C Descrio Nome do usurio. Senha do usurio. Obrigat. Sim Tipo N Descrio Valor total da

Exemplo User Function <nome-da-funo>( cUsuario, cSenha ) Local lAdminst := .F. Local nRet nRet := PSWADMIN( cUsuario, cSenha ) If nRet == 0 lAdminst := .T. ElseIf nRet == 1 APMsgInfo( Usurio no Administrador ! ) ElseIf nRet == 2 APMsgInfo( Senha invalida ! ) EndIf Return lAdminst PswName PswOrder PswID PswRet PswSeek PswID Retorna o ID do usurio ou do grupo de usurio. Sintaxe PSWID() -> caracter Descrio Utilizada para retornar o ID do usurio ou do grupo de usurios aps ter posicionado o arquivo de senha com a funo PswSeek(). Exemplo User Function <nome-da-funo>( cUsuario ) Local cUserID PswOrder (2) If PswSeek ( cUsuario, .T. ) cUserId := PSWID() // Retorna o ID do usurio EndIf Return PswAdmin PswName PswOrder PswSeek PswRet PswName Verifica senha de usurio. ----------------------- Page 319-----------------------

Sintaxe PSWNAME( cSenha ) -> lgico Argumento Descrio cSenha nha do usurio. Descrio A funo PswName() verifica se a senha informada no parmetro cSenha pertence ao usurio posicionado no arquivo de senha, se pertencer retornar verdadeiro(.T.). Exemplo User Function <nome-da-funo>( cUsuario, cSenha ) Local lOk PswOrder (2) If PswSeek ( cUsuario, .T. ) lOk := PSWNAME( cSenha ) EndIf Return lOk PswAdmin PswID PswOrder PswRet PswSeek PswOrder Posiciona a ordem de indexao do arquivo de senhas. Sintaxe PSWORDER( nOrdem ) -> nil Argumento scrio nOrdem ndexao. Descrio A funo PswOrder() posiciona a ordem de indexao de acordo com o parametro nOrdem, ond e: 1 ID; 2 usurio; 3 senha;e Obrigat. Sim Tipo N De Ordem de i Sim C Se Obrigat. Tipo

4 e-mail. ----------------------- Page 320----------------------Exemplo User Function <nome-da-funo>( cUsuario ) Local cUserID PSWORDER(2) If PswSeek( cUsuario, .T. ) cUserId := PswID() // Retorna o ID do usurio EndIf Return PswAdmin PswID PswRet PswSeek PswName PswRet Retorna vetor contendo informaes do Usurio ou do Grupo de Usurios. Sintaxe PSWRET() -> array Descrio A funo PswRet() retorna dois tipos de vetores distintos, de acordo com o posiciona mento do arquivo de senha. Se no segundo parmetro da funo PswSeek() for informado .T. a PswRet() retorn ar um vetor com informaes do Usurios, caso contrrio retornar informaes do Grupo de Usurios. Exemplo // Exemplo 1 User Function <nome-da-funo>( cUsuario ) Local aArray := {} PswOrder (2) If PswSeek ( cUsuario, .T. ) aArray := PSWRET() // Retorna vetor com informaes do usurio EndIf Return // Exemplo 2 User Function <nome-da-funo>( cGrupoID ) Local cGrupo PswOrder(1) If PswSeek( cGrupoId, .F. ) cGrupo := PSWRET()[1][2] // Retorna nome do Grupo de Usurio EndIf Return PswAdmin PswID PswName

PswOrder PswSeek PswSeek Pesquisa e posiciona o arquivo de senhas. ----------------------- Page 321----------------------Sintaxe PSWSEEK( cID, [ lUsuario ] ) -> lgico Argumento cID e usurios. Obrigat. Sim Tipo C Descrio String contendo o ID do usurio ou do grupo d Se verdadeiro (.T.) pesquisa por usurios, se falso (.F.) pesquisa por lUsuario No .T. Descrio A funo PswSeek() pesquisa e posiciona o arquivo de senhas conf orme a ordem de indexao e o parmetro lUsuario, se encontrar o usurio ou grupo de usurios retorna verdadeiro (.T .). Exemplo User Function <nome-da-funo>( cUsuario ) Local cUserID PswOrder (2)// seleciona ordem de indexao If PSWSEEK( cUsuario, .T. ) cUserId := PswID() // Retorna o ID do usurio EndIf Return PswAdmin PswID PswName PswOrder PswRet ReadVar Retorna o nome da varivel que esta sendo editada. Sintaxe READVAR() -> caracter Descrio L grupo de usurios. O valor assumido como padro

Retorna o nome da varivel que esta sendo editada pela MsGetDados, MsGetDB e MsMGe t (Enchoice) para ser usada na validao de um campo por exemplo. Exemplo cVar := READVAR() If Type(cVar) EndIf MsGetDados MsGetDB MsMGet ----------------------- Page 322----------------------RetExtHlp Retorna a extenso do help de campo. Sintaxe RETEXTHLP() -> caracter Descrio Esta funo retorna uma string contendo a extenso do help de campos de acordo com idi oma corrente. Exemplo Local cExt cExt := RETEXTHLP() If HLP $ cExt APMsgInfo ( Help de Campos em Portugus ) ElseIf HLE $ cExt APMsgInfo( Help de Campos em Espanhol ) ElseIf HLI $ cExt APMsgInfo( Help de Campos em Ingls ) EndIf RetAcsName RetExtHls RetEXtMnu RetExtHpr RetExtHls Retorna a extenso do help de solues. Sintaxe RETEXTHLS() -> caracter Descrio C

APMsgInfo (Opo escolhida: +&cVar)

Esta funo retorna uma string contendo a extenso do help de solues de acordo com idiom a corrente. Exemplo Local cExt cExt := RETEXTHLS() If HLS $ cExt APMsgInfo ( Help de Solues em Portugus ) ElseIf HSE $ cExt APMsgInfo( Help de Solues em Espanhol ) ElseIf HSI $ cExt APMsgInfo( Help de Solues em Ingls ) EndIf RetAcsName RetExtHlp RetExtHpr RetEXtMnu ----------------------- Page 323---------------------------------------------/\/\/\/\/\/\/\/\/\ Cores do Botes /\/\/\/\/\/\/\/\/\/\/\------------Botes utilizados no Siga. Na Funo: @ Lin, Col BMPBUTTON TYPE NN ACTION FUNO Ou nas barras de Ferramentas: AFASTAME ALTERA CANCEL AREA CARGA AUTOM CHAVE2 BAR BUDGET CONTAINR BUDGETY CADEADO

----------------------- Page 324----------------------DBG06 DBG07 DESTINOS DISCAGEM EDITABLE EXCLUIR FORM GRAF2D

EDIT ----------------------- Page 325----------------------GRAF3D LINE NOTE OBJETIVO OK PENDENTE PRECO PRODUTO S4SB014N S4WB001N S4WB005N S4WB006N S4WB007N S4WB008N S4WB009N S4WB010N S4WB011N S4WB013N S4WB014A S4WB016N SIMULACA VENDEDOR -------------------/\/\/\/\/\/\/\/\/\ Cores do Botes dos Semaforo/\/\/\/\/\/\/\/\ /\/\---------------------Estas so as cores de nosso exemplo padro. No temos listagem de todas as cores disponveis, teriam de ser consultados todos os fontes com browse para verificao;.. aCores := { { Recno() = 1 , ENABLE },; // Cores padroes do semaforo. { Recno() = 2 , DISABLE },; // Verde - ENABLE - Vermelho DIS ABLE. { Recno() = 3 , BR_PRETO },;.

325 ----------------------- Page 326---------------------------------------------/\/\/\/\/\/\/\/\/\ ORIENTAAO A OBJETO /\/\/\/\/\/\/\/\/\/\ /\---------------------tSrvObject Classe me de todas as classes de interface. Caractersticas Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser in stanciada diretamente. Propriedades Propriedade Tipo nLeft nTop nWidth nHeight cCaption cTooltip lShowHint do objeto. Numrico. Numrico. Numrico. Numrico. Caractere. Caractere. Lgico. Descrio Coordenada horizontal em pixels. Coordenada vertical em pixels. Largura em pixels. Altura em pixels. Ttulo ou contedo do objeto. Mensagem exibida quando objeto exibe seu tooltip. Flag que ativa .T. ou desativa .F. a exibio do tooltip Mensagem exibida na barra de status da janela prin cipal quando o objeto cMsg Caractere. ganha foco. nClrText nClrPane Numrico. Numrico. Cor do texto do objeto. Cor do fundo do objeto.

{ Recno() = 4 , { Recno() = 5 , { Recno() = 6 , { Recno() = 7 , { Recno() = 8 , { Recno() = 9 , { Recno() = 10 , { Recno() = 11 , Acredito que no seja possvel a ita na funo que monta o browse;

BR_AMARELO },;. BR_VERDE },;. BR_AZUL },;. BR_CINZA },;. BR_PINK },;. BR_LARANJA },;. BR_MARRON },;. BR_VERMELHO } } implementao por .ch, pois a chamada das cores est impl

Bloco de tornar .T. o bWhen cdigo. ser desabilitado. ever ser Bloco de bValid se contedo cdigo. Bloco de mouse sobre o blClicked cdigo. Bloco de mouse sobre o brClicked cdigo. Bloco de rdo do mouse sobre blDblClick cdigo. oWnd lVisible Cargo bLostFocus cdigo. Bloco de bGotFocus cdigo. Mtodos SetFocus Sintaxe Objeto. Booleano. Objeto ou varivel. Bloco de

Executado quando h movimentao de foco na janela.Se re objeto continua habilitado, se retornar .F. o objeto Executado quando o contedo do objeto modificado e d validado. Deve retornar .T. se o contedo vlido e .F. invlido. Executado quando acionado click do boto esquerdo do objeto. Executado quando acionado click do boto direito do objeto. Executado quando acionado duplo click do boto esque o objeto. Janela onde o objeto foi criado. Se .T. o objeto visvel, se .F. o objeto invisvel. Contedo associado ao objeto. Executado quando objeto perde foco.

Executado quando objeto ganha foco.

SetFocus( )

Descrio Fora o foco de entrada de dados mudar para o objeto. Retorno Hide Sintaxe Hide( ) NIL

Descrio Torna objeto invisvel. Retorno NIL

Show Sintaxe

Show( )

Descrio Torna objeto visvel. Retorno Enable Sintaxe Enable( ) 326 ----------------------- Page 327----------------------Descrio Habilita o objeto. Retorno Disable Sintaxe Disable( ) NIL NIL

Descrio Desabilita o objeto. Retorno Refresh Sintaxe o Protheus Descrio Remote. tFont Classe que encapsula fonte de edio. Hierarquia tFontAbs -> tFont Descrio Utilize objeto tFont para modificar a fonte padro de controles visuais. Propriedades Vide classes ancestrais. Mtodos New Descrio Mtodo construtor da classe. Refresh( ) Fora atualizao (sincronia) de propriedades entre o programa e NIL

New([acName], [nPar2], [anHeight], [lPar4], [alBold], [nPar6], [lPar7], [nPar8], Sintaxe [alItalic], [alUnderline]) Parmetro acName nPar2 anHeight lPar4 alBold to. Parmetros nPar6 lPar7 nPar8 alItalic . alUnderline Lgico, opcional. Se .T. o estilo da fonte ser sublin hado. Retorno Exemplo #INCLUDE "PROTHEUS.CH" User Function Teste() Local oDlg, oSay Local oFont:= TFont():New("Courier New",,-14,.T.) 327 ----------------------- Page 328----------------------DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE "My dialog" PIXEL // Apresenta o tSay com a fonte Courier New oSay := TSay():New( 10, 10, { RED ) "Mensagem"},oDlg,, oFont,,,, .T., CLR_WHITE,CLR_ O objeto criado. Tipo / Descrio Caractere, opcional. Nome da fonte, o padro Arial. Reservado. Numrico, opcional. Tamanho da fonte. O padro -11. Reservado. Lgico, opcional. Se .T. o estilo da fonte ser negri Reservado. Reservado. Reservado. Lgico, opcional. Se .T. o estilo da fonte ser itlico

/* o comando abaixo proporciona o mesmo resultado @ 10,10 SAY oSay PROMPT "Mensagem" FONT oFont COLOR CLR_WHITE,CLR_RED OF oDlg PI XEL */ oSay:lTransparent:= .F. ACTIVATE MSDIALOG oDlg CENTERED

Return MSDialog Classe de dilogo de entrada de dados. Hierarquia tSrvObject -> tWindow -> tDialog -> MSDialog Caractersticas MSDialog deve ser utilizada como padro de janela para entrada de dados. MSDialog um tipo de janela dilogo modal, isto , no permite que outra janela ativa receba dados enquanto esta estiver ativa. Propriedades Vide classes ancestrais. Mtodos New Descrio n], [cPar6], [nPar7], Sintaxe aoWnd], [alPixel], Mtodo construtor da classe. New([anTop], [anLeft], [anBottom], [anRight], [acCaptio [lPar8], [nPar9], [anClrText], [anClrBack], [oPar12], [ [oPar15], [oPar16], [lPar17]) Parmetro Tipo / Descrio Numrico, opcional. Coordenada vertical supe rior em pixels ou anTop caracteres. Numrico, opcional. Coordenada horizontal es querda em pixels ou anLeft caracteres. Numrico, opcional. Coordenada vertical infe rior em pixels ou anBotom caracteres. Numrico, opcional. Coordenada horizontal di reita em pixels ou anRight caracteres. acCaption Caractere, opcional. Ttulo da janela. cPar6 Reservado.

Parmetros

nPar7 lPar8 nPar9 anClrText

Reservado. Reservado. Reservado. Numrico,opcional. Cor do texto.

anClrBack Numrico,opcional. Cor de fundo. oPar12 criada, padro a aoWnd janela principal do programa. Lgico, opcional. Se .T. considera as coorde nadas passadas em alPixel pixels, se .F. considera caracteres. oPar15 oPar16 328 ----------------------- Page 329----------------------nPar17 Retorno Exemplo #INCLUDE protheus.ch User Function Teste() // cria dilogo Local oDlg:=MSDialog():New(10,10,300,300,Meu dialogo,,,,,CLR_BLACK,CLR_WHITE,,,.T. ) // ativa dilogo centralizado oDlg:Activate(,,,.T.,{ msgstop(validou!),.T.},,{ msgstop(iniciando) ) Return tButton Classe de boto. Hierarquia tSrvObject -> tControl -> tButton Reservado. Reservado. Reservado. Reservado. Objeto, opcional. Janela me da janela a ser

O Dilogo criado.

Descrio Utilize a classe tButton para criar um controle visual do tipo boto. Propriedades Nome Tipo / Descrio

lProcessing Lgico. Se .T. indica o boto est efetuando uma ao. bAction Mtodos New Descrio Mtodo construtor da classe. Bloco de cdigo. Executado quando o boto pressionado.

New([anRow], [anCol], [acCaption], [aoWnd], [abAction], [anWidth ], [anHeight], Sintaxe [nPar8], [aoFont], [lPar10], [alPixel],[lPar12],[cPar13], [lPar1 4], [abWhen], [bPar16], [lPar17]) Parmetro Tipo / Descrio anRow carateres. anCol u caracteres. acCaption Caractere, opcional. Titulo do boto. aoWnd er ser criado. Bloco de cdigo, opcional. Bloco que dever ser acionad o quando o boto abAction for pressionado. Parmetros anWidth anHeight nPar8 s da fonte utilizada para aoFont o ttulo do boto. lPar10 sadas em pixels, se alPixel .F. (padro) considera em caracteres. Reservado. Lgico, opcional. Se .T. considera as coordenadas pas Numrico, opcional. Largura do boto em pixels. Numrico, opcional. Altura do boto em pixels. Reservado. Objeto, opcional. Objeto tipo tFont com propriedade Objeto, opcional. Janela ou controle onde o boto dev Numrico, opcional. Coordenada horizontal em pixels o Numrico, opcional. Coordenada vertical em pixels ou

lPar12 cPar13

Reservado. Reservado. 329

----------------------- Page 330----------------------lPar14 oco de entrada abWhen foi criado. O bloco litado ou .F. se no. bPar16 lPar17 Exemplo #include protheus.ch User Function TesteGet() Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3} cCombo:= aItems[2] DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo oCombo:= tComboBox():New(10,10,{ u if(PCount()>0,cCombo:=u,cCombo)},; aItems,100,20,oDlg,,{ MsgStop(Mudou item)},,,,.T.,,,,,,,,,cCombo) // Boto para fechar a janela oButton:=tButton():New(30,10,fechar,oDlg,{ oDlg:End()},100,20,,,,.T.) ACTIVATE MSDIALOG oDlg CENTERED MsgStop( O valor +cCombo ) Return NIL ------------------------------/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ /\/\/\/\-------------------------Instalao de Servios AP6 e AP5 no mesmo Servido 1-Tire do ar o AP5 Server que est como console (CTRL-BREAK); 2-Pare o servio do AP6 Server que est automtico no Win2000 Server; 3-Remova o servio do AP6 Server chamado pelo iniciar / executar o AP6SVR com a clu sula "-remove" Reservado. Reservado. de dados est sendo efetuada na janela onde o controle deve retornar .T. se o controle deve permanecer habi Reservado. Bloco de cdigo, opcional. Executado quando mudana de f

4-Inclua no INI do AP5SVR a clusula [Service] name=AP5 Displayname=AP5 5-Inclua no INI do AP6SVR a clusula [Service] name=AP6 Displayname=AP6 6-Suba o servio do AP6SVR a partir de iniciar / executar com a clusula "-install" 7-Suba o servio do AP5SVR a partir de iniciar / executar com a clusula "-install" Se subir legal os dois, confirme pelo service do Win2000 que ambos esto no ar, st artados e como automticos. 330 ----------------------- Page 331-----------------------

Se no der certo, volte situao original, ou seja, AP6SVR automtico como servio e AP5S R como console. Integrao Siga Advanced - Office

Atravs do Office Kit, encontrado no CD de instalao da verso 407 em diante, o Siga oferece integrao com os aplicativos do pacote Office da Microsoft. importante lemb rar que o Siga Advanced possu integrao somente com o Excel e que a integrao com o Word est disponve somente para o mdulo de Controle de Documentos do Siga Quality Celerina. Instalao Para instalar o SIGA Advanced for Windows com Microsoft Excel, o usurio deve poss uir: Hardware Configurao mnima: Pentium 133 com 16 MB RAM, recomendado Pentium 166 com 32 MB RAM. Microsoft Excel A verso mnima 7.0 (95), recomendado o uso da verso 8.0 (97) 1. 2. Execute o programa de instalao do SIGA Advanced. Instale o SIGA Office Kit nas estaes. Observaes 1. A instalao do Office Kit deve ser feita em todas estaes que iro utilizar a integrao. 2. A MICROSIGA envia dois arquivos exemplos de Planilha Excel, ADVD EMO e ADVDEMO7, para serem utilizados nas verses Excel 97 e Excel 95, respectivame as

nte. Estes arquivos so instalados no diretrio X:\Arquivos de Programa \ SIG A Advanced Office Kit \ Samples (onde X: drive onde est instalado o SIGA Advanced). Utilizando a Integrao Pode-se acessar o Microsoft Excel SIGA Advanced, com exceo do SIGACFG (Configurador ). 1. a partir de qualquer Mdulo

Escolha a opo Planilha Excel no menu Miscelnea. Se for o primeiro acesso ao Microsoft Excel atravs do Siga Advanced, ser soli citado o diretrio onde est o executvel do Microsoft Excel, essa configurao ser gr avada no arquivo ADV97BRW.INI. Esse processo deve ser realizado em cada estao que for utilizar o SIGA Advanc ed for Windows com o Microsoft Excel. 2. Clique sobre o boto "OK" para iniciar o Microsoft. Excel. Aps a inicializao do Microsoft Excel, a conexo pode ser cancelada atravs do SIGA Advanced, clicando no b oto Cancelar, ou fechando o Microsoft Excel. OBS: . A integrao somente funcionar se o Excel for aberto a partir do Siga Advanced Usando as funes do Siga no Excel Existem 4 formas de se utilizar as funes do SIGA Advanced em uma planilha Excel. V eja a seguir: 331 ----------------------- Page 332-----------------------

1. Este procedimento recomendado para usurios menos experientes, pois o Microso ft Excel abre uma janela assistente para que sejam informados os parmetros, facilitando o uso de referncia a outras clulas. Clique na clula que deve receber o resultado da funo SIGA Advanced e selecione a opo "Funes" no menu Inserir. No lado esquerdo da janela so relacionadas as categorias de funes disponveis. Selecione a categoria de funes "Definidas pelo usurio". Na caixa de listagem Nome da Funo , selecione a funo que ser utilizada. Ser ap da uma janela Assistente, onde devem ser informados os parmetros da funo, conform e solicitado e definido pela sua sintaxe. Informe os parmetros da funo e clique no boto "OK" para finalizar. 2. Outra forma de se utilizar as funes SIGA, digitando a funo diretamente na clula. Esta forma no conta com o assistente, e portanto, o usurio deve conhecer a sintaxe

da funo para informar corretamente seus parmetros (recomendada apenas para usurios mais ex perientes). Para a informao de uma frmula no Excel, deve-se digitar o sinal de igual =. 3. o A terceira forma utilizar a funo SIGA( ) para identificar incio da informao de funes SIGA Advanced. Para tanto, deve ser usada a seguinte sintaxe: SIGA("nome da funo"; 1 parmetro da funo; 2 parmetro da funo;...) Por exemplo, informando: =SIGA("MesExtenso";2) Desta forma, ser retornado o ms Fevereir Observe que o nome da funo SIGA Advanced informado entre aspas. (" "). 4.

o.

A quarta forma, tambm iniciar a informao com a funo Siga( ), porm as funes Advanced, juntamente com seus parmetros, devem ser digitados e ntre aspas, obedecendo a sintaxe padro que utiliza os sinais de parnteses. Por exemplo: =SIGA(MesExtenso(2)) Cuidados com a utilizao de funes O Microsoft Excel utiliza um padro de data diferente do SIGA Advanced, por esse m otivo qualquer funo de planilha do Advanced utilizada a partir do menu Inserir Frmula do Microsoft Excel ou da sintaxe =Siga(nomefuno; Par01;Par02) que utilize data como parmetro ou retor ne uma data, deve obedecer as regras abaixo:

Formatar a clula como data, para as funes que retornem data. Utilizar como parmetro das funes do SIGA Advanced uma referncia de clula cujo con edo seja uma data, ou digitar a data no formato do Microsoft Excel 00:00 10/05/9 8.

Toda funo do SIGA Advanced utilizada a partir do menu Inserir Frmula do Microsoft Exc el ou da sintaxe =Siga(nomefuno;Par01;Par02) que utiliza valor lgico (.T./.F.) como p tro, deve obedecer o padro do Microsoft Excel (ateno! com o idioma do Microsoft Excel): .T. - VERDADEIRO/TRUE .F. - FALSO/FALSE

Se ao executar uma funo SIGA Advanced, o Excel retornar o erro "#VALOR" ou a mensa gem As funes do SIGA Advanced no constam na lista de funes definidas pelo usurio verifique os seguintes tpicos para solucionar: Tenha certeza de que o Excel foi iniciado a partir do SIGA Advanced. Atravs da opo "Suplementos" do Menu "Ferramentas" do Excel, utilize o boto "Procu rar" para localizar o "Add In" do SIGA Advanced (AdvXla80.XLA para a verso 8.0 ou AdvX la para verso 7.0 do Excel, que esto no diretrio de Bibliotecas do Office). ExecBlocks

Pode-se utilizar Execblock nas clulas do Microsoft Excel com algumas restries: No devem ser utilizadas entradas de dados ou qualquer outro tipo de Tela. O Execblock deve obrigatoriamente retornar um valor. O Execblock deve ser pequeno para evitar a perda da conexo do SIGA Advanced co m o Microsoft Excel. 332 ----------------------- Page 333----------------------A varivel que recebe o parmetro passado pelo Excel sempre PARAMIXB, que deve ser tratada dentro do execblock. Caso seja necessrio utilizar mais de um parmetro no programa, ele j deve vir do Excel concatenado em uma nica String. Sintaxe: =EXECBLOCK(Nome da funo,PAR1) O Rdmake utilizado no ExecBlock deve estar dentro do diretrio Sigaadv da base que est sendo utilizada para chamar o Excel e j estar compilado. a Funes Genricas POSICIONE Posiciona o arquivo em um determinado registro. Sintaxe: Posicione(ExpC1, ExpN1, ExpC2, ExpC3) onde: ExpC1 - Alias do arquivo ExpN1 - Ordem utilizada ExpC2 - Chave pesquisa ExpC3 - Campo a ser retornado Ex.: Posicione(SA1,1,xFilial(SA1)+001,A1_NOME) MEDIA Calcula a taxa mdia de uma determinada moeda em um ms especfico. Sintaxe: Media (ExpN1, ExpN2, ExpN3) onde: ExpN1 - Moeda a ser calculada a mdia ExpN2 - Ms a ser calculado ExpN3 - Ano a ser calculado Ex.: Media (2,10,94) Caso o ms e o ano no sejam passados como parmetros sero assumidos o ms e ano da database. SOMAR Faz o somatrio de um arquivo, retornando o valor acumulado de um campo determinado. Sintaxe: Somar(ExpC1, ExpC2, ExpC3) onde: ExpC1 - Alias do arquivo ExpC2 - Condio para soma ExpC3 - Campo a ser somado Ex.: Somar(SI1",I1_CLASSE= S ,I1_SALANT) Caso o usurio no deseje definir nenhuma condio, a ExpC2 deve ser .T.. GRUPO

Retorna o somatrio das clulas pertencentes a um determinado grupo. Sintaxe: Grupo(ExpC1) onde: ExpC1 - Grupo a ser somado Ex.: Grupo(1) CONTAR Conta o nmero de registros de acordo com a condio determinada. Sintaxe: Contar(ExpC1, ExpC2) onde: ExpC1 - Alias do arquivo ExpC2 - Condio para a contagem Ex: Contar(SC1,C1_DATPRF < dDataBase) F unes Contbeis 333 ----------------------- Page 334----------------------SALDO Devolve o saldo de uma determinada conta. Sintaxe: Saldo(ExpC1, ExpN1,ExpN2) onde: ExpC1 - Cdigo da Conta ExpN1 - Perodo do saldo desejado ExpN2 - Moeda desejada para obteno do saldo. Ex.: Saldo(11101,12,1) MOVIMENTO Devolve o movimento (dbito-crdito) de uma determinada conta. Sintaxe: Movimento(ExpC1,ExpN1,ExpN2,ExpD1) onde: ExpC1 - Cdigo da conta ExpN1 - Ms do movimento desejado ExpN2 - Moeda desejada para obteno do movimento ExpD1 - Data do exerccio desejado Ex.: Movimento(43,1,1, CTOD ("01/01/95") : retorna o 1 perodo Movimento(`43,1,1,CTOD(01/01/96) : retorna o 13 perodo DEBITO Devolve o valor a dbito de uma determinada conta. Sintaxe: Debito(ExpC1, ExpN1, ExpN2) onde: ExpC1 - Cdigo da Conta ExpN! - Ms do movimento desejado ExpN2 - Moeda desejada para obteno do valor a dbito Ex.: Debito(11103,03,1) CREDITO Devolve o valor a crdito de uma conta. Sintaxe: Credito(ExpC1, ExpN1, ExpN2) onde: ExpC1 - Cdigo da Conta

ExpN1 - Ms do movimento desejado ExpN2 - Moeda desejada para obteno do valor a crdito Ex.: Credito(11103,03,1) SOMAMOVIM Retorna o movimento dentro de um intervalo de contas analticas Sintaxe: SomaMovim(ExpC1, ExpC2, ExpN1, ExpN2) onde: ExpC1 - Cdigo da conta De ExpC2 - Cdigo da conta At ExpN1 - Referente ao ms Exp N2 - Moeda desejada para obteno do valor Ex.: SomaMovim(41304,41305,12,1) SOMASALDO Retorna o saldo atual entre um intervalo de contas. Sintaxe SomaSaldo(ExpC1, ExpC2, ExpN1, ExpN2) onde: ExpC1 - Cdigo da conta De ExpC2 - Cdigo da conta At ExpN1 - Referente ao perodo ExpN2 - Moeda desejada para obteno do valor Ex.: SomaSaldo(31001,31010,12,1) ORADO Retorna o valor orado de uma conta.. Sintaxe Orcado(ExpC1, ExpN1, ExpN2, ExpD1) onde: ExpC1 - Cdigo da conta De 334 ----------------------- Page 335----------------------ExpN1 - Referente ao perodo ExpN2 - Moeda desejada para obteno do valor ExpD1 - Data para converso (em formato data ou caracter), caso no informa-da, ser utilizada a DataBase do sistema. Ex.: Orcado(11102001,1,1) MESEXTENSO Devolve o nome do ms por extenso. Sintaxe: MesExtenso(ExpX1) onde: ExpX1 - Poder ser enviado o nmero de um ms, tanto do tipo caracter como numrico, ou poder ser enviada uma data. Caso nada seja informado, ser devolvido o nome do ms referente a Data Base. Ex.: MesExtenso(01) VARIAO Retorna a variao em percentual entre dois valores. Sintaxe: Variao(ExpN1, ExpN2) onde: ExpN1 - Primeiro fator comparativo ExpN2 - Segundo fator comparativo Ex.: Variacao(100000,50000) MOVIMCC Retorna o movimento de um centro de custo mais conta contbil (extracontbil).

Sintaxe: MovimCC(ExpC1, ExpC2, ExpN1, ExpN2) onde: ExpC1 - Cdigo do centro de custo ExpC2 - Cdigo da conta contbil ExpN1 - Referente ao ms ExpN2 - Moeda desejada para obteno do valor Ex.: MovimCC(3001, 111001,Month(Ddatabase),1) ORCADOCC Recupera o valor orado da Conta x Centro de Custo para utilizao na planilha. Sintaxe: OrcadoCC(ExpC1,ExpC2,ExpN1,ExpN2,ExpD1), onde: ExpC1 - Conta ExpC2 - Centro de Custo ExpN1 - Perodo (default ms da database) ExpN2 - Moeda (default 1) ExpD1 - Data para converso se moeda de 2 a 5 - (default dDataBase). Ex.: OrcadoCC( 111001,3001,3,2) SUMMOVIMCC Retorna o movimento de um intervalo de centro de custos extracontbeis. Poder ser parametrizados tambm um grupo de contas. Sintaxe: SumMovimCC(ExpC1,ExpC2,ExpC3,ExpC4,ExpN1,ExpN2) onde: ExpC1 - do Centro de Custo ExpC2 - at Centro de Custo ExpC3 - da Conta ExpC4 - at a Conta ExpN1 - Ms (default ms da database) ExpN2 - Moeda (default 1) Ex.: SumMovimCC( 3001,3100,31001,31010,12,1) GRAVAORCADO Permite que um determinado valor calculado pela planilha seja gravado no Arquivo de Oramentos. Sintaxe: GravaOrcado(ExpC1,ExpN1,ExpN2,ExpN3) onde: 335 ----------------------- Page 336-----------------------

ExpC1 - Conta Contbil a ser orada ExpN1 - Nmero da clula onde o valor estar contido ExpN2 - Ms a ser orado (se nulo, ser ms corrente) ExpN3 - Moeda a ser orada (se nula, ser moeda nacional) Por exemplo: Obtm-se um valor na clula 022 referente conta 11102001, do que este dever ser orado na contabilidade para o ms 07 e na moeda 1. Para tanto, cria-s m outra clula a seguinte frmula: GravaOrcado(11102001,#022,7,1) Uma grande vantagem deste recurso que caso a planilha seja recalculada e o valor alterado, o valor

orado ser automaticamente atualizado. Esta funo ir devolver planilha o contedo <<< >>> Para inibir a impresso destas clulas, basta acessar as suas propriedades e desabil itar a visibilidade. SALDOCUSTO Calcula o saldo dos centro de custos extracontbeis. Sintaxe: SaldoCusto(ExpC1,ExpC2,ExpC3,ExpC4,ExpN1,ExpN2) onde: ExpC1 - Centro de Custo Inicial ExpC2 - Centro de Custo Final ExpC3 - Conta Inicial ExpC4 - Conta Final ExpN1 - Ms (se nula, assume o ms de referncia da database) ExpN2 - Moeda (se nula, ser assumido 1 ) Ex.: SaldoCusto(1007, 1099, 3, 4, 10, 1)

SOMACONTAS Retorna o saldo acumulado de um grupo de contas, de acordo com a sintaxe apresen tada. Esta funo considera somente contas de classe A analtica Sintaxe: SomaContas(ExpC1,ExpN1,ExpN2) onde: ExpC1 - Lista de contas, cercada por aspas (). O Separador : (dois pontos) forma intervalo de contas De - At. O separador , (vrgula) , informa separao de contas. ExpN1 - Ms (default ms da database) ExpN2 - Moeda (default 1) Exemplos: SomaContas(11101001,3,1) Devolve o saldo da conta em questo no ms 3 na moeda 1. SomaContas(11101001,11101002,11102237) Devolve a soma dos saldos das contas em questo. SomaContas(11101001:11102,31101001) Devolve a soma dos saldos das contas 11101001 at 11102 mais o saldo da conta 3110 1001. Funes Financeiras SLDBCO Retorna o saldo bancrio em uma data. Sintaxe: SldBco(ExpC1,ExpC2,ExpC3,ExpD1,ExpN1) onde: ExpC1 - Cdigo do Banco ExpC2 - Agncia Bancria ExpC3 - Conta Bancria ExpD1 - Data do Saldo ExpN1 - Moeda do Saldo Bancrio Ex.: SldBco(409,00198,011122, dDataBase,1) SLDRECEBER Retorna o saldo a receber em uma data. Sintaxe: SldReceber(ExpD1,ExpN1,ExpL1) onde: ExpD1 - Data do Movimento a Receber. ExpN1 - Moeda - Default 1

ExpL1 - Se .T. At a Data, .F. Somente Data (o padro .T.) Ex.: SldReceber(Data,1,.T.) 336 ----------------------- Page 337----------------------SLDPAGAR Retorna o saldo a pagar em uma determinada data. Sintaxe: SldPagar(ExpD1,ExpN1,ExpL1) onde: ExpD1 - Data do Movimento a Pagar ( padro dDataBase) ExpN1 - Moeda (padro 1) ExpL1 - Se .T. At a Data, .F. Somente Data (padro .T.) Ex.: SldPagar(dDataBase,1,.T.) SLDCLIENTE Retorna o saldo a receber do cliente em uma determinada data. Sintaxe: SldCliente(ExpC1,ExpD1,ExpN1,ExpL1) onde: ExpC1 - Cliente+Loja ExpD1 - Data do Movimento a Receber (padro dDataBase) ExpN1 - Moeda ExpL1 - Se .T. considera o saldo do SE5 (padro .T.) Ex.: SldCliente(00000101,dDataBase) SLDFORNECE Retorna o saldo a pagar do fornecedor em uma data Sintaxe: SldFornece(ExpC1,ExpD1,ExpN1,ExpL1) onde: ExpC1 - Fornecedor+Loja ExpD1 - Data do Movimento a Pagar (padro dDataBase) ExpN1 - Moeda - (padro 1) ExpL1 - Se .T. considera o saldo do SE5 (padro .T.) Ex.: SldFornece(00000101") FINNATPRV Retorna o valor previsto de cada natureza. Sintaxe: FinatPrv(ExpC1,ExpD1,ExpD2,ExpN1) onde: ExpC1 - Natureza a ser Pesquisada ExpD1 - Data Inicial para clculo ExpD2 - Data Final de clculo ExpN1 - Moeda de Sada Ex.: FinNatPrv(R001,CtoD(01/01/98),dDataBase,1) FINNATREA Retorna o valor realizado da Natureza. SintaxeFinNatRea(ExpC1,ExpD1,ExpD2,ExpN1) onde: ExpC1 - Natureza a ser Pesquisada ExpD1 - Data Inicial para clculo ExpD2 - Data Final de clculo ExpN1 - Moeda de Sada

Ex.: FinNatRea(R001,CtoD(01/01/98),dDataBase,1) FINNATORC Retorna o valor orado da natureza. Sintaxe: FinNatOrc(ExpC1,ExpN1,ExpN2) onde: ExpC1 - Natureza a ser Pesquisada ExpN1 - Ms para clculo ExpN2 - Moeda de Sada Ex.: FinNatOrc(R001,10,1) 337 ----------------------- Page 338----------------------ROTEIRO PARA INSTALAO DO TOPCONNECT COM SQL/SERVER 7.0 MICROSOFT : O ice Windows NT 4.0 deve ser Pack atualizado(caso possua da verso em ingls e Ter o serv

estaes Workstation as recomendaes de service pack atualizado deve ser aplicado na estao). Na instalao do SQL et/sort order/Unicode de ser selecionada a opo Custom Character S

Collation/Character Set: 1252/ISO CHARACTER SET (DEFAULT) SORT ORDER: BINARY ORDER E UNICODE COLLATION/LOCALE IDENTIFIER:BINARY ORDER No "Query Analyzer"(Ferramenta do SQL/Server 7.0) executar SP_HELPSORT, para ver ificar se o SQL, est Configurado como Binary Order (Sort Order = 50, bin_iso_ ), caso no este ja DEVER SER REFEITA A INSTALAO DO SQL SERVER. Acessar a Ferramenta Enterprise Manager do no servidor SQL destinado Microsoft SQL/Server 7.0,

para o Siga, abrir a rvore indicada pelo sinal de "+" ao lado esquerdo deste S erver. er Abrir a pasta Databases, clique com Database e escolha New o o boto direito sobre qualqu

Database. Onde lo com o tamanho

Nome deste Database, por exemplo, ser DADOSADV, cria, e em TRANSACTIO

previamente definido e demais parametros default LOG ser definido a rea

destinada a Log e o ideal que seja em outro disco (NO OUTRA PARTIO) diferente do que estiver armazenado o DATABASE, finido. Ex.: DATABASE o tamanho tambm dever ser previamente de

500MB e em TRANSACTION LOG 150MB. Em PROPERTIES/OPTIONS do DATABASE a opo "Truncat Log on Checkpoint", tem a funo de estratgia de Backup, se a empresa optar por efetuar Backup`s de Log, tal opo poder ficar desmarcada. Agora entre em Security e em Logins, e com o boto direito sobre qualquer outro lo gin, escolha New Login, seguindo o exemplo, Server authentication Password = SIGA, Server Roles marcar a BASE ACCESS atribuir opo Nome = SIGA, ativar o e SQL em DATA

SYSTEM

ADMINSTRATORS

permisses (permit) para o database criado, no caso DADOSADV. A parte do SQL Server est pronta. Agora resta apenas a configurao do TOPConnect Man ager e do SigaAdv. Instalar o TOPConnect, e aps o termino do Install, encerrar todos os servio e rein iciar o Servidor, Caso o processo TOPConnect_2, deve ser seja de Atualizao do TOPConnect_1 para

efetuada a remoo do TOPConnect_1(e o que for referente ao topconnect) atravs de Adicionar e Remover Programas que est NT, antes de Instalar o TOPConnect_2. Topconnect_2 / Em Propriedades SQL Server Setup : Name Pconnect o TOPConnect e o SQL no estar trafegando na Rede], NEXT>. Marcar a opes () With SQL Server authentication using a login ID .... e [] Connect to SQL Server to obtain default setings .... Login ID : SIGA , Password .:SIGA. XT> Marcar.: [] Database criado Change the default para o Siga) e database to: ( Selecionar o NE = TOPSQL, SERVER=(nome esteja no mesmo de Ambiente. Configurao )[ Caso do o TO ODBC no Painel de Controle do Windows

do servidor

servidor que o SQL/Server deve-se manter a opo LOCAL Desta forma a conexo entre

desmarcar as opes and warnings . NEXT>.

[] Use ANSI quoted e [] Use ANSI Translation for

nulls, paddings character data, e

Prxima tela marcar [] Perform os demais parametros sero

marcados deacordo com a poltica de administrao do Banco. Selecionar na Barra de Ferramentas do Topconnect o cone = a uma Chave ( ou Editar Licenas), para que possa ser detectado o n m o suporte Topconnect (CLIENTE DEVER ATENDIMENTO DO DISK338 ----------------------- Page 339----------------------a SIGA.: (0xx11)3981-7100)para quantidade de usurios adquiridos. SIGA ADVANCED 4.07 : No diretrio Sigaadv\WINSQL, existe um arquivo chamado ADV97 .INI. Edite-o, os parmetros corretos para o SigaAdv com SQL Server so: Database = MSSQ L7, Alias = TOPSQL, Contype = NPIPE, Server = NOME do servidor NT com o TOPConnect. AP5 : Localizar em AP5\BIN dever ser configurado o arquivo AP5SRV.ini e edita-lo, neste arquivo obter a chave de acesso conforme

a clausula [TOPCONNECT] como segue o exemplo conformo o padro adotado neste rot eiro: [TopConnect] DataBase=MSSQL7 Server= *nome do servidor ou o endereo IP do servidor ALIAS=TOPSQL Contype=NPIPE o DBF2SQL, o DBF2SQL.INI. O Alias tem que ser igual MSSQL7/TOPSQL, neste exemplo . Est pronta toda sua configurao. CASO seja necessrio que o" SQL SERVER deva estar em UM SERVIDOR NT E ou Contype=TCPIP *dependendo da opo do Server.

Caso seja necessrio a migrao de base DBF para o Banco verifique, antes de executar

de srie, da mquina e assim entrar em contato co ENTRAR EM CONTATO COM O

TOPCONNECT EM OUTRO NT". No 1 Instalar o SQL SERVER. No 2 instalar o client do SQL e o topconnect, e aponta r o client para a 1 mquina, o TOPCONNECT deve apontar para o SQL Server (1 er

indicar o nome do servidor da 2 mquina, aonde o Topconnect est instalado. ftp://ftp.microsiga.com.br/topconnect/nt ect_2. - Download Instalador do TOPConn

1.1. Ambiente Desejvel para uma instalao de 25 usurios: Servidor Windows NT 4.0 com TopConnect, s MsSql/Oracle/Informix/..., SigaAdvanced/AP5. - Memria - Discos is adaptadores para ara base de dados grandes (com mais de 1GB de dados) recomen damos um Disk Array do tipo Raid-5 de 4 com memria de 256 a 512 para cache de leitura. - Processador m 512 de cache. - Rede cascatear Hubs) = 2 processador Pentium III Xeon 500mhz co = Adaptador de 100 mbits, utilizar swite(no Discos de 9GB = 512 MB ou mais = 2 discos SCSI com 9GB de 80mbit/s com do garantir acesso simultaneo dos discos. P Banco de dado

ROTEIRO PARA INSTALAO DO TOPCONNECT MSSQL 2000 Processo de instalao do SQL 2000 Criao de Instance. 1. 2. SQL SERVER 2000 COMPONENTS INSTALL DATABASE SERVER Locall Server Create a New Instance of SQL Server or Install Client Tools Server and Client Tools 339

mquina) o ADV97.INI dev

----------------------- Page 340----------------------ult., caso pemanea marcado, ser criado uma instace como .0. Na proxima selecionar o local opo selecionar para a a forma Custom, que permitirar er no SQL 7

A proxima opo ir definir a criao de uma Instance para isto desmarque a opo

instalao do banci e marcar os componentes a serem instalados. SERVICES ACCOUNTS Selecionar a forma que o Sql ira Startar. Ex: Service Settings Use The Local System Account AUTHEMTICATION MODE Windows Authentication Mode COLLATION SETTINGS Sql collations Binary order, for use with the 437 (U.S.English) C haracter Set. NETWORK LIBARIES <next> START COPYING FILES <next> Segue o resultado do Query Analyzer Latin1-General, binary 437 for nonUnicode Data er Acessar 2000, a Ferramenta no servidor Enterprise SQL Manager do Microsoft SQL/Serv ao executar o sp_helpsort :

sort for Unicode Data, SQL Server Sort Order 30 on Code Page

destinado para o Siga, abrir a rvore indicada pelo sinal de "+" ao lado esquer do deste Server. er Abrir a pasta Databases, clique com Database e escolha New o o boto direito sobre qualqu

Database. Onde lo com o tamanho

Nome deste Database, por exemplo, ser DADOSADV, cria, e em TRANSACTIO

previamente definido e demais parametros default LOG ser definido a rea

destinada a Log e o ideal que seja em outro disco (NO OUTRA PARTIO) diferente do que estiver

armazenado o DATABASE, finido. Ex.: DATABASE

tamanho

tambm dever

ser previamente

de

500MB e em TRANSACTION LOG 150MB. Em PROPERTIES/OPTIONS do DATABASE a opo "Truncat Log on Checkpoint", tem a funo de estratgia de Backup, se a empresa optar por efetuar Backup`s de Log, tal opo poder ficar desmarcada. Agora entre em Security e em Logins, e com o boto direito sobre qualquer outro lo gin, escolha New Login, seguindo o exemplo, Server authentication Password = SIGA, Server Roles marcar a BASE ACCESS atribuir opo Nome = SIGA, ativar o e SQL em DATA

SYSTEM

ADMINSTRATORS

permisses (permit) para o database criado, no caso DADOSADV. A parte do SQL Server est pronta. Agora resta apenas a configurao do TOPConnect Man ager e do SigaAdv. Instalar o TOPConnect, e aps o termino do Install, encerrar todos os servio e rein iciar o ra Servidor, Caso TOPConnect_2, o processo deve ser seja de Atualizao do TOPConnect_1 pa

efetuada a remoo do TOPConnect_1(e o que for referente ao topconnect) atravs de A dicionar e Remover Programas que est no NT, antes de Instalar o TOPConnect_2. Topconnect_2 / Server Setup Name connect o TOPConnect e o SQL no estar trafegando na Rede], NEXT>. Marcar a opes () With SQL Server authentication using a login ID .... e [] Connect to SQL Server to obtain default setings .... Login ID : SIGA , Password .:SIGA. XT> NE = Em Propriedades : de Ambiente. do Configurao do ODBC o TOP SQL Painel de Controle do Windows

TOPSQL, SERVER=(nome esteja no mesmo

servidor )[ Caso

servidor que o SQL/Server deve-se manter a opo LOCAL Desta forma a conexo entre

Marcar.: [] Database criado

Change the default para o Siga) e

database

to:

Selecionar o nulls, paddings a

desmarcar as opes nd warnings . NEXT>.

[] Use ANSI quoted e [] Use ANSI

340 ----------------------- Page 341----------------------Prxima tela marcar [] Perform os demais parametros sero Translation for character data, e

marcados deacordo com a poltica de administrao do Banco. Selecionar na Barra de Ferramentas do Topconnect o cone = a uma Chave ( ou Editar Licenas), para que possa ser detectado o n m o suporte Topconnect ATENDIMENTO a (CLIENTE DO DEVER DISKobter

SIGA.: (0xx11)3981-7100)para quantidade de usurios adquiridos.

No o, os

diretrio AP5\BIN, existe parmetros corretos

para O PROTHEUS com SQL Server so: Database = MSSQL7, Alias = TOPSQL, Contype = NPIPE, Server = NOME do servidor NT com o TOPConnect. ftp://ftp.microsiga.com.br/topconnect/nt para TOPConnect e das atualizaes do TOPConnect_2. RELAO DE ERROS DO TOPCONNECT Constant Name: TCF_NoError Value: 0 Meaning: A Chamada da Funo no foi completada como desejada. -------------------------------------------------------------------------------Constant Name: TCF_NoRouterInstalled Value: -1 - Download de executveis

de srie, da mquina e assim entrar em contato co ENTRAR a EM chave de CONTATO acesso COM conforme O

CLIENTE SIGAADVANCED um arquivo chamado AP5SRV.INI. Edite-

Meaning: Voc est tentado executar a funo TC_Connect sem ter uma camada de comunicao. Recovery: Voc necessita ter um Appc ou TCP/IP router disponvel -------------------------------------------------------------------------------Constant Name: TCF_NoConnection Value: -2 Meaning: Voc est tentado executar uma funo sem estabelecer conexo previa. Recovery: Execute a funo do TC_Connect -------------------------------------------------------------------------------Constant Name: TC_NoUserSecurity Value:-4 Meaning: Voc necessita fornecer um user+password vlido com o TC_Setuser Recovery: -------------------------------------------------------------------------------Constant Name: TCF_No_More_Connections 341 ----------------------- Page 342----------------------Value: -6 Meaning: No H mais conexes disponveis. Recovery: Feche uma das conexes e tente nova conexo. -------------------------------------------------------------------------------Constant Name: TCF_ScanTableError Value: -7 Meaning: H uma diferena entre o formato do registro corrente que o AS/400 arquiva e o formato digitado na PC Table. Recovery: Obtenha o registro do formato AS/400 para o arquivo usando no programa do TClient, e check a tabela -------------------------------------------------------------------------------Constant Name: TCF_InvalidFile

Value: -10 Meaning: Voc est tentando abrir um arquivo que no pod ser encontrado Recovery: Verifique se o arquivo est na biblioteca indicada sobre abertura -------------------------------------------------------------------------------Constant Name: TCF_UnknownFile Value: -11 Meaning: Voc est tentando abrir um arquivo que no est associado com um processo no A S/400. Recovery: Verifique o identifier de tabela utilizado em abertura. -------------------------------------------------------------------------------Constant Name: TCF_InvalidProgram Value: -12 Meaning: O programa pode ser encontrado. especificado na funo do TC_Call no

Recovery: Verifique a localizao do Nome do programa. -------------------------------------------------------------------------------Constant Name: TCF_InvalidOperation Value: -13 Meaning: O programa est utilizando uma funo invalida. Recovery: Cheque a existncia da funo. -------------------------------------------------------------------------------Constant Name: TCF_InvalidKeyNum Value: -14 Meaning: Voc tem especificado um nmero de campo chave maior que o arquivo, como um a funo de acesso chave. Recovery: Veja o valor de parmetro do n_keys 342 ----------------------- Page 343-----------------------

-------------------------------------------------------------------------------Constant Name: TCF_TooManyFiles Value: -16 Meaning: Voc est tentando abrir um arquivo, o servidor excedeu. mas o nmero de mximo de arquivos a

Recovery: Feche um dos arquivos abertos e tente abrir o arquivo outra vez. -------------------------------------------------------------------------------Constant Name: TCF_InvalidNumRecs Value: -17 Meaning: Um nmero negativo k_or_count da operao multiple-read est especificado no parmetro do loc

Recovery: Verifique o valor de parmetro do Lock_or_count da operao multiple-read. -------------------------------------------------------------------------------Constant Name: TCF_CallFailed Value: -18 Meaning: O programa que chamou a funo do TC_Call falhou. Recovery: Consulte no AS/400 as mensagens de erro. -------------------------------------------------------------------------------Constant Name: TCF_CommandFailed Value: -19 Meaning: O comando do OS/400 chamado na funo do TC_Call Falhou. Recovery: Consulte no AS/400 as mensagens de erro. -------------------------------------------------------------------------------Constant Name: TCF_OverrideFailed Value: -20 Meaning: O OVRDBF comando de OS/400 est falhando na abertura o arquivo. Recovery: Consulte no AS/400 as mensagens de erro. --------------------------------------------------------------------------------

Constant Name: TCF_QueryFailed Value: -21 Meaning: Um erro foi produzido no OPNQRYF ou no comando SELECT do AS/400 Recovery: Consulte no AS/400 as mensagens de erro. -------------------------------------------------------------------------------Constant Name: TCF_OpenFailed Value: -23 Meaning: O arquivo no pode ser aberto. 343 ----------------------- Page 344----------------------Recovery: Consulte no AS/400 as mensagens de erro. -------------------------------------------------------------------------------Constant Name: TCF_NotOpened Value: -24 Meaning: Voc est tentando uma operao com um arquivo que no est aberto. Recovery: Verifique se o arquivo foi aberto apropriadamente. -------------------------------------------------------------------------------Constant Name: TCF_NoRecordFound Value: -25 Meaning: O registro solicitado no pode ser encontrado como uma funo de acesso ao ca mpo chave. Recovery: Verifique os valores do campo chave no registro. -------------------------------------------------------------------------------Constant Name: TCF_EndOfrecords Value: -26 Meaning: Voc chegou no fim do arquivo ou o fim de registros que esto em Read_Multi ple. Recovery: Esta uma mensagem consultiva

-------------------------------------------------------------------------------Constant Name: TCF_NoWritePossible Value: -27 Meaning: Voc no pode incluir um novo registro no arquivo. Recovery: Verifique o valor da chave de ndice pode estar tentado escrever um registro com uma chave duplicada ou database est cheio. em registro. Voc

-------------------------------------------------------------------------------Constant Name: TCF_NoRecordEqual Value: -28 Meaning: No H registro pertencendo chave especificada na funo do TCF_ReadE. Recovery: Verifique o valor das chaves de ndice em registro. -------------------------------------------------------------------------------Constant Name: TCF_UpdateFailed Value: -29 Meaning: Voc no pode criar registro no arquivo. Recovery: Verifique a chave utilizada na criao, e assegure que o registro no esteja Locado. -------------------------------------------------------------------------------Constant Name: TCF_DeleteFailed Value: -30 344 ----------------------- Page 345----------------------Meaning: Voc no pode deletar o registro no arquivo. Recovery: Verifique a chave utilizada, e assegure que o registro no est Locado. -------------------------------------------------------------------------------Constant Name: TCF_RecordLocked Value: -31

Meaning: O registro est locado por outra tarefa. Recovery: Verifique qual a tarefa que no est liberando o registro -------------------------------------------------------------------------------Constant Name: TCF_NoAuthorization Value: -33 Meaning: O uso do TOPconnect no est autorizado. Recovery: Isto indica que a conexo completada porque a chave do TOPConnect invlida ou est expirada. com o AS/400 no pode ser

-------------------------------------------------------------------------------Constant Name: TCF_TooManyUsers Value: -34 Meaning: O nmero de mximo de usurios conectados foi alcanado. Recovery: Alguns usurios devero desconectar ou mais licenas sero necessitadas. -------------------------------------------------------------------------------Constant Name: TCF_NoDBConnection Value: -35 Meaning:O Database no pode ser acessado. Recovery: -------------------------------------------------------------------------------Value: -58 Meaning: "No H Memria Do DOS" Recovery: Indica que no pode do insuficincia de memria corrente para a situao. ter o desempenhado necessario devi

-------------------------------------------------------------------------------Value: -90 Meaning: " Memria Insuficiente" Recovery: Indica que o trabalho no pode ser feito devido a insuficincia de Memria d o PC . Corrija a situao.

Hardlock 345 ----------------------- Page 346----------------------1-) Qual o objetivo doHardlock ? Juntamente com a verso 7.10 a Microsiga disponibiliza um hardwa re de proteo que tem por objetivo a segurana das informaes usando algoritmos de criptografia recurso para proteo de mensagens eletrnicas) baseados em chaves de 128 bits, liberando mecanismos mais e ficientes para proteger o sistema contra acessos indevidos. Aliado a isso, mais agilidade no pr ocesso de liberao de senhas e ganho de performance nos processos de controle aos acessos simultneos (s emaforizao) so obtidos. -------------------------------------------------------------------------------2-) O cliente recebeu k o que deve-se fazer a ? verso 7.10 mas ainda no recebeu o Hardloc

Isto no ir ocorrer, pois o "pacote" da verso AP7 contempla: - 1 CD InstalaoAP7 Windows - 1 CD Instalao AP7 Linux - 1 Hardlock Paralela - 1 Bottom AP7 - 1 Recibo de entrega da verso, a ser assinado pelo cliente Portanto, tendo o recibo assinado, comprova o recebimento de todos os itens acim a ! -------------------------------------------------------------------------------3-) Com quem devo falar na Microsiga para solicitar a contra senha do Hardlock ? O prprio Departamento de vio das contra-senhas do Hardlock. Senhas o responsvel pela liberao e en

-------------------------------------------------------------------------------4-) Continua existindo a necessidade de liberao de senha do sigamat.emp ? Sim. O Objetivo da liberao de senhas no Sigamat de controlar o nmero de empresas us urias do sistema, enquanto o Hardlock responsvel pela criptografia dos dados, assim como o c ontrole de usurios simultneos. --------------------------------------------------------------------------------

5-) Como realizar testes em clientes sem utilizar as licenas oficiais ? Os testes a partir da verso 7.10 ficam sendo possveis, sem consumo de licenas do am biente oficial, somente na empresa "99 Teste / Matriz ", ou utilizando-se da senha de emergncia. -------------------------------------------------------------------------------6-) Como fica a empresa teste ?

A empresa "99 - Teste" no requer a utilizao nem a autenticao atravs do Hardlock, p to, seu uso est liberado. O nmero de registros que antes era limitado a 50 passa a no e xistir mais, sendo este substitudo pelo controle de uso por no mximo 2 usurios simultneos. -------------------------------------------------------------------------------7-) Como ficam as liberaes no caso em que o Hardlock, depois de colocad o em uso, falhar? Para este caso existe o procedimento de liberao da senha de emergncia, que neste ca so, ir liberar o uso do sistema at que a substituio ou manuteno seja realizada. Em caso de falha con statada no dispositivo, este ser substitudo gratuitamente no 1 ano e ao custo de tabela da Store (Hoje em US$ 43,55) a partir de ento. -------------------------------------------------------------------------------8-) Quantos Hardlock o cliente precisa utilizar em seus ambientes ? Somente um, pois o cliente ir eleger qual "servidor" Protheus tambm ser o servidor de licenas,e este por sua vez poder autenticar todos os demais servidores da empresa. --------------------------------------------------------------------------------

346 ----------------------- Page 347----------------------9-) O cliente perdeu o Hardlock, e agora? Caso o cliente tenha perdido ou tenha furtado o Hardlock ele dever providenciar um Boletim de ocorrncia e comprar a nova chave de segurana pelo valor de US$ 43,55 -------------------------------------------------------------------------------10-) O cliente modificou seu ambiente de hardware, ou seja, a mquina quebrou inst

alou novamente, mudou para uma mquina nova, etc. O mesmo Hardlock funcionar? Ir funcionar normalmente desde que seja instalado novamente, e reconfigurado o AP 7SRV.INI, caso o nome / IP da mquina tenha sido alterado. -------------------------------------------------------------------------------11-) Onde e como deve ser instalado o Hardlock ? Na porta paralela ou USB, de acordo com a disponibilidade do Servidor do cliente . O prprio instalador do AP7 ir solicitar informaes quanto a porta e o nome do ser vidor em que ser instalado o Hardlock. --------------------------------------------------------------------------------

12-) Possuo um ambiente com trs "sites" distintos, onde dois deles esto centraliza dos e o terceiro esta trabalhando de forma independente ? Como este ambiente dev er ser com a utilizao do Hardlock ? Contratualmente a Microsiga exige um contrato para cada localidade ( fsica ), por tanto, existindo este caso, o cliente receber 2 Hardlock s, 1 para ser usado nos que so centralizados, e um adicional para que seja usado na localidade independente. Cabe s alientar que a Microsiga fornece gratuitamente 1 Hardlock para cada contrato de manuteno vigente e caso ex ista apenas um contrato de manuteno, o cliente dever adquirir mais um Hardlock pelo preo de US$ 43,5 -------------------------------------------------------------------------------13-) O Cliente recebeu o Hardlock paralelo e somente tem sada USB ? O mesmo deve entrar em contato com a unidade de Atendimento e relacionamento da Microsiga para que seja providenciada a sua substituio. -------------------------------------------------------------------------------14-) Existe vantagem de performance entre o Hardlock paralelo e ou USB ? Tecnicamente sim, pois as portas USB s so em mdia 5x mais rpidas que as paralelas, porm isto no implicara em maior ou menor performance do sistema, pois a comunicao com a chave de segurana se d em raras ocasies. --------------------------------------------------------------------------------

15-) Quando devo utilizar a senha emergencial ? Quando por algum motivo qualquer oHardlock , ou a porta em que ele est instalado ve nha a falhar, portanto, at sua manuteno, o cliente dever utilizar a senha emergencial. No caso da necessidade de se montar um ambiente teste exatamente com as caracters ticas do cliente tambm deve ser solicitada a senha de emergncia. -------------------------------------------------------------------------------16-) O Hardlock no funciona mesmo com a contra senha correta, o que devo fazer? Verifique a configurao da porta ( paralela ou USB ). Realize testes utilizando um outro servidor para ter certeza se o problema ou no no Harklock. Cabe salientar que todos os HardLocks so testados na Microsiga no momento da liberao. -------------------------------------------------------------------------------17-) Caso o cliente seja um DataCenter e tenha um nmero de licenas que deva ser dis tribudo para cada um de seus clientes, o que fazer ? 347 ----------------------- Page 348----------------------Existem duas alternativas para resolver este problema : 17.1 -> Distribuir o licenciamento em n HardLocks e n servidores

17.2 -> Ter um nico HardLock e controlar os acessos atravs do ponto de entrada CHKEXE C alm da utilizao da chave SEMAFOROKEY no ambiente (Environment corrente) que est configur no AP7SRV.INI -------------------------------------------------------------------------------18-) Como configurar o servidor de licenas ? O prprio instalador do AP7 solicita as informaes necessrias durante este processo pa ra se utilizar o Hardlock. No arquivo .INI do Servidor do AP7, havero duas sesses confo rme abaixo: [LICENSESERVER] enable=1 port=porta-do-license-server [LICENSECLIENT] server=nome-do-servidor port=porta-do-license-server

-------------------------------------------------------------------------------19-) Preciso processamento um do servidor de Protheus? licena para cada servidor de

No. O cliente tendo 2 ou mais servidores de aplicao, o mesmo ir eleger um deles para ser o servidor de licenas, onde ento ser instalado o Hardlock, e a partir deste momento , os demais passaro a pedir autenticao para ele. -------------------------------------------------------------------------------20-) mesmo Podemos ter servidor mais ? de um HardLock no

Sim, mas apenas um da Microsiga. 16 Programando com Schedule de Relatorios Abrangncia

Como o sistema permite que a emisso de relatrios possa ser programada (schedule) f undamental que se utilize as rotinas padres para a emisso dos mesmo. O controle do schedule feito pela funo SetPrint. Sendo assim, no suportado interface com data ent ry durante o processo de relatrio, visto que isto inviabilizar a utilizao do mesmo. A no ser em relatrios espe icos e que sejam inviveis a utilizao de shedule (ex. Impresso de Cheques) est e procedimento dever ser adotado corretamente. Caso exista alguma entrada de dados que mida qualquer valor apenas no schedule deve-se adotar o seguinte procedimento : Usar a varivel __cInternet, dadeiro) estamos no processo schedule. que de se seja possvel ser assu

estiver

com

valor

.T.

(Ver

Instrues para instalao das Storeds Procedures 1. Arquivos anexados: a. .sps - Arquivo encriptado com as Storeds Procedures. b..txt - Arquivo que documenta o contedo dos arquivos .sps. c. .pat - Patch do Protheus. ( necessrio solicitar ) 348 ----------------------- Page 349----------------------2. Instalando o .pat (se houver).

Abra o IDE do Protheus, selecione o menu Ferramentas -> Aplicao de Patchs . Escolha o arquivo .pat e clique em Ok. Este arquivo deve estar dentro do sever do protheus , preferencialmente dentro da pasta Sigaadv. Obs.: Para baixar o patch, pode acessar : ftp.microsiga.com.br/Ap7/Procedures Este patch contm os seguintes arquivos: CFGX051.PRW, MATA280.PRX, MATA300.PRX Cada solicitante tem a responsabilidade de validar os Patches antes de aplic-lo na rea de produo do cliente. Como procedimento obrigatrio, deve-se efetuar um backup da s ituao atual, antes da aplicao do Patch. Devemos estar ciente que o Patch completo que esta no nosso site FTP, contm todas as alteraes efetuadas at a data especificada pelo laboratrio de produ tos da Microsiga, portanto devemos observar que a atualizao do RPO ou Patch completo deste site, no garante que os Patches emergenciais aplicados estaro contemplados. Recomendamos que em caso de dvida,verifiquem nos documentos existentes no FTP de sua verso as datas e alteraes d as rotinas realizadas junto com o arquivo texto anexo, se as mesmas no existirem, reapliquem os Patches emergenciais ou faam nova solicitao dos mesmos. Somente atenderemos as solicitaes originadas de e-mails com domnio @micros iga.com.br, e faremos o envio para esta mesma conta, o solicitante dever ser sempre o canal de redirecionamento ao cliente. 3. Instalando o arquivo .sps.

Entre no mldulo configurador e selecione a opo do instalador de procedures , normalmente encontada no menu Ambiente -> Cadastros -> Stored Procedures. Aparecer uma tela para que sejam selecionadas as filias para as quais as Stored Procedures sero instaladas. Selecione as filiais desejadas e clique em ok. Caso no exista o menu, crie. A funo que chama o configurador a CFGX051(). Variveis Pblicas Disponveis no Protheus dDataBase (D, 8) cUsuario (C, 533) Contm a data selecionada na entrada do sistema. Contm informaes do usurio:

o De 001 a 006 Senha do Usurio (6 dgitos) o De 007 a 021 Nome do Usurio (15 dgitos) o De 022 a 533 Permisses de Acesso (512 dgitos)

cSenha (C, 6)

Senha do Usurio. Nome do Usurio sem brancos a direita. Permisses de Acesso do Usurio. Nmero de identificao do usurio no cadastro

cUserName (C, 15) cAcesso (C, 128) __UserID (C, 6)

de usurios. Ex.: 000006. cNivel (N, 1) Nvel de Acesso do Usurio podendo variar de 0 a

9 sendo que 9 indica um Administrador. cModulo (C, 3) Sigla do Mdulo que est em uso no momento. Ex.:

EST para o Mdulo de Estoque. 349 ----------------------- Page 350----------------------nModulo (N, 1) Nmero do Mdulo que est em uso no momento.

Ex.: 4 para o Mdulo de Estoque. aEmpresas (A) Array contendo tantos elementos quanto forem as

empresas e filiais cadastradas no sistema sendo que cada elemento se encontra no formato EEFF (Empresa + Filial) Ex.: 5501. cNumEmp (C, 4) Nmero da Empresa + Filial que est em uso no

momento. Ex.: 9901. cEmpAnt (C, 2) Ex.: 55. cFilAnt (C, 2) Ex.: 01. cArqEmp (C, 12) Ex.: SIGAMAT.EMP. cArqMnu (C, 12) Nome do arquivo de menu que est em uso no Nome do arquivo de empresas com sua extenso. Nmero da Filial que est em uso no momento. Nmero da Empresa que est em uso no momento.

momento + a sua extenso. Ex.: SIGAEST.MNU. _NomeExec (C, 12) Nome do arquivo executvel que est em uso no

momento + a sua extenso. Ex.: SIGAEST.EXE. cFOpened (C) String com os Alias de todos os arquivos que esto

abertos no momento. cVersao (C) tInicio (C, 8) HH:MM:SS. __Language (C) cPaisLoc (C, 3) Sistema. Ex.: BRA. __TTSinUse (L) Indica se o controle de transaes est ativo no Lngua atual do Sistema. Ex.: PORTUGUESE. Sigla do Pais para qual est configurado o Verso do Sistema. Horrio em que foi iniciado o sistema no formato

sistema. Retorna .T. se MV_TTS = S e .F. se for igual a N. __lSX8 (L) Usada em conjunto com as funes GetSX8Num() e

ConfirmSX8(). Provavelmente para controlar se o nmero j est reservado para outro usurio. 350

Vous aimerez peut-être aussi