Filtro setscope, como usar???
Moderador: Moderadores
- Marcos
- Usuário Nível 3

- Mensagens: 355
- Registrado em: 20 Set 2003 09:16
- Localização: Cáceres/Mato Grosso
Filtro setscope, como usar???
Olá a todos, estava acompanhando outro tópico com a dúvida sobre o uso de filtros com setscope, só que o tópico acho que caiu no esquecimento.
Como faço para substituir o Set filter pelo sx_setscope no código abaixo, se trata de um relatório que está demorando muito para ser gerado.
@ 9, 7 say "C¢digo Cliente :" get xcod_cli picture "999999"
@10, 7 SAY "Data Inicial :" Get xdataIni Picture "99/99/9999"
@11, 7 SAY "Data Final :" Get xdataFin Picture "99/99/9999"
read
Select ITENVEND
DbSetOrder(1)
Set Filter To CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin)
Goto Top
No indice está assim:
Desta forma dá "erro de argumentos: +"
INDEX ON Str(CODIGO_CLI) + AJUSTE + Ctod(DATA_SAIDA) TAG 6 FOR !DELETED()
Desta forma não dá erro, só que também não filtra nada, nem mesmo o Cliente, aparece todos os registro sem filtro algum.
INDEX ON Str(CODIGO_CLI) + AJUSTE + DATA_SAIDA TAG 6 FOR !DELETED()
No DBF o CODIGO_CLI é numérico, o AJUSTE é character e o DATA_SAIDA é character com 10 espaços
O Dudu demonstrou a forma de substituir o Código onde encontra-se o Set Filter pelo sx_setscope, só que não deu certo, não sei c é devido ao Indice, esta é a forma que o Dudu passou:
sx_setscope(0,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin) )
sx_setscope(1,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin) )
Aguardo alguma ajuda, c for possivel.
Marcos
Da Roça.
Como faço para substituir o Set filter pelo sx_setscope no código abaixo, se trata de um relatório que está demorando muito para ser gerado.
@ 9, 7 say "C¢digo Cliente :" get xcod_cli picture "999999"
@10, 7 SAY "Data Inicial :" Get xdataIni Picture "99/99/9999"
@11, 7 SAY "Data Final :" Get xdataFin Picture "99/99/9999"
read
Select ITENVEND
DbSetOrder(1)
Set Filter To CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin)
Goto Top
No indice está assim:
Desta forma dá "erro de argumentos: +"
INDEX ON Str(CODIGO_CLI) + AJUSTE + Ctod(DATA_SAIDA) TAG 6 FOR !DELETED()
Desta forma não dá erro, só que também não filtra nada, nem mesmo o Cliente, aparece todos os registro sem filtro algum.
INDEX ON Str(CODIGO_CLI) + AJUSTE + DATA_SAIDA TAG 6 FOR !DELETED()
No DBF o CODIGO_CLI é numérico, o AJUSTE é character e o DATA_SAIDA é character com 10 espaços
O Dudu demonstrou a forma de substituir o Código onde encontra-se o Set Filter pelo sx_setscope, só que não deu certo, não sei c é devido ao Indice, esta é a forma que o Dudu passou:
sx_setscope(0,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin) )
sx_setscope(1,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin) )
Aguardo alguma ajuda, c for possivel.
Marcos
Da Roça.
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
...tenta assim...
Código: Selecionar todos
sx_setscope(0,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. dtos (DATA_SAIDA) >= dtos(xDataIni) .AND. dtos(DATA_SAIDA) <= dtos(xdataFin) )
sx_setscope(1,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= dtos(xDataIni) .AND. dtos(DATA_SAIDA) <= Ctod(xdataFin) )
________________________________________________________________________________________________________
(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
Re: Filtro setscope, como usar???
Código: Selecionar todos
INDEX ON Str(CODIGO_CLI) + AJUSTE + Ctod(DATA_SAIDA) TAG 6 FOR !DELETED()Uma sugestão: acostume-se a armazenar datas como DATE. Usar caracter realmente não é uma boa idéia. Além do que, se armazenada como tipo DATE, você consumirá 8 bytes e não 10 como disse. Imagino que você também armazene a máscara da data. Isso não é necessário. Você está gastando espaço à toa. É só uma sugestão.No DBF o CODIGO_CLI é numérico, o AJUSTE é character e o DATA_SAIDA é character com 10 espaços
Como faço para substituir o Set filter pelo sx_setscope
Código: Selecionar todos
sx_setscope(0,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin) )
sx_setscope(1,CODIGO_CLI == xcod_cli .and. AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin) )Código: Selecionar todos
sx_SetScope(0,xcod_cli)
sx_SetScope(1,xcod_cli)
dbGoTop()Uma dica que pode ajudá-lo é usar o filtro tradicional, além de sx_SetScope(). Você monta o escopo, que criará a área do arquivo limitada a apenas esse cliente. Depois monta um filtro com os parâmetros que limitarão a busca mais ainda, mais ou menos como você fazia antes. Uma vez que não devem haver tantos registros para o mesmo cliente, imagino que a velocidade de acesso aos dados será muito maior. Talvez instantânea. O código seria mais ou menos isso:
Código: Selecionar todos
Select ITENVEND
DbSetOrder(1)
sx_SetScope(0,xcod_cli)
sx_SetScope(1,xcod_cli)
Set Filter To AJUSTE == "-" .and. Ctod (DATA_SAIDA) >= Ctod(xDataIni) .AND. Ctod(DATA_SAIDA) <= Ctod(xdataFin)
Go Top[]'s
Maligno
http://www.buzinello.com/prg
- Marcos
- Usuário Nível 3

