Indice temporario com INDEX ON com dados on-line no DBF?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Indice temporario com INDEX ON com dados on-line no DBF?

Mensagem por ANDRIL »

Ola pessoal,

Vendo os topicos anteriores sobre filtragem resolvi mudar meus filtros para indice temporario. Apos usar o

INDEX ON nomedocampo TO nomedoarquivo FOR condicaox

a filtragem ocorre beleza. So que nao fica on-line com os dados do DBF, pois se eu cadastrar um novo cliente em outra maquina que atenda a CONDICAOX na outra maquina que tem o filtro, ele nao aparece.

No SET FILTER ele entraria tambem no browse pois satisfaz a condicao do filtro. Talvez esse problema seja um empecilho para alterarmos de SET FILTER para o INDEX ON.

Quando o sistema tem um DBF e neste sao abertos 2 indices por exemplo na maquina 1, ao abrir o sistema na maquina 2 eles apenas sao abertos com o SET INDEX TO e pronto, os dados estao on-line, pois os indices estao abertos simultaneamente.

Nota que no caso de um indice temporario, a saida do INDEX TO em cada maquina vai para um arquivo.maq, mesmo estes arquivos ficando no diretorio do sistema no servidor eles nao sao atualizados.

Imaginava que uma vez feito o INDEX ON na maquina que estou no momento e se cadastrar um dado em outra este indice temporario seria tambem atualizado.

Alguem sabe como resolver este problema???


Ja fiz teste com SET ESCOPE pois uso a SIX mais gostaria de saber se o problema acima tem solucao


ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Indice temporario com INDEX ON com dados on-line no DBF?

Mensagem por Maligno »

ANDRIL escreveu:Imaginava que uma vez feito o INDEX ON na maquina que estou no momento e se cadastrar um dado em outra este indice temporario seria tambem atualizado.
De forma alguma. O índice, sendo temporário, existe para a instância que o criou.
Alguem sabe como resolver este problema???
Eu nunca uso índice temporário. Até porque, com a SIX, posso perfeitamente utilizar um SET FILTER. Embora a idéia não pareça muito agradável, note que o SET FILTER é lento apenas enquanto o DBF contiver um volume elevado de dados. Mas com SET SCOPE (recurso presente na SIX) você pode, artificialmente, diminuir esse volume e então, aplicar o SET FILTER sem medo, pois a velocidade tende a se multiplicar várias vezes. Nem parece mais o velho (e lento) SET FILTER.

Entretanto, ainda existe a alternativa de adicionar ao índice principal (supondo que você use índice composto, claro) a chave que satisfaça sua necessidade e possa então, substituir o índice temporário. Com a SIX você pode manter várias chaves distintas.
[]'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!
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Eu entendo indice temporário como algo que crio num dado momento em um terminal com determinada critica e em outro terminal com critica diferente e se usar em dois terminais uma mesma critica o arquivo temporário possui nome diferente.

Ao criar o temporario eu anexo aos indices correntes como sendo o ultimo indice, mudo o foco, incluo os dados e pronto, tudo fica atualizado.

Agora se sua intenção for criar indice condicional, estes devem ser criados numa indexação, abertos junto com os outros indices e pronto.

Na verdade deste os tempos do NTX eu ja não usava indices condicionais, usava SubNTX(coisa fina, merecia o Oscar) e com CDX, Scope() 200% do tempo e Set Filter.

Acho até que esta dobradinha é unanimidade, pois o Scope() agiliza muito o Set Filter.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1298
Registrado em: 06 Jul 2004 00:44
Contato:

Mensagem por ANDRIL »

Ola

Rochinha, eu usava o CDX com clipper52e. Troquei pela DBFNSX (nao sei se é a mesma SIX da SIX3) agora estou testando a SIX3.

O que ocorre que tenho funcoes de filtragem no meu sistema (varios campos) sao usados para a filtragem pq o sistema tem que buscar um perfil de cliente conforme o filtro designado.

