Você está na página 1de 19

No Visual FoxPro, a programao procedural e a programao orientada a objetos trabalham juntas para que voc possa criar aplicativos

poderosos e flexveis. Conceitualmente, voc pode entender a programao como uma forma de escrever uma seqncia de instrues para executar tarefas especficas. Em um nvel estrutural, a programao em Visual FoxPro envolve a manipulao de dados armazenados. Se voc no tiver experincia em programao, este captulo o ajudar a dar os primeiros passos. Se voc j estiver familiarizado com outras linguagens de programao e desejar fazer uma comparao com o Visual FoxPro, consulte Visual FoxPro e outras linguagens de programao. Para obter uma explicao sobre a programao orientada a objetos, consulte o captulo 3, Programao orientada a objetos Este captulo abrange os tpicos a seguir: Vantagens da programao O mecanismo de programao em Visual FoxPro Conceitos bsicos de programao O processo de programao Utilizando procedimentos e funes definidas pelo usurio Seguindo adiante

Vantagens da programao
Em geral, tudo o que voc pode fazer em um programa pode tambm ser feito manualmente se voc tiver tempo suficiente. Caso queira procurar informaes sobre um nico cliente em uma tabela de clientes, a empresa Ernst Handel, por exemplo, voc poder fazer isso manualmente, seguindo uma seqncia especfica de instrues. Para localizar manualmente um nico pedido em uma tabela 1 No menu Arquivo, selecione Abrir. 2 Na caixa Arquivos do tipo, selecione Tabela. 3 Clique duas vezes em CUSTOMER.DBF na lista de arquivos. 4 No menu Exibir, selecione Pesquisar. 5 Percorra a tabela procurando Ernst Handel no campo Company dos registros. Por programao, voc poderia obter os mesmos resultados, digitando os comandos a seguir do Visual FoxPro na janela Comando: USE Customer LOCATE FOR Company = "Ernst Handel" BROWSE Uma vez localizado o pedido para esta empresa, talvez voc deseje aumentar em 3% a quantidade mxima de pedidos. Para aumentar manualmente a quantidade mxima de pedidos 1 V com a tecla Tab at o campo max_ord_amt. 2 Multiplique o valor existente em max_ord_amt por 1,03 e digite o novo valor no campo. Para obter o mesmo resultado por programao, digite o comando a seguir do Visual FoxPro na janela Comando: REPLACE max_ord_amt WITH max_ord_amt * 1.03 relativamente simples alterar a quantidade mxima de pedidos de um nico cliente, manualmente ou digitando as instrues na janela Comando. Suponha, no entanto, que voc deseje aumentar em 3% a quantidade mxima de pedidos de todos os clientes. A mesma tarefa executada manualmente consome muito tempo e propensa a inmeros erros. Se voc fornecer as instrues corretas em um arquivo de programa, o Visual FoxPro poder executar essa tarefa de forma rpida e fcil, sem

erros. Programa de exemplo para aumentar a quantidade mxima de pedidos para todos os clientes Cdigo USE customer SCAN Comentrios Abra a tabela CUSTOMER. Percorre todos os registros na tabela e executa todas as instrues entre SCAN e ENDSCAN para cada registro. Aumenta em 3% a quantidade mxima de pedidos. (O ponto-e-vrgula (;) indica que o comando continua na linha seguinte.)

REPLACE max_ord_amt WITH ; max_ord_amt * 1.03 ENDSCAN

Fim do cdigo executado para cada registro na tabela. bem mais vantajoso executar um programa do que digitar comandos individuais na janela Comando: Os programas podem ser modificados e executados novamente. Voc pode executar programas a partir de seus menus, formulrios e barras de ferramentas. Os programas podem executar outros programas. As sees a seguir detalham o mecanismo, os conceitos e os processos subjacentes a este e outros programas do Visual FoxPro.

O mecanismo de programao em Visual FoxPro


Voc pode programar o Visual FoxPro escrevendo um cdigo: instrues sob a forma de comandos, funes ou operaes que o Visual FoxPro pode entender. Voc pode incluir essas instrues nos locais a seguir: Na janela Comando Em arquivos de programa Em janelas de cdigo de evento ou de mtodo no Criador de formulrios ou no Criador de classes Em janelas de cdigo de procedimento no Criador de menus Em janelas de cdigo de procedimentos no Criador de relatrios

Utilizando a janela Comando


Voc pode executar um comando do Visual FoxPro, digitando-o na janela Comando e pressionando ENTER. Para executar o comando outra vez, mova o cursor para a linha que contm o comando e pressione ENTER novamente. Voc pode at executar vrias linhas de cdigo na janela Comando como se fossem um programa independente. Para executar vrias linhas de cdigo na janela Comando 1 Selecione as linhas de cdigo. 2 Pressione ENTER ou selecione Executar seleo no menu de atalho. Como a janela Comando uma janela de edio, voc pode editar os comandos, utilizando as ferramentas de edio disponveis no Visual FoxPro. Voc pode editar, inserir, excluir, recortar, copiar ou colar texto na janela Comando. A vantagem de digitar um cdigo na janela Comando que as instrues so executadas

imediatamente. No necessrio salvar um arquivo e execut-lo como um programa. Alm disso, as selees efetuadas nos menus e caixas de dilogo so repetidas na janela Comando como comandos. Voc pode copiar e colar esses comandos em um programa do Visual FoxPro e depois executar o programa vrias vezes, facilitando a execuo de milhares de comandos repetidamente.

