Você está na página 1de 103

Visual FoxPro 8.

0 – O Caminho das Pedras – Página 1 de 103

O CAMINHO DAS PEDRAS

Como desenvolvedor vindo de linguagens não visuais como Clipper e FoxPro, tive um certo
trabalho pra me adaptar com Visual FoxPro. Primeiro pela infinidade de coisas que são
abertas na tela pra se clicar e segundo porque existem muitos conceitos novos.

Pretendo através deste pequeno manual apresentar o caminho mais rápido para se desenvolver
aplicações em Visual FoxPro, sem que ter apresentar todos os conceitos da linguagem.

Nós que viemos de dialetos xBase e principalmente de linguagens para ambiente DOS temos
um vasto vocabulário de termos para elementos de nossas aplicações que provavelmente
mudarão de nomes no ambiente Windows. Alguns desses vocábulos:

Tabela 1
Linguagem não Visual Linguagem Visual
Tela Janela
Tela de Dados Formulário de Dados
Lib Biblioteca de classes
Get Textbox
Say Label

NÃO É PRECISO CONHECER TUDO PARA COMEÇAR

Ao contrário do que muitos acham, não é necessário conhecer tudo de VFP para começar a
desenvolver. Note que eu disse começar. À medida que se aprende mais, mais se têm
necessidade de aprender. Isso é o que é o máximo! Em outras palavras quero dizer que é
necessário aprender sempre.

Para começarmos a desenvolver aplicações de baixa complexidade não precisamos conhecer


muita coisa. Vejamos algumas das que são mais necessárias.

O que precisamos conhecer?

• Project Manager
• Database Designer
• Form Designer
• Menu Designer
• Report Designer
• Program Editor

O Project Manager

Esta é a ferramenta de gerenciamento de projetos do Visual FoxPro. É bastante simples de


utilizar e de uma utilidade incrível. Através dele é que faremos a compilação de nosso projeto
final, gerando nossas APP’s (Aplicações) e executáveis. Vejamos sua aparência:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 2 de 103

Figura 1 - Project Manager

Como é de se notar na figura do Project Manager acima, há seis abas dividindo os arquivos
do projeto por categoria, sendo elas:

All – exibe todo o conteúdo do projeto.

Data – exibe apenas o que está relacionado a banco de dados

Documents – exibe os arquivos de formulários (telas), relatórios (reports) e etiquetas (labels).

Classes – exibe as bibliotecas de classes (vcx) incluídas no projeto assim como as classes
nelas contidas.

Code – exibe todos os programs (prgs), bibliotecas API e aplicações (apps).

Other – exibe os demais tipos de arquivos que possam estar inclusos no projeto, como
imagens, arquivos texto, menus, etc.

O gerenciador de projetos é composto ainda dos seguintes botões:

New... – serve para criar um novo componente e adicioná-lo automaticamente ao projeto. O


novo componente dependerá da categoria selecionada. Se você estiver sobre Databases, irá
criar um novo banco de dados ao clicar em New... e assim por diante.

Add... – serve para adicionar um componente já existente. Para adicionar um banco de dados
já pronto, bastaria clicar sobre Database e depois em Add... escolhendo então o banco de
dados a ser adicionado ao projeto.

Modify – serve para modificar o componente selecionado. Ao clicar sobre o componente e


depois em Modify, o editor apropriado será aberto de acordo com o tipo de componente.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 3 de 103

Open – serve para abrir um banco de dados.

Run – serve para executar o componente selecionado. Os componentes que podem ser
executados são os forms, labels, reports, prgs, menus.

Remove... – serve para remover um componente do projeto.

Build... – serve para compilar o projeto, permitindo-os criar app’s, dll’s e exe’s.

Preview – exibe um relatório ou etiqueta no modo de visualização para impressão.

Já mostrei algumas informações sobre o gerenciador de projetos mas ainda nem mostrei como
abri-lo. Pois bem, abri-lo é tarefa bastante simples.

Quando se trata de criar um novo projeto, você pode ir no menu File e escolher New... a
primeira opção é Project.

Ou ainda pode a partir da Janela de Comandos (Command Window) digitar:

CREATE PROJECT nomedoprojeto

Onde nomedoprojeto é o nome que você dará ao seu projeto.

É importante saber que o nome dado ao projeto será o nome do executável da


aplicação, por isso, escolha bem o nome do seu projeto.

Ainda sobre o Gerenciador de projetos, podemos adicionar que há um menu específico para o
mesmo, conforme mostra a próxima figura.

Figura 2 - Menu Project

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 4 de 103

O menu Project possui as ações dos botões contidos no Project Manager e ainda algumas
outras importantes ações como Project Info, utilizada para visualizar algumas outras
informações sobre o projeto. A opção Clean Up Project é uma espécie de reindexador e
compactador do projeto. À medida que vamos adicionando e removendo itens do projeto é
bom sempre que executemos o Clean Up Project para reduzir o tamanho do mesmo.

A Database Designer

Usuários e desenvolvedores vindos de outras linguagens podem já ter utilizado alguma


ferramenta para auxiliar na criação das tabelas de banco de dados. Na época do Clipper, o
DBU era um excelente aliado do desenvolvedor. Na era dBase, também já existia meio do
usuário criar suas tabelas.

Desde os tempos mais remotos o FoxPlus, FoxPro Dos e Windows também já permitia a
criação de tabelas de forma interativa, facilitando bastante a vida do usuário.

No Visual FoxPro não é diferente. Há uma ferramenta chamada Database Designer a qual
utilizamos para a criação de forma visual e interativa dos componentes de um banco de
dados.

A principal diferença conceitual é que na versão Visual, o Banco de dados é formado por um
Container e diversas tabelas. O DBC ou Database Container é responsável por armazenar
informações sobre as tabelas, índices, stored procedures (procedimentos armazenados),
triggers (disparadores), conexões e views.

Através da Database Designer podemos gerenciar todas as atividades relacionadas a um


banco de dados do Visual FoxPro.

Para acessar a Database Designer, você pode simplesmente a partir da aba Data do
gerenciador de projetos clicar em Database ou no nome do banco de dados existente (caso
exista um) e então clicar em New..., ou em Modify (caso exista um banco de dados).

No nosso caso como o banco ainda não existe, vamos criar um novo, clicando em New...
Uma nova janela será apresentada. Escolha New Database.

Figura 3 - New Database

Agora informe o nome do banco de dados a ser criado. Caso queira colocá-lo dentro de uma
pasta separada, fique à vontade.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 5 de 103

Figura 4 - Informando o nome do banco de dados.

Após clicar sobre o botão Save, o banco foi criado vazio e a janela da Database Designer irá
aparecer para que você adicione novas tabelas ao banco:

Figura 5 - Database Designer com um banco novo.

Observe que além da janela da Database Designer veio junto uma barra de ferramentas de
mesmo nome. A partir dessa barra de ferramentas podemos realizar as seguintes operações:

New Table – criar uma nova tabela.

Add Table – adicionar uma tabela já existente.


Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 6 de 103

Remove Table – remover uma tabela.

New Remote View – criar uma nova view (visualização) remota.

New Local View – criar uma nova view local.

Modify Table – modificar a estrutura de uma tabela.

Browse Table – visualizar os dados da tabela selecionada.

Edit Stored Procedures – criar/modificar procedimentos armazenados no banco de dados.

Connections – criar/alterar conexões com bancos de dados.

Já que estamos falando em banco de dados, vamos logo definir aqui o que vamos desenvolver
para aprendizado. Pensei num aplicativo simples, porém com um certo nível de
complexidade. Um Contas a Pagar e Contas a Receber seria um bom começo.

Estrutura básica para o banco de dados do aplicativo

• Tabela de Fornecedores
• Tabela de Clientes
• Tabela de Contas a Pagar
• Tabela de Contas a Receber
• Tabela de Usuários

Passemos agora a definir a estrutura de cada uma dessas tabelas formando assim nosso banco
de dados. A estrutura das tabelas é a seguinte:

Tabela 2
Tabela: Clientes
Nome do Campo Tipo Tamanho
Id_cliente Character 6
Nome_cliente Character 40
Endereço Character 40
Numero Character 5
Bairro Character 20
Cep Character 8
Cidade Character 20
Estado Character 2
Ddd Character 2
Telefone Character 8
Contato Character 20

Tabela 3
Tabela: Fornecedores
Nome do Campo Tipo Tamanho

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 7 de 103

Id_fornecedor Character 6
Nome_fornecedor Character 40
Endereço Character 40
Numero Character 5
Bairro Character 20
Cep Character 8
Cidade Character 20
Estado Character 2
Ddd Character 2
Telefone Character 8
Contato Character 20

Tabela 4
Tabela: ContasReceber
Nome do Campo Tipo Tamanho
Id_ContaReceber Character 6
ID_Cliente Character 6
TipoDocto Character 10
NumeroDocto Character 8
DataVencimento Date 8
Valor Numeric 7,2
Quitado Logic 1
DataPagto Date 8
ValorPagto Numeric 7,2
Cheque_banco Character 3
Cheque_agencia Character 7
Cheque_numconta Character 10
Cheque_numero Character 6
Cheque_titular Character 40
DataCadastro Date 8
ID_usuario Character 3

Tabela 5
Tabela: ContasPagar
Nome do Campo Tipo Tamanho
Id_ContaPagar Character 6
ID_Fornecedor Character 6
TipoDocto Character 10
NumeroDocto Character 8
DataVencimento Date 8
Valor Numeric 7,2
Quitado Logic 1
DataPagto Date 8
ValorPagto Numeric 7,2
DataCadastro Date 8
ID_usuario Character 3
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 8 de 103

Tabela 6
Tabela: Usuários
Nome do Campo Tipo Tamanho
Id_usuario Character 3
NomeUsuario Character 25
SenhaUsuario Character 8

- Representa um índice de chave primária

- representa um índice regular

Uma vez que já temos a descrição das tabelas e seus campos, agora vamos colocar a mão na
massa... ops!, na raposa.

Como você já está com o banco de dados aberto, clique sobre o botão New Table. Aparecerá
o seguinte diálogo:

Figura 6 - Diálogo New Table

Clique sobre o botão New Table. Aparecerá então o diálogo Create para que você informe o
nome da tabela a ser criada.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 9 de 103

Figura 7 - Diálogo Create

Ao clicar em Save, um novo diálogo aparecerá onde você definirá o conteúdo da tabela.
Agora é só informar as informações de cada campo.

Figura 8 - Diálogo Table Designer, definindo a estrutura da tabela.


Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 10 de 103

Observe na figura acima as informações de cada campo. Na lista da esquerda estão os campos
da tabela. No painel da direita colocamos informações adicionais para definirmos
propriedades e comportamentos em particular de cada campo.

Note na figura abaixo os dois destaques:

Figura 9 - Índices e valores nulos

Na figura acima temos dois destaques. O primeiro, na coluna Index indica que o campo será
um índice. O segundo, na coluna NULL indica que o campo poderá receber um valor vazio.

Como você observou no painel da direita, exibido na figura 8, temos algumas propriedades
relacionadas à forma como os dados serão exibidos na tela ou em relatórios. Veja a figura 10:

Figura 10 – Propriedades de exibição do campo

O significado de cada um desses campos é:

Format – define o formato da apresentação dos dados.

Input mask – define a máscara de entrada para o campo.

Caption – define o título (descrição) para o campo. Esta é a informação que aparecerá no
cabeçalho das grids, browses, labels, relatórios, etiquetas, etc. Definir este valor neste ponto
fará com que tenhamos muito menos trabalho na hora de formatar nossos formulários e
relatórios.

O painel Field Validation da figura 8, apesar de parecer interessante não terá muita utilidade
quando estivermos criando nossas aplicações. Na maioria das vezes esse tipo de validação
estará em nossos formulários e não diretamente no banco de dados.

O painel Map field type do class permite que façamos um mapeamento para o tipo de
controle que será usado para a entrada dos dados, por exemplo, Combo, Checkbox, Textbox,
etc. Na maioria das vezes não faremos esse mapeamento diretamente no banco de dados.

TIPOS DE FORMATOS PARA A PROPRIEDADE FORMAT

Tabela 7
Configuração Descrição

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 11 de 103

K Seleciona todo o texto quando um controle recebe o foco.


$ Exibe símbolo de moeda.
^ Exibe dados numéricos usando notação científica.
L Em campos numéricos exibem zeros à esquerda.
R Exibe o formato da mascara para o conteúdo do campo, conforme
máscara informada em Input mask, porém, só armazena no campo os
dígitos ou letras.
Z Exibe um campo número em braço, caso seu valor seja zero.
! Converte caracteres alfabéticos para maiúsculo.
A Permite apenas caracteres alfabéticos
D Usa o formato especificado com o comando SET DATE para datas.
E Edita valores Data em formato britânico (British).
T Remove conteúdo em branco antes e depois do texto.
YS Exibe valores Data conforme o formato curto configurado no painel de
controle do Windows.
YL Exibe valores Data conforme o formato longo configurado no painel de
controle do Windows.

A propriedade Format tem o mesmo significado da cláusula FUNCTION para os comandos


@... GET e @ ... EDIT, agora suportados apenas para compatibilidade com versões
anteriores.

DEFININDO OS ÍNDICES PARA UMA TABELA

Uma vez que definimos os campos da tabela e já marcamos quais campos gostaríamos que
fossem índice, precisamos agora refinar esses índices acrescentando alguma informação ou
simplesmente escolhendo o tipo de índice apropriado.

O tipos de índice são:

Primary – Índice primário ou chave primária, conforme o gosto do freguês. Este tipo de
índice não aceita valor duplicado. Ideal para campos identificadores, CNPJ, CPF, ou qualquer
outro que requer um valor único em toda a tabela.

Cadidate – É um índice semelhante à chave primária. Este tipo de índice substitui o tipo
UNIQUE de versões anteriores do FoxPro e também do dBase e Clipper. Uma chave do tipo
Cadidate não aceita valores duplicados, por isso é uma chave candidata a chave primária.

Regular – É o tipo de índice comum, usado apenas para indexar uma tabela por uma
determinada chave. No Visual FoxPro as chaves estrangeiras são índices do tipo regular.

Para refinar a definição de nossos índices vamos clicar na aba Indexes e teremos o seguinte
diálogo:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 12 de 103

Figura 11 – Definindo índices

Temos as seguintes colunas:

- serve para movermos a posição do índice.

Order – serve para definirmos de o índice será ascendente ( ) ou descendente ( ).

Name – é o nome que daremos para a marca (TAG) de índice da tabela. São permitidos até
10 caracteres.

Type – define o tipo do índice: Primary, Candidate, Regular.

Expression – define o campo que será usado na marca de índice. Chaves compostas podem
ser criadas. Para tal, basta concatenarmos a expressão colocando ali os campos que
desejamos. Funções nativas do VFP ou definidas pelo usuário também podem ser utilizadas
nas expressões de índice.

Filter – permite criarmos filtros para nossos índices. Algumas vezes é interessante criar
índices com filtro, por exemplo um filtro sem os registros apagados.

Collate – permite definir a página de código para o índice. Esta opção é muito útil quando do
desenvolvimento de aplicações internacionais que usam idiomas diferentes. Esta opção está
disponível somente a partir da versão 8 do VFP. Em versões anteriores consegue-se um
resultado semelhante através do comando SET COLLATE.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 13 de 103

Para os desenvolvedores vindos do Clipper e outras linguagens, uma pequena


orientação: O FoxPro e Visual FoxPro utiliza índices compostos, ou seja, todos os
índices são armazenados em um único arquivo físico (.cdx) ao contrário do Clipper que para
cada índice seria gerado um arquivo .ntx. Essa característica é muito interessante pois
elimina a necessidade constante de reindexação. Uma aplicação bem projetada em FoxPro
raramente precisará de reindexação, a menos que seja por algum problema ocasionado por
hardware, como corrupção de índices.

Agora crie as demais tabelas, baseando-se nas informações de cada tabela.

Agora que nossas tabelas estão criadas, vamos definir os relacionamentos permanentes. Este
talvez seja um conceito novo para quem vem de outras linguagens. Mas é bastante
interessante e com esse tipo de relacionamento temos muito a ganhar. Por exemplo, o
relacionamento definido entre uma tabela de clientes com a tabela de contas a receber será
feito de forma automática quando adicionarmos tais tabelas ao nosso formulário. Não apenas
isso, mas regras de integridade podem ser definidas a partir do relacionamento.

