comando index - clausula for x while

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

comando index - clausula for x while

Mensagem 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
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

comando index - clausula for x while

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1299
Registrado em: 06 Jul 2004 00:44
Contato:

comando index - clausula for x while

Mensagem 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+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

comando index - clausula for x while

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

comando index - clausula for x while

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

comando index - clausula for x while

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

comando index - clausula for x while

Mensagem por Abel »

agradeço a todos pela ajuda e orientação,

grato mesmo,
Abel
Responder