0% acharam este documento útil (0 voto)
25 visualizações14 páginas

Aula 08

Aula e Dicas
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
25 visualizações14 páginas

Aula 08

Aula e Dicas
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 14

A U L A

Introdução à
08 Linguagem do Visual FoxPro
Parte 4

Estruturas de Controle Condicionais e de Repetição

Numa linguagem de programação, as estruturas de controle permitem que se


possam criar desvios lógicos e condicionais na execução do código do programa.

Existem vários tipos de desvios, que devem ser utilizados de acordo com a
necessidade específica de cada situação.

No Visual FoxPro existem alguns comandos responsáveis por criar essas


estruturas, os quais estaremos examinando nesta aula.

O comando DO WHILE ... ENDDO

Executa um conjunto de comandos em um loop condicional.

Sintaxe

DO WHILE lExpressão
Comandos
[LOOP]
[EXIT]
ENDDO

Argumentos

lExpressão – Especifica uma expressão lógica cujo valor determina se os


comandos entre DO WHILE e ENDDO são executados. Se lExpressão for
verdadeiro (.T.), o conjunto de comandos será executado.

Comandos – Especifica o conjunto de comandos do Visual FoxPro a ser


executado se lExpressão for verdadeiro (.T.).

LOOP – Retorna o controle do programa diretamente para DO WHILE.


LOOP pode ser colocado em qualquer lugar entre DO WHILE e ENDDO.

EXIT – Transfere o controle do programa de dentro do loop DO WHILE para


o primeiro comando após ENDDO. EXIT pode ser colocado em qualquer
lugar entre DO WHILE e ENDDO.
A U L A

08
Comentários

Os comandos entre DO WHILE e ENDDO são executados enquanto a


expressão lógica lExpressão permanecer como verdadeira (.T.). Cada
instrução DO WHILE deve ter uma instrução ENDDO correspondente.

Os comentários podem ser colocados depois de DO WHILE e ENDDO na


mesma linha. Os comentários serão ignorados durante a compilação e
execução do programa.

DO WHILE ... ENDDO, exemplo do comando

No exemplo a seguir, o número de produtos em estoque com preços acima


de $20 é totalizado no loop DO WHILE até que seja encontrado o final do
arquivo (EOF). O loop DO WHILE é executado e o total é exibido.

CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE products && Abre a tabela Products
SET TALK OFF
PUBLIC gnStockTot
gnStockTot = 0

DO WHILE .T. && Inicia o loop


IF EOF( )
EXIT
ENDIF
IF unit_price < 20
SKIP
LOOP
ENDIF
gnStockTot = gnStockTot + in_stock
SKIP
ENDDO && Finaliza o loop

CLEAR
? 'Total de itens em estoque com valor igual ou superior a U$ 20,00:'
?? gnStockTot

USE IN products && Fecha a tabela products


CLOSE DATABASES && Fecha o banco de dados
RELEASE gnStockTot && Elimina a variável da memória

Comentários sobre o exemplo

No exemplo do comando DO WHILE ... ENDDO, Utilizamos vários comandos


e funções que não foram apresentados até o momento. Para saber detalhes
sobre estes comandos, procure no Help em português do VFP 5.

Agora sobre a lógica do código acima, o que acontece é o seguinte:

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
1. Um banco de dados chamado testdata é aberto.

2. A tabela products é aberta.

3. A variável gnStockTot é definida e inicializada com valor zero.

4. O Laço (ou estrutura de repetição) é iniciado com o comando DO WHILE


.T., significando enquanto não houver a ocorrência de um comando EXIT
é para continuar executando o bloco de código entre o DO WHILE e o
ENDDO.

5. No caso desse nosso exemplo, o comando EXIT só ocorrerá numa única


situação: quando o final do arquivo (EOF) for encontrado. Sendo assim,
nosso laço de repetição foi projetado para percorrer a tabela inteira. O
comando IF EOF() irá garantir que somente ocorrerá o EXIT quando a
tabela tiver sido totalmente percorrida.

6. O trecho de código:
IF unit_price < 20
SKIP
LOOP
ENDIF

Verifica se o preço unitário do produto é menor que 20. Caso positivo,


salta (SKIP) o registro e volta o controle da execução para o início do
laço (DO WHILE).

7. Nas linhas:
gnStockTot = gnStockTot + in_stock
SKIP

