Filtragem e Sx_SetScope
Moderador: Moderadores
- Anderson J. Freitas
- Usuário Nível 1

- Mensagens: 46
- Registrado em: 19 Fev 2005 10:34
- Localização: Caratinga-MG
Filtragem e Sx_SetScope
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
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
Pitbull
Clipper 5.2e, Exospace, Six2, DBMax
Clipper 5.2e, Exospace, Six2, DBMax
-
Alessandro
- Usuário Nível 3

- Mensagens: 141
- Registrado em: 07 Jul 2004 09:39
- Localização: Santo Antonio da Platina-PR
- Anderson J. Freitas
- Usuário Nível 1

- Mensagens: 46
- Registrado em: 19 Fev 2005 10:34
- Localização: Caratinga-MG
Filtragem e Sx_SetScope
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).
Pitbull
Clipper 5.2e, Exospace, Six2, DBMax
Clipper 5.2e, Exospace, Six2, DBMax
-
Jorge Adourian
- Usuário Nível 2

- Mensagens: 95
- Registrado em: 05 Jul 2004 23:38
- Localização: São Paulo-SP-Brasil
- Contato:
- Anderson J. Freitas
- Usuário Nível 1

- Mensagens: 46
- Registrado em: 19 Fev 2005 10:34
- Localização: Caratinga-MG
Segui a sugestão do Maligno posta no caminho abaixo :
https://pctoledo.org/forum/viewto ... t=setscope
https://pctoledo.org/forum/viewto ... t=setscope
Pitbull
Clipper 5.2e, Exospace, Six2, DBMax
Clipper 5.2e, Exospace, Six2, DBMax
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
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")
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")
________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle
- Anderson J. Freitas
- Usuário Nível 1

- Mensagens: 46
- Registrado em: 19 Fev 2005 10:34
- Localização: Caratinga-MG
-
Jorge Adourian
- Usuário Nível 2

- Mensagens: 95
- Registrado em: 05 Jul 2004 23:38
- Localização: São Paulo-SP-Brasil
- Contato:
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.
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.
Até...
Jorge Adourian
Clipper5.2e, Blinker7.0, SIX2(NSX), ADS7.1, FW2.3c, PrintFile2.1.5 e PDFCreator0.8.0(2)
Jorge Adourian
Clipper5.2e, Blinker7.0, SIX2(NSX), ADS7.1, FW2.3c, PrintFile2.1.5 e PDFCreator0.8.0(2)
- Anderson J. Freitas
- Usuário Nível 1

- Mensagens: 46
- Registrado em: 19 Fev 2005 10:34
- Localização: Caratinga-MG
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 ?
Pitbull
Clipper 5.2e, Exospace, Six2, DBMax
Clipper 5.2e, Exospace, Six2, DBMax
-
Jorge Adourian
- Usuário Nível 2

- Mensagens: 95
- Registrado em: 05 Jul 2004 23:38
- Localização: São Paulo-SP-Brasil
- Contato:
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.
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.
Até...
Jorge Adourian
Clipper5.2e, Blinker7.0, SIX2(NSX), ADS7.1, FW2.3c, PrintFile2.1.5 e PDFCreator0.8.0(2)
Jorge Adourian
Clipper5.2e, Blinker7.0, SIX2(NSX), ADS7.1, FW2.3c, PrintFile2.1.5 e PDFCreator0.8.0(2)
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
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...
-:]
-:]
________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle
