SET FILTER NO BLINKER ***URGENTE****
Moderador: Moderadores
-
managercorp
- Usuário Nível 3

- Mensagens: 138
- Registrado em: 16 Nov 2004 11:03
- Localização: recife
- Contato:
SET FILTER NO BLINKER ***URGENTE****
AS MESMAS LINHAS ABAIXO FUNCIONAM PERFEITO QUANDO COMPILO COM EXOSPACE, MAS QUANDO COMPILO COM BLINKER, A PESQUISA TRAVA EM UM DETERMINADO REGISTRO E NAO SAI NEM COM ALT+C
*******************
#Include "INKEY.CH"
#INCLUDE "SET.CH"
ANNOUNCE RDDSYS
REQUEST DBFCDX
RDDSETDEFAUT("DBFCDX")
CLEAR
SELE 9
use reserva SHARED
set index to reser1
SET FILTER TO (STATUS='1' .OR. STATUS='6')
SET ORDER TO 2
GO TOP
DO WHILE .NOT. EOF()
@ 23,00 SAY RECNO()
SKIP
ENDDO
***************************
AGORA SE EU TIRAR A LINHA DO SET FILTER, AI ELA PASSA OK
SERA QUE EXISTE IMCOMPATIBILIDADE DO BLINKER COM O SET FILTER
*******************
#Include "INKEY.CH"
#INCLUDE "SET.CH"
ANNOUNCE RDDSYS
REQUEST DBFCDX
RDDSETDEFAUT("DBFCDX")
CLEAR
SELE 9
use reserva SHARED
set index to reser1
SET FILTER TO (STATUS='1' .OR. STATUS='6')
SET ORDER TO 2
GO TOP
DO WHILE .NOT. EOF()
@ 23,00 SAY RECNO()
SKIP
ENDDO
***************************
AGORA SE EU TIRAR A LINHA DO SET FILTER, AI ELA PASSA OK
SERA QUE EXISTE IMCOMPATIBILIDADE DO BLINKER COM O SET FILTER
A máquina trava ou fica tão lento que *parece* que trava? Por acaso não é aquele mesmo banco de dados com mais de 1 milhão de registros? Se for, não espere outra coisa do SET FILTER se não a lentidão. Esse tipo de filtro pode perfeitamente se tornar inviável em um volume de dados muito grande, já que ele faz o ponteiro do arquivo pular de registro a registro, do começo ao fim. Uma solução pra essa lentidão é limitar o escopo do trabalho do SET FILTER usando SET SCOPE.
Em tempo: não existe qualquer tipo de incompatibilidade do BLinker com o comando SET FILTER. Nem poderia.
PS: Uma dica: quando em comunicação via texto (chat, eMail, fórum, etc) só se utiliza letra maiúsculas quando se quer GRITAR com alguém.
Em tempo: não existe qualquer tipo de incompatibilidade do BLinker com o comando SET FILTER. Nem poderia.
PS: Uma dica: quando em comunicação via texto (chat, eMail, fórum, etc) só se utiliza letra maiúsculas quando se quer GRITAR com alguém.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
managercorp
- Usuário Nível 3

- Mensagens: 138
- Registrado em: 16 Nov 2004 11:03
- Localização: recife
- Contato:
Não, a demora começa no ponto em que o ponteiro se mexe. O comando SET FILTER apenas e tão somente configura o filtro. Ou seja, a coisa começa mesmo no GO TOP. Depois, na malha, você vai pegando registro a registro com o SKIP, conforme esse filtro. O problema pode ficar feio mesmo quando o registro atual é o último que satisfaz o filtro. Aí, supondo que no meio de 1 milhão de registros, o último encontrado, nas condições do filtro, é o de número 100.000, internamente o próximo SKIP vai provocar a leitura de 900.000 registros. Isso é obrigatório. Ele forçosamente tem de ir até o final do arquivo. Aí se explica a lentidão.
O que eu acabei de explicar é mandatório. Isso vai acontecer, não importa com qual linker você trabalhe. É a característica básica do comando SET FILTER. Ele sempre vai navegar por todo o arquivo, nas condições em que você mostrou que o utiliza.
Agora, porque isso não acontece quando se usa o ExoSpace, pra mim é um total mistério. Não sei o que dizer. :[
O que eu acabei de explicar é mandatório. Isso vai acontecer, não importa com qual linker você trabalhe. É a característica básica do comando SET FILTER. Ele sempre vai navegar por todo o arquivo, nas condições em que você mostrou que o utiliza.
Agora, porque isso não acontece quando se usa o ExoSpace, pra mim é um total mistério. Não sei o que dizer. :[
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
managercorp
- Usuário Nível 3

- Mensagens: 138
- Registrado em: 16 Nov 2004 11:03
- Localização: recife
- Contato:
Pois não acabei de dizer que pra mim é um mistério? 
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- Augusto
- Usuário Nível 3

- Mensagens: 473
- Registrado em: 26 Ago 2003 17:50
- Localização: Maricá/RJ
- Contato:
Parceiro "managercorp"... Experimente alterar a rotina e veja se fica mais rápido:
Uma outra opção, já que o arquivo tem mesmo 1 mulhão de registro, é vc criar um arquivo temporário dando um APPEND somente dos registros que atendam a "condição" e depois listar todo o arquivo temporário...
Quanto ao "suposto" travamento não acontecer com o EXOSPACE eu acho muito difícil... Talvez ele nem esteja fazendo o SET FILTER, caso contrário... como diz o Maligno... "MISTÉRIO" !!!
Código: Selecionar todos
SELE 9
use reserva SHARED
set index to reser1
SET ORDER TO 2
DO WHILE .NOT. EOF()
IF (STATUS='1' .OR. STATUS='6')
@ 23,00 SAY RECNO()
ENDIF
SKIP
ENDDOQuanto ao "suposto" travamento não acontecer com o EXOSPACE eu acho muito difícil... Talvez ele nem esteja fazendo o SET FILTER, caso contrário... como diz o Maligno... "MISTÉRIO" !!!
:xau Fui...
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Teoricamente seu código teria de rodar mais lento ainda, já que o SET FILTER faz exatamente isso com comandos internos. Claro que não custa tentar. 
Mas se fosse o caso de mudar algo radicalmente, eu sugeriria a criação de um índice temporário. Ou então, melhor ainda, a criação de um índice a mais (tag) com uma condição tal que permita a diminuição do volume de dados pesquisados (SET SCOPE), dentro do qual o SET FILTER certamente ficará rápido, se não instantâneio. Essa é, aliás, a forma como eu faço.
Mas se fosse o caso de mudar algo radicalmente, eu sugeriria a criação de um índice temporário. Ou então, melhor ainda, a criação de um índice a mais (tag) com uma condição tal que permita a diminuição do volume de dados pesquisados (SET SCOPE), dentro do qual o SET FILTER certamente ficará rápido, se não instantâneio. Essa é, aliás, a forma como eu faço.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- Augusto
- Usuário Nível 3

- Mensagens: 473
- Registrado em: 26 Ago 2003 17:50
- Localização: Maricá/RJ
- Contato:
Prezado Maligno,
Desculpe discordar, mais por experiência própria, ousei em dar a opção do IF pois, comigo funcionou ou seja, ficou mais rápido que o SET FILTER apesar de, posteriormente, ter optado pela crição do arquivo temporádio e mantenho esse procedimento quando necessário...
Na época, assim como vc, entendia que não havia diferença entre o IF e o SET FILTER mas fiz o teste e comprovei...
Desculpe discordar, mais por experiência própria, ousei em dar a opção do IF pois, comigo funcionou ou seja, ficou mais rápido que o SET FILTER apesar de, posteriormente, ter optado pela crição do arquivo temporádio e mantenho esse procedimento quando necessário...
Na época, assim como vc, entendia que não havia diferença entre o IF e o SET FILTER mas fiz o teste e comprovei...
:xau Fui...
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
goulart@provsul.com.br
Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Justamente pela falta de teste que usei a expressão "teoricamente seu código teria de rodar mais lento". Mas se você já fez o teste, fica então uma alternativa a mais pro colega. Se bem que, se o arquivo tiver mesmo mais de 1 milhão de registros, o ganho não deve ser tão grande. Fora isso, tem a questão do Exospace. Um total mistério. 
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
managercorp
- Usuário Nível 3

- Mensagens: 138
- Registrado em: 16 Nov 2004 11:03
- Localização: recife
- Contato:
Pois e pessoal aqui abaixo vai exatamente o que estou usando e no exospace e instananeo e no blinker fica inviavel, quanto ao arquivo ele tem mesmo 1 milhao de registro.
aqui vai minha rotina, se alguem puder fazer isso diferente, eu agradeço muito.
********
SELE 9
SET FILTER TO (STATUS='1' .OR. STATUS='6' .OR. STATUS='5' .OR. STATUS='8') .AND. (WDATA >=DATACHE .AND. WDATA <DATAPAR)
SET ORDER TO 2
GO TOP
DO WHILE .NOT. EOF()
IF WDATA >= DATACHE .AND. WDATA < DATAPAR .AND. EMPRESA=XEMP
if status='1'
* aqui entra meu resultado *
endif
if status='6'
* aqui entra outro resultado *
endif
if status='5'
* aqui entra outro resultado *
endif
if status='8'
* aqui entra outro resultado *
endif
skip
enddo
********************************
NOTEM QUE PRECISO APENAS DOS STATUS 1,6,5 E 8 E DENTRO DA DATA EM QUESTAO
- Existe no arquivo varios outros status inclusive o status 3 que e a maioria e nao preciso passar por ele, por isso sempre usei o set filter
Agora que preciso migrar pro blinker, o set filter fica inoperante,
To PERDIDO, ao sei mas o que fazer.
se tivesse um jeito de indexar por condicao seria otimo.
aqui vai minha rotina, se alguem puder fazer isso diferente, eu agradeço muito.
********
SELE 9
SET FILTER TO (STATUS='1' .OR. STATUS='6' .OR. STATUS='5' .OR. STATUS='8') .AND. (WDATA >=DATACHE .AND. WDATA <DATAPAR)
SET ORDER TO 2
GO TOP
DO WHILE .NOT. EOF()
IF WDATA >= DATACHE .AND. WDATA < DATAPAR .AND. EMPRESA=XEMP
if status='1'
* aqui entra meu resultado *
endif
if status='6'
* aqui entra outro resultado *
endif
if status='5'
* aqui entra outro resultado *
endif
if status='8'
* aqui entra outro resultado *
endif
skip
enddo
********************************
NOTEM QUE PRECISO APENAS DOS STATUS 1,6,5 E 8 E DENTRO DA DATA EM QUESTAO
- Existe no arquivo varios outros status inclusive o status 3 que e a maioria e nao preciso passar por ele, por isso sempre usei o set filter
Agora que preciso migrar pro blinker, o set filter fica inoperante,
To PERDIDO, ao sei mas o que fazer.
se tivesse um jeito de indexar por condicao seria otimo.
-
andrethomazi
- Usuário Nível 1

- Mensagens: 17
- Registrado em: 19 Jul 2005 08:50
o set order to 2 dentro de um set filter não seria meio estranho? suponhamos que o set filter tenha "marcado" 50 000 registros da condicao especificada, quando vc mudaria a ordem de pesquisa do set order o que aconteceria com os filtrados? teriam que ser novamente filtrados ou marcados, pro ponteiro saber quais seriam as posicoes dos registros marcados. Experimente por o Set Order antes de filtrar os dados.....
Em meus programas (principalmente em rede), substitui todos os SET FILTERs por:
do while condição
se nao atender a condicao
skip
loop
fim do se
lista, processa, etc
skip
loop
enddo
Em meus programas (principalmente em rede), substitui todos os SET FILTERs por:
do while condição
se nao atender a condicao
skip
loop
fim do se
lista, processa, etc
skip
loop
enddo
O comando SET FILTER não marca registro algum. Através dele só se configura a condição de filtragem. Você só saberá quais registros satisfarão a condição do filtro depois de percorrer TODO o banco de dados. Portanto, o SET ORDER não fará diferença alguma, a não ser na ordem em que os registros serão acessados.suponhamos que o set filter tenha "marcado" 50 000 registros da condicao especificada
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
