Página 1 de 2
Problemas com Filtro
Enviado: 07 Out 2009 12:36
por Edenilson Santos
Tenho uma base com 1/121790 registros armazenados e de vez em quando preciso filtrar algumas informações dessa base então o problema:
Utilizo Clipper 5.2e com Blinker 7 e indices CDX .
Este sistema trabalha hoje em +- 10 computadores em ambiente de rede local e o procedimento usando set filter fica extremamente lento e difícil de trabalhar gostaria de sabe se vc tem alguma solução para o meu caso para filtrar de outra forma tendo em vista q já andei dando uma olhada pela internet e vi um tal de sx_setscope ai olhei olhei e me parece q ele só funciona com indices SIX então pergunto é verdade tem alguma coisa q eu possa usar pra cdx ou se der pra usar o sx_setscope pra limitar o tamanho da minha base e depois usar set filter como eu faço isso de forma correta pra agilizar o processamento.
Tenho urgência na resolução deste problema se puder me auxiliar agradeço.
desde já agradeço
Edenilson Santos
E-mail/Msn:
es.sistemas@terra.com.br
Re: Problemas com Filtro
Enviado: 07 Out 2009 15:39
por alxsts
Olá!
Seja bem-vindo ao forum!
Quando você usa este filtro (em um TBrowse, relatório)? Nunca utilizei a Six. Nâo sei como seria alterar o teu sistema para passar a utilizar. Certamente os colegas poderão te aconselhar melhor.
Quando trabalhava com Clipper, utilizava as rotinas do Stephen Straley. Elas são muito úteis em TBrowse pois você consegue definir os code blocks de goTop e goBottom do TBrowse como uma faixa do índice do teu arquivo de dados. Fica rápido.
Vamos aguardar. Se optar por esta solução, ainda tenho os fontes.
Re: Problemas com Filtro
Enviado: 07 Out 2009 20:04
por gvc
Como vc não especificou qual é a versão do clipper, vamos por partes.
Se vc esta usando o 5.3x, vc pode usar ordscope para montar o filtro por indice.
Se esta usando versão anterior, vc pode montar indices temporários para relatórios e pesquisas.
Não é uma boa prática, mas funciona.
Se é um critério fixo, vc pode mondar um indice usando FOR para fazer a filtragem já no indice.
index on <cheve> to <arquivo> for <condição>
Código: Selecionar todos
Isto é do xHarbour, mas deve funcionar no 5.3x
// The example demonstrates evaluation of scope code blocks while a
// database is browsed. Although the code blocks return constant values,
// they could return the result of a function call as well.
#include "Ord.ch"
PROCEDURE Main
USE Customer
INDEX ON Upper(LastName+Firstname) TO Cust01
OrdScope( TOPSCOPE , {|| Tone(1000), "E" } )
OrdScope( BOTTOMSCOPE, {|| Tone(500), "K" } )
Browse()
RETURN
Re: Problemas com Filtro
Enviado: 07 Out 2009 22:48
por alaminojunior
gvc escreveu:Como vc não especificou qual é a versão do clipper
O colega usa a versão 5.2e com Blinker 7 e CDX.
Vejo duas possibilidades:
1º compilar com 5.3b que é a ultima versão, para poder usar o "Set Scope to" (fica um avião)
2º compilar com 5.2e mesmo, e utilizar a lib Six para usar as aclamadas funções desta RDD.
Como não conheço a Six, sugiro a 1ª opção, que é praticamente indolor. No caso precisaria apenas trocar o comando Set Filter por Set Scope, claro que estando a base indexada pela chave que se quer pesquisar e/ou
escopar
Re: Problemas com Filtro
Enviado: 08 Out 2009 11:10
por Edenilson Santos
Olá amigo, como eu faço pra compilar em 5.3 é só mudar meu script , tentei mas deu vários erros de libs etc e tal... pode me dar uma ajuda
Re: Problemas com Filtro
Enviado: 08 Out 2009 11:27
por alaminojunior
Edenilson Santos escreveu:tentei mas deu vários erros de libs etc e tal
É, essa é a parte chata da coisa.
Mas por favor, poste o seu script atual para que possamos melhor auxiliar.
Re: Problemas com Filtro
Enviado: 08 Out 2009 11:35
por gvc
[alaminojunior]
Desculpe-me. Eu li mas não vi.
- E não é que o cara tinha informado mesmo!!!
[Edenilson Santos]
1 - Vc tem que declarar a função main no seu sistema.
2 - Veja se esta faltando alguma lib. Informe, por favor.
Crie o "Ola, mundo" e compile para ver se esta funcionando a compilação e as lib´s.
Aproveitando para vender o peixe. Vc já pensou em usar o (x)Harbour? Ele tem tudo o que o 5.3x tem e mais algumas coisas. O BCC e o (x)Harbour são gratuitos. Compilação 32 bits. Classe win32prn (Impressão gráfica). Ordscope. Talvez o investimento valha para vc. Pense nisso.
Re: Problemas com Filtro
Enviado: 08 Out 2009 14:41
por sygecom
Concordo com o colega GVC, as mudanças para harbour são mínimas mesmo comparado a quantidade de ganho de recursos e melhorias, vale a pena tentar.
Re: Problemas com Filtro
Enviado: 08 Out 2009 14:53
por Augusto
Edenilson,
É claro que existem "n" soluções para o seu caso mas... vou dizer prá vc como eu solucionava essa questão quando eu usava CLIPPER 5.3 + Blinker7 e mais... usava indice NTX.
Eu criava um DBF temporário e jogava prá dentro dele somente os registros que obedecessem o filtro (já indexados pela chave desejada) e na hora de usar o TBrowse ou qqr outra forma de "display" eu lia esse "temp"...
As funções CREATE e APPEND FROM são muito rápidas... mais rápidas que qqr SET FILTER
Re: Problemas com Filtro
Enviado: 08 Out 2009 15:13
por alaminojunior
Augusto escreveu:Eu criava um DBF temporário e jogava prá dentro dele somente os registros que obedecessem o filtro (já indexados pela chave desejada) e na hora de usar o TBrowse ou qqr outra forma de "display" eu lia esse "temp"...
As funções CREATE e APPEND FROM são muito rápidas... mais rápidas que qqr SET FILTER
Está certíssimo, porém o
Set Scope to da RDD CDX ou SIX é mais flexível que qualquer outra artimanha, pois imaginemos que esta tabela que o colega queira exibir, precise ser compartilhada com outros terminais !?
À propósito, quando eu usava Clipper 5.2 com NTX, eu recorria ao uso de índices condicionais (FOR), que mantinha as atualizações nas tabelas.
Re: Problemas com Filtro
Enviado: 08 Out 2009 21:47
por gvc
[Augusto]
O problema de usar arquivo temporário é a atualização on-line dos arquivos originais.
Se isso não for problema então o indice com filtro é mais prático, usando 0 5.2x.
Com o ordscope, os dados são mantidos on-line para o usuário, mas só existe no 5.3x.
Ah! Eu tb uso dbf temporário para trabalhar com arquivos muito grandes, mas só no 5.2x.
[Edenilson Santos]
Aguardamos o colega responder se conseguiu resolver o problema.
Acho que ainda vou/vamos conseguir "vender" a idéia do [x]Harbour.
Trabalho com array maiores. Novos comando e funções. Sistemas maiores. Continue pensando, colega.
Re: Problemas com Filtro
Enviado: 08 Out 2009 23:15
por billy1943
Realmente, fica problemático usar filtro em um arquivo muito grande.
Vou apresentar uma solução "bolada" por um amigo meu, cujo trabalho envolve arquivos com milhões de registros.
1. É gerado um arquivo ordenado por um único campo, por exemplo (CNPJ/CPF), sem nenhum índice;
2. Obtem-se o total de registros do arquivo com LASTREC().
3. Aí é feito uma pesquisa para se saber se o registro desejado é maior que o registro que está no meio ( LASTREC()/2 )
4. Se ele estiver a procura vai ser na segunda metade e em caso contrário na primeira metade
5. Trabalha-se agora com essa metade, e se repete o processo, sempre procurando saber se o registro desejado está na primeira ou segunda metade.
6. Segundo o meu amigo, a procura é super rápida, bastando não se perder com os ponteiros que indicarão em que parte do arquivo a procura está focada.
7. A quantidade de iterações e o tempo gasto é proporcional ao número de registros do arquivo.
Fica aqui a sugestão !!!
Re: Problemas com Filtro
Enviado: 09 Out 2009 00:41
por alxsts
Olá!
O algoritmo citado existe há décadas. Particularmente o conheci mexendo com COBOL, no final dos anos 70. Nesta linguagem, é uma das técnicas de table handling (termo usado em COBOL para definir o que em Clipper chamamos de manipulação de arrays) e também é conhecido popularmente como pesquisa binária.
É fácil de construir e funciona como o colega descreveu. O único pré-requisito é que o array (no caso a lista de Recno() ) esteja ordenada de forma ascendente (para pesquisa ascendente) ou descendente para pesquisa descendente.
No caso de arrays, como o trabalho é feito em memória, o processo é muito rápido. Em Clipper temos que considerar o limite de 4096 elementos...
No exemplo citado pelo colega, a pesquisa é feita em disco. Aqui, temos que considerar o impacto de I/O...
Re: Problemas com Filtro
Enviado: 27 Out 2009 15:14
por gvc
[Edenilson Santos]
Agora eu entendi sua MP.
Aproveitando para vender o peixe. Vc já pensou em usar o [x]Harbour? Ele tem tudo o que o 5.3x tem e mais algumas coisas. O BCC e o [x]Harbour são gratuitos. Compilação 32 bits. Classe win32prn (Impressão gráfica). Ordscope. Talvez o investimento valha para vc. Pense nisso.
O curto, com esta acima, é o tempo para aprender a usar as novas ferramentas.
No inicio do tópico sobre o [x]Harbour tem como baixar e configurar a sua máquina para trabalhar com ele.
Alem disso, temos muita gente aqui que gosta de ajudar os companheiros. Eu inclusive.
Esse é o "peixe" que eu estou tentando te "vender", a idéia de mudar para algo que oferece mais opções de trabalho. Não tem custo nenhum da minha parte.
Se bem que tomar uma cervejinha com os amigos não tem preço. Mas cada um paga a sua e a amizade é a mesma. (eh. eh. eh.)
(Não vamos desviar o post, pois o Maligno esta sempre de olho) (eh. eh. eh. de novo!)
Re: Problemas com Filtro
Enviado: 28 Nov 2009 16:56
por leandromiler
Como você esta usando indices CDX com CLIPPER 5.2, entre no site
www.vagucs.com.br e baixe a bibliotex da SIX, compile seu executável com a SIXLIB.CLD, e tire a dbfcdx.lib. E na abertura dos arquivos você abrirá os arquivos VIA 'SIXCDX', e tambem mude o nome do RDD para SIXCDX.
Feito isto, você poderá criar varios índices na abertura do sistema baseado nos filtros que você utiliza. fica extremamente rapido. eu usava o clipper 5.3b com CDX. mas voltei para 5.2e somente por causa da SIX. E não me arrependo.
Outra coisa é que nao vai dar pau quando o arquivo é muito grande, pois no clipper 5.3b com CDX, as vezes dava problema qdo um arquivo dbf era muito grande em determinados processos, do qual eu tinha que abaixar os registros das tabelas criando um sistema com dados antigos, só aí funcionava. Agora com SIX, meus problemas acabaram.
abraços.