Página 1 de 1

comando index - clausula for x while

Enviado: 04 Jan 2014 15:54
por Abel
olá pessoal,
gostaria de saber a diferenca e vantagens/desvantagens de criar um indice usando a clausula for ou while.

Desde ja Agradeço,
ABEL

comando index - clausula for x while

Enviado: 04 Jan 2014 19:34
por Itamar M. Lins Jr.
Ola!

"for" varre todo o dbf, mesmo que não esteja indexado.
"While" falhará caso o dbf não esteja indexado.

Resumindo while quase nunca é usado, a não se que saiba exatamente a ordem do dbf.

Saudações,
Itamar M. Lins Jr.

comando index - clausula for x while

Enviado: 05 Jan 2014 13:37
por ANDRIL
Itamar M. Lins Jr. escreveu:"While" falhará caso o dbf esteja indexado
O FOR simula um FILTER pois verifica todo o conteúdo do arquivo, criando um indice com apenas os registros que satisfaçam a condição. Vamos supor que temos um DBF com campos NOME e ESTADO.

Código: Selecionar todos

use MEUDBF

Código: Selecionar todos

index on NOME to idx1 FOR "ANDRIL"$NOME
Será criado um indice com apenas registros que contenham ANDRIL no campo NOME em qualquer POSICAO.

Para uso do WHILE é necessário que já haja um indice usando o campo desejado. Cria-se um indice primeiro

Código: Selecionar todos

index on NOME to idx1
Para criar um indice temporário apenas com registros iniciados com ANDRIL

Código: Selecionar todos

seek "ANDRIL"
index on NOME to idx2 WHILE NOME="ANDRIL"
Pode-se usar os WHILE e FOR juntos

Código: Selecionar todos

seek "ANDRIL"
index on NOME to idx3 WHILE NOME="ANDRIL" FOR estado="SP"
Neste caso, o indice agiria sobre o campo NOME e fazendo uma seleção sobre o ESTADO="SP"

Ate+

comando index - clausula for x while

Enviado: 06 Jan 2014 12:37
por JoséQuintas
Um exemplo, em pedidos pra filtrar os produtos do pedido:

Código: Selecionar todos

SEEK XPEDIDO
INDEX ON PEDIDO + PRODUTO WHILE PEDIDO=XPEDIDO TO TEMP
SET INDEX TO PRINCIPAL,TEMP
OrdSetFocus( "TEMP" )
BROWSE()
SET INDEX TO PRINCIPAL
fErase( "TEMP.NTX" )
Mesmo que o arquivo contenha milhões de registros, essa indexação é instantânea, e o browse também vai ser.

Lógico, dependendo do caso, SET SCOPE tem o mesmo efeito mas um SET FILTER, deixaria tudo extremamente lento.

Um browse de um arquivo com set filter vai ter navegação lenta.
Um browse de um arquivo com INDEX...FOR...WHILE vai ter navegação instantânea.
O tempo pra criar o índice, pode compensar ou não, dependendo do que vai ser filtrado.

Tem casos onde SET FILTER é melhor, em outros casos SET SCOPE é melhor, em outros casos um INDEX...WHILE é melhor, e em outros casos até um DBF temporário pode ser melhor.
Como tudo em programação, não existe "isto é melhor". Você é que precisa analisar qual vai ser a melhor opção para cada uma das suas necessidades.

Obs. Num banco de dados servidor, o servidor entrega tudo pronto ao terminal. É justamente nisto que o DBF perde longe.

comando index - clausula for x while

Enviado: 06 Jan 2014 21:12
por Itamar M. Lins Jr.
...
É justamente nisto que o DBF perde longe.
Depende, se usar ADS, LETODB ou NETIO isso pode ser contornado.
Outra coisa;
... não existe "isto é melhor".
Você é que precisa analisar qual vai ser a melhor opção para cada uma das suas necessidades.
Então existe, isto é o melhor! :-)
O melhor é o que melhor se aplica.
Como eu havia dito antes, só use o "while" se souber exatamente a ordem dos registros.
While é usado quase sempre na indexação da indexação.

Um seek p/ depois usar index é dificil de ver em exemplos na NET.
Geralmete usamos DbSeek + Do While, EndDo.


Saudações,
Itamar M. Lins Jr.

comando index - clausula for x while

Enviado: 07 Jan 2014 02:23
por JoséQuintas
Um seek p/ depois usar index é dificil de ver em exemplos na NET.
Geralmete usamos DbSeek + Do While, EndDo.
Pra relatórios sim, pra tbrowse não.
Apesar do set scope resolver a maioria dos casos, sempre tem exceções.

comando index - clausula for x while

Enviado: 14 Jan 2014 23:13
por Abel
agradeço a todos pela ajuda e orientação,

grato mesmo,
Abel