Página 1 de 1

Índice

Enviado: 28 Mar 2011 00:52
por Suporte Soft
Pessoal boa tarde!

Ainda tenho alguns problemas com quebra de índices, já sei que não é energia, então suponho que seja algum código que esteja fazendo isso.

Por favor me ajudem.

Uso uma rotina para abrir os DBF que verifica automaticamente se o DBF possuí índice e o abre juntamente.

Após incluir, alterar ou excluir um registro eu sempre uso um alias->(DbCommit())

uso índices temporários também... acho que o problema pode estar aqui.... mas ainda não o identifiquei. Nesse caso crio um .CDX temporário e após o uso sempre excluo o mesmo.

Se alguém tiver idéia de onde possa estar o problema por favor entrem em contato.

Obrigado.

Suporte Soft

Re: Índice

Enviado: 28 Mar 2011 07:38
por sygecom
Sem postar codigo fica dificil, como esta usando para criar indice, alterar registros, indice temporario, e etc.....

Re: Índice

Enviado: 28 Mar 2011 09:45
por Suporte Soft
Segue algumas partes do código:

Criando o índice:

Código: Selecionar todos

   If ! File("FLUXO.DBF")
      MsgBox1("Arquivo nÆo encontrado!")
      Return .T.
   EndIf
   nOpc := 0
   Do While nOpc <> 2
      Use fluxo Alias fluxo Exclusive
      If NetErr()
         nOpc := MsgBox2({"Arquivo em uso por outro usu rio!","Solicite que fechem o sistema."},,,"&Repetir","&Cancelar")
         If nOpc == 1
            Loop
         Else
            nOpc := 2
         EndIf
      Else
         Pack
         If File("FLUXO.CDX")
            FErase("FLUXO.CDX")
         EndIf
         Close fluxo
         Use fluxo Alias fluxo Exclusive
         nOpc := 2
      EndIf
   EndDo
   If Alias() == "FLUXO"
      aTelaInd := SavEnv()
      Win(11,20,18,58,"Aguarde! Reindexando Arquivo")
      Index On LANCA Tag fluxo1 To fluxo Eval BarProgress("FLUXO","FLUXO1") Every 50
      Index On Dtos(DATAENTRA) + TIPOCAD + Str(CODIGO,6) + Str(LOJA,6) Tag fluxo2 To fluxo Eval BarProgress("FLUXO","FLUXO2") Every 50
      Close fluxo
   EndIf
   RstEnv(aTela)
Alterando registro:

Código: Selecionar todos

      nSalCliF := MsgBox2("Confirma altera‡Æo?")
      If nSalCliF == 1
         Repla fluxo->TIPOCAD    With cTipoCad
      EndIf
      fluxo->(Destrava())  // DbUnlock
      fluxo->(DbCommit())
Índices Temporários:

Código: Selecionar todos

      cIndTemp1 := "indtemp"
      If (cTipoMov == "T" , cIndice := cIndice, cIndice := cIndice + "fluxo->tipomov  == cTipoMov .And. ")
      If (cPosicao == "T" , cIndice := cIndice, cIndice := cIndice + "fluxo->posicao  == cPosicao .And. ")
      cIndice := cIndice + "fluxo->dataentra >= dDataIni .And. fluxo->dataentra <= dDataFin .And. "
      nTamIndice := Len(cIndice)
      If Subs(cIndice,nTamIndice-6,7) == " .And. "
         cIndice := Subs(cIndice,1,nTamIndice-7)
      EndIf
      sele fluxo
      fluxo->(DbGoTop())
      If Empty(cIndice)
         fluxo->(OrdSetFocus(1))
      Else
         Index On fluxo->DATAENTRA To &cIndTemp1 For &cIndice
      EndIf
Grato

Índice

Enviado: 28 Mar 2011 12:11
por Pablo César
Antes de mais nada, quero desejá-lhe as nossas boas vinda ao fórum, em nome de todos !

Uma pergunta à margem disto: você utiliza campos memos ?
Uma observação sobre seu 1º código, na linha 16, pack ? NMMO essa prática não é correta, nessa situação.
A criação de arquivo de índices, não precisa estar em todo momento de abertura de arquivos. Inclusive, teoricamente, você não consegue deletar o arquivo de índice quando ele estiver aberto. Veja a linha 18 que utiliza o FErase antes do "close".
Eu faria uma opção de menu "Manutenção" para recriar os arquivos de índices quando estes dão problemas. Aliás também pode ser feito um modificação no ERRORSYS.PRG em que trata essa questão de REINDEXAÇÃO quando dá mensagem de problemas de índices, assim dispararia posteriormente a rotina de indexação. Mas esta eu faria em modo exclusivo.

O quê o Destrava() faz ?

Re: Índice

Enviado: 28 Mar 2011 12:39
por Clipper
Complementando a postagem do Pablo.

1 - No caso do CDX é recomendável (para não dizer obigatório) a exclusão do arquivo de indice, e aí sim criar um outro, ou então usar o coamndo REINDEX.
2 - Segundo o NG do RDD CDX, você pode utilizar REINDEX ao invés de PACK para eliminar os registros deletados.

NG do Clipper escreveu:If you rebuild your indexes on a regular basis, you should either delete your (.cdx) files before rebuilding the tags or use the REINDEX command
to rebuild them instead.
NG do Clipper escreveu:You can use the REINDEX command to "pack" the index file. REINDEX rebuilds each tag, eliminating any unused space in the file.
Até logo.

Marcelo

Re: Índice

Enviado: 28 Mar 2011 14:35
por alxsts
Olá!

