Indice CDX desatualizando

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Alexandre Costa
Usuário Nível 1
Usuário Nível 1
Mensagens: 25
Registrado em: 27 Dez 2005 10:49
Localização: Cambé - PR

Indice CDX desatualizando

Mensagem por Alexandre Costa »

Olá Pessoal!

Estou com um problema de índice que desatualiza. O sistema é em CL53 e Blinker 7 com rdd DBFCDX. A rede é novel, com vários terminais sem hd e outros com windows. Sempre funcionou bem, mas de uns tempos para cá as pesquisas (seek) simplesmente não encontram os dados. Olho diretamente no arquivo DBF e os dados estão lá sem estarem deletados, tudo ok. Apago o índice e gero novamente e pronto, volta a funcionar corretamente.

Para todos os dbfs utilizo uma função assim:

**********

FUNCTION A_PEDIDOS( ABRE, Modo, Indexa )

IF ABRE == "ABRE"

IF !FILE("PEDIDOS.DBF")
DBCREATE ( "PEDIDOS.DBF",;
{ { "CODIFUNC", "N", 3, 0 }, { "CODICART", "N", 3, 0 },;
{ "CODITRAN", "N", 3, 0 }, { "DATAPERE", "D", 8, 0 },;
{ "NUMEPERE", "N", 6, 0 }, { "ANOPERE" , "N", 2, 0 },;
{ "NUMEPEDI", "N", 6, 0 }, { "ANOPEDID", "N", 2, 0 },;
{ "DATAPEDI", "D", 8, 0 }, { "TOTAPEDI", "N", 13, 2 },;
{ "BASECALC", "N", 13, 2 }, { "CODIMERC", "N", 5, 0 },;
{ "CODITAMA", "N", 2, 0 }, { "UNIDTAMA", "N", 7, 3 },;
{ "QUANTIDA", "N", 10, 2 }, { "VALORUNI", "N", 10, 2 },;
{ "CONDPAGT", "C", 47, 0 }, { "DATAPROD", "D", 8, 0 },;
{ "VALOFRET", "N", 10, 2 }, { "VALODESC", "N", 10, 2 },;
{ "VALODESP", "N", 10, 2 }, { "ALIQFRET", "N", 6, 2 },;
{ "TIPOFRET", "C", 1, 0 }, { "PERCOMIS", "N", 6, 2 },;
{ "COMISSAO", "N", 10, 2 }, { "PERPREMI", "N", 6, 2 },;
{ "PREMIO" , "N", 10, 2 }, { "PESOBRUT", "N", 10, 2 },;
{ "PESOLIQU", "N", 10, 2 }, { "PEDIAPRO", "C", 1, 0 },;
{ "NUMEDOCT", "N", 7, 0 }, { "TIPODOCT", "C", 2, 0 },;
{ "OPERACAO", "C", 2, 0 }, { "VALORTOT", "N", 10, 2 },;
{ "DATAENSA", "D", 8, 0 }, { "ALIQUIPI", "N", 6, 2 },;
{ "VALORIPI", "N", 10, 2 }, { "ALIQICMS", "N", 6, 2 },;
{ "VALOICMS", "N", 10, 2 }, { "NOMEFANT", "C", 10, 0 },;
{ "MOTIVOCA", "C", 30, 0 }, { "QTDPEDI" , "N", 3, 0 },;
{ "CONT" , "N", 2, 0 }, { "DESMERPE", "N", 6, 2 },;
{ "CODIREDE", "N", 3, 0 }, { "SERIENF" , "C", 1, 0 },;
{ "CODICLFO", "N", 6, 0 }, { "NUMECARR", "N", 6, 0 },;
{ "SERICARR", "C", 2, 0 } } )
ENDIF

IF !FILE("PEDIDOS.CDX")
INDEXA := "S"
MODO := "E"
ENDIF

IF MODO == NIL .OR. MODO == "S"
OPENARQ("PEDIDOS","S") // USE PEDIDOS ALIAS A_PEDIDOS SHARED NEW - verifica se abriu corretamente
ELSEIF MODO == "E"
OPENARQ("PEDIDOS","E") // USE PEDIDOS ALIAS A_PEDIDOS EXCLUSIVE NEW - idem
ENDIF

IF INDEXA <> NIL .AND. MODO == "E"

PACK

INDEX ON STR(ANOPEDID,2)+STR(NUMEPEDI,6) TAG 01 TO PEDIDOS.CDX
INDEX ON DTOS(DATAPEDI)+STR(CODIMERC,5)+STR(CODITAMA,2) TAG 02 TO PEDIDOS.CDX
INDEX ON PEDIAPRO+STR(ANOPEDID,2)+STR(NUMEPEDI,6) TAG 03 TO PEDIDOS.CDX
INDEX ON STR(CODIMERC,5)+NOMEFANT+DTOS(DATAENSA)+STR(NUMEDOCT,6)+SERIENF TAG 04 TO PEDIDOS.CDX
INDEX ON DTOS(DATAPEDI)+STR(ANOPEDID,2)+STR(NUMEPEDI,6) TAG 05 TO PEDIDOS.CDX
INDEX ON STR(CODIMERC,5)+DTOS(DATAPEDI)+STR(CODITAMA,2) TAG 06 TO PEDIDOS.CDX
INDEX ON STR(NUMEDOCT,6)+DTOS(DATAENSA)+NOMEFANT TAG 07 TO PEDIDOS.CDX
INDEX ON STR(CODICLFO,6)+STR(ANOPEDID,2)+STR(NUMEPEDI,6) TAG 08 TO PEDIDOS.CDX
INDEX ON NOMEFANT+DTOS(DATAENSA)+STR(NUMEDOCT,6) TAG 09 TO PEDIDOS.CDX
INDEX ON DTOS(DATAENSA)+STR(NUMEDOCT,6) TAG 10 TO PEDIDOS.CDX
INDEX ON DTOS(DATAPROD)+STR(ANOPEDID,2)+STR(NUMEPEDI,6) TAG 11 TO PEDIDOS.CDX
INDEX ON STR(CODIFUNC,3)+STR(CODIMERC,5)+DTOS(DATAENSA) TAG 12 TO PEDIDOS.CDX
INDEX ON STR(NUMEPERE,6)+STR(ANOPERE,2)+STR(CODIMERC,5) TAG 13 TO PEDIDOS.CDX
INDEX ON STR(NUMECARR,6)+SERICARR+STR(ANOPEDID,2)+STR(NUMEPEDI,6) TAG 14 TO PEDIDOS.CDX
INDEX ON STR(ANOPEDID,2)+STR(NUMEPEDI,6)+STR(CODIMERC,5) TAG 15 TO PEDIDOS.CDX

ENDIF

SET INDEX TO PEDIDOS.CDX

ELSE

SELECT A_PEDIDOS
USE

ENDIF

RETURN NIL

**********

A funcao acima é a que mais desatualiza pois o arquivo PEDIDOS é o utilizado por mais usuarios ao mesmo tempo.

Obrigado,

Alexandre Costa
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

olá meu caro, já passei por algo semelhante.
Procure usar funções em vez de comandos.
EX.:
Ao invés de Set Index to pedidos.cdx / alias, não use a extensão .cdx, use apenas o nome do arquivo.
Use DbSetIndex("pedidos")

Nas funções de troca de indice
Ao invés de Set Order to , use OrdSetFocus("01") / o nome da tag entre parenteses

Com essas mudanças que fiz em meu sistema tudo ficou chique !
Tente aí também, se já não estiver fazendo.
:|<
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
casesistemas
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 04 Ago 2004 16:50
Localização: Campinas/SP
Contato:

Mensagem por casesistemas »

quando se trabalha com CDX, voce deve apaga-lo antes de recria-lo.
se nao voce estara acrescetando mais e mais tag´s dentro do cdx.

joao carlos
Responder