Vamos então modificar a estrutura do nosso banco de dados para criar os relacionamentos e a
integridade referencial. Com o projeto aberto, clique na aba Data, e então clique sobre o
banco de dados cpedras. Agora clique no botão Modify.

As tabelas podem aparecer meio sobrepostas. Clique no menu Database e depois em


Arrange..., e então clique Ok.

Figura 12 – Diálogo Arrage Tables e Views.

Você deverá obter algo parecido com o apresentado na figura 13 a seguir.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 14 de 103

Figura 13 – Banco de dados depois do comando arrange...

Na figura acima fiz questão de destacar o índice id_usuario. Note que agora as tabelas
possuem os campos listados na primeira parte e logo abaixo da lista de campos vem os
índices. O campo de chave primária terá uma ao lado esquerdo da marca de índice.

Definindo relacionamentos

Agora vamos definir os relacionamentos entre as tabelas. Este procedimento é muito simples.
Basta você arrastar o índice da tabela pai (lado um) do relacionamento para o índice da tabela
filho (lado muitos). Por exemplo, arrastar o índice id_cliente para cima do índice.

Defina então os seguintes relacionamentos:

Tabela 8
Tabela Pai Tabela Filha
Clientes->id_cliente ContaReceber->id_cliente
Fornecedores->id_fornece ContaPagar->id_fornece
Usuarios->id_usuario ContaReceber->id_usuario
Usuarios->id_usuario ContaPagar->id_usuario

Após definidos os relacionamentos, teremos a seguinte aparência no banco de dados. Neste


caso, reposicionei as tabelas para dar destaque às linhas ligando as tabelas:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 15 de 103

Figura 14 – Tabelas relacionadas

Os relacionamentos do tipo um para muitos são os mais comuns e mais fáceis de serem
definidos, como é o caso que fizemos aqui. Note que o lado um do relacionamento há uma
notação parecida com um sinal de mais ( + ) e do lado muitos há uma espécie de gancho com
três pontas.

Para definir um relacionamento do tipo um para um através da Database Designer, é


necessário que ambos os índices sejam do tipo chave primária.

É muito importante saber como editar o relacionamento entre as tabelas, pois pode ser que
por falta de atenção arrastemos um índice para outro que não seja o seu correspondente
causando assim uma falha de relacionamento. Nenhum erro ocorrerá mas muito
provavelmente o resultado não será o esperado.

Editando um relacionamento

Para editar um relacionamento, basta clicar sobre a linha de relacionamento entre as tabelas
com o botão direito e escolher Edit Relationship... Aparecerá um diálogo como o apresentado
a seguir na figura 15.

Figura 15 – Editando relacionamento


Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 16 de 103

Observe de acordo com a figura 15 que o lado esquerdo representa a tabela a qual o
relacionamento inicia-se e o lado direito é a tabela à qual ela se relaciona. A informação
Relationship type exibe se o relacionamento é do tipo um para muitos (One To Many) ou um
para um (One To One). Note também que há um botão Referential Integrity. Através deste
botão podemos definir a integridade referencial entre as duas tabelas.

Para gerar integridade referencial, é necessário abrir o banco de dados em modo exclusivo.
Muito provavelmente seu banco já estará aberto em modo exclusivo, mas caso receba uma
mensagem como esta:

Você deverá fechar o seu banco de dados e então abri-lo em modo exclusivo. Em nosso caso,
basta digitar o seguinte na janela de comandos:

CLOSE ALL ALL


OPEN DATABASE cpedras.dbc EXCLUSIVE
MODIFY DATABASE cpedras.dbc

Definindo a integridade referencial entre as tabelas

Como vimos na figura 15, é possível definir a integridade referencial a partir do diálogo de
edição do relacionamento. Mas essa não é a única forma. Temos ainda as opções de acessar
através do menu Database ou do menu de contexto clicando com o botão direito sobre a linha
do relacionamento e escolhendo Edit Referential Integrity.

Vamos então clicar com o botão direito sobre o relacionamento entre a tabela de clientes e a
tabela ContasReceber e escolher Edit Referential Integrity. Aparecerá um diálogo
semelhante ao seguinte:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 17 de 103

Figura 17 – Selecionar Builder

Este diálogo aparece a fim de selecionarmos o Builder (criador) que será usado para definir a
integridade referencial. O Builder padrão do VFP para esssa tarefa é o Referential Integrity
Builder. Após selecionar, clique em OK.

Agora temos o Builder aberto. Clique sobre a aba Rules for Deleting (Regras para apagar).

Figura 18 – definindo integridade referencial.

Em nosso caso vamos criar regras (rules) apenas para ações de apagar (delete). Faremos isso
para garantir que quando um registro de uma tabela pai for apagado, os registros da tabela
filha não fiquem órfãos.

As opções são:

Cascade: apaga todos os registros relacionados na tabela filha.


Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 18 de 103

Restrict: proíbe de apagar se houver registros relacionados na tabela filha.

Ignore: permite apagar e mantém intactos os registros relacionados na tabela filha.

Do ponto de vista funcional, a melhor das opções é a Restrict, uma vez que não permitirá
apagar um cliente caso esse possua algum lançamento de conta a receber.

Caso você ainda não tenha feito, defina as regras conforme mostra a figura 18 e depois clique
em OK. Aparecerá o seguinte diálogo:

Figura 19 – Escolher fazer ou não cópia das Stored Procedures existentes.

Escolha Yes. Caso você venha a modificar alguma Stored Procedure gerada automaticamente
pelo VFP, se você refizer a integridade através do Builder você perderá as modificações. Por
isso a opção de fazer a cópia antes.

Aparecerá o diálogo a seguir, informando que houve modificação no banco de dados e


pergunta se você quer recarregá-lo. Informe Yes.

Agora vamos dar uma olhada no código gerado:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 19 de 103

Figura 21 – Stored Procedures da integridade referencial

Nunca remova as linhas de comentários antes e depois do código de integridade referencial.

Algumas definições:

Para garantir essa funcionalidade de forma automática, o VFP irá criar triggers, ou seja,
disparadoras automáticos para a ação de excluir das tabelas clientes e fornecedores, apagando
os registros de ContasReceber e ContasPagar, respectivamente.

Um trigger (disparador) é uma expressão ligada a uma tabela e que é invocado sempre que há
algum tipo de modificação na mesma. Podemos associar expressões trigger’s para incluir,
modificar e apagar registros.

Trigger’s podem ser criados para as mais diversas funções, por exemplo, criar índices,
selecionar determinados registros, fazer lançamentos ou processamentos em tabelas, e assim
por diante. O código escrito para um trigger é armazenado como stored procedure
(procedimentos armazenados) no banco de dados.

Uma Stored Procedure é um procedimento ou função, porém este estará armazenado no


próprio banco de dados e sua utilização será sempre para manipular ou retornar algum dado.

CRIANDO UMA STORED PROCEDURE PARA AUTO-INCREMENTO

Embora o Visual FoxPro 8.0 já tenha de forma nativa um campo de auto-incremento, vamos
criar nossa própria rotina de auto-incremento através de uma stored procedure. Basta
adicionar o seguinte código às stored procedures:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 20 de 103

Figura 22 – Código da Stored Procedure GeraCodigo()

Essa Stored Procedures é capaz de gerar código seqüencial para qualquer tabela do banco de
dados, desde que sejam seguidas as seguintes regras:

• O campo seqüencial seja sempre o primeiro campo da tabela.


• O campo seqüencial seja sempre do tipo caractere.

É claro que para gerar código seqüencial para campos do tipo numérico ou inteiro basta
alterar a função. Fica a gosto do freguês.

Uma vez que a função já está inclusa no banco, juntamente com as Stored Procedures, vamos
alterar a estrutura das nossas tabelas e adicionar a função ao valor inicial do campo
seqüencial. Para isso, modifique o banco de dados e clique sobre o nome da tabela que quer
alterar. Vamos começar pela tabela de clientes. Clique sobre o botão Modify após selecionar
a tabela.

Selecione o campo id_cliente e faça a modificação conforme destaque na próxima figura e


depois clique em OK.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 21 de 103

Figura 23 – definindo função de auto-incremento ao valor padrão do campo

Agora repita a mesma operação para as outras quatro tabelas. Lembre-se apenas sobre o
campo ID da própria tabela.

Humm... já estava me esquecendo... muito provavelmente você deve estar curioso pra saber
onde é que vai a chamada ao código do trigger para apagar os registros. Muito bem,
modifique a tabela de clientes e vá à aba Table e veja, conforme figura 24:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 22 de 103

Figura 24 – Trigger apagar clientes.

Muito bem, a parte de banco de dados está finalmente pronta! Agora partiremos para
conhecer os formuários.

TRABALHANDO COM FORMULÁRIOS

Os formulários são considerados a principal forma de interagir com o usuário da aplicação.


São através deles que os usuários inserem dados, escolhem opções, e realizam tudo que
precisam no sistema. Há outras formas de interação como os menus, relatórios, etc.

Como quase tudo no Visual FoxPro, existe mais de uma forma de programar os formulários.
Os mesmos podem ser criados a partir da Form Designer ou programados diretamente através
de PRG’s. Com certeza a primeira opção será mais produtiva uma vez que tudo pode ser feito
de forma visual, enquanto que a segunda precisa de ser codificada na munheca. ☺

Como nosso objetivo é produzir mais em menos tempo, vamos partir para a Form Designer.

A ferramenta Gerenciador de Projetos possui uma aba dedicada aos documentos que são
Formulários, Relatórios e Etiquetas.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 23 de 103

Figura 25 – Aba Documents do gerenciador de projetos

Vamos criar um formulário e estudarmos os seus principais elementos. Estando na aba


Documents, clique em Forms e depois em New... Aparecerá o seguinte diálogo:

Figura 26 – Diálogo New Form

No diálogo acima, escolha New Form. A Form Designer será aberta, conforme mostra a
próxima figura.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 24 de 103

Figura 27 – Ferramenta Form Designer

A Form Designer é praticamente a ferramenta mais complicada de se entender no Visual


FoxPro. Uma vez que você a domine, achará as demais ferramentas fáceis de serem usadas.

Na figura 27 temos a área de desenho do formulário onde iremos inserir todos os controles.
Temos também a barra de ferramentas Form Controls. Essa barra de ferramentas disponibiliza
ao desenvolvedor todos os controles possíveis de se inserir em um formulário. São os
controles básicos do Visual FoxPro. Como podemos personalizar (subclassificar) cada um
desses controles e criar os nossos próprios, temos ainda a opção de anexar nossas bibliotecas
de controles para serem exibidas na barra de ferramentas Form Controls.

Assim que a Form Designer é aberta um novo menu chamado Form é adicionado à barra de
menus. Esse menu serve para disparar algumas opções relacionadas ao formulário. Veja a
figura 28:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 25 de 103

Figura 28 – Menu Form

À medida que formos precisando, exploraremos estas opções.

Temos ainda um componente muito importante. Na verdade tão importante quanto a Form
Designer. É a janela de propriedades, a qual utilizamos para configurar desde o formulário até
as mais diversas características de cada controle nele incluso. Veja a figura 29:

Figura 29 – Janela de Propriedades

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 26 de 103

Através da janela de propriedades podemos configurar as Propriedades, Eventos e Métodos


(PEM’s) dos formulários e de qualquer outro Objeto visual que estiver contido no formulário,
relatório e até mesmo da janela principal do Visual FoxPro (_Screen).

Há cinco abas nessa janela: All, Data, Methods, Layout e Other. Vejamos para que servem:

All – exibe a lista completa de todos as PEM’s.

Data – exibe as propriedades relacionadas a dados.

Methods – exibe todos os métodos e eventos do controle selecionado.

Layout – exibe todas as propriedades relacionada com o formato de exibição do objeto


selecionado.

Other – exibe outras propriedades adicionais.

Algumas coisas que você deve saber

1. Para editar uma propriedade, evento ou método a partir da janela de propriedades


basta clicar sobre a propriedade e depois editar o valor na caixa de edição, conforme
figura 30. No caso do evento ou método, você deve clicar duplo.

Figura 30 – Caixa de edição de propriedade

2. Quando você altera uma propriedade, o valor alterado aparecerá em negrito na janela
de propriedades facilitando a identificação.

3. Os valores que aparecem no formato itálico são valores somente leitura (ready only),
ou seja, não podem ser editados.

Além dos componentes já apresentados temos um outro que também é muito importante.
Trata-se do Ambiente de Dados (Data Environment). O ambiente de dados é responsável por
gerenciar a abertura e fechamento das tabelas do banco de dados, além de oferecer recursos
de Buffer (proteção). É claro que não é obrigatória a utilização do ambiente de dados. Mas já
que é um recurso que está disponível e funciona muito bem, porque não utilizá-lo?

Através do ambiente de dados (Data Environment) podemos adicionar tabelas do banco de


dados, tabelas soltas (free tables) ou ainda views (visões).

As tabelas que serão apresentadas ou manipuladas neste ambiente podem ser operadas desde
os mais clássicos comandos do mundo xBase como APPEND BLANK, REPLACE, até
comandos SQL como INSERT SQL, UPDATE SQL, DELETE SQL, SELECT SQL, etc.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 27 de 103

Em nosso primeiro formulário vamos procurar usar a maioria das ferramentas aqui
apresentadas, de forma que as conheçamos na prática.

Com o formulário que criamos agora há pouco, vamos configurar algumas propriedades para
melhor adequá-lo à realidade de nosso software. Vamos criar um formulário para
cadastro/manutenção de usuários do sistema.

Vamos fazer as seguintes configurações:

1. Com o formulário aberto, clique sobre o mesmo e depois clique sobre a aba Layout da
janela de propriedades.

2. Localize a propriedade Caption e clique sobre a mesma e então digite Cadastro de


Usuários. Ao pressionar ENTER, o título do formulário será mudado de Form1 para o
aqui informado.

3. Mude a propriedade AutoCenter para .T. (True). Isto fará com que a janela seja
centralizada automaticamente ao ser aberta.

4. Ajuste a propriedade ShowTips para .T. (True).

5. Agora mude para a aba Data da janela de propriedades, localize a propriedade


BufferMode e altere-a para 2 – Optmistic. Isso definirá o tipo de bloqueio empregado
na hora de realizar as alterações no banco de dados para otimista, ou seja, só tentará o
bloqueio quando for efetivar a gravação através da função TABLEUPDATE().

6. Nesta aba, altere ainda a propriedade DataSession para 2 – Private Data Session. Isso
garantirá que cada instância desse formulário terá uma sessão de dados separada. É
importante saber que quando um formulário usa uma sessão de dados privada, todos
os comandos SET para configuração de ambiente devem ser configurados dentro do
próprio formulário. É claro que isso parece trabalhoso à medida que nossos
formulários vão aumentando, mas graças às técnicas de Programação Orientada a
Objetos (OOP) tudo isso é muito fácil.

Vinculando os dados e inserindo os campos

Em nosso aplicativo, vamos utilizar o ambiente de dados (data environment) para controlar a
manipulação dos dados em nossos formulários. Para tal, precisamos adicionar ao ambiente de
dados a tabela que iremos utilizar:

1. Clique sobre a área do formulário com o botão direito do mouse e escolha Data
Envivonment...

2. No diálogo Add Table ou View, escolha a tabela de usuários e depois clique sobre o
botão Add, conforme figura 31, depois clique em Close.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 28 de 103

Figura 31 – Diálogo Add Table or View

3. Agora aparece o ambiente de dados, conforme figura 32:

Figura 32 – Data Environment (ambiente de dados)

4. Agora selecione os campos da tabela usuarios. Você pode segurar a tecla SHIFT
enquanto sobre os campos. Uma vez selecionados, clique com o botão direito do
mouse e arraste-os para a área de design do formulário, conforme mostra a figura 33.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 29 de 103

Figura 33 – Arrastando os campos para a área de design do formulário

5. Assim que você soltar o botão do mouse aparecerá um menu com três opções,
conforme a figura 33. Escolha Create Multiple Controls Here. Os controles serão
criados, conforme mostra a próxima figura:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 30 de 103

Figura 34 – Controles inseridos no formulário

Agora que os controles estão inseridos no formulário, podemos começar a programar