Criando programas
Um programa do Visual FoxPro um arquivo de texto que contm uma srie de comandos. Voc pode criar um programa no Visual FoxPro de uma destas formas: Para criar um programa 1 No Gerenciador de projetos, selecione Programas na guia Cdigo. 2 Escolha Novo. Ou 1 No menu Arquivo, selecione Novo. 2 Na caixa de dilogo Novo, selecione Programa. 3 Selecione Novo arquivo. Ou Na janela Comando, digite: MODIFY COMMAND O Visual FoxPro abre uma nova janela denominada Programa1. Voc agora pode digitar seu programa nessa janela.

Salvando programas
Depois de criar um programa, no se esquea de salv-lo. Para salvar um programa No menu Arquivo, escolha Salvar. Se voc tentar fechar um programa que ainda no foi salvo, uma caixa de dilogo ser aberta para que voc possa salvar ou descartar as alteraes efetuadas. Se voc salvar um programa criado no Gerenciador de projetos, o programa ser adicionado ao projeto. Se voc salvar um programa que ainda no foi nomeado, a caixa de dilogo Salvar como ser aberta para que voc possa especificar um nome para o programa. Uma vez salvo o programa, voc pode execut-lo ou modific-lo.

Modificando programas
Aps salvar seu programa, voc poder modific-lo. Primeiro, abra o programa, de uma das formas a seguir: Para abrir um programa Se o programa estiver contido em um projeto, selecione-o no Gerenciador de projetos e escolha Modificar. Ou No menu Arquivo, selecione Abrir. Ser exibida uma caixa de dilogo com uma lista de arquivos disponveis. Na lista Arquivos do tipo, escolha Programa. Na lista de arquivos, selecione o programa que voc deseja modificar e, em seguida, escolha Abrir. Ou

Na janela Comando, digite o nome do programa a ser modificado: MODIFY COMMAND myprogrm Ou Na janela Comando, digite: MODIFY COMMAND ? Na lista de arquivos, selecione o programa que voc deseja modificar e, em seguida, escolha Abrir. Depois de abrir o programa, voc pode fazer alteraes. Ao terminar de fazer as alteraes, no se esquea de salvar o programa.

Executando programas
Aps criar um programa, voc pode execut-lo. Para executar um programa Se o programa estiver contido em um projeto, selecione-o no Gerenciador de projetos e escolha Executar. Ou No menu Programa, selecione Executar. Na lista de programas, selecione o programa que ser executado e escolha Executar. Ou Na janela Comando, digite DO e o nome do programa a ser executado: DO myprogrm

Escrevendo cdigo nas ferramentas de criao do Visual FoxPro


O Criador de formulrios, o Criador de classes e o Criador de menus permitem que voc integre facilmente o cdigo do programa com a interface do usurio, para que o cdigo apropriado seja executado em resposta s aes do usurio. O Criador de relatrios permite que voc crie relatrios complexos e personalizados, integrando o cdigo ao arquivo de relatrio. Para aproveitar toda a capacidade do Visual FoxPro, voc dever utilizar essas ferramentas de criao. Para obter maiores informaes sobre o Criador de relatrios, consulte o captulo 7, Criando relatrios e etiquetas, no Guia do Usurio. Para obter maiores informaes sobre o Criador de classes, consulte o captulo 3, Programao orientada a objetos, neste manual. Para obter maiores informaes sobre o Criador de formulrios, consulte o captulo 9, Criando formulrios, e sobre o Criador de menus, consulte o captulo 11, Criando menus e barras de ferramentas

Conceitos bsicos de programao


Ao programar, voc armazena dados e manipula esses dados com uma srie de instrues. Os dados e os recipientes de armazenamento de dados so a matria-prima da programao. As ferramentas utilizadas para manipular essa matria-prima so os comandos, as funes e os operadores.

Armazenando dados
Os dados com os quais voc trabalha provavelmente incluem quantidades de tempo, itens financeiros e contbeis, alm de datas, nomes, descries etc. Cada fragmento de dado de determinado tipo: pertence a uma categoria de dados que voc manipula de modos semelhantes. Voc poderia trabalhar diretamente com esses dados sem armazen-los, mas perderia grande parte da flexibilidade e potncia do Visual FoxPro. O Visual FoxPro fornece diversos recipientes de armazenamento para otimizar a manipulao dos dados.

Tipos de dados
Os tipos de dados determinam como os dados so armazenados e utilizados. Voc pode multiplicar dois nmeros mas no pode multiplicar caracteres. Voc pode imprimir caracteres em caixa alta, mas nmeros no. Alguns dos tipos de dados do Visual FoxPro esto listados na tabela que se segue: Tipos de dados Tipo Numrico Caractere Lgico Data DataHora Exemplos 123 3,1415 7 Seqncia de Teste 123 01/01/95 .T. .F. {01/01/95} {01/01/95 12:30:00}

Recipientes de dados
Os recipientes de dados permitem que voc execute as mesmas operaes em diversos dados. Por exemplo, se voc somar as horas trabalhadas por um funcionrio, multiplic-las pelo salrio/hora e, em seguida, deduzir os impostos para determinar quanto o funcionrio deve receber, ter que executar essas operaes para cada funcionrio, a cada pagamento. Se armazenar essas informaes em recipientes e executar as operaes nos recipientes, voc ter apenas que substituir os dados antigos pelos novos e executar o mesmo programa novamente. A tabela a seguir lista alguns dos principais recipientes para dados no Visual FoxPro: Recipientes de dados Tipo Variveis Descrio Elementos individuais de dados armazenados na RAM (Memria de Acesso Aleatrio) de seu computador. Registrosdetabelas Vrias linhas de campos predeterminados, cada uma podendo conter um dado predefinido. As tabelas so salvas no disco. Matrizes Diversos elementos de dados armazenados na RAM.

