Filtro setscope, como usar???

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Filtro setscope, como usar???

Mensagem por Marcos »

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.
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem por Dudu_XBase »

...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




Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Filtro setscope, como usar???

Mensagem por Maligno »

Código: Selecionar todos

INDEX ON Str(CODIGO_CLI) + AJUSTE + Ctod(DATA_SAIDA) TAG 6 FOR !DELETED()
Observe o erro: numa chave de índice você não pode misturar tipos, sob pena de abortar o programa. Se tiver que somar diferentes campos, converta-os todos para caracter.
No DBF o CODIGO_CLI é numérico, o AJUSTE é character e o DATA_SAIDA é character com 10 espaços
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.
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) )
Você está usando como argumento da função uma expressão que retornará um valor lógico, a exemplo do que se faz no comando SET FILTER. Não é isso o que sx_SetScope() espera. Ela trabalha apenas com a chave de índice selecionada. Portanto, você deve informar os valores inicial e final do escopo desta chave. Exemplo:

Código: Selecionar todos

sx_SetScope(0,xcod_cli)
sx_SetScope(1,xcod_cli)
dbGoTop()
Com isso você cria uma área da qual constarão apenas os registros que têm esse cliente "xcod_cli".

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
Experimente. Acho que, além de resolver o problema, deve ficar bom.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Agradecimentos...

Mensagem por Marcos »

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
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Olá a todos,

Grande Maligno! Esse é o cara!


Pessoal, não existe uma "belezura" destas, só que para ser usado com índices CDX?

Tenho estas mesmas dificuldades (lentidão com set filter) nos meus relatórios, o problema é que utilizo índices CDX e não SIX.


Janio
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem por Dudu_XBase »

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




Avatar do usuário
Clash
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 11 Set 2004 11:14
Localização: Divinópolis (MG)

Indices temporarios?!

Mensagem por Clash »

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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Indices temporarios?!

Mensagem por Maligno »

Clash escreveu:E o uso de indices temporarios para filtrar em vez do set filter, não funciona na mesma velocidade e mais simples?!
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.
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
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Maligno,

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?

Janio
Avatar do usuário
Clash
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 11 Set 2004 11:14
Localização: Divinópolis (MG)

Scope

Mensagem por Clash »

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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

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?
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.
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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Scope

Mensagem por Maligno »

Clash escreveu:quem sou eu pra criticá-las.
Crítica (constutiva) pra mim é como dinheiro: quanto mais, melhor. Só tenho a ganhar. :)
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
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

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
Avatar do usuário
Clash
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 11 Set 2004 11:14
Localização: Divinópolis (MG)

RDD SIX

Mensagem por Clash »

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
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: Indices temporarios?!

Mensagem por janio »

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
Responder