nosso formulário. Antes porém, gostaria de chamar sua atenção para as propriedades que
foram definidas para cada controle TextBox. Para tal, feche a janela Data Environment e
em seguida clique numa área do formulário onde não contém nada para desfazer a seleção
dos objetos.

Verificando as propriedades de um controle

1. Clique sobre o controle que deseja verificar as propriedades. No nosso caso, clique
sobre o controle do tipo TextBox para entrada do ID do usuário. O nome do controle é
txtId_usuario e ganhou esse nome automaticamente ao arrastarmos o controle para o
formulário. Por padrão o Visual FoxPro adiciona um prefixo de três letras a cada
controle que você arrastar, identificando o tipo de campo. Essa é uma prática que é
bom seguirmos para termos padronização e também para sabermos identificar
facilmente o tipo de controle que está sendo utilizado.

2. Se a janela de propriedades estiver aberta, apenas clique nela e vá para a bada Data.
Caso contrário, clique com o botão direito sobre o objeto txtId_usuario e escolha
Properties. Vá então para a aba Data conforme dito anteriormente.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 31 de 103

Figura 35 – Propriedades do controle txtId_usuario

3. Note que a propriedade ControlSource foi preenchida com o valor


usuários.id_usuario. Isto significa que a fonte de dados para este control será o
campo id_usuario da tabela usuários.

4. Aproveite e verifique os demais controles.

TABELA DE PREFIXOS SUGERIDOS

Embora os prefixos não sejam requeridos, utilizá-los tornará nosso código bem mais
profissional e fácil de ser entendido. A seguir está uma lista dos prefixos sugeridos pela
Microsoft:

Tabela 9
Prefixo Tipo de Objeto Exemplo
Chk CheckBox chkReadOnly
Col Collection colFormObjects
Cbo ComboBox cboEnglish
Cmd CommandButton cmdCancel
Cmg CommandGroup cmgChoices
Cnt Container cntMoverList
Ctl Control ctlFileList
Cad CursorAdapter cadInventory
<user- Custom user-defined

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 32 de 103

defined>
Dte DataEnvironment dteSalesForm
Edt EditBox edtTextArea
Frm Form frmFileOpen
Frs FormSet frsDataEntry
Grd Grid grdPrices
Grc Column grcCurrentPrice
Grh Header grhTotalInventory
Hpl HyperLink hplHomeURL
Img Image imgIcon
Lbl Label lblHelpMessage
Lin Line linVertical
Lst ListBox lstPolicyCodes
Olb OLEBoundControl olbObject1
Ole OLE oleObject1
Opt OptionButton optFrench
Opg OptionGroup opgType
Pag Page pagDataUpdate
Pgf PageFrame pgfLeft
Prj ProjectHook prjBuildAll
Sep Separator sepToolSection1
Shp Shape shpCircle
Spn Spinner spnValues
Txt TextBox txtGetText
Tmr Timer tmrAlarm
Tbr ToolBar tbrEditReport
Xad XMLAdapter xadRemoteXMLData
Xfd XMLField xfdPrices
Xtb XMLTable xtbInventory

Nosso formulário de Cadastro de Usuários deverá ficar com a aparência exibida na figura 36.
Os botões de comando para todos os demais formulários de cadastro serão os mesmos. Por
isso é bom planejarmos para que o código seja 100% reutilizável. Dessa forma estaremos
aplicando bem os conceitos da OOP.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 33 de 103

Figura 36 – Janela de Cadastro de Usuários

Nosso formulário terá os seguintes métodos e propriedades personalizados:

Tabela 10 - MÉTODOS
MÉTODO OBJETIVO
BloquearRegistro() Bloqueia o registro para operações de alteração e
remoção (delete).
CoordenaBotoes() Coordena o estado dos botões do formulário de acordo
com cada operação.
CoordenaControles() Coordena o estado dos controles de edição dos dados,
tornando-os editáveis ou não editáveis.
CoordenaNavegacao() Coordena o estado dos botões de navegação do
formulário.
CriticarDados() Reservado para a escrita de código para validação dos
dados do formulário.
PosicionarPrimeiroCampo() Executa o comando armazenado na propriedade
PrimeiroCampoFoco. É usado para posicionar o cursor no
campo que será o primeiro foco em operações de adição e
edição de registros.
TratarErro() Faz o tratamento de erros do formulário.

Tabela 11 - PROPRIEDADES
PROPRIEDADE OBJETIVO
PrimeiroCampoFoco Nesta propriedade será colocado o comando responsável
pelo posicionamento do foco no primeiro campo editável.

Além dos métodos já apresentados, ainda iremos programar o evento Init do formulário a fim
de definirmos as configurações iniciais do formulário. Sim, eu disse programar o evento Init.
O fato é que um evento também pode ser programado como um método. Ou seja, podemos
determinar código para ser executado quando um evento ocorre. Assim o código programado
no evento Init logo será o método Init. Pra descomplicar um pouco, apenas tenha em mente
que o evento em si não faz nada. Ele apenas ocorre e pronto. Aí, para facilitar nossa vida
podemos escrever códigos quando eles ocorrem. Ao código escrito ali no evento,
denominamos método.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 34 de 103

Antes de prosseguirmos é bom que conhecermos a ordem de ocorrência dos principais


eventos de um formulário do Visual FoxPro a fim de que quando precisarmos codificá-los
não venhamos cometer alguns enganos.

Tabela 12 - ORDEM DE OCORRÊNCIA DOS PRINCIPAIS EVENTOS NUM


FORMULÁRIO
EVENTO DESCRIÇÃO
Load Ocorre antes do objeto form (ou outro qualquer) ser
criado. Caso queira evitar a criação condicional de um
form, use um RETURN .F. a patir do evento Load e o
objeto não será criado.
Init Ocorre quando o objeto é criado. Cada objeto ou controle
incluso no formulário também possui um evento init.
Todos os eventos Init’s de cada controle incluído no
formulário ocorrem antes do Init do formulário, ou seja,
todos os init’s dos objetos contidos ocorrem antes do
evento Init do container (formulário, recipiente).
Você pode usar o evento init para fazer configurações no
formulário ou nos demais controles deste.
Show Apesar deste não ser classificado como um evento
propriamente dito, é o terceiro a ocorrer quando da
ativação normal de um formulário. É usado para mostrar
o formulário e ainda para configurar a forma como o
mesmo será exibido.
Activate Ocorre no momento que o formulário é exibido e torna-se
ativo.
GotFocus Quando da ativação de um formulário, o primeiro objeto
da lista que estiver inserido no formulário receberá o
foco. Este evento ocorre exatamente no momento em que
o primeiro objeto recebe o foco.
Ocorre também a partir daí sempre que um objeto recebe
o foco dentro do formulário.

É importante saber que diversos outros tipos de objetos também possuem Propriedades,
Eventos e Métodos (PEM’s) de mesmo nome. Apesar de terem PEM’s de mesmo nome, a
execução desses PEM’s em um objeto não interfere na execução dos PEM’s de outro objeto.
A esta característica damos o nome de ENCAPSULAÇÃO.

Agora que já estamos conhecendo a ordem de ocorrência dos eventos quando da execução de
um formulário já podemos ter idéia de onde adicionar o código. Existem diversos outros
eventos que ocorrem quando um formulário está sendo executado, mas à medida que formos
precisando deles passaremos a conhecê-los em mais detalhes.

ADICIONANDO BOTÕES DE AÇÃO AO FORMULÁRIO

Os botões de ação ou botões de comando são usados para disparar ações a serem executadas.
O Windows está cheio deles. No Visual FoxPro não é diferente. Quando estamos
programando um formulário para inserção e manutenção de dados numa tabela poderemos ter
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 35 de 103

vários botões com ações como essas: Novo, Gravar, Editar, Desfazer, Excluir, Primeiro,
Anterior, Próximo, Último e assim por diante, conforme a necessidade do projeto. Cada ação
requer a especificação de código para executar a tarefa a qual o botão se propõe.

Nessa etapa do nosso estudo, vamos lidar com os botões de ação para começarmos a dar vida
aos nossos formulários. De nada adianta termos belas interfaces, se essas não puderem
realizar o trabalho esperado sobre os dados.

O Visual FoxPro possui algumas classes prontas chamadas Foundation Classes ou


simplesmente FFC. Algumas dessas classes são interessantes e funcionam bem. Inclusive há
classes prontas para a maioria das ações que citei anteriormente. Entretanto, como o objetivo
deste texto é conduzi-lo ao aprendizado programático, mostrando como fazer, vamos
desenvolver nosso próprio código. Assim você terá a oportunidade de aumentar seus
conhecimentos.

Adicionar um botão ao formulário é tarefa simples. Basta clicar sobre Command Button na
barra de ferramenta Form Controls e em seguida posicionar o cursor no local onde deseja
adicionar o botão ao formulário e clicar.

A seguir está a descrição dos objetos Buttons que teremos em nosso formulário e quais
propriedades e métodos devemos alterar ou escrever.

BOTÕES A SEREM INSERIDOS NO FORMULÁRIO

Tabela 13
BOTÃO: Novo
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Novo
Name bntNovo
Picture imagens\new.bmp
Height 27
Left 3
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 14
BOTÃO: Gravar
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Gravar
Name bntGravar
Picture imagens\save.bmp
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 36 de 103

Height 27
Left 80
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 15
BOTÃO: Editar
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Editar
Name bntEditar
Picture Imagens\wzedit.bmp
Height 27
Left 157
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 16
BOTÃO: Desfazer
PROPRIEDADE VALOR A ATRIBUIR
Caption \<Desfazer
Name bntDesfazer
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 37 de 103

Picture imagens\wzundo.bmp
Height 27
Left 234
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 17
BOTÃO: Excluir
PROPRIEDADE VALOR A ATRIBUIR
Caption E\<xcluir
Name bntExcluir
Picture imagens\wzundo.bmp
Height 27
Left 311
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 38 de 103

Click Event

Tabela 18
BOTÃO: Primeiro Registro
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntPrimeiro
Picture imagens\wztop.bmp
Height 27
Left 390
PicturePosition 1
Top 179
ToolTip Text Primeiro Registro
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 19
BOTÃO: Registro Anterior
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntAnterior
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 39 de 103

Picture imagens\wzback.bmp
Height 27
Left 416
PicturePosition 1
Top 179
ToolTip Text Registro Anterior
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 20
BOTÃO: Próximo Registro
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntProximo
Picture imagens\wznext.bmp
Height 27
Left 442
PicturePosition 1
Top 179
ToolTip Text Próximo Registro
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 21
BOTÃO: Último Registro
PROPRIEDADE VALOR A ATRIBUIR
Caption
Name bntUltimo
Picture imagens\wzend.bmp
Height 27
Left 468
PicturePosition 1
Top 179
ToolTip Text Último Registro
Width 26
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Tabela 22
BOTÃO: Fechar
PROPRIEDADE VALOR A ATRIBUIR
Caption Fecha\<r
Name bntFechar
Picture imagens\wzclose.bmp
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 40 de 103

Height 27
Left 496
PicturePosition 1
Top 179
Width 78
EVENTO/MÉTODO CÓDIGO A EXECUTAR
Click Event

Talvez você esteja pensando muitas coisas nesse momento, mas com certeza uma delas deve
ser: Como faço para atribuir essas configurações e escrever o código de cada evento/método?

Pois bem, vamos lá!

Primeiro você deve clicar sobre o objeto que deseja atribuir as propriedades ou o código.
Depois clique com o botão direito e escolha Properties. Para seguir uma seqüência lógica,
comece pelo botão Novo. Após clicar em Properties, você terá a janela de propriedades
aberta, como mostra a figura 37:

Figura 37 – Propriedades do botão novo.

Agora é só definir o valor de cada propriedade conforme indica a tabela 13.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 41 de 103

O código do evento Click, conforme tabela 13 deve ser digitado no evento clique do botão
Novo. Para isso você deve acessa a aba Methods e localizar o Click Event, dê dois cliques
sobre o mesmo e abrirá o editor de programas para você digitar o código:

Figura 38 – Editor de Programas, editando evento Click do botão

Agora defina todas as propriedades para os botões e também o código do evento Click
conforme ilustra as tabelas de número 13 a 22.

Além do código do evento Click de cada botão, nosso formulário ainda contém código nos
métodos relacionados na tabela 10. A seguir estão relacionados os métodos e os seus
respectivos códigos.

Tabela 23
MÉTODO CÓDIGO DO MÉTODO

BloquearRegistro

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 42 de 103

CoordenaBotoes()

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 43 de 103

CoordenaControles()

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 44 de 103

CoordenaNavegacao()

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 45 de 103

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 46 de 103

CriticarDados()

PosicionarPrimeiroCampo()

TratarErro() O código a seguir é o código básico para tratamento de erros do


nosso formulário.
*!* Walfrans, essa vai em sua homenagem :)
*TratarErro
* Gerencia os erros de Integridade Referencial
* (IR), emite mensagem
* e focaliza o campo responsável pelo erro.

* Códigos dos erros de IR


* 1884 - Unicidade
* 1539 - Falha no disparador

=AERROR(dados)
*-- A função AERROR( ) cria uma matriz,
* retornando o número de linhas da matriz.
* Número do elemento Descrição
* 1 Numérico. Contém o número do erro.
* Idêntico ao valor retornado por ERROR( ).
* 2 Caractere. O texto da mensagem de erro.
* Idêntico ao valor retornado por MESSAGE( ).
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 47 de 103

* 3 O valor nulo. No entanto, se o erro possuir


* um parâmetro de erro adicional, irá
* conter o texto do parâmetro de erro.
* Idêntico ao valor retornado por SYS(2018).
* 4 O valor nulo, ou, quando apropriado,
* contém o número da área de trabalho
* em que o erro ocorreu.
* 5 O valor nulo, ou, SE UM DISPARADOR FALHAR,
* (erro 1539), irá conter um dos
* valores numéricos abaixo:
* 1 - Erro no Disparador de inserção.
* 2 - Erro no Disparador de atualização.
* 3 - Erro no Disparador de exclusão.
* 6 O valor nulo.
* 7 O valor nulo.

EXTERNAL ARRAY GAERRORS


* Matriz publica que é criada pelo Fox
* na Integridade Referecial.
* Contém mais informações do que AERROR().
* Não está documentada no Help.
* Os elementos não listados são
* iguais aos de AERROR.
* Número do elemento Descrição
* 2 (c) Mensagem de erro com o gatilho que falhou.
* Idêntico ao valor retornado por MESSAGE( ).
* 5 DBF Pai (c) Na Integridade Referencial (IR), a
* tabela Pai é a que sofre a ação (tabela de destino)
* 6 Rec Pai (n)
* 7 Id Pai (c)
* 8 Expr Pai (c)
* 9 DBF Filho (c), tabela origem da relação.
* 10 Rec Filho (n)
* 11 Id Filho (c)
* 12 Expr Filho (c) Se ocorrer falha de disparador
* na IR, será este o campo com problema

DO CASE

CASE dados(1) = 1884 && Unicidade violada

MESSAGEBOX("A chave do índice foi violada.",0+16,"Erro")


RETURN

CASE dados(1) = 1585 OR dados(1) = 1494


* Erro 1585 “Registro modificado por outro usuário” ou
* Erro 1494 “Conflito de atualização.
IF dados(1) = 1585
cMsgErro = "Registro modificado por outro usuário"
ELSE
cMsgErro = "Registro modificado por outro usuário"
ENDIF
*-- Caixa de Mensagem "Interrogação"
* botões "Ok / Cancelar"
* default "1º Botão"
LOCAL lnNrBotao
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 48 de 103

lnNrBotao = MESSAGEBOX( ;
cMsgErro + CHR(13)+CHR(13)+[Pressione: ]+CHR(13);
+[ OK para forçar a gravação;]+CHR(13);
+[ Cancelar para desfazer.]+CHR(13)+[], ;
32+1+0, ;
[Erro atualizando o banco de dados])

*-- testa a resposta do usuário


IF lnNrBotao = 1 && OK
IF TABLEUPDATE(0,.T.)
Thisform.CoordenaBotoes("PADRAO")
RETURN
ELSE
*-- Caixa de Mensagem "Exclamação"
* botões "Ok"
* default "1º Botão"
= MESSAGEBOX( ;
[Não foi possivel gravar as alterações!!!];
+CHR(13)+CHR(13);
+[A operação será cancelada.], ;
48+0+0, ;
[Erro atualizando o banco de dados])
ENDIF
ENDIF
*-- executa esta parte se o TABLEUPDATE
*-- acima não retornou .T. ou
*-- se o operador apertou o botão Cancelar (lnNrBotão = 2)
TABLEREVERT()

Thisform.CoordenaBotoes("PADRAO")

RETURN

OTHERWISE
*-- Caixa de Mensagem "Exclamação"
* botões "Ok"
* default "1º Botão"
= MESSAGEBOX( ;
[Erro número: ] + alltrim(str(dados(1)));
+CHR(13)+CHR(13);
+dados(2)+CHR(13)+CHR(13);
+[O programa será cancelado!];
+CHR(13)+[], ;
48+0+0, ;
[Erro inesperado])
ON ERROR
ON SHUTDOWN
*-- Cancela a execução
CANCEL
*-- Termina o ciclo de eventos
CLEAR EVENTS

ENDCASE

EVENTO CÓDIGO DO EVENTO

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 49 de 103

Init

Agora a tabela 24 traz a lista de valores a serem configurados para propriedades do


formulário.

Tabela 24 – ATRIBUIÇÃO DE VALOR A PROPRIEDADE


PROPRIEDADE VALOR A ATRIBUIR
PrimeiroCampoFoco Thisform.txtNomeUsuario.SetFocus()

Apesar de todo o código fonte disponível para os métodos do formulário já estarem


disponíveis nas tabelas acima, você ainda nem aprendeu como inserir os métodos no
formulário. Façamos isso nesse momento.

INSERINDO NOVOS MÉTODOS E PROPRIEDADES AO FORMULÁRIO

Anteriormente, ainda no início do assunto de formulários apresentamos a figura do menu


Form. Este menu será usado para criar os métodos e propriedades:

Figura 28 – Menu Form

1. Clique no menu Form e sem seguida em New Method...

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 50 de 103

Figura 39 – Criando um novo método

2. Em Name informe o nome do método. Não coloque os parênteses. Cloque também


uma breve descrição do que o mesmo faz em Description.

3. Clique sobre o botão Add.

Faça isso para todos os métodos que precisas criar para o formulário.

Para adicionar propriedades o procedimento é parecido.

1. Clique no menu Form e depois escolha a opção New Propertie...

Figura 40 – Criando uma nova propriedade

2. Em Name informe o nome da propriedade e também informe uma breve descrição


para o que serve a propriedade.

3. Clique em Add.

Pronto! A propriedade estará lá disponível para ser ajustada.

Agora que a propriedade está disponível, clique sobre o formulário, depois clique com o
botão direito do mouse e escolha Properties. Na janela de propriedades, escolha a aba All e vá
para o final da lista. Deve aparecer a propriedade. Informe o valor
Thisform.txtNomeUsuario.SetFocus() para a mesma.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 51 de 103

Após realizadas todas as alterações proposta acima, seu formulário deverá estar pronto. É
claro que você pode melhorar a aparência conforme seu gosto, movendo os objetos para os
locais que melhor lhe atraia e até mesmo inserindo outros objetos de interface.

Agora chegou a hora de executarmos nosso formulário para testá-lo. Quando for testar, faça-o
devagar, senão poderá se ferir. ☺

O que acho fantástico no Visual FoxPro é poder mesmo no ambiente de design ver o
resultado daquilo que estamos fazendo sem ter que compilar o projeto e gerar um executável.
Para executar o formulário basta você clicar sobre o botão . Faça isso então e verás o
resultado semelhante à figura 36. A diferença será os dados ainda não preenchidos em sua
tabela.

Figura 36 – Formulário de Cadastro de Usuários sendo executado.

Ainda há uma coisa a se fazer. Como nosso formulário possui um ambiente de dados privado,
toda a configuração externa a este não é incorporada. Por exemplos os registros apagados
poderão aparecer causando uma impressão de que o botão excluir não funciona corretamente.

Como configuração de ambiente é algo que utilizaremos em diversos locais, inclusive em


formulários, relatórios e até mesmo em PRG’s, faremos uma classe que possa ser reutilizada
quando houver necessidade.

Se estiver com o formulário aberto, feche-o.

CRIANDO UMA CLASSE PARA CONFIGURAÇÃO DE AMBIENTE

1. Com o projeto aberto, clique sobre a aba Classes.

2. Clique no botão New...

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 52 de 103

Figura 43 – Criando uma nova classe

3. No diálogo New Class, exibido na figura 42, informe SetagemAmbiente como Class
Name, Based On como Custom e Sore In, informe ambiente.vcx. O arquivo
ambiente.vcx passará a ser a biblioteca de classes para classes de ambiente em nosso
projeto. Click em OK.

4. Aparecerá a janela do Class Designer conforme mostra a figura 43.

Figura 43 – Class Designer editando SetagemAmbiente

5. Dê dois cliques sobre a classe SetagemAmbiente. Aparecerá a janela do editor de


programas onde você deverá abrir o evento Init e digitar o seguinte código:

Figura 44 – Código da classe SetagemAmbiente

6. Feche a janela de edição de código. Feche também o Class Designer.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 53 de 103

7. Voltando ao Gerenciador de Projetos, você verá que a classe que criamos já aparece
na lista de classes.

8. Agora abra novamente o formulário usuários para ser modificado. Vamos incluir a
classe que acabamos de criar no formulário.

9. Observe a figura 45, onde estão posicionadas as duas janelas (Gerenciador de Projetos
e Usuários). Com a janela do Gerenciador de Projetos aberta, clique sobre a classe
SetagemAmbiente e segurando o botão do mouse arraste-a para dentro do formulário
de usuários. O resultado será algo como o seguinte:

Figura 45 – Instanciando um objeto a partir da classe SetagemAmbiente

10. Pronto, agora é só você arrastar o objeto SetagemAmbiente1 que foi instanciado
dentro do formulário usuários. Somente o simples fato dele estar lá dentro o código já
será executado, uma vez que o código da classe fôra escrito dentro do evento Init do
mesmo.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 54 de 103

11. Salve o formulário e execute-o. Inclua registros e os apague e veja que agora tudo
funciona perfeitamente.

Agora que o formulário está pronto e funcionando, vencemos a primeira etapa. Você já deve
ser capaz de programar outros formulários com características semelhantes. Por exemplo o
formulário de Cadastro de Clientes e o de Cadastro de Fornecedores.

Antes porém de passar a desenvolver esses outros formulários quero comentar um pouco
sobre algumas partes do código principalmente alguns termos usados.

As figuras utilizadas para os botões do formulário estão disponíveis a partir da área de


download do fórum no seguinte link:
http://www.foxbrasil.com.br/forum/viewtopic.php?t=129.

ENTENDENDO O MODELO DE OBJETOS DO VISUAL FOXPRO

Em qualquer linguagem orientada a objetos (OOL) é preciso que conheçamos o modelo de


objetos ou seja a estrutura hierárquica dos objetos para que possamos obter êxito. Com Visual
FoxPro esse conceito é mais válido que nunca.

O modelo de objetos pode ser considerado a um grande recipiente. Pra ficar mais claro ainda
vamos comparar esse recipiente como sendo ao muro que cerca uma casa.

Esse muro possui suas características (propriedades) por exemplo, altura, largura,
comprimento, espessura, cor, composição (material utilizado) e outros.

Dentro do muro há várias coisas, por exemplo uma casa, um jardim, etc.

Tanto a casa e o jardim ambos possuem suas propriedades que você mesmo pode imaginar
quais são e enumerá-las.

Dentro da casa há diversas dependências como sala, quarto, cozinha, varanda, garagem,
banheiros, etc.

Cada dependência possui suas características e também um objetivo específico para


proporcionar uma certa função às pessoas que moram na casa.

Se fôssemos enumerando os relacionamentos das propriedades e funções de cada um desses


objetos, teríamos uma enorme árvore hierárquica.

Gostaria que você desse uma olhada na seguinte planta baixa de uma casa e imaginasse a
relação hierárquica entre cada objeto:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 55 de 103

Imagine a linha preta em volta como sendo o muro. A área verde representa o jardim e a
planta interior é a casa com suas dependências e objetos em cada dependência.

Usando uma semântica de notação semelhante à do Visual FoxPro, onde cada objeto contido
em outro é separado por um ponto “.”, se fôssemos descrever o que temos na casa faríamos
algo como o que se segue:

Muro.Jardim.Casa.Sala.Sofá1.Cor = “Marrom”
Muro.Jardim.Casa.Quarto1.Cama.Tipo = “Casal”
Muro.Jardim.Grama.Cor = “Verde”

Muito bem, vou parar por aqui a analogia que fiz com a casa. Agora vamos tentar entender
como funciona o Modelo de Objetos do Visual FoxPro.

Quando você abre o Visual FoxPro a primeira coisa que temos é uma grande janela contendo
várias barras de ferramentas, etc. Essa é a janela principal do Visual FoxPro e no modelo de
objetos ela é representada com o nome _Screen.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 56 de 103

A partir do Objeto _Screen muitos outros podem ser adicionados, por exemplo formulários,
barras de ferramentas, etc, etc.

À medida que vamos adicionando objetos dentro de outro objeto estamos implicitamente
criando uma hierarquia entre esses objetos, de forma que para acessar o objeto contido,
precisamos especificar também o recipiente (container), ou seja, aquele que contém o objeto
contido.

O Visual FoxPro gerencia muito bem a hierarquia dos objetos. Em um nível mais superior
como do objeto _Screen, muito raramente precisaremos gerenciá-los.

No entanto, para definir programaticamente propriedades, chamar métodos, disparar eventos,


etc, precisamos pelo menos acessar os objetos na hierarquia em nível do formulário em
questão.

No nosso caso do formulário de Usuários, onde o nome do mesmo é usuarios poderíamos


fazer algo como o seguinte para preencher um valor no campo Nome do usuário:

Usuarios.txtNomeUsuario.Value = “NILTON PAULINO”

Sendo:

Usuarios -> Nome do formulários

txtNomeUsuario -> Objeto TextBox para o campo nome do usuário

Value -> Propriedade do objeto txtNomeUsuario que irá armazenar o nome do usuário.

Vamos ver como isso funciona na prática?

Abra o seu formulário de usuários para modificar e depois clique no botão executar
formulário .

Agora, ative a janela de comandos pressionando CTRL+F2.

Agora digite na janela de comandos

Usuarios.txtNomeUsuario.Value = “NILTON PAULINO”

Imagino que você vá colocar o seu nome. ☺ Tudo bem, eu não ligo.

Quando você pressionar ENTER o valor já está alterado no objeto txtNomeUsuario.

Viu como é fácil?

Muito bem, agora vamos ver algumas formas relativas de se acessar objetos.

Imagine que num método genérico desenvolvido para ser reaproveitado com vários outros
formulários de nomes diferentes você precise acessar alguns botões, métodos, propriedades.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 57 de 103

Só que você não saberá qual é o nome do formulário. Por isso ficará inviável usar da forma
que fizemos acima.

Para contornar esse problema existe uma palavra chamada THISFORM.

Thisform quer dizer este formulário. Ou seja, faz uma referência ao formulário que está
executando o código sem se importar qual é o seu nome.

Se você tentar executar o comando:

Thisform.txtNomeusuario.Value = “NILTON PAULINO”

na janela de comandos você obterá um erro, pois a referência é inválida. Essa referência só
será válida quando chamada do próprio formulário e não de outros lugares.

É por isso que no código dos métodos e eventos do nosso formulário está cheio de referência
usando thisform. Por exemplo:

Neste caso o código está dizendo para executar o método CoordenaNavegacao, passando o
parâmetro “PRIMEIRO” no formulário em questão.

Outra palavra usada para fazer referências relativas é THIS.

This é uma referência para o objeto em questão. Ou seja, quando estamos codificando dentro
de um determinado objeto e queremos nos referir a ele próprio então usamos this.

Mais uma palavra para referências relativas: PARENT.

Imagine que inserimos um objeto container e nele colocamos alguns outros objetos como por
exemplo botões de comando.

De repente estamos codificando o evento click do objeto bntBotao1 e precisamos disparar o


evento click do bntBotao2. Seria algo mais ou menos assim:

This.Parent.bntBotao2.Click

Aqui estou dizendo assim, acesse o Parent (pai, recipiente, container) no qual estou inserido e
então dispare o Click de bntBotao2.

Entendeu a flexibilidade?

A princípio parece complicado, mas à medida que você for codificar perceberá que na prática
é mais simples, principalmente se estiver utilizando o recurso de IntelliSense do Visual
FoxPro.

No final deste documento você encontra um guia de referência para os comandos e funções
utilizados até o momento.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 58 de 103

REAPROVEITANDO O CÓDIGO JÁ ESCRITO NO FORMULÁRIO USUÁRIOS

Uma técnica já muito conhecida de programadores é a de reaproveitar código escrito para


uma determinada rotina em outra. Para isso linguagens estruturadas oferecem as chamadas
funções e as bibliotecas de funções.

Em OOP, temos um conceito diferente de reaproveitamento de código. Definimos modelos


(templates) que chamamos de classes. A partir de uma classe podemos instanciar uma
infinidade de objetos com as mesmas características.

Apesar do conceito ser um pouco vago, você entenderá na prática o que estou tentando dizer.
Até o momento definimos um formulário chamado usuarios.scx. Neste formulário
adicionamos vários controles do tipo Botão de Comando e dentro de cada botão inserimos um
código a ser executado quando do seu pressionamento.

Se fôssemos usar os métodos da linguagem tradicional o que faríamos seria copiar esses
controles para um novo formulário e estaria tudo certo.

Aí você pergunta:

─ Funciona dessa forma?

─ Funciona.

─ Então por que não fazer assim?

─ Porque além de você ter o trabalho de copiar tudo cada vez para cada formulário novo, se
de repente você encontrasse um erro no código de algum desses botões, você teria que sair
corrigindo o erro em cada formulário, sem contar que o tamanho do seu executável
aumentaria bastante pois o código estaria duplicado em cada formulário.

─ Então o que devo fazer?

─ Você deve criar um modelo/template ou simplesmente uma classe.

Antes que você pergunte como definir uma classe, vou lhe explicar.

CRIANDO UMA CLASSE DE FORMULÁRIO A PARTIR DO FORMULÁRIO


USUARIOS.SCX

Vamos criar uma classe a partir do formulário usuarios.scx porque todo o código necessário
para o seu funcionamento como os métodos de coordenação de controles, botões, navegação
já estão ali agregados (encapsulados) no formulário e todos os botões já estão prontos.

Evidentemente que algumas coisas não serão reaproveitadas como por exemplo a tabela de
usuários e os campos.

Criando a Classe:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 59 de 103

1. Abra o formulário de usuários para edição, clicando no botão Modify do gerenciador


de projetos.

2. Certifique-se de que nenhum objeto do formulário esteja selecionado e depois clique


no menu File, e depois em Save As Class...

Figura 46 – Gravando um formulário como Classe

3. Clique no botão OK.

A partir desse momento uma nova biblioteca de classes foi criada com o nome
formulários.vcx. Dentro dessa classe está a definição da classe FormularioPadrao.

Adequando a Classe FormularioPadrao:

Agora que nossa classe está criada, é necessário que façamos as adequações necessárias para
que possamos reaproveitá-la (herança).

1. No Gerenciador de Projetos, clique sobre a aba Classes.

2. Caso a classe ainda não apareça na lista de classes, use o botão Add... para adicioná-
la.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 60 de 103

Figura 47 – Adicionando biblioteca de classes

3. Escolha a biblioteca formulários.vcx e clique em OK.

4. A nova classe aparece na janela do gerenciador de projetos:

Figura 48 – Classe FormularioPadrao no Gerenciador de Projetos)

5. Clique sobre a classe FormularioPadrao e clique em Modify.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 61 de 103

Figura 49 – Class Designer editando a classe FormularioPadrao

6. Como você pode notar na figura 49 o formulário de usuários está ali completinho,
aparentemente. O que muda é que este formulário perdeu o ambiente de dados.
Simplesmente desaparece o vínculo quando transformamos um formulário em classe.
Isso faz sentido já que cada formulário instanciado a partir dessa classe terá um
ambiente de dados diferente. Agora precisamos redefinir algumas propriedades como:

7. Remova o título do formulário


8. Limpe o conteúdo da propriedade PosicionarPrimeiroCampo
9. Remova os campos e todos os demais objetos label do cadastro de usuários
10. Aumente um pouco o tamanho do formulário
11. Reposicione os botões de controle.
12. Remova o código do método CriticarDados(), mantendo o método vazio.
13. Salve a classe e feche o Class Designer.

Agora nossa classe já está pronta para ser reaproveitada.

DEFININDO UMA CLASSE MODELO PARA CRIAÇÃO DE FORMULÁRIOS

A forma mais rápida e mais fácil de criarmos um formulário interativamente baseado em uma
classe visual é definindo qual a classe da qual o formulário irá se originar. Podemos fazer isso
acessando a opção Options do menu Tools.

Ao acessar a opção Options do menu Tools, clique na aba Forms. O resultado será algo como
o apresentado na figura 50.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 62 de 103

Figura 50 – Diálogo Options, definindo opções de formulários

Observe no destaque da figura. Esse grupo, Template Classes serve para definirmos qual será
a classe que servirá de modelo para nossos formulários. Marque o CheckBox Form.
Aparecerá um novo diálogo permitindo-nos escolher qual será a biblioteca e a classe
utilizada:

Figura 51 – Escolhendo a classe que servirá de modelo para os novos formulários

Escolha a biblioteca formularios.vcx e do lado direito do diálogo Form Template escolha a


classe formulariopadrao. Clique OK.

Você estará novamente no diálogo Options, e sua aparência deve ser a seguinte:
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 63 de 103

Figura 52 – Diálogo Options após a definição da classe de formulário.

Note agora que o TextBox Form foi preenchido com o nome da classe seguido pelo caminho
e nome da biblioteca de formulários.

Clique no botão Set As Default. Agora já podemos criar nossos formulários baseados nesta
classe. Clique em OK.

CRIANDO UM FORMULÁRIO BASEADO NA CLASSE MODELO

Se você é como eu, provavelmente não conseguiu esperar até este ponto do texto e
provavelmente já tenha criado os formulários de clientes e fornecedores. Muito bem.
Parabéns! Esse tipo de iniciativa é uma ótima qualidade de um desenvolvedor. Não se deve
ficar esperando pelos outros, deve-se correr atrás.

Embora aprecie sua iniciativa, pode ser que o caminho escolhido não seja o mais produtivo
tanto em tempo de desenvolvimento como em futuras manutenções ao sistema.

Vamos agora criar os formulários do nosso sistema baseados na classe FormularioPadrao que
definimos como Class Template.

Procedamos conforme os próximos passos para a criação do formulário de clientes:

1. Clique na aba Documents do gerenciador de projetos.

2. Clique em Forms e depois no botão New...

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 64 de 103

Figura 53 – Diálogo New Form

3. No diálogo New Form, clique no botão New Form.

4. Agora a Form Designer aparecerá como mostra a figura 54.

Figura 54 – Novo formulário baseado na classe FormularioPadrao

5. Observe que o formulário FormDoc1 (assim chamado porque ainda não foi salvo)
possui exatamente as mesmas características da classe FormularioPadrao. Quando
criamos um objeto baseado nas especificações de uma classe, dizemos que estamos
criando a instância da classe no objeto. Portanto, o formulário FormDoc1 é uma
instância da classe FormularioPadrao.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 65 de 103

Agora que temos nosso formulário disponível para ser alterado, faremos as seguintes
modificações para que o mesmo se transforme em nosso formulário de clientes:

a) Adicionar a tabela de clientes ao Data Environment (ambiente de dados) do


formulário;
b) Posicionar os campos e Labels (texto descritivo dos campos) no formulário;
c) Adicionar o código de validação no método CriticarDados();
d) Configurar a propriedade PrimeiroCampoFoco com o comando de posicionamento de
foco no primeiro campo;
e) Definir o título do formulário;
f) Definir o nome (name) do formulário.

Vamos então modificar nosso formulário seguindo a ordem proposta acima.

1. Clique com o botão direito do mouse sobre uma área livre do formulário e escolha
Data Environment.

Figura 55 – Adicionando a tabela de clientes ao Data Environment

2. Selecione a tabela de clientes e clique no botão Add. Clique no botão Close.

3. Selecione os campos da tabela de clientes. Clique com o botão direito sobre os


campos selecionados e arraste-os para a área do formulário. Quando aparecer o menu
de contexto, escolha Create Multiple Controls Here. O Resultado deve ser o
apresentado a seguir.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 66 de 103

Figura 56 – Arrastando os campos da tabela para a área do formulário

4. Feche a janela do Data Environment.

5. Agora vamos adicionar o código de validação dos campos no método


CriticarDados(). Clique sobre uma área livre do formulário e depois procure na janela
de propriedades na aba Methods o método CriticarDados. Dê dois cliques sobre o
mesmo e digite o código de validação. Você pode usar como base o código a seguir:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 67 de 103

6. É claro que você pode adicionar e remover código conforme a sua necessidade, mas
não se esqueça de sempre retornar os valores Falso (.F.) ou Verdadeiro (.T.) quando a
condição não obedecer as regras ou quando for o contrário disso, respectivamente.

7. Configure a propriedade PrimeiroCampoFoco com o valor


Thisform.txtNome_cliente.SetFocus. Caso tenha mudado o nome do objeto no banco
de dados, deve-se atentar para a escrita correta do nome do controle nesse ponto,
senão seu formulário poderá apresentar erros em tempo de execução.

8. Agora clique na aba Layout da janela de propriedades e mude a propriedade Caption


para Cadastro de Clientes.

9. Clique na aba Other e mude o valor da propriedade Name para clientes.

10. Agora clique no botão Run (!) e veja o resultado:

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 68 de 103

Figura 57 – Formulário de Cadastro de Clientes

Pronto! Seu formulário está pronto para ser usado. Difícil não é?

Agora sim, você pode criar todos os formulários de cadastro, inclusive recrie o formulário de
usuários para que todos fiquem baseados na mesma classe.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 69 de 103

ALGUMAS DEFINIÇÕES IMPORTANTES

MÉTODO – Um método é uma ação que um objeto é capaz de executar. Um objeto pode ter
inúmeros métodos, mas pode também não ter nenhum. Em termos gerais um método é
comparado a uma função, porém está encapsulado dentro de um objeto. Um método é
representado por um ícone .

PROPRIEDADE – É um atributo de um controle, objeto, campo de banco de dados e é


usado para definir as características ou os aspectos do comportamento de um objeto. Na
prática uma propriedade é como uma variável, mas sua definição é bem mais ampla que isso.
Uma propriedade pode ser reconhecida pelo ícone .

EVENTO – É uma ação que ocorre no ambiente de execução e que é reconhecido por um
objeto permitindo que seja programada uma reação. Eventos podem ocorrer por diversos
motivos, por exemplo um clique de mouse, a entrada ou perda de foco de um TextBox ou
qualquer outro controle. Existem vários eventos para cada tipo de objeto. Para identificar um
evento, note o tipo de ícone que representa um evento .

CLASSE – Uma classe é um molde (modelo) que define todas as características e


comportamentos de um objeto.

OBJETO -

ENCAPSULAÇÃO –

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 70 de 103

GUIA DE REFERÊNCIA DE COMANDOS E FUNÇÕES

COMANDO / DESCRIÇÃO / FINALIDADE


FUNÇÃO

& Executa substituição de macro.

Sintaxe

& NomeVar[.cExpressão]

Argumentos

& NomeVar Especifica o nome da variável ou do elemento de


matriz ao qual será feita referência na substituição de macro. Não
inclua o prefixo M. que diferencia variáveis de campos. Essa
inclusão provocará um erro de sintaxe. A macro não deve exceder o
tamanho máximo de instrução permitido no Visual FoxPro.

Uma variável não pode fazer referência a si mesma de forma


recursiva durante a substituição de macro. Por exemplo, o comando a
seguir gerará uma mensagem de erro:

STORE '&gcX' TO gcX

? &gcX

As instruções de substituição de macro que aparecem em DO


WHILE, FOR e SCAN são avaliadas somente no início do loop, não
sendo reavaliadas em iterações subseqüentes. Qualquer alteração
feita na variável ou no elemento de matriz que ocorra dentro do loop
não será reconhecida.

cExpressão O delimitador de ponto opcional (.) e .cExpressão são


utilizados para incluir caracteres adicionais em uma macro.
cExpressão incluída na macro com .

cExpressão também pode ser uma macro. Se cExpressão for um


nome de propriedade, inclua um ponto extra
(cExpressão..NomePropriedade).

Comentários

A substituição de macro trata o conteúdo de uma variável ou de um


elemento de matriz como um literal de seqüência de caracteres.
Quando um “E” comercial (&) preceder uma variável do tipo
Caractere ou um elemento de matriz, o conteúdo da variável ou do
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 71 de 103

elemento substituirá a referência à macro. É possível utilizar a


substituição de macro em qualquer comando ou função que aceite um
literal de seqüência de caracteres.

Dica: Sempre que possível, utilize uma expressão de nome em vez


de uma substituição de macro. Uma expressão de nome opera como a
substituição de macro. No entanto, uma expressão de nome limita-se
a passar seqüências de caracteres como nomes. Utilize uma
expressão de nome para acelerar de forma significativa o
processamento caso um comando ou função aceite um nome (um
nome de arquivo, nome de janela, nome de menu e assim por diante).

Embora os comandos abaixo sejam aceitáveis:

STORE 'cliente' TO gcTableName

STORE 'empresa' TO gcTagName

USE &gcTableName ORDER &gcTagName

substitua-os por uma expressão de nome:

USE (gcTableName) ORDER (gcTagName)

A substituição de macro é útil para a substituição de uma palavra-


chave em um comando. No exemplo a seguir, a definição TALK é
salva em uma variável para que a variável possa ser posteriormente
restaurada no programa. A definição original TALK é restaurada
com a substituição de macro.

AERROR() Cria uma matriz de variável que contém informações sobre o erro
mais recente do ODBC, OLE ou Visual FoxPro.

Sintaxe

AERROR(NomeMatriz)

Tipos de retorno

Numérico

Argumentos

NomeMatriz Especifica o nome da matriz criada por AERROR( ).

Comentários

A função AERROR( ) cria uma matriz com seis colunas e retorna o

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 72 de 103

número de linhas da matriz.

A tabela a seguir descreve o conteúdo de cada elemento quando


ocorre um erro do Visual FoxPro. Na ocorrência de um erro, a matriz
conterá uma linha.

Número do elemento Descrição

1 Numérico. Contém o número do erro.


Idêntico ao valor retornado por
ERROR( ).

2 Caractere. O texto da mensagem de erro.


Idêntico ao valor retornado por
MESSAGE( ).

3 O valor nulo. No entanto, se o erro


possuir um parâmetro de erro adicional,
irá conter o texto do parâmetro de erro.
Idêntico ao valor retornado por
SYS(2018).

4 O valor nulo. No entanto, quando


apropriado, contém o número da área de
trabalho em que o erro ocorreu.

5 O valor nulo. No entanto, se um


disparador falhar (erro 1539), irá conter
um dos valores numéricos abaixo: 1 -
Erro no Disparador de inserção. 2 -
Erro no Disparador de atualização. 3 -
Erro no Disparador de exclusão.

6 O valor nulo.

7 O valor nulo.

A tabela a seguir descreve o conteúdo de cada elemento quando


ocorrem os erros de OLE número 1427 ou 1429. Nestes casos, a
matriz contém uma linha.

Número do elemento Descrição

1 Numérico. Contém 1427 ou 1429.

2 Caractere. O texto da mensagem de erro


do Visual FoxPro.

3 Caractere. O texto da mensagem de erro


Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 73 de 103

de OLÉ.

4 Caractere. O nome do aplicativo


(Microsoft Excel, por exemplo).

5 O valor nulo ou Caractere. Contém o


nome do arquivo de Ajuda do aplicativo
em que podem ser encontradas maiores
informações sobre o erro, se as
informações estiverem disponíveis no
aplicativo; caso contrário, contém o
valor nulo.

6 O valor nulo ou Caractere. Contém o


identificador de contexto da Ajuda para
o tópico apropriado, se as informações
estiverem disponíveis no aplicativo; caso
contrário, contém o valor nulo.

7 Numérico. Um número de exceção OLE


2.0.

A tabela a seguir descreve o conteúdo de cada elemento quando


ocorre um erro do ODBC de número 1526. Neste caso, a matriz
contém duas ou mais linhas; uma linha para cada erro do ODBC.

Número do elemento Descrição

1 Numérico. Contém 1526.

2 Caractere. O texto da mensagem de erro.

3 Caractere. O texto da mensagem de erro


do ODBC.

4 Caractere. O estado atual do ODBC


SQL.

5 Numérico. O número do erro da fonte de


dados do ODBC.

6 Numérico. O identificador de conexão


do ODBC.

7 O valor nulo.

ALLTRIM() Remove os espaços em branco do início e do final da expressão de


caracteres especificada e retorna a expressão com os espaços
removidos como uma seqüência de caracteres.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 74 de 103

Sintaxe

ALLTRIM(cExpressão)

Tipos de retorno

Caractere

Argumentos

cExpressão Especifica a expressão de caracteres da qual serão


retirados os espaços em branco iniciais e finais.

Comentários

ALLTRIM( ) pode ser utilizado para assegurar que os espaços em


branco serão removidos dos dados inseridos pelo usuário.

APPEND BLANK Adiciona um ou mais registros novos ao fim de uma tabela.

Sintaxe

APPEND [BLANK]
[IN nÁreaTrabalho | cAliasTabela]
[NOMENU]

Argumentos

BLANK Adiciona um registro em branco ao fim da tabela atual. O


Visual FoxPro não abre uma janela de edição quando você emite
APPEND BLANK.

Você pode editar o novo registro com BROWSE, CHANGE ou


EDIT.

IN nÁreaTrabalho Especifica a área de trabalho da tabela na qual


um novo registro será incluído.

IN cAliasTabela Especifica o alias da tabela na qual um novo


registro será incluído.

Se você omitir nÁreaTrabalho e cAliasTabela, um novo registro será


incluído na tabela na área de trabalho selecionada no momento. Se
você emitir APPEND, um registro em branco será adicionado à
tabela especificada com nÁreaTrabalho ou cAliasTabela e a tabela
será automaticamente selecionada. Se você emitir APPEND
BLANK, um registro em branco será adicionado à tabela
especificada com nÁreaTrabalho ou cAliasTabela e a tabela não será

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 75 de 103

selecionada.

NOMENU Especifica que o título do menu Tabela será removido


da barra de menus do sistema, evitando alterações no formato da
janela de edição.

Comentários

Quando você emite APPEND ou APPEND BLANK e uma tabela


não está aberta na área de trabalho selecionada no momento, a caixa
de diálogo Abrir é exibida, de forma que você possa escolher uma
tabela na qual inclua registros.

APPEND abre uma janela de edição para que você possa fornecer
dados a um ou mais novos registros. Quando você adiciona um novo
registro, o Visual FoxPro atualiza todos os índices abertos.

BOF() Determina se o ponteiro do registro está posicionado no início de


uma tabela.

Sintaxe

BOF([nÁreaTrabalho | cAliasTabela])

Tipos de retorno

Lógico

Argumentos

nÁreaTrabalho Especifica o número da Área de trabalho para uma


tabela aberta em uma outra Área de trabalho.

cAliasTabela Especifica o alias de uma tabela aberta em uma outra


Área de trabalho.

Caso a tabela em que você deseja testar a condição de início do


arquivo esteja aberta em uma Área de trabalho diferente da
selecionada no momento, utilize estes argumentos opcionais para
especificar o número da Área de trabalho ou o alias da tabela. Caso a
tabela não esteja aberta na Área de trabalho especificada, BOF( )
retornará falso (.F.).

Comentários

Utilize BOF( ) para testar uma condição de início do arquivo para


uma tabela. BOF( ) retornará verdadeiro (.T.) se você tiver tentado
mover o ponteiro do registro para uma posição anterior ao primeiro
registro da tabela.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 76 de 103

CANCEL Finaliza a execução do arquivo de programa atual do Visual FoxPro.

Sintaxe

CANCEL

Comentários

O controle retornará à janela Comando quando o Visual FoxPro


estiver sendo utilizado de forma interativa. Se um aplicativo
distribuído em tempo de execução estiver sendo executado,
CANCEL terminará o aplicativo e o controle retorna ao Windows. Se
um programa estiver sendo executado no Visual FoxPro na hora da
criação, CANCEL terminará o programa e o controle retorna à janela
Comando.

