Página 1 de 1

Filtragem e Sx_SetScope

Enviado: 30 Mar 2005 16:12
por Anderson J. Freitas
Olá!

Tenho dois bancos de dados, um com a capa da nota fiscal(numero,fornecedor,valor) e outro com os itens da nota (codigo,produto,quantidade...). No sistema é apresentado uma função estilo o browse, onde pode-se navegar pelas notas registradas. Ao pressionar enter sobre uma determinada nota, abre-se um segundo browse com os itens da nota selecionada. Usei o sx_setscope e set filter to para filtrar os dados, funcionou porém ficou lento porque o bando de dados dos itens tem 70.000 registros. Pergunto :

1 - Existe alguma outra função que trabalhe com sx_setscope e que seja semelhante ao set filter de forma que filtragem de dados fique mais rápida ?
2 - Se eu usar o sx_setscope antes de um laço de repetição e depois usá-lo dentro do laço, tenho que usar sx_clrscope antes da segunda chamada ?

Grato

select corpo
sx_settag('A')
sx_setscope(0,entrada->loja+entrada->numero+entrada->fornece)
sx_setscope(1,entrada->loja+entrada->numero+entrada->fornece)
set filter to entrada->loja+entrada->numero+entrada->fornece=loja+nota+clifor
sx_settag('K')
go top
do while !saip
select corpo
sx_settag('A')
sx_setscope(0,entrada->loja+entrada->numero+entrada->fornece)
sx_setscope(1,entrada->loja+entrada->numero+entrada->fornece)
set filter to entrada->loja+entrada->numero+entrada->fornece=loja+nota+clifor
sx_settag('K')
go top

Enviado: 30 Mar 2005 16:16
por Alessandro
Anderson,

Aconselho vc não utilizar o set filter, experimente carregar uam array com os itens, ou um arquivo temporário.
Com array fica bem mais simples e vai ficar rápido.

Beleza...

Filtragem e Sx_SetScope

Enviado: 30 Mar 2005 17:20
por Anderson J. Freitas
Agradeço a sugestão mas um array ou banco temporário seria inviável, pois o banco do corpo é aberto o dia inteiro para inclusão de dados. E certa de 4000 inclusões por dia. Eu citei 70.000 registros, só que este é apenas de uma loja (4 ao todo).

Enviado: 30 Mar 2005 17:21
por Jorge Adourian
Anderson, você pode explicar para que usou SX_SETSCOPE() junto com o SET FILTER ??????????????????????????????????????

Enviado: 30 Mar 2005 18:08
por Trazom
perguntou o que não tive coragem

é, porque ?

Enviado: 31 Mar 2005 08:14
por Anderson J. Freitas
Segui a sugestão do Maligno posta no caminho abaixo :

https://pctoledo.org/forum/viewto ... t=setscope

Enviado: 31 Mar 2005 09:51
por Dudu_XBase
Anderson Bom Dia !!
Antes do Sx_SetScope()
Adicione um dbseek ou seek para localizar a expressão.

dbssek(entrada->loja+entrada->numero+entrada->fornece)

Se for criar outro filtro vc tem q executar o sx_clrscope()
Sx_ClrScope(0)
Sx_ClrScope(1)

Uma dúvida pq vc depois ao criar um filtro com uma ordem vc muda ?
SX_settag("A")
// Vc Filtra...
//depois vc muda a ordem
SX_SetTag("K")

Enviado: 31 Mar 2005 10:14
por Anderson J. Freitas
É, agora que caiu a ficha, não precisa mudar a ordem pois o início dos índices (que entram no filtro) são iguais "loja+numero+fornece"

Enviado: 31 Mar 2005 10:54
por Jorge Adourian
Dudu:

Desculpe mas preciso corrigir uma informação sua.

Não precisa dar SEEK antes do SCOPE pois de nada adianta, o que você deve fazer é dar um GOTOP após o SCOPE para ativar o filtro.

Poderia usar o SEEK para decidir se filtra por SCOPE ou não. Aí tem sentido usar o SEEK.

Para trocar um filtro de SCOPE por outro não precisa limpar, apenas setar o novo e GOTOP para ativar o filtro.


Anderson:

IMPORTANTE: o SCOPE vale apenas para a ORDER atual se você muda de ORDER o SCOPE não vale mais, ou seja, tem que setar o SCOPE para cada ORDER que precisar filtrar.

Se você ler bem a dica do Maligno, ele diz que a dupla SX_SETSCOPE() e SET FILTER é muito agil no que eu concordo totalmente. Porém usar o FILTER para uma filtragem complementar ao SCOPE e não com a mesma condição como você fez. No seu caso não precisa do FILTER e sim apenas do SCOPE.

Outra coisa, usar no TAG uma letra como você fez, é perder legibilidade, use mnemônicos que indiquem a chave de indexação.

Enviado: 31 Mar 2005 11:39
por Anderson J. Freitas
:))

Muito obrigado a todos, agora a filtragem funcionou q uma beleza. Algumas linhas a mais e o negócio parecia uma carroça, "programação é ingrata mesmo, mas vale a pena", principalmente quando tem gente disposta a ajudar.

Mais duas dúvidas:

1 - O Jorge citou q não tenho q limpar a filtragem somente setá-la em caso de uma nova filtragem, como assim, digitar o sx_setscope novamente ou é outro comando/função ?
2 - Quando faço uma pesquisa no banco, tenho que mudar a ordem porque ele busca por loja+codigo e exibe na tela loja+recno(), tenho que realizar o filtro novamente ?

Enviado: 31 Mar 2005 16:47
por Jorge Adourian
Anderson, para mudar de um filtro para outro é só usar outro SX_SETSCOPE(), e no final, para deixar sem filtro, aí sim use o SX_CLRSCOPE().

Se precisar mudar de order, tudo bem quando voltar a order original o filtro estará ativado como você deixou ele só é desativado por SX_CLRSCOPE() ou eventualmente ao reabrir o arquivo.

Quanto ao TAG o que eu disse antes não é obrigatório, apenas seria o ideal.

Enviado: 31 Mar 2005 23:22
por Dudu_XBase
Vlw Jorge Pela Informação eu uso assim desde o Antigo Fórum qdo migrei para o SIXNSX o Junior Prado na época me deu diversos toque q até hj eu uso. Como até hj nunca tive problemas....nunca desconfiei...
-:]