Manipulando dados
Os recipientes e os tipos de dados fornecem a voc os blocos de construo necessrios para manipular os dados As peas restantes so os operadores, as funes e os comandos.

Utilizando operadores
Os operadores renem os dados. Eis aqui os operadores mais comuns no Visual FoxPro. Operadores Operador = Tipos de dados vlidos Todos Exemplo ? n = 7 Resultado Imprime .T. se o valor armazenado na varivel n for 7;

+ ! ou NOT *, /

Imprime .F. Imprime 25 Imprime 5 Observao Um ponto de interrogao (?) antes de uma expresso faz com que um caractere de nova linha e os resultados da expresso sejam exibidos na janela de sada ativa, que geralmente a janela principal do Visual FoxPro. Lembre-se de que voc deve utilizar sempre o mesmo tipo de dados ao utilizar um operador. As instrues a seguir armazenam dois dados numricos em duas variveis. Os nomes das variveis comeam com n para indicar que contm dados numricos, mas voc poderia nome-las com qualquer combinao de caracteres alfanumricos e sublinhados. ? !.T. ? 5 * 5 ? 25 / 5 nPrimeiro = 123 nSegundo = 45 As instrues a seguir armazenam dois dados de caractere em duas variveis. Os nomes de variveis comeam com c para indicar que contm dados de caractere. cPrimeiro = "123" cSegundo = "45" As duas operaes a seguir, adio e concatenao, produzem resultados diferentes porque os tipos de dados contidos nas variveis so diferentes. ? nPrimeiro + nSegundo ? cPrimeiro + cSegundo Sada 168 12345 Como cPrimeiro um dado de caractere e nSegundo um dado numrico, voc obter um erro de no-correspondncia de tipo de dado ao tentar emitir o comando a seguir: ? cPrimeiro + nSegundo Voc pode evitar esse problema, utilizando funes de converso. Por exemplo, STR( ) retornar o caractere equivalente a um valor numrico e VAL( ) retornar o valor numrico equivalente a uma seqncia de caracteres de nmeros. Essas funes e LTRIM( ), que remove os espaos esquerda, permitem que voc execute as operaes a seguir: ? cPrimeiro + LTRIM(STR(nSegundo)) ? VAL(cPrimeiro) + nSegundo Sada 12345 168

Numrico, Caractere, Data, DataHora Lgico Numrico

? "Fox" + "Pro"

caso contrrio, imprime .F. Imprime FoxPro

Utilizando funes
As funes retornam um tipo especfico de dados. Por exemplo, as funes STR( ) e VAL( ), utilizadas na seo anterior, retornam valores de caractere e numricos, respectivamente. Como acontece com todas as funes, esses tipos de retorno esto documentados juntamente com as funes. Existem cinco formas de chamar uma funo do Visual FoxPro: Atribuir o valor de retorno da funo a uma varivel. A linha de cdigo a seguir armazena a data atual do sistema em uma varivel denominada dHoje:

dHoje = DATE( ) Incluir a chamada da funo em um comando do Visual FoxPro. O comando a seguir define o diretrio padro como o valor retornado pela funo GETDIR( ): CD GETDIR( ) Imprimir o valor de retorno na janela de sada ativa. A linha de cdigo a seguir imprime a hora atual do sistema na janela de sada ativa: ? TIME( ) Chamar a funo sem armazenar o valor de retorno em lugar nenhum. A chamada de funo a seguir desativa o cursor: SYS(2002) Incorporar a funo a outra funo. A linha de cdigo a seguir imprime o dia da semana: ? DOW(DATE( )) Outros exemplos de funes utilizadas neste captulo so: Funo ISDIGIT( ) FIELD( ) LEN( ) RECCOUNT( ) SUBSTR( ) Descrio Retornar verdadeiro (.T.) se o caractere mais esquerda em uma seqncia for um nmero; caso contrrio, retornar falso (.F.). Retornar o nome de um campo. Retornar o nmero de caracteres em uma expresso de caracteres. Retornar o nmero de registros na tabela ativa no momento. Retornar o nmero de caracteres especificado de uma seqncia de caracteres, comeando em um local especificado na seqncia.

Utilizando comandos
Um comando faz com que uma determinada ao seja executada. Cada comando possui uma sintaxe especfica que indica o que deve ser includo para que o comando funcione. H tambm clusulas opcionais associadas aos comandos que lhe permitem especificar em maiores detalhes o que voc deseja. Por exemplo, o comando USE permite que voc abra e feche tabelas: Fecha a tabela na rea de trabalho atual. USE customer Abre a tabela CUSTOMER na rea de trabalho atual, fechando outra tabela j aberta na rea de trabalho. USE customer IN 0 Abre a tabela CUSTOMER na prxima rea de trabalho disponvel. USE customer IN 0 ; Abre a tabela CUSTOMER na ALIAS mycust prxima rea de trabalho disponvel e atribui rea de trabalho o alias mycust. Alguns exemplos de comandos utilizados neste captulo so: Comando DELETE REPLACE Descrio Marca registros especificados em uma tabela para excluso. Substitui o valor armazenado no campo do registro por Sintaxe USE USE Descrio

GO