A execução de CANCEL libera todas as variáveis privadas.

CLEAR EVENTS Interrompe o processamento de eventos iniciado com READ


EVENTS. Quando CLEAR EVENTS for executado, a execução do
programa continuará na linha do programa imediatamente após
READ EVENTS.

DELETE Marca registros para exclusão.

Sintaxe

DELETE
[Escopo] [FOR lExpressão1] [WHILE lExpressão2]
[IN nÁreaTrabalho | cAliasTabela]
[NOOPTIMIZE]

Argumentos

Escopo Especifica um intervalo de registros a serem marcados para


exclusão. As cláusulas de escopo são: ALL, NEXT nRegistros,
RECORD nNúmeroRegistro e REST.

Para obter maiores informações sobre as cláusulas de escopo,


consulte o tópico Cláusulas de escopo.

O escopo padrão para DELETE é o registro atual (NEXT 1).

FOR lExpressão1 Especifica uma condição através da qual somente


os registros que satisfazem à condição lógica lExpressão1 são
marcados para exclusão.

Rushmore otimizará uma consulta especificada com


Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 77 de 103

DELETE ... FOR se lExpressão1 for uma expressão otimizável e a


tabela for indexada em DELETED( ). Para obter um melhor
desempenho, utilize uma expressão otimizável na cláusula FOR.

Para obter informações sobre expressões otimizáveis Rushmore,


consulte SET OPTIMIZEe “Compreendendo a tecnologia
Rushmore”, no capítulo 15, “Otimizando aplicativos”, no Guia do
Desenvolvedor.

WHILE lExpressão2 Especifica uma condição através da qual os


registros serão marcados para serem excluídos quando lExpressão2
resultar em verdadeiro (.T.).

IN nÁreaTrabalho Especifica a Área de trabalho da tabela onde os


registros são marcados para exclusão.

IN cAliasTabela Especifica o alias da tabela onde os registros são


marcados para exclusão.

Se você omitir nÁreaTrabalho e cAliasTabela, os registros serão


marcados para exclusão na tabela da Área de trabalho atualmente
selecionada.

NOOPTIMIZE Desativa a otimização de Rushmore de DELETE.

Comentários

Os registros marcados para exclusão não são removidos fisicamente


da tabela até que PACK seja emitido. Os registros marcados para
exclusão podem ser reintegrados (desmarcados) com RECALL.

DO CASE Executa o primeiro conjunto de comandos cuja expressão


condicional resulta em verdadeiro (.T.).
... CASE ...

ENDCASE
Sintaxe

DO CASE
CASE lExpressão1
Comandos
[CASE lExpressão2
Comandos
...
CASE lExpressãoN
Comandos]
[OTHERWISE
Comandos]
ENDCASE
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 78 de 103

Argumentos

CASE lExpressão1 Comandos ... Quando a primeira expressão


CASE verdadeira (.T.) é localizada, o conjunto de comandos que a
acompanha é executado. A execução do conjunto de comandos
continua até que a próxima cláusula CASE ou ENDCASE seja
localizada. A execução é retomada, então, pelo primeiro comando
seguinte a ENDCASE.

Se uma expressão CASE for falsa (.F.), o conjunto de comandos


seguintes a ela até a próxima cláusula CASE será ignorado.

Apenas um conjunto de comandos é executado. É o primeiro


conjunto de comandos cuja expressão CASE resulta em verdadeiro
(.T.). Qualquer expressão CASE verdadeira (.T.) posterior será
ignorada.

OTHERWISE Comandos Se todas as expressões CASE resultarem


em falso (.F.), OTHERWISE determinará se um conjunto de
comandos adicionais será executado.

• Se você incluir OTHERWISE, os comandos que


acompanham OTHERWISE serão executados e a execução
saltará para o primeiro comando que acompanha ENDCASE.

• Se você omitir OTHERWISE, a execução saltará para o


primeiro comando que acompanha ENDCASE.

Comentários

DO CASE é utilizado para executar um conjunto de comandos do


Visual FoxPro, baseado no valor de uma expressão lógica. Quando
DO CASE é executado, as expressões lógicas sucessivas são
avaliadas; os valores das expressões determinam o conjunto de
comandos que será executado.

Podem ser colocados comentários na mesma linha, após DO CASE e


ENDCASE. Os comentários são ignorados durante a compilação e
execução do programa.

EMPTY() Determina se uma expressão retorna um valor vazio.

Sintaxe

EMPTY(eExpressão)

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 79 de 103

Tipos de Retorno

Lógico

Argumentos

eExpressão Especifica a expressão retornada pela função


EMPTY( ).

A expressão incluída pode ser de caracteres, data, numérica ou


lógica, bem como o nome de um campo Memo ou geral de uma
tabela aberta. EMPTY( ) retorna verdadeiro (.T.) quando as
expressões retornam um dos valores a seguir:

Tipo de expressão Retorna este valor

Caractere Seqüência vazia, espaços, tabulações,


retornos de carro, alimentações de linha ou
qualquer combinação dos mesmos.

Numérica 0

Moeda 0

Flutuante 0

Número inteiro 0

Dupla 0

Data Vazio (e.g. CTOD(''))

DataHora Vazio (e.g. CTOT(''))

Lógica Falso (.F.)

Memo Vazio (sem conteúdo)

Geral Vazio (sem objeto OLE)

Figura Vazio (nenhuma figura)

EMPTY( ) não pode ser utilizada para determinar se uma referência a


um objeto de variável de memória é vazia. Por exemplo, uma
variável de memória pode conter uma referência de objeto para um
formulário. Se o formulário for fechado a partir da caixa de menu
Controle do formulário ou com CLEAR WINDOWS, a variável de
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 80 de 103

memória conterá o valor nulo.

O exemplo de programa a seguir mostra como utilizar TYPE( ) e


ISNULL( ) para determinar se uma referência a um objeto de
variável de memória é válida.
goMyForm = CREATEOBJECT('Form')

WAIT WINDOW IIF(TYPE('goMyForm') = 'O' AND


!ISNULL(goMyForm), ;
'goMyForm has valid object reference',;
'goMyForm does not have valid object reference')

Comentários

EMPTY( ) retornará verdadeiro (.T.) se a expressão eExpressão


retornar um valor vazio; caso contrário, EMPTY( ) retornará falso
(.F.).

EOF() Determina se o ponteiro do registro está posicionado após o último


registro na tabela atual ou especificada.

Sintaxe

EOF([nÁreaTrabalho | cAliasTabela])

Tipos de Retorno

Lógico

Argumentos

nÁreaTrabalho Especifica o número da Área de trabalho da tabela.

cAliasTabela Especifica o alias da tabela.

EOF( ) retornará falso (.F.) se uma tabela não estiver aberta na Área
de trabalho que você especificou.

Se você não especificar uma Área de trabalho ou alias, a tabela que


estiver aberta na Área de trabalho selecionada no momento será
testada para o final da condição de tabela.

Comentários

EOF( ) retornará verdadeiro (.T.) se o ponteiro do registro alcançar o


final do arquivo de tabela (EOF). O final da tabela é alcançado
quando o ponteiro do registro passa pelo último registro da tabela.
Por exemplo, quando os comandos FIND, LOCATE ou SEEK não
têm êxito, o Visual FoxPro move o ponteiro do registro para depois
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 81 de 103

do último registro e EOF( ) retorna verdadeiro (.T.). EOF( ) retornará


falso (.F.) se o ponteiro do registro não estiver no final da tabela.

EXTERNAL Informa ao Gerenciador de projetos sobre uma referência indefinida.

Sintaxe

EXTERNAL FILE ListaArquivos | ARRAY ListaMatrizes


| CLASS | FORM | LABEL | LIBRARY | MENU
| PROCEDURE | QUERY | REPORT | SCREEN | TABLE

Argumentos

FILE ListaArquivos Especifica que o arquivo incluído em uma


referência indireta ao arquivo ou substituição de macro é um arquivo
autônomo, como um arquivo de texto, arquivo de bitmap .BMP e
assim por diante. ListaArquivos pode conter uma lista de nomes de
arquivos separados por vírgulas.

ARRAY ListaMatrizes Quando uma matriz é criada em um


programa e, em seguida, utilizada em um programa de baixo nível,
inclua ARRAY com o nome da matriz no programa de baixo nível.
ListaMatrizes pode conter uma lista de nomes de matriz separados
por vírgulas.

No exemplo a seguir, o primeiro programa cria uma matriz


denominada gaInvoice. A matriz é inicializada e é chamado um
programa de baixo nível denominado dispinvo. dispinvo exibe o
conteúdo da matriz criada no programa de alto nível. O comando
EXTERNAL ARRAY GAINVOICE é incluído para avisar o
Gerenciador de projetos.
DIMENSION gaInvoice(4)
STORE 'Pago' TO gaInvoice
DO dispinvo
*** Programa dispinvo ***
PROCEDURE dispinvo
EXTERNAL ARRAY gaInvoice
? gaInvoice(1)
? gaInvoice(2)
? gaInvoice(3)
? gaInvoice(4)
RETURN
*** Final do programa dispinvo ***

Quando uma matriz é passada para uma função ou procedimento


definido pelo usuário, a matriz correspondente na função ou
procedimento definido pelo usuário deve ser identificada para o
Gerenciador de projetos. Inclua a opção ARRAY com o nome da
matriz incluído na instrução PARAMETER.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 82 de 103

DIMENSION gaArrayOne(2) && Cria uma matriz


EXTERNAL ARRAY gaArrayTwo && Nome da matriz
utilizada na UDF
SET TALK OFF
STORE 10 TO gaArrayOne(1)
STORE 2 TO gaArrayOne(2)
= ADDTWO(@gaArrayOne) && Passa a matriz por
referência a uma UDF
FUNCTION ADDTWO
PARAMETER gaArrayTwo
CLEAR
gaArrayTwo(1) = gaArrayTwo(1) + 2
gaArrayTwo(2) = gaArrayTwo(2) + 2
? gaArrayTwo(1)
? gaArrayTwo(2)

CLASS Especifica que o arquivo incluído em uma referência


indireta ao arquivo ou substituição de macro é uma biblioteca de
classes visuais.
EXTERNAL CLASS myvclass && CLASS myvclass deve existir
STORE 'myvclass' TO gcClassFile
MODIFY CLASS (gcClassFile)

FORM Se um arquivo de definição de Form for incluído em uma


referência indireta ao arquivo ou substituição de macro, inclua
FORM e o nome do arquivo de Form. FORM é idêntico a SCREEN.
EXTERNAL FORM dataentr && FORM dataentr deve existir
STORE 'dataentr' TO gcFormFile
DO FORM (gcFormFile)

LABEL Especifica que o arquivo incluído em uma referência


indireta ao arquivo ou substituição de macro é um arquivo de
definição de rótulo.
EXTERNAL LABEL Maillabl && LABEL FORM Maillabl deve
existir
STORE 'Maillabl' TO gcLabelFile
LABEL FORM (gcLabelFile) PREVIEW

LIBRARY Inclua LIBRARY quando um arquivo de biblioteca for


indicado por referência indireta ao arquivo ou substituição de macro
em SET LIBRARY.
EXTERNAL LIBRARY regress && LIBRARY regress deve
existir
STORE 'regress' TO gcStatFunc
SET LIBRARY TO (gcStatFunc)

MENU Se um arquivo de definição de menu for incluído em uma


referência indireta ao arquivo ou substituição de macro, inclua
MENU e o nome do arquivo de menu.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 83 de 103

EXTERNAL MENU pickfile && MENU pickfile deve existir


STORE 'pickfile' TO gcSysMenPad
MODIFY MENU (gcSysMenPad)

PROCEDURE Identifica um procedimento externo ou função


definida pelo usuário.
EXTERNAL PROCEDURE delblank && PROCEDURE delblank
deve existir
STORE 'delblank' TO gcTrimBlanks
DO (gcTrimBlanks) WITH 'A B C D E'

QUERY Especifica que o arquivo incluído em uma referência


indireta ao arquivo ou substituição de macro é um arquivo de
consulta.
EXTERNAL QUERY sales && QUERY sales deve existir
STORE 'sales.qpr' TO gcSalesFile
DO (gcSalesFile)

REPORT Especifica que o arquivo incluído em uma referência


indireta ao arquivo ou substituição de macro é um arquivo de
definição de relatório.
EXTERNAL REPORT overdue && REPORT overdue deve
existir
STORE 'overdue' TO gcReportFile
REPORT FORM (gcReportFile) PREVIEW

SCREEN Se um arquivo de definição de formulário estiver incluído


em uma referência indireta ao arquivo ou substituição de macro,
inclua SCREEN e o nome do arquivo de tela. SCREEN é idêntico a
FORM.
EXTERNAL SCREEN dataentr && SCREEN dataentr deve
existir
STORE 'dataentr' TO gcScreenFile
MODIFY SCREEN (gcScreenFile)

TABLE Especifica que o arquivo incluído em uma referência


indireta ao arquivo ou substituição de macro é uma tabela do Visual
FoxPro.
EXTERNAL TABLE customer && Table customer deve existir
STORE 'customer' TO gcMyTable
USE (gcMyTable)

Comentários

Utilize EXTERNAL para incluir arquivos e resolver referências


indefinidas em um projeto criado pelo Gerenciador de projetos.
EXTERNAL é utilizado somente pelo Gerenciador de projetos e é
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 84 de 103

ignorado durante a execução do programa.

Arquivos cujos nomes foram especificados com EXTERNAL são


incluídos em um projeto pelo Gerenciador de projetos. É preciso
incluir CLASS, FILE, FORM, LABEL, LIBRARY, MENU,
PROCEDURE, QUERY, REPORT, SCREEN ou TABLE antes dos
nomes de arquivos ou de um conjunto de nomes de arquivos
separados com vírgulas para informar ao Gerenciador de projetos o
tipo dos arquivos a serem incluídos no projeto.

O Gerenciador de projetos também precisa ser alertado quanto a


nomes de arquivos contidos em uma expressão de nome ou
substituição de macro. Isso garante que todos os arquivos necessários
estejam incluídos em um projeto quando este é criado. Também é
necessário informar as matrizes criadas em outro procedimento ou
função definida pelo usuário.

Para obter maiores informações sobre expressões de nome e


substituição de macro, consulte o comando &. Sempre que possível,
utilize uma expressão de nome em vez de uma substituição de macro
para melhorar o desempenho.

GO Move o ponteiro do registro para o número de registro especificado.

Sintaxe

GO [RECORD] nNúmeroRegistro [IN nÁreaTrabalho | IN cAliasTabela]


– Ou –

GO TOP | BOTTOM [IN nÁreaTrabalho | IN cAliasTabela]

– Ou –

GOTO [RECORD] nNúmeroRegistro [IN nÁreaTrabalho | IN


cAliasTabela]

– Ou –

GOTO TOP | BOTTOM [IN nÁreaTrabalho | IN cAliasTabela]

Argumentos

RECORD nNúmeroRegistro Especifica o número do registro físico


para o qual o ponteiro do registro deve ser movido. Você pode omitir
GO ou GOTO totalmente e especificar apenas o número do registro.
Caso especifique apenas o número do registro, você poderá mover o
ponteiro do registro somente dentro da Área de trabalho atual.

IN nÁreaTrabalho Especifica a Área de trabalho da tabela na qual o


ponteiro do registro é movido.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 85 de 103

IN cAliasTabela Especifica o alias da tabela na qual o ponteiro do


registro é movido.

TOP Posiciona o ponteiro do registro no primeiro registro na tabela.


Caso a tabela esteja utilizando um índice ascendente, o primeiro
registro será o que apresenta o menor valor-chave. Se o índice estiver
em ordem descendente, o primeiro registro será o que apresenta o
maior valor-chave.

BOTTOM Posiciona o ponteiro do registro no último registro da


tabela. Caso a tabela esteja utilizando um índice ascendente, o último
registro será o que apresenta o maior valor-chave. Se o índice estiver
em ordem descendente, o último registro será o que apresenta o
menor valor-chave.

Comentários

GO e GOTO podem ser utilizados alternativamente. Estes comandos


operam na Área de trabalho atual da tabela, a menos que você
especifique outra Área de trabalho com a cláusula IN.

