Página 1 de 2
Como filtrar dados em dbfs muito grandes ??
Enviado: 04 Jun 2006 17:33
por rbonotto
Olas,
Fiz um sistema ha alguns anos que funciona ok, mas o dono da loja adicionou neste ultimo mes 47 grupos de trabalho...resultado que o meu SET FILTER TO cod_grupo == chAve que antes funcionava bem ficou lennnnnnnnnto.
Tentei fazer com um TBROWSER:
Mas não sei onde colocar a condicao cod_grupo == cHave
eis ai o codigo:
sset(3)
SEEK cChave
RESTSCREEN(,,,,tEl)
WHILE .T.
tela(03,02,19,77)
oTAB := sele_dados(04,03,18,76)
WHILE .T.
WHILE NEXTKEY()==0 .AND. .NOT. oTAB:STABILIZE()
END
tEcLa:=INKEY(0)
IF TECLA==K_ESC
EXIT
ELSE
testatec(tEcLa)
END
END
IF LASTKEY() == K_ENTER
EXIT
END
EXIT
END
RESTSCREEN(,,,,tel22); RELEASE tel22
RETURN
***************************************
FUNCTION sele_dados(nLINT,nCOLT,nLINB,nCOLB)
***************************************
Local ocolumn1,ocolumn2,ocolumn3,oColumn4,oColumn5
oTAB := TBROWSEDB(nLINT,nCOLT,nLINB,nCOLB)
oTAB : COLORSPEC :=(cCorMenu+","+cCorBarra+",,,"+cCorGet+","+cCormens )
oTAB : COLSEP := CHR(179)
oColumn1 := TBColumnNew('DESCRI€ŽO',{ || produto } )
oTAB:ADDCOLUMN(oColumn1)
RETURN (oTAB)
***************************************
FUNCTION testatec(tEcLa)
***************************************
DO CASE
CASE tEcLa==K_UP ;oTAB:UP(sobe())
CASE tEcLa==K_DOWN ;oTAB:DOWN(desce())
CASE tEcLa==K_LEFT ;oTAB:LEFT()
CASE tEcLa==K_ENTER ;a_executa()
CASE tEcLa==K_F2 ;a_pes()
END
RETURN
****
Alguem saberia como me ajudar ??

Enviado: 04 Jun 2006 18:10
por filizola
tente isto
***************************************
FUNCTION testatec(tEcLa)
***************************************
DO CASE
CASE tEcLa==K_UP;oTAB:UP(sobe())
CASE tEcLa==K_DOWN ;oTAB:DOWN(desce())
CASE tEcLa==K_LEFT ;oTAB:LEFT()
CASE tEcLa==K_ENTER ;a_executa()
CASE tEcLa==K_F2 ;a_pes()
END
RETURN
***************
FUNCTION sobe()
skip -1
if cod_grupo<>chave
skip
elseif bof()
alert("Inicio de Arquivo")
endif
return(.t.)
***************
FUNCTION desce()
skip
if cod_grupo<>chave
skip -1
endif
return(.t.)
Enviado: 04 Jun 2006 18:15
por filizola
mas vc tem que tirar o objeto up e o objeto down porque senao ele já irá executar o skip e o skip -1 respectivamente.
Enviado: 05 Jun 2006 11:42
por rbonotto
filizola escreveu:mas vc tem que tirar o objeto up e o objeto down porque senao ele já irá executar o skip e o skip -1 respectivamente.
Desculpe a minha "inguinorantzia"...mas como faço isto

Enviado: 05 Jun 2006 14:47
por MARCELOG
Verifique se o "seu" clipper suporta ordscope.
A função indicada faz um "filtro" pelo índice, tornando-se muito mais rápida que um "filtro" comum.
Veja a sua descrição e síntese, talvez lhe ajude.
Por outro lado, no próprio fórum, veja também os tópicos relacionados com "tbrowse filtrada" ou tbrowse.
O Dudu (dudu_xbase) há muito tempo postou um prg com todos os detalhes para fazer a pesquisa filtrada em banco de dados.
Boa sorte.
MarceloG
Ps: para efetuar o filtro em um tbrowse, você define apenas três variáveis, ou seja: top (início), bottom (fim) e skipblock.
Enviado: 05 Jun 2006 20:45
por filizola
assim:
***************************************
FUNCTION testatec(tEcLa)
***************************************
DO CASE
CASE tEcLa==K_UP
sobe()
CASE tEcLa==K_DOWN
desce()
CASE tEcLa==K_LEFT
oTAB:LEFT()
CASE tEcLa==K_ENTER
a_executa()
CASE tEcLa==K_F2
a_pes()
END
RETURN
***************
FUNCTION sobe()
skip -1
if cod_grupo<>chave
skip
elseif bof()
alert("Inicio de Arquivo")
endif
return(.t.)
***************
FUNCTION desce()
skip
if cod_grupo<>chave
skip -1
endif
return(.t.)
Enviado: 06 Jun 2006 07:19
por helio
Pessoal nao tem como filtra os dados com uma condicao ao carregar.
Porque estou com o mesmo problema gostaria de criar uma consulta que aparecesse so os dados que fosse solicitado.Ex: Consulta de Produtos mais so gostaria que filtrasse os produtos que o saldo esteja igual 0.
Se alguem poder me ajudar agradeco, Valeu
Helio Beltrao
helio@hrbinfo.com.br
Filtro
Enviado: 06 Jun 2006 15:52
por Norberto-Oliveira
Amigo,
Em vez de utilizar o FILTER, faça uma copia para um arquivo auxiliar, utilizando COPY While Campo = Condicao.
Abs
:)Pos
Enviado: 07 Jun 2006 10:03
por Raul
Olá amigo,
Várias vezes eu me deparei com este tipo de rotina e sempre fiz o seguinte:
Crie um índice com a chave a qual necessita filtrar. ( este índice passa a ser fixo).
Antes de fazer o browse normal, sete a ordem para este índice ( que é a chave do filtro) e gere um índice temporário condicional ( utilize as cláusulas FOR e WHILE ).
Abra o browse
Está lá... somente os registros que satisfazem a tua seleção.
Um abraço,
Raul
Novo Hamburgo - RS
Enviado: 07 Jun 2006 11:55
por Leandro2C
Caro amigo Raul,
este seu exemplo funcionaria tb p/ sistema em rede?
Um abraço à todos.
Leandro
São Lourenço - MG
Enviado: 07 Jun 2006 13:33
por Raul
Amigo Leandro,
Todas as aplicações que eu já desenvolví em Clipper são para ambientes multiusuários. Este índice condicional é temporário e de preferência em uma pasta local, isto é, na máquina que está rodando o aplicativo.
A velocidade é muitíssimo maior não somente por ser gerado no próprio HD, mas também porque ele se utiliza do índice principal.
Levando em conta que nem todos ainda utilizaram tal artifício, se faz necessário dizer que deverá ser feito um DBSEEK para posicionar o ponteiro no primeiro registro que satisfaça a condição, aí sim gerar o índice, visto que a cláusula FOR deverá retornar verdadeira.
Um abraço,
Raul
Novo Hamburgo - RS
Enviado: 08 Jun 2006 09:44
por Leandro2C
Caro amigo Raul,
sem querer abusar, queria pedir à vc e aos amigos do fórum uma ajuda nesta questão que p/ mim ainda está meio confusa. Passo abaixo um exemplo:
* onde crio meus índices - CDX
do while .t.
if userede("brid007","brid007",.t.,10,1)
aviso(10,"Reorganizando Arquivo de Cidades. Aguarde ...")
pack
aviso(14,"Reorganizando o Arquivo por C¢digo")
INDEX ON codcid tag codcid to brii007 EVAL NTXPROGRESS() EVERY LASTREC()/100
aviso(14,"Reorganizando o Arquivo por cidade")
INDEX ON nomcid tag nomcid to brii007 EVAL NTXPROGRESS() EVERY LASTREC()/100
use
exit
endif
* Rotina p/ listar as cidades
* vnomcid = nome da cidade à buscar
sele brid007
set orde to 2
go top
seek vnomcid
msgbox('Aguarde, processando...')
* aqui entraria a criação do índice temporário citado por você - seria um CDX ou NTX?

? inde on nomcid tag nomcid to itemp FOR nomcid=vnomcid WHILE valmensal>15000

? use brid026 inde itemp shared new
Usando assim, está dando errado. Agradeço qualquer ajuda.
Obrigado à todos.
Leandro - São Lourenço - MG
Enviado: 08 Jun 2006 12:32
por alaminojunior
Rapais, faça como postou nosso colega MarceloG, use Set Scope to... e vai pra galera... :|<
Enviado: 09 Jun 2006 15:28
por Raul
Amigo Leandro,
Realmente acredito que não daria certo teu índice por causa da expressão que tu colocastes na cláusula WHILE.
inde on nomcid tag nomcid to itemp FOR nomcid=vnomcid WHILE valmensal>15000
a cláusula WHILE deve conter a mesma expressão lógica que a cláusula FOR, óbvio! Se queremos aqui filtrar todos os nomes FOR (para) e WHILE (enquanto) devem ser iguais, caso contrário, se o primeiro registro que o ponteiro está posicionado, após o SEEK não tiver o valmensal > 15000, a geração não terá nenhum índice.
Um forte abraço,
Raul
Novo Hamburgo - RS
Obs.: Lembre-se contruir um sub-índice local é muitíssimo mais rápido do que ficar navegando em um browse filtrado com set filter.
Enviado: 11 Jun 2006 16:28
por alaminojunior
Só reforçando. Caso esteja usando Clipper 5.3, use o Set Scope to ....
ele cria um filtro logo no indice, tornando a rotina muito mais veloz e segura.
Usar sub-indices até que funciona, porém é mais trabalhoso e muitas vezes gera alguns erros de corrupção, além do problema de atualizações perdidas, pois se no momento de sub-indexar vc se esquecer e não manter os indices atuais abertos, eles ficarão desatualizados, causando posteriormente, um Corruption Detected ..... num eventual Append Blank ou Replace ... with ...
No caso do Clipper 5.2, embora não conheça, existe a Lib Six3.02, com diversas ferramentas.
Pense bem