um novo valor. Posiciona o ponteiro do registro em um local especfico na tabela.

Controlando o fluxo de programas


O Visual FoxPro inclui uma categoria especial de comandos que agrupam outros comandos e funes, determinando quando e com que freqncia esses outros comandos e funes so executados. Esses comandos permitem desvios condicionais e loops, duas ferramentas de programao muitoeficazes. O programa a seguir ilustra desvios condicionais e loops. Esses conceitos esto descritos com detalhes aps o exemplo. Suponha que voc tenha 10.000 funcionrios e deseje dar um aumento de 3% queles com salrio anual igual ou superior a R$ 30.000,00 e um aumento de 6% queles com salrio anual abaixo de R$ 30.000,00. O programa de exemplo a seguir efetua essa tarefa. Este programa pressupe que uma tabela com um campo numrico chamado salary esteja aberta na rea de trabalho atual. Para obter informaes sobre reas de trabalho, consulte a seo Utilizando diversas tabelas no captulo 7, Trabalhando com tabelas. Programa de exemplo para aumentar o salrio dos funcionrios Cdigo SCAN Comentrios O cdigo entre SCAN e ENDSCAN executado tantas vezes quanto o nmero de registros existente na tabela. Cada vez que o cdigo for executado, o ponteiro do registro se mover para o prximo registro na tabela. Para cada registro, se o salrio for maior ou igual a 30.000, substitui este valor por um novo salrio 3% mais alto. O ponto-e-vrgula (;) depois de WITH indica que o comando continuar na linha seguinte. Para cada registro, se o salrio no for maior ou igual a 30.000, substitui este valor por um novo salrio 6% mais alto.

IF salary >= 30.000,00 REPLACE salary WITH ; salary * 1.03

ELSE REPLACE salary WITH ; salary * 1.06 ENDIF ENDSCAN

Fim da instruo condicional IF. Fim do cdigo executado para cada registro na tabela. Este exemplo utiliza comandos de loop e desvio condicional para controlar o fluxo do programa.

Recurso de desvio condicional


O recurso de desvio condicional permite que voc teste condies e, dependendo dos resultados desse teste, efetue diferentes operaes. H dois comandos no Visual FoxPro que permitem desvios condicionais: IF ... ELSE ... ENDIF DO CASE ... ENDCASE O cdigo entre a instruo inicial e a instruo ENDIF ou ENDCASE ser executado somente se uma condio lgica tiver um valor verdadeiro (.T.). No programa de exemplo, o comando IF utilizado para distinguir entre dois estados: se o salrio ou no igual ou superior a R$ 30.000,00. A ao a ser tomada depende do estado. No exemplo a seguir, se o valor armazenado na varivel nWaterTemp for menor que 100, nenhuma ao ser tomada:

* define uma varivel lgica como verdadeira se uma condio for atendida. IF nWaterTemp >= 100 lBoiling = .T. ENDIF Observao Um asterisco no incio de uma linha em um programa indica que essa linha um comentrio. Os comentrios lembram o programador do que cada segmento de cdigo deve executar, mas so ignorados pelo Visual FoxPro. Se houver vrias condies possveis a serem verificadas, um bloco DO CASE ... ENDCASE poder ser mais eficiente e mais fcil de ser controlado do que vrias instrues IF.

Recurso de loop
O recurso de loop permite que voc execute uma ou mais linhas de cdigo tantas vezes quantas forem necessrias. Existem trs comandos no Visual FoxPro que permitem loop: SCAN ... ENDSCAN FOR ... ENDFOR DO WHILE ... ENDDO Utilize SCAN quando estiver executando uma seqncia de aes para cada registro em uma tabela, como no programa de exemplo descrito anteriormente. O loop SCAN permite que voc escreva o cdigo uma vez e que ele seja executado para cada registro medida que o ponteiro do registro percorre a tabela. Utilize FOR quando voc souber quantas vezes a seo de cdigo deve ser executada. Por exemplo, voc sabe que existe um nmero especfico de campos em uma tabela. Como a funo FCOUNT( ) do Visual FoxPro retorna este nmero, voc pode utilizar um loop FOR para imprimir os nomes de todos os campos existentes na tabela: FOR nCnt = 1 TO FCOUNT( ) ? FIELD(nCnt) ENDFOR Utilize DO WHILE quando desejar executar uma seo de cdigo, enquanto uma determinada condio for atendida. Voc pode no saber quantas vezes o cdigo ter que ser executado, mas sabe quando sua execuo dever ser interrompida. Por exemplo, suponha que voc tivesse uma tabela com os nomes e as iniciais das pessoas e desejasse utilizar as iniciais para procurar as pessoas. Voc enfrentaria um problema na primeira vez que tentasse incluir uma pessoa que tivesse as mesmas iniciais de outra j existente na tabela. Para resolver o problema, voc poderia adicionar um nmero s iniciais. Por exemplo, o cdigo de identificao de Marcos Sabia seria MS. A prxima pessoa com as mesmas iniciais, Margareth Silva, seria MS1. Se voc adicionasse depois Mrcia Santiago tabela, seu cdigo de identificao seria MS2. Um loop DO WHILE permite que voc localize o nmero correto para anexar s iniciais. Programa de exemplo com DO WHILE para gerar uma ID exclusiva Cdigo nHere = RECNO() CInitials = LEFT(firstname,1) + ; LEFT(lastname,1) nSuffix = 0 Comentrios Salva a posio do registro. Extrai as iniciais da pessoa a partir das primeiras letras dos campos firstname e lastname. Estabelece uma varivel para guardar o nmero a ser adicionado ao final das iniciais da pessoa, caso necessrio. Verifica se h outra pessoa na tabela com as mesmas iniciais. Se um outro registro na tabela possuir um valor de person_id igual a cInitials, a funo