O mais chato do SET FILTER TO é na rede. Entao passei a usar o Sx_SetScope() resolveu 50% do problema, a desvantagem no meu caso, é que só posso usar um escopo e o resto fazer com SET FILTER TO, com isso na rede, a performance cai tambem.

Mesmo com o escopo ativado e o SET FILTER TO os poucos dados mostrados ficam com a paginação lenta.

Entao procurei a usar a SIX3 nao pelo fato de ter o Sx_SetScope() mais procurando alternativas, além que o NG esta em inglês e como apenas arranho.... já viu.

Mais achei um COMANDO pouco citado aqui no forum o SUBINDEX que é uma clausula do próprio INDEX ON da SIX3.

Sua função é criar um sub-indice do indice ativo no momento, ou seja, vc pode criar um indice assim:

index on MEUCAMPO to MEUIDX for MINHACONDICAO

Nesta linha ele cria um indice ja com uma determinada condição feita pela clausula FOR.

Agora se dentro deste indice eu quiser fazer:

index on OUTROCAMPO to MEUIDX1 for MINHAOUTRACONDICAO subindex

o indice anterior é mantido e em cima dele é feito o outro indice, assim, repetindo estas operações posso simular o comando SET FILTER porem com dados praticamentes instantaneos na rede.

Veja que no meu caso eu nao tenho como fazer um simples

INDEX on campo TO meuidx FOR minhacondicao.or.minhaoutracondicao.or.minhasoutrascondicoes

mesmo pq na linha de parametros so pode ter 256 caracteres e na montagem da minha string de consulta necessito muito mais que isso.

Bom ainda estou estudando o novo comando, se alguem ja usa e tiver algumas dicas, serao bem-vindas.


Ate+,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Eu uso indices que usam sistematica básica que é:

- ordem cronológica
- ordem alfabética
- ordem numérica

Os indices ficam mais enxutos e muito mais facil de usar escopo. Raras vezes uso dois campos ou mais.

Além do que, para diminuir um conjunto de dados sem sacrificar o database uso os indices condicionais, ex:

Caso de CONTAS, onde armazeno o CONTAS A PAGAR e CONTAS A RECEBER, difereciando os registros pelo campo CONTROLE que pode conter P ou R e o campo FLAG onde armazeno o logico .T. para contas quitadas ou .F. para a quitar.

Num mesmo banco de dados possuo 4 conjuntos distintos então.

Meus comandos de indexação ficam parecidos com estes:

Cronologicamente:

Código: Selecionar todos

INDEX ON dtos(areceber) TAG cta01 FOR controle = "P" .and. flag  // A Pagar
INDEX ON dtos(areceber) TAG cta02 FOR controle = "P" .and. !flag // Pagas
INDEX ON dtos(areceber) TAG cta03 FOR controle = "R" .and. flag  // A Receber
INDEX ON dtos(areceber) TAG cta04 FOR controle = "R" .and. !flag // Recebidas
Uso o escopo no campo ARECEBER na tag cta01, cta02 ou qualquer uma.

Depois uso um SET FILTER complexo para o caso de fazer a filtragem de registros baseado em critérios que o usuário escolherá como:

- registros com SITUACAO de PROTESTO
- que ja foram quitados
- que foram quitados com CHEQUE
- cujo repasse de alguns cheques foram para o JOSE DAS COUVES

Então se o limite esta no comando INDEX de uma enxugada no mesmo, use com mais vontade os escopos e afine os SET FILTERS de suas consultas e criticas.

Verifique também se o fato da lentidão não esteja ligada a arquivos relacionados, ou seja, voce mostras filtrados os dados de uma tabela, mas o que é apresentado na tela, possui colunas com campos que trazem conteudo de outras bases cujo vinculo relacionado nao esteja otimizado.

Não adianta voce fazer uma super filtragem de escopo, indice enxuto, etc se um relacionamento esta ligando duas tabelas super pesadas vinculadas por um campo com 200 caracteres, por exemplo.

Eu também pastei pra otimizar meus escopos, hoje não vivo sem eles.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder