A Biblia Do Advpl
A Biblia Do Advpl
A Biblia Do Advpl
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.
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
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.
Estruturao
A estrutura de diretrios do Advanced Protheus
A estrutura de diretrios do Advanced Protheus depende da verso instalada.
Verso AP5
\ap5\ \ap5\apo\ \ap5\bin\ \ap5\sigaadv\ Diretrio inicial do Protheus. a partir deste diretrio que o sistema ir localizar os caminhos informados em parmetros, customizaes, etc. Diretrio onde sero localizados os arquivos de repositrio de APOs. Diretrio onde so localizados os arquivos do ncleo do Protheus: executveis, bibliotecas de carga dinmica (DLLs) e arquivos de configurao do sistema. 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. 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\dadosadv\
Similar ao \RELATO\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de arquivos de impresso em disco. Similar ao \CPROVA\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de arquivos de contabilizao. Diretrio de localizao de programas de exemplo escritos em AdvPl, nos padres definidos pela Microsiga Software S.A. Diretrio de arquivos de incluso padro (extenso .CH) necessrios para a compilao de programas escritos em AdvPl. Diretrio de ferramentas adicionais do Protheus.
Verso AP6
\ap6\ \ap6\apo\ \ap6\bin\server\ \ap6\bin\remote\ Diretrio inicial do Protheus. a partir deste diretrio que o sistema ir localizar os caminhos informados em parmetros, customizaes, etc. Diretrio onde sero localizados os arquivos de repositrio de APOs. Diretrio onde so localizados os arquivos do ncleo do Protheus Server: executveis, bibliotecas de carga dinmica (DLLs) e arquivos de configurao. Diretrio onde so localizados os arquivos das aplicaes clientes (Remote, IDE, Monitor, etc): executveis, bibliotecas de carga dinmica (DLLs) e arquivos de configurao. 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. 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. Similar ao \RELATO\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de arquivos de impresso em disco. Similar ao \CPROVA\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de arquivos de contabilizao. Diretrio de localizao de programas de exemplo escritos em AdvPl, nos padres definidos pela Microsiga Software S.A. Diretrio de arquivos de incluso padro (extenso .CH) necessrios para a compilao de programas escritos em AdvPl.
\ap6\sigaadv\
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.
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.
IDE
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.
Monitor
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).
Nomenclaturas Utilizadas
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.
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.
Server
MASTER
Server
Configurando o Servidor Master 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: [ServerNetwork] 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 [Server2] TYPE=TCPIP Server=SIGASERVER2 Connections=20 [Server3] TYPE=TCPIP
Server=SIGASERVER3 Connections=30 Configurao dos outros Servidores Como j foi citado acima, nos demais servidores a nica coisa que ser alterada o 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: [Environment] SourcePath=C:\AP5\APO RootPath=\\SIGAMASTER\AP5 veja que o raiz est sendo apontado para o servidor Master. StartPath=\SIGAADV\ (demais configuraes continuam iguais) Observaes Cada servidor dever ter o seu build e repositrio, sendo que a base de 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.
Caractersticas do IDE
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.Criao do cdigo atravs 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.Montagem do Grupo de Projetos. O Grupo de Projetos um gerenciador existente dentro do IDE, onde o usurio pode manter os arquivos de cdigo separados por projetos e pastas. Com um grupo de projetos os arquivos podem ser organizados de uma forma lgica, em projetos e pastas. 3.Compilao. Durante a compilao, os arquivos so enviados ao Protheus Server. Toda a compilao e a gravao no repositrio so efetuadas no servidor.
4.Depurao. O IDE permite aos usurios depurar as rotinas criadas, executando-as linha a linha ou em modo de animao. Permite visualizar informaes como variveis em diferentes escopos, pilha de chamadas, lista de break points, etc. 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;
Monitor
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.
Btrieve
Informaes Bsicas
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;
Configurao do Btrieve/PervasiveSQL2000:
Para configurar o Btrieve Server deve-se executar os seguintes passos: 1.Terminar a execuo do Protheus e parar o servio w32mkde; 2.Deletar os arquivos binrios 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:
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
Informaes Bsicas
Para manipulao de tabelas Ctree o driver utilizado CTREECDX; Para programar algo especfico para o Ctree pode-se utilizar o teste #ifdef CTREE; A extenso padro das tabelas .dtc. Quando o LocalFile estiver utilizando o 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 recrilos 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.
A Linguagem AdvPl
A Linguagem AdvPl teve seu incio em 1994, sendo na verdade uma evoluo na utilizao de linguagens no padro xBase pela Microsiga Software S.A. (Clipper, Visual Objects e depois FiveWin). Com a criao da tecnologia Protheus, era necessrio criar uma linguagem que suportasse o padro 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 APOs (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:
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 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 Web
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 TelNet
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.
Linhas 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.
Linhas 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
Linhas de Comentrio
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.
Linhas Mistas
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 Linha
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 utilizandose 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.
Estrutura 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 Identificao
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.
O Corpo do Programa
nesta rea que se encontram as linhas de cdigo do programa. onde se realiza a tarefa necessria atravs da organizao lgica destas linhas de comando. Espera-se que as linhas de comando estejam organizadas de tal modo que no final desta rea o resultado esperado seja obtido, seja ele armazenado em um arquivo ou em variveis de memria, pronto para ser exibido ao usurio atravs de um relatrio ou na tela. // Clculo do fatorial For nCnt := nFator To 1 Step -1 nResultado *= nCnt Next nCnt
A rea de Encerramento
nesta rea onde as finalizaes so efetuadas. onde os arquivos abertos so fechados, e 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:
Numrico
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:
Uma varivel do tipo de dado numrico pode conter um nmero de dezoito dgitos incluindo o ponto flutuante, no intervalo de 2.2250738585072014 E308 at 1.7976931348623158 E+308.
Lgico
Valores lgicos em AdvPl so identificados atravs de .T. ou .Y. para verdadeiro e .F. ou .N. para falso (independentemente se os caracteres estiverem em maisculo ou minsculo).
Caracter
Strings ou cadeias de caracteres so identificadas em AdvPl por blocos de texto 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.
Matriz (Array)
Matrizes so um tipo de dado especial. a disposio de outros elementos em colunas e linhas. O AdvPl suporta matrizes uni ou multidimensionais. Os elementos de uma matriz so 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.
Bloco de Cdigo
O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues escritas em AdvPl que podero ser executadas posteriormente.
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. Limitao 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 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 Local xVariavel // Declara a varivel inicialmente com valor nulo xVariavel := "Agora a varivel caracter..." Alert("Valor do Texto: " + xVariavel) xVariavel := 22 // Agora a varivel numrica Alert(cValToChar(xVariavel)) xVariavel := .T. // Agora a varivel lgica If xVariavel Alert("A varivel tem valor verdadeiro...") Else Alert("A varivel tem valor falso...") Endif xVariavel := Date() // Agora a varivel data Alert("Hoje : " + DtoC(xVariavel)) xVariavel := nil // Nulo novamente Alert("Valor nulo: " + xVariavel) Return
No programa de exemplo anterior, a varivel xVariavel utilizada para armazenar 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.
Matrizes
Matrizes, ou arrays, so colees de valores. Ou, de uma maneira mais fcil de entender, uma lista. Uma matriz pode ser criada atravs de diferentes maneiras. Consulte a documentao sobre Inicializao de Matrizes para maiores detalhes. Cada item em uma matriz referenciado pela indicao de sua posio numrica na lista, iniciando pelo nmero 1. O exemplo a seguir declara uma varivel, atribui uma matriz de trs 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 // Exibe o tamanho da matriz
Alert(cValToChar(Len(aLetras)))
O AdvPl permite a manipulao de matrizes facilmente. Enquanto que em outras linguagens como C ou Pascal necessrio alocar memria para cada elemento de uma 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
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.} } aFuncts uma matriz com 3 linhas por 3 colunas. Uma vez que as variveis separadas foram combinadas em uma matriz, os nomes podem ser exibidos assim: Local nCount For nCount := 1 To Len(aFuncts) Alert(aFuncts[nCount,FUNCT_NOME]) // O acesso a elementos de uma matriz multidimensional // pode ser realizado tambm desta forma: // aFuncts[nCount][FUNCT_NOME] Next nCount
A varivel nCount seleciona que funcionrio (ou que linha) de interesse. Ento a constante FUNCT_NOME seleciona a primeira coluna daquela linha.
Inicializando Matrizes
Algumas vezes o tamanho da matriz conhecido previamente. Outras vezes o tamanho da matriz s ser conhecido em tempo de execuo.
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 0s na lista encerrada entre chaves ({}). Claramente, este mtodo no o utilizado para criar uma matriz de 1000 elementos. O terceiro mtodo difere dos anteriores 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.
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).
Blocos 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.
Um Primeiro Lembrete
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".
Outro Lembrete
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.
Lista de Expresses
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.
Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento impresso.
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.
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.
{|| 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}
Passando Parmetros
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
Esta linha de cdigo declara uma varivel chamada nNumero indicando que pertence seu escopo local. Os identifadores de escopo so:
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.
Variveis Locais
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.
Variveis Estticas
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: Function Pai() 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.
Variveis 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 pblicas) 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: Function Pai() Private nVar := 10 . <comandos> . Filha()
. <mais comandos> . Return(.T.) Neste exemplo, a varivel nVar criada como privada e inicializada com o valor 10. Quando a funo Filha executada, nVar ainda existe e, diferente de uma varivel local, pode ser acessada pela funo Filha. Quando a funo Pai terminar, nVar ser destruda e qualquer declarao de nVar anterior se tornar acessvel novamente.
Variveis Pblicas
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).
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.
Operadores 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.
Operadores Matemticos
Os operadores utilizados em AdvPl para clculos matemticos so: + * / ** ou ^ % Adio Subtrao Multiplicao Diviso Exponenciao Mdulo (Resto da Diviso)
Operadores de String
Os operadores utilizados em AdvPl para tratamento de caracteres so: + $ Concatenao de strings (unio) Concatenao de strings com eliminao dos brancos finais das strings intermedirias Comparao de Substrings (contido em)
Operadores Relacionais
Os operadores utilizados em AdvPl para operaes e avaliaes relacionais so: < > = Comparao Menor Comparao Maior Comparao Igual
Comparao Exatamente Igual (para caracteres) Comparao Menor ou Igual Comparao Maior ou Igual Comparao Diferente
Operadores Lgicos
Os operadores utilizados em AdvPl para operaes e avaliaes lgicas so: .And. .Or. .Not. ou ! E lgico OU lgico NO lgico
Operadores de Atribuio
Os operadores utilizados em AdvPl para atribuio de valores a variveis de memria so: = := += -= *= /= **= ou ^= %= Atribuio Simples Atribuio em Linha Adio e Atribuio em Linha Subtrao e Atribuio em Linha Multiplicao e Atribuio em Linha Diviso e Atribuio em Linha Exponenciao e Atribuio em Linha Mdulo (resto da diviso) e Atribuio em Linha
Atribuio Simples
O sinal de igualdade utilizado para atribuir valor a uma varivel de memria. nVariavel = 10
Atribuio em Linha
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.
Atribuio 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 += -= *= /= **= ou ^= %= Exemplo X += Y X -= Y X *= Y X /= Y X **= Y X %= Y Equivalente a X=X+Y X=X-Y X=X*Y X=X/Y X = X ** Y X=X%Y
Operadores de Incremento/Decremento
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.
Operadores Especiais
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 precedncia 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 -> 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 & 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.
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 Precedncia
A utilizao de parnteses dentro de uma expresso altera a ordem de precedncia dos operadores. Operandos entre parnteses so analisados antes dos que se encontram fora dos 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.
Macro Substituio
O operador de macro substituio, simbolizado pelo "e" comercial (&), utilizado para a avaliao de expresses em tempo de execuo. Funciona como se uma expresso 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. Podese 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.
Controlando o Fluxo
O AdvPl suporta vrias estruturas de controle que permitem mudar a seqncia de fluxo de execuo de um programa. Estas estruturas permitem a execuo de cdigo baseado em condies lgica e a 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
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
FOR...NEXT e o comando
WHILE...ENDDO.
O Comando FOR...NEXT
A estrutura de controle FOR...NEXT, ou simplesmente o loop FOR, repete uma seo de cdigo em um nmero determinado de vezes. Sintaxe FOR Variavel := nValorInicial TO nValorFinal [STEP nIncremento]
Comandos... [EXIT] [LOOP] NEXT Parmetros 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.
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. 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. Especifica um ou mais instrues de comando AdvPl que sero executadas. 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. 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.
Comandos EXIT
LOOP
Comentrios 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.
Exemplo Local nCnt Local nSomaPar := 0 For nCnt := 0 To 100 Step 2 nSomaPar += nCnt Next Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) ) Return 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.
O Comando WHILE...ENDDO
A estrutura de controle WHILE...ENDDO, ou simplesmente o loop WHILE, repete uma seo de cdigo enquanto uma determinada expresso resultar em verdadeiro (.T.).
Parmetros 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. Especifica um ou mais instrues de comando AdvPl que sero executadas enquanto lExpressao for avaliado como verdadeiro (.T.). 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. 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.
Comandos EXIT
LOOP
Comentrios 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.
Exemplo 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
Desviando a Execuo
Estruturas de desvio so deseginadas para executar uma seo de cdigo se determinada condio lgica resultar em verdadeiro (.T.). Em AdvPl existem dois comandos para execuo de sees de cdigo de acordo com avaliaes lgicas. O comando IF...ENDIF e o comando DO CASE...ENDCASE.
O Comando IF...ENDIF
Executa um conjunto de comandos baseado no valor de uma expresso lgica. Sintaxe IF lExpressao Comandos [ELSE Comandos...] ENDIF Parmetros lExpressao Especifica uma expresso lgica que avaliada. Se lExpressao 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. Conjunto de comandos AdvPl que sero executados dependendo da avaliao da expresso lgica em lExpressao.
Comandos
Comentrios Pode-se aninhar um bloco de comando IF...ENDIF dentro de outro bloco de comando IF...ENDIF. Porm, para a avaliao de mais de uma expresso lgica, deve-se utilizar o comando DO CASE...ENDCASE. Exemplo Local dVencto := CTOD("31/12/01") If Date() > dVencto Alert("Vencimento ultrapassado!") Endif Return
O Comando DO CASE...ENDCASE
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em verdadeiro (.T.).
Sintaxe DO CASE CASE lExpressao1 Commandos [CASE lExpressao2 Commandos ... CASE lExpressaoN Commandos] [OTHERWISE Commandos] ENDCASE Parmetros CASE 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). 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.
OTHERWISE Commandos
Comentrios O Comando DO CASE...ENDCASE utilizado no lugar do comando IF...ENDIF quando um nmero maior do que uma expresso deve ser avaliada, substituindo a necessidade de mais de um comando IF...ENDIF aninhados.
Exemplo Local nMes := Month(Date()) Local cPeriodo := "" DO CASE CASE nMes <= 3 cPeriodo CASE nMes >= 4 cPeriodo CASE nMes >= 7 cPeriodo OTHERWISE cPeriodo ENDCASE Return
:= "Primeiro Trimestre" .And. nMes <= 6 := "Segundo Trimestre" .And. nMes <= 9 := "Terceiro Trimestre" := "Quarto Trimestre"
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. FUNO AADD (<matriz>,<expr>) Adiciona dinamicamente um novo elemento, com o valor da expr no fim da matriz. aArray := {} AADD(aArray, 5) AADD(aArray, 10) AADD(aArray, { 12, 10 } FUNO ABS (<exprN>) Retorna o valor absoluto (valor numrico no negativo) de exprN FUNO ASC (<exprC>) // Result: aArray is an empty array // Result: aArray is { 5 } // Result: aArray is { 5, 10 } // Result: aArray is { 5, 10, { 12, 10 } }
Retorna o codigo ASCII do primeiro caractere da expreC FUNO AT (<exprC1>,<exprC2>) Retorna a posio inicial de exprC1 em exprC2. Se no encontrar, retorna o valor 0. FUNO BOF () Retorna .T. se o inicio do banco de dados ativo for atingido com um camando SKIP n. FUNO BREAK (<expr>) Sai fora da sequencia corrente, exatamente com a declarao BREAK. FUNO CDOW (<expr>) Retorna l nome do dia da semana (Sanday-Saturday). FUNO CHR (<expr>) Retorna o caractere ASCII equivalente ao cdigo exprN. FUNO CMONTH (<exprD>) Retorna o nome do ms (janeiro-dezembro) da expresso tipo data. FUNO COL () Retorna o nmero da coluna do vdeo onde o curso est posicionado. FUNO CTOD (<exprC>) Retorna a exprC convertida para o formato tipo data. FUNO DATE (<expr>) Retorna a data mantida pelo Sistema Operacional. FUNO DAY (<expr>) Retorna o nmero do dia (1-31) da expreo tipo data exprD. FUNO DBGOTOP () Posiciona o indicador de registro no primeiro registo do banco de dados ativo. FUNO DBSEEK (<expr>,<exprL>) Posiciona no primeiro registro cuja chave da indice satisfaa a expresso. FUNO DBSELECTAREA (<narea>,<alias>) Seleciona a rea de trabalho especificada. FUNO DBSETFILTER (<bloco>,[exprC]) Define um filtro. Bloco Bloco de codigo que expressa a condio de filtro na executada, experC Valor que expresa a condio de filtro na forma textual. FUNO DBSETORDER (<exprN>) Designa como indice mestre o exprN-simo indice da lista de indices do banco de dados ativo.
Codificao Auto-Documentvel
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.
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"
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.
Utilizao 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 With "Grisalho" Else Replace hair With "Preto" Endif Endif Endif Endif Um cdigo de uma nica letra, (A at E), foi informado para indicar a cor de cabelo. 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
Constantes em Maisculo
Isto uma conveno que faz sentido. Em AdvPl, como em C por exemplo, a regra utilizar todos os caracteres de uma constante em maisculo, a fim de que possam ser claramente reconhecidos como constantes no cdigo, e que no seja necessrios lembrar onde foram declarados.
Utilizao de Identao
Este um hbito que todo programador deve desenvolver. No consome muito esforo para 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
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
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.
Utilizao de Comentrios
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
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
X Z ( !
Exibe DB depois de nmeros negativos Exibe zeros como brancos Envolve nmeros negativos entre parnteses Converte todos os carecteres alfabticos para maisculo
Templates X 9 # ! * . , Exibe dgitos para qualquer tipo de dado Exibe dgitos para qualquer tipo de dado Exibe dgitos para qualquer tipo de dado Converte caracteres alfabticos para maisculo Exibe asterisco no lugar de espaos em branco inicias em nmeros Exibe a posio do ponto decimal Exibe a posio do milhar
Comando GET
Funes A C E R S<n> X Z ( ) ! Permite apenas caracteres alfabticos Exibe CR depois de nmeros positivos Exibe numricos com o ponto e vrgula invertidos (formato Europeu) Insere caracteres diferentes dos caracteres de template na exibio mas no insere-os na varivel do GET Permite rolamento horizontal do texto dentro do GET, <n> um nmero inteiro que identifica o tamanho da regio Exibe DB depois de nmeros negativos 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
Prefcio
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!
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.
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.
Criao de Variveis
Na criao de uma varivel deve-se ter em mente alguns pontos fundamentais:
A Declarao
Deve ser feita sempre no incio da rotina que for utiliz-la, como no exemplo: Function a910VerCod() Local cCod910 := 001 Return
O Tipo de Varivel
O tipo de varivel serve para identificar a utilizao que a mesma ter no decorrer da 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 Existentes
PUBLIC: Esta varivel ser inicializada em um valor lgico falso (.F.) at que seja atribudo um valor especfico a ela. Esta varivel permanece definida por toda a durao da aplicao e pode 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. PRIVATE: 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. LOCAL: 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. STATIC: 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.
Inicializao
Quando no atribumos nenhum valor a uma varivel no momento de sua declarao, corremos o risco de utiliz-la com valor NIL e causar erros fatais. Por isso, a inicializao de uma varivel de extrema importncia.
Padronizao de Variveis
importante que ao lermos o nome de uma varivel, possamos saber se o seu tipo 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
Variveis de Relatrios
Na criao de um relatrio algumas variveis e seus tipos so convencionados para a utilizao da biblioteca de funes de relatrio. Varivel wnRel cbCont Cabec1 Cabec2 Cabec3 Tamanho cDesc1 cDesc2 cDesc3 Limite Titulo AReturn Nomeprog CString Li m_pg aOrd nLastKey Tipo Local Local Local Local Local Local Local Local Local Local Local Private Private Private Private Private Private Private Contedo Nome default do relatrio em disco Contador 1 linha do cabealho do relatrio 2 linha do cabealho do relatrio 3 linha do cabealho do relatrio Tamanho do Relatrio (P = Pequeno 80 colunas, M = Mdio 132 colunas, G = Grande, 220 colunas) 1 linha da descrio do relatrio 2 linha da descrio do relatrio 3 linha da descrio do relatrio Quantidade de colunas no relatrio (80,132,220) Ttulo do Relatrio Matriz com as informaes para a tela de configurao de impresso Nome do programa do relatrio Alias do arquivo principal do relatrio para o uso de filtro Controle das linhas de impresso. Seu valor inicial a quantidade mxima de linhas por pgina utilizada no relatrio Controle do nmero de pginas do relatrio 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 Utilizado para controlar o cancelamento da impresso do relatrio
cPerg aLinha
Private Private
Nome da pergunta a ser exibida para o usurio Matriz que contem informaes para impresso de relatrios cadastrais
Funo Posicione
Podemos tambm buscar uma informao em determinado campo usando apenas uma funo. Sintaxe: Posicione(cAlias, nOrdem, cChave, cCampo) Exemplo: Posicione("SB1", 1, xFilial("SB1") + cCodigo, "B1_DESC") 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.
Funo Existcpo
Retorna se determinada chave existe ou no no arquivo. Sintaxe : ExistCpo(cAlias,cChave,nOrdem) Exemplo : ExistCpo("SB1", 1, cCodigo, "B1_DESC") Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave cChave. E ser 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.
Outros Cuidados
Um dos cuidados que devemos ter quando da criao de relatrios contendo valores a utilizao dos subtotais e totais, a fim de evitar erros que podem ser desastrosos durante uma tomada de deciso errada devido a valores errados. A utilizao de somatrias deve ser bastante criteriosa a fim de no cometermos o erro de misturarmos unidades de medidas diferentes no mesmo clculo.
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.
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_FOLDER, 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_FOLDER 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.
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 Entrada
Dentro dos processos operacionais dos programas possvel criar aberturas que possibilitam a execuo de processos distintos a partir de uma rotina do sistema.
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 )
Contabilizando
A contabilizao de registros em um sistema ERP necessrio toda vez que houverem operaoes envolvendo valores na empresa, como por exemplo, a emisso de uma nota 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 Funo HeadProva
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 funo 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 funo RodaProva()
Esta funo ir cria a finalizao da contabilizao. Sintaxe: RodaProva(ExpN1, ExpN2) ExpN1 -> Handle retornado da funo anterior ExpN2 -> Valor Total da contabililizao No Final, ou seja, aps todos registros serem processados utilizar a funo CA100INCL(), cujo objetivo ler o arquivo gerado (.LAN), e gerar os lanamentos no arquivo SI2 (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
Atualizando SX (ATUSX)
O ATUSX uma ferramenta muito importante utilizada na manuteno dos arquivos customizadores internos: os arquivos SXs . nos arquivos SX que esto armazenadas todas as informaes padres necessrias para a criao de bases das empresas e efetuar possveis customizaes. Em uma atualizao de verso, o sistema ir fazer uma 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.
SX6 - Parmetros
Elemento chave para a execuo de um processamento, que determina diferentes resultados dependendo do seu contedo.
SX7 Gatilhos
Rotina ou operao que disparada a partir de um evento get.
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.
Uso de Strings
Para que o sistema possa ser utilizado em outros pases com lnguas diferentes ao invs de inserirmos diretamente os textos no fonte do relatrio utilizamos o recurso de 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.
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.
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.
Arquivos Compartilhados
Quando o arquivo est configurado para trabalhar no modo compartilhado (X2_MODO = C), este campo ser gravado com ( espaos ). Deste modo o registro ficara disponvel para todas as Filiais.
Arquivos Exclusivos
Quando o arquivo esta configurado para trabalhar no modo 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 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). se o arquivo for
A varivel cFilAnt contm a filial que o usurio est operando, e a varivel cEmpant contm a empresa e a filial
Chaves Primrias
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 Estrangeiras
um atributo cuja funo permitir relacionamento. Em uma tabela na qual o atributo chave externa ou estrangeira, em outra, o atributo deve ser chave primria, e os valores dos campos so necessrios.
Integridade Referencial
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.
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.
Quando 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.
Onde 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 Semforo
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.
Atualizao do SourceSafe
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 Localizaes
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).
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 [email protected] 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.
Modelo 1
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
Modelo 2
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 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
//"Rateios
@ 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.
Modelo 3
Este modelo de programa a juno dos Modelos 1 e 2. Nele exibido um Browse vertical e um Browse horizontal (ambos dependentes do dicionrio de dados). As validaes so genericamente herdadas do dicionrio de dados.
/*/ +---------------------------------------------------------------------------+ + 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 )
Modelos 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 posio de " Local cDesc2 := STR0002 //"estoque por Lote/Sub-Lote." Local cDesc3 := '' Local cString := 'SB8' Local Titulo := STR0003 //"Posicao de Estoque por Lote/Sub-Lote" Local Tamanho := 'M' Local wnRel := 'MATR425' +----------------------------------------------------------------+ | Variaveis Tipo Private padrao de todos os relatorios | +----------------------------------------------------------------+ Private aOrd := {STR0004,STR0005} //" Por Produto"###" Por Lote/Sub-Lote" Private aReturn := {STR0006,1,STR0007, 1, 2, 1, '',1 } //"Zebrado"###"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 " 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 " Cabec2 := STR0014 //" VALIDADE " EndIf +----------------------------------------------------------------+ | Pega o nome do arquivo de indice de trabalho | +----------------------------------------------------------------+
DATA
DATA
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
Modelos de Clculos
Existem diversas formas de se gerar uma rotina de clculo no sistema, no entanto o modelo bsico sempre se mantm. Abaixo mostramos um modelo-padro que utiliza as funes bsicas para 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/Cauo (FINA060) | | no sofrem mesmo tratamento dos TR bancarias do FINA100 | | Aclaracao : Foi incluido o tipo $ para os movimentos en di-- | | nheiro em QUALQUER moeda, pois o R$ nao e representativo | | fora do BRASIL. | +---------------------------------------------------------------+ If SE5->E5_TIPODOC $ "TR/TE" .and. Empty(SE5->E5_NUMERO) If !(E5_MOEDA $ " $ /R$/DO/TB/TC/CH"+IIf(cPaisLoc=="BRA","","/$ ")) dbSkip() Loop Endif Endif If E5_TIPODOC $ "TR/TE" .and. (Substr(E5_NUMCHEQ,1,1)=="*" ; .or. Substr(E5_DOCUMEN,1,1) == "*" ) dbSkip() Loop Endif If SE5->E5_MOEDA == "CH" .and. IsCaixaLoja(SE5->E5_BANCO) //Sangria dbSkip() Loop Endif If SubStr(E5_NUMCHEQ,1,1)=="*" //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/Cauo (FINA060) | | no sofrem mesmo tratamento dos TR bancarias do FINA100 | +---------------------------------------------------------------+ If E5_TIPODOC $ "TR/TE" .and. Empty(E5_NUMERO) If !(E5_MOEDA $ "R$/DO/TB/TC/CH") dbSkip() Loop Endif Endif If E5_TIPODOC $ "TR/TE" .and. (Substr(E5_NUMCHEQ,1,1)=="*" ; .or. Substr(E5_DOCUMEN,1,1) == "*" ) dbSkip() Loop Endif If E5_MOEDA == "CH" .and. IsCaixaLoja(E5_BANCO) //Sangria dbSkip() Loop Endif If SubStr(E5_NUMCHEQ,1,1)=="*" //cheque para juntar (PA) dbSkip() Loop Endif If !Empty(E5_MOTBX) 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
AbreExcl
Tipo: Processamento
Fecha o arquivo e reabre exclusivo. Esta funo fecha o arquivo cujo alias est expresso em <cAlias> e o reabre em modo exclusivo para proceder operaes em que isto necessrio, como por exemplo, PACK. Entretanto, prefervel utilizar o depurador do sistema para proceder estas operaes. Se outra estao estiver usando o arquivo, o retorno ser .F.. Sintaxe AbreExcl(cAlias) Parmetros cAlias Nome do Alias do Arquivo. Deve ter obrigatriamente sua estrutura definida no SX3. Exemplo // IF AbreExcl(inSI2li) Pack ENDIF AbreExcl( ) dbGoTop( )
MANUAL RDMAKE -
Activate Dialog
Tipo: Tela Windows Ativa uma janela previamente definida na funo Dialog e executa os GETs, botes e outros objetos. Sintaxe ACTIVATE DIALOG cVar <CENTERED> [On Init cFuncInit] [Valid cFuncValid] Parmetros cVar Varivel utilizada na funo Dialog para definio da janela. cFuncInit Funo executada automaticamente na abertura do dilogo na tela (Opcional). cFuncValid Funo executada para validar o fechamento da janela de dilogo. Deve retornar um valor lgico (.T. ou .F.) (Opcional) Comentrios A clusula <CENTERED> opcional, se omitida assume as coordenadas definidas na criao da janela. Exemplo Ver exemplo no programa RDDEMO apresentado no final deste Manual. Ver tambm Funo Dialog
ACopy
Copia os elementos de uma array para outra.
Sintaxe ACOPY( aOrigem, aDestino , [ nInicio ], [ nQtde ], [ nPosDestino ]) --> aDestino Argumento aOrigem aDestino Obrigat. Sim Sim Tipo A A Descrio o array que contm os elementos a serem copiados. o array que receber a cpia dos elementos.
nInicio
No
indica qual o ndice do primeiro elemento de aOrigem que ser copiado. Se no for especificado, o valor assumido ser 01. indica a quantidade de elementos a serem copiados a partir do array aOrigem. iniciando-se a contagem a partir da posio nInicio. Se nQtde no for especificado, todos os elementos do array aOrigem sero copiados, iniciando-se a partir da posio nInicio. a posio do elemento inicial no array aDestino que receber os elementos de aOrigem. Se no especificado, ser assumido 01.
nQtde
No
nPosDestino
Retorno
Descrio
ACOPY()
Descrio ACOPY() uma funo de array que copia elementos do array aOrigem para array aDestino. O array destino aDestino j deve ter sido declarado e grande o bastante para conter os elementos que sero 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 aDestino, conter o mesmo subarray. Portanto, ACOPY() no produzir uma cpia completa de array multidimensionais, Para fazer isso, uso a funo aClone().
Exemplos Este exemplo cria dois arrays, com um contedo cada. Os dois primeiros elementos 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 }
ADel
Exclui um elemento de um array.
Tipo A A
Descrio o array de onde ser excludo um item a posio a partir da 1, do qual ser excludo um elemento
Retorno ADEL()
Descrio 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.
AFILL() AINS()
ADir
Preenche vrios arrays com informaes de arquivos e diretrios.
Sintaxe ADIR([ cArqEspec ], [ aNomeArq ], [ aTamanho ], [ aData ], [ aHora ], [ aAtributo ]) --> Numrico Argumento Obrigat. Tipo Descrio 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 ( *.* ). Array de Caracteres. o array com os nomes dos arquivos encontrados na busca. O contedo anterior do array apagado.
cArqEspec
No
aNomeArq
No
aTamanho
No
aData
No
as
datas
de
modificao
dos
arquivos
aHora
No
Array de Caracteres. So os horrios de modificao dos arquivos encontrados. Cada elemento contm horrio no formato: hh:mm:ss. Array de Caracteres. So os atributos dos arquivos, caso esse array seja passado como parmetros, sero includos os arquivos com atributos de Sistema, Ocultos.
aAtributos
No
Retorno >=0
Descrio 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().
AEval
Executa um code block para cada elemento de um array.
Sintaxe AEVAL( aArray, bBloco, [ nInicio ], [ nQtde]) --> aArray Argumento aArray Obrigat. Sim Tipo A Bloco de cdigo Descrio o array que ser atravessado pelo bloco o bloco que ser executado para cada elemento do Array. a posio inicial. Se no for especificada o inicio ser a partir do 1. o numero de elementos que devem ser processados a partir de nInicio. O Valor padro so todos os elementos do nInicio at o final.
bBlock
Sim
nInicio
No
nQtde
No
Retorno AEVAL()
Descrio 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.
Exemplos // Exemplo 1 #include "Directry.ch" // LOCAL aFiles := DIRECTORY("*.dbf"), nTotal := 0 AEVAL(aFiles,{ | aDbfFile | QOUT(PADR(aDbfFile[F_NAME], 10), aDbfFile[F_SIZE]),; nTotal += aDbfFile[F_SIZE]); } ) // ? ? "Total Bytes:", nTotal // Exemplo 2 #include "Directry.ch" // LOCAL aFiles := DIRECTORY("*.dbf"), aNames := {} AEVAL(aFiles, { | file | AADD(aNames, file[F_NAME]) } ) //Exemplo 3 LOCAL aArray[6] AFILL(aArray,"old") AEVAL(aArray,; {|cValue,nIndex| IF(cValue == "old",; aArray[nIndex] := "new",)})
EVAL() DBEVAL()
AFill
Preenche um array com um determinado valor.
Argumento aDestino
Obrigat. Sim
Descrio
expValor
Sim
Todos
o dado que ser preenchido em todas as posies informadas, no permitida a utilizao de arrays.
[nInicio]
No
a posio inicial de onde os dados sero preenchidos, o valor padro 1. 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.
[nCount]
No
Retorno AFILL()
Descrio 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. }
AIns
Insere um elemento com contedo NIL em um array.
Sintaxe AINS( aOrigem, nPos ) --> aIns Argumento AOrigem NPos Obrigat. Sim Sim Tipo A A Descrio o array de onde ser inserido um item. a posio a partir da 1, do qual ser inserido um elemento
Retorno AINS()
Descrio 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().
Aleatorio
Tipo: 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. Sintaxe Aleatorio(nMax,nSeed) Parmetros nMax Nmero mximo para a gerao do nmero aleatrio nSeed Semente para a gerao do nmero aleatrio Retorna nRet Nmero aleatrio retornado Exemplo // 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.
Sintaxe ALIAS([ nAreaTrab ]) --> Caracter Argumento nAreaTrab Obrigat. No Tipo N Descrio Nmero da rea de trabalho a ser verificada.
Descrio No existe tabela em uso na rea de trabalho verificada. String contendo o Alias da rea de trabalho verificada (em maisculo).
Descrio 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 Alias correspondente.
Exemplo // Este exemplo mostra como o Alias corrente pode ser apresentado para o usurio. dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) MessageBox("O Alias corrente : " + Alias(), "Alias", 0) // Resultado: "O Alias corrente : SSS".
DBUSEAREA( ) SELECT( )
Append From
Importa registros de outra tabela ou arquivo texto.
Sintaxe APPEND FROM Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] [VIA RDD] [SDF | DELIMITED [WITH BLANK | cDelimitador] ] Argumento Obrigat. Tipo Descrio Nome do arquivo cujos registros sero importados, pode ser apenas o nome ou na forma de uma string. Lista dos campos a serem copiados, se omitido sero copiados todos os campos.
Arquivo
Sim
Campos
No
CondFor
No
copiado. Expresso em ADVPL que determina quando a cpia deve parar (quando a expresso retornar .F.).
CondWhile
No
nRecs nRecno
No No
N N
Quantos registros devem ser copiados. Nmero do recno do registro a ser copiado. Nome do RDD utilizado na importao (entre aspas simples ou dupla), se omitido ser utilizado o RDD corrente.
RDD cDelimitador
No No C
Especifica qual caracter foi utilizado como delimitador para gerar o arquivo do tipo texto.
Descrio Este comando utilizado para copiar alguns registros do arquivo especificado por "FROM cArquivo" utilizando-se o driver especificado por "VIA RDD" se especificado. Se forem especificados os campos de interesse atravs de "FIELDS Campos", apenas eles sero copiados, caso contrrio todos campos o sero. Se no forem especificadas as condies 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 CondFor" e "WHILE CondWhile". 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 DBGOTOP() 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 COPY TO, 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 cDelimitador" - as strings so delimitadas com o caracter especificado;
").
Exemplo
// 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 APPEND FROM 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
COPY TO
Array
Cria um array com dados no inicializados. Sintaxe ARRAY( nQtdElementos1 , [ nQtdElementosn ]...) --> aArray Argumento nQtdElementos1 [nQtdElementosN] Obrigat. Sim No Tipo N N Descrio Quantidade de Elementos da 1 dimenso do array. Quantidade de Elementos das demais dimenses do array.
Retorno ARRAY()
Descrio Array() uma funo que retorna um array no inicializado com mltiplas dimenses. Se mais de um argumento for especificado, ser retornado um array multidimensional A vantagem de utilizar ARRAY(), ao invs de outras opes, a possibilidade de us-la em code blocks e expresses.
Exemplo // Exemplo 1 - Dois mtodos idnticos. aArray := ARRAY(5) aArray := { NIL, NIL, NIL, NIL, NIL } // Mtodos equivalentes. aArray := ARRAY(3, 2) aArray := { {NIL, NIL}, {NIL, NIL}, {NIL, NIL} } aArray := { ARRAY(2), ARRAY(2), ARRAY(2) }
AADD() ACLONE()
AScan
Busca em um array at que o bloco retorne verdadeiro .T. Sintaxe ASCAN( aOrigem, expSearch, [ nStart ], [ nCount ]) --> nStoppedAt Argumento aOrigem <expSearch> Obrigat. Sim Sim Tipo A Todos Descrio o array onde ser executada a expresso. 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>array 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"})
AEVAL() EVAL()
ASort
Ordena um array.
Sintaxe ASORT( aOrigem, [ nInicio ], [ nQtde ], [ bOrdem ]) --> aOrigem Argumento aOrigem Obrigat. Sim Tipo A Descrio o array que ser classificado. Onde ser o inicio da ordenao. Caso seja omitido, ser considerado o 1 elemento do array. Quantidade de elementos que sero ordenados a partir do nInicio. Caso seja omitido, sero considerados todos elementos at o final do Array. 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.
nInicio
No
nQtde
No
bOrder
No
Bloco de cdigo
Retorno ASORT()
Descrio ASORT() uma funo de manipulao de array que classifica todo ou parcialmente um array de tipo simples. Os tipos que podem ser classificados automaticamente so: caracter, data, lgico e numrico. Caso bOrder seja especificado, o code block ser usado para ordernar o 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.
Exemplos // 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} }
ASCAN() EVAL()
ATail
Retorna o ltimo elemento de um array
Sintaxe ATAIL( aArray ) --> Element Argumento aArray Obrigat. Sim Tipo A Descrio o array de onde ser retornado o ltimo elemento.
Retorno ATAIL()
Descrio. ATAIL() uma funo de manipulao de array que retorna o ltimo elemento de um array. Ela deve ser usada em substituio da seguinte construo: aArray [LEN( aArray )]
Exemplos
LEN()
Avalimp
Tipo: Relatrios 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. Sintaxe AvalImp(nLimit) Parmetros
nLimit Tamanho do relatrio em colunas. Pode ser 80, 132 ou 220 (respec-tivamente para relatrios de tamanho P,M e G). Retorna cControl String com caracteres de controle, dependente das configuraes escolhidas pelo usurio e do arquivo de driver especificado. Exemplo // Exemplo de uso da funo AvalImp: #IFNDEF WINDOWS #DEFINE PSAY SAY #ENDIF cCbTxt:= cCbCont:= nOrdem:= 0 nAlfa:= 0 nZ:= 0 nM:= 0 cTamanho:= G cLimite:= 220 cTitulo:= PADC(ioNota FiscallA,74) cDesc1:= PADC(Este programa ir emitir a Nota Fiscal de Entrada/Sada,74) cDesc2:= cDesc3:= PADC(da Feeder Industrial Ltda.,74) cNatureza:= aReturn:= {Especial, 1, Administrao, 1, 2, 2, ,1} cNomeProg:= NFEEDER cPerg:= ENTSAI nLastKey:= 0 lContinua:= .T. nLi:= 0 wnrel:= NFEEDER nTamNf:=72 // Apenas Informativo Pergunte(cPerg,.F.) // Pergunta no SX1 cString:=luSF2" wnrel:= SetPrint(cString,wnrel,cPerg,cTitulo,cDesc1,cDesc2,cDesc3,.T.) SetDefault(aReturn,cString) If nLastKey == 27 Return Endif #IFDEF WINDOWS RptStatus({|| Execute(Relato)}) Return #ENDIF Function Relato SetPrc(0,0) // Aqui est a chamada da funo AvalImp. Configura a // impressora de acordo com as definies em aReturn // escolhidas pelo usurio na funo SetPrint @ 00,00 PSAY AvalImp(220) dbSelectArea(SF2) dbSeek(xFilial()+mv_par01+mv_par03,.T.) // O programa segue normalmente... Return
Aviso
Tipo: Tela DOS/Windows Monta uma janela exibindo o texto desejado e, opcionalmente, disponibilizando opes de escolha para o usurio. Sintaxe Aviso(cTitulo,cMensagem,aOpcoes) Parmetros
cTitulo Titulo da janela. cMensagem Mensagem para ser exibida no interior da janela. O tamanho mximo de 90 caracteres. AOpcoes Array de caracteres com as opes para a montagem de menu (na verso DOS) ou dos botes (na verso Windows). Retorna nResp Retorno. Retorna o nmero da opo escolhida pelo usurio. Exemplo // Exemplo de uso da funo Aviso: While .T. GravaArq() // Funo qualquer (apenas p/exemplo) If !File(ifTESTE.TXTle) aOp:= {i.SimlO,l=NaolJ,l.Cancelal.} cTit:= i.Atencao!l= cMsg:= iMO arquivo TESTE.TXT nao foi gravado!lT cMsg:= cMsg + iM Tenta novamente?l= nOp:= Aviso(cTit,cMsg,aOp) If nOp == 1 // Sim Loop ElseIf nOp == 3 // Cancela Return Else // Nao ou <ESC> Exit Endif Endif Exit EndDo // Faz o processamento... Return
AxCadastro
Tipo: Processamento Gerao de modelo 1. Rotina para criao e manuteno de cadastros no padro do SIGA Advanced, contendo as opes padronizadas: PESQUISA, INCLU-SO, ALTERAO, VISUALIZAO e EXCLUSO. Disponibiliza o Browse e todas as funes de cadastramento padro. Sintaxe AxCadastro(cAlias,cTitulo,cDel,cOk) Parmetros cAlias Alias do arquivo. Deve obrigatoriamente ter sua estrutura definida no SX3. cTitulo Ttulo da Janela. cDel Funo para validar a excluso. cOk Funo para validar a Incluso/Alterao. Comentrios Deve ser utilizada para editar arquivos especficos (Famlia SZ?), sendo semelhante aos cadastros de Clientes, Fornecedores e etc... Exemplo // Exemplo de uso de cadastro de arquivo especifico: AxCadastro(SZ1,Cadastro de Descontos,.T.",.T.) Return
@ n1,n2 BmpButton
Tipo: Tela Windows Cria um boto de bitmap padro do SigaAdv Win. Sintaxe @ nLinha,nColuna BMPBUTTON TYPE nBotao ACTION cFuncao OBJECT oBtn
Parmetros nLinha nColuna nBotao cFuncao oBtn Nmero da linha superior Nmero da coluna superior Nmero do boto padronizado Funo que ser executada Objeto associado ao boto
Comentrios Para executar funes definidas em um mesmo .PR? utilizar a funo Execute(Nome da funo) ou ExecBlock(Nome do Arquivo) para chamar outro .PR?. Exemplo Ver exemplo no programa RDDEMO.
@...Button
Tipo: Tela Windows Cria um boto com texto. Sintaxe @ nLinha,nColuna BUTTON cTexto SIZE nAltura,nLargura ACTION cFuno Object oBtn Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior 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. Comentrios
Para executar funes definidas em um mesmo .PR? utilizar a funo Execute(Nome da funo) ou ExecBlock(Nome do Arquivo) para chamar outro .PR?. Exemplo Ver exemplo no programa RDDEMO.
BTVCanOpen
Verifica se a tabela BTrieve pode ser aberta. Sintaxe BTVCanOpen( cNome , [ cIndice ])->Lgico Argumento cNome cIndice Obrigat. Sim No Tipo C C Descrio Nome da tabela a ser testada. Nome do arquivo de ndice da tabela a ser testada.
Retorno
Descrio 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. A tabela testada pode ser aberta.
.F.
.T.
Descrio Esta funo verifica se a tabela definida pelo parmetro cNome pode ser aberta e, se existir, o parmetro cIndice 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.
Exemplo // Este exemplo demonstra o uso tpico de BTVCanOpen(). Se no falhar, a tabela e o ndice testados sero abertos. Se falhar, uma mensagem apresentada. IF !BTVCanOpen("\dadosadv\aa1990.dat", "\dadosadv\ind1.ind") Messagebox("No possvel abrir a tabela testada","Erro", 0) BREAK ELSE Use "\dadosadv\aa1990.dat" SHARED NEW OrdListAdd("\dadosadv\ind1.ind") ENDIF
BTVCreateDDFs
Gera os arquivos de definies (DDFs) compatveis com outras ferramentas que manipulam arquivos Btrieve (Crystal Reports). Sintaxe BTVCreateDDFs ( aTabelas , [ cDiretorio ])->Lgico
Obrigat. Sim No
Tipo A C
Descrio Nomes das tabelas e os respectivos diretrios (opcional). Nome do diretrio (abaixo do root) onde sero criados os novos DDF's.
Retorno
Descrio 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. Transformao de definies ocorrida com sucesso.
.F.
.T.
Descrio Esta funo transforma as informaes armazenadas nos arquivos DDF's para o padro utilizado por outras ferramentas, principalmente para gerao de relatrios. Sendo que podem ser selecionadas apenas as tabelas de interesse atravs do parmetro aTabelas. Ex: aTabelas := {{"AA3990", "C:\DADOS"},{"AA4990", "C:\DADOS1"},{"AA5990"}} Se o diretrio no for especificado, ser utilizado o diretrio definido no arquivo FILE.BTV.
Os novos arquivos de definio, FILE.DDF, FIELD.DDF e INDEX.DDF, so gerados no diretrio especificado pelo parmetro cDiretrio, se ele for omitido, sero gerados no mesmo diretrio dos SXs.
Exemplo // 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 !BTVCreateDDFs(b, "\temp") // Ser concatenado com o RootPath Messagebox("No foi possvel montar o array com os nomes das tabelas","Erro", 0) BREAK ENDIF
BTVTables
BTVDropIdxs
Apaga os ndices da tabela corrente. Sintaxe BTVDropIdxs ()->Lgico Retorno .F. .T. Descrio Descrio No conseguiu apagar os ndices. Principais erros: RDD no Btrieve, no achou as definies no DDF, o arquivo no est exclusivo Deleo de ndices ocorrida com sucesso
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. 2. 3. Fecha todos os ndices; Apaga as definies dos ndices nos arquivos do diretrio DDF; 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.
Exemplo // Este exemplo demonstra o uso tpico de BTVDropIdxs(). Se no falhar, os ndices so apagados e o processo continua. Se falhar, uma mensagem apresentada. USE Clientes SHARED NEW IF !BTVDropIdxs() Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0) BREAK ENDIF
CTREEDELIDXS() DBCLEARINDEX()
BTVTables
Retorna array composto por nomes das tabelas definidas no DDF do Protheus (FILE.BTV). Sintaxe BTVTables ()-->Array Retorno NIL Descrio No conseguiu montar o array. Principais erros: RDD no Btrieve ou no conseguiu recuperar as informaes corretamente do arquivo FILE.BTV do DDFs. Lista com os nomes das tabelas extradas do DDF.
Array
Descrio 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.
Exemplo // 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:= BTVTables() IF a=Nil Messagebox("No foi possvel montar o array com os nomes das tabelas","Erro", 0) BREAK ELSE FOR i:= 1 to LEN(a) ConOut(a[i]) NEXT
ENDIF
BTVCREATEDDFS
CDow
Converte uma data para uma cadeia de caracteres contendo o dia da semana. Sintaxe CDOW( dExp ) --> Caracter Argumento dExp Obrigat. Sim Tipo D Descrio a data a converter.
Descrio 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
CDOW() uma funo que converte uma data para uma cadeia de caracteres. Exemplos dData := DATE() cDiaDaSemana := cDiaDaSemana := cDiaDaSemana := // Resultado: 09/01/90 CDOW(DATE()) // Resultado: Friday CDOW(DATE() + 7) // Resultado: Friday CDOW(CTOD("06/12/90")) // Resultado: Tuesday
CMonth
Converte uma data para uma cadeia de caracteres contento o nome do ms.
Sintaxe CMONTH( dData ) --> Caracter Argumento dData Obrigat. S Tipo D Descrio a data a converter.
Retorno Caracter
Descrio Retorna o nome do ms em uma cadeia de caracteres. A primeira letra do retorno em maiscula e o restante do nome, em minsculas.
""
Descrio CMONTH() uma funo de converso de datas que retorna uma cadeia de caracteres com o nome do ms em ingls.
Exemplos Estes exemplos ilustram CMONTH(): cMes cMes cMes cMes := := := := CMONTH(DATE()) // Resultado: September CMONTH(DATE() + 45) // Resultado: October CMONTH(CTOD("12/01/94")) // Resultado: December SUBSTR(CMONTH(DATE()), 1, 3) + STR(DAY(DATE())) // Resultado: Sep 1
Commit
Salva em disco as modificaes de todas as tabelas.
Sintaxe COMMIT Descrio Este comando salva em disco todas as atualizaes pendentes em todas as reas de trabalho. Exemplo // 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" COMMIT// Salva em disco as alteraes realizadas nas tabelas Clientes e Fornecedores
DBCOMMIT
DBCOMMITALL
Copy File
Copia Arquivos. Sintaxe CopyFile( cOrigem, cDestino) --> NIL
Argumento
Obrigat.
Tipo
Descrio Nomes dos arquivos a serem copiados, aceita tanto arquivos locais ( Cliente ), como arquivos que esto no Servidor. WildCards so aceitos normalmente. Diretrio com o destino dos arquivos a serem copiados, podendo tambm ser no servidor ou no cliente ( estao local ).
cOrigem
Sim
cDestino
Sim
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. Exemplo __CopyFile( "C:\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos do cliente para o Servidor __CopyFile( "\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos no servidor
CPYT2S( ) CPYS2T( )
Copy Structure
Copia a estrutura da tabela corrente para uma nova tabela. Sintaxe COPY STRUCTURE [FIELDS Campos] TO Arquivo Argumento Campos Arquivo Obrigat. No Sim C Tipo Descrio Lista dos campos a serem includos na nova tabela, se omitido sero includos todos os campos. Nome do arquivo da nova tabela a ser criada.
Descrio
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 Exemplo // Este exemplo demonstra como utilizar o comando COPY STRUCTURE no seu modo mais usual: USE Cliente NEW COPY STRUCTURE FIELDS Nome,Idade TO NovoCliente // Este exemplo demonstra como o comando COPY STRUCTURE pode substituir o DBCREATE: USE Cliente NEW COPY STRUCTURE TO NovoCliente // *** semelhante a *** USE Cliente NEW DBCREATE("NovoCliente",DBSTRUCT())
Copy To
Copia registros da tabela corrente para uma nova tabela.
Sintaxe COPY TO Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] [VIA RDD] [SDF | DELIMITED [WITH BLANK | cDelimitador] ]
Obrigat. Sim No No No No No No No
Tipo
Descrio Nome do arquivo cujos registros sero exportados, pode ser apenas o nome ou na forma de uma string Lista dos campos a serem copiados, se omitido sero copiados todos os campos. Expresso em ADVPL a ser resolvida para que o registro seja copiado. Expresso em ADVPL que determina quando a cpia deve parar (quando a expresso retornar .F.).
N N
Quando registros devem ser copiados. Nmero do recno do registro a ser copiado. Nome do RDD utilizado na importao (entre aspas simples ou dupla), se omitido ser utilizado o RDD corrente.
Especifica qual caracter foi utilizado como delimitador para gerar o arquivo do tipo texto.
Descrio Este comando utilizado para copiar alguns registros da tabela corrente para o arquivo especificado por "TO cArquivo" utilizando-se o driver especificado por "VIA RDD" se 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 CondFor" e "WHILE CondWhile". 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 DBGOTOP() 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 COPY TO, 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 cDelimitador" - as strings so delimitadas com o caracter especificado;
Caso seja omitido, o delimitador ser considerado o delimitador padro (" Exemplo
").
// Este exemplo demonstra como utilizar o comando COPY TO criar nova tabela 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
APPEND FROM
CPYS2T
Copia arquivos do servidor para o cliente ( Remote ). Sintaxe CpyS2T( cOrigem, cDestino, [lCompacta]) --> NIL Argumento Obrigat. Tipo Descrio
Sim Sim No
C C L
Nomes dos arquivos a serem copiados, aceita apenas arquivos no servidor, WildCards so aceitos normalmente. Diretrio com o destino dos arquivos no remote (Cliente). Indica se a cpia deve ser feita compactando o arquivo antes.
Descrio Arquivo foi copiado para o cliente com sucesso Erro na cpia do Arquivo.
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. Exemplo CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .T. ) // Copia arquivos do servidor para o remote local, compactando antes de transmitir CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .F. ) // Copia arquivos do servidor para o remote local, sem compactar antes de transmitir
CPYT2S()
CPYT2S
Copia Arquivos entre o Cliente ( Terminal ) para o servidor.
Sintaxe CpyT2S( cOrigem, cDestino, [ lCompacta ]) --> NIL Argumento COrigem cDestino lCompacta Retorno .T. .F. Descrio 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. Exemplo CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP", .T. ) // Copia arquivos do cliente( remote ) para o Servidor compactando antes de transmitir Obrigat. Sim Sim No Tipo C C L Descrio Arquivo foi copiado para o cliente com sucesso. Erro na cpia do Arquivo. Descrio Nomes dos arquivos a serem copiados, aceita apenas arquivos locais ( Cliente ), WildCards so aceitos normalmente. Diretrio com o destino dos arquivos no remote ( Cliente ). Indica se a cpia deve ser feita compactando o arquivo antes.
CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP" ) // Copia arquivos do cliente( remote ) para o Servidor sem compactar.
CPYS2T()
CTreeDellnt
Deleta ndice interno da tabela CTree. Sintaxe CTreeDelInt( cNome )->Lgico Argumento cNome Obrigat. Sim Tipo C Descrio Especifica o nome da tabela cujo ndice interno deve ser deletado.
Descrio 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. Deleo do ndice interno ocorrida com sucesso.
A funo CtreeDelInt apaga o ndice interno de tabela Ctree, estando a mesma fechada. Para tanto, so executados os seguintes procedimentos: 1. 2. 3. Abre a tabela especificada pelo parmetro cNome; Verifica o nome do arquivo do ndice interno na tabela; Fecha a tabela;
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.
Exemplo // Este exemplo demonstra o uso tpico de CtreeDelInt(). Sendo que a tabela "\DADOSADV\SA1990.DTC" deve estar fechada. Se no falhar, o ndice interno apagado e o processo continua. Se falhar, uma mensagem apresentada. IF !CtreeDelInt("\dadosadv\sa1990.dtc") Messagebox("No foi possvel deletar o ndice da tabela","Erro", 0) BREAK ENDIF fErase("\dadosadv\sa1990.dtc")
CTreeDelIdxs
Deleta os ndices da tabela corrente. Sintaxe
CTreeDelIdxs()->Lgico Retorno .F. Descrio No conseguiu deletar os ndices. Principais erros: RDD no Ctre; no fechou a tabela; no apagou o arquivo de ndice; no atualizou as informaes da tabela; no abriu a tabela novamente. Deleo de ndices ocorrida com sucesso.
.T. Descrio
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. 2. 3. 4. 5. Fecha os ndices abertos; Fecha a tabela; Deleta os arquivos de ndice fisicamente; Atualiza as informaes da tabela, removendo os ndices de sua estrutura; Abre novamente a tabela.
Todos os ndices criados de forma permanente ficam guardados na 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.
Exemplo // 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 !CtreeDelIdxs() Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0) BREAK ENDIF
CurDir
Retorna o diretrio corrente.
Sintaxe CURDIR([ cNovoDir ]) --> cDirAtual Argumento cNovoDir Obrigat. No Retorno Tipo C Descrio Caminho com o novo diretrio que ser ajustado como corrente. Descrio
cDirAtual Descrio
Retorna o diretrio corrente do servidor, caso seja passado um caminho como parmetro, esse diretrio passar a ser o default.
Exemplo ? CURDIR("C:\TEMP")
Date
Retorna a data do sistema. Sintaxe DATE() --> Data Retorno Data Descrio Data do sistema.
Descrio 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.
Exemplos Estes exemplos mostram como usar a funo DATE(): dData := DATE() // Resultado: 09/01/01 dData := DATE() + 30 // Resultado: 10/01/01 dData := DATE() - 30 // Resultado: 08/02/90 dData := DATE() cMes := CMONTH(dData) // Resultado: September
Day
Retorna o dia do ms como valor numrico.
Sintaxe DAY( dData ) -->Numrico Argumento dData Obrigat. Sim Tipo D Descrio a data a converter.
Descrio Se o ms do argumento dData for fevereiro, anos bissextos so considerados. Se a data do argumento dData for 29 de fevereiro e o ano no for bissexto, ou se o argumento dData for vazio.
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 tambm em diversos clculos envolvendo datas.
Exemplos Estes exemplos mostram a funo DAY() de diversas maneiras: dData := DATE() // Resultado: 09/01/01 nDia := DAY(DATE()) // Resultado: 1 nDia := DAY(DATE()) + 1 // Resultado: 2 nDia := DAY(CTOD("12/01/94")) // Resultado: 1 Este exemplo mostra a funo DAY() usada em conjunto com CMONTH() e YEAR() para formatar o valor da data: dData := Date() cData := CMONTH(dData) + STR(DAY(dData)) + "," + STR(YEAR(dData)) // Resultado: June 15, 2001
DBAppend
Acrescenta um novo registro na tabela corrente.
Sintaxe DBAppend ([ lLiberaBloqueios ]) ->Nil Argumento lLiberaBloqueios Descrio Obrigat. No Tipo L Descrio Libera todos os registros bloqueados (locks), valor padro .T.
Esta funo acrescenta mais um registro em branco no final da tabela corrente, sempre acrescentado e bloqueado. Se o parmetro estiver com valor .T., todos os bloqueios de registros anteriores so liberados para que o novo registro seja acrescentado, caso contrrio, se for .F., todos os bloqueios anteriores so mantidos. Se este parmetro no for especificado, o valor padro .T..
Exemplo // Este exemplo demonstra como se pode utilizar o dbappend liberando e mantendo bloqueios anteriores. USE Clientes NEW FOR i:=1 to 5 DBAPPEND(.F.) NOME := "XXX" END : "YYY" NEXT // Os 5 registros includos permanecem bloqueados DBAPPEND() // Todos os bloqueios anteriores so liberados
RLOCK( ) DBRLOCK( )
DBClearAllFilter
Limpa a condio de filtro de todas as ordem as ordens da lista.
Sintaxe DBClearAllFilter() ->Nil Retorno NIL Descrio Esta funo salva as atualizaes realizadas e pendentes de todas as tabelas e depois limpa as condies de filtro de todas as ordens inclusas na lista. Seu funcionamento oposto ao comando SET FILTER. Nenhum Descrio
Exemplo // Este exemplo demonstra como se pode utilizar DBCLEARALLFILTER para limpar a expresso de filtro. USE Clientes NEW DBSETFILTER( {|| Idade < 40}, "Idade < 40" ) // Seta a expresso de filtro ... DBCLEARALLFILTER() // Limpa a expresso de filtro de todas as ordens
DBClearIndex
Fecha todos os arquivos de ndice da rea de trabalho.
Descrio 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.
Exemplo // Este exemplo demonstra como se pode utilizar a funo DBCLEARINDEX para fechar os ndices. USE Clientes NEW DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome" ... DBCLEARINDEX() // Fecha todos os arquivos de ndices
DBClearIndex
Fecha todos os arquivos de ndice da rea de trabalho.
Descrio 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.
Exemplo // Este exemplo demonstra como se pode utilizar a funo DBCLEARINDEX para fechar os ndices. USE Clientes NEW DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome" ... DBCLEARINDEX() // Fecha todos os arquivos de ndices
DBREINDEX DBSETINDEX
DBSETORDER
DBCloseArea
Fecha a rea de trabalho.
Sintaxe DBCloseArea () ->Nil Retorno NIL Descrio Esta funo salva as atualizaes pendentes na tabela corrente, libera todos os registros bloqueados e fecha a tabela corrente (rea de trabalho). Seu funcionamento semelhante ao comando CLOSE e oposto funo DBUSEAREA e ao comando USE. Exemplo // Este exemplo demonstra como se pode utilizar o DBCLOSEAREA para fechar a rea de trabalho atual. USE Clientes NEW DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome" ... DBCLOSEAREA() // Fecha a rea de trabalho atual, todos os indices e ordens Nenhum Descrio
DBCOMMIT DBUSEAREA
DBCommit
Salva em disco todas as modificaes da tabela corrente. Sintaxe DBCommit() ->Nil Retorno NIL Descrio Esta funo salva em disco todas as atualizaes pendentes na rea de trabalho corrente. Exemplo // Este exemplo demonstra como se pode utilizar o DBCOMMIT para salvar todas as alteraes realizadas na rea de trabalho atual. USE Clientes NEW DBGOTO(100) Nome := "Jose" USE Fornecedores NEW DBGOTO(168) Nome := "Joao" DBCOMMIT() // Salva em disco apenas as alteraes realizadas na tabela Fornecedores Descrio Nenhum
DBCOMMITALL DBUNLOCK
DBCommitAll
Salva em disco todas as modificaes.
Sintaxe DBCommitAll () ->Nil Retorno NIL Descrio Esta funo salva em disco todas as atualizaes pendentes em todas as reas de trabalho. Exemplo // Este exemplo demonstra como se pode utilizar o DBCOMMITALL para salvar todas as alteraes realizadas nas reas de trabalho abertas no momento. USE Clientes NEW DBGOTO(100) Nome := "Jose" USE Fornecedores NEW DBGOTO(168) Nome := "Joao" DBCOMMITALL() // Salva em disco as alteraes realizadas nas tabelas Clientes e Fornecedores Descrio Nenhum
DBCOMMIT DBUNLOCK
DBCreate
Cria nova tabela.
Sintaxe DBCREATE( cNome , aEstrutura , [ cDriver ]) --> Nil Argumento cNome aEstrutura cDriver Obrigat. S S N Tipo C Array C Descrio Nome do arquivo da tabela a ser criada (abaixo do "RootPath"). Lista com as informaes dos campos para ser criada a tabela. Nome do RDD a ser utilizado para a criao da tabela. Se for omitido ser criada com o corrente.
Retorno NIL
Descrio Nenhum
Descrio Esta funo utilizada para criar um novo arquivo de tabela cujo nome est especificado atravs do primeiro parmetro (cNome) e estrutura atravs do segundo (aEstrutura). 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.
Exemplo // Este exemplo mostra como se pode criar novo arquivo de tabela atravs da funo DBCREATE: LOCAL aEstrutura := {{Cod,N,3,0},{Nome,C,10,0},{Idade,N,3,0},{Nasc,D,8,0},{Pagto, N,7,2}} DBCREATE("\teste\amigos.xxx",aEstrutura) // Cria a tabela com o RDD corrente USE "\teste\amigos.xxx" VIA "DBFCDX" NEW
DBUSEAREA DBSTRUCT( )
DBCreateIndex
Cria um arquivo de ndice.
Sintaxe DBCREATEINDEX( cNome , cExpChave , [ bExpChave ], [ lUnico ]) --> Nil Argumento cNome cExpChave bExpChave lUnico Obrigat. S S N N Tipo C C Bloco de Cdigo L Descrio Nome do arquivo de ndice a ser criado. Expresso das chaves do ndice a ser criado na forma de string. Expresso das chaves do ndice a ser criado na forma executvel. Cria ndice como nico (o padro .F.).
Retorno
Descrio 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).
Nil
Descrio 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. 2.
Salva fisicamente as alteraes ocorridas na tabela corrente; Fecha todos os arquivos de ndice abertos;
3. 4.
5.
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. Exemplo // 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 DBCREATEINDEX ("\teste\ind2.cdx","Nome+End",{ || Nome+End },.T.)
DBCreateIndex
Cria um arquivo de ndice.
Sintaxe DBCREATEINDEX( cNome , cExpChave , [ bExpChave ], [ lUnico ]) --> Nil Argumento cNome cExpChave bExpChave lUnico Obrigat. S S N N Tipo C C Bloco de Cdigo L Descrio Nome do arquivo de ndice a ser criado. Expresso das chaves do ndice a ser criado na forma de string. Expresso das chaves do ndice a ser criado na forma executvel. Cria ndice como nico (o padro .F.).
Retorno
Descrio 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).
Nil
Descrio 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. 2.
Salva fisicamente as alteraes ocorridas na tabela corrente; Fecha todos os arquivos de ndice abertos;
3. 4.
5.
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. Exemplo // 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 DBCREATEINDEX ("\teste\ind2.cdx","Nome+End",{ || Nome+End },.T.)
Deleted
Verifica se o registro foi deletado.
Sintaxe DELETED() --> Lgico Retorno .F. .T. Descrio 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 DBRECALL marca todos os registros deletados como no-deletados. Exemplo // Este exemplo verifica se determinado registro est deletado, caso positivo, mostra uma mensagem: USE "\DADOSADV\AA1990.DBF" SHARED NEW DBGOTO(100) IF DELETED() Messagebox("O registro atual foi deletado","Erro", 0) BREAK ENDIF Descrio O registro no foi deletado O registro foi deletado
DBPACK( ) DBRECALL( )
DBEval
Executa uma expresso para os registros dentro das condies especificadas. Sintaxe
DBEVAL( bBloco, [ bForCond ], [ bWhileCond ], [ nProxRegs ], [ nRecno ], [ lRestante ]) --> Nil Argumento bBloco bForCond bWhileCond nProxRegs nRecno lRestante Descrio Esta funo utilizada para executar uma expresso definida pelo bloco de cdigo do primeiro parmetro para cada registro que est dentro do escopo definido atravs dos blocos de condio de "for" e "while". O nmero de registros a ser executado ser definido com o parmetro nProxRegs ou se setado o parmetro lRestante sero executados todos os registros a partir do registro 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. Exemplo // 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) DBEVAL( {|| nCount++}, {|| Nome > "FFFFF"}, {|| Idade < 40},,,.T.) // Este exemplo mostra como se pode usar o DBEVAL para colocar numa varivel um nome inicial que est definido em um registro de recno definido (100): USE Cliente VIA "DBFCDX" NEW LOCAL cNomeIni := ""; DBEVAL( {|| cNomeIni := Nome},,,,100) // Este exemplo mostra como se pode usar o DBEVAL para verificar qual o recno do dcimo registro a partir do corrente dentro do escopo definido: USE Cliente VIA "DBFCDX" NEW LOCAL nRecno := 0; DBGOTO(100) DBEVAL( {|| nRecno := RECNO()}, {|| Nome > "FFFFF"}, {|| Idade < 40},10,,.T.) Obrigat. S N N N N N Tipo Bloco Cdigo Bloco Cdigo Bloco Cdigo N N L de de de Descrio Expresso na forma executvel a ser resolvida para cada registro processado. Expresso na forma executvel a ser resolvida para verificar se o registro em questo est dentro do escopo definido. Expresso na forma executvel a ser resolvida para verificar at qual registro ser processado (at o bloco retornar .F.). Nmero de registros a ser processado a partir do registro corrente. Identificao de determinado registro a ser resolvida a expresso (recno). Processa o restante dos registro.
AEVAL( ) EVAL
DBF
Verifica qual o Alias corrente. Sintaxe DBF() --> Caracter Retorno "" cAlias Descrio 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 Alias correspondente. Exemplo // Este exemplo mostra como o DBF corrente pode ser mostrado para o usurio. dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) MessageBox("O Alias corrente : " + DBF(), "Alias", 0) // Resultado: "O Alias corrente : SSS" Descrio No existe tabela em uso. String contendo o Alias corrente.
DBFieldInfo
Verifica informaes sobre um campo. Sintaxe DBFieldInfo ( nInfoTipo , nCampo ) -> Informao do Campo Argumento nInfoTipo nCampo Obrigat. S S Tipo N N Descrio Tipo de informao a ser verificada. Posio do campo a ser verificado.
Retorno Nil
Descrio 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).
Descrio 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 DBS_LEN Nmero de casas decimais (tipo numrico) Tamanho (tipo numrico)
DBS_TYPE
A posio do campo no leva em considerao os campos internos do Protheus (recno e deleted). Exemplo // Este exemplo demonstra como se pode utilizar o DBFIELDINFO para obter as informaes do primeiro campo da tabela Clientes. USE Clientes NEW DBFIELDINFO(DBS_NAME, 1) // Retorno: Nome DBFIELDINFO(DBS_TYPE, 1) // Retorno: C DBFIELDINFO(DBS_LEN, 1) // Retorno: 10 DBFIELDINFO(DBS_DEC, 1) // Retorno: 0
DBINFO( ) DBORDINFO( )
FIELDNAME
DBFilter
Verifica a expresso de filtro corrente.
Sintaxe DBFilter () --> Caracter Retorno "" cExpFiltro Descrio No existe filtro ativo na rea de trabalho atual. Expresso do filtro ativo na rea de trabalho atual.
Descrio Esta funo utilizada para verificar a expresso de filtro ativo na rea de trabalho corrente.
Exemplo // 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" DBFILTER() // retorna: Nome > "Jose" SET FILTER TO Num < 1000 DBFILTER() // retorna: Num < 1000
DBRELATION DBRSELECT
DBGoBottom
Posiciona no ltimo registro lgico.
Descrio Esta funo utilizada para posicionar a tabela corrente no ltimo registro lgico. A seqncia lgica depende da ordem e do filtro ativo sobre a tabela corrente, portanto o ltimo registro lgico pode no ser o ltimo registro fsico.
Exemplo // Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no ltimo registro fsico. USE Cliente DBGOBOTTOM() // Posiciona no ltimo registro fsico, pois no h ordem ativa // Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no ltimo registro lgico. USE Cliente INDEX Ind1 NEW DBGOBOTTOM() // Posiciona no ltimo registro lgico (ltimo registro na seqncia gerada pelo ndice)
DBGoTo
Posiciona em determinado registro.
Sintaxe DBGoTo( nRegistro ) -> Nil Argumento nRegistro Obrigat. S Tipo N Descrio bbbNmero do registro a ser posicionado.
Descrio Esta funo utilizada para posicionar a tabela corrente em determinado registro, segundo a ordem fsica (seqncia sobre o recno).
Exemplo // Este exemplo demonstra como se pode utilizar o DBGOTO para posicionar a tabela corrente em determinado registro. USE Cliente INDEX Ind1 NEW DBGOTO(100) // Posiciona no registro de recno 100
DBGoTop
Posiciona no primeiro registro lgico.
Descrio Esta funo utilizada para posicionar a tabela corrente no primeiro registro lgico. A seqncia lgica depende da ordem e do filtro ativo sobre a tabela corrente, portanto o primeiro registro lgico pode no ser o primeiro registro fsico.
Exemplo // Este exemplo demonstra como se pode utilizar o DBGOBOTOP para posicionar no primeiro registro fsico. USE Cliente DBGOTOP() // Posiciona no primeiro registro fsico, pois no h ordem ativa // Este exemplo demonstra como se pode utilizar o DBGOTOP para posicionar no primeiro registro lgico. USE Cliente INDEX Ind1 NEW DBGOTOP() // Posiciona no primeiro registro lgico (primeiro registro na segncia gerada pelo ndice)
DBSKIP
DBEOF DBBOF
DBInfo
Verifica informaes sobre a tabela corrente.
Sintaxe DBInfo ( nInfoTipo ) -> Informao da Tabela Argumento nInfoTipo Obrigat. S Tipo N Descrio Tipo de informao a ser verificada.
Retorno Nil
Descrio No h tabela corrente. Informao da Tabela Informao requisitada pelo usurio (o tipo depende da informao requisitada).
Descrio Esta funo utilizada para obter informaes sobre a tabela corrente. O tipo de informao (primeiro argumento) escolhido de acordo com as constantes abaixo:
Extenso do arquivo da tabela corrente (tipo caracter) Nome da tabela corrente com caminho completo (tipo caracter) Verifica se est posicionada no incio da tabela similar a BOF (tipo lgico) Verifica se est posicionada no final da tabela similar a EOF (tipo lgico) Verifica se a tabela est posicionada aps uma pesquisa similar a FOUND (tipo lgico) Nmero de campos na estrutura da tabela corrente similar a FCOUNT (tipo numrico) Nome do Alias da rea de trabalho corrente similar a Verifica a data da ltima modificao similar a
Exemplo // Este exemplo demonstra como se pode utilizar o DBINFO para obter as informaes da tabela corrente (Clientes). USE Clientes NEW DBINFO(DBI_FULLPATH) // Retorno: C:\Teste\Clientes.dbf DBINFO(DBI_FCOUNT) // Retorno: 12 DBGOTOP() DBINFO(DBI_BOF) // Retorno: .F. DBSKIP(-1) DBINFO(DBI_BOF) // Retorno: .T.
DBORDINFO( ) DBFIELDINFO( )
DBRLockList
Retorna uma lista com todos os registros locados na tabela corrente.
Sintaxe DBRLOCKLIST() --> Array Retorno Nil ListaLock Descrio No existe tabela corrente ou no existe nenhum registro locado. Lista com os recnos dos registros locados na tabela corrente.
Descrio Esta funo utilizada para verificar quais registros esto locados na tabela corrente. Para tanto, retornada uma tabela unidimensional com os nmeros dos registros.
Exemplo // Este exemplo mostra como utilizada a funo DBRLOCKLIST para verificar quais registros esto bloqueados na tabela corrente DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTOP() DBRLOCK() // Bloqueia o primeiro registro DBRLOCK(110) // Bloqueia o registro de nmero 110 DBRLOCK(100) // Bloqueia o registro de nmero 100 DBRLOCKLIST() // Retorna: {1,100,110}
DBOrderInfo
Verifica informaes sobre uma ordem.
Sintaxe DBOrderInfo ( nInfoTipo , [ cIndice ], [ cOrdem | nPosicao ]) -> Informao da Ordem Argumento Obrigat. Tipo Descrio
S N N
N C N
Nome do arquivo de ndice. Nome da ordem. Posio da ordem na lista de ordens ativas.
Retorno Nil
Descrio 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).
Descrio 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 DBOI_FULLPATH DBOI_ORDERCOUNT Nome do arquivo de ndice ao qual a ordem pertence (tipo caracter). Nome do arquivo de ndice (com seu diretrio) ao qual a ordem pertence (tipo caracter) Nmero de ordens existentes no arquivo de ndice especificado
Exemplo // Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter informaes sobre o nome do arquivo de ndice da ordem corrente. DBORDERINFO(DBOI_BAGNAME) // retorna: Ind DBORDERINFO(DBOI_FULLPATH) // retorna: C:\AP6\Teste\Ind.cdx // Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter informaes sobre o nome do arquivo de ndice de uma ordem especificada. DBORDERINFO(DBOI_BAGNAME,,3) // retorna: Ind2 DBORDERINFO(DBOI_FULLPATH,,"Nome") // retorna: C:\AP6\Teste\Ind2.cdx // Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter o nmero de ordens de determinado arquivo de ndice. DBORDERINFO(DBOI_ ORDERCOUNT,"\Teste\Ind2.cdx") // retorna: 3
DBOrderNickName
Torna ativa a ordem com o determinado apelido.
Sintaxe DBOrderNickName( cApelido ) -> Lgico Argumento cApelido Obrigat. S Tipo C Descrio Nome do apelido da ordem a ser setada.
Descrio No conseguiu tornar a ordem ativa. Principais erros: No existe tabela ativa ou no foi encontrada a ordem com o apelido. A ordem foi setada com sucesso.
Descrio Esta funo utilizada para selecionar a ordem ativa atravs de seu apelido. Esta ordem a responsvel seqncia lgica dos registros da tabela corrente.
Exemplo //Este exemplo demonstra como se pode utilizar o DBORDERNICKNAME para setar nova ordem. USE Cliente NEW SET INDEX TO Nome, Idade IF !DBORDERNICKNAME("IndNome") Messagebox("Registro no encontrado","Erro", 0) BREAK ENDIF
DBSETORDER( ) DBSETNICKNAME( )
DBRecall
Altera o estado deletado do registro atual.
Descrio 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 DBDELETE que marca o registro atual como deletado.
Exemplo // 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. DBRECALL() 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() DBRECALL() DBSKIP() ENDDO
DBDELETE( )
DBRecordInfo
Verifica informaes sobre um registro.
Sintaxe DBRecordInfo ( nInfoTipo ,[ nRegistro ]) -> Informao do Registro Argumento nInfoTipo nRegistro Obrigat. S Opcional Tipo N N Descrio Tipo de informao a ser verificada. Nmero do registro a ser verificado.
Retorno Nil
Descrio No h tabela corrente ou registro invlido. Informao do Registro. Informao requisitada pelo usurio (o tipo depende da informao requisitada).
Descrio 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:
Verifica se o registro foi alterado e ainda no foi atualizado fisicamente. Similar a UPDATED (tipo lgico).
Exemplo // Este exemplo demonstra como se pode utilizar o DBRECORDINFO para se obter as informaes sobre registros da tabela corrente. USE Clientes NEW DBGOTO(100) DBRECORDINFO(DBRI_DELETED) // Retorno: .F. DBDELETE() DBRECORDINFO(DBRI_DELETED) // Retorno: .F. DBRECALL()
DBRECORDINFO(DBRI_RECSIZE) // Retorno: 230 NOME := "JOAO" DBGOTO(200) DBRECORDINFO(DBRI_UPDATED) // Retorno: .F. DBRECORDINFO(DBRI_UPDATED,100) // Retorno: .T.
DBORDERINFO( ) DBFIELDINFO( )
DBReindex
Reconstri todos os ndices da rea de trabalho.
Descrio Reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro registro lgico.
Exemplo // Este exemplo demonstra como se pode utilizar o DBREINDEX para reconstruir os ndices depois que um novo ndice foi gerado. USE Clientes NEW DBSETINDEX("IndNome") DBREINDEX()
DBSETINDEX( ) DBSETORDER( )
DBRLock
Bloqueia determinado registro.
Sintaxe DBRLOCK([ nRegistro ]) --> Lgico Argumento nRegistro Obrigat. Opcional Tipo N Descrio Nmero do registro a ser bloqueado.
Descrio No conseguiu bloquear o registro. Principal motivo: o registro j foi bloqueado por outro usurio. O registro foi bloqueado com sucesso
Descrio Esta funo utilizada quando se tem uma tabela aberta e compartilhada e se deseja bloquear um registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a funo no altera seu estado.
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 RLOCK().
Exemplo // Este exemplo mostra duas variaes do uso de DBRLOCK. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBRLOCK() // Bloqueia o registro atual (100) DBRLOCK(110) // Bloqueia o registro de nmero 110
DBRunLock
Desbloqueia determinado registro.
Sintaxe DBRUNLOCK([ nRegistro ]) --> Nil Argumento nRegistro Obrigat. No Tipo N Descrio Nmero do registro a ser desbloqueado.
Retorno NIL
Descrio 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 DBUNLOCK(). Esta funo o oposto
Exemplo // Este exemplo mostra duas variaes do uso de DBRUNLOCK. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBRUNLOCK() // Desbloqueia o registro atual (100) DBRUNLOCK(110) // Desbloqueia o registro de nmero 110
DbSeek
Encontra um registro com determinado valor da chave do ndice.
Sintaxe DBSeek ( cExp | nExp, [ lSoftSeek ], [ lUltimo ]) --> Lgico Argumento cExp Obrigat. Sim Tipo C Descrio 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). Valor de chave a ser encontrado do tipo numrico (apenas quando a expresso do ndice possui apenas uma campo do tipo numrico). Posiciona no primeiro registro com expresso de chave maior que o valor procurado. O padro .F.
nExp
Sim
lSoftSeek
No
No Descrio
No foi encontrado nenhum registro com o valor especificado Foi encontrado um registro com o valor especificado
Descrio 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.
Exemplo // 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) DBSEEK(100) // Retorna: .F. EOF() // Retorna: .T. DBSEEK(100,.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) DBSEEK("joao200101",.T.) // Procura a primeira ocorrncia de Nome "joao" e vencimento maior que Janeiro de 2001 WHILE !EOF() .AND. Nome == " joao" DBSKIP() ENDDO
DBSetDriver
Modifica ou verifica o RDD padro.
Sintaxe DBSetDriver ([ cNovoRddPadro ]) --> Caracter Argumento cNovoRddPadro Obrigat. No Tipo C Descrio Novo nome do RDD a ser definido como padro.
Retorno cAntigoRddPadro
Descrio Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for omitido seu parmetro.
Ela tambm pode ser utilizada para especificar outro RDD como padro, especificando-o atravs do parmetro.
Exemplo // Este exemplo demonstra como se pode utilizar o DBSETDRIVER para alterar o valor do RDD padro. DBSETDRIVER("CTREECDX") // Retorna: DBFCDX DBSETDRIVER() // Retorna: CTREECDX
RDDSETDEFAULT( )
RDDNAME( ) RDDLIST( )
DBSetFilter
Seta uma condio de filtro.
Argumento
Obrigat.
Tipo
Descrio
bCondio
Sim
Bloco de Cdigo
cCondio
Sim
Retorno NIL
Descrio 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 DBGOTOP, DBSEEK, DBSKIP, etc).
Exemplo // Este exemplo demonstra como se pode utilizar o DBSETFILTER para filtrar todos os clientes com menos de 40 anos. USE Cliente NEW DBSETFILTER( {|| Idade < 40}, "Idade < 40" ) DBGOTOP()
DBFILTER( )
DBSetIndex
Acrescenta todas as ordens de determinado ndice lista.
cArqIndice
Sim
Retorno NIL
Descrio 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.
Exemplo // Este exemplo demonstra como se pode utilizar o DBSETINDEX para acrescentar novos ndices lista de ordens. USE Cliente NEW DBSETINDEX("Ind1") DBSETINDEX("\teste\Ind2.cdx")
ORDLISTADD( )
DBSetNickName
Seta um apelido para determinada ordem ou verifica qual o apelido corrente.
Sintaxe DBSetNickName( cOrdem,[ cApelido ]) --> Caracter Argumento cIndice cApelido Obrigat. Sim No Tipo C C Descrio Nome da ordem que deve receber o apelido. 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 Apelido corrente
cApelido
Descrio Esta funo utilizada para colocar um apelido em determinada ordem especificada pelo primeiro parmetro. Caso seja omitido o nome do apelido a ser dado, a funo apenas verifica o apelido corrente.
Exemplo // Este exemplo demonstra como se pode utilizar o DBSETNICKNAME para setar um novo apelido e verificar qual o apelido atual. USE Cliente NEW DBSETNICKNAME("IndNome") // retorna: "" DBSETNICKNAME("IndNome","NOME") // retorna: "" DBSETNICKNAME("IndNome") // retorna: "NOME"
DBORDERNICKNAME( )
DBSetOrder
Seleciona a ordem ativa da rea de trabalho.
Sintaxe DBSetOrder( nPosio ) --> Nil Argumento nPosio Obrigat. Sim Tipo N Descrio Posio da ordem na lista de ordens ativas
Retorno NIL
Descrio Esta funo utilizada para selecionar a ordem ativa da rea de trabalho. Esta ordem a responsvel seqncia lgica dos registros da tabela corrente.
Exemplo // Este exemplo demonstra como se pode utilizar o DBSETORDER para selecionar a ordem corrente. USE Cliente NEW SET INDEX TO Nome, Idade DBSETORDER(2)
DBSkip
Desloca para outro registro na tabela corrente.
Sintaxe DBSkip([ nRegistros ]) --> Nil Argumento nRegistros Obrigat. No Tipo N Descrio Nmero de registros a ser deslocado.
Retorno NIL
Descrio Esta funo utilizada para deslocar para outro registro a partir do registro atual. O parmetro especifica quantos registros lgicos devem ser deslocados a partir do 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.
Exemplo // 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. DBSKIP() EOF() // retorna .T. DBGOTOP() BOF() // retorna .F. DBSKIP(-1) BOF() // retorna .T. // Este exemplo mostra como o DBSKIP pode deslocar 10 registro em relao ao registro corrente DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBSKIP(10) RECNO() // retorna 110 DBSKIP(-10) RECNO() // retorna 100
BOF( )
EOF( )
DBStruct
Retorna a estrutura da tabela corrente.
Retorno {} aEstrutura
Descrio No existe tabela corrente. Array com todos os campos, onde cada elemento um subarray contendo Nome, Tipo, Tamanho e Decimais.
Descrio Esta funo utilizada para verificar a estrutura da tabela corrente da mesma forma que utilizada para criar a tabela com a funo DBCREATE. Para isto ela cria um array para gravar as informaes e as retorna.
Exemplo // Este exemplo demonstra como se pode utilizar o DBSTRUCT para recuperar a estrutura da tabela corrente. USE Cliente NEW DBSTRUCT() //Retorna:{{Cod,N,3,0},{Nome,C,10,0},{Idade,N,3,0},{Nasc,D,8,0},{Pagto,N,7,2}}
DBCREATE( )
AFIELDS( )
DBUnlock
Descrio Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar todos os registros da lista
DBRUNLOCK para
DBRLOCKLIST.
Exemplo // Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBUNLOCK()
FLOCK( )
DBUnlockAll
Desbloqueia todos os registros de todas as tabelas abertas.
Descrio
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar todos os registros da lista
DBUNLOCK para
Exemplo // Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBUNLOCKALL()
FLOCK( )
DBUnlockAll
Desbloqueia todos os registros de todas as tabelas abertas.
Descrio Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar todos os registros da lista
DBUNLOCK para
Exemplo // Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente. DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBUNLOCKALL()
FLOCK( )
DBRLOCKLIST( )
Delete
Marca registros como deletados.
Sintaxe DELETE [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] Argumento CondFor Obrigat. No Tipo Descrio Expresso em ADVPL a ser resolvida para que o registro seja marcado como deletado. Expresso em ADVPL que determina quando a "deleo" deve parar (quando a expresso retornar .F. N N Quando registros devem ser marcados como deletados. Nmero do recno do registro a ser deletado.
CondWhile
No
nRecs nRecno
No No
Retorno NIL
Descrio 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 CondFor" e "WHILE CondWhile". Pode-se tambm limitar o nmero de registros a serem marcados atravs da opo "NEXT nRecs" e determinar que a "deleo" dos registros deve-se iniciar a partir do registro atual com "REST", mas caso contrrio o comando executa um DBGOTOP() antes de iniciar a "deleo". Se desejado marcar apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD nRecno".
Exemplo // 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
RECALL
REPLACE
SET DELETED ON
PACK ZAP
DevOutPict
Imprime o contedo na posio corrente formatando a sada.
Sintaxe DEVOUTPICT ( xVal, cPicture ) --> NIL Argumento xVal cPicture Obrigat. Sim Sim Tipo C, N ou D C Descrio Informar valor a ser impresso. Informar a mscara de formatao do dado.
Descrio
Exemplo nVal:= 100.89 DevPos( 10,10 ) // configura linha 0, coluna 0 para impresso //@ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() ) DevOutPict( nVal, "@E 999,999.99" ) // imprime 100,89
DEVPOS( )
DEVOUT( )
DevPos
Posiciona linha e coluna de impresso.
Sintaxe DEVPOS( nLin, nCol ) --> NIL Argumento nLin nCol Obrigat. Sim Sim Tipo N N Descrio Informar nova linha de impresso. Informar nova coluna de impresso.
Descrio
PROW() e PCOL( ).
Exemplo DevPos( 10,10 ) // configura linha 0, coluna 0 para impressao @ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() )
DEVOUT( )
Directory
Cria um array com dados dos diretrios e dos arquivos.
cDirSpec
Sim
Identifica o drive, o caminho de onde as informaes sero buscadas. O Caminho pode estar no servidor ou no local (Remote).
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 cAtributos No C H S
Descrio Incluir arquivos ocultos (Hidden) Incluir arquivos de sistema. Incluir diretrios Procurar o nome do disco (label)
D V
Retorno Array
Descrio Retorna um array de subarrays onde cada subarray contm informaes sobre um arquivo ou diretrio que correspondem a cDirSpec. Os subarrays possuem a seguinte estrutura, definida em directry.ch: F_NAME F_SIZE F_DATE F_TIME F_ATTR Caracter, Nome do arquivo Numrico, Tamanho do arquivo Data, Data de modificao do arquivo Caracter, Hora de modificao do arquivo Caracter, Atributos do arquivo.
Descrio 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.
Exemplos #include "Directry.ch" // aDirectory := DIRECTORY("*.*", "D") AEVAL( aDirectory, {|aFile| QOUT(aFile[F_NAME])} )
CURDIR()
ADIR()
DirRemove
Elimina um diretrio.
Sintaxe DIRREMOVE( cDirNome ) --> lSuccesso Argumento Obrigat. Tipo Descrio Nome do diretrio a ser removido, opcionalmente incluindo o caminho. O diretrio ser removido no servidor.
cDirNome
Sim
Note que necessrio ter direitos suficientes para remover um diretrio, e o diretrio para ser eliminado precisa estar vazio, sem subdiretrios e arquivos.
Exemplo DIRREMOVE("c:\teste\um\dois") // Eliminando um diretrio, sem testar o retorno bResult := DIRREMOVE("c:\teste\um") // Elimina e testa o retorno IF bResult ? "Impossivel excluir o diretrio" ENDIF
DIRMAKE() DIRCHANGE()
Dow
Converte uma data para o valor numrico do dia da semana.
Sintaxe DOW( dData ) --> Numrico Argumento dData Obrigat. Sim Tipo D Descrio o valor da data a converter.
Descrio 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.
Descrio 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.
Exemplos Estes exemplos mostram como usar CDOW() e o seu relacionamento com DOW(): dData := DATE() nDiaDaSemana := cDiaDaSemana := nDiaDaSemana := cDiaDaSemana := // Resultado: 09/01/01 DOW(DATE()) // Resultado: 3 CDOW(DATE()) // Resultado: Tuesday DOW(DATE() - 2) // Resultado: 1 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 - DOW(dData) + 2)
Dtoc
Sintaxe DTOC( dData ) --> Caracter Argumento dData Obrigat. Sim Tipo D Descrio o valor a converter.
Retorno Caracter
Descrio 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.
Descrio DTOC() converte uma data para uma cadeia de caracteres formatada segundo o padro corrente, definido pelo comando SET DATE. Se for necessria a utilizao de formatao 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.
Exemplos cData := DATE() // Resultado: 09/01/90 cData := DTOC(DATE()) // Resultado: 09/01/90 cData := "Today is " + DTOC(DATE()) // Resultado: Today is 09/01/90
CTOD()
DATE() DTOS()
Dtos
Converte uma data para uma cadeia de caracteres no formato yyyymmdd.
dData
Sim
Retorno Caracter
Descrio Retorna uma cadeia de caracteres com oito byte de tamanho no formato yyyymmdd. Quando dData nulo ou invalido, DTOS() retorna uma cadeia de caracteres com oito espaos. O valor retornado no afetado pela formato da data corrente.
Descrio 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).
Exemplos cData := DATE() // Resultado: 09/01/90 cData := DTOS(DATE()) // Resultado: 19900901 nLen := LEN(DTOS(CTOD(""))) // Resultado: 8 Este exemplo mostra como criado um ndice composto usando DTOS(): USE Vendas NEW INDEX ON DTOS(Data) + Vendedor TO DataNome CTOD()
DATE() DTOC()
Eject
Fora a impresso de nova pgina no relatrio.
PROW( ) para 0.
Exemplo SETPRC(0,0) // inicia impressao na linha 0 coluna 0 PCOL( 10 ) //muda para coluna 10 @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PRNFLUSH( ) // Forca impressao antes do termino da pagina. PROW( PROW( )+2 ) // Pula 2 linhas PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) //PROW( 0 ) // Salta a pagina EJECT( ) // Salta de pagina FECHAREL( ) // Fecha impressao
ElapTime
Retorna o tempo decorrido entre duas horas.
Sintaxe ElapTime( cHoraInicial , cHoraFinal ) --> Caracter Argumento cHoraInicial cHoraFinal Obrigat. Sim Sim Tipo C C Descrio Informe a hora inicial no formato hh:mm:ss, onde hh a hora ( 1 a 24 ), mm os minutos e ss os segundos Informe a hora final no formato hh:mm:ss, onde hh a hora ( 1 a 24 ), mm os minutos e ss os segundos.
Retorno Caracter
Descrio
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.
Exemplos Este exemplo compara ELAPTIME(): cHoraInicio := TIME() // Resultado: 10:00:00 . . <instrucoes> . cElapsed := ELAPTIME(TIME(), cHoraInicio)
TIME()
FClose
Fecha um arquivo binrio e grava os buffers no disco.
Sintaxe FCLOSE( nHandle ) --> Lgico Argumento nHandle Obrigat. Sim Tipo N Descrio Handle a ser fechado
Retorno .F.
Descrio 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.
Descrio Fecha um manipulador ( handle ) de um arquivo binrio. Este manipulador deve ter sido aberto atravs das funes FOPEN(), FOPENPORT(), FCREATE().
Exemplo O exemplo abaixo utiliza o CLOSE para fechar um arquivo. #include "Fileio.ch" // nHandle := FCREATE("Testfile", FC_NORMAL) IF !FCLOSE(nHandle) conout ("Erro fechando arquivo:" + Str(FError( 0 )
ENDIF
FCreate
Cria um arquivo, ou elimina o contedo de um arquivo.
Sintaxe FCREATE( cArq, [ nAtributo ]) --> nHandle Argumento Obrigat. Tipo Descrio Nome do arquivo a ser criado, o caminho pode ser includo. So vlidos caminhos no local (remote) e no servidor. Atributos no qual o arquivo ser criado.
cArq
nAtributo
Opcional
Retorno >0 -1
Descrio Numrico. O Handle do arquivo para ser usado nas demais funes de arquivo.
Erro na criao do arquivo, verifique FERROR() para obter maiores detalhes do erro.
Descrio 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.
Os Atributos para criao do arquivo esto abaixo, e esto definidos no header fileio.ch.
Criao normal do Arquivo (default/padro). Cria o arquivo protegido para gravao. Cria o arquivo como oculto. Cria o arquivo como sistema.
Note que se o arquivo existir, o contedo ser truncado para zero bytes.
Exemplo #include "Fileio.ch" IF (nHandle := FCREATE("Testfile", FC_NORMAL)) == -1 ? "Arquivo no pode ser criado", FERROR() BREAK ELSE FWRITE(nHandle, "ola!!!") FCLOSE(nHandle) ENDIF
FErase
Apaga um arquivo do disco.
Sintaxe FERASE( cArq ) --> nSucesso Argumento Obrigat. Tipo Descrio Apaga um arquivo do disco, aceita caminhos locais (Remote), ou caminhos no servidor Advanced Protheus.
cArg
Retorno
-1
Descrio 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).
Exemplos // Este exemplo apaga todos os arquivos .BAK do diretrio corrente. #include "Directry.ch" AEVAL(DIRECTORY("*.BAK"), { |aFile| FERASE(aFile[F_NAME]) }) /// Este exemplo apaga um arquivo no cliente ( Remote ) e imprime uma mensagem caso // ele apresente erro. IF FERASE("AFile.txt") == -1 ? "File erase error:", FERROR() BREAK ENDIF
FRENAME()
FError
Verifica se houve erros aps uma operao com arquivos binrios.
Sintaxe FERROR() --> Numrico Retorno 0 2 3 4 5 6 8 Descrio Operao realizada com sucesso. Sem erros Arquivo no encontrado Caminho no encontrado Muitos arquivos abertos Acessso negado Manipulador Invalido ( Handle ) Memria Insuficiente
15 19 21 23 29 30 32 33
Drive invlido especificado Tentativa de gravar em disco protegido contra-gravao Drive No esta pronto Dados com erro de CRC Erro de gravao Erro de leitura Violao de compartilhamento Erro de Lock
Descrio FERROR() a funo que retorna o cdigo de erro mais especfico, aps a execuo de funes com arquivos binrios, tais como: FOPEN(), FCLOSE(), FWRITE(), FREAD(). Se FERROR() retornar zero, indica sucesso na ltima operao. FERROR() sempre retorna o estado da ultima operao.
Exemplo #include "Fileio.ch" // nHandle := FCREATE("Temp.txt", FC_NORMAL) IF FERROR() != 0 conout ("Erro ao criar o arquivo, Erro:" Str(FError()) ENDIF
FieldBlock
Retorna um bloco de cdigo para um campo determinado da tabela corrente.
Sintaxe FIELDBLOCK( cCampo ) --> Bloco de Cdigo Argumento Obrigat. Tipo Descrio
cCampo
Retorno bBloco
Descrio Bloco de cdigo. Bloco de cdigo para o campo especificado na tabela corrente.
Descrio 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
Exemplo // Este exemplo mostra como se pode usar o FIELDBLOCK para criar o bloco de cdigo para o campo Nome da tabela corrente na varivel bBloco: USE Cliente VIA "DBFCDX" NEW bBloco := FIELDBLOCK("Nome")
FIELDWBLOCK( )
FieldWbl
Retorna um bloco de cdigo para um campo determinado especificando a rea de trabalho.
Sintaxe FIELDWBLOCK(<cCampo>,<nArea>) --> Bloco de Cdigo Argumento CCampo CArea Obrigat. S S Tipo C N Descrio Nome do campo a ser retornado o bloco de cdigo. Nmero da rea de trabalho a ser criado o bloco de cdigo.
Retorno bWBloco
Descrio Bloco de cdigo. Bloco de cdigo para o campo especificado na rea de trabalho determinada.
Descrio
Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especificado em determinada rea de trabalho. Sendo que quando o bloco resultante executado sem valor recupera o valor armazenado no campo, mas quando executado com um 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
Exemplo // Este exemplo mostra como se pode usar o FIELDWBLOCK para criar o bloco de cdigo para o campo Nome da rea de trabalho 3 na varivel bBloco: USE Cliente VIA "DBFCDX" NEW bBloco := FIELDBLOCK("Nome",3) FIELDBLOCK
File
Verifica se um arquivo ou mscara de arquivos existem.
Sintaxe FILE( cArquivo ) --> lExiste Argumento Obrigat. Tipo Descrio Nome do arquivo podendo incluir caminhos. Caminhos locais (Remote) ou caminhos de servidor so aceitos.
CArquivo
Descrio Verifica se existe um arquivo ou um padro de arquivos, no diretrio. Os caracteres * e ?. so aceitos. Caminhos de servidor e locais so aceitos.
FILE("\SIGAADV\TESTE.dbf") // // Verifica no diretrio Sigaadv do servidor se corrente e se existe o arquivo teste.dbf FILE("C:\TEMP\TESTE.dbf") // // Verifica no diretrio Temp do cliente (Remote) se existe o arquivo teste.dbf
DIRECTORY() ADIR()
FOpen
Abre um arquivo binrio.
Sintaxe FOPEN( cArq , nModo ]) --> Numrico Argumento cArq Obrigat. Sim Tipo C Descrio Nome do Arquivo a ser aberto em modo binrio. 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.
nModo
No
Retorno -1 >0
Descrio Erro na abertura do arquivo. Verifique FERROR() para maiores detalhes do erro Handle do arquivo, a ser usado com as demais funes de arquivo
Descrio FOPEN() abre um arquivo de modo binrio, permitindo a leitura ou gravao atrves das funes FWRITE(). Todo arquivo aberto atravs da FOPEN(), deve ser fechado atravs da
FREAD(),
FCLOSE().
O modo de abertura composto de modo de acesso e modo de compartilhamento, esses modos esto descritos em fileio.ch.
FO_WRITE FO_READWRITE Modos de Compartilhamento FO_COMPAT FO_EXCLUSIVE FO_DENYWRITE FO_DENYREAD FO_DENYNONE FO_SHARED
Modo de compatibilidade ( Padro ) Exclusivo No permite que outros abram o arquivo para gravao No permite que outros abram o arquivo para leitura permite leitura e gravao 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 ).
Exemplo 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 := FOPEN("Temp.txt", FO_READWRITE + FO_SHARED) IF FERROR() != 0 ? "Impossivel abrir o arquivo, Erro : ", FERROR() BREAK ENDIF
FOpenPort
Abre uma porta paralela ou serial.
Tipo C C
Descrio Nome do Dispositivo a ser usado. Caractersticas do dispositivo, apenas vlido para portas seriais. Os parmetros so: Velocidade (BPS), Paridade, DataBits, StopBits, Timeout de leitura ( Opcional ). 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.
nModo
No
Retorno -1 >0
Descrio Erro na abertura do arquivo. Verifique FERROR() para maiores detalhes do erro Handle do dispositivo, a ser usado com as demais funes de arquivo.
Descrio FOPENPORT() abre um dispositivo, permitindo a leitura ou gravao atrves das funes Todo arquivo aberto atravs da FOPENPORT(), deve ser fechado atravs da funo
FREAD(), FWRITE().
FCLOSE().
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 FO_WRITE FO_READWRITE Modos de Compartilhamento FO_COMPAT FO_EXCLUSIVE FO_DENYWRITE FO_DENYREAD FO_DENYNONE FO_SHARED Modo de compatibilidade ( Padro ) Exclusivo No permite que outros abram o arquivo para gravao No permite que outros abram o arquivo para leitura permite leitura e gravao. Igual ao FO_DENYNONE Apenas Leitura Apenas Gravao Leitura e Gravao
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) Paridade DataBits StopBits Timeout de leitura N ( Default, Sem Paridade ), E ( Par ), O ( Impar ). 6,7 ou 8 ( Default ) Bits. 1 ( default ) ou 2 Bits. 1000 ( Default ), Valores acima de zero. Tempo em milisegundos de espera por dados a serem lidos.
Exemplo 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 := FOPENPORT("LPT1:", "", FO_WRITE) IF FERROR() != 0 ? "Impossivel abrir a impressora LPT1, Erro : ", FERROR() BREAK ENDIF Este exemplo abre uma porta serial e espera para obter uma leitura da porta. #include "Fileio.ch" // CURDIR( "C:\TEMP" ) // Posicionando no diretrio cliente ( Remote ) nHandle := FOPENPORT("COM1:", "9600,N,8,1,10000", FO_WRITE) IF FERROR() != 0 ? "Impossivel abrir a impressora LPT1, Erro : ", FERROR() BREAK ENDIF FREAD(
FRead
L caracteres binrios de um arquivo.
Sintaxe FREAD( nHandle , @cBuffer , nQtdBytes ) --> Numrico Argumento nHandle cBufferVar Obrigat. Sim Sim Tipo N C Descrio o manipulador retornado pelas funes FOPEN(), FCREATE(), FOPENPORT() 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 nQtdBytes. Esta varivel deve ser sempre passada por referncia. ( @ antes do nome da varivel ) nQtdBytes Retorno Numrico Sim N Descrio Quantidades de bytes lidos. Caso a quantidade seja menor que a solicitada, indicar erro ou final de arquivo. Verifique FERROR() para obter maiores detalhes Nmero mximo de bytes que devem ser lidos.
Descrio FREAD() l a partir um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados e armazena no buffer informado. FREAD() l normalmente caracteres de controle (ASC 128, ASC 0, etc.). FREAD() ler at o nmero de bytes informado em nQtdBytes; caso acontea algum erro ou o arquivo chegue ao final, FREAD() retornar um nmero menor que o nQtdBytes. O buffer passado para leitura deve ser sempre pr-alocado e passado como referncia. Caso contrrio, os dados no podero ser retornados. FREAD() l a partir da posio atual do ponteiro, que pode ser ajustado pelo FREADSTR().
Exemplos Este exemplo l 128 bytes em um buffer. #define F_BLOCK 128 // cBuffer := SPACE(F_BLOCK) nHandle := FOPEN("Temp.txt") // IF FERROR() != 0 ? "Abertura de arquivos com erro: ", FERROR() ELSE IF FREAD(nHandle, @cBuffer, F_BLOCK) <> F_BLOCK ? "Erro lendo arquivo" ENDIF FCLOSE(nHandle) ENDIF
FReadStr
L caracteres de um arquivo binrio.
Sintaxe FREADSTR( nHandle , nQtdBytes ) --> Caracter Argumento NHandle Obrigat. Sim Tipo N Descrio o manipulador retornado pelas funes FOPEN(), FCREATE(), FOPENPORT(). Nmero mximo de bytes que devem ser lidos.
NQtdBytes
Sim
FREAD() ler at o nmero de bytes informado em nQtdBytes ou at encontrar um CHR(0). Caso acontea algum erro ou o arquivo chegue ao final, FREAD() retornar uma string menor do que nQdBytes 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().
Exemplos 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(nHandle, 16) ? cString FCLOSE(nHandle) ENDIF
Frename
Muda o nome de um arquivo.
Sintaxe FRENAME(cNomeAntigo, cNovoNome) --> nSucesso Argumento cOldFile cNewFile Obrigat. S S Tipo C C Descrio Nome do arquivo ser renomeado, aceita caminhos do servidor e caminhos do cliente. Novo nome do arquivo, aceita tambm caminho do servidor, e caminho do cliente.
Retorno
Descrio A mudana foi executada com sucesso. 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.
-1
Descrio FRENAME() renomeia um arquivo para outro nome, tanto no servidor como na estao. Ao renomear um arquivo no esquea que esta arquivo dever estar fechado.
Exemplos // Renomeando arquivos no cliente. IF FRENAME("C:\TEMP\ArqAntigo.txt", "C:\TEMP\ArqNovo.txt") == -1 ? "Erro ao renomear ", FERROR() ENDIF // Renomeando arquivos no Servidor. IF FRENAME("\SIGAADV\ArqAntigo.txt", "\SIGAADV\ArqNovo.txt") == -1 ? "Erro ao renomear ", FERROR() ENDIF
@FERROR() @FILE()
FSeek
Posiciona o arquivo binrio.
Sintaxe FSEEK( nHandle , nOffset , [ nOrigem ]) --> Numrico Argumento NHandle NOffset Obrigat. Sim Sim Tipo N N Descrio Manipulador obtido atravs das funes FOPEN, FCREATE. 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. Indica a partir de qual posio do arquivo, o nOffset ser considerado.
No
N Descrio
Descrio 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:
Ajusta a partir do inicio do arquivo. Ajuste relativo a posio atual do arquivo. Ajuste a partir do final do arquivo
Exemplo // Exemplo calcula o tamanho do arquivo. #include "Fileio.ch" // // Abre o arquivo apenas para leitura IF (nHandle := FOPEN("Temp.txt")) >= 0 // // Pega o tamanho do arquivo nLength := FSEEK(nHandle, 0, FS_END) // FCLOSE(nHandle) ELSE ? "Erro na abertura do arquivo", FERROR() ENDIF
FWrite
Grava em um arquivo binrio.
Sintaxe FWRITE( nHandle , cBuffer , [ nQtdBytes ]) --> Numrico Argumento NHandle CBuffer Obrigat. Sim Sim Tipo N C Descrio o manipulador retornado pelas funes FOPEN(), FCREATE(), FOPENPORT(). o nome de um buffer de onde os dados sero gravados. O tamanho desta varivel deve ser maior ou igual ao tamanho informado em nQtdBytes (caso seja informado o tamanho). Quantidade de bytes a serem gravados.
No
Descrio Quantidade de bytes efetivamente gravados. Se o retorno for menor que o nQtdBytes, houve um erro na gravao. Verifique FERROR() para mais detalhes.
Descrio FWRITE() grava em um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados do buffer informado. FWRITE() grava normalmente caracteres de controle ( ASC 128, ASC 0, etc. ). FWRITE() gravar at o nmero de bytes informado em nQtdBytes; caso acontea algum erro, retornar um nmero menor que o nQtdBytes. FWRITE() grava a partir da posio atual do ponteiro, que pode ser ajustado pelo
FREADSTR().
Exemplos 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 FWRITE(nOutfile, cBuffer, nBytesRead) < ; nBytesRead ? "Erro gravando: ", FERROR() lDone := .T. ELSE lDone := (nBytesRead == 0) ENDIF ENDDO //
FCLOSE(nInfile) FCLOSE(nOutfile)
GetClientDir
Retorna o diretrio onde est instalado o Remote. Sintaxe GetClientDir( ) --> cDir Retorno cDir Descrio Retorna o diretrio onde o Remote est instalado. Exemplo ? GetClientDir() // Imprime o diretrio onde est instalado o remote // Exemplo de sada // c:\ap6\bin\remote Descrio Caracter, diretrio aonde est instalado o remote.
CURDIR( )
GetImpWindows
Retorna lista de impressoras disponveis para impresso.
Sintaxe GETIMPWINDOWS( lServer ) --> Array Argumento lServer Obrigat. Sim Tipo L Descrio Informar .T. se desejar lista de impressoras do Server e .F. se desejar lista de impressoras do Remote.
Retorno
Descrio
Array
Descrio 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 PREPAREPRINT( )).
GetPortActive
Retorna lista de portas de impresso disponveis.
Sintaxe GETPORTACTIVE ( lServer ) --> Array Argumento lServer Obrigat. Sim Tipo L Descrio Informar .T. se desejar lista de impressoras do Server e .F. se desejar lista de impressoras do Remote.
Retorno Array
Descrio 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.
Header
Verifica o tamanho do cabealho da tabela corrente.
Sintaxe HEADER() --> Numrico Retorno 0 NBytes Descrio No h tabela corrente Tamanho do cabealho da tabela corrente em nmero de bytes
Descrio Esta funo pode ser utilizada em conjunto com as funes RecSize e RecCount para calcular o tamanho ocupado no disco pela tabela corrente. Pois, o tamanho ser Header+RecSize*RecCount.
Exemplo // Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmero de bytes): USE "\DADOSADV\AA1990.DBF" SHARED NEW nCabecalho := HEADER() nDados := RecSize() * RecCount() nTamanhoTotal := nCabecalho + nDados
RECSIZE
RECCOUNT
IndexKey
Verifica qual a expresso de chave de um ndice.
Sintaxe INDEXKEY( nOrdem ) --> Caracter Argumento nOrdem Retorno "" cExpOrdem Obrigat. S Descrio No existe ndice para o parmetro nOrdem corrente. Expresso de chave da ordem ativa ou especificada pelos parmetros. Tipo N Descrio Posio do ndice na lista.
Descrio 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. Exemplo // Este exemplo mostra como o INDEXKEY() pode recuperar a expresso do ndice atual: USE Cliente NEW INDEX ON Nome+Cod TO Ind1 FOR Nome+Cod > "AZZZZZZZ" INDEX ON Nome TO Ind2 FOR Nome > "CCCCCCC" INDEXKEY(1) // Retorna: Nome+Cod INDEXKEY(2) // Retorna: Nome INDEXKEY(0) // Retorna: Nome expresso corrente
ORDKEY( )
IndexOrd
Verifica a posio do ndice corrente.
0 nOrd
Descrio Esta funo retorna a posio ocupada pelo ndice corrente dentro da lista de ndices.
Exemplo // Este exemplo verifica qual a posio do ndice corrente dentro da lista USE Cliente NEW SET INDEX TO Nome, End, Cep INDEXORD() // Returns: 1 - o primeiro ndice da lista
ORDBAGEXT
ORDCREATE( )
ORDBAGNAME ORDNAME
InitPrint
Inicializa parmetros de impresso de relatrio.
Sintaxe INITPRINT([ nOutPut ], [ cNameRel ], [ cType ] ,[ lPort ],[ cPathAtu ]) --> NIL Argumento NOutPut cNameRel cType Obrigat. No No No Tipo N C C Descrio Direcionamento da sada de impresso. 1=via Client (padro) e 2=via Server Nome do relatrio que ser exibido no spool de impresso Tipo do relatrio. "220" = 220 colunas, "132L"= 132 colunas landscape (Padro), "132P"= 132 colunas portrait, "080" = 80 colunas portrait No utilizado No utilizado
L L
Descrio INITPRINT() inicializa parmetros de impresso de relatrio. Define onde ser a sada de impresso e qual vai ser a formatao de sada.
Exemplo
/* Inicializa relatrio para imprimir via Client "Meu relatrio" em formulrio de 132 colunas em Landscape */ InitPrint( 1,"Meu relatrio", "132L" )
IsCisaSyncOn
Verifica se o uso do CisaSync est habilitado.
Sintaxe IsCisaSyncON() -> Lgico Retorno .F. .T. Descrio No est habilitado. Est habilitado.
Descrio Esta funo utilizada para verificar se o uso do CisaSync est habilitado ou no.
Exemplo // Este exemplo demonstra como se pode utilizar IsCisaSyncOn verificar se o CisaSync est habilitado. USE Cliente NEW IF (ISCISASYNCON()) QOUT("CisaSync habilitado") ELSE QOUT("CisaSync desabilitado") ENDIF
IsPrinter
Verifica se impressora est disponvel.
Sintaxe ISPRINTER( [ xPorta ], [ lSeta ], [ nWhere ], [ @nErrorCode ] ) --> Lgico Argumento xPorta lSeta nWhere nErrorCode Retorno .T. .F. Obrigat. No No No No Descrio Impressora ativa Impressora inativa Tipo C N L N N ou Descrio Informar a porta que desejamos verificar "LPT1" (padro), "LPT2" , "COM1", "COM2" ou 1=LPT1, 2=LPT2. No utilizado 1= testa impressora no Remote (default), 2= testa impressora no Server. Retorna o cdigo de erro da impressora
Descrio 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 nErrorCode no ser informado.
Exemplo If !isPrinter(1,,1,@nErr) // testa se impressora esta conectada na lpt1 no Remote. MsgBox("Impressora no conectada! Erro: "+Str(nErr)) endif
PRNFLUSH( ) EJECT( )
GETIMPWINDOWS( ) GETPORTACTIVE( )
MakeDir
Cria um diretrio.
Sintaxe MAKEDIR( cNovoDir ) --> Numrico Argumento CNovoDir Obrigat. Sim Tipo C Descrio Nome do diretrio a ser criado, incluindo opcionalmente o caminho.
Retorno 0 -1
Exemplo MAKEDIR("c:\teste\um") // Cria um diretrio na estacao nResult := MAKEDIR("\teste\um") // Cria o diretorio no servidor Advanced protheus IF nResult != 0 conout("Impossivel criar o diretrio no servidor Protheus" + Str(nResult)) ENDIF MAKEDIR( "teste" ) // Exemplo tambm vlido ( Criando o diretrio no servidor)
DIRMAKE() DIRCHANGE()
DIRREMOVE()
MemoLine
Extrai uma linha de uma string ou de um campo memo.
Sintaxe
MEMOLINE( cString, [ nLineLength ], [ nLineNumber ], [ nTabSize ], [ lWrap ]) --> Caracter Argumento cString nLineLength nLineNumber nTabSize lWrap Obrigat. Sim No No No No Tipo C N N N L Descrio a string original de onde ser extrada a linha. Nmero de caracteres por linha. Caso no especificado, assume 79. Nmero da linha a ser retornada. Caso no especificado, assume 1. Define o nmero de caracteres para o Tab. Caso no especificado, assume 4. Habilita a quebra de linhas de acordo com as palavras. Caso no especificada, fica habilitado.
Retorno Caracter
Descrio Caracter. Retorna a linha solicitada, caso no exista o nmero de linhas, retorna uma string em branco.
Descrio MemoLine() uma funo que retorna uma linha especfica. Caso no exista a linha 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.
Exemplos LOCAL nLineLength := 40, nTabSize := 3, lWrap := .T. LOCAL nLines, nCurrentLine // LOCAL cTexto := MEMOREAD( "Texto.TXT" ) nLines := MLCOUNT(cTexto, nLineLength, nTabSize, lWrap) // FOR nCurrentLine := 1 TO nLines conout (MEMOLINE(CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap)) NEXT
MemoRead
L um arquivo texto e retorna uma string.
Argumento CFile
Obrigat. Sim
Tipo C
Descrio Nome do arquivo texto que dever ser lido. Caminhos podem ser includos.
Retorno varivel
Descrio Caracter. MEMOREAD() retorna uma string com no mximo 65.535 bytes do arquivo informado.
Descrio MemoRead() l um arquivo texto e armazena o contedo em uma varivel string. O arquivo pode conter no mximo 65.535 bytes. MemoRead() tentar abrir o arquivo compartilhado e somente para leitura. Caso o arquivo no possa ser aberto, MemoRead retornar uma string vazia ( "" ).
MEMOWRITE()
MemoWrite
Grava uma string para um arquivo em disco.
Sintaxe MEMOWRITE( cArquivo , cString ) -->Lgico Argumento cArquivo CString Retorno .T. .F. Obrigat. Sim Sim Tipo C C Descrio O Arquivo foi gravado com sucesso Houve falha na criao e gravao do arquivo, verifique FERROR() para obter detalhes o erro. Descrio o nome do arquivo onde ser gravado, incluindo a extenso e o caminho. a string que ser gravada no arquivo.
Descrio MEMOWRITE() uma funo que grava o contedo de uma string em um arquivo em disco. Podem ser usados caminhos tanto no local ( Remote ) como no servidor.
Exemplos LOCAL cString := "Teste de gravao" IF MEMOWRITE("teste.txt", cString) conout("Erro gravando teste.txt") ENDIF
MEMOREAD()
MLCount
Conta o nmero de linhas de uma String.
Sintaxe MLCOUNT( cString , [ nLineLength ], [ nTabSize ], [ lWrap ]) --> Numrico Argumento cString NLineLength nTabSize lWrap Obrigat. Sim No No No Tipo C N N L Descrio a string original de onde ser extrada a linha. Nmero de caracteres por linha. Caso no especificado, assume 79. Define o nmero de caracteres para o Tab. Caso no especificado, assume 4. Habilita a quebra de linhas de acordo com as palavras. Se no especificado, fica habilitado.
Retorno >=0
Descrio MLCOUNT() retorna o nmero de linhas de uma string baseado nos parmetros informados.
Exemplos LOCAL nLineLength := 40, nTabSize := 3, lWrap := .T. LOCAL nLines, nCurrentLine // LOCAL cTexto := MEMOREAD( "Texto.TXT" ) nLines := MLCOUNT(cTexto, nLineLength, nTabSize, lWrap) // FOR nCurrentLine := 1 TO nLines conout(MEMOLINE(CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap)) NEXT
Month
Converte o valor da data para o nmero do ms.
Sintaxe MONTH( dData ) --> Numrico Argumento dData Obrigat. Sim Tipo D Descrio o valor da data a ser convertido
Descrio MONTH() uma funo de converso que extrai da data o valor numrico do ms. CMONTH() uma funo semelhante que retorna o nome do ms a partir do valor de dData.
Exemplos Estes exemplos retornam o ms da data do sistema: dData := DATE() // Resultado: 09/01/01 nMes := MONTH(DATE()) // Resultado: 9 nMes := MONTH(DATE()) + 1 // Resultado: 10
MsCompress
Compacta um ou vrios arquivos em um nico arquivo com extenso .MZP.
Sintaxe MSCOMPRESS( cArq, [ cDestino ], [ cSenha ] ) --> lSucesso Ou MSCOMPRESS( aArquivos, [ cDestino ], [ cSenha ] ) --> lSucesso
Tipo C A
Descrio Nome do Arquivo a ser compactado. Nomes dos arquivos a serem compactados. Nome do Arquivo destino, caso a extenso seja omitida ser assumido .MZP, se no for informado assumir o mesmo nome do cArq com extenso .MZP ou o nome do 1. Arquivo no Array aArquivos. Senha a ser utilizada para criptografar o arquivo.
cDestino
No
cSenha
No
Descrio A compactao foi executada com sucesso. Erro na compactao, verifique o espao disponvel para compactao.
Descrio 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.
Exemplos // Exemplo 1 Compacta apenas um arquivo lRes := MSCOMPRESS( "AP6SRV.EXE", "AP6SRV.MZP" ) // Exemplo 2 Compacta um diretrio com senha aNome := {} ADIR( "*.DBF", aNome ) lRes := MSCOMPRESS( aNome, "ArqComp.MZP", "SENHA" )
MSDECOMP()
MsCRC32
Sintaxe MSCRC32( cString ) --> nCRC Argumento Obrigat. Tipo Descrio 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.
CString
Sim
Retorno nCRC
Descrio 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.
MSCRC32STR()
MsCRC32Str
Calcula um CRC de uma string, retornando em formato String.
Sintaxe MSCRC32STR( cString ) --> cCRC. Argumento Obrigat. Tipo Descrio 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
cString
Sim
Retorno
Descrio
nCRC
Descrio 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.
MSCRC32()
MsDecomp
Descompacta arquivos no formato .MZP (Microsiga Zip).
Sintaxe MSDECOMP( cArqZip, cPathDestino, [ cSenha ] ) --> lSucesso. Argumento cArq cPathDestino Obrigat. Sim No Tipo C C Descrio Nome do Arquivo a ser descompactado. Diretrio onde os arquivos devero ser descompactados. Note que podem ser includos caminhos do servidor como caminhos locais ( Remote ). Senha a ser utilizada para descriptografar o arquivo.
cSenha
No
Descrio A descompactao foi executada com sucesso. Erro na compactao, verifique o espao disponvel para descompactao.
Descrio 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.
Exemplo // Exemplo 1 Descompacta no servidor lRes := MSDECOMP( "AP6SRV.MZP", "TEMP" ) // Exemplo 2 Descompacta no local ( Remote ) lRes := MSCOMPRESS( "c:\ArqComp.MZP", "SENHA" )
MSCOMPRESS()
MsgBox
Tipo: Tela Windows Abre uma caixa de dialogo padronizada para informar o usurio de um Erro deciso a ser tomada ou apenas uma informao (Registro Gravado com sucesso). Sintaxe MSGBOX(cMensagem,cTtulo,cTpCaixa) Parmetros cMensagem Define a mensagem apresentada no interior da janela cTtulo Titulo da janela cTpCaixa Tipo da caixa padronizada Retorno Retorna Nil ou um valor lgico (.T. ou .F.) conforme o tipo de caixa. Comentrios As caixas assumem o tamanho de <cMensagem>. Tipos de caixas: STOP, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. INFO, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. ALERT, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. YESNO, utiliza um bitmap para advertncia e tem dois botes Sim e No, retorna .T. ou .F. RETRYCANCEL, utiliza um bitmap para advertncia e tem dois botes Repetir e Cancelar, retorna .T. ou .F.
OrdCondSet
Seta a condio e o escopo para a ordem corrente.
Sintaxe ORDCONDSET([ cForCond ],,,,[ bEval ],,,,,, [ lDescendente ],,,,) --> Lgico
Obrigat. No No
Descrio Expresso na forma textual a ser resolvida para verificar se o registro em questo est dentro do escopo definido Expresso na forma executvel a ser resolvida para cada registro processado. Este bloco deve retornar tipo lgico Especifica se a ordem deve ser crescente ou decrescente
lDescendente
No
Descrio 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.
Exemplo // Este exemplo mostra como se pode usar o ORDCONDSET para executar um filtro com idade entre 20 e 30 anos e nome Joao: USE Cliente VIA "DBFCDX" NEW ORDCONDSET("Idade>20 .AND. Idade<30",,,,{||Nome = "Joao"})
OrdCreate
Cria uma ordem em determinado arquivo de ndice.
Sintaxe ORDCREATE([ cIndice ],[ cOrdem ], cExpChave, [ bExpChave ], [ lUnico ]) --> Nil
Obrigat. No * No *
Tipo C C
Descrio Nome do arquivo de ndice a ser criada a ordem. Nome da ordem a ser criada. Expresso das chaves da ordem a ser criada na forma de string.
cExpChave
Sim
bExpChave
No
Bloco de Cdigo
lUnico
No
*Obs: Os dois primeiros parmetros so opcionais, mas pelo menos um deles tem que estar especificado. Retorno NIL Descrio Sem retorno
Descrio 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.
Exemplo // 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 })
OrdDescend
Verifica ou altera a condio (crescente/decrescente) de uma ordem.
Obrigat. No No No No
Tipo C N C L
Descrio Nome da ordem a ser alterada Posio da ordem na lista a ser alterada Nome do arquivo de ndice
Descrio A ordem do parmetro est na forma crescente A ordem do parmetro est na forma decrescente
Descrio Esta funo pode ser utilizada para apenas verificar o estado da ordem atual, se no for especificado o parmetro lDecrescente. Quando especificado o parmetro lDescend, 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 ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automaticamente se o parmetro numrico ou caracter.
Exemplo
// 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 ORDDESCEND() // Retorna: .F. ORDDESCEND(,,.T.) // Retorna: .F., mas seta a ordem atual (NOME) como decrescente ORDDESCEND() // Retorna: .T. ORDLISTADD ("\teste\ind2.cdx","NOME") ORDDESCEND("NOME","ind1",.F.) // Retorna: .T. ORDDESCEND("NOME","ind1",) // Retorna: .F.
OrdKey
Verifica qual a expresso de chave da ordem.
Sintaxe ORDKEY([ cOrdem | nPosicao ],[ cArqIndice ]) --> Caracter Argumento cOrdem nPosicao cArqIndice Obrigat. No No No Tipo C N C Descrio Nome da ordem a ser alterada Posio da ordem na lista Nome do ndice
Descrio No existe ordem corrente. Expresso de chave da ordem ativa ou especificada pelos parmetros.
Descrio Esta funo utilizada para verificar qual a expresso de chave de determinada ordem. Caso no sejam especificados os parmetros de identificao da ordem, verificada a ordem corrente. Para evitar conflito, no caso de haver mais 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 ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automaticamente se o parmetro numrico ou caracter.
Exemplo // Este exemplo mostra como o ORDKEY() pode recuperar a expresso da ordem atual: USE Cliente NEW INDEX ON Nome+Cod TO Ind1 FOR Nome+Cod > "AZZZZZZZ" ORDKEY("Ind1") // Retorna: Nome+Cod
OrdListAdd
Acrescenta uma ou mais ordens lista.
Sintaxe ORDLISTADD( cArqIndice, [ cOrdem ]) --> Nil Argumento Obrigat. Tipo Descrio
cArqIndice
Sim
cOrdem
No
Descrio
Descrio 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.
Exemplo // 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 OrdListAdd ("\teste\ind1.cdx","NOME") // Acrescenta apenas a ordem NOME OrdListAdd ("\teste\ind2.cdx") // Acrescenta todas as ordens do arquivo ind2.cdx
Pack
Remove todos os registros deletados da tabela.
Sintaxe PACK
Descrio Este comando apaga (fisicamente) todos os registros deletados da tabela corrente.
Exemplo // Este exemplo demonstra como se pode utilizar a funo DBDELETE() 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() PACK
ZAP DBRECALL( )
PCol
Sintaxe PCOL( [ nNewCol ] ) --> Numrico Argumento nNewCol Obrigat. No Tipo N Descrio Informar a nova coluna de impresso.
Retorno N
Descrio PCOL( ) pode ser utilizado para informar a coluna corrente de impresso ou para modific-la. Se for informada uma coluna menor que a corrente, sero impressos caracteres de BACKSPACE chr(8) para forar o retorno do carro de impresso em impressoras matriciais.
Exemplo PCOL( 10 ) @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( PROW( )+2 ) // Pula 2 linhas PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina
PreparePrint
Sintaxe PREPAREPRINT( lWindows, cPrinterName, lDisco, cFile, l_Lpd, nLeftMargin ) --> NIL Argumento lWindows Obrigat. Sim Tipo L Descrio Define se a impresso ser via spool do Windows ou diretamente em porta de impresso. Informa o nome da impressora que ser acionada. Se lWindows=.T., deve-se informar o nome da impressora Windows. Se lWindow=.F., deve-se informar o nome da porta de impresso "LPT1","LPT2". Informa se a impresso ser direcionada para gravao em arquivo. Se lDisco=.T., lWindows e cPrinterName, no tero efeito ento deve-se informar o nome do arquivo de sada em cFile. Informa o nome de arquivo que ser gerado se lDisco=.T.. 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). Margem esquerda do relatrio para ajuste para encadernao em cm.
cPrinterName
Sim
lDisco
Sim
cFile l_lpd
Sim No
C L
nLeftMargin
No
Retorno NIL
Descrio PREPAREPRINT( ) ajusta a impresso do relatrio propriamente dita, define se utilizar o spool do Windows ou se o relatrio ser direcionado para arquivo. Pode-se ajustar a margem 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 l_lpd 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.
Exemplo
// Envia a impressao para a impressora "LaserJet4.." e configura a margem esquerda para 1 cm para direita PreparePrint( .T., "LaserJet4 in //advpr1",.F.,"",.F.,1 )
PrnFlush
Fora envio do buffer de impresso para a impressora.
Descrio 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.
Exemplo SETPRC(0,0) // inicia impresso na linha 0 coluna 0 PCOL( 10 ) //muda para coluna 10 @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PRNFLUSH( ) // Forca impresso antes do termino da pagina. PROW( PROW( )+2 ) // Pula 2 linhas PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina FECHAREL( ) // Fecha impresso
INITPRINT( )
PRow
Informa ou muda a linha corrente de impresso.
Sintaxe PROW( [ nNewLine ] ) --> Numrico Argumento nNewLine Obrigat. No Tipo N Descrio Informar a nova linha de impresso.
Retorno N
Descrio 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.
Exemplo @ PROW( ), 10 PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( PROW( )+2 ) // Pula 2 linhas @ PROW( ), 10 PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina
FECHAREL( )
RDDSetDefault
Modifica ou verifica o RDD padro.
Sintaxe RDDSetDefault ([ cNovoRddPadro ]) --> Caracter Argumento cNovoRddPadro Obrigat. No Tipo C Descrio Novo nome do RDD a ser definido como padro.
Retorno cAntigoRddPadro
Descrio Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for omitido seu parmetro. Ela tambm pode ser utilizada para especificar outro RDD como padro, especificando-o atravs do parmetro.
Exemplo // Este exemplo demonstra como se pode utilizar o RDDSETDEFAULT para alterar o valor do RDD padro. RDDSETDEFAULT("CTREECDX") // Retorna: DBFCDX RDDSETDEFAULT() // Retorna: CTREECDX
DBSETDRIVER( )
RDDNAME( ) RDDLIST( )
RealRDD
Retorna qual o driver que realmente est sendo utilizado para abertura dos arquivos locais.
Sintaxe
REALRDD() --> Caracter Retorno "ADS" "ADSSERVER" "CTREE" "CODEBASE" Descrio Advantage Local Server Advantage Database Server Ctree - Faircom Codebase
Descrio 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.
Recall
Altera o estado deletado de alguns registros.
Sintaxe RECALL [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL] Argumento CondFor CondWhile nRecs nRecno Obrigat. Sim No No No N N Tipo Descrio Expresso em ADVPL a ser resolvida para o registro ser aceito. Expresso em ADVPL que determina quando a busca deve parar (quando a expresso retornar .F.. Quando registros devem ser verificados. Nmero do recno do registro a ser verificado. Retorno NIL Descrio Sem retorno
Descrio 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
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.
Exemplo // 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
PACK DELETE
RecSize
Verifica o tamanho do registro da tabela corrente.
Sintaxe RECSIZE() --> Numrico Retorno nBytes 0 Descrio Tamanho do registro da tabela corrente em nmero de bytes. No h tabela corrente.
Descrio
Esta funo calcula o tamanho do registro da tabela corrente somando os tamanhos de cada campo mais um byte da flag de registro deletado mais quatro bytes do campo recno.
Ela pode ser utilizada em conjunto com as funes Header e RecCount para calcular o tamanho ocupado no disco pela tabela corrente, pois o tamanho ser Header+RecSize*RecCount.
Exemplo // Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmero de bytes): USE "\DADOSADV\AA1990.DBF" SHARED NEW nCabecalho := HEADER() nDados := RECSIZE() * RECCOUNT() nTamanhoTotal := nCabecalho + nDados
HEADER( )
RecCount( )
ReIndex
Reconstri todos os ndices abertos da rea de trabalho corrente.
Sintaxe REINDEX
Descrio Este comando reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro registro lgico.
Exemplo // Este exemplo demonstra como se pode utilizar o DBREINDEX para reconstruir os ndices depois que um novo ndice foi gerado. USE Clientes NEW DBSETINDEX("IndNome") REINDEX
DBSETINDEX( ) DBSETORDER( )
Replace
Modifica o valor de alguns campos e registros da tabela corrente.
Sintaxe REPLACE Campo WITH Exp [, Campo2 WITH Exp2 ] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Tipo
Descrio Nome do campo a ser alterado Expresso em especificado ADVPL com valor a ser colocado no campo
CondFor
No
Expresso em ADVPL a ser resolvida para que o registro seja alterado Expresso em ADVPL que determina quando a alterao deve parar (quando a expresso retornar .F.) N N Quando registros devem ser alterados Nmero do recno do registro a ser alterado
No No No
Descrio 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 CondFor" e "WHILE CondWhile". 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 DBGOTOP() antes de iniciar a alterao. Se desejado alterar apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD nRecno".
Exemplo // 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
RECALL REPLACE
RLock
Bloqueia o registro corrente da tabela ativa.
Sintaxe
RLOCK() --> Lgico Retorno .F. Descrio No conseguiu bloquear o registro. Principal motivo: o registro j est bloqueado por outro usurio. O registro foi bloqueado com sucesso.
.T.
Descrio Esta funo utilizada quando se tem uma tabela aberta e compartilhada, e se deseja bloquear um registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a funo no altera seu estado.
Exemplo //Este exemplo utiliza a funo RLOCK() para deletar o registro com o nome "Joao" da tabela de Clientes indexada por Nome: USE Clientes INDEX Nome SHARED NEW SEEK "Joao" IF FOUND() IF RLOCK() DELETE Messagebox("Joao deletado","OK", 0) ELSE Messagebox("Registro utilizado por outro usurio","Erro", 0) 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->(RLOCK()) Messagebox("Registro utilizado por outro usurio","Erro", 0) BREAK ENDIF
FLOCK( )
USED( )
Seconds
Retorna o nmero de segundos decorridos desde a meia-noite.
>=0 e <=86399
Retorna a hora do sistema em segundos. O valor numrico representa o nmero de segundos decorridos desde a meia-noite, baseado no relgio de 24 horas e varia de 0 a 86399.
Descrio Esta funo retorna o nmero de segundos decorridos desde a meia-noite, segundo a hora do sistema. Est relacionada funo TIME() que retorna a hora do sistema como uma cadeia de caracteres no formato hh:mm:ss.
Exemplos Este exemplo compara TIME() e SECONDS(): cHora := TIME() // Resultado: 10:00:00 cSegundos := SECONDS() // Resultado: 36000.00 Este exemplo usa a funo SECONDS() para cronometrar o tempo decorrido: LOCAL nStart, nElapsed nStart:= SECONDS() . . <statements> . nElapsed:= SECONDS() - nStart cElapsed := LTRIM(STR(nElapsed)) + " seconds"
TIME()
Seek
Encontra um registro com determinado valor da chave do ndice.
Sintaxe SEEK Exp [SOFTSEEK] Argumento Exp Obrigat. Sim Tipo Descrio Expresso em ADVPL a ser resolvida para o registro ser encontrado
Retorno NIL
Descrio
Este comando utilizado para encontrar um registro com determinado valor da expresso de chave de ndice. Antes da chamada do SEEK deve-se certificar de que existe uma ordem 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.
Exemplo // Este exemplo demonstra como se pode utilizar o SEEK para busca de valores numricos. USE Clientes NEW ORDLISTADD ("/teste/ind1.cdx") // Expresso Num (campo numrico) SEEK 100 // Retorna: .F. EOF() // Retorna: .T. SEEK 100 SOFTSEEK // Retorna: .F. EOF() // Retorna: .F. (pois o softseek posicionou no prximo registro) // Este exemplo demonstra como se pode utilizar o SEEK para percorrer todos 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) SEEK " 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( )
Select
Seleciona nova rea de trabalho.
Sintaxe SELECT nArea | Alias Argumento nArea Alias Obrigat. Sim Sim Tipo N Descrio Nmero da rea de trabalho a ser selecionada. Nome da identificao da rea de trabalho a ser selecionada (Alias).
Descrio Este comando utilizado para selecionar uma nova rea de trabalho para deix-la ativa. Exemplo // Este exemplo demonstra como se pode utilizar o SELECT alterar a rea corrente. USE Clientes ALIAS a1 USE Clientes2 ALIAS a2 SELECT a1 // ou SELECT 1 DBUSEAREA( )
ALIAS( )
Set Filter
Seta ou cancela uma condio de filtro. Sintaxe SET FILTER TO [ Condio ] Argumento Condio Obrigat. No Tipo Descrio Expresso em ADVPL a ser setada como filtro na ordem corrente
Retorno NIL
Descrio 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 DBGOTOP, DBSEEK, DBSKIP, etc). Se o comando chamado com condio em vazio, ser cancelado o filtro existente.
Exemplo // Este exemplo demonstra como utilizar o comando SET FILTER para setar novas expresses de filtro e retir-las: USE Cliente VIA "CTREECDX" NEW SET ORDER TO 2 // Seta a ordem de nome Nome do ndice Ind1 SET FILTER TO Idade>30 // Filtra os registros com Idade menor que 30 SET FILTER TO
DBSETFILTER
Set Index
Acrescenta todas as ordens de um ou mais arquivos de ndice lista.
Sintaxe SET INDEX TO [ ArqIndices ] [ ADDITIVE ] Argumento ArqIndices Obrigat. No Tipo Descrio Nome dos arquivos de ndice a serem acrescentados lista de ordens.
Retorno NIL
Descrio 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.
Exemplo // Este exemplo demonstra como utilizar o comando SET INDEX para lista e retir-las depois: USE Cliente VIA "CTREECDX" NEW SET INDEX TO ind1 // Inicializa a lista com as ordens do arquivo SET INDEX TO ind2 ADDITIVE // Acrescenta as ordens do arquivo de SET INDEX TO ind3 // Limpa a lista e inicializa com as ordens do SET INDEX TO // Limpa a lista de ordens acrescentar novas ordens a
Set Order
Seleciona uma ordem ativa da rea de trabalho.
Sintaxe SET ORDER TO [ nPosio | [ TAG cOrdem ] [ IN cIndice ]] Argumento Obrigat. Tipo Descrio
No No No
Posio da ordem na lista de ordens ativas Nome da ordem a ser setada Nome do arquivo de ndice a ser ao qual pertence a ordem a ser setada
Retorno NIL
Descrio Este comando pode ser utilizado apenas para retornar a tabela corrente ordem original (recno), se no for especificado nenhum parmetro. Tambm pode ser utilizado para 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 cIndice". Exemplo // Este exemplo demonstra como utilizar o comando SET ORDER para setar novas ordens e retirlas: USE Cliente VIA "CTREECDX" NEW SET ORDER TO TAG Nome IN Ind1 // Seta a ordem de nome Nome do ndice Ind1 SET ORDER TO 3 // Seta a terceira ordem da lista SET ORDER TO // Retira as ordens, setando a ordem natural da tabela DBORDLISTADD( )
DBSETORDER( )
SetPrc
Configura a linha e coluna correntes de impresso.
Sintaxe SETPRC( nLin, nCol ) --> NIL Argumento nLin nCol Obrigat. Sim Sim Tipo N N Descrio Informar a nova linha de impresso Informar a nova coluna de impresso
Retorno NIL
Descrio SETPRC( ) modifica a linha e coluna atuais de impresso assim como PCOL( ) e PROW( ) chamados separadamente. Exemplo SETPRC(0,0) // inicia impresso na linha 0 coluna 0 PCOL( 10 ) //muda para coluna 10 @ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( PROW( )+2 ) // Pula 2 linhas PCOL( 10 ) @ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) ) PROW( 0 ) // Salta a pagina
SetPrint
Interface onde so configuradas as opes de impresso.
Sintaxe SETPRINT( cAlias, cPrograma, [ cPerg ], [ cTitulo ], [ cDesc1 ], [ cDesc2 ], [ cDesc3 ], [ lDic ], [ aOrd ], [ lCompres ], [ cTam ], [ uPar1 ], lFiltro, [ lCrystal ], [ cNomeDrv ], [ uPar2 ], [ lServidor ], [ cPortaImpr ] ) > caracter Argumento cAlias cPrograma cPerg cTitulo cDesc1 cDesc2 Obrigat. Sim Sim No No No No Tipo C C C C C C Descrio Alias do arquivo a ser impresso. Nome do arquivo a ser gerado em disco Grupo de perguntas cadastrado no dicionrio SX1. Ttulo do relatrio Descrio do relatrio. Continuao da descrio do relatrio.
cDesc3 lDic aOrd lCompres cTam uPar1 lFiltro lCrystal cNomeDrv uPar2 lServidor cPortaImpr
No No No No No No No No No No No No
C L A L C U L L C U L C
Continuao da descrio do relatrio. Para impresso de cadastro genrico permite a escolha dos campos a serem impressos. Ordem(s) de impresso. Se verdadeiro (.T.) habilita escolha o formato da impresso. Tamanho do relatrio "P","M" ou "G". Parmetro reservado Se verdadeiro (.T.) permite a utilizao do assistente de filtro. Se verdadeiro (.T.) permite integrao com Crystal Report. Nome de um driver de impresso. Parmetro reservado. Se verdadeiro (.T.) fora impresso no servidor. Define uma porta de impresso padro.
Descrio 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.
Exemplo User Function <nome-da-funo>( ) Local cProgram := 'Exemplo' // nome do relatrio Local cAlias := 'XXX' // alias do arquivo Local cPerg := 'XXXXXX' // grupo de perguntas Local cTitulo := 'Titulo do relatrio' Local cDesc1 := 'Descrio' Local cDesc2 := 'continuao da descrio' Local cDesc3 := 'continuao da descrio' Local lDic := .F. // no utiliza dicionrio Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 } Private wrel
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58
IncRegua()
dbSkip() End IF nLin != 80 nLin++ If nLin > 60 Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) Endif @ nLin,000 PSAY __PrtThinLine()
// cabealho
Roda( 0, cTitulo, cTamanho ) // Rodap EndIf If aReturn[5] = 1 Set Printer TO dbCommitAll() OurSpool( wrel )
Endif
MS_FLUSH()
Return
Skip
Desloca a tabela para outro registro.
Sintaxe
SKIP [nRegistros] [nArea | ALIAS Alias] Argumento nRegistros nArea Alias Obrigat. No No No Tipo N N Descrio Nmero de registros a ser deslocados Nmero da rea de trabalho Nome da identificao da rea de trabalho
Retorno NIL
Descrio 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".
Exemplo // 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. SKIP EOF() // retorna .T. DBGOTOP() BOF() // retorna .F. SKIP -1 BOF() // retorna .T. // Este exemplo mostra como o SKIP pode deslocar 10 registro em relao ao registro corrente DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) SKIP 10 RECNO() // retorna 110 SKIP -10 RECNO() // retorna 100 // Este exemplo mostra como o SKIP pode ser executado em outra area de trabalho. DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) DBGOTO(100) DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1110.dbf","XXX", .T., .F. ) SKIP 10 ALIAS "SSS" SSS->RECNO() // retorna 110 SKIP -10 ALIAS "SSS" SSS->RECNO() // retorna 100 BOF EOF
DBGOTOP( ) DBGOBOTTOM( )
DBSEEK( )
SplitPath
Quebra em diversas partes um arquivo.
Sintaxe SPLITPATH( cArq, @[cDrive], @[cCaminho], @[cNome], @[cExt] ) --> NIL Argumento cArq Obrigat. Sim Tipo C Descrio Nome do Arquivo a ser quebrado. Opcionalmente, pode incluir caminho e drive. 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. Nome do Caminho. Caso o Arquivo informado no possua caminho, ser uma string em branco. Nome do Arquivo sem a extenso, caso em cArq no seja especificado um nome do Arquivo retornar uma string em branco. Nome do Arquivo sem a extenso, caso em cArq no seja especificado um Arquivo com extenso retornar uma string em branco
cDrive
No
cCaminho
No
cNome
No
cExt
No
Retorno NIL
Descrio SplitPath() divide um caminho completo em todas as suas subpartes; cArq 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.
Exemplo Local cArq := "C:\TEMP\TESTE.EXE" Local cDrive, cDir, cNome, cExt SplitPath( cArq, @cDrive, @cDir, @cNome, @cExt ) ? cDrive // Resultado : C: ? cDir // Resultado : \TEMP\ ? cNome // Resultado : TESTE ? cExt // Resultado: .EXE
TCConType
Define o tipo de conexo que ser utilizada entre o Protheus e o TopConnect.
Sintaxe TCCONTYPE ( cTipo ) --> NIL Argumento cTipo Obrigat. Sim Tipo C Descrio Tipo da conexo. Pode ser: "TCPIP" ou "NPIPE"
Retorno NIL
Descrio Determina o tipo de conexo que ser utilizada entre o Protheus e o TopConnect. O valor guardado e utilizado nas chamadas seguintes de TCLink.
Exemplo TCConType("NPIPE") _nCon := TCLink("MSSQL7/TOPSQL", "TOPSERVER1") If (_nCon < 0) CONOUT("Falha Conexao TOPCONN - Erro: "+ str(nCon, 10, 0)) EndIf
TCLINK( )
TCDelFile
Apaga um arquivo de um banco de dados.
Sintaxe TCDELFILE ( cTabela ) --> Lgico Argumento cTabela Obrigat. Sim Tipo C Descrio Nome da tabela que deve ser apagada.
Descrio Tabela foi excluda com sucesso Erro. Geralmente porque a tabela est sendo utilizada por outro processo.
TCCANOPEN( )
TCGenQry
Define a execuo de uma Query.
Sintaxe TCGENQRY ([ xPar1, xPar2, ], cQuery) --> caracter Argumento xPar1, xPar2 cQuery Obrigat. No Sim Tipo Qualquer C Descrio Parmetros apenas para compatibilizao. No tem funo. Contm a expresso da query que se deseja executar.
Retorno ""
Descrio Esta funo determina que a prxima chamada DBUseArea ser a abertura de uma Query e no de tabela.
Exemplo cQuery := 'SELECT X2_CHAVE CHAVE, R_E_C_N_O_ RECNO from SX2990' dbUseArea(.T., 'TOPCONN', TCGenQry(,,cQuery), 'TRB', .F., .T.) while !Eof() // Processa conout(TRB->CHAVE) dbSkip() enddo dbCloseArea()
DBUSEAREA( )
TCIsvLock
Verifica se o servidor possui sistema de locks virtuais.
Sintaxe TCISVLOCK () --> Lgico Retorno .T. .F. Descrio O servidor possui sistemas de locks virtuais. O servidor no possui locks virtuais.
Descrio Atravs de locks virtuais, possvel bloquear uma string. A funo TCISVLOCK verifica se o servidor TopConnect possui tratamento para locks virtuais.
TCVLOCK( ) TCVUNLOCK( )
TCRefresh
Faz refresh em uma tabela.
Sintaxe TCREFRESH ( cTabela ) --> NIL Argumento cTabela Obrigat. Sim Tipo Lgico Descrio Indica nome da tabela que deve ser feito refresh.
Retorno NIL
Descrio 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).
Exemplo cTabela:= "SA1990" cComando := "Delete "+ cTabela +" Where R_E_C_N_O_ > 50000 " TCSqlExec(cComando) TCRefresh(cTabela)
TCSetBuff
Esta funo foi mantida apenas para compatilizao, no sendo utilizada no AP6.
TCSetConn
Altera a conexo corrente.
Sintaxe TCSETCONN( nConexaoCorrente ) --> Lgico Argumento nConexaoCorrente Obrigat. Sim Tipo Numrico Descrio Indica o nmero da conexo que deve se tornar a corrente. Este nmero foi retornada pela funo TCLINK.
Descrio 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.
Exemplo _nCon1 := TCLink("MSSQL7/TOPSQL1", "TOPSERVER1") If (_nCon1 < 0) CONOUT("Falha Conexao TOPCONN 1 - Erro: "+ str(_nCon1, 10, return .F. EndIf _nCon2 := TCLink("MSSQL7/TOPSQL2", "TOPSERVER2") If (_nCon2 < 0) CONOUT("Falha Conexao TOPCONN 2 - Erro: "+ str(_nCon2, 10, return .F. EndIf USE CLIENTES VIA "TOPCONN" NEW // Tabela de clientes ser aberto TCSETCONN(_nCon1) USE PEDIDOS VIA "TOPCONN" NEW // Tabela de pedidos ser aberto . . . TCQUIT() RETURN .T.
0))
0))
em _nCon2 em _nCon2
TCLINK( )
TCSetDummy
Altera o status do modo "dummy"
Sintaxe TCSETDUMMY ([ lStatus ]) --> Lgico Argumento lStatus Obrigat. Sim Tipo Lgico Descrio Indica se deve ligar (.T.) ou desligar (.F.) o modo "dummy" .
Descrio 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.
Exemplo TCSetDummy(.t.) For ni:= 1 to NroTabelas cTabela:= "TABELA"+TRIM(STR(NI, 10, 0)) dbUseArea( .T.,"TOPCONN", cTabela, cTabela, .T., .F. ) next TCSetDummy(.F.)
TCSpExec
Executa uma Stored Procedure.
Sintaxe TCSPEXEC ( cSProc [, xParam1,...,xParamN])--> [array] Argumento cSProc xParamX Obrigat. Sim No Tipo C Qualquer Descrio Nome da Stored Procedure. Parmetro(s) da Stored Procedure
Descrio Nenhum valor retornado pela Stored Procedure ou ocorreu um erro. Array contendo os valores de retorno da Stored Procedure.
Descrio Executa uma Stored Procedure, no banco de dados, com nmero varivel de parmetros.
Create Procedure teste1( @IN_VALUE int, @OUT_STR char(255), @OUT_VALUE int) WITH RECOMPILE As Begin Select @OUT_STR = "Teste", @OUT_VALUE = @IN_VALUE + 3 End GO
Para executar:
aResult := TCSPEXEC(xProcedures ('teste1'), 100 ) IF Len(aResult) = 0 conout("Erro na execuo da Stored Procedure.") Endif Else conout(aResult[1] + str(aResult[2])) Endif
TCSpExist
Verifica se uma Stored Procedure existe.
Sintaxe TCSPEXIST ( cStoredProc ) --> Lgico Argumento cStoredProc Obrigat. Sim Tipo C Descrio Nome da Stored Procedure.
Exemplo if TCSPExist("SP000001") cStr := "DROP PROCEDURE "+ "SP000001 " TCSqlExec(cStr) endif
TCSqlError
Retorna o ltimo erro produzido em comandos SQL.
Sintaxe TCSQLERROR ( )-> Caracter Retorno Caracter Descrio Texto com descrio do erro. Se no houve erro, retorna texto vazio.
Descrio
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.
Exemplo nRet = TCSQLEXEC("INSERT INTO SALES/CUSTOMER(NAME) VALUES('JOHN DOE')") If nRet == 0 conout("Insero executada") Else conout( "Insero com erro (s) : ") cRet = TCSQLERROR() Do While !Empty(cRet) conout(cRet) cRet = TCSQLERROR() EndDo EndIf
TCSrvType
Retorna o tipo de servidor.
Sintaxe TCSRVTYPE () --> Caracter Retorno "" <> "" Descrio String vazia se o driver TopConnect no estiver inicializado. String contendo o tipo do servidor. Pode ser: "AS/400", "WinNT", "AIX", "HPUX","Linux"
Exemplo // utilizado para testar se o ambiente AS/400, pois alguns comandos so diferentes nesta plataforma. Ex: Chamada da funcao de reconciliao If TcSrvType() == 'AS/400' Processa({|lEnd| FA210Processa()}) Else Processa({|lEnd| FA211Processa()}) Endif
TCSysExe
Executa um comando do sistema operacional no servidor TopConnect.
Sintaxe TCSYSEXE ( cComando ) --> Numrico Argumento cComando Obrigat. Sim Tipo C Descrio Comando do Sistema Operacional.
Retorno 0 <>0
Exemplo // Copia arquivo no AS400 cAntigo:= "ANTIGO" cNovo:= "NOVO" cExpres := "CPYF FROMFILE("+AllTrim(cAntigo)+") TOFILE(" cExpres += AllTrim(cNovo)+") MBROPT(*ADD) FMTOPT(*MAP *DROP)" if TCSysExe(cExpres) <> 0 conout("Erro na execuo do comando") endif
TCSysExe
Executa um comando do sistema operacional no servidor TopConnect.
Sintaxe TCSYSEXE ( cComando ) --> Numrico Argumento cComando Obrigat. Sim Tipo C Descrio Comando do Sistema Operacional.
Retorno
Descrio
0 <>0
Exemplo // Copia arquivo no AS400 cAntigo:= "ANTIGO" cNovo:= "NOVO" cExpres := "CPYF FROMFILE("+AllTrim(cAntigo)+") TOFILE(" cExpres += AllTrim(cNovo)+") MBROPT(*ADD) FMTOPT(*MAP *DROP)" if TCSysExe(cExpres) <> 0 conout("Erro na execuo do comando") endif
TCVUnLock
Libera o bloqueio virtual de uma string.
Sintaxe TCVUNLOCK ([ cPalavra ]) --> Lgico Argumento Obrigat. Tipo Descrio String que deve ser liberada. Se no for passada, TODOS os locks virtuais desta conexo so liberados.
cPalavra
No
Descrio A palavra foi bloqueada. No foi possvel desbloquear a palavra, provavelmente porque ela no estava bloqueada.
Exemplo #ifdef TOP If TCIsVLock() if !TCVLock("Processo1") messagebox("Nao foi possivel bloquear o processo1", "", 0) return endif ...... // Processa
TCISVLOCK( ) TCVLOCK( )
Time
Retorna a hora do sistema
Sintaxe TIME() --> cHora Retorno Descrio 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.
cHora
Descrio TIME() uma funo que retorna a hora do sistema como uma cadeia de caracteres. TIME() est relacionada com SECONDS() que retorna o valor inteiro representando o nmero de segundos desde a meia-noite. SECONDS() geralmente usada no lugar de TIME() para clculos.
Exemplos 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
SECONDS()
SUBSTR()
UnLock
Desbloqueia os registros da tabela corrente.
Sintaxe
UnLock [ALL]
Descrio Este comando utilizado para liberar registros da tabela corrente. Se for passada a opo "ALL" todos os registros da tabela corrente so liberados. Caso contrrio, s liberado o registro corrente.
Exemplo // Este exemplo mostra como liberar todos os registros bloqueados DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., UNLOCK ALL // Este exemplo mostra uma variao do uso de UNLOCK para liberar DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., DBGOTO(100) UNLOCK // Desbloqueia o registro atual (100) da tabela corrente. .F. ) apenas o registro corrente. .F. )
FLOCK( ) RLOCK( )
UpdateIntName
Atualiza o nome do ndice interno da tabela CTree.
Sintaxe UpdateIntName ( cNome )->Lgico Argumento cNome Obrigat. No Tipo C Descrio Especifica o nome da tabela cujo ndice interno deve ter o nome atualizado.
Descrio No conseguiu atualizar o nome do ndice interno. O arquivo no pode ser aberto em modo exclusivo. Atualizao do nome de ndice interno ocorrida com sucesso
Descrio 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.
Exemplo // Este exemplo demonstra o uso tpico de UpdateIntName(). Se no falhar, o nome do ndice interno ser atualizado e o processo continua quando ao abrir a tabela o novo arquivo de ndice interno criado. Se falhar, uma mensagem apresentada. IF !UpdateIntName("\dadosadv\sa1990.dtc") Messagebox("No foi possvel atualizar o nome do ndice interno da tabela","Erro", 0) BREAK ENDIF USE "\dadosadv\sa1990.dtc" SHARED NEW
CTREEDELINT( )
Use
Abre uma tabela na rea de trabalho atual e os arquivos relacionados a ela. Sintaxe USE Tabela [INDEX Indices] [ALIAS Alias] [EXCLUSIVE | SHARED] [NEW] [READONLY] [VIA Driver]] Argumento Tabela Obrigat. Tipo Descrio Nome do arquivo da tabela a ser aberta
Nomes dos ndices a serem abertos junto com a tabela Alias da tabela a ser aberta Nome do RDD a ser utilizado na abertura da tabela Descrio Sem retorno
Descrio Este comando associa uma tabela especificada pelo primeiro parmetro (Tabela) rea de trabalho atual atravs de um driver especificado atravs do parmetro Driver. Tambm pode abrir os arquivos de ndices relacionados com a tabela. No caso do Ctree os arquivos de ndices permanentes j so abertos automaticamente, mas nos demais RDDs deve especificar os arquivos de ndices que se deseja abrir atravs do parmetro Indices. O Alias pode ser especificado atravs do parmetro Alias. Pode-se especificar se a 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.
Exemplo // Este exemplo demonstra como utilizar o comando USE para associar uma tabela (do tipo Ctree) a prxima rea de trabalho disponvel e torn-la ativa em modo compartilhado e somente leitura: USE Cliente VIA "CTREECDX" NEW SHARED READONLY
CLOSEAREA DBUSEAREA
Used
Verifica se existe uma tabela corrente
Sintaxe Used() --> Lgico Retorno .F. .T. Descrio No existe tabela corrente Existe tabela corrente
Descrio Esta funo utilizada para verificar se existe alguma tabela aberta no momento.
Exemplo //Este exemplo utiliza a funo USED()para verificar quando a tabela est ativa: USE Clientes NEW Result := USED() // Result: .T. CLOSE Result := USED() // Result: .F.
Year
Converte o valor da data no valor numrico do ano.
Sintaxe YEAR( dData ) --> nAno Argumento dData Obrigat. Sim Tipo D Descrio o valor da data a ser convertido.
Retorno
Descrio 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. Para uma data invlida ou nula.
nAno
Descrio 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 DAY() e MONTH() que retornam o dia e o ms como valores numricos.
Exemplos Estes exemplos mostram YEAR() usando a data do sistema: dData := DATE() // Resultado: 09/20/01 dAno := YEAR(dData) // Resultado: 2001 dAno := YEAR(dData) + 11 // Resultado: 2012
Este exemplo cria uma funo de usurio que usa a funo YEAR() para formatar o valor da data: cData := Mdy(DATE()) // Result: September 20, 1990 FUNCTION Mdy( dDate ) RETURN CMONTH(dDate) + " " + LTRIM(STR(DAY(dDate))) + "," + STR(YEAR(dDate))
CDOW()
ZAP
Remove todos os registros da tabela.
Sintaxe ZAP
Exemplo // Este exemplo mostra como o ZAP pode se utilizado. dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. ) ZAP
PACK
tSrvObject
Classe me de todas as classes de interface.
Caractersticas
Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser instanciada diretamente.
Propriedades
nLeft nTop nWidth nHeight cCaption cTooltip lShowHint cMsg Numrico. Coordenada horizontal em pixels. Numrico. Coordenada vertical em pixels. Numrico. Largura em pixels. Numrico. Altura em pixels. Caractere. Ttulo ou contedo do objeto. Caractere. Mensagem exibida quando objeto exibe seu tooltip. Lgico. Flag que ativa .T. ou desativa .F. a exibio do tooltip do objeto. Caractere. Mensagem exibida na barra de status da janela principal quando o objeto ganha
foco. nClrText nClrPane bWhen bValid blClicked brClicked blDblClick oWnd lVisible Cargo bLostFocus bGotFocus Numrico. Cor do texto do objeto. Numrico. Cor do fundo do objeto. 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. 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. Bloco de cdigo. Executado quando acionado click do boto esquerdo do mouse sobre o objeto. Bloco de cdigo. Executado quando acionado click do boto direito do mouse sobre o objeto. Bloco de cdigo. Executado quando acionado duplo click do boto esquerdo do mouse sobre o objeto. Objeto. Janela onde o objeto foi criado. Booleano. Se .T. o objeto visvel, se .F. o objeto invisvel. Objeto ou varivel. Contedo associado ao objeto. Bloco de cdigo. Executado quando objeto perde foco. Bloco de cdigo. Executado quando objeto ganha foco.
Mtodos
bSetFocus
Sintaxe
SetFocus( )
Descrio
Fora o foco de entrada de dados mudar para o objeto.
Retorno
NIL
Hide
Sintaxe
Hide( )
Descrio
Torna objeto invisvel.
Retorno
NIL
Show
Sintaxe
Show( )
Descrio
Torna objeto visvel.
Retorno
NIL
Enable
Sintaxe
Enable( )
Descrio
Habilita o objeto.
Retorno
NIL
Disable
Sintaxe
Disable( )
Descrio
Desabilita o objeto.
Retorno
NIL
Refresh
Sintaxe
Refresh( )
Descrio
Fora atualizao (sincronia) de propriedades entre o programa e o Protheus Remote.
tComboBox
Classe de combobox.
Hierarquia
tSrvObject -> tControl -> tComboBox
Descrio
Utilize a classe tComboBox para cria uma entrada de dados com mltipla escolha com item definido em uma lista vertical, acionada por F4 ou pelo boto esquerdo 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 nAt 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}. Numrico. Posio do item selecionado.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd], [nPar8], [abChange], [abValid], [anClrText], [anClrBack], [alPixel], [aoFont], [cPar15], [lPar16], [abWhen], [lPar18], [aPar19], [bPar20], [cPar21], [acReadVar])
Parmetros
anRow anCol Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. 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. 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}. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Objeto, opcional. Janela ou controle onde o controle ser criado. Reservado. Bloco de cdigo, opcional. Executado quando o controle modifica o item selecionado. Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado, deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
abSetGet
anClrBack anClrText alPixel aoFont cPar15 lPar16 abWhen lPar18 aPar19 bPar20 cPar21 acReadVar
Numrico, opcional. Cor de fundo do controle. Numrico, opcional. Cor do texto do controle. Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres. Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte utilizada para exibir o contedo do controle. Reservado. Reservado. 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. Reservado. Reservado. Reservado. Reservado. 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.
Sintaxe
Select( [anItem] )
Parmetros
anItem Numrico, opcional. Posio do item a ser selecionado.
Retorno
NIL
Exemplo
#include protheus.ch User Function TesteGet() Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3} cCombo:= aItems[2] DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},; aItems,100,20,oDlg,,{||MsgStop(Mudou item)},; ,,,.T.,,,,,,,,,cCombo)
// Boto para fechar a janela @ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End() ACTIVATE MSDIALOG oDlg CENTERED MsgStop( O valor +cCombo ) Return nil
tComboBox
Classe de combobox.
Hierarquia
tSrvObject -> tControl -> tComboBox
Descrio
Utilize a classe tComboBox para cria uma entrada de dados com mltipla escolha com item definido em uma lista vertical, acionada por F4 ou pelo boto esquerdo 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}. Numrico. Posio do item selecionado.
nAt
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd], [nPar8], [abChange], [abValid], [anClrText], [anClrBack], [alPixel], [aoFont], [cPar15], [lPar16], [abWhen], [lPar18], [aPar19], [bPar20], [cPar21], [acReadVar])
Parmetros
anRow anCol Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( 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. 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}. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Objeto, opcional. Janela ou controle onde o controle ser criado. Reservado. Bloco de cdigo, opcional. Executado quando o controle modifica o item selecionado. Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado, deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido. Numrico, opcional. Cor de fundo do controle. Numrico, opcional. Cor do texto do controle. Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres. Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte utilizada para exibir o contedo do controle. Reservado. Reservado. 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. Reservado. Reservado. Reservado. Reservado. 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( ).
anItems
anWidth anHeight aoWnd nPar8 abChange abValid anClrBack anClrText alPixel aoFont cPar15 lPar16 abWhen lPar18 aPar19 bPar20 cPar21 acReadVar
Retorno
O objeto criado.
Select
Descrio
Muda o item selecionado no combobox.
Sintaxe
Select( [anItem] )
Parmetros
anItem Numrico, opcional. Posio do item a ser selecionado.
Retorno
NIL
Exemplo
#include protheus.ch User Function TesteGet() Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3} cCombo:= aItems[2] DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},; aItems,100,20,oDlg,,{||MsgStop(Mudou item)},; ,,,.T.,,,,,,,,,cCombo) // Boto para fechar a janela @ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End() ACTIVATE MSDIALOG oDlg CENTERED MsgStop( O valor +cCombo ) Return nil
tGroup
Classe de painel de grupo de controles.
Hierarquia
tSrvObject -> tControl -> tGroup
Descrio
Utilize a classe tGroup para criar um painel onde controles visuais podem ser agrupados ou classificados. criada uma borda com ttulo em volta dos controles agrupados.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [aoWnd], [anClrText], [anClrPane], [alPixel], [lPar10])
Parmetros
AnTop AnLeft anBottom anRight acCaption aoWnd anClrText anClrPane Numrico, opcional. Coordenada vertical superior em pixels ou caracteres. Numrico, opcional. Coordenada horizontal esquerda em pixels ou caracteres. Numrico, opcional. Coordenada vertical inferior em pixels ou caracteres. Numrico, opcional. Coordenada horizontal direita em pixels ou caracteres. Caractere, opcional. Ttulo do grupo. Objeto, opcional. Janela ou controle onde o controle ser criado. Numrico, opcional. Cor do texto. Numrico, opcional. Cor do fundo. Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres. Reservado.
alPixel
lPar10
Retorno
O objeto criado.
Exemplo
#include protheus.ch User function teste() Local oDlg, oGroup, oGet1, oGet2, cGet1:=Space(10),; cGet2:= Space(10) DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE My test PIXEL oGroup:= tGroup():New(10,10,200,200,grupo de gets,oDlg,,,.T.) @ 10,10 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oGroup PIXEL @ 30,10 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oGroup PIXEL ACTIVATE MSDIALOG oDlg CENTERED Return nil
tListbox
Classe de lista de items.
Hierarquia
Descrio
Utilize a classe tListbox para criar uma janela com itens selecionveis e barra de rolagem. Ao selecionar um item, uma varivel atualizada com o contedo do item selecionado.
Parmetros
Nat AItems Numrico. Indica ou modifica o item selecionado. Array de items caracteres. Lista do itens selecionveis.
Mtodos
New
Descrio
Contrutor da classe
Sintaxe
New([anRow], [anCol], [abSetGet], [aaItems], [anWidth], [anHeigth], [abChange], [aoWnd], [abValid], [anClrFore], [anClrBack], [alPixel], [lPar13], [abLDBLClick], [aoFont], [cPar16], [lPar17], [abWhen], [aPar19], [bPar20], [lPar21], [lPar22], [abRightClick] )
Parmetros
AnRow AnCol Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. 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. Array de items caracteres, opcional. Lista de items selecionveis. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Bloco de cdigo, opcional. Executado quando o item selecionado alterado. Objeto, opcional. Janela ou controle onde o controle ser criado. 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. Numrico, opcional. Cor de fundo do controle. Numrico, opcional. Cor do texto do controle.
AbSetGet
abValid
anClrFore anClrBack
alPixel lPar13 abLDBLClick aoFont cPar16 lPar17 abWhen aPar19 bPar20 lPar21 lPar22 abRightClick
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres. Reservado. Bloco de cdigo, opcional. Executado quando acionado duplo click do boto esquerdo do mouse sobre o controle. Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte utilizada para exibir o contedo do controle. Reservado. Reservado. 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. Reservado. Reservado. Reservado. Reservado. Bloco de cdigo, opcional. Executado quando acionado click do boto direito do mouse sobre o controle.
Select
Descrio
Fora a seleo de um item.
Sintaxe
Select( [nItem] )
Parmetros
NItem Numrico, opcional. Item a ser selecionado.
Retorno
NIL
Add
Descrio
Insere ou adiciona novo item.
Sintaxe
Add( cText, nPos )
Parmetros
cText nPos
Caractere, obrigatrio. Texto do item. 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
Modify
Descrio
Modifica o texto de um item.
Sintaxe
Modify( cText, nPos )
Parmetros
cText nPos Caractere, obrigatrio. Texto novo. 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.
Sintaxe
Del( nPos )
Parmetros
Numrico, obrigatrio. Posio a ser excluida, deve ser maior que 0 e menor ou igual que o nmero de itens.
nPos
Retorno
NIL
Len
Descrio
Sintaxe
Len( )
Retorno
Numrico. Nmero de itens.
Reset
Descrio
Apaga todos os itens.
Sintaxe
Reset( )
Retorno
NIL
Exemplo
#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
tMeter
Classe de rgua de processamento.
Hierarquia
tSrvObject -> 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.
Parmetros
NTotal lPercentage nClrBar Numrico. Nmero total de passos at o preenchimento da rgua de processo. Lgico. Se .T. considera o passo de movimentao em porcentagem. Numrico. Cor da barra de andamento.
Mtodos
New
Descrio
Contrutor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [anTotal], [aoWnd], [anWidth], [anHeight], [lPar8], [alPixel], [oPar10], [cPar11], [alNoPerc], [anClrPane], [nPar14], [anClrBar], [nPar16], [lPar17])
Parmetros
anRow anCol abSetGet anTotal aoWnd anWidth anHeight lPar8 alPixel oPar10 cPar11 alNoPerc anClrPane nPar14 anClrBar nPar16 lPar17 Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. 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. Numrico, opcional. Numero total de passos at o preenchimento da rgua de processo. Objeto, opcional. Janela ou controle onde o controle sera criado. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Reservado. Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres. Reservado. Reservado. Lgico, opcional. Se .T. (padro) no considera os passos de atualizao em porcentagem. Numrico, opcional. Cor de fundo do controle. Reservado. Numrico, opcional. Cor da barra de andamento. Reservado. Reservado.
Retorno
O objeto construdo.
Set
Descrio
Atualiza a posio da rgua de processamento.
Sintaxe
Set( [nVal] )
Parmetros
nVal Numrico, opcional. Novo valor da posio da rgua de processamento.
Retorno
NIL
Exemplo
#include protheus.ch Static lRunning:=.F., lStop:=.F. User Function Teste() Local oDlg, oMeter, nMeter:=0, oBtn1, oBtn2 DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE Teste // 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
tMultiget
Classe de campo Memo de edio.
Hierarquia
tSrvObject -> tControl -> tMultiGet
Descrio
Utilize a classe tMultiget para criar controle de edio de texto de mltiplas linhas.
Propriedades
lWordWrap Lgico. Se .T., faz quebra automtica de linhas.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [aoFont], [alHScroll], [anClrFore], [anClrBack], [oPar11], [alPixel], [cPar13], [lPar14], [abWhen], [lPar16], [lPar17], [alReadOnly], [abValid], [bPar20], [lPar21], [alNoBorder], [alNoVScroll])
Parmetros
anRow AnCol AbSetGet Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. 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 anWidth anHeight aoFont alHScroll anClrFore anClrBack oPar11 alPixel cPar13 lPar14 abWhen lPar16 lPar17 alReadOnly abValid bPar20 lPar21 alNoBorder alNoVScroll
Objeto, opcional. Janela ou controle onde o controle ser criado. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte utilizada para exibir o contedo do controle. Lgico, opcional. Se .T., habilita barra de rolagem horizontal. Numrico, opcional. Cor de fundo do controle. Numrico, opcional. Cor do texto do controle. Reservado. Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres. Reservado. Reservado. 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. Reservado. Reservado. Lgico, opcional. Se .T. o controle so permitira leitura. 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. Reservado. Reservado. Lgico, opcional. Se .T. cria controle sem borda. Lgico, opcional. Se .T., habilita barra de rolagem vertical.
Retorno
O objeto construdo.
EnableVScroll
Descrio
Habilita a barra de rolagem vertical.
Sintaxe
EnableVScroll( lEnable )
Parmetros
lEnable Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra de rolagem.
Retorno
NIL
EnableHScroll
Descrio
Habilita a barra de rolagem horizontal.
Sintaxe
EnableHScroll( lEnable )
Parmetros
lEnable Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra de rolagem.
Retorno
NIL
Exemplo
#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.
Hierarquia
tSrvObject -> 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.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [acText], [aoWnd], [aoFont], [alCentered], [lPar6], [anClrText], [anClrBack], [anWidth], [anHeight], [alLowered], [alRaised])
Parmetros
anRow anCol acText aoWnd alCentered lPar6 anClrText anClrBack anWidth anHeight alLowered alRaised Numrico, opcional. Coordenada vertical em pixels. Numrico, opcional. Coordenada horizontal em pixels. Caractere, opcional. Texto a ser exibido ao fundo. Objeto, opcional. Janela ou controle onde ser criado o objeto. Lgico, opcional. Se .T. exibe o texto de ttulo ao centro do controle. Reservado. Numrico, opcional. Cor do texto do controle. Numrico, opcional. Cor do fundo do controle. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Lgico, opcional. Se .T. exibe o painel rebaixado em relao ao controle de fundo. Lgico, opcional. Se .T. exibe a borda do controle rebaixada em relao ao controle de fundo.
Retorno
O objeto construdo.
Exemplo
#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
tRadMenu
Classe de radio group.
Hierarquia
tSrvObject -> tControl -> tRadMenu
Descrio
Utilize a classe tRadMenu para criar um controle que possibilita escolha de item atravs de uma lista.
Propriedades
nOption aItems Numrico. Item selecionado. Array de caracteres. Lista de items selecionveis.
Mtodos
New
Descrio
Construtor do objeto.
Sintaxe
New([anRow], [anCol], [aacItems], [abSetGet], [aoWnd], [aPar6], [abChange], [anClrText], [anClrPan], [cPar10], [lPar11], [abWhen], [anWidth], [anHeight], [abValid], [lPar16], [lPar17], [alPixel])
Parmetros
anRow anCol aacItems abSetGet aoWnd aPar6 abChange anClrText anClrPan cPar10 lPar11 abWhen anWidth anHeight abValid lPar16 Lpar17 alPixel Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. Array de caracteres, opcional. Lista de opes. 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. Objeto, opcional. Janela ou controle onde o controle ser criado. Reservado. Bloco de cdigo, opcional. Executado quando o item selecionado alterado. Numrico, opcional. Cor do texto do controle Numrico, opcional. Cor de fundo do controle. Reservado. Reservado. Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados 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. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Bloco de cdigo, opcional. Executado quando o contedo do controle deva ser validado, retornando .T. se o contedo for vlido, e .F. quando invlido. Reservado. Reservado. Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres.
Retorno
O objeto construdo.
EnableItem
Descrio
Habilita ou desabilita item.
Sintaxe
EnableItem( [nItem], [lEnable])
Parmetros
NItem LEnable Numrico, opcional. Item selecionado. Lgico, opcional. Se .T. habilita o item se .F. desabilita o item.
Retorno
NIL
Exemplo
#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
tSay
Classe de label.
Hierarquia
tSrvObject -> tControl -> tSay
Descrio
O objeto tipo tSay exibe o contedo de texto esttico sobre uma janela ou controle.
Parmetros
lWordWrap lTransparent 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. 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.
Mtodos
New
Descrio
Mtodo construtor do controle.
Sintaxe
New([anRow], [anCol], [abText], [aoWnd], [acPicture], [aoFont], [lPar7], [lPar8], [lPar9], [anClrText], [anClrBack], [anWidth], [anHeight], [lPar15], [lPar16], [lPar17], [lPar18], [lPar19]) [alPixels],
Parmetros
AnRow AnCol AbText AoWnd acPicture AoFont lPar7 lPar8 lPar9 AlPixels anClrText anClrBack anWidth anHeight lPar15 lPar16 lPar17 lPar18 lPar19 Numrico, opcional. Coordenada vertical em pixels ou caracteres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. Codeblock, opcional. Quando executado deve retornar uma cadeia de caracteres a ser exibida. Objeto, opcional. Janela ou dilogo onde o controle ser criado. Caractere, opcional. Picture de formatao do contedo a ser exibido. Objeto, opcional. Objeto tipo tFont para configurao do tipo de fonte que ser utilizado para exibir o contedo. Reservado. Reservado. Reservado. Lgico, opcional. Se .T. considera coordenadas passadas em pixels se .F., padro, considera as coordenadas passadas em caracteres. Numrico, opcional. Cor do contedo do controle. Numrico, opcional. Cor do fundo do controle. Numrico, opcional. Largura do controle em pixels. Numrico, opcional. Altura do controle em pixels. Reservado. Reservado. Reservado. Reservado. Reservado.
Retorno
O controle criado.
SetText
Descrio
Modifica o contedo a ser exibido pelo controle.
Sintaxe
SetText( [xVal] )
Parmetros
xVal Caracter / Numrico / Data, Opcional. Valor a ser exibido.
Retorno
NIL
Exemplo
#include protheus.ch User Function Teste() Local oDlg, oSay DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE My dialog PIXEL oSay:= tSay():New(10,10,{||para exibir},oDlg,,,,; ,,.T.,CLR_WHITE,CLR_RED,100,20) ACTIVATE MSDIALOG oDlg CENTERED Return
tScrollbox
Classe de rea de scroll.
Hierarquia
tSrvObject -> tControl -> tScrollbox
Descrio
Utilize a classe tScrollbox para criar um painel com scroll deslizantes nas laterais do controle.
Mtodos
New
Descro
Construtor da classe
Sintaxe
New([aoWnd], [anTop], [anLeft], [anHeight], [anWidth], [alVertical], [alHorizontal], [alBorder])
Parmetros
aoWnd AnTop AnLeft anHeight anWidth alVertical alHorizontal alBorder Objeto, opcional. Janela ou controle onde o controle ser criado. Numrico, opcional. Coordenada vertical em pixels. Numrico, opcional. Coordenada horizontal em pixels. Numrico, opcional. Altura do controle em pixels. Numrico, opcional. Largura do controle em pixels. Lgico, opcional. Se .T. exibe a barra de scroll vertical. Lgico, opcional. Se .T. exibe a barra de scroll horizontal. Lgico, opcional. Se .T. exibe a borda do controle.
Retorno
O objeto criado.
Exemplo
#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
AllGroups
Retorna vetor contendo informaes dos grupos de usurios.
Descrio
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 1 1 2 3 4 5 6 7 8 9 10 11 ID Nome Vetor com horrios de acesso Data de validade Quantas vezes para expirar Autorizado a alterar a senha Idioma Diretrio Impressora Acessos Vetor com empresas C C A D N L N C C C A 512 8 4 1 1 100 6 20 Descrio Tipo Qtd.
12 13 14 15 16 17 2 1
Data da ltima alterao Tipo de impresso Formato Ambiente Opo de impresso Acesso a outros Dir de impresso
D N N N L L
8 1 1 1 1 1
Mdulo+nvel+menu
AllUsers
Retorna vetor contendo informaes dos usurios do sistema.
Descrio A funo AllUsers() retorna um vetor principal onde cada elemento refere-se a um usurio do sistema, estes elementos so compostos de um vetor multidimensional subdividindo as informaes dos usurios. Sua estrutura composta de: Elemento 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 1 2 3 4 5 6 7 8 9 Vetor com horrios de acesso Idioma Diretrio Impressora Acessos Vetor com empresas Ponto de entrada Tipo de impresso Formato A N C C C A C N N -1 100 -512 -10 1 1 ID Nome Senha Nome Completo Vetor com n ltimas senhas Data de validade Quantas vezes para expirar Autorizado a alterar a senha Alterar a senha no prximo logon Vetor com os grupos ID do superior Departamento Cargo E-Mail Nmero de acessos simultneos Data da ltima alterao Usurio bloqueado Nmero de dgitos para o ano Listner de ligaes Ramal C C C C A D N L L A C C C C N D L N L C 6 15 6 30 -8 4 1 1 -6 30 30 130 4 8 1 1 1 4 Descrio Tipo Qtd.
10 11 12 13 3 1
Ambiente Prioridade p/ config. do grupo Opo de impresso Acesso a outros dir de impresso Mdulo+nvel+menu
N L C L C
1 1 50 1
APMsgAlert
Exibe uma mensagem em um dilogo
Sintaxe APMSGALERT( cMsg, [ cTitulo ] ) -> nil Argumento cMsg cTitulo Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo.
Descrio Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e um cone de mensagem de aviso.
Exemplo APMSGALERT(Ateno)
APMsgInfo
Exibe uma mensagem em um dilogo
Sintaxe APMSGINFO( cMsg, [ cTitulo ] ) -> nil Argumento cMsg cTitulo Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo.
Descrio Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e um cone de mensagem de aviso.
Exemplo APMSGINFO(Ateno)
APMsgNoYes
Exibe uma mensagem em um dilogo
Sintaxe APMSGNOYES( cMsg, [ cTitulo ] ) -> lgico Argumento CMsg CTitulo Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo.
Descrio Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para cancelar. Caso cancele a funo retornar verdadeiro, seno retornar falso.
Exemplo
APMsgStop
Exibe uma mensagem em um dilogo
Sintaxe APMSGSTOP( cMsg , [ cTitulo ] ) -> nil Argumento cMsg cTitulo Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida. Ttulo do dilogo.
Descrio Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e um cone de mensagem crtica.
Exemplo APMSGSTOP(Ateno)
APMsgYesNo
Exibe uma mensagem em um dilogo
Sintaxe APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico Argumento Obrigat. Tipo Descrio
CMsg cTitulo
Sim No
C C
Descrio Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso.
APMsgYesNo
Exibe uma mensagem em um dilogo
Sintaxe APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico Argumento CMsg CTitulo Obrigat. Sim No Tipo C C Descrio Mensagem a ser exibida Ttulo do dilogo.
Descrio Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso.
Cabec
Imprime cabealho personalizado nos relatrios.
Sintaxe CABEC( cTitulo, cCabec1, cCabec2, cPrograma, cTamanho, [ nFormato ], [ uPar ], [ lPerg ] ) -> nil Argumento CTitulo cCabec1 cCabec2 cPrograma cTamanho nFormato uPar lPerg Obrigat. Sim Sim Sim Sim Sim No No No Tipo C C C C C N U L Descrio Ttulo do relatrio. Primeira linha do cabealho. Segunda linha do cabealho. Nome do relatrio. Tamanho da pgina P,M,G. Para imprimir comprimido informe 15 Reservado Se verdadeiro, (.T.) imprime as perguntas no incio do relatrio.
Descrio 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.
Exemplo User Function <nome-da-funo>( ) Local cProgram := 'Exemplo' Local cAlias := 'XXX' // nome do relatrio
Local cTitulo := 'Titulo do relatrio' Local cDesc1 := 'Descrio' Local cDesc2 := 'continuao da descrio' Local cDesc3 := 'continuao da descrio' Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administrao", 1, 2, 1, "",1 }
Private
wrel
Pergunte( cPerg, .F. ) wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd , lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf
// rotina de impresso Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho ) Local nLin := 80
Local cCabec1 := 'Cabecalho 1' Local cCabec2 := 'Cabecalho 2' dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58 CABEC( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) 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 ) Endif @ nLin,000 PSAY __PrtThinLine() // cabealho // cabealho
Set Printer TO
dbCommitAll()
OurSpool( wrel )
Endif
MS_FLUSH()
Return
Capital
Corrige maisculas e minsculas de uma frase.
Sintaxe CAPITAL( cTexto ) -> caracter Argumento cTexto Sim Obrigat. C Tipo Descrio Texto a ser corrigido.
Descrio Esta funo coloca a primeira letra de cada palavra em maiscula e o restante em minscula em toda a frase.
Exemplo
CloseBrowse
Fecha a MBrowse ou a MarkBrow.
Sintaxe
Descrio Esta funo fecha a MBrowse ou MarkBrow dependendo de qual estiver ativa.
MBrowse MarkBrow
Conpad1
Exibe a tela de consulta padro.
Sintaxe CONPAD1( [ uPar1 ], [ uPar2 ], [ uPar3 ], cAlias, [ cCampoRet ], [ uPar4 ], [ lVisual ] ) -> lgico Argumento UPar uPar2 uPar3 CAlias cCampoRet uPar4 LVisual Obrigat. No No No Sim No No No Tipo U U U C C U L Descrio Parmetro reservado. Parmetro reservado. Parmetro reservado. Consulta padro cadastrada no Dicionrio de Dados (SXB) a ser utilizada. Nome da varivel ou campo que receber o retorno da consulta padro. Parmetro Reservado. Indica se ser somente para visualizao.
Descrio Esta funo exibe a tela de consulta padro baseada no Dicionrio de Dados (SXB).
Exemplo CONPAD1(,,,SA1,,,.F.)
Enchoicebar
Cria barra de botes padro na janela
Sintaxe ENCHOICEBAR( oDlg, bOk, bCancelar, [ lMensApag ] , [ aBotoes ] ) -> nil Argumento ODlg BOk bCancelar lMensApag Obrigat. Sim Sim Sim No Tipo O B B L Descrio Janela onde a barra ser criada. Bloco executado quando clicado boto Ok. Bloco executado quando clicado. Indica se ao clicar no boto Ok aparecer uma tela de confirmao de
excluso. Valor padro falso aBotoes No A Vetor com informaes para criao de botes adicionais na barra no formato {bitmap, bloco de cdigo, mensagem}.
Descrio Esta funo cria uma barra com botes padro e outros passados como parmetro na janela tambem passada por parmetro. A EnchoiceBar dever ser chamada antes do ACTIVATE da janela.
Exemplo User Function <nome-do-programa>() Local oDlg DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 300,400 PIXEL ACTIVATE MSDIALOG oDlg CENTERED ON INIT,; ENCHOICEBAR(oDlg,{|| APMsgInfo(Ok)}, {|| ApMsgInfo(Cancelar)}, , {{BMPINCLUIR,{|| APMsgInfo(Teste)},Teste}}) Return
FileNoExt
Retorna o nome de um arquivo sem a extenso.
Sintaxe FILENOEXT( cTexto ) -> caracter Argumento CTexto Obrigat. Sim Tipo C Descrio Texto contendo o nome do arquivo
Descrio A funo FileNoExt() retorna o nome de um arquivo contido em uma string, ignorando a extenso.
RetFileName
Final
Utilizada para finalizar o sistema.
Obrigat. No No
Tipo C C
Descrio 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.
Exemplo User Function <nome-do-programa>( cUsuario, cSenha ) Local cMensag1 := Usurio invlido! Local cMensag2 := Opo disponvel para usurios Administradores! If !PswAdmin( cUsuario, cSenha ) FINAL( cMensag1, cMensag2 ) EndIf Return
FTPConnect
Cria conexo com servidor FTP.
Descrio A funo FTPConnect() retorna verdadeiro se a operao for realizada com sucesso. Se existir uma conexo ativa e for solicitada uma nova, retornar falso. Argumento cServidor nPorta cUsuario cSenha Obrigat. Sim No No No Tipo C N C C Descrio Endereo do servidor Nmero da porta utilizada para conectar no servidor, por default utiliza a porta padro de FTP. Nome do usurio utilizado para conectar no servidor. Por default utiliza o usurio "Anonymous". Senha do usurios utilizado para conectar no servidor. Por default utiliza o usurio "Anonymous".
FTPDirChange
FTPDirChange
Altera o diretrio corrente do FTP.
Sintaxe FTPDIRCHANGE( cDiretorio ) -> lgico Argumento cDiretorio Obrigat. Sim Tipo C Descrio Nome do diretrio.
Descrio A funo FTPDirChange () retornar verdadeiro (.T.) se a operao for realizada com sucesso.
FTPDisconnect()
If !FTPConnect( cServidor )
FTPRenameFile
FTPDirectory
Cria um vetor com informaes de diretrios e arquivos do FTP.
Sintaxe FTPDIRECTORY( cMascara, [ cAtributo ] ) -> array Argumento cMascara cAtributo Obrigat. Sim No Tipo C C Descrio Mscara dos arquivos a serem pesquisados. Se for informado D a funo retornar somente diretrios, se no for informado retornar somente arquivos.
Descrio A funo FTPDirectory() retorna um vetor contendo informaes dos diretrios e arquivos contidos no FTP.
FTPDisconnect()
If !FTPConnect( cServidor )
FTPDirChange('diretorio')
aDirs := FTPDIRECTORY( '*.*', 'D' ) aArqs := FTPDIRECTORY( '*.*' )
EndIf
FTPDownload
Copia um arquivo no servidor FTP para o servidor local.
Sintaxe FTPDOWNLOAD( cArqDest, cArqOrig ) -> lgico Argumento cArqDest cArqOrig Obrigat. Sim Sim Tipo C C Descrio Caminho e nome do arquivo a ser gravado na mquina. Arquivo no servidor a ser copiado.
Descrio
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.
FTPDirChange('diretorio')
If !FTPDOWNLOAD( '\DIRETORIO\ARQ00001.ARQ', 'ARQ00001.ARQ' )
FTPGetCurDir
Retorna o diretrio corrente no FTP.
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' ) EndIf cCurDir := FTPGETCURDIR() FTPConnect FTPDirChange FTPDirectory FTPDisconnect FTPDownload FTPErase FTPUpload FTPRenameFile
FTPRenameFile
Renomeia arquivo no servidor FTP.
Sintaxe FTPRENAMEFILE( cArqAtual, cArqNovo ) -> lgico Argumento cArqAtual cArqDest Obrigat. Sim Sim Tipo C C Descrio Nome do arquivo a ser renomeado. Novo nome do arquivo.
Descrio A funo FTPRenameFile() renomeia um arquivo no diretrio corrente do servidor FTP. Se a operao for realizada com sucesso a funo retornar verdadeiro (.T.).
FTPDisconnect()
If !FTPConnect( cServidor )
EndIf
FTPUpload
Copia um arquivo na mquina local para o servidor FTP.
Sintaxe FTPUPLOAD( cArqOrig, cArqDest ) -> lgico Argumento cArqOri cArqDest Obrigat. Sim Sim Tipo C C Descrio Caminho e nome do arquivo na mquina a ser copiado para o servidor FTP. Nome do arquivo a ser gravado no servidor FTP.
Descrio
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.).
Exemplo Local cServidor cServidor := 'ftp.caminhodoserivor.com.br' FTPDisconnect() If !FTPConnect( cServidor ) APMsgInfo( 'Falha na conexo!' ) EndIf If FTPDirChange('diretorio') If !FTPUPLOAD( '\DIRETORIO\ARQ00001.ARQ', 'ARQ00001.ARQ' ) APMsgInfo( 'Problemas ao copiar arquivo!' ) EndIf EndIf
FunDesc
Retorna descrio de uma opo do menu.
Descrio A funo FunName() retornar a descrio de uma opo selecionada no menu do Siga.
FunName
FunName
Retorna nome de uma funo do menu.
Descrio A funo FunName() retornar o nome de uma funo executada a partir de um menu do Siga
FunDesc
GetCountryList
Retorna vetor contendo informaes dos pases localizados.
Descrio 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.
Exemplo Local aArray := GETCOUNTRYLIST() Local cSigla := GetMv( MV_PAISLOC ) Local nPos nPos := Ascan( aArray, {|d| d[1] == Upper(cSigla) } ) If nPos > 0
GetMark
Retorna string de caracteres aleatrios.
Sintaxe GETMARK( [ lMaiusc ] ) -> caracter Argumento lMaiusc Obrigat. No Tipo L Descrio Se verdadeiro (.T.) retorna somente caracteres em maisculos.
Descrio A GetMark() utilizada junto a funo MarkBrow() onde so utilizados combinaes de caracteres para controle de marcas.
Exemplo
Function <nome-da-funo>( ) Local aCampos := {{'CB_OK' ,,''},; {'CB_USERLIB' ,,'Usurio'},; {'CB_TABHORA' ,,'Hora'},; {'CB_DTTAB' ,,'Data'}} Private cMarca := GETMARK() Private cCadastro := 'Cadastro de Contrato' Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0, 1 }}
MarkBrow
GetMv
Retorna o contedo de um parmetro cadastrado no SX6.
Sintaxe GETMV( cPar01, [ lPar02 ], [ uPar03 ] ) -> varivel Argumento cPar1 lPar02 Obrigat. Sim No Tipo C L Descrio Nome do parmetro a ser pesquisado 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 ). 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.
uPar03
No
Descrio 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.
Exemplo Local cValor := "" // Retorna o contedo do parmetro cValor := GETMV( "MV_ESTADO" ) // Verifica se o parmetro existe If ( GETMV( "MV_ESTADO", .T. ) )
IncProc
Incrementa rgua de progresso.
Descrio Para incrementar a rgua criada pela funo Processa(), utilizamos a funo IncProc()
Exemplo User Function <nome-da-funo>( ) Local bAcao := {|lFim| Exemplo(@lFim) } Local cTitulo := '' Local cMsg := 'Processando' Local lAborta := .T.
ProcRegua(10000) For nI := 1 To 10000 If lFim Exit EndIf INCPROC() Next nI Return Processa ProcRegua
IncRegua
Incrementa valores na rgua de progresso criada pela funo RptStatus().
Descrio Aps executar as funes RptStatus() e SetRegua(), para incrementar valores na rgua utilizamos a funo IncRegua().
Exemplo User Function <nome-da-funo>( ) Local cProgram := 'Exemplo' // nome do relatrio Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas Local cTitulo := 'Titulo do relatrio' Local cDesc1 := 'Descrio' Local cDesc2 := 'continuao da descrio' Local cDesc3 := 'continuao da descrio' Local lDic := .F. // no utiliza dicionrio Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administrao", 1, 2, 1, "",1 } Private wrel
Pergunte( cPerg, .F. ) wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf
SetDefault( aReturn, cAlias ) If nLastKey == 27 Set Filter To Return EndIf RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, 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 )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58
// cabealho
// cabealho
OurSpool( wrel )
Endif
MS_FLUSH()
Return
RptStatus SetRegua
IndRegua
Cria ndice temporrio com expresso de filtro.
Sintaxe INDREGUA( cAlias, cIndice, cExpress, [ xOrdem] , [ cFor ], [ cMens ], [ lExibir ] ) -> nil Argumento cAlias cIndece cExpress xOrdem lExibir cFor cMens Obrigat. No Sim Sim No No No No Tipo C C C C L C C Descrio Alias da tabela que o ndice ser criado. Nome do arquivo para criao do ndice. Expresso do ndice. Indica se a ordem ser crescente ou decrescente. Indica se exibir o dilogo de progresso. Expresso de filtro. Mensagem do dilogo de progresso.
Descrio 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.
Exemplo User Function Exemplo() Local cArquivo Local cChave Local cFor Local nIndex DbSelectArea("SA1") cArquivo := CriaTrab(,.F.) cChave := "A1_NOME" cFor := "!Empty(A1_NOME)" INDREGUA("SA1",cArquivo,cChave,,cFor) DbSelectArea("SA1") nIndex := RetIndex("SA1") #IFNDEF TOP DbSetIndex(cArquivo+OrdBagExt()) #ENDIF DbSetOrder(nIndex+1) . . . DbSelectArea("SA1") RetIndex("SA1") FErase(cArquivo+OrdBagExt()) Return
CriaTrab RetIndex
MarkBRefresh
Atualiza a MarkBrow.
MarkBrow GetMark
MarkBrow
Monta um Browse onde as linhas podem ser marcadas ou desmarcadas.
Sintaxe MARKBROW( cAlias, cCampo, [ cCpo ], [ aCampos ], [ lInverte ], cMarca, [ cCtrlM ], [ uPar ], [ cExpIni ], [ cExpFim ], [ cAval ] ) -> nil Argumento cAlias cCampo cCpo aCampos lInvert cMarca cCtrlM uPar cExpIni cExpFim cAval Obrigat. Sim Sim No No No Sim No No No No No Tipo C C C A L C C L C C C Descrio Alias do arquivo a ser exibido no browse. Campo do arquivo onde ser feito o controle (gravao) da marca. Campo onde ser feita a validao para marcao e exibio do bitmap de status. Colunas a serem exibidas. Inverte a marcao. String a ser gravada no campo especificado para marcao. Funo a ser executada caso deseje marcar todos elementos. Parmetro reservado. Funo que retorna o contedo inicial do filtro baseada na chave de ndice selecionada. Funo que retorna o contedo final do filtro baseada na chave de ndice selecionada. Funo a ser executada no duplo clique em um elemento no browse.
Descrio 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.
Exemplo Function <nome-da-funo>( ) Local aCampos := { {'CB_OK' ,,''},; {'CB_USERLIB' ,,'Usurio'},; {'CB_TABHORA' ,,'Hora'},; {'CB_DTTAB' ,,'Data'}} Private cMarca := GetMark() Private cCadastro := 'Cadastro de Contrato' Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0, 1 }} MARKBROW( 'SCB', 'CB_OK','!CB_USERLIB',aCampos,, cMarca,'MarkAll()',,,,'Mark()' ) Return // Grava marca no campo Function Mark() If IsMark( 'CB_OK', cMarca ) RecLock( 'SCB', .F. ) Replace CB_OK With Space(2)
MsUnLock()
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
MBrowse
Monta um Browse com menu de opes.
Sintaxe MBROWSE( [ uPar1 ], [ uPar2 ], [ uPar3 ], [ uPar4 ], cAlias, [ aFixos ], [ cCpo ], [ uPar5 ], [ cFun ], [ nPadrao ], [ aCores ], [ cExpIni ], [ cExpFim ], [ nCongela ] ) -> nil Argumento Obrigat. Tipo Descrio
uPar1 uPar2 uPar3 uPar4 cAlias aFixos cCpo uPar5 cFun nPadrao
No No No No Sim No No No No No
N N N N C A C N C N
Parmetro reservado. Parmetro reservado. Parmetro reservado. Parmetro reservado. Alias do arquivo a ser visualizado no browse. Contendo os nomes dos campos fixos pr-definidos pelo programador, obrigando a exibio de uma ou mais colunas. Campo a ser validado se est vazio ou no para exibio do bitmap de status. Parmetro reservado. Funo que retornar um valor lgico para exibio do bitmap de status. 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. 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. Funo que retorna o contedo inicial do filtro baseada na chave de ndice selecionada. Funo que retorna o contedo final do filtro baseada na chave de ndice selecionada. Coluna a ser congelado no browse.
No No No No
A C C N
Descrio 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.
Exemplo 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 }} MBROWSE( ,,,, 'SA1',, '!A1_COD',,, 4 )
Ms_Flush
Descarrega spool de impresso.
Descrio
Aps os comandos de impresso as informaes ficam armazenadas no spool e so descarrega em seus destinos atravs da funo Ms_Flush().
Exemplo User Function <nome-da-funo>( ) Local cProgram := 'Exemplo' // nome do relatrio Local cAlias := 'XXX' // alias do arquivo Local cPerg := 'XXXXXX' // grupo de perguntas Local cTitulo := 'Titulo do relatrio' Local cDesc1 := 'Descrio' Local cDesc2 := 'continuao da descrio' Local cDesc3 := 'continuao da descrio' Local lDic := .F. // no utiliza dicionrio Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 } Private wrel
SetDefault( aReturn, cAlias ) If nLastKey == 27 Set Filter To Return EndIf RptStatus( {|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 )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58 Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) nLin := 8 EndIf @ nLin,000 PSAY __PrtFatLine() @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin++,001 PSAY ... @ nLin,000 PSAY __PrtThinLine()
// cabealho
IncRegua()
dbSkip() End IF nLin != 80 nLin++ If nLin > 60 Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
// cabealho
OurSpool( wrel )
Endif
MS_FLUSH()
Return
MsAppend
Adiciona registros de um arquivo para outro.
Sintaxe MSAPPEND( [ cArqDest ], cArqOrig ) -> lgico Argumento cArqDest cArqOrig Obrigat. No No Tipo C C Descrio Se o RDD corrente for DBFCDX os registros sero adicionados na rea selecionada, caso contrrio o arquivo destino ter que ser informado. Nome do arquivo origem contendo os registros a serem adicionados.
Descrio 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.).
MsCopyFile
Executa copia binria de um arquivo.
Sintaxe MSCOPYFILE( cArqOrig, cArqDest ) -> lgico Argumento cArqOrig cArqDest Obrigat. Sim Sim Tipo C C Descrio Nome do arquivo origem e a extenso. Nome do arquivo destino e a extenso.
Descrio Se a copia for realizada com sucesso a funo retornar verdadeiro (.T.).
Exemplo Local cArqOrig := 'ARQ00001.DBF' Local cArqDest := 'ARQ00002.XXX' If MSCOPYFILE( cArqOrig, cArqDest )
MsCopyTo
Realiza copia de um arquivo de dados.
Sintaxe MSCOPYTO( [ cArqOrig ], cArqDest ) -> lgico Argumento cArqOrig cArqDest Obrigat. No Sim Tipo C C Descrio Nome do arquivo origem e a extenso se o ambiente for Top o parmetro passar a ser obrigatrio. Nome do arquivo destino e a extenso.
Descrio A funo MsCopyTo() copia os registros de uma base de dados para outra, criando o arquivo destino de acordo com a estrutura da base de dados origem. Se a operao for realizada com sucesso o funo retornar verdadeiro (.T.)
MsCreate
Cria arquivo de dados.
Sintaxe MSCREATE( cArquivo, aEstrut ,[ cDriver ] ) -> lgico Argumento cArquivo aEstrut cDriver Obrigat. No Sim No Tipo C A C Descrio Nome do arquivo. Estrutura do arquivo. RDD do arquivo.
Descrio 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.
Exemplo Local cTarget := '\sigaadv\' Local aStrut aStrut := { { 'Campo', 'C', 40, 0 } } If MSCREATE( cTarget+'ARQ1001', aStrut )
MsErase
Deleta arquivo. Sintaxe MSERASE( cArquivo, [ cIndice ], [ cDriver ] ) -> lgico Argumento cArquivo cIndice cDriver Obrigat. Sim No No Tipo C C C Descrio Nome do arquivo e a extenso. Nome do arquivo de ndice e a extenso. RDD do arquivo, se no for informado assumir o RDD corrente como padro.
Descrio A funo MsErase() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo Local cArquivo := 'SX2ZZZ.DBF' Local cIndice := 'SX2ZZZ'+ OrdBagExt() If MSERASE( cArquivo, cIndice )
MsExecAuto
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 baseouse 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. 2. Sem Interface 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.
MsFile
Verifica existncia de um arquivo. Sintaxe MSFILE( cArquivo, [ cIndice ], [ cDriver ] ) -> lgico Argumento cArquivo cIndice cDriver Obrigat. Sim No No Tipo C C C Descrio Nome do arquivo origem e a extenso. Nome do arquivo de ndice e a extenso. RDD do arquivo, se no for informado assumir o RDD corrente como padro.
Descrio A funo MsFile() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo Local cArquivo := 'SX2ZZZ.DBF' Local cIndice := 'SX2ZZZ'+ OrdBagExt() If !MSFILE( cArquivo, cIndice )
MsRename
Renomeia arquivo de acordo com RDD corrente.
Sintaxe MSRENAME( cArqOrig, cArqDest ) -> lgico Argumento cArqOrig cArqDest Obrigat. Sim Sim Tipo C C Descrio Nome do arquivo origem e a extenso. Nome do arquivo destino e a extenso.
Descrio A funo MsRename() retornar verdadeiro (.T.) se efetuar a operao com sucesso.
Exemplo Local cTarget := '\sigaadv\' Local cArqOrig := 'ARQ00001.DBF' Local cArqDest := 'ARQ00002.DBF' If MSRENAME( cTarget + cArqOrig, cTarget + cArqDest )
MsUnlock
Libera lock de registro.
Descrio A funo MsUnlock() libera os registros bloqueados pela funo RecLock(). No retorna valores.
Exemplo RecLock( 'XXX' ,.F. ) Replace Campo With '000001' MSUNLOCK() RecLock
OurSpool
Gerenciador de impresso. Sintaxe OURSPOOL( [ cArquivo ] ) -> nil Argumento cArquivo Descrio Obrigat. Sim Tipo C Descrio Relatrio gerado em disco
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. Exemplo User Function <nome-da-funo>( ) Local cProgram := 'Exemplo' // nome do relatrio Local cAlias := 'XXX' // alias do arquivo Local cPerg := 'XXXXXX' // grupo de perguntas Local cTitulo := 'Titulo do relatrio' Local cDesc1 := 'Descrio' Local cDesc2 := 'continuao da descrio' Local cDesc3 := 'continuao da descrio' Local lDic := .F. // no utiliza dicionrio Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' } Local lCompres :=.F. Local cTam := "G" Private m_pag := 1 Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 } Private wrel
Pergunte( cPerg, .F. ) wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam ) If nLastKey == 27 Set Filter To Return EndIf
SetDefault( aReturn, cAlias ) If nLastKey == 27 Set Filter To Return EndIf RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, 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 )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 ) If lFim @Prow()+1,001 PSAY "CANCELADO PELO OPERADOR" Exit EndIf If nLin > 58
// cabealho
// cabealho
Roda( 0, cTitulo, cTamanho ) // Rodap EndIf If aReturn[5] = 1 Set Printer To dbCommitAll() OURSPOOL( wrel )
Endif
MS_FLUSH()
Return
Pergunte
Inicializa as variveis de pergunta (mv_par??).
Sintaxe PERGUNTE( cPergunta , [ lPerg ] , [ cTitulo ] ) -> lgico Argumento cPergunta lPerg cTitulo Obrigat. Sim No No Tipo C L C Descrio Pergunta cadastrada no dicionrio de dados ( SX1) a ser utilizada. Indica se exibir a tela para edio. Ttulo do dilogo.
Descrio 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.
Exemplo PERGUNTE(CON010)
Processa
Cria dilogo com uma rgua de progresso.
Sintaxe PROCESSA( bAcao, [ cTitulo ] , [ cMsg ], [ lAborta] ) -> nil Argumento Obrigat. Tipo Descrio
Sim No No No
C C C L
Funo a ser executada. Mensagem a ser exibida a baixo da rgua de progresso Ttulo de janela Habilita boto cancelar.
Descrio 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().
Exemplo User Function <nome-da-funo>( ) Local bAcao := {|lFim| Exemplo(@lFim) } Local cTitulo := '' Local cMsg := 'Processando' Local lAborta := .T.
ProcRegua IncProc
ProcRegua
Atribui o valor total da rgua de progresso cria pela pela funo Processa().
Sintaxe PROCREGUA( nTotal ) -> nil Argumento nTotal Descrio Aps atribuir o valor total da rgua, para incrementar utilizamos a funo IncProc(). Obrigat. Sim Tipo N Descrio Valor total da rgua.
Exemplo User Function <nome-da-funo>( ) Local bAcao := {|lFim| Exemplo(@lFim) } Local cTitulo := ''
Local cMsg := 'Processando' Local lAborta := .T. Processa( bAcao, cTitulo, cMsg, lAborta ) Return Static Function Exemplo(lFim) Local nI PROCREGUA(10000) For nI := 1 To 10000 If lFim Exit EndIf IncProc() Next nI Return
IncProc Processa
PswAdmin
Verifica se um usurio pertence ao grupo de administradores.
Sintaxe PSWADMIN( cUsuario, cSenha ) -> numrico Argumento cUsuario cSenha Obrigat. Sim Sim Tipo C C Descrio Nome do usurio. Senha do usurio.
Descrio A funo PswAdmin() retorna 0 (zero) se o usurio for do grupo de administradores, 1 (um) para usurio no administrador e 2 (dois) se for senha invlida.
Exemplo User Function <nome-da-funo>( cUsuario, cSenha ) Local lAdminst := .F. Local nRet nRet := PSWADMIN( cUsuario, cSenha ) If nRet == 0 lAdminst := .T. ElseIf nRet == 1 APMsgInfo( Usurio no Administrador ! ) ElseIf nRet == 2 APMsgInfo( Senha invalida ! ) EndIf Return lAdminst
PswID
Retorna o ID do usurio ou do grupo de usurio.
Descrio Utilizada para retornar o ID do usurio ou do grupo de usurios aps ter posicionado o arquivo de senha com a funo PswSeek().
PswName
Verifica senha de usurio.
Sintaxe PSWNAME( cSenha ) -> lgico Argumento cSenha Sim Obrigat. C Tipo Descrio Senha do usurio.
Descrio A funo PswName() verifica se a senha informada no parmetro cSenha pertence ao usurio posicionado no arquivo de senha, se pertencer retornar verdadeiro(.T.).
PswOrder
Posiciona a ordem de indexao do arquivo de senhas.
Sintaxe PSWORDER( nOrdem ) -> nil Argumento nOrdem Obrigat. Sim Tipo N Descrio Ordem de indexao.
Descrio 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.
Exemplo User Function <nome-da-funo>( cUsuario ) Local cUserID PSWORDER(2) If PswSeek( cUsuario, .T. ) cUserId := PswID() // Retorna o ID do usurio EndIf Return
PswRet
Retorna vetor contendo informaes do Usurio ou do Grupo de Usurios.
Sintaxe PSWRET() -> array Descrio A funo PswRet() retorna dois tipos de vetores distintos, de acordo com o 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.
PswOrder(2) PswSeek( cUsuario, .T. ) aArray := PSWRET() // Retorna vetor com informaes do usurio
EndIf Return // Exemplo 2 User Function <nome-da-funo>( cGrupoID ) Local cGrupo PswOrder(1) If PswSeek( cGrupoId, .F. ) cGrupo := PSWRET()[1][2] // Retorna nome do Grupo de Usurio EndIf Return
PswSeek
Pesquisa e posiciona o arquivo de senhas.
Sintaxe PSWSEEK( cID, [ lUsuario ] ) -> lgico Argumento cID lUsuario Obrigat. Sim No Tipo C L Descrio String contendo o ID do usurio ou do grupo de usurios. Se verdadeiro (.T.) pesquisa por usurios, se falso (.F.) pesquisa por grupo de usurios. O valor assumido como padro .T.
Descrio 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.).
Local cUserID
PswOrder(2)// seleciona ordem de indexao If PSWSEEK( cUsuario, .T. ) cUserId := PswID() // Retorna o ID do usurio EndIf Return PswAdmin PswID PswName PswOrder PswRet
ReadVar
Retorna o nome da varivel que esta sendo editada.
Descrio 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. Exemplo cVar := READVAR() If Type(cVar) == C
RetExtHlp
Retorna a extenso do help de campo. Sintaxe RETEXTHLP() -> caracter Descrio Esta funo retorna uma string contendo a extenso do help de campos de acordo com idioma corrente. Exemplo Local cExt cExt := RETEXTHLP() If HLP $ cExt
APMsgInfo( Help de Campos em Portugus ) ElseIf HLE $ cExt APMsgInfo( Help de Campos em Espanhol' ) ElseIf HLI $ cExt
RetExtHls
Retorna a extenso do help de solues.
Descrio Esta funo retorna uma string contendo a extenso do help de solues de acordo com idioma corrente.
APMsgInfo( Help de Solues em Portugus ) ElseIf HSE $ cExt APMsgInfo( Help de Solues em Espanhol' ) ElseIf HSI $ cExt APMsgInfo( Help de Solues em Ingls ) EndIf RetAcsName RetExtHlp RetExtHpr RetEXtMnu -----------------------/\/\/\/\/\/\/\/\/\ Cores do Botes /\/\/\/\/\/\/\/\/\/\/\--------------
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;
322
tSrvObject
Classe me de todas as classes de interface. Caractersticas Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser instanciada diretamente. Propriedades Propriedade Tipo nLeft nTop nWidth nHeight cCaption cTooltip lShowHint cMsg nClrText nClrPane bWhen bValid blClicked brClicked blDblClick oWnd lVisible Cargo bLostFocus bGotFocus Numrico. Numrico. Numrico. Numrico. Caractere. Caractere. Lgico. Caractere. Numrico. Numrico. Bloco de cdigo. Bloco de cdigo. Bloco de cdigo. Bloco de cdigo. Bloco de cdigo. Objeto. Booleano. Objeto ou varivel. Bloco de cdigo. Bloco de cdigo. Descrio Coordenada horizontal em pixels. Coordenada vertical em pixels. Largura em pixels. Altura em pixels. Ttulo ou contedo do objeto. Mensagem exibida quando objeto exibe seu tooltip. Flag que ativa .T. ou desativa .F. a exibio do tooltip do objeto. Mensagem exibida na barra de status da janela principal quando o objeto ganha foco. Cor do texto do objeto. Cor do fundo do objeto. Executado quando h movimentao de foco na janela.Se retornar .T. o objeto continua habilitado, se retornar .F. o objeto ser desabilitado. Executado quando o contedo do objeto modificado e dever ser validado. Deve retornar .T. se o contedo vlido e .F. se contedo invlido. Executado quando acionado click do boto esquerdo do mouse sobre o objeto. Executado quando acionado click do boto direito do mouse sobre o objeto. Executado quando acionado duplo click do boto esquerdo do mouse sobre o objeto. Janela onde o objeto foi criado. Se .T. o objeto visvel, se .F. o objeto invisvel. Contedo associado ao objeto. Executado quando objeto perde foco. Executado quando objeto ganha foco.
Mtodos SetFocus Sintaxe Retorno SetFocus( ) NIL Hide( ) NIL Show( ) NIL Enable( ) Descrio Fora o foco de entrada de dados mudar para o objeto.
Enable Sintaxe
323
Descrio Habilita o objeto. Retorno NIL Disable( ) NIL Refresh( ) Fora atualizao (sincronia) de propriedades entre o programa e o Protheus Remote.
tFont
Classe que encapsula fonte de edio. Hierarquia tFontAbs -> tFont Descrio Utilize objeto tFont para modificar a fonte padro de controles visuais.
New Mtodo construtor da classe. New([acName], [nPar2], [anHeight], [lPar4], [alBold], [nPar6], [lPar7], [nPar8], [alItalic], [alUnderline]) Parmetro Tipo / Descrio acName nPar2 anHeight lPar4 alBold Caractere, opcional. Nome da fonte, o padro Arial. Reservado. Numrico, opcional. Tamanho da fonte. O padro -11. Reservado. Lgico, opcional. Se .T. o estilo da fonte ser negrito. Reservado. Reservado. Reservado. Lgico, opcional. Se .T. o estilo da fonte ser itlico.
Descrio Sintaxe
Parmetros
Retorno Exemplo
O objeto criado.
#INCLUDE "PROTHEUS.CH" User Function Teste() Local oDlg, oSay Local oFont:= TFont():New("Courier New",,-14,.T.)
324
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 */ oSay:lTransparent:= .F. ACTIVATE MSDIALOG oDlg CENTERED Return
MSDialog
Classe de dilogo de entrada de dados. Hierarquia tSrvObject -> tWindow -> tDialog -> MSDialog Caractersticas MSDialog deve ser utilizada como padro de janela para entrada de dados. MSDialog um tipo de janela dilogo modal, isto , no permite que outra janela ativa receba dados enquanto esta estiver ativa. Propriedades Vide classes ancestrais. Mtodos
New Descrio Sintaxe Mtodo construtor da classe. New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7], [lPar8], [nPar9], [anClrText], [anClrBack], [oPar12], [aoWnd], [alPixel], [oPar15], [oPar16], [lPar17]) Parmetro Tipo / Descrio anTop anLeft anBotom anRight Numrico, opcional. Coordenada vertical superior em pixels ou caracteres. Numrico, opcional. Coordenada horizontal esquerda em pixels ou caracteres. Numrico, opcional. Coordenada vertical inferior em pixels ou caracteres. Numrico, opcional. Coordenada horizontal direita em pixels ou caracteres. Reservado. Reservado. Reservado. Reservado.
acCaption Caractere, opcional. Ttulo da janela. cPar6 Parmetros nPar7 lPar8 nPar9
anClrText Numrico,opcional. Cor do texto. anClrBack Numrico,opcional. Cor de fundo. oPar12 aoWnd alPixel oPar15 oPar16 Reservado. Objeto, opcional. Janela me da janela a ser criada, padro a janela principal do programa. Lgico, opcional. Se .T. considera as coordenadas passadas em pixels, se .F. considera caracteres. Reservado. Reservado.
325
nPar17
Reservado.
Retorno Exemplo
O Dilogo criado.
#INCLUDE protheus.ch User Function Teste() // cria dilogo Local oDlg:=MSDialog():New(10,10,300,300,Meu dialogo,,,,,CLR_BLACK,CLR_WHITE,,,.T.) // ativa dilogo centralizado oDlg:Activate(,,,.T.,{||msgstop(validou!),.T.},,{||msgstop(iniciando) ) Return
tButton
Classe de boto. Hierarquia tSrvObject -> tControl -> tButton Descrio Utilize a classe tButton para criar um controle visual do tipo boto. Propriedades Nome bAction Mtodos Tipo / Descrio Bloco de cdigo. Executado quando o boto pressionado.
New Mtodo construtor da classe. New([anRow], [anCol], [acCaption], [aoWnd], [abAction], [anWidth], [anHeight], [nPar8], [aoFont], [lPar10], [alPixel],[lPar12],[cPar13], [lPar14], [abWhen], [bPar16], [lPar17]) Parmetro Tipo / Descrio anRow anCol aoWnd abAction Numrico, opcional. Coordenada vertical em pixels ou carateres. Numrico, opcional. Coordenada horizontal em pixels ou caracteres. Objeto, opcional. Janela ou controle onde o boto dever ser criado. Bloco de cdigo, opcional. Bloco que dever ser acionado quando o boto for pressionado. Numrico, opcional. Largura do boto em pixels. Numrico, opcional. Altura do boto em pixels. Reservado. Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada para o ttulo do boto. Reservado. Lgico, opcional. Se .T. considera as coordenadas passadas em pixels, se .F. (padro) considera em caracteres. Reservado. Reservado.
Descrio Sintaxe
326
Reservado. 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. Reservado. Reservado.
Exemplo #include protheus.ch User Function TesteGet() Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3} cCombo:= aItems[2] DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},; aItems,100,20,oDlg,,{||MsgStop(Mudou item)},,,,.T.,,,,,,,,,cCombo) // Boto para fechar a janela oButton:=tButton():New(30,10,fechar,oDlg,{||oDlg:End()},100,20,,,,.T.) ACTIVATE MSDIALOG oDlg CENTERED MsgStop( O valor +cCombo ) Return NIL
------------------------------/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\--------------------------
Se subir legal os dois, confirme pelo service do Win2000 que ambos esto no ar, startados e como automticos.
327
Se no der certo, volte situao original, ou seja, AP6SVR automtico como servio e AP5SVR como console.
Instalao
Para instalar o SIGA Advanced for Windows com Microsoft Excel, o usurio deve possuir: Hardware Configurao mnima: Pentium 133 com 16 MB RAM, recomendado Pentium 166 com 32 MB RAM. Microsoft Excel A verso mnima 7.0 (95), recomendado o uso da verso 8.0 (97) 1. 2. Execute o programa de instalao do SIGA Advanced. Instale o SIGA Office Kit nas estaes.
Observaes
1. 2. A instalao do Office Kit deve ser feita em todas as estaes que iro utilizar a integrao. 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).
Utilizando a Integrao
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. 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.
2.
OBS: A integrao somente funcionar se o Excel for aberto a partir do Siga Advanced.
328
1.
2.
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 "Definidas 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. 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 =. 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: SIGA("nome da funo"; 1 parmetro da funo; 2 parmetro da funo;...) Por exemplo, informando: =SIGA("MesExtenso";2) Desta forma, ser retornado o ms Fevereiro. Observe que o nome da funo SIGA Advanced informado entre aspas. (" "). 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: =SIGA(MesExtenso(2))
3.
4.
ExecBlocks
Pode-se utilizar Execblock nas clulas do Microsoft Excel com algumas restries: No devem ser utilizadas entradas de dados ou qualquer outro tipo de Tela. O Execblock deve obrigatoriamente retornar um valor. O Execblock deve ser pequeno para evitar a perda da conexo do SIGA Advanced com o Microsoft Excel.
329
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.
MEDIA
Calcula a taxa mdia de uma determinada moeda em um ms especfico. Sintaxe: Media (ExpN1, ExpN2, ExpN3) onde: ExpN1 - Moeda a ser calculada a mdia ExpN2 - Ms a ser calculado ExpN3 - Ano a ser calculado Ex.: Media (2,10,94) Caso o ms e o ano no sejam passados como parmetros sero assumidos o ms e ano da database.
SOMAR
Faz o somatrio de um arquivo, retornando o valor acumulado de um campo determinado. Sintaxe: Somar(ExpC1, ExpC2, ExpC3) onde: ExpC1 - Alias do arquivo ExpC2 - Condio para soma ExpC3 - Campo a ser somado Ex.: Somar(SI1",I1_CLASSE='S' ,I1_SALANT) Caso o usurio no deseje definir nenhuma condio, a ExpC2 deve ser .T..
GRUPO
Retorna o somatrio das clulas pertencentes a um determinado grupo. Sintaxe: Grupo(ExpC1) onde: ExpC1 - Grupo a ser somado Ex.: Grupo(1)
CONTAR
Conta o nmero de registros de acordo com a condio determinada. Sintaxe: Contar(ExpC1, ExpC2) onde: ExpC1 - Alias do arquivo ExpC2 - Condio para a contagem Ex: Contar(SC1,C1_DATPRF < dDataBase)
Funes Contbeis
330
SALDO
Devolve o saldo de uma determinada conta. Sintaxe: Saldo(ExpC1, ExpN1,ExpN2) onde: ExpC1 - Cdigo da Conta ExpN1 - Perodo do saldo desejado ExpN2 - Moeda desejada para obteno do saldo. Ex.: Saldo(11101,12,1)
MOVIMENTO
Devolve o movimento (dbito-crdito) de uma determinada conta. Sintaxe: Movimento(ExpC1,ExpN1,ExpN2,ExpD1) onde: ExpC1 - Cdigo da conta ExpN1 - Ms do movimento desejado ExpN2 - Moeda desejada para obteno do movimento ExpD1 - Data do exerccio desejado Ex.: Movimento(43,1,1, CTOD ("01/01/95") : retorna o 1 perodo Movimento(`43,1,1,CTOD(01/01/96) : retorna o 13 perodo
DEBITO
Devolve o valor a dbito de uma determinada conta. Sintaxe: Debito(ExpC1, ExpN1, ExpN2) onde: ExpC1 - Cdigo da Conta ExpN! - Ms do movimento desejado ExpN2 - Moeda desejada para obteno do valor a dbito Ex.: Debito(11103,03,1)
CREDITO
Devolve o valor a crdito de uma conta. Sintaxe: Credito(ExpC1, ExpN1, ExpN2) onde: ExpC1 - Cdigo da Conta ExpN1 - Ms do movimento desejado ExpN2 - Moeda desejada para obteno do valor a crdito Ex.: Credito(11103,03,1)
SOMAMOVIM
Retorna o movimento dentro de um intervalo de contas analticas Sintaxe: SomaMovim(ExpC1, ExpC2, ExpN1, ExpN2) onde: ExpC1 - Cdigo da conta De ExpC2 - Cdigo da conta At ExpN1 - Referente ao ms Exp N2 - Moeda desejada para obteno do valor Ex.: SomaMovim(41304,41305,12,1)
SOMASALDO
Retorna o saldo atual entre um intervalo de contas. Sintaxe SomaSaldo(ExpC1, ExpC2, ExpN1, ExpN2) onde: ExpC1 - Cdigo da conta De ExpC2 - Cdigo da conta At ExpN1 - Referente ao perodo ExpN2 - Moeda desejada para obteno do valor Ex.: SomaSaldo(31001,31010,12,1)
ORADO
Retorna o valor orado de uma conta.. Sintaxe Orcado(ExpC1, ExpN1, ExpN2, ExpD1) onde: ExpC1 - Cdigo da conta De
331
ExpN1 - Referente ao perodo ExpN2 - Moeda desejada para obteno do valor ExpD1 - Data para converso (em formato data ou caracter), caso no informa-da, ser utilizada a DataBase do sistema. Ex.: Orcado(11102001,1,1)
MESEXTENSO
Devolve o nome do ms por extenso. Sintaxe: MesExtenso(ExpX1) onde: ExpX1 - Poder ser enviado o nmero de um ms, tanto do tipo caracter como numrico, ou poder ser enviada uma data. Caso nada seja informado, ser devolvido o nome do ms referente a Data Base. Ex.: MesExtenso(01)
VARIAO
Retorna a variao em percentual entre dois valores. Sintaxe: Variao(ExpN1, ExpN2) onde: ExpN1 - Primeiro fator comparativo ExpN2 - Segundo fator comparativo Ex.: Variacao(100000,50000)
MOVIMCC
Retorna o movimento de um centro de custo mais conta contbil (extracontbil). Sintaxe: MovimCC(ExpC1, ExpC2, ExpN1, ExpN2) onde: ExpC1 - Cdigo do centro de custo ExpC2 - Cdigo da conta contbil ExpN1 - Referente ao ms ExpN2 - Moeda desejada para obteno do valor Ex.: MovimCC(3001, 111001,Month(Ddatabase),1)
ORCADOCC
Recupera o valor orado da Conta x Centro de Custo para utilizao na planilha. Sintaxe: OrcadoCC(ExpC1,ExpC2,ExpN1,ExpN2,ExpD1), onde: ExpC1 - Conta ExpC2 - Centro de Custo ExpN1 - Perodo (default ms da database) ExpN2 - Moeda (default 1) ExpD1 - Data para converso se moeda de 2 a 5 - (default dDataBase). Ex.: OrcadoCC( 111001,3001,3,2)
SUMMOVIMCC
Retorna o movimento de um intervalo de centro de custos extracontbeis. Poder ser parametrizados tambm um grupo de contas. Sintaxe: SumMovimCC(ExpC1,ExpC2,ExpC3,ExpC4,ExpN1,ExpN2) onde: ExpC1 - do Centro de Custo ExpC2 - at Centro de Custo ExpC3 - da Conta ExpC4 - at a Conta ExpN1 - Ms (default ms da database) ExpN2 - Moeda (default 1) Ex.: SumMovimCC( 3001,3100,31001,31010,12,1)
GRAVAORCADO
Permite que um determinado valor calculado pela planilha seja gravado no Arquivo de Oramentos. Sintaxe: GravaOrcado(ExpC1,ExpN1,ExpN2,ExpN3) onde:
332
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
Calcula o saldo dos centro de custos extracontbeis. Sintaxe: SaldoCusto(ExpC1,ExpC2,ExpC3,ExpC4,ExpN1,ExpN2) onde: ExpC1 - Centro de Custo Inicial ExpC2 - Centro de Custo Final ExpC3 - Conta Inicial ExpC4 - Conta Final ExpN1 - Ms (se nula, assume o ms de referncia da database) ExpN2 - Moeda (se nula, ser assumido 1 ) Ex.: SaldoCusto(1007, 1099, 3, 4, 10, 1)
SOMACONTAS
Retorna o saldo acumulado de um grupo de contas, de acordo com a sintaxe 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.
Funes Financeiras
SLDBCO
Retorna o saldo bancrio em uma data. Sintaxe: SldBco(ExpC1,ExpC2,ExpC3,ExpD1,ExpN1) onde: ExpC1 - Cdigo do Banco ExpC2 - Agncia Bancria ExpC3 - Conta Bancria ExpD1 - Data do Saldo ExpN1 - Moeda do Saldo Bancrio Ex.: SldBco(409,00198,011122, dDataBase,1)
SLDRECEBER
Retorna o saldo a receber em uma data. Sintaxe: SldReceber(ExpD1,ExpN1,ExpL1) onde: ExpD1 - Data do Movimento a Receber. ExpN1 - Moeda - Default 1 ExpL1 - Se .T. At a Data, .F. Somente Data (o padro .T.) Ex.: SldReceber(Data,1,.T.)
333
SLDPAGAR
Retorna o saldo a pagar em uma determinada data. Sintaxe: SldPagar(ExpD1,ExpN1,ExpL1) onde: ExpD1 - Data do Movimento a Pagar ( padro dDataBase) ExpN1 - Moeda (padro 1) ExpL1 - Se .T. At a Data, .F. Somente Data (padro .T.) Ex.: SldPagar(dDataBase,1,.T.)
SLDCLIENTE
Retorna o saldo a receber do cliente em uma determinada data. Sintaxe: SldCliente(ExpC1,ExpD1,ExpN1,ExpL1) onde: ExpC1 - Cliente+Loja ExpD1 - Data do Movimento a Receber (padro dDataBase) ExpN1 - Moeda ExpL1 - Se .T. considera o saldo do SE5 (padro .T.) Ex.: SldCliente(00000101,dDataBase)
SLDFORNECE
Retorna o saldo a pagar do fornecedor em uma data Sintaxe: SldFornece(ExpC1,ExpD1,ExpN1,ExpL1) onde: ExpC1 - Fornecedor+Loja ExpD1 - Data do Movimento a Pagar (padro dDataBase) ExpN1 - Moeda - (padro 1) ExpL1 - Se .T. considera o saldo do SE5 (padro .T.) Ex.: SldFornece(00000101")
FINNATPRV
Retorna o valor previsto de cada natureza. Sintaxe: FinatPrv(ExpC1,ExpD1,ExpD2,ExpN1) onde: ExpC1 - Natureza a ser Pesquisada ExpD1 - Data Inicial para clculo ExpD2 - Data Final de clculo ExpN1 - Moeda de Sada Ex.: FinNatPrv(R001,CtoD(01/01/98),dDataBase,1)
FINNATREA
Retorna o valor realizado da Natureza. SintaxeFinNatRea(ExpC1,ExpD1,ExpD2,ExpN1) onde: ExpC1 - Natureza a ser Pesquisada ExpD1 - Data Inicial para clculo ExpD2 - Data Final de clculo ExpN1 - Moeda de Sada Ex.: FinNatRea(R001,CtoD(01/01/98),dDataBase,1)
FINNATORC
Retorna o valor orado da natureza. Sintaxe: FinNatOrc(ExpC1,ExpN1,ExpN2) onde: ExpC1 - Natureza a ser Pesquisada ExpN1 - Ms para clculo ExpN2 - Moeda de Sada Ex.: FinNatOrc(R001,10,1)
334
desmarcar as opes [] Use ANSI quoted e [] Use ANSI nulls, paddings and warnings . NEXT>. 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 (CLIENTE DEVER ENTRAR EM CONTATO COM O ATENDIMENTO DO DISK-
335
SIGA.: (0xx11)3981-7100)para obter a chave de acesso conforme a quantidade de usurios adquiridos. SIGA ADVANCED 4.07 : No diretrio Sigaadv\WINSQL, existe um arquivo chamado ADV97.INI. Edite-o, os parmetros corretos para o SigaAdv com SQL Server so: Database = MSSQL7, Alias = TOPSQL, Contype = NPIPE, Server = NOME do servidor NT com o TOPConnect. AP5 : 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.
Caso seja necessrio a migrao de base DBF 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.
1.1.
- Memria - Discos
= 512 MB ou mais = 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 - Rede = 2 processador Pentium III Xeon 500mhz com 512 de cache. = Adaptador de 100 mbits, utilizar swite(no cascatear Hubs)
336
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.
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
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 :Latin1-General, binary sort for Unicode Data, SQL Server Sort Order 30 on Code Page 437 for nonUnicode Data
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. Em PROPERTIES/OPTIONS do DATABASE a opo "Truncat Log on Checkpoint", tem a funo de estratgia de Backup, se a empresa optar por efetuar Backup`s de Log, tal opo poder ficar desmarcada. Agora entre em Security e em Logins, e com o boto direito sobre qualquer outro 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 SQL Server est pronta. Agora resta apenas a configurao do TOPConnect Manager e do SigaAdv. Instalar o TOPConnect, e aps o termino do Install, encerrar todos os servio e reiniciar o Servidor, Caso o processo seja de Atualizao do TOPConnect_1 para TOPConnect_2, deve ser efetuada a remoo do TOPConnect_1(e o que for referente ao topconnect) atravs de Adicionar e Remover Programas que est no Painel de Controle do Windows NT, antes de Instalar o TOPConnect_2. Topconnect_2 / Em Propriedades de Ambiente. Configurao do ODBC SQL Server Setup : Name = TOPSQL, SERVER=(nome do servidor )[ Caso o TOPconnect esteja no mesmo servidor que o SQL/Server deve-se manter a opo LOCAL Desta forma a conexo entre o TOPConnect e o SQL no estar trafegando na Rede], NEXT>. Marcar a opes () With SQL Server authentication using a login ID .... e [] Connect to SQL Server to obtain default setings .... Login ID : SIGA , Password .:SIGA. Marcar.: [] NEXT> 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 . NEXT>.
337
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 (CLIENTE DEVER ENTRAR EM CONTATO COM O ATENDIMENTO DO DISKSIGA.: (0xx11)3981-7100)para obter a chave de acesso conforme a quantidade de usurios adquiridos.
CLIENTE SIGAADVANCED
No diretrio AP5\BIN, existe um arquivo chamado AP5SRV.INI. Edite-o, os parmetros corretos para O PROTHEUS com SQL Server so: Database = MSSQL7, Alias = TOPSQL, Contype = NPIPE, Server = NOME do servidor NT com o TOPConnect.
e das
338
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 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
339
-------------------------------------------------------------------------------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 Value: -23 Meaning: O arquivo no pode ser aberto.
340
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. -------------------------------------------------------------------------------Constant Name: TCF_DeleteFailed Value: -30
341
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.
Hardlock
342
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 ? 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. --------------------------------------------------------------------------------
343
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. -------------------------------------------------------------------------------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 ?
344
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 ?
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.
345
2.
Abra o IDE do Protheus, selecione o menu Ferramentas -> Aplicao de Patchs. Escolha o arquivo .pat e clique em Ok. Este arquivo deve estar dentro do sever do protheus, preferencialmente dentro da pasta Sigaadv. Obs.: Para baixar o patch, pode acessar : ftp.microsiga.com.br/Ap7/Procedures Este patch contm os seguintes arquivos: CFGX051.PRW, MATA280.PRX, MATA300.PRX Cada solicitante tem a responsabilidade de validar os Patches antes de aplic-lo na rea de produo do cliente. Como procedimento obrigatrio, deve-se efetuar um backup da 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.
Entre no mldulo configurador e selecione a opo do instalador de procedures, normalmente encontada no menu Ambiente -> Cadastros -> Stored Procedures. Aparecer uma tela para que sejam selecionadas as filias para as quais as Stored Procedures sero instaladas. Selecione as filiais desejadas e clique em ok. Caso no exista o menu, crie. A funo que chama o configurador a CFGX051().
De 001 a 006 Senha do Usurio (6 dgitos) De 007 a 021 Nome do Usurio (15 dgitos) De 022 a 533 Permisses de Acesso (512 dgitos) Senha do Usurio. Nome do Usurio sem brancos a direita. Permisses de Acesso do Usurio. Nmero de identificao do usurio no cadastro
cSenha (C, 6)
de usurios. Ex.: 000006. cNivel (N, 1) Nvel de Acesso do Usurio podendo variar de 0 a
9 sendo que 9 indica um Administrador. cModulo (C, 3) Sigla do Mdulo que est em uso no momento. Ex.:
346
nModulo (N, 1)
Ex.: 4 para o Mdulo de Estoque. aEmpresas (A) Array contendo tantos elementos quanto forem as
empresas e filiais cadastradas no sistema sendo que cada elemento se encontra no formato EEFF (Empresa + Filial) Ex.: 5501. cNumEmp (C, 4) Nmero da Empresa + Filial que est em uso no
momento. Ex.: 9901. cEmpAnt (C, 2) Ex.: 55. cFilAnt (C, 2) Ex.: 01. cArqEmp (C, 12) Ex.: SIGAMAT.EMP. cArqMnu (C, 12) Nome do arquivo de menu que est em uso no Nome do arquivo de empresas com sua extenso. Nmero da Filial que est em uso no momento. Nmero da Empresa que est em uso no momento.
momento + a sua extenso. Ex.: SIGAEST.MNU. _NomeExec (C, 12) Nome do arquivo executvel que est em uso no
momento + a sua extenso. Ex.: SIGAEST.EXE. cFOpened (C) String com os Alias de todos os arquivos que esto
abertos no momento. cVersao (C) tInicio (C, 8) HH:MM:SS. __Language (C) cPaisLoc (C, 3) Sistema. Ex.: BRA. __TTSinUse (L) Indica se o controle de transaes est ativo no Lngua atual do Sistema. Ex.: PORTUGUESE. Sigla do Pais para qual est configurado o Verso do Sistema. Horrio em que foi iniciado o sistema no formato
sistema. Retorna .T. se MV_TTS = S e .F. se for igual a N. __lSX8 (L) Usada em conjunto com as funes GetSX8Num() e
ConfirmSX8(). Provavelmente para controlar se o nmero j est reservado para outro usurio.
347