Creio ter havido um mal entendido nestas traduções.
O comando PACK elimina registros marcados para deleção do arquivo de dados .DBF, ao passo que REINDEX reorganiza os índices, fazendo um pack no arquivo de índice apenas. Ou seja, não inclui no índice os registros do .DBF marcados para deleção, alem de reorganizar o espaço interno do arquivo de índices .

Re: Índice

Enviado: 28 Mar 2011 14:50
por Clipper
Correto Alexandre

Realmente é como você observou.

Corrigindo.

O comando REINDEX faz um "pack" no arquivo de indice, porém o arquivo DBF continuará a conter os arquivos marcados para deleção.

Até logo.

Marcelo

Re: Índice

Enviado: 28 Mar 2011 20:22
por Suporte Soft
Pessoal obrigado pelas postagens até o momento....

Estou fazendo as devidas correções no meu código.

As principais

1. Fechar o arquivo DBF antes de apagar o .CDX;
2. Removendo a cláusula Eval do Index. Por via das dúvidas melhor deixar sem a atualizar a janela apenas quando for executar a outra tag.

Outro detalhe abordado:
Eu uso camo MEMO em alguns arquivos, isso gera problemas nos índices? é aconselhável usar ou não?

O comando Pack eu utilizo para eliminar os registros deletados e manter o DBF melhor organizado.... O que vocês sugerem, deixar como está ou eliminar também?

Obrigado.

Re: Índice

Enviado: 28 Mar 2011 20:41
por sygecom
Suporte Soft escreveu: Eu uso camo MEMO em alguns arquivos, isso gera problemas nos índices? é aconselhável usar ou não?
Eu cheguei a usar por pouco tempo no Clipper, mas o grande Problema se dava quando tinha dois campo MEMO para uma mesma tabela, isso dava problema nos DBF e indice.
O comando Pack eu utilizo para eliminar os registros deletados e manter o DBF melhor organizado.... O que vocês sugerem, deixar como está ou eliminar também?
Eu sempre usei dessa forma no clipper, ainda tenho sistema no clipper rodando até hoje e utilizo do PACK para eliminar registros marcados para deletar, isso até hoje não me trouxe problema algum, no meu ponto de vista você pode manter sim isso como está.

Re: Índice

Enviado: 29 Mar 2011 09:57
por gvc
[Suporte Soft]
Se vc fecha o arquivo CDX "oficial", altera os registros enquanto usa os temporários e nessa alteração muda algum campo que compõe uma chave de indice, o seu arquivo "oficial" estará corrompido.
Veja na documentação do CDX como criar temporário no próprio arquivo. Eu ainda não usei isso mas lembro que alguns colegas daqui já usaram.

[Clipper]
O "pack" que o NG fala é para diminuir o espaço do arquivo CDX no disco. Como o NTX, o CDX usa paginação para montar as "arvores". Balancear as "arvores" é provavelmente a pior parte do algoritmo. Com o REINDEX as "arvores" são remontadas, permitindo uma melhor distribuição e até a diminuição de nós/paginação.

Putz! Daqui a pouco vamos começar a falar do algoritmo mesmo. Eh.Eh.Eh.

Tá! O que eu fiz para resolver alguns dos problemas de indice.

- O sistema abre e fecha os arquivos que necessita para executar um módulo do sistema. Assim o usuário que ficar no menu não tem nenhum arquivo aberto sem necessidade. E como o sistema fecha todos os arquivos, não deve ficar informação na memória.

- Uma função apenas para abrir os arquivos. Assim eu sei aonde esta a abertura dos arquivos e evito surpresas no meio do sistema.

- Bloqueio do X (fechar) da janela windows. Assim o usuário não sai do sistema fechando a janela. Diminuiu bastante a quebra de indice.

- Coloque uma "armadilha" para verificar que entra no sistema e não sai normalmente. Os usuários aqui juravam que estavam fazendo a saida correta, mas quando eu mandei a lista foi um "velório".

- Cuidado especial ao usar arquivos temporários. Só uso quando é para pesquisa ou relatórios. Se for para alterar alguma coisa no DBF, procuro usar sempre no "oficial".

- Apesar de alguns amigos aqui dizerem que não tem problemas, eu sempre tive com o CDX das versões 5.2x. Na documentação do clipper e parece que do NG tb falam que é para usar a versão 5.3x quando for trabalhar com CDX.
Só para constar: Não dúvido dos amigos que conseguiram usar CDX no 5.2x, mas a experiência foi horrível.

Re: Índice

Enviado: 29 Mar 2011 18:52
por Suporte Soft
Blz...

Apenas mais duas perguntinhas agora...

onde eu encontro a documentação do CDX e...

Consultando aqui no site alguns colegas alegam que usar o DbCommit() diminui a quebra de índice e aumenta a eficiência do programa.

Neste tópico o colega Eric.Developer disse que de forma geral nunca é preciso usar.

e ai?

Re: Índice

Enviado: 29 Mar 2011 22:45
por Clipper
Prezado colega

Essa questão do DBCOMMIT é meio polêmica mesmo. Eu uso sempre, para garantir que nada se perca em caso de pane ou de algum usuário desleixado.
O que eu não gosto e nunca uso é o DBCOMMITALL().
Mas cada caso é um caso e depende também do funcionamento interno do programa. Exemplos :
Após a inclusão dos dados o banco de dados é fechado. Então não faz sentido usar o DBCOMMIT() pois ao fechar o BD o buffer será descarregado e o BD será gravado.
Em um sistema onde há grande relacionamento de arquivos, é importante que haja concomitância na gravação, então eu usaria. Mas como eu disse cada caso é um caso.

Um pequeno manual do RDD CDX http://www.ousob.com/ng/cldriv/ng1b9d1.php

Até logo.

Marcelo