O Visual FoxPro só interpretará esse código caso o preço unitário do


produto seja maior ou igual a 20, caso contrário o fluxo da execução é
desviado conforme visto no item 6, acima. Uma vez que o valor seja
maior ou igual a 20, a variável gnStockTot é incrementada recebendo
o seu valor atual mais a quantidade em estoque do produto atual.

8. No penúltimo trecho de código, temos a impressão na tela dos valores


calculados:
CLEAR
? 'Total de itens em estoque com valor igual ou superior a U$
20,00:'
?? gnStockTot

9. E finalmente o restante do código é responsável por fechar a tabela e o


banco de dados e ainda eliminar a variável gnStockTot.

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
O Comando IF ... ENDIF

Executa condicionalmente um conjunto de comandos baseados no valor de


uma expressão lógica.

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

Argumentos

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


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

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


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

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


comandos entre IF e ENDIF serão ignorados. Neste caso, a execução
do programa continuará com o primeiro comando depois de ENDIF.

Comentários

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

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


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

Exemplo de uso do comando IF...ENDIF


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

GETEXPR 'Digite a condição para localizar ' TO gcTemp;


TYPE 'L' DEFAULT 'COMPANY = "Centro"'
LOCATE FOR &gcTemp && Digita a expressão LOCATE
IF FOUND( ) && Foi encontrado?
BROWSE && Em caso positivo, exibe o registro
ELSE && Em caso negativo
* Exibe a mensagem
MESSAGEBOX( 'Condição ' + gcTemp + ' não encontrada ')
ENDIF

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
USE

Neste exemplo abrimos um banco de dados e a tabela Customer. Em


seguida exibimos um diálogo para que se informe a expressão a ser
pesquisada com LOCATE.

O comando LOCATE pesquisa a tabela Customer procurando pela


expressão informada. Caso uma ocorrência seja encontrada a função
FOUND() retornará um valor .T. (Verdadeiro). Caso contrário um valor .F.
(Falso) será retornado. Sendo assim, no caso de a expressão ser encontrada
então o IF avalia o valor de FOUND() .T. (Verdadeiro) e então executa o
código que estiver entre o IF e o ELSE ou ENDIF, que nesse exemplo é o
comando BROWSE, exibindo o registro encontrado.

Se a expressão não for localizada, uma mensagem será exibida.

O comando DO CASE ... ENDCASE

Executa o primeiro conjunto de comandos cuja expressão condicional resulta


em verdadeiro (.T.).

Sintaxe
DO CASE
CASE lExpressão1
Comandos
[CASE lExpressão2
Comandos
...
CASE lExpressãoN
Comandos]
[OTHERWISE
Comandos]
ENDCASE

Argumentos

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


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

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


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

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
Apenas um conjunto de comandos é executado. É o primeiro conjunto de
comandos cuja expressão CASE resulta em verdadeiro (.T.). Qualquer
expressão CASE verdadeira (.T.) posterior será ignorada.

OTHERWISE Comandos – Se todas as expressões CASE resultarem em


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

• Se você incluir OTHERWISE, os comandos que acompanham


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

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


comando que acompanha ENDCASE.

Comentários

DO CASE é utilizado para executar um conjunto de comandos do Visual


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

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


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

Exemplo do comando DO CASE ... ENDCASE


STORE Mes(CTOD("01/06/2004")) TO mes

WAIT WINDOW mes


DO CASE && Começa o loop

CASE INLIST(mes,'Janeiro','Fevereiro','Março')
STORE 'Ganhos no primeiro trimestre' TO rpt_title

CASE INLIST(mes,'Abril','Maio','Junho')
STORE 'Ganhos no segundo trimestre' TO rpt_title

CASE INLIST(mes,'Julho','Agosto','Setembro')
STORE 'Ganhos no terceiro trimestre' TO rpt_title

OTHERWISE
STORE 'Ganhos no quarto trimestre' TO rpt_title

ENDCASE && Finaliza o loop


WAIT WINDOW rpt_title NOWAIT

FUNCTION Mes(dData As Date) AS Character

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
LOCAL lcMeses AS String, lnMes AS Number, lnPosicao AS Number

* Recebe uma string com a lista de meses


lcMeses = "Janeiro FevereiroMarço Abril Maio Junho
Julho Agosto Setembro Outubro Novembro Dezembro "

* Identifica o número do mês da data passada


lnMes = MONTH(dData)

IF lnMes = 1
lnPosicao = 1
ELSE
lnPosicao = (lnMes * 9)-8
ENDIF

* Retorna o mês extraído de lcMeses a partir da posição


* identificada em lnPosicao. Os nove dígitos formam
* o nome do mês.
RETURN ALLTRIM(SUBSTR(lcMeses,lnPosicao,9))

ENDFUNC

No exemplo acima, nossa intenção é passar uma data qualquer à função


Mes() e a partir daí temos uma estrutura DO CASE para identificar se
estamos no primeiro, segundo, terceiro ou quarto trimestre.

A melhor forma de entender como este exemplo funciona é executando-o.


Faça isso várias vezes alterando a data passada como parâmetro na linha:
STORE Mes(CTOD("01/06/2004")) TO mes

Para maiores detalhes, consulte o vídeo que foi produzido especialmente


para este exemplo, para entendimento visual de como o programa analisa os
CASE’s.

O Comando SCAN ... ENDSCAN

Move o ponteiro do registro pela tabela atualmente selecionada e executa um


bloco de comandos para cada registro que satisfaça as condições
especificadas.

Sintaxe
SCAN [NOOPTIMIZE]
[Escopo] [FOR lReferência1] [WHILE lReferência2]
[Comandos]
[LOOP]
[EXIT]
ENDSCAN

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08

Argumentos

NOOPTIMIZE – Impede a otimização de Rushmore de SCAN.

Para obter maiores informações, consulte SET OPTIMIZE Na documentação


do Visual FoxPro.

Escopo – Especifica um intervalo de registros a ser examinado. Apenas os


registros dentro deste intervalo serão examinados. As cláusulas de escopo
são: ALL, NEXT nRegistros, RECORD nNúmeroRegistro e REST. Para obter
maiores informações sobre cláusulas de escopo, consulte “Cláusulas
escopo”.

O escopo padrão para SCAN é todos os registros (ALL)

FOR lReferência1 – Executa comandos apenas para os registros para os


quais lReferência1 resulta em verdadeiro (.T.) A inclusão da cláusula FOR
permite filtrar os registros que você não deseja examinar.

Rushmore otimizará uma consulta criada com SCAN ... FOR se lReferência1
for uma expressão otimizável. Para obter um melhor desempenho, utilize
uma expressão otimizável na cláusula FOR.

Para obter maiores informações, consulte “SET OPTIMIZE” na


documentação do Visual FoxPro.

WHILE lReferência2 – Especifica uma condição pela qual os comandos


serão executados desde que lReferência2 resulte em verdadeiro (.T.).

Comandos – Especifica os comandos do Visual FoxPro que devem ser


executados.

LOOP – Retorna o controle diretamente para SCAN. LOOP pode ser


colocado em qualquer lugar entre SCAN e ENDSCAN.

EXIT – Transfere o controle do programa de dentro do loop


SCAN ... ENDSCAN para o primeiro comando depois de ENDSCAN. EXIT
pode ser colocado em qualquer lugar entre SCAN e ENDSCAN.

ENDSCAN – Indica o fim do procedimento SCAN.

Comentários

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
O comando SCAN avança automaticamente o ponteiro do registro para o
próximo registro que satisfaça as condições especificadas e executa o bloco
de comandos.

Você pode colocar comentários na mesma linha depois de ENDSCAN. Os


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

SCAN ... ENDSCAN, exemplo do comando

O exemplo a seguir utiliza um loop SCAN ... ENDSCAN para exibir todas as
empresas na Suécia.
CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
UTILIZE customer && Abra a tabela Customer
CLEAR

SCAN FOR UPPER(country) = 'SWEDEN'


? contato, empresa, cidade
ENDSCAN

O Comando FOR ... ENDFOR

Executa um conjunto de comandos, um determinado número de vezes.

Sintaxe
FOR Var = nValorInicial TO nValorFinal [STEP nIncremento]
Comandos
[EXIT]
[LOOP]
ENDFOR | NEXT

Argumentos

Var – Especifica uma variável ou um elemento de matriz que atue como


contador. Não é necessário que a variável ou o elemento de matriz já exista
antes da execução de FOR ... ENDFOR.

nValorInicial TO nValorFinal – nValorInicial é o valor inicial do contador e


nValorFinal é o valor final do contador.