LOCATE FOR person_id = cInitials DO WHILE FOUND( )

NSuffix = nSuffix + 1 cInitials = ; LEFT(cInitials,2); + ALLTRIM(STR(nSuffix)) CONTINUE

FOUND( ) retornar verdadeiro (.T.) e o cdigo do loop DO WHILE ser executado. Se nenhuma correspondncia for encontrada, a prxima linha do cdigo a ser executada ser a seguinte a ENDDO. Prepara um sufixo novo e o anexa ao final das iniciais. CONTINUE faz com que o ltimo comando LOCATE seja avaliado novamente. O programa verifica se o novo valor em cInitials j existe no campo person_id de outro registro. Se j existir, FOUND( ) retornar .T. e o cdigo do loop DO WHILE ser executado novamente. Se o novo valor em cInitials for realmenteexclusivo, FOUND( ) retornar .F. e a execuo do programa continuar com a linha de cdigo aps ENDDO. Fim do loop DO WHILE.

ENDDO GOTO nHere REPLACE person_id WITH cInitials

Retorna ao registro e armazena o cdigo de identificao exclusivo no campo person_id. Como no possvel saber de antemo quantas vezes voc encontrar cdigos de identificao correspondentes j em uso, voc deve utilizar o loop DO WHILE.

O processo de programao
Uma vez compreendidos os conceitos bsicos, a programao um processo iterativo. Voc passa pelas etapas muitas vezes, refinando o seu cdigo conforme vai programando. Quando est comeando, voc testa com freqncia utilizando vrias vezes o mtodo de tentativa e erro. Quanto mais familiarizado voc estiver com a linguagem, mais rapidamente poder programar e realizar um maior nmero de testes preliminares mentalmente As etapas bsicas de programao incluem: Definio do problema. Decomposio do problema em pequenos elementos. Construo das partes. Teste e ajuste das partes. Juno das partes. Teste de todo o programa. Eis aqui alguns pontos a serem lembrados ao iniciar: Delineie claramente o problema antes de tentar resolv-lo. Caso contrrio, voc acabar tendo que fazer diversas alteraes, jogar cdigo fora, comear tudo de novo ou aceitar algo aqum do que realmente deseja. Decomponha o problema em etapas que possam ser gerenciadas em vez de tentar resolver o problema inteiro de uma vez. Teste e depure sees de cdigo enquanto desenvolve o programa. Verifique se o cdigo faz o que voc quer. A depurao o processo de localizao e soluo dos problemas que impedem que o cdigo faa o que voc deseja. Aprimore os dados e o seu armazenamento para facilitar a manipulao destes dados pelo cdigo do programa. Na maioria das vezes, isso significa estruturar corretamente suas tabelas.

O restante desta seo descreve as etapas para a criao de um pequeno programa do Visual FoxPro.

Definindo o problema
Antes de poder solucionar um problema, necessrio formul-lo claramente. Algumas vezes, ajustando a formulao do problema, voc ser capaz de enxergar mais e melhores opes para solucion-lo. Suponha que voc tenha diversos dados de vrias origens. Embora a maior parte dos dados seja rigorosamente numrica, alguns valores de dados contm traos e espaos alm de nmeros. Voc deseja remover todos os espaos e traos desses campos e salvar os dados numricos. Em vez de tentar remover os espaos e traos dos dados originais, voc pode formular o objetivo do programa como: Objetivo Substituir os valores existentes em um campo por outros valores que contenham tudo o que pertence aos valores originais com exceo dos espaos e traos. Esta formulao evita a dificuldade de manipular uma seqncia de caracteres cujo comprimento est sempre se modificando medida que voc trabalha com ela.

Decompondo o problema
Como voc tem que fornecer instrues especficas para o Visual FoxPro em termos de operaes, comandos e funes, ser necessrio decompor o problema em pequenas etapas. A menor tarefa para esse problema seria examinar cada caractere da seqncia. At que possa examinar um caractere individualmente, voc no pode determinar se deseja salv-lo ou no. Uma vez examinado um caractere, verifique se ele um trao ou um espao. Nesse momento, voc pode desejar aprimorar a definio do problema. O que acontecer se depois voc obtiver dados com parnteses de abertura e de fechamento? O que acontecer caso queira se livrar dos smbolos de moeda, vrgulas e pontos? Quanto mais genrico for o cdigo, menos trabalho voc ter mais tarde; o objetivo economizar trabalho. Eis aqui uma formulao do problema que lida com uma maior variedade de dados: Objetivo aprimorado Substituir os valores existentes em um campo por outros que contenham apenas os caracteres numricos dos valores originais. Com esta formulao, voc pode agora redefinir o problema em nvel de caractere: se for numrico, salve o caractere; caso contrrio, v para o prximo caractere. Aps criar uma seqncia que contenha apenas os elementos numricos da seqncia inicial, voc pode substituir a primeira seqncia e ir para o prximo registro at passar por todos os dados. Em resumo, o problema decomposto nas partes a seguir: 1 2 3 4 Examinar cada caractere. Determinar se o caractere numrico ou no. Se for numrico, copi-lo para a segunda seqncia. Aps passar por todos os caracteres na seqncia original, substituir a seqncia original pela seqncia com apenas caracteres numricos. 5 Repetir essas etapas para todos os registros na tabela.

Construindo as partes
Quando j souber o que fazer, voc poder comear a formular as partes em termos de comandos, funes e operadores do Visual FoxPro. Se souber exatamente qual o comando ou a funo de que precisa, voc poder consultar a Ajuda para verificar a sintaxe correta. Caso saiba o que deseja fazer mas desconhea os comandos ou as funes apropriadas, localize o tpico Categorias da

linguagem na Ajuda. Visto que os comandos e funes sero utilizados para manipular dados, ser necessrio trabalhar com dados de teste, pois voc deseja que os dados de teste assemelhem-se tanto quanto possvel aos dados reais. Para este exemplo, voc pode armazenar uma seqncia de teste para uma varivel digitando o comando a seguir na janela Comando: cTest = "123-456-7 89 0"

Examinando cada caractere


1 Primeiro, voc deseja examinar um nico caractere na seqncia. Consulte Funes de caracteres. 2 Se a caixa de dilogo Salvar for exibida, escolha OK. Ao executar este programa, os caracteres individuais na seqncia de teste sero exibidos em linhas separadas na janela principal do Visual FoxPro. Testando parte do programa

A primeira tarefa j foi realizada. Agora voc pode examinar cada caractere na seqncia.

Decidindo se o caractere numrico


Aps isolar um nico caractere da seqncia, ser necessrio saber se ele um nmero. Voc pode descobrir isso, utilizando ISDIGIT( ).

Digite os comandos a seguir na janela Comando: ? ISDIGIT('2') ? ISDIGIT('-') ? ISDIGIT(SUBSTR(cTest, 3, 1)) Sada .T. .F. .T. A partir dessa sada, voc pode constatar que 2 um nmero, no um nmero e o terceiro caractere em cTest, 3, um nmero.

Se o caractere for numrico, copie-o para a segunda seqncia


Agora que j pode examinar todos os caracteres e determinar se eles so numricos ou no, voc precisar de uma varivel para guardar os valores numricos: cNumOnly. Para criar a varivel, atribua a ela um valor inicial, uma seqncia de comprimento zero: cNumOnly = "" Como o loop FOR se move pela seqncia, uma boa idia criar outra varivel para guardar temporariamente cada caractere da seqncia enquanto ela est sendo manipulada: cCharacter = SUBSTR(cTest, nCnt, 1) Dica Em geral, melhor armazenar o resultado de um clculo, avaliao ou funo em uma varivel. Voc pode, ento, manipular a varivel sem precisar repetir o clculo ou a avaliao. A linha de cdigo a seguir pode ser usada sempre que um nmero for encontrado para adicion-lo segunda seqncia: cNumOnly = cNumOnly + cCharacter At agora, o programa inclui: cNumOnly = "" FOR nCnt = 1 TO 14 cCharacter = SUBSTR(cTest, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR

Testando as partes
Se adicionar alguns comandos no final para exibir as seqncias e, em seguida, executar o programa, voc ver que o programa funciona com a seqncia de teste: cNumOnly = "" FOR nCnt = 1 TO 14 cCharacter = SUBSTR(cTest, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? cTest ? cNumOnly Sada 123-456-7 89 0 1234567890 A sada parece correta. No entanto, se alterar a seqncia de teste enquanto estiver testando as partes, voc poder enfrentar problemas. Digite o comando a seguir na janela Comando e execute o programa novamente:

cTest = "456-789 22" O programa ir gerar uma mensagem de erro. O loop FOR tentou executar 14 vezes mas h apenas 10 caracteres na seqncia. Voc precisa de uma forma de ajuste para comprimentos de seqncia variveis. Utilize LEN( ) para retornar o nmero de caracteres contido em uma seqncia. Se substituir este comando no loop FOR, voc ver que o programa funciona corretamente com ambas as seqncias de teste: cNumOnly = "" FOR nCnt = 1 TO LEN(cTest) cCharacter = SUBSTR(cTest, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? cTest ? cNumOnly

Juntando as partes
Para concluir a soluo de programao para esse problema, convm que voc leia seus dados a partir de uma tabela. Ao selecionar uma tabela a ser usada, varra os registros e aplique seu cdigo de programa a um campo da tabela, e no a uma varivel. Primeiro, voc pode criar uma tabela temporria com diversas seqncias de exemplo. Uma tabela dessa natureza pode conter um nico campo de caractere denominado TestField e quatro ou cinco registros: Contedo de TestField 123-456-7 89 0 -9221 9220 94321 99456-789 22 000001 98-99-234 Ao substituir o nome do campo pelo nome da seqncia de teste, o programa ficar desta forma: FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? TestField ? cNumOnly Voc pode ajustar manualmente o ponteiro do registro pesquisando e percorrendo a tabela. Quando o ponteiro est em cada registro, o programa funciona da forma desejada. Voc pode tambm utilizar o cdigo de navegao de tabela com o resto do programa: SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR ? TestField ? cNumOnly ? ENDSCAN Sada 123-456-7 89 0 1234567890

456-789 22 45678922 -9221 9220 94321 99922192209432199 000001 98-99-234 0000019899234

Testando todo o programa


Em vez de imprimir a seqncia no final do programa, voc deseja salv-la em sua tabela. Para isso, utilize a linha de cdigo a seguir: REPLACE TestField WITH cNumOnly O programa completo agora : SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + cCharacter ENDIF ENDFOR REPLACE TestField WITH cNumOnly ENDSCAN Quando voc tiver o programa completo, ser necessrio test-lo com dados de exemplo antes de experiment-lo em dados reais.

Tornando o programa mais eficaz


Um programa eficaz faz o que voc deseja, mas tambm antecipa e lida com possveis aspectos que poderiam dar errado. Este programa faz o que voc deseja, mas faz algumas suposies que devem ser verdadeiras para que o programa funcione: Uma tabela est aberta na rea de trabalho ativa. A tabela possui um campo de caractere denominado TestField. Se a tabela no estiver aberta na rea de trabalho ativa ou se ela no possuir um campo de caractere com o nome esperado, o programa ir gerar uma mensagem de erro e no conseguir realizar a tarefa. Programa para remover os caracteres no-numricos de todos os registros em um campo Cdigo lFieldOK = .F. Comentrios Esta varivel determina se existem as condies necessrias para que o programa funcione. Inicialmente, define a varivel como falsa (.F.) para pressupor que as condies necessrias no existem. Esta seo de cdigo passa por cada campo na tabela ativa at encontrar um campo de caractere denominado TestField. Assim que o campo correto for localizado, lFieldOK ser definida com verdadeira (.T.) e EXIT terminar o loop (no h mais razo para continuar a verificao uma vez que o campo correto j foi identificado). Se nenhum

FOR nCnt = 1 TO FCOUNT( ) IF FIELD(nCnt) = ; UPPER("TestField") IF TYPE("TestField") = "C" lFieldOK = .T. ENDIF EXIT ENDIF

campo corresponder aos critrios, lFieldOK permanecer como falsa (.F.). IF lFieldOK A seo de converso do programa ser executada apenas se um campo de caractere denominado TestField estiver presente na tabela ativa no momento. O cdigo de converso.

SCAN cNumOnly = "" FOR nCnt = 1 TO LEN(TestField) cCharacter = ; SUBSTR(TestField, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = cNumOnly + ; cCharacter ENDIF ENDFOR REPLACE TestField WITH ; cNumOnly ENDSCAN ENDIF

Fim da condio de IF lFieldOK. A caracterstica de maior limitao deste programa que voc s pode us-lo para um nico campo. Se voc desejar remover os caracteres no-numricos de um campo que no seja TestField, ter que percorrer todo o programa e substituir cada ocorrncia de TestField pelo nome do outro campo.

A converso do programa em uma funo, conforme ser explicado nas sees a seguir, permite que voc torne o cdigo escrito mais genrico e reutilizvel, economizando trabalho posterior.

Utilizando procedimentos e funes definidas pelo usurio


Os procedimentos e as funes permitem que voc guarde o cdigo utilizado com muita freqncia em um nico local e possa cham-lo em qualquer parte do aplicativo quando precisar. Isso facilita a leitura e a manuteno do seu cdigo, pois uma alterao pode ser feita uma nica vez no procedimento, no sendo necessrio efetu-la vrias vezes em seus programas. No Visual FoxPro, os procedimentos so deste tipo: PROCEDURE myproc * Isto um comentrio, mas poderia ser um cdigo executvel ENDPROC Tradicionalmente, os procedimentos contm cdigos que voc escreve para executar uma operao, e as funes realizam algumas operaes e retornam um valor. No Visual FoxPro, as funes se assemelham aos procedimentos: FUNCTION myfunc * Isto um comentrio mas poderia ser um cdigo executvel ENDFUNC Voc pode incluir procedimentos e funes em um arquivo de programa separado ou no final de um arquivo de programa que contenha o cdigo de programa normal. Voc no pode ter um cdigo de programa executvel normal includo em um arquivo de programa aps procedimentos e funes. Se incluir seus procedimentos e funes em um arquivo de programa separado, voc poder torn-los acessveis ao seu programa utilizando o comando SET PROCEDURE TO. Por exemplo, se voc tiver um arquivo denominado FUNPROC.PRG, utilize o comando a seguir na janela Comando: SET PROCEDURE TO funproc.prg

Chamando um procedimento ou funo


H duas formas de chamar um procedimento ou uma funo em seus programas:

Utilize o comando DO. Por exemplo: DO myproc Ou Inclua um conjunto de parnteses depois do nome da funo. Por exemplo: myfunc( ) Cada um desses mtodos pode ser expandido enviando ou recebendo valores do procedimento ou da funo.

Enviando valores a um procedimento ou funo


Para enviar valores a procedimentos ou funes, voc pode incluir parmetros. Por exemplo, o procedimento a seguir aceita um nico parmetro: PROCEDURE myproc( cString ) * A linha a seguir exibe uma mensagem MESSAGEBOX ("myproc" + cString) ENDPROC Observao A incluso dos parmetros entre parnteses em uma linha de definio de procedimento ou funo, por exemplo, PROCEDURE myproc(cString), indica que o parmetro tem um escopo local em relao ao procedimento ou funo. Voc tambm pode permitir que uma funo ou um procedimento aceite parmetros de escopo local utilizando LPARAMETERS. Os parmetros funcionam da mesma forma em uma funo. Para enviar um valor como um parmetro a este procedimento ou a uma funo, voc pode utilizar uma seqncia ou uma varivel que contenha uma seqncia, conforme indicado na tabela a seguir. Passagem de parmetros Chama um procedimento e passa uma seqncia literal ou uma varivel de caracteres. Myfunc("seqncia de teste") Chama uma funo e passa myfunc( cTestString ) uma cpia de uma varivel de caracteres ou seqncia literal. Observao Se voc chamar um procedimento ou uma funo sem utilizar o comando DO, a definio UDFPARMS controlar como os parmetros so passados. Como padro, UDFPARMS definido como VALUE para que cpias dos parmetros sejam passadas. Quando voc utilizar DO, o parmetro real utilizado (o parmetro passado por referncia) e quaisquer alteraes no procedimento ou na funo so refletidas nos dados originais, independentemente da definio de UDFPARMS. Voc pode enviar diversos valores a um procedimento ou a uma funo, separando-os por vrgulas. Por exemplo, o procedimento a seguir pressupe trs parmetros: uma data, uma seqncia de caracteres e um nmero. PROCEDURE myproc( dDate, cString, nTimesToPrint ) FOR nCnt = 1 to nTimesToPrint ? DTOC(dDate) + " " + cString + " " + STR(nCnt) ENDFOR ENDPROC Voc poderia chamar este procedimento com a linha de cdigo a seguir: DO myproc WITH DATE(), "Ol Mundo", 10 Cdigo DO myproc WITH cTestString DO myproc WITH " seqncia de teste" Comentrios

Recebendo valores de uma funo


O valor de retorno padro verdadeiro (.T.) mas voc pode utilizar o comando RETURN para retornar qualquer valor. Por exemplo, a funo a seguir retorna uma data duas semanas aps a data passada para ela como um parmetro.

FUNCTION plus2weeks PARAMETERS dDate RETURN dDate + 14 ENDFUNC A linha de cdigo a seguir armazena o valor retornado por essa funo em uma varivel: dDeadLine = plus2weeks(DATE()) A tabela abaixo lista as formas de armazenar ou exibir valores retornados por uma funo: Manipulando valores de retorno Cdigo var = myfunc( ) ? myfunc( ) Comentrios Armazena o valor retornado pela funo em uma varivel. Imprime o valor retornado pela funo na janela de sada ativa.

Verificando parmetros em um procedimento ou funo


uma boa idia verificar se os parmetros enviados ao seu procedimento ou funo so os que voc espera receber. Voc pode utilizar as funes TYPE( ) e PARAMETERS( ) para verificar o tipo e o nmero de parmetros enviados ao procedimento ou funo. O exemplo na seo anterior, por exemplo, precisa receber um parmetro do tipo Data. Voc pode utilizar a funo TYPE( ) para certificar-se de que o valor recebido pela funo do tipo certo. FUNCTION plus2weeks( dDate ) IF TYPE("dDate") = "D" RETURN dDate + 14 ELSE MESSAGEBOX( "Voc deve passar uma data!" ) RETURN {} && Retorna uma data vazia ENDIF ENDFUNC Se um procedimento receber mais parmetros do que o esperado, o Visual FoxPro ir gerar uma mensagem de erro. Por exemplo, se tiver listado dois parmetros e chamar o procedimento com trs parmetros, voc receber uma mensagem de erro. Contudo, se um procedimento receber menos parmetros do que o esperado, os parmetros adicionais so simplesmente inicializados com um valor falso (.F.). Como no h uma forma de saber se o ltimo parmetro foi definido como falso (.F.) ou omitido, o procedimento a seguir ir verificar se o nmero apropriado de parmetros foi enviado: PROCEDURE SaveValue( cStoreTo, cNewVal, lIsInTable ) IF PARAMETERS( ) < 3 MESSAGEBOX( "Nmero insuficiente de parmetros passado." ) RETURN .F. ENDIF IF lIsInTable REPLACE (cStoreTo) WITH (cNewVal) ELSE &cStoreTo = cNewVal ENDIF RETURN .T. ENDPROC

Convertendo o programa NUMONLY em uma funo


O programa de exemplo NUMONLY.PRG discutido na seo O processo de programao, pode se tornar mais eficaz e til atravs da criao de uma funo para a parte do programa que remove os caracteres no-numricos de uma seqncia. Exemplo de procedimento para retornar caracteres numricos de uma seqncia

Cdigo FUNCTION NumbersOnly( cMixedVal ) CNumOnly = "" FOR nCnt = 1 TO LEN(cMixedVal) cCharacter = ; SUBSTR(cMixedVal, nCnt, 1) IF ISDIGIT(cCharacter) cNumOnly = ; cNumOnly + cCharacter ENDIF ENDFOR RETURN cNumOnly

Comentrios Incio da funo, que aceita uma seqncia de caracteres. Cria uma seqncia que s contm os caracteres numricos da seqncia original.

Retorna a seqncia que s contm caracteres numricos. ENDFUNC Final da funo. Alm de permitir a utilizao deste cdigo em vrias situaes, esta funo facilita a leitura do programa: SCAN REPLACE FieldName WITH NumbersOnly(FieldName) ENDSCAN Ou mais simples ainda: REPLACE ALL FieldName WITH NumbersOnly(FieldName)

Seguindo adiante
A programao procedural, juntamente com a programao orientada a objetos e com as ferramentas de criao do Visual FoxPro, podem ajud-lo a desenvolver um aplicativo verstil do Visual FoxPro. O restante deste manual traz tpicos com os quais voc ir se deparar ao desenvolver aplicativos do Visual FoxPro. Para obter maiores informaes sobre a programao com uma abordagem orientada a objetos, consulte o captulo 3, Programao orientada a objetos. Para aprender mais sobre a criao de formulrios com o Criador de formulrios, consulte o captulo 9, Criando formulrios.

Você também pode gostar