Você está na página 1de 131

VISUAL FOX PRO

INTERMEDIÁRIO

VISUAL FOX PRO


INTERMEDIÁRIO

APOSTILA DO CURSO DE VISUAL FOX PRO INTERMEDIÁRIO


MINISTRADO NO UNIFIEO

SETEMBRO/2008

Rogério Miranda Zanon


rogerio.zanon@itelefonica.com.br

Setembro/2008 1
VISUAL FOX PRO
INTERMEDIÁRIO

ÍNDICE

ÍNDICE.............................................................................................................................2
1. PREPARANDO O AMBIENTE DE TRABALHO......................................................3
2. CRIANDO O PROJETO DE TRABALHO..................................................................7
3. CLASSES......................................................................................................................9
4. GRIDS.........................................................................................................................20
5. MERGULHANDO NA OOP......................................................................................39
6. BIBLIOTECA DE VÍNCULO DINÂMICO (DLL)...................................................60
7. LIGANDO E ENCAIXANDO OBJETOS..................................................................79
8. REGISTRO DE MOVIMENTAÇÕES.......................................................................88
9. FINALIZANDO O APLICATIVO...........................................................................115
10. CRIAÇÃO DO INSTALADOR..............................................................................117
11. ENDEREÇOS WEB PARA VISUAL FOX PRO...................................................131

Setembro/2008 2
VISUAL FOX PRO
INTERMEDIÁRIO

1. PREPARANDO O AMBIENTE DE TRABALHO


Para organizar os arquivos que serão utilizados, deve-se criar uma pasta de
trabalho. Para fins didáticos, nesta apostila, esta pasta será denominada
C:\TRABALHO, sendo que o leitor poderá adotar outra nomenclatura de acordo
com sua preferência.
Nesta pasta serão armazenados todos os diferentes tipos de arquivos que
possam compor um projeto VFP, distribuídas em várias subpastas desta.

Na pasta C:\TRABALHO ficarão exclusivamente o(s) arquivo(s) de projeto(s).

Subpastas a criar:
BD: para armazenar o banco de dados;
FORMULARIO: formulários de tela;
CLASSES: classes;
RELATORIOS: para armazenar os reports;
PROGRAMAS; para armazenar os arquivos de programas;
IMAGENS; para armazenar imagens e ícones utilizados no projeto.

Figura 1.1 Hierarquia de Pastas para Desenvolvimento no Curso

O segundo passo é configurar o ambiente de trabalho no VFP para que a


pasta C:\TRABALHO seja a pasta padrão, e suas subpastas estejam no
caminho de procura do VFP (Search Path).
O programa INICIO.PRG será o responsável pela configuração do
ambiente, e deverá ser criado, conforme descrito a seguir:

Entre no VFP e acesse a Command Window.

Setembro/2008 3
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 1.2 – Acessando a Command Window. Este acesso pode também ser feito através
da combinação das teclas Ctrl+F2.

Digite o comando MODIFY COMMAND. Este comando tem por objetivo


criar ou alterar um arquivo de programa. Após a digitação do comando, que é
finalizado com [ENTER], será disponibilizada uma tela para digitação do
programa que será criado.

Figura 1.3. Após a digitação do Comando a tela de título Program1 é disponibilizada pelo
VFP para criação do programa.

O título desta tela exibe o nome do programa em manutenção.


Como o programa ainda não foi nomeado, o VFP o denominará
automaticamente como Program1.
Digite o código ilustrado na Figura Abaixo:

Setembro/2008 4
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 1.4 – Código do Programa que configura os Caminhos de Busca no VFP (Paths)

O símbolo de ponto-e-vírgula (;) indica para o VFP que o comando


continua na linha seguinte. Assim, tudo o que está separado por ponto-e-
vírgula pode ser digitado na mesma linha.
O arquivo será salvo na pasta C:\TRABALHO\PROGRAMAS (criada no
início do processo) com o nome de INICIO.PRG.

Figura 2 – Caminho para Salvar programa INICIO.PRG

À partir de agora, basta mandar executar INICIO.PRG que o VFP fica


configurado para buscar os arquivos nas pasta definidas neste programa.

Setembro/2008 5
VISUAL FOX PRO
INTERMEDIÁRIO
Sendo assim, para configurar o ambiente dentro do VFP, basta executar o
comando: DO C:\TRABALHO\PROGRAMAS\INICIO.PRG

O Comando DO tem a função de mandar executar um programa (PRG).


Ao executá-lo o VFP passa utilizar a pasta C:\TRABALHO como pasta padrão,
e a enxergar suas subpastas em seu caminho de busca.
Isto implica, que a partir deste momento, não se faz necessário referenciar
no VFP o caminho completo da localização de um arquivo (desde que ele
esteja localizado nas pastas especificadas no comando SET PATH), bastando
informar seu nome.
Existe também a possibilidade de configurar no VFP para que ele
execute automaticamente este programa, toda vez que for inicializado. Para
isto, acesse a opção de Configurações de Ambiente do VFP ( Tools / Options ).

Figura 1.3 – Acessando Configurações de Ambiente do VFP

Localize a Aba File Locations e depois o item Startup Program


(Programa a ser executado na Inicialização). Neste item, coloque a chamada
do programa INICIO.PRG, citando seu caminho completo.

Setembro/2008 6
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 1.4- Configurando INICIO.PRG para ser executado ao entrar no VFP

Clique em OK para confirmar o arquivo e depois, não esqueça de clicar


no botão Set As Default, antes do OK final.
Feito isto, toda vez que acessar o VFP, já estarão configuradas as
pastas utilizadas para o trabalho.
Se o computador utilizado contiver outros usuários que mexem no VFP, é
recomendável que sempre que houver o início de um trabalho, seja confirmado
se o Startup Program configurado corresponde ao do usuário que o está
acessando.

2. CRIANDO O PROJETO DE TRABALHO


O objetivo final do curso será a criação de um aplicativo que utilize todo o
conhecimento adquirido aqui. Para que isso aconteça será necessário criar um
projeto para o aplicativo final, que será denominado como APLCURSO e
deverá ser gravado na pasta C:\TRABALHO.
A tarefa agora é criar o Banco de Dados que será utilizado no aplicativo.
Para exercitar o que foi utilizado no curso básico, será criado o Banco de
Dados.
Todos os arquivos que compõem este Banco devem ser gravados na pasta
C:\TRABALHO\BD. O Nome do Banco de dados será CURSO, contendo
inicialmente 3 tabelas, que têm suas estruturas descritas à seguir:

Setembro/2008 7
VISUAL FOX PRO
INTERMEDIÁRIO

TABPROF (Tabela de Profissões)

Índices:
CODIGO (Chave Primária)
NOME (Regular)

TABPERF (Tabela de Perfis)

Índices:
CODIGO (Chave Primária)
NOME (Regular)

Setembro/2008 8
VISUAL FOX PRO
INTERMEDIÁRIO

CADCLI (Cadastro de Clientes)

Índices:
CODIGO (Chave Primária)
NOME (Regular)
CODPROF (Regular)
CODPERFIL (Regular)

Para Finalizar, descompacte na pasta C:\TRABALHO\IMAGENS o arquivo


IMAGENS.ZIP. Este arquivo contém todas os arquivos de imagens e arquivos
de ícones que serão utilizados no projeto.

3. CLASSES
A Utilização deste recurso permite uma maior padronização, flexibilidade ao
desenvolvedor, além de acelerar o processo de desenvolvimento de um
software.
Quando um formulário é criado, sempre ocorre a modificação de alguns
padrões nele como: cor de fundo, ícone, entre outros. Então, para facilitar o
trabalho no exemplo apresentado, será criada uma classe baseada no
formulário que será escolhido como padrão.
O projeto APLCURSO deve ser aberto e acionada a aba Classes. Na
seqüência clica-se no Botão New com o objetivo de criar uma nova classe. A
etapa é concluída com o preenchimento dos campos solicitados pelo VFP
conforme ilustra a Figura 3.1, confirmando a criação da classe com um clique
no botão OK.

Setembro/2008 9
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 3.1 Tela para Criação de uma Classe.


As informações destacadas na Figura 3.1 para criação da classe são:
1. Class Name: trata-se do nome de identificação da classe. No
exemplo trabalhado, a classe foi nomeada de frs_padrao. A
nomenclatura da classe é de livre uso do desenvolvedor. Porém,
recomenda-se que sejam evitados caracteres como acentos, hífens,
espaços e símbolos de pontuação. No exemplo apresentado, foi
utilizada uma construção onde os três primeiros dígitos identificam o
tipo de objeto padrão escolhido, como por exemplo frs = formset.
2. Based On: indica a classe pai da qual a nova classe será herdada.
Como trata-se de um FormSet, esta classe será herdada da classe
de FormSet padrão do VFP.
3. Store In: Indica o nome do arquivo onde será armazenada a classe
recém-criada. Neste caso, será indicado o arquivo de nome
PADROES_CURSO, sendo este armazenado na pasta
C:\TRABALHO\CLASSES\. Após confirmar a criação da classe com
um clique no botão OK, observe na pasta C:\TRABALHO\CLASSES
que serão criados 2 arquivos: PADROES_CURSO.VCT e
PADROES_CURSO.VCX.

A tela que aparece à seguir é um FormSet. Através dela o formulário será


personalizado. Dentro da proposta apresentada, personalize, entre outras, as
seguintes características:
 Cor de Fundo (BackColor ou Picture) ;
 O Ícone (Icon);
 Não permita que o usuário minimize ou maximize o formulário
(MinButton e MaxButton);
 Habilite a visualização de Tips (Show Tips).

Terminada a personalização, salve o trabalho e feche a tela.

Setembro/2008 10
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 3.2 – Aba Classes após a criação de nossa primeira classe.


A Figura 3.2 ilustra como fica a aba Classes, quando é concluída a criação
da primeira classe. A imagem ilustra que a classe de nome frs_padrao, está
armazenada dentro do arquivo de classes padroes_curso.
Para refinar o aprendizado, crie um programa para manutenção de cadastro
na tabela de Perfis (TABPERF) utilizando os novos recursos aprendidos.

Então mãos-a-obra e proceda a criação de um novo formulário. Clique na


aba Documents do projeto, certificando-se de que está selecionado o item
Forms. Clique no Botão New, e na tela seguinte na opção New Form, conforme
ilustra a Figura 3.3.

Figura 3.3 – Criando um Novo Formulário.


Na tela seguinte surgirá o formulário padrão do VFP. Acione a Barra de
Ferramentas e atente para o ícone em destaque na Figura 3.4.

Setembro/2008 11
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 3.4 – Barra de Ferramentas – em Destaque ícone para selecionar classes.


Clique neste ícone e será exibido o menu suspenso ilustrado pela Figura
3.5.

Figura 3.5 – Em Destaque a Classe de Objetos em Uso pela Barra de Ferramentas.


A opção em destaque, com o símbolo √ à esquerda, indica qual é a classe
de objetos em uso pela barra de ferramentas. A Figura 3.5 indica que a barra
de ferramentas está utilizando-se da classe padrão do Visual Fox Pro
(Standard). Para utilizar a classe recém criada, é preciso fazer com que a Barra
de Ferramentas trabalhe com o arquivo de classes PADROES_CURSO. Para
isto, selecione a opção Add (primeira opção do menu suspenso). Será
solicitado pelo VFP que indique um arquivo de classes a ser adicionado.
Localize o arquivo PADROES_CURSO que está gravado na pasta
C:\TRABALHO\CLASSES e clique no botão Open, conforme ilustra a Figura
3.6.

Setembro/2008 12
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 3.6 – Adicionando um novo arquivo de classes.


Observe que a barra de ferramentas mudou (Figura 3.7). Ela apresenta
apenas um objeto. Coloque o mouse sobre este objeto que será apresentado
um Tool Tip Text com a mensagem frs_padrao, que é o nome da classe que
foi criada. Ao clicar no botão das classes, observe que no menu suspenso foi
adicionado o item Padroes_curso, que está atualmente selecionado (símbolo √
à esquerda).

Figura 3.7 – Barra de Ferramentas após inclusão de nova classe.


Se quiser voltar a utilizar a classe Standard na barra de ferramentas, basta
acionar o botão das classes e selecionar a opção Standard. Faz-se o mesmo
processo para utilizar qualquer outra classe personalizada que venha a ser
criada.
Para enfim, utilizar a classe que foi criada, basta clicar no ícone do
frs_padrao e soltá-lo dentro do formulário. Observe que “surgirá” o formulário
criado nas classes. Altere a propriedade Caption para Cadastro de Perfis e

Setembro/2008 13
VISUAL FOX PRO
INTERMEDIÁRIO
salve este formulário com o nome FrmPerfis na pasta
C:\TRABALHO\FORMULARIO.
Nas propriedades do FormSet (Sequência de Menus Window / Properties
Window ) , verifique a aba Other e observe os detalhes destacados na Figura
3.8:

Figura 3.8 – Propriedades relativas à classe do objeto.


a) BaseClass: indica a qual classe padrão do VFP o objeto pertence;
b) Class: indica o nome da classe da qual o objeto é herdada. No caso
do exemplo ilustrado pela Figura 3.8, o objeto em questão (FormSet)
é herdado da classe Frs_padrao, que tem por objeto de origem o
FormSet.
c) ClassLibrary: Nome do Arquivo de classes (.vcx) onde está
armazena a classe indicada na propriedade Class.
Na Figura 3.8 foi utilizado um exemplo de FormSet, mas todos os objetos
(textbox, commandbutton, labels, ... ) possuem estas propriedades.

Feche o formulário, volte na edição da Classe e modifique as seguintes


propriedades:
 Cor de Fundo da Tela ou Imagem de Fundo da Tela;
 Ícone
 Título (Caption)
Feito isto, volte e abra novamente o formulário. Será observado que a Cor
de Fundo da Tela ou Imagem de Fundo da tela e o ícone também foram
alterados no formulário, mas o título permaneceu o mesmo.
Isto ocorre porque as propriedades da cor de fundo ou imagem de fundo e o
ícone foram definidas na classe. Logo, todo o objeto que é “filho” desta classe,
herda todas as propriedades (e métodos) dinamicamente. Isto é, basta alterar
na classe que todos os “filhos” desta classe mudem automaticamente. Esta
característica é fundamental para definição de padrões, bem como agilizar o
processo de desenvolvimento de um software.
No Caso do Título (Caption), o mesmo foi definido no formulário e não na
classe. Quando uma propriedade (ou método) é alterada na instância de uma

Setembro/2008 14
VISUAL FOX PRO
INTERMEDIÁRIO
classe (é o nome dado aos objetos que derivam de uma classe quando estão
sendo executados), esta propriedade (ou método) deixa de herdar as
características (ou ações) da sua classe de origem e passa apenas a executar
o que foi definido na instância.
Simplificando, quando um formulário é criado e modificado em si mesmo (e
não na classe) alguma propriedade (ou método), esta não assume mais as
modificações que venham a ser efetuadas na classe pai, e passa a respeitar
exatamente o que foi definido no próprio formulário.

Os padrões determinados para a classe de FormSet, também podem ser


determinados para os outros objetos.
Crie uma padronização para o botão que tem a ação de encerrar o
formulário. Para criar uma nova classe, voltemos a aba Classe.

Figura 3.9 – Criando classe para padronização do botão sair.


A Figura 3.9 ilustra o conteúdo a ser informado para o VFP com fins da
criação da classe do botão sair:
 Class Name: o nome da classe fica a critério do desenvolvedor,
porém é saudável criarmos uma padronização de nomes para
facilitar a equipe de desenvolvedores. Neste exemplo sugere-se
utilizar o nome de cmdsair_padrao.
 Based On: identifica-se como classe base a CommandButton.
 Store In: o arquivo onde será armazenada a classe, será o mesmo
onde foi armazenada a classe do formset: padroes_curso. A
distribuição das classes em arquivos cabe ao desenvolvedor. É
aconselhável criar arquivos que contenham classes com conceitos
semelhantes.

Após a confirmação da criação desta classe, o VFP apresenta uma tela


onde existe apenas um botão (Figura 3.10).

Setembro/2008 15
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 3.10 – Tela para construção de Classe baseada em Command Button.


Isto ocorre porque a classe em criação (ou em desenvolvimento) é baseada
num Command Button e isto implica em limitar-se a este objeto.
Faça as seguintes personalizações nesta classe:
 Configure o tamanho do botão como preferir;
 Coloque uma imagem para Botão e deixe-o sem texto (Picture
Position);
 Retire os Themas do Windows (Themes);
 Modifique o ponteiro do mouse quando este estiver sobre o botão
(Mouse Pointer)
 Programe o encerramento do formulário. No método click, colocar o
código abaixo:

IF MESSAGEBOX("Deseja Encerrar o Formulário?",4+32,"Sair") = 6


ThisFormSet.Release()
ENDIF

Finalize esta classe e volte a editar o formulário da Tabela de Perfis.


Observe que na barra de ferramentas agora aparecem 2 objetos, conforme
ilustra a Figura 3.11.

Figura 3.11 – Objetos disponíveis na barra de Ferramentas após inclusão da classe do


botão Sair.

Setembro/2008 16
VISUAL FOX PRO
INTERMEDIÁRIO
Se por um acaso na barra de ferramentas apresentada, estiver
apresentados os objetos da classe padrão (Standard), verifique a Figura 3.7
para selecionar novamente a classe PADROES_CURSO.
Coloque então o objeto CMDSAIR_PADRAO dentro do formulário. Veja que
este objeto já está com a figura (Picture) que foi definida lá na classe. Abra a
janela de propriedades do objeto, posicione na aba Other e observe os
detalhes destacados pela Figura 3.12.

Figura 3.12 – Propriedades Relativa a herança e Nome Padrão para a instância da classe
do botão Sair.
1. As propriedades BaseClass, Class e ClassLibrary possuem
respectivamente: o tipo de objeto nativo VFP, classe de origem e
nome do arquivo de classes (VCX) de origem, de forma análoga ao
ilustrado na Figura 3.8 para o FormSet..
2. Observe que o nome padrão trazido pelo VFP é
CMDSAIR_PADRAO1, isto é, um nome derivado da classe seguido
de um número.
Na seqüência modifique o nome do objeto para CMDSAIR. Salve o
formulário e execute-o. Observe que roda normalmente.

Edite novamente o formulário em questão e verifique a programação que


está no evento Click do botão CMDSAIR.
Confira se não existe nenhum código de programação neste evento. Note
também que fica habilitado do lado direito da tela ilustrada pela Figura 3.13 um
botão com o título View Parent Code. Ao acionar este botão é mostrada uma
opção com o nome da classe de origem: CMD_SAIRPADRAO. Ao acionar este
botão, o código da classe (que está sendo executado quando você clica no
botão) será acessado. Note, que não será possível efetuar modificações neste
código.

Setembro/2008 17
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 3.13 – Acesso ao código da Click na instância do Botão Sair.


Acione agora a janela de propriedades deste objeto, e observe na aba
Methods o Click, conforme ilustra a Figura 3.14.

Figura 3.14 – Visualização de um método com código na classe pai.


Observe que no método Click aparece a expressão [Inherited
cmdsair_padrao c:\trabalho\classes\padroes_curso.vcx]. A palavra Inherited em
inglês significa Herdado. Logo, esta expressão quer dizer, que o método a ser
executado é Herdado da classe CMDSAIR_PADRAO que encontra-se no
arquivo C:\TRABALHO\CLASSES\PADROES_CURSO.VCX.

Faça um experimento: Modifique o código do evento Click do botão


CMDSAIR, colocando a seguinte linha de comando:
ThisFormSet.Release()
Na seqüência execute o formulário. Note que ao clicar no botão sair, ele
não mais faz a pergunta e sai direto do formulário. Isto ocorre porque
anteriormente foi escrito um código no método Click. À partir do momento que
existe um código do método, o VFP ignora a classe pai e executa somente o
código existente no método.

É possível executar um código próprio no evento click e também executar o


código da classe?
Sim, é possível. Supondo que no Botão Sair, antes de executar o processo
da classe, o desenvolvedor quisesse dar uma mensagem ao usuário avisando
que ele clicou no botão Sair e depois executar o código da classe. No evento
Click do botão CMDSAIR, seria colocado o código abaixo:

Setembro/2008 18
VISUAL FOX PRO
INTERMEDIÁRIO
= MESSAGEBOX("Você Acionou o Botão Sair!!!",48,"Atenção!")
DODEFAULT()

Execute o formulário e acione o Botão Sair. Observe que é executado o


comando que exibe mensagem avisando o acionamento do Botão Sair. Na
seqüência é executado processo programado na classe. Isto é permitido
através da execução da função DODEFAULT(). Esta função executa o código
que está programado na classe pai do objeto.
Para não executar o código programado na classe pai, basta programar
qualquer coisa na instância. Porém, se for preciso somente omitir a execução
do método pai, sem a necessidade de programação adicional, basta colocar o
comando NODEFUALT (neste caso não se deve utilizar os parênteses) no
código do método.

EXERCÍCIO 01

Crie uma classe padrão para os seguintes objetos:


 Botão Novo (CMDNOVO_PADRAO)
 Botão Alterar (CMDALTERAR_PADRAO)
 Botão Excluir (CMDEXCLUIR_PADRAO)
 Botão Ok (CMDOK_PADRAO)
 Botão Cancela (CMDCANC_PADRAO)
 Botão Relatório (CMDRELATORIO_PADRAO)
 TextBox (TEXTBOX_PADRAO)
 Label (LABEL_PADRAO)

Defina as seguintes características para cada tipo de objeto:


 Botões
o Imagem de Fundo;
o Desabilitar Temas do Windows;
o Exibir Tool Tip Text Conforme o Conteúdo do Botão;
o Personalizar o Ponteiro do Mouse quando estiver sob o botão;
o Padronizar os Tamanhos.
 TextBox
o Colocar Fonte Tipo Arial, Tamanho 10 e em Negrito.
o Deixar o fundo em cor diferenciada quando o usuário estiver com
o foco no controle.
 Label
o Deixar Fundo Transparente;
o Colorcar Fonte Tipo Arial, Tamanho 10 e em Negrito.

Para Testar o Funcionamento das Classes, coloque os elementos dentro de


um Formulário. Há possibilidade de utilizar o formulário da Tabela de Perfis. No
entanto, ao terminar o exercício exclua os itens adicionados, pois este
formulário será utilizado no próximo capítulo.

Setembro/2008 19
VISUAL FOX PRO
INTERMEDIÁRIO

4. GRIDS
O Grid é um dos objetos nativos do VFP mais utilizados. Sua função é exibir
em tela dados em formato de planilha. Ele permite visualizar o conteúdo de
uma tabela, por exemplo.
O recurso do Grid será utilizado para prosseguir com o formulário da Tabela
de Perfis. Antes de prosseguir preencha a tabela de perfis com alguns dados
(por uma questão didática), através da Command Window (que pode ser
acionada através da seqüência de menus Window / Command Window ou
através da combinação das teclas Ctrl + F2 ) com os comandos APPEND e/ou
BROWSE.
Voltando ao formulário de Perfis (FRMPERFIS), coloque no Data
Environment a tabela TABPERF e não esqueça de buferizá-la, modificando a
propriedade BufferModeOverride para 3.
Feito isto, ainda no DataEnvironment, selecione os campos CODIGO,
NOME e VLRCOMPRA. Faça isto, segurando a tecla Shift , enquanto efetua o
clique do mouse nos 3 campos mencionados, ficando estes destacados,
conforme ilustra a Figura 4.1.

Figura 4.1 – Selecionando TODOS os Campos da Tabela TABPERF.


Feito isto, arraste com o mouse os campos e “jogue-os” para dentro do
formulário. O resultado será a criação do objeto que é denominado como
GRID, ilustrado pela Figura 4.2.

Setembro/2008 20
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 4.2 – Grid com os Dados da Tabela TABPERF.


Quando apenas um campo do DataEnvironment é arrastado para o
formulário o VFP cria automaticamente um textobox e uma label. Já, quando
esta seleção é de mais de um campo (como foi feito) o VFP cria
automaticamente um GRID.
Observe que o VFP nomeou automaticamente este grid como
GRDTABPERF. Este nome identifica bem o tipo de objeto (GRD) e sua
finalidade (TABPERF), logo não há necessidade de modificá-lo.
Na Janela de Propriedades, clique na seta para seleção dos objetos e note
o que é mostrado pela Figura 4.3.

Figura 4.3 – Hierarquia de Objetos Criada com a Adição de um GRID.


Quando um GRID é criado, automaticamente ele cria outros objetos “filhos”.
Na Figura 4.3 pode-se observar que logo abaixo do objeto GRDTABPERF

Setembro/2008 21
VISUAL FOX PRO
INTERMEDIÁRIO
foram criados 3 objetos: COLUMN1; COLUMN2 e COLUMN3, sendo cada um
deles relativo a uma das colunas selecionadas. Cada um destes 3 objetos
ainda possui 2 “filhos”: HEADER1 e TEXT1. O objeto HEADER 1 é o cabeçalho
da coluna e o objeto TEXT1 é o objeto utilizado pelo GRID para exibir a
informação da coluna, que neste caso, é um objeto TEXTBOX.
Todos estes objetos criados contêm seus próprios métodos e propriedades,
bem como podem ser manipulados pelo desenvolvedor, como os demais
objetos já estudados anteriormente. Esta diversidade nos objetos criados
automaticamente pelo GRID possibilita manipular cada coluna de forma
específica.
Antes de falar mais do GRID, salve o formulário e execute-o.

Figura 4.4 – Formulário com Grid em Tempo de Execução.


A Figura 4.4 ilustra a execução do Formulário com o Grid. Veja que no
GRID os 3 campos selecionados são mostrados, bem como todos os registros.
Pode-se “navegar” por esta “planilha”. Além disto, o GRID gera
automaticamente barras de rolagem horizontais e verticais, as quais auxiliam
em sua navegação quando as informações excedem o espaço ocupado pelo
GRID.
Note também que será possível alterar qualquer uma das informações do
GRID, como se estivesse executando o comando BROWSE.
Volte para o módulo de Edição do Formulário. Posicione a janela de
propriedades no Grid e explore algumas delas:
 AllowHeaderSizing: Determina se o usuário poderá modificar a altura
do cabeçalho em tempo de execução. Modifique para FALSE.
 AllowRowSizing: Determina se o usuário poderá modificar o tamanho
da linha em tempo de execução. Modifique para FALSE.
 Column Count: Trata-se do número de colunas que contém o Grid.
Neste caso, 3.

Setembro/2008 22
VISUAL FOX PRO
INTERMEDIÁRIO
 DeleteMark: Apresenta uma pequena coluna à esquerda do primeiro
campo que fica negra caso o registro esteja com marca de deletado,
como no Browse. Modifique o valor desta propriedade para FALSO,
pois não serão considerados os registros deletados.
 GridLineColor: Define a cor das linhas do grid.
 GridLineWidth: Determina a espessura das linhas do Grid.
 GridLines: Permite configurar a existência das linhas horizontais e
verticais do Grid. Possibilita a existência das 2 linhas (3-Padrão),
somente a linha horizontal (1), somente a linha vertical (2) ou
nenhuma das linhas (0).
 LinkMaster: Neste campo determina-se o nome de uma tabela
relacionada com o Grid. Isto fará com que o Grid filtre somente os
registros de sua tabela que estejam correlacionados com o registro
corrente da tabela especificada nesta propriedade (MASTER).
 ReadOnly: Quando esta propriedade é .T. (Verdadeiro) o GRID não
permite que o usuário modifique seus dados, quando ela é .F. (Falso
– Padrão) o GRID permite a alteração de dados pelo usuário em
tempo de execução. Habilitar ou não este recurso depende do foco
do processo em que ele está sendo aplicado. Por padrão, não é
conveniente deixar o usuário alterar dados diretamente no GRID.
Logo, modifique o valor desta propriedade para VERDADEIRO.
 RecordMark: Trata-se da exibição ou não da MARCA DE
REGISTRO, que é um pequenino destaque no extremo esquerdo do
GRID. Trata-se apenas de uma questão de estética, mas modifique o
valor desta propriedade para FALSO, omitindo a exibição da MARCA
DE REGISTRO.
 RecordSource: A tradução deste termo para o português significa
“FONTE DOS REGISTROS”. Nesta propriedade é indicado qual é a
fonte dos registros mostrados no GRID. Simplificando, esta
propriedade armazena a Tabela de Origem dos Dados.
 RecordSourceType: Esta propriedade indica o Tipo de Fonte de
Dados. O padrão utilizado é 1-Alias, significando que o tipo de fonte
de dados é uma tabela. Esta propriedade permite utilizar como tipo
de fonte de dados uma sentença SQL, por exemplo. Na prática, o
Alias é o mais utilizado.
 ScrollBars: Configura a existência das barras de rolagem vertical e
horizontal. Pode-se manter o padrão com a existência das 2 barras
(3), manter somente uma delas ( 2 – Vertical, 1 – Horizontal) ou
omitir as 2 barras (0).
 SplitBar: Configura a visualização da SplitBar, que é uma pequena
barra negra no extremo esquerdo da barra de rolagem horizontal.
Quando esta barra está habilitada o usuário pode, em tempo de
execução modificar a disposição das colunas. Omita a exibição desta
barra, modificando o valor desta propriedade para FALSO.

O objeto COLUMN também possui propriedades interessantes para serem


exploradas. Posicione a janela de propriedades em qualquer uma das colunas
e confira algumas delas:
 Alignment: Define o Alinhamento da informação dentro da coluna
(esquerda, direita ou centralizado).

Setembro/2008 23
VISUAL FOX PRO
INTERMEDIÁRIO
 ControlSource: Determina qual campo será exibido na coluna.
Recomenda-se que seja preenchido com formato TABELA.CAMPO.
Pode-se omitir este parâmetro. Se isto acontecer o próprio VFP
determinará a posição de cada coluna dentro do GRID, conforme o
número de colunas determinadas na propriedade ColumnCount do
GRID.
 DynamicBackColor: Permite a modificação da cor da coluna de
forma dinâmica na execução do Grid. Pode-se modificar a cor de
uma coluna de acordo com o valor do registro.
 Resizeble: Determina se o a coluna poderá ter seu tamanho
modificado em tempo de execução. Modifique para FALSE.
 Width: Largura da Coluna. Pode-se modificar a largura da coluna
nesta propriedade, ou fazê-lo com o próprio mouse, arrastando a
coluna para aumento ou diminuição de seu tamanho.

As propriedades e métodos que foram mencionados são de fato os mais


utilizados. Muitas outras não são mencionadas, pois seu conteúdo já fora
explorado anteriormente, como as propriedades relacionadas com Fontes
(FontBold, FontName, ... ) ou Cores (BackColor, ForeColor, ... ).
Seguindo a personalização proposta neste GRID, modifique algumas
propriedades do Cabeçalho da Coluna. Posicione a Janela de Propriedades em
HEADER1 da COLUMN1 e proceda com as seguintes alterações:
 Caption: Trata-se do Título da Coluna. Modifique-o se achar
conveniente.
 FontBold: Coloque Verdadeiro (.T.) para que o cabeçalho apareça
em negrito.
 Alignment: Determina o alinhamento do título dentro da caixa que
contém o cabeçalho. Centralize-o, modificando o valor desta
propriedade para 2.
 BackColor: Cor de Fundo da Caixa que contém o cabeçalho.
Modifique para a cor preferida. Neste trabalho, sugere-se uma
tonalidade de azul de código RGB(0,128,192).
 ForeColor: Cor da Letra do título do cabeçalho. Modifique para uma
cor preferida. Neste caso, sugere-se branco código
RGB(255,255,255).

Após a conclusão destas modificações na primeira coluna, já é possível


perceber que o campo que contém titulo dela já tem um aspecto melhor. Repita
a mesma coisa para os outros dois cabeçalhos. Use o mouse para
redimensionar o GRID e as colunas a gosto. Salve o formulário e execute-o
novamente.

Setembro/2008 24
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 4.5 – Execução do Formulário com GRID após modificações no leiaute.


A Figura 4.5 ilustra a execução do formulário após a modificação de
parâmetros de seu leiaute. Veja que a aparência agora é bem melhor que o
GRID que foi trazido automaticamente. Faça o teste e veja que agora não será
possível modificar o conteúdo de nenhum dos campos, devido a modificação
no valor da propriedade ReadOnly do GRID que foi efetuado.

Para incrementar o GRID deixe a linha atual em que está o usuário de cor
diferente. Para fazer isto, crie uma propriedade no FORMSET.

Figura 4.6 – Primeiros passos para a criação de uma Propriedade no FORMSET.


Execute a seqüência de menus: Form / New Property (Figura 4.6).
A propriedade é uma característica que fica associada ao formulário. Em
qualquer objeto do formulário pode-se modificar ou acessar o conteúdo de uma

Setembro/2008 25
VISUAL FOX PRO
INTERMEDIÁRIO
propriedade. A grosso modo, pode-se dizer que métodos são funções
associadas ao formulário, e propriedades são variáveis associadas ao
formulário. A criação da propriedade é completada através da informação dos
dados conforme ilustra a Figura 4.7.

Figura 4.7 – Criando uma Propriedade Atrelada ao FORMSET.


1. Name: Nome dado a propriedade;
2. Default/Initial Value: Valor inicial da propriedade. Uma propriedade
pode assumir os mais variados tipos de dados. A definição do Tipo
de Dado é feita no valor Inicial. Uma propriedade com valor numérico
tem valor inicial 0 (zero), uma propriedade string tem valor inicial
“” (string vazia), uma propriedade tipo data, tem valor inicial {} (data
em branco);
3. Description: Comentário a respeito da função da propriedade. Não é
obrigatório, mas uma boa prática de programação não dispensa os
comentários.
Ao Clicar no Botão Add, a propriedade é incluída no FORMSET.
Feito isto, posicione a janela de propriedades no FORMSET e observe o
último item na aba All.

Setembro/2008 26
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 4.8 – Visualizando propriedade criada pelo desenvolver.


Observe que a propriedade REGISTROATUAL é exibida em conjunto com
as demais. Veja que seu valor é 0 (o Valor definido inicialmente) e o comentário
criado também aparece na janela de propriedades (Figura 4.8).
Observe que as propriedades criadas pelo usuário são exibidas sempre no final
da lista e seu valor inicial é destacado em vermelho, ficando fácil para o
desenvolvedor a caracterização que esta propriedade foi customizada pelo
programador.

Dando seqüência ao objetivo proposto (mostrar a linha do registro corrente


em outra cor), programe o método AfterRowColChange do objeto
GRDTABPERF. Este método é executado toda vez que o usuário movimenta
seu curso de linha ou coluna dentro do Grid. Observe ao programar o método
que a primeira linha de código contém o comando: LPARAMETERS nColIndex.
Este comando indica que o VFP passa automaticamente o número da coluna
onde o usuário estava posicionado antes de mexer o cursor. Na tarefa proposta
esta informação não será usada.

1. LPARAMETERS nColIndex

2. ThisFormSet.registroatual = RECNO("TABPERF")
3. This.SetAll("DynamicBackColor","IIF(RECNO('TabPerf')
=ThisformSet.RegistroAtual,RGB(255,255,206),RGB(255,255,255))","Column")
4. This.Refresh

Salve o formulário e execute-o.

Setembro/2008 27
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 4.9 – Execução do formulário com linha de destaque no registro corrente.


Ao executar novamente o formulário perceba que o registro atual fica com
toda a linha em amarelo (Figura 4.9). Isto é resultado do código colocado no
evento AfterRowColChange do GRID. Toda a vez que o cursor muda de linha
ou coluna, todo o GRID é atualizado.
Na linha 2, através da função Recno(), a propriedade REGISTROATUAL
armazena o número do Registro físico atual.
Na linha 3, são executados os seguintes comandos:
1. This.SetAll(Propriedade,Valor,Objeto): O método SetAll, permite
modificar o valor de várias propriedades simultaneamente em tempo
de execução. Assim, estando dentro do GRID, SetAll vai modificar o
conteúdo da propriedade DynamicBackColor, para o valor do
segundo parâmetro de todos os objetos Tipo Column.
2. IIF(Condição,Verdadeiro,Falso): A função IIF é utilizada quando se
quer um valor condicional em apenas 1 linhas. Se a condição for
Verdadeira, assume-se o valor colocado no segundo parâmetro,
sendo falsa, assume o valor do terceiro parâmetro.
3. DynamicBackColor: Esta propriedade determina a cor de fundo da
coluna do GRID que pode ser alterada dinamicamente, isto é, em
tempo de execução.

O passo seguinte é adicionar os demais objetos para completar esta


manutenção de cadastro. O formulário final ficará conforme ilustra a Figura
4.10.

Setembro/2008 28
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 4.10 – Formulário de Manutenção de Cadastros na Tabela de Perfis com GRID.


Note que este formulário não contém os botões de navegação. A existência
de um GRID suprime a necessidade deste recurso, já que o GRID por si só, já
é uma navegação dentro do cadastro, com uma visão muito melhor que os
botões estudados anteriormente.
Observe também que foi incluído a este cadastro um OptionGroup para o
usuário determinar em qual ordem desejar visualizar os registros. Isto implicará
que a Tabela de Perfis tenha um índice por CÓDIGO, outro por NOME e outro
por VALOR DE COMPRA. Verifique na tabela TABPERFIL se estes índices
existem, e os crie se necessário for. Ainda neste exemplo os campos do
cadastro bem como os Botões de OK e CANCELA, ficam dentro de um
Container, isto facilitará o trabalho de habilitar e desabilitar os campos, que
serão feitos em bloco, isto é, trabalhando a propriedade habilitar e desabilitar
do CONTAINER.
Por fim, todos os BOTÕES e LABELS devem ser puxados da classe
PADROES_CURSO e os demais da classe STANDARD. Fazer este formulário
exercitará o processo de trocar constantemente a classe de origem dos
objetos.
A Tabela 4.1 é uma guia para a construção destes formulários. Ela traz os
objetos destacados na Figura 4.10 que identificados pela seqüência de letras
de a a o, mostrando as propriedades que devem ser modificadas, bem como o
código de programação a ser escrito para cada método.

Setembro/2008 29
VISUAL FOX PRO
INTERMEDIÁRIO
Objeto(Método/ Linhas de Código/Valor Obs;
Prop.)
Cria uma Sessão de Dados
Exclusivamente para o FormSet e
seus Formulários. Isto torna o
THISFORMSET
a 2 – Private DataSession programa mais seguro e também
(DATASESSION)
mais rápido. A conseqüência é que
a Sessão Privada perde todos os
parâmetros de ambiente.
Este programa refaz as
configurações de ambiente
THISFORMSET
Do Ambiente “perdidas” com a Sessão Privada.
(LOAD)
Adicione o arquivos
AMBIENTE.PRG ao projeto.
PARAMETERS pHab

* pHab: 1 - Habilita os Botões NOVO, ALTERAR e


EXCLUIR
* 0 - Desabilita os Botões NOVO, ALTERAR e
EXCLUIR

With ThisFormset.form1 Criar este método no FORMSET


THISFORMSET
.cmdnovo.enabled = (pHab = 1) que será responsável por
(HABBOTOESCO
.cmdalterar.enabled = (pHab = 1) AND habilitar/desabilitar os botões de
MANDO)
.CntDados.txtCodigo.Value > 0 comando conforme parâmetro
.cmdExcluir.enabled = (pHab = 1) AND
.CntDados.txtCodigo.Value > 0
.GrdTabPerf.Enabled = (pHab = 1)
.CntDados.Enabled = NOT (pHab = 1)
ENDWITH

RETURN
Chamada do Método de Habilitar
THISFORMSET
ThisFormSet.habbotoescomando(1) os botões de Comando ao Iniciar
(INIT)
o Formulário.
THISFORMSET Armazena o número do físico do Registro em que Criar esta Propriedade no
(REGISTROATUAL o usuário está posicionado. FORMSET.
ThisFormSet.habbotoescomando(0)
APPEND BLANK IN TabPerf
Replace VlrCompra WITH 0 IN TabPerf
CMDNOVO Deve ser herdado da classe
b WITH ThisForm.cntDados
(CLICK) PADROES_CURSO.
.txtCodigo.Enabled = .T.
.Refresh
.txtCodigo.SetFocus
ENDWITH
ThisFormSet.habbotoescomando(0)
WITH ThisForm.cntDados
CMDALTERAR .txtCodigo.Enabled = .F. Deve ser herdado da classe
c
(CLICK) .Refresh PADROES_CURSO.
.txtNome.SetFocus
ENDWITH
LOCAL oErr

IF MESSAGEBOX("Confirma a Exclusão deste Registro?",


4+32+256,"Perfis") = 6
CMDEXCLUIR Deve ser herdado da classe
d
(CLICK) DELETE IN TabPerf PADROES_CURSO.
= TABLEUPDATE(1,.t.,"TabPerf")

TRY

Setembro/2008 30
VISUAL FOX PRO
INTERMEDIÁRIO
SKIP IN TabPerf
CATCH TO oErr
IF oErr.ErrorNo = 1539

= MESSAGEBOX("Existem Vínculos para este


Registro!",16,"Exclusão Não Permitida!")

ELSE

= MESSAGEBOX(STR(oErr.ErrorNo,4) + " - " +


oErr.Message,16,"Falha na Exclusão!")

ENDIF
= TABLEREVERT(.T.,"TabPerf")
ENDTRY
ThisForm.grdTabperf.Refresh
Thisform.cntDados.Refresh
ThisFormSet.habbotoescomando(1)
ENDIF
PUBLIC gOrdem

WITH This.Parent.optOrdem
DO Case
CASE .Value = 1
gOrdem = "CÓDIGO"
CASE .Value = 2
gOrdem = "NOME" Deve ser herdado da classe
CMDRELATORIO
e CASE .Value = 3 PADROES_CURSO. A confecção
(CLICK)
gOrdem = "VALOR MÉDIO DE COMPRAS" do Report, veremos à seguir.
ENDCASE
ENDWITH

REPORT FORM RptPerfil NOCONSOLE TO


PRINTER PREVIEW

RELEASE gOrdem
Deve ser herdado da classe
f LABEL (CAPTION) ORDEM
PADROES_CURSO.
SELECT TABPERF
DO Case
CASE This.Value = 1 Construa as opções conforme
SET ORDER TO CODIGO indicada na figura. O Código no
OPTORDEM CASE This.Value = 2 método Valid, tem por objetivo
g
(VALID) SET ORDER TO NOME determinar a ordem das
CASE This.Value = 3 informações apresentadas no
SET ORDER TO VLRCOMPRA GRID.
ENDCASE
This.Parent.grdTabperf.Refresh
Container onde estarão contidos
BackStyle = 0 – Transparente
h CNTDADOS os objetos relacionados aos
SpeciallEffetc = 1 - Sunken
dados da tabela.
ControlSource = TabPerf.Codigo Pode ser ‘arrastado” do
i TXTCODIGO
InputMask = 99 Dataenvironment.
IF This.Value < 0

= MESSAGEBOX("O Código deve ser um Valor


TXTCODIGO Deve estar contido em
POSITIVO!",16,"Valor Inválido!")
(VALID) CNTDADOS.
RETURN 0
ENDIF
Pode ser ‘arrastado” do
ControlSource = TabPerf.Nome
j TXTNOME Dataenvironment e deve estar
MaxLenght = 40
contido em CNTDADOS.

Setembro/2008 31
VISUAL FOX PRO
INTERMEDIÁRIO
ControlSource = TabPerf.VlrCompra Pode ser ‘arrastado” do
k TXTVLRCOMPRA
InputMask = 9999,999.99 Dataenvironment.
IF This.Value < 0

= MESSAGEBOX("Este Valor NÃO PODE SER


TXTVLRCOMPRA Deve estar contido em
NEGATIVO!!!",16,"Valor Inválido!")
(VALID) CNTDADOS.
RETURN 0
ENDIF
LOCAL nRegistro, nFalha, cMsgErro, nCodigo, cNome

*** Verificar se os campos estão consistentes **


WITH Thisform.cntDados
IF .txtCodigo.Value <= 0
= MESSAGEBOX("Código do Perfil INVÁLIDO!",
16,"Dados Inválidos!")
.txtCodigo.SetFocus()
RETURN
ENDIF

IF EMPTY(.txtNome.Value)
= MESSAGEBOX("Nome do Perfil NÃO
INFORMADO!",16,"Dados Inválidos!")
.txtNome.SetFocus()
RETURN
ENDIF

IF .txtVlrcompra.Value < 0
= MESSAGEBOX("Valor de Compra não pode Ser
Negativo!",16,"Dados Inválidos!")
.txtVlrcompra.SetFocus()
RETURN
ENDIF
ENDWITH
*************************************************
**
Dever ser herdado da classe
= TABLEUPDATE( 1, .T., "TabPerf" )
l CMDOK (CLICK) nRegistro = RECNO("TabPerf")
PADROES_CURSO e estar
nFalha = 0 contido em CNTDADOS.

TRY
GO TOP
CATCH TO oErr
nFalha = 1
= TABLEREVERT(.T.,"TabPerf")
IF oErr.ErrorNo = 1884

**** Verificar se não é uma nova inclusão de um


Registro DELETADO ***
nCodigo = ThisForm.cntDados.txtCodigo.Value
cNome = ThisForm.cntDados.txtNome.Value
nVlrCompra = ThisForm.cntDados.txtVlrcompra.Value
SET DELETED OFF
IF SEEK( nCodigo, "TABPERF", "CODIGO")
IF DELETED()
RECALL IN Tabperf
Replace Nome WITH cNome IN TabPerf
Replace VlrCompra WITH nVlrCompra IN TabPerf
= TABLEUPDATE(1,.T.,"TabPerf")
nFalha = 0
nRegistro = RECNO("TabPerf")
ENDIF
ENDIF
SET DELETED ON
IF nFalha = 1
*** Duplicidade de Chave Primária ***

Setembro/2008 32
VISUAL FOX PRO
INTERMEDIÁRIO
APPEND BLANK IN TabPerf
cMsgErro = "Código de Perfil Já Cadastrado!"
ENDIF
ELSE
cMsgErro = "Erro na Gravação dos Dados: " +
ALLTRIM(STR(oErr.ErrorNo)) + " - " + oErr.Message
ENDIF
IF nFalha = 1
= MESSAGEBOX(cMsgErro,16,"Dados Não
Gravados!")
ENDIF
ENDTRY

ThisForm.cntDados.Refresh
Thisform.grdTabperf.Refresh

IF nFalha = 0
GO nRegistro
ThisForm.cntDados.txtCodigo.Enabled = .F.
ThisFormSet.habbotoescomando(1)
ENDIF
= TABLEREVERT(.T.,"TabPerf")
ThisForm.cntDados.txtCodigo.Enabled = .F.
IF Thisformset.registroatual > 0
GO Thisformset.registroatual IN TabPerf
ThisFormSet.form1.grdTabperf.SetFocus() Dever ser herdado da classe
CMDCANCELA
m ELSE PADROES_CURSO e estar
(CLICK) ThisFormSet.form1.cmdnovo.SetFocus() contido em CNTDADOS
ENDIF
ThisForm.cntDados.Refresh
Thisform.grdTabperf.Refresh
ThisFormSet.habbotoescomando(1)
LPARAMETERS nColIndex

ThisFormSet.registroatual = RECNO("TABPERF")
Este método permite “colorir” o
GRDTABPERF
This.SetAll("DynamicBackColor","IIF(RECNO('TabP registro atual e atualizar estas
n (AFTERROWCOL
erf')=ThisformSet.RegistroAtual,RGB(255,255,206),R informações nos objetos da
CHANGE)
GB(255,255,255))","Column") CNTDADOS.

This.Refresh
This.Parent.cntDados.Refresh
Labels com os títulos dos campos CÓDIGO, NOME e Deve ser herdado da classe
o LABEL (CAPTION)
VALOR MÉDIO DE COMPRAS. PADROES_CURSO.
Tabela 4.1 – Objetos a da Tabela de Manutenção do Cadastro de Perfis, com seus respectivos
métodos e linhas de código que devem ser modificados.
Para a conclusão deste pequeno cadastro falta o Report. Crie-o com o
nome de RPTPERFIL salvando na pasta C:\TRABALHO\RELATORIOS.
A criação do formulário ficará conforme ilustra a Figura 4.11.

Setembro/2008 33
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 4.11 – Criação do REPORT da Tabela de Perfis.

Neste Report atente para o subtítulo que trará a informação da ordem de


impressão dos dados. Esta informação é captada através da variável pública
gOrdem no evento Click do Botão CMDRELATÓRIO (Tabela 4.1, item e).
Como esta informação é variada, o campo de dados foi esticado para pegar
todo o corpo do relatório e o formato da informação foi configurado como
centralizado nas propriedades do campo, conforme ilustra a Figura 4.12.

Figura 4.12 – Centralizando um campo dentro do Objeto do Report. Configura-se na aba


Format das propriedades do objeto.
Ainda neste caso não foi utilizado o DataEnvironment do Report. Isto
implica que a mesma Sessão de Dados do Formulário será aproveitada. O

Setembro/2008 34
VISUAL FOX PRO
INTERMEDIÁRIO
fundo cinza colocado na linha de detalhe é feito através do objeto Rectangle da
barra de ferramentas, conforme ilustra a Figura 4.13.

Figura 4.13 – O objeto em destaque deve ser o selecionado para fazer o retângulo de
fundo na linha de detalhe.
Para obter o efeito esperado, devem ser modificadas mais duas
propriedades deste objeto (Figura 4.14).

Figura 4.14 – Configurações de Propriedades do Retângulo.


Na Área onde está Color, devem ser desmarcados os itens Use default
foreground (pen) color e use default backgound (fill) color. O primeiro refere-se
a cor da borda do retângulo e o segundo a cor de preenchimento do retângulo.
Ao desmarcar estas opções, o botão para selecionar a cor que deseja para as
duas propriedades estará habilitado. Para a primeira opção escolha a cor
branca (para dar o efeito de sem borda) e para a segunda uma tonalidade de
cinza claro. Certifique-se também que a propriedade BackStyle fique
configurada como Opaque.
Para totalizar o número de perfis, faz-se necessário criar uma variável no
Report, de nome RPTTOTPERFIS, conforme ilustra a Figura 4.15.

Setembro/2008 35
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 4.15 – Parâmetros da variável RPTTOTPERFIS, utilizada para demonstrar a


quantidade total de Perfis Listados.
Utilizando-se desta variável, crie um pequeno efeito na linha de detalhe
para que ela alterne uma linha com fundo cinza e outra linha com fundo branco.
Para isto deve-se mexer na aba Print When da janela de propriedades do
objeto retângulo na linha de detalhe.

Figura 4.16 – Expressão Condicional do retângulo da linha de detalhe.


O campo destacado pela Figura 4.16 (Print only when expression is true –
Imprimir somente quando a expressão for verdadeira) determina que os dados
referente ao objeto serão impressos somente se a expressão colocada for
verdadeira. A expressão colocada foi:

Mod( RptTotPerfis, 2 ) = 1

Setembro/2008 36
VISUAL FOX PRO
INTERMEDIÁRIO
A Função Mod ( Arg1, Arg2 ) retorna o resto da divisão de ARG1 por ARG2.
Neste caso é utilizado o resto da divisão da variável RPTTOTPERFIS por 2.
Isto significa que somente será impresso o fundo cinza quando
RPTTOTPERFIS for um número ímpar.
Por fim, o retângulo cinza que destaca o total de registros listados não terá
esta expressão condicional. Pode ocorrer que ao colocar o retângulo cinza, ele
fique sobre a Label e a caixa de texto. Se isto ocorrer, selecione o retângulo e
click na ferramenta Send to Back da LayOutToolBar, ilustrada pela Figura 4.17.

Figura 4.17 – Ferramenta que permite jogar informações para trás.

Setembro/2008 37
VISUAL FOX PRO
INTERMEDIÁRIO

A Figura 4.18 ilustra o resultado do Report.

Figura 4.18 – Resultado da execução do Relatório de Perfis.

EXERCÍCIO 02

Crie o formulário de manutenção no cadastro de Profissões, seguindo os


mesmos padrões do cadastro de perfis, com as seguintes considerações:
 Certifique-se que a Tabela TABPROF tem um índice por Nome.
 No Botão de Relatórios deverá ser chamado outro formulário dando ao
usuário da Opção de emitir o relatório em tela ou na impressora.
 Enquanto este outro formulário é executado, o formulário do cadastro
não pode ser acionado pelo usuário.
 No REPORT de profissões o fundo cinza da linha de detalhe deverá ficar
nas linhas pares, ao invés das linhas ímpares, como ficou no REPORT
de perfis.

Setembro/2008 38
VISUAL FOX PRO
INTERMEDIÁRIO

5. MERGULHANDO NA OOP
As vantagens que a utilização de classes pode trazer são inúmeras. É
possível fazer muito mais com as classes, desde que sejam respeitados os
padrões na hora de construir um aplicativo. Foi a padronização e
compatibilidade um dos fatores que permitiram a grande evolução da
informática nos últimos 30 anos. Logo de início, toda vez que se criava um
modelo novo de computador, todos os programas precisavam ser reescritos.
Depois, com a utilização de padrões, isto não foi mais necessário, e o resultado
foi esta grande evolução da qual todos somos testemunhas.
Uma boa prática de programação orientada a objeto é criar uma instância
para cada tipo de objeto primário. Crie na biblioteca de classes
PADROES_CURSO uma classe de nome COMBOBOX_PADRAO, baseada
em uma combobox. A classe será salva sem modificar inicialmente nenhum
padrão herdado da classe standard do VFP. E daí por diante, todos os objetos
combobox que utilizados serão herdados desta classe, procurando manter
sempre os mesmos padrões. Quando for necessário remodelar o projeto, basta
mexer na classe.
Adicione então as seguintes classes:
 COMBOBOX_PADRAO herdado de Combobox;
 CONTAINER_PADRAO herdado de Container;
 EDITBOX_PADRAO herdado de EditBox;
 CHECKBOX_PADRAO herdado de CheckBox;
 GRID_PADRAO herdado de Grid;
 IMAGE_PADRAO herdado de Image;
 LISTBOX_PADRAO herdado de Listbox;
 OPTINGROUP_PADRAO herdado de OptionGroup;

Estes são inicialmente os objetos que mais interessam. Se no futuro houver


necessidade, basta criar outras classes.
O objetivo agora será construir uma classe para efetuar a manutenção de
um cadastro simples, que exija apenas uma tabela, como foi o caso dos
cadastros de Perfis e Profissões. A estratégia para a criação desta classe pode
ser resumida na seguinte afirmação: Coloca-se na classe o que for comum
para todas as tabelas e o que for específico será programado na instância.

Inicie este processo criando uma nova classe de nome


CADASTRO_SIMPLES. Esta classe será herdada da classe FRS_PADRAO
que é herdada da classe Standard FORMSET.

Figura 5.1 – Criação da Classe CADASTRO_SIMPLES

Setembro/2008 39
VISUAL FOX PRO
INTERMEDIÁRIO
Como esta classe não será herdada da Standard, será preciso acionar o
botão destacado na Figura 5.1 para escolher a classe da qual será feita a
herança.

Figura 5.2 – Selecionando a Classe Pai


Localize o diretório CLASSES, depois clique sobre a biblioteca onde está
nossa classe (padroes_curso.vcx). Feito isto, será listado à direita todas as
classes ali armazenadas (Figura 5.2). Clique com o mouse sobre a classe
FRS_PADRAO e depois acione o botão Open.

Figura 5.3 – Determinando a Biblioteca de classes para Armazenamento.


Por uma simples questão de organização, grave esta classe em outra
biblioteca, de nome CADASTROS.VCX na mesma pasta CLASSES, conforme
ilustra a Figura 5.3. Observe ainda nesta mesma figura, que ao lado de From é
mostrado o nome do arquivo de biblioteca da quase onde herdados. Este
espaço fica em branco quando a herança é feita da classe Standard.
Assim uma classe não precisa ser obrigatoriamente “filha” da classe
Standard. Ela pode ser “neta”, “bisneta”, “tataraneta”, ..., sem um limite
específico.
Converta o formulário em um FormSet da classe FRS_PADRAO,
adicionando nele os seguintes objetos:
• GRID_PADRAO (GrdTabela); modificando as seguintes
propriedades:
o DeleteMark = Falso;
o ReadOnly = Verdadeiro;
o RecordMark = Falso;
o SplitBar = Falso;
o Themes = Falso.

Setembro/2008 40
VISUAL FOX PRO
INTERMEDIÁRIO
• CONTAINER_PADRAO (CntDados); modificando as seguintes
propriedades:
o BackStyle = 0 - Transparente;
o SpeciallEffect = 1 – Afundada (Sunken).
• CMDOK_PADRAO (CmdOk): contido em CONTAINER_PADRAO.
• CMDCANC_PADRAO (CmdCancela): contido em
CONTAINER_PADRAO.
• CMDNOVO_PADRAO (CmdNovo).
• CMDALTERAR_PADRAO (CmdAlterar).
• CMDEXCLUIR_PADRAO (CmdExcluir).
• CMDRELATORIO_PADRAO (CmdRelatorio).

Configure o FormSet para trabalhar com uma sessão privada de dados,


modificando a propriedade DataSession para 2 – Private DataSession. No
Formulário (Form1), deixe sempre a tela principal centralizada, configurando a
propriedade AutoCenter = Verdadeiro.

Figura 5.4 – Leiaute do Formulário Principal da Classe CADASTRO_SIMPLES.


A Figura 5.4 ilustra como fica inicialmente a disposição destes objetos na
tela. À partir de agora, a tarefa é programar este formulário a fim de que
execute ações padrões para qualquer tipo de cadastro. Isto demandará um
esforço maior na programação dos objetos, mas economizará um esforço
significativo na hora da criação do cadastro específico. A classe será criada
uma única vez (grade esforço), mas serão criados cadastros inúmeras vezes
(pequeno esforço).
Será necessário a criação das seguintes propriedades dentro do FormSet:
• ARRCAMPOSMANUTENCAO[1,5]: Matriz com os dados para
configuração do Grid. Valor Inicial: FALSO.

Setembro/2008 41
VISUAL FOX PRO
INTERMEDIÁRIO
• NOMEREPORT: Armazena o nome do relatório que será chamado
pelo botão. Valor Inicial: STRING VAZIA (“”).
• REGISTROATUAL: Armazena o número físico do Registro Atual
( RECNO() ) para tratamento de linha em destaque no GRID. Valor
Inicial: ZERO.
• TABELAMANUTENCAO: Esta propriedade armazena o nome da
Tabela que sofrerá manutenção da classe. Valor Inicial: STRING
VAZIA (“”).
• TABELAVAZIA. Esta Propriedade assume 0 ou 1 se a tabela está
vazia. Valor Inicial: ZERO.

Agora é momento de programar os métodos e eventos dos objetos desta


classe.

FORMSET.LOAD
DO Ambiente

FORMSET.INIT
LOCAL cTabManut

ThisFormSet.configuracampos
ThisformSet.configuragrid

cTabManut = ThisFormSet.tabelamanutencao

ThisFormSet.habbotoescomando(1)

IF EMPTY(ThisFormSet.nomereport)
ThisFormSet.form1.cmdRelatorio.Visible = .F.
ENDIF

SELECT &cTabManut.
GO TOP
IF EOF()
ThisFormSet.tabelavazia = 1
ELSE
ThisFormSet.tabelavazia = 0
ThisFormSet.registroatual = RECNO(cTabManut)
ThisFormSet.form1.grdTabela.SetFocus()
ENDIF
CONFIGURACAMPOS e CONFIGURAGRID são dois métodos a serem
criados no FORMSET, que serão descritos em seguida. Adoto-se aqui o
princípio de que nem sempre será necessária a criação de um Report. Assim,
se na classe for omitido o nome do Report, o botão ficará invisível para que não
fique um objeto em função na tela e confunda o usuário final.
Uma expressão nova apresentada aqui é a variável CTABMANUT
precedida pelo símbolo & (“e” comercial) e seguida pelo ponto (.), sendo
apresentada como &CTABMANUT. . A utilização deste recurso é chamada de
MACRO DE SUBSTITUIÇÃO. Quando o VFP encontra uma expressão dentro

Setembro/2008 42
VISUAL FOX PRO
INTERMEDIÁRIO
de uma macro de substituição (precedida pelo & e seguida de ponto), ele
substitui na execução do comando a expressão dentro da macro pelo conteúdo
da variável de mesmo nome. Assim em SELECT &cTabManut., se cTabManu =
TABPROF, o comando a ser executado pelo VFP será SELECT TABPROF. A
macro de substituição é um recurso muito utilizado em programação VFP,
permitindo muita flexibilidade aos aplicativos.

FORMSET.CONFIGURACAMPOS.
Método a ser criado: Método para utilização na instância da classe, onde é
preenchida a Matriz ArrCamposManutencao para Configurar os Campos
Exibidos no GRID.
A Função deste método é o preenchimento da Matriz
ARRCAMPOSMANUTENCAO com informações na instância da Classe. A
técnica utilizada aqui na criação desta classe é que, informações que são
específicas de cada cadastro, devem ser informadas na instância da classe. A
classe prevê apenas a existência e execução do método ou propriedade, mas o
seu conteúdo será programado na criação do cadastro específico. No caso
deste método, é aconselhável manter no código, apenas o comentário
discriminado abaixo.
** Aqui Declara-se a Matriz ThisformSet.arrcamposmanutencao[n,5]
** onde [n,1] = Nome do Campo
** [n,2] = Título do Campo
** [n,3] = Máscara de Edição
** [n,4] = Valor "Zero" do Campo
** [n,5] = Tamanho de Caracteres a Ser ocupado no GRID

FORMSET.CONFIGURAGRID.
Método a ser criado: Método que configura o GRID a ser apresentado.
LOCAL nTotColunas, k_Cnt, cObjeto, nFator

nFator = 10 && Estimativa de Quantos Pixels por Caracter


nTotColunas = ALEN(ThisFormSet.arrcamposmanutencao,1)

WITH ThisFormset.Form1.GrdTabela
.RecordSource = ThisFormSet.tabelamanutencao
.ColumnCount = nTotColunas
FOR k_Cnt = 1 TO nTotColunas
cObjeto = ".Column" + ALLTRIM(STR(k_Cnt))
WITH &cObjeto.
.ControlSource = ThisformSet.arrcamposmanutencao[k_Cnt,1]
.InputMask = ThisFormSet.arrcamposmanutencao[k_Cnt,3]
.Width = ThisFormSet.arrcamposmanutencao[k_Cnt,5]*nFator
WITH .Header1
.Alignment = 2
.BackColor = RGB(0,128,192)
.Caption = ThisFormSet.arrcamposmanutencao[k_Cnt,2]
.FontBold = .T.
.ForeColor = RGB(255,255,255)

Setembro/2008 43
VISUAL FOX PRO
INTERMEDIÁRIO
ENDWITH
.Text1.InputMask = ThisFormSet.arrcamposmanutencao[k_Cnt,3]
ENDWITH

NEXT
.Refresh
ENDWITH
A função desta propriedade é configurar em tempo de execução um GRID.
Todo aquele esforço executado na construção Gráfica dos outros GRIDs, aqui
será feito através de programação.

FORMSET.FOCOMANUTENCAO
Método a ser criado: Este método coloca o Foco no objeto desejado,
conforme parâmetro que indica se é na inclusão ou alteração.
PARAMETERS pIdFoco

* pIdFoco: I - Inclusão
* A – Alteração
Trata-se de mais um método que deverá ser programado na instância da
classe. Este método tem por função determinar qual será o objeto que primeiro
vai receber o foco, conforme a operação de inclusão ou alteração. Esta
informação é passada como parâmetro. Na classe, será programado apenas o
recebimento do parâmetro e inserido um comentário para auxiliar o
programador da classe.

FORMSET.HABBOTOESCOMANDO.
Método a ser criado: Trata o estado habilitado/desabilitado dos objetos do
form, conforme parâmetro recebido.
PARAMETERS pHab

* pHab: 1 - Habilita os Botões NOVO, ALTERAR e EXCLUIR


* 0 - Desabilita os Botões NOVO, ALTERAR e EXCLUIR

With ThisFormset.form1
.cmdnovo.enabled = (pHab = 1)
.cmdalterar.enabled = (pHab = 1) AND ThisFormSet.tabelavazia = 0
.cmdExcluir.enabled = (pHab = 1) AND ThisFormSet.tabelavazia = 0
.GrdTabela.Enabled = (pHab = 1)
WITH .CntDados
.Enabled = NOT (pHab = 1)
.SetAll("Enabled",NOT (pHab = 1),"CheckBox_padrao")
.SetAll("Enabled",NOT (pHab = 1),"Combobox_padrao")
.SetAll("Enabled",NOT (pHab = 1),"Editbox_padrao")
.SetAll("Enabled",NOT (pHab = 1),"OptionGroup_padrao")
.SetAll("Enabled",NOT (pHab = 1),"Spinner_padrao")
.SetAll("Enabled",NOT (pHab = 1),"textbox_padrao")

ENDWITH

Setembro/2008 44
VISUAL FOX PRO
INTERMEDIÁRIO

ENDWITH

RETURN

Este método terá por função habilitar e desabilitar os botões de comando.


Nos cadastros feitos anteriormente foi adotada a estratégia de colocar todos os
objetos que se referem os dados do cadastro dentro de um Container
(CNTDADOS). Assim, bastava habilitar ou desabilitar o Container, para permitir
ou restringir o acesso de digitação nestes objetos. Esta estratégia funciona
como já visto nos outros cadastros porém, quando os controles não estão
habilitados, eles ficam com a mesma aparência de habilitados, podendo causar
um desconforto ao usuário final de nosso aplicativo.
A estratégia adotada aqui nesta classe permite habilitar ou desabilitar todos
os controles contidos no Container CNTDADOS, sem necessariamente saber o
nome do objeto. Para isto, faz-se uso do método SetAll.

Objeto.SetAll(“Propriedade”, Valor, “Classe”)

Fica mais fácil visualizar quando é utilizado um exemplo concreto, como


segue:

ThisFormSet.Form1.CntDados.SetAll("Enabled",.F,"CheckBox_padrao")

O Comando abaixo vai modificar a propriedade de Enabled para Falso, de


todos os objetos contidos em CNTDADOS que forem herdados da classe
CHECKBOX_PADRAO. O VFP não acusará nenhum erro caso não exista
nenhum objeto pertencente a classe indicada, o VFP apenas não fará nada
neste tipo de situação.
Este tipo de estratégia dá muita flexibilidade na programação. Isto permite a
modificação de vários objetos em massa, simplesmente pelo fato de serem
herdados da mesma classe. Isto também implica numa disciplina à
padronização adotada.
Como conseqüência da programação deste método, adote que os objetos
que forem responsáveis por conter os dados da manutenção do cadastro
deverão pertencer às seguintes classes: CHECKBOX_PADRAO,
COMBOBOX_PADRAO, EDITBOX_PADRAO, OPTINGROUP_PADRAO,
SPINNER_PADRAO ou TEXTBOX_PADRAO.

FORMSET.DESABILITACAMPOSCHAVE.
Método a ser criado: Este método deve ser utilizado na instância da classe
para desabilitar os campos que compõem a chave primária na operação de
alteração de dados.

FORMSET.FOCOMANUTENCAO.
Método a ser criado: Este método coloca o Foco no objeto desejado,
conforme parâmetro que indica se é na inclusão ou alteração.

Setembro/2008 45
VISUAL FOX PRO
INTERMEDIÁRIO

FORMSET.VALIDACAMPOS.
Método a ser criado: Método responsável por validar se os campos
digitados pelo usuário são consistentes, retornando VERDADEIRO ou FALSO.
Deve ser programado na instância da classe.

FORMSET.VALIDAREINCLUSAO.
Método a ser criado: Este método tem por finalidade avaliar se trata-se de
uma "reinclusão" de registro anteriormente excluído, retornando VERDADEIRO
ou FALSO. Deve ser programado na instância da classe.

GRDTABELA.AFTERROWCOLCHANGE.
LPARAMETERS nColIndex
LOCAL cTabManut
cTabManut = ThisFormSet.tabelamanutencao
ThisFormSet.registroatual = RECNO(cTabManut)

This.SetAll("DynamicBackColor","IIF(RECNO('" + cTabManut + "') =


ThisformSet.RegistroAtual,RGB(255,255,206),RGB(255,255,255))","Column")

This.Refresh
ThisForm.CntDados.Refresh

CMDNOVO.CLICK.
LOCAL cTabManut
cTabManut = ThisFormSet.tabelamanutencao
ThisFormSet.habbotoescomando(0)
APPEND BLANK IN &cTabManut.
ThisForm.cntDados.Refresh
ThisFormSet.focomanutencao("I")

CMDALTERAR.CLICK.
ThisFormSet.habbotoescomando(0)
ThisForm.cntDados.Refresh
ThisformSet.desabilitacamposchave()
ThisFormSet.focomanutencao("A")

CMDEXLCUIR.CLICK.
LOCAL oErr, cTabManut, lErroExclusao
cTabManut = ThisformSet.tabelamanutencao

Setembro/2008 46
VISUAL FOX PRO
INTERMEDIÁRIO
IF MESSAGEBOX("Confirma a Exclusão deste Registro?" ,4+32+256,
Thisform.Caption) = 6

DELETE IN &cTabManut.
= TABLEUPDATE(1,.t.,cTabManut)
lErroExclusao = .F.
TRY
SKIP IN &cTabManut.
CATCH TO oErr
IF oErr.ErrorNo = 1539

= MESSAGEBOX("Existem Vínculos para este Registro!",16,"Exclusão


Não Permitida!")

ELSE

= MESSAGEBOX(STR(oErr.ErrorNo,4) + " - " + oErr.Message,


16,"Falha na Exclusão!")

ENDIF
= TABLEREVERT(.T.,cTabManut)
lErroExclusao = .T.
ENDTRY
IF .Not. lErroExclusao
IF EOF(cTabManut)
GO TOP IN &cTabManut.
IF EOF(cTabManut)
ThisFormSet.tabelavazia = 1
ENDIF
ENDIF
ENDIF
ThisForm.grdTabela.Refresh
Thisform.cntDados.Refresh
ThisFormSet.habbotoescomando(1)
ENDIF

CMDOK.CLICK
LOCAL nRegistro, nFalha, cMsgErro, nCodigo, cNome, cTabManut
IF .Not. ThisFormSet.validacampos()
RETURN
ENDIF
cTabManut = ThisFormSet.tabelamanutencao
= TABLEUPDATE( 1, .T., cTabManut )
nRegistro = RECNO(cTabManut)
nFalha = 0
TRY
GO TOP
CATCH TO oErr
nFalha = 1

Setembro/2008 47
VISUAL FOX PRO
INTERMEDIÁRIO
= TABLEREVERT(.T.,cTabManut)
IF oErr.ErrorNo = 1884
**** Verificar se não é uma nova inclusão de um Registro DELETADO
***
IF ThisFormSet.validareinclusao()
nFalha = 0
nRegistro = RECNO(cTabManut)
ENDIF
IF nFalha = 1
*** Duplicidade de Chave Primária ***
APPEND BLANK IN &cTabManut.
cMsgErro = "Registro Já Cadastrado!"
ENDIF
ELSE

cMsgErro = "Erro na Gravação dos Dados: " +


ALLTRIM(STR(oErr.ErrorNo)) + " - " + oErr.Message

ENDIF
IF nFalha = 1
= MESSAGEBOX(cMsgErro,16,"Dados Não Gravados!")
ENDIF
ENDTRY

IF nFalha = 0
ThisFormSet.tabelavazia = 0
GO nRegistro IN &cTabManut.
ThisFormSet.habbotoescomando(1)
ENDIF

ThisForm.cntDados.Refresh
ThisForm.grdTabela.Refresh
Observe que neste método o código valida o retorno do método
VALIDACAMPOS. Assim, na instância desta classe, este método deverá ser
programado retornando VERDADEIRO se os dados digitados foram
consistentes, ou FALSO caso contrário.

CMDCANCELA.CLICK.
LOCAL cTabManut
cTabManut = ThisFormSet.tabelamanutencao
= TABLEREVERT(.T.,cTabManut)
IF Thisformset.tabelavazia = 0
GO Thisformset.registroatual IN &cTabManut.
ThisFormSet.form1.grdTabela.SetFocus()
ELSE
ThisFormSet.form1.cmdnovo.SetFocus()
ENDIF
ThisForm.cntDados.Refresh
Thisform.grdTabela.Refresh

Setembro/2008 48
VISUAL FOX PRO
INTERMEDIÁRIO
ThisFormSet.habbotoescomando(1)

Falta ainda o botão de Relatório. Para isto, adicione um novo formulário


(FrmReport), que terá por função pedir ao usuário que escolha se quer a
emissão do relatório em tela ou impressora. Após adicionar o formulário,
modifique as seguintes propriedades:
• AlwaysOnTop = VERDADEIRO;
• AutoCenter = VERDADEIRO;
• BorderStyle = 1 – Simples Fixada (Fixed Single);
• Caption = Emissão de Relatório;
• CloseAble = FALSO;
• Icon = Coloque arquivo de ícone de sua preferência;
• MaxButton = FALSO;
• MinButton = FALSO;
• MovAble = FALSO;
• Name = FRMREPORT;
• Picture = Coloque arquivo de imagem de sua preferência;
• Themes = FALSO;
• Visible = FALSO.

Acrescente neste formulário os botões cmdMonitor, cmdImpressora e


CmdCancRelatorio da Classe Padrão (Standard) , conforme ilustra a Figura
5.5.

Figura 5.5 – Visual do Formulário para Emissão do Relatório.


Estes botões devem ser programados da forma como descrita à seguir:

CMDMONITOR.CLICK.
LOCAL cReport
cReport = ThisFormSet.nomereport
Thisform.AlwaysOnTop = .F.
REPORT FORM &cReport. NOCONSOLE TO PRINTER PREVIEW
Thisform.AlwaysOnTop = .T.

CMDIMPRESSORA.CLICK.
LOCAL cReport
cReport = ThisFormSet.nomereport
Thisform.AlwaysOnTop = .F.

Setembro/2008 49
VISUAL FOX PRO
INTERMEDIÁRIO
REPORT FORM &cReport. NOCONSOLE TO PRINTER PROMPT
Thisform.AlwaysOnTop = .T.

CMDCANCRELATORIO.CLICK.
ThisForm.Visible = .F.
ThisFormSet.Form1.Enabled = .T.

Para finalizar a classe, faltou o código do botão relatório, do formulário


Principal.

CMDRELATORIO.CLICK.
ThisForm.Enabled = .F.
Thisformset.frmReport.Visible = .T.

Conclui-se aqui o desenvolvimento da classe de Cadastros padrões. Todo


este código que aqui foi desenvolvido somente o será feito desta vez. Agora
trabalhe a criação de um cadastro específico baseado nesta classe, que será o
Cadastro de Clientes.
Crie um novo Formulário salvando-o com o nome FRMPROFISSAO na
pasta C:\TRABALHO\FORMULARIO. Na Barra de Ferramentas adicione a
biblioteca CADASTROS.VCX, tornado-a padrão e puxe para o formulário a
classe CADASTROS_SIMPLES (que é a única classe desta biblioteca). Note
que todos os objetos que acabaram de ser construídos já estão no formulário.
Na propriedade Caption do Formulário Principal (FORM1), indique o título
do cadastro como: Cadastro de Clientes.
No DataEnvironment é preciso inserir a Tabela CADCLI. Neste caso,
também é preciso inserir as Tabelas TABPERF e TABPROF, pois no cadastro
de clientes é preciso indicar a profissão e perfil do mesmo. Nas 3 Tabelas
modifique a propriedade BufferModeOverride para 3 – Buffer de Linha Otimista.
Nas Tabelas TABPERF e TABPROF configure a propriedade Order para o
Índice por Nome, para que ao selecionar a profissão e perfil, estas opções
venham em ordem alfabética.
Agora, adicione dentro do CNTDADOS, todos os campos necessários para
efetuar a manutenção. Neste caso, não se pode simplesmente arrastar o
campos do DataEnvironment, pois ao fazê-lo, este recurso cria os objetos com
a classe Standard e, lembre-se que foi programado acima a classe, prevendo
que estes objetos façam parte da própria classe.

Objeto Classe Propriedades


ControlSource = CadCli.Codigo
txtCodigo TEXTBOX_PADRAO
InputMask = 9999
ControlSource = CadCli.Nome
txtNome TEXTBOX_PADRAO Format = K!
MaxLenght = 60
ControlSource = CadCli.CPF
TxtCPF TEXTBOX_PADRAO Format = R
InputMask = 999,999,999-99
OptSexo OPTIONGROUP_PADRAO ControlSource = CadCli.Sexo
txtDtNasc TEXTBOX_PADRAO ControlSource = CadCli.DtNasc

Setembro/2008 50
VISUAL FOX PRO
INTERMEDIÁRIO
OptEstCivil OPTIONGROUP_PADRAO ControlSource = CadCli.EstCivil
cboCodPerf COMBOBOX_PADRAO ControlSource = CadCli.CodPerfil
cboCodProf COMBOBOX_PADRAO ControlSource = CadCli.CodProf
ControlSource =
CadCli.Endereco
txtEndereco TEXTBOX_PADRAO
Format = K!
MaxLenght = 60
ControlSource = CadCli.Bairro
txtBairro TEXTBOX_PADRAO Format = K!
MaxLenght = 40
ControlSource = CadCli.Cidade
txtCidade TEXTBOX_PADRAO Format = K!
MaxLenght = 40
ControlSource = CadCli.uf
TxtUF TEXTBOX_PADRAO Format = K!
MaxLenght = 2
Tabela 5.1 – Objetos com tratamento de dados a serem inseridos para o Cadastro de
Clientes.

Figura 5.6 – Formulário de Cadastro de Clientes em tempo de Projeto.


A Tabela 5.1 determina os objetos que deverão ser colocados dentro de
CNTDADOS com suas classes “Pai” e as propriedades que devem ser
modificadas. Nesta tabela não são mencionadas as Labels, que também
devem ser inseridas dentro de CNTDADOS para identificarem os campos. As
Labels até podem ser herdadas da Classe Standard sem causar nenhum
problema para a execução do formulário, pois estes objetos são apenas para
exibição de informação, mas para que seja criado o hábito de respeitar
padrões, herde as labels da classe LABEL_PADRAO, pois já é possível
configurar esta Label, com tamanho, cor e tipo de fonte desejados, conforme a

Setembro/2008 51
VISUAL FOX PRO
INTERMEDIÁRIO
padronização do aplicativo. A Figura 5.6 ilustra fomo fica o formulário de
Cadastro de Clientes após a inserção destes objetos dentro da CNTDADOS.
Abaixo, uma melhor explicação quanto a adição de objetos baseados no
OPTGROUP_PADRAO (Estado Civil e Sexo) e COMBOBOX_PADRAO (Perfil
e Profissão). Em ambos os casos utiliza-se o Construtor do Objeto. Após
arrastar o objeto dentro do formulário e dar-lhe o nome, clique sobre ele com o
botão direito e acione a opção Builder do menu suspenso, conforme ilustra a
Figura 5.7.

Figura 5.7 – Acionando o Construtor (Builder) de um Objeto.

Figura 5.8a – Construtor OptionGroup (1.Buttons): Número e Dizeres das opções.

Setembro/2008 52
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 5.8b – Construtor Option Group (2.LayOut): Parâmetro de Leiaute.

Figura 5.8c – Construtor Option Group (3.Value): Campo para Relação do Objeto.
As Figuras 5.8a, 5.8b e 5.8c ilustram o processo de 3 etapas da utilização
do Construtor do OptionGroup, que deve ser utilizado nos campos Sexo e
Estado Civil. Na primeira etapa (Figura 5.8a) determine o número de opções do
Option Group e também os dizeres de cada uma das opções. Na segunda
etapa (Figura 5.8b) configure a disposição das opções (Horizontal ou Vertical) e
a aparência do controle: Opaco ou Transparente. Na terceira e última etapa
(Figura 5.8c) determine a Tabela e Campo para o qual será associada a
propriedade Value do objeto. Ao preencher o campo Field Name,
automaticamente o construtor já atribui esta informação na propriedade
ControlSource.

Setembro/2008 53
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 5.9a – Construtor Combobox (1.List Itens): Origem dos dados.


O Construtor do Combobox tem como primeira etapa a identificação da
origem dos dados, conforme os itens destacados na Figura 5.9a:
1. Determina a origem dos dados que vão compor a tabela. Neste caso
seleciona-se a opção Campos de uma tabela ou view (Fields from a
table or view).
2. Selecione a Tabela que deve preencher a combobox.
3. Lista dos Campos da Tabela.
4. Utilize os botões para selecionar os campos que devem ser
mostrados ao usuário.

Figura 5.9b – Construtor Combobox (2.Style): Estilo do objeto.


Na segunda etapa do construtor (Figura 5.9b) determine as propriedades do
estilo do objeto. Determine um estilo tri-dimensional ou plano (destaque acima
e á direita), obrigatoriamente selecione Drop-down list (destaque acima e à

Setembro/2008 54
VISUAL FOX PRO
INTERMEDIÁRIO
esquerda) para permitir que sejam selecionados somente itens pertencentes à
lista e por fim habilite uma busca incremental (destaque abaixo).

Figura 5.9c – Construtor Combobox (3.Layout): Distribuição das Informações.


Na terceira etapa (Figura 5.9c) determine o tamanho da(s) coluna(s) que
serão exibidas ao usuário final. No exemplo a ser trabalhado, opte por mostrar
código e nome da profissão e perfil, tendo o nome como primeira coluna.

Figura 5.9d – Construtor Combobox (4.Value): Destino da Informação Selecionada


A quarta e última etapa corresponde em determinar como a informação será
armazenada. No destaque superior da Figura 5.9d é determinado qual dos
campos da tabela será retornado na propriedade Value do objeto, que neste
caso será o campo CODIGO da tabela de clientes. No destaque inferior da
Figura 5.9d é determinado qual o campo de destino da informação selecionada,
isto é, o ControlSource do objeto.

Setembro/2008 55
VISUAL FOX PRO
INTERMEDIÁRIO
A tarefa agora é preencher as propriedades e programar os métodos que
ficam na instância. Estes métodos e propriedades possuem características bem
particulares de cada cadastro, o que ocasiona determinar seus valores e ações
no momento do cadastro propriamente dito.
Preencha a propriedade TABELAMANUTENCAO com o nome da tabela
que é submetida a manutenção de cadastro: CADCLI. Neste cadastro, deixe a
propriedade NOMEREPORT vazia, pois não será feito nenhum relatório.
Seguem os métodos a serem programados:

FORMSET.CONFIGURACAMPOS
DIMENSION ThisFormSet.arrcamposmanutencao[3,5]

ThisformSet.arrcamposmanutencao[1,1] = "Codigo"
ThisFormSet.arrcamposmanutencao[1,2] = "Código"
ThisFormSet.arrcamposmanutencao[1,3] = "9999"
ThisFormSet.arrcamposmanutencao[1,4] = 0
ThisFormSet.arrcamposmanutencao[1,5] = 4

ThisformSet.arrcamposmanutencao[2,1] = "Nome"
ThisFormSet.arrcamposmanutencao[2,2] = "Nome"
ThisFormSet.arrcamposmanutencao[2,3] = ""
ThisFormSet.arrcamposmanutencao[2,4] = ""
ThisFormSet.arrcamposmanutencao[2,5] = 60

ThisformSet.arrcamposmanutencao[3,1] = "DtNasc"
ThisFormSet.arrcamposmanutencao[3,2] = "Data de Nascimento"
ThisFormSet.arrcamposmanutencao[3,3] = ""
ThisFormSet.arrcamposmanutencao[3,4] = {}
ThisFormSet.arrcamposmanutencao[3,5] = 10
Neste método, determina-se quais campos serão visualizados no GRID,
através dos parâmetros da matriz ARRCAMPOSMANUTENCAO, que é uma
propriedade do FormSet. Neste ponto, não é preciso mencionar todos os
campos da tabela, somente aqueles que serão visualizados no Grid. Para cada
campo, configuram-se 5 informações:
1. Nome do Campo;
2. Título do Campo no GRID;
3. Máscara de Visualização do Campo;
4. Valor Padrão, que determinará o tipo do campo;
5. Tamanho da coluna em Pixels.

FORMSET.DESABILITACAMPOSCHAVE
ThisFormset.Form1.CntDados.txtCodigo.Enabled = .F.

FORMSET.FOCOMANUTENCAO

Setembro/2008 56
VISUAL FOX PRO
INTERMEDIÁRIO
PARAMETERS pIdFoco

IF pIdFoco = "I"
ThisFormSet.form1.cntDados.txtCodigo.SetFocus()
ELSE
ThisformSet.form1.cntDados.txtNome.SetFocus()
ENDIF
Neste caso, nota-se que a primeira linha do código já será apresentada na
edição deste método, pois foi determinado na própria classe, que o método
exige o recebimento de um parâmetro.

FORMSET.VALIDACAMPOS
WITH ThisFormset.Form1.CntDados
IF .txtCodigo.Value <= 0

= MESSAGEBOX("Código deve ser um número POSITIVO!",16,"Dados


Inválidos")

.txtCodigo.SetFocus()
RETURN .F.
ENDIF

IF EMPTY(.txtNome.Value)
= MESSAGEBOX("Nome Não Preenchido!!!",16,"Dados Inválidos")
.txtNome.SetFocus()
RETURN .F.
ENDIF
IF EMPTY(.txtDtNasc.Value)

= MESSAGEBOX("Data de Nascimento NÃO PREENCHIDA !!!",


16,"Dados Inválidos")

.txtDtNasc.SetFocus()
RETURN .F.
ENDIF
IF .txtDtNasc.Value > DATE()

=MESSAGEBOX ("Data de Nascimento Inválida !!!", 16, "Dados


Inválidos")

.txtDtNasc.SetFocus()
RETURN .F.
ENDIF
RETURN .T.
ENDWITH
Neste método validamos as condições que determinam se os campos estão
ou não consistentes, retornando VERDADEIRO ou FALSO.

Setembro/2008 57
VISUAL FOX PRO
INTERMEDIÁRIO

FORMSET.VALIDAREINCLUSAO
LOCAL nCodigo, cNome, cDtNasc, nCpf, nSexo, cEndereco, cBairro
LOCAL cUf, nEstCivil, nCodProf, nCodPerfil, cCidade, lRetorno

lRetorno = .F.

WITH ThisFormSet.form1.cntDados

nCodigo = .txtCodigo.Value
cNome = .txtNome.Value
cDtNasc = .txtDtNasc.Value
nCpf = .txtCpf.value
nSexo = .OptSexo.Value
cEndereco = .txtEndereco.Value
cBairro = .txtBairro.Value
cCidade = .txtCidade.Value
cUf = .txtUf.value
nEstCivil = .OptEstCivil.value
nCodProf = .CboCodProf.Value
nCodPerfil = .CboCodPerf.Value

SET DELETED OFF


IF SEEK(nCodigo,"CADCLI","CODIGO")
IF DELETED("CADCLI")
RECALL IN CadCli
Replace Cadcli.Codigo WITH nCodigo IN CadCli
Replace CadCli.Nome WITH cNome IN CadCli
Replace CadCli.CPF WITH nCpf IN Cadcli
Replace CadCli.Sexo WITH nSexo IN CadCli
Replace CadCli.Endereco WITH cEndereco IN CadCli
Replace CadCli.Bairro WITH cBairro IN Cadcli
Replace CadCli.Cidade WITH cCidade IN CadCli
Replace CadCli.UF WITH cUF IN CadCli
Replace CadCli.EstCivil WITH nEstCivil IN CadCli
Replace CadCli.CodProf WITH nCodProf IN CadCli
Replace CadCli.CodPerfil WITH nCodPerfil IN CadCli
lRetorno = .T.
ENDIF
ENDIF
SET DELETED ON
ENDWITH
RETURN lRetorno

Finalizado este último método, salve o formulário e execute-o.

Setembro/2008 58
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 5.10 – Formulário de Cadastro de Clientes em Produção.


O resultado final ficará semelhante ao apresentado na Figura 5.10.

Até aqui, foi um árduo trabalho construir a classe de cadastro. De agora em


diante, esta classe será utilizada para a construção dos próximos cadastros,
diminuindo consideravelmente o trabalho. Na verdade, esta é uma estratégia
para evitar RETRABALHO.

O grande segredo de todo este processo é a fidelidade aos padrões


criados. Isto oferece bastante “poder” às classes, tendo como uma
conseqüência básica a padronização dos programas, que é muito importante
para o fácil entendimento do usuário final do aplicativo.

Setembro/2008 59
VISUAL FOX PRO
INTERMEDIÁRIO

6. BIBLIOTECA DE VÍNCULO DINÂMICO (DLL)


Biblioteca de Vínculo Dinâmico é a tradução para o português do termo
Dynamic Link Library, que é mais conhecida no mundo Windows pela sua sigla:
DLL.
Arquivos com extensão DLL são bibliotecas de funções desenvolvidas para
o compartilhamento de vários aplicativos. Estes arquivos em geral estão
localizados na pasta de sistema do Windows:
 \WINDOWS\SYSTEM para Windows 98
 \WINDOWS\SYSTEM32 para Windows XP e Vista
 \WINNT\SYSTEM32 para Windows NT e 2000
Quando um fabricante desenvolve um equipamento, cria também uma
biblioteca de funções e as armazena em uma DLL (comumente desenvolvida
em Linguagem C ou C++, mas que também pode ser desenvolvida em Visual
Basic, Delphi e até mesmo VFP – que será apresentado no curso avançado).
Este deve gerar uma documentação com o nome das funções utilizadas, os
parâmetros de entrada e de saída das funções criadas na DLL.

Neste capítulo será realizada a manutenção de cadastro de uma nova


tabela (fazendo uso da classe CADASTRO_SIMPLES), utilizando uma função
de uma DLL para validar uma das informações.
A tarefa será iniciada, com a criação de mais uma tabela em no banco de
dados. Esta tabela será utilizada para armazenar o Cadastro de Fornecedores,
devendo ser gravada na pasta C:\TRABALHO\BD sob o nome de CADFORN,
obedecendo a estrutura apresentada pela Tabela 6.1.

Campo Tipo Tam Obs


Input Mask: 9999
CODFORN Numérico 4 Código do Fornecedor
Caption: Código
Razão Social do Caption: Razão
NOMFORN Alfanumérico 60
Fornecedor Social
Format: R
Input Mask:
CNPJFORN Numérico 14 CNPJ do Fornecedor 99,999,999/9999-
99
Caption: CNPJ
Caption:
Inscrição Estadual do
IEFORN Alfanumérico 20 Inscrição
Fornecedor
Estadual
Sigla do Estado do Format: K
UFFORN Alfanumérico 2
Fornecedor Caption: UF
Tabela 6.1 – Estrutura da Tabela CADFORN.
O campo CODFORN será chave primária da tabela e os campos
NOMFORN e UFFORN índices regulares.

Utilizando a classe CADASTRO_SIMPLES crie a manutenção do cadastro


desta tabela. Para recordar o que foi visto no Capítulo Anterior, siga a
seqüência:

Setembro/2008 60
VISUAL FOX PRO
INTERMEDIÁRIO
1. Grave o Formulário em C:\TRABALHO\FORMULARIO com o nome
de FRMFORN.
2. Coloque a Tabela CADFORN no DataEnvironment e não esqueça de
modificar a propriedade BufferModeOverride para 3.
3. Coloque os objetos TEXTBOX_PADRAO para os campos
CODFORN, NOMFORN, CNPJFORN e IEFORN e um objeto
COMBOBOX_PADRAO para o campo UFFORN. Configure a
propriedade ControlSource de todos os objetos, as propriedades
InputMask, Format e MaxLenght quando aplicável e por fim
modifique a propriedade Style para DropDown List da Combobox.
4. Modifique a propriedade Caption do FORM1 para “Cadastro de
Fornecedores” e preencha a propriedade TabelaManutencao do
FORMSET com CADFORN.

Agora, programe os métodos específicos da instância:

FORMSET.CONFIGURACAMPOS
DIMENSION ThisFormSet.arrcamposmanutencao[2,5]

ThisFormSet.arrcamposmanutencao[1,1] = "CODFORN"
ThisFormSet.arrcamposmanutencao[1,2] = "Código"
ThisFormSet.arrcamposmanutencao[1,3] = "9999"
ThisFormSet.arrcamposmanutencao[1,4] = 0
ThisFormSet.arrcamposmanutencao[1,5] = 4

ThisFormSet.arrcamposmanutencao[2,1] = "NOMFORN"
ThisFormSet.arrcamposmanutencao[2,2] = "Razão Social"
ThisFormSet.arrcamposmanutencao[2,3] = ""
ThisFormSet.arrcamposmanutencao[2,4] = ""
ThisFormSet.arrcamposmanutencao[2,5] = 60

FORMSET.DESABILITACAMPOSCHAVE
ThisFormset.Form1.CntDados.txtCodForn.Enabled = .F.

FORMSET.FOCOMANUTENCAO
PARAMETERS pIdFoco

IF pIdFoco = "I"
ThisFormset.Form1.CntDados.txtCodForn.SetFocus()
ELSE
ThisFormset.Form1.CntDados.txtNomForn.SetFocus()
ENDIF

FORMSET.VALIDACAMPOS
LOCAL nCodForn,cNomForn,nCnpjForn,cIeForn,cUfForn
WITH ThisFormset.Form1.CntDados

Setembro/2008 61
VISUAL FOX PRO
INTERMEDIÁRIO
nCodForn = .txtCodForn.value
cNomForn = .txtNomForn.value
nCnpjForn = .txtCnpjForn.value
cIeForn = .txtIeForn.value
cUfForn = .cboUfForn.value
ENDWITH
IF nCodForn <= 0

= MESSAGEBOX("Código do Fornecedor deve ser um Número


POSITIVO!",16,"Dados Inválidos")

RETURN .F.
ENDIF
IF EMPTY(cNomForn)

= MESSAGEBOX("Razão Social do Fornecedor NÃO INFORMADA!",


16,"Dados Inválidos")

RETURN .F.
ENDIF
IF EMPTY(cUfForn)

= MESSAGEBOX("UF do Fornecedor NÃO INFORMADO!",16,"Dados


Inválidos")

RETURN .F.
ENDIF
RETURN .T.

FORMSET.VALIDAREINCLUSAO
LOCAL nCodForn,cNomForn,nCnpjForn,cIeForn,cUfForn, lRetorno
WITH ThisFormset.Form1.CntDados
nCodForn = .txtCodForn.value
cNomForn = .txtNomForn.value
nCnpjForn = .txtCnpjForn.value
cIeForn = .txtIeForn.value
cUfForn = .cboUfForn.value
ENDWITH
lRetorno = .F.
SET DELETED OFF
IF SEEK( nCodForn, "CADFORN" ,"CODFORN" )
IF DELETED("CADFORN")
RECALL IN CadForn
Replace CadForn.NomForn WITH cNomForn IN CadForn
Replace CadForn.CnpjForn WITH nCnpjForn IN CadForn
Replace CadForn.IeForn WITH cIeForn IN CadForn
Replace CadForn.UFForn WITH cUfForn IN CadForn
= TABLEUPDATE(1,.T.,"CadForn")
GO TOP IN CadForn

Setembro/2008 62
VISUAL FOX PRO
INTERMEDIÁRIO
lRetorno = .T.
ENDIF
ENDIF
SET DELETED ON
RETURN lRetorno

Para o campo UF pode-se limitar a escolha do usuário final para as 27


siglas brasileiras (26 Estados e o Distrito Federal). Em muitos sistemas é
comum encontrar cadastros de estados. No exemplo trabalhado, fixe os
Estados existentes, para fins de exercitar a alimentação dinâmica (em tempo
de execução) das opções objeto Combobox.

No método INIT do FORMSET, coloque o seguinte código:


DODEFAULT() && Executando método na Classe PAI
LOCAL ARRAY ArrUf[27]
LOCAL k_Cnt
** Região Norte ************
ArrUF[01] = "AM" && Amazonas
ArrUF[02] = "PA" && Pará
ArrUF[03] = "RR" && Roraima
ArrUF[04] = "RO" && Rondônia
ArrUF[05] = "AP" && Amapá
ArrUF[06] = "TO" && Tocantins
ArrUF[07] = "AC" && Acre
*** Região Nordeste
ArrUF[08] = "BA" && Bahia
ArrUF[09] = "PE" && Pernambuco
ArrUF[10] = "SE" && Sergipe
ArrUF[11] = "CE" && Ceará
ArrUF[12] = "AL" && Alagoas
ArrUF[13] = "MA" && Maranhão
ArrUF[14] = "PI" && Piauí
ArrUF[15] = "RN" && Rio Grande do Norte
ArrUF[16] = "PB" && Paraíba
*** Região Centro-Oeste
ArrUF[17] = "GO" && Goiás
ArrUF[18] = "MT" && Mato Grosso
ArrUF[19] = "MS" && Mato Grosso do Sul
ArrUF[20] = "DF" && Distrito Federal
*** Região Sudeste
ArrUF[21] = "ES" && Espírito Santo
ArrUF[22] = "RJ" && Rio de Janeiro
ArrUF[23] = "SP" && São Paulo
ArrUF[24] = "MG" && Minas Gerais
*** Região Sul
ArrUF[25] = "PR" && Paraná
ArrUF[26] = "SC" && Santa Catarina
ArrUF[27] = "RS" && Rio Grande do Sul
= ASORT(ArrUF) && Ordenando Matriz
WITH ThisFormset.Form1.CntDados.CboUFFORN

Setembro/2008 63
VISUAL FOX PRO
INTERMEDIÁRIO
.Clear
FOR k_Cnt = 1 TO ALEN(ArrUF,1)
.AddItem(ArrUF[k_Cnt])
NEXT
ENDWITH

Não esqueça que o método INIT possui uma programação na Classe Pai.
Assim, na primeira linha deste código programe a execução das ações da
classe pai através do comando DODEFAULT().
As siglas dos 26 Estados e o Distrito Federal são armazenadas na Matriz
ARRUF. Aqui, a matriz foi preenchida olhando no Mapa do Brasil, onde ficaram
primeiro os Estados da Região Norte, depois os Estados da Região Nordeste,
Centro-Oeste, Sul e Sudeste. Com certeza, esta ordem não será a melhor
ordem para apresentar as informações ao usuário final. Assim, através do
comando ASORT(ARRUF), a Matriz ARRUF é ordenada. Por Fim, alimente os
dados na CBOUFFORN, onde o método CLEAR limpa todos os dados da
ComboBox, e o método ADDITEM, adiciona um item na ComboBox.

Figura 6.1 – Cadastro de Fornecedores


A Figura 6.1 ilustra como fica o Formulário do Cadastro de Fornecedores
após inseridos todos os campos. Salve e execute o formulário. Veja que, em
muito pouco tempo um novo cadastro foi construído.
O conteúdo dos campos CNPJ e Inscrição Estadual são informações que
tem uma inteligência em sua composição. O CNPJ possui 2 dígitos
verificadores. Estes dígitos são determinados através de operações
matemáticas com os dígitos anteriores. Esta prática é utilizada para evitar erros
de digitação. Se o operador errar um dígito de um CNPJ, vai criar um valor que
não é compatível com a inteligência do cálculo e este valor será recusado.
Assim, no caso de um erro de digitação, o aplicativo vai acusar um valor
inválido, evitando que o erro cause um troca de CNPJ.

Setembro/2008 64
VISUAL FOX PRO
INTERMEDIÁRIO
O número que compõe o CNPJ é composto por três segmentos de
algarismos, sendo o primeiro o número da inscrição propriamente dito, o
segundo (após a barra) o número de filiais e o terceiro, representado pelos
últimos dois valores que são os dígitos verificadores.
Oficialmente o cálculo do número do CNPJ prevê também a verificação do
oitavo dígito, mas algumas empresas possuem números que ao serem
validados segundo esse critério são considerados inválidos.
Por isso o mais seguro é fazer a validação dos dígitos verificadores, pois
assim nenhum número será inválido e sua rotina está protegida da mesma
forma, já que a regra é única e funciona com qualquer CNPJ válido.
Validando os dígitos verificadores
Estudando a forma de cálculo de modo prático, adotar-se-á um número de
CNPJ hipotético e serão calculados seus dígitos verificadores:
11.222.333/0001-XX.
Comece alinhando os números que compõe o CNPJ com os algarismos
5,4,3,2,9,8,7,6,5,4,3 e 2 nesta ordem, veja:
1 1 2 2 2 3 3 3 0 0 0 1
5 4 3 2 9 8 7 6 5 4 3 2
Feito isso efetue a multiplicação de cada uma das colunas, assim:
1 1 2 2 2 3 3 3 0 0 0 1
5 4 3 2 9 8 7 6 5 4 3 2
5 4 6 4 18 24 21 18 0 0 0 2
Com os valores encontrados em cada uma das colunas efetue o somatório,
desta forma: 5+4+6+4+18+24+21+18+0+0+0+2 e com o número obtido, nesse
caso 102, realize a divisão por 11 (102/11).
Considere como quociente somente o valor inteiro, o resto da divisão será
responsável pelo cálculo do primeiro dígito verificador. Assim sendo, no
exemplo exposto, o resto da divisão é o número 3.
Neste momento utiliza-se a seguinte regra: Caso o resto da divisão seja
menor que 2 o valor do dígito verificador passa a ser 0, caso contrário subtrai-
se este valor de 11 para obter o dígito, (que é o a ser aplicado no exemplo).
Portanto, o primeiro dígito verificador é (11 - 3) o número 8.
Para seguir com a validação utilize o CNPJ com o primeiro dígito já
calculado para efetuar a validação do segundo e último dígito verificador:
11.222.333/0001-8X.
O processo é semelhante ao da primeira etapa. A única mudança é a
seqüência de números que serão alinhados na tabela, como a tabela ficou
maior com a presença do dígito já calculado a seqüência agora tem que ter
mais um número e ficará assim: 6,5,4,3,2,9,8,7,6,5,4,3 e 2, confira:
1 1 2 2 2 3 3 3 0 0 0 1 8
6 5 4 3 2 9 8 7 6 5 4 3 2
6 5 8 6 4 27 24 21 0 0 0 3 16
Como é possível notar, foi efetuada como na primeira etapa, a multiplicação
das colunas e faz-se então a somatória dos resultados obtidos:
6+5+8+6+4+27+24+21+0+0+0+3+16. Com o resultado obtido, nesse caso 120,
efetuamos a divisão por 11.

Setembro/2008 65
VISUAL FOX PRO
INTERMEDIÁRIO
Nessa divisão, assim como no cálculo anterior, considere apenas o valor
inteiro do quociente, pois o cálculo do último dígito verificador será feito com o
resto da divisão seguindo a seguinte regra: caso o resto da divisão seja menor
que 2 (dois), esse valor passa automaticamente a ser zero; caso contrário, (que
é o caso do exemplo), subtrai-se o resto de 11 para obter o valor do último
dígito verificador, acompanhe: 120/11=10 com resto 10, 11-10 dígito verificador
1 - O CNPJ agora completo 11.222.333/0001-81.

Construa agora o algoritmo em VFP para efetuar a Validação do CNPJ.


Faça uso de um programa de nome CHEKACNPJ.PRG que ficará gravado na
pasta C:\TRABALHO\PROGRAMAS.

CHEKACNPJ.PRG
PARAMETERS pCNPJ
LOCAL k_Cnt, j_Cnt, nSoma, nContador, nDigito, cCNPJ, cDV
IF pCNPJ <= 0
= MESSAGEBOX("CNPJ Não Informado!")
RETURN .F.
ENDIF
cCNPJ = STR(pCNPJ,14)
cDV = RIGHT(cCNPJ,2)
cCNPJ = LEFT(cCNPJ,12)
FOR j_Cnt = 1 TO 2
nContador = 1
nSoma = 0
FOR k_Cnt = LEN(CCNPJ) TO 1 STEP -1
nContador = nContador + 1
IF nContador > 9
nContador = 2
ENDIF
nSoma = nSoma + VAL(SUBSTR(cCNPJ,k_cnt,1))*nContador
NEXT
nDigito = 11 - MOD(nSoma,11)
IF nDigito > 9
nDigito = 0
ENDIF
cCNPJ = cCNPJ + STR(nDigito,1)
NEXT
IF RIGHT(cCNPJ,2) <> cDv
= MESSAGEBOX("CNPJ Inválido!")
RETURN .F.
ELSE
RETURN .T.
ENDIF

Agora, “incremente” no método VALIDACAMPOS a Chamada desta função:

Setembro/2008 66
VISUAL FOX PRO
INTERMEDIÁRIO
IF .Not. ChekaCnpj(nCnpjForn)
RETURN .F.
ENDIF
Tenha em mãos alguns CNPJ válidos e confira a consistência.

CNPJs Válidos
07.692.902/0001-85
61.474.334/0001-91
93.896.397/0012-85
45.543.915/0001-81
01.252.046/0001-60
56.697.162/0002-66
28.114.122/0001-28

A Inscrição Estadual não possui uma regra de validação a nível nacional.


Cada Estado pode ter sua própria regra de validação desta informação. Isto
implica que para poder consistir qualquer inscrição estadual brasileira podem
ser utilizadas até 27 regras diferentes.
Para facilitar este trabalho aos desenvolvedores, foi disponibilizada uma
DLL que é capaz de validar as 27 regras de inscrições estaduais, chamada
DLLINSCE32.DLL. Sempre que algum desenvolvedor oferece uma biblioteca
de funções (que é o caso da DLL), sempre deve fornecer em conjunto com o
arquivo, a documentação desta função. No Caso da DLL que valida as
Inscrições Estaduais, a parte da documentação que nos interessa é transcrita à
seguir:

Chamada da função:

Erro: = ConsisteInscricaoEstadual (IE, UF) ;

Características:

Erro: integer
IE : string
UF : string

Parâmetros

A inscrição estadual a ser avaliada deve estar sem qualquer máscara de


edição.

Retornos da função:

Setembro/2008 67
VISUAL FOX PRO
INTERMEDIÁRIO
A função retorna um código.

Códigos retornados:
0  inscrição válida
1  inscrição inválida
2  parâmetros inválidos

O Arquivo DLLINSCE32.DLL contém a função de nome


ConsisteInscricaoEstadual, que recebe duas strings como parâmetro: Sigla da
UF e número da Inscrição Estadual, retornando um resultado numérico quanto
a sua consistência. Este arquivo deve ser copiado junto ao diretório de
sistemas do Windows, que no caso do Windows XP é a pasta
C:\WINDOWS\SYSTEM32 ou no diretório corrente de sua aplicação.

Para utilizar uma função de uma biblioteca externa (que é o caso da DLL),
primeiramente é preciso fazer a declaração desta função no VFP. Esta tarefa é
realizada através do comando DECLARE. No exemplo trabalhado, a função de
validação da inscrição estadual seria declarada da seguinte maneira:

DECLARE Integer1 ConsisteInscricaoEstadual2 IN


DLLINSCE323 as ValidaIE4 String, String5

Onde:
1. Determina o Tipo de Retorno que será dado pela função, que neste
caso é um valor inteiro.
2. Nome da Função dentro da DLL. Este nome deve ser rigorosamente
igual a documentação fornecida pelo desenvolvedor, pois este
parâmetro é Case Sensitive, isto é, ele diferencia maiúsculas de
minúsculas.
3. Nome do Arquivo que contém a função.
4. Apelido para esta função dentro do Fox. Este parâmetro é opcional e
se omitido assumiremos no Fox o mesmo nome da função definido
pelo desenvolvedor.
5. Lista dos Tipos de Parâmetros de Entrada. Como nossa função exige
2 parâmetros de entrada e ambos são alfanuméricos colocamos
então String, String.

Antes de inserir esta função dentro do aplicativo, teste-a na linha de


comando do VFP. Inicialmente comece digitando o comando de declaração da
Função, conforme destacado acima.

Feito isto, faça o seguinte teste:

Setembro/2008 68
VISUAL FOX PRO
INTERMEDIÁRIO

nInfoValida = ValidaIE("105757884116","SP")

Depois de executado o comando, peça para visualizar no ambiente de


trabalho, o valor que foi retornado na variável NINFOVALIDA

? nInfoValida

Este comando, exibirá no canto superior esquerdo o valor da variável, que


neste caso será 0 (Zero). Olhando a documentação da DLL, verifica-se que 0,
significa uma Inscrição Estadual Válida.
Agora, teste um pouco as variações desta função, passando outras
Inscrições Estaduais e também outros Estados, para uma melhor familiarização
com ela.

Feito isto, coloque dentro do formulário a chamada da função da DLL.

No primeiro passo coloque a declaração da DLL no método INIT.

Agora, efetue a chamada da função para fins de validação do conteúdo da


Inscrição Estadual. Ao ler a documentação da função ou nos próprios testes
feitos na linha de comando, repare que não se pode passar como parâmetro
para a função, qualquer caracter que não seja um número, apesar do campo
para digitação ser alfanumérico.
É possível limitar a digitação para apenas números através de um
InputMask essencialmente numérico. Porém, isto impediria que o usuário
colocasse os caracteres que identificam a máscara da Inscrição Estadual,
como pontos, traços e barras, que facilitam a visualização da informação. O
mais correto a se fazer neste caso, é o próprio sistema enviar para a função da
DLL uma string sem estas informações, independente dos dados digitados pelo
usuário. E por último, existe ainda outro detalhe. Existem empresas que não
possuem Inscrição Estadual (pois sua atividade não exige recolhimento de
ICMS). Para estas empresas, no campo Inscrição Estadual deve estar a
palavra ISENTO. Nestes casos é preciso fazer o tratamento da questão dentro
do programa.
No método VALIDACAMPOS, inclui-se as seguintes linhas de comando:

IF EMPTY(cUfForn)
= MESSAGEBOX("UF do Fornecedor NÃO INFORMADO!",16,"Dados
Inválidos")
RETURN .F.
ENDIF

**** Tratando String para Envio a Função de Validação da Inscrição


Estadual ****
LOCAL cIeFuncao, k_Cnt, cDigito, nInfoValida

cIeForn = UPPER(cIeForn)
IF AT("ISENT",cIeForn) > 0
cIeFuncao = "ISENTO"

Setembro/2008 69
VISUAL FOX PRO
INTERMEDIÁRIO
ELSE
cIeFuncao = ""
FOR k_Cnt = 1 TO LEN(cIeForn)
cDigito = SUBSTR(cIeForn,k_Cnt,1)
IF cDigito$"0123456789"
&& ou IF INLIST(cDigito,"0","1","2","3","4","5","6","7","8","9")
cIeFuncao = cIeFuncao + cDigito
ENDIF
NEXT
ENDIF

nInfoValida = ValidaIE(cIeFuncao,cUfForn)

IF nInfoValida <> 0
= MESSAGEBOX("Inscrição Estadual Inválida para o Estado!",16,"Dados
Inválidos")
RETURN .F.
ENDIF

RETURN .T.

As linhas em itálico são linhas de código já existentes e servem como


referência de onde será inserida esta validação.
Merecem destaque aqui, alguns comandos e funções:
 AT( Parm1, Parm2 ): Localiza a String Parm1 dentro da String Parm2,
retornando a posição onde se inicia Parm1 ou 0 se não encontrar.
AT(“ANA”,”MARIANA”) retorna 5 e AT(“PH”,”FARMÁCIA”) retorna 0.
 UPPER (Parm1): retorna PARM1 tudo em letra maiúsculas. LOWER
(Parm1) retorna parm1 em letras minúsculas.
 SUBSTR( pString, nPosIni, kPosicoes): Retorna uma parte da String,
informando a posição inicial em nPosini e o número total de posições em
kPosicoes. SUBSTR(“MARIANA”,3,2) retorna “RI”.
 CDIGITO$”0123456789” retorna VERDADEIRO ou FALSO se a String
CDIGITO está contida dentro da String “0123456789”. Para esta
verificação também pode ser utilizada a expressão INLIST
(cDigito,"0","1","2","3","4","5","6","7","8","9") , Esta expressão retorna
VERDADEIRO ou FALSO se o primeiro parâmetro pertence a lista
formada pelos parâmetros seguintes.

Agora já está pronto para testar: quando mais consistências forem inseridas
no formulário, o aplicativo fica mais profissional, mais robusto e como
conseqüência fica mais difícil de testar, pois à partir de agora não é qualquer
informação que é aceita. A Tabela 6.2 contém uma lista de Inscrições
Estaduais válidas para utilização em testes:

Setembro/2008 70
VISUAL FOX PRO
INTERMEDIÁRIO

Inscrição Estadual UF
06.200.107-8 AM
06.300.230-2 AM
06.200.224-4 AM
06.300.166-7 AM
06.300.075-0 AM
1666728660018 MG
1860146480069 MG
1664293650004 MG
0624230690095 MG
3670110000049 MG
336.049.094.115 SP
209.026.644.110 SP
456.000.199.119 SP
105.757.884.116 SP
336.075.411.116 SP
105.291.245.119 SP
626.027.597.112 SP
251.784.118 SC
250.102.790 SC
252.106.440 SC
Tabela 6.2 – Inscrições Estaduais válidas para testar o Formulário de Cadastro de
Fornecedores.

Neste cadastro crie um relatório que possibilite explorar mais alguns


recursos desta ferramenta. Cria-se então um Report de nome
RPTFORNECEDOR que fica armazenado na pasta
C:\TRABALHO\RELATORIOS e em inicialmente será criado conforme ilustra a
Figura 6.2.

Setembro/2008 71
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 6.2 – Formato Inicial do Relatório de Fornecedores.


Aqui, merece um destaque a formatação que deverá ser feita no campo
CNPJ.

Figura 6.3 – Formatação do Campo CNPJ no Relatório.


A Figura 6.3 destaca dois importantes itens para a formatação do CNPJ. No
destaque superior é a máscara a ser apresentada pelo campo numérico e no
destaque inferior ao marcar o item Leading Zeros o relatório preencherá que
zeros à esquerda para completar a informação do campo no mesmo tamanho
da máscara. Lembre-se que neste caso o CNPJ é um campo numérico, e zeros
à esquerda são omitidos em campos numéricos por padrão.
Feito isto, salve o relatório. Volte ao formulário FRMFORN e preencha a
propriedade NOMEREPORT com o nome do formulário que foi criado:
RPTFORNECEDOR.
Ao executar o formulário, percebe-se que o botão de relatório agora é
visível, bem como existe possibilidade de emitir o relatório, que será
visualizado conforme exemplifica a Figura 6.4.

Setembro/2008 72
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 6.4 – Exemplo da Primeira Emissão do Relatório de Fornecedores.


Até este passo, nada diferente do que já foi feito. Incremente este relatório
para que ele fique agrupado por estado, apresentando um subtotal de
fornecedores por Estado e um total geral ao Final.
O primeiro passo a ser feito é certificar-se que o Relatório possui no
DataEnvironment a tabela CADFORN. Além disto, configure a propriedade
ORDER desta tabela para UFFORN.
Cria-se então no Relatório um Grupo de Informações. Para criar este grupo
segue-se a seqüência de menus ilustrada pela Figura 6.5.

Figura 6.5 – Acessando Agrupamentos ( Report / Data Grouping )

Setembro/2008 73
VISUAL FOX PRO
INTERMEDIÁRIO
Ao acessar a tela de agrupamento de produtos, clique no botão Add para
criar um novo agrupamento. Quando solicitado, informe a expressão que
determinará o agrupamento. Como os dados serão agrupados por fornecedor,
deve-se informar a expressão UFFORN, que é o campo onde é armazenada a
sigla do fornecedor. Como o relatório será agrupado por estado é
imprescindível que a tabela esteja ordenada por este campo.

Figura 6.6 – Criando Agrupamento por Estado do Fornecedor.

Figura 6.7 – Agrupamento Compondo o Leiaute do Relatório.


Ao clicar em OK, verifica-se que o relatório ganhou novas seções, conforme
ilustram os destaques da Figura 6.7. Houve a criação de um HEADER
(cabeçalho) para o Agrupamento e também de um FOOTER (rodapé). Perceba

Setembro/2008 74
VISUAL FOX PRO
INTERMEDIÁRIO
que a linha de detalhe é sempre a seção mais interna, estando contida no
agrupamento que criamos. Assim, efetue algumas modificações no leiaute.

Figura 6.8 – Tratando o Agrupamento por Estado.


As modificações feitas estão identificadas na Figura 6.8:
a. Alteração do cabeçalho do Relatório para a seção GROUP HEADER.
Este cabeçalho passa então a ser o cabeçalho do grupo.
b. Na seção GROUP FOOTER, foi adicionado um pequeno traço para
identificar o final do grupo.
c. No GROUP HEADER foi acrescentada uma Caixa de texto para
identificar o estado que trata o grupo. No conteúdo da caixa de texto
vai a expressão: “FORNECEDORES DE “ + CADFORN.UFFORN.

Falta apenas agora, criar um totalizador para a quantidade de Fornecedores


por Estado e um totalizador para a quantidade total de Fornecedores do
Relatório. Crie uma variável de nome RPTTOTUF para totalizar a quantidade
de fornecedores por Estado e uma variável de nome RPTTOTGER para
acumular a quantidade total de fornecedores do relatório.
A Figura 6.9 ilustra o processo de criação destas variáveis. Os parâmetros
para as duas variáveis são quase idênticos. A modificação fica no campo Reset
value based on , que determina o momento em que a variável será zerada.
Este campo (em destaque à direita na Figura 6.9) deve ser preenchido com
Group UFFORN para a variável RPTTOTUF e Report para a Variável
RPTTOTGER.
A primeira variável deverá ser “zerada” sempre que modificar o fornecedor e
a segunda somente deverá ser “zerada” ao final do relatório.

Setembro/2008 75
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 6.9 – Criação das Variáveis de Totais por UF e Total Geral de Fornecedores.
Por Fim, adicione a visualização destas variáveis no Relatório. A variável
RPTTOTUF é adicionada no rodapé do grupo. Para visualizar a variável
RPTTOTGER, é preciso adicionar a seção de Sumário, e a construção final do
relatório é ilustrada pela Figura 6.10.

Setembro/2008 76
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 6.10 – Formato Final do Relatório de Fornecedores.


O cadastro foi concluído. Agora execute o formulário de Fornecedores e
visualize o Resultado Final do relatório.

EXERCÍCIO 03

Crie o formulário de manutenção no cadastro de Produtos, conforme as


especificações abaixo:
 Deverá ser criada a tabela CADPRODU com os seguintes campos:
o CODPROD, Numérico, 6 posições, para armazenar o código do
produto. Deverá ser chave primária. Este campo não pode ser
Zero ou negativo.
o NOMPROD, Alfanumérico, 60 posições, para armazenar a
descrição do produto. Deverá ser chave regular. Este campo não
pode ficar em branco.
o PRCPROD, Numérico, 12 posições com 2 casas decimais, para
armazenar o preço de venda do produto. Este campo não pode
ser zero ou negativo
o CATPROD, Numérico, 1 posição, para armazenar a categoria do
produto. Este campo somente poderá assumir os valores:
 1. Alimentos
 2.Vestuário
 3.Outros
 O usuário final poderá visualizar o cadastro por ordem de código ou
nome.
 Criar um Relatório que liste todos os campos do Cadastro, agrupado por
Categoria de Produtos, totalizando a quantidade de produtos por
Categoria bem como também o preço médio do produto na Categoria,
bem como a quantidade total de produtos e o preço médio geral do
cadastro.

Setembro/2008 77
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 6.11 – Resultado Final da Listagem de Fornecedores.

Setembro/2008 78
VISUAL FOX PRO
INTERMEDIÁRIO

7. LIGANDO E ENCAIXANDO OBJETOS


O Título deste Capítulo seria a tradução para o português do termo
OBJECT LINKING AND EMBEDDING, mais comumente conhecido por sua
sigla OLE.
OLE é um sistema de objetos distribuídos e um protocolo desenvolvido pela
Microsoft. Ele permite a um editor disponibilizar parte de um documento para
outro editor, e então reimportá-lo. Por exemplo, um sistema de editoração
eletrônica pode enviar texto para um processador de texto ou uma figura para
um editor gráfico usando OLE.
O Recurso de OLE permite implementarmos em nossos aplicativos objetos
não nativos do VFP.
Começando com um exemplo bem simples, o leitor deve criar um novo
formulário (herdado de FRS_PADRAO), colocando a Tabela de perfis
(TABPERF) no DataEnvironment. O objeto aqui é utilizarmos um recurso de
OLE para criar uma barra indicadora de progresso, com o objetivo de
contarmos a quantidade de registros da Tabela TABPERF. Salve este
formulário na pasta C:\TRABALHO\FORMULARIOS sob o nome de FRMOLE.

Para inserir o objeto desejado deve-se configurar a barra de ferramentas


para a classe Standard. Feito isto, deve-se selecionar na barra de ferramentas
o objeto destacado pela Figura 7.1.

Figura 7.1 – Selecionando Objeto com Recurso de OLE (ActiveX Control)

Feito isto, o VFP apresenta uma tela contemplando todos os Recursos de


OLE possíveis de implementação. Esta lista varia em cada equipamento, pois
estes recursos estão de acordo com a versão do Windows instalada, bem
como também outros aplicativos que disponibilizam uma integração via OLE.
Esta tela é ilustrada inicialmente pela Figura 7.2, e o leitor deve manter o
padrão do VFP mantendo Insert Control selecionado na opção Choose, em
destaque na figura.

Setembro/2008 79
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 7.2 – Inserindo um objeto via recurso de OLE.

Através das setas de cursor ou pelo mouse, o leitor deve navegar pela lista
Control Type, em busca do objeto procurado, conforme ilustra Figura 7.3.

Figura 7.3 – Selecionando Controle de OLE

Procure pelo Controle Microsoft ProgressBar Control, version 6.0


(selecionado na Figura 7.3). Observe em destaque na Figura 7.4 que é exibida
a identificação deste controle do Registro do Windows, bem como também o
arquivo onde ele está armazenado.

Setembro/2008 80
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 7.4 – Identificação do objeto no Registro do Windows e arquivo onde o mesmo


está armazenado.
O Fato é que o usuário final onde o aplicativo será executado, deverá ter
em seu equipamento o arquivo aqui indicado. Neste caso em particular, esta
barra de progresso, trata-se de um objeto padrão do Windows e, dificilmente
haverá problemas neste tipo de operação. Clique no botão OK, para finalizar a
escolha do objeto.

Figura 7.5 – Objeto OLE no Formulário

Setembro/2008 81
VISUAL FOX PRO
INTERMEDIÁRIO
A Figura 7.5 ilustra a aparência do objeto OLE no formulário. Observe à
direita, a barra de propriedades. Trata-se a partir deste momento de mais um
objeto que estamos manipulando suas propriedades e métodos. É importante
determinar um nome a este objeto, que aqui denomina-se OLEBARRA.
Redimensione OLEBARRA, modificando propriedade Scrolling para 1 –
Smooth Scrolling. Além disso, o leitor deve inserir um botão CMDCNTAR,
conforme ilustra a Figura 7.6.

Figura 7.6 – Preparando Formulário para utilizar Barra de Progresso.

O Evento Click de CMDCONTAR, deverá ter o código abaixo:

LOCAL nTotReg, nRegAtu

SET DELETED OFF

SELECT TABPERF
GO TOP
nTotReg = RECCOUNT()
nRegAtu = 0

ThisForm.OleBarra.Min = 0
ThisForm.oleBarra.max = nTotReg
ThisForm.oleBarra.value = 0

SCAN
nRegAtu = nRegAtu + 1
ThisForm.oleBarra.value = nRegAtu
= INKEY(0.1)
ENDSCAN

= MESSAGEBOX("Contados " + ALLTRIM(STR(nRegAtu)) + " Registros",


64,"PERFIS")

O Exemplo deste código é meramente educativo. A idéia é apenas


demonstrar a utilização da Barra de Progresso. O Fundamental na utilização
deste tipo de objeto é determinar seu valor mínimo, máximo e valor atual,
através das propriedades Min, Max e Value respectivamente, fazendo a barra

Setembro/2008 82
VISUAL FOX PRO
INTERMEDIÁRIO
de progresso “correr”. Agora o leitor pode “brincar” com a barra de progresso,
modificando a quantidade de registros em TABPERF e constatando o
funcionamento deste recurso.

Outro recurso interessante é a utilização do Calendário. Crie um novo


Formulário de nome FRMCALENDARIO, inserindo o Controle Microsoft
MonthView Control 6.0 (SP4). A Figura 7.7 ilustra a seleção do objeto e a
Figura 7.8 ilustra a aparência após a seleção.

Figura 7.7 – Selecionando objeto OLE para Calendário

Figura 7.8 – Aparência do Objeto Calendário.

Setembro/2008 83
VISUAL FOX PRO
INTERMEDIÁRIO
O objeto OLE deverá ser nomeado como OLECALENDARIO. No
Formulário crie a propriedade DATARETORNO, tendo como valor inicial uma
data em branco: {}. Ainda no objeto FORM1, modifique as propriedades
listadas abaixo:
 AlwaysOnTop: VERDADEIRO;
 BorderStyle: 1 – FIXED SINGLE;
 TitleBar: O – OFF;
 WindowType: 1 – MODAL.

Programação do método INIT:


ThisForm.Height = ThisForm.oleCalendario.Height
ThisForm.Width = Thisform.oleCalendario.Width

Programação do método UNLOAD:


RETURN Thisform.dataretorno

No objeto OLECALENDARIO, é necessário programar apenas o método


DblClick (Duplo Clique):

LOCAL nDia, nMes, nAno


nDia = This.day
nMes = This.month
nAno = This.year
ThisForm.dataretorno = DATE(nAno,nMes,nDia)
ThisForm.Release

O Leitor concluiu a criação de um formulário que ao ser chamado, retorna a


data escolhida no calendário. Você pode testar a funcionalidade deste
formulário da própria linha de comando do VFP, executando:

DO Form frmcalendario TO cdata

O Leitor pode agora explorar os recursos deste objeto OLE, navegando no


calendário. Escolha uma data com um duplo clique. O formulário será
encerrado e a data escolhida, armazenada na variável cData. Para conferir o
valor de cData, basta digitar na linha de comando:

? cData

Com a bagagem adquirida até o momento, têm-se condições de construir


uma classe para o input de Datas, permitindo sempre que o usuário final possa
chamar o calendário para auxiliá-lo na escolha de uma data.
Inicie o processo, criando uma nova classe de nome DATACALENDARIO,
herdada de CONTAINER_PADRAO (PADROES_CURSO.VCX) e armazenada
em C:\TRABALHO\CLASSES\OUTROS.VCX, conforme ilustra a Figura 7.9.

Setembro/2008 84
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 7.9 – Definição Inicial da Classe DATACALENDARIO.

Figura 7.10 – Aparência da Classe DATACALENDARIO.

A Figura 7.10 ilustra a aparência em tempo de programação da Classe


DATACALENDARIO.
O objeto mais abrangente (que neste caso é o Container) tem as
propriedades BackStyle e BorderWidth modificadas para 0 (zero).
O objeto TextBox, para a digitação da data, deverá ser herdado de
TEXTBOX_PADRAO, tendo como nome TXTDATA e seu valor inicial uma data
em branco (Value = {}).
Os métodos GotFocus e LostFocus, terão exatamente a mesma
programação, demonstrada à seguir:

DODEFAULT()
IF .Not. EMPTY(This.Value)
This.ToolTipText = DataExtenso(This.Value)
ELSE
This.ToolTipText = ""
ENDIF

DataExtenso é um programa (DATAEXTENSO.PRG) que retornará a data


escrita por extenso:

PARAMETERS pData
LOCAL cRetorno, nDiaSemana, nMes
nDiaSemana = DOW(pData)
nMes = MONTH(pData)
DO Case
CASE nDiaSemana = 1
cRetorno = "Domingo, "
CASE nDiaSemana = 2
cRetorno = "Segunda-Feira, "
CASE nDiaSemana = 3
cRetorno = "Terça-Feira, "
CASE nDiaSemana = 4
cRetorno = "Quarta-Feira, "
CASE nDiaSemana = 5
cRetorno = "Quinta-Feira, "

Setembro/2008 85
VISUAL FOX PRO
INTERMEDIÁRIO
CASE nDiaSemana = 6
cRetorno = "Sexta-Feira, "
OTHERWISE
cRetorno = "Sábado, "
ENDCASE
cRetorno = cRetorno + STR(DAY(pdata),2) + " de "
DO Case
CASE nMes = 1
cRetorno = cRetorno + "Janeiro"
CASE nMes = 2
cRetorno = cRetorno + "Fevereiro"
CASE nMes = 3
cRetorno = cRetorno + "Março"
CASE nMes = 4
cRetorno = cRetorno + "Abril"
CASE nMes = 5
cRetorno = cRetorno + "Maio"
CASE nMes = 6
cRetorno = cRetorno + "Junho"
CASE nMes = 7
cRetorno = cRetorno + "Julho"
CASE nMes = 8
cRetorno = cRetorno + "Agosto"
CASE nMes = 9
cRetorno = cRetorno + "Setembro"
CASE nMes = 10
cRetorno = cRetorno + "Outubro"
CASE nMes = 11
cRetorno = cRetorno + "Novembro"
CASE nMes = 12
cRetorno = cRetorno + "Dezembro"
ENDCASE
cRetorno = cRetorno + " de " + TRANSFORM(YEAR(pData),"9,999")
RETURN cRetorno

O objetivo desta implementação é fazer com que, quando o usuário passar


o mouse sobre a data, seja exibida a data por extenso, iniciando esta
informação com a indicação do dia da semana, conforme ilustra a Figura 7.11.

Figura 7.11 – Utilizando ToolTipText para mostrar Data por Extenso.


Parece um recurso “bobo”, mas mostrar a data por extenso e,
principalmente o dia da semana, auxilia em muito os usuários executam suas
tarefas diárias de acordo com o calendário.

Para finalizar a construção da classe DATACALENDARIO, falta


implementar o botão para a chamada do formulário com o calendário. Este

Setembro/2008 86
VISUAL FOX PRO
INTERMEDIÁRIO
botão será nomeado de CMDCALENDARIO. As propriedades de leiaute deste
objeto o caberá ao leitor configurar conforme ilustra a Figura 7.10. O evento
Click deve ser programado conforme o código abaixo:

LOCAL cData

DO FORM FrmCalendario TO cData

This.Parent.txtData.Value = cData
This.Parent.txtData.ToolTipText = DataExtenso(cData)

Feito isto, a construção da classe está terminada. Agora, o leitor pode


instanciar alguns objetos em um formulário para testar a classe recém criada.

Neste capítulo foram apresentados 2 exemplos de utilização dos recursos


de OLE no VFP. Existe uma infinidade de outros recursos, nativos do próprio
Windows ou até mesmo de outros aplicativos que venham a ser instalados no
computador.

Setembro/2008 87
VISUAL FOX PRO
INTERMEDIÁRIO

8. REGISTRO DE MOVIMENTAÇÕES
Este Capítulo tem por objeto apresentar técnicas de programação para o
registro de movimentações diversas em banco de dados. Até o presente
momento foram desenvolvidas técnicas exclusivas para a manutenção de
cadastros simples, que envolvem apenas 1 tabela.
Estas técnicas serão demonstradas através da construção de um formulário
para efetuar o cadastro e a manutenção de 1 pedido de vendas. Este processo
envolve o registro de um pedido de vendas. O registro deste pedido deverá ser
feito em 2 tabelas. Em uma delas são gravados os dados do que chamamos de
cabeçalho do pedido, como: Número, Identificação do Cliente, Data de Entrega,
entre outros. Um pedido, porém, pode ter inúmeros itens. Para a gravação
destes dados, é utilizada a tabela de itens de pedidos. Além destas tabelas
específicas para a gravação dos dados do pedido, é necessário tratar também
as tabelas de CLIENTES e PRODUTOS, pois, em um aplicativo profissional,
clientes e produtos dos pedidos, devem ter origem em dados previamente
cadastrados.
Antes de iniciar a criação do formulário, o leitor deverá criar dentro do banco
de dados as tabelas para registro do cabeçalho do pedido (PEDCAB) e dos
itens dos pedidos (PEDITE), conforme ilustram as figuras 8.1 e 8.2.

Figura 8.1 – Tabela PEDCAB, estrutura e índices.

Setembro/2008 88
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 8.2 – Tabela PEDITE, estrutura e índices.

O Formulário principal do registro de pedidos será gravado como


FRMPEDIDOS. Em seu ambiente de dados (DataEnvironment) deverão estar
presentes as tabelas PEDCAB, PEDITE, CADCLI e CADPRODUTO utilizando-
se como ordem principal os respectivos índices: PDCNRO, PDCNRO, CODIGO
e NOMPROD respectivamente. A ordem principal é definida na propriedade
Order de cada uma das tabelas no DataEnvironment.
O passo seguinte é dar uma cara ao formulário, colocando nele os objetos e
configurando sua aparência.
A Figura 8.3 destaca os botões que executam tarefas para gerenciar o
pedido como um todo. Todos os botões em destaque devem ficar contidos em
um Container Transparente (BackStyle = 0 – TRANSPARENT) e sem Bordas
(BorderWidth = 0) de nome CNTCONTROLESPEDIDO. Estes botões são:
 CMDNOVOPEDIDO: Possibilita a inclusão de um novo pedido. Herdado
de CMDNOVO_PADRAO.
 CMDALTERARPEDIDO: Possibilita a alteração de um pedido já
cadastrado. Herdado de CMDALTERAR_PADRAO.
 CMDEXCLUIRPEDIDO: Possibilita a exclusão de um pedido já
cadastrado. Herdado de CMDEXCLUIR_PADRAO.
 CMDPESQUISARPEDIDO: Executa formulário para localizar pedidos.
Herdado de CMDPESQUISAR_PADRAO.
 CMDEMITIRPEDIDO: Efetuar a Emissão de Report do Pedido atual.
Herdado de CMDRELATORIO_PADRAO.
 CMDGRAVARPEDIDO: Executa a gravação dos dados do pedido que
está sendo incluído ou alterado. Herdado de CMDGRAVA_PADRAO.
 CMDCANCELAPEDIDO: Aborta a inclusão ou desfaz as alterações no
pedido em curso. Herdado de CMDDESFAZER_PADRAO.
 CMDSAIR: Abandona o Formulário. Herdado de CMDSAIR_PADRAO.

Setembro/2008 89
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 8.3 – Em Destaque, Botões para Gerenciamento das Informações do Pedido como
um todo.

Figura 8.4 – Em Destaque, campos relativos ao cabeçalho do pedido.

Setembro/2008 90
VISUAL FOX PRO
INTERMEDIÁRIO
A Figura 8.4 destaca os campos relativos ao cabeçalho do pedido que
devem ser preenchidos pelo usuário. Todos os 5 campos em destaque, são
TextBox herdados de TEXTBOX_PADRAO, onde:
1. TXTNRO: Número do Pedido, que é gerado automaticamente pelo
formulário, sem interferência do usuário.
o InputMask: 99999;
o Value: 0.
2. TXTDTEMIS: Data de Emissão do Pedido, que é gerada
automaticamente pelo formulário.
o Value: {}.
3. TXTDTENT: Data de Entrega do Pedido.
o Value: {}.
4. CBOCODCLI: Determina o Cliente do Pedido, que deve estar
previamente cadastrado. A Combobox deve ser carregada com
todos os clientes do cadastrado e gerada através do seu construtor
(acionar Builder no clique com o botão direito do mouse sobre o
objeto);
o Selected Fields: NOME e CODIGO, nesta ordem - Aba List Items
do Construtor;
o Style: THREE-DIMENSIONAL, DROP-DOWN LIST e YES,
ENABLED INCREMENTAL SEARCH - Aba Style do Construtor;
o BoundColumn: 2 (Indica que a segunda coluna – CODIGO, será
retornada como Value do Objeto.
5. TXTOBS: Campo livre para digitação de observações no pedido;
o Format: K!;
o MaxLenght: 60.

Figura 8.5 – Em Destaque, Objetos para Gerenciamento dos Itens do Pedido.

Setembro/2008 91
VISUAL FOX PRO
INTERMEDIÁRIO
A Figura 8.5 destaca os objetos utilizados no gerenciamento dos itens do
Pedido. Aqui temos uma relação que chamamos de 1 x N, isto é, 1 pedido pode
ter N itens. Todos estes objetos estão contidos em um Container de fundo
transparente (BackStyle = 0 – TRANSPARENT) , com efeito de afundado
(SpecialEffect = 1 – SUNKEN) de nome CNTITENS, onde:
a. GRDITENS: objeto GRID para exibição dos itens. O Leitor repara
que a Figura 8.5 apresenta o GRID desprovido de colunas, pois este
será configurado via programação mais adiante. Deve ser herdado
de GRID_PADRAO e com ReadOnly = VERDADEIRO.
b. TXTSEQU: identifica o seqüencial dentro do pedido. Esta informação
será gerada automaticamente pelo aplicativo, sem interferência no
usuário na determinação de seu valor;
o Herdado: TEXTBOX_PADRAO;
o InputMask: 999;
o Value: 0
c. CBOCODPROD: Determina o produto utilizado no ítem, o qual deve
estar previamente cadastrado. Utilizar o Construtor (Builder), em sua
configuração;
o Herdado: COMBOBOX_PADRAO;
o Selected Fields: NOMPROD, CODPROD e PRCPROD (respeitar
esta ordem) – Aba List Items do Construtor;
o Style: THREE-DIMENSIONAL, DROP-DOWN LIST e YES,
ENABLED INCREMENTAL SEARCH - Aba Style do Construtor;
o BoundColumn: 2 (Indica que a segunda coluna – CODPROD,
será retornada como Value do Objeto.
d. TXTVLRUNI: Armazena o preço unitário de venda do produto, trazido
do cadastro. Este campo servirá apenas para visualização, sendo
que o usuário final não terá acesso a modificá-lo;
o Herdado: TEXTBOX_PADRAO;
o InputMask: 9999,999.99;
o Value: 0.
e. TXTQTDE: Armazena a quantidade de itens do pedido, que será
digitada pelo usuário;
o Herdado: TEXTBOX_PADRAO;
o InputMask: 9999;
o Value: 0.
f. TXTDESC: Armazena o percentual de desconto do item, que será
digitado pelo usuário;
o Herdado: TEXTBOX_PADRAO:
o InputMask: 99.9;
o Value: 0.
g. TXTVLRTOTITEM: Armazena o valor total do item, que é calculado
com base no preço unitário, quantidade e desconto. Este campo é
apenas para visualização do usuário;
o Herdado: TEXTBOX_PADRAO;
o InputMask: 9999,999.99;
o Value: 0.
h. CMDNOVOITEM: Botão para Inclusão de novo item no pedido,
herdado de CMDNOVO_PADRAO.

Setembro/2008 92
VISUAL FOX PRO
INTERMEDIÁRIO
i. CMDALTERARITEM: Botão para Alteração de item, herdado de
CMDALTERAR_PADRAO.
j. CMDEXCLUIRITEM: Botão para Exclusão de item, herdado de
CMDEXCLUIR_PADRAO.
k. CMDCONFIRMAITEM: Botão para Efetuar a confirmação de inclusão
de item ou alteração de dados de item, sendo herdado de
CMDOK_PADRAO.
l. CMDCANCELAITEM: Botão para abortar inclusão ou desfazer
alteração de dados de item, sendo herdado de
CMDCANC_PADRAO.

Figura 8.6 – Em Destaque, Total do Pedido.


A Figura 8.6 destaque o TextoBox TXTTOTALPEDIDO, utilizado para
exibição do Valor Total do Pedido. Este objeto é atualizado constantemente,
mostrando ao usuário sempre o total atual de um pedido que está sendo
digitado ou já concluído. Este objeto é herdado de TEXTBOX_PADRAO, com
InputMask = 9999,999.99, Value = 0 e Enabled = FALSO.

O leitor pode reparar que neste breve descritivo dos objetos que compõem
nosso formulário, são omitidas as Labels. Estes objetos não terão suas
propriedades modificadas em tempo de execução do programa, sendo assim
não se faz necessário criar um nome específico, podendo ficar o nome
atribuído pelo próprio VFP quando o objeto é criado. Recomenda-se que todas
estas labels, sejam herdadas de LABEL_PADRAO.
Neste mesmo descritivo, foi dada menção aos valores de propriedades
modificados, daqueles padrões definidos em suas respectivas classes.

Setembro/2008 93
VISUAL FOX PRO
INTERMEDIÁRIO
O passo seguinte é proceder à programação dos eventos dos objetos. Aqui
será apresentada a programação feita em cada objeto e comentada quando
necessário for.

Primeiramente apresentamos os métodos criados no FORMSET.

ATUALIZAGRIDITENS: Este método efetua a atualização do GRID dos


itens, conforme número do pedido passado como parâmetro.
PARAMETERS pPedido

LOCAL nFatTamanho, k_Cnt


LOCAL ARRAY ArrGrid[7,4]

**** Localizando Pedido *****


IF pPedido > 0
SELECT I.PdiSeq as Seq, ;
I.PdiCodProd as CodProd, ;
P.NomProd as NomProd, ;
I.PdiQtde as Qtde, ;
I.PdiVlrUni as VlrUni, ;
I.PdiDesc as Desc, ;
(I.PdiQtde*I.PdiVlrUni -
ROUND(I.PdiQtde*I.PdiVlrUni*(I.PdiDesc/100),2)) as VlrTot ;
FROM PedIte I, CadProdu P ;
WHERE I.PdiNro = pPedido AND ;
P.CodProd = I.PdiCodProd ;
ORDER BY I.PdiSeq ;
INTO CURSOR Cr_Itens READWRITE
ELSE
ZAP IN Cr_Itens
ENDIF
GO TOP IN Cr_Itens

*** Configura Grid


nFatTamanho = 8

ArrGrid[1,1] = "Cr_Itens.Seq"
ArrGrid[1,2] = "Ítem"
ArrGrid[1,3] = "999"
ArrGrid[1,4] = 4

ArrGrid[2,1] = "Cr_Itens.CodProd"
ArrGrid[2,2] = "Código"
ArrGrid[2,3] = "999999"
ArrGrid[2,4] = 6

ArrGrid[3,1] = "Cr_Itens.NomProd"
ArrGrid[3,2] = "Descrição do Produto"
ArrGrid[3,3] = ""

Setembro/2008 94
VISUAL FOX PRO
INTERMEDIÁRIO
ArrGrid[3,4] = 35

ArrGrid[4,1] = "Cr_Itens.Qtde"
ArrGrid[4,2] = "Qtd."
ArrGrid[4,3] = "9999"
ArrGrid[4,4] = 4

ArrGrid[5,1] = "Cr_Itens.VlrUni"
ArrGrid[5,2] = "Preço Un."
ArrGrid[5,3] = "9999,999.99"
ArrGrid[5,4] = 9

ArrGrid[6,1] = "Cr_Itens.Desc"
ArrGrid[6,2] = "% Desc"
ArrGrid[6,3] = "99,9"
ArrGrid[6,4] = 6

ArrGrid[7,1] = "Cr_Itens.VlrTot"
ArrGrid[7,2] = "Total Ítem"
ArrGrid[7,3] = "9999,999.99"
ArrGrid[7,4] = 9

WITH ThisFormset.Form1.CntItens.GrdItens
.ColumnCount = ALEN(ArrGrid,1)
.RecordSource = "Cr_Itens"
FOR k_Cnt = 1 TO .ColumnCount
WITH .Columns[k_Cnt]
.ControlSource = ArrGrid[k_Cnt,1]
.InputMask = ArrGrid[k_Cnt,3]
.Width = ArrGrid[k_Cnt,4]*nFatTamanho
.Resizable = .F.
WITH .Header1
.Alignment = 2
.BackColor = RGB(0,128,192)
.Caption = ArrGrid[k_Cnt,2]
.FontBold = .T.
.ForeColor = RGB(255,255,255)
ENDWITH
ENDWITH
NEXT
.Refresh
ENDWITH
Neste método podemos ver primeiramente a aplicação de comandos SQL
que são entendidos e executados perfeitamente pelo VFP. Além disto, é
apresentada também a configuração do GRID de forma programada.

CALCULATOTALITEM: Este método efetua o cálculo do Total do ítem,


armazendo o valor atualizado no respectivo objeto.
LOCAL nQtde, nVlrUnit, nDesconto, nVlrDesc, nVlrTotal

Setembro/2008 95
VISUAL FOX PRO
INTERMEDIÁRIO

WITH ThisFormset.Form1.CntItens
nQtde = .txtQtde.Value
nVlrUnit = .txtVlrUni.value
nDesconto = .txtDesc.Value

nVlrDesc = ROUND(nQtde*nVlrUnit*(nDesconto/100),2)
nVlrTotal = nQtde*nVlrUnit - nVlrDesc

.txtVlrTotItem.value = nVlrTotal
ENDWITH

CALCULATOTALPEDIDO: Este método efetua o cálculo do Total do


Pedido, Atualizando este valor no formulário.
LOCAL ARRAY ArrTotal[1]
ArrTotal[1] = 0
SELECT SUM(VlrTot) FROM Cr_Itens INTO ARRAY ArrTotal
IF ISNULL(ArrTotal[1])
ArrTotal[1] = 0
ENDIF
ThisFormset.Form1.txtTotalPedido.Value = ArrTotal[1]
Neste caso pode-se perceber mais um exemplo de aplicação do recurso
SQL dentro do VFP, com a utilização de um comando que agrega dados, SUM.
Além do mais cita-se a função ISNULL. Esta função retorna VERDADEIRO ou
FALSO se o dado é do tipo nulo.

CARREGADADOSITEM: Este método carrega os dados do item para os


controles.
PARAMETERS pItem

* Passa o número do ítem para carga


* pItem = 0, Significa Novo Ítem
* pItem > 0, Carregar Registro Corrente.

LOCAL ARRAY ArrSeq[1]

WITH ThisFormset.Form1.CntItens

IF pItem = 0
**** Novo Ítem, Carregar Próximo Sequencial ****
SELECT MAX(Seq) FROM Cr_Itens INTO ARRAY ArrSeq
IF ISNULL(ArrSeq[1])
ArrSeq[1] = 0
ENDIF

.txtSeq.value = ArrSeq[1] + 1
.cboCodProd.Value = 0
.txtVlrUni.value = 0

Setembro/2008 96
VISUAL FOX PRO
INTERMEDIÁRIO
.txtDesc.Value = 0
.txtQtde.value = 0
ELSE
.txtSeq.value = Cr_Itens.Seq
.cboCodProd.value = Cr_Itens.CodProd
.txtVlrUni.value = Cr_Itens.VlrUni
.txtQtde.Value = Cr_Itens.Qtde
.txtDesc.Value = Cr_Itens.Desc
ENDIF

ENDWITH

ThisFormSet.calculatotalitem()

CARREGADADOSPEDIDO: Este método efetua a carga de dados do


pedido, conforme número do pedido passado como parâmetro.
PARAMETERS pPedido
LOCAL ARRAY ArrPedido[1,4]
ArrPedido[1,1] = 0 && Código do Cliente
ArrPedido[1,2] = DATE() && Data de Emissão
ArrPedido[1,3] = {} && Data de Entrega
ArrPedido[1,4] = "" && Observações
IF pPedido > 0
SELECT PdcCodCli, ;
PdcDtEmis, ;
PdcDtEnt, ;
PdcObs ;
FROM PedCab ;
WHERE PdcNro = pPedido ;
INTO ARRAY ArrPedido
ENDIF
WITH ThisFormSet.form1
.txtnro.value = pPedido
.cboCodCli.value = ArrPedido[1,1]
.txtDtemis.Value = ArrPedido[1,2]
.txtDtEnt.value = ArrPedido[1,3]
.txtObs.value = ArrPedido[1,4]
ENDWITH
ThisFormSet.atualizagriditens(pPedido)
ThisformSet.calculatotalpedido()
O Resultado de uma consulta SQL (Select) pode ser direcionado para uma
Matriz de memória (INTO ARRAY) como também para uma tabela temporária
(INTO CURSOR). Existem outros direcionamentos que também podem ser
utilizados (ver o HELP do VFP), sendo estes dois os mais amplamente
utilizados.

Setembro/2008 97
VISUAL FOX PRO
INTERMEDIÁRIO
GRAVAITEM: Este método efetua a gravação de um item no Cursor
Temporário.
LOCAL nPosProduto, cNomeProd, nSeq
WITH ThisFormset.Form1.CntItens
nPosProduto = .cboCodProd.ListIndex
cNomeProd = .CboCodProd.List[nPosProduto,1]
nSeq = .txtSeq.value
IF .Not. SEEK(nSeq,"CR_ITENS","SEQ")
APPEND BLANK IN Cr_Itens
Replace Cr_Itens.Seq WITH .txtSeq.value IN Cr_Itens
ENDIF
Replace Cr_Itens.CodProd WITH .CboCodProd.value IN Cr_Itens
Replace Cr_Itens.NomProd WITH cNomeProd IN Cr_Itens
Replace Cr_Itens.Qtde WITH .txtQtde.Value IN Cr_Itens
Replace Cr_Itens.VlrUni WITH .txtVlrUni.Value IN Cr_Itens
Replace Cr_Itens.Desc WITH .txtDesc.Value IN Cr_Itens
Replace Cr_Itens.VlrTot WITH .txtVlrTotItem.Value IN Cr_Itens
.grdItens.Refresh()
ENDWITH
ThisFormSet.calculatotalpedido

GRAVAPEDIDO: Este método efetua a Gravação dos dados do pedido.


PARAMETERS pTipoGravacao
* pTipoGravacao: 1 - Atualização (Inclusão ou Alteração)
* -1 - Exclusão
LOCAL nPdcNro
LOCAL ARRAY ArrProxPed[1]
nPdcNro = ThisFormset.Form1.txtnro.Value
IF pTipoGravacao < 0
DELETE FROM PEDCAB WHERE PDCNRO = nPdcNro
= TABLEUPDATE(1,.T.,"PEDCAB")
GO TOP IN PEDCAB

DELETE FROM PEDITE WHERE PDINRO = nPdcNro


= TABLEUPDATE(1,.T.,"PEDITE")
GO TOP IN PEDITE
ELSE
IF nPdcNro = 0
*** Gerar Número de Pedido Automaticamente ***
SELECT MAX(PdcNro) FROM PedCab INTO ARRAY ArrProxPed
IF ISNULL(ArrProxPed[1])
ArrProxPed[1] = 0
ENDIF
nPdcNro = ArrProxPed[1] + 1
ThisFormset.Form1.txtnro.Value = nPdcNro
ENDIF

SET DELETED OFF


IF SEEK(nPdcNro,"PEDCAB","PDCNRO")

Setembro/2008 98
VISUAL FOX PRO
INTERMEDIÁRIO
IF DELETED("PEDCAB")
RECALL IN PEDCAB
ENDIF
ELSE
APPEND BLANK IN PedCab
Replace PedCab.PdcNro WITH nPdcNro IN PedCab
ENDIF
Replace PedCab.PdcCodCli WITH ThisFormSet.form1.cboCodCli.Value
IN PedCab
Replace PedCab.PdcDtEmis WITH ThisFormSet.form1.txtDtEmis.Value
IN PedCab
Replace PedCab.PdcDtEnt WITH ThisFormSet.form1.txtdtEnt.Value IN
PedCab
Replace PedCab.PdcObs WITH ThisFormSet.form1.txtobs.Value IN
PedCab
SET DELETED ON
= TABLEUPDATE(1,.T.,"PEDCAB")
GO TOP IN PEDCAB
**** Efetuando a Gravação dos Ítens ****
DELETE FROM PEDITE WHERE PDINRO = nPdcNro
= TABLEUPDATE(1,.T.,"PEDITE")
GO TOP IN PEDITE
SELECT Cr_Itens
GO TOP
SCAN
SET DELETED OFF
IF SEEK( STR(nPdcNro,5)+STR(Cr_Itens.Seq,3),"PEDITE","PDISEQ")
IF DELETED("PEDITE")
RECALL IN PEDITE
ENDIF
ELSE
APPEND BLANK IN PEDITE
Replace PEDITE.PdiNro WITH nPdcNro IN PEDITE
Replace PEDITE.PdiSeq WITH Cr_Itens.Seq IN PEDITE
ENDIF
Replace PEDITE.PdiCodProd WITH Cr_Itens.CodProd IN PEDITE
Replace PEDITE.PdiQtde WITH Cr_Itens.Qtde IN PEDITE
Replace PEDITE.PdiVlrUni WITH Cr_Itens.VlrUni IN PEDITE
Replace PEDITE.PdiDesc WITH Cr_Itens.Desc IN PEDITE
= TABLEUPDATE(1,.t.,"PEDITE")
GO TOP IN PEDITE
ENDSCAN
*****************************************
ENDIF
Aqui vê-se a utilização dos comandos SQL de gravação em tabelas, neste
caso o DELETE. Os outros dois comandos SQL de gravação de dados
(INSERT e UPDATE) também funcionam perfeitamente no VFP. Neste trecho
de código pode-se notar também a utilização do laço SCAN – ENDSCAN. Este
laço permite “navegar” por toda a tabela ou cursor temporário, especificando
uma condição se for necessário.

Setembro/2008 99
VISUAL FOX PRO
INTERMEDIÁRIO
STATUSMANUTITEM: Este método configura a apresentação dos controles
do item do pedido conforme parâmetro.
PARAMETERS pStatus
* pStatus: 0 - Exibir dados do Pedido
* 1 - Edição de Dados do Pedido
WITH ThisFormset.Form1.CntItens
.SetAll("Enabled",IIF(pStatus=0,.F.,.T.),"TextBox_Padrao")
.SetAll("Enabled",IIF(pStatus=0,.F.,.T.),"ComboBox_Padrao")
.CmdNovoItem.Enabled = IIF(pStatus=0,.T.,.F.)
.CmdAlterarItem.Enabled = IIF(pStatus=0 And .txtSeq.Value > 0,.T.,.F.)
.CmdExcluirItem.Enabled = IIF(pStatus=0 And .txtSeq.Value > 0,.T.,.F.)
.CmdConfirmaItem.enabled = IIF(pStatus=1,.T.,.F.)
.CmdCancelaItem.enabled = IIF(pStatus=1,.T.,.F.)
ENDWITH
Observa-se neste método a utilização da função SetAll, utilizada para
habilitar/desabilitar simultaneamente todos os controles pertencentes a uma
classe especificada, contidas no objeto de onde é executada esta função.

STATUSMANUTPEDIDO: Este método atualiza o Status da Manutenção do


Pedido como um Todo, conforme o parâmetro informado.
PARAMETERS pStatus
* pStatus: 0 - Exibir dados do Pedido
* 1 - Edição de Dados do Pedido
WITH ThisFormSet.Form1
.SetAll("Enabled",IIF(pStatus=1,.T.,.F.),"TextBox_padrao")
.SetAll("Enabled",IIF(pStatus=1,.T.,.F.),"ComboBox_padrao")
ThisFormset.Form1.txtTotalPedido.Enabled = .F.
.cntItens.Enabled = IIF(pStatus=1,.T.,.F.)
WITH .cntControlesPedido
.CmdNovoPedido.Enabled = IIF(pStatus=1,.F.,.T.)
.CmdAlterarPedido.Enabled = IIF(pStatus=0 And
ThisFormSet.Form1.txtnro.value > 0,.T.,.F.)
.CmdExcluirPedido.Enabled = IIF(pStatus=0 And
ThisFormSet.Form1.txtnro.value > 0,.T.,.F.)
.CmdPesquisarPedido.Enabled = IIF(pStatus=0,.T.,.F.)
.CmdEmitirPedido.Enabled = IIF(pStatus=0 And
ThisFormSet.Form1.txtnro.value > 0,.T.,.F.)
.CmdGravarPedido.Enabled = IIF(pStatus=1,.T.,.F.)
.CmdCancelaPedido.Enabled = IIF(pStatus=1,.T.,.F.)
ENDWITH
ENDWITH
ThisFormSet.statusmanutitem(0)

Setembro/2008 100
VISUAL FOX PRO
INTERMEDIÁRIO
VALIDADADOSITEM: Este método efetua a validação dos dados do item,
retornado VERDADEIRO ou FALSO, quanto a sua consistência.
WITH ThisFormset.Form1.CntItens
IF .cboCodProd.Value = 0
= MESSAGEBOX("Nenhum Produto Selecionado!",16,"Ítem
Inconsistente")
RETURN .F.
ENDIF
IF .txtVlrUni.Value <= 0
= MESSAGEBOX("Preço Unitário do Produto Inválido!",16,"Ítem
Inconsistente")
RETURN .F.
ENDIF
IF .txtQtde.Value <= 0
= MESSAGEBOX("Quantidade Inválida!",16,"Ítem Inconsistente")
RETURN .F.
ENDIF
IF .txtDesc.Value < 0
= MESSAGEBOX("Percentual de Desconto Inválido!",16,"Ítem
Inconsistente")
RETURN .F.
ENDIF
RETURN .T.
ENDWITH

VALIDADADOSPEDIDO: Este método efetua a validação da digitação dos


dados do pedido, retornando VERDADEIRO ou FALSO conforme sua
consistência.
WITH ThisformSet.form1
IF .cbocodcli.value = 0
= MESSAGEBOX("Cliente NÃO INFORMADO!",16,"Pedido
Inconsistente")
RETURN .F.
ENDIF
IF .txtDtEnt.value < .txtDtEmis.value
= MESSAGEBOX("Data de Entrega INVÁLIDA ou NÃO
INFORMADA@!",16,"Pedido Inconsistente")
RETURN .F.
ENDIF
IF .txtTotalPedido.value = 0
= MESSAGEBOX("Não Há Ítens Lançados para o Pedido!",16,"Pedido
Inconsistente")
RETURN .f.
ENDIF
RETURN .T.
ENDWITH

Ainda no FORMSET, seguem os eventos NATIVOS que devem ser


programados:

Setembro/2008 101
VISUAL FOX PRO
INTERMEDIÁRIO
LOAD
DO Ambiente
CREATE CURSOR Cr_Itens ( Seq N(3), ;
CodProd N(6), ;
NomProd C(60), ;
Qtde N(4), ;
VlrUni N(12,2), ;
Desc N(4,1), ;
VlrTot N(12,2))
SELECT Cr_Itens
INDEX on Seq TAG Seq
O Comando CREATE CURSOR possibilita a criação de uma tabela
temporária dentro do VFP. Este tipo de recurso é extremamente útil na
programação. Para a criação da tabela temporária, segue-se o nome desta
tabela (neste caso CR_ITENS) e na seqüência o nome dos campos seguido de
seu tipo de dado e tamanho. O comando INDEX ON é utilizado na criação de
um índice para a tabela temporária. Este índice faz-se necessário quando se
deseja uma ordenação na tabela temporária ou o aplicativo fará buscas na
tabela temporária. Quando a tabela temporária é fechada (através do comando
USE para fechar uma tabela em particular ou o comando CLOSE DATA ou
CLOSE ALL) a tabela temporária é automaticamente removida do disco pelo
VFP.

INIT
ThisFormSet.carregadadospedido(0)
ThisFormSet.statusmanutpedido(0)

UNLOAD
IF USED("Cr_Itens")
USE IN Cr_Itens
ENDIF
Ao Finalizar o formulário, é verificado se a tabela temporária está aberta,
função USED que retorna VERDADEIRO ou FALSO, fechando-a se estiver
aberta.

O FORMSET é utilizado para a criação de métodos que impliquem em


códigos mais longos ou repetitivos, bem como também as ações de
inicialização (LOAD, INIT) e finalização do formulário (DESTROY, UNLOAD). A
seguir, apresentamos a programação a ser feita nos objetos que estão contidos
no FORMSET. A tendência é que o tamanho dos códigos de cada objeto, seja
relativamente pequeno, pois o “grosso” já fora escrito no FORMSET.
Os botões em destacados pela Figura 8.3, apresentam código no evento
CLICK, a saber:

Setembro/2008 102
VISUAL FOX PRO
INTERMEDIÁRIO
CMDNOVOPEDIDO
ThisFormset.carregadadospedido(0)
ThisFormSet.STatusmanutpedido(1)
ThisForm.txtnro.Enabled = .F.
ThisForm.txtDtEmis.Enabled = .F.
ThisForm.txtDtEnt.SetFocus()

CMDALTERARPEDIDO
ThisFormSet.statusmanutpedido(1)
ThisForm.txtnro.Enabled = .F.
ThisForm.txtDtEmis.Enabled = .F.
ThisForm.txtDtEnt.SetFocus()

CMDEXCLUIRPEDIDO
IF MESSAGEBOX("Confirma a Eliminação deste Pedido?",
4+32+256,"Operação Crítica")=6
ThisFormSet.gravapedido(-1)
ThisFormSet.carregadadospedido(0)
ThisFormSet.statusmanutitem(0)
ENDIF

CMDGRAVARPEDIDO
IF ThisFormSet.validadadospedido()
ThisformSet.gravapedido(1)
ThisFormSet.carregadadospedido(ThisForm.txtnro.value)
ThisformSet.statusmanutpedido(0)
ENDIF

CMDCANCELAPEDIDO.DESFAZIMENTO
ThisFormSet.carregadadospedido(ThisForm.txtnro.value)
ThisformSet.statusmanutpedido(0)
Atenção que neste botão o código deverá estar no método
DESFAZIMENTO.

No Botão CMDSAIR, o código da classe já satisfaz a necessidade.


As caixas de texto para digitação dos dados do cabeçalho do pedido, em
destaque pela Figura 8.4, não necessitam de códigos adicionais. À seguir,
segue a codificação dos objetos e métodos utilizados no gerenciamento dos
itens do pedido, ilustrados na Figura 8.5.

GRDITENS.AFTERROWCOLCHANGE
LPARAMETERS nColIndex
ThisFormSet.carregadadositem(Cr_Itens.Seq)
ThisFormSet.STatusmanutitem(0)

Setembro/2008 103
VISUAL FOX PRO
INTERMEDIÁRIO

CBOCODPROD.VALID
LOCAL nPos, nPrecoUni
nPos = This.ListIndex
IF this.ListIndex > 0
nPrecoUni = VAL(This.List[nPos,3])
ELSE
nPrecoUni = 0
ENDIF
This.Parent.txtVlrUni.Value = nPrecoUni
ThisFormSet.calculatotalitem()

TXTQTDE.VALID
ThisFormSet.calculatotalitem()

TXTDESC.VALID
ThisFormSet.calculatotalitem()

CMDNOVOITEM.CLICK
ThisForm.CntControlesPedido.Enabled = .F.
ThisformSet.carregadadositem(0)
ThisFormSet.statusmanutitem(1)
This.Parent.txtseq.Enabled = .F.
This.Parent.txtVlrUni.Enabled = .F.
This.Parent.txtVlrTotItem.Enabled = .F.
This.Parent.cboCodProd.SetFocus()

CMDALTERARITEM.CLICK
ThisForm.CntControlesPedido.Enabled = .F.
ThisformSet.carregadadositem(Cr_Itens.Seq)
ThisFormSet.statusmanutitem(1)
This.Parent.txtseq.Enabled = .F.
This.Parent.txtVlrUni.Enabled = .F.
This.Parent.txtVlrTotItem.Enabled = .F.
This.Parent.cboCodProd.SetFocus()

CMDEXLCUIRITEM.CLICK
IF MESSAGEBOX("Confirma a Exclusão do Ítem?",4+32+256,"Operação
Crítica") = 6
DELETE IN Cr_Itens
SKIP IN Cr_Itens
IF EOF("Cr_Itens")
GO TOP IN Cr_Itens
ENDIF
ThisformSet.carregadadositem(Cr_Itens.Seq)
ThisFormSet.statusmanutitem(0)

Setembro/2008 104
VISUAL FOX PRO
INTERMEDIÁRIO
ThisformSet.calculatotalpedido()
ENDIF

CMDCONFIRMAITEM.CLICK
IF ThisFormSet.validadadositem()
ThisFormSet.gravaitem()
ThisFormSet.statusmanutitem(0)
ThisForm.CntControlesPedido.Enabled = .T.
ENDIF

CMDCANCELAITEM.CLICK
ThisformSet.statusmanutitem(0)
ThisForm.CntControlesPedido.Enabled = .T.

A área do Total do Pedido, em destaque na Figura 8.6, não necessidade de


códigos adicionais em seus objetos. Feito isto, você pode executar e cadastrar
um pedido. Antes de executar, certifique-se que você tenha cadastrado
produtos e clientes, caso contrário não conseguirá incluir um pedido.

O leitor pode notar que faltou a especificação de 2 botões de comando:


Pesquisar (CMDPESQUISARPEDIDO) e Emitir(CMDEMITIRPEDIDO).

O Botão Pesquisar tem por função executar outra tela, onde o usuário
consultar os pedidos registrados, retornando as informações do pedido
escolhido para alteração, exclusão ou impressão do pedido. O código do
evento CLICK deste botão vem a seguir:

LOCAL nPedido
DO FORM FrmPesquisaPedidos TO nPedido
ThisFormset.carregadadospedido(nPedido)
ThisFormSet.statusmanutpedido(0)

O comando DO FORM FrmPesquisaPedidos TO nPedido, implica na


execução do formulário FRMPESQUISAPEDIDOS que retornará uma
informação que será armazenada na variável NPEDIDO. Em nosso contexto,
esta informação será o número do pedido selecionado pelo usuário no
formulário executado.
No FORMSET, deverá ser criada a propriedade RETORNO, com valor
inicial 0. Será esta propriedade a responsável por armazenar o valor que será
retornado pelo formulário. É importante frisar que este formulário deve ter
também uma sessão de dados privada (DataSession = 2 – PRIVATE
DATASESSION).

No evento LOAD deve ser programado:


DO Ambiente
SELECT P.PdcNro as Pedido, ;
P.PdcDtEmis as Emissao, ;
C.Nome as Cliente, ;

Setembro/2008 105
VISUAL FOX PRO
INTERMEDIÁRIO
P.PdcDtEnt as Entrega ;
FROM PedCab P, CadCli C ;
WHERE C.Codigo = P.PdcCodCli AND .F. ;
INTO CURSOR Cr_Pedidos READWRITE
Neste código a novidade é o parâmetro READWRITE após o SELECT.
Todo o cursor resultado de um Select SQL, é originalmente ReadOnlu, isto é,
não permitido alterar os dados retornados. Para que se possa manipular estes
dados, acrescenta-se a cláusula READWRITE.

No evento INIT deve ser programado:


ThisFormSet.configuragrid()

Observe que o evento INIT, chama o método CONFIGURAGRID. Este


método tem como função parametrizar o objeto GRID para visualização dos
pedidos como resultado da consulta e deve ser programado conforme segue:
LOCAL ARRAY ArrGrid[4,4]
LOCAL nFatTamanho
*** Configura Grid
nFatTamanho = 8
ArrGrid[1,1] = "Cr_Pedidos.Pedido"
ArrGrid[1,2] = "Pedido"
ArrGrid[1,3] = "99999"
ArrGrid[1,4] = 5
ArrGrid[2,1] = "Cr_Pedidos.Emissao"
ArrGrid[2,2] = "Emissão"
ArrGrid[2,3] = ""
ArrGrid[2,4] = 10
ArrGrid[3,1] = "Cr_Pedidos.Cliente"
ArrGrid[3,2] = "Cliente"
ArrGrid[3,3] = ""
ArrGrid[3,4] = 35
ArrGrid[4,1] = "Cr_Pedidos.Entrega"
ArrGrid[4,2] = "Entrega"
ArrGrid[4,3] = ""
ArrGrid[4,4] = 10
WITH ThisFormset.form1.grdPedidos
.ColumnCount = ALEN(ArrGrid,1)
.RecordSource = "Cr_Pedidos"
FOR k_Cnt = 1 TO .ColumnCount
WITH .Columns[k_Cnt]
.ControlSource = ArrGrid[k_Cnt,1]
.InputMask = ArrGrid[k_Cnt,3]
.Width = ArrGrid[k_Cnt,4]*nFatTamanho
.Resizable = .F.
WITH .Header1
.Alignment = 2
.BackColor = RGB(0,128,192)
.Caption = ArrGrid[k_Cnt,2]
.FontBold = .T.

Setembro/2008 106
VISUAL FOX PRO
INTERMEDIÁRIO
.ForeColor = RGB(255,255,255)
ENDWITH
ENDWITH
NEXT
.Refresh
ENDWITH

No evento UNLOAD, programa-se:


IF USED("Cr_Pedidos")
USE IN Cr_Pedidos
ENDIF
RETURN ThisFormSet.retorno
O retorno dado pelo formulário é o parâmetro do comando RETURN,
executado no método UNLOAD.

Para que um formulário possa retornar valores é obrigatório que a


propriedade WindowType do FORMSET e FORMULÁRIO PRINCIPAL, esteja
com o valor 1 – MODAL. Um Formulário modal implica que o processamento
do aplicativo somente será seguido após a execução do formulário. O padrão
da propriedade WindowType é 0 – MODELESS. Vários formulários
MODELESS podem ser executados simultaneamente no mesmo aplicativo.
Quando entra em cena um formulário MODAL, a execução de qualquer outro
formulário, somente segue quando o formulário MODAL é finalizado. Se o
usuário tentar a execução de um formulário MODELESS com o parâmetro
retornar valor, o VFP abortará a execução do aplicativo com um erro.

Figura 8.7 – Formulário de Pesquisa de Pedidos.

Setembro/2008 107
VISUAL FOX PRO
INTERMEDIÁRIO
A Figura 8.7 ilustra o formulário de pesquisa dos pedidos, destacando-se os
objetos:

1. OPTPESQUISA: herdado de OPTGROUP_PADRAO;


2. TXTNUMERO: herdado de TEXTBOX_PADRAO;
 Format: 99999;
 Value: 0.
3. DATAINICIAL: herdado de DATACALENDARIO;
 Enabled: FALSO.
4. DATAFINAL: herdado de DATACALENDARIO;
 Enabled: FALSO.
5. CMDPESQUISAR: herdado da STANDARD;
6. GRDPEDIDOS: herdado de GRID_PADRAO;
7. CMDSAIR: herdado de CMDSAIR_PADRAO.

Observe que nestes objetos utilizamos os campos data de nossa classe


DATACALENARIO, que permitirá ao usuário escolher a data através do auxílio
de um calendário.

O Botão Pesquisar (CMDPESQUISAR) possui a função de efetuar a busca


no banco de dados, conforme a solicitação do usuário, tendo a seguinte
programação no evento CLICK:

LOCAL nPedido, cDataIni, cDataFim, nTipoPesq

nTipoPesq = ThisForm.OptPesquisa.Value

*** Verificar se o Filtro digitado é consistente ***


IF nTipoPesq = 1
*** Pesquisa por Número
nPedido = This.Parent.txtNumero.Value
IF nPedido <= 0
= MESSAGEBOX("Número do Pedido Inválido para Consulta!",
48,"Consulta de Pedidos")
RETURN
ENDIF
ThisForm.dataInicial.txtData.Value = {}
ThisForm.dataFinal.txtData.Value = {}
ELSE

This.Parent.txtNumero.Value = 0

cDataIni = ThisForm.dataInicial.txtData.Value
cDataFim = ThisForm.dataFinal.txtData.Value

IF EMPTY(cDataIni)
= MESSAGEBOX("Data Inicial NÃO INFORMADa!",48,"Consulta de
Pedidos")
RETURN
ENDIF

Setembro/2008 108
VISUAL FOX PRO
INTERMEDIÁRIO

IF cDataFim < cDataIni


= MESSAGEBOX("Data Final INVÁLIDA!",48,"Consulta de Pedidos")
RETURN
ENDIF

ENDIF

SELECT P.PdcNro as Pedido, ;


P.PdcDtEmis as Emissao, ;
C.Nome as Cliente, ;
P.PdcDtEnt as Entrega ;
FROM PedCab P, CadCli C ;
WHERE IIF( nTipoPesq = 1, P.PdcNro = nPedido,
BETWEEN(P.PdcDtEmis,cDataIni,cDataFim)) ;
AND C.Codigo = P.PdcCodCli ;
INTO CURSOR Cr_Pedidos READWRITE

ThisFormSet.configuragrid

Por Fim, para adaptar o botão sair na necessidade deste formulário,


programa-se no seu evento CLICK.
ThisFormSet.Retorno = 0
ThisFormSet.Release

Terminado! Agora o leitor pode efetuar os testes de pesquisa, que habitarão


o programa a poder excluir e alterar pedidos já concluídos.
O Botão Emitir (CMDEMITIRPEDIDO) têm a finalidade de executar um
Report para gerar um documento do pedido de venda registrado. O Report será
gravado na pasta C:\TRABALHO\RELATORIOS sob o nome de RPTPEDIDO.
Neste Report adicionaremos as tabelas PEDCAB, CADCLI, PEDITE e
CADPRODU no DataEnvironment do Report, conforme ilustra a Figura 8.8.

Figura 8.8 – DataEnvironment do Report RPTPEDIDO.

Setembro/2008 109
VISUAL FOX PRO
INTERMEDIÁRIO
O Leitor pode observar na Figura 8.8 a existência de um relacionamento
entre as tabelas. Lembre-se que na gravação dos pedidos apenas o código do
produto e do cliente, que é a identificação destas informações para o
computador. Porém, para o ser humano, esta identificação é insuficiente,
devendo ser impresso no relatório o nome do cliente e o nome do produto.
Assim, este relacionamento, tem a função de manter as tabelas de clientes e
produtos, posicionadas sempre no registro correspondente ao gravado nas
tabelas de pedidos e itens. Já para as tabelas PEDCAB e PEDITE este
relacionamento tem por finalidade deixar sempre os itens posicionados de
acordo com o seu cabeçalho.

Figura 8.9 – Relacionamento entre as Tabelas CADCLI e PEDCAB.


A Figura 8.9 ilustra com mais detalhes o relacionamento entre as tabelas de
Clientes (CADCLI) e o cabeçalho dos pedidos (PEDCAB). Neste
relacionamento a função da tabela CADCLI é “andar” conforme está a tabela
PEDCAB. Assim, com o mouse, deve-se arrastar o índice CODIGO da tabela
CADCLI (em destaque à direita na Figura 8.9) até o campo PDCCODCLI da
tabela PEDCAB (em destaque à esquerda na Figura 8.9). Esta linha de
relacionamento é mais um objeto do report. Ao clicar com o botão direito do
mouse sobre esta linha, é possível ter acesso as propriedades do objeto,
conforme ilustra a Figura 8.10.

Figura 8.10 – Objeto de Relacionamento entre Tabelas.

Setembro/2008 110
VISUAL FOX PRO
INTERMEDIÁRIO
Deve-se criar ainda o relacionamento da Tabela CADPRODU (Índice
CODPROD) com a Tabela PEDITE (campo PDICODPROD) e da Tabela
PEDITE (Índice PDINRO) com a Tabela PEDCAB (campo PDCNRO). Para
esta última relação faz-se necessário editar o relacionamento, modificando a
propriedade OneToMany para VERDADEIRO, conforme ilustra a Figura 8.11.
Este procedimento é necessário porque esta relação trata-se de 1 registro da
PEDCAB para vários registros na PEDITE. Nos outros dois relacionamentos
anteriormente, trata-se de uma relação 1 para 1.

Figura 8.11 - Detalhe da Relação 1 x N (1 p/ vários) entre as tabelas PEDCAB e PEDITE.


A confecção do Report segue no padrão que já conhecemos. O Design do
Report em tempo de programação é ilustrado pela Figura 8.12.

Setembro/2008 111
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 8.12 – Design do Report em tempo de programação.


Neste Design ilustrado pela Figura 8.12, a novidade fica por conta da
inclusão de uma imagem no Report, que fará o papel de logotipo da empresa
que emite o pedido de vendas.

Figura 8.13 – Objeto para inserção de Imagem no Report.


Para inserir a imagem no Report, na barra de Ferramentas deve-se
selecionar Picture/OLE Bound Control, em destaque na Figura 8.13 e colocar o
objeto dentro do formulário na posição desejada.
A Figura 8.14 descata os dois campos que o leitor deve selecionar para
obter a imagem desejada. No destaque mais acima marca-se Image File Name
na opção Control source type e no destaque mais abaixo, identifica-se o nome
do arquivo de imagem a ser utilizado.

Setembro/2008 112
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 8.14 – Propriedades para inserção da Imagem no Report.


Os demais objetos do Report já são conhecidos nossos. Nos demais
campos o leitor deve tomar o cuidado de mencionar as informações sempre no
formato Tabela.Campo, devido a existência de 4 tabelas distintas neste Report.
Merecem um comentário adicional neste Report os campos que indicam o
Total do Item e o Total do Pedido.

A Expressão indicada no Total do Item é:


pedite.pdiqtde*pedite.pdivlruni -(pedite.pdiqtde*pedite.pdivlruni*pedite.pdidesc/100)

A Expressão do Total do Pedido é indicada pela variável VLRTOTALPED.


Trata-se de uma variável de soma com a mesma expresão do Total do Item,
Seus parâmetros são ilustrados pela Figura 8.15.

Setembro/2008 113
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 8.15 – Variável para Totalização do pedido.

Com isto o relatório está finalizado. No evento CLICK do botão


CMDEMITIRPEDIDO, deve ser colocado o seguinte código para chamada do
relatório:

REPORT FORM RptPedido NOCONSOLE TO PRINTER PROMPT


PREVIEW FOR PDCNRO = ThisForm.txtnro.value

O Leitor deve observar que neste chamda foi incluída a expressão


condicional FOR. Isto indica que o Report somente vai considerar os Registros
tem tenham o número de pedido indicado na expressão. Este relatório somente
terá a funcionalidade desejada quando executado nesta chamada. Se o Leitor
tiver a curiosidade de fazer um preview dele pela tela de programação poderá
notar que são emitidos os itens de todos os pedidos, o que não é o objetivo do
aplicativo.

Figura 8.16 – Resultado Final do Report – Relatório em Produção.

Setembro/2008 114
VISUAL FOX PRO
INTERMEDIÁRIO

9. FINALIZANDO O APLICATIVO
Com a finalização do formulário de pedidos, está concluído o aplicativo que
serviu de guia neste aprendizado. Com isto, o leitor já está apto, a construir um
aplicativo completo utilizando-se do VFP.
O leitor deverá recordar o curso básico e providenciar a criação de um
Menu, o qual será gerado com o nome de MNUPRINCIPAL, tendo o resultado
final ilustrado pela Figura 9.1

Figura 9.1 – Menu do Aplicativo.

A opção Finalizar Aplicativo deverá chamar o programa FINALIZA.PRG,


através do comando DO FINALIZA. Abaixo, segue o código do programa
FINALIZA.PRG

IF MESSAGEBOX("Deseja Finalizar o Aplicativo?",4+32+256,"Fim") = 6


ON SHUTDOWN
CLOSE DATABASES
CLOSE ALL
CLEAR EVENTS
SET SYSMENU ON
SET SYSMENU TO DEFAULT
QUIT
ENDIF

Para as demais opções, cada uma delas deverá chamar seu respectivo
formulário através do comando DO FORM NomeFormulario.

Resta agora efetuar a criação do programa Principal, isto é, o programa que


inicia o aplicativo. O leitor deverá criar um novo programa (.PRG) e sugere-se
dar o nome de MAIN.PRG. O código deste programa é demonstrado à seguir:

DO Ambiente
SET SYSMENU OFF
ON SHUTDOWN DO Finaliza
_Screen.Visible = .T.
_Screen.WindowState = 2
_Screen.Caption = "Aplicativo Final - VFP Intermediário"

Setembro/2008 115
VISUAL FOX PRO
INTERMEDIÁRIO
DO MnuPrincipal.MPR

READ EVENTS

RETURN

O Comando ON SHUTDOWN DO Finaliza, indica que quando o usuário


final clicar no X para fechar o aplicativo, será executado o programa FINALIZA.
Caso o parâmetro ON SHUTDOWN seja omitido, ao clicar no botão X, será
exibida uma mensagem Cannot Quit Visual Fox Pro, sendo recomendada a
utilização deste parâmetro para evitar o desconforto da mensagem emitida
automaticamente pelo VFP.
Note que no programa FINALIZA.PRG é colocado o comando ON
SHUTDOWN sem parâmetros adicionais, o que significa a chamada de um
programa ao finalizar o aplicativo está sendo desabilitada. Isto se faz
necessário para evitar que, se o usuário final quiser encerrar o aplicativo
clicando no X, seja executada por 2 vezes a chamada do aplicativo FINALIZA.

Aqui nosso aplicativo está finalizado. A última etapa é a geração do


executável conforme foi explicado ao final do módulo Básico.
O próximo é último capítulo deste material, apresenta como pode ser criado
o instalador de nosso aplicativo.

Setembro/2008 116
VISUAL FOX PRO
INTERMEDIÁRIO

10.CRIAÇÃO DO INSTALADOR
Depois de Terminado todo o desenvolvimento de um aplicativo em
Visual Fox Pro, chega a hora de instalar este aplicativo no computador do
usuário final. Este usuário não terá em seu computador o Visual Fox Pro
instalado.
A maneira mais simples de fazer isto é efetuar apenas a cópia dos
arquivos necessários. Aplicativos do Visual Fox Pro não precisam ser
registrados no Windows, apenas necessitam que alguns arquivos adicionais
acompanhem o aplicativo gerado. Sendo assim, para instalar o aplicativo no
cliente final, é necessário:

• Criar uma pasta para deixar os arquivos do aplicativo. Isto não é


obrigatório, porém deixa mais organizado seu projeto.
• Copiar para a pasta o aplicativo (.EXE) que você gerou.
• Copiar para a pasta os seguintes arquivos necessários para
execução de aplicativos em Visual Fox Pro 9:
o vfp9t.dll
o vfp9r.dll
o vfp9enu.dll
o vfp9renu.dll
o msvcr71.dll
o gdiplus.dll
• Copiar para a pasta do aplicativo os arquivos que compõem o
banco de dados (DBF, CDX, DBT, DCX e DCT). Recomenda-se
que estes arquivos sejam copiados sem nenhum dado para o
cliente final começar a utilizar o aplicativo, porém isto é um fato
relativo para cada aplicativo e cada desenvolvedor.
• Criar um atalho no Desktop para execução do Aplicativo.

Estes procedimentos já são suficientes para o usuário final executar o


aplicativo sem a necessidade de ter instalado em seu computador o Visual Fox
Pro. Isto é, o seu cliente final não precisa adquirir licença do Visual Fox Pro
para executar aplicativos em VFP.
Caso você execute o aplicativo e nada aconteça, verifique realmente se
os arquivos mencionados acima foram copiados corretamente. Outro ponto
também a verificar é se o Aplicativo foi gerado na Versão 9 do Visual Fox Pro.
Se o aplicativo foi gerado na versão 8 ou anterior, os arquivos são diferentes.
No caso da Versão 8 os arquivos necessários seriam outros: vfp8t.dll, vfp8r.dll,
vfp8enu.dll, vfp8renu.dll, msvcr70.dll e gdiplus.dll. Para a versão 7 do Visual
Fox Pro, seriam os arquivos vfp7t.dll e assim sucessivamente.

Setembro/2008 117
VISUAL FOX PRO
INTERMEDIÁRIO

É possível também criar um instalador para o aplicativo. Até a versão 6


do VFP este instalador estava presente no próprio Visual Fox. A partir da
versão 7 do VFP a Microsoft retirou o instalador do Visual Fox e disponibilizou
uma versão Express (customizada) do InstallShield que vêm junto com a
instalação do VFP para criar o instalador.

Em primeiro lugar deve ser criada uma pasta para colocar todos os
arquivos do projeto que precisam ser disponibilizados ao usuário final. Como
exemplo sugere-se criar a pasta C:\INSTALACAO e copiar lá o aplicativo
gerado (.EXE) e os arquivos que compõem o banco de dados (DBC, DCT,
DCX, DBF e CDX), conforme ilustra a Figura 10.1.

Figura 10.1 – Arquivos a serem copiados para a pasta C:\INSTALACAO.

O Leitor deve certificar-se de ter instalado em seu computador o


InstallShield Express para Visual Fox Pro. Este aplicativo vem junto no CD de
instalação do VFP, mas precisa ser instalado separadamente. Tendo o
InstallShield instalado, execute-o.

Figura 10.5 – Execução o InstallShield Express para Visual FoxPro.

Na Tela de Entrada deve-se criar um Novo Projeto:

Setembro/2008 118
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.6 – Tela Inicial do InstallShield

A Figura 10.4 ilustra as configurações iniciais do novo projeto criado.


Estes dados referem-se ao tipo de projeto e aos locais de gravação, conforme
os indicadores de 1 a 5 destacados na figura.

Figura 10.7 – Configurações Iniciais do Projeto Instalador.

1. Determina o Tipo de Projeto. Escolha obrigatoriamente Express


Project.
2. Nome dado ao Projeto. O nome deve ser de acordo com a
preferência do leitor, sugere-se Setup.
3. Linguagem do Instalador.

Setembro/2008 119
VISUAL FOX PRO
INTERMEDIÁRIO
4. Local no Disco onde serão gravados os dados do projeto. Neste
caso, deve ser indicada a pasta C:\INSTALACAO
5. Determina que seja criada uma subpasta na pasta C:\INSTALACAO
com os dados do projeto. Isto ajuda a tornar mais organizado o
projeot de instalação.

Ao clicar no Botão OK, o InstallShield direiciona o usuário para o Project


Assistant que na parte inferior da tela mostra as etapas que devem ser
seguidas para gerar a instalação, conforme ilustra a Figura 10.5.

Figura 10.8 – Etapas do Projeto de Instalação.

A ordem de execução das etapas é da esquerda para a direita conforme


a ilustração da Figura 10.5. A etapa 1 é Application Information e a 8ª e última
etapa consiste na geração do instalador – Build Instalation. Nem Todas as
etapas são obrigatórias para o Tipo de Instalação aqui demonstrada.
Na Primeira Etapa (Application Information), são informados os dados da
Aplicação e do desenvolvedor conforme ilustra a Figura 10.6 com os
indicadores A, B, C, D e E.

Setembro/2008 120
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.9 – Etapa 1, Dados Gerais da Aplicação.

A. Nome da Empresa que desenvolveu o aplicativo.


B. Identificação do Aplicativo a ser instalado.
C. Versão do Aplicativo
D. Endereço web da empresa desenvolvedora.
E. Nesta opção o leitor pode modificar o ícone que representará a sua
aplicação no Windows.

Na Etapa 2 (Installation Requeriments) determina-se para quais versões


de Windows o projeto estará disponível. Não é recomendada a execução de
aplicativos em Visual Fox 8 e 9 para Windows 95 e Windows 98.

Na Etapa 3 (Installation Architecture) deve ser dada a definição de quais


arquivos farão parte da instalação Mínima, Full e como será a instalação
personalizada.

Na Etapa 4 (Application Files) determina-se o local onde será instalado o


seu aplicativo, bem como também quais arquivos do Aplicativo que serão
instalados.

Setembro/2008 121
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.10 – Determinar os Arquivos do Aplicativo que devem compor a instalação.

A Figura 10.7 ilustra a tela do Application Files. Por padrão o


InstallShield sugere a instalação do Aplicativo na Pasta Arquivos de
Programas/UNIFIEO (UNIFIEO, neste caso, é o nome da empresa
desenvolvedora do aplicativo). Esta pasta pode ser modificada, colocando-se
uma pasta fixa. Basta colocar o mouse em Destination Computer, clicar com o
botão direito e criar uma nova pasta. Depois, posicione o mouse sobre a nova
pasta criada, clique em Add Files e adicione os arquivos que foram copiados no
início deste processo para a pasta C:\INSTALACAO\. A tela ficará conforme
ilustra a Figura 10.8.

Setembro/2008 122
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.11 – Arquivos que serão copiados para o Cliente na Instalação.

Note que permanece visível a subpasta UNIFIEO do


ProgramFilesFolder. O InstallShield não permite que esta pasta seja excluída.
Nesta etapa devem ser informados apenas os arquivos exclusivos do
aplicativo. Os arquivos necessários para a execução do Aplicativo em Visual
Fox (vfp9r.dll,...) citados no início deste capítulo, serão indicados
posteriormente.

Na Etapa 5 (Application ShortCuts) determinam-se os atalhos que serão


criados pelo Instalador. No caso do Aplicativo finalizado no capítulo anterior,
recomenda-se algumas modificações no atalho criado automaticamente pelo
InstallShield, conforme ilustra a Figura 10.9.

Marque a opção para ser criado um atalho no Desktop (Create shortcut


on Desktop) que por padrão vem desmarcado.
Outra modificação é no nome no Atalho a ser criado. Clique no botão
Rename e altere o nome para MeuProjeto.

Na Etapa 6 (Application Registry) são determinadas as modificações que


serão feitas no Registro do Windows pelo Instalador. Aplicações em Visual Fox
Pro não necessitam deste registro para funcionar. Aqui, omite-se esta etapa.
Porém, isto não impede que se possa criar alguma informação no Registro do
Windows.

Setembro/2008 123
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.12 – Configurando Atalhos a Serem Criados pelo Instalador.

Na Etapa 7 (Installation Interview) são configuradas algumas etapas do


instalador, como habilitar a permissão ao usuário de modificar o local de
instalação, pedir o prompt do instalador para solicitar nome do usuário e
companhia, entre outras etapas padrões do InstallShield. Aqui, omite-se esta
etapa.
Alguns ajustes se fazem necessários antes de seguir para a última
estapa. Para isto, deve ser acessada a aba Installation Designer conforme
ilustra a Figura 10.10.

Setembro/2008 124
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.13 – Acessando o Installation Designer.

Esta seção do Instalador contém um acesso mais detalhado aos


recursos criados com o Assistente.
Para efetuar a alteração que necessitamos, seguem-se os passos
ilustrados pela Figura 10.11.

Figura 10.14 – Alteração de Propriedade do Atalho.

1. Clique em ShortCuts/Folders
2. Clique no sinal de + em Desktop para que ele possa “abrir” a árvore
3. Clique em MeuProjeto

Do Lado Direito, observe que ficam visíveis as propriedades do Atalho a


Ser Criado. É necessário modificar a propriedade Working Directory, que indica
a pasta Default em que o aplicativo será executado. Neste caso, está indicando
o Desktop, isto é, a pasta do atalho. Esta propriedade deve ser modificada para
que o diretório de Trabalho seja o diretório da instalação.

Setembro/2008 125
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.15 – Modificar o Diretório de Trabalho.

A Figura 10.12 ilustra como deverá ficar a propriedade Working Directory


após a modificação. Ela deverá conter a pasta [UNIFIEO1], que é a mesma
pasta onde o projeto será instalado.

O próximo ajuste a ser feito nesta seção é definir os Arquivos a serem


distribuídos, isto é, os arquivos necessários para a execução do aplicativo
Visual Fox Pro.

Figura 10.16 – Arquivos de Redistribuição.

Clique no item Redistributables destacado na Figura 10.13. No lado


direito aparecerão todos os itens que o seu computador tem condições de
Redistribuir. Marque então GDI Plus Redist module, conforme ilustra a Figura
10.13.

Setembro/2008 126
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.17 – Mais Itens para Redistribuir.

Desça a Barra de Scroll e marque todos os itens que indicam Visual Fox
Pro, conforme ilustra a Figura 10.14.

Feito isto, clica-se na pasta Project Assistant para proceder à


última Etapa (Build Installation).

Setembro/2008 127
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.18 – Gerando Instalação.

Marque a opção Single Executable para que seja gerado um executável


simples como instalador. As outras opções indicam outros tipos de distribuição
para CD ROM, WEB, etc.. Ao escolher o tipo de distribuição o botão Build
Installations é habilitado. Clique nele para efetuar a geração do Setup conforme
ilustra a Figura 10.15.

Figura 10.19 – Resultado da Geração da Instalação.

Ao gerar o programa de instalação, na parte inferior da tela é


disponibilizada uma janela com as informações do resultado desta geração,
conforme ilustra a Figura 10.16. Neste caso é visualizado 0 erros(s), 0
Warnings e a indicação da criação no arquivo de LOG da geração.

Setembro/2008 128
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.20 – Arquivo Instalador

Logo no início de nosso processo, foi definido que projeto de instalação


chamava-se Setup e criado na pasta C:\INSTALACAO\. A Figura 10.17 ilustra o
caminho onde o arquivo de instalação foi criado:

C:\INSTALACAO\SETUP\EXPRESS\SINGLEIMAGE\DISKIMAGES\DISK1.

O Arquivo SETUP.EXE é o arquivo de instalação que deve ser copiado e


executado no cliente Final. Observe ao executar a instalação como ela fica
muito parecida com a instalação de outros aplicativos Windows que você já
deve ter visto.

Faça a instalação em um computador e veja o Resultado.

Este tipo de instalação fará com que o seu aplicativo fique na lista de
aplicativos do Windows e você poderá removê-lo através do
Adicionar/Remover Programas do Painel de Controle.

É possível ainda criar outro tipo de instalador, mais simples que o


InstallShield, e como um aplicativo freeware.
Para isto, deve ser efetuado o download do Aplicativo FilZip (trata-se de
um compactador semelhante ao WinZip) no endereço www.filzip.com

Agora, agregue aos arquivos copiados para a pasta C:\INSTALACAO\,


os arquivos de RUN TIME do Fox citados no início deste capítulo conforme
ilustra a Figura 10.18.

Setembro/2008 129
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.21 - Arquivos para Gerar Instalador com FILZIP.

Crie um Arquivo Compactado com todos os arquivos Indicados na Figura


10.18, com o nome de INSTALACAO.ZIP.

Figura 10.22 – Utilizando FILZIP como Instalador.

Depois de criado o arquivo INSTALACAO.ZIP, clique nele com o botão


direito, escolha a seqüência de menus Filzip / Criar arquivo SFX... conforme
ilustrado pela Figura 10.19. A opção Filzip no botão direito sobre o nome do
arquivo, somente aparecerá caso você o tenha instalado corretamente.

A próxima tela, ilustrada pela Figura 10.20, contém as configurações do


instalador do Filzip.

Setembro/2008 130
VISUAL FOX PRO
INTERMEDIÁRIO

Figura 10.23 – Opções do Instalador FilZip.

1. Diretório onde serão copiados os arquivos.


2. Título da Janela do Instalador.
3. Aplicativo a ser executado após a cópia dos arquivos, que neste caso
não é utilizado.
4. Ação a ser executada caso algum arquivo já existir na pasta configurada
em 1.
5. Demais configurações, aconselha-se deixar tudo desmarcado.

Ao clicar em OK, é criado o arquivo INSTALACAO.EXE, que é o instalador


gerado pelo Filzip. Este instalador não cria atalhos no DESKTOP e nem no
Menu Iniciar.

11.ENDEREÇOS WEB PARA VISUAL FOX PRO


www.foxbrasil.com.br
www.foxtotal.com.br
foxbrasil-subscribe@yahoogroups.com – Mande um email para este endereço
para participar do Grupo de Discussão de Visual Fox Pro.

Setembro/2008 131