STEP nIncremento – nIncremento é o valor incrementado ou decrementado


do contador. Caso nIncremento seja negativo, o contador será
decrementado. Se você omitir STEP, o contador será incrementado de 1.

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
Comandos – Especifica os comando do Visual FoxPro a serem executados.
Comandos pode incluir qualquer número de comandos.

EXIT – Transfere o controle do loop FOR ... ENDFOR para o comando logo
depois de ENDFOR. EXIT pode ser colocado em qualquer parte entre FOR e
ENDFOR.

LOOP – Retorna o controle diretamente para a cláusula FOR sem executar


as instruções entre LOOP e ENDFOR. O contador é incrementado ou
decrementado como se ENDFOR tivesse sido atingido. LOOP pode ser
colocado em qualquer parte entre FOR e ENDFOR.

Comentários

Utiliza-se uma variável de memória ou um elemento de matriz como um


contador para especificar quantas vezes os comandos do Visual FoxPro
dentro do loop FOR ... ENDFOR são executados.

Os comandos do Visual FoxPro depois de FOR são executados até


ENDFOR ou NEXT ser atingido. Em seguida, o contador Var é incrementado
do valor de nIncremento. Se você omitir a cláusula STEP, o contador será
incrementado em 1. Em seguida, o contador é comparado ao nValorFinal. Se
ele for menor ou igual ao nValorFinal, os comandos depois da cláusula FOR
serão executados novamente. Se for maior que o nValorFinal, o loop
FOR ... ENDFOR será abandonado e a execução do programa continuará
com o primeiro comando depois de ENDFOR ou NEXT.

Observação – Os valores de nValorInicial, nValorFinal e nIncremento são,


inicialmente, somente para leitura. No entanto, uma alteração no valor do
contador Var dentro do loop afeta o número de vezes que o loop é
executado.

Se o valor de nIncremento for negativo e o valor inicial nValorInicial for maior


que o valor final nValorFinal, o contador será decrementado a cada execução
do loop.

FOR ... ENDFOR, exemplos do comando

No exemplo 1, os números de 1 a 10 são exibidos.

O exemplo 2 utiliza variáveis de memória para os valores inicial, final e STEP


para exibir tudo, inclusive registros pares de 2 a 10 em customer.

* Exemplo 1

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
CLEAR
FOR gnCount = 1 TO 10
? gnCount
ENDFOR

* Example 2
SET TALK OFF
CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE customer && Abre tabela Customer
STORE 2 TO gnI && Valor inicial
STORE 10 TO gnJ && Valor final
STORE 2 TO K && Valor Step
FOR gnCount = gnI TO gnJ STEP K
GOTO gnCount && Move o ponteiro do registro
DISPLAY company && Exibe o nome da empresa
ENDFOR

O comando FOR EACH ... ENDFOR

Executa um conjunto de comandos para cada elemento em uma matriz ou


coleção do Visual FoxPro.

Sintaxe
FOR EACH Var IN Grupo
Comandos
[EXIT]
[LOOP]
ENDFOR | NEXT [Var]

Definição

Var – Uma variável ou elemento de matriz utilizado para interagir por meio
dos elementos de Grupo.

Grupo – Uma matriz do Visual FoxPro, uma matriz OLE, uma coleção do
Visual FoxPro ou uma coleção OLE.

Comandos – Especifica os comandos Visual FoxPro a serem executados


para cada elemento em Grupo. Comandos pode incluir qualquer quantidade
de comandos.

EXIT – Transfere o controle do loop FOR EACH ... ENDFOR para o comando
imediatamente após ENDFOR. Pode-se colocar EXIT em qualquer parte
entre FOR EACH e ENDFOR.

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
LOOP – Retorna o controle diretamente para a cláusula FOR EACH sem
executar as instruções entre LOOP e ENDFOR. LOOP pode ser colocado em
qualquer parte entre FOR EACH e ENDFOR.

Exemplos de FOR EACH ... ENDFOR

No exemplo a seguir uma matriz é criada e valores são atribuídos a seus


elementos. Usamos o FOR EACH ... ENDFOR para percorrer toda a matriz
cMyArray e exibir o conteúdo de seus elementos.
DIMENSION cMyArray(3)
cMyArray[1] = 'A'
cMyArray[2] = 'B'
cMyArray[3] = 'C'

