Você está na página 1de 342

A Tecnologia Protheus

O Advanced Protheus uma nova tecnologia desenvolvida sobre o sistema Advanced, que teve toda
a inteligncia dividida em duas camadas: Servidor de Aplicao (Protheus Server) e Interface (Remote).
Ou seja, uma aplicao 32 bits que se encarrega do gerenciamento das conexes, da execuo do cdigo
AdvPl e do acesso aos recursos de banco de dados (ADS, Btrieve, CTree ou TopConnect), 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 distribudo
Baixo trfego de rede entre o AP5 Server e o AP5 Remote
Utilizao de configuraes, possibilitando o uso de conexes simultneas atravs de protocolos
diferentes e o acesso a diferentes repositrios de APO's e diretrios (o que permite o uso de
diferentes idiomas, verses, etc, acessando a mesma base de dados)
Diferentes possibilidades de impresso de relatrios. No Advanced 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 impressas no servidor (o que
evitar o trfego de rede do relatrio impresso) ou na estao. As impresses efetuadas em disco tambm
evitam o trfego de rede. Os relatrios em disco so sempre mantidos no servidor 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 contiverem uma
letra de drive (por exemplo, "\DADOS\ARQ.TXT"), so consideradas a partir 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 carregados 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 usurio
As Camadas do Advanced Protheus
O Advanced Protheus dividido em quatro camadas para a operao so elas:
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, no qual o
sistema Siga Advanced est escrito a partir da verso 5.07. Na linguagem AdvPl, as rotinas so mantidas em
APO's (Advanced Protheus Objects) individuais em repositrios. Isso 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's modificados
necessitam ser atualizados. Desse modo, a performance alta e no requer muitos recursos da mquina
para a execuo do servidor.
Terminal Thin-Client
O Remote a aplicao encarregada da interface com o usurio. No existe processamento local,
por isso o trfego de rede entre o Terminal e o Servidor de 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 seguintes 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.
struturao
A estrutura de diretrios do Advanced Protheus
A estrutura de diretrios do Advanced Protheus depende da verso instalada.
!erso AP"
\ap5\ Diretrio inicial do Protheus. a partir deste diretrio que o sistema ir localizar os
caminhos informados em parmetros, customizaes, etc.
\ap5\apo\ Diretrio onde sero localizados os arquivos de repositrio de APOs.
\ap5\bin\ Diretrio onde so localizados os arquivos do ncleo do Protheus: executveis, bibliotecas
de carga dinmica (DLLs) e arquivos de configurao 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 Advanced, arquivos de menus, etc. tambm
o diretrio inicial de execuo no Remote.
\ap5\dadosadv\ Similar ao \DADOSADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se localizam
os arquivos de base de dados para verses no SQL.
\ap5\relato\ Similar ao \RELATO\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de arquivos
de impresso em disco.
\ap5\cprova\ Similar ao \CPROVA\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de arquivos
de contabilizao.
\ap5\ixbpad\ Diretrio de localizao de programas de exemplo escritos em AdvPl, nos padres definidos
pela Microsiga Software S.A.
\ap5\include\ Diretrio de arquivos de incluso padro (extenso .CH) necessrios para a compilao de
programas escritos em AdvPl.
\ap5\util\ Diretrio de ferramentas adicionais do Protheus.

!erso AP#
\ap6\ Diretrio inicial do Protheus. a partir deste diretrio que o sistema ir localizar os
caminhos informados em parmetros, customizaes, etc.
\ap6\apo\ Diretrio onde sero localizados os arquivos de repositrio de APOs.
\ap6\bin\server\ Diretrio onde so localizados os arquivos do ncleo do Protheus Server: executveis,
bibliotecas de carga dinmica (DLLs) e arquivos de configurao.
\ap6\bin\remote\ Diretrio onde so localizados os arquivos das aplicaes clientes (Remote, IDE, Monitor,
etc): executveis, bibliotecas de carga dinmica (DLLs) e arquivos de configurao.
\ap6\sigaadv\ Similar ao \SIGAADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se encontram
os arquivos de configurao do sistema ERP Advanced, arquivos de menus, etc.
tambm o diretrio inicial de execuo no Remote.
\ap6\dadosadv\ Similar ao \DADOSADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se localizam
os arquivos de base de dados para verses no SQL.
\ap6\relato\ Similar ao \RELATO\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de
arquivos de impresso em disco.
\ap6\cprova\ Similar ao \CPROVA\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de
arquivos de contabilizao.
\ap6\ixbpad\ Diretrio de localizao de programas de exemplo escritos em AdvPl, nos padres
definidos pela Microsiga Software S.A.
\ap6\include\ Diretrio de arquivos de incluso padro (extenso .CH) necessrios para a compilao
de programas escritos em AdvPl.
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 instalao.
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 esta a parte do sistema que ser
executada no Servidor e ser responsvel pela comunicao entre o Cliente, a Base de Dados e o Repositrio
de Apos. O nome do executvel depende da verso e sistema operacional utilizados, por exemplo:
AP5SRV.EXE ou AP6SRVWIN.EXE.
Remote
o Remote que utilizamos para interagir com todo o sistema, 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.
$D
Trata-se do ambiente de desenvolvimento integrado do Advanced Protheus. atravs deste
aplicativo que todos os acessos aos repositrios de Apos (compilao de customizaes, visualizao de
funes existentes etc.) so efetuados, e tambm a ferramenta para desenvolvimento e depurao de
aplicaes/customizaes. O nome do executvel depende da verso utilizada, por exemplo: AP5IDE.EXE ou
AP6IDE.EXE.
%onitor
Esta ferramenta permite a interao com os usurios conectados ao sistema: Analisar os programas
em uso, derrubar conexes pendentes, enviar mensagens ao usurios etc. O nome do executvel depende
da verso utilizada, por exemplo: AP5MONIT.EXE ou AP6MONIT.EXE
Alem destas aplicaes, o Siga Advanced Protheus conta ainda com outros utilitrios diversos,
como o Diff (utilizado para comparao de arquivos texto) e Dump (utilizado para edio de
arquivos binrios).
&omenclaturas 'tili(adas
Estas so as principais nomeclaturas utilizadas no Advanced Protheus:
Build: Verso completa do sistema com seus executveis, Dlls e RPO completo. O build 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 atualizaes de APOs, correes
disponibilizadas pela Microsiga Software S.A., que ser aplicado no repositrio atravs do IDE.
Verso Master: Mesma definio de build porm neste caso a verso ser utilizada como referncia para
a gerao de atualizaes do sistema (patchs). Quando gerada, a verso encaminhada a todos os
envolvidos em processos de implantao/utilizao do sistema via correio ou disponibilizada no site de FTP
do Protheus.
A definio dos nomes dos arquivos dos repositrios de APO's e Patchs seguem o mesmo padro
(diferenciando-se apenas na extenso Patch=.PAT e repositrio=RPO) e 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;
Por exemplo, APBP609.RPO ser um repositrio de APO's para base de dados BTrieve, idioma
Portugus e verso 609.
Devido sua diviso em camadas, a tecnologia Protheus permite montar o ambiente 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 Possi)ilidades 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 aumento 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 processamento de uma
ou mais estaes.
Utilizao do protocolo TCP-IP para as conexes. Na verso AP5 pode-se utilizar tambm o
protocolo NAMED PIPES.
Pode-se disponibilizar conexes via Internet atravs da montagem de um Web Server na empresa
ou atravs de provedores de acesso (como a UOL e o ZAZ). Neste caso, o Protheus Server pode ser
executado no provedor ou na empresa utilizando uma LP para a conexo ao provedor de acesso.
A Internet utilizada apenas como o meio de comunicao, ou seja, 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 remotos 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 sendo executado como um
servidor FTP.
A definio da melhor topologia para execuo um passo importante da implementao da
tecnologia Protheus, pois influenciar totalmente na performance. O maior trfego de rede est
localizado entre o Protheus Server e o Banco de Dados, j que o trfego entre o Protheus Server e
o Remote limita-se s informaes para montagem de telas e controle de teclado 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.
*alanceamento de Carga entre Servidores +,oad*alance-
$ntroduo
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
de balanceamento de carga para que nenhum servidor
fique sobrecarregado e comprometa assim o desempenho
da rede e do servidor.
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.
O balanceamento feito por proporo, ou seja, se
tivermos 60 usurios e definirmos que o servidor Master
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 "pendurado no servidor Master, 2
entraro no Server2 e 3 no Server3. Ficaria assim:
# Usurio Servidor
01 Joo Master
02 Karla Server2
03 Paulo Server2
04 Mrio Server3
05 Karina Server3
06 Daniel Server3
07 Rosana Master
Con.igurando o Servidor %aster
O nico "ap5srv.ini que ser alterado com as configuraes abaixo o do servidor master, pois ele quem
administrar o balanceamento de carga. Todos os usurios se conectaro inicialmente ao servidor
Master, e este quem efetuar o balanceamento de carga para os outros servidores. Nos "inis dos outros
servidores ser alterado apenas o parmetro "rootpath, para que eles peguem a mesma base de dados do
servidor master. As sees que devem ser alteradas so estas abaixo:
Server!et"or#$
Servers=Master,Server2,Server3
aqui deve ser informado o nome das sees para cada servidor, que sero configuradas 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
Server%$
TYPE=TCPIP
Server=SIGASERVER2
%ASTR
+Server/-
Server
2
Server
3
Connections=20
Server&$
TYPE=TCPIP
Server=SIGASERVER3
Connections=30
Con.igurao dos outros Servidores
Como j foi citado acima, nos demais servidores a nica coisa que ser alterada o parmetro "rootpath do
arquivo "ap5srv.ini. Para isso, o diretrio-raz AP5 do servidor Master dever ser compartilhado 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 mesma base de dados.
Supondo que a base de dados esteja no servidor Master, os inis ficariam assim:
'nvironment$
SourcePath=C:\AP5\APO
RootPath011S$2A%ASTR1AP"
veja que o raiz est sendo apontado para o servidor Master.
StartPath=\SIGAADV\
(demais configuraes continuam iguais)
3)serva4es
Cada servidor dever ter o seu build e repositrio, sendo que a base de dados fica centralizada no
servidor Master ou no servidor de banco de dados.
Quando for feita qualquer atualizao de build e repositrio no servidor Master, a mesma alterao
dever ser feita nos outros servidores.
Um mesmo usurio Windows dever ter direitos na pasta compartilhada (rootpath) 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 Ap5Monitor em cada
servidor.
$D - $ntegrated Development nvironment
O IDE (Integrated Development Environment) uma ferramenta de edio, compilao e depurao 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 gerao dos APO's no
repositrio.
Como ferramenta de edio e depurao, engloba todos os recursos disponveis nas melhores ferramentas
de desenvolvimento do mercado.
Caractersticas do $D
Para a execuo do IDE no necessrio conectar-se ao Protheus Server, exceto nas operaes de
atualizao ou consulta de um repositrio (compilao, obteno do Mapa de Objetos, aplicao de
patchs, etc) e durante o processo de depurao.
No aconselhvel executar o IDE remotamente (via Internet ou via modem), pois 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. (ria)o do c*di+o atrav,s do editor. Na linguagem AdvPl, os analistas e os usurios do
Protheus tm todos os recursos disponveis para o desenvolvimento de suas rotinas. E
diferentemente do antigo RDMAKE, no mais uma linguagem interpretada. Por isso, a
performance das rotinas especficas dez vezes maior do que era nos RDMAKEs antigos.
2. Monta+em do -rupo de Pro.etos. O Grupo de Projetos um gerenciador existente dentro do
IDE, onde o usurio pode manter os arquivos de cdigo separados por projetos e pastas. Com
um grupo de projetos os arquivos podem ser organizados de uma forma lgica, em projetos e
pastas.
3. (ompila)o. Durante a compilao, os arquivos so enviados ao Protheus Server. Toda a
compilao e a gravao no repositrio so efetuadas no servidor.
4. /epura)o. 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. Exatamente como as melhores ferramentas de
desenvolvimento existentes no mercado. No IDE pode-se depurar pontos de entrada
simplesmente colocando-se um ponto de parada (break point) em uma linha qualquer do cdigo
do ponto de entrada;
%onitor
O Monitor utilizado para monitorar as conexes de terminais ao Protheus Server. Atravs 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 e se precisa
evitar que outros usurios se conectem.
$n.orma4es *5sicas das Cone64es
Usurio. o nome do usurio na rede local. Para conexes remotas este nome est em branco.
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 Remote se conectou.
Programa Inicial. o nome do programa inicial (APO) com o qual o Remote iniciou a execuo.
Environment. Nome do ambiente sendo utilizado pelo terminal.
*trieve
$n.orma4es *5sicas
Para manipulao de tabelas Btrieve o driver utilizado "BTVCDX";
Para programar algo especfico para o Btrieve pode-se utilizar o teste "#ifdef BTV";
A extenso padro das tabelas ".dat";
Os ndices so criados no mesmo arquivo de dados (".dat");
As manipulaes e visualizaes de dados devem ser feitas atravs do "APSdu", pois as antigas
ferramentas so incompatveis;
O Btrieve verso 6.15 no precisa ser instalado, pois as DLLs necessrias so disponibilizadas junto
com o Protheus. Os arquivos necessrios ficam no diretrio "BIN" (wbtrv32.dll, w32mkrc.dll,
wbtrvres.dll e w32mkde.exe). O funcionamento praticamente igual ao Btrieve 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 Protheus for
executado novamente no necessrio seu reincio. Quando o usurio desejar renomear o diretrio
"BIN", o mesmo no ser permitido por esse motivo, deve-se portanto finalizar a execuo do
mesmo;
As informaes das tabelas, campos e ndices so armazenados no diretrio "DDF", criado abaixo do
"RootPath", atravs dos arquivos (Field.btv, File.btv, Finfo.btv, Iinfo.btv e Index.btv). Se estes
arquivos forem apagados as tabelas sero recriadas e todos os dados sero PERDIDOS. No se
pode copiar uma tabela com estrutura diferente para este diretrio, pois seus dados devem ser
atualizados nos arquivos do DDF tambm. Como os dados e o diretrio DDF devem estar
"sincronisados" os arquivos do DDF devem ser includos no esquema de "backup" 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 programa, selecione a
tabela e chame a funo <@>BTVDropIdxs(). 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 temporrios;
Para gerar os arquivos DFFs compatveis com outras ferramentas que manipulam arquivos btrieve,
inclusive Crystal Reports, existem duas funes para criar os arquivos necessrios: <@>BTVTables
e <@>BTVCreateDDFs;
Con.igurao do *trieve7PervasiveS8,9:::;
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 do Btrieve do diretrio "Protheus\Bin" (wbtrv32.dll, w32mkrc.dll,
wbtrvres.dll e w32mkde.exe);
3. Instalar o PervasiveSQL200 com os respectivos "Services Packs";
4. Entrar no Pervasive Control Center (menu Iniciar - Pervasive - Pervasive Control Center);
5. Visualizar os nomes dos servidores disponveis (no caso de Linux, Novell e Solaris deve-se
acrescentar um servidor);
6. Atravs de um duplo click sobre o servidor que se deseja utilizar entrar em "configurao"
(configuration);
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
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
*Obs: O Cache Allocation Size aloca memria do servidor para uso do banco de dados.
Quanto mais memria, mais rpidas so executadas as operaes.
A verso 6.15 possui uma limitao: Se dois servidores NT4 estiverem acessando o mesmo
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 em cada servidor
ou adquirir (deve ser comprado) a verso a partir da PervasiveSQL2000. Em mquinas Win2000,
no nem mesmo possvel abrir um arquivo btrieve de dois servidores. Este problema de
conhecimento da Pervasive, mas no ser alterado porque esta verso foi descontinuada por volta
de agosto de 2001.
CTree
$n.orma4es *5sicas
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 banco Ctree os SXs
continuam tendo como padro a extenso ".dbf, mas as tabelas 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 no arquivo "ap6srv.ini como
".dtc;
As manipulaes e visualizaes de dados devem ser feitas atravs do "APSdu, 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, por isso na hora da sua criao o
Protheus automaticamente desloca-os para o final e mostra uma mensagem de aviso;
As tabelas geradas pelo Ctree so totalmente compatveis entre as plataformas 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 extenso ".int. Uma
pasta ("ctreeint) criada abaixo da pasta com a tabela. Nesta pasta sero armazenados todos os
ndices internos daquele diretrio. Caso no exista o arquivo de ndice interno 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 <@>CTREEDELINT;
- Os arquivos de ndices permanentes so criados fora do arquivo da tabela com 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 deve estar aberta em modo
exclusivo. Na hora da abertura da tabela, todos os arquivos de ndices permanentes 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 estrutura 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 temporrios;
- 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 arquivo da tabela, por ser
temporrio.
Sistemas 3peracionais e Plata.ormas +verso AP# e posteriores-
Sistemas 3peracionais e Plata.ormas
O Protheus Server foi desenvolvido em ANSI C++ e, portanto, independe de API's especificas para funcionar.
Graas a isso, o ncleo do Protheus pode ser recompilado em todos os sistemas operacionais e plataformas
que suportem ANSI C++.
Outra preocupao durante o desenvolvimento do Protheus foi garantir total compatibilidade dos repositrios
de objetos do Protheus (RPO's) e das correes dos repositrios (Patch's) entre os sistemas operacionais e
plataformas.
Plata.ormas e S3=s suportados
Windows e Linux Intel,
Windows IA64,
Sun Solaris ( RISC ),
HP UX ( RISC ),
Compaq True64 ( RISC ),
IBM AIX ( Power PC e RS/6000 )
&ovos S3=s a serem suportados
PalmOS ( em fase Beta )
PocketPC
A ,inguagem 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 xBase 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 pela 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 aplicaes 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 APOs so mantidos em um repositrio e carregados
dinamicamente pelo AP6 Server para a execuo. Como no existe a linkedio, ou unio fsica 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 AdvPl o prprio servidor AP6 (AP6 Server), e existe um
ambiente visual para desenvolvimento integrado (AP6 IDE) onde o cdigo pode ser criado, compilado e
depurado.
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 $nter.ace Prpria com o 'su5rio
Nesta categoria entram os programas desenvolvidos para serem executados atravs do terminal remoto do
Protheus, o AP6 Remote. O AP6 Remote a aplicao encarregada da interface e da interao com o
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 qualquer 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 Protheus.
Pode-se criar rotinas para a customizao do sistema ERP Advanced Protheus, desde 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 toda uma aplicao, ou mdulo, do
comeo.
Todo o cdigo do sistema ERP Advanced Protheus escrito em AdvPl.
Programao Sem $nter.ace Prpria com o 'su5rio
As rotinas criadas sem interface so consideradas nesta categoria porque 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, executados
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 meio de conectividade utilizado, estas rotinas so subcategorizadas
assim:
Programao por Processos
Rotinas escritas em AdvPl podem ser iniciadas como processos individuais (sem 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 propriamente configurado).
Programao de RPC
Atravs de uma biblioteca de funes disponvel no Protheus (uma API de comunicao), pode-se 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 outros 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 >e)
O AP6 Server pode tambm ser executado como um servidor Web, respondendo a requisies HTTP. No
momento destas requisies, pode executar rotinas escritas em AdvPl como processos individuais, enviando
o resultado das funes como retorno das requisies para o cliente HTTP (como por exemplo um Browser
de Internet). Qualquer rotina escrita em AdvPl que no contenha comandos de interface 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 Tel&et
TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador remoto 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 interface final ser um terminal
TelNet ou um coletor de dados mvel.
Criao de um Programa
Um programa de computador nada mais do que um grupo de comandos logicamente dispostos com o
objetivo de executar determinada tarefa. Esses comandos so gravados 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 sintaxe da linguagem
utilizada, pois caso contrrio o programa ser interrompido por erros. Os erros podem ser de compilao ou
de execuo.
Erros de compilao so aqueles encontrados na sintaxe que no permitem que o arquivo de cdigo do
programa seja compilado. Podem ser comandos especificados de forma errnea, utilizao invlida de
operadores, etc.
Erros de execuo so aqueles que acontecem depois da compilao, quando 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.
,inhas de Programa
As linhas existentes dentro de um arquivo texto de cdigo de programa podem ser linhas de comando,
linhas de comentrio ou linhas mistas.
,inhas de Comando
Linhas de comando possuem os comandos ou instrues que sero executadas. Por exemplo:
Local nCnt
Local nSoma := 0
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
,inhas de Coment5rio
Linhas de comentrio possuem um texto qualquer, mas no so executadas. 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 linha:
* 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 comentrio. Pode-se utilizar a
palavra NOTE ou dois smbolos da letra "e" comercial (&&) para realizar a funo do sinal de asterisco.
Porm todas estas formas de comentrio de linhas so obsoletas e existem apenas para compatibilizao
com o padro xBase. A melhor maneira de comentar linhas em AdvPl utilizar duas barras 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:
/*
Programa para clculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
Todo o texto encontrado entre a abertura (indicada pelos caracteres /*) e o fechamento (indicada pelos
caracteres */) considerado como comentrio.
,inhas %istas
O AdvPl tambm permite que existam linhas de comando com comentrio. Isto possvel inclundo-se as
duas barras transversais (//) ao final da linha de comando e adicionando-se o texto 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 ,inha
Assim como a linha fsica, delimitada pela quantidade de caracteres que pode ser digitado no editor de
textos utilizado, existe uma linha considerada linha lgica. A linha lgica, aquela considerada para a
compilao como uma nica linha de comando.
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 fsica do editor de texto
ou por esttica, pode-se "quebrar" a linha lgica em mais de uma 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 do programa ocorrer
um erro, pois a segunda linha fsica ser considerada como uma segunda linha de comando na compilao. E
durante a execuo esta linha no ter sentido.
strutura de um Programa
Apesar de no ser uma linguagem de padres rgidos com relao estrutura do programa, importante
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
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 $denti.icao
Esta uma rea que no obrigatria e dedicada a documentao do programa. Quando existente,
contm apenas comentrios explicando a sua finalidade, data de criao, autor, etc, e aparece no comeo do
programa, antes de qualquer linha de comando.
O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao desejada 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 ou incluso de arquivos de
cabealho nesta rea.
A ?rea de A@ustes $niciais
Nesta rea geralmente se fazem os ajustes iniciais, importantes para o correto funcionamento do programa.
Entre os ajustes se encontram declaraes de variveis, inicializaes, abertura de arquivos, etc. Apesar do
AdvPl no ser uma linguagem rgida e as variveis poderem ser declaradas em qualquer lugar do programa,
aconselhvel faz-lo nesta rea visando tornar o cdigo mais legvel e facilitar a identificao de variveis
no utilizadas.
Local nCnt
Local nResultado := 0 // Resultado do fatorial
Local nFator := 10 // Nmero para o clculo
3 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
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 ncerramento
nesta rea onde as finalizaes so efetuadas. onde os arquivos abertos so fechados, e o resultado da
execuo do programa utilizado. Pode-se exibir o resultado armazenado em uma varivel ou em um
arquivo ou simplesmente finalizar, caso a tarefa j tenha sido toda completada 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 variveis de memria
podem receber diferentes tipos de dados durante a execuo do programa. Variveis podem tambm conter
objetos, mas os tipos primrios da linguagem so:
&umArico
O AdvPl no diferencia valores inteiros de valores com ponto flutuante, 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 E-308 at 1.7976931348623158 E+308.
,gico
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 entre aspas duplas (") ou
aspas simples ('):
"Ol mundo!"
'Esta uma string'
"Esta 'outra' string"

Uma varivel do tipo caracter pode conter strings com no mximo 1 Mb, ou seja, 1048576 caracteres.
Data
O AdvPl tem um tipo de dados especfico para datas. Internamente as variveis deste tipo de dado so
armazenadas como um nmero correspondente a data Juliana.
Variveis do tipo de dados Data no podem ser declaradas diretamente, e sim atravs da utilizao de
funes especficas como por exemplo ctod que converte uma string para data.
%atri( +ArraB-
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 acessados atravs de ndices
numricos iniciados em 1, identificando a linha e coluna para quantas dimenes existirem.
Uma matriz pode conter no mximo 100000 elementos, independentemente do nmero de dimenses.
Matrizes devem ser utilizadas com cautela, pois se forem muito grandes podem exaurir a memria do
servidor.
*loco de Cdigo
O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues escritas em AdvPl que
podero ser executadas posteriormente.
Criao e Atribuio de Variveis
Criao e Atri)uio de !ari5veis
Variveis de memria so um dos recursos mais importantes de uma linguagem. 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 gravada 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 regras:
M0imo de 12 caracteres. O AdvPl no impede a criao de uma varivel de memria cujo nome contenha
mais de 10 caracteres, porm apenas os 10 primeiros sero considerados para a localizao do
contedo armazenado. Portanto se forem criadas duas variveis cujos 10 primeiros caracteres forem iguais,
como nTotalGeralAnual e nTotalGeralMensal, as referncias a qualquer uma delas no 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 nTotalGeralMensal), ou seja,
considerou-as como a mesma varivel. Assim o valor original de 100 foi substituido pelo de 300.
3imita)o de caracteres no nome. Os nomes das variveis devem sempre comear por uma letra ou o
caracter de sublinhado ( _ ). No restante, pode conter letras, nmeros e o caracter 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 informar o tipo de
dados que determinada varivel ir conter no momento de sua declarao, e o seu valor pode mudar
durante a execuo do programa. Tambm no h necessidade de declarar variveis em uma seo
especfica do seu cdigo fonte, embora seja aconselhvel declarar todas as variveis necessrias 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 indica a que contexto do
programa a varivel declarada pertence. O contexto de variveis pode ser local (visualizadas apenas dentro
do programa atual), pblico (visualizadas por qualquer outro programa), entre outros. 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 uma expresso de clculo
sem ter sido declarada. Para solucionar este erro, deve-se declarar a varivel previamente:
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 utilizado 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 inicializada em uma outra
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 igual, 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 tipo 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 determinado tipo de
dado, pode-se mudar o tipo da varivel atribuindo outro tipo a ela:
01 Local xVariavel // Declara a varivel inicialmente com valor nulo
02
03 xVariavel := "Agora a varivel caracter..."
04 Alert("Valor do Texto: " + xVariavel)
05
06 xVariavel := 22 // Agora a varivel numrica
07 Alert(cValToChar(xVariavel))
08
09 xVariavel := .T. // Agora a varivel lgica
10 If xVariavel
11 Alert("A varivel tem valor verdadeiro...")
12 Else
13 Alert("A varivel tem valor falso...")
14 Endif
15
16 xVariavel := Date() // Agora a varivel data
17 Alert("Hoje : " + DtoC(xVariavel))
18
19 xVariavel := nil // Nulo novamente
20 Alert("Valor nulo: " + xVariavel)
21
22 Return
No programa de exemplo anterior, a varivel xVariavel utilizada para armazenar diversos 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 especfica 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 dependendo do tipo de dado
da varivel xVariavel necessrio fazer uma converso antes.
Apesar dessa flexibilidade de utilizao de variveis, deve-se tomar cuidados na passagem 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 exemplo, 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 diretamente 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, exatamente 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
Estruturas de Controle
%atri(es
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
atrizes 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 elementos 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
Alert(cValToChar(Len(aLetras))) // Exibe o tamanho da matriz
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 matriz (o que tornaria a utilizao de
"pointeiros" necessria), o AdvPl se encarrega de gerenciar a memria e torna simples adicionar elementos a
uma matriz, utilizando a funo aAdd:
aAdd(aLetras,"D") // Adiciona o quarto elemento ao final da matriz
Alert(aLetras[4]) // Exibe o quarto elemento
Alert(aLetras[5]) // Erro! No h um quinto elemento na matriz
%atri(es como struturas
Uma caracterstica interessante do AdvPl que uma matriz pode conter qualquer coisa: nmeros, datas,
lgicos, caracteres, objetos, etc. E ao mesmo tempo. Em outras palavras, os elementos de uma matriz no
precisam ser necessariamente do mesmo tipo de dado, em contraste com outras linguagens como C e
Pascal.
aFunct1 := {"Pedro",32,.T.}
Esta matriz contem uma string, um nmero e um valor lgico. Em outras linguagens como C ou Pascal, este
"pacote" de informaes pode ser chamado como um "struct" (estrutura em C, por exemplo) ou um "record"
(registro em Pascal, por exemplo). Como se fosse na verdade um registro de um banco de dados, um pacote
de informaes construdo com diversos campos. Cada campo tendo um pedao diferente de dado.
Suponha que no exemplo anterior, o array aFunct1 contenha informaes sobre o nome de uma pessoa, sua
idade e sua situao matrimonial. Os seguintes #defines podem ser criados para indicar cada posio dos
valores dentro da matriz:
#define FUNCT_NOME 1
#define FUNCT_IDADE 2
#define FUNCT_CASADO 3
E considere mais algumas matrizes para representar mais pessoas:
aFunct2 := {"Maria" , 22, .T.}
aFunct3 := {"Antnio", 42, .F.}
Os nomes podem ser impressos assim:
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 outra 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" , 32, .T.}, ;
{"Maria" , 22, .T.}, ;
{"Antnio", 42, .F.} }
auncts 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 constante FUNCT_NOME
seleciona a primeira coluna daquela linha.
Cuidados com %atri(es
Matrizes so listas de elementos, portanto memria necessria para armazenar estas informaes. Como
as matrizes podem ser multidimensionais, a memria necessria ser a multiplicao do nmero de itens em
cada dimenso da matriz, considerando-se o tamanho do contedo de 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 array for
muito grande. Quando o nmero de elementos for muito grande deve-se procurar outras solues, como a
utilizao de um arquivo de banco de dados temporrio.
No h limitao para o nmero de dimenses que uma matriz pode ter, mas o nmero de elementos
mximo (independentes das dimenses onde se encontram) de 100000.
Criao e Atribuio de Variveis
Inicializando atrizes
!locos de Cdigo
$niciali(ando %atri(es
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 matri( A conhecido
Se o tamanho da matriz conhecido no momento que o programa escrito, h diversas maneiras de
implementar o cdigo.
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 trabalhar com aY ou aZ. O objetivo deste
exemplo demonstrar trs modos de criar uma matriz de tamanho conhecido no momento 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 retorno desta funo
atribudo varivel aY.
Na linha 03 efetuado o que se chama "desenhar a imagen da matriz". Como pode-se notar, existem dez 0
s na lista encerrada entre chaves ({}). Claramente, este mtodo no o utilizado para criar uma matriz de
1000 elementos. O terceiro mtodo difere dos anteriores porque 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 pode ser atribudo para uma posio existente em uma matriz
especificando o ndice entre colchetes.
Se o tamanho da matri( no A conhecido
Se o tamanho da matriz no conhecido at o momento da execuo do programa, h algumas maneiras de
criar uma matriz e adicionar elementos a ela. O exemplo a seguir ilustra a idia de 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)
08 Next nCnt
A linha 02 utiliza os colchetes para criar uma matriz vazia. Apesar de no ter nenhum 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 em 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 tamanho 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 varivel nSize).
*locos de Cdigo
Blocos de cdigo so um conceito existente h muito tempo em linguagens 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.
'm Primeiro ,em)rete
O AdvPl uma linguagem baseada em funes. Funes tm um valor de retorno. Assim como o operador
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, no caso de atribuies isso acontece ao
contrrio, da direita para a esquerda. O valor atribudo varivel X, que retorna o valor para ser atribudo
varivel Y e assim sucessivamente. Pode-se dizer que o zero foi "propagado atravs da expresso".
3utro ,em)rete
Em AdvPl pode-se juntar diversas linhas de cdigo em uma nica linha fscia do arquivo. Por exemplo, o
cdigo:
If lAchou
Alert("Cliente encontrado!")
Endif
pode ser escrito assim:
If lAchou ; Alert("Cliente encontrado!") ;
Endif
O ponto-e-vrgula indica ao AdvPl que a nova linha de cdigo est para comear. Pode-se ento colocar
diversas linhas lgicas de cdigo na mesma linha fsica atravs do editor de texto utilizado.
Apesar da possibilidade de se escrever todo o programa assim, em uma nica linha fsica, isto no
recomendado pois dificulta a legibilidade do programa e, conseqentemente, a manuteno.
,ista de 6press4es
A evoluo dos blocos de cdigo comea com as listas de expresses. Nos exemplos a seguir, 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 ,inhas 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 ,inha de Cdigo em 'ma C 'tili(ando Ponto-e-!rgula
Este o mesmo cdigo que o anterior, apenas escrito em uma nica linha:
Alert( cValToChar( x := 10 ; y := 20 ) ) ==> 10
Apesar desse cdigo se encontrar em uma nica linha fsica, existem 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 ,ista de 6press4es
Quando parnteses so colocados ao redor do cdigo e o sinal de ponto-e-vrgula substitudo por uma
vrgula apenas, o cdigo torna-se uma lista de expresses:
Alert( cValToChar ( ( X := 10 , Y := 20 ) ) ) ==> 20
O 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 cdigo 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 lista de
expresses. Na prtica, o nmero mximo por volta de 500 smbolos.
Debugar listas de expresses difcil porque as expresses no esto divididas em linhas de 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.
3nde Pode-se 'tili(ar uma ,ista de 6press4esD
O propsito principal de uma lista de expresses agrup-las em uma nica unidade. Em qualquer 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 aconteceria.
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 ,istas de 6press4es para *locos 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 pequeno 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 linha 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 resultado, 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:
( 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}
6ecutando um *loco de Cdigo
Diferentemente de uma matriz, no se pode acessar elementos de um bloco de cdigo atravs de um ndice
numrico. Porm blocos de cdigo so semelhantes a uma lista de expresses, e a uma pequena 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 ParEmetros
J que blocos de cdigo so como pequenas funes, tambm possvel a passagem de parmetros para
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
'tili(ando *locos de Cdigo
Blocos de cdigo podem ser utilizados em diversas situaes. Geralmente so utilizados para executar
tarefas quando eventos de objetos so acionados ou para modificar o comportamento padro de algumas
funes.
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 pode ser modificado atravs da
informao de um bloco de cdigo que ordena a matriz de forma descendente:
B := { |X, Y| X > Y }
aSort(A, B)
O bloco de cdigo (de acordo com a documentao da funo asort) deve 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
!uic"#ort) 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 verdadeira se os elementos esto em ordem
descendente, o que significa que o primeiro valor maior que o segundo.
Para ordenar a mesma matriz pelo ltimo nome, tambm em orden descendente, pode-se utilizar 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 imediatamente 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, pode-se utilizar o seguinte
bloco de cdigo:
B := { |X, Y| X[1] > Y[1] }
Criao e Atribuio de Variveis
atrizes
3 Conte6to de !ari5veis dentro de um Programa
As variveis declaradas em um programa ou funo, so visveis de acordo 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
"#A#IC
$%IVA#E
$&!LIC
O AdvPl no rgido em relao declarao de variveis no comeo do programa. 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 varivel caso ela
no tenha sido declarada anteriormente. A varivel ento criada como se tivesse sido declarada como
Private.
Devido a essa caracterstica, quando pretende-se fazer uma atribuio a uma varivel declarada
previamente mas escreve-se o nome da varivel de forma incorreta, o AdvPl no gerar nenhum
erro de compilao ou de execuo. Pois compreender o nome da varivel escrito de forma
incorreta como se fosse a criao de uma nova varivel. Isto alterar a lgica do programa, e um
erro muitas vezes difcil de identificar.
!ari5veis ,ocais
Variveis locais so pertencentes apenas ao escopo da funo onde foram declaradas. Devem ser
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 funo 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 funo retorne o
controle para o cdigo que a executou). Se uma funo chamada recursivamente (por exemplo, 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 recursivamente, apenas as
variveis locais criadas na mais recente ativao so visveis.
!ari5veis st5ticas
Variveis estticas funcionam basicamente como as variveis locais, mas mantm seu valor atravs da
execuo. Variveis estticas devem ser declaradas explicitamente no cdigo com o identificador STATIC.
O escopo das variveis estticas depende de onde so declaradas. Se forem declaradas dentro 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:
4unction Pai56
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente 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 funo Pai.
!ari5veis Privadas
A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente com o
identificador PRIVATE.
Adicionalmente, a atribuio de valor a uma varivel no criada anteriormente automaticamente cria a
varivel como privada. Uma vez criada, uma varivel privada continua a existir e mantem 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 onde a varivel j
havia sido criada). A nova varivel privada ir esconder qualquer outra varivel privada ou pblica (veja a
documentao sobre variveis p'blicas) com o mesmo nome enquanto existir.
Uma vez criada, uma varivel privada visvel em todo o programa 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 inacessvel at que a nova
varivel privada seja destruda).
Em termos mais simples, uma varivel privada visvel dentro da funo de criao e todas as funes
chamadas por esta, a menos que uma funo chamada crie sua prpria varivel privada com o mesmo
nome.
Por exemplo:
4unction Pai56
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 de nVar anterior se tornar
acessvel novamente.
!ari5veis PF)licas
Pode-se criar variveis pblicas dinamicamente no cdigo com o identificador PUBLIC. As variveis pblicas
continuam a existir e mantm seu valor at o fim da execuo.
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 existente.
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 seja destruda. Por
exemplo:
Function Pai()
Public nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Neste exemplo, nVar criada como pblica e inicializada com o valor 10. Quando a funo Filha
executada, nVar ainda existe e pode ser acessada. Diferente de variveis locais ou privadas, nVar ainda
existe aps o trmino da a execuo da funo Pai.
Diferentemente dos outros identificadores de escopo, quando uma varivel declarada como
pblica sem ser inicializada, o valor assumido falso (.F.) e no nulo (nil).
Di.erenciao entre vari5veis e nomes de campos
Muitas vezes uma varivel pode ter o mesmo nome que um campo de um arquivo ou tabela aberto no
momento. Neste caso, o AdvPl privilegiar o campo. Assim uma referncia a um nome que identifique tanto
uma varivel como um campo, resultar no contedo do campo.
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 valor atribudo varivel cRes deve ser o valor da varivel de
memria chamada NOME.
cRes := FIELD->NOME
Neste caso, o valor atribudo varivel cRes ser o valor do campo NOME existente no arquivo ou tabela
aberto na rea atual.
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 de apelidos, consulte a documentao
sobre acesso a banco de dados ou a documentao da funo dbUseArea.
3peradores Comuns
Na documentao sobre variveis h uma breve demonstrao de como atribuir valores a uma varivel 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 resultado 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 calcular o salrio lquido aps um aumento. Os
operandos de uma expresso podem ser uma varivel, uma constante, um campo de arquivo ou uma
funo.
3peradores %atem5ticos
Os operadores utilizados em AdvPl para clculos matemticos so:
+ Adio
- Subtrao
* Multiplicao
/ Diviso
** ou ^ Exponenciao
% Mdulo (Resto da Diviso)
3peradores 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)
3peradores Relacionais
Os operadores utilizados em AdvPl para operaes e avaliaes relacionais so:
< Comparao Menor
> Comparao Maior
= Comparao Igual
== Comparao Exatamente Igual (para caracteres)
<= Comparao Menor ou Igual
>= Comparao Maior ou Igual
<> ou # ou != Comparao Diferente

3peradores ,gicos
Os operadores utilizados em AdvPl para operaes e avaliaes lgicas so:
.And. E lgico
.Or. OU lgico
.Not. ou ! NO lgico
Variveis de emria
Estruturas de Controle
3peradores de Atri)uio
Os operadores utilizados em AdvPl para atribuio de valores a variveis de memria so:
= 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
**= ou ^= Exponenciao e Atribuio em Linha
%= Mdulo (resto da diviso) e Atribuio em Linha

Atri)uio Simples
O sinal de igualdade utilizado para atribuir valor a uma varivel de memria.
nVariavel = 10
Atri)uio em ,inha
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 pode-se atribuir mais
de uma varivel ao mesmo tempo.
nVar1 := nVar2 := nVar3 := 0
Quando diversas variveis so inicializadas em uma mesma linha, a atribuio comea da direita para a
esquerda, ou seja, nVar3 recebe o valor zero inicialmente, nVar2 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 tambm pode ser utilizado para substituir valores de campos em um
banco de dados.
Atri)uio Composta
Os operadores de atribuio composta so uma facilidade da linguagem AdvPl para expresses de clculo e
atribuio. Com eles pode-se economizar digitao:
Operador Exemplo Equivalente a
+= X += Y X = X + Y
-= X -= Y X = X - Y
*= X *= Y X = X * Y
/= X /= Y X = X / Y
**= ou ^= X **= Y X = X ** Y
%= X %= Y X = X % Y
Variveis de emria
Estruturas de Controle
3peradores de $ncremento7Decremento
A linguagem AdvPl possui operadores para realizar incremento ou decremento de variveis. Entende-se por
incremento aumentar o valor de uma varivel numrica em 1 e entende-se por decremento diminuir o valor
da varivel em 1. Os operadores so:
++ Incremento Ps ou Pr-fixado
-- Decremento Ps ou Pr-fixado

Os operadores de decremento/incremento podem ser colocados tanto antes (pr-fixado) como depois (ps-
fixado) do nome da varivel. Dentro de uma expresso, a ordem do operador muito importante, podendo
alterar o resultado da expresso. Os operadores incrementais so executados 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 execuo destas duas linhas
a varivel nB contendo 21 e a varivel nA contendo 11.
No entanto:
Local nA := 10
Local nB := ++nA + nA
Resulta em 22, pois o operador incremental aumentou o valor da primeira nA antes que seu valor fosse
considerado.
Variveis de emria
Estruturas de Controle
3peradores speciais
Alm dos operadores comuns, o AdvPl possui alguns outros operadores ou identificadores. Estas so suas
finalidades:
() 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 de precedncia
da avaliao da expresso (segundo as regras matemticas por exemplo). Tambm servem para envolver os
argumentos de uma funo. Veja a documentao sobre preced(ncia de operadores para maiores
detalhes.
Os colchetes so utilizados para especificar um elemento especfico de uma matriz. Por exemplo, A[3,2],
refere-se ao elemento da matriz A na linha 3, coluna 2.
As chaves so utilizadas para a especificao de matrizes literais ou blocos de cdigo. Por exemplo,
A:={10,20,30} cria uma matriz chamada A com trs elementos.
O smbolo 78 identifica um campo de um arquivo diferenciando-o de 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 9 identifica uma avaliao de expresso atravs de macro e visto em detalhes na
documentao sobre macrossubstituio.
O smbolo : utilizado para indicar que durante a passagem de 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 passagem de uma varivel para uma funo ou
procedimento ela seja tomada como um e valor no como referncia.
Variveis de emria
Estruturas de Controle
3rdem de PrecedGncia dos 3peradores
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 direita 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
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 finalmente as adies resultando em
2+5+15+8(=30).
Alterao da PrecedGncia
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 parnteses. 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 avaliao ocorrer do
parnteses mais intero em direo ao mais externo.
Variveis de emria
Estruturas de Controle
%acro Su)stituio
O operador de macro substituio, simbolizado pelo "e" comercial (&), utilizado para a avaliao de
expresses em tempo de execuo. Funciona como se uma expresso armazenada 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, enquanto a varivel Y atribuda com a string de caracteres
contendo "X + 1".
A terceira linha utiliza o operador de macro. Esta linha faz com que o nmero 11 seja 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 linha, Y definido
como "X + 1", ento pode-se substituir Y na terceira linha:
03 B := &"X + 1"
O operador de macro cancela as aspas:
03 B := X + 1
Pode-se perceber que o operador de macro remove as aspas, o que deixa um pedao de cdigo para ser
executado. Deve-se ter em mente que tudo isso acontece em tempo de execuo, o que torna 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 string de caracteres (X
nos exemplos anteriores) no podem ser locais.
Variveis de emria
Estruturas de Controle
Controlando o Hlu6o
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 repetio 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 identificador de incio e um
de fim, e qualquer estrutura aninhada deve se encontrar entre estes identificadores.
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 #ifndef...#endif. Consulte a
documentao sobre o pr-processador para maiores detalhes.
As estruturas de controle em AdvPl esto divididas em Estruturas de %epetio e Estruturas de )eciso.
Variveis de emria
Operadores da Linguagem
Repetio de Comandos
Estruturas de repetio so deseginadas para executar uma seo de cdigo mais de uma vez. Por exemplo,
imagiando-se a existncia de uma funo para imprimir um relatrio, pode-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 fosse varivel.
Em AdvPl existem dois comandos para a repetio de sees de cdigo. O comando *O%+++,E-# e o
comando ./ILE+++E,))O.
3 Comando H3RIII&JT
A estrutura de controle FOR...NEXT, ou simplesmente o loop FOR, repete uma seo de cdigo em um
nmero determinado de vezes.
Sinta0e
FOR $ariavel %& n$alor'nicial TO n$alorinal (STEP n'ncremento)
Comandos***
[EXIT]
[LOOP]
NEXT
Par<metros
Variavel Especifica uma varivel ou um elemento de uma matriz para atuar como um contador. A
varivel ou o elemento da matriz no precisa ter sido declarado antes da execuo do
comando FOR...NEXT. Se a varivel no existir, ser criada como uma varivel privada.
n$alor'nicial +O
n$alorinal
nValorInicial o valor inicial para o contador; nValorFinal o valor final para o contador.
Pode-se utilizar valores numricos literais, variveis ou expresses, contanto que o resultado
seja do tipo de dado numrico.
STEP n'ncremento nIncremento a quandidade que ser incrementada ou decrementada no contador aps 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 literais, variveis ou expresses, contanto que o resultado seja do
tipo de dado numrico.
Comandos Especifica um ou mais instrues de comando AdvPl que sero executadas.
EXIT Transfere o controle de dentro do comando FOR...NEXT para 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 Retorna o controle diretamente para a clusula FOR sem executar o restante dos comandos
entre o LOOP e o NEXT. O contador incrementadou ou decrementado normalmente, como
se o NEXT tivesse sido alcanado. Pode-se colocar o comando LOOP em qualquer lugar entre
o FOR e o NEXT.
(omentrios
Uma varivel ou um elemento de uma matriz utilizado como um contador para especificar 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 incrementado 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 contido em nValorFinal,
a estrutura FOR...NEXT terminada e o programa continua a execuo no primeiro comando aps o NEXT.
Os valores de nValorInicial, nValorFinal e nIncremento so apenas considerados inicialmente. Entretanto,
mudar o valor da varivel utilizada como contador dentro da estrutura afetar o nmero de vezes que a
repetio ser executada. Se o valor de nIncremento negativo e o valor de nValorInicial maior que o de
nValorFinal, o contador ser decrementado a cada repetio.
'0emplo
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
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 utilizada, a varivel nCnt
ser sempre incrementada em 2. E como o contador comea com 0, seu valor sempre ser um nmero par.
./ILE+++E,))O
I*+++E,)I*
)O CA"E+++E,)CA"E
3 Comando >K$,III&DD3
A estrutura de controle WHILE...ENDDO, ou simplesmente o loop WHILE, repete uma seo de cdigo
enquanto uma determinada expresso resultar em verdadeiro (.T.).
Sinta0e
WHILE l,-pressao
Comandos***
[EXIT]
[LOOP]
ENDDO
Par<metros
lExpressao Especifica uma expresso lgica cujo valor determina quando os comandos entre o WHILE e o
ENDDO so executados. Enquanto o resultado de lExpressao for avaliado como verdadeiro (.T.), o
conjunto de comandos so executados.
Comandos Especifica um ou mais instrues de comando AdvPl que sero executadas enquanto lExpressao
for avaliado como verdadeiro (.T.).
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.
(omentrios
Os comandos entre o WHILE e o ENDDO so executados enquanto o resultado da avaliao da expresso em
lExpressao permanecer verdadeiro (.T.). Cada palavra chave WHILE deve ter uma palavra chave ENDDO
correspondente.
'0emplo
Local nNumber := nAux := 350
nAux := Int(nAux / 2)
While nAux > 0
nSomaPar += nCnt
Next
Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )
Return
*O%+++,E-#
I*+++E,)I*
)O CA"E+++E,)CA"E
Desviando a 6ecuo
Estruturas de desvio so deseginadas para executar uma seo de cdigo se determinada condio lgica
resultar em verdadeiro (.T.). Em AdvPl existem dois comandos para execuo de sees de cdigo de
acordo com avaliaes lgicas. O comando I*+++E,)I* e o comando DO CASE...ENDCASE.
3 Comando $HIII&D$H
Executa um conjunto de comandos baseado no valor de uma expresso lgica.
Sinta0e
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
Par<metros
lExpressao Especifica uma expresso lgica que avaliada. Se lExpressao resultar 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 definida, qualquer comando aps
essa clusula e anterior ao ENDIF ser executada. Se a clusula ELSE no for definida, todos os
comandos entre o IF e o ENDIF so ignorados. Neste caso, a execuo do programa continua
com o primeiro comando seguinte ao ENDIF.
Comandos Conjunto de comandos AdvPl que sero executados dependendo da avaliao da expresso
lgica em lExpressao.
(omentrios
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 )O CA"E+++E,)CA"E.
'0emplo
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
Endif
Return
./ILE+++E,))O
*O%+++,E-#
)O CA"E+++E,)CA"E
3 Comando D3 CASIII&DCAS
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em verdadeiro (.T.).
Sinta0e
DO CASE
CASE lExpressao1
Commandos
[CASE lExpressao2
Commandos
...
CASE lExpressaoN
Commandos]
[OTHERWISE
Commandos]
ENDCASE
Par<metros
CA#,
lExpressao1
Comandos...
Quando a primeira expresso CASE resultante em verdadeiro (.T.) for encontrada, o
conjunto de comandos seguinte executado. A execuo do conjunto de comandos
continua at que a prxima clusula CASE, OTHERWISE ou ENDCASE seja encontrada.
Ao terminar de executar esse conjunto 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 primeiros comandos cuja
expresso CASE avaliada como verdadeiro (.T.). Aps a execuo, qualquer outra
expresso CASE posterior ignorada (mesmo que sua avaliao resultasse em
verdadeiro).
O+.,R/'#,
Commandos
Se todas as expresses CASE forem avaliadas como falso (.F.), a clusula OTHERWISE
determina se um conjunto adicional de comandos deve ser executado. Se essa clusula
for incluida, os comandos seguintes sero executados e ento o programa continuar
com o primeiro comando seguinte ao ENDCASE. Se a clusula OTHERWISE for omitida, a
execuo continuar normalmente aps a clusula ENDCASE.
(omentrios
O Comando DO CASE...ENDCASE utilizado no lugar do comando I*+++E,)I* quando um nmero maior do
que uma expresso deve ser avaliada, substituindo a necessidade de mais de um comando IF...ENDIF
aninhados.
'0emplo
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
./ILE+++E,))O
*O%+++,E-#
I*+++E,)I*
,ista de Palavras Reservadas
AADD DTOS INKEY REPLICATE VAL
ABS ELSE INT RLOCK VALTYPE
ASC ELSEIF LASTREC ROUND WHILE
AT EMPTY LEN ROW WORD
BOF ENDCASE LOCK RTRIM YEAR
BREAK ENDDO LOG SECONDS
CDOW ENDIF LOWER SELECT
CHR EOF LTRIM SETPOS
CMONTH EXP MAX SPACE
COL FCOUNT MIN SQRT
CTOD FIELDNAME MONTH STR
DATE FILE PCOL SUBSTR
DAY FLOCK PCOUNT TIME
DELETED FOUND PROCEDURE TRANSFORM
DEVPOS FUNCTION PROW TRIM
DOW IF RECCOUNT TYPE
DTOC IIF RECNO UPPER

Notas:
Palavras reservadas no podem ser utilizadas para variveis, procedimentos, ou funes.
Funes reservadas so pertencentes ao compilador e portanto no podem ser redefinidas 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 reservados.
4U!=>O ??// 5@matriA8B@e0pr86
Adiciona dinamicamente um novo elemento, com o valor da expr no fim da matriz.
aArray := {} // Result: aArray is an empty array
AADD(aArray, 5) // Result: aArray is { 5 }
AADD(aArray, 10) // Result: aArray is { 5, 10 }
AADD(aArray, { 12, 10 } // Result: aArray is { 5, 10, { 12, 10 } }
4U!=>O ?BS 5@e0pr!86
Retorna o valor absoluto (valor numrico no negativo) de exprN
4U!=>O ?S( 5@e0pr(86
Retorna o codigo ASCII do primeiro caractere da expreC
4U!=>O ?T 5@e0pr(18B@e0pr(%86
Retorna a posio inicial de exprC1 em exprC2. Se no encontrar, retorna o valor 0.
4U!=>O BO4 56
Retorna .T. se o inicio do banco de dados ativo for atingido com um camando SKIP nC
4U!=>O BR'?D 5@e0pr86
Sai fora da sequencia corrente, exatamente com a declarao BREAK.
4U!=>O (/OE 5@e0pr86
Retorna l nome do dia da semana (Sanday-Saturday).
4U!=>O (FR 5@e0pr86
Retorna o caractere ASCII equivalente ao cdigo exprN.
4U!=>O (MO!TF 5@e0pr/86
Retorna o nome do ms (janeiro-dezembro) da expresso tipo data.
4U!=>O (O3 56
Retorna o nmero da coluna do vdeo onde o curso est posicionado.
4U!=>O (TO/ 5@e0pr(86
Retorna a exprC convertida para o formato tipo data.
4U!=>O /?T' 5@e0pr86
Retorna a data mantida pelo Sistema Operacional.
4U!=>O /?G 5@e0pr86
Retorna o nmero do dia (1-31) da expreo tipo data exprD.
4U!=>O /B-OTOP 56
Posiciona o indicador de registro no primeiro registo do banco de dados ativo.
4U!=>O /BS''D 5@e0pr8B@e0pr386
Posiciona no primeiro registro cuja chave da indice satisfaa a expresso.
4U!=>O /BS'3'(T?R'? 5@narea8B@alias86
Seleciona a rea de trabalho especificada.
4U!=>O /BS'T4H3T'R 5@bloco8Be0pr($6
Define um filtro. Bloco "Bloco de codigo que expressa a condio de filtro na executada, experC "Valor que
expresa a condio de filtro na forma textual.
4U!=>O /BS'TOR/'R 5@e0pr!86
Designa como indice mestre o exprN-simo indice da lista de indices do banco de dados ativo.
TAcnicas de Programao .iciente em AdvPl
Para o desenvolvimento de sistemas e a programao de rotinas, sempre esperado que qualquer 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 Hun4es Segundo a &ecessidade
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 escolhida pelo
usurio em uma funo de dilogo "sim/no" designada para isso. Pode 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 mais 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 realiza nada
adicional chamada de GetOk, podendo ser substituda por uma chamada direta desta, continuando a
funcionar corretamente.
Codi.icao Auto-Document5vel
Nenhum comentrio substitui um cdigo claramente escrito, e este no um um acidente. Considere o
exemplo:
cVar := " " // 11 espaos
O tamanho da varivel cVar no evidente por si s e no facilmente verificado. Estes mesmos 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 repetidos. 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.
'tili(ao de Solu4es Simples
Simplicidade na criao de instrues torna a programao e at mesmo a execuo mais rpida. Considere
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 falhar 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 a seguir:
If cVar == "A" .Or. cVar == "B" .Or ;
cVar == "C" .Or. cVar == "D"
Pode ser substitudo pelo operador de conteno:
If cVar $ "ABCD"
3po por Hle6i)ilidade
A melhor soluo aquela que envolve o problema imediato e previne problemas no futuro. Considere o
exemplo:
@nRow,nCol PSAY cVar Picture "!!!!!!!!!!!!!!!!!!!!"
Exceto contando-se os caracteres, no existe maneira de saber se o nmero de caracteres de exclamao
o esperado. Enquanto isto um problema, existem algo mais grave. A expresso de picture esttica. Se no
futuro for necessrio ajustar o tamanho da varivel cVar, ser necessrio localizar todos os lugares no
cdigo onde esta mscara de picture est sendo utilizada para ajuste manual. Existe uma 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 "@!"
3po da Praticidade ao Drama
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 casos, 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"
'tili(ao de 3peradores de $ncremento7Decremento
Utilizados devidamente, os operadores de incremento e decremento tornam 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 detalhes, consulte
a documentao de operadores da linguagem AdvPl.
vitar Passos Desnecess5rios
Existe uma diferena entre um bom hbito e perda de tempo. Algumas vezes estes conceitos podem estar
muito prximos, mas um modo de diferenci-los balancear os benefcios de realizar alguma 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 seguro 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 princpio, o que far com
que uma exceo em tempo de execuo acontea quando a instruo de repetio while for executada.
Diferentemente do primeiro exemplo, onde a inicializao da varivel no fazia diferena alguma, neste
segundo exemplo a inicializao absolutamente necessria. Deve-se procurar inicializar variveis
numricas com zero (0) e variveis caracter com string nula ("") apenas quando realmente necessrio.
'tili(ao de Alternativas
Quando se est trabalhando em uma simples rotina, deve-se tomar algum tempo para explorar duas ou trs
diferentes abordagens. Quando se est trabalhando em algo mais complexo, 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 /ith 01risalho0
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. Este cdigo foi ento
convertido e armazenado como uma string. Pode-se notar que a cor "Preto" ser atribuda se nenhuma outra
opo for verdadeira.
Uma alternativa que reduz o nvel de identao torna o cdigo mais fcil de ler enquanto reduz 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
'tili(ao de ArLuivos de Ca)ealho 8uando &ecess5rio
Se um arquivo de cdigo criado se referencia a comandos para interpretao e tratamento de arquivos XML,
este deve se incluir o arquivo de cabealho prprio para tais comandos (XMLXFUN.CH no exemplo). Porm
no deve-se incluir arquivos de cabealho apenas por segurana. Se no se est referenciando nenhuma das
constantes ou utilizando nenhum dos comandos contidos em um destes arquivos, a incluso apenas tornar
a compilao mais demorada.
Constantes em %aiFsculo
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.
'tili(ao de $dentao
Este um hbito que todo programador deve desenvolver. No consome muito esforo para manter o cdigo
alinhado durante o trabalho, porm quando necessrio pode-se utilizar 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 as estruturas de controle de fluxo (while, 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)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
'tili(ao de spaos em *ranco
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 funciona muito bem.
Costuma-se separar parmetros com espaos em branco.
8ue)ra de ,inhas %uito ,ongas
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-e-
vrgula (;).
Capitulao de Palavras-Chave
Uma conveno amplamente utilizada a de capitular as palavras chaves, funes, variveis e campos
utilizando uma combinao de caracteres em maisculo e minsculo, visando facilitar a leitura do cdigo
fonte. O cdigo a seguir:
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
'tili(ao da &otao KFngara
A Notao Hngara muito comum entre programadores xBase e de outras linguagens. A documentao 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 AdvPl.
'tili(ao de &omes Signi.icantes para !ari5veis
A principal vantagem da liberdade na criao dos nomes de variveis a facilidade de identificao da sua
utilidade. Portanto deve-se utilizar essa facilidade o mximo possvel. Nomes sem sentido apenas tornaro
difcil a identificao da utilidade de uma determinada varivel, assim como nomes extremamente curtos.
Nem sempre a utilizao de uma varivel chamada i a melhor sada. Claro, no convm criar uma varivel
com um nome muito longo que ser utilizada como um contador, e referenciada muitas vezes no cdigo. O
bom senso deve ser utilizado.
Criar variveis como nNumero ou dData tambm no ajudam na identificao. A Notao Hngara j est
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 devem descrever um pouco sobre o que a funo faz.
Novamente nomes extremamente curtos no so aconselhveis.
'tili(ao de Coment5rios
Comentrios so muito teis na documentao de programas criados e para facilitar a identificao de
processos importantes no futuro. Devem sempre ser utilizados.
Sempre que possvel, funes criadas devem ter uma breve descrio do seu objetivo, parmetros e retorno.
Alm de servir como documentao, os comentrios embelezam o cdigo ao separar as funes umas 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 %ensagens SistGmicas Signi.icantes e Consistentes
Seja oferecendo assistncia, exibindo mensagens de aviso ou mantendo o usurio informado 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\SB1990.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 incomodado com tais
detalhes. Apenas a frase "Aguarde, indexando." funcionaria corretamente, assim como palavras
"processando" ou "reorganizando".
Outra boa idia evitar a referencia a um item corrente de uma tabela como um "registro":
"Deletar este registro?"
Se a operao estiver sendo efetuada em um arquivo de clientes, o usurio deve ser questionado sobre a
remoo do cliente corrente, se possvel informando valores de identificao como o cdigo ou o nome.
vitar A)reviao de Comandos em M letras
Apesar do AdvPl suportar a abreviao de comandos em quatro letras (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.
vitar NDis.arcesN no Cdigo
No deve-se criar constantes para expresses complexas. Isto tornar o cdigo muito difcil de compreender
e poder causar erros primrios, pois pode-se imaginar que uma atribuio efetuada a uma varivel
quando na verdade h toda uma expresso disfarada:
#define NUMLINES aPrintDefs[1]
#define NUMPAGES aPrintDefs[2]
#define ISDISK aReturn[5]
If ISDISK == 1
NUMLINES := 55
Endif
NUMPAGES += 1
A impresso que se tem aps uma leitura deste cdigo de que valores esto sendo atribuidos s variveis
ou que constantes esto sendo utilizadas. Se o objetivo flexibilidade, o cdigo anterior deve ser substitudo
por:
#define NUMLINES 1
#define NUMPAGES 2
#define ISDISK 5
If aReturn[ISDISK] == 1
aPrintDefs[ NUMLINES ] := 55
Endif
aPrintDefs[ NUMPAGES ] += 1
vitar Cdigo de Segurana Desnecess5rio
Dada sua natureza binria, tudo pode ou no acontecer dentro de um computador. Adicionar pedaos de
cdigo apenas para "garantir a segurana" freqentemente utilizado como uma desculpa para evitar
corrigir o problema real. Isto pode incluir a checagem para validar intervalos de 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 tipo de "captura"
o que torna a depurao difcil, j que o retorno ser sempre um valor vlido (mesmo que o parmetro
recebido seja de tipo de dado incorreto). Se esta captura no tiver sido efetuada quando um possvel erro
de tipo de dado invlido ocorrer, o cdigo pode ser corrigido para que este erro no mais acontea.
$solamento de Strings de Te6to
No caso de mensagens e strings de texto, a centralizao um bom negcio. Pode-se colocar mensagens,
caminhos para arquivos, e mesmo outros valores em um local especfico. 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 lugar do cdigo. E
mant-las em um nico lugar, como um arquivo de cabealho, torna fcil a produo de documentao e a
internacionalizao em outros idiomas.
Ta)ela de Pictures de Hormatao
Comando SAO7PSAO
Funes
C Exibe CR depois de nmeros positivos
E Exibe numricos com o ponto e a vrgula invertidos (formato Europeu)
R Insere caracteres diferentes dos caracteres de template
X 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 Exibe dgitos para qualquer tipo de dado
9 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
Comando 2T
Funes
A Permite apenas caracteres alfabticos
C Exibe CR depois de nmeros positivos
E Exibe numricos com o ponto e vrgula invertidos (formato Europeu)
R Insere caracteres diferentes dos caracteres de template na exibio mas no insere-os na varivel
do GET
S<n> Permite rolamento horizontal do texto dentro do GET, <n> um nmero inteiro que identifica o
tamanho da regio
X Exibe DB depois de nmeros negativos
Z Exibe zeros como brancos
( Exibe nmeros negativos entre parnteses com os espaos em branco iniciais
) Exibe nmeros negativos entre parnteses sem os espaos em branco iniciais
! Converte caracteres alfabticos para maisculo

Pre.5cio
Existe um ditado chins que diz: "O Homem no tropea em montanhas, tropea em pedregulhos, 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 companheiros 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 dispostos a trabalhar
em equipe, trocarmos conhecimento e discernimento nas decises, pensarmos mais no todo porm se
importando com as partes que o compe?
Seria mais interessante se ao caminharmos por um parque, prestssemos mais ateno nas rvores, no
caminho, nas flores, no canto dos passarinhos sem se esquecer do objetivo do passeio, sem perder a noo
de tempo e distncia, mas curtindo muito a paisagem, o detalhe.
Agora vamos traar um paralelo com o nosso dia a dia. No seria melhor ao reservarmos um fonte,
verificarmos com mais ateno:
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 usurio 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 campo 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 aquela 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 avaliamos o fonte para
evitarmos NOVOS BOPS? Ao resolver uma ocorrncia lembre-se de todos os pontos de implicao da sua
atividade. O que isso ir impactar no servio do outro? Sem falar em documentar no Quark!
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 menor. 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 comunica, 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 em equipe com um alto nvel de qualidade e detalhes; este manual, que
foi constitudo em apenas 2 dias, com a colaborao de mais de 20 pessoas, focadas em seus objetivos, se
atentando cada um com o seu tema. O resultado? Um trabalho excelente, um documento para nos ajudar a
sermos melhores e no errarmos no fcil!
3 8ue A Ha(er um Programa com $nteligGncia
Precisamos entender, antes de mais nada, o que inteligncia.
Segundo o dicionrio Michaelis, inteligncia significa: faculdade de entender, pensar, raciocinar e
interpretar;
Compreenso, conhecimento profundo.
De acordo com essa definio, se pretendemos utilizar nosso bem mais precioso em nosso trabalho, vamos
precisar desenvolver alguns hbitos:
Devemos estudar o programa antes de comear a desenvolver. Imagine prestar um concurso 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 das 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.
Ao criar uma funo, certifique-se de que no cabealho conste algumas informaes bsicas como: descrio
da funo, sintaxe, definio dos parmetros e autor. comum ao desenvolver uma funo, utilizarmos
outra j pronta como exemplo, e neste momento o "copiar/colar nos faz esquecer 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 esto claras, 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 existncia 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 desenvolvimento do sistema,
mas se medidas como estas no forem tomadas, o que era extremamente simples se tornar extremamente
trabalhoso.
Programando SimplesC mas Certo
Qual profissional da rea de informtica ainda no se deparou com um cdigo fonte que parecia estar escrito
em outro dialeto mesmo com todo conhecimento adquirido naquela linguagem, este fato geralmente ocorre
pela m utilizao de sintaxes complexas que nem sempre significam um bom funcionamento do sistema.
Um profissional da rea de informtica no possui nenhum modelo padro para desenvolver os seus
algoritmos, porm necessria a aplicao da tica profissional para que se possa desenvolver 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 possvel.
rros Lue Podem ser vitados
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 do processo se recupere
estes valores;
Evite retornar da funo antes do seu final, ou seja, crie preferencialmente um nico retorno;
Valide sempre o retorno do ponto de entrada;
Quando for gravar um arquivo que utiliza campos de outros arquivos, posicione todos 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 processos.
A $mportEncia de Programas Documentados
Todos sabemos o quanto difcil elaborar e manter uma documentao tcnica atualizada, ainda mais aqui
na Microsiga, cuja dinmica dos acontecimentos muitas vezes impede 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 comentrios a cada linha
de cdigo. Significa que os comentrios tm passar alguma informao relevante. Vemos comentrios
assim: "compara A com B e s. Isso bvio, a leitura do cdigo j nos diz isso. A documentao deve se
ater a conceitos, por exemplo: "Se A for maior que B, o arquivo de saldos ser atualizado, caso contrrio o
registro ser rejeitado para que o saldo no fique negativo.. Isto sim transmite alguma 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 ter 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 ateno 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 tarefa. 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 prprio cdigo.
Programas cujas variveis so declaradas como nX, cVAR1, dAUX, nNUM, etc., so extremamente difceis de
entender e pior, manter. conveniente que os nomes das variveis retratem seu uso ou destino. Por
exemplo: dDataDeS ou dDataDeE. Segundo as convenes da Microsiga, variveis do tipo DATA devem ser
iniciadas pela letra "d. Assim "Data, no acrescenta nada ao entendimento do que a varivel representa.
Nos sobrou o "dES e o "dEE para informar para que diados serve a bendita varivel. Ser sada, 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 objetivo e se colocar na
posio de quem no conhece o programa to pouco o assunto. Algum dia voc mesmo poder estar nessa
posio.
Ca)ealho de Programa 7 Huno
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 atualizada. 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 da ltima pessoa que alterou o fonte. O
cabealho de programa padro da Microsiga contm: rotina, autor, data do desenvolvimento, comentrio
sinttico e sintaxe.
Criao de !ari5veis
Na criao de uma varivel deve-se ter em mente alguns pontos fundamentais:
A declarao
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
3 Tipo de !ari5vel
O tipo de varivel serve para identificar a utilizao que a mesma ter no decorrer da rotina. Toda varivel
deve estar tipada durante sua criao. Quando programamos nativamente em "C, isto se torna obrigatrio.
Devemos fazer o mesmo no AP5, pois isto demonstra que a varivel foi conscientemente declarada.
Tipos 6istentes
PUB3H(: 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 ser vista (assim
como usada, alterada e avaliada) por qualquer funo. Esta varivel gera um token (indicao) na tabela de
smbolos, isto significa que o mdulo principal conter smbolos para esta classe de varivel, o que, por sua
vez, ocupa mais espao de memria. Deve-se evitar a utilizao deste tipo, a no ser em casos extremos.
PRHV?T': Esta varivel ser inicializada em valor nulo (NIL) e uma 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 como um varivel
PUBLIC. Esta varivel pode ser vista por uma sub-rotina da funo e modificada de maneira correspondente.
Esta varivel tambm gera um token na tabela de smbolos comentada acima.
3O(?3: Esta varivel de memria ser inicializada com valor nulo (NIL) e s visvel dentro 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, por 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 pode obter economia de
memria, mudando qualquer referncia PRIVATE para uma referncia LOCAL. Se voc fizer isso, as funes
podem no funcionar corretamente, embora funcionassem na verso anterior s alteraes.
ST?TH(: A varivel STATIC idntica classe de armazenamento LOCAL, com uma exceo. Uma varivel
STATIC retida dentro de sua sub-rotina, mesmo depois que o fluxo 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.
$niciali(ao
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.
Padroni(ao de !ari5veis
importante que ao lermos o nome de uma varivel, possamos saber se o seu tipo numrico, caracter,
data ou lgico. O nome da varivel de get no deve coincidir com uma varivel de outro programa, 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 este 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 !ari5vel 'tili(ando a Huno CR$A!AR+-
Esta funo cria uma varivel, retornando o valor do campo, de acordo com o dicionrio de dados. Avalia o
inicializador padro e retorna o contedo de acordo com o tipo de dado definido no dicionrio.
Sintaxe
uRet := CriaVar(cCampo,lIniPad,cLado)
Onde :
Uret -> tipo de retorno de acordo com o dicionrio de dados, considerando inicializador padro.
cCampo -> Nome do campo
LiniPad -> Indica se considera (.T.) ou no (.F.) o inicializador padrao (X3_RELACAO)
Clado -> Lado para inicializao padro
!ari5veis de Relatrios
Na criao de um relatrio algumas variveis e seus tipos so convencionados para a utilizao da biblioteca
de funes de relatrio.
Varivel Tipo Contedo
wnRel Local Nome default do relatrio em disco
cbCont Local Contador
Cabec1 Local 1 linha do cabealho do relatrio
Cabec2 Local 2 linha do cabealho do relatrio
Cabec3 Local 3 linha do cabealho do relatrio
Tamanho Local
Tamanho do Relatrio (P = Pequeno 80 colunas, M = Mdio 132 colunas, G =
Grande, 220 colunas)
cDesc1 Local 1 linha da descrio do relatrio
cDesc2 Local 2 linha da descrio do relatrio
cDesc3 Local 3 linha da descrio do relatrio
Limite Local Quantidade de colunas no relatrio (80,132,220)
Titulo Local Ttulo do Relatrio
AReturn Private Matriz com as informaes para a tela de configurao de impresso
Nomeprog Private Nome do programa do relatrio
CString Private Alias do arquivo principal do relatrio para o uso de filtro
Li Private
Controle das linhas de impresso. Seu valor inicial a quantidade mxima de linhas
por pgina utilizada no relatrio
m_pg Private Controle do nmero de pginas do relatrio
aOrd Private
Matriz contendo as ordens de layout para a impresso. Caso no existam vrias
ordens esta matriz deve estar vazia. Ex.: aOrd := {"Cdigo", "Descrio",
"Telefone"} -> O layout do relatrio vai depender da ordem selecionada na tela de
configurao de impresso
nLastKey Private Utilizado para controlar o cancelamento da impresso do relatrio
cPerg Private Nome da pergunta a ser exibida para o usurio
aLinha Private Matriz que contem informaes para impresso de relatrios cadastrais
Cuidados com o Posicionamento de Registros
O posicionamento correto de registros fundamental para a funcionalidade completa dos programas.
Algumas dicas para posicionamento de registros so :
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 forma 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 em 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 ateno, 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")
// Processamento
dbSkip()
Enddo
Ao criar uma funo que ir desposicionar registros, use a funo GETAREA() e RESTAREA(), 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
Huno 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")
Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave da busca xFilial("SB1") + 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 chave passada como parmetro, caso ela exista na chave do
indice.
Huno 6istcpo
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 retornado 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 .iltros
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()
3utros 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 criteriosa a fim de no cometermos o erro de misturarmos
unidades de medidas diferentes no mesmo clculo.
Con.rontando relatrios e consultas
Quando elaboramos um sistema, existem muitos relatrios que geram dados para outros relatrios e
consultas.
Devemos tomar cuidado para que no aconteam divergncias de informaes de um para o outro, como
por exemplo, no caso de valores.
Um bom exemplo disso, a rotina de impresso de folha de pagamento. Este relatrio exibe informaes
que so utilizadas em outros relatrios, tais como, valores para o FGTS, guia de recolhimento de impostos.
Uma soluo para que no se ocorra uma divergncia de valores, seria utilizar uma nica funo 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, entre outros, devem
ser confrontados entre relatrios e consultas para no gerarem informaes errneas ao cliente.
Normalmente estes problemas ocorrem em funes de critrios de filtragens diferenciados 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 outras situaes.
Este um tipo de no conformidade simples de ser evitada e que pode causar problemas 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.
Pro)lemas com ,ooping de Programas
O Protheus utiliza a tecnologia Cliente/Servidor. Isto significa que o aplicativo no mais executado
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 executvel estava na memria
da estao). Com o Protheus, todo o processamento est no Server e quando o programa est em looping
estaremos gradativamente "usando todo a CPU do Server e consequentemente parando todo o
processamento.
Se ao desenvolvermos uma rotina e a mesma entrar em looping (tiver apenas uma entrada e no tiver uma
sada do processamento), este processamento utilizar todos os recursos 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 rotina, um DbSkip() seria
o mais apropriado), utilizando todos os recursos de processamento do servidor, fazendo 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 abruptamente e todos os
demais usurios ficaro impossibilitados de utilizarem o sistema.
%anipulao de ArLuivos 6ternos 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 Client para o Server e vice-
versa utilizando uma conexo (TPC-IP,IPX,etc). Para copiar os arquivos, 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 te-to /ord da 2icrosoft3 os ar4uivos de imagens 562P37P,13etc) e-igem um lugar f8sico para
abertura dos documentos9imagens3 navegando pela 'nternet por e-emplo so copiados via cone-o para
um diret:rio tempor;rio no computador para serem visuali<ados*
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 Importao/Exportao de lanamentos,
exigindo serem utilizadas as funes CPYT2S() e CPYS2T() para manipulao 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 visualizar os lanamentos de origem da
importao no ter acesso, agora se for realizado a cpia do Client para o Server todos podero visualizar
(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 manipulem. Um exemplo
que no h necessidade de cpia so os arquivos gerados para contabilizao (CPROVA), pois estes so
gerados no prprio Server no havendo necessidade de cpia.
Os arquivos que podero ser copiados devero estar necessariamente embaixo do RootPath na configurao
do Server, isto , o diretrio DOCS do exemplo abaixo dever ser sub-diretrio do RootPath.
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 a cpia foi realizada com sucesso ou
no.
Desenvolvendo Telas
A aparncia e objetividade das telas num sistema base fundamental da interface Sistema x Usurio.
O AP5 j cria, automaticamente, a grande parte das telas de um mdulo, tais como a Browse, a GetDados e
Enchoice.
Algumas outras telas necessitam de construo "manual, ou seja, com a utilizao de comandos, tais como
"SAY , "GET e "LABEL, na Dialog.
Procure sempre colocar em tela as informaes que mais se objetivam com o assunto abordado.
Sempre que possvel, d preferncia aos campos obrigatrios primeiro. Isso facilita a digitao 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 informaes.
Quando o volume de informaes muito grande, divida os campos em folders, ou seja, pastas, 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_FO!ER, no SX3, com um nmero, agrupando-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_FO!ER e a descrio nos trs idiomas. Essa descrio que ser a informao
contida na pasta do folder. Exemplo: Os campos SZ1_ENDER, SZ1_NUM e SZ1_BAIRRO 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 vertical da tela, facilitando a
visualizao das informaes.
Evite tela com muitos botes. Isso poder confundir o usurio e induzi-lo ao erro. Utilize 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 sequncia 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 sair 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 excedam o tamanho da
caixa de dilogo definida. Isso, alm de no ser esttico, prejudica o entendimento da informao.
Salvando ArraBs padr4es
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 = Varivel publica que indica a posio do atual no acols (a Linha que est sendo editada na
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 ntrada
Dentro dos processos operacionais dos programas possvel criar "aberturas que possibilitam a execuo
de processos distintos a partir de uma rotina do sistema.
3)@etivo dos Pontos de ntrada
Deixar o sistema flexivl , pois isso permite uma grande variedade de desenvolvimento pelos nossos
analistas de suporte de acordo com a necessidade de cada tipo de cliente/implantao.
Permitir que o sistema seja o mais abrangente possvel de acordo com cada tipo de segmento de negcio.
8uando criar um Ponto de ntrada
O ponto de entrada tem resultado quando permite que um processo possa ser modificado, desde que ele no
seja crtico para o sistema.
Exemplo: Montagem das parcelas de pagamento de um pedido
Ele til em processos que podem ser diferentes de acordo com o tipo de negcio de cada empresa ou
estratgia adotada.
Ex: Relatrio de Pedido, Cadastro de Clientes
Sinta6e para criar um Ponto de ntrada;
Function TMKA010()
Local lRetorno := .F.
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 sim 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.
Conta)ili(ando
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 fiscal, um recebimento de
dinheiro, um pagamento na folha, entre outros.
Para quem est programando fundamental que este conceito esteja bastante sidimentado.
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 contabilizao. Este detalhe muito
importante pois o lanamento padro uma frmula e o posicionamento dos registros
fundamental. Exemplo : Na rotina de exclusao de nota fiscal deve-se executar a contabilizao
antes do comando dbDelete().
A chamada do lanamento contbil deve estar em um lugar estratgicamente correto, pois
teoricamente a ltima coisa a ser feita na rotina. No aconselhvel executar a contabilizao
e depois efetuar outros comandos.
Existem trs funes que devero ser utilizadas, para que seja criado um arquivo texto, contendo as
informaes a serem contabilizadas.
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 Huno KeadProva
Este funo cria o cabealho da contabilizao. tratada de forma diferenciada 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)
cNomProg -> Nome do Programa (Ex.: "ATFA060)
cUsuario -> Usurio arquivo: nome do arquivo (Ex.: cArquivo := ` `)
A .uno DetProva+-
Em primeiro lugar, deve-se estar posicionado no registro, que contm o valor ser contabilizado
Sintaxe:
ExpN1 := DetProva(ExpN2,ExpC1,ExpC2,ExpC3)
ExpN1 -> Valor Total da Contabilizao
ExpN2 -> Handle retornado da funo anterior
ExpC1 -> Cdigo do Lanamento Padro
ExpC2 -> Nome da rotina Geradora
ExpC3 -> Lanamento Padro
A .uno 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 (Lanamentos contbeis).
Exemplo:
CA100Incl( cArquivo, nHdlPrv, nOpcx, cLoteContabil, lDigita, lAglut, cOnLine, dData)
Onde:
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(ando SJ +AT'SJ-
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 compatibilizao 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 contrrio 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, criamos os menus do
sistema e onde disponibilizamos informaes para serem traduzidas para outros pases.
6emplo de atuali(ao no SJ;
Criao de ndice no Cadastro de Funcionrios- Suponhamos que seja necessrio um ndice por
Data de Admisso. Neste caso utilizaremos o SINDEX , onde devero ser alimentados basicamente o Alias
(SRA), a ordem , a chave de indexao (RA_ADMISSA) e sua descrio em Portugus. As descries
referentes s outras lnguas devero ficar a cargo do departamento de tradues. Numa atualizao 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 documentado 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.
SJ/ - ParEmetros 2enAricos
Esta tabela contm as perguntas, os valores armazenados e a ltima resposta utilizada para
processamento, impresso de relatrios , etc.
Todos os processamentos ou relatrios que tenham a opo de parametrizao, devero utilizar a
funo Pergunte para carregar os valores dos parmetros e/ou apresentar na tela as perguntas
relacionadas.
Como o usurio pode no utilizar a opo de parametrizao, devemos sempre carregar as variveis
MV_PARXX com os valores default ou com as ltimas respostas aplicadas, para evitar erros de
comparao de variveis.
SJ9 - %apeamento dos arLuivos
Armazena os Paths dos arquivos possibilitando que estes possam ser distribudos em diversos drives
ou diretrios.
SJP - Dicion5rio de Dados
Armazena informaes referentes s definies de todos os campos que existem no Protheus.
SJ" - Ta)elas 2enAricas
Armazena tabelas genricas utilizadas em todo sistema.
SJ# - ParEmetros
Elemento chave para a execuo de um processamento, que determina diferentes resultados
dependendo do seu contedo.
SJQ R 2atilhos
Rotina ou operao que disparada a partir de um evento get.
SJ7SJH - SeLSGnciaI 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 usurios poderiam estar utilizando o
mesmo nmero de pedido.
S$&DJ- ArLuivo de <ndices
Armazena todos os ndices padres.
Comandos De.inidos pelo 'su5rio +'DCTs-
Este recurso cria novas e infinitas possibilidades para modificar a maneira pela qual escrevemos o
cdigo de uma funo e a maneira pela qual podemos resolver problemas complexos. 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-processador que um
tradutor inteligente que atua antes da gerao do cdigo objeto.
Em sua maioria, isto se resume a encontrar os comandos no cdigo fonte e traduzi-los para
instrues e funes equivalentes que se acham no corpo da funo ou no contedo de arquivos .CH
(arquivos de cabealho). Este tipo de arquivo (.CH), contm diversos comandos que sero 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 tempo. No h a
necessidade de colocar o comando include em cada funo. Uma nica meno ao .CH no arquivo .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
#ENDIF
#INCLUDE
Cada um destes comandos pode ser colocado em qualquer parte do arquivo fonte, que ser lido
pelo pr-processador. No entanto, para facilitar a visualizao da existncia 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 _TESC 27
#DEFINE _LESC lastkey()
if _nLastkey == _TESC
RETURN
Endif
if _LESC == _TESC
RETURN
Endif
Esta diretiva muito til quando temos um valor constante vrias vezes repetido dentro do cdigo
fonte, que poder ser alterado com freqncia no decorrer da vida til da funo.
#IFDEF ou #IFNDEF <CONSTANTE>
<instrues>
#ELSE
<outras instrues>
#ENDIF
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 instrues>, sero
desprezadas. Mas se a <constante> no foi definida <IFNDEF> as <instrues> sero incorporadas 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 outras instrues do pr-
processador que possam ser comuns a diversos mdulos da rotina.
'so 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 strings, onde atravs de um
include acessaremos o texto em trs lnguas diferentes (Portugus, Espanhol e Ingls) dependendo da
forma da compilao.
convencionado que o nome do include seja o mesmo nome do fonte do relatrio para que a
manuteno deste relatrio seja o mais simples possvel.
Exemplo:
Relatrio -> FABR001.PRW
Include -> FABR001.CH
<ndices
A utilizao de ndices para a pesquisa deve ser bem analisada a fim de evitar lentido ou
processamentos redundantes nos relatrios.
Os ndices ajudam a otimizar as pesquisas e laos de processamentos, por isto no devem ser
subtilizados ou utilizados de forma errnea.
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 tornando assim os
relatrios mais geis e bem estruturados.
Criando e Deletando ArLuivos de tra)alho +Tempor5rios-
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 de Trabalho (Temporrio) com Indregua:
cArqNtx := 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 problemas futuros para
o cliente. Por isto, fundamental, que aps sua utilizao o mesmo seja descartado.
'tili(ando 8uerBs 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 Banco 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 $mportantes - D*H versus S8,
A princpio no existem diferenas na programao para a verso SQL, j que pelo prprio 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 dados relacional, que se utiliza de
tabelas ao invs de arquivos, e onde o sistema no tem acesso aos dados de forma nativa e sim atravs
do Top Connect. Essa forma de acesso adiciona ao sistema algumas das caractersticas e vantagens
oferecidas pelo SGBD em uso (por exemplo, o Oracle, MSSQL Server ou o DB2) como por exemplo
segurana e integridade referencial, e as imensas facilidades da linguagem SQL, mas por outro lado tem-
se tambm as implicaes da converso dos comandos no padro xBase para a perfeita compreenso no
ambiente SQL.
Imagine a montagem de uma expresso de filtro para um ndice 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 expresso de filtro pois
a mesma ser avaliada registro a registro durante a montagem do ndice. Mas no ambiente 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 o SGBD
no tem como reconhecer a varivel informada na expresso. Ela existe apenas no sistema ou, mais
especificamente, no seu programa. Por isso, deve-se substituir a expresso anteriormente exemplificada
pela seguinte (que tambm funcionaria perfeitamente em um ambiente xBase): "DTOS(E1_VENCTO) >=
`"+DTOS(mv_par01)+"". Esta expresso melhor que anterior simplesmente porque no se utilizada
varivel e sim do contedo da mesma, o que pode ser compreendido em qualquer ambiente. 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 trabalha 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 filtros diferentes, pois
um filtro sobrescreveria o outro.
Outro ponto de ateno deve ser a funo xBase chamada DBSETINDEX. Podem ocorrer alguns
erros ao tentar-se utilizar essa funo para abrir um ndice de trabalho criado. Por esses motivos e pelo
fato de tornar o processamento mais lento deve-se evitar ao mximo o uso de ndices de trabalho no
ambiente SQL.
Da mesma maneira que a funco DBSETINDEX, os comandos COPY TO e APPEND FROM tambm
devem ter uma ateno especial. No ambiente SQL esses comandos so executados entre uma tabela e
um arquivo DBF (e vice-versa) ou entre dois arquivos DBF. Por exemplo, o comando 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 podem 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 Hilial e Compartilhamento de ArLuivos
O Sistema permite a criao de vrias Filiais para uma mesma empresa cadastrada, 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:
ArLuivos 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.
ArLuivos 6clusivos
Quando o arquivo esta configurado para trabalhar no modo exclusivo ( 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 gravou.
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, ExpC1 = Alias do arquivo
A funo xFilial() verifica se o arquivo exclusivo ou compartilhado e ira retornar " " 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 procedimento 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 outra tabela. Pois uma
tabela poder ser compartillhada (campo filial em branco), enquanto que a outra poder ser
compartilhada (campo filial preenchido).
A varivel cFilAnt contm a filial que o usurio est operando, e a varivel cEmpant contm a
empresa e a filial
TAcnicas para Hiltragem
Nos sistemas Microsiga, a filtragem dos dados em ambiente 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 Exemplo :
Chaves Prim5rias
Sua funo garantir unicidade. Em toda relao, por definio, tem-se uma ou mais chaves
candidatas. Dessas chaves, uma ser primria e se houver mais de uma na relao, essas outras sero
definidas como chave alternada.
Chaves strangeiras
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.
$ntegridade Re.erencial
Todos os valores da chave estrangeira tem, obrigatoriamente, que ter valor correspondente na
chave primria que se relaciona; mas nem todos os valores encontrados na chave primria, precisam ter
seus correspondentes na chave estrangeira que se relaciona. Por exemplo, na tabela de clientes, o campo
A1_COD (cdigo do cliente), vai estar relacionado com outra tabela que indica quais 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 referencial 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 pode-se alterar o tamanho
do cdigo do cliente em apenas uma tabela, caso esse cdigo seja alterado deve-se verificar as tabelas de
cabecalho e itens das notas fiscais, de titulos a pagar e receber, etc. O sistema 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 tabelas relacionadas: no pode-se excluir o
cdigo do cliente se existe um pedido de vendas em aberto para esse cliente, deve-se 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 sejam repetidas e
que o acesso a tabelas externas seja validado de maneira consistente.
Verificar a atualizao da informao em todas as tabelas relacionadas: a integridade no se
resume a validaes de cadastros e tamanho de colunas, deve-se garantir no ato do desenvolvimento 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 atualizar somente
o 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.
'tili(ando Rotinas Autom5ticas
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 programa standard,
contudo sem interferencia do usurio (digitador). Para tal, criamos um mecanismo onde todos os
programas que necessitem desta regra devem ser capazes de "inserir dados de forma automtica. Abaixo
mostraremos como proceder :
Tome como exemplo o MATA250.PRX . O vetor aRotAuto passado para o programa citado. Se este
vetor contiver elementos, significa que ser utilizada a Rotina Automtica. Este vetor deve, quando da
utilizao das rotinas automticas, conter os dados mnimos necessrios para a atualizao dos 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 validaes a serem
utilizadas para o respectivo campo sero as existentes no SX3. Se as validaes no forem as do SX3,
elas devem ser passadas numa funo.
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 utilizada nos programas
chama-se aRotAuto, e para processo de incluso com cabealho e itens, as variveis a serem utilizadas
so: aAutoCab para o cabealho, e aAutoItens para os itens da getdados.
Para uma incluso simples, tomar como exemplo o MATA250.PRX. Para uma incluso com
cabealho e tem, tomar como exemplo o CONA050.PRX.
Controle de Transao +TTS-
3 Lue A
Tratando-se de Banco de Dados, toda e qualquer operao de incluso, alterao ou 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 seja, ignora todo o
registro.
8uando usar
Quando temos uma operao em Banco de Dados que necessite que vrias incluses, alteraes ou
excluses s sejam efetuadas quando todas as operaes tenham sido realizadas com sucesso, garantindo
com isso que no seja atualizada parcialmente uma tabela ou que atualize uma tabela e no atualize outra
tabela relacionada.
Como usar
Para definir uma transao, deve-se utilizar os comandos BEGIN TRANSACTION e END
TRANSACTION para definir inicio e fim de uma transao respectivamente. Todas informaes 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 travamento do banco de
dados. O tamanho da transao deve-ser ser conhecido pelo programdor. Em suma, para exemplificar,
devemos controlar a transao de uma nota e no de um conjunto ilimitado de notas.
3nde no usar
O controle de transao jamais dever ser utilizado durante processo que envolvam interface (telas
com entrada de dados). O controle deve-se resumir apenas ao processo de gravao. Entre um incio de
transao (Begin Transaction) e um final (End Transaction) Todos os registros a serem gravados ficam
"locados at o final da transao. Caso tenhamos uma tela aps o BEGIN e antes do END dependeremos
do usurio para efetuar a liberao da transao, fato este que causaria enormes problemas para o
usurio.
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 possamos ter um
grande nmero de locks.
BEGIN TRANSACTION
ExpN1 :=FuncGrava()
END TRANSACTION
Caso exista uma transao dentro de uma outra a segunda ser automaticamente ignorada,
fechando-se a transao principal quando da chamada do comando END TRANSACTION.
Controle de Sem5.oro
O controle de Semaforo permite que o sistema controle a Numerao Automtica de Documentos 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 pendente do semforo. usado quando o usurio cancela a
operao (o numero no aproveitado).
CONFIRMSXE -> Confirma o nmero sugerido. Esta funo deve ser chamada quando da confirmao da
gravao do registro.
MAYIUSE -> Checa fisicamente se um determinado arquivo existe. O arquivo poder conter o nmero
sequencial.
Obs : A funo GETX8NUM executa a prpria GETSXENUM.
Atuali(ao do SourceSa.e
A atualizao do Source Safe a ltima, e mais crtica, etapa 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 base equivalente instalada no
cliente e para as novas verses, em uma nova base que poder ser gerada atravs do ATUSX;
Feita a anlise, os testes e antes de atualizar definitivamente o Source Safe o programa alterado
dever ser comparado com o constante no Source Safe para verificar se as alteraes foram 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 feita 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 ,ocali(a4es
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 procedimento).
Procedimentos a serem cumpridos em alterao 7 desenvolvimento de
programas ;
A fim de evitar os inconvenientes citados no ponto anterior, existem procedimentos 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 traducoes0microsiga+com+br indicando
a verso, o STR e o CH que foi alterado.
Quando criado um campo novo, ou modificado o contedo de um j existente, os campos que
devem refletir esta alterao nos demais idiomas devem ser deixados em branco, 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 atualizar um parmetro deve ser sempre usada a funo PUTMV, 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 todos 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, browse, etc.) de acordo com
os demais paises.
Quando for modificada a caracterstica de um campo do sistema e este estiver replicado para o
resto dos pases, as alteraes devem ser replicadas em todos os paises. Na dvida da
aplicabilidade da alterao nos outros paises, deve ser informada a equipe de localizaes.
Os novos campos tipo COMBO, devem ser criados com numerao e no com siglas (1 para sim e 2
para no, ao invs de S para sim e N para no). Esta alterao o incluso deve ser informada de
imediato para a equipe de tradues.
Quando for criado um novo parmetro, ou modificado o contedo default de um j existente, 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 tratarmos 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 combo, 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
pela funo SetPrint. Sendo assim, no suportado interface com data 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) este procedimento dever ser
adotado corretamente.
Caso exista alguma entrada de dados que seja possvel ser assumida qualquer valor apenas no
schedule deve-se adotar o seguinte procedimento :
Usar a varivel __cInternet, que se estiver com valor .T. (Verdadeiro) estamos no processo de
schedule.
%odelo /
Este modelo de programa exibe um Browse vertical de campos presentes no dicionrio 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 |
+-----------+--------+------+-----------------------------------------------+
| | | | |
+-----------+--------+------+-----------------------------------------------+
/*/
#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},; //"Pesquisar"
{ OemToAnsi(STR0002) ,"AxVisual", 0 , 2},; //"Visualizar"
{ 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
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 exclusao?"
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")
dbSetOrder(1)
dbSelectArea("SE5")
dbSetOrder(1)
dbSelectArea(cAlias)
RETURN
%odelo 9
Este modelo de programa exibe um cabealho com informaes pr-determinadas, um Browse horizontal
central (dependente do dicionrio de dados) e um rodap com variveis de memria que so atualizadas
de acordo com os valores preenchidos no Browse horizontal.
As validaes do cabealho so pr-determinadas no programa-fonte. J as validaes do browse
horizontal so genericamente herdadas do dicionrio de dados.


/*/
+---------------------------------------------------------------------------+
+ Funcao | CTBA120 | Autor | Pilar S. Albaladejo | Data | 24/07/00 |
+-----------+----------+-------+-----------------------+------+-------------+
| Descricao | Cadastro de Criterios de Rateio Externo |
+-----------+---------------------------------------------------------------+
| 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
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 |
+----------------------------------------------------------------+
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 |
| | 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) |
+------------+-----------------------------------------------------------+
| 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 != 100)
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
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
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
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao |CT120Moed| Autor | Pilar S. Albaladejo | Data | 24/07/00 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Valida Moeda do Lancamento |
+------------+-----------------------------------------------------------+
| Sintaxe | Ctb120Moed(ExpC1) |
+------------+-----------------------------------------------------------+
| Parametros | ExpC1 = Moeda a ser validada |
+------------+-----------------------------------------------------------+
| Retorno | .T./.F. |
+------------+-----------------------------------------------------------+
| Uso | CTBA120 |
+------------+-----------------------------------------------------------+
/*/
Function Ct120MoedLC(cMoeda)
Local aCtbMoeda:= {}
Local lRet := .T.
aCtbMoeda := CtbMoeda(cMoeda)
If Empty(aCtbMoeda[1])
Help(" ",1,"NOMOEDA")
lRet := .F.
Endif
Return lRet
%odelo P
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.


/*/
+---------------------------------------------------------------------------+
+ 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 ------------ +
| 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 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} } //"Exclusao"

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 |
+------------+------------------------------------------------------------+
| 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)
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],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
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
+----------------------------------------------------------------+
| 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) |
+------------+------------------------------------------------------------+
| Parametros | 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 )
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)
#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],aSizeAut[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 )
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")
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
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])))
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 "
cQuery += "FROM "+RetSqlName("AC2")+" AC2 "
cQuery += "WHERE AC2.AC2_FILIAL='"+xFilial("AC2")+"' AND "
cQuery += "AC2.AC2_PROVEN='"+M->AC1_PROVEN+"' AND "
cQuery += "AC2.D_E_L_E_T_<>'*' "
cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey()))

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
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[nCntFor]
[nCntFor2])
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_CODMEM")
EndIf
+----------------------------------------------------------------+
| Grava os campos memo de usuario |
+----------------------------------------------------------------+
For nLoop := 1 To Len( aMemoAC2 )
MSMM(AC2->(FieldGet(aMemoAC2[nLoop,1])),,, ;
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())
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,nPosStage] ) + ;
STR0012, { STR0009 }, 2 ) ;
// Atencao // "A etapa " // " nao pode ser excluida pois esta em
uso por uma ou mais // oportunidades !"
lRet := .F.
Exit


EndIf
EndIf
Next nLoop

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.01.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 utilizado em uma
ou mais
// oportunidades !", "Fechar"
EndIf
Return( lRet )
%odelos de Relatrios
Existem vrias formas de se gerar um relatrio no sistema, no entanto a forma de se elaborar o
programa no varia muito. Abaixo mostramos um modelo-padro, que utiliza as funes bsicas na
gerao de um relatrio.

/*/
+---------------------------------------------------------------------------+
+ Funcao | MATR425 | Autor | Rodrigo de Sartorio | Data | 11/05/95 |
+-----------+----------+-------+-----------------------+------+-------------+
| Descricao | Relatorio de Estoque por Lote |
+-----------+---------------------------------------------------------------+
| Sintaxe | MATR425() |
+-----------+---------------------------------------------------------------+
| Uso | Generico |
+---------------------------------------------------------------------------+
| ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL |
+-----------+--------+------+-----------------------------------------------+
|Programador| Data | BOPS | Motivo da Alteracao |
+-----------+--------+------+-----------------------------------------------+
| | | | |
+-----------+--------+------+-----------------------------------------------+
/*/
#include 'MATR425.CH'
#include 'FIVEWIN.CH'
Function MATR425()
+----------------------------------------------------------------+
| Define Variaveis |
+----------------------------------------------------------------+
Local cDesc1 := STR0001 //"Este programa emitira' uma relacao com a posi|,o 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"###"Administracao"
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,,Tamanho)
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 |
+------------+------------------------------------------------------------+
/*/
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)
+----------------------------------------------------------------+
| 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+B8_LOCAL'
EndIf
nSaldo := 0
nEmpenho := 0
nSaldoT := 0
nEmpenhoT := 0

//-- 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
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_LOTECTL)
//-- 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 -
@ Li, 068 PSay nSaldoT Picture cPicSld
@ Li, 081 PSay nEmpenhoT Picture cPicEmp
Li++
@ Li, 000 PSay __PrtThinLine()
Li++
nCntImpr := 0
nSaldoT := 0
nEmpenhoT := 0
EndIf
EndDo
If !(Li==80)
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
%odelos de C5lculos
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 tal.
/*/
+---------------------------------------------------------------------------+
+ 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"
Function FinA210()
LOCAL nOpca :=0
+----------------------------------------------------------------+
| Define Variaveis |
+----------------------------------------------------------------+
LOCAL oDlg, aSays:={}, aButtons:={}
Private cCadastro := OemToAnsi(STR0004) //"Reconciliacao de Saldos Bancarios"
Pergunte("FIN210",.F.)
AADD (aSays,;
OemToAnsi(STR0005))//"Este programa tem como objetivo recalcular e analisar os saldos"
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. ) } } )
FormBatch( cCadastro, aSays, aButtons )
If nOpcA == 1
#IFDEF TOP
If TcSrvType() == 'AS/400'
Processa({|lEnd| FA210Proc()}) // Chamada da funcao de reconciliacao
Else
Processa({|lEnd| FA211Proc()}) // Chamada da funcao de reconciliacao
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)
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" - Adriano
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"))
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 Baixas
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/Cau|o (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)=="*" //cheque para juntar (PA)
dbSkip()
Loop
Endif
If !Empty(SE5->E5_MOTBX)
If !MovBcoBx(SE5->E5_MOTBX)
dbSkip()
Loop
Endif
Endif
+----------------------------------------------------------------+
| Baixa automatica |
+----------------------------------------------------------------+
IF E5_TIPODOC = "BA"
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+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()
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
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 indice
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.)
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" //Valores 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/Cau|o (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)
If !MovBcoBx(E5_MOTBX)
dbSkip()
Loop
Endif
Endif
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("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")
dbCloseArea()
Return NIL
#ENDIF
A)re6cl
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 proceder estas operaes. Se
outra estao estiver usando o arquivo, o retorno ser .F..
Sinta0e
AbreExcl(cAlias)
Par<metros
cAlias - Nome do Alias do Arquivo. Deve ter obrigatriamente sua estrutura definida no SX3.
'0emplo
//
IF AbreExcl(inSI2li)
Pack
ENDIF AbreExcl( )
dbGoTop( )
%A&'A, RD%AU - S$2A AD!A&CD MI:Q - P/
Activate Dialog
TipoI Tela Eindo"s
Ativa uma janela previamente definida na funo Dialog e executa os GETs, botes e outros objetos.
Sinta0e
ACTIVATE DIALOG cVar <CENTERED> [On Init cFuncInit] [Valid cFuncValid]
Par<metros
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 o fechamento da janela de dilogo. Deve retornar um valor
lgico (.T. ou .F.) (Opcional)
(omentrios
A clusula <CENTERED> opcional, se omitida assume as coordenadas definidas na criao da janela.
'0emplo
Ver exemplo no programa RDDEMO apresentado no final deste Manual.
Ver tamb,m
4un)o /ialo+
ACopB

Copia os elementos de uma array para outra.
Sinta0e
ACOPY( aOrigem, a=estino , [ n'nicio ], [ n!tde ], [ nPos=estino ]) --> aDestino
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array que contm os elementos a serem copiados.
aDestino Sim A o array que receber a cpia dos elementos.
nInicio No N
indica qual o ndice do primeiro elemento de aOrigem que ser
copiado. Se no for especificado, o valor assumido ser 01.
nQtde No N
indica a quantidade de elementos a serem copiados a partir do array
aOrigem. iniciando-se a contagem a partir da posio n'nicio. Se
n!tde no for especificado, todos os elementos do array aOrigem
sero copiados, iniciando-se a partir da posio n'nicio.
nPosDestino
N
a posio do elemento inicial no array a=estino que receber os
elementos de aOrigem. Se no especificado, ser assumido 01.

Retorno Descrio
ACOPY() retorna uma referncia ao array a=estino.
/escri)o
ACOPY() uma funo de array que copia elementos do array aOrigem para array a=estino. O
array destino a=estino j deve ter sido declarado e grande o bastante para conter os elementos que sero
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 bloco.
Se um elemento for um subarray, o elemento correspondente no array a=estino, conter o mesmo
subarray. Portanto, ACOPY() no produzir uma cpia completa de array multidimensionais, Para fazer
isso, uso a funo aClone().
'0emplos
Este exemplo cria dois arrays, com um contedo cada. Os dois primeiros elementos do 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 }
ACLO,E12
A)EL12
AEVAL12
A*ILL12
AI,"12
A"O%#12
ADel
Exclui um elemento de um array.
Sinta0e
ADEL( aOrigem3 nPos) --> aOrigem
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array de onde ser excludo um item
nPos Sim A a posio a partir da 1, do qual ser excludo um elemento

Retorno Descrio
ADEL() Retorna uma referncia ao aOrigem.
/escri)o
ADEL() uma funo de manipulao que elimina uma posio do array, deslocando as 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.
'0emplos
LOCAL aArray
aArray := { 1, 2, 3 } // Resultado: { 1, 2, 3 }
ADEL(aArray, 2) // Resultado: { 1, 3, NIL }
A*ILL12
AI,"12
ADir
Preenche vrios arrays com informaes de arquivos e diretrios.
Sinta0e
ADIR([ cAr4,spec ], [ a>omeAr4 ], [ a+amanho ], [ a=ata ], [ a.ora ], [ aAtributo ]) --> Numrico
Argumento Obrigat. Tipo Descrio
cAr4,spec No C
Caminho dos arquivos a serem includos na busca de informaes. Segue o
padro para especificao de arquivos, aceitando arquivos no servidor
Protheus e no Cliente. Caracteres como * e ? so aceitos normalmente.
Caso seja omitido, sero aceitos todos os arquivos do diretrio default
( *.* ).
aNomeArq No A
Array de Caracteres. o array com os nomes dos arquivos encontrados na
busca. O contedo anterior do array apagado.
aTamanho No A Array Numrico. So os tamanhos dos arquivos encontrados na busca.
aData No A
Array de Datas. So as datas de modificao dos arquivos encontrados na
busca.
a.ora No A
Array de Caracteres. So os horrios de modificao dos arquivos
encontrados. Cada elemento contm horrio no formato: hh:mm:ss.
aAtributos No A
Array de Caracteres. So os atributos dos arquivos, caso esse array seja
passado como parmetros, sero includos os arquivos com atributos de
Sistema, Ocultos.

Retorno Descrio
> = 0 Quantidade de arquivos encontrados
/escri)o
ADir() preenche os arrays passados com os dados dos arquivos encontrados, atravs da mscara
informada. Tanto arquivos locais (Remote) como do servidor podem ser informados. ADir uma funo
obsoleta, utilize sempre Directory().
'0emplos
LOCAL aFiles[ADIR("*.TXT")]
ADIR("*.TXT", aF!e")
AEVAL(aFiles, { |element| QOUT(element) })
AEVAL12
A"CA,12
)I%EC#O%312
Aval
Executa um code block para cada elemento de um array.
Sinta0e
AEVAL( aArra?, b6loco, [ n'nicio ], [ n!tde]) --> aArray
Argumento Obrigat. Tipo Descrio
aArray Sim A o array que ser atravessado pelo bloco
bBlock Sim Bloco de cdigo o bloco que ser executado para cada elemento do Array.
nInicio No N
a posio inicial. Se no for especificada o inicio ser a
partir do 1.
nQtde No N
o numero de elementos que devem ser processados a
partir de n'nicio. O Valor padro so todos os elementos do
n'nicio at o final.

Retorno Descrio
AEVAL() Retorna uma referncia de aArra?.
/escri)o
AEVAL() executa um code block para cada elemento de um array, passando cada um como o
parmetro do bloco. muito semelhante ao DBEVAL().
AEVAL() passa cada elemento de um array para o code block sem se preocupar com o tipo.
'0emplos
// Exemplo 1
#include "Directry.ch"
//
LOCAL aFiles := DIRECTORY("*.dbf"), nTotal := 0
AE#AL(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 := {}
AE#AL(aFiles, { | file | AADD(aNames, file[F_NAME]) } )
//Exemplo 3
LOCAL aArray[6]
AFILL(aArray,"old")
AE#AL(aArray,;
{|cValue,nIndex| IF(cValue == "old",;
aArray[nIndex] := "new",)})
EVAL12
)!EVAL12
AHill
Preenche um array com um determinado valor.
Sinta0e
AFILL( a=estino , e-p$alor, [ n'nicio ], [ n!uantidade ]) --> aDestino

Argumento Obrigat. Tipo Descrio
aDestino Sim A o onde os dados sero preenchidos.
expValor Sim Todos
o dado que ser preenchido em todas as posies informadas, no
permitida a utilizao de arrays.
[n'nicio] No N
a posio inicial de onde os dados sero preenchidos, o valor padro
1.
[nCount] No N
Quantidade de elementos a partir de [nInicio] que sero preenchidos
com <expValor>, caso no seja informado o valor ser a quantidade
de elementos at o final do array.

Retorno Descrio
AFILL() Retorna uma referncia para aDestino.
/escri)o
AFILL() funo de manipulao de arrays, que preenche os elementos do array com qualquer tipo
de dado. Incluindo code block.
Afill() no deve ser usado para preencher um array com outro array.
Exemplos

LOCAL aLogic[3]
// Resultado: aLogic { NIL, NIL, NIL }
AFILL(aLogic, .F.)
// Resultado: aLogic { .F., .F., .F. }
AFILL(aLogic, .T., 2, 2)
// Resultado: aLogic { .F., .T., .T. }
AEVAL12
)!"#%&C#12
)I%EC#O%312
A$ns
Insere um elemento com contedo NIL em um array.
Sinta0e
AINS( aOrigem, nPos ) --> aIns
Argumento Obrigat. Tipo Descrio
AOrigem Sim A o array de onde ser inserido um item.
NPos Sim A a posio a partir da 1, do qual ser inserido um elemento

Retorno Descrio
AINS() Retorna uma referncia ao aOrigem.
/escri)o
AINS() um funo de manipulao de array que insere um elemento na posio determinada por
nPos.
O novo elemento possui contedo igual a NIL. Aps a insero, o ltimo elemento ser excludo.
Para alterar o tamanho de um array, utilize aSize().
'0emplos
LOCAL aArray
aArray := { 1, 2, 3 } // Resultado: { 1, 2, 3 }
AI$S(aArray, 2) // Resultado: { 1, NIL, 2 }
ACLO,E12
A)EL12
AEVAL12
A*ILL12
A"I4E12
Aleatorio
TipoI Processamento
Gera um nmero aleatrio de acordo com a semente passada. Esta funo retorna um nmero aleatrio
menor ou igual ao primeiro parmetro informado, usando como semente o segundo parmetro.
recomendado que esta semente seja sempre o ltimo nmero aleatrio gerado por esta funo.
Sinta0e
Aleatorio(nMax,nSeed)
Par<metros
nMax - Nmero mximo para a gerao do nmero aleatrio
nSeed - Semente para a gerao do nmero aleatrio
Retorna
nRet - Nmero aleatrio retornado
'0emplo
// 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
Verifica qual o Alias.
Sinta0e
ALIAS([ nArea+rab ]) --> Caracter
Argumento Obrigat. Tipo Descrio
nAreaTrab No N Nmero da rea de trabalho a ser verificada.

Retorno Descrio
"" No existe tabela em uso na rea de trabalho verificada.
cAlias String contendo o Alias da rea de trabalho verificada (em maisculo).
/escri)o
Verifica qual o Alias de determinada rea de trabalho; se ela no foi especificada, 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 "ELEC#12, pois nesta retornado o nmero da rea de trabalho
do Alias correspondente.
'0emplo
// 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 : " + A!a"(), "Alias", 0) // Resultado: "O Alias
corrente : SSS".
)!&"EA%EA1 2
"ELEC#1 2
Append Hrom
Importa registros de outra tabela ou arquivo texto.
Sinta0e
APPEND FROM Ar4uivo [FIELDS Campos] [FOR Condor] [WHILE Cond/hile] [NEXT nRecs] [RECORD
nRecno] [REST] [ALL] [VIA R==] [SDF | DELIMITED [WITH BLANK | c=elimitador] ]
Argumento Obrigat. Tipo Descrio
Arquivo Sim
Nome do arquivo cujos registros sero importados, pode ser apenas
o nome ou na forma de uma string.
Campos No
Lista dos campos a serem copiados, se omitido sero copiados
todos os campos.
CondFor No
Expresso em ADVPL a ser resolvida para que o registro seja
copiado.
CondWhile No
Expresso em ADVPL que determina quando a cpia deve parar
(quando a expresso retornar .F.).
nRecs
No
N Quantos registros devem ser copiados.
nRecno No N Nmero do recno do registro a ser copiado.
RDD No
Nome do RDD utilizado na importao (entre aspas simples ou
dupla), se omitido ser utilizado o RDD corrente.
cDelimitador No C
Especifica qual caracter foi utilizado como delimitador para gerar o
arquivo do tipo texto.
/escri)o
Este comando utilizado para copiar alguns registros do arquivo especificado por "FROM cAr4uivo"
utilizando-se o driver especificado por "VIA R==" 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 para que o registro
seja copiado, copia toda a tabela como se estivesse especificada a opo "ALL".
Pode-se especificar um escopo para que os registros sejam copiados atravs das opes "FOR
Condor" e "WHILE Cond/hile". Pode-se tambm limitar o nmero de registros a serem copiados 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 )!5O#O$12 antes de iniciar a cpia. Se desejado
copiar apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD
nRecno".
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 estes arquivos textos com CO$3 #O,
utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preenchendo com espaos) ou
atravs de um delimitador que separa os campos",". Deve-se especificar na cpia qual o tipo do arquivo
texto atravs das opes "SDF" ou "DELIMITED".
Pode-se ainda especificar qual o delimitador utilizado nas strings da seguinte forma:
"DELIMITED WITH BLANK" - as strings no possuem delimitador;
"DELIMITED WITH c=elimitador" - as strings so delimitadas com o caracter especificado;

Caso seja omitido o delimitador ser considerado o delimitador padro (" ").
6emplo
// Este exemplo demonstra como utilizar o comando APPEND FROM para acrescentar alguns
campos de registros (apenas 10 registros) de outra tabela pertencentes a um escopo
definido a partir do registro atual para a tabela corrente:
USE Cliente VIA "CTREECDX" NEW
APPE$D FRO% Amigos FIELDS Nome,Nascimento,End,Tel FOR Idade>20 WHILE Nome<"VVV" NEXT 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 69411233 12.00
COPY TO temp2 DELIMITED WITH "@" // Registro: @Jose@,19751108,69411233,12.00
USE Cliente NEW
APPE$D FRO% temp DELIMITED
USE Cliente1 NEW
APPE$D FRO% temp1 DELIMITED WITH BLANK
USE Cliente2 NEW
APPE$D FRO% 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
APPE$D FRO% temp3 SDF

CO$3 #O
ArraB
Cria um array com dados no inicializados.
Sinta0e
ARRAY( n!td,lementos@ , [ n!td,lementosn ]...) --> aArray
Argumento Obrigat. Tipo Descrio
nQtdElementos1 Sim N Quantidade de Elementos da 1 dimenso do array.
[n!td,lementos>] No N Quantidade de Elementos das demais dimenses do array.

Retorno Descrio
ARRAY() Retorna um array com as dimenses especificadas.
/escri)o
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.
'0emplo
// 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} }
aArray := { ARRAY(2), ARRAY(2), ARRAY(2) }
AA))12
ACLO,E12
ACO$312
A)EL12
AEVAL12
A*ILL12
AScan
Busca em um array at que o bloco retorne verdadeiro .T.
Sinta0e
ASCAN( aOrigem, e-p#earch, [ n#tart ], [ nCount ]) --> nStoppedAt
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array onde ser executada a expresso.
<expSearch> Sim Todos a posio a partir da 1, do qual ser 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 position of thelast element scanned. If
<expSearch> is a simple value, ASCAN() returnsthe position of the first matching element, or zero if a
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 valueand 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 thereare no more characters left in
<expSearch>. If there is no match,ASCAN() proceeds to the next element in the array.Since ASCAN() uses
the equal operator (=) for comparisons, it issensitive to the status of EXACT. 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 element accessed. As each
element isencountered, ASCAN() passes the element's value as an argument to thecode block, and then
performs an EVAL() on the block. The scanningoperation stops when the code block 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
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
AADD(aArr,{"one","two"})
AADD(aArr,{"three","four"})
AADD(aArr,{"five","six"})
? ASCAN(aArr, {|aVal| aVal[2] == "four"}) // Returns 2
See Also
AEVAL12
EVAL12
ASort
Ordena um array.
Sinta0e
ASORT( aOrigem, [ n'nicio ], [ n!tde ], [ bOrdem ]) --> aOrigem
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array que ser classificado.
nInicio No N
Onde ser o inicio da ordenao. Caso seja omitido, ser
considerado o 1 elemento do array.
nQtde No N
Quantidade de elementos que sero ordenados a partir do
n'nicio* Caso seja omitido, sero considerados todos
elementos at o final do Array.
bOrder No Bloco de cdigo
um bloco de cdigo ( code block ) opcional que indicar a
ordem correta dos elementos. Caso ele no seja informado,
o array ser classificado em ordem crescente desde que no
seja multidimensional.

Retorno Descrio
ASORT() Retorna uma referncia ao array aOrigem.
/escri)o
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 array, neste caso, pode-se
usar dados de qualquer tipo. Cada vez que o bloco for avaliado, sero passados dois elementos do array,
caso eles estejam em ordem, deve-se retornar .T.
'0emplos
// Exemplo 1
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} }
A"CA,12
EVAL12
ATail
Retorna o ltimo elemento de um array
Sinta0e
ATAIL( aArra? ) --> Element
Argumento Obrigat. Tipo Descrio
aArray Sim A o array de onde ser retornado o ltimo elemento.

Retorno Descrio
ATAIL() Retorna o ltimo elemento de um array.
/escri)oC
ATAIL() uma funo de manipulao de array que retorna o ltimo elemento de um array. Ela deve ser
usada em substituio da seguinte construo: aArra? [LEN( aArra? )]
'0emplos

aArray := {"a", "b", "c", "d"}
? ATAIL(aArray) // Resultado: d
LE,12
Avalimp
TipoI Relat*rios
Configura a impressora atravs dos parmetros. Esta funo usada em relatrios especficos que no se
utilizam da funo "Cabec. Imprimindo o retorno desta funo na impressora, ela se encarregar de
configurar a impressora de acordo com o arquivo de driver escolhido, e com as configuraes escolhidas pelo
usurio definidas no array aReturn.
Sinta0e
AvalImp(nLimit)
Par<metros
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 controle, dependente das configuraes escolhidas pelo usurio e do
arquivo de driver especificado.
'0emplo
// 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
Tipo: Tela DOS/Windows
Monta uma janela exibindo o texto desejado e, opcionalmente, disponibilizando opes de escolha para o
usurio.
Sinta0e
Aviso(cTitulo,cMensagem,aOpcoes)
Par<metros
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.
'0emplo
// 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
A6Cadastro
TipoI 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.
Sinta0e
AxCadastro(cAlias,cTitulo,cDel,cOk)
Par<metros
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.
(omentrios
Deve ser utilizada para editar arquivos especficos (Famlia SZ?), sendo semelhante aos cadastros de
Clientes, Fornecedores e etc...
'0emplo
// Exemplo de uso de cadastro de arquivo especifico:
AxCadastro("SZ1,Cadastro de Descontos,.T.",.T.)
Return
V n/Cn9 *mp*utton
TipoI Tela Eindo"s
Cria um boto de bitmap padro do SigaAdv Win.
Sinta0e
@ nLinha,nColuna BMPBUTTON TYPE nBotao ACTION cFuncao OBJECT oBtn
Par<metros
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
(omentrios
Para executar funes definidas em um mesmo .PR? utilizar a funo Execute("Nome da funo) ou
ExecBlock("Nome do Arquivo) para chamar outro .PR?.
'0emplo
Ver exemplo no programa RDDEMO.
0+++ !itmap+++ "ize
TipoI Tela Eindo"s
Define a rea em que ser mostrado um BITMAP na janela.
Sinta0e
@ nLinha,nColuna BITMAP SIZE nAltura,nLargura FILE cArq
Par<metros
nLinha - Nmero da Linha superior
nColuna - Nmero da Coluna superior
nAltura - Altura de apresentao do BITMAP
nLargura - Largura de apresentao do BITMAP
cArq - Nome do arquivo BITMAP
'0emplo
Ver exemplo no programa RDDEMO .
VIII*utton
TipoI Tela Eindo"s
Cria um boto com texto.
Sinta0e
@ nLinha,nColuna BUTTON cTexto SIZE nAltura,nLargura ACTION cFuno Object oBtn
Par<metros
nLinha - Nmero da linha superior
nColuna - Nmero da coluna superior
cTexto - Texto que ser apresentado no boto. Deve incluir um "_ antes da letra que utilizada 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.
(omentrios
Para executar funes definidas em um mesmo .PR? utilizar a funo Execute("Nome da funo) ou
ExecBlock("Nome do Arquivo) para chamar outro .PR?.
'0emplo
Ver exemplo no programa RDDEMO.
*T!Can3pen
Verifica se a tabela BTrieve pode ser aberta.
Sinta0e
BTVCanOpen( c>ome , [ c'ndice ])->Lgico
Argumento Obrigat. Tipo Descrio
cNome Sim C Nome da tabela a ser testada.
cIndice No C Nome do arquivo de ndice da tabela a ser testada.

Retorno Descrio
.F.
No possvel abrir a tabela testada. Principais motivos: No existe o arquivo da tabela ou do
ndice fisicamente, ou as definies da tabela ou ndice em questo no foram encontradas.
.T. A tabela testada pode ser aberta.
/escri)o
Esta funo verifica se a tabela definida pelo parmetro c>ome pode ser aberta e, se existir, o
parmetro c'ndice verifica, tambm, se o ndice pode ser aberto. Para tanto, testado se os arquivos
envolvidos existem fisicamente, caso afirmativo, verificado se as definies envolvidas so encontradas
nos arquivos do DDF's.
'0emplo
// 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 &'T#CanO(en("\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
*T!CreateDDHs
Gera os arquivos de definies (DDFs) compatveis com outras ferramentas que manipulam
arquivos Btrieve (Crystal Reports).
Sinta0e
BTVCreateDDFs ( a+abelas , [ c=iretorio ])->Lgico
Argumento Obrigat. Tipo Descrio
a+abelas Sim A Nomes das tabelas e os respectivos diretrios (opcional).
cDiretorio No C Nome do diretrio (abaixo do root) onde sero criados os novos DDF's.

Retorno Descrio
.F.
No conseguiu gerar os novos arquivos de definio. Principais erros: RDD no Btrieve;
diretrio no est dentro do Protheus; no pode carregar as informaes de definio ou no
pode gravar os novos arquivos de definio.
.T. Transformao de definies ocorrida com sucesso.
/escri)o
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 a+abelas.
Ex: aTabelas := {{"AA3990", "C:\DADOS"},{"AA4990", "C:\DADOS1"},{"AA5990"}}
Se o diretrio no for especificado, ser utilizado o diretrio definido no arquivo FILE.BTV.
Os novos arquivos de definio, FILE.DDF, FIELD.DDF e INDEX.DDF, so gerados no diretrio
especificado pelo parmetro c=iret:rio, se ele for omitido, sero gerados no mesmo diretrio dos SXs.
'0emplo
// Este exemplo demonstra o uso tpico de BTVCreateDDFs(). Se no falhar, sero gerados
os novos arquivos de definio. Se falhar, uma mensagem apresentada.
b:= {{"AA3990"}, {"SA1990", "c:\protheus507\dadosadv"}}
IF &'T#CreateDDF"(b, "\temp") // Ser concatenado com o RootPath
Messagebox("No foi possvel montar o array com os nomes das tabelas","Erro", 0)
BREAK
ENDIF

!#V#ables
*T!Drop$d6s
Apaga os ndices da tabela corrente.
Sinta0e
BTVDropIdxs ()->Lgico
Retorno Descrio
.F.
>o conseguiu apagar os 8ndices* Principais erros% R== no A 6trieve3 no achou as definiBes no
==3 o ar4uivo no est; e-clusivo
.T. Deleo de ndices ocorrida com sucesso
/escri)o
A funo BTVDropIdxs apaga os ndices da tabela corrente, com exceo do ndice interno, apenas se
o mesmo for Btrieve e estiver aberto exclusivo. Para tanto ela executa os seguintes passos:
1. Fecha todos os ndices;
2. 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 criao de
ndices de forma temporria.
'0emplo
// 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 &'T#Dro(I)*"()
Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0)
BREAK
ENDIF
C#%EE)ELI)-"12
)!CLEA%I,)E-12
*T!Ta)les
Retorna array composto por nomes das tabelas definidas no DDF do Protheus (FILE.BTV).
Sinta0e
BTVTables ()-->Array
Retorno Descrio
NIL >o conseguiu montar o arra?* Principais erros% R== no A 6trieve ou no conseguiu recuperar
as informaBes corretamente do ar4uivo 'L,*6+$ do ==s*
Array Lista com os nomes das tabelas extradas do DDF.
/escri)o
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 definies.
'0emplo
// Este exemplo demonstra o uso tpico de BTVTables(). Se no falhar, montado um array
com os nomes das tabelas e esses nomes so mostrados no servidor. Se falhar, uma mensagem
apresentada.
a:= 'T#Ta+!e"()
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

!#VC%EA#E))*"
CDoW
Converte uma data para uma cadeia de caracteres contendo o dia da semana.
Sinta0e
CDOW( d,-p ) --> Caracter
Argumento Obrigat. Tipo Descrio
dExp Sim D a data a converter.

Retorno Descrio
Caracter
Nome do dia da semana como uma cadeia de caracteres. A primeira letra maiscula
e as demais minsculas.
"" Caso a data seja invlida ou nula
/escri)o
CDOW() uma funo que converte uma data para uma cadeia de caracteres.
'0emplos
dData := DATE() // Resultado: 09/01/90
cDiaDaSemana := CDO,(DATE()) // Resultado: Friday
cDiaDaSemana := CDO,(DATE() - .) // Resultado: Friday
cDiaDaSemana := CDO,(CTOD("/012213/")) // Resultado: Tuesday
C#O)12
)A#E12
)A312
)O.12
C%onth
Converte uma data para uma cadeia de caracteres contento o nome do ms.
Sinta0e
CMONTH( d=ata ) --> Caracter
Argumento Obrigat. Tipo Descrio
dData S D a data a converter.
Retorno Descrio
Caracter Retorna o nome do ms em uma cadeia de caracteres. A primeira letra do retorno em maiscula
e o restante do nome, em minsculas.
"" Caso a data seja invlida ou nula.
/escri)o
CMONTH() uma funo de converso de datas que retorna uma cadeia de caracteres com o nome do
ms em ingls.
'0emplos
Estes exemplos ilustram CMONTH():
cMes := C%O$T4(DATE()) // Resultado: September
cMes := C%O$T4(DATE() - 56) // Resultado: October
cMes := C%O$T4(CTOD("221/2135")) // Resultado: December
cMes := SUBSTR(C%O$T4(DATE()), 1, 3) + STR(DAY(DATE())) // Resultado: Sep 1
C)O.12
)A#E12
)A312
O,#/12
Commit
Salva em disco as modificaes de todas as tabelas.
Sinta0e
COMMIT
/escri)o
Este comando salva em disco todas as atualizaes pendentes em todas as reas de trabalho.
'0emplo
// Este exemplo demonstra como se pode utilizar o COMMIT 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"
CO%%IT// Salva em disco as alteraes realizadas nas tabelas Clientes e Fornecedores
)!COI#
)!COI#ALL
CopB Hile
Copia Arquivos.
Sinta0e
CopyFile( cOrigem3 c=estino) --> NIL

Argumento Obrigat. Tipo Descrio
cOrigem Sim C
Nomes dos arquivos a serem copiados, aceita tanto arquivos locais
( Cliente ), como arquivos que esto no Servidor. WildCards so
aceitos normalmente.
cDestino Sim C
Diretrio com o destino dos arquivos a serem copiados, podendo
tambm ser no servidor ou no cliente ( estao local ).

Retorno Descrio
NIL Sem retorno.
/escri)o
Copia um arquivo, da origem para o destino, os caracteres * e ?, so aceitos normalmente.
Caso a origem esteja no cliente e o destino no servidor os arquivos so copiados para o servidor, o
contrrio tambm valido.
'0emplo
JJ(opK4ile( "C:\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos do cliente para o Servidor
JJ(opK4ile( "\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos no servidor
C$3#6"1 2
C$3"6#1 2
CopB Structure
Copia a estrutura da tabela corrente para uma nova tabela.
Sinta0e
COPY STRUCTURE [FIELDS Campos] TO Ar4uivo
Argumento Obrigat. Tipo Descrio
Campos No
Lista dos campos a serem includos na nova tabela, se omitido sero
includos todos os campos.
Arquivo Sim C Nome do arquivo da nova tabela a ser criada.
/escri)o
Este comando utilizado para criar nova tabela copiando a estrutura da tabela atual, sendo que
pode-se selecionar apenas os campos de interesse atravs da opo "FIELD Campos" que se omitida, deixa
que o comando copie toda a estrutura.
Semelhante ao funcionamento da funo )!C%EA#E com a passagem de parmetro DBSTRUCT.
'0emplo
// Este exemplo demonstra como utilizar o comando COPY STRUCTURE no seu modo mais usual:
USE Cliente NEW
COPY STR7CT7RE FIELDS Nome,Idade TO NovoCliente
// Este exemplo demonstra como o comando COPY STRUCTURE pode substituir o DBCREATE:
USE Cliente NEW
COPY STR7CT7RE TO NovoCliente
// *** semelhante a ***
USE Cliente NEW
DBCREATE("NovoCliente",DBSTRUCT())

)!C%EA#E1 2
)!"#%&C#1 2
A*IEL)"1 2
CopB To
Copia registros da tabela corrente para uma nova tabela.
Sinta0e
COPY TO Ar4uivo [FIELDS Campos] [FOR Condor] [WHILE Cond/hile] [NEXT nRecs] [RECORD nRecno]
[REST] [ALL] [VIA R==] [SDF | DELIMITED [WITH BLANK | c=elimitador] ]

Argumento Obrigat. Tipo Descrio
Arquivo Sim
Nome do arquivo cujos registros sero exportados, pode ser apenas o
nome ou na forma de uma string
Campos No
Lista dos campos a serem copiados, se omitido sero copiados todos
os campos.
CondFor No Expresso em ADVPL a ser resolvida para que o registro seja copiado.
CondWhile No
Expresso em ADVPL que determina quando a cpia deve parar
(quando a expresso retornar .F.).
nRecs No N Quando registros devem ser copiados.
nRecno No N Nmero do recno do registro a ser copiado.
RDD No
Nome do RDD utilizado na importao (entre aspas simples ou dupla),
se omitido ser utilizado o RDD corrente.
cDelimitador No C
Especifica qual caracter foi utilizado como delimitador para gerar o
arquivo do tipo texto.
/escri)o
Este comando utilizado para copiar alguns registros da tabela corrente para o arquivo especificado
por "TO cAr4uivo" utilizando-se o driver especificado por "VIA R==" 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 para que o registro seja copiado, copia toda a
tabela como se estivesse especificada a opo "ALL".
Pode-se especificar um escopo para que os registros sejam copiados atravs das opes "FOR
Condor" e "WHILE Cond/hile". Pode-se tambm limitar o nmero de registros a serem copiados 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 )!5O#O$12 antes de iniciar a cpia. Se desejado
copiar apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD
nRecno".
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 estes arquivos textos com CO$3 #O,
utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preenchendo com espaos) ou
atravs de um delimitador que separa os campos",". Deve-se especificar na cpia qual o tipo do arquivo
texto atravs das opes "SDF" ou "DELIMITED". Pode-se ainda especificar qual o delimitador utilizado nas
strings da seguinte forma:
"DELIMITED WITH BLANK" - as strings no possuem delimitador;

"DELIMITED WITH c=elimitador" - as strings so delimitadas com o caracter especificado;

Caso seja omitido, o delimitador ser considerado o delimitador padro (" ").
'0emplo
// Este exemplo demonstra como utilizar o comando COPY TO criar nova tabela com 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" NEXT 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 69411233 12.00
COPY TO temp2 DELIMITED WITH "@" // Registro: @Jose@,19751108,69411233,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 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

A$$E,) *%O
CPOS9T
Copia arquivos do servidor para o cliente ( Remote ).
Sinta0e
CpyS2T( cOrigem, c=estino, [lCompacta]) --> NIL
Argumento Obrigat. Tipo Descrio
cOrigem Sim C
Nomes dos arquivos a serem copiados, aceita apenas arquivos no
servidor, WildCards so aceitos normalmente.
cDestino Sim C Diretrio com o destino dos arquivos no remote (Cliente).
lCompacta No L Indica se a cpia deve ser feita compactando o arquivo antes.

Retorno Descrio
.T. Arquivo foi copiado para o cliente com sucesso
.F. Erro na cpia do Arquivo.
/escri)o
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 maneira compactada e
descompactados antes do uso.
'0emplo
C(yS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .T. ) // Copia arquivos do servidor para o remote
local, compactando antes de transmitir
C(yS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .F. ) // Copia arquivos do servidor para o remote
local, sem compactar antes de transmitir
C$3#6"12
CPOT9S
Copia Arquivos entre o Cliente ( Terminal ) para o servidor.
Sinta0e
CpyT2S( cOrigem, cDestino, [ lCompacta ]) --> NIL
Argumento Obrigat. Tipo Descrio
COrigem Sim C
Nomes dos arquivos a serem copiados, aceita apenas arquivos locais
( Cliente ), WildCards so aceitos normalmente.
cDestino Sim C Diretrio com o destino dos arquivos no remote ( Cliente ).
lCompacta No L Indica se a cpia deve ser feita compactando o arquivo antes.

Retorno Descrio
.T. Arquivo foi copiado para o cliente com sucesso.
.F. Erro na cpia do Arquivo.
/escri)o
Copia um arquivo, do cliente ( Remote ) para o servidor, os caracteres * e ?, so aceitos
normalmente.
Caso a compactao seja habilitada ( lCompacta ), os dados sero transmitidos de maneira
compacta e descompactados antes do uso.
'0emplo
C(yT2S( "C:\TEMP\MANUAL.DOC", "\BKP", .T. ) // Copia arquivos do cliente( remote ) para o
Servidor compactando antes de transmitir
C(yT2S( "C:\TEMP\MANUAL.DOC", "\BKP" ) // Copia arquivos do cliente( remote ) para o
Servidor sem compactar.
C$3"6#12
CTreeDellnt
Deleta ndice interno da tabela CTree.
Sinta0e
CTreeDelInt( c>ome )->Lgico
Argumento Obrigat. Tipo Descrio
cNome Sim C Especifica o nome da tabela cujo ndice interno deve ser deletado.

Retorno Descrio
.F.
No conseguiu deletar o ndice interno. Principais erros: tabela no est dentro do diretrio do
Protheus; no abriu a tabela ou no deletou o arquivo de ndice interno.
.T. Deleo do ndice interno ocorrida com sucesso.
/escri)o
A funo CtreeDelInt apaga o ndice interno de tabela Ctree, estando a mesma fechada. Para tanto,
so executados os seguintes procedimentos:
1. Abre a tabela especificada pelo parmetro cNome;
2. Verifica o nome do arquivo do ndice interno na tabela;
3. Fecha a tabela;
4. Deleta fisicamente o arquivo do ndice interno.
A tabela deve ser apagada aps a chamada desta funo, pois a tabela CTree no pode ser aberta sem
ndice interno.
'0emplo
// Este exemplo demonstra o uso tpico de CtreeDelInt(). Sendo que a tabela
"\DADOSADV\SA1990.DTC" deve estar fechada. Se no falhar, o ndice interno apagado e o
processo continua. Se falhar, uma mensagem apresentada.
IF &CtreeDe!Int("\dadosadv\sa1990.dtc")
Messagebox("No foi possvel deletar o ndice da tabela","Erro", 0)
BREAK
ENDIF
fErase("\dadosadv\sa1990.dtc")
C#%EE)ELI)-"12
)!CLEA%I,)E-12
&$)A#EI,#,AE12
CTreeDel$d6s
Deleta os ndices da tabela corrente.
Sinta0e
CTreeDelIdxs()->Lgico
Retorno Descrio
.F. >o conseguiu deletar os 8ndices* Principais erros% R== no A CtreC no fechou a tabelaC no
apagou o ar4uivo de 8ndiceC no atuali<ou as informaBes da tabelaC no abriu a tabela
novamente*
.T. Deleo de ndices ocorrida com sucesso.
/escri)o
A funo CtreeDelIdxs apaga os ndices da tabela corrente, com exceo do ndice interno, apenas se
o mesmo for CTree e estiver exclusiva. Para tanto, ela executa os seguintes passos:
1. Fecha os ndices abertos;
2. Fecha a tabela;
3. Deleta os arquivos de ndice fisicamente;
4. Atualiza as informaes da tabela, removendo os ndices de sua estrutura;
5. Abre novamente a tabela.
Todos os ndices criados de forma permanente ficam guardados na estrutura da tabela. Portanto,
no adianta deletar os arquivos de ndices, pois quando a tabela for aberta, todos os ndices criados de
forma permanente e o ndice interno sero recriados fisicamente (se no existirem); caso contrrio, a tabela
no ser aberta. Por isso, recomendada a criao de ndices de forma temporria.
'0emplo
// Este exemplo demonstra o uso tpico de CtreeDelIdxs(). Se no falhar, os ndices so apagados e o
processo continua. Se falhar, uma mensagem apresentada.

USE Clientes SHARED NEW
IF &CtreeDe!I)*"()
Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0)
BREAK
ENDIF

C#%EE)ELI,#1 2
)!CLEA%I,)E-1 2
!#V)%O$I)-"1 2
CurDir
Retorna o diretrio corrente.
Sinta0e
CURDIR([ c>ovo=ir ]) --> cDirAtual
Argumento Obrigat. Tipo Descrio
cNovoDir No C Caminho com o novo diretrio que ser ajustado como corrente.

Retorno Descrio
cDirAtual bDiretrio corrente, sem a ltima barra.
/escri)o
Retorna o diretrio corrente do servidor, caso seja passado um caminho como parmetro, esse diretrio
passar a ser o default.
'0emplo
? C7RDIR("C:\TEMP")
*ILE12
DIRCHANGE()
A7E)I%12
)I%%EOVE12
Date
Retorna a data do sistema.
Sinta0e
DATE() --> Data
Retorno Descrio
Data =ata do sistema*
/escri)o
DATE() a funo que retorna a data do atual sistema. O formato de sada controlado pelo comando
SET DATE. O formato padro mm/dd/yy.
'0emplos
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()
)#OC12
)#O"12
DaB
Retorna o dia do ms como valor numrico.
Sinta0e
DAY( d=ata ) -->Numrico
Argumento Obrigat. Tipo Descrio
dData Sim D a data a converter.

Retorno Descrio
>=0 e <=31 Se o ms do argumento dData for fevereiro, anos bissextos so considerados.
0
Se a data do argumento dData for 29 de fevereiro e o ano no for bissexto, ou se o
argumento dData for vazio.
/escri)o
DAY() uma funo de converso de datas usada para converter o valor data em um nmero
inteiro que representa o dia do ms.
Esta funo pode ser usada em conjunto com CO,#/12 e 3EA%12 para formatar datas. Pode ser
usada tambm em diversos clculos envolvendo datas.
'0emplos
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("221/2135")) // 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()Data)) + "," + STR(YEAR(dData)) // Resultado: June 15,
2001
C)O.12
CO,#/12
)O.12
O,#/12
3EA%12
D*Append
Acrescenta um novo registro na tabela corrente.
Sinta0e
DBAppend ([ lLibera6lo4ueios ]) ->Nil
Argumento Obrigat. Tipo Descrio
lLibera6lo4ueios No L Libera todos os registros bloqueados (locks), valor padro .T.
/escri)o
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..
'0emplo
// Este exemplo demonstra como se pode utilizar o dbappend liberando e mantendo bloqueios
anteriores.
USE Clientes NEW
FOR i:=1 to 5
D'APPE$D(.F.)
NOME := "XXX"
END : "YYY"
NEXT
// Os 5 registros includos permanecem bloqueados
D'APPE$D()
// Todos os bloqueios anteriores so liberados
%LOC71 2
)!%LOC71 2
D*ClearAllHilter
Limpa a condio de filtro de todas as ordem as ordens da lista.
Sinta0e
DBClearAllFilter() ->Nil
Retorno Descrio
NIL >enhum
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.
'0emplo
// 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
...
D'CLEARALLFILTER() // Limpa a expresso de filtro de todas as ordens

)!*IL#E%
)!"E#*IL#E%
)!CLEA%*IL#E%
D*Clear$nde6
Fecha todos os arquivos de ndice da rea de trabalho.
Sinta0e
DBClearIndex () ->Nil
Retorno Descrio
NIL >enhum

/escri)o
Esta funo salva as atualizaes pendentes na tabela corrente e fecha todos os arquivos de ndice da
rea de trabalho, por conseqncia limpa todas as ordens da lista. Seu funcionamento oposto ao
comando <@>SET INDEX.
'0emplo
// 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"
...
D'CLEARI$DEX() // Fecha todos os arquivos de ndices
)!%EI,)E-
)!"E#I,)E-
)!"E#O%)E%
D*Clear$nde6
Fecha todos os arquivos de ndice da rea de trabalho.
Sinta0e
DBClearIndex () ->Nil
Retorno Descrio
NIL >enhum
/escri)o
Esta funo salva as atualizaes pendentes na tabela corrente e fecha todos os arquivos de ndice da
rea de trabalho, por conseqncia limpa todas as ordens da lista. Seu funcionamento oposto ao
comando <@>SET INDEX.
'0emplo
// 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"
...
D'CLEARI$DEX() // Fecha todos os arquivos de ndices
)!%EI,)E-
)!"E#I,)E-
)!"E#O%)E%
D*CloseArea
Fecha a rea de trabalho.
Sinta0e
DBCloseArea () ->Nil
Retorno Descrio
NIL >enhum
/escri)o
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 &"E.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBCLOSEAREA para fechar a rea de
trabalho atual.
USE Clientes NEW
DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome"
...
D'CLOSEAREA() // Fecha a rea de trabalho atual, todos os indices e ordens
)!COI#
)!&"EA%EA
D*Commit
Salva em disco todas as modificaes da tabela corrente.
Sinta0e
DBCommit() ->Nil
Retorno Descrio
NIL >enhum
/escri)o
Esta funo salva em disco todas as atualizaes pendentes na rea de trabalho corrente.
'0emplo
// 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"
D'CO%%IT() // Salva em disco apenas as alteraes realizadas na tabela Fornecedores
)!COI#ALL
)!&,LOC7
D*CommitAll
Salva em disco todas as modificaes.
Sinta0e
DBCommitAll () ->Nil
Retorno Descrio
NIL >enhum
/escri)o
Esta funo salva em disco todas as atualizaes pendentes em todas as reas de trabalho.
'0emplo
// 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"
D'CO%%ITALL() // Salva em disco as alteraes realizadas nas tabelas Clientes e
Fornecedores
)!COI#
)!&,LOC7
D*Create
Cria nova tabela.
Sinta0e
DBCREATE( c>ome , a,strutura , [ c=river ]) --> Nil
Argumento Obrigat. Tipo Descrio
cNome S C Nome do arquivo da tabela a ser criada (abaixo do "RootPath").
aEstrutura S Array Lista com as informaes dos campos para ser criada a tabela.
cDriver N C
Nome do RDD a ser utilizado para a criao da tabela. Se for omitido ser
criada com o corrente.

Retorno Descrio
>'L Nenhum
/escri)o
Esta funo utilizada para criar um novo arquivo de tabela cujo nome est especificado atravs do
primeiro parmetro (c>ome) e estrutura atravs do segundo (a,strutura).
A estrutura especificada atravs de um array com todos os campos, onde cada campo expresso
atravs de um array contendo {Nome, Tipo, Tamanho, Decimais}, como visto no exemplo a seguir.
'0emplo
// 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},{Pagto, N,7,2}}
D'CREATE("\teste\amigos.xxx",aEstrutura) // Cria a tabela com o RDD corrente
USE "\teste\amigos.xxx" VIA "DBFCDX" NEW
)!&"EA%EA
)!"#%&C#1 2
D*Create$nde6
Cria um arquivo de ndice.
Sinta0e
DBCREATEINDEX( c>ome , c,-pChave , [ b,-pChave ], ( lDnico )) --> Nil
Argumento Obrigat. Tipo Descrio
cNome S C Nome do arquivo de ndice a ser criado.
cExpChave S C Expresso das chaves do ndice a ser criado na forma de string.
bExpChave N Bloco de Cdigo
Expresso das chaves do ndice a ser criado na forma
executvel.
lUnico N L Cria ndice como nico (o padro .F.).

Retorno Descrio
>il
No h tabela corrente ou a posio do campo especificado est invlida.
Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for
tamanho ou casas decimais, tipo caracter se for nome ou tipo).
/escri)o
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 tanto so executados os
passos a seguir:

1. Salva fisicamente as alteraes ocorridas na tabela corrente;

2. Fecha todos os arquivos de ndice abertos;

3. Cria o novo ndice;

4. Seta o novo ndice como a ordem corrente;

5. 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, precisando para isto a
tabela estar aberta em modo exclusivo.
'0emplo
// Este exemplo mostra como se pode criar novo arquivo de ndice criando a ordem sobre os
campos Nome e End e no aceitar duplicao:
USE Cliente VIA "DBFCDX" NEW
D'CREATEI$DEX ("\teste\ind2.cdx","Nome+End",{ || Nome+End },.T.)
)!%EI,)E-1 2
)!"E#I,)E-1 2
)!"E#O%)E%1 2
D*Create$nde6
Cria um arquivo de ndice.
Sinta0e
DBCREATEINDEX( c>ome , c,-pChave , [ b,-pChave ], ( lDnico )) --> Nil
Argumento Obrigat. Tipo Descrio
cNome S C Nome do arquivo de ndice a ser criado.
cExpChave S C Expresso das chaves do ndice a ser criado na forma de string.
bExpChave N Bloco de Cdigo Expresso das chaves do ndice a ser criado na forma executvel.
lUnico N L Cria ndice como nico (o padro .F.).

Retorno Descrio
>il
No h tabela corrente ou a posio do campo especificado est invlida.
Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for
tamanho ou casas decimais, tipo caracter se for nome ou tipo).
/escri)o
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 tanto so executados os
passos a seguir:

1. Salva fisicamente as alteraes ocorridas na tabela corrente;

2. Fecha todos os arquivos de ndice abertos;

3. Cria o novo ndice;

4. Seta o novo ndice como a ordem corrente;

5. 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, precisando para isto a
tabela estar aberta em modo exclusivo.
'0emplo
// Este exemplo mostra como se pode criar novo arquivo de ndice criando a ordem sobre os
campos Nome e End e no aceitar duplicao:
USE Cliente VIA "DBFCDX" NEW
D'CREATEI$DEX ("\teste\ind2.cdx","Nome+End",{ || Nome+End },.T.)
)!%EI,)E-1 2
)!"E#I,)E-1 2
)!"E#O%)E%1 2
Deleted
Verifica se o registro foi deletado.
Sinta0e
DELETED() --> Lgico
Retorno Descrio
.F. O registro no foi deletado
.T. O registro foi deletado
/escri)o
Quando o registro deletado, permanece fisicamente na tabela, mas fica marcado como "deletado".
Esta funo verifica este estado. Quando executada a funo DBPACK todos os registros marcados como
deletados so apagados fisicamente enquanto a funo )!%ECALL marca todos os registros deletados
como no-deletados.
'0emplo
// Este exemplo verifica se determinado registro est deletado, caso positivo, mostra uma mensagem:
USE "\DADOSADV\AA1990.DBF" SHARED NEW
DBGOTO(100)
IF DELETED()
Messagebox("O registro atual foi deletado","Erro", 0)
BREAK
ENDIF

)!$AC71 2
)!%ECALL1 2
D*val
Executa uma expresso para os registros dentro das condies especificadas.
Sinta0e
DBEVAL( b6loco, [ borCond ], [ b/hileCond ], [ nPro-Regs ], [ nRecno ], [ lRestante ]) --> Nil
Argumento Obrigat. Tipo Descrio
bBloco S
Bloco de
Cdigo
Expresso na forma executvel a ser resolvida para cada registro
processado.
bForCond N
Bloco de
Cdigo
Expresso na forma executvel a ser resolvida para verificar se o
registro em questo est dentro do escopo definido.
bWhileCond N
Bloco de
Cdigo
Expresso na forma executvel a ser resolvida para verificar at qual
registro ser processado (at o bloco retornar .F.).
nProxRegs N N Nmero de registros a ser processado a partir do registro corrente.
nRecno N N
Identificao de determinado registro a ser resolvida a expresso
(recno).
lRestante N L Processa o restante dos registro.
/escri)o
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 nPro-Regs ou se setado o
parmetro lRestante sero executados todos os registros a partir do registro corrente 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" e "while", os mesmos sero considerados .T. como padro,
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.
'0emplo
// Este exemplo mostra como se pode usar o DBEVAL para contar quantos registros 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. Supondo 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 registros 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)
D'E#AL( {|| 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 := "";
D'E#AL( {|| 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)
D'E#AL( {|| nRecno := RECNO()}, {|| Nome > "FFFFF"}, {|| Idade < 40},10,,.T.)
AEVAL1 2
EVAL
D*H
Verifica qual o Alias corrente.
Sinta0e
DBF() --> Caracter
Retorno Descrio
"" No existe tabela em uso.
cAlias String contendo o Alias corrente.
/escri)o
Verifica 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 "ELEC#12, pois nesta retornado o nmero da rea de trabalho
do Alias correspondente.
'0emplo
// 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 : " + D'F(), "Alias", 0) // Resultado: "O Alias
corrente : SSS"
)!&"EA%EA
"ELEC#1 2
ALIA"1 2
D*Hield$n.o
Verifica informaes sobre um campo.
Sinta0e
DBFieldInfo ( n'nfo+ipo , nCampo ) -> Informao do Campo
Argumento Obrigat. Tipo Descrio
nInfoTipo S N Tipo de informao a ser verificada.
nCampo S N Posio do campo a ser verificado.

Retorno Descrio
Nil
No h tabela corrente ou a posio do campo especificado est invlida.
Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for tamanho
ou casas decimais, tipo caracter se for nome ou tipo).
/escri)o
Esta funo utilizada para obter informaes sobre determinado campo da tabela corrente. O tipo
de informao (primeiro argumento) escolhido de acordo com as constantes abaixo:
DBS_DEC Nmero de casas decimais (tipo numrico)
DBS_LEN Tamanho (tipo numrico)
DBS_TYPE Tipo (tipo caracter)

A posio do campo no leva em considerao os campos internos do Protheus (recno e deleted).
'0emplo
// Este exemplo demonstra como se pode utilizar o DBFIELDINFO para obter as informaes
do primeiro campo da tabela Clientes.
USE Clientes NEW
D'FIELDI$FO(D'S8$A%E, 2) // Retorno: Nome
D'FIELDI$FO(D'S8TYPE, 2) // Retorno: C
D'FIELDI$FO(D'S8LE$, 2) // Retorno: 10
D'FIELDI$FO(D'S8DEC, 2) // Retorno: 0
)!I,*O1 2
)!O%)I,*O1 2
FIELDNAME
D*Hilter
Verifica a expresso de filtro corrente.
Sinta0e
DBFilter () --> Caracter
Retorno Descrio
"" No existe filtro ativo na rea de trabalho atual.
cExpFiltro Expresso do filtro ativo na rea de trabalho atual.
/escri)o
Esta funo utilizada para verificar a expresso de filtro ativo na rea de trabalho corrente.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBFILTER para verificar a expresso do
filtro corrente.
USE Cliente INDEX Ind1 NEW
SET FILTER TO Nome > "Jose"
D'FILTER() // retorna: Nome > "Jose"
SET FILTER TO Num < 1000
D'FILTER() // retorna: Num < 1000
DBRELATION
DBRSELECT
D*2o*ottom
Posiciona no ltimo registro lgico.
Sinta0e
DBGoBottom() -> Nil
Retorno Descrio
NIL >enhum
/escri)o
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 registro lgico pode no ser
o ltimo registro fsico.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no ltimo
registro fsico.
USE Cliente
D'9O'OTTO%() // Posiciona no ltimo registro fsico, pois no h ordem ativa
// Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no ltimo
registro lgico.
USE Cliente INDEX Ind1 NEW
D'9O'OTTO%() // Posiciona no ltimo registro lgico (ltimo registro na sequncia gerada
pelo ndice)
)!5O#O1 2
)!5O#O$1 2
)!"EE71 2
)!"7I$1 2
DBEOF( )
DBBOF( )
D*2oTo
Posiciona em determinado registro.
Sinta0e
DBGoTo( nRegistro ) -> Nil
Argumento Obrigat. Tipo Descrio
nRegistro S N bbbNmero do registro a ser posicionado.
/escri)o
Esta funo utilizada para posicionar a tabela corrente em determinado registro, segundo a ordem fsica
(seqncia sobre o recno).
'0emplo
// Este exemplo demonstra como se pode utilizar o DBGOTO para posicionar a tabela
corrente em determinado registro.
USE Cliente INDEX Ind1 NEW
D'9OTO(2//) // Posiciona no registro de recno 100
)!5O!O##O
)!5O#O$
)!"EE7
)!"7I$
DBEOF
DBBOF
D*2oTop
Posiciona no primeiro registro lgico.
Sinta0e
DBGoTop() -> Nil
bRetorno Descrio
NIL >enhum

/escri)o
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.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBGOBOTOP para posicionar no primeiro
registro fsico.
USE Cliente
D'9OTOP() // Posiciona no primeiro registro fsico, pois no h ordem ativa
// Este exemplo demonstra como se pode utilizar o DBGOTOP para posicionar no primeiro
registro lgico.
USE Cliente INDEX Ind1 NEW
D'9OTOP() // Posiciona no primeiro registro lgico (primeiro registro na seguncia gerada
pelo ndice)
)!5O#O
)!5O!O##O
)!"EE7
)!"7I$
DBEOF
DBBOF
D*$n.o
Verifica informaes sobre a tabela corrente.
Sinta0e
DBInfo ( n'nfo+ipo ) -> Informao da Tabela
Argumento Obrigat. Tipo Descrio
nInfoTipo S N Tipo de informao a ser verificada.

Retorno Descrio
>il
No h tabela corrente.
Informao da Tabela Informao requisitada pelo usurio (o tipo depende da
informao requisitada).
/escri)o
Esta funo utilizada para obter informaes sobre a tabela corrente. O tipo de informao (primeiro
argumento) escolhido de acordo com as constantes abaixo:

DBI_GETRECSIZE Tamanho do registro em nmero de bytes similar a %EC"I4E (tipo numrico)
DBI_TABLEEXT ,-tenso do ar4uivo da tabela corrente 5tipo caracter)
DBI_FULLPATH Nome da tabela corrente com caminho completo (tipo caracter)
DBI_BOF Verifica se est posicionada no incio da tabela similar a BOF (tipo lgico)
DBI_EOF Verifica se est posicionada no final da tabela similar a EOF (tipo lgico)
DBI_FOUND Verifica se a tabela est posicionada aps uma pesquisa similar a FOUND (tipo lgico)
DBI_FCOUNT Nmero de campos na estrutura da tabela corrente similar a FCOUNT (tipo numrico)
DBI_ALIAS Nome do Alias da rea de trabalho corrente similar a ALIA" (tipo caracter)
DBI_LASTUPDATE Verifica a data da ltima modificao similar a L&$)A#E (tipo data)
'0emplo
// Este exemplo demonstra como se pode utilizar o DBINFO para obter as informaes da
tabela corrente (Clientes).
USE Clientes NEW
D'I$FO(D'I8F7LLPAT4) // Retorno: C:\Teste\Clientes.dbf
D'I$FO(D'I8FCO7$T) // Retorno: 12
DBGOTOP()
D'I$FO(D'I8'OF) // Retorno: .F.
DBSKIP(-1)
D'I$FO(D'I8'OF) // Retorno: .T.
)!O%)I,*O1 2
)!*IEL)I,*O1 2
D*R,ocX,ist
Retorna uma lista com todos os registros locados na tabela corrente.
Sinta0e
DBRLOCKLIST() --> Array
Retorno Descrio
Nil >o e-iste tabela corrente ou no e-iste nenhum registro locado*
ListaLock Lista com os recnos dos registros locados na tabela corrente.
/escri)o
Esta funo utilizada para verificar quais registros esto locados na tabela corrente. Para tanto,
retornada uma tabela unidimensional com os nmeros dos registros.
'0emplo
// 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
D'RLOC:LIST() // Retorna: {1,100,110}

*LOC71 2
%LOC71 2
)!&,LOC71 2
)!%&,LOC71 2
)!%LOC71 2
D*3rder$n.o
Verifica informaes sobre uma ordem.
Sinta0e
DBOrderInfo ( n'nfo+ipo 3 [ c'ndice ], [ cOrdem | nPosicao ]) -> Informao da Ordem
Argumento Obrigat. Tipo Descrio
nInfoTipo S N Nome do arquivo de ndice.
cOrdem N C Nome da ordem.
nPosio N N Posio da ordem na lista de ordens ativas.

Retorno Descrio
Nil
No h ordem corrente ou a posio da ordem especificada est invlida.
Informao da Ordem Informao requisitada pelo usurio (pode ser de tipo numrico se for
nmero de ordens no ndice, tipo caracter se for nome do arquivo de ndice).
/escri)o
Esta funo utilizada para obter informaes sobre determinada ordem. A especificao da ordem pode
ser realizada atravs de seu nome ou sua posio dentro da lista de 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 abaixo:
DBOI_BAGNAME Nome do arquivo de ndice ao qual a ordem pertence (tipo caracter).
DBOI_FULLPATH Nome do arquivo de ndice (com seu diretrio) ao qual a ordem pertence (tipo caracter)
DBOI_ORDERCOUNT Nmero de ordens existentes no arquivo de ndice especificado
'0emplo
// Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter informaes
sobre o nome do arquivo de ndice da ordem corrente.
D'ORDERI$FO(DBOI_BAGNAME) // retorna: Ind
D'ORDERI$FO(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.
D'ORDERI$FO(DBOI_BAGNAME,,3) // retorna: Ind2
D'ORDERI$FO(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.
D'ORDERI$FO(DBOI_ ORDERCOUNT,"\Teste\Ind2.cdx") // retorna: 3
)!I,*O1 2
)!*IEL)I,*O1 2
)!%ecordIn8o1 2
D*3rder&icX&ame
Torna ativa a ordem com o determinado apelido.
Sinta0e
DBOrderNickName( cApelido ) -> Lgico
Argumento Obrigat. +ipo Descrio
cApelido S C Nome do apelido da ordem a ser setada.

Retorno Descrio
.F.
No conseguiu tornar a ordem ativa.
Principais erros: No existe tabela ativa ou no foi encontrada a ordem com o apelido.
.T. A ordem foi setada com sucesso.
/escri)o
Esta funo utilizada para selecionar a ordem ativa atravs de seu apelido. Esta ordem a responsvel
seqncia lgica dos registros da tabela corrente.
'0emplo
//Este exemplo demonstra como se pode utilizar o DBORDERNICKNAME para setar nova ordem.
USE Cliente NEW
SET INDEX TO Nome, Idade
IF !D'ORDER$IC:$A%E("IndNome")
Messagebox("Registro no encontrado","Erro", 0)
BREAK
ENDIF
)!"E#O%)E%1 2
)!"E#,IC7,AE1 2
D*Recall
Altera o estado deletado do registro atual.
Sinta0e
DBRecall() -> Nil
Retorno Descrio
NIL >enhum
/escri)o
Esta funo utilizada para retirar a marca de registro deletado do registro atual. Para ser executada o
registro atual deve estar bloqueado ou a tabela deve estar aberta em modo exclusivo. Se o registro atual
no estiver deletado, esta funo no faz nada. Ela o oposto da funo )!)ELE#E que marca o
registro atual como deletado.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBRECALL para retornar o estado do
registro atual para normal.
USE Cliente
DBGOTO(100)
DBDELETE()
DELETED() // Retorna: .T.
D'RECALL()
DELETED() // Retorna: .F.
// Este exemplo demonstra como se pode utilizar o DBRECALL para desfazer todas as
delees da tabela corrente.
USE Cliente
DBGOTOP()
WHILE !EOF()
D'RECALL()
DBSKIP()
ENDDO
)!)ELE#E1 2
D*Record$n.o
Verifica informaes sobre um registro.
Sinta0e
DBRecordInfo ( n'nfo+ipo 3( nRegistro )) -> Informao do Registro
Argumento Obrigat. Tipo Descrio
n'nfo+ipo S N Tipo de informao a ser verificada.
nRegistro Opcional N Nmero do registro a ser verificado.

Retorno Descrio
Nil
No h tabela corrente ou registro invlido.
Informao do Registro. Informao requisitada pelo usurio (o tipo depende da informao
requisitada).
/escri)o
Esta funo utilizada para obter informaes sobre o registro especificado 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 )ELE#E) (tipo lgico)
DBRI_RECSIZE Tamanho do registro. Similar a %EC"I4E (tipo numrico)
DBRI_UPDATED
Verifica se o registro foi alterado e ainda no foi atualizado fisicamente. Similar a
UPDATED (tipo lgico).

'0emplo
// Este exemplo demonstra como se pode utilizar o DBRECORDINFO para se obter as
informaes sobre registros da tabela corrente.
USE Clientes NEW
DBGOTO(100)
D'RECORDI$FO(DBRI_DELETED) // Retorno: .F.
DBDELETE()
D'RECORDI$FO(DBRI_DELETED) // Retorno: .F.
DBRECALL()
D'RECORDI$FO(DBRI_RECSIZE) // Retorno: 230
NOME := "JOAO"
DBGOTO(200)
D'RECORDI$FO(DBRI_UPDATED) // Retorno: .F.
D'RECORDI$FO(DBRI_UPDATED,100) // Retorno: .T.
)!O%)E%I,*O1 2
)!*IEL)I,*O1 2
D*Reinde6
Reconstri todos os ndices da rea de trabalho.
Sinta0e
DBReindex() -> Nil
Retorno Descrio
NIL >enhum

/escri)o
Reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro registro lgico.
'0emplo
// 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")
D'REI$DEX()
)!"E#I,)E-1 2
)!"E#O%)E%1 2
D*R,ocX
Bloqueia determinado registro.
Sinta0e
DBRLOCK([ nRegistro ]) --> Lgico
Argumento Obrigat. Tipo Descrio
nRegistro Opcional N Nmero do registro a ser bloqueado.

Retorno Descrio
.F.
No conseguiu bloquear o registro.
Principal motivo: o registro j foi bloqueado por outro usurio.
.T. O registro foi bloqueado com sucesso
/escri)o
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.

O usurio pode escolher o registro a ser bloqueado atravs do parmetro (recno), mas se este for omitido
ser bloqueado o registro corrente como na funo %LOC712.

Esta funo o oposto )!%&,LOC7, que libera registros bloqueados.
'0emplo
// Este exemplo mostra duas variaes do uso de DBRLOCK.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
D'RLOC:() // Bloqueia o registro atual (100)
D'RLOC:(22/) // Bloqueia o registro de nmero 110
*LOC7
%LOC71 2
)!&,LOC71 2
)!%&,LOC71 2
)!%LOC7LI"#1 2
D*Run,ocX
Desbloqueia determinado registro.
Sinta0e
DBRUNLOCK([ nRegistro ]) --> Nil
Argumento Obrigat. Tipo Descrio
nRegistro No N Nmero do registro a ser desbloqueado.

Retorno Descrio
NIL Sem retorno.
/escri)o
Esta funo utilizada para liberar determinado registro bloqueado.
O usurio pode escolher o registro a ser desbloqueado atravs do parmetro (recno), mas se este for
omitido ser desbloqueado o registro corrente como na funo )!&,LOC712.
Esta funo o oposto )!%LOC7, que bloquea os registros.
'0emplo
// Este exemplo mostra duas variaes do uso de DBRUNLOCK.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
D'R7$LOC:() // Desbloqueia o registro atual (100)
D'R7$LOC:(22/) // Desbloqueia o registro de nmero 110

*LOC7
%LOC71 2
)!&,LOC71 2
)!%LOC71 2
)!%LOC7LI"#1 2

D)SeeX
Encontra um registro com determinado valor da chave do ndice.
Sinta0e
DBSeek ( c,-p | n,-p, [ l#oft#ee" ], [ lDltimo ]) --> Lgico
Argumento Obrigat. Tipo Descrio
c,-p Sim C
Valor de chave a ser encontrado do tipo caracter (todos os tipos de
expresso de ndice com exceo do ndice com apenas um campo do tipo
numrico).
nExp Sim N
Valor de chave a ser encontrado do tipo numrico (apenas quando a
expresso do ndice possui apenas uma campo do tipo numrico).
lSoftSeek No L
Posiciona no primeiro registro com expresso de chave maior que o valor
procurado. O padro .F.
lUltimo No L Procura a ltima ocorrncia do valor procurado. O padro .F.

Retorno Descrio
.F. No foi encontrado nenhum registro com o valor especificado
.T. Foi encontrado um registro com o valor especificado
/escri)o
Esta funo utilizada para encontrar um registro com determinado valor da expresso de chave de
ndice.
Antes da chamada do DBSEEK deve-se certificar de que existe uma ordem ativa no momento com os
campos que se deseja pesquisar o valor.
Se a expresso possuir apenas uma campo numrico, o primeiro 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).
Quando o segundo parmetro for especificado como .T. (softseek), mesmo que a expresso pesquisada
no 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).
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.
Se o terceiro parmetro for especificado com valor .T. a funo posiciona a tabela no ltimo registro com
o valor procurado, caso no seja especificado ou for .F., ser posicionada na primeira ocorrncia.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBSEEK para busca de valores numricos.
USE Clientes NEW
ORDLISTADD ("/teste/ind1.cdx") // Expresso Num (campo numrico)
D'SEE:(2//) // Retorna: .F.
EOF() // Retorna: .T.
D'SEE:(2//,.T.) // Retorna: .F.
EOF() // Retorna: .F. (pois o softseek posicionou no prximo registro)
// 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)
D'SEE:(";oao2//2/2",.T.) // Procura a primeira ocorrncia de Nome "joao" e vencimento
maior que Janeiro de 2001
WHILE !EOF() .AND. Nome == " joao"
DBSKIP()
ENDDO

*O&,)1 2
EO*1 2
)!"7I$1 2
)!5O#O$1 2
)!5o!ottom1 2
D*SetDriver
Modifica ou verifica o RDD padro.
Sinta0e
DBSetDriver ([ c>ovoRddPadro ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cNovoRddPadro No C Novo nome do RDD a ser definido como padro.

Retorno Descrio
cAntigoRddPadro Nome do RDD padro corrente
/escri)o
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 especificar outro RDD como padro, especificando-o atravs do
parmetro.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBSETDRIVER para alterar o valor do RDD
padro.
D'SETDRI#ER("CTREECDX") // Retorna: DBFCDX
D'SETDRI#ER() // Retorna: CTREECDX

%))"E#)E*A&L#1 2
RDDNAME( )
RDDLIST( )

D*SetHilter
Seta uma condio de filtro.
Sinta0e
DBSetFilter( bCondio, cCondio ) --> Nil
Argumento Obrigat. Tipo Descrio
bCondio Sim Bloco de Cdigo Expresso do filtro na forma executvel.
cCondio Sim C Expresso do filtro na forma de string.

Retorno Descrio
NIL Sem retorno.

/escri)o
Esta funo utilizada para setar um filtro nos registros da tabela corrente especificado atravs do bloco
de cdigo no primeiro parmetro.

Quando um registro no est dentro do filtro setado ele continua existindo fisicamente, mas no
logicamente (nas funes de manipulao de banco de dados como )!5O#O$, )!"EE7, )!"7I$,
etc).
'0emplo
// Este exemplo demonstra como se pode utilizar o DBSETFILTER para filtrar todos os
clientes com menos de 40 anos.
USE Cliente NEW
D'SETFILTER( {|| Idade < 40}, "Idade < 40" )
DBGOTOP()

)!*IL#E%1 2

D*Set$nde6
Acrescenta todas as ordens de determinado ndice lista.
Sinta0e
DBSetIndex( cAr4'ndice ) --> Nil
Argumento Obrigat. Tipo Descrio
cAr4'ndice Sim C Nome do arquivo de ndice, com ou sem diretrio e extenso.

Retorno Descrio
NIL Sem retorno.
/escri)o
Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho.

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 primeira torna-se ativa.

Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no primeiro parmetro,
mas caso contrrio deve ser especificado.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBSETINDEX para acrescentar novos
ndices lista de ordens.
USE Cliente NEW
D'SETI$DEX("In)2")
D'SETI$DEX("<te"te<In)2.=)*")

O%)LI"#A))1 2
D*Set&icX&ame
Seta um apelido para determinada ordem ou verifica qual o apelido corrente.
Sinta0e
DBSetNickName( cOrdem,[ cApelido ]) --> Caracter
Argumento Obrigat. Tipo Descrio
c'ndice Sim C Nome da ordem que deve receber o apelido.
cApelido No C Nome do apelido da ordem a ser setada.

Retorno Descrio
"" No conseguiu encontrar a ordem especificada, no conseguiu setar o apelido ou no havia
apelido corrente
cApelido Apelido corrente

/escri)o
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 corrente.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBSETNICKNAME para setar um novo
apelido e verificar qual o apelido atual.
USE Cliente NEW
D'SET$IC:$A%E("In)$o>e") // retorna: ""
D'SET$IC:$A%E("In)$o>e","$O%E") // retorna: ""
D'SET$IC:$A%E("In)$o>e") // retorna: "NOME"

)!O%)E%,IC7,AE1 2
D*Set3rder
Seleciona a ordem ativa da rea de trabalho.
Sinta0e
DBSetOrder( nPosio ) --> Nil
Argumento Obrigat. Tipo Descrio
nPosio Sim N Posio da ordem na lista de ordens ativas

Retorno Descrio
NIL Sem retorno

/escri)o
Esta funo utilizada para selecionar a ordem ativa da rea de trabalho.
Esta ordem a responsvel seqncia lgica dos registros da tabela corrente.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBSETORDER para selecionar a ordem
corrente.
USE Cliente NEW
SET INDEX TO Nome, Idade
D'SETORDER(2)

O%)LI"#A))1 2
)!%EI,)E-1 2
)!"E#I,)E-1 2
D*SXip
Desloca para outro registro na tabela corrente.
Sinta0e
DBSkip([ nRegistros ]) --> Nil
Argumento Obrigat. Tipo Descrio
nRegistros No N Nmero de registros a ser deslocado.

Retorno Descrio
NIL Sem retorno.
/escri)o
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 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 primeiro registro e seta BOF, caso passe do final da tabela,
posiciona no registro LASTREC + 1 e seta EOF.
'0emplo
// Este exemplo mostra como o DBSKIP pode passar do final da tabela e do incio da tabela
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOBOTTOM()
EOF() // retorna .F.
D'S:IP()
EOF() // retorna .T.
DBGOTOP()
BOF() // retorna .F.
D'S:IP(?2)
BOF() // retorna .T.
// Este exemplo mostra como o DBSKIP pode deslocar 10 registro em relao ao registro
corrente
DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
D'S:IP(2/)
RECNO() // retorna 110
D'S:IP(?2/)
RECNO() // retorna 100

BOF( )
EOF( )
)!5O#O$1 2
)!5O!O##O1 2
)!"EE71 2
D*Struct
Retorna a estrutura da tabela corrente.
Sinta0e
DBStruct() --> Array

Retorno Descrio
{} >o e-iste tabela corrente*
aEstrutura Array com todos os campos, onde cada elemento um subarray contendo Nome, Tipo, Tamanho
e Decimais.
/escri)o
Esta funo utilizada para verificar a estrutura da tabela corrente da mesma forma que utilizada para
criar a tabela com a funo )!C%EA#E.
Para isto ela cria um array para gravar as informaes e as retorna.
'0emplo
// Este exemplo demonstra como se pode utilizar o DBSTRUCT para recuperar a estrutura da
tabela corrente.
USE Cliente NEW
D'STR7CT()
//Retorna:{{Cod,N,3,0},{Nome,C,10,0},{Idade,N,3,0},{Nasc,D,8,0},{Pagto,N,7,2}}

)!C%EA#E1 2
AFIELDS( )
D*'nlocX
Desbloqueia todos os registros da tabela corrente.
Sinta0e
DBUNLOCK() --> Nil
Retorno Descrio
NIL #em retorno*
/escri)o
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar
)!%&,LOC7 para todos os registros da lista )!%LOC7LI"#.
'0emplo
// Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
D'7$LOC:()

FLOCK( )
%LOC71 2
)!&,LOC7ALL1 2
)!%LOC71 2
)!%LOC7LI"#1 2

D*'nlocXAll
Desbloqueia todos os registros de todas as tabelas abertas.
Sinta0e
DBUNLOCKALL() --> Nil
Retorno Descrio
NIL #em retorno*
/escri)o
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar )!&,LOC7
para todos os registros da lista )!%LOC7LI"# de todas as reas de trabalho.
'0emplo
// Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
D'7$LOC:ALL()

FLOCK( )
%LOC71 2
)!&,LOC71 2
)!%LOC71 2
)!%LOC7LI"#1 2

D*'nlocXAll
Desbloqueia todos os registros de todas as tabelas abertas.
Sinta0e
DBUNLOCKALL() --> Nil
Retorno Descrio
NIL #em retorno*
/escri)o
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar )!&,LOC7
para todos os registros da lista )!%LOC7LI"# de todas as reas de trabalho.
'0emplo
// Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
D'7$LOC:ALL()

FLOCK( )
%LOC71 2
)!&,LOC71 2
)!%LOC71 2
)!%LOC7LI"#1 2

Delete
Marca registros como deletados.
Sinta0e
DELETE [FOR Condor] [WHILE Cond/hile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento Obrigat. Tipo Descrio
CondFor No
Expresso em ADVPL a ser resolvida para que o registro seja marcado
como deletado.
CondWhile No
Expresso em ADVPL que determina quando a "deleo" deve parar
(quando a expresso retornar .F.
nRecs No N Quando registros devem ser marcados como deletados.
nRecno No N Nmero do recno do registro a ser deletado.

Retorno Descrio
NIL Sem retorno.
/escri)o
Este comando utilizado para marcar alguns registros da tabela corrente como deletados.
Se no forem especificadas as condies para que o registro seja marcado como deletado, 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 Condor" e
"WHILE Cond/hile".
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 atual com "REST", mas caso
contrrio o comando executa um )!5O#O$12 antes de iniciar a "deleo".
Se desejado marcar apenas determinado registro pode-se defini-lo atravs da especificao do recno
com "RECORD nRecno".
'0emplo
// Este exemplo demonstra como utilizar o comando DELETE para marcar alguns registros
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

%ECALL
%E$LACE
SET DELETED ON
$AC7
4A$
Dev3utPict
Imprime o contedo na posio corrente formatando a sada.
Sinta0e
DEVOUTPICT ( -$al, cPicture ) --> NIL
Argumento Obrigat. Tipo Descrio
xVal Sim C, N ou D Informar valor a ser impresso.
cPicture Sim C Informar a mscara de formatao do dado.

Retorno Descrio
NIL Nenhum
/escri)o
DEVOUTPICT( ) imprime contedo na posio corrente de $%O.1 2 e $COL1 2, aplicando a mscara
cPicture.
'0emplo
nVal:= 100.89
DevPos( 10,10 ) // configura linha 0, coluna 0 para impresso
//@ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() )
De@OutP=t( nVal, "@E 999,999.99" ) // imprime 100,89

)EV$O"1 2
DEVOUT( )
DevPos
Posiciona linha e coluna de impresso.
Sinta0e
DEVPOS( nLin, nCol ) --> NIL
Argumento Obrigat. Tipo Descrio
nLin Sim N Informar nova linha de impresso.
nCol Sim N Informar nova coluna de impresso.

Retorno Descrio
NIL Nenhum
/escri)o
DEVPOS( ) modifica a linha e coluna corrente de impresso. Modifica os retornos de $%O.12 e $COL1 2.
'0emplo
De@Po"( 10,10 ) // configura linha 0, coluna 0 para impressao
@ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() )

DEVOUT( )

DirectorB
Cria um array com dados dos diretrios e dos arquivos.
Sinta0e
DIRECTORY( c=ir#pec , [ cAtributos ]) -->Array
Argumento Obrigat. +ipo Descrio
cDirSpec Sim C
Identifica o drive, o caminho de onde as informaes sero buscadas. O
Caminho pode estar no servidor ou no local (Remote).
cAtributos No C
Especifica os atributos especiais de arquivos/diretrios que devem ser
includos na busca por informaes. Abaixo esto os atributos aceitos.
Note que o atributo normal sempre considerado, desde que no seja
informado.
Atributo Descrio
H Incluir arquivos ocultos (Hidden)
S Incluir arquivos de sistema.
D
Incluir diretrios
V Procurar o nome do disco (label)

Retorno Descrio
Array Retorna um array de subarrays onde cada subarray contm informaes sobre um
arquivo ou diretrio que correspondem a c=ir#pec.
Os subarrays possuem a seguinte estrutura, definida em directry.ch:
F_NAME Caracter, Nome do arquivo
F_SIZE Numrico, Tamanho do arquivo
F_DATE Data, Data de modificao do arquivo
F_TIME Caracter, Hora de modificao do arquivo
F_ATTR Caracter, Atributos do arquivo.
/escri)o
DIRECTORY() funo que retorna informaes de arquivos/diretrios que correspondam a uma mscara
especifica.

Tanto arquivos no servidor como no cliente (Remote) so aceitos. Os atributos so sempre aditivos.

Utilize Directory() ao invs de ADIR().
'0emplos
#include "Directry.ch"
//
aDirectory := DIRECTORY("*.*", "D")
AEVAL( aDirectory, {|aFile| QOUT(aFile[F_NAME])} )
C&%)I%12
A)I%12

DirRemove
Elimina um diretrio.
Sinta0e
DIRREMOVE( c=ir>ome ) --> lSuccesso
Argumento Obrigat. Tipo Descrio
c=ir>ome Sim C
Nome do diretrio a ser removido, opcionalmente incluindo o caminho. O
diretrio ser removido no servidor.

Retorno Descrio
.T. O diretrio foi eliminado.
.F. No foi possivel eliminar o diretrio.
/escri)o
DIRREMOVE() elimina um diretrio especifico.

Note que necessrio ter direitos suficientes para remover um diretrio, e o diretrio para ser eliminado
precisa estar vazio, sem subdiretrios e arquivos.
'0emplo
DIRRE%O#E("c:\teste\um\dois") // Eliminando um diretrio, sem testar o retorno
bResult := DIRRE%O#E("c:\teste\um") // Elimina e testa o retorno
IF bResult
? "Impossivel excluir o diretrio"
ENDIF
DIRMAKE()
DIRCHANGE()
DoW
Converte uma data para o valor numrico do dia da semana.
Sinta0e
DOW( d=ata ) --> Numrico
Argumento Obrigat. Tipo Descrio
dData Sim D o valor da data a converter.

Retorno Descrio
>=0 e <=7 Retorna um nmero entre zero e sete, representando o dia da semana. O primeiro dia da
semana 1 (Domingo) e o ltimo 7 (Sbado). Se a data for vazia ou invlida, DOW()
retorna zero.
/escri)o
DOW() uma funo que converte uma data para o valor numrico que representa o dia da semana. til
quando se deseja fazer clculos semanais. DOW() similar a CDOW(), que retorna o dia da semana como
uma cadeia de caracteres.
'0emplos
Estes exemplos mostram como usar CDOW() e o seu relacionamento com DOW():
dData := DATE() // Resultado: 09/01/01
nDiaDaSemana := DO,(DATE()) // Resultado: 3
cDiaDaSemana := CDOW(DATE()) // Resultado: Tuesday
nDiaDaSemana := DO,(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 data informada.
FUNCTION LastMonday(dData)
RETURN (dData - DO,()Data) + 2)
C)O.12
)A#E12
)A312
Dtoc
Converte uma data para cadeia de caracteres.
Sinta0e
DTOC( d=ata ) --> Caracter
Argumento Obrigat. Tipo Descrio
dData Sim D o valor a converter.

Retorno Descrio
Caracter uma cadeia de caracteres representando o valor da data. O retorno formatado utilizando-
se o formato corrente definido pelo comando SET DATE 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.
/escri)o
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 especial, use a funo
TRANSFORM() <a>.

Em expresses de ndices de arquivo, use DTOS() no lugar de DTOC() para converter datas para cadeia de
caracteres.
'0emplos
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()
)A#E12
)#O"12
Dtos
Converte uma data para uma cadeia de caracteres no formato yyyymmdd.
Sinta0e
DTOS( d=ata ) --> Caracter
Argumento Obrigat. Tipo Descrio
d=ata Sim D o valor da data a converter.

Retorno Descrio
Caracter Retorna uma cadeia de caracteres com oito byte de tamanho no formato
yyyymmdd. Quando d=ata nulo ou invalido, DTOS() retorna uma cadeia de
caracteres com oito espaos. O valor retornado no afetado pela formato da data
corrente.
/escri)o
DTOS() uma funo de converso de data que pode ser usada para criar expresses de ndice. O
resultado estruturado visando manter a ordem correta do ndice (ano, ms, dia).
'0emplos
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()
)A#E12
)#OC12

@ect
Fora a impresso de nova pgina no relatrio.
Sinta0e
EJECT( )--> NIL
Retorno Descrio
NIL #em retorno
/escri)o
EJECT( ) efetua o salto de pgina na impresso de relatrio configurando o $%O.1 2 para 0.
'0emplo
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
EAECT( ) // Salta de pagina
FECHAREL( ) // Fecha impressao

I,I#$%I,#1 2
$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
$COL1 2
"E#$%C1 2
$%,*L&"/1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
lapTime
Retorna o tempo decorrido entre duas horas.
Sinta0e
ElapTime( c.ora'nicial , c.orainal ) --> Caracter
Argumento Obrigat. Tipo Descrio
cHoraInicial Sim C Informe a hora inicial no formato hh:mm:ss, onde hh a hora ( 1
a 24 ), mm os minutos e ss os segundos
cHoraFinal Sim C Informe a hora final no formato hh:mm:ss, onde hh a hora ( 1 a
24 ), mm os minutos e ss os segundos.

Retorno Descrio
Caracter A diferena de tempo no formato hh:mm:ss, onde hh a hora ( 1 a 24 ), mm os minutos
e ss os segundos
/escri)o
ElapTime() retorna uma cadeia de caracteres contendo a diferena de tempo no formato hh:mm:ss, onde
hh a hora ( 1 a 24 ), mm os minutos e ss os segundos.
'0emplos
Este exemplo compara ELAPTIME():
cHoraInicio := TIME() // Resultado: 10:00:00
.
. <instrucoes>
.
cElapsed := ELAPTI%E(TI%E(), cHoraInicio)
#IE12
HClose
Fecha um arquivo binrio e grava os buffers no disco.
Sinta0e
FCLOSE( n.andle ) --> Lgico
Argumento Obrigat. Tipo Descrio
nHandle Sim N Handle a ser fechado

Retorno Descrio
.F. nHandle informado no corresponde a um arquivo aberto previamente, ou erro na gravao dos
buffers pendentes, verifique atravs de FERROR() maiores detalhes sobre o erro.
.T. Arquivo foi fechado com sucesso.
/escri)o
Fecha um manipulador ( handle ) de um arquivo binrio. Este manipulador deve ter sido aberto atravs
das funes *O$E,12, *O$E,$O%#12, *C%EA#E12.
'0emplo
O exemplo abaixo utiliza o CLOSE para fechar um arquivo.
#include "Fileio.ch"
//
nHandle := FCREATE("Testfile", FC_NORMAL)
IF &FCLOSE(n4an)!e)
conout ("Erro fechando arquivo:" + Str(FError( 0 )
ENDIF
*E%%O%12
*O$E,12
*CLO"E12
*%EA)12
*.%I#E12
*O$E,$O%#12
HCreate
Cria um arquivo, ou elimina o contedo de um arquivo.
Sinta0e
FCREATE( cAr43 ( nAtributo )) --> nHandle
Argumento Obrigat. Tipo Descrio
cArq S C
Nome do arquivo a ser criado, o caminho pode ser includo. So vlidos
caminhos no local (remote) e no servidor.
nAtributo Opcional N Atributos no qual o arquivo ser criado.

Retorno Descrio
>0 Numrico. O Handle do arquivo para ser usado nas demais funes de arquivo.
-1
Erro na criao do arquivo, verifique FERROR() para obter maiores detalhes do erro.
/escri)o
FCREATE() uma funo de baixo-nvel que permite a manipulao direta dos arquivos textos como
binrios.

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 Criao normal do Arquivo (default/padro).
FC_READONLY Cria o arquivo protegido para gravao.
FC_HIDDEN Cria o arquivo como oculto.
FC_SYSTEM Cria o arquivo como sistema.


Note que se o arquivo existir, o contedo ser truncado para zero bytes.
'0emplo
#include "Fileio.ch"
IF (nHandle := FCREATE("Te"tB!e", FC8$OR%AL)) CC ?2
? "Arquivo no pode ser criado", FERROR()
BREAK
ELSE
FWRITE(nHandle, "ola!!!")
FCLOSE(nHandle)
ENDIF
*CLO"E12
*E%%O%12
*O$E,12
*.%I#E12
*%EA)12

Hrase
Apaga um arquivo do disco.
Sinta0e
FERASE( cAr4 ) --> nSucesso
Argumento Obrigat. Tipo Descrio
cArg S C
Apaga um arquivo do disco, aceita caminhos locais (Remote), ou caminhos
no servidor Advanced Protheus.

Retorno Descrio
Arquivo foi apagado com sucesso.
-1 O Arquivo no foi apagado, verifique FERROR() para obter maiores detalhes.
/escri)o
Elimina um arquivo. O Arquivo pode estar no servidor ou no local (Remote).
O Arquivo para ser apagado deve estar fechado. No permitido a utilizao de caracteres coringa
(wildcards).
'0emplos
// Este exemplo apaga todos os arquivos .BAK do diretrio corrente.
#include "Directry.ch"
AEVAL(DIRECTORY("*.BAK"), { |aFile| FERASE(aF!eDF8$A%EE) })
/// Este exemplo apaga um arquivo no cliente ( Remote ) e imprime uma mensagem caso //
ele apresente erro.
IF FERASE("AF!e.t*t") == -1
? "File erase error:", FERROR()
BREAK
ENDIF
*%E,AE12
Hrror
Verifica se houve erros aps uma operao com arquivos binrios.
Sinta0e
FERROR() --> Numrico
Retorno Descrio
0 Operao realizada com sucesso. Sem erros
2 Arquivo no encontrado
3 Caminho no encontrado
4 Muitos arquivos abertos
5 Acessso negado
6 Manipulador Invalido ( Handle )
8 Memria Insuficiente
15 Drive invlido especificado
@E Tentativa de gravar em disco protegido contra-gravao
21 Drive No esta pronto
23 Dados com erro de CRC
29 Erro de gravao
30 Erro de leitura
32 Violao de compartilhamento
33 Erro de Lock
/escri)o
FERROR() a funo que retorna o cdigo de erro mais especfico, aps a execuo de funes com
arquivos binrios, tais como: *O$E,12, *CLO"E12, *.%I#E12, *%EA)12.
Se FERROR() retornar zero, indica sucesso na ltima operao.
FERROR() sempre retorna o estado da ultima operao.
'0emplo
#include "Fileio.ch"
//
nHandle := FCREATE("Temp.txt", FC_NORMAL)
IF FERROR() != 0
conout ("Erro ao criar o arquivo, Erro:" Str(FError())
ENDIF
*CLO"E12
*C%EA#E12
*E%A"E12
*O$E,12
Hield*locX
Retorna um bloco de cdigo para um campo determinado da tabela corrente.
Sinta0e
FIELDBLOCK( cCampo ) --> Bloco de Cdigo
Argumento Obrigat. Tipo Descrio
cCampo S C Nome do campo a ser retornado o bloco de cdigo.

Retorno Descrio
bBloco Bloco de cdigo. Bloco de cdigo para o campo especificado na tabela corrente.
/escri)o
Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especificado. Sendo que
quando o bloco resultante executado sem valor recupera o valor armazenado no campo, 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
'0emplo
// 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")
*IEL).!LOC71 2
Hield>)l
Retorna um bloco de cdigo para um campo determinado especificando a rea de trabalho.
Sinta0e
FIELDWBLOCK(FcCampoG3FnAreaG) --> Bloco de Cdigo
Argumento Obrigat. Tipo =escrio
CCampo S C Nome do campo a ser retornado o bloco de cdigo.
CArea S N Nmero da rea de trabalho a ser criado o bloco de cdigo.

Retorno Descrio
bWBloco Bloco de cdigo. Bloco de cdigo para o campo especificado na rea de trabalho determinada.
/escri)o
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 valor 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
'0emplo
// 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
Hile
Verifica se um arquivo ou mscara de arquivos existem.
Sinta0e
FILE( cAr4uivo ) --> lExiste
Argumento Obrigat. Tipo Descrio
CArquivo S C
Nome do arquivo podendo incluir caminhos. Caminhos locais (Remote) ou
caminhos de servidor so aceitos.

Retorno Descrio
.F. O Arquivo ou padro de busca existem.
.T. O Arquivo ou padro no existem.
/escri)o
Verifica se existe um arquivo ou um padro de arquivos, no diretrio. Os caracteres * e ?. so aceitos.
Caminhos de servidor e locais so aceitos.
'0emplos
FILE("te"te.)+B") // Verifica no diretrio corrente se existe o arquivo teste.dbf
FILE("<SI9AAD#<TESTE.)+B") // // Verifica no diretrio Sigaadv do servidor se corrente e
se existe o arquivo teste.dbf
FILE("CF<TE%P<TESTE.)+B") // // Verifica no diretrio Temp do cliente (Remote) se existe
o arquivo teste.dbf
)I%EC#O%312
A)I%12
H3pen
Abre um arquivo binrio.
Sinta0e
FOPEN( cAr4 , n2odo ]) --> Numrico
Argumento Obrigat. Tipo Descrio
cArq Sim C Nome do Arquivo a ser aberto em modo binrio.
nModo No N
Modo como o arquivo dever ser aberto. O Modo de abertura um
modo composto entre modo de acesso e modo de compartilhamento.
O modo padro de abertura zero, o que indica sem
compartilhamento e somente leitura.

Retorno Descrio
-1 Erro na abertura do arquivo. Verifique FERROR() para maiores detalhes do erro
>0 Handle do arquivo, a ser usado com as demais funes de arquivo
/escri)o
FOPEN() abre um arquivo de modo binrio, permitindo a leitura ou gravao atrves das funes
*%EA)12, *.%I#E12.
Todo arquivo aberto atravs da FOPEN(), deve ser fechado atravs da *CLO"E12.
O modo de abertura composto de modo de acesso e modo de compartilhamento, esses modos esto
descritos em fileio.ch.
Modos de Acesso
FO_READ Apenas Leitura
FO_WRITE Apenas Gravao
FO_READWRITE Leitura e Gravao
Modos de Compartilhamento
FO_COMPAT Modo de compatibilidade ( Padro )
FO_EXCLUSIVE Exclusivo
FO_DENYWRITE No permite que outros abram o arquivo para gravao
FO_DENYREAD No permite que outros abram o arquivo para leitura
FO_DENYNONE permite leitura e gravao
FO_SHARED Igual ao FO_DENYNONE

O modo de acesso em combinao ( + ) com o modo de compartilhamento determina a maneira como o
arquivo ser aberto e sua acessibilidade em um ambiente de rede.
Sero aceitos tantos caminhos baseados no servidor, como caminhos locais ( remote ).
'0emplo
Este exemplo usa o FOPEN() para abrir um arquivo para leitura/gravao de maneira compartilhada e
mostra uma mensagem de erro caso a abertura falhe:
#include "Fileio.ch"
//
nHandle := FOPE$("Te>(.t*t", FO8READ,RITE - FO8S4ARED)
IF FERROR() != 0
? "Impossivel abrir o arquivo, Erro : ", FERROR()
BREAK
ENDIF
*C%EA#E12
*E%%O%12
*%EA)12
*.%I#E12
*CLO"E12
H3penPort
Abre uma porta paralela ou serial.
Sinta0e
FOPENPORT( cPorta , [ cParm ], [ n2odo ] ) --> Numrico
Argumento Obrigat. Tipo Descrio
cArq Sim C Nome do Dispositivo a ser usado.
cParm Sim C Caractersticas do dispositivo, apenas vlido para portas seriais. Os
parmetros so: Velocidade (BPS), Paridade, DataBits, StopBits,
Timeout de leitura ( Opcional ).
nModo No N Modo como o dispositivo dever ser aberto. O Modo de abertura um
modo composto entre modo de acesso e modo de compartilhamento.
O modo padro de abertura zero, o que indica sem
compartilhamento e somente leitura.

Retorno Descrio
-1 Erro na abertura do arquivo. Verifique FERROR() para maiores detalhes do erro
>0 Handle do dispositivo, a ser usado com as demais funes de arquivo.
/escri)o
FOPENPORT() abre um dispositivo, permitindo a leitura ou gravao atrves das funes *%EA)12,
*.%I#E12.
Todo arquivo aberto atravs da FOPENPORT(), deve ser fechado atravs da funo *CLO"E12.
O modo de abertura composto de modo de acesso e modo de compartilhamento, esses modos esto
descritos em fileio.ch.
Modos de Acesso
FO_READ Apenas Leitura
FO_WRITE Apenas Gravao
FO_READWRITE Leitura e Gravao
Modos de Compartilhamento
FO_COMPAT Modo de compatibilidade ( Padro )
FO_EXCLUSIVE Exclusivo
FO_DENYWRITE No permite que outros abram o arquivo para
gravao
FO_DENYREAD No permite que outros abram o arquivo para
leitura
FO_DENYNONE permite leitura e gravao.
FO_SHARED Igual ao FO_DENYNONE

O modo de acesso em combinao ( + ) com o modo de compartilhamento determina a maneira 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 posicionado 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 ser os seguintes:

Velocidade (BaudRate) 9600 ( Default ),19200,38400,57600,115200.
Paridade N ( Default, Sem Paridade ), E ( Par ), O ( Impar ).
DataBits 6,7 ou 8 ( Default ) Bits.
StopBits 1 ( default ) ou 2 Bits.
Timeout de leitura 1000 ( Default ), Valores acima de zero. Tempo em milisegundos de espera por
dados a serem lidos.
'0emplo
Este exemplo usa o FOPENPORT() para abrir uma porta de impresso para gravao e mostra uma
mensagem de erro caso a abertura falhe:
#include "Fileio.ch"
//
nHandle := FOPE$PORT("LPT2F", "", FO8,RITE)
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 := FOPE$PORT("CO%2F", "30//,$,G,2,2////", FO8,RITE)
IF FERROR() != 0
? "Impossivel abrir a impressora LPT1, Erro : ", FERROR()
BREAK
ENDIF
FREAD(
*C%EA#E12
*E%%O%12
*%EA)12
*.%I#E12
*CLO"E12
HRead
L caracteres binrios de um arquivo.
Sinta0e
FREAD( n.andle , @c6uffer , n!td6?tes ) --> Numrico
Argumento Obrigat. Tipo Descrio
nHandle Sim N o manipulador retornado pelas funes FOPEN(), FCREATE(),
FOPENPORT()
cBufferVar Sim C o nome de um buffer onde os dados lidos devero ser armazenados. O
tamanho desta varivel deve ser maior ou igual ao tamanho informado em
n!td6?tes. Esta varivel deve ser sempre passada por referncia. ( @
antes do nome da varivel )
nQtdBytes Sim N Nmero mximo de bytes que devem ser lidos.

Retorno Descrio
Numrico Quantidades de bytes lidos. Caso a quantidade seja menor que a solicitada, indicar erro ou
final de arquivo. Verifique FERROR() para obter maiores detalhes
/escri)o
FREAD() l a partir um arquivo aberto, atravs de *CLO"E12, *C%EA#E12, *O$E,$O%#12, os dados
e armazena no buffer informado. FREAD() l normalmente caracteres de controle (ASC 128, ASC 0, etc.).
FREAD() ler at o nmero de bytes informado em n!td6?tes; caso acontea algum erro ou o arquivo
chegue ao final, FREAD() retornar um nmero menor que o n!td6?tes.
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 *"EE712 ou por *.%I#E12,
*%EA)"#%12.
'0emplos
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(n4an)!e, H='uBBer, F8'LOC:) <> F_BLOCK
? "Erro lendo arquivo"
ENDIF
FCLOSE(nHandle)
ENDIF
BIN2I()
BIN2L()
BIN2W()
*CLO"E12
*C%EA#E12
*.%I#E12
*E%%O%12
*%EA)"#%
HReadStr
L caracteres de um arquivo binrio.
Sinta0e
FREADSTR( n.andle , n!td6?tes ) --> Caracter
Argumento Obrigat. Tipo Descrio
>.andle Sim N o manipulador retornado pelas funes FOPEN(), FCREATE(),
FOPENPORT().
NQtdBytes Sim N Nmero mximo de bytes que devem ser lidos.

Retorno Descrio
Retorno varivel Retorna uma string contendo os caracteres lidos.

/escri)o
FREADSTR() l de um arquivo aberto, atravs de *CLO"E12, *C%EA#E12, *O$E,$O%#12.
FREAD() ler at o nmero de bytes informado em n!td6?tes ou at encontrar um CHR(0). Caso acontea
algum erro ou o arquivo chegue ao final, FREAD() retornar uma string menor do que n!d6?tes e
colocar o erro em FERROR().
FREADSTR() l a partir da posio atual do ponteiro, que pode ser ajustado pelo FSEEK() ou por
FWRITE( ), FREAD().
'0emplos
Este exemplo l os 16 caracteres de um arquivo e imprime o seu contedo.
#include "Fileio.ch"
//
nHandle := FOPEN("New.txt", FC_NORMAL)
IF FERROR() != 0
? "Erro abrindo o arquivo", FERROR()
ELSE
cString := FREADSTR(n4an)!e, 20)
? cString
FCLOSE(nHandle)
ENDIF
BIN2I()
BIN2L()
BIN2W()
*E%%O%12
*O$E,12
*%EA)12
*C%EA#E12
*CLO"E12
Hrename
Muda o nome de um arquivo.
Sinta0e
FRENAME(c>omeAntigo3 c>ovo>ome) --> n#ucesso
Argumento Obrigat. Tipo =escrio
cOldFile S C
Nome do arquivo ser renomeado, aceita caminhos do servidor e caminhos
do cliente.
cNewFile S C
Novo nome do arquivo, aceita tambm caminho do servidor, e caminho do
cliente.

Retorno Descrio
A mudana foi executada com sucesso.
-1
Ocorreu algum erro na mudana de nome, verifique se os dois caminhos esto no mesmo ambiente.
(Local/Local, Servidor/Servidor). Verifique FERROR() para detalhes do erro.
/escri)o
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.
'0emplos
// 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
? "Erro ao renomear ", FERROR()
ENDIF
@FERROR()
@FILE()
HSeeX
Posiciona o arquivo binrio.
Sinta0e
FSEEK( n.andle , nOffset , [ nOrigem ]) --> Numrico
Argumento Obrigat. Tipo Descrio
NHandle Sim N Manipulador obtido atravs das funes FOPEN, FCREATE.
NOffset Sim N Nmero de bytes que o ponteiro do arquivo deve ser movido a partir da
origem informada em nOrigem. O nmero pode ser positivo ou negativo. O
destino no precisa existir no arquivo.
NOrigem No N Indica a partir de qual posio do arquivo, o nOffset ser considerado.

Retorno Descrio
Numrico A nova posio do arquivo.
/escri)o
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 seguintes valores definidos em
fileio.ch:

FS_SET Ajusta a partir do inicio do arquivo.
FS_RELATIVE Ajuste relativo a posio atual do arquivo.
FS_END Ajuste a partir do final do arquivo
'0emplo
// 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 := FSEE:(n4an)!e, /, FS8E$D)
//
FCLOSE(nHandle)
ELSE
? "Erro na abertura do arquivo", FERROR()
ENDIF
*C%EA#E12
*E%%O%12
*O$E,12
*%EA)12
*.%I#E12
*CLO"E12
H>rite
Grava em um arquivo binrio.
Sinta0e
FWRITE( n.andle , c6uffer , [ n!td6?tes ]) --> Numrico
Argumento Obrigat. Tipo Descrio
>.andle Sim N o manipulador retornado pelas funes FOPEN(), FCREATE(),
FOPENPORT().
CBuffer Sim C o nome de um buffer de onde os dados sero gravados. O tamanho
desta varivel deve ser maior ou igual ao tamanho informado em
n!td6?tes (caso seja informado o tamanho).
nQtdBytes No N Quantidade de bytes a serem gravados.

Retorno Descrio
Numrico !uantidade de b?tes efetivamente gravados* #e o retorno for menor 4ue o nQtdBytes3
houve um erro na gravao* $erifi4ue ,RROR5) para mais detalhes*
/escri)o
FWRITE() grava em um arquivo aberto, atravs de *CLO"E12, *C%EA#E12, *O$E,$O%#12, os dados
do buffer informado. FWRITE() grava normalmente caracteres de controle ( ASC 128, ASC 0, etc. ).
FWRITE() gravar at o nmero de bytes informado em n!td6?tes; caso acontea algum erro, retornar
um nmero menor que o n!td6?tes.
FWRITE() grava a partir da posio atual do ponteiro, que pode ser ajustado pelo *"EE712 ou por
*%EA)12, *%EA)"#%12.
'0emplos
Este exemplo copia um arquivo para outro.
#include "Fileio.ch"
#define F_BLOCK 512
//
cBuffer := SPACE(F_BLOCK)
nInfile := FOPEN("Temp.txt", FO_READ)
nOutfile := FCREATE("Newfile.txt", FC_NORMAL)
lDone := .F.
//
DO WHILE !lDone
nBytesRead := FREAD(nInfile, @cBuffer, F_BLOCK)
IF F,RITE(nOutB!e, ='uBBer, n'yte"Rea)) < ;
nBytesRead
? "Erro gravando: ", FERROR()
lDone := .T.
ELSE
lDone := (nBytesRead == 0)
ENDIF
ENDDO
//
FCLOSE(nInfile)
FCLOSE(nOutfile)
*CLO"E12
*C%EA#E12
*E%%O%12
*O$E,12
I2BIN()
2etClientDir
Retorna o diretrio onde est instalado o Remote.
Sinta0e
GetClientDir( ) --> cDir
Retorno Descrio
cDir Caracter, diretrio aonde est instalado o remote.
/escri)o
Retorna o diretrio onde o Remote est instalado.
'0emplo
? 9etC!entDr() // Imprime o diretrio onde est instalado o remote
// Exemplo de sada
// c:\ap6\bin\remote
C&%)I%1 2
2et$mp>indoWs
Retorna lista de impressoras disponveis para impresso.
Sinta0e
GETIMPWINDOWS( l#erver ) --> Array
Argumento Obrigat. Tipo Descrio
lServer Sim L Informar .T. se desejar lista de impressoras do Server e .F. se desejar lista
de impressoras do Remote.

Retorno Descrio
Array Array com nome das impressoras disponveis.
/escri)o
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 nomes de impressoras
cadastradas na chave PRINTERSNAME do AP6SRV.INI (ver $%E$A%E$%I,#1 2).
'0emplo
aImpressoras:= 9etI>(,n)ow"(.F.) // retorna lista de impressoras do Windows do remote.

I,I#$%I,#1 2
$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
$COL1 2
"E#$%C1 2
4'(F?R'35 6
$%,*L&"/1 2
EJEC#1 2
5E#$O%#AC#IVE1 2

2etPortActive
Retorna lista de portas de impresso disponveis.
Sinta0e
GETPORTACTIVE ( l#erver ) --> Array
Argumento Obrigat. Tipo Descrio
lServer Sim L Informar .T. se desejar lista de impressoras do Server e .F. se desejar lista
de impressoras do Remote.

Retorno Descrio
Array Array com nome das impressoras disponveis
/escri)o
GETPORTACTIVE( ) retorna uma lista de portas de impresso disponveis do Server ou Remote. Se o
Server est em ambiente Unix, a GETPORTACTIVE( ) retornar uma lista com os nomes de devices
possveis para impresso.
'0emplo
aPortas:= 9etPortA=t@e(.F.) // retorna lista de portas de impressao do remote.

I,I#$%I,#1 2
$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
$COL1 2
"E#$%C1 2
FECHAREL( )
$%,*L&"/1 2
EJEC#1 2
5E#I$.I,)O."1 2
Keader
Verifica o tamanho do cabealho da tabela corrente.
Sinta0e
HEADER() --> Numrico
Retorno Descrio
0 No h tabela corrente
NBytes Tamanho do cabealho da tabela corrente em nmero de bytes
/escri)o
Esta funo pode ser utilizada em conjunto com as funes %ec"ize e RecCount para calcular o tamanho
ocupado no disco pela tabela corrente. Pois, o tamanho ser Header+RecSize*RecCount.
'0emplo
// Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmero de
bytes):
USE "\DADOSADV\AA1990.DBF" SHARED NEW
nCabecalho := 4EADER()
nDados := RecSize() * RecCount()
nTamanhoTotal := nCabecalho + nDados

%EC"I4E
RECCOUNT
$nde6UeB
Verifica qual a expresso de chave de um ndice.
Sinta0e
INDEXKEY( nOrdem ) --> Caracter
Argumento Obrigat. Tipo =escrio
nOrdem S N Posio do ndice na lista.

Retorno Descrio
"" No existe ndice para o parmetro nOrdem corrente.
cExpOrdem Expresso de chave da ordem ativa ou especificada pelos parmetros.
/escri)o
Esta funo utilizada para verificar qual a expresso de chave de determinado ndice, especificado 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.
'0emplo
// 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"
I$DEX:EY(2) // Retorna: Nome+Cod
I$DEX:EY(2) // Retorna: Nome
I$DEX:EY(/) // Retorna: Nome - expresso corrente
ORDFOR( )
ORDNAME( )
ORDNUMBER( )
O%)7E31 2
$nde63rd
Verifica a posio do ndice corrente.
Sinta0e
INDEXORD() --> Numrico
Retorno Descrio
0 No existe ndice ou tabela corrente
nOrd Posio do ndice corrente na lista
/escri)o
Esta funo retorna a posio ocupada pelo ndice corrente dentro da lista de ndices.
'0emplo
// Este exemplo verifica qual a posio do ndice corrente dentro da lista
USE Cliente NEW
SET INDEX TO Nome, End, Cep
I$DEXORD() // Returns: 1 - o primeiro ndice da lista
ORDBAGEXT
O%)C%EA#E1 2
ORDBAGNAME
ORDNAME
$nitPrint
Inicializa parmetros de impresso de relatrio.
Sinta0e
INITPRINT([ nOutPut ], [ c>ameRel ], [ c+?pe ] ,[ lPort ],[ cPathAtu ]) --> NIL
Argumento Obrigat. Tipo Descrio
NOutPut No N Direcionamento da sada de impresso. 1=via Client (padro) e 2=via
Server
cNameRel No C Nome do relatrio que ser exibido no spool de impresso
c+?pe No C Tipo do relatrio. "220" = 220 colunas, "132L"= 132 colunas landscape
(Padro), "132P"= 132 colunas portrait, "080" = 80 colunas portrait
lPort No L No utilizado
cPathAtu No L No utilizado

Retorno Descrio
NIL Sem retorno
/escri)o
INITPRINT() inicializa parmetros de impresso de relatrio. Define onde ser a sada de impresso e qual
vai ser a formatao de sada.
'0emplo
/* Inicializa relatrio para imprimir via Client "Meu relatrio" em formulrio de 132
colunas
em Landscape */
IntPrnt( 1,"Meu relatrio", "132L" )

$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
$COL1 2
"E#$%C1 2
FECHAREL( )
$%,*L&"/1 2
EJEC#1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
$sCisaSBnc3n
Verifica se o uso do CisaSync est habilitado.
Sinta0e
IsCisaSyncON() -> Lgico
Retorno Descrio
.F. No est habilitado.
.T. Est habilitado.
/escri)o
Esta funo utilizada para verificar se o uso do CisaSync est habilitado ou no.
'0emplo
// Este exemplo demonstra como se pode utilizar IsCisaSyncOn verificar se o CisaSync est
habilitado.
USE Cliente NEW
IF (ISCISASY$CO$())
QOUT("CisaSync habilitado")
ELSE
QOUT("CisaSync desabilitado")
ENDIF
$sPrinter
Verifica se impressora est disponvel.
Sinta0e
ISPRINTER( [ -Porta ], [ l#eta ], [ n/here ], [ @n,rrorCode ] ) --> Lgico
Argumento Obrigat. Tipo Descrio
xPorta No C ou N Informar a porta que desejamos verificar "LPT1" (padro), "LPT2" ,
"COM1", "COM2" ou 1=LPT1, 2=LPT2.
lSeta No L No utilizado
nWhere No N 1= testa impressora no Remote (default), 2= testa impressora no
Server.
nErrorCode No N Retorna o cdigo de erro da impressora

Retorno Descrio
.T. Impressora ativa
.F. Impressora inativa
/escri)o
ISPRINTER( ) testa a disponibilidade de impressoras conectadas fisicamente mquina onde est sendo
executado o Server ou Remote Protheus. Dependendo do sistema operacional, 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 n,rrorCode no ser informado.
'0emplo
If &"Prnter(2,,2,HnErr) // testa se impressora esta conectada na lpt1 no Remote.
MsgBox("Impressora no conectada! Erro: "+Str(nErr))
endif
I,I#$%I,#1 2
$%E$A%E$%I,#1 2
$%O.1 2
$COL1 2
"E#$%C1 2
FECHAREL( )
$%,*L&"/1 2
EJEC#1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
%aXeDir

Cria um diretrio.
Sinta0e
MAKEDIR( c>ovo=ir ) --> Numrico
Argumento Obrigat. Tipo Descrio
C>ovo=ir Sim C Nome do diretrio a ser criado, incluindo opcionalmente o caminho.

Retorno Descrio
0 Diretrio foi criado com sucesso
- 1 Erro na criao do diretrio
/escri)o
Cria um diretrio na estao ou no servidor Advanced Protheus.
'0emplo
%A:EDIR("c:\teste\um") // Cria um diretrio na estacao
nResult := %A:EDIR("\teste\um") // Cria o diretorio no servidor Advanced protheus
IF nResult != 0
conout("Impossivel criar o diretrio no servidor Protheus" + Str(nResult))
ENDIF
%A:EDIR( "teste" ) // Exemplo tambm vlido ( Criando o diretrio no servidor)
DIRMAKE()
DIRCHANGE()
)I%%EOVE12
%emo,ine
Extrai uma linha de uma string ou de um campo memo.
Sinta0e
MEMOLINE( c#tring, [ nLineLength ], [ nLine>umber ], [ n+ab#i<e ], [ l/rap ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cString Sim C a string original de onde ser extrada a linha.
nLineLength No N Nmero de caracteres por linha. Caso no especificado, assume 79.
nLineNumber No N Nmero da linha a ser retornada. Caso no especificado, assume 1.
nTabSize No N Define o nmero de caracteres para o Tab. Caso no especificado,
assume 4.
lWrap No L Habilita a quebra de linhas de acordo com as palavras. Caso no
especificada, fica habilitado.

Retorno Descrio
Caracter Caracter. Retorna a linha solicitada, caso no exista o nmero de linhas, retorna uma string
em branco.
/escri)o
MemoLine() uma funo que retorna uma linha especfica. Caso no exista a linha especificada, retorna
um string em branco.
Caso a quebra de linhas esteja habilitada (lWrap igual .T.) e a palavra esteja no meio da quebra de linha,
esta ser colocada na prxima linha.
MemoLine() usada em conjunto com MLCOUNT() para extrair todas as linhas de um texto.
'0emplos
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 (%E%OLI$E(CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap))
NEXT
LCO&,#1 2
EO%EA)1 2
EO.%I#E1 2
%emoRead
L um arquivo texto e retorna uma string.
Sinta0e
MEMOREAD( cile ) --> Caracter
Argumento Obrigat. Tipo Descrio
CFile Sim C Nome do arquivo texto que dever ser lido. Caminhos podem ser includos.

Retorno Descrio
varivel Caracter. MEMOREAD() retorna uma string com no mximo 65.535 bytes do arquivo
informado.

/escri)o
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 ( "" ).
'0emplos
cString = %E%OREAD("Temp.txt")
if empty( cString )
conout("Erro lendo arquivo")
endif
EO.%I#E12
%emo>rite
Grava uma string para um arquivo em disco.
Sinta0e
MEMOWRITE( cAr4uivo , c#tring ) -->Lgico
Argumento Obrigat. Tipo Descrio
cArquivo Sim C o nome do arquivo onde ser gravado, incluindo a extenso e o
caminho.
CString Sim C a string que ser gravada no arquivo.

Retorno Descrio
.T. O Arquivo foi gravado com sucesso
.F. Houve falha na criao e gravao do arquivo, verifique FERROR() para obter detalhes o erro.
/escri)o
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.
'0emplos
LOCAL cString := "Teste de gravao."
IF %E%O,RITE("teste.txt", cString)
conout("Erro gravando teste.txt")
ENDIF
EO%EA)12
%,Count
Conta o nmero de linhas de uma String.
Sinta0e
MLCOUNT( c#tring , [ nLineLength ], [ n+ab#i<e ], [ l/rap ]) --> Numrico
Argumento Obrigat. Tipo Descrio
cString Sim C a string original de onde ser extrada a linha.
NLineLength No N Nmero de caracteres por linha. Caso no especificado, assume 79.
nTabSize No N Define o nmero de caracteres para o Tab. Caso no especificado,
assume 4.
lWrap No L Habilita a quebra de linhas de acordo com as palavras. Se no
especificado, fica habilitado.

Retorno Descrio
>=0 Numrico. Nmero de linhas que a string possui.
/escri)o
MLCOUNT() retorna o nmero de linhas de uma string baseado nos parmetros informados.
'0emplos
LOCAL nLineLength := 40, nTabSize := 3, lWrap := .T.
LOCAL nLines, nCurrentLine
//
LOCAL cTexto := MEMOREAD( "Texto.TXT" )
nLines := %LCO7$T(cTexto, nLineLength, nTabSize, lWrap)
//
FOR nCurrentLine := 1 TO nLines
conout(MEMOLINE(CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap))
NEXT
EOLI,E12
EO%EA)12
EO.%I#E12
%onth
Converte o valor da data para o nmero do ms.
Sinta0e
MONTH( d=ata ) --> Numrico
Argumento Obrigat. Tipo Descrio
d=ata Sim D o valor da data a ser convertido

Retorno Descrio
>=0 e <=12 Para uma data vlida.
0 Se a data for nula ou invlida
/escri)o
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 d=ata.
'0emplos
Estes exemplos retornam o ms da data do sistema:
dData := DATE() // Resultado: 09/01/01
nMes := %O$T4(DATE()) // Resultado: 9
nMes := %O$T4(DATE()) + 1 // Resultado: 10
CO,#/12
)A312
3EA%12
)O.12
%sCompress
Compacta um ou vrios arquivos em um nico arquivo com extenso .MZP.
Sinta0e
MSCOMPRESS( cAr4, [ c=estino ], [ c#enha ] ) --> lSucesso
Ou
MSCOMPRESS( aAr4uivos, [ c=estino ], [ c#enha ] ) --> lSucesso

Argumento Obrigat. Tipo Descrio
CAr4 Sim C Nome do Arquivo a ser compactado.
aArquivos Sim A Nomes dos arquivos a serem compactados.
cDestino No C
Nome do Arquivo destino, caso a extenso seja omitida ser assumido
.MZP, se no for informado assumir o mesmo nome do cAr4 com
extenso .MZP ou o nome do 1. Arquivo no Array aAr4uivos*
cSenha No C Senha a ser utilizada para criptografar o arquivo.

Retorno Descrio
.T. A compactao foi executada com sucesso.
.F. Erro na compactao, verifique o espao disponvel para compactao.

/escri)o
MSCOMPRESS() compacta os arquivos informados em um nico arquivo com extenso default .MZP. O
formato proprietrio e multiplataforma.
Caso a senha seja informada apenas com a senha poderemos descompactar os arquivos.
A funo para descompactao a MSDECOMP().
Tanto arquivos no local ( Remote ) como no Servidor so aceitos.
'0emplos
// Exemplo 1 Compacta apenas um arquivo
lRes := %SCO%PRESS( "AP6SRV.EXE", "AP6SRV.MZP" )
// Exemplo 2 Compacta um diretrio com senha
aNome := {}
ADIR( "*.DBF", aNome )
lRes := %SCO%PRESS( aNome, "ArqComp.MZP", "SENHA" )

")ECO$12
%sCRCP9
Calcula um CRC de uma string.
Sinta0e
MSCRC32( c#tring ) --> nCRC
Argumento Obrigat. Tipo Descrio
C#tring Sim C
String de onde ser calculado um CRC32, garantido que para a mesma
string sempre se obter um mesmo nmero, porm, no garantido que
para strings diferentes, os nmeros sejam sempre diferentes.

Retorno Descrio
nCRC Um nmero indicando o CRC da string informada.
/escri)o
MSCRC32() calcula um CRC de uma string informada e retorna um nmero com esse clculo.
Note que strings iguais retornam CRC iguais, porm, nem sempre strings diferentes retornam CRC
diferentes.
'0emplo
cString := MEMOREAD( "ARQ.TXT" )
? %SCRCI2( cString )
"C%C96"#%12
%sCRCP9Str
Calcula um CRC de uma string, retornando em formato String.
Sinta0e
MSCRC32STR( c#tring ) --> cCRC.
Argumento Obrigat. Tipo Descrio
c#tring Sim C
String de onde ser calculado um CRC32, garantido que para a mesma
string sempre obter um mesmo nmero, mas no garantido que para
strings diferentes os nmeros sejam sempre diferentes

Retorno Descrio
nCRC Uma string com o CRC da string informada
/escri)o
MSCRC32STR() calcula um CRC de uma string informada e retornando uma string com esse clculo.

Note que strings iguais retornam CRC iguais, porm nem sempre strings diferentes retornam CRC
diferentes.
'0emplo
cString := MEMOREAD( "ARQ.TXT" )
? %SCRCI2STR( cString )

"C%C9612
%sDecomp
Descompacta arquivos no formato .MZP (Microsiga Zip).
Sinta0e
MSDECOMP( cAr4Hip, cPath=estino, [ c#enha ] ) --> lSucesso.
Argumento Obrigat. Tipo Descrio
cAr4 Sim C Nome do Arquivo a ser descompactado.
cPathDestino No C
Diretrio onde os arquivos devero ser descompactados. Note que
podem ser includos caminhos do servidor como caminhos locais
( Remote ).
cSenha No C Senha a ser utilizada para descriptografar o arquivo.

Retorno Descrio
*+* A descompactao foi executada com sucesso.
.F. Erro na compactao, verifique o espao disponvel para descompactao.

/escri)o
MSDECOMP() descompacta o arquivo informado em um diretrio. O Formato proprietrio, e multi-
plataforma, suporta apenas arquivos compactados pela funo MSCOMPRESS().

Caso o arquivo seja protegido por senha, apenas com a senha poderemos descompact-lo.

A funo para compactao a MSCOMPRESS().

Tanto arquivos no local ( Remote ) como no Servidor so aceitos.
'0emplo
// Exemplo 1 Descompacta no servidor
lRes := %SDECO%P( "AP6SRV.MZP", "TEMP" )
// Exemplo 2 Descompacta no local ( Remote )
lRes := MSCOMPRESS( "c:\ArqComp.MZP", "SENHA" )

"CO$%E""12
%sg*o6
TipoI Tela Eindo"s
Abre uma caixa de dialogo padronizada para informar o usurio de um Erro deciso a ser tomada ou apenas
uma informao ("Registro Gravado com sucesso).
Sinta0e
MSGBOX(cMensagem,cTtulo,cTpCaixa)
Par<metros
cMensa+em - Define a mensagem apresentada no interior da janela
cTLtulo - Titulo da janela
cTp(ai0a - 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 cai0asI
"STOP, utiliza um bitmap para advertncia e tem um boto "Ok. Retorna Nil.
"H!4O, utiliza um bitmap para advertncia e tem um boto "Ok. Retorna Nil.
"?3'RT, utiliza um bitmap para advertncia e tem um boto "Ok. Retorna Nil.
"G'S!O, utiliza um bitmap para advertncia e tem dois botes "Sim e "No,
retorna .T. ou .F.
"R'TRG(?!('3, utiliza um bitmap para advertncia e tem dois botes "Repetir e "Cancelar, retorna .T.
ou .F.
3rdCondSet
Seta a condio e o escopo para a ordem corrente.
Sinta0e
ORDCONDSET([ corCond ],,,,[ b,val ],,,,,, [ l=escendente ],,,,) --> Lgico
Argumento Obrigat. Tipo Descrio
cForCond No C
Expresso na forma textual a ser resolvida para verificar se o
registro em questo est dentro do escopo definido
bEval No
Bloco de
Cdigo
Expresso na forma executvel a ser resolvida para cada
registro processado. Este bloco deve retornar tipo lgico
lDescendente No L Especifica se a ordem deve ser crescente ou decrescente

Retorno Descrio
.F. No conseguiu setar o filtro
.T. Filtro setado com sucesso
/escri)o
Esta funo utilizada para setar uma ordem de registro que esteja dentro de um escopo e de uma
condio especificada. Se todos os parmetros forem omitidos sero aceitos todos os registros da ordem.
Atravs do primeiro parmetro (cForCond) possvel especificar o escopo ao qual o registro deve
pertencer para estar dentro do filtro. Atravs do parmetro bEval, pode-se definir um bloco de cdigo que
deve retornar .T. para que o registro pertena ao filtro a ser setado.
Se o parmetro lDescendente for omitido, a ordem estar crescente, mas se tiver valor .T. ser
decrescente.
'0emplo
// 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( )
ORDNUMBER( )
ORDSCOPE( )
DBEVAL( )

3rdCreate
Cria uma ordem em determinado arquivo de ndice.
Sinta0e
ORDCREATE([ c'ndice ],[ cOrdem ], c,-pChave, [ b,-pChave ], [ lDnico ]) --> Nil
Argumento Obrigat. Tipo Descrio
c'ndice No * C Nome do arquivo de ndice a ser criada a ordem.
cOrdem No * C Nome da ordem a ser criada.
cExpChave Sim C Expresso das chaves da ordem a ser criada na forma de string.
bExpChave No Bloco de Cdigo
Expresso das chaves da ordem a ser criada na forma
executvel.
lDnico No
L
Cria ndice como nico (o padro .F.).

*Obs: Os dois primeiros parmetros so opcionais, mas pelo menos um deles tem que estar especificado.
Retorno Descrio
NIL Sem retorno
/escri)o
Esta funo utilizada para criar uma nova ordem em determinado arquivo de ndice com o nome
especificado atravs do primeiro parmetro, sendo que, se o mesmo existir, apenas acrescentada a
ordem, mas, caso contrrio, criado o arquivo.
Para tanto, so executados os passos a seguir:
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;
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 necessrio que a
tabela esteja aberta em modo exclusivo.
'0emplo
// Este exemplo mostra como se pode criar novo arquivo de ndice criando a ordem sobre 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 que
aceitar duplicao e no arquivo de ndice j existente:
USE Cliente VIA "DBFCDX" NEW
ORDCREATE ("\teste\ind2.cdx","Tag2","End",{ || End })

)!%EI,)E-1 2
)!"E#I,)E-1 2
)!"E#O%)E%1 2
)!C%EA#EI,)E-1 2
3rdDescend
Verifica ou altera a condio (crescente/decrescente) de uma ordem.
Sinta0e
ORDDESCEND([ cOrdem | nPosicao ],[ cAr4'ndice ], [ l=ecrescente ]) --> Lgico

Argumento Obrigat. Tipo Descrio
cOrdem No C Nome da ordem a ser alterada
nPosicao No N Posio da ordem na lista a ser alterada
cArqIndice No C Nome do arquivo de ndice
lDecrescente No L
Determina se a ordem ser decrescente (.T.) ou crescente (.F.)

Retorno Descrio
.F. A ordem do parmetro est na forma crescente
.T. A ordem do parmetro est na forma decrescente
/escri)o
Esta funo pode ser utilizada para apenas verificar o estado da ordem atual, se no for especificado o
parmetro l=ecrescente.
Quando especificado o parmetro l=escend, o estado da ordem modificado, sendo que a funo
retorna ao estado anterior da ordem em questo.
Para evitar conflito, no caso de haver mais de uma ordem com o mesmo nome, pode-se passar o
parmetro com o nome do ndice ao qual a ordem pertence.
A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na lista de ordens
ativas (atravs do O%)LI"#A))) ou atravs do nome dado ordem, a funo verifica automaticamente
se o parmetro numrico ou caracter.
'0emplo
// Este exemplo mostra como o ORDBAGNAME pode encontrar o nome de diferentes ndices
atravs da posio da ordem na lista:
USE Cliente VIA "DBFCDX" NEW
ORDLISTADD ("\teste\ind1.cdx","NOME") // A ordem criada na forma crescente
ORDDESCE$D() // Retorna: .F.
ORDDESCE$D(,,.T.) // Retorna: .F., mas seta a ordem atual (NOME) como decrescente
ORDDESCE$D() // Retorna: .T.
ORDLISTADD ("\teste\ind2.cdx","NOME")
ORDDESCE$D("$O%E","n)2",.F.) // Retorna: .T.
ORDDESCE$D("$O%E","n)2",) // Retorna: .F.

ORDBAGNAME( )
ORDNAME( )
ORDCREATE( )
3rdUeB
Verifica qual a expresso de chave da ordem.
Sinta0e
ORDKEY([ cOrdem | nPosicao ],[ cAr4'ndice ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cOrdem No C Nome da ordem a ser alterada
nPosicao No N Posio da ordem na lista
cArqIndice No C Nome do ndice

Retorno Descrio
00 No existe ordem corrente.
cExpOrdem Expresso de chave da ordem ativa ou especificada pelos parmetros.
/escri)o
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 de uma ordem com o mesmo nome, pode-se passar o
parmetro com o nome do ndice ao qual a ordem pertence.
A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na lista de ordens
ativas (atravs do O%)LI"#A))) ou atravs do nome dado ordem, a funo verifica automaticamente
se o parmetro numrico ou caracter.
'0emplo
// 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"
ORD:EY("In)2") // Retorna: Nome+Cod

ORDFOR( )
ORDNAME( )
ORDNUMBER( )
INDEXKEY( )
3rd,istAdd
Acrescenta uma ou mais ordens lista.
Sinta0e
ORDLISTADD( cAr4'ndice3 [ cOrdem ]) --> Nil
Argumento Obrigat. Tipo Descrio
cAr4'ndice Sim C Nome do ndice a ser acrescentado, com ou sem diretrio e extenso
cOrdem No C Nome da ordem a ser acrescentada

Retorno Descrio
NIL Sem retorno
/escri)o
Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho.

Quando so especificados os dois argumentos (ndice e ordem), acrescentada 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 ativa.
Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no primeiro parmetro,
mas, caso contrrio, deve ser especificado.
'0emplo
// Este exemplo mostra como se pode acrescentar uma ordem especfica ou todas as ordens
de determinado arquivo de ndice lista:
USE Cliente VIA "DBFCDX" NEW
Or)L"tA)) ("\teste\ind1.cdx","NOME") // Acrescenta apenas a ordem NOME
Or)L"tA)) ("\teste\ind2.cdx") // Acrescenta todas as ordens do arquivo ind2.cdx

ORDFOR( )
ORDNAME( )
ORDNUMBER( )
ORDLISTCLEAR( )
PacX
Remove todos os registros deletados da tabela.
Sinta0e
PACK
/escri)o
Este comando apaga (fisicamente) todos os registros deletados da tabela corrente.
'0emplo
// Este exemplo demonstra como se pode utilizar a funo )!)ELE#E12 para marcar alguns
registros como deletados e o comando PACK para delet-los fisicamente.
USE Clientes NEW
DBGOTO(100)
DBDELETE()
DBGOTO(105)
DBDELETE()
DBGOTO(110)
DBDELETE()
PAC:

4A$
)!%ECALL1 2
PCol
Informa ou muda a coluna corrente de impresso.
Sinta0e
PCOL( [ n>eICol ] ) --> Numrico
Argumento Obrigat. Tipo Descrio
n>eICol No N Informar a nova coluna de impresso.

Retorno Descrio
N Nmero da coluna corrente de impresso.
/escri)o
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 caracteres de BACKSPACE chr(8) para
forar o retorno do carro de impresso em impressoras matriciais.
'0emplo
PCOL( 2/ )
@ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( PROW( )+2 ) // Pula 2 linhas
PCOL( 2/ )
@ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( 0 ) // Salta a pagina

I,I#$%I,#1 2
$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
"E#$%C1 2
FECHAREL( )
$%,*L&"/1 2
EJEC#1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
PreparePrint
Prepara o relatrio para o inicio da impresso.
Sinta0e
PREPAREPRINT( l/indoIs, cPrinter>ame, l=isco, cile, lJLpd, nLeft2argin ) --> NIL
Argumento Obrigat. Tipo Descrio
lWindows Sim L Define se a impresso ser via spool do Windows ou diretamente em
porta de impresso.
cPrinterName Sim C Informa o nome da impressora que ser acionada. Se l/indoIs&*+*,
deve-se informar o nome da impressora Windows. Se l/indoI&**,
deve-se informar o nome da porta de impresso "LPT1","LPT2".
lDisco Sim L Informa se a impresso ser direcionada para gravao em arquivo. Se
l=isco&*+*, l/indoIs e cPrinter>ame, no tero efeito ento deve-se
informar o nome do arquivo de sada em cile.
cFile Sim C Informa o nome de arquivo que ser gerado se l=isco&*+*.
l_lpd No L Aplicvel somente para Server executando em ambiente Unix. Informa
que a impresso ser direcionada para disco e logo em seguida
direcionada para o LPD (daemon de impresso do Unix).
nLeftMargin No N Margem esquerda do relatrio para ajuste para encadernao em cm.

Retorno Descrio
NIL Sem retorno.
/escri)o
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 esquerda 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 lJlpd para .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\printcap. Para mais
informaes veja manual do Unix para configurao de impressoras. Lembrando que o Unix case-
sensitive quando trata nomes e arquivos.
'0emplo
// Envia a impressao para a impressora "LaserJet4.." e configura a margem esquerda para 1
cm para direita
Pre(arePrnt( .T., "LaserJet4 in //advpr1",.F.,"",.F.,1 )

I,I#$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
$COL1 2
"E#$%C1 2
FECHAREL( )
$%,*L&"/1 2
EJEC#1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
PrnHlush
Fora envio do buffer de impresso para a impressora.
Sinta0e
PRNFLUSH( ) --> NIL
Retorno Descrio
NIL Sem retorno
/escri)o
Nas impresses, o Protheus bufferiza a impresso em pginas para enviar 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.
'0emplo
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( ) )
PR$FL7S4( ) // 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

I,I#$%I,#1 2
$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
$COL1 2
"E#$%C1 2
FECHAREL( )
EJEC#1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
PRoW
Informa ou muda a linha corrente de impresso.
Sinta0e
PROW( [ n>eILine ] ) --> Numrico
Argumento Obrigat. Tipo Descrio
nNewLine No N Informar a nova linha de impresso.

Retorno Descrio
N Nmero da linha corrente de impresso
/escri)o
PROW( ) pode ser utilizado para informar a linha corrente de impresso ou para modific-la. Se a nova
linha informada for menor que a corrente, isto provocar um salto de pgina na impresso.
'0emplo
@ PRO,( ), 10 PSAY "Minha Linha nesta pagina e " + str( PRO,( ) )
PRO,( PRO,( )+2 ) // Pula 2 linhas
@ PRO,( ), 10 PSAY "Minha Linha nesta pagina e " + str( PRO,( ) )
PRO,( / ) // Salta a pagina

I,I#$%I,#1 2
$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$COL1 2
"E#$%C1 2
FECHAREL( )
$%,*L&"/1 2
EJEC#1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
RDDSetDe.ault
Modifica ou verifica o RDD padro.
Sinta0e
RDDSetDefault ([ c>ovoRddPadro ]) --> Caracter
Argumento Obrigat. Tipo Descrio
c>ovoRddPadro No C Novo nome do RDD a ser definido como padro.

Retorno Descrio
cAntigoRddPadro Nome do RDD padro corrente
/escri)o
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 especificar outro RDD como padro, especificando-o atravs do
parmetro.
'0emplo
// Este exemplo demonstra como se pode utilizar o RDDSETDEFAULT para alterar o valor do
RDD padro.
RDDSETDEFA7LT("CTREECDX") // Retorna: DBFCDX
RDDSETDEFA7LT() // Retorna: CTREECDX

)!"E#)%IVE%1 2
RDDNAME( )
RDDLIST( )
RealRDD
Retorna qual o driver que realmente est sendo utilizado para abertura dos arquivos locais.
Sinta0e
REALRDD() --> Caracter
Retorno Descrio
"ADS" Advantage Local #erver
"ADSSERVER" Advantage Database Server
"CTREE" Ctree - Faircom
"CODEBASE" Codebase
/escri)o
O driver "DBFCDX" pode ser utilizado para a abertura de arquivos Codebase, Advantage Database Server,
Advantage Local Server ou Ctree. Depende do que est especificado na chave LOCALFILES do ambiente
utilizado, no arquivo de inicializao do servidor.
REALRDD() retorna o nome do driver que realmente est sendo utilizado para abertura dos arquivos
locais.
'0emplo
if Rea!R))()="CODEBASE"
conout("Mudar abertura dos arquivos para ADS.")
endif

Recall
Altera o estado deletado de alguns registros.
Sinta0e
RECALL [FOR Condor] [WHILE Cond/hile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento Obrigat. Tipo Descrio
CondFor Sim Expresso em ADVPL a ser resolvida para o registro ser aceito.
CondWhile No
Expresso em ADVPL que determina quando a busca deve parar (quando a
expresso retornar .F..
nRecs No N Quando registros devem ser verificados.
nRecno No N Nmero do recno do registro a ser verificado.

Retorno Descrio
NIL Sem retorno
/escri)o
Este comando utilizado para retirar a marca de registro deletado de alguns registros.
Para ser executado, os registros em questo devem estar bloqueados ou a tabela deve estar aberta em
modo exclusivo. Se o registro no estiver deletado, este comando no faz nada.
Ele o oposto da funo )!)ELE#E, 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 alterado;

a opo "REST" determina que sero processados os registros a partir do registro atual. Caso seja
omitida, o comando comea a processar a partir do primeiro registro.
'0emplo
// Este exemplo demonstra como se pode utilizar o RECALL para retornar o estado 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 RECALL para retornar o estado de todos
os registros que apresentam idade>30.
USE Cliente
RECALL FOR Idade>30
// Este exemplo demonstra como se pode utilizar o RECALL para retornar o estado de todos
os registros com idade maior que 30 e Nome = Joao a partir do registro atual.
USE Cliente
RECALL FOR Idade>30 WHILE Nome="Joao" REST

$AC7
)ELE#E
RecSi(e
Verifica o tamanho do registro da tabela corrente.
Sinta0e
RECSIZE() --> Numrico
Retorno Descrio
nBytes +amanho do registro da tabela corrente em nmero de b?tes*
0 No h tabela corrente.
/escri)o
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 /eader e RecCount para calcular o tamanho ocupado
no disco pela tabela corrente, pois o tamanho ser Header+RecSize*RecCount.
'0emplo
// Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmero de
bytes):
USE "\DADOSADV\AA1990.DBF" SHARED NEW
nCabecalho := HEADER()
nDados := RECSIJE() * RECCOUNT()
nTamanhoTotal := nCabecalho + nDados

/EA)E%1 2
RecCount( )
Re$nde6
Reconstri todos os ndices abertos da rea de trabalho corrente.
Sinta0e
REINDEX
/escri)o
Este comando reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro
registro lgico.
'0emplo
// 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")
REI$DEX

)!"E#I,)E-1 2
)!"E#O%)E%1 2
Replace
Modifica o valor de alguns campos e registros da tabela corrente.
Sinta0e
REPLACE Campo WITH ,-p [, CampoK WITH ,-pK .] [FOR Condor] [WHILE Cond/hile] [NEXT
nRecs] [RECORD nRecno] [REST] [ALL]
Argumento Obrigat. Tipo Descrio
Campo Sim Nome do campo a ser alterado
Exp Sim Expresso em ADVPL com valor a ser colocado no campo especificado
CondFor No Expresso em ADVPL a ser resolvida para que o registro seja alterado
CondWhile No
Expresso em ADVPL que determina quando a alterao deve parar
(quando a expresso retornar .F.)
nRecs No N Quando registros devem ser alterados
nRecno No N Nmero do recno do registro a ser alterado
/escri)o
Este comando utilizado para alterar o valor de determinado campo em alguns registros da tabela
corrente, onde o campo escolhido recebe o valor da expresso para os registros dentro do escopo definido.
Se no forem especificadas as condies para que o registro seja alterado, modifica toda a tabela,
como se estivesse especificada a opo "ALL".
Pode-se especificar um escopo para que os registros sejam alterados atravs das opes "FOR
Condor" e "WHILE Cond/hile".
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 atual com "REST", mas, caso
contrrio, o comando executa um )!5O#O$12 antes de iniciar a alterao.
Se desejado alterar apenas determinado registro pode-se defini-lo atravs da especificao do
recno com "RECORD nRecno".
'0emplo
// Este exemplo demonstra como utilizar o comando REPLACE alterar todos os registros
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 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
REPLACE Valor WITH Valor1+Valor2-Valor3*0.1, DiaTran WITH Date() FOR Idade>20 WHILE
Nome<"VVV" NEXT 10 REST

%ECALL
%E$LACE
R,ocX
Bloqueia o registro corrente da tabela ativa.
Sinta0e
RLOCK() --> Lgico
Retorno Descrio
.F. No conseguiu bloquear o registro. Principal motivo: o registro j est bloqueado por outro
usurio.
.T. O registro foi bloqueado com sucesso.
/escri)o
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.
'0emplo
//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 RLOC:()
DELETE
Messagebox("Joao deletado","OK", 0)
ELSE
Messagebox("Registro utilizado por outro usurio","Erro", 0)
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
//
IF !VENDAS->(RLOC:())
Messagebox("Registro utilizado por outro usurio","Erro", 0)
BREAK
ENDIF

FLOCK( )
&"E)1 2
Seconds
Retorna o nmero de segundos decorridos desde a meia-noite.
Sinta0e
SECONDS() --> Numrico
Retorno Descrio
>=0 e <=86399 Retorna a hora do sistema em segundos* O valor numArico representa o nmero de
segundos decorridos desde a meiaLnoite3 baseado no rel:gio de KM horas e varia de N a
OPQEE*
/escri)o
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.
'0emplos
Este exemplo compara TIME() e SECONDS():
cHora := TIME() // Resultado: 10:00:00
cSegundos := SECO$DS() // Resultado: 36000.00
Este exemplo usa a funo SECONDS() para cronometrar o tempo decorrido:
LOCAL nStart, nElapsed
nStart:= SECO$DS()
.
. <statements>
.
nElapsed:= SECO$DS() - nStart
cElapsed := LTRIM(STR(nElapsed)) + " seconds"
#IE12
SeeX
Encontra um registro com determinado valor da chave do ndice.
Sinta0e
SEEK ,-p [SOFTSEEK]
Argumento Obrigat. Tipo Descrio
,-p Sim Expresso em ADVPL a ser resolvida para o registro ser encontrado

Retorno Descrio
NIL Sem retorno
/escri)o
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 ativa no momento com os
campos que se deseja pesquisar o valor.
Caso a expresso possua apenas um campo numrico, o primeiro 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).
Quando for especificada a opo "SOFTSEEK", mesmo que a expresso pesquisada no 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).
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.
'0emplo
// 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)
SEE: 100 // Retorna: .F.
EOF() // Retorna: .T.
SEE: 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 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)
SEE: " joao200101" SOFTSEEK // Procura a primeira ocorrncia de Nome "joao" e
vencimento maior que Janeiro de 2001
WHILE !EOF() .AND. Nome == " joao"
DBSKIP()
ENDDO

FOUND( )
EOF( )
)!"7I$1 2
)!5O#O$1 2
)!5O!O##O1 2
)!"EE71 2
Select
Seleciona nova rea de trabalho.
Sinta0e
SELECT nArea | Alias
Argumento Obrigat. Tipo Descrio
nArea Sim N Nmero da rea de trabalho a ser selecionada.
Alias Sim Nome da identificao da rea de trabalho a ser selecionada (Alias).

/escri)o
Este comando utilizado para selecionar uma nova rea de trabalho para deix-la ativa.
'0emplo
// Este exemplo demonstra como se pode utilizar o SELECT alterar a rea corrente.
USE Clientes ALIAS a1
USE Clientes2 ALIAS a2
SELECT a1 // ou SELECT 1

DBUSEAREA( )
ALIA"1 2
Set Hilter
Seta ou cancela uma condio de filtro.
Sinta0e
SET FILTER TO [ Condio ]
Argumento Obrigat. Tipo Descrio
Condio No Expresso em ADVPL a ser setada como filtro na ordem corrente

Retorno Descrio
NIL Sem retorno
/escri)o
Este comando utilizado para setar um filtro nos registros da tabela corrente especificado atravs
da condio especificada.
Quando um registro no est dentro do filtro setado ele continua existindo fisicamente, mas no
logicamente (nas funes de manipulao de banco de dados como )!5O#O$, )!"EE7, )!"7I$,
etc).
Se o comando chamado com condio em vazio, ser cancelado o filtro existente.
'0emplo
// 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 I)a)eKI/ // Filtra os registros com Idade menor que 30
SET FILTER TO

DBSETFILTER
Set $nde6
Acrescenta todas as ordens de um ou mais arquivos de ndice lista.
Sinta0e
SET INDEX TO [ Ar4'ndices ] [ A=='+'$, ]
Argumento Obrigat. Tipo Descrio
Ar4'ndices No Nome dos arquivos de ndice a serem acrescentados lista de ordens.

Retorno Descrio
NIL Sem retorno
/escri)o
Este comando utilizado para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho quando se especifica "ADDITIVE".
Quando o mesmo omitido, a lista de ordens esvaziada para depois ser acrescentada s ordens dos
ndices.
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 primeira torna-se ativa.
Quando mais de um arquivo de ndice selecionado, a ordem que torna-se ativa a primeira ordem do
primeiro arquivo.
Quando o comando utilizado sem nenhum parmetro, todas as ordens da lista so apagadas.
'0emplo
// 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 I$DEX TO n)2 // Inicializa a lista com as ordens do arquivo de ndice "ind1"
SET I$DEX TO n)2 ADDITI#E // Acrescenta as ordens do arquivo de ndice "ind2" na lista
SET I$DEX TO n)I // Limpa a lista e inicializa com as ordens do arquivo "ind3"
SET I$DEX TO // Limpa a lista de ordens

"E# O%)E%
)!"E#O%)E%1 2
)!"E#I,)E-1 2
CLEAR
Set 3rder
Seleciona uma ordem ativa da rea de trabalho.
Sinta0e
SET ORDER TO [ nPosio | [ +A1 cOrdem ] [ '> c'ndice ]]
Argumento Obrigat. Tipo Descrio
nPosio No N Posio da ordem na lista de ordens ativas
cOrdem No Nome da ordem a ser setada
cIndice No Nome do arquivo de ndice a ser ao qual pertence a ordem a ser setada

Retorno Descrio
NIL Sem retorno
/escri)o
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 selecionar uma nova ordem para a tabela corrente atravs da
posio da ordem na lista de ordens ativas com o primeiro parmetro ou atravs do nome da ordem
especificado "TAG cOrdem".
Para evitar nomes de ordens duplicados, pode-se especificar a qual arquivo de ndice pertence com
"IN c'ndice".
'0emplo
// 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( )
)!"E#O%)E%1 2
SetPrc
Configura a linha e coluna correntes de impresso.
Sinta0e
SETPRC( nLin, nCol ) --> NIL
Argumento Obrigat. Tipo Descrio
nLin Sim N Informar a nova linha de impresso
nCol Sim N Informar a nova coluna de impresso

Retorno Descrio
NIL Sem retorno.
/escri)o
SETPRC( ) modifica a linha e coluna atuais de impresso assim como PCOL( ) e PROW( ) chamados
separadamente.
'0emplo
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

I,I#$%I,#1 2
$%E$A%E$%I,#1 2
I"$%I,#E%1 2
$%O.1 2
$COL1 2
FECHAREL( )
$%,*L&"/1 2
EJEC#1 2
5E#I$.I,)O."1 2
5E#$O%#AC#IVE1 2
SetPrint
Interface onde so configuradas as opes de impresso.
Sinta0e
SETPRINT( cAlias3 cPrograma3 [ cPerg ]3 [ c+itulo ]3 [ c=esc@ ]3 [ c=escK ]3 [ c=escQ ]3 [ l=ic ]3 [ aOrd
]3 [ lCompres ]3 [ c+am ]3 [ uPar@ ]3 liltro3 [ lCr?stal ]3 [ c>ome=rv ]3 [ uParK ]3 [ l#ervidor ]3 [
cPorta'mpr ] ) -> caracter
Argumento Obrigat. Tipo Descrio
cAlias Sim C Alias do arquivo a ser impresso.
cPrograma Sim C Nome do arquivo a ser gerado em disco
cPerg No C Grupo de perguntas cadastrado no dicionrio SX1.
c+itulo No C Ttulo do relatrio
c=esc@ No C Descrio do relatrio.
c=escK No C Continuao da descrio do relatrio.
c=escQ No C Continuao da descrio do relatrio.
l=ic No L
Para impresso de cadastro genrico permite a escolha dos campos a serem
impressos.
aOrd No A Ordem(s) de impresso.
lCompres No L Se verdadeiro (.T.) habilita escolha o formato da impresso.
c+am No C Tamanho do relatrio "P","M" ou "G".
uPar@ No U Parmetro reservado
liltro No L Se verdadeiro (.T.) permite a utilizao do assistente de filtro.
lCr?stal No L Se verdadeiro (.T.) permite integrao com Crystal Report.
c>ome=rv No C Nome de um driver de impresso.
uParK No U Parmetro reservado.
l#ervidor No L Se verdadeiro (.T.) fora impresso no servidor.
cPortaImpr No C Define uma porta de impresso padro.
/escri)o
A funo SetPrint() cria a interface (dilogo) onde as opes de impresso de um relatrio podem ser
configuradas. Basicamente duas variveis m_pag (*) e aReturn (**) precisam ser declaradas 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.
(**) vetor contendo as opes de impresso, sua estrutura composta de 8 (oito) elementos: 1 - caracter,
tipo do formulrio; 2 - numrico, opo de margem; 3 - caracter, destinatrio; 4 - numrico, formato da
impresso; 5 - numrico, dispositivo de impresso; 6 - reservado; 7 - reservado; 8 - numrico, ordem.
'0emplo
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
$ergunte( cPerg, .F. )
wrel := SETPRI$T( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
"et)e8ault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
%pt"tatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
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 )
"et%egua( 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()
Inc%egua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
%oda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
Our"pool( wrel )
Endif
":*L&"/()
Return
Cabec
Inc%egua
%oda
%pt"tatus
"et)e8ault
"et%egua
SXip
Desloca a tabela para outro registro.
Sinta0e
SKIP [nRegistros] [nArea | ALIAS Alias]
Argumento Obrigat. Tipo Descrio
nRegistros No N Nmero de registros a ser deslocados
nArea No N Nmero da rea de trabalho
Alias No Nome da identificao da rea de trabalho

Retorno Descrio
NIL Sem retorno

/escri)o
Este comando utilizado para deslocar para outro registro a partir do registro atual.
O parmetro especifica quantos registros lgicos devem ser deslocados a partir 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 primeiro 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".
'0emplo
// Este exemplo mostra como o SKIP pode passar do final da tabela e do incio da tabela
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOBOTTOM()
EOF() // retorna .F.
S:IP
EOF() // retorna .T.
DBGOTOP()
BOF() // retorna .F.
S:IP ?2
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)
S:IP 2/
RECNO() // retorna 110
S:IP ?2/
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. )
S:IP 2/ ALIAS "SSS"
SSS->RECNO() // retorna 110
S:IP ?2/ ALIAS "SSS"
SSS->RECNO() // retorna 100

BOF
EOF
)!5O#O$1 2
)!5O!O##O1 2
)!"EE71 2
SplitPath
Quebra em diversas partes um arquivo.
Sinta0e
SPLITPATH( cAr4, @[c=rive], @[cCaminho], @[c>ome], @[c,-t] ) --> NIL
Argumento Obrigat. Tipo Descrio
cAr4 Sim C
Nome do Arquivo a ser quebrado. Opcionalmente, pode incluir caminho e
drive.
cDrive No C
Nome do Drive. Exemplo ( C: ). Caso o Arquivo informado no possua
drive ou o caminho refira-se ao servidor, retorno ser uma string em
branco.
cCaminho No C
Nome do Caminho. Caso o Arquivo informado no possua caminho, ser
uma string em branco.
cNome No C
Nome do Arquivo sem a extenso, caso em cAr4 no seja especificado um
nome do Arquivo retornar uma string em branco.
c,-t No C
Nome do Arquivo sem a extenso, caso em cAr4 no seja especificado um
Arquivo com extenso retornar uma string em branco

Retorno Descrio
NIL Sem retorno
/escri)o
SplitPath() divide um caminho completo em todas as suas subpartes; cAr4 no necessita conter todas as
partes.
Tanto arquivos locais ( Remote ) quanto arquivos no servidor, podem ser informados.
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.
'0emplo
Local cArq := "C:\TEMP\TESTE.EXE"
Local cDrive, cDir, cNome, cExt
S(!tPatL( cArq, @cDrive, @cDir, @cNome, @cExt )
? cDrive // Resultado : C:
? cDir // Resultado : \TEMP\
? cNome // Resultado : TESTE
? cExt // Resultado: .EXE
TCConTBpe
Define o tipo de conexo que ser utilizada entre o Protheus e o TopConnect.
Sinta0e
TCCONTYPE ( c+ipo ) --> NIL
Argumento Obrigat. Tipo Descrio
c+ipo Sim C Tipo da conexo. Pode ser: "TCPIP" ou "NPIPE"

Retorno Descrio
NIL Sem retorno
/escri)o
Determina o tipo de conexo que ser utilizada entre o Protheus e o TopConnect. O valor guardado e
utilizado nas chamadas seguintes de TCLink.
'0emplo
TCConTy(e("$PIPE")
_nCon := TCLink("MSSQL7/TOPSQL", "TOPSERVER1")
If (_nCon < 0)
CONOUT("Falha Conexao TOPCONN - Erro: "+ str(nCon, 10, 0))
EndIf
TCLINK( )
TCDelHile
Apaga um arquivo de um banco de dados.
Sinta0e
TCDELFILE ( c+abela ) --> Lgico
Argumento Obrigat. Tipo Descrio
c+abela Sim C Nome da tabela que deve ser apagada.

Retorno Descrio
.T. Tabela foi excluda com sucesso
.F. Erro. Geralmente porque a tabela est sendo utilizada por outro processo.
/escri)o
Apaga um arquivo de um banco de dados relacional via TopConnect.
'0emplo
If TcCanOpen("TRB"+SM0->M0_CODIGO+"0")
T=De!F!e("TRB"+SM0->M0_CODIGO+"0")
Endif
TCCANOPEN( )
TC2en8rB
Define a execuo de uma Query.
Sinta0e
TCGENQRY ([ -Par@, -ParK, ], c!uer?) --> caracter
Argumento Obrigat. Tipo Descrio
-Par@3 -ParK No Qualquer Parmetros apenas para compatibilizao. No tem funo.
cQuery Sim C Contm a expresso da query que se deseja executar.

Retorno Descrio
"" Sempre retorna uma string vazia.
/escri)o
Esta funo determina que a prxima chamada DBUseArea ser a abertura de uma Query e no de
tabela.
'0emplo
cQuery := 'SELECT X2_CHAVE CHAVE, R_E_C_N_O_ RECNO from SX2990'
dbUseArea(.T., 'TOPCONN', TC9enMry(,,cQuery), 'TRB', .F., .T.)
while !Eof()
// Processa
conout(TRB->CHAVE)
dbSkip()
enddo
dbCloseArea()
DBUSEAREA( )
TC$sv,ocX
Verifica se o servidor possui sistema de locks virtuais.
Sinta0e
TCISVLOCK () --> Lgico
Retorno Descrio
.T. O servidor possui sistemas de locks virtuais.
.F. O servidor no possui locks virtuais.
/escri)o
Atravs de locks virtuais, possvel bloquear uma string. A funo TCISVLOCK verifica se o servidor
TopConnect possui tratamento para locks virtuais.
'0emplo
#ifdef TOP
If TCI"#Lo=N()
TCVUnLock()
EndIf
#endif
#CVLOC71 2
#CV&,LOC71 2
TCRe.resh
Faz refresh em uma tabela.
Sinta0e
TCREFRESH ( c+abela ) --> NIL
Argumento Obrigat. Tipo Descrio
c+abela Sim Lgico Indica nome da tabela que deve ser feito refresh.

Retorno Descrio
NIL No existe retorno.
/escri)o
Faz o refresh de uma tabela, atravs de uma leitura forada da tabela no banco de dados. til aps
alteraes diretas no banco (delete, insert).
'0emplo
cTabela:= "SA1990"
cComando := "Delete "+ cTabela +" Where R_E_C_N_O_ > 50000 "
TCSqlExec(cComando)
TCReBre"L(=Ta+e!a)

TCSet*u..
Esta funo foi mantida apenas para compatilizao, no sendo utilizada no AP6.
TCSetConn
Altera a conexo corrente.
Sinta0e
TCSETCONN( nCone-aoCorrente ) --> Lgico
Argumento Obrigat. Tipo Descrio
nCone-aoCorrente Sim Numrico
Indica o nmero da conexo que deve se tornar a corrente.
Este nmero foi retornada pela funo TCLINK.

Retorno Descrio
.T. Conexo corrente trocada com sucesso
.F. Conexo no encontrada
/escri)o
Altera a conexo corrente. Novas tabelas abertas ou criadas utilizaro esta conexo para realizar a
operao. til quando se tem mais de uma conexo com o TopConnect.
'0emplo
_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.
EndIf
USE CLIENTES VIA "TOPCONN" NEW // Tabela de clientes ser aberto em _nCon2
TCSETCO$$(8nCon2)
USE PEDIDOS VIA "TOPCONN" NEW // Tabela de pedidos ser aberto em _nCon2
.
.
.
TCQUIT()
RETURN .T.
TCLINK( )
TCSetDummB
Altera o status do modo "dummy"
Sinta0e
TCSETDUMMY ([ l#tatus ]) --> Lgico
Argumento Obrigat. Tipo Descrio
l#tatus Sim Lgico Indica se deve ligar (.T.) ou desligar (.F.) o modo "dummy" .

Retorno Descrio
.T. Operao com sucesso
.F. Erro na operao.
/escri)o
No modo "dummy", o TopConnect faz apenas a abertura dos arquivos, sem executar nenhuma funo de
posicionamento. utilizado para fazer uma abertura mais rpida dos arquivos. Passando .T., entra em
modo "Dummy", .F. volta ao normal.
'0emplo
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()
.......
TCSp6ec
Executa uma Stored Procedure.
Sinta0e
TCSPEXEC ( c#Proc [, -Param@,...,-Param>])--> [array]
Argumento Obrigat. Tipo Descrio
c#Proc Sim C Nome da Stored Procedure.
xParamX No Qualquer Parmetro(s) da Stored Procedure

Retorno Descrio
NIL Nenhum valor retornado pela Stored Procedure ou ocorreu um erro.
array Array contendo os valores de retorno da Stored Procedure.
/escri)o
Executa uma Stored Procedure, no banco de dados, com nmero varivel de parmetros.
'0emplo
A Stored Procedure abaixo retorna "Teste" e o parmetro numrico +3:

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(*Pro=e)ure" (Ote"te2O), 2// )
IF Len(aResult) = 0
conout("Erro na execuo da Stored Procedure.")
Endif
Else
conout(aResult[1] + str(aResult[2]))
Endif
TCSp6ist
Verifica se uma Stored Procedure existe.
Sinta0e
TCSPEXIST ( c#toredProc ) --> Lgico
Argumento Obrigat. Tipo Descrio
c#toredProc Sim C Nome da Stored Procedure.
Retorno Descrio
.T. Stored Procedure existe.
.F. Stored Procedure no existe.
/escri)o
Verifica a existncia de uma Stored Procedure no Banco de dados atual.
'0emplo
if TCSPE*"t("SP/////2")
cStr := "DROP PROCEDURE "+ "SP000001 "
TCSqlExec(cStr)
endif
TCSLlrror
Retorna o ltimo erro produzido em comandos SQL.
Sinta0e
TCSQLERROR ( )-> Caracter
Retorno Descrio
Caracter Texto com descrio do erro. Se no houve erro, retorna texto vazio.
/escri)o
Esta funo obtm as mensagens de erros em ordem inversa. Portanto, s vezes necessrio fazer vrias
chamadas a esta funo para obter todos os erros, caso eles sejam mltiplos.
'0emplo
nRet = TCSQLEXEC("INSERT INTO SALES/CUSTOMER(NAME) VALUES('JOHN DOE')")
If nRet == 0
conout("Insero executada")
Else
conout( "Insero com erro (s) : ")
cRet = TCSMLERROR()
Do While !Empty(cRet)
conout(cRet)
cRet = TCSMLERROR()
EndDo
EndIf
TCSrvTBpe
Retorna o tipo de servidor.
Sinta0e
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"
/escri)o
Retorna o tipo de servidor onde est o banco de dados.
'0emplo
// utilizado para testar se o ambiente AS/400, pois alguns comandos so diferentes
nesta plataforma.
Ex: Chamada da funcao de reconciliao
If T=Sr@Ty(e() == 'AS/400'
Processa({|lEnd| FA210Processa()})
Else
Processa({|lEnd| FA211Processa()})
Endif
TCSBs6e
Executa um comando do sistema operacional no servidor TopConnect.
Sinta0e
TCSYSEXE ( cComando ) --> Numrico
Argumento Obrigat. Tipo Descrio
cComando Sim C Comando do Sistema Operacional.

Retorno Descrio
0 Comando executado com sucesso.
<>0 Erro na execuo do comando.
'0emplo
// Copia arquivo no AS400
cAntigo:= "ANTIGO"
cNovo:= "NOVO"
cExpres := "CPYF FROMFILE("+AllTrim(cAntigo)+") TOFILE("
cExpres += AllTrim(cNovo)+") MBROPT(*ADD) FMTOPT(*MAP *DROP)"
if TCSy"E*e(=E*(re") <> 0
conout("Erro na execuo do comando")
endif
TCSBs6e
Executa um comando do sistema operacional no servidor TopConnect.
Sinta0e
TCSYSEXE ( cComando ) --> Numrico
Argumento Obrigat. Tipo Descrio
cComando Sim C Comando do Sistema Operacional.

Retorno Descrio
0 Comando executado com sucesso.
<>0 Erro na execuo do comando.
'0emplo
// Copia arquivo no AS400
cAntigo:= "ANTIGO"
cNovo:= "NOVO"
cExpres := "CPYF FROMFILE("+AllTrim(cAntigo)+") TOFILE("
cExpres += AllTrim(cNovo)+") MBROPT(*ADD) FMTOPT(*MAP *DROP)"
if TCSy"E*e(=E*(re") <> 0
conout("Erro na execuo do comando")
endif
TC!'n,ocX
Libera o bloqueio virtual de uma string.
Sinta0e
TCVUNLOCK ([ cPalavra ]) --> Lgico
Argumento Obrigat. Tipo Descrio
cPalavra No C
String que deve ser liberada. Se no for passada, TODOS os locks
virtuais desta conexo so liberados.

Retorno Descrio
.T. A palavra foi bloqueada.
.F. No foi possvel desbloquear a palavra, provavelmente porque ela no estava bloqueada.
/escri)o
Retira o bloqueio virtual de uma string ou de todas da conexo.
'0emplo
#ifdef TOP
If TCIsVLock()
if !TCVLock("Processo1")
messagebox("Nao foi possivel bloquear o processo1", "", 0)
return
endif

...... // Processa


TC#7n!o=N("Pro=e""o2")
EndIf
#endif
#CI"VLOC71 2
#CVLOC71 2
Time
Retorna a hora do sistema
Sinta0e
TIME() --> cHora
Retorno Descrio
cHora
A hora do sistema como uma cadeia de caracteres no formato hh:mm:ss onde hh a hora
( 1 a 24 ), mm os minutos e ss os segundos.
/escri)o
TIME() uma funo que retorna a hora do sistema como uma cadeia de caracteres. TIME() est
relacionada com "ECO,)"12 que retorna o valor inteiro representando o nmero de segundos desde a
meia-noite.
SECONDS() geralmente usada no lugar de TIME() para clculos.
'0emplos
Estes exemplos mostram a funo TIME() utilizada em conjunto com SUBSTR() para extrair 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
"ECO,)"12
SUBSTR()
'n,ocX
Desbloqueia os registros da tabela corrente.
Sinta0e
UnLock [ALL]
/escri)o
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 corrente.
'0emplo
// Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
7$LOC: ALL
// Este exemplo mostra uma variao do uso de UNLOCK para liberar apenas o registro
corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
7$LOC: // Desbloqueia o registro atual (100)

FLOCK( )
RLOCK( )
)!&,LOC7ALL1 2
)!%LOC71 2
)!%LOC7LI"#1 2
)!&,LOC71 2
'pdate$nt&ame
Atualiza o nome do ndice interno da tabela CTree.
Sinta0e
UpdateIntName ( c>ome )->Lgico
Argumento Obrigat. Tipo Descrio
c>ome No C
Especifica o nome da tabela cujo ndice interno deve ter o nome
atualizado.

Retorno Descrio
.F.
No conseguiu atualizar o nome do ndice interno. O arquivo no pode ser aberto em modo
exclusivo.
.T. Atualizao do nome de ndice interno ocorrida com sucesso
/escri)o
A funo UpdateIntName muda o nome do arquivo de ndice interno 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 armazenado no diretrio "\CTREEINT\" acima da tabela equivalente,
calculado da seguinte forma:

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 automaticamente.
'0emplo
// 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 &7()ateInt$a>e("<)a)o"a)@<"a233/.)t=")
Messagebox("No foi possvel atualizar o nome do ndice interno da tabela","Erro", 0)
BREAK
ENDIF
USE "\dadosadv\sa1990.dtc" SHARED NEW
C#%EE)ELI,#1 2
'se
Abre uma tabela na rea de trabalho atual e os arquivos relacionados a ela.
Sinta0e
USE +abela [INDEX 'ndices] [ALIAS Alias] [EXCLUSIVE | SHARED] [NEW] [READONLY] [VIA Driver]]
Argumento Obrigat. Tipo Descrio
+abela Nome do arquivo da tabela a ser aberta
Indices Nomes dos ndices a serem abertos junto com a tabela
Alias Alias da tabela a ser aberta
Driver Nome do RDD a ser utilizado na abertura da tabela

Retorno Descrio
NIL Sem retorno
/escri)o
Este comando associa uma tabela especificada pelo primeiro parmetro (+abela) rea de trabalho atual
atravs de um driver especificado atravs do parmetro =river.
Tambm pode abrir os arquivos de ndices relacionados com a tabela.
No caso do Ctree os arquivos de ndices permanentes j so abertos automaticamente, mas nos demais
RDDs deve especificar os arquivos de ndices que se deseja abrir atravs do parmetro 'ndices.
O Alias pode ser especificado atravs do parmetro Alias. Pode-se especificar se a tabela 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 "READONLY", onde
nenhuma alterao ser efetivada na tabela. A opo "NEW" determina que a tabela especificada ser
aberta na prxima rea de trabalho disponvel e ser setada como a rea de trabalho corrente.
'0emplo
// 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:
7SE C!ente #IA "CTREECDX" $E, S4ARED READO$LY

CLOSEAREA
DBUSEAREA
'sed
Verifica se existe uma tabela corrente
Sinta0e
Used() --> Lgico
Retorno Descrio
.F. No existe tabela corrente
.T. Existe tabela corrente
/escri)o
Esta funo utilizada para verificar se existe alguma tabela aberta no momento.
'0emplo
//Este exemplo utiliza a funo USED()para verificar quando a tabela est ativa:
USE Clientes NEW
Result := 7SED() // Result: .T.
CLOSE
Result := 7SED() // Result: .F.
Oear
Converte o valor da data no valor numrico do ano.
Sinta0e
YEAR( d=ata ) --> nAno
Argumento Obrigat. Tipo Descrio
d=ata Sim D o valor da data a ser convertido.

Retorno Descrio
nAno
Valor numrico do ano da data especificada em dData incluindo os dgitos do sculo. O valor
retornado no afetado pelos valores especificados pelos comandos SET DATE ou SET
CENTURY.
0 Para uma data invlida ou nula.
/escri)o
YEAR() uma funo de converso de data que extrai o valor numrico do ano. YEAR() membro de um
grupo de funes que retornam valores numricos de uma data. O grupo inclui )A312 e O,#/12 que
retornam o dia e o ms como valores numricos.
'0emplos
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 data:
cData := Mdy(DATE()) // Result: September 20, 1990
FUNCTION Mdy( dDate )
RETURN CMONTH(dDate) + " " + LTRIM(STR(DAY(dDate))) + "," + STR(YEAR(dDate))
C)O.12
CO,#/12
)O.12
O,#/12
)A312
YAP
Remove todos os registros da tabela.
Sinta0e
M?P
/escri)o
Este comando apaga (fisicamente) todos os registro da tabela corrente.
'0emplo
// Este exemplo mostra como o ZAP pode se utilizado.
dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
JAP

$AC7
tSrv3)@ect
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 Numrico. Coordenada horizontal em pixels.
nTop Numrico. Coordenada vertical em pixels.
nWidth Numrico. Largura em pixels.
nHeight Numrico. Altura em pixels.
cCaption Caractere. Ttulo ou contedo do objeto.
cTooltip Caractere. Mensagem exibida quando objeto exibe seu tooltip.
lShowHint Lgico. Flag que ativa .T. ou desativa .F. a exibio do tooltip do objeto.
cMsg Caractere. Mensagem exibida na barra de status da janela principal quando o objeto ganha foco.
nClrText Numrico. Cor do texto do objeto.
nClrPane Numrico. Cor do fundo do objeto.
bWhen
Bloco de cdigo. Executado quando h movimentao de foco na janela.
Se retornar .T. o objeto continua habilitado, se retornar .F. o objeto ser desabilitado.
b$alid
Bloco de cdigo. Executado quando o contedo do objeto modificado e dever ser validado.
Deve retornar .T. se o contedo vlido e .F. se contedo invlido.
blClicked Bloco de cdigo. Executado quando acionado click do boto esquerdo do mouse sobre o objeto.
brClicked Bloco de cdigo. Executado quando acionado click do boto direito do mouse sobre o objeto.
blDblClick
Bloco de cdigo. Executado quando acionado duplo click do boto esquerdo do mouse sobre o
objeto.
oWnd Objeto. Janela onde o objeto foi criado.
lVisible Booleano. Se .T. o objeto visvel, se .F. o objeto invisvel.
Cargo Objeto ou varivel. Contedo associado ao objeto.
bLostFocus Bloco de cdigo. Executado quando objeto perde foco.
bGotFocus Bloco de cdigo. Executado quando objeto ganha foco.
%Atodos
)SetHocus
Sinta6e
SetFocus( )
Descrio
Fora o foco de entrada de dados mudar para o objeto.
Retorno
NIL
Kide
Sinta6e
Hide( )
Descrio
Torna objeto invisvel.
Retorno
NIL
ShoW
Sinta6e
Show( )
Descrio
Torna objeto visvel.
Retorno
NIL
na)le
Sinta6e
Enable( )
Descrio
Habilita o objeto.
Retorno
NIL
Disa)le
Sinta6e
Disable( )
Descrio
Desabilita o objeto.
Retorno
NIL
Re.resh
Sinta6e
Refresh( )
Descrio
Fora atualizao (sincronia) de propriedades entre o programa e o Protheus Remote.
tCom)o*o6
Classe de combobox.
KierarLuia
t"rvOb;ect -> 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 localizado na parte direita do controle. A
varivel associada ao controle ter o valor de um dos itens selecionados ou no caso de uma lista
indexada, o valor de seu ndice.
Propriedades
AItems
Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes formatos: a)
Seqencial, exemplo: {"item1,item2,...,itemN} ou b) Indexada, exemplo:
{"a=item1,b=item2, ..., "n=itemN}.
nAt Numrico. Posio do item selecionado.
%Atodos
&eW
Descrio
Construtor da classe.
Sinta6e
New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd], [nPar8], [abChange],
[abValid], [anClrText], [anClrBack], [alPixel], [aoFont], [cPar15], [lPar16], [abWhen], [lPar18], [aPar19],
[bPar20], [cPar21], [acReadVar])
ParEmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter. Se a lista for seqencial, o controle atualizar <var> com o contedo do item
selecionado, se a lista for indexada, <var> ser atualizada com o valor do ndice do item
selecionado.
anItems
Array, opcional. Lista de items, caracteres, a serem exibidos. Pode ter os seguintes
formatos: a) Seqencial, exemplo: {"item1,item2,...,itemN} ou b) Indexada, exemplo:
{"a=item1,b=item2, ..., "n=itemN}.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
nPar8 Reservado.
abChange 6loco de c:digo3 opcional* ,-ecutado 4uando o controle modifica o item selecionado*
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
anClrBack Numrico, opcional. Cor de fundo do controle.
anClrText Numrico, opcional. Cor do texto do controle.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte utilizada
para exibir o contedo do controle.
cPar15 Reservado.
lPar16 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados 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 Reservado.
aPar19 Reservado.
bPar20 Reservado.
cPar21 Reservado.
acReadVar
Caractere, opcional. Nome da varivel que o controle dever manipular, dever ser a
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.
Sinta6e
Select( [anItem] )
ParEmetros
anItem Numrico, opcional. Posio do item a ser selecionado.
Retorno
NIL
6emplo
#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()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +cCombo )

Return nil
tCom)o*o6
Classe de combobox.
KierarLuia
t"rvOb;ect -> 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 localizado na parte direita do controle. A
varivel associada ao controle ter o valor de um dos itens selecionados ou no caso de uma lista
indexada, o valor de seu ndice.
Propriedades
aItems
Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes formatos: a)
Seqencial, exemplo: {"item1,item2,...,itemN} ou b) Indexada, exemplo:
{"a=item1,b=item2, ..., "n=itemN}.
nAt Numrico. Posio do item selecionado.
%Atodos
&eW
Descrio
Construtor da classe.
Sinta6e
New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd], [nPar8], [abChange],
[abValid], [anClrText], [anClrBack], [alPixel], [aoFont], [cPar15], [lPar16], [abWhen], [lPar18], [aPar19],
[bPar20], [cPar21], [acReadVar])
ParEmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter. Se a lista for seqencial, o controle atualizar <var> com o contedo do item
selecionado, se a lista for indexada, <var> ser atualizada com o valor do ndice do item
selecionado.
anItems Array, opcional. Lista de items, caracteres, a serem exibidos. Pode ter os seguintes
formatos: a) Seqencial, exemplo: {"item1,item2,...,itemN} ou b) Indexada, exemplo:
{"a=item1,b=item2, ..., "n=itemN}.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
nPar8 Reservado.
abChange 6loco de c:digo3 opcional* ,-ecutado 4uando o controle modifica o item selecionado*
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
anClrBack Numrico, opcional. Cor de fundo do controle.
anClrText Numrico, opcional. Cor do texto do controle.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte utilizada
para exibir o contedo do controle.
cPar15 Reservado.
lPar16 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados 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 Reservado.
aPar19
Reservado.
bPar20 Reservado.
cPar21 Reservado.
acReadVar
Caractere, opcional. Nome da varivel que o controle dever manipular, dever ser a
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.
Sinta6e
Select( [anItem] )
ParEmetros
anItem Numrico, opcional. Posio do item a ser selecionado.
Retorno
NIL
6emplo
#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()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +cCombo )

Return nil
t2roup
Classe de painel de grupo de controles.
KierarLuia
t"rvOb;ect -> tControl -> tGroup
Descrio
Utilize a classe tGroup para criar um painel onde controles visuais podem ser agrupados ou classificados.
criada uma borda com ttulo em volta dos controles agrupados.
%Atodos
&eW
Descrio
Construtor da classe.
Sinta6e
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [aoWnd], [anClrText], [anClrPane], [alPixel],
[lPar10])
ParEmetros
AnTop Numrico, opcional. Coordenada vertical superior em pixels ou caracteres.
AnLeft Numrico, opcional. Coordenada horizontal esquerda em pixels ou caracteres.
anBottom Numrico, opcional. Coordenada vertical inferior em pixels ou caracteres.
anRight Numrico, opcional. Coordenada horizontal direita em pixels ou caracteres.
acCaption Caractere, opcional. Ttulo do grupo.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
anClrText Numrico, opcional. Cor do texto.
anClrPane Numrico, opcional. Cor do fundo.
alPixel Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres.
lPar10 Reservado.
Retorno
O objeto criado.
6emplo
#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
t,ist)o6
Classe de lista de items.
KierarLuia
t"rvOb;ect -> 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.
ParEmetros
Nat Numrico. Indica ou modifica o item selecionado.
AItems Array de items caracteres. Lista do itens selecionveis.
%Atodos
&eW
Descrio
Contrutor da classe
Sinta6e
New([anRow], [anCol], [abSetGet], [aaItems], [anWidth], [anHeigth], [abChange], [aoWnd], [abValid],
[anClrFore], [anClrBack], [alPixel], [lPar13], [abLDBLClick], [aoFont], [cPar16], [lPar17], [abWhen],
[aPar19], [bPar20], [lPar21], [lPar22], [abRightClick] )
ParEmetros
AnRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
AnCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
AbSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> )} que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter ou numrica.
AaItems Array de items caracteres, opcional. Lista de items selecionveis.
AnWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
abChange Bloco de cdigo, opcional. Executado quando o item selecionado alterado.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
abValid
6loco de c:digo3 opcional* ,-ecutado 4uando o contedo do controle deve ser validado3
deve retornar *+* se o contedo for v;lido e ** 4uando o contedo for inv;lido*
anClrFore
Numrico, opcional. Cor de fundo do controle.
anClrBack Numrico, opcional. Cor do texto do controle.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
lPar13 Reservado.
abLDBLClick
Bloco de cdigo, opcional. Executado quando acionado duplo click do boto esquerdo do
mouse sobre o controle.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
cPar16 Reservado.
lPar17 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados 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.
aPar19
Reservado.
bPar20 Reservado.
lPar21 Reservado.
lPar22 Reservado.
abRightClick
Bloco de cdigo, opcional. Executado quando acionado click do boto direito do mouse
sobre o controle.
Select
Descrio
Fora a seleo de um item.
Sinta6e
Select( [nItem] )
ParEmetros
NItem Numrico, opcional. Item a ser selecionado.
Retorno
NIL
Add
Descrio
Insere ou adiciona novo item.
Sinta6e
Add( cText, nPos )
ParEmetros
cText Caractere, obrigatrio. Texto do item.
nPos
Numrico, obrigatrio. Se 0 ou maior que o nmero de itens, insere o item no final da lista. Se
valor entre 1 e nmero de itens, insere o item na posio informada, empurrando o item
anterior para baixo.
Retorno
NIL
%odi.B
Descrio
Modifica o texto de um item.
Sinta6e
Modify( cText, nPos )
ParEmetros
cText Caractere, obrigatrio. Texto novo.
nPos
Numrico, obrigatrio. Posio a ser modificada deve ser maior que 0 e menor ou igual que o
nmero de itens.
Retorno
NIL
Del
Descrio
Apaga um item.
Sinta6e
Del( nPos )
ParEmetros
nPos
Numrico, obrigatrio. Posio a ser excluida, deve ser maior que 0 e menor ou igual que o
nmero de itens.
Retorno
NIL
,en
Descrio
Retorna o nmero de itens.
Sinta6e
Len( )
Retorno
Numrico. Nmero de itens.
Reset
Descrio
Apaga todos os itens.
Sinta6e
Reset( )
Retorno
NIL
6emplo
#include protheus.ch

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
t%eter
Classe de rgua de processamento.
KierarLuia
t"rvOb;ect -> tControl -> tMeter
Descrio
Utilize a classe tMeter para criar um controle que exibe uma rgua (gauge) de processamento,
descrevendo o andamento de um processo atraves da exibio de uma barra horizontal.
ParEmetros
NTotal Numrico. Nmero total de passos at o preenchimento da rgua de processo.
lPercentage Lgico. Se .T. considera o passo de movimentao em porcentagem.
nClrBar Numrico. Cor da barra de andamento.
%Atodos
&eW
Descrio
Contrutor da classe.
Sinta6e
New([anRow], [anCol], [abSetGet], [anTotal], [aoWnd], [anWidth], [anHeight], [lPar8], [alPixel],
[oPar10], [cPar11], [alNoPerc], [anClrPane], [nPar14], [anClrBar], [nPar16], [lPar17])
ParEmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
numrico.
anTotal Numrico, opcional. Numero total de passos at o preenchimento da rgua de processo.
aoWnd Objeto, opcional. Janela ou controle onde o controle sera criado.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
lPar8 Reservado*
alPixel Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres.
oPar10 Reservado.
cPar11 Reservado.
alNoPerc Lgico, opcional. Se .T. (padro) no considera os passos de atualizao em porcentagem.
anClrPane Numrico, opcional. Cor de fundo do controle.
nPar14 Reservado.
anClrBar Numrico, opcional. Cor da barra de andamento.
nPar16 Reservado.
lPar17 Reservado.
Retorno
O objeto construdo.
Set
Descrio
Atualiza a posio da rgua de processamento.
Sinta6e
Set( [nVal] )
ParEmetros
nVal Numrico, opcional. Novo valor da posio da rgua de processamento.
Retorno
NIL
6emplo
#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
// 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

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
t%ultiget
Classe de campo Memo de edio.
KierarLuia
t"rvOb;ect -> tControl -> tMultiGet
Descrio
Utilize a classe tMultiget para criar controle de edio de texto de mltiplas linhas.
Propriedades
lWordWrap Lgico. Se .T., faz quebra automtica de linhas.
%Atodos
&eW
Descrio
Construtor da classe.
Sinta6e
New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [aoFont], [alHScroll], [anClrFore],
[anClrBack], [oPar11], [alPixel], [cPar13], [lPar14], [abWhen], [lPar16], [lPar17], [alReadOnly],
[abValid], [bPar20], [lPar21], [alNoBorder], [alNoVScroll])
ParEmetros
anRow >umArico3 opcional* Coordenada vertical em pi-els ou caracteres*
AnCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
AbSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
alHScroll Lgico, opcional. Se .T., habilita barra de rolagem horizontal.
anClrFore Numrico, opcional. Cor de fundo do controle.
anClrBack >umArico3 opcional* Cor do te-to do controle*
oPar11 Reservado.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
cPar13 Reservado.
lPar14 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados 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.
lPar16 Reservado.
lPar17 Reservado.
alReadOnly Lgico, opcional. Se .T. o controle so permitira leitura.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
bPar20 Reservado.
lPar21 Reservado.
alNoBorder Lgico, opcional. Se .T. cria controle sem borda.
alNoVScroll Lgico, opcional. Se .T., habilita barra de rolagem vertical.
Retorno
O objeto construdo.
na)le!Scroll
Descrio
Habilita a barra de rolagem vertical.
Sinta6e
EnableVScroll( lEnable )
ParEmetros
lEnable Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra de rolagem.
Retorno
NIL
na)leKScroll
Descrio
Habilita a barra de rolagem horizontal.
Sinta6e
EnableHScroll( lEnable )
ParEmetros
lEnable Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra de rolagem.
Retorno
NIL
6emplo
#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
tPanel
Classe de painel esttico.
KierarLuia
t"rvOb;ect -> tControl -> tPanel
Descrio
Utilize a classe tPanel quando desejar criar um painel esttico, onde podem ser criados outros controles
com o objetivo de organizar ou agrupar componentes visuais.
%Atodos
&eW
Descrio
Construtor da classe.
Sinta6e
New([anRow], [anCol], [acText], [aoWnd], [aoFont], [alCentered], [lPar6], [anClrText], [anClrBack],
[anWidth], [anHeight], [alLowered], [alRaised])
ParEmetros
anRow Numrico, opcional. Coordenada vertical em pixels.
anCol Numrico, opcional. Coordenada horizontal em pixels.
acText Caractere, opcional. Texto a ser exibido ao fundo.
aoWnd Objeto, opcional. Janela ou controle onde ser criado o objeto.
alCentered Lgico, opcional. Se .T. exibe o texto de ttulo ao centro do controle.
lPar6 Reservado.
anClrText Numrico, opcional. Cor do texto do controle.
anClrBack Numrico, opcional. Cor do fundo do controle.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
alLowered Lgico, opcional. Se .T. exibe o painel rebaixado em relao ao controle de fundo.
alRaised
Lgico, opcional. Se .T. exibe a borda do controle rebaixada em relao ao controle de
fundo.
Retorno
O objeto construdo.
6emplo
#include protheus.ch

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
tRad%enu
Classe de radio group.
KierarLuia
t"rvOb;ect -> tControl -> tRadMenu
Descrio
Utilize a classe tRadMenu para criar um controle que possibilita escolha de item atravs de uma lista.
Propriedades
nOption Numrico. Item selecionado.
aItems Array de caracteres. Lista de items selecionveis.
%Atodos
&eW
Descrio
Construtor do objeto.
Sinta6e
New([anRow], [anCol], [aacItems], [abSetGet], [aoWnd], [aPar6], [abChange], [anClrText], [anClrPan],
[cPar10], [lPar11], [abWhen], [anWidth], [anHeight], [abValid], [lPar16], [lPar17], [alPixel])
ParEmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
aacItems Array de caracteres, opcional. Lista de opes.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
numrico.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
aPar6 Reservado.
abChange Bloco de cdigo, opcional. Executado quando o item selecionado alterado.
anClrText Numrico, opcional. Cor do texto do controle
anClrPan >umArico3 opcional* Cor de fundo do controle*
cPar10 Reservado.
lPar11 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados 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 Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deva ser validado,
retornando .T. se o contedo for vlido, e .F. quando invlido.
lPar16 Reservado.
Lpar17 Reservado.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
Retorno
O objeto construdo.
na)le$tem
Descrio
Habilita ou desabilita item.
Sinta6e
EnableItem( [nItem], [lEnable])
ParEmetros
NItem Numrico, opcional. Item selecionado.
LEnable Lgico, opcional. Se .T. habilita o item se .F. desabilita o item.
Retorno
NIL
6emplo
#include protheus.ch

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,;
{|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
tSaB
Classe de label.
KierarLuia
t"rvOb;ect -> tControl -> tSay
Descrio
O objeto tipo tSay exibe o contedo de texto esttico sobre uma janela ou controle.
ParEmetros
lWordWrap
Lgico. Se .T. quebra o texto em vrias linhas de maneira a enquadrar o contedo na
rea determinada para o controle, sendo o padro .F.
lTransparent
Lgico. Se .T. a cor de fundo do controle ignorada assumindo o contedo ou cor do
controle ou janela ao fundo, sendo o padro .T.
%Atodos
&eW
Descrio
Mtodo construtor do controle.
Sinta6e
New([anRow], [anCol], [abText], [aoWnd], [acPicture], [aoFont], [lPar7], [lPar8], [lPar9], [alPixels],
[anClrText], [anClrBack], [anWidth], [anHeight], [lPar15], [lPar16], [lPar17], [lPar18], [lPar19])
ParEmetros
AnRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
AnCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
AbText
Codeblock, opcional. Quando executado deve retornar uma cadeia de caracteres a ser
exibida.
AoWnd Objeto, opcional. Janela ou dilogo onde o controle ser criado.
acPicture Caractere, opcional. Picture de formatao do contedo a ser exibido.
AoFont
Objeto, opcional. Objeto tipo tFont para configurao do tipo de fonte que ser utilizado
para exibir o contedo.
lPar7 Reservado.
lPar8 Reservado.
lPar9 Reservado*
AlPixels
Lgico, opcional. Se .T. considera coordenadas passadas em pixels se .F., padro,
considera as coordenadas passadas em caracteres.
anClrText Numrico, opcional. Cor do contedo do controle.
anClrBack Numrico, opcional. Cor do fundo do controle.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
lPar15 Reservado.
lPar16 Reservado.
lPar17 Reservado.
lPar18 Reservado.
lPar19 Reservado.
Retorno
O controle criado.
SetTe6t
Descrio
Modifica o contedo a ser exibido pelo controle.
Sinta6e
SetText( [xVal] )
ParEmetros
xVal Caracter / Numrico / Data, Opcional. Valor a ser exibido.
Retorno
NIL
6emplo
#include protheus.ch

User Function Teste()

Local oDlg, oSay
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE My dialog PIXEL
oSay:= tSay():New(10,10,{||para exibir},oDlg,,,,;
,,.T.,CLR_WHITE,CLR_RED,100,20)
ACTIVATE MSDIALOG oDlg CENTERED

Return
tScroll)o6
Classe de rea de scroll.
KierarLuia
t"rvOb;ect -> tControl -> tScrollbox
Descrio
Utilize a classe tScrollbox para criar um painel com scroll deslizantes nas laterais do controle.
%Atodos
&eW
Descro
Construtor da classe
Sinta6e
New([aoWnd], [anTop], [anLeft], [anHeight], [anWidth], [alVertical], [alHorizontal], [alBorder])
ParEmetros
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
AnTop Numrico, opcional. Coordenada vertical em pixels.
AnLeft Numrico, opcional. Coordenada horizontal em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
anWidth Numrico, opcional. Largura do controle em pixels.
alVertical Lgico, opcional. Se .T. exibe a barra de scroll vertical.
alHorizontal Lgico, opcional. Se .T. exibe a barra de scroll horizontal.
alBorder Lgico, opcional. Se .T. exibe a borda do controle.
Retorno
O objeto criado.
6emplo
#include protheus.ch

User Function Teste()

Local oDlg, oScr, oGet1, oGet2, oGet3
Local cGet1, cGet2, cGet3
cGet1:= Space(10)
cGet2:= Space(10)
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
All2roups
Retorna vetor contendo informaes dos grupos de usurios.
Sinta0e
ALLGROUPS() -> array
/escri)o
A funo AllGroups() retorna um vetor principal onde cada elemento refere-se a um grupo de usurios
do sistema, estes elementos so compostos de um vetor multidimensional subdividindo as
informaes dos grupos. Sua estrutura composta de:
Elemento /escri)o Tipo Qtd.
1
1 ID C 6
2 Nome C 20
3 Vetor com horrios de acesso A
4 Data de validade D 8
5 Quantas vezes para expirar N 4
6 Autorizado a alterar a senha L 1
7 Idioma N 1
8 Diretrio C 100
9 Impressora C
10 Acessos C 512
11 Vetor com empresas A

12 Data da ltima alterao D 8
13 Tipo de impresso N 1
14 Formato N 1
15 Ambiente N 1
16 Opo de impresso L 1
17 Acesso a outros Dir de impresso L 1
%
1 Mdulo+nvel+menu C
'0emplo
Local aGrupos:= {}
aGrupos:= ALL9RO7PS()
$s<Admin
$s<I)
$s<"ee=
$s<%et
$s<,ame
$s<Order
All&sers
All'sers
Retorna vetor contendo informaes dos usurios do sistema.
Sinta0e
ALLUSERS() -> array
/escri)o
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 subdividindo as informaes dos
usurios. Sua estrutura composta de:
Elemento Descrio Tipo Qtd.
1
1 ID C 6
2 Nome C 15
3 Senha C 6
4 Nome Completo C 30
5 Vetor com n ltimas senhas A --
6 Data de validade D 8
7 Quantas vezes para expirar N 4
8 Autorizado a alterar a senha L 1
9 Alterar a senha no prximo logon L 1
10 Vetor com os grupos A --
11 ID do superior C 6
12 Departamento C 30
13 Cargo C 30
14 E-Mail C 130
15 Nmero de acessos simultneos N 4
16 Data da ltima alterao D 8
17 Usurio bloqueado L 1
18 Nmero de dgitos para o ano N 1
19 Listner de ligaes L 1
20 Ramal C 4
%
1 Vetor com horrios de acesso A --
2 Idioma N 1
3 Diretrio C 100
4 Impressora C --
5 Acessos C 512
6 Vetor com empresas A --
7 Ponto de entrada C 10
8 Tipo de impresso N 1
9 Formato N 1
10 Ambiente N 1
11 Prioridade p/ config. do grupo L 1
12 Opo de impresso C 50
13 Acesso a outros dir de impresso L 1
&
1 Mdulo+nvel+menu C
'0emplo
Local aUsuario:= {}
aUsuario:= ALL7SERS()
$s<Admin
$s<I)
$s<"ee=
$s<%et
$s<,ame
$s<Order
All5roups
AP%sgAlert
Exibe uma mensagem em um dilogo
Sinta0e
APMSGALERT( c2sg, [ c+itulo ] ) -> nil
Argumento Obrigat. Tipo Descrio
c2sg Sim C Mensagem a ser exibida.
cTitulo No C Ttulo do dilogo.
/escri)o
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem de aviso.
'0emplo
AP%S9ALERT(Ateno)
A$sgIn8o
A$sg"top
A$sg3es,o
A$sg,o3es
AP%sg$n.o
Exibe uma mensagem em um dilogo
Sinta0e
APMSGINFO( c2sg, [ c+itulo ] ) -> nil
Argumento Obrigat. Tipo Descrio
c2sg Sim C Mensagem a ser exibida.
cTitulo No C Ttulo do dilogo.
/escri)o
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem de aviso.
'0emplo
AP%S9I$FO(Ateno)
A$sgIn8o
A$sg"top
A$sg3es,o
A$sg,o3es
AP%sg&oOes
Exibe uma mensagem em um dilogo
Sinta0e
APMSGNOYES( c2sg, [ c+itulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
C2sg Sim C Mensagem a ser exibida.
CTitulo No C Ttulo do dilogo.
/escri)o
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.
'0emplo
If !AP%S9$OYES(Abandonar?)
Return
EndIf
A$sgAlert
A$sg"top
A$sgIn8o
A$sg3es,o
AP%sgStop
Exibe uma mensagem em um dilogo
Sinta0e
APMSGSTOP( c2sg , [ c+itulo ] ) -> nil
Argumento Obrigat. Tipo Descrio
c2sg Sim C Mensagem a ser exibida.
cTitulo No C Ttulo do dilogo.
/escri)o
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem crtica.
'0emplo
AP%S9STOP(Ateno)
A$sgIn8o
A$sgAlert
A$sg3es,o
A$sg,o3es
AP%sgOes&o
Exibe uma mensagem em um dilogo
Sinta0e
APMSGYESNO( c2sg , [ c+itulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
C2sg Sim C Mensagem a ser exibida
cTitulo No C Ttulo do dilogo.
/escri)o
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.
'0emplo
If AP%S9YES$O(Abandonar ?)
Return
EndIf
A$sgAlert
A$sg"top
A$sgIn8o
A$sg,o3es
AP%sgOes&o
Exibe uma mensagem em um dilogo
Sinta0e
APMSGYESNO( c2sg , [ c+itulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
C2sg Sim C Mensagem a ser exibida
CTitulo No C Ttulo do dilogo.
/escri)o
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.
'0emplo
If AP%S9YES$O(Abandonar ?)
Return
EndIf
A$sgAlert
A$sg"top
A$sgIn8o
A$sg,o3es
Ca)ec
Imprime cabealho personalizado nos relatrios.
Sinta0e
CABEC( c+itulo3 cCabec@3 cCabecK3 cPrograma3 c+amanho3 [ normato ]3 [ uPar ]3 [ lPerg ] ) -> nil
Argumento Obrigat. Tipo Descrio
C+itulo Sim C Ttulo do relatrio.
cCabec@ Sim C Primeira linha do cabealho.
cCabecK Sim C Segunda linha do cabealho.
cPrograma Sim C Nome do relatrio.
c+amanho Sim C Tamanho da pgina P,M,G.
normato No N Para imprimir comprimido informe 15
uPar No U Reservado
lPerg No L Se verdadeiro, (.T.) imprime as perguntas no incio do relatrio.
/escri)o
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 associado
com o empresa corrente. Ex: `LGRL01.BMP, `01 a empresa.
'0emplo
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 := "et$rint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
"et)e8ault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
%pt"tatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
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 )
"et%egua( 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
CA'EC( 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
CA'EC( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda(,, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
"et $rinter TO
dbCommitAll()
Our"pool( wrel )
Endif
":*L&"/()
Return
"et$rint
%pt"tatus
"et%egua
Inc%egua
Our"pool
s:*lus>
%oda
Capital
Corrige maisculas e minsculas de uma frase.
Sinta0e
CAPITAL( c+e-to ) -> caracter
Argumento Obrigat. Tipo Descrio
cTexto Sim C Texto a ser corrigido.
/escri)o
Esta funo coloca a primeira letra de cada palavra em maiscula e o restante em minscula em toda a
frase.
'0emplo
A$sgIn8o( CAPITAL(FrAsE InCoRrEtA) )
Close*roWse
Fecha a MBrowse ou a MarkBrow.
Sinta0e
CLOSEBROWSE() -> lgico
/escri)o
Esta funo fecha a MBrowse ou MarkBrow dependendo de qual estiver ativa.
!ro<se
ar=!ro<
Conpad/
Exibe a tela de consulta padro.
Sinta0e
CONPAD1( [ uPar@ ]3 [ uParK ]3 [ uParQ ]3 cAlias3 [ cCampoRet ]3 [ uParM ]3 [ l$isual ] ) -> lgico
Argumento Obrigat. Tipo Descrio
UPar No U Parmetro reservado.
uPar2 No U Parmetro reservado.
uPar3 No U Parmetro reservado.
CAlias Sim C Consulta padro cadastrada no Dicionrio de Dados (SXB) a ser utilizada.
cCampoRet No C Nome da varivel ou campo que receber o retorno da consulta padro.
uPar4 No U Parmetro Reservado.
LVisual No L Indica se ser somente para visualizao.
/escri)o
Esta funo exibe a tela de consulta padro baseada no Dicionrio de Dados (SXB).
'0emplo
CO$PAD2(,,,SA1,,,.F.)
nchoice)ar
Cria barra de botes padro na janela
Sinta0e
ENCHOICEBAR( o=lg3 bO"3 bCancelar3 [ l2ensApag ] 3 [ a6otoes ] ) -> nil
Argumento Obrigat. Tipo Descrio
O=lg Sim O Janela onde a barra ser criada.
6O" Sim B Bloco executado quando clicado boto Ok.
bCancelar Sim B Bloco executado quando clicado.
l2ensApag No L
Indica se ao clicar no boto Ok aparecer uma tela de confirmao de
excluso. Valor padro falso
a6otoes No A
Vetor com informaes para criao de botes adicionais na barra no
formato {bitmap, bloco de cdigo, mensagem}.
/escri)o
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.
'0emplo
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,;
E$C4OICE'AR(oDlg,{|| A$sgIn8o(Ok)}, {|| ApMsgInfo(Cancelar)}, , {{BMPINCLUIR,{||
APMsgInfo(Teste)},Teste}})
Return

Hile&o6t
Retorna o nome de um arquivo sem a extenso.
Sinta0e
FILENOEXT( c+e-to ) -> caracter
Argumento Obrigat. Tipo Descrio
CTexto Sim C Texto contendo o nome do arquivo
/escri)o
A funo FileNoExt() retorna o nome de um arquivo contido em uma string, ignorando a extenso.
'0emplo
Local cString := '\SIGAADV\ARQZZZ.DBF'
cString := F!e$oE*t( cString )
// retorno `\SIGAADV\ARQZZZ'
%et*ile,ame
Hinal
Utilizada para finalizar o sistema.
Sinta0e
FINAL( [ c2ensagem@ ]3 [ c2ensagemK ] ) -> lgico
?r+umento Obri+atC Tipo /escri)o
cMensagem1 No C Primeira mensagem.
cMensagem2 No C Segunda mensagem.
/escri)o
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 tabelas abertas.
'0emplo
User Function <nome-do-programa>( cUsuario, cSenha )
Local cMensag1 := Usurio invlido!
Local cMensag2 := Opo disponvel para usurios Administradores!
If !$s<Admin( cUsuario, cSenha )
FI$AL( cMensag1, cMensag2 )
EndIf
Return
HTPConnect
Cria conexo com servidor FTP.
Sinta0e
FTPCONNECT( c#ervidor, nPorta, cDsuario, c#enha ) -> lgico
/escri)o
A funo FTPConnect() retorna verdadeiro se a operao for realizada com sucesso. Se existir uma
conexo ativa e for solicitada uma nova, retornar falso.
?r+umento Obri+atC Tipo /escri)o
c#ervidor Sim C Endereo do servidor
nPorta No N
Nmero da porta utilizada para conectar no servidor, por default utiliza
a porta padro de FTP.
cUsuario No C
Nome do usurio utilizado para conectar no servidor. Por default utiliza
o usurio "Anonymous".
cSenha No C
Senha do usurios utilizado para conectar no servidor. Por default utiliza
o usurio "Anonymous".
'0emplo
Local cServidor
Local cCurDir
cServidor := 'ftp.caminhodoservidor.com.br'
If !FTPCO$$ECT( cServidor )
A$sgIn8o( 'Falha na conexo!' )
EndIf
*#$)irC>ange
*#$)irector?
*#$)isconnect
*#$)o<nload
*#$Erase
*#$5etCur)ir
*#$%ename*ile
*#$&pload
HTPDirChange
Altera o diretrio corrente do FTP.
Sinta0e
FTPDIRCHANGE( c=iretorio ) -> lgico
Argumento Obrigat. Tipo Descrio
c=iretorio Sim C Nome do diretrio.
/escri)o
A funo FTPDirChange () retornar verdadeiro (.T.) se a operao for realizada com sucesso.
'0emplo
Local cServidor
Local aArqs
Local aDirs
cServidor := 'ftp.caminhodoserivor.com.br'
*#$)isconnect()
If !*#$Connect( cServidor )
A$sgIn8o( 'Falha na conexo!' )
EndIf
If FTPDrCLanPe('diretorio')
aDirs := *#$)irector?( '*.*', 'D' )
aArqs := FTPDirectory( '*.*' )
EndIf
*#$Connect
*#$)isconnect
*#$)irector?
*#$)o<nload
*#$Erase
*#$5etCur)ir
FTPUpload
*#$%ename*ile
HTPDirectorB
Cria um vetor com informaes de diretrios e arquivos do FTP.
Sinta0e
FTPDIRECTORY( c2ascara3 [ cAtributo ] ) -> array
Argumento Obrigat. Tipo Descrio
c2ascara Sim C Mscara dos arquivos a serem pesquisados.
cAtributo No C
Se for informado "D a funo retornar somente diretrios, se no for
informado retornar somente arquivos.
/escri)o
A funo FTPDirectory() retorna um vetor contendo informaes dos diretrios e arquivos contidos no FTP.
'0emplo
Local cServidor
Local aArqs
Local aDirs
cServidor := 'ftp.caminhodoserivor.com.br'
*#$)isconnect()
If !*#$Connect( cServidor )
A$sgIn8o( 'Falha na conexo!' )
EndIf
If *#$)irC>ange('diretorio')
aDirs := FTPDIRECTORY( '*.*', 'D' )
aArqs := FTPDIRECTORY( '*.*' )
EndIf
*#$Connect
*#$)irC>ange
*#$)isconnect
*#$)o<nload
*#$Erase
*#$5etCur)ir
*#$&pload
*#$%ename*ile
HTPDoWnload
Copia um arquivo no servidor FTP para o servidor local.
Sinta0e
FTPDOWNLOAD( cAr4=est3 cAr4Orig ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqDest Sim C Caminho e nome do arquivo a ser gravado na mquina.
cArqOrig Sim C Arquivo no servidor a ser copiado.
/escri)o
A funo FTPDownload() copia um arquivo no servidor FTP para uma mquina local em um diretrio
(informado no parmetro cArqDest) abaixo do RootPath do Protheus.
'0emplo
Local cServidor
cServidor := 'ftp.caminhodoserivor.com.br'
*#$)isconnect()
If !*#$Connect( cServidor )
A$sgIn8o( 'Falha na conexo!' )
EndIf
If *#$)irC>ange('diretorio')
If !FTPDO,$LOAD( '\DIRETORIO\ARQ00001.ARQ', 'ARQ00001.ARQ' )
A$sgIn8o( 'Problemas ao copiar arquivo!' )
EndIf
EndIf
*#$Connect
*#$)irC>ange
*#$)irector?
*#$)isconnect
*#$Erase
*#$5etCur)ir
*#$&pload
*#$%ename*ile
HTP2etCurDir
Retorna o diretrio corrente no FTP.
Sinta0e
FTPGETCURDIR() -> caracter
'0emplo
Local cServidor
Local cCurDir
cServidor := 'ftp.caminhodoserivor.com.br'
*#$)isconnect()
If !*#$Connect( cServidor )
A$sgIn8o( 'Falha na conexo!' )
EndIf
cCurDir := FTP9ETC7RDIR()
*#$Connect
*#$)irC>ange
*#$)irector?
*#$)isconnect
*#$)o<nload
*#$Erase
*#$&pload
*#$%ename*ile
HTPRenameHile
Renomeia arquivo no servidor FTP.
Sinta0e
FTPRENAMEFILE( cAr4Atual, cAr4>ovo ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqAtual Sim C Nome do arquivo a ser renomeado.
cAr4=est Sim C Novo nome do arquivo.
/escri)o
A funo FTPRenameFile() renomeia um arquivo no diretrio corrente do servidor FTP. Se a operao for
realizada com sucesso a funo retornar verdadeiro (.T.).
'0emplo
Local cServidor
cServidor := 'ftp.caminhodoserivor.com.br'
*#$)isconnect()
If !*#$Connect( cServidor )
A$sgIn8o( 'Falha na conexo!' )
EndIf
If *#$)irC>ange('diretorio')
If !HTPR&A%H$,( 'ARQ00001.ARQ', 'ARQ00002.ARQ' )
APMsgInfo( 'Problemas ao renomear arquivo!' )
EndIf
EndIf
*#$)isconnect
*#$)irector?
*#$5etCur)ir
*#$)o<nload
*#$&pload
HTP'pload
Copia um arquivo na mquina local para o servidor FTP.
Sinta0e
FTPUPLOAD( cAr4Orig, cAr4=est ) -> lgico
Argumento Obrigat. Tipo Descrio
cAr4Ori Sim C Caminho e nome do arquivo na mquina a ser copiado para o servidor FTP.
cAr4=est Sim C Nome do arquivo a ser gravado no servidor FTP.
/escri)o
A funo FTPUpload() copia um arquivo na mquina local para o diretrio corrente no servidor FTP. O
arquivo a ser copiado deve estar abaixo do RootPath do Protheus. Se a operao for realizada com
sucesso a funo retornar verdadeiro (.T.).
'0emplo
Local cServidor
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
If FTPDirChange('diretorio')
If !FTP7PLOAD( '\DIRETORIO\ARQ00001.ARQ', 'ARQ00001.ARQ' )
APMsgInfo( 'Problemas ao copiar arquivo!' )
EndIf
EndIf
*#$)isconnect
*#$)irector?
*#$5etCur)ir
*#$)irC>ange
*#$)o<nload
*#$&pload
*#$Erase
*#$%ename*ile
HunDesc
Retorna descrio de uma opo do menu.
Sinta0e
FUNDESC() -> caracter
/escri)o
A funo FunName() retornar a descrio de uma opo selecionada no menu do Siga.
'0emplo
Local cDescr
cDescr := F7$DESC()
*un,ame
Hun&ame
Retorna nome de uma funo do menu.
Sinta0e
FUNNAME() -> caracter
/escri)o
A funo FunName() retornar o nome de uma funo executada a partir de um menu do Siga
'0emplo
Local cFunction
cFunction := F7$$A%E()
*un)esc
2etCountrB,ist
Retorna vetor contendo informaes dos pases localizados.
Sinta0e
GETCOUNTRYLIST() -> array
/escri)o
O vetor retornado possui trs dimenses, a primeira refere-se a sigla dos pases, o segundo ao nome do
pas e o terceiro a identificao do pas com dois dgitos.
'0emplo
Local aArray := 9ETCO7$TRYLIST()
Local cSigla := 5etv( MV_PAISLOC )
Local nPos
nPos := Ascan( aArray, {|d| d[1] == Upper(cSigla) } )
If nPos > 0
A$sgIn8o( Pas de localizao + aArray[nPos,2] )
EndIf
2et%arX
Retorna string de caracteres aleatrios.
Sinta0e
GETMARK( [ l2aiusc ] ) -> caracter
Argumento Obrigat. Tipo Descrio
lMaiusc No L Se verdadeiro (.T.) retorna somente caracteres em maisculos.
/escri)o
A GetMark() utilizada junto a funo MarkBrow() onde so utilizados combinaes de caracteres para
controle de marcas.
'0emplo
Function <nome-da-funo>( )
Local aCampos := {{'CB_OK' ,,''},;
{'CB_USERLIB' ,,'Usurio'},;
{'CB_TABHORA' ,,'Hora'},;
{'CB_DTTAB' ,,'Data'}}
Private cMarca := 9ET%AR:()
Private cCadastro := 'Cadastro de Contrato'
Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0, 1 }}
ar=!ro<( 'SCB', 'CB_OK','!CB_USERLIB',aCampos,, cMarca,'MarkAll()',,,,'Mark()' )
Return
ar=!ro<
2et%v
Retorna o contedo de um parmetro cadastrado no SX6.
Sinta0e
GETMV( cParN@3 [ lParNK ]3 [ uParNQ ] ) -> varivel
Argumento Obrigat. Tipo Descrio
cPar@ Sim C Nome do parmetro a ser pesquisado
lParNK No L
Define se a GetMv deve retornar o contedo do parmetro, .F. ( Falso ) ou
apenas verificar se o parmetro existe, .T. ( Verdadeiro ). Valor default .F.
( Falso ).
uParNQ No U
Valor default que deve ser retornado pela GetMv quando os parmetro
solicitado no existir. O valor desse parmetro pode ser caracter,
numrico, lgico ou data.
/escri)o
O retorno da funo depende do tipo informado na cadastro do parmetro e da configurao dos
argumentos lPar02 e uPar03.
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.
'0emplo
Local cValor := ""
// Retorna o contedo do parmetro
cValor := 9ET%#( "MV_ESTADO" )
// Verifica se o parmetro existe
If ( 9ET%#( "MV_ESTADO", .T. ) )
ApsgIn8o( "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 := 9ET%#( "MV_ESTADO", , "SP" )
$ncProc
Incrementa rgua de progresso.
Sinta0e
INCPROC() -> nil
/escri)o
Para incrementar a rgua criada pela funo Processa(), utilizamos a funo IncProc()
'0emplo
User Function <nome-da-funo>( )
Local bAcao := {|lFim| Exemplo(@lFim) }
Local cTitulo := ''
Local cMsg := 'Processando'
Local lAborta := .T.
$rocessa( bAcao, cTitulo, cMsg, lAborta )
Return

Static Function Exemplo(lFim)
Local nI
$roc%egua(10000)
For nI := 1 To 10000
If lFim
Exit
EndIf
I$CPROC()
Next nI
Return
$rocessa
$roc%egua
$ncRegua
Incrementa valores na rgua de progresso criada pela funo RptStatus().
Sinta0e
INCREGUA() -> nil
/escri)o
Aps executar as funes RptStatus() e SetRegua(), para incrementar valores na rgua utilizamos a
funo IncRegua().
'0emplo
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
$ergunte( cPerg, .F. )
wrel := "et$rint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
"et)e8ault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
%pt"tatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
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 )
"et%egua( 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()
I$CRE97A()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
%oda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
"et $rinter TO
dbCommitAll()
Our"pool( wrel )
Endif
":*L&"/()
Return
%pt"tatus
"et%egua
$ndRegua
Cria ndice temporrio com expresso de filtro.
Sinta0e
INDREGUA( cAlias3 c'ndice3 c,-press3 [ -Ordem] 3 [ cor ]3 [ c2ens ]3 [ l,-ibir ] ) -> nil
Argumento Obrigat. Tipo Descrio
cAlias No C Alias da tabela que o ndice ser criado.
cIndece Sim C Nome do arquivo para criao do ndice.
cExpress Sim C Expresso do ndice.
xOrdem No C Indica se a ordem ser crescente ou decrescente.
lExibir No L Indica se exibir o dilogo de progresso.
cFor No C Expresso de filtro.
cMens No C Mensagem do dilogo de progresso.
/escri)o
Esta funo cria um ndice temporrio para o alias especificado podendo ou no ter um filtro e tambem
podendo ser decrescente se o parmetro xOrdem for especificado como "D. Durante a criao do ndice
um dilogo com uma barra de progresso ser criada podendo esta ser omitida.
'0emplo
User Function Exemplo()
Local cArquivo
Local cChave
Local cFor
Local nIndex
DbSelectArea("SA1")
cArquivo := CriaTrab(,.F.)
cChave := "A1_NOME"
cFor := "!Empty(A1_NOME)"
I$DRE97A("SA1",cArquivo,cChave,,cFor)
DbSelectArea("SA1")
nIndex := RetIndex("SA1")
#IFNDEF TOP
DbSetIndex(cArquivo+OrdBagExt())
#ENDIF
DbSetOrder(nIndex+1)
.
.
.
DbSelectArea("SA1")
RetIndex("SA1")
FErase(cArquivo+OrdBagExt())
Return
CriaTrab
RetIndex
%arX*Re.resh
Atualiza a MarkBrow.
Sinta0e
MARKBREFRESH() -> nil
/escri)o
Esta funo atualiza o browse da MarkBrow.
ar=!ro<
5etar=
%arX*roW
Monta um Browse onde as linhas podem ser marcadas ou desmarcadas.
Sinta0e
MARKBROW( cAlias3 cCampo3 [ cCpo ]3 [ aCampos ]3 [ l'nverte ]3 c2arca3 [ cCtrl2 ], [ uPar ]3 [
c,-p'ni ]3 [ c,-pim ]3 [ cAval ] ) -> nil
Argumento Obrigat. Tipo Descrio
cAlias Sim C Alias do arquivo a ser exibido no browse.
cCampo Sim C Campo do arquivo onde ser feito o controle (gravao) da marca.
cCpo No C
Campo onde ser feita a validao para marcao e exibio do bitmap de
status.
aCampos No A Colunas a serem exibidas.
l'nvert No L Inverte a marcao.
c2arca Sim C String a ser gravada no campo especificado para marcao.
cCtrl2 No C Funo a ser executada caso deseje marcar todos elementos.
uPar No L Parmetro reservado.
c,-p'ni No C
Funo que retorna o contedo inicial do filtro baseada na chave de ndice
selecionada.
c,-pim No C
Funo que retorna o contedo final do filtro baseada na chave de ndice
selecionada.
cAval No C Funo a ser executada no duplo clique em um elemento no browse.
/escri)o
A funo MarkBrow() permite que os elementos de um browse sejam marcados ou desmarcados.
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 composta de 5 (cinco)
dimenses: 1 - Ttulo; 2 - Rotina; 3 - Reservado; 4 - Operao (1 - pesquisa; 2 - visualizao; 3 -
incluso; 4 - alterao; 5 - excluso); 5 - Acesso relacionado a rotina, se esta posio no for informada
nenhum acesso ser validado.
'0emplo
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 }}
%AR:'RO,( '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)
s&nLoc=()
Else
RecLock( 'SCB', .F. )
Replace CB_OK With cMarca
MsUnLock()
EndIf
Return

// Grava marca em todos os registros validos
Function MarkAll()
Local nRecno := Recno()
dbSelectArea('SCB')
dbGotop()
While !Eof()
Mark()
dbSkip()
End
dbGoto( nRecno )
Return
ar=!%e8res>
5etar=
!ro<se
%*roWse
Monta um Browse com menu de opes.
Sinta0e
MBROWSE( [ uPar@ ]3 [ uParK ]3 [ uParQ ]3 [ uParM ]3 cAlias3 [ ai-os ]3 [ cCpo ]3 [ uParR ]3 [ cun ]3 [
nPadrao ]3 [ aCores ]3 [ c,-p'ni ]3 [ c,-pim ]3 [ nCongela ] ) -> nil
Argumento Obrigat. Tipo Descrio
uPar@ No N Parmetro reservado.
uParK No N Parmetro reservado.
uParQ No N Parmetro reservado.
uParM No N Parmetro reservado.
cAlias Sim C Alias do arquivo a ser visualizado no browse.
ai-os No A
Contendo os nomes dos campos fixos pr-definidos pelo programador,
obrigando a exibio de uma ou mais colunas.
cCpo No C
Campo a ser validado se est vazio ou no para exibio do bitmap de
status.
uParR No N Parmetro reservado.
cun No C
Funo que retornar um valor lgico para exibio do bitmap de
status.
nPadrao No N
Nmero da rotina a executada quando for efetuado um duplo clique
em um registros do browse. Caso no seja informado o padro ser
executada visualizao ou pesquisa.
aCores No A
Este vetor possui duas dimenses, a primeira a funo de validao
para exibio do bitmap de status, e a segunda o bitmap a ser
exibido.
c,-p'ni No C
Funo que retorna o contedo inicial do filtro baseada na chave de
ndice selecionada.
c,-pim No C
Funo que retorna o contedo final do filtro baseada na chave de
ndice selecionada.
nCongela No N Coluna a ser congelado no browse.
/escri)o
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 composta de 5 (cinco)
dimenses: 1 - Ttulo; 2 - Rotina; 3 - Reservado; 4 - Operao (1 - pesquisa; 2 - visualizao; 3 -
incluso; 4 - alterao; 5 - excluso); 5 - Acesso relacionado a rotina, se esta posio no for informada
no validar os acessos.
'0emplo
Private cCadastro := 'Cadastro de Clientes'
Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0, 1 },;
{ 'Visualizar' , 'AxVisual' , 0, 2 },;
{ 'Incluir' , 'AxInclui' , 0, 3 },;
{ 'Alterar' , 'AxAltera' , 0, 4 },;
{ 'Excluir' , 'AxExcluir', 0, 5 }}
%'RO,SE( ,,,, 'SA1',, '!A1_COD',,, 4 )
%sZHlush
Descarrega spool de impresso.
Sinta0e
MS_FLUSH() -> nil
/escri)o
Aps os comandos de impresso as informaes ficam armazenadas no spool e so descarrega em seus
destinos atravs da funo Ms_Flush().
'0emplo
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
$ergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
"et)e8ault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
%pt"tatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
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 )
"et%egua( 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()
Inc%egua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
%oda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
"et $rinter TO
dbCommitAll()
Our"pool( wrel )
Endif
%SZH,'SK()
Return
"et$rint
"et)e8ault
%pt"tatus
Inc%egua
Our"pool
"et%egua
%sAppend
Adiciona registros de um arquivo para outro.
Sinta0e
MSAPPEND( [ cAr4=est ]3 cAr4Orig ) -> lgico
Argumento Obrigat. Tipo Descrio
cAr4=est No C
Se o RDD corrente for DBFCDX os registros sero adicionados na rea
selecionada, caso contrrio o arquivo destino ter que ser informado.
cAr4Orig No C Nome do arquivo origem contendo os registros a serem adicionados.
/escri)o
A funo MsAppend() adiciona registros de um arquivo para outro, respeitando a estrutura das tabelas. Se
a operao for realizada com sucesso o funo retornar verdadeiro (.T.).
'0emplo
dbSelectArea(`XXX')
%SAPPE$D(,`ARQ00001')
sCop?#o
sCop?*ile
s*ile
sErase
sCreate
s%ename
%sCopBHile
Executa copia binria de um arquivo.
Sinta0e
MSCOPYFILE( cAr4Orig3 cAr4=est ) -> lgico
Argumento Obrigat. Tipo Descrio
cAr4Orig Sim C Nome do arquivo origem e a extenso.
cAr4=est Sim C Nome do arquivo destino e a extenso.
/escri)o
Se a copia for realizada com sucesso a funo retornar verdadeiro (.T.).
'0emplo
Local cArqOrig := 'ARQ00001.DBF'
Local cArqDest := 'ARQ00002.XXX'
If %SCOPYFILE( cArqOrig, cArqDest )
A$sgIn8o('Copia realizada com sucesso!')
EndIf
sAppend
sCop?#o
sCreate
sErase
s*ile
s%ename
%sCopBTo
Realiza copia de um arquivo de dados.
Sinta0e
MSCOPYTO( [ cAr4Orig ]3 cAr4=est ) -> lgico
Argumento Obrigat. Tipo Descrio
cAr4Orig No C
Nome do arquivo origem e a extenso se o ambiente for Top o parmetro
passar a ser obrigatrio.
cAr4=est Sim C Nome do arquivo destino e a extenso.
/escri)o
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.)
'0emplo
Local cArqDest := 'SX2ZZZ.DBF'
DbSelectArea('SX2')
If %SCOPYTO( , cArqDest )
A$sgIn8o('Copia realizada com sucesso!')
Else
APMsgInfo('Problemas ao copiar o arquivo SX2!')
EndIf
sAppend
sCop?*ile
sCreate
sErase
s*ile
s%ename
%sCreate
Cria arquivo de dados.
Sinta0e
MSCREATE( cAr4uivo3 a,strut 3[ c=river ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cAr4uivo No C Nome do arquivo.
a,strut Sim A Estrutura do arquivo.
c=river No C RDD do arquivo.
/escri)o
A funo MsCreate() cria um arquivo (tabela) de acordo com a estrutura informada no 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.).
(*) vetor contendo a estrutura da tabela: 1 - caracter, nome do campo; 2 - caracter, tipo do campo; 3
- numrico, tamanho do campo; 4 - numrico, decimais.
'0emplo
Local cTarget := '\sigaadv\'
Local aStrut
aStrut := { { 'Campo', 'C', 40, 0 } }
If %SCREATE( cTarget+'ARQ1001', aStrut )
A$sgIn8o('Criado com sucesso!')
Else
APMsgInfo('Problemas ao criar o arquivo!')
EndIf
sAppend
sCop?#o
sCop?*ile
sErase
s*ile
s%ename
%srase
Deleta arquivo.
Sinta0e
MSERASE( cAr4uivo3 [ c'ndice ]3 [ c=river ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cAr4uivo Sim C Nome do arquivo e a extenso.
c'ndice No C Nome do arquivo de ndice e a extenso.
c=river No C
RDD do arquivo, se no for informado assumir o RDD corrente como
padro.
/escri)o
A funo MsErase() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
'0emplo
Local cArquivo := 'SX2ZZZ.DBF'
Local cIndice := 'SX2ZZZ'+ OrdBagExt()
If %SERASE( cArquivo, cIndice )
A$sgIn8o( 'Arquivo deletado com sucesso!' )
Else
APMsgInfo( 'Problemas ao deletar arquivo!' )
EndIf
sAppend
sCop?*ile
sCop?#o
sCreate
s*ile
s%ename
%s6ecAuto
Objetivo
Fazer manuteno automtica (incluso, alterao e excluso) das rotinas 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 as verses Protheus, porm esta
documentao baseou-se na verses superiores a AP6.09.
Vantagens
1) Interface : Os dados de entrada so enviados a rotina em forma de campos e
conteudos (array) e desta forma no necessario a apresentao de nenhuma
inteface ao usurio.
2) Segurana : A utilizao de rotinas automticas aumenta consideravelmente 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.
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 ambiente
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
PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' MODULO 'FAT'
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.
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}}
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.
%sHile
Verifica existncia de um arquivo.
Sinta0e
MSFILE( cAr4uivo, [ c'ndice ], [ c=river ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cArquivo #im C Nome do arquivo origem e a extenso.
cIndice No C Nome do arquivo de ndice e a extenso.
cDriver No C
RDD do arquivo, se no for informado assumir o RDD corrente como
padro.
/escri)o
A funo MsFile() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
'0emplo
Local cArquivo := 'SX2ZZZ.DBF'
Local cIndice := 'SX2ZZZ'+ OrdBagExt()
If !%SFILE( cArquivo, cIndice )
A$sgIn8o( 'Arquivo no encontrado!' )
EndIf
sAppend
sCop?*ile
sCop?#o
sCreate
sErase
s%ename

%sRename
Renomeia arquivo de acordo com RDD corrente.
Sinta0e
MSRENAME( cAr4Orig, cAr4=est ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqOrig Sim C Nome do arquivo origem e a extenso.
cArqDest Sim C Nome do arquivo destino e a extenso.
/escri)o
A funo MsRename() retornar verdadeiro (.T.) se efetuar a operao com sucesso.
'0emplo
Local cTarget := '\sigaadv\'
Local cArqOrig := 'ARQ00001.DBF'
Local cArqDest := 'ARQ00002.DBF'
If %SRE$A%E( cTarget + cArqOrig, cTarget + cArqDest )
A$sgIn8o('Arquivo renomeado com sucesso!')
Else
APMsgInfo('Problemas ao renomear o arquivo ' + cArqOrig + '!')
EndIf
sAppend
sCop?*ile
sCop?#o
sCreate
s*ile
sErase
%s'nlocX
Libera lock de registro.
Sinta0e
MSUNLOCK() -> nil
/escri)o
A funo MsUnlock() libera os registros bloqueados pela funo RecLock().
No retorna valores.
'0emplo
RecLock( 'XXX' ,.F. )
Replace Campo With '000001'
%S7$LOC:()
RecLock
3urSpool
Gerenciador de impresso.
Sinta0e
OURSPOOL( [ cAr4uivo ] ) -> nil
Argumento Obrigat. Tipo Descrio
cAr4uivo Sim C Relatrio gerado em disco
/escri)o
A funo OurSpool() executa o gerenciador de impresso do Siga, carregando os relatrios gerados no
diretrio configurado atravs parmetro MV_RELT no dicionrio SX6. Caso quiser visualizar um relatrio
especfico, informe o nome no parmetro cArquivo.
'0emplo
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
$ergunte( cPerg, .F. )
wrel := "et$rint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
"et)e8ault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
%pt"tatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
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 )
"et%egua( 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()
%oda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer To
dbCommitAll()
3'RSP33,( wrel )
Endif
":*L&"/()
Return
"et$rint
"et)e8ault
%pt"tatus
Inc%egua
s:*lus>
"et%egua
Pergunte
Inicializa as variveis de pergunta (mv_par??).
Sinta0e
PERGUNTE( cPergunta 3 [ lPerg ] 3 [ c+itulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cPergunta Sim C Pergunta cadastrada no dicionrio de dados ( SX1) a ser utilizada.
lPerg No L Indica se exibir a tela para edio.
c+itulo No C Ttulo do dilogo.
/escri)o
Esta funo inicializa as variveis de pergunta (mv_par01,...) baseado na pergunta cadastrado no
Dicionrio de Dados (SX1). Se o parmetro lAsk no for especificado ou for verdadeiro ser exibida a tela
para edio da pergunta e se o usurio confirmar as variveis sero atualizadas e a pergunta no SX1
tambm ser atualizada.
'0emplo
PERGUNTE(CON010)
Processa
Cria dilogo com uma rgua de progresso.
Sinta0e
PROCESSA( bAcao3 [ c+itulo ] 3 [ c2sg ]3 [ lAborta] ) -> nil
Argumento Obrigat. Tipo Descrio
bAcao Sim C Funo a ser executada.
c2sg No C Mensagem a ser exibida a baixo da rgua de progresso
c+itulo No C Ttulo de janela
lAborta No L Habilita boto cancelar.
/escri)o
A funo Processa() cria um dilogo onde a execuo de um determinada funo pode ser acompanhada
atravs de uma rgua de progresso. Para atribuir o valor total da rgua utilizamos a funo ProcRegua()
e para incrementar a rgua utilizamos a funo IncProc().
'0emplo
User Function <nome-da-funo>( )
Local bAcao := {|lFim| Exemplo(@lFim) }
Local cTitulo := ''
Local cMsg := 'Processando'
Local lAborta := .T.
PR3CSSA( bAcao, cTitulo, cMsg, lAborta )
Return

Static Function Exemplo(lFim)
Local nI
$roc%egua(10000)
For nI := 1 To 10000
If lFim
Exit
EndIf
Inc$roc()
Next nI
Return
$roc%egua
Inc$roc
ProcRegua
Atribui o valor total da rgua de progresso cria pela pela funo Processa().
Sinta0e
PROCREGUA( n+otal ) -> nil
Argumento Obrigat. Tipo Descrio
nTotal Sim N Valor total da rgua.
/escri)o
Aps atribuir o valor total da rgua, para incrementar utilizamos a funo IncProc().
'0emplo
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
Inc$roc
$rocessa
PsWAdmin
Verifica se um usurio pertence ao grupo de administradores.
Sinta0e
PSWADMIN( cDsuario, c#enha ) -> numrico
Argumento Obrigat. Tipo Descrio
cDsuario Sim C Nome do usurio.
c#enha Sim C Senha do usurio.
/escri)o
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.
'0emplo
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
$s<,ame
$s<Order
$s<I)
$s<%et
$s<"ee=
PsW$D
Retorna o ID do usurio ou do grupo de usurio.
Sinta0e
PSWID() -> caracter
/escri)o
Utilizada para retornar o ID do usurio ou do grupo de usurios aps ter posicionado o arquivo de senha
com a funo PswSeek().
'0emplo
User Function <nome-da-funo>( cUsuario )
Local cUserID
$s<Order(2)
If $s<"ee=( cUsuario, .T. )
cUserId := PS,ID() // Retorna o ID do usurio
EndIf
Return
$s<Admin
$s<,ame
$s<Order
$s<"ee=
$s<%et
PsW&ame
Verifica senha de usurio.
Sinta0e
PSWNAME( c#enha ) -> lgico
Argumento Obrigat. Tipo Descrio
cSenha Sim C Senha do usurio.
/escri)o
A funo PswName() verifica se a senha informada no parmetro cSenha pertence ao usurio posicionado
no arquivo de senha, se pertencer retornar verdadeiro(.T.).
'0emplo
User Function <nome-da-funo>( cUsuario, cSenha )
Local lOk
$s<Order(2)
If $s<"ee=( cUsuario, .T. )
lOk := PS,$A%E( cSenha )
EndIf
Return lOk
$s<Admin
$s<I)
$s<Order
$s<%et
$s<"ee=
PsW3rder
Posiciona a ordem de indexao do arquivo de senhas.
Sinta0e
PSWORDER( nOrdem ) -> nil
Argumento Obrigat. Tipo Descrio
nOrdem Sim N Ordem de indexao.
/escri)o
A funo PswOrder() posiciona a ordem de indexao de acordo com o parametro nOrdem, onde:
1 - ID;
2 - usurio;
3 - senha;e
4 - e-mail.
'0emplo
User Function <nome-da-funo>( cUsuario )
Local cUserID
PS,ORDER(2)
If PswSeek( cUsuario, .T. )
cUserId := PswID() // Retorna o ID do usurio
EndIf
Return
$s<Admin
$s<I)
$s<%et
$s<"ee=
$s<,ame
PsWRet
Retorna vetor contendo informaes do Usurio ou do Grupo de Usurios.
Sinta0e
PSWRET() -> array
/escri)o
A funo PswRet() retorna dois tipos de vetores distintos, de acordo com o posicionamento do arquivo de
senha. Se no segundo parmetro da funo PswSeek() for informado .T. a PswRet() retornar um vetor
com informaes do Usurios, caso contrrio retornar informaes do Grupo de Usurios.
'0emplo
// Exemplo 1
User Function <nome-da-funo>( cUsuario )
Local aArray := {}
$s<Order(2)
If $s<"ee=( cUsuario, .T. )
aArray := $".%E#() // 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 := PS,RET()[1][2] // Retorna nome do Grupo de Usurio
EndIf
Return
$s<Admin
$s<I)
$s<,ame
$s<Order
$s<"ee=
PsWSeeX
Pesquisa e posiciona o arquivo de senhas.
Sinta0e
PSWSEEK( c'=3 [ lDsuario ] ) -> lgico
Argumento Obrigat. Tipo Descrio
c'= Sim C String contendo o ID do usurio ou do grupo de usurios.
lUsuario No L
Se verdadeiro (.T.) pesquisa por usurios, se falso (.F.) pesquisa por grupo
de usurios. O valor assumido como padro .T.
/escri)o
A funo PswSeek() pesquisa e posiciona o arquivo de senhas conforme a ordem de indexao e o
parmetro lUsuario, se encontrar o usurio ou grupo de usurios retorna verdadeiro (.T.).
'0emplo
User Function <nome-da-funo>( cUsuario )
Local cUserID
$s<Order(2)// seleciona ordem de indexao
If PS,SEE:( cUsuario, .T. )
cUserId := PswID() // Retorna o ID do usurio
EndIf
Return
$s<Admin
$s<I)
$s<,ame
$s<Order
$s<%et
Read!ar
Retorna o nome da varivel que esta sendo editada.
Sinta0e
READVAR() -> caracter
/escri)o
Retorna o nome da varivel que esta sendo editada pela MsGetDados, MsGetDB e MsMGet (Enchoice) para
ser usada na validao de um campo por exemplo.
'0emplo
cVar := READ#AR()
If Type(cVar) == C
A$sgIn8o(Opo escolhida: +&cVar)
EndIf
s5et)ados
s5et)!
s5et
Ret6tKlp
Retorna a extenso do help de campo.
Sinta0e
RETEXTHLP() -> caracter
/escri)o
Esta funo retorna uma string contendo a extenso do help de campos de acordo com idioma corrente.
'0emplo
Local cExt
cExt := RETEXT4LP()
If `HLP' $ cExt
A$sgIn8o( `Help de Campos em Portugus' )
ElseIf `HLE' $ cExt
APMsgInfo( `Help de Campos em Espanhol' )
ElseIf `HLI' $ cExt
APMsgInfo( `Help de Campos em Ingls' )
EndIf
%etAcs,ame
%etE@t/ls
%etE-tnu
%etE@t/pr
Ret6tKls
Retorna a extenso do help de solues.
Sinta0e
RETEXTHLS() -> caracter
/escri)o
Esta funo retorna uma string contendo a extenso do help de solues de acordo com idioma corrente.
'0emplo
Local cExt
cExt := RETEXT4LS()
If `HLS' $ cExt
A$sgIn8o( `Help de Solues em Portugus' )
ElseIf `HSE' $ cExt
APMsgInfo( `Help de Solues em Espanhol' )
ElseIf `HSI' $ cExt
APMsgInfo( `Help de Solues em Ingls' )
EndIf
%etAcs,ame
%etE@t/lp
%etE@t/pr
%etE-tnu
-----------------------/\/\/\/\/\/\/\/\/\ Cores do Botes /\/\/\/\/\/\/\/\/\/\/\--------------
Bo"#es $"i%i&ados no Si'a.
Na Funo:
@ Lin, Col BMPBUTTON TYPE NN ACTION FUNO
Ou nas barras de Ferramentas:
AFASTAME
ALTERA
AREA
AUTOM
BAR
BUDGET
BUDGETY
CADEADO
CANCEL
CARGA
CHAVE2
CONTAINR
DBG06
DBG07
DESTINOS
DISCAGEM
EDIT
EDITABLE
EXCLUIR
FORM
GRAF2D
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 DISABLE.
{ 'Recno() = 3 ', 'BR_PRETO' },;.
{ 'Recno() = 4 ', 'BR_AMARELO' },;.
{ 'Recno() = 5 ', 'BR_VERDE' },;.
{ 'Recno() = 6 ', 'BR_AZUL' },;.
{ 'Recno() = 7 ', 'BR_CINZA' },;.
{ 'Recno() = 8 ', 'BR_PINK' },;.
{ 'Recno() = 9 ', 'BR_LARANJA' },;.
{ 'Recno() = 10 ', 'BR_MARRON' },;.
{ 'Recno() = 11 ', 'BR_VERMELHO' } }
Acredito que no seja possvel a implementao por .ch, pois a chamada das cores est implcita na
funo que monta o browse;
31
-----------------------/\/\/\/\/\/\/\/\/\ ORIENTAAO A OBJETO /\/\/\/\/\/\/\/\/\/\/\----------------------
tSrvOb.ect
Classe me de todas as classes de interface.
(aracterLsticas
Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser instanciada
diretamente.
Propriedades
Propriedade Tipo Descrio
nLeft Numrico. Coordenada horizontal em pixels.
nTop Numrico. Coordenada vertical em pixels.
nWidth Numrico. Largura em pixels.
nHeight Numrico. Altura em pixels.
cCaption Caractere. Ttulo ou contedo do objeto.
cTooltip Caractere. Mensagem exibida quando objeto exibe seu tooltip.
lShowHint Lgico. Flag que ativa .T. ou desativa .F. a exibio do tooltip do objeto.
cMsg Caractere.
Mensagem exibida na barra de status da janela principal quando o objeto
ganha foco.
nClrText Numrico. Cor do texto do objeto.
nClrPane Numrico. Cor do fundo do objeto.
bWhen
Bloco de
cdigo.
Executado quando h movimentao de foco na janela.Se retornar .T. o
objeto continua habilitado, se retornar .F. o objeto ser desabilitado.
bValid
Bloco de
cdigo.
Executado quando o contedo do objeto modificado e dever ser
validado. Deve retornar .T. se o contedo vlido e .F. se contedo
invlido.
blClicked
Bloco de
cdigo.
Executado quando acionado click do boto esquerdo do mouse sobre o
objeto.
brClicked
Bloco de
cdigo.
Executado quando acionado click do boto direito do mouse sobre o objeto.
blDblClick
Bloco de
cdigo.
Executado quando acionado duplo click do boto esquerdo do mouse sobre
o objeto.
oWnd Objeto. Janela onde o objeto foi criado.
lVisible Booleano. Se .T. o objeto visvel, se .F. o objeto invisvel.
Cargo
Objeto ou
varivel.
Contedo associado ao objeto.
bLostFocus
Bloco de
cdigo.
Executado quando objeto perde foco.
bGotFocus
Bloco de
cdigo.
Executado quando objeto ganha foco.
M,todos
Set4ocus
Sintaxe SetFocus( )
Descrio Fora o foco de entrada de dados mudar para o objeto.
Retorno NIL
Fide
Sintaxe Hide( )
Descrio Torna objeto invisvel.
Retorno NIL
Sho"
Sintaxe Show( )
Descrio Torna objeto visvel.
Retorno NIL
'nable
Sintaxe Enable( )
Descrio Habilita o objeto.
Retorno NIL
/isable
Sintaxe Disable( )
31
Descrio Desabilita o objeto.
Retorno NIL
ReNresh
Sintaxe Refresh( )
Descrio
Fora atualizao (sincronia) de propriedades entre o programa e o Protheus
Remote.
t4ont
Classe que encapsula fonte de edio.
Fierarquia
tFontAbs -> tFont
/escri)o
Utilize objeto tFont para modificar a fonte padro de controles visuais.
Propriedades
Vide classes ancestrais.
M,todos
!e"
/escri)o Mtodo construtor da classe.
Sinta0e
New([acName], [nPar2], [anHeight], [lPar4], [alBold], [nPar6], [lPar7], [nPar8],
[alItalic], [alUnderline])
Par<metros
Parmetro Tipo / Descrio
acName Caractere, opcional. Nome da fonte, o padro "Arial.
nPar2 Reservado.
anHeight Numrico, opcional. Tamanho da fonte. O padro -11.
lPar4 Reservado.
alBold Lgico, opcional. Se .T. o estilo da fonte ser negrito.
nPar6 Reservado.
lPar7 Reservado.
nPar8 Reservado.
alItalic Lgico, opcional. Se .T. o estilo da fonte ser itlico.
alUnderline Lgico, opcional. Se .T. o estilo da fonte ser sublinhado.
Retorno O objeto criado.
'0emplo
#INCLUDE "PROTHEUS.CH"
User Function Teste()
Local oDlg, oSay
Local oFont:= TFont():New("Courier New",,-14,.T.)
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, {|| "Mensagem"},oDlg,, oFont,,,, .T., CLR_WHITE,CLR_RED )
/* o comando abaixo proporciona o mesmo resultado
@ 10,10 SAY oSay PROMPT "Mensagem" FONT oFont COLOR CLR_WHITE,CLR_RED OF oDlg PIXEL
31
*/
oSay:lTransparent:= .F.
ACTIVATE MSDIALOG oDlg CENTERED
Return
MS/ialo+
Classe de dilogo de entrada de dados.
Fierarquia
tSrvObject -> tWindow -> tDialog -> MSDialog
(aracterLsticas
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.
M,todos
!e"
/escri)o Mtodo construtor da classe.
Sinta0e
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7],
[lPar8], [nPar9], [anClrText], [anClrBack], [oPar12], [aoWnd], [alPixel],
[oPar15], [oPar16], [lPar17])
Par<metros
Parmetro Tipo / Descrio
anTop
Numrico, opcional. Coordenada vertical superior em pixels ou
caracteres.
anLeft
Numrico, opcional. Coordenada horizontal esquerda em pixels ou
caracteres.
anBotom
Numrico, opcional. Coordenada vertical inferior em pixels ou
caracteres.
anRight
Numrico, opcional. Coordenada horizontal direita em pixels ou
caracteres.
acCaption Caractere, opcional. Ttulo da janela.
cPar6 Reservado.
nPar7 Reservado.
lPar8 Reservado.
nPar9 Reservado.
anClrText Numrico,opcional. Cor do texto.
anClrBack Numrico,opcional. Cor de fundo.
oPar12 Reservado.
aoWnd
Objeto, opcional. Janela me da janela a ser criada, padro a
janela principal do programa.
alPixel
Lgico, opcional. Se .T. considera as coordenadas passadas em
pixels, se .F. considera caracteres.
oPar15 Reservado.
oPar16 Reservado.
nPar17 Reservado.
Retorno O Dilogo criado.
'0emplo
#INCLUDE "protheus.ch
User Function Teste()
32
// 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.
Fierarquia
tSrvObject -> tControl -> tButton
/escri)o
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 Bloco de cdigo. Executado quando o boto pressionado.
M,todos
!e"
/escri)o Mtodo construtor da classe.
Sinta0e
New([anRow], [anCol], [acCaption], [aoWnd], [abAction], [anWidth], [anHeight],
[nPar8], [aoFont], [lPar10], [alPixel],[lPar12],[cPar13], [lPar14], [abWhen], [bPar16],
[lPar17])
Par<metros
Parmetro Tipo / Descrio
anRow Numrico, opcional. Coordenada vertical em pixels ou carateres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
acCaption Caractere, opcional. Titulo do boto.
aoWnd Objeto, opcional. Janela ou controle onde o boto dever ser criado.
abAction
Bloco de cdigo, opcional. Bloco que dever ser acionado quando o boto for
pressionado.
anWidth Numrico, opcional. Largura do boto em pixels.
anHeight Numrico, opcional. Altura do boto em pixels.
nPar8 Reservado.
aoFont
Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada para
o ttulo do boto.
lPar10 Reservado.
alPixel
Lgico, opcional. Se .T. considera as coordenadas passadas em pixels, se .F.
(padro) considera em caracteres.
lPar12 Reservado.
cPar13 Reservado.
lPar14 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada
de dados 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.
bPar16 Reservado.
lPar17 Reservado.
'0emplo
#include "protheus.ch
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo, aItems:= {"item1,item2,item3}
32
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
------------------------------/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\--------------------------
$nstalao de Servios AP# e AP" 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 clusula
"-remove"
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, startados e como
automticos.
Se no der certo, volte situao original, ou seja, AP6SVR automtico como servio e AP5SVR como
console.
$ntegrao Siga Advanced - 3..ice
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 lembrar que o Si+a
?dvanced possuL inte+ra)o somente com o '0cel e que a integrao com o Word est disponvel
somente para o mdulo de Controle de Documentos do Siga Quality Celerina.
32
$nstalao
Para instalar o SIGA Advanced for Windows com Microsoft Excel, o usurio deve possuir:
Fard"are O (onNi+ura)o mLnima: Pentium 133 com 16 MB RAM, recomendado Pentium 166
com 32 MB RAM.
MicrosoNt '0cel - A verso mnima 7.0 (95), recomendado o uso da verso 8.0 (97)
1C '0ecute o pro+rama de instala)o do SH-? ?dvancedC
%C Hnstale o SH-? ONNice Dit nas esta)PesC
3)serva4es
1. A instalao do Office Kit deve ser feita em todas as estaes que iro utilizar a
integrao.
2. A MICROSIGA envia dois arquivos exemplos de Planilha Excel, ADVDEMO e ADVDEMO7,
para serem utilizados nas verses Excel 97 e Excel 95, respectivamente. Estes arquivos
so instalados no diretrio X:\Arquivos de Programa \ SIGA Advanced Office Kit \
Samples (onde X: drive onde est instalado o SIGA Advanced).
'tili(ando a $ntegrao
Pode-se acessar o Microsoft Excel a partir de qualquer Mdulo SIGA Advanced, com exceo do
SIGACFG (Configurador ).
1. Escolha a opo "Planilha Excel no menu Miscelnea.
Se for o primeiro acesso ao Microsoft Excel atravs do Siga Advanced, ser solicitado o diretrio
onde est o executvel do Microsoft Excel, essa configurao ser gravada no arquivo
"ADV97BRW.INI.
Esse processo deve ser realizado em cada estao que for utilizar o SIGA Advanced 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 boto "Cancelar, ou
fechando o Microsoft Excel.
OBSI A integrao somente funcionar se o Excel for aberto a partir do Siga Advanced.
'sando as .un4es do Siga no 6cel
Existem 4 formas de se utilizar as funes do SIGA Advanced em uma planilha Excel. Veja a seguir:
1. Este procedimento recomendado para usurios menos experientes, pois o Microsoft 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 "/eNinidas pelo usurio".
Na caixa de listagem "Nome da Funo , selecione a funo que ser utilizada. Ser apresentada
uma janela Assistente, onde devem ser informados os parmetros da funo, conforme 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 experientes).
Para a informao de uma frmula no Excel, deve-se digitar o sinal de igual "=.
32
3. A terceira forma utilizar a funo SIGA( ) para identificar o incio da informao de funes
SIGA Advanced. Para tanto, deve ser usada a seguinte sintaxe:
SH-?5Qnome da Nun)oQR 1S par<metro da Nun)oR %S par<metro da Nun)oRCCC6
Por exemplo, informando:
TSH-?5QMes'0tensoQR%6 Desta forma, ser retornado o ms "Fevereiro.
Observe que o nome da funo SIGA Advanced informado entre aspas. (" ").
4. A quarta forma, tambm iniciar a informao com a funo Siga( ), porm as funes SIGA
Advanced, juntamente com seus parmetros, devem ser digitados entre aspas, obedecendo a
sintaxe padro que utiliza os sinais de parnteses. Por exemplo:
TSH-?5UMes'0tenso5%6V6
Cuidados com a utili(ao de .un4es
O Microsoft Excel utiliza um padro de data diferente do SIGA Advanced, por esse motivo 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 retorne 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 contedo
seja uma data, ou digitar a data no formato do Microsoft Excel "00:00 10/05/98.
Toda funo do SIGA Advanced utilizada a partir do menu "Inserir Frmula do Microsoft Excel ou da
sintaxe "=Siga("nomefuno;Par01;Par02) que utiliza valor lgico (.T./.F.) como parmetro, 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 mensagem "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 "Procurar" para
localizar o "Add In" do SIGA Advanced (AdvXla80.XLA para a verso 8.0 ou AdvXla para verso
7.0 do Excel, que esto no diretrio de Bibliotecas do Office).
6ec*locXs
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 com o Microsoft
Excel.
A varivel que recebe o parmetro passado pelo Excel sempre a 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.
Hun4es 2enAricas
$O"ICIO,E
Posiciona o arquivo em um determinado registro.
Sintaxe: Posicione(ExpC1, ExpN1, ExpC2, ExpC3)
32
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)
E)IA
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.
"OA%
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)
Hun4es Cont5)eis
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
32
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 - Cdi!o da conta "e
ExpC2 - Cdi!o da conta #t$
ExpN1 - Re%erente ao m&s
Exp N2 - Moeda dese'ada para o(ten)*o do valor
Ex+: SomaMovim(,-1./-0,,-1./10,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
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)
32
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:
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, sendo que este
dever ser orado na contabilidade para o ms "07 e na moeda "1. Para tanto, cria-se em 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 "<<< Orado
>>>
Para inibir a impresso destas clulas, basta acessar as suas propriedades e desabilitar a visibilidade.
SALDOCUSTO
32
Calcula o saldo dos centro de custos extracontbeis.
#inta-e%
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 apresentada. 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 31101001.
Hun4es Hinanceiras
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.)
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.)
32
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)
RO(EIRO PARA I)S(AA*+O !O (OP,O))E,( ,O- S./SER0ER 1.0 -I,ROSOF(
2
O Windows NT 4.0 deve ser da verso em ingls e Ter o service Pack atualizado(caso possua
estaes Workstation as recomendaes de service pack atualizado deve ser aplicado na estao).
Na instalao do SQL de ser selecionada a opo Custom Character Set/sort order/Unicode
Collation/Character Set: 1252/ISO CHARACTER SET (DEFAULT)
32
SORT ORDER: BINARY ORDER E UNICODE COLLATION/LOCALE IDENTIFIER:BINARY ORDER
No "Query Analyzer"(Ferramenta do SQL/Server 7.0) executar SP_HELPSORT, para verificar se o
SQL, est Configurado como Binary Order ("Sort Order = 50, bin_iso_ ), caso no esteja DEVER
SER REFEITA A INSTALAO DO SW3 S'RV'R.
Acessar a Ferramenta Enterprise Manager do Microsoft SQL/Server 7.0, no servidor SQL destinado
para o Siga, abrir a rvore indicada pelo sinal de "+" ao lado esquerdo deste Server.
Abrir a pasta Databases, clique com o boto direito sobre qualquer Database e escolha New
Database. Onde o Nome deste Database, por exemplo, ser DADOSADV, cria-lo com o tamanho
previamente definido e demais parametros default , e em TRANSACTIO 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, o tamanho tambm dever ser previamente definido. Ex.: DATABASE
500MB e em TRANSACTION LOG 150MB.
'm PROP'RTH'SXOPTHO!S do /?T?B?S' a opo "+runcat Log on Chec"point", tem a funo
de estratgia de Backup, se a empresa optar por efetuar Backup`s de Log, tal opo poder ficar
desmarcada.
?+ora entre em SecuritK e em 3o+ins, e com o boto direito sobre qualquer outro login, escolha
New Login, seguindo o exemplo, Nome = SIGA, ativar o SQL Server authentication Password =
SIGA, Server Roles marcar a opo SYSTEM ADMINSTRATORS e em DATABASE ACCESS atribuir
permisses (permit) para o database criado, no caso DADOSADV.
A parte do #!L #erver est; pronta* Agora resta apenas a configurao do +OPConnect 2anager e
do #igaAdv*
Hnstalar o TOP(onnectB e ap*s o termino do HnstallB encerrar todos os servi)o e reiniciar o
ServidorB Caso o processo seja de Atuali<ao do +OPConnectJ@ para +OPConnectJK3 deve ser
efetuada a remoo do +OPConnectJ@5e o 4ue for referente ao topconnect) atravAs de Adicionar e
Remover Programas 4ue est; no Painel de Controle do /indoIs >+3 antes de 'nstalar o
+OPConnectJK*
(opconnec"_3 / Em Propriedades de Ambiente. Configurao do O/B( SW3 Server Setup :
>ame = TOPSQL, SER0ER=(nome do servidor ) (aso o TOPconnect este.a no mesmo
servidor que o SW3XServer deve7se manter a op)o 3O(?3 - Desta forma a conexo entre o
TOPConnect e o SQL no estar trafegando na Rede $ , )EX(4.
Marcar a opes () With SQL Server authentication using a login ID .... e [] Connect to SQL Server
to obtain default setings .... Login ID : SH-? B Password .:SH-?C )EX(4
Marcar.: [] Change the default database to: ( Selecionar o Database criado para o Siga) e
desmarcar as opes [] Use ANSI quoted e [] Use ANSI nulls, paddings and warnings . )EX(4.
Prxima tela marcar [] Perform Translation for character data, e 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 de srie, da mquina e assim entrar em contato com o suporte
Topconnect ((3H'!T' /'V'RY '!TR?R 'M (O!T?TO (OM O ?T'!/HM'!TO /O /HSD7
SH-?CI 5200116&Z[17\1226para obter a chave de acesso conforme a quantidade de usurios
adquiridos.
SH-? ?/V?!('/ ]C 2\ I No diretrio Sigaadv\WINSQL, existe um arquivo chamado ADV97.INI.
Edite-o, os parmetros corretos para o SigaAdv com SQL Server so: /atabase = MSSW3\, ?lias
= TOPSW3, (ontKpe = NPIPE, Server = NOME do servidor NT com o TOPConnect.
33
?P^ I Localizar em AP5\BIN o arquivo AP5SRV.ini e edita-lo, neste arquivo dever ser configurado
a clausula [TOPCONNECT] como segue o exemplo conformo o padro adotado neste roteiro:
[TopConnect]
DataBase=MSSQL7
Server= *nome do servidor ou o endereo IP do servidor
ALIAS=TOPSQL
Contype=NPIPE ou Contype=TCPIP *dependendo da opo do Server.
(aso se.a necessrio a mi+ra)o de base /B4 para o Banco verifique, antes de executar 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 TOPCONNECT EM
OUTRO NT".
No 1 Instalar o SQL SERVER. No 2 instalar o client do SQL e o topconnect, e apontar o client para
a 1 mquina, o TOPCONNECT deve apontar para o SQL Server (1 mquina) o ADV97.INI dever
indicar o nome do servidor da 2 mquina, aonde o Topconnect est instalado.
ftp://ftp.microsiga.com.br/topconnect/nt - Download Instalador do TOPConnect_2.
1C1C ?mbiente /ese.vel para uma instala)o de %^ usuriosI
Servidor Eindo"s !T ]C2 com Top(onnectB Banco de dados
MsSqlXOracleXHnNormi0XCCCB Si+a?dvancedX?P^C
- Memria = 512 MB ou mais
- Discos = 2 discos SCSI com 9GB de 80mbit/s com dois adaptadores para
garantir acesso simultaneo dos discos. Para base de dados
grandes (com mais de 1GB de dados) recomendamos um Disk
Array do tipo Raid-5 de 4 Discos de 9GB com memria de 256 a
512 para cache de leitura.
- Processador = 2 processador Pentium III Xeon 500mhz com 512 de cache.
- Rede = Adaptador de 100 mbits, utilizar swite(no cascatear Hubs)
RO(EIRO PARA I)S(AA*+O !O (OP,O))E,( MSSW3 %222
Processo de instalao do SQL 2000 - Criao de Instance.
1. SQL SERVER 2000 COMPONENTS
2. INSTALL DATABASE SERVER
Locall Server
Create a New Instance of SQL Server or Install Client Tools
Server and Client Tools
A proxima opo ir definir a criao de uma Instance para isto desmarque a opo Default.,
caso pemanea marcado, ser criado uma instace como er no SQL 7.0.
33
Na proxima opo selecionar a forma Custom, que permitirar selecionar o local para a
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) Character Set.
NETWORK LIBARIES <next> START COPYING FILES <next>
Segue o resultado do Query Analyzer ao executar o sp_helpsort :3atin17-eneralB binarK
sort Nor Unicode /ataB SW3 Server Sort Order &2 on (ode Pa+e ]&\ Nor non7
Unicode /ata
Acessar a Ferramenta Enterprise Manager do Microsoft SQL/Server 2000, no servidor SQL
destinado para o Siga, abrir a rvore indicada pelo sinal de "+" ao lado esquerdo deste Server.
Abrir a pasta Databases, clique com o boto direito sobre qualquer Database e escolha New
Database. Onde o Nome deste Database, por exemplo, ser DADOSADV, cria-lo com o tamanho
previamente definido e demais parametros default , e em TRANSACTIO 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, o tamanho tambm dever ser previamente definido. Ex.: DATABASE
500MB e em TRANSACTION LOG 150MB.
'm PROP'RTH'SXOPTHO!S do /?T?B?S' a opo "+runcat Log on Chec"point", tem a funo
de estratgia de Backup, se a empresa optar por efetuar Backup`s de Log, tal opo poder ficar
desmarcada.
?+ora entre em SecuritK e em 3o+ins, e com o boto direito sobre qualquer outro login, escolha
New Login, seguindo o exemplo, Nome = SIGA, ativar o SQL Server authentication Password =
SIGA, Server Roles marcar a opo SYSTEM ADMINSTRATORS e em DATABASE ACCESS atribuir
permisses (permit) para o database criado, no caso DADOSADV.
A parte do #!L #erver est; pronta* Agora resta apenas a configurao do +OPConnect 2anager e
do #igaAdv*
Hnstalar o TOP(onnectB e ap*s o termino do HnstallB encerrar todos os servi)o e reiniciar o
ServidorB Caso o processo seja de Atuali<ao do +OPConnectJ@ para +OPConnectJK3 deve ser
efetuada a remoo do +OPConnectJ@5e o 4ue for referente ao topconnect) atravAs de Adicionar e
Remover Programas 4ue est; no Painel de Controle do /indoIs >+3 antes de 'nstalar o
+OPConnectJK*
(opconnec"_3 / Em Propriedades de Ambiente. Configurao do O/B( SW3 Server Setup :
>ame = TOPSQL, SER0ER=(nome do servidor ) (aso o TOPconnect este.a no mesmo
servidor que o SW3XServer deve7se manter a op)o 3O(?3 - Desta forma a conexo entre o
TOPConnect e o SQL no estar trafegando na Rede $ , )EX(4.
Marcar a opes () With SQL Server authentication using a login ID .... e [] Connect to SQL Server
to obtain default setings .... Login ID : SH-? B Password .:SH-?C )EX(4
33
Marcar.: [] Change the default database to: ( Selecionar o Database criado para o Siga) e
desmarcar as opes [] Use ANSI quoted e [] Use ANSI nulls, paddings and warnings . )EX(4.
Prxima tela marcar [] Perform Translation for character data, e 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 de srie, da mquina e assim entrar em contato com o suporte
Topconnect ((3H'!T' /'V'RY '!TR?R 'M (O!T?TO (OM O ?T'!/HM'!TO /O /HSD7
SH-?CI 5200116&Z[17\1226para obter a chave de acesso conforme a quantidade de usurios
adquiridos.
,IE)(E SI5AA!0A),E!
No diretrio AP5\BIN, existe um arquivo chamado AP5SRV.INI. Edite-o, os parmetros corretos
para O PROTHEUS com SQL Server so: Database = MSSW3\, Alias = TOPSQL, Contype = NPIPE,
Server = NOME do servidor NT com o TOPConnect.
ftp://ftp.microsiga.com.br/topconnect/nt - Download de executveis para TOPConnect e das
atualizaes do TOPConnect_2.
R,A[\3 D RR3S D3 T3PC3&&CT
Constant Name: TCF_NoError
Value: 0
Meaning: A Chamada da Funo no foi completada como desejada.
--------------------------------------------------------------------------------
Constant Name: TCF_NoRouterInstalled
Value: -1
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
33
Recovery:
--------------------------------------------------------------------------------
Constant Name: TCF_No_More_Connections
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 AS/400.
Recovery: Verifique o identifier de tabela utilizado em abertura.
--------------------------------------------------------------------------------
Constant Name: TCF_InvalidProgram
Value: -12
Meaning: O programa especificado na funo do TC_Call no pode ser encontrado.
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
33
Meaning: Voc tem especificado um nmero de campo chave maior que o arquivo, como uma funo
de acesso chave.
Recovery: Veja o valor de parmetro do n_keys
--------------------------------------------------------------------------------
Constant Name: TCF_TooManyFiles
Value: -16
Meaning: Voc est tentando abrir um arquivo, mas o nmero de mximo de arquivos ao servidor
excedeu.
Recovery: Feche um dos arquivos abertos e tente abrir o arquivo outra vez.
--------------------------------------------------------------------------------
Constant Name: TCF_InvalidNumRecs
Value: -17
Meaning: Um nmero negativo est especificado no parmetro do lock_or_count da operao
multiple-read
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
33
Value: -23
Meaning: O arquivo no pode ser aberto.
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 campo 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_Multiple.
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 em registro. Voc pode estar tentado escrever um
registro com uma chave duplicada ou database est cheio.
--------------------------------------------------------------------------------
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.
--------------------------------------------------------------------------------
33
Constant Name: TCF_DeleteFailed
Value: -30
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 com o AS/400 no pode ser completada porque a chave do
TOPConnect invlida ou est expirada.
--------------------------------------------------------------------------------
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 ter o desempenhado necessario devido insuficincia de memria
corrente para a situao.
--------------------------------------------------------------------------------
Value: -90
Meaning: " Memria Insuficiente"
Recovery: Indica que o trabalho no pode ser feito devido a insuficincia de Memria do PC . Corrija a
situao.
33
KardlocX
1-) Qual o objetivo doHardlock ?
Juntamente com a verso 7.10 a Microsiga disponibiliza um hardware 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 eficientes para
proteger o sistema contra acessos indevidos. Aliado a isso, mais agilidade no processo de liberao de
senhas e ganho de performance nos processos de controle aos acessos simultneos (semaforizao)
so obtidos.
--------------------------------------------------------------------------------
2-) O cliente recebeu a verso 7.10 mas ainda no recebeu o "Hardlock o que deve-se fazer ?
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 acima !
--------------------------------------------------------------------------------
3-) Com quem devo falar na Microsiga para solicitar a contra senha do "Hardlock ?
O prprio Departamento de Senhas o responsvel pela liberao e envio das contra-senhas do
"Hardlock.
--------------------------------------------------------------------------------
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 usurias do
sistema, enquanto o "Hardlock responsvel pela criptografia dos dados, assim como o controle 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 ambiente 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, portanto,
seu uso est liberado. O nmero de registros que antes era limitado a 50 passa a no existir 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 colocado em uso, falhar?
Para este caso existe o procedimento de liberao da senha de emergncia, que neste caso, ir liberar
o uso do sistema at que a substituio ou manuteno seja realizada. Em caso de falha constatada
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 ?
33
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.
--------------------------------------------------------------------------------
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 instalou novamente,
mudou para uma mquina nova, etc. O mesmo "Hardlock funcionar?
Ir funcionar normalmente desde que seja instalado novamente, e reconfigurado o AP7SRV.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 servidor em que ser instalado o
"Hardlock.
--------------------------------------------------------------------------------
12-) Possuo um ambiente com trs "sites" distintos, onde dois deles esto centralizados e o terceiro
esta trabalhando de forma independente ? Como este ambiente dever ser com a utilizao do
"Hardlock ?
Contratualmente a Microsiga exige um contrato para cada localidade ( fsica ), portanto, 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 salientar que a Microsiga fornece
gratuitamente 1 "Hardlock para cada contrato de manuteno vigente e caso exista apenas um
contrato de manuteno, o cliente dever adquirir mais um "Hardlock pelo preo de US$ 43,55
--------------------------------------------------------------------------------
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 venha 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 caractersticas 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.
33
--------------------------------------------------------------------------------
17-) Caso o cliente seja um "DataCenter " e tenha um nmero de licenas que deva ser distribudo
para cada um de seus clientes, o que fazer ?
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 "CHKEXEC alm
da utilizao da chave "SEMAFOROKEY no ambiente ("Environment corrente) que est configurado
no AP7SRV.INI
--------------------------------------------------------------------------------
18-) Como configurar o servidor de licenas ?
O prprio instalador do AP7 solicita as informaes necessrias durante este processo para se utilizar
o "Hardlock. No arquivo .INI do Servidor do AP7, havero duas sesses conforme abaixo:
[LICENSESERVER]
enable=1
port=porta-do-license-server
[LICENSECLIENT]
server=nome-do-servidor
port=porta-do-license-server
--------------------------------------------------------------------------------
19-) Preciso um servidor de licena para cada servidor de processamento do Protheus?
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-) Podemos ter mais de um "HardLock no mesmo servidor ?
Sim, mas apenas um da Microsiga.
/# Programando com Schedule de Relatorios
Abrangncia
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 pela
funo SetPrint. Sendo assim, no suportado interface com data 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) este procedimento dever ser
adotado corretamente.
Caso exista alguma entrada de dados que seja possvel ser assumida qualquer valor apenas no
schedule deve-se adotar o seguinte procedimento :
Usar a varivel __cInternet, que se estiver com valor .T. (Verdadeiro) estamos no processo de
schedule.
Instrues para instalao das Storeds Procedures
34
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 )
2. Instalando o .pat 6se 7o$8er9.
Abra o IDE do Protheus, selecione o menu Ferramen"as :4 Ap%ica;o de Pa"c7s. 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 situao 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 produtos 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 das 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 @microsiga.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 Am<ien"e :4 ,adas"ros :4 S"ored Proced$res.
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 (4-_2^156C
Variveis Pblicas Disponveis no Protheus

dDataBase (D, 8) Contm a data selecionada na entrada do sistema.
cUsuario (C, 533) 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 5!2 d"itos#
cSenha (C, 6) Senha do Usurio.
cUserName (C, 15) Nome do Usurio sem brancos a direita.
cAcesso (C, 128) Permisses de Acesso do Usurio.
__UserID (C, 6) Nmero de identificao do usurio no cadastro
de usurios. Ex.: 000006.
34
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.
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) Nmero da Empresa que est em uso no momento.
Ex.: 55.
cFilAnt (C, 2) Nmero da Filial que est em uso no momento.
Ex.: 01.
cArqEmp (C, 12) Nome do arquivo de empresas com sua extenso.
Ex.: SIGAMAT.EMP.
cArqMnu (C, 12) Nome do arquivo de menu que est em uso no
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) Verso do Sistema.
tInicio (C, 8) Horrio em que foi iniciado o sistema no formato
HH:MM:SS.
__Language (C) Lngua atual do Sistema. Ex.: PORTUGUESE.
cPaisLoc (C, 3) Sigla do Pais para qual est configurado o
Sistema. Ex.: BRA.
__TTSinUse (L) Indica se o controle de transaes est ativo no
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.
34

Você também pode gostar