IF ... ELSE … Executa condicionalmente um conjunto de comandos baseados no


ENDIF valor de uma expressão lógica.

Sintaxe

IF lExpressão [THEN]
Comandos
[ELSE
Comandos]
ENDIF

Argumentos

lExpressão Especifica a expressão lógica avaliada. Caso lExpressão


resulte em verdadeiro (.T.), todos os comandos depois de IF ou
THEN e antes de ELSE ou ENDIF (aquele que ocorrer primeiro)
serão executados.

• Se lExpressão for falso (.F.) e ELSE for incluído, todos os


comandos depois de ELSE e antes de ENDIF serão
executados.

• Se lExpressão for falso (.F.) e ELSE não for incluído, todos


os comandos entre IF e ENDIF serão ignorados. Neste caso, a
execução do programa continuará com o primeiro comando
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 86 de 103

depois de ENDIF.

Comentários

É possível aninhar um bloco IF... ENDIF dentro de outro bloco


IF... ENDIF.

Os comentários precedidos por && podem ser colocados na mesma


linha depois de IF, THEN, ELSE e ENDIF. Esses comentários são
ignorados durante a compilação e a execução do programa.

ISRELOCKED() Retorna o status de bloqueio do registro.

Sintaxe

ISRLOCKED([nNúmeroRegistro, [nÁreaTrabalho | cAliasTabela]])

Tipos de retorno

Lógico

Argumentos

nNúmeroRegistro Especifica o número do registro para o qual o


status do bloqueio é retornado. Se nNúmeroRegistro é omitido, o
status de bloqueio do registro é retornado para o registro atual.

nÁreaTrabalho Especifica um número de Área de trabalho de uma


tabela para a qual o status de bloqueio de registro é retornado. Se for
omitido cAliasTabela e nÁreaTrabalho, o status de bloqueio do
registro é retornado para a tabela aberta na Área de trabalho atual.

cAliasTabela Especifica o alias da tabela para a qual o status de


bloqueio do registro é retornado.

Comentários

ISRLOCKED( ) retorna verdadeiro (.T.) se o registro estiver


bloqueado, caso contrário será retornado falso (.F.).

LOCAL Cria variáveis e matrizes de variáveis locais.

Sintaxe

LOCAL ListaVar
– Ou –

LOCAL [ARRAY] NomeMatriz1(nLinhas1 [, nColunas1])


[, NomeMatriz2(nLinhas2 [, nColunas2])] ...

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 87 de 103

Argumentos

ListaVar Especifica uma ou mais variáveis locais a serem criadas.

[ARRAY] NomeMatriz1 (nLinhas1 [, nColunas1])


[, NomeMatriz2 (nLinhas2 [, nColunas2])] ... Especifica
uma ou mais matrizes locais a serem criadas. Consulte DIMENSION
para obter uma descrição de cada argumento.

Comentários

As variáveis e as matrizes de variáveis locais só podem ser utilizadas


e modificadas dentro do procedimento ou função em que são criadas,
e não podem ser acessadas por programas de nível mais alto ou
baixo. As matrizes e variáveis locais são liberadas quando é
concluída a execução do procedimento ou função que as contém.

As variáveis e matrizes criadas com LOCAL são inicializadas com


um valor falso (.F.). Qualquer variável de memória ou matriz que
você deseje declarar como local deve ser declarada local antes de ter
um valor atribuído. O Visual FoxPro gera uma mensagem de erro
quando você atribui um valor a uma variável ou matriz e
posteriormente a declara local utilizando LOCAL.

As variáveis locais podem ser passadas por referência.

Não abrevie LOCAL porque LOCAL e LOCATE possuem as


primeiras quatro letras iguais.

LPARAMETERS Atribui dados passados de um programa de chamada para matrizes


ou variáveis locais.

Sintaxe

LPARAMETERS ListaParâmetros

Argumentos

ListaParâmetros Especifica os nomes de matrizes ou variáveis de


memória locais aos quais os dados são atribuídos.

Os parâmetros em ListaParâmetros são separados por vírgulas. A


instrução LPARAMETERS deve ter pelo menos o mesmo número de
parâmetros que a instrução DO ... WITH. Se mais variáveis ou
matrizes forem listadas na instrução PARAMETERS do que
passadas por DO ... WITH, as variáveis ou matrizes restantes serão
inicializadas com um valor falso (.F.). Podem ser passados no
máximo 27 parâmetros.
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 88 de 103

Você pode utilizar PARAMETERS( ) para determinar o número de


parâmetros passados para o programa, função definida pelo usuário
ou procedimento executado mais recentemente.

Comentários

LPARAMETERS cria variáveis ou matrizes locais em um programa,


função definida pelo usuário ou procedimento chamado. Utilize
PARAMETERS para criar matrizes ou variáveis particulares.

LPARAMETERS deverá ser a primeira instrução executável no


programa, função definida pelo usuário ou procedimento chamado se
você passar valores, variáveis ou matrizes para um deles.

Como padrão, DO ... WITH passa variáveis e matrizes para


procedimentos por referência. Quando um valor for alterado no
programa chamado, o novo valor será repassado para a variável ou
matriz associada no programa de chamada. Se você desejar passar
uma variável ou matriz por valor, coloque-a entre parênteses na lista
de parâmetros de DO ... WITH. As alterações feitas no parâmetro do
programa chamado não são repassadas para o programa de chamada.

Como padrão, as variáveis são passadas por referência para um


procedimento e por valor para uma função definida pelo usuário.
Utilize SET UDFPARMS TO REFERENCE para passar variáveis
para um procedimento ou função definida pelo usuário por
referência.

MESSAGEBOX() Exibe uma caixa de diálogo definida pelo usuário.

Sintaxe

MESSAGEBOX(cTextoMensagem [, nTipoCaixaDiálogo [,
cTextoBarraTítulo]])

Tipos de retorno

Numérico

Argumentos

cTextoMensagem Especifica o texto a ser exibido na caixa de


diálogo. Utilize um retorno de carro (CHR(13)) em
cTextoMensagem para mover parte da mensagem para a linha
seguinte na caixa de diálogo. A altura e a largura da caixa de diálogo
serão aumentadas conforme o necessário para conter
cTextoMensagem.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 89 de 103

nTipoCaixaDiálogo Especifica os botões e ícones a serem exibidos


na caixa de diálogo, o botão padrão a ser selecionado quando a caixa
de diálogo for exibida e as ações a serem executadas pela caixa de
diálogo.

Nas tabelas a seguir, os valores de botões de caixa de diálogo de 0 a


5 especificam os botões exibidos na caixa de diálogo. Os valores de
ícone 16, 32, 48 e 64 especificam o ícone exibido na caixa de
diálogo. Os valores padrão 0, 256 e 512 especificam qual será o
botão padrão na caixa de diálogo. O botão padrão será selecionado
quando a caixa de diálogo for exibida

A omissão de nTipoCaixaDiálogo tem o mesmo efeito que a


especificação do valor 0 para nTipoCaixaDiálogo.

Valor Botões da caixa de diálogo

0 Somente botão OK.

1 Botões OK e Cancelar.

2 Botões Anular, Repetir e Ignorar.

3 Botões Sim, Não e Cancelar.

4 Botões Sim e Não.

5 Botões Repetir e Cancelar.

Valor Ícone

16 Sinal de parada.

32 Ponto de interrogação.

48 Ponto de exclamação.

64 Ícone de informação (i).

Valor Botão padrão

0 Primeiro botão.

256 Segundo botão.

512 Terceiro botão.

nTipoCaixaDiálogo pode ser a soma de até três valores — um para

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 90 de 103

(2+32+256), a caixa de diálogo especificada apresentará as seguintes


características:

• Botões Anular, Repetir e Ignorar.

• A caixa de mensagem exibe o ícone ponto de interrogação.

• O segundo botão, Repetir, é o padrão.

cTextoBarraTítulo Especifica o texto a ser exibido na barra de título


da caixa de diálogo. Se você omitir cTextoBarraTítulo, o título
“Microsoft Visual FoxPro” será exibido na barra de título.

Comentários

O valor retornado por MESSAGEBOX( ) indica qual botão foi


selecionado na caixa de diálogo. Se você pressionar ESC para sair de
caixas de diálogo que apresentem o botão Cancelar, será retornado
um valor igual (2) ao da seleção do botão Cancelar.

Observe que a abreviação mais compacta para esta função é


MESSAGEB( ).

A tabela a seguir lista os valores retornados por MESSAGEBOX( )


para cada botão.

Valor retornado Botão

1 OK

2 Cancelar

3 Anular

4 Repetir

5 Ignorar

6 Sim

7 Não

Objeto.Refresh Redesenha um formulário ou um controle e atualiza todos os valores.

Sintaxe

[Form.]Object.Refresh

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 91 de 103

Comentários

De um modo geral, o desenho de um formulário ou controle é


gerenciado automaticamente quando não está ocorrendo nenhum
evento. Utilize o método Refresh quando desejar atualizar o
formulário ou o controle imediatamente.

Utilize Refresh para fazer com que o formulário ou controle seja


totalmente redesenhado e para atualizar o valor de um controle. O
método Refresh é útil quando você deseja que um formulário seja
exibido enquanto um outro está sendo carregado ou quando você
deseja atualizar o conteúdo de um controle. Para atualizar o conteúdo
de uma caixa de combinação ou caixa de listagem, utilize o método
Requery.

Observação Quando um formulário é atualizado, todos os seus


controles também são atualizados. Quando uma moldura de página é
atualizada, somente a página ativa é atualizada.

Objeto.Release() Libera um conjunto de formulários ou um formulário da memória.

Sintaxe

Object.Release

Comentários

O método Release é útil quando um conjunto de formulários ou um


formulário é criado com o comando DO FORM e não existe
nenhuma variável através da qual se possa fazer referência ao
conjunto de formulários ou ao formulário.

Você pode utilizar o conjunto de formulários do objeto Screen para


encontrar o conjunto de formulários ou o formulário e chamar seu
método Release.

O método Release imita o comportamento do comando RELEASE


emitido dentro do conjunto de formulários ou formulário.

Objeto.SetFocus() Atribui o foco a um controle.

Sintaxe

Control.SetFocus

Comentários

Não é possível atribuir o foco a um controle se a propriedade


Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 92 de 103

Enabled ou Visible do controle estiver definida como falso ( F ) ou se


o evento When do controle retornar falso (.F.). Se a propriedade
Enabled ou Visible tiver sido definida como falso (.F.), você deve
primeiro defini-la como verdadeiro (.T.) antes que o controle possa
receber o foco a partir do método SetFocus.

Depois que um controle tiver o foco, qualquer entrada fornecida pelo


usuário será direcionada para ele.

ON ERROR Especifica um comando que é executado quando um erro ocorre.

Sintaxe

ON ERROR
[Comando]

Argumentos

Comando Especifica o comando do Visual FoxPro a ser executado.


Após a execução do comando, a execução do programa é retomada
na linha logo após à que provocou o erro. No entanto, se o
procedimento de gerenciamento de erros incluir RETRY, a linha do
programa que provocou o erro será executada novamente.

Caso o comando especifique um procedimento a ser executado


quando ocorrer um erro, você poderá utilizar ERROR( ),
MESSAGE( ), LINENO( ) e PROGRAM( ) para passar o número do
erro, a mensagem de erro, o número da linha do programa e o nome
do programa para o procedimento. Estas informações podem ser
utilizadas para corrigir a causa do erro.

Comentários

Quando ocorre um erro durante a execução do programa, o Visual


FoxPro executa o comando especificado com ON ERROR.
Normalmente, ON ERROR utiliza DO para executar um
procedimento de gerenciamento de erros.

Utilize ON ERROR sem um comando para restaurar o Gerenciador


de erros padrão do Visual FoxPro.

Os procedimentos ON ERROR não podem ser aninhados. Caso ON


ERROR seja emitido a partir de um procedimento, o Gerenciador de
erros padrão do Visual FoxPro será restaurado.

ON SHUTDOWN Especifica um comando a ser executado quando você tentar sair do


Visual FoxPro ou Microsoft Windows.

Sintaxe
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 93 de 103

ON SHUTDOWN [Comando]

Argumentos

Emita ON SHUTDOWN sem Comando para liberar o comando ON


SHUTDOWN atual.

Comentários

O comando especificado em ON SHUTDOWN será executado se


você tentar sair do Visual FoxPro. Se você tentar sair do Microsoft
Windows a partir do Gerenciador de programas, enquanto o Visual
FoxPro estiver aberto, o controle será retornado ao Visual FoxPro e o
comando especificado em ON SHUTDOWN será executado.

Normalmente, o comando ON SHUTDOWN é um comando DO que


executa uma rotina para exibir uma caixa de diálogo. A caixa de
diálogo pergunta se você tem certeza de que deseja sair do aplicativo
atual e do Visual FoxPro. Se você quiser sair do aplicativo, a rotina
poderá fechar arquivos abertos, limpar o ambiente do Visual FoxPro
e, em seguida, executar QUIT. Caso você não queira sair do
aplicativo atual, a rotina poderá retornar o controle novamente para o
aplicativo.

READ EVENTS Inicia o processamento do evento.

Sintaxe

READ EVENTS

Comentários

Quando READ EVENTS é emitido, o Visual FoxPro inicia o


processamento do evento.

Emita CLEAR EVENTS para interromper o processamento do


evento. Quando CLEAR EVENTS é emitido, e execução do
programa continua com a linha imediatamente após READ
EVENTS.

RETURN Retorna o controle do programa para o programa que originou a


chamada.

Sintaxe

RETURN [eExpressão | TO MASTER | TO NomeProcedimento]

Argumentos
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 94 de 103

eExpressão Especifica uma expressão retornada para o programa


que originou a chamada. Se você omitir RETURN ou a expressão de
retorno, verdadeiro (.T.) será retornado automaticamente para o
programa de chamada.

TO MASTER Retorna o controle para o programa de chamada de


nível mais alto.

TO NomeProcedimento Especifica o programa para o qual o


controle é retornado.

Comentários

RETURN finaliza a execução de um programa, procedimento ou


função e retorna o controle para o programa que originou a chamada,
o programa que originou a chamada de nível mais alto, outro
programa ou a janela Comando.

O Visual FoxPro libera variáveis de memória PRIVATE quando


RETURN é executado.

Normalmente, RETURN é colocado no fim de um programa,


procedimento ou função para retornar o controle para um programa
de nível mais alto. No entanto, um RETURN implícito será
executado se você omitir esse comando.

RLOCK() Tenta bloquear o(s) registro(s) de uma tabela.

Sintaxe

RLOCK([nÁreaTrabalho | cAliasTabela]
| [cListaNúmerosRegistro, nÁreaTrabalho | cAliasTabela])

Tipos de retorno

Lógico

Argumentos

nÁreaTrabalho | cAliasTabela Especifica o número da Área de


trabalho ou alias de tabela para uma tabela aberta em outra Área de
trabalho. Se você não especificar a Área de trabalho ou alias,
RLOCK( ) irá tentar bloquear o registro atual da tabela na Área de
trabalho selecionada no momento.

cListaNúmerosRegistro Especifica que RLOCK( ) tenta bloquear


vários registros. A expressão de caractere cListaNúmerosRegistro
especifica um ou mais números de registro, separados por vírgulas,
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 95 de 103

que RLOCK( ) tenta bloquear. Por exemplo, para tentar bloquear os


primeiros quatro registros de uma tabela, cListaNúmerosRegistro
deve conter 1, 2, 3, 4.

Para bloquear vários registros, você deve ativar SET MULTILOCKS


e incluir o número da Área de trabalho (nÁreaTrabalho) ou o alias
(cAliasTabela) da tabela onde tentou bloquear vários registros.

Também é possível bloquear vários registros movendo o ponteiro do


registro até aquele que pretende bloquear. A seguir, emita RLOCK( )
ou LOCK( ) e repita este processo para registros adicionais.

No Visual FoxPro, você pode especificar 0 como um número de


registro. Esta especificação permite que você bloqueie o cabeçalho
da tabela.

Importante Mantenha o cabeçalho da tabela bloqueado pelo menor


tempo possível, pois outros usuários não poderão acrescentar
registros à tabela enquanto aquele estiver bloqueado.

Para liberar o bloqueio do cabeçalho da tabela, utilize UNLOCK


RECORD 0, UNLOCK ou UNLOCK ALL.

Se o bloqueio de todos os registros especificados em


cListaNúmerosRegistro for bem-sucedido, RLOCK( ) retornará
verdadeiro (.T.). Se um ou mais registros especificados em
cListaNúmerosRegistro não puderem ser bloqueados, RLOCK( )
retornará falso (.F.) e nenhum registro será bloqueado. Em ambos os
casos, os bloqueios de registros existentes permanecem na mesma
posição. O bloqueio de vários registros é um processo adicional — o
posicionamento de bloqueios adicionais não libera os bloqueios
existentes.

Quanto ao desempenho, sempre é mais rápido bloquear a tabela


inteira do que bloquear até mesmo um pequeno número de registros.

Comentários

RLOCK( ) é idêntico a LOCK( ).

Se o(s) bloqueio(s) for(em) bem-sucedido(s), RLOCK( ) retornará


verdadeiro (.T.). Os registros bloqueados encontram-se disponíveis
para o acesso de leitura e gravação pelo usuário que posicionou os
bloqueios. Já para os demais usuários da rede, a disponibilidade de
acesso é somente para leitura.

A execução de RLOCK( ) não garante que a(s) tentativa(s) de


bloqueio de registro tenha(m) sido bem-sucedida(s). Um bloqueio de
registro não pode ser posicionado em um registro ou em uma tabela
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 96 de 103

já bloqueados por outro usuário. Se, por qualquer motivo, o(s)


bloqueio(s) de registro não puder(em) ser posicionado(s), RLOCK( )
retornará falso (.F.).

Como padrão, RLOCK( ) tenta bloquear um registro uma vez. Utilize


SET REPROCESS para tentar novamente e de forma automática um
bloqueio de registro quando a primeira tentativa falhar. SET
REPROCESS controla o número de tentativas de bloqueio ou sua
duração quando a tentativa de bloqueio inicial é malsucedida. Para
obter maiores informações sobre SET REPROCESS e bloqueio de
tabelas, consulte SET REPROCESS.

SET MULTILOCKS determina se você pode bloquear vários


registros em uma tabela. Se SET MULTILOCKS estiver desativado
(o padrão), você só poderá bloquear um único registro da tabela. Se
SET MULTILOCKS estiver ativado, você poderá bloquear vários
registros da tabela. Para obter maiores informações, consulte SET
MULTILOCKS.

Um registro de tabela só pode ser desbloqueado pelo usuário que fez


o bloqueio. Os bloqueios de registro podem ser liberados da seguinte
forma: emitindo UNLOCK, fechando a tabela ou saindo do Visual
FoxPro.

UNLOCK pode ser utilizado para liberar bloqueios de registro na


Área de trabalho atual, em uma Área de trabalho específica ou em
todas. Para obter maiores informações, consulte UNLOCK.

Ao passar SET MULTILOCKS de ativado (ON) para desativado


(OFF) ou vice-versa, executa-se implicitamente UNLOCK ALL.
Todos os bloqueios de registro de todas as Áreas de trabalho são
liberados.

Para fechar tabelas, utilize USE, CLEAR ALL ou CLOSE


DATABASES.

Para obter maiores informações sobre o bloqueio de registros e


arquivos e o compartilhamento de tabelas em uma rede, consulte o
capítulo 17, “Programando para acesso compartilhado”, no Guia do
Desenvolvedor.

SetAll() Atribui uma definição de propriedade em todos os controles, ou em


uma classe específica de controles, de um objeto Container.

Sintaxe

Container.SetAll(cPropriedade, Valor [, cClasse])

Argumentos
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 97 de 103

cPropriedade Especifica a propriedade a ser definida.

Valor Especifica a nova definição da propriedade. O tipo de dado de


Valor depende da propriedade que está sendo definida.

cClasse Especifica o nome da classe, que é a classe em que o objeto


está baseado e não a classe principal do Visual FoxPro para o objeto.

Comentários

Utilize o método SetAll para definir um propriedade para todos, ou


para uma classe específica de controles Container. Por exemplo, para
definir a propriedade BackColor em todos os objetos Column em um
controle Grid com vermelho, emita o seguinte:

Form1.Grid1.SetAll("BackColor", RGB(255, 0, 0), "Column")

Você também pode definir propriedades para objetos que estão


contidos por outros objetos dentro do recipiente. Para definir a
propriedade ForeColor dos Headers que estão contidos por cada
objeto Column contido no controle Grid para a cor verde, emita o
seguinte:

Form1.Grid1.SetAll("ForeColor", RGB(0, 255, 0), "Header")

SKIP Move o ponteiro do registro para frente e para trás em uma tabela.

Sintaxe

SKIP
[nRegistros]
[IN nÁreaTrabalho | cAliasTabela]

Argumentos

nRegistros Especifica o número de registros que serão percorridos


pelo ponteiro do registro.

A emissão de SKIP sem nRegistros avançará o ponteiro para o


próximo registro. Se nRegistros resultar em um número positivo, o
ponteiro do registro se moverá em direção ao final dos registros do
arquivo nRegistros. Se nRegistros resultar em um número negativo, o
ponteiro do registro se moverá em direção ao começo dos registros
do arquivo nRegistros.

Se o ponteiro do registro estiver posicionado sobre o último registro


de uma tabela e SKIP for executado sem nenhum argumento, um
valor 1 maior que o número de registros na tabela será retornado por
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 98 de 103

RECNO( ) e EOF( ) retornará verdadeiro (.T.). Se o ponteiro do


registro estiver posicionado no primeiro registro de uma tabela e
SKIP -1 for executado, RECNO( ) retornará 1 e BOF( ) retornará
verdadeiro (.T.).

IN nÁreaTrabalho | cAliasTabela Move o ponteiro do registro em


uma tabela dentro de uma Área de trabalho específica.
nÁreaTrabalho especifica o número da Área de trabalho e
cAliasTabela especifica um alias de tabela ou de Área de trabalho.

Comentários

Se a tabela tiver uma marca de índice de controle mestre ou um


arquivo de índice, SKIP moverá o ponteiro para o registro
determinado pela seqüência de índice.

SKIP, exemplo do comando


CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE customer && Abre a tabela Customer
CLEAR

SKIP 4 IN 'customer'
? RECNO('customer') && Exibe 5
GO BOTTOM
SKIP -5
? RECNO( )

TABLEREVERT() Ignora as alterações feitas em uma linha, tabela ou cursor que esteja
utilizando buffer e restaura os dados de OLDVAL( ) para cursores
remotos e os valores atuais do disco para tabelas e cursores locais.

Sintaxe

TABLEREVERT([lTodasLinhas [, cAliasTabela | nÁreaTrabalho]])

Tipos de retorno

Numérico

Argumentos

lTodasLinhas Determina se todas as mudanças feitas na tabela ou


no cursor serão ignoradas. Se lTodasLinhas for verdadeiro (.T.), e a
utilização do buffer de tabela estiver ativada, as alterações feitas em
todos os registros da tabela ou do cursor serão ignoradas. Se
lTodasLinhas for falso (.F.) e a utilização do buffer de tabela estiver
ativada, somente as alterações feitas no registro atual da tabela ou do
cursor serão ignoradas.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 99 de 103

Se a utilização do buffer de linha estiver ativada, o valor de


lTodasLinhas será ignorado, e as alterações feitas no registro atual da
tabela ou do cursor serão ignoradas.

O valor padrão de lTodasLinhas é falso (.F.).

cAliasTabela Especifica o alias da tabela ou do cursor cujas


alterações serão ignoradas.

NÁreaTrabalho Especifica a Área de trabalho da tabela ou do cursor


cujas alterações serão ignoradas.

Comentários

A função TABLEREVERT( ) retornará o número de registros cujas


alterações foram ignoradas.

Observação Em uma rede, os dados presentes atualmente no disco


poderão diferir dos dados contidos no disco quando a tabela e o
cursor foram criados. Outros usuários da rede podem ter alterado os
dados depois que a tabela foi aberta ou depois que o cursor foi
criado.

A função TABLEREVERT( ) não pode ignorar as alterações feitas


em uma tabela ou cursor onde a utilização do buffer de linha não
esteja ativada. Se você emitir TABLEREVERT( ), e a utilização do
buffer de linha ou de tabela não estiver ativada, o Visual FoxPro irá
gerar uma mensagem de erro. Utilize a função
CURSORSETPROP( ) para ativar ou desativar a utilização do buffer
de linha ou de tabela.

As alterações serão ignoradas na tabela ou cursor aberto na Área de


trabalho selecionada atualmente, se TABLEREVERT( ) for emitida
sem os argumentos opcionais cAliasTabela ou nÁreaTrabalho.

A função TABLEREVERT( ) não retorna um ponteiro de registro a


sua posição original.

TABLEUPDATE() Grava fisicamente as alterações feitas em uma linha, tabela ou cursor


que esteja utilizando buffer.

Sintaxe

TABLEUPDATE([nLinhas [, lForçar]] [, cAliasTabela |


nÁreaTrabalho]
[, cMatrizErro])

Tipos de retorno
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 100 de 103

Lógico

Argumentos

nLinhas Especifica se as alterações feitas na tabela ou no cursor


serão gravadas fisicamente.Se nLinhas for 0 e a utilização do buffer
de tabela ou de linha estiver ativo, apenas as alterações feitas no
registro atual da tabela ou do cursor serão gravadas fisicamente.

Se nLinhas for 1 e a utilização do buffer de tabela estiver ativa, as


alterações feitas em todos os registros na tabela ou no cursor serão
gravadas fisicamente. Se nLinhas for 1 e a utilização do buffer de
linha estiver ativo, apenas as alterações feitas no registro atual da
tabela ou do cursor serão gravadas fisicamente.

Se nLinhas for 2 e a utilização do buffer de tabela estiver ativa, as


alterações feitas em todos os registros na tabela ou no cursor serão
gravadas fisicamente. Se nLinhas for 2 e a utilização do buffer de
linha estiver ativo, apenas as alterações feitas no registro atual na
tabela ou no cursor serão gravadas fisicamente.

Ao contrário do que acontece com os valores 0 e 1 para nLinha, um


erro não ocorre quando uma alteração não pode ser gravada
fisicamente e o Visual FoxPro continua a processar qualquer registro
restante na tabela ou no cursor. Se cMatrizErro for incluída, uma
matriz contendo informações de erro será criada quando ocorrer um
erro.

O valor padrão para nLinhas é 0.

lForçar Determina se as alterações feitas na tabela ou no cursor por


outro usuário da rede serão sobrescritas. Se lForçar for verdadeiro
(.T.), quaisquer alterações feitas na tabela ou no cursor por outro
usuário da rede serão sobrescritas.

Se lForçar for falso (.F.), o Visual FoxPro gravará fisicamente as


alterações na tabela ou no cursor, começando com o primeiro registro
até o fim da tabela ou do cursor. Se um registro modificado por outro
usuário da rede for encontrado, o Visual FoxPro irá gerar um erro.

Quando o Visual FoxPro gera o erro , este pode ser gerenciado


através da rotina ON ERROR, e esta rotina pode emitir a função
TABLEUPDATE( ) com lForçar definido para verdadeiro (.T.) a fim
de gravar fisicamente as alterações feitas no registro. Opcionalmente,
se uma transação estiver em andamento, a rotina ON ERROR poderá
gerenciar o erro e, em seguida, emitir ROLLBACK para reverter a
tabela ou o cursor para seu estado original.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 101 de 103

O valor padrão para lForçar é falso (.F.).

cAliasTabela Especifica o alias da tabela ou do cursor no qual as


alterações são gravadas fisicamente.

nÁreaTrabalho Especifica a Área de trabalho da tabela ou do cursor


no qual as alterações são gravadas fisicamente.

cMatrizErro Especifica o nome de uma matriz criada quando


nLinhas é 2 e altera um registro que não pode ser gravado
fisicamente. A matriz possui uma coluna simples contendo o número
dos registros para os quais as alterações não puderam ser gravadas
fisicamente.

Comentários

A função TABLEUPDATE( ) retornará verdadeiro (.T.) se as


alterações feitas em todos os registros forem gravadas fisicamente;
do contrário, TABLEUPDATE( ) retornará falso (.F.). Se você
especificar 0 ou 1 nLinha, o ponteiro do registro permanece em um
registro onde as alterações não puderam ser gravadas fisicamente e
pode emitir AERROR( ) para determinar porque as alterações não
puderam ser gravadas.

A função TABLEUPDATE( ) não poderá gravar fisicamente as


alterações feitas em uma tabela ou cursor que não tenha a utilização
do buffer de linha ou de tabela ativada. Se você emitir
TABLEUPDATE( ), e a utilização do buffer de linha não estiver
ativada, o Visual FoxPro irá gerar uma mensagem de erro.
Entretanto, TABLEUPDATE( ) ainda poderá gravar fisicamente
alterações em uma tabela ou cursor que possua regras de validação.
Utilize CURSORSETPROP( ) para ativar ou desativar a utilização do
buffer de linha ou de tabela.

As alterações são gravadas fisicamente na tabela ou no cursor aberto


na Área de trabalho atualmente selecionada se TABLEUPDATE( )
for emitida sem os argumentos opcionais cAliasTabela ou
nÁreaTrabalho.

UNLOCK Libera um bloqueio de registro, bloqueios de múltiplos registros ou


um bloqueio de arquivo de uma tabela, ou libera todos os bloqueios
de registros e arquivos de todas as tabelas abertas.

Sintaxe

UNLOCK
[RECORD nNúmeroRegistro]
[IN nÁreaTrabalho | cAliasTabela]
Fox Total Network
http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 102 de 103

[ALL]

Argumentos

RECORD nNúmeroRegistro Libera o bloqueio do registro em um


registro de número nNúmeroRegistro. Você pode especificar 0 para
nNúmeroRegistro para desbloquear o cabeçalho de tabela com
LOCK(0) ou RLOCK(0).

A emissão de UNLOCK RECORD nNúmeroRegistro para um


registro em uma tabela com um bloqueio de arquivo libera o
bloqueio.

IN nÁreaTrabalho | cAliasTabela Libera um bloqueio (ou


bloqueios) de registro ou um bloqueio de arquivo de uma tabela em
uma determinada Área de trabalho. nÁreaTrabalho especifica o
número da Área de trabalho e cAliasTabela especifica o alias da
tabela. Se você não incluir nÁreaTrabalho ou cAliasTabela,
UNLOCK irá liberar um bloqueio (ou bloqueios) de registro ou um
bloqueio de arquivo da tabela na Área de trabalho selecionada no
momento.

ALL Libera todos os bloqueios de registros e de arquivos em todas


as áreas de trabalho.

Para obter maiores informações sobre o bloqueio de registros e de


arquivos e o compartilhamento de tabelas em uma rede, consulte o
capítulo 17, “Programando para acesso compartilhado,” no Guia do
Desenvolvedor.

Comentários

Os bloqueios de registros e de arquivos só podem ser removidos de


uma tabela pelo usuário que os executou. UNLOCK não consegue
desbloquear uma tabela aberta para uso exclusivo.

Um bloqueio (ou bloqueios) de registro ou um bloqueio de arquivo


será liberado de uma tabela na Área de trabalho atual se você emitir
UNLOCK sem argumentos adicionais.

Caso tenham sido estabelecidas relações entre tabelas, a liberação de


um bloqueio (ou bloqueios) de registro ou de um bloqueio de arquivo
de uma das tabelas não desbloqueará os registros ou arquivos
relacionados. É preciso liberar os bloqueios de registros ou de
arquivos explicitamente em cada arquivo relacionado. Você pode
liberar todos os bloqueios em quaisquer tabelas relacionadas
emitindo UNLOCK ALL (isso também libera bloqueios em arquivos
não-relacionados).

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino
Visual FoxPro 8.0 – O Caminho das Pedras – Página 103 de 103

UPPER() Retorna a expressão de caracteres especificada em maiúscula.

Sintaxe

UPPER(cExpressão)

Tipos de retorno

Caractere

Argumentos

cExpressão Especifica que expressão de caracteres UPPER( )


converte em maiúscula.

Comentários

Cada letra minúscula (a – z) na expressão de caracteres é convertida


em maiúscula (A – Z) na seqüência retornada. Todos os outros
caracteres permanecem inalterados.

Fox Total Network


http://www.foxtotal.com.br
Copyright © 2004 – Nilton Paulino

Você também pode gostar