Indice CDX desatualizando
Enviado: 03 Mai 2006 08:23
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
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