FOR EACH cMyVar IN cMyArray


? cMyVar
ENDFOR

O próximo exemplo cria uma instância do Excel e adiciona uma nova pasta
de trabalho. Em seguida FOR EACH ... ENDFOR é utilizado para percorrer a
coleção oExcel.sheets exibindo o nome das planilhas contidas na pasta de
trabalho. Certifique-se de que o Excel esteja instalado em sua máquina antes
de executar este exemplo.
oExcel = CREATE("Excel.Application")
oExcel.Workbooks.ADD

FOR EACH oMyVar IN oExcel.sheets


? oMyVar.name
NEXT oMyVar

O exemplo a seguir cria um formulário, e adiciona cinco botões de comandos


ao mesmo. FOR EACH ... ENDFOR é usado para mostrar os botões no
formulário, assim como atribuir seus títulos, fontes e posição.
PUBLIC oMyObject
oMyObject = CREATEOBJECT("frmTest")
oMyObject.SHOW

DEFINE CLASS frmTest AS FORM


Height = 200
DIMENSION MyArray[5]
PROCEDURE Init

FOR i = 1 to 5
THIS.AddObject('THIS.MyArray[i]',;
'COMMANDBUTTON')
ENDFOR

****** FOR EACH - NEXT ******

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
FOR EACH oButton IN THIS.MyArray
oButton.Visible = .T.
NEXT

****** FOR EACH - NEXT element ******


FOR EACH oButton IN THIS.MyArray
oButton.FontBold = .T.
NEXT obutton

j = 1
****** FOR EACH - ENDFOR ******
FOR EACH oButton IN THIS.MyArray
oButton.top = j * 30
j = j + 1
ENDFOR

****** FOR EACH - ENDFOR element ******


FOR EACH oButton IN THIS.MyArray
oButton.FontItalic = .T.
ENDFOR obutton

j = 1
****** EXIT ******
FOR EACH oButton IN THIS.MyArray
oButton.Caption = "test" + str(j)
j = j+1
IF j > 3
EXIT
ENDIF
NEXT

j = 1
****** LOOP ******
FOR EACH oButton IN THIS.MyArray
IF j > 3
LOOP
ENDIF
j = j + 1
oButton.Left = 25
NEXT
ENDPROC
ENDDEFINE

Coleções

Coleções são como uma espécie de matriz que podem armazenar certos
tipos de informações de objetos ou entidades no Visual FoxPro. Desde suas
primeiras versões o Visual FoxPro já implementava em alguns objetos, as
coleções.

Na versão 8.0 do Visual FoxPro houve mudanças importantes. Uma nova


classe de raiz foi implementada permitindo a criação de coleções
personalizadas e não mais somente a utilização daquelas já implementadas

Copyright © 2004 – Fox Total Network – Todos os direitos reservados


A U L A

08
em objetos existentes. Agora podemos criar nossas próprias coleções e até
mesmo substituir o uso de matrizes em determinados pontos do nosso
código. Com isso, teremos uma abordagem totalmente orientada a objetos
na hora de implementarmos códigos com as coleções.

Apesar de seu conceito ir bem mais além, vamos ficar apenas com este
resumo sobre coleções para fins de complementarmos o conceito já visto
com o comando FOR EACH ... ENDFOR, logo acima.

Cláusulas Escopo

Se um comando do Visual FoxPro possui uma cláusula Escopo, é possível


especificar um intervalo de registro para o comando agir substituindo Escopo
por uma das cláusulas da tabela abaixo.

Cláusula Escopo Efeito

ALL Comando influencia todos os registros na


tabela.

NEXT nExpr Comando influencia um intervalo de


registros começando com o registro atual e
continuando para um número de registro
específico.
Por exemplo, o exemplo abaixo age sobre
os registros atuais e sobre os dois
seguintes registros:
REPLACE status WITH "aberto" NEXT 3

RECORD nNumero Comando influencia apenas um número de


registro específico.
O exemplo a seguir age sobre o registro
cinco.
REPLACE status WITH "aberto" RECORD 5

REST Comando influencia um intervalo de


registros começando com o registro atual e
terminando com o último registro na tabela.
O exemplo a seguir armazena um valor
nulo nos registros remanescentes.
REPLACE status WITH .NULL. REST

Copyright © 2004 – Fox Total Network – Todos os direitos reservados

Você também pode gostar