- Mensagens: 355
- Registrado em: 20 Set 2003 09:16
- Localização: Cáceres/Mato Grosso
Agradecimentos...
Quero na oportunidade agradecer ao Maligno e ao Dudu pela ajuda, o Código que o Maligno sugeriu deu certo, fiquei impressionado com a rapidez que ficou minha consulta após ter colocado o sx_setscope() antes do Set Filter, esta consulta era muito demorada, talvez pelo número de clientes cadastrado e com o Set Filter não dava conta do recado, mas agora ficou rápida, como vc disse ficou "...instantânea".
Obrigado novamente.
Abraços,
Marcos
Obrigado novamente.
Abraços,
Marcos
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
Maligno fiz uma alteração aki com o exemplo q vc postou...eita....ficow da hora ....
________________________________________________________________________________________________________
(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
Indices temporarios?!
Olá Galera!
E o uso de indices temporarios para filtrar em vez do set filter, não funciona na mesma velocidade e mais simples?!
[ ]s
Clash
E o uso de indices temporarios para filtrar em vez do set filter, não funciona na mesma velocidade e mais simples?!
[ ]s
Clash
Re: Indices temporarios?!
O uso de índice temporário tem suas vantagens. Mas a eficiência desse método vai depender da utilização, do tamanho da base, da complexidade das chaves, etc. Cada método tem vantagens e desvantagens. É o caso do SET FILTER, que tem má fama. Por isso é comum pensar que sx_SetScope() é mais eficiente. É e não é. Sua principal desvantagem é não ter a flexibilidade do SET FILTER. E a desvantagem do SET FILTER é sua lentidão em bases mais volumosas. O que foi feito no caso do colega é uma simples junção do melhor dos dois mundos. SET FILTER fica excelente em bases de dados pequenas. A solução foi diminuir o tamanho da base com o uso de um limitador de escopo. Ficou bom, pelo que o colega disse.Clash escreveu:E o uso de indices temporarios para filtrar em vez do set filter, não funciona na mesma velocidade e mais simples?!
Um índice temporário, no caso dele, pelo que ele comentou, não faria o serviço melhor que a dupla SET FILTER/sx_SetScope(). Mas tem sua aplicação em alguns outros casos.
De qualquer forma, fica a dica para o colega. Se ele quiser testar.
[]'s
Maligno
http://www.buzinello.com/prg
Scope
Olá colegas!
Maligno, suas intenções foram das melhores, quem sou eu pra criticá-las. Eu queria era exatamente o que vc fez, uma comparação com os dois metódos. Através disto, hoje mesmo já vou testar o Scope em algumas rotinas. Valeu!
[ ]s
Clash
Maligno, suas intenções foram das melhores, quem sou eu pra criticá-las. Eu queria era exatamente o que vc fez, uma comparação com os dois metódos. Através disto, hoje mesmo já vou testar o Scope em algumas rotinas. Valeu!
[ ]s
Clash
Até onde eu sei, essa função é parte da API da LIB SIX. Portanto, está disponível sob este RDD. Aliás, é muito fácil começar a usá-lo.janio escreveu:Tem alguma função semelhante ao sx_setscope para usar nos índices CDX? Ou eu posso usar esta função sem usar os índices SIX?
Agora, se for o CDX do Clipper, não sei dizer ao certo. Mas é provável que não tenha.
[]'s
Maligno
http://www.buzinello.com/prg
Re: Scope
Crítica (constutiva) pra mim é como dinheiro: quanto mais, melhor. Só tenho a ganhar.Clash escreveu:quem sou eu pra criticá-las.
De qualquer forma, você não me criticou. Só fez uma observação e observou que existe um outro método além dos que foram citados. Foi uma boa lembrança.
Quanto ao índice temporário, faça o teste. Se depois quiser compartilhar o resultado e suas impressões conosco, será ótimo.
[]'s
Maligno
http://www.buzinello.com/prg
Olá a todos,
Alguém pode me mandar o RDD SIX com algumas dicas de como passar a usá-lo?
E-mail: janioaguiar@yahoo.com.br
Obrigadoo!
Janio
Alguém pode me mandar o RDD SIX com algumas dicas de como passar a usá-lo?
E-mail: janioaguiar@yahoo.com.br
Obrigadoo!
Janio
RDD SIX
Janio, voce pode baixar o RDD SIX pelo site www.geracaoclipper.org e quanto ao seu uso, é praticamente identico ao do CDX eu estava usando em um sistema o SIX, agora só pra testar estou usando o CDX, realmente ambos são maravilhosos. No site do Toledo tem explicações de como uar o CDX e para o NSX(Six) é só trocar os nomes.
Maligno, valeu pela consideração, eu já uso indices temporários que substituiram mesmo arquivos temporários, que por sua vez vieram substituir meus SET FILTER'S. ...É a evolução da programação... hehehe!
Mas agora vou testar o SET SCOPE. E veremos!
[ ]s a todos
Clash
Maligno, valeu pela consideração, eu já uso indices temporários que substituiram mesmo arquivos temporários, que por sua vez vieram substituir meus SET FILTER'S. ...É a evolução da programação... hehehe!
Mas agora vou testar o SET SCOPE. E veremos!
[ ]s a todos
Clash
Re: Indices temporarios?!
Clash escreveu:
E o uso de indices temporarios para filtrar em vez do set filter, não funciona na mesma velocidade e mais simples?!
[ ]s
Clash
Clash
Dá pra vc postar aki um exemplo de como gerar índices temporários. Já vi muita gente falando sobre este tipo de substituição ao set filter, mas ainda não vi nenhum exemplo.
Valeu?
Janio

