INTERMEDIÁRIO
SETEMBRO/2008
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
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.
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.
Figura 1.3. Após a digitação do Comando a tela de título Program1 é disponibilizada pelo
VFP para criação do programa.
Setembro/2008 4
VISUAL FOX PRO
INTERMEDIÁRIO
Figura 1.4 – Código do Programa que configura os Caminhos de Busca no VFP (Paths)
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
Setembro/2008 6
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 7
VISUAL FOX PRO
INTERMEDIÁRIO
Índices:
CODIGO (Chave Primária)
NOME (Regular)
Índices:
CODIGO (Chave Primária)
NOME (Regular)
Setembro/2008 8
VISUAL FOX PRO
INTERMEDIÁRIO
Índices:
CODIGO (Chave Primária)
NOME (Regular)
CODPROF (Regular)
CODPERFIL (Regular)
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
Setembro/2008 10
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 11
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 12
VISUAL FOX PRO
INTERMEDIÁRIO
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:
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.
Setembro/2008 15
VISUAL FOX PRO
INTERMEDIÁRIO
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.
Setembro/2008 17
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 18
VISUAL FOX PRO
INTERMEDIÁRIO
= MESSAGEBOX("Você Acionou o Botão Sair!!!",48,"Atenção!")
DODEFAULT()
EXERCÍCIO 01
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.
Setembro/2008 20
VISUAL FOX PRO
INTERMEDIÁRIO
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.
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.
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.
Setembro/2008 24
VISUAL FOX PRO
INTERMEDIÁRIO
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.
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.
Setembro/2008 26
VISUAL FOX PRO
INTERMEDIÁRIO
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
Setembro/2008 27
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 28
VISUAL FOX PRO
INTERMEDIÁRIO
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
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
TRY
Setembro/2008 30
VISUAL FOX PRO
INTERMEDIÁRIO
SKIP IN TabPerf
CATCH TO oErr
IF oErr.ErrorNo = 1539
ELSE
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
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
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
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
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
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).
Setembro/2008 35
VISUAL FOX PRO
INTERMEDIÁRIO
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.
Setembro/2008 37
VISUAL FOX PRO
INTERMEDIÁRIO
EXERCÍCIO 02
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;
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.
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).
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.
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
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
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
ThisFormSet.Form1.CntDados.SetAll("Enabled",.F,"CheckBox_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.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
ELSE
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
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)
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.
CMDRELATORIO.CLICK.
ThisForm.Enabled = .F.
Thisformset.frmReport.Visible = .T.
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.
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.
Setembro/2008 52
VISUAL FOX PRO
INTERMEDIÁRIO
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
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).
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
.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)
.txtDtNasc.SetFocus()
RETURN .F.
ENDIF
IF .txtDtNasc.Value > DATE()
.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
Setembro/2008 58
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 59
VISUAL FOX PRO
INTERMEDIÁRIO
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.
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
RETURN .F.
ENDIF
IF EMPTY(cNomForn)
RETURN .F.
ENDIF
IF EMPTY(cUfForn)
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
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.
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.
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
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
Chamada da função:
Características:
Erro: integer
IE : string
UF : string
Parâmetros
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
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:
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.
Setembro/2008 68
VISUAL FOX PRO
INTERMEDIÁRIO
nInfoValida = ValidaIE("105757884116","SP")
? nInfoValida
IF EMPTY(cUfForn)
= MESSAGEBOX("UF do Fornecedor NÃO INFORMADO!",16,"Dados
Inválidos")
RETURN .F.
ENDIF
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.
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.
Setembro/2008 71
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 72
VISUAL FOX PRO
INTERMEDIÁRIO
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.
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.
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
EXERCÍCIO 03
Setembro/2008 77
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 78
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 79
VISUAL FOX PRO
INTERMEDIÁRIO
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.
Setembro/2008 80
VISUAL FOX PRO
INTERMEDIÁ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.
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
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.
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.
? cData
Setembro/2008 84
VISUAL FOX PRO
INTERMEDIÁRIO
DODEFAULT()
IF .Not. EMPTY(This.Value)
This.ToolTipText = DataExtenso(This.Value)
ELSE
This.ToolTipText = ""
ENDIF
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
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
This.Parent.txtData.Value = cData
This.Parent.txtData.ToolTipText = DataExtenso(cData)
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.
Setembro/2008 88
VISUAL FOX PRO
INTERMEDIÁRIO
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.
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.
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.
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.
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.
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
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()
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
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.
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
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.
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.
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.
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)
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.
Setembro/2008 106
VISUAL FOX PRO
INTERMEDIÁRIO
.ForeColor = RGB(255,255,255)
ENDWITH
ENDWITH
NEXT
.Refresh
ENDWITH
Setembro/2008 107
VISUAL FOX PRO
INTERMEDIÁRIO
A Figura 8.7 ilustra o formulário de pesquisa dos pedidos, destacando-se os
objetos:
nTipoPesq = ThisForm.OptPesquisa.Value
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
ENDIF
ThisFormSet.configuragrid
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.
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.
Setembro/2008 111
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 112
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 113
VISUAL FOX PRO
INTERMEDIÁRIO
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
Para as demais opções, cada uma delas deverá chamar seu respectivo
formulário através do comando DO FORM NomeFormulario.
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
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:
Setembro/2008 117
VISUAL FOX PRO
INTERMEDIÁRIO
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.
Setembro/2008 118
VISUAL FOX PRO
INTERMEDIÁRIO
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.
Setembro/2008 120
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 121
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 122
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 123
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 124
VISUAL FOX PRO
INTERMEDIÁRIO
1. Clique em ShortCuts/Folders
2. Clique no sinal de + em Desktop para que ele possa “abrir” a árvore
3. Clique em MeuProjeto
Setembro/2008 125
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 126
VISUAL FOX PRO
INTERMEDIÁRIO
Desça a Barra de Scroll e marque todos os itens que indicam Visual Fox
Pro, conforme ilustra a Figura 10.14.
Setembro/2008 127
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 128
VISUAL FOX PRO
INTERMEDIÁRIO
C:\INSTALACAO\SETUP\EXPRESS\SINGLEIMAGE\DISKIMAGES\DISK1.
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.
Setembro/2008 129
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 130
VISUAL FOX PRO
INTERMEDIÁRIO
Setembro/2008 131
Muito mais do que documentos
Descubra tudo o que o Scribd tem a oferecer, incluindo livros e audiolivros de grandes editoras.
